diff --git a/client/galaxy/scripts/viz/trackster/tracks.js b/client/galaxy/scripts/viz/trackster/tracks.js index 948eb40301fa..ccef6ea2348a 100644 --- a/client/galaxy/scripts/viz/trackster/tracks.js +++ b/client/galaxy/scripts/viz/trackster/tracks.js @@ -2507,7 +2507,7 @@ extend(Track.prototype, Drawable.prototype, { var data = result.data; // Tracks may not have stat data either because there is no data or data is not yet ready. - if (data !== undefined && data.min !== undefined && data.max !== undefined) { + if (data && data.min !== undefined && data.max !== undefined) { // Compute default minimum and maximum values var min_value = data.min, max_value = data.max; diff --git a/lib/galaxy/webapps/galaxy/api/datasets.py b/lib/galaxy/webapps/galaxy/api/datasets.py index eae3004ae584..78ce3461bcc4 100644 --- a/lib/galaxy/webapps/galaxy/api/datasets.py +++ b/lib/galaxy/webapps/galaxy/api/datasets.py @@ -154,7 +154,7 @@ def _data( self, trans, dataset, chrom, low, high, start_val=0, max_vals=None, * if msg: return msg - # Get datasources and check for essages. + # Get datasources and check for messages. data_sources = dataset.get_datasources( trans ) messages_list = [ data_source_dict[ 'message' ] for data_source_dict in data_sources.values() ] return_message = self._get_highest_priority_msg( messages_list ) @@ -249,7 +249,7 @@ def _raw_data( self, trans, dataset, provider=None, **kwargs ): registry = trans.app.data_provider_registry - # allow the caller to specifiy which provider is used + # allow the caller to specify which provider is used # pulling from the original providers if possible, then the new providers if provider: if provider in registry.dataset_type_name_to_data_provider: diff --git a/static/maps/viz/trackster/tracks.js.map b/static/maps/viz/trackster/tracks.js.map index 556fd06ec09a..2f9d22f6eefb 100644 --- a/static/maps/viz/trackster/tracks.js.map +++ b/static/maps/viz/trackster/tracks.js.map @@ -1 +1 @@ -{"version":3,"file":"tracks.js","sources":["../../../src/viz/trackster/tracks.js"],"names":["define","_","visualization","viz_views","util","slotting","painters","filters_mod","data","tools_mod","config_mod","extend","html_elt_js_obj_dict","is_container","element","obj","attr","moveable","handle_class","container_selector","element_js_obj","bind","handle","relative","e","d","child","container","top","bottom","i","parent","$","this","children","this_obj","parents","length","position","outerHeight","cur_container","offsetY","insertBefore","remove_drawable","add_drawable_before","insertAfter","add_drawable","get","is","find","prepend","append","hasClass","move_drawable","deltaY","addClass","removeClass","ERROR_PADDING","MAX_FEATURE_DEPTH","MIN_SQUISH_VIEW_WIDTH","TILE_SIZE","DEFAULT_DATA_QUERY_WAIT","MAX_CHROMS_SELECTABLE","DATA_ERROR","DATA_NOCONVERTER","DATA_NONE","DATA_PENDING","DATA_CANNOT_RUN_TOOL","DATA_OK","TILE_CACHE_SIZE","CONTINUOUS_DATA_MODES","Drawable","view","obj_dict","id_counter","id","drag_handle_class","is_overview","action_icons","config","ConfigSettingCollection","from_models_and_saved_values","config_params","prefs","get_value","set_value","name","config_onchange","on","container_div","build_container_div","header_div","header","header_view","TrackHeaderView","model","$el","icons_div","hover","show","hide","prototype","action_icons_def","title","css_class","on_click_fn","drawable","toggle_icon","hide_contents","show_contents","ConfigSettingCollectionView","collection","render_in_modal","remove","key","label","type","default_value","hidden","init","changed","can_draw","enabled","request_draw","_draw","to_dict","set_name","new_name","old_name","revert_name","update_intro_div","update_icons","get_drawables","DrawableCollection","call","obj_type","drawables","unpack_drawables","drawables_array","object_from_template","options","dictified_drawables","push","to_key_value_dict","other","index","indexOf","splice","replace_drawable","old_drawable","new_drawable","update_html","replaceWith","new_position","get_tracks","track_type","queue","slice","tracks","shift","concat","DrawableGroup","content_div","appendTo","filters_manager","FiltersManager","after","parent_div","saved_filters_managers","old_manager","filters","visible","setup_multitrack_filtering","group","show_composite_track","clear_filters","_restore_filter_managers","clear_tile_cache","toggle","tiles_div","num_drawables","composite_icon","filters_icon","CompositeTrack","j","same_type","a_type","get_type","num_feature_tracks","can_composite","FeatureTrack","LineTrack","filter","shared_filters","remove_all","new_filter","filter_name","NumberFilter","add_filter","init_filters","composite_track","each","TracksterView","Backbone","View","initialize","chrom","vis_id","dbkey","stand_alone","undefined","label_tracks","tracks_to_be_redrawn","max_low","max_high","zoom_factor","min_separation","has_changes","load_chroms_deferred","render","canvas_manager","CanvasManager","ownerDocument","reset","requested_redraw","parent_element","top_container","browser_content_div","bottom_container","top_labeltrack","viewport_container","intro_div","text","click","select_datasets","Galaxy","root","f-dbkey","track","nav_container","prependTo","nav","overview","overview_viewport","overview_close","overview_highlight","overview_box_background","overview_box","default_overview_height","height","nav_controls","chrom_select","submit_nav","keyCode","which","go_to","val","location_span","stopPropagation","nav_input","tooltip","placement","low","high","css","select","focus","autocomplete","source","request","response","all_features","feature_search_deferreds","map","t","data_manager","search_features","term","success","dataset_features","when","apply","done","feature","value","minLength","hidden_input","zo_link","zoom_out","zi_link","zoom_in","load_chroms","change_chrom","trigger","pageX","current_x","offsetX","delta","delta_chrom","Math","round","width","move_delta","reset_overview","clientX","original_low","current_height","clientY","new_scroll","scrollTop","proxy","left","min","startX","offset","abs","max","span","update_location","old_low","request_redraw","add_label_track","LabelTrack","window","resize_timer","clearTimeout","setTimeout","resize_window","document","redraw","get_base_color","base","toLowerCase","trigger_navigate","new_chrom","new_low","new_high","delay","timer","self","commatize","url_parms","num","chrom_data","Deferred","ajax","url","dataType","result","chrom_info","reference","ref_track","ReferenceTrack","reference_track","chrom_options","len","prev_chroms","next_chroms","html","chrom_start_index","start_index","resolve","error","alert","then","found","grep","v","str","replace","chrom_pos","split","parseInt","move_fraction","fraction","current_chrom_span","data_fetch","redraw_on_move_fn","label_track","track_list","track_options","to","requestAnimationFrame","_redraw","floor","ceil","resolution_px_b","left_px","width_px","min_width_px","point","cur_center","new_half","resize_viewport","set_overview","overview_drawable","dataset","copy","postdraw_actions","TracksterTool","Tool","defaults","tool_state","set","remove_inputs","state_dict","get_inputs_dict","is_visible","ToolParameterView","events","change :input","param_div","param","html_div","update_value","update_event","target","TracksterToolView","set_visible","tool","keydown","param_view","run_tool_row","run_on_dataset_button","run_on_region_button","run_on_region","run_on_dataset","update_params","params","run","target_dataset_id","action","tool_id","modal","body","buttons","Close","region","GenomeRegion","start","end","url_params","regions","toJSON","current_track","track_name","tool_region_and_parameters_str","new_track","constructor","hda_ldda","init_for_tool_data","change_mode","mode","set_filters_manager","track_data","set_dataset","Dataset","success_callback","inputs","ss_deferred","ServerStateDeferred","ajax_settings","JSON","stringify","contentType","interval","success_fn","go","message","FilterScaler","default_val","Scaler","gen_val","feature_data","Number","MAX_VALUE","parseFloat","Tile","w_scale","canvas","html_elt","stale","predisplay_actions","LineTrackTile","FeatureTrackTile","all_slotted","feature_mapper","incomplete_features","seq_data","has_icons","other_tiles_features_drawn","Track","Model","dataset_check_type","data_url_extra_params","data_query_wait","GenomeDataManager","genome","Genome","chroms_info","data_mode_compatible","data_and_mode_compatible","can_subset","min_height_px","max_height_px","visible_height_px","resize","add_resize_handle","cancel_fn","unbind","ok_fn","regions_to_use","view_region","bookmarked_regions","elt","from_str","location","href","dataset_id","Collection","No","Yes","on_resize","in_handle","in_drag","drag_control","original_height","new_height","tile_cache","clear","ReadTrack","VariantTrack","show_message","msg_html","retry","init_deferred","data_type","getJSON","kind","status","valid_chroms","predraw_init","msg_elt","stats","min_value","max_value","mean","sd","set_default_value","TiledTrack","filters_available","Cache","left_offset","tool_view","dynamic_tool_div","overlay_div","slotters","max_rows","set_min_max","isNaN","new_mode","mode_icon","tools_icon","param_space_viz_icon","_gen_tile_cache_key","tile_region","before_draw","clear_after","resolution","tile_promise","tile_width","tile_index","tile_promises","tiles","draw_helper","tile","_add_yaxis_label","on_change","pref_name","make_text_editable","num_cols","on_finish","new_val","help_text","line_track_tiles","force","icons_present","get_mode","update_auto_mode","_get_drawables","is_tile","o","get_elt","show_tile","get_tile_data","data_mode","m","tile_data","get_data","tile_drawn","set_elt","tracks_data","is_deferred","subset_entry","pop","drawing_modes","drawing_heights","get_canvas_height","new_canvas","tile_low","tile_high","ctx","getContext","translate","globalAlpha","globalCompositeOperation","draw_tile","_draw_line_track_tile","painter","LinePainter","draw","tile_element","track_height","region_str","toString","param_str","values","join","dataset_type","extra_info","entry","range","tickDistance","pow","log","new_div","screenPosition","display_modes","union","show_group","visible_height","init_deferreds","update_all_min_max","max_height","char_width_px","data_url","GenomeReferenceDataManager","new_visible","cur_visible","subset","font","manager","default_font","textAlign","c","str_len","fillStyle","fillText","DiagonalHeatmapTrack","DiagonalHeatmapPainter","summary_draw_height","start_end_dct","set_painter_from_config","help","ArcLinkedFeaturePainter","LinkedFeaturePainter","all_incomplete_features","pluck","inc_features","tile_incomplete_features","omit","f","keys","size","features","new_canvas_ctx","drawImage","new_tile","update_ui_elt","example_feature","applies_to","show_more_rows_icon","incremental_slots","level","dummy_context","slotter","x","measureText","slot_features","canvas_width","rows_required","dummy_painter","get_required_height","ref_seq","cur_tile","filtered","slots","hide_feature","flen","update_attrs","keep","filter_alpha_scaler","alpha_filter","filter_height_scaler","height_filter","b","draw_results","translation","VariantPainter","num_samples","get_metadata","match","deferreds","fetch","sample_names","font_size","font-size","samples_div_html","line-height","ReadPainter","addable_objects","VcfTrack","template","drawable_type"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tracks.js","sources":["../../../src/viz/trackster/tracks.js"],"names":["define","_","visualization","viz_views","util","slotting","painters","filters_mod","data","tools_mod","config_mod","extend","html_elt_js_obj_dict","is_container","element","obj","attr","moveable","handle_class","container_selector","element_js_obj","bind","handle","relative","e","d","child","container","top","bottom","i","parent","$","this","children","this_obj","parents","length","position","outerHeight","cur_container","offsetY","insertBefore","remove_drawable","add_drawable_before","insertAfter","add_drawable","get","is","find","prepend","append","hasClass","move_drawable","deltaY","addClass","removeClass","ERROR_PADDING","MAX_FEATURE_DEPTH","MIN_SQUISH_VIEW_WIDTH","TILE_SIZE","DEFAULT_DATA_QUERY_WAIT","MAX_CHROMS_SELECTABLE","DATA_ERROR","DATA_NOCONVERTER","DATA_NONE","DATA_PENDING","DATA_CANNOT_RUN_TOOL","DATA_OK","TILE_CACHE_SIZE","CONTINUOUS_DATA_MODES","Drawable","view","obj_dict","id_counter","id","drag_handle_class","is_overview","action_icons","config","ConfigSettingCollection","from_models_and_saved_values","config_params","prefs","get_value","set_value","name","config_onchange","on","container_div","build_container_div","header_div","header","header_view","TrackHeaderView","model","$el","icons_div","hover","show","hide","prototype","action_icons_def","title","css_class","on_click_fn","drawable","toggle_icon","hide_contents","show_contents","ConfigSettingCollectionView","collection","render_in_modal","remove","key","label","type","default_value","hidden","init","changed","can_draw","enabled","request_draw","_draw","to_dict","set_name","new_name","old_name","revert_name","update_intro_div","update_icons","get_drawables","DrawableCollection","call","obj_type","drawables","unpack_drawables","drawables_array","object_from_template","options","dictified_drawables","push","to_key_value_dict","other","index","indexOf","splice","replace_drawable","old_drawable","new_drawable","update_html","replaceWith","new_position","get_tracks","track_type","queue","slice","tracks","shift","concat","DrawableGroup","content_div","appendTo","filters_manager","FiltersManager","after","parent_div","saved_filters_managers","old_manager","filters","visible","setup_multitrack_filtering","group","show_composite_track","clear_filters","_restore_filter_managers","clear_tile_cache","toggle","tiles_div","num_drawables","composite_icon","filters_icon","CompositeTrack","j","same_type","a_type","get_type","num_feature_tracks","can_composite","FeatureTrack","LineTrack","filter","shared_filters","remove_all","new_filter","filter_name","NumberFilter","add_filter","init_filters","composite_track","each","TracksterView","Backbone","View","initialize","chrom","vis_id","dbkey","stand_alone","undefined","label_tracks","tracks_to_be_redrawn","max_low","max_high","zoom_factor","min_separation","has_changes","load_chroms_deferred","render","canvas_manager","CanvasManager","ownerDocument","reset","requested_redraw","parent_element","top_container","browser_content_div","bottom_container","top_labeltrack","viewport_container","intro_div","text","click","select_datasets","Galaxy","root","f-dbkey","track","nav_container","prependTo","nav","overview","overview_viewport","overview_close","overview_highlight","overview_box_background","overview_box","default_overview_height","height","nav_controls","chrom_select","submit_nav","keyCode","which","go_to","val","location_span","stopPropagation","nav_input","tooltip","placement","low","high","css","select","focus","autocomplete","source","request","response","all_features","feature_search_deferreds","map","t","data_manager","search_features","term","success","dataset_features","when","apply","done","feature","value","minLength","hidden_input","zo_link","zoom_out","zi_link","zoom_in","load_chroms","change_chrom","trigger","pageX","current_x","offsetX","delta","delta_chrom","Math","round","width","move_delta","reset_overview","clientX","original_low","current_height","clientY","new_scroll","scrollTop","proxy","left","min","startX","offset","abs","max","span","update_location","old_low","request_redraw","add_label_track","LabelTrack","window","resize_timer","clearTimeout","setTimeout","resize_window","document","redraw","get_base_color","base","toLowerCase","trigger_navigate","new_chrom","new_low","new_high","delay","timer","self","commatize","url_parms","num","chrom_data","Deferred","ajax","url","dataType","result","chrom_info","reference","ref_track","ReferenceTrack","reference_track","chrom_options","len","prev_chroms","next_chroms","html","chrom_start_index","start_index","resolve","error","alert","then","found","grep","v","str","replace","chrom_pos","split","parseInt","move_fraction","fraction","current_chrom_span","data_fetch","redraw_on_move_fn","label_track","track_list","track_options","to","requestAnimationFrame","_redraw","floor","ceil","resolution_px_b","left_px","width_px","min_width_px","point","cur_center","new_half","resize_viewport","set_overview","overview_drawable","dataset","copy","postdraw_actions","TracksterTool","Tool","defaults","tool_state","set","remove_inputs","state_dict","get_inputs_dict","is_visible","ToolParameterView","events","change :input","param_div","param","html_div","update_value","update_event","target","TracksterToolView","set_visible","tool","keydown","param_view","run_tool_row","run_on_dataset_button","run_on_region_button","run_on_region","run_on_dataset","update_params","params","run","target_dataset_id","action","tool_id","modal","body","buttons","Close","region","GenomeRegion","start","end","url_params","regions","toJSON","current_track","track_name","tool_region_and_parameters_str","new_track","constructor","hda_ldda","init_for_tool_data","change_mode","mode","set_filters_manager","track_data","set_dataset","Dataset","success_callback","inputs","ss_deferred","ServerStateDeferred","ajax_settings","JSON","stringify","contentType","interval","success_fn","go","message","FilterScaler","default_val","Scaler","gen_val","feature_data","Number","MAX_VALUE","parseFloat","Tile","w_scale","canvas","html_elt","stale","predisplay_actions","LineTrackTile","FeatureTrackTile","all_slotted","feature_mapper","incomplete_features","seq_data","has_icons","other_tiles_features_drawn","Track","Model","dataset_check_type","data_url_extra_params","data_query_wait","GenomeDataManager","genome","Genome","chroms_info","data_mode_compatible","data_and_mode_compatible","can_subset","min_height_px","max_height_px","visible_height_px","resize","add_resize_handle","cancel_fn","unbind","ok_fn","regions_to_use","view_region","bookmarked_regions","elt","from_str","location","href","dataset_id","Collection","No","Yes","on_resize","in_handle","in_drag","drag_control","original_height","new_height","tile_cache","clear","ReadTrack","VariantTrack","show_message","msg_html","retry","init_deferred","data_type","getJSON","kind","status","valid_chroms","predraw_init","msg_elt","stats","min_value","max_value","mean","sd","set_default_value","TiledTrack","filters_available","Cache","left_offset","tool_view","dynamic_tool_div","overlay_div","slotters","max_rows","set_min_max","isNaN","new_mode","mode_icon","tools_icon","param_space_viz_icon","_gen_tile_cache_key","tile_region","before_draw","clear_after","resolution","tile_promise","tile_width","tile_index","tile_promises","tiles","draw_helper","tile","_add_yaxis_label","on_change","pref_name","make_text_editable","num_cols","on_finish","new_val","help_text","line_track_tiles","force","icons_present","get_mode","update_auto_mode","_get_drawables","is_tile","o","get_elt","show_tile","get_tile_data","data_mode","m","tile_data","get_data","tile_drawn","set_elt","tracks_data","is_deferred","subset_entry","pop","drawing_modes","drawing_heights","get_canvas_height","new_canvas","tile_low","tile_high","ctx","getContext","translate","globalAlpha","globalCompositeOperation","draw_tile","_draw_line_track_tile","painter","LinePainter","draw","tile_element","track_height","region_str","toString","param_str","values","join","dataset_type","extra_info","entry","range","tickDistance","pow","log","new_div","screenPosition","display_modes","union","show_group","visible_height","init_deferreds","update_all_min_max","max_height","char_width_px","data_url","GenomeReferenceDataManager","new_visible","cur_visible","subset","font","manager","default_font","textAlign","c","str_len","fillStyle","fillText","DiagonalHeatmapTrack","DiagonalHeatmapPainter","summary_draw_height","start_end_dct","set_painter_from_config","help","ArcLinkedFeaturePainter","LinkedFeaturePainter","all_incomplete_features","pluck","inc_features","tile_incomplete_features","omit","f","keys","size","features","new_canvas_ctx","drawImage","new_tile","update_ui_elt","example_feature","applies_to","show_more_rows_icon","incremental_slots","level","dummy_context","slotter","x","measureText","slot_features","canvas_width","rows_required","dummy_painter","get_required_height","ref_seq","cur_tile","filtered","slots","hide_feature","flen","update_attrs","keep","filter_alpha_scaler","alpha_filter","filter_height_scaler","height_filter","b","draw_results","translation","VariantPainter","num_samples","get_metadata","match","deferreds","fetch","sample_names","font_size","font-size","samples_div_html","line-height","ReadPainter","addable_objects","VcfTrack","template","drawable_type"],"mappings":"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"} \ No newline at end of file diff --git a/static/scripts/bundled/analysis.bundled.js.map b/static/scripts/bundled/analysis.bundled.js.map index c416f52ea947..60c15266b0cc 100644 --- a/static/scripts/bundled/analysis.bundled.js.map +++ b/static/scripts/bundled/analysis.bundled.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///analysis.bundled.js","webpack:///./galaxy/scripts/apps/analysis.js","webpack:///./galaxy/scripts/mvc/ui/ui-misc.js?fd98","webpack:///./~/handlebars/dist/cjs/handlebars/utils.js?2349","webpack:///./~/handlebars/dist/cjs/handlebars/exception.js?bdd5","webpack:///./galaxy/scripts/mvc/ui/ui-portlet.js?0568","webpack:///./~/handlebars/runtime.js?525d","webpack:///./galaxy/scripts/mvc/dataset/data.js?f841*","webpack:///./galaxy/scripts/mvc/dataset/states.js","webpack:///./galaxy/scripts/mvc/ui/ui-buttons.js?4ced","webpack:///./galaxy/scripts/mvc/ui/ui-table.js?4ded","webpack:///./galaxy/scripts/mvc/ui/icon-button.js?40a6*","webpack:///./galaxy/scripts/ui/editable-text.js?53d0","webpack:///./galaxy/scripts/viz/trackster/util.js?c726","webpack:///./galaxy/scripts/mvc/citation/citation-model.js?63a3","webpack:///./galaxy/scripts/mvc/tool/tool-form.js?a6b7","webpack:///./galaxy/scripts/mvc/tool/tool-template.js?e474","webpack:///./galaxy/scripts/mvc/ui/ui-list.js?ecf1","webpack:///./galaxy/scripts/mvc/ui/ui-options.js?405a","webpack:///./galaxy/scripts/ui/fa-icon-button.js","webpack:///./~/handlebars/dist/cjs/handlebars/base.js?78ef","webpack:///./galaxy/scripts/mvc/ui/ui-popover.js","webpack:///./galaxy/scripts/mvc/ui/ui-select.js","webpack:///./galaxy/scripts/mvc/ui/ui-tabs.js?173b","webpack:///./galaxy/scripts/libs/bibtex.js?8f2e","webpack:///./galaxy/scripts/mvc/citation/citation-view.js?b4c0","webpack:///./galaxy/scripts/mvc/collection/collection-li.js","webpack:///./galaxy/scripts/mvc/collection/collection-model.js","webpack:///./galaxy/scripts/mvc/collection/list-collection-creator.js","webpack:///./galaxy/scripts/mvc/dataset/dataset-li.js","webpack:///./galaxy/scripts/mvc/form/form-data.js?6144","webpack:///./galaxy/scripts/mvc/form/form-input.js?af7f","webpack:///./galaxy/scripts/mvc/form/form-parameters.js?0ee1","webpack:///./galaxy/scripts/mvc/form/form-repeat.js?7c22","webpack:///./galaxy/scripts/mvc/form/form-section.js?2ccb","webpack:///./galaxy/scripts/mvc/form/form-select-content.js?e07e","webpack:///./galaxy/scripts/mvc/form/form-view.js?db3b","webpack:///./galaxy/scripts/mvc/history/hdca-model.js","webpack:///./galaxy/scripts/mvc/history/history-content-model.js","webpack:///./galaxy/scripts/mvc/history/history-contents.js","webpack:///./galaxy/scripts/mvc/list/list-item.js","webpack:///./galaxy/scripts/mvc/tool/tool-form-base.js?81c1","webpack:///./galaxy/scripts/mvc/tool/tools.js?fad9","webpack:///./galaxy/scripts/mvc/ui/popup-menu.js","webpack:///./galaxy/scripts/mvc/ui/ui-color-picker.js?fa1d","webpack:///./galaxy/scripts/mvc/ui/ui-drilldown.js?de06","webpack:///./galaxy/scripts/mvc/ui/ui-select-default.js?402d","webpack:///./galaxy/scripts/mvc/ui/ui-select-ftp.js?cf41","webpack:///./galaxy/scripts/mvc/ui/ui-select-library.js?fd76","webpack:///./galaxy/scripts/mvc/ui/ui-slider.js?93a7","webpack:///./galaxy/scripts/mvc/upload/upload-model.js","webpack:///./galaxy/scripts/utils/deferred.js?8fee","webpack:///./galaxy/scripts/utils/query-string-parsing.js?15f2","webpack:///./galaxy/scripts/templates/panel_section.handlebars?f235","webpack:///./galaxy/scripts/templates/tool_form.handlebars?5353","webpack:///./galaxy/scripts/templates/tool_link.handlebars?b1c9","webpack:///./galaxy/scripts/templates/tool_search.handlebars?337a","webpack:///./~/handlebars/dist/cjs/handlebars.runtime.js?c991","webpack:///./~/handlebars/dist/cjs/handlebars/decorators.js?d196","webpack:///./~/handlebars/dist/cjs/handlebars/decorators/inline.js?7559","webpack:///./~/handlebars/dist/cjs/handlebars/helpers.js?2634","webpack:///./~/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js?16c5","webpack:///./~/handlebars/dist/cjs/handlebars/helpers/each.js?32ff","webpack:///./~/handlebars/dist/cjs/handlebars/helpers/helper-missing.js?9e0e","webpack:///./~/handlebars/dist/cjs/handlebars/helpers/if.js?b54a","webpack:///./~/handlebars/dist/cjs/handlebars/helpers/log.js?cc97","webpack:///./~/handlebars/dist/cjs/handlebars/helpers/lookup.js?4e06","webpack:///./~/handlebars/dist/cjs/handlebars/helpers/with.js?a6ac","webpack:///./~/handlebars/dist/cjs/handlebars/logger.js?e18b","webpack:///./~/handlebars/dist/cjs/handlebars/no-conflict.js?2695","webpack:///./~/handlebars/dist/cjs/handlebars/runtime.js?6a24","webpack:///./~/handlebars/dist/cjs/handlebars/safe-string.js?d667","webpack:///./galaxy/scripts/mvc/annotation.js","webpack:///./galaxy/scripts/mvc/collection/collection-view.js","webpack:///./galaxy/scripts/mvc/dataset/dataset-li-edit.js","webpack:///./galaxy/scripts/mvc/dataset/dataset-model.js","webpack:///./galaxy/scripts/mvc/history/hda-li.js","webpack:///./galaxy/scripts/mvc/history/hda-model.js","webpack:///./galaxy/scripts/mvc/history/hdca-li.js","webpack:///./galaxy/scripts/mvc/history/history-model.js","webpack:///./galaxy/scripts/mvc/list/list-view.js","webpack:///./galaxy/scripts/mvc/tag.js","webpack:///./galaxy/scripts/mvc/upload/upload-ftp.js","webpack:///./galaxy/scripts/mvc/upload/upload-settings.js","webpack:///./galaxy/scripts/ui/hoverhighlight.js","webpack:///./galaxy/scripts/ui/search-input.js","webpack:///./galaxy/scripts/utils/natural-sort.js","webpack:///./galaxy/scripts/utils/uploadbox.js","webpack:///./galaxy/scripts/apps/history-panel.js","webpack:///./galaxy/scripts/apps/tool-panel.js","webpack:///./galaxy/scripts/mvc/collection/collection-li-edit.js","webpack:///./galaxy/scripts/mvc/collection/collection-view-edit.js","webpack:///./galaxy/scripts/mvc/collection/list-of-pairs-collection-creator.js","webpack:///./galaxy/scripts/mvc/collection/pair-collection-creator.js","webpack:///./galaxy/scripts/mvc/history/copy-dialog.js","webpack:///./galaxy/scripts/mvc/history/hda-li-edit.js","webpack:///./galaxy/scripts/mvc/history/hdca-li-edit.js","webpack:///./galaxy/scripts/mvc/history/history-view-edit-current.js","webpack:///./galaxy/scripts/mvc/history/history-view-edit.js","webpack:///./galaxy/scripts/mvc/history/history-view.js","webpack:///./galaxy/scripts/mvc/history/options-menu.js","webpack:///./galaxy/scripts/mvc/upload/composite/composite-row.js","webpack:///./galaxy/scripts/mvc/upload/composite/composite-view.js","webpack:///./galaxy/scripts/mvc/upload/default/default-row.js","webpack:///./galaxy/scripts/mvc/upload/default/default-view.js","webpack:///./galaxy/scripts/mvc/upload/upload-button.js","webpack:///./galaxy/scripts/mvc/upload/upload-view.js","webpack:///./galaxy/scripts/ui/loading-indicator.js","webpack:///./galaxy/scripts/utils/levenshtein.js"],"names":["webpackJsonp","module","exports","__webpack_require__","_","Backbone","jQuery","$","GalaxyApp","QUERY_STRING","PANEL","ToolPanel","HistoryPanel","PAGE","ToolForm","window","app","options","bootstrapped","Galaxy","debug","config","toolPanel","el","userIsAnonymous","user","isAnonymous","spinner_url","search_url","toolbox","toolbox_in_panel","stored_workflow_menu_entries","nginx_upload_path","ftp_upload_site","default_genome","default_extension","centerPanel","CenterPanel","historyPanel","galaxyRoot","root","allow_user_dataset_purge","analysisPage","PageLayoutView","extend","left","center","right","page","params","tool_panel","upload","uploadButton","currHistoryPanel","historyView","listenToGalaxy","display","view","target","remove","Router","initialize","this","execute","callback","args","name","queryObj","parse","pop","push","apply","routes","(/)","(/)root*","home","tool_id","job_id","_loadToolForm","workflow_id","_loadCenterIframe","m_c","m_a","id","View","url","prop","render","loadCurrentHistory","listenTo","fetch","urlRoot","connectToQuotaMeter","masthead","quotaMeter","history","start","pushState","call","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","Utils","Select","Slider","Options","Drilldown","Buttons","Modal","Image","merge","cls","setElement","_template","Label","title","tagname","new_title","$el","html","value","addClass","Icon","floating","icon","tooltip","placement","Anchor","on","onclick","Message","message","status","persistent","update","fadeIn","timeout","clearTimeout","self","setTimeout","is","fadeOut","hide","cls_status","large","Searchbox","searchword","e","search_field","find","val","Input","type","placeholder","disabled","visible","area","undefined","onchange","new_val","Hidden","tmpl","info","Button","ButtonDefault","ButtonIcon","ButtonCheck","ButtonMenu","ButtonLink","RadioButton","Checkbox","Radio","escapeChar","chr","escape","obj","i","arguments","length","key","Object","prototype","hasOwnProperty","indexOf","array","len","escapeExpression","string","toHTML","possible","test","replace","badChars","isEmpty","isArray","createFrame","object","frame","_parent","blockParams","ids","path","appendContextPath","contextPath","__esModule","&","<",">","\"","'","`","=","toString","isFunction","Array","Exception","node","loc","line","column","tmp","Error","constructor","idx","errorProps","captureStackTrace","lineNumber","uid","buttons","body","scrollable","nopadding","operations","operations_flt","collapsible","collapsed","$body","$title","$header","$content","$footer","css","$buttons","each","item","append","$operations","cursor","text-decoration","expand","collapse","empty","header","footer","show","enableButton","disableButton","hideOperation","showOperation","setOperation","off","height","trigger","disable","enable","Frames","mod_icon_btn","DatasetMetadata","Model","Dataset","defaults","hda_ldda","metadata","get","_set_metadata","keys","attributes","k","new_key","split","set","silent","get_metadata","attribute","TabularDataset","chunk_url","first_data_chunk","chunk_index","at_eof","url_viz","get_next_chunk","next_chunk","Deferred","getJSON","chunk","success","rval","ck_data","resolve","DatasetCollection","Collection","model","TabularDatasetChunkedView","row_count","loading_chunk","TabularButtonTracksterView","expand_to_container","scroll_elt","attempt_to_fetch","func","scrolled_to_bottom","loading_indicator","when","then","result","_renderChunk","attr","data_table","cellpadding","column_names","header_container","appendTo","header_row","join","j","first_chunk","scroll","_renderCell","cell_contents","index","colspan","$cell","text","column_types","_renderRow","cells","row","num_columns","slice","TopLevelTabularDatasetChunkedView","parents","p","scrollTop","EmbeddedTabularDatasetChunkedView","position","overflow","innerHeight","scrollHeight","col","chrom","end","dataset_id","genome_build","file_ext","search","str","match","parent","modal","console","log","btn_viz","IconButtonView","IconButton","icon_class","events","mouseover tr","mouseleave","is_numeric","n","isNaN","parseFloat","isFinite","children","eq","btn_viz_pars","gene_region","offset","top","click","create_trackster_action","vis_url","dataset_params","dbkey","listTracksParams","ajax","param","dataType","error","Cancel","table_html","View in saved visualization","Add to visualization","vis_id","add","content","View in new visualization","createTabularDatasetChunkedView","dataset_config","parent_elt","embedded","STATES","UPLOAD","QUEUED","RUNNING","SETTING_METADATA","NEW","EMPTY","OK","PAUSED","FAILED_METADATA","NOT_VIEWABLE","DISCARDED","ERROR","READY_STATES","NOT_READY_STATES","ButtonBase","cls_wait","removeClass","wait","unwait","href","icons","$icon","current","total","$button","setIcon","icon_cls","width","$menu","pull","onunload","tag","$root","preventDefault","addMenu","menuOptions","divider","_templateMenu","$item","_templateMenuItem","_templateDivider","download","margin","optionsDefault","ondblclick","onconfirm","cls_tr","dblclick","$thead","$tbody","$tmessage","_row","addHeader","wrapper","appendHeader","align","fade","_commit","prepend","del","_refresh","delAll","new_value","before","after","size","_onclick","old_value","closest","_ondblclick","on_click","menu_options","is_menu_button","enabled","tooltip_config","bind","new_elem","template","toJSON","replaceWith","event","buffer","IconButtonCollection","IconButtonMenuView","tagName","collection","button","elt","make_popupmenu","create_icon_buttons_menu","global_config","map","button_config","__WEBPACK_AMD_DEFINE_FACTORY__","factory","fn","make_text_editable","config_dict","num_cols","num_rows","use_textarea","on_finish","help_text","container","input_elt","button_elt","set_text","new_text","cur_text","rows","cols","trim","keyup","keyCode","blur","stopPropagation","focus","select","commatize","number","rgx","is_deferred","d","ServerStateDeferred","ajax_settings","interval","success_fn","go","deferred","_go","get_random_color","colors","parseInt","new_color","nr","ng","nb","other_color","or","og","ob","n_brightness","o_brightness","diff","brightness","r","g","b","difference","r1","g1","b1","r2","g2","b2","Math","max","min","ok","num_tries","round","random","abs","substr","parseBibtex","baseMVC","_l","BibtexParser","logNamespace","Citation","LoggableMixin","_logNamespace","bibtex","entry","entries","_fields","rawFields","Fields","lowerKey","toLowerCase","entryType","EntryType","fields","BaseCitationCollection","partial","HistoryCitationCollection","history_id","ToolCitationCollection","Ui","ToolFormBase","ToolTemplate","customize","execute_btn","version","portlet","submit","job_remap","inputs","label","ignore","help","job_def","tool_version","data","create","validate","emit","request","response","refreshContents","err_data","error_messages","matchResponse","input_id","highlight","err_msg","Close","job_inputs","batch_n","batch_src","job_input_id","input_value","input_field","field_list","input_def","input_list","optional","batch","values","src","$tmpl","jobs","njobs","njobs_text","outputs","hid","JSON","stringify","requirements","requirements_message","req","Portlet","multiple","v","v_id","v_name","lst","_templateRow","Base","error_text","wait_text","$message","$options","all_button","_getValue","_templateOptions","$option","_templateOption","first","_size","exists","_messageShow","_messageHide","selected","BaseIcons","pair","faIconButton","tooltipConfig","classes","concat","faIcon","_interopRequireDefault","default","HandlebarsEnvironment","helpers","partials","decorators","_helpers","registerDefaultHelpers","_decorators","registerDefaultDecorators","_utils","_exception","_exception2","_logger","_logger2","VERSION","COMPILER_REVISION","REVISION_CHANGES",1,2,3,4,5,6,7,"objectType","logger","registerHelper","unregisterHelper","registerPartial","unregisterPartial","registerDecorator","unregisterDecorator","with_close","$close","has","_get_placement","newTitle","_get_width","$container","container_width","container_height","_get_height","container_position","minimumInputLength","initialData","select_data","_setValue","select2","_getIndex","splice","select_opt","containerCssClass","dropdownCssClass","escapeMarkup","formatResult","formatSelection","initSelection","dropdownAutoWidth","title_new","onnew","$nav","first_tab","current_id","$tabs","list","$tab_new","_template_tab_new","$tab_title","_template_tab","$tab_content","_template_tab_content","ondel","$del_icon","delRemovable","retitle","arg0","accumulator","tempStorage","parser","errors","getErrors","STATES_","ENTRY_OR_JUNK","OBJECT_TYPE","ENTRY_KEY","KV_KEY","EQUALS","KV_VALUE","DATA_","CALLBACK_","CHAR_","LINE_","CHAR_IN_LINE_","SKIPWS_","SKIPCOMMENT_","PARSETMP_","SKIPTILLEOL_","VALBRACES_","BRACETYPE_","BRACECOUNT_","STATE_","ERRORS_","ENTRY_TYPES_","inproceedings","proceedings","article","techreport","misc","mastersthesis","book","phdthesis","incollection","unpublished","inbook","manual","periodical","booklet","masterthesis","conference","online","MACROS_","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","processCharacter_","error_","processEntry_","f","raw","CHARCONV_","re","rep","processed","c","skip","ObjectType","AnotherIteration","ot","Key","EntryKey","Value","{","delim","doneParsingValue","macro","citationModel","CitationView","className","formattedReference","ref","authorsAndYear","_asSentence","author","year","pages","address","volume","journal","booktitle","howpublished","note","institution","_formatBookInfo","doiUrl","doi","chapter","editor","publisher","series","issn","CitationListView","renderCitation","click .citations-to-bibtex","click .citations-to-formatted","citation","citationView","rawTextarea","citationsElement","showFormatted","showBibtex","partialWarningElement","LIST_ITEM","DATASET_LI","BASE_MVC","FoldoutListItemView","ListItemView","DCListItemView","linkTarget","hasUser","_setUpListeners","isEqual","changed","_renderSubtitle","$subtitle","_getFoldoutPanelOptions","$selector","modelString","templates","warnings","wrapTemplate","purged","deleted","titleBarTemplate","titleBar","DCEListItemView","DatasetDCEListItemView","DatasetListItemView","_fetchModelDetails","inReadyState","hasDetails","NestedDCDCEListItemView","_swapNewRender","$newRender","state","DATASET_MODEL","DatasetCollectionElementMixin","model_class","element_identifier","element_index","element_type","_mergeObject","element_id","idAttribute","DatasetCollectionElement","DCECollection","DatasetDCE","DatasetAssociation","mixin","warn","objStr","DatasetDCECollection","SearchableModelMixin","collection_type","collectionClass","elements","_createElementsModel","unset","json","populated","isDeletedOrPurged","getVisibleContents","filters","delete","save","undelete","searchAttributes","idAndName","ListDatasetCollection","attrs","PairDatasetCollection","NestedDCDCE","NestedDCDCECollection","NestedPairDCDCE","NestedPairDCDCECollection","ListPairedDatasetCollection","HDCA","UI_MODAL","naturalSort","createListCollection","contents","promise","listCollectionCreatorModal","creationFn","element","history_content_type","createHDCA","DatasetCollectionElementView","toggle","toggleClass","source","hasClass","discard","parentWidth","animate","margin-right","destroy","click .name","click .discard","dragstart","dragend","dragover","drop","_click","ev","_clickName","prompt","_clickDiscard","_dragstart","originalEvent","dataTransfer","effectAllowed","setData","_dragend","_sendToParent","ListCollectionCreator","elementViewClass","HistoryListDatasetCollection","minElements","defaultAttributes","TypeError","oncreate","oncancel","autoscrollDist","highlightClr","metric","creator","initialElements","_instanceSetUp","_elementsSetUp","_setUpBehaviors","selectedIds","$dragging","blocking","invalidElements","workingElements","elementViews","_ensureElementIds","_validateElements","_mangleDuplicateNames","_sortElements","forEach","uniqueId","filter","problem","_isElementInvalid","contains","SAFETY","counter","existingNames","currName","speed","_renderInvalid","main","_renderHeader","_renderMiddle","_renderFooter","_addPluginComponents","invalidInitial","problems","helpContent","_invalidElementsAlert","$middle","middle","_renderList","hoverhighlight","_showAlert","_validationWarning","what","clear","VALIDATION_CLASS","_disableNameAndCreate","isUndefined","$list","_renderClearSelected","$tmp","removeElementView","elementView","_createElementView","invoke","_listenToElementView","addElementView","without","stopListening","_renderNoElementsLeft","noElementsLeft","_elementToJSON","createList","always","fail","xhr","done","_errorHandler","once","readyState","responseJSON","click .more-help","click .less-help","click .main-help","click .header .alert button","click .reset","click .clear-selected","click .collection-elements","dragover .collection-elements","drop .collection-elements","collection-element.dragstart .collection-elements","collection-element.dragend .collection-elements","change .collection-name","keydown .collection-name","click .cancel-create","click .create-collection","_clickMoreHelp","_clickLessHelp","_toggleHelp","alertClass","_hideAlert","reset","clearSelectedElements","_dragoverElements","_checkForAutoscroll","clientY","$nearest","_getNearestElement","$placeholder","$element","y","AUTOSCROLL_SPEED","upperDist","lowerDist","outerHeight","WIGGLE","lis","toArray","$li","halfHeight","floor","_dropElements","dropEffect","insertBefore","insertAfter","last","_syncOrderToDom","newElements","findWhere","_elementDragstart","_elementDragend","_changeName","_getName","_nameCheckForEnter","_clickCreate","collectionCreatorModal","CreatorClass","reject","closing_events","_collectionCreator","_super","changedAttributes","expanded","fxSpeed","_renderPrimaryActions","_renderDisplayButton","displayBtnData","urls","active","addDataset","_renderDetails","noAccess","$details","_renderSecondaryActions","_renderSummary","_renderDetailMessages","_renderDisplayApplications","summaryRenderFn","summaries","unknown","$warnings","detailMessages","templateFn","displayApplications","_renderDownloadButton","_renderShowParamsButton","show_params","hasData","_renderMetaFileDownloadButton","meta_file","meta_download","file_type","clone","click .display-btn","click .params-btn","click .download-btn","failed_metadata","detailsTemplate","noAccessTemplate","summaryTemplates","detailMessageTemplates","resubmitted","displayApplicationsTemplate","details","Manager","checksum","sum","section","field","flat_id","flat_dict","result_dict","convert","identifier","head","input","section_label","block_indices","block_prefix","block_label","pos","sort","a","test_param","selectedCase","matchCase","flat","collapsible_value","payload","p_id","dict","_iterate","matchModel","matchIds","new_id","separator","child","truevalue","falsevalue","cases","matchContext","context","isObject","mapping","cache","mapped","text_enable","text_disable","cls_enable","cls_disable","$field","$preview","$collapsible","$collapsible_icon","$error_text","$error","$backdrop","opacity","_tooltip","argument","collapsible_preview","text_value","SelectContent","SelectLibrary","SelectFtp","ColorPicker","types","data_column","genomebuild","data_collection","integer","float","boolean","drill_down","color","hidden","hidden_data","baseurl","library_data","ftpfile","default_value","fieldClass","incompatible","_fieldSelect","_fieldText","_fieldData","extensions","is_workflow","option","SelectClass","searchable","_fieldDrilldown","str_value","String","_fieldSlider","precise","_fieldHidden","_fieldBoolean","_fieldColor","_fieldLibrary","_fieldFtp","Table","empty_text","button_new","table","button_delete","table_row","hideOptions","Repeat","InputElement","Parameters","parameters","_addConditional","_addRepeat","_addSection","_addRow","sustain_conditionals","case_def","section_id","section_row","nonhidden","sub_section_id","sub_section","block_index","repeat","n_cache","sustain_repeats","input_element","button_visible","element_list","Tabs","radio_buttons","mode","textify","hda_error","hdca_error","select_single","select_multiple","select_collection","button_type","refresh","$batch","template_batch","n_buttons","button_width","margin-left","_update","select_options","hda","hdca","err","id_list","_select","_batch","map_over_type","FormSection","FormData","initial_errors","new_model","new_options","opt","is_dynamic","$panel","_renderForm","current_check","new_check","DC_MODEL","HISTORY_CONTENT","buildHDCASave","isNew","hcontentMixin","HistoryContentMixin","ListDC","PairDC","ListPairedDC","HistoryPairDatasetCollection","HistoryListPairedDatasetCollection","typeIdStr","type_id","_typeIdStr","_createTypeId","isVisible","show_deleted","show_hidden","unhide","nameAndId","HistoryContent","HDA_MODEL","HDCA_MODEL","HistoryContents","HistoryDatasetAssociation","validationError","models","historyId","notReady","running","idList","isRunning","getByHid","getVisible","filteredHdas","filterFn","haveDetails","all","fetchAllDetails","detailsFlag","ajaxQueue","ajaxFn","startingLength","responses","ajaxFns","chain","reverse","notify","curr","shift","isCopyable","contentsJSON","copyableModelClasses","copy","contentType","isString","LibraryDatasetDatasetAssociation","HistoryDatasetCollectionAssociation","post","matches","matchesWhat","elementIdentifiers","collectionType","typeToModel","paired","element_identifiers","print","ExpandableView","_buildNewRender","_queueNewRender","queue","next","$where","$newDetails","toggleExpanded","_expand","slideDown","duration","step","complete","slideUp","SelectableViewMixin","DraggableViewMixin","isSelectable","_renderWarnings","_renderTitleBar","selectable","showSelector","draggable","draggableOn","subtitle","click .title-bar","keydown .title-bar","click .selector","_clickTitleBar","altKey","toggleSelect","_keyDownTitleBar","KEYCODE_SPACE","KEYCODE_RETURN","elTemplato","subtitleTemplate","foldoutStyle","foldoutPanelClass","foldout","_createFoldoutPanel","_attachFoldout","FoldoutClass","_getFoldoutPanelClass","$whereTo","_expandByDrilldown","FormBase","CitationModel","_buildForm","needs_update","process","_updateModel","_buildModel","description","_operations","_footer","hide_message","build_url","build_data","tool_model","location","error_message","redirect","model_url","update_url","current_state","versions_button","narrow","sustain_version","versions","menu_button","biostar_url","open","origin","sharable_url","menu","citations","$citations","citation_list_view","util","tool_form_template","tool_link_template","panel_section_template","tool_search_template","VisibilityMixin","is_visible","ToolParameter","num_samples","unescape","set_value","ToolParameterCollection","DataToolParameter","IntegerToolParameter","get_samples","d3","scale","linear","domain","ticks","FloatToolParameter","SelectToolParameter","subModelTypes","Tool","p_class","remove_inputs","tool","incompatible_inputs","only_samplable_inputs","valid_inputs","apply_search_results","results","set_input_value","set_input_values","inputs_dict","input_name","run","_run","rerun","target_dataset","regions","action","target_dataset_id","get_inputs_dict","input_dict","additional_params","run_deferred","ss_deferred","ToolCollection","ToolSectionLabel","ToolSection","elems","clear_search_results","cur_label","all_hidden","ToolSearch","search_hint_string","min_chars_for_search","clear_btn_url","query","clear_key","do_search","q","timer","ga","clear_search","tool_search","tools","layout","parse_elt","elt_dict","panel_elt","BaseView","update_visible","ToolLinkView","$link","form","ToolSectionLabelView","ToolSectionView","update_open","section_body","tool_view","label_view","click .toolSectionTitle > a","ToolSearchView","keyup :input","click #search-clear-btn","focus_and_select","query_changed","evData","which","ToolPanelView","handle_search_results","search_view","section_title_view","ToolFormView","tool_panel_view","tool_form_view","show_tool","PopupMenu","_renderAndShow","clickEvent","_getShownPosition","_setUpCloseBehavior","li","check","menuWidth","x","pageX","document","scrollLeft","pageY","closePopup","one","addItem","removeItem","findIndexByHtml","findItemByHtml","button_element","initial_options","convertedOptions","optionVal","optionKey","newOption","convertLinksToOptions","$parent","selector","elem","linkHref","confirmText","confirm","fromExistingDom","$buttonElement","$menuElement","menuElementLinkSelector","make_popup_menus","menuSelector","buttonSelectorBuildFn","popupMenusCreated","fromDom","standard","base","theme","$view","$value","_build","$boxes","_templateCheck","hex","rgb","_content","padding","line_def","bottom","_templateContent","$label","$line","$box","_templateBox","initial","header_index","_setState","header_id","is_expanded","$subgroup","attach","iterate","level","has_options","new_header","$group","$buttongroup","$select","$icon_dropdown","minHeight","currentY","currentHeight","_availableOptions","sorter","closeOnSelect","setOnChange","available","List","ftpfile_list","Libraries","LibraryDatasets","library_id","libraries","datasets","library_select","dataset_list","library_current","useslider","$slider","slider","ui","$text","pressed","_isParameter","substring","extension","genome","url_paste","file_name","file_mode","file_size","file_path","file_data","percentage","space_to_tab","to_posix_lines","has_deferred","charAt","toUpperCase","ready","isEmptyObject","queryString","keyRegex","RegExp","parsed","pairString","decodeURI","Handlebars","compiler","depth0","helper","alias1","alias2","helperMissing","alias3","alias4","hash","useData","stack1","program","inverse","noop","lambda","labels","link","min_width","_interopRequireWildcard","newObj","hb","SafeString","_handlebarsSafeString2","_handlebarsException2","VM","runtime","spec","_handlebarsBase","_handlebarsSafeString","_handlebarsException","_handlebarsUtils","_handlebarsRuntime","_handlebarsNoConflict","_handlebarsNoConflict2","inst","instance","_decoratorsInline2","_decoratorsInline","props","ret","original","_helpersBlockHelperMissing2","_helpersEach2","_helpersHelperMissing2","_helpersIf2","_helpersLog2","_helpersLookup2","_helpersWith2","_helpersBlockHelperMissing","_helpersEach","_helpersHelperMissing","_helpersIf","_helpersLog","_helpersLookup","_helpersWith","execIteration","priorKey","conditional","includeZero","methodMap","lookupLevel","levelMap","method","_len","_key","global","$Handlebars","noConflict","checkRevision","compilerInfo","compilerRevision","currentRevision","_base","runtimeVersions","compilerVersions","templateSpec","env","invokePartialWrapper","resolvePartial","invokePartial","compile","compilerOptions","indent","lines","l","depths","_setup","initData","useBlockParams","useDepths","executeDecorators","decorator","main_d","strict","lookup","programs","declaredBlockParams","programWrapper","wrapProgram","depth","common","isTop","usePartial","useDecorators","_child","prog","currentDepths","partialBlock","Function","AnnotationEditor","HiddenUntilActivatedViewMixin","hiddenUntilActivated","$activator","$annotation","newAnnotation","annotation","previous","LIST_VIEW","DC_LI","ModelListPanel","CollectionView","DatasetDCEViewClass","NestedDCDCEViewClass","modelCollectionKey","panelStack","parentName","_filterCollection","_getItemViewClass","_getItemViewOptions","_setUpItemViewListeners","panel","drilldown","_expandDrilldownPanel","_collapseDrilldownPanel","click .navigation .back","close","controlsTemplate","controls","ListCollectionView","PairCollectionView","ListOfPairsCollectionView","TAGS","ANNOTATIONS","DatasetListItemEdit","purgeAllowed","tagsEditorShown","annotationEditorShown","actions","_renderEditButton","_renderDeleteButton","editBtnData","edit","deletedAlready","_renderTags","_renderAnnotation","_makeDbkeyEditLink","unshift","_renderErrButton","_renderRerunButton","_renderVisualizationsButton","report_error","creating_job","__WEBPACK_AMD_REQUIRE_ARRAY__","visualizations","$visualizations","_addScratchBookFn","addBack","$links","tagsEditor","TagsEditor","onshowFirstTime","onshow","onhide","annotationEditor","editableDbkey","click .undelete-link","click .purge-link","click .edit-btn","click .delete-btn","click .rerun-btn","click .report-err-btn","click .visualization-btn","click .dbkey a","_clickUndeleteLink","_clickPurgeLink","purge","visualizationsTemplate","searchableMixin","accessible","data_type","meta_files","misc_blurb","misc_info","tags","_generateUrls","visualization","currModel","newState","dataset","responseObj","messageBuriedInUnfortunatelyFormattedError","responseText","searchAliases","format","database","blurb","DatasetAssociationCollection","HDAListItemView","DATASET","DC_VIEW","HDCAListItemView","change:populated change:visible","HISTORY_CONTENTS","UTILS","History","historyJSON","updateTimeoutId","msg","errorHandler","makeArray","newId","clearUpdateTimeout","nice_size","bytesToString","ownedByCurrUser","contentsCount","reduce","memo","num","checkForUpdates","onReadyCallback","setUpdateTimeout","delay","UPDATE_DELAY","detailIds","_delete","allDatasets","postData","all_datasets","newHistory","setAsCurrent","getHistoryData","getHistory","historyData","getContents","detailIdsFn","hdcaDetailIds","dataset_details","dataset_collection_details","df","historyFn","contentsFn","historyXHR","contentsXHR","ControlledFetchMixin","_buildFetchData","traditional","_fetchOptions","fetchDefaults","_fetchDefaults","pick","_buildFetchFilters","filterMap","qv","HistoryCollection","DEFAULT_ORDER","sortOrders","update_time","getter","h","Date","asc","update_time-asc","name-dsc","size-asc","includeDeleted","setOrder","order","currentHistoryId","allFetched","setUpListeners","change:deleted","copied","newData","setCurrent","set-as-current","oldCurrentId","sortOrder","comparator","fetchOptions","limit","fetchData","numFetched","hdas","historyOptions","xhrOptions","LoadingIndicator","ListPanel","viewClass","emptyMsg","noneFoundMsg","searchPlaceholder","searchFor","indicator","selecting","lastSelected","dragItems","views","$scrollContainer","freeViews","_showLoadingIndicator","_hideLoadingIndicator","_setUpCollectionListeners","_setUpViewListeners","renderItems","addItemView","removeItemView","shiftKey","lastSelectedView","viewFromModelId","selectRange","showSelectors","_renderControls","_renderTitle","_renderSearch","$controls","_renderMultiselectActionMenu","multiselectActions","$newMenu","$actions","$messages","$emptyMessage","itemModel","_createItemView","_attachItems","_renderEmptyMessage","_filterItem","every","matchesAll","ViewClass","getSelectedModels","expandAll","collapseAll","_attachView","viewFromModel","viewsWhereModel","properties","viewRange","viewA","viewB","indexA","indexB","searchInput","initialVal","onfirstsearch","_firstSearch","onsearch","searchItems","onclear","clearSearch","THROTTLE_SELECTORS_AT","hideSelectors","hideSelector","toggleSelectors","selectAll","deselectAll","deselect","range","getSelectedViews","scrollPosition","scrollTo","scrollToTop","scrollToItem","itemTop","scrollToId","click .select-all","click .deselect-all","elTemplate","setModel","freeModel","oldModelId","_setUpModelListeners","$input","_getTagsUsed","tagsToCSV","tagsArray","added","_addNewTagToTagsUsed","newTag","tagsUsed","class_add","class_remove","class_partial","onadd","onremove","ftp_files","_fill","_templateTable","_add","$select_all","ftp_file","model_index","_find","_templateInfo","$it","filtered","where","ctime","class_check","class_uncheck","_switchState","_renderState","$cover","parameter_id","checked","scope","$this","targetSelector","mouseover","background","mouseout","parentNode","clearSearchInput","searchTerms","firstSearch","inputTemplate","KEYCODE_ESC","escWillClear","minSearchLen","$clearBtn","$loadingIndicator","toggleLoadingIndicator","$parentNode","inputVal","oninit","s","nC","fromCharCode","xN","yN","xD","getTime","yD","oFxNcL","oFyNcL","cLoc","numS","uploadpost","cnf","progress","maxfilesize","error_filesize","error_default","error_server","error_login","sizes","files","file","XMLHttpRequest","setRequestHeader","onreadystatechange","DONE","parseJSON","statusText","addEventListener","lengthComputable","loaded","send","uploadinput","opts","ondragover","ondragleave","change","dialog","uploadbox","queue_running","current_index","queue_index","duplicate","announce","queue_length","queue_stop","stop","configure","compatible","File","FileList","dragleave","m","alert","RightPanel","historyOptionsMenu","CurrentHistoryView","refreshButton","optionsButton","viewMultiButton","optionsMenu","anonymous","_templateBody","LeftPanel","Tools","Upload","_renderWorkflowMenu","handle_minwidth_hint","_templateTool","menu_entry","stored_workflow","encoded_stored_workflow_id","DATASET_LI_EDIT","DCListItemEdit","DCEListItemEdit","DatasetDCEListItemEdit","NestedDCDCEListItemEdit","DC_EDIT","CollectionViewEdit","nameSelector","newName","previousName","ListCollectionViewEdit","PairCollectionViewEdit","NestedPairCollectionViewEdit","ListOfPairsCollectionViewEdit","levenshteinDistance","LIST_COLLECTION_CREATOR","autoPairFnBuilder","getRegExps","_regexps","createPair","listA","listB","aInBIndex","bInAIndex","_pair","preprocessMatch","regexps","matchTo","bestMatch","score","scoreThreshold","createListOfPairsCollection","pairedCollectionCreatorModal","PairView","currentTarget","style","PairedCollectionCreator","DEFAULT_FILTERS","automaticallyPair","strategy","matchPercentage","twoPassAutopairing","initialList","commonFilters","strategies","DEFAULT_STRATEGY","removeExtensions","unpairedPanelHidden","pairedPanelHidden","_dataSetUp","illumina","Rs","simple","lcs","levenshtein","unpaired","_sortInitialList","_ensureIds","autoPair","_sortDatasetList","_splitByFilters","_filter","regexFilters","stringFilter","_addToUnpaired","binSearchSortedIndex","low","hi","mid","compared","autopairSimple","autopairLevenshtein","distance","autopairLCS","_naiveStartingAndEndingLCS","s1","s2","fwdLCS","revLCS","fwd","rev","_createPair","_guessNameForPair","forward","fwdName","revName","lastDotIndex","lastIndexOf","_unpair","unpairAll","pairs","_pairToJSON","ajaxData","_ajaxErrHandler","_renderFilters","_renderUnpaired","_renderPaired","$fwd","$rev","$prd","_renderUnpairedDisplayStr","_renderUnpairedEmpty","_renderPairButton","_renderUnpairedDataset","_adjUnpairedOnScrollbar","_renderUnpairedNotShown","numFiltered","$msg","$unpairedColumns","$firstDataset","ucRight","outerWidth","dsRight","rightDiff","_renderPairedEmpty","pairView","_chooseFiltersPopover","filterChoice","val1","val2","$popoverContent","filterSet","popover","splitView","msgClass","hideUnpaired","click .forward-column .column-title","click .reverse-column .column-title","click .unpair-all-link","change .forward-unpaired-filter input","focus .forward-unpaired-filter input","click .autopair-link","click .choose-filters .filter-choice","click .clear-filters-link","change .reverse-unpaired-filter input","focus .reverse-unpaired-filter input","click .forward-column .dataset.unpaired","click .reverse-column .dataset.unpaired","click .paired-column .dataset.unpaired","click .unpaired-columns","mousedown .unpaired-columns .dataset","click .paired-column-title","mousedown .flexible-partition-drag","click .paired-columns .dataset.paired","click .paired-columns","click .paired-columns .pair-name","click .unpair-btn","dragover .paired-columns .column-datasets","drop .paired-columns .column-datasets","pair.dragstart .paired-columns .column-datasets","pair.dragend .paired-columns .column-datasets","change .remove-extensions","toggleExtensions","_clickShowOnlyUnpaired","hidePaired","_clickShowOnlyPaired","_clickUnpairAll","_clickAutopair","_clickFilterChoice","$selected","_hideChooseFilters","_clearFilters","_clickUnpairedDataset","toggleSelectUnpaired","$dataset","force","waitToPair","pairAllSelected","fwds","revs","clearSelectedUnpaired","_mousedownUnpaired","$startTarget","moveListener","_clickPairRow","rowIndex","_startPartitionDrag","endDrag","unbind","trackMouse","startingY","adjPartition","mousemove","adj","$unpaired","$paired","unpairedHi","pairedHi","movingUpwards","flex","selectPair","clearSelectedPaired","_clickPairName","$name","$pair","customizedName","_clickUnpair","pairIndex","_dragoverPairedColumns","_getNearestPairedDatasetLi","_dropPairedColumns","_syncPairsToDom","newPaired","_pairDragstart","_pairDragend","_printList","_printPair","LIST_CREATOR","createPairCollection","pairCollectionCreatorModal","PairedDatasetCollectionElementView","PairCollectionCreator","_createForwardElementView","_createReverseElementView","swap","click .swap","MODAL","CopyDialog","defaultName","submitLabel","errorMessage","progressive","activeLabel","allLabel","anonWarning","_showAjaxIndicator","margin-top","checkNameAndCopy","copyAllDatasets","rejectWith","autoClose","defaultCopyNameFn","nameFn","defaultCopyName","defaultCopyWhat","allowAll","originalClosingCallback","closing_callback","isAnon","copyWhat","cancelled","ImportDialog","historyCopyDialog","useImport","HDA_LI","HDAListItemEdit","click .unhide-link","HDCA_LI","DC_VIEW_EDIT","HDCAListItemEdit","HISTORY_MODEL","HISTORY_VIEW_EDIT","HistoryViewPrefs","SessionStorageModel","storageKey","HistoryViewEdit","HDCAViewClass","preferences","currentContentId","loadHistoryWithDetails","contentsData","switchToHistory","createNewHistory","displayMessage","loadHistory","oldState","storage","_debouncedScrollCaptureHandler","debounce","prependTo","_renderQuotaMessage","quotaMsg","$emptyMsg","$toolMenu","_setCurrentContentById","setCurrentContent","galaxy","pathToMatch","fullpath","useToURLRegexMap","hdaId","hdaUse","regex","use","showQuotaMessage","hideQuotaMessage","isOverQuota","clearMessages","$target","not","quotaMsgTemplate","HISTORY_VIEW","HDA_LI_EDIT","HDCA_LI_EDIT","PAIR_COLLECTION_CREATOR","LIST_OF_PAIRS_COLLECTION_CREATOR","HistoryView","HDAViewClass","dataDropped","dropTargetOff","_renderCounts","_handleHdaDeletionChange","_handleHdaVisibleChange","updateHistoryDiskSize","toggleLink","_class","msgs","showDeleted","showHidden","toggleHDATagEditors","toggleHDAAnnotationEditors","_collectionActions","showOrHide","click .show-selectors-btn","click .toggle-deleted-link","toggleShowDeleted","click .toggle-hidden-link","toggleShowHidden","dropTargetOn","dropTarget","dropHandlers","dragenter","$dropTarget","_renderDropTarget","_renderDropTargetHelp","evName","border","border-radius","font-size","font-style","_dropHandlers","dropTargetToggle","getData","USER","HistoryPrefs","expandedIds","addExpanded","removeExpanded","omit","storageKeyPrefix","historyStorageKey","clearAll","sessionStorage","loading-done","views:ready view:attached view:removed","_renderSelectButton","initiallyExpanded","_loadHistoryFromXHR","JSONToModel","newHistoryJSON","newHdaJSON","_setUpWebStorage","isBoolean","change:show_deleted","newVal","change:show_hidden","$existing","click .messages [class$=message]","store","inputSelector","_parseErrorMessage","sentryId","_bePolite","raven","Raven","lastEventId","agent","navigator","userAgent","lastAjax","User","getAllResponseHeaders","responseHeaders","compact","$msgContainer","$detailsLink","_messageToModalOptions","functions","pre","Ok","scrollToHid","buildMenu","menuOption","anon","galaxy_main","UploadSettings","UploadFtp","Popover","status_classes","init","_refreshReady","button_menu","_showFtp","ftp","settings","_showSettings","_refreshPercentage","_refreshStatus","_refreshInfo","_refreshFileName","_refreshMode","_refreshFileSize","offsetHeight","UploadModel","UploadRow","select_extension","select_genome","list_extensions","list_genomes","currentFtp","btnStart","_eventStart","btnClose","ext","composite_files","file_desc","_showExtensionInfo","_eventAnnounce","_updateScreen","upload_row","toData","_eventSuccess","_eventError","_eventProgress","it","extension_popup","_templateDescription","description_url","queued","updateGenome","updateExtension","_removeRow","showExtensionInfo","_refreshGenome","_refreshExtension","count","upload_size","ui_button","btnLocal","btnFtp","_eventFtp","btnCreate","_eventCreate","btnStop","_eventStop","btnReset","_eventReset","_eventComplete","_eventRemove","_uploadPercentage","upload_completed","currentHistory","defaults_only","_percentage","_status","UploadButton","UploadViewDefault","UploadViewComposite","auto","current_history","ui_button_view","datatypes","a_text","b_text","datatypes_disable_auto","genomes","current_user","tabs","default_view","composite_view","title_separator","items","prefix","$indicator","cover","z-index","background-color","text-align","matrix"],"mappings":"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AChB,YAAe,MACf,YAAe,MACf,eACA,eACA,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,YAAe,MACf,YAAe,MACf,eACA,eACA,YAAe,MACf,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,YAAe,MACf,cAAiB,MACjB,cAAiB,MACjB,eAAkB,MAClB,cAAiB,MACjB,eACA,YAAe,MACf,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,YAAe,MACf,YAAe,MACf,gBACA,cACA,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,YAAe,MACf,YAAe,MACf,eACA,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,aAAgB,MAChB,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,eACA,eACA,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,aAAgB,MAChB,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,aAAgB,MAChB,kBACA,YAAe,MACf,cAAiB,MACjB,YAAe,MACf,cAAiB,MACjB,YAAe,MACf,cAAiB,MACjB,YAAe,MACf,YAAe,MACf,YAAe,MACf,cACA,aAAgB,MAChB,eAAkB,MAClB,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,cACA,cACA,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,eACA,eACA,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,eACA,eACA,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,aAAgB,MAChB,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,aAAgB,MAChB,aAAgB,MAChB,aAAgB,MAChB,aAAgB,MAChB,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,YAAe,MACf,sBACA,sBACA,gBACA,2BACA,YAAe,MACf,oBACA,qBACA,qBACA,oBACA,qBACA,uBACA,sBACA,qBACA,oBACA,oBACA,oBACA,oBACA,sBACA,qBACA,oBACA,oBACA,sBACA,oBACA,oBACA,qBACA,sBACA,kBACA,oBACA,mBACA,oBACA,mBACA,oBACA,oBACA,sBACA,qBACA,oBACA,oBACA,oBACA,oBACA,oBACA,oBACA,sBACA,sBACA,sBACA,qBACA,oBACA,2BACA,qBACA,qBACA,oBACA,qBACA,qBACA,qBACA,oBACA,mBACA,2BACA,+BACA,WAAc,MACd,WAAc,MACd,yBACA,WAAc,MACd,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,sBACA,oBACA,kBACA,qBACA,kBACA,mBACA,YAAe,MACf,YAAe,MACf,YAAe,MACf,gBAAmB,MACnB,YAAc,MACd,kBAAqB,MACrB,wBAA2B,MAC3B,+BAAkC,MAClC,kBACA,iBACA,kBACA,kBACA,oBACA,iBACA,gBACA,kBACA,iBACA,kBACA,mBACA,eACA,eACA,gBACA,kBACA,gBACA,oBACA,gBACA,gBACA,gBACA,kBACA,2BAA8B,MAC9B,2BAA8B,MAC9B,sBAAyB,MACzB,wBAA2B,MAC3B,oBAAuB,MACvB,qBAAwB,MACxB,kCAAqC,MACrC,kBACA,iBACA,kBACA,kBACA,oBACA,iBACA,gBACA,sBACA,iBACA,kBACA,mBACA,eACA,eACA,eACA,eACA,gBACA,qBACA,kBACA,gBACA,oBACA,mBACA,gBACA,gBACA,kBACA,oBAAuB,MACvB,uBAA0B,MAC1B,YAAe,MACf,wBAA2B,MAC3B,sBAAyB,MACzB,8BAAiC,MACjC,yBACA,oBACA,gBACA,kBACA,mBACA,oBACA,oBACA,kBACA,kBACA,qBACA,mBACA,sBACA,wBACA,2BACA,4BACA,0BAA6B,MAC7B,2BACA,4BACA,2BACA,2BACA,2BACA,4BACA,4BACA,6BACA,0BAA6B,MAC7B,8BACA,6BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,2BACA,0BACA,0BACA,8BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,2BACA,2BACA,6BACA,8BACA,4BACA,8BACA,6BACA,2BACA,2BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,2BACA,0BACA,0BACA,8BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,0BACA,2BACA,2BACA,6BACA,8BACA,4BACA,8BACA,6BACA,2BACA,2BACA,2BACA,4BACA,0BAA6B,MAC7B,2BACA,4BACA,2BACA,2BACA,2BACA,4BACA,4BACA,6BACA,0BAA6B,MAC7B,8BACA,6BACA,8BACA,8BACA,4BACA,6BACA,6BACA,6BACA,6BACA,gCACA,gCACA,6BACA,gCACA,gCACA,4BACA,4BACA,4BACA,4BACA,6BACA,4BACA,2BACA,2BACA,iCACA,iCACA,mCACA,mCACA,2BACA,2BACA,8BACA,8BACA,kCACA,yCACA,iCACA,kCACA,kCACA,8BACA,8BACA,4BACA,4BACA,8BACA,8BACA,4BACA,4BACA,8BACA,8BACA,6BACA,6BACA,6BACA,6BACA,8BACA,8BACA,8BACA,8BACA,8BACA,8BACA,6BACA,6BACA,2BACA,2BACA,4BACA,4BACA,8BACA,8BACA,6BACA,6BACA,6BACA,6BACA,0BACA,0BACA,8BACA,8BACA,6BACA,6BACA,8BACA,8BACA,+BACA,+BACA,+BACA,+BACA,6BACA,6BACA,8BACA,8BACA,iCACA,iCACA,iCACA,4BACA,4BACA,4BACA,4BACA,+BACA,+BACA,2BACA,2BACA,8BACA,8BACA,+BACA,+BACA,6BACA,6BACA,qBAAwB,MACxB,mBAAsB,MACtB,sBAAyB,MACzB,sBAAyB,MACzB,uBAA0B,MAC1B,mBAAsB,MACtB,mBAAsB,MACtB,uBAA0B,MAC1B,qBACA,uBACA,uBACA,wBAA2B,MAC3B,iBACA,sBACA,6BACA,8BACA,uBACA,0BACA,uBACA,kBACA,4BACA,+BACA,sBACA,0BACA,2BACA,qBACA,wBACA,4BAA+B,MAC/B,yBAA2B,MAC3B,kBACA,mBACA,iBAAoB,MACpB,kBAAqB,MACrB,kBAAqB,MACrB,mBAAsB,MACtB,iBAAoB,MACpB,mBACA,kBAAqB,MACrB,mBAAsB,MACtB,kBAAqB,MACrB,kBAAqB,MACrB,iBAAoB,MACpB,gCACA,eACA,iBAAoB,MACpB,iBAAoB,MACpB,kBAAqB,MACrB,mBAAsB,MACtB,iBAAoB,MACpB,oBACA,0BACA,iBAAoB,MACpB,kBACA,gBACA,mBAAsB,MACtB,2BAA8B,MAC9B,eACA,kBAAqB,MACrB,mBAAsB,MACtB,kBAAqB,MACrB,kBAAqB,MACrB,kBAAqB,MACrB,kBAAqB,MACrB,kBAAqB,MACrB,kBACA,iBACA,kBACA,mBACA,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,wBAA2B,MAC3B,sBACA,oBACA,uBACA,sBACA,2BACA,wBACA,oBACA,oBACA,oBACA,oBACA,uBACA,wBACA,2BACA,2BACA,6BACA,8BACA,0BACA,2BACA,mBACA,0BACA,2BACA,0BACA,2BACA,gCACA,4BACA,gBACA,gBACA,2BAA8B,MAC9B,2BACA,4BACA,4BACA,6BACA,0BACA,4BACA,2BACA,0BACA,2BACA,6BACA,6BACA,4BACA,4BACA,2BACA,4BACA,2BACA,uBACA,6BACA,2BACA,8BACA,8BACA,uBACA,4BACA,wBACA,sBACA,oBACA,uBACA,sBACA,2BACA,wBACA,uBACA,wBACA,4BACA,6BACA,mBACA,uBACA,oBACA,mBACA,oBACA,uBACA,kBACA,eACA,oBACA,eACA,oBACA,iBACA,mBACA,gBACA,eACA,oBACA,qBACA,iBACA,mBACA,iBACA,mBACA,kBACA,uBACA,kBACA,0BACA,2BACA,gBACA,iBACA,qBACA,sBACA,kBACA,gBACA,gBACA,gBACA,gBACA,wBACA,gCACA,iBACA,yBACA,wBACA,wBACA,2BAA8B,MAC9B,2BAA8B,MAC9B,sBACA,oBACA,kBACA,2BAA8B,MAC9B,6CAAgD,MAChD,uBACA,gBACA,oBACA,qBACA,eACA,qBACA,2BAA8B,MAC9B,gCACA,kBACA,uBACA,iBACA,2BACA,sBACA,mBACA,wBACA,qBACA,sBACA,4BACA,qBACA,kBACA,mBACA,kCACA,mBACA,+BACA,kBACA,4BACA,qBACA,0BACA,yBACA,mBACA,mBACA,sBACA,2BAA8B,MAC9B,sBACA,sBACA,2BAA8B,MAC9B,iBACA,kBACA,uBACA,gBACA,gBACA,iBACA,iBACA,kBACA,4BACA,kBACA,4BACA,eACA,8BACA,eACA,oCACA,oBACA,oCACA,gBACA,gBACA,qBACA,qBACA,yBACA,4BACA,2BAA8B,MAC9B,2BAA8B,MAC9B,oBACA,oBACA,2BACA,2BACA,iBACA,iBACA,wBACA,wBACA,uBACA,mCACA,uBACA,mCACA,sBACA,sBACA,mBACA,mBACA,wBACA,wBACA,qBACA,qBACA,0BACA,0BACA,sBACA,gCACA,sBACA,+BACA,kBACA,qBACA,kCACA,qBACA,oCACA,uBACA,uBACA,kBACA,kBACA,kBACA,mBACA,mBACA,mBACA,iBACA,wBACA,uBACA,wBACA,oBACA,qBACA,qBACA,mBACA,kBACA,kBACA,gBACA,iBACA,sBACA,wBACA,kBACA,mBACA,kBACA,mBACA,mBACA,mBACA,mBACA,4BACA,6BACA,2BACA,4BACA,qBACA,kBACA,qBACA,6BACA,qBACA,mBACA,0BACA,2BAA8B,MAC9B,2BAA8B,MAC9B,mBACA,mBACA,oBACA,iBACA,iBACA,0BACA,mBACA,mBACA,mBACA,2BACA,4BACA,sBACA,qBACA,uBACA,mBACA,mBACA,gBACA,gBACA,sBACA,oBACA,mBACA,yBACA,4BACA,sBACA,sBACA,wBACA,wBACA,4BACA,4BACA,sBACA,kBACA,kBACA,+BACA,qBACA,0BACA,2BACA,4BACA,6BACA,kBACA,kBACA,4BACA,8BACA,qBACA,4BACA,kBACA,kBACA,mBACA,mBACA,qBACA,yBACA,qBACA,qBACA,qBACA,qBACA,kBACA,kBACA,mBACA,mBACA,2BAA8B,MAC9B,sBACA,uBACA,uBACA,6BACA,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,qBACA,sBACA,qBACA,mBACA,iBAAoB,MACpB,mBACA,wBACA,gBAAmB,MACnB,sBACA,2BAA8B,MAC9B,iBAAoB,MACpB,0BACA,0BACA,wBACA,+BACA,0BACA,iBAAoB,MACpB,4BACA,8BACA,yBACA,8BACA,yBACA,iBAAoB,MACpB,oBACA,oBACA,iBAAoB,MACpB,qBACA,qBACA,qBACA,iBAAoB,MACpB,sBACA,oBACA,oBACA,qBACA,oBACA,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,sBACA,oBACA,kBACA,iBACA,oBACA,mBACA,mBACA,oBACA,kBACA,kBACA,mBACA,mBACA,mBACA,gBACA,kBACA,kBACA,oBACA,wBACA,wBACA,qBACA,mBACA,iBAAoB,MACpB,oBACA,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,wBACA,uBACA,iBACA,oBACA,kBACA,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,gBAAmB,MACnB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAAoB,MACpB,iBAA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B,aAAA,SAAAjJ,GACA,GAAA/4B,GAAAJ,KAAAkiC,UACA9hC,GAESJ,KAAAg7B,UACTh7B,KAAAs+B,WAAAl+B,GAFAJ,KAAAk9B,mBAAA,SAWArJ,WAEAuI,KAAA9/B,EAAA0d,UACA,8CACA,yDACA,+CACA5J,KAAA,KAGAvE,OAAAvP,EAAA0d,UACA,qCACA,mDAA+DyF,EAAA,oBAC/D,6BACA,mDAAmEA,EAAA,eACnE,SACA,SACA,wCACA,4DACA,UAAAA,EAAA,oEACA,sCACA,UACArP,KAAA,KAGA0sB,OAAAxgC,EAAA0d,UACA,6CACA,+CACA,UAAAyF,EAAA,yCACAA,EAAA,cACA,OACA,wDACA,UAAAA,EAAA,wCACAA,EAAA,kBACA,OACA,SACA,8DACA,UACArP,KAAA,KAGAtE,OAAAxP,EAAA0d,UACA,iCACA,sBACA,0DACA,gBAAAyF,EAAA,+CACA,kDAAAA,EAAA,kBACA,SACA,SAEA,gDACA,wCACA,mDAAAA,EAAA,sBACA,8CACA,0EACAA,EAAA,yCACA,+BACA,YACA,yCACA,mBAAAA,EAAA,2CACA,mBAAAA,EAAA,yDACA,QACA,SACA,SAEA,wCACA,qDAAAA,EAAA,2BACA,SACA,UACArP,KAAA,KAGAusB,YAAArgC,EAAA0d,UACA,MAAAyF,GACA,oGACA,sGACA,iEACArP,KAAA,YACA,OACA,OAAAqP,GACA,8CACA,qEACArP,KAAA,aACA,OAAAqP,GACA,mEACA,uEACArP,KAAA,aACA,OAAAqP,GACA,+FACA,sGACA,yEACA,mEACArP,KAAA,aACA,OAAAqP,GACA,oGACA,kBACArP,KAAA,aACA,OAAAqP,GACA,wFACArP,KAAA,aACA,cACA,MAAAqP,GACA,4FACA,gEACArP,KAAA,aACAA,KAAA,KAGA6qB,gBAAA3+B,EAAA0d,UACAyF,EAAA,mEACA,mDACA,mEACA,kBACArP,KAAA,KAGAguB,eAAA9hC,EAAA0d,UACA,wCACAyF,EAAA,sBACAA,EAAA,oEAAAA,EAAA,sBACA,SACArP,KAAA,KAGAqsB,eAAAngC,EAAA0d,UACA,wCACA,2DACA,+BACA,kCAC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CA,SACA,SACA,+EACA,oCACA,UACArP,KAAA,KAGAtE,OAAAxP,EAAA0d,UACA,iCACA,sBACA,sDACAyF,EAAA,8CACA,iEACA,WACA,SACA,sBACA,0DACA,gBAAAA,EAAA,yCACA,kDAAAA,EAAA,kBACA,SACA,SAEA,gDACA,wCACA,mDAAAA,EAAA,sBACA,8CACA,0EACAA,EAAA,yCACA,+BACA,YACA,yCACA,mBAAAA,EAAA,2CACA,mBAAAA,EAAA,yDACA,QACA,SACA,SAEA,wCACA,qDAAAA,EAAA,2BACA,SACA,UACArP,KAAA,KAGAusB,YAAArgC,EAAA0d,UACA,MAAAyF,GACA,wGACA,2GACA,yGACA,sCACArP,KAAA,YACA,MAAAqP,GACA,8FACA,yDACA,wFACA,iCACA,8BACA,sEACA,yDACA,4CACA,sEACA,yDACA,QACA,6DACA,qEACA,uDACA,4CACA,QACA,6DACA,4DACA,QACA,SACArP,KAAA,YACA,MAAAqP,GACA,gEACA,oDACA,yEACA,sEACA,QACA,8DACA,mEACA,QACA,iEACA,8FACA,uEACA,6CACA,QACA,4CACA,iEACA,QACA,SACArP,KAAA,YACA,MAAAqP,GACA,iDACA,2FACA,0FACArP,KAAA,YACA,MAAAqP,GACA,sGACA,qGACArP,KAAA,YACA,MAAAqP,GACA,4FACA,gEACA,oEACArP,KAAA,aACAA,KAAA,KAMA,IAAA+3D,GAAA,SAAA/jB,EAAAjnD,GAEA,GACAs9B,GADAtd,EAAA3gB,EAAA6R,UAeA,IAZAlR,EAAAb,EAAAyQ,SAAA5P,OACAinD,WACA/pB,SAAA,WACAh9B,OAAAkV,MAAAxN,OACAoY,EAAAolB,OAAA,cAEAnI,SAAA,SAAAK,EAAAtY,GACA9kB,OAAAkV,MAAAxN,OACAoY,EAAAxO,QAAAwT,OAIAllB,OAAAI,gBAAAkV,MACA,SAAAzI,OAAA,mCAeA,OAZA2wB,GAAA,GAAA8tC,GAAAprE,GACAE,OAAAkV,MAAAxG,MACA3I,MAAA,yCACAkH,KAAAmwB,EAAAl3B,IACAuT,MAAA,MACAxK,OAAA,QACAk2B,gBAAA,IAEA/H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","file":"analysis.bundled.js","sourcesContent":["webpackJsonp([3,1],[\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(_, Backbone) {\n\tvar jQuery = __webpack_require__( 1 ),\n\t $ = jQuery,\n\t GalaxyApp = __webpack_require__( 82 ).GalaxyApp,\n\t QUERY_STRING = __webpack_require__( 61 ),\n\t PANEL = __webpack_require__( 13 ),\n\t ToolPanel = __webpack_require__( 113 ),\n\t HistoryPanel = __webpack_require__( 112 ),\n\t PAGE = __webpack_require__( 84 ),\n\t ToolForm = __webpack_require__( 22 );\n\t\n\t/** define the 'Analyze Data'/analysis/main/home page for Galaxy\n\t * * has a masthead\n\t * * a left tool menu to allow the user to load tools in the center panel\n\t * * a right history menu that shows the user's current data\n\t * * a center panel\n\t * Both panels (generally) persist while the center panel shows any\n\t * UI needed for the current step of an analysis, like:\n\t * * tool forms to set tool parameters,\n\t * * tables showing the contents of datasets\n\t * * etc.\n\t */\n\twindow.app = function app( options, bootstrapped ){\n\t window.Galaxy = new GalaxyApp( options, bootstrapped );\n\t Galaxy.debug( 'analysis app' );\n\t // TODO: use router as App base (combining with Galaxy)\n\t\n\t // .................................................... panels and page\n\t var config = options.config,\n\t toolPanel = new ToolPanel({\n\t el : '#left',\n\t userIsAnonymous : Galaxy.user.isAnonymous(),\n\t spinner_url : config.spinner_url,\n\t search_url : config.search_url,\n\t toolbox : config.toolbox,\n\t toolbox_in_panel : config.toolbox_in_panel,\n\t stored_workflow_menu_entries : config.stored_workflow_menu_entries,\n\t nginx_upload_path : config.nginx_upload_path,\n\t ftp_upload_site : config.ftp_upload_site,\n\t default_genome : config.default_genome,\n\t default_extension : config.default_extension,\n\t }),\n\t centerPanel = new PANEL.CenterPanel({\n\t el : '#center'\n\t }),\n\t historyPanel = new HistoryPanel({\n\t el : '#right',\n\t galaxyRoot : Galaxy.root,\n\t userIsAnonymous : Galaxy.user.isAnonymous(),\n\t allow_user_dataset_purge: config.allow_user_dataset_purge,\n\t }),\n\t analysisPage = new PAGE.PageLayoutView( _.extend( options, {\n\t el : 'body',\n\t left : toolPanel,\n\t center : centerPanel,\n\t right : historyPanel,\n\t }));\n\t\n\t // .................................................... decorate the galaxy object\n\t // TODO: most of this is becoming unnecessary as we move to apps\n\t Galaxy.page = analysisPage;\n\t Galaxy.params = Galaxy.config.params;\n\t\n\t // add tool panel to Galaxy object\n\t Galaxy.toolPanel = toolPanel.tool_panel;\n\t Galaxy.upload = toolPanel.uploadButton;\n\t\n\t Galaxy.currHistoryPanel = historyPanel.historyView;\n\t Galaxy.currHistoryPanel.listenToGalaxy( Galaxy );\n\t\n\t //HACK: move there\n\t Galaxy.app = {\n\t display : function( view, target ){\n\t // TODO: Remove this line after select2 update\n\t $( '.select2-hidden-accessible' ).remove();\n\t centerPanel.display( view );\n\t },\n\t };\n\t\n\t // .................................................... routes\n\t /** */\n\t var router = new ( Backbone.Router.extend({\n\t // TODO: not many client routes at this point - fill and remove from server.\n\t // since we're at root here, this may be the last to be routed entirely on the client.\n\t initialize : function( options ){\n\t this.options = options;\n\t },\n\t\n\t /** override to parse query string into obj and send to each route */\n\t execute: function( callback, args, name ){\n\t Galaxy.debug( 'router execute:', callback, args, name );\n\t var queryObj = QUERY_STRING.parse( args.pop() );\n\t args.push( queryObj );\n\t if( callback ){\n\t callback.apply( this, args );\n\t }\n\t },\n\t\n\t routes : {\n\t '(/)' : 'home',\n\t // TODO: remove annoying 'root' from root urls\n\t '(/)root*' : 'home',\n\t },\n\t\n\t /** */\n\t home : function( params ){\n\t // TODO: to router, remove Globals\n\t // load a tool by id (tool_id) or rerun a previous tool execution (job_id)\n\t if( ( params.tool_id || params.job_id ) && params.tool_id !== 'upload1' ){\n\t this._loadToolForm( params );\n\t\n\t } else {\n\t // show the workflow run form\n\t if( params.workflow_id ){\n\t this._loadCenterIframe( 'workflow/run?id=' + params.workflow_id );\n\t // load the center iframe with controller.action: galaxy.org/?m_c=history&m_a=list -> history/list\n\t } else if( params.m_c ){\n\t this._loadCenterIframe( params.m_c + '/' + params.m_a );\n\t // show the workflow run form\n\t } else {\n\t this._loadCenterIframe( 'welcome' );\n\t }\n\t }\n\t },\n\t\n\t /** load the center panel with a tool form described by the given params obj */\n\t _loadToolForm : function( params ){\n\t //TODO: load tool form code async\n\t params.id = params.tool_id;\n\t centerPanel.display( new ToolForm.View( params ) );\n\t },\n\t\n\t /** load the center panel iframe using the given url */\n\t _loadCenterIframe : function( url, root ){\n\t root = root || Galaxy.root;\n\t url = root + url;\n\t centerPanel.$( '#galaxy_main' ).prop( 'src', url );\n\t },\n\t\n\t }))( options );\n\t\n\t // .................................................... when the page is ready\n\t // render and start the router\n\t $(function(){\n\t analysisPage\n\t .render()\n\t .right.historyView.loadCurrentHistory();\n\t\n\t // use galaxy to listen to history size changes and then re-fetch the user's total size (to update the quota meter)\n\t // TODO: we have to do this here (and after every page.render()) because the masthead is re-created on each\n\t // page render. It's re-created each time because there is no render function and can't be re-rendered without\n\t // re-creating it.\n\t Galaxy.listenTo( analysisPage.right.historyView, 'history-size-change', function(){\n\t // fetch to update the quota meter adding 'current' for any anon-user's id\n\t Galaxy.user.fetch({ url: Galaxy.user.urlRoot() + '/' + ( Galaxy.user.id || 'current' ) });\n\t });\n\t analysisPage.right.historyView.connectToQuotaMeter( analysisPage.masthead.quotaMeter );\n\t\n\t // start the router - which will call any of the routes above\n\t Backbone.history.start({\n\t root : Galaxy.root,\n\t pushState : true,\n\t });\n\t });\n\t};\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(2)))\n\n/***/ },\n/* 1 */,\n/* 2 */,\n/* 3 */,\n/* 4 */,\n/* 5 */,\n/* 6 */,\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/**\n\t * This class contains backbone wrappers for basic ui elements such as Images, Labels, Buttons, Input fields etc.\n\t */\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4),\n\t __webpack_require__(54),\n\t __webpack_require__(57),\n\t __webpack_require__(25),\n\t __webpack_require__(53),\n\t __webpack_require__(16),\n\t __webpack_require__(10)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils, Select, Slider, Options, Drilldown, Buttons, Modal ) {\n\t\n\t /** Image wrapper */\n\t var Image = Backbone.View.extend({\n\t initialize : function(options) {\n\t this.options = Utils.merge(options, {\n\t url : '',\n\t cls : ''\n\t });\n\t this.setElement(this._template(this.options));\n\t },\n\t _template: function(options) {\n\t return '';\n\t }\n\t });\n\t\n\t /** Label wrapper */\n\t var Label = Backbone.View.extend({\n\t initialize : function(options) {\n\t this.options = Utils.merge(options, {\n\t title : '',\n\t cls : '',\n\t tagname : 'label'\n\t });\n\t this.setElement(this._template(this.options));\n\t },\n\t title: function(new_title) {\n\t this.$el.html(new_title);\n\t },\n\t value: function() {\n\t return options.title;\n\t },\n\t _template: function(options) {\n\t return $( '<' + options.tagname + '/>' ).addClass( 'ui-label' ).addClass( options.cls ).html( options.title );\n\t }\n\t });\n\t\n\t /** Displays an icon with title */\n\t var Icon = Backbone.View.extend({\n\t initialize : function(options) {\n\t this.options = Utils.merge(options, {\n\t floating : 'right',\n\t icon : '',\n\t tooltip : '',\n\t placement : 'bottom',\n\t title : '',\n\t cls : ''\n\t });\n\t this.setElement(this._template(this.options));\n\t $(this.el).tooltip({title: options.tooltip, placement: 'bottom'});\n\t },\n\t _template: function(options) {\n\t return '
' +\n\t ' ' +\n\t options.title +\n\t '
';\n\t }\n\t });\n\t\n\t /** Renders an anchor element */\n\t var Anchor = Backbone.View.extend({\n\t initialize : function(options) {\n\t this.options = Utils.merge(options, {\n\t title : '',\n\t cls : ''\n\t });\n\t this.setElement(this._template(this.options));\n\t $(this.el).on('click', options.onclick);\n\t },\n\t _template: function(options) {\n\t return '
' + options.title + '
';\n\t }\n\t });\n\t\n\t /** Displays messages used e.g. in the tool form */\n\t var Message = Backbone.View.extend({\n\t initialize : function(options) {\n\t this.options = Utils.merge(options, {\n\t message : null,\n\t status : 'info',\n\t cls : '',\n\t persistent : false\n\t });\n\t this.setElement('
');\n\t this.options.message && this.update(this.options);\n\t },\n\t\n\t // update\n\t update: function(options) {\n\t // get options\n\t this.options = Utils.merge(options, this.options);\n\t\n\t // show message\n\t if (options.message != '') {\n\t this.$el.html(this._template(this.options));\n\t this.$el.fadeIn();\n\t\n\t // clear previous timeouts\n\t if (this.timeout) {\n\t window.clearTimeout(this.timeout);\n\t }\n\t\n\t // set timeout if message is not persistent\n\t if (!options.persistent) {\n\t var self = this;\n\t this.timeout = window.setTimeout(function() {\n\t if (self.$el.is(':visible')) {\n\t self.$el.fadeOut();\n\t } else {\n\t self.$el.hide();\n\t }\n\t }, 3000);\n\t }\n\t } else {\n\t this.$el.fadeOut();\n\t }\n\t },\n\t\n\t // template\n\t _template: function(options) {\n\t var cls_status = 'ui-message alert alert-' + options.status;\n\t if (options.large) {\n\t cls_status = ( ( options.status == 'success' && 'done' ) ||\n\t ( options.status == 'danger' && 'error' ) ||\n\t options.status ) + 'messagelarge';\n\t }\n\t return '
' +\n\t options.message +\n\t '
';\n\t }\n\t });\n\t\n\t /** Render a search box */\n\t var Searchbox = Backbone.View.extend({\n\t initialize : function(options) {\n\t this.options = Utils.merge(options, {\n\t onclick : null,\n\t searchword : ''\n\t });\n\t this.setElement(this._template(this.options));\n\t var self = this;\n\t if (this.options.onclick) {\n\t this.$el.on('submit', function(e) {\n\t var search_field = self.$el.find('#search');\n\t self.options.onclick(search_field.val());\n\t });\n\t }\n\t },\n\t _template: function(options) {\n\t return '
' +\n\t '
' +\n\t '' +\n\t '' +\n\t '
' +\n\t '
';\n\t }\n\t });\n\t\n\t /** Renders an input element used e.g. in the tool form */\n\t var Input = Backbone.View.extend({\n\t initialize : function(options) {\n\t // configure options\n\t this.options = Utils.merge(options, {\n\t type : 'text',\n\t placeholder : '',\n\t disabled : false,\n\t visible : true,\n\t cls : '',\n\t area : false\n\t });\n\t\n\t // create new element\n\t this.setElement(this._template(this.options));\n\t\n\t // set initial value\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t\n\t // disable input field\n\t if (this.options.disabled) {\n\t this.$el.prop('disabled', true);\n\t }\n\t\n\t // hide input field\n\t if (!this.options.visible) {\n\t this.$el.hide();\n\t }\n\t\n\t // onchange event handler. fires on user activity.\n\t var self = this;\n\t this.$el.on('input', function() {\n\t if (self.options.onchange) {\n\t self.options.onchange(self.$el.val());\n\t }\n\t });\n\t },\n\t\n\t // value\n\t value : function (new_val) {\n\t if (new_val !== undefined) {\n\t this.$el.val( ( typeof new_val === 'string' && new_val ) || '' );\n\t }\n\t return this.$el.val();\n\t },\n\t\n\t // template\n\t _template: function(options) {\n\t if (options.area) {\n\t return '';\n\t } else {\n\t return '';\n\t }\n\t }\n\t });\n\t\n\t /** Creates a hidden element input field used e.g. in the tool form */\n\t var Hidden = Backbone.View.extend({\n\t initialize : function(options) {\n\t this.options = options;\n\t this.setElement(this._template(this.options));\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t },\n\t value : function (new_val) {\n\t if (new_val !== undefined) {\n\t this.$('hidden').val(new_val);\n\t }\n\t return this.$('hidden').val();\n\t },\n\t _template: function(options) {\n\t var tmpl = '
';\n\t if (options.info) {\n\t tmpl += '
' + options.info + '
';\n\t }\n\t tmpl += '' +\n\t '
';\n\t return tmpl;\n\t }\n\t });\n\t\n\t return {\n\t Anchor : Anchor,\n\t Button : Buttons.ButtonDefault,\n\t ButtonIcon : Buttons.ButtonIcon,\n\t ButtonCheck : Buttons.ButtonCheck,\n\t ButtonMenu : Buttons.ButtonMenu,\n\t ButtonLink : Buttons.ButtonLink,\n\t Icon : Icon,\n\t Image : Image,\n\t Input : Input,\n\t Label : Label,\n\t Message : Message,\n\t Modal : Modal,\n\t RadioButton : Options.RadioButton,\n\t Checkbox : Options.Checkbox,\n\t Radio : Options.Radio,\n\t Searchbox : Searchbox,\n\t Select : Select,\n\t Hidden : Hidden,\n\t Slider : Slider,\n\t Drilldown : Drilldown\n\t }\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.extend = extend;\n\texports.indexOf = indexOf;\n\texports.escapeExpression = escapeExpression;\n\texports.isEmpty = isEmpty;\n\texports.createFrame = createFrame;\n\texports.blockParams = blockParams;\n\texports.appendContextPath = appendContextPath;\n\tvar escape = {\n\t '&': '&',\n\t '<': '<',\n\t '>': '>',\n\t '\"': '"',\n\t \"'\": ''',\n\t '`': '`',\n\t '=': '='\n\t};\n\t\n\tvar badChars = /[&<>\"'`=]/g,\n\t possible = /[&<>\"'`=]/;\n\t\n\tfunction escapeChar(chr) {\n\t return escape[chr];\n\t}\n\t\n\tfunction extend(obj /* , ...source */) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t for (var key in arguments[i]) {\n\t if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n\t obj[key] = arguments[i][key];\n\t }\n\t }\n\t }\n\t\n\t return obj;\n\t}\n\t\n\tvar toString = Object.prototype.toString;\n\t\n\texports.toString = toString;\n\t// Sourced from lodash\n\t// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n\t/* eslint-disable func-style */\n\tvar isFunction = function isFunction(value) {\n\t return typeof value === 'function';\n\t};\n\t// fallback for older versions of Chrome and Safari\n\t/* istanbul ignore next */\n\tif (isFunction(/x/)) {\n\t exports.isFunction = isFunction = function (value) {\n\t return typeof value === 'function' && toString.call(value) === '[object Function]';\n\t };\n\t}\n\texports.isFunction = isFunction;\n\t\n\t/* eslint-enable func-style */\n\t\n\t/* istanbul ignore next */\n\tvar isArray = Array.isArray || function (value) {\n\t return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n\t};\n\t\n\texports.isArray = isArray;\n\t// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\t\n\tfunction indexOf(array, value) {\n\t for (var i = 0, len = array.length; i < len; i++) {\n\t if (array[i] === value) {\n\t return i;\n\t }\n\t }\n\t return -1;\n\t}\n\t\n\tfunction escapeExpression(string) {\n\t if (typeof string !== 'string') {\n\t // don't escape SafeStrings, since they're already safe\n\t if (string && string.toHTML) {\n\t return string.toHTML();\n\t } else if (string == null) {\n\t return '';\n\t } else if (!string) {\n\t return string + '';\n\t }\n\t\n\t // Force a string conversion as this will be done by the append regardless and\n\t // the regex test will do this transparently behind the scenes, causing issues if\n\t // an object's to string has escaped characters in it.\n\t string = '' + string;\n\t }\n\t\n\t if (!possible.test(string)) {\n\t return string;\n\t }\n\t return string.replace(badChars, escapeChar);\n\t}\n\t\n\tfunction isEmpty(value) {\n\t if (!value && value !== 0) {\n\t return true;\n\t } else if (isArray(value) && value.length === 0) {\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t}\n\t\n\tfunction createFrame(object) {\n\t var frame = extend({}, object);\n\t frame._parent = object;\n\t return frame;\n\t}\n\t\n\tfunction blockParams(params, ids) {\n\t params.path = ids;\n\t return params;\n\t}\n\t\n\tfunction appendContextPath(contextPath, id) {\n\t return (contextPath ? contextPath + '.' : '') + id;\n\t}\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxJQUFNLE1BQU0sR0FBRztBQUNiLEtBQUcsRUFBRSxPQUFPO0FBQ1osS0FBRyxFQUFFLE1BQU07QUFDWCxLQUFHLEVBQUUsTUFBTTtBQUNYLEtBQUcsRUFBRSxRQUFRO0FBQ2IsS0FBRyxFQUFFLFFBQVE7QUFDYixLQUFHLEVBQUUsUUFBUTtBQUNiLEtBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQzs7QUFFRixJQUFNLFFBQVEsR0FBRyxZQUFZO0lBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUM7O0FBRTdCLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN2QixTQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQjs7QUFFTSxTQUFTLE1BQU0sQ0FBQyxHQUFHLG9CQUFtQjtBQUMzQyxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxTQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1QixVQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDM0QsV0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUM5QjtLQUNGO0dBQ0Y7O0FBRUQsU0FBTyxHQUFHLENBQUM7Q0FDWjs7QUFFTSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0FBS2hELElBQUksVUFBVSxHQUFHLG9CQUFTLEtBQUssRUFBRTtBQUMvQixTQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDOzs7QUFHRixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNuQixVQUlNLFVBQVUsR0FKaEIsVUFBVSxHQUFHLFVBQVMsS0FBSyxFQUFFO0FBQzNCLFdBQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssbUJBQW1CLENBQUM7R0FDcEYsQ0FBQztDQUNIO1FBQ08sVUFBVSxHQUFWLFVBQVU7Ozs7O0FBSVgsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxVQUFTLEtBQUssRUFBRTtBQUN0RCxTQUFPLEFBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUNqRyxDQUFDOzs7OztBQUdLLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDcEMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxRQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDdEIsYUFBTyxDQUFDLENBQUM7S0FDVjtHQUNGO0FBQ0QsU0FBTyxDQUFDLENBQUMsQ0FBQztDQUNYOztBQUdNLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLE1BQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFOztBQUU5QixRQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQzNCLGFBQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ3hCLE1BQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3pCLGFBQU8sRUFBRSxDQUFDO0tBQ1gsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2xCLGFBQU8sTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUNwQjs7Ozs7QUFLRCxVQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUN0Qjs7QUFFRCxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUFFLFdBQU8sTUFBTSxDQUFDO0dBQUU7QUFDOUMsU0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztDQUM3Qzs7QUFFTSxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDN0IsTUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLFdBQU8sSUFBSSxDQUFDO0dBQ2IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxXQUFPLElBQUksQ0FBQztHQUNiLE1BQU07QUFDTCxXQUFPLEtBQUssQ0FBQztHQUNkO0NBQ0Y7O0FBRU0sU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0FBQ2xDLE1BQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0IsT0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDdkIsU0FBTyxLQUFLLENBQUM7Q0FDZDs7QUFFTSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLFFBQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLFNBQU8sTUFBTSxDQUFDO0NBQ2Y7O0FBRU0sU0FBUyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO0FBQ2pELFNBQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUEsR0FBSSxFQUFFLENBQUM7Q0FDcEQiLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIl19\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\t\n\tfunction Exception(message, node) {\n\t var loc = node && node.loc,\n\t line = undefined,\n\t column = undefined;\n\t if (loc) {\n\t line = loc.start.line;\n\t column = loc.start.column;\n\t\n\t message += ' - ' + line + ':' + column;\n\t }\n\t\n\t var tmp = Error.prototype.constructor.call(this, message);\n\t\n\t // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n\t for (var idx = 0; idx < errorProps.length; idx++) {\n\t this[errorProps[idx]] = tmp[errorProps[idx]];\n\t }\n\t\n\t /* istanbul ignore else */\n\t if (Error.captureStackTrace) {\n\t Error.captureStackTrace(this, Exception);\n\t }\n\t\n\t if (loc) {\n\t this.lineNumber = line;\n\t this.column = column;\n\t }\n\t}\n\t\n\tException.prototype = new Error();\n\t\n\texports['default'] = Exception;\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsSUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbkcsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUNoQyxNQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7TUFDdEIsSUFBSSxZQUFBO01BQ0osTUFBTSxZQUFBLENBQUM7QUFDWCxNQUFJLEdBQUcsRUFBRTtBQUNQLFFBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN0QixVQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBRTFCLFdBQU8sSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDeEM7O0FBRUQsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7O0FBRzFELE9BQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ2hELFFBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDOUM7OztBQUdELE1BQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO0FBQzNCLFNBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDMUM7O0FBRUQsTUFBSSxHQUFHLEVBQUU7QUFDUCxRQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUN2QixRQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztHQUN0QjtDQUNGOztBQUVELFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQzs7cUJBRW5CLFNBQVMiLCJmaWxlIjoiZXhjZXB0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2snXTtcblxuZnVuY3Rpb24gRXhjZXB0aW9uKG1lc3NhZ2UsIG5vZGUpIHtcbiAgbGV0IGxvYyA9IG5vZGUgJiYgbm9kZS5sb2MsXG4gICAgICBsaW5lLFxuICAgICAgY29sdW1uO1xuICBpZiAobG9jKSB7XG4gICAgbGluZSA9IGxvYy5zdGFydC5saW5lO1xuICAgIGNvbHVtbiA9IGxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjtcbiAgfVxuXG4gIGxldCB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay5cbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1wW2Vycm9yUHJvcHNbaWR4XV07XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG5cbiAgaWYgKGxvYykge1xuICAgIHRoaXMubGluZU51bWJlciA9IGxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gIH1cbn1cblxuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnQgZGVmYXVsdCBFeGNlcHRpb247XG4iXX0=\n\n\n/***/ },\n/* 10 */,\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\tvar View = Backbone.View.extend({\n\t visible : false,\n\t initialize : function( options ) {\n\t var self = this;\n\t this.options = Utils.merge( options, {\n\t id : Utils.uid(),\n\t title : '',\n\t icon : '',\n\t buttons : null,\n\t body : null,\n\t scrollable : true,\n\t nopadding : false,\n\t operations : null,\n\t placement : 'bottom',\n\t cls : 'ui-portlet',\n\t operations_flt : 'right',\n\t collapsible : false,\n\t collapsed : false\n\t });\n\t this.setElement( this._template( this.options ) );\n\t\n\t // link content\n\t this.$body = this.$( '.portlet-body' );\n\t this.$title = this.$( '.portlet-title-text' );\n\t this.$header = this.$( '.portlet-header' );\n\t this.$content = this.$( '.portlet-content' );\n\t this.$footer = this.$( '.portlet-footer' );\n\t\n\t // set content padding\n\t if ( this.options.nopadding ) {\n\t this.$content.css( 'padding', '0px' );\n\t this.$body.css( 'padding', '0px' );\n\t }\n\t\n\t // append buttons\n\t this.$buttons = this.$( '.portlet-buttons' );\n\t if ( this.options.buttons ) {\n\t $.each( this.options.buttons, function( name, item ) {\n\t item.$el.prop( 'id', name );\n\t self.$buttons.append( item.$el );\n\t });\n\t } else {\n\t this.$buttons.remove();\n\t }\n\t\n\t // append operations\n\t this.$operations = this.$( '.portlet-operations' );\n\t if ( this.options.operations ) {\n\t $.each( this.options.operations, function( name, item ) {\n\t item.$el.prop( 'id', name );\n\t self.$operations.append( item.$el );\n\t });\n\t }\n\t\n\t // add body\n\t this.options.body && this.append( this.options.body );\n\t\n\t // make portlet collapsible\n\t this.collapsed = false;\n\t if ( this.options.collapsible ) {\n\t this.$title.addClass( 'no-highlight' ).css({\n\t 'cursor' : 'pointer',\n\t 'text-decoration' : 'underline'\n\t });\n\t this.$title.on( 'click', function() {\n\t if ( self.collapsed ) { self.expand(); } else { self.collapse(); }\n\t });\n\t this.options.collapsed && this.collapse();\n\t }\n\t },\n\t\n\t // append\n\t append: function( $el ) {\n\t this.$body.append( $el );\n\t },\n\t\n\t // remove all content\n\t empty: function() {\n\t this.$body.empty();\n\t },\n\t\n\t // header\n\t header: function() {\n\t return this.$header;\n\t },\n\t\n\t // body\n\t body: function() {\n\t return this.$body;\n\t },\n\t\n\t // footer\n\t footer: function() {\n\t return this.$footer;\n\t },\n\t\n\t // show\n\t show: function(){\n\t this.visible = true;\n\t this.$el.fadeIn( 'fast' );\n\t },\n\t\n\t // hide\n\t hide: function(){\n\t this.visible = false;\n\t this.$el.fadeOut( 'fast' );\n\t },\n\t\n\t // enable buttons\n\t enableButton: function( id ) {\n\t this.$buttons.find( '#' + id ).prop( 'disabled', false );\n\t },\n\t\n\t // disable buttons\n\t disableButton: function( id ) {\n\t this.$buttons.find( '#' + id ).prop( 'disabled', true );\n\t },\n\t\n\t // hide operation\n\t hideOperation: function( id ) {\n\t this.$operations.find( '#' + id ).hide();\n\t },\n\t\n\t // show operation\n\t showOperation: function( id ) {\n\t this.$operations.find( '#' + id ).show();\n\t },\n\t\n\t // set operation\n\t setOperation: function( id, callback ) {\n\t var $el = this.$operations.find( '#' + id );\n\t $el.off( 'click' );\n\t $el.on( 'click', callback );\n\t },\n\t\n\t // title\n\t title: function( new_title ) {\n\t var $el = this.$title;\n\t if ( new_title ) {\n\t $el.html( new_title );\n\t }\n\t return $el.html();\n\t },\n\t\n\t // collapse portlet\n\t collapse: function() {\n\t this.collapsed = true;\n\t this.$content.height( '0%' );\n\t this.$body.hide();\n\t this.$footer.hide();\n\t this.trigger( 'collapsed' );\n\t },\n\t\n\t // expand portlet\n\t expand: function() {\n\t this.collapsed = false;\n\t this.$content.height( '100%' );\n\t this.$body.fadeIn( 'fast' );\n\t this.$footer.fadeIn( 'fast' );\n\t this.trigger( 'expanded' );\n\t },\n\t\n\t // disable content access\n\t disable: function() {\n\t this.$( '.portlet-backdrop' ).show();\n\t },\n\t\n\t // enable content access\n\t enable: function() {\n\t this.$( '.portlet-backdrop' ).hide();\n\t },\n\t\n\t // fill regular modal template\n\t _template: function( options ) {\n\t var tmpl = '
';\n\t if ( options.title ) {\n\t tmpl += '
' +\n\t '
' +\n\t '
';\n\t if ( options.icon ) {\n\t tmpl += ' ';\n\t }\n\t tmpl += '' + options.title + '' +\n\t '
' +\n\t '
';\n\t }\n\t tmpl += '
';\n\t if ( options.placement == 'top' ) {\n\t tmpl += '
';\n\t }\n\t tmpl += '
';\n\t if ( options.placement == 'bottom' ) {\n\t tmpl += '
';\n\t }\n\t tmpl += '
' +\n\t '
' +\n\t '
' +\n\t '
';\n\t return tmpl;\n\t }\n\t});\n\treturn {\n\t View : View\n\t}\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Create a simple path alias to allow browserify to resolve\n\t// the runtime on a supported path.\n\tmodule.exports = __webpack_require__(67)['default'];\n\n\n/***/ },\n/* 13 */,\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {// Additional dependencies: jQuery, underscore.\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(10), __webpack_require__(28), __webpack_require__(18)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Modal, Frames, mod_icon_btn) {\n\t\n\t/**\n\t * Dataset metedata.\n\t */\n\tvar DatasetMetadata = Backbone.Model.extend({});\n\t\n\t/**\n\t * A dataset. In Galaxy, datasets are associated with a history, so\n\t * this object is also known as a HistoryDatasetAssociation.\n\t */\n\tvar Dataset = Backbone.Model.extend({\n\t defaults: {\n\t id: '',\n\t type: '',\n\t name: '',\n\t hda_ldda: 'hda',\n\t metadata: null\n\t },\n\t\n\t initialize: function() {\n\t // Metadata can be passed in as a model or a set of attributes; if it's\n\t // already a model, there's no need to set metadata.\n\t if (!this.get('metadata')) {\n\t this._set_metadata();\n\t }\n\t\n\t // Update metadata on change.\n\t this.on('change', this._set_metadata, this);\n\t },\n\t\n\t _set_metadata: function() {\n\t var metadata = new DatasetMetadata();\n\t\n\t // Move metadata from dataset attributes to metadata object.\n\t _.each(_.keys(this.attributes), function(k) {\n\t if (k.indexOf('metadata_') === 0) {\n\t // Found metadata.\n\t var new_key = k.split('metadata_')[1];\n\t metadata.set(new_key, this.attributes[k]);\n\t delete this.attributes[k];\n\t }\n\t }, this);\n\t\n\t // Because this is an internal change, silence it.\n\t this.set('metadata', metadata, { 'silent': true });\n\t },\n\t\n\t /**\n\t * Returns dataset metadata for a given attribute.\n\t */\n\t get_metadata: function(attribute) {\n\t return this.attributes.metadata.get(attribute);\n\t },\n\t\n\t urlRoot: Galaxy.root + \"api/datasets\"\n\t});\n\t\n\t/**\n\t * A tabular dataset. This object extends dataset to provide incremental chunked data.\n\t */\n\tvar TabularDataset = Dataset.extend({\n\t defaults: _.extend({}, Dataset.prototype.defaults, {\n\t chunk_url: null,\n\t first_data_chunk: null,\n\t chunk_index: -1,\n\t at_eof: false\n\t }),\n\t\n\t initialize: function(options) {\n\t Dataset.prototype.initialize.call(this);\n\t\n\t // If first data chunk is available, next chunk is 1.\n\t this.attributes.chunk_index = (this.attributes.first_data_chunk ? 1 : 0);\n\t this.attributes.chunk_url = Galaxy.root + 'dataset/display?dataset_id=' + this.id;\n\t this.attributes.url_viz = Galaxy.root + 'visualization';\n\t },\n\t\n\t /**\n\t * Returns a jQuery Deferred object that resolves to the next data chunk or null if at EOF.\n\t */\n\t get_next_chunk: function() {\n\t // If already at end of file, do nothing.\n\t if (this.attributes.at_eof) {\n\t return null;\n\t }\n\t\n\t // Get next chunk.\n\t var self = this,\n\t next_chunk = $.Deferred();\n\t $.getJSON(this.attributes.chunk_url, {\n\t chunk: self.attributes.chunk_index++\n\t }).success(function(chunk) {\n\t var rval;\n\t if (chunk.ck_data !== '') {\n\t // Found chunk.\n\t rval = chunk;\n\t }\n\t else {\n\t // At EOF.\n\t self.attributes.at_eof = true;\n\t rval = null;\n\t }\n\t next_chunk.resolve(rval);\n\t });\n\t\n\t return next_chunk;\n\t }\n\t});\n\t\n\tvar DatasetCollection = Backbone.Collection.extend({\n\t model: Dataset\n\t});\n\t\n\t/**\n\t * Provides a base for table-based, dynamic view of a tabular dataset.\n\t * Do not instantiate directly; use either TopLevelTabularDatasetChunkedView\n\t * or EmbeddedTabularDatasetChunkedView.\n\t */\n\tvar TabularDatasetChunkedView = Backbone.View.extend({\n\t\n\t /**\n\t * Initialize view and, importantly, set a scroll element.\n\t */\n\t initialize: function(options) {\n\t // Row count for rendering.\n\t this.row_count = 0;\n\t this.loading_chunk = false;\n\t\n\t // load trackster button\n\t new TabularButtonTracksterView({\n\t model : options.model,\n\t $el : this.$el\n\t });\n\t },\n\t\n\t expand_to_container: function(){\n\t if (this.$el.height() < this.scroll_elt.height()){\n\t this.attempt_to_fetch();\n\t }\n\t },\n\t\n\t attempt_to_fetch: function( func ){\n\t var self = this;\n\t if ( !this.loading_chunk && this.scrolled_to_bottom() ) {\n\t this.loading_chunk = true;\n\t this.loading_indicator.show();\n\t $.when(self.model.get_next_chunk()).then(function(result) {\n\t if (result) {\n\t self._renderChunk(result);\n\t self.loading_chunk = false;\n\t }\n\t self.loading_indicator.hide();\n\t self.expand_to_container();\n\t });\n\t }\n\t },\n\t\n\t render: function() {\n\t // Add loading indicator.\n\t this.loading_indicator = $('
').attr('id', 'loading_indicator');\n\t this.$el.append(this.loading_indicator);\n\t\n\t // Add data table and header.\n\t var data_table = $('').attr({\n\t id: 'content_table',\n\t cellpadding: 0\n\t });\n\t this.$el.append(data_table);\n\t var column_names = this.model.get_metadata('column_names'),\n\t header_container = $('').appendTo(data_table),\n\t header_row = $('').appendTo(header_container);\n\t if (column_names) {\n\t header_row.append('');\n\t } else {\n\t for (var j = 1; j <= this.model.get_metadata('columns'); j++) {\n\t header_row.append('');\n\t }\n\t }\n\t\n\t // Render first chunk.\n\t var self = this,\n\t first_chunk = this.model.get('first_data_chunk');\n\t if (first_chunk) {\n\t // First chunk is bootstrapped, so render now.\n\t this._renderChunk(first_chunk);\n\t }\n\t else {\n\t // No bootstrapping, so get first chunk and then render.\n\t $.when(self.model.get_next_chunk()).then(function(result) {\n\t self._renderChunk(result);\n\t });\n\t }\n\t\n\t // -- Show new chunks during scrolling. --\n\t\n\t // Set up chunk loading when scrolling using the scrolling element.\n\t this.scroll_elt.scroll(function(){\n\t self.attempt_to_fetch();\n\t });\n\t },\n\t\n\t /**\n\t * Returns true if user has scrolled to the bottom of the view.\n\t */\n\t scrolled_to_bottom: function() {\n\t return false;\n\t },\n\t\n\t // -- Helper functions. --\n\t\n\t _renderCell: function(cell_contents, index, colspan) {\n\t var $cell = $(''),\n\t num_columns = this.model.get_metadata('columns');\n\t\n\t if (this.row_count % 2 !== 0) {\n\t row.addClass('dark_row');\n\t }\n\t\n\t if (cells.length === num_columns) {\n\t _.each(cells, function(cell_contents, index) {\n\t row.append(this._renderCell(cell_contents, index));\n\t }, this);\n\t }\n\t else if (cells.length > num_columns) {\n\t // SAM file or like format with optional metadata included.\n\t _.each(cells.slice(0, num_columns - 1), function(cell_contents, index) {\n\t row.append(this._renderCell(cell_contents, index));\n\t }, this);\n\t row.append(this._renderCell(cells.slice(num_columns - 1).join('\\t'), num_columns - 1));\n\t }\n\t else if (num_columns > 5 && cells.length === num_columns - 1 ) {\n\t // SAM file or like format with optional metadata missing.\n\t _.each(cells, function(cell_contents, index) {\n\t row.append(this._renderCell(cell_contents, index));\n\t }, this);\n\t row.append($('');\n\t wrapper.append($el);\n\t this.row.append(wrapper);\n\t },\n\t \n\t // header\n\t appendHeader: function() {\n\t // append header row\n\t this.$thead.append(this.row);\n\t\n\t // row\n\t this.row = $('');\n\t },\n\t \n\t // add row cell\n\t add: function($el, width, align) {\n\t var wrapper = $('');\n\t if (width) {\n\t wrapper.css('width', width);\n\t }\n\t if (align) {\n\t wrapper.css('text-align', align);\n\t }\n\t wrapper.append($el);\n\t this.row.append(wrapper);\n\t },\n\t \n\t // append\n\t append: function(id, fade) {\n\t this._commit(id, fade, false);\n\t },\n\t \n\t // prepend\n\t prepend: function(id, fade) {\n\t this._commit(id, fade, true);\n\t },\n\t \n\t // get element\n\t get: function(id) {\n\t return this.$el.find('#' + id);\n\t },\n\t \n\t // delete\n\t del: function(id) {\n\t var item = this.$tbody.find('#' + id);\n\t if (item.length > 0) {\n\t item.remove();\n\t this.row_count--;\n\t this._refresh();\n\t }\n\t },\n\t\n\t // delete all\n\t delAll: function() {\n\t this.$tbody.empty();\n\t this.row_count = 0;\n\t this._refresh();\n\t },\n\t \n\t // value\n\t value: function(new_value) {\n\t // get current id/value\n\t this.before = this.$tbody.find('.current').attr('id');\n\t \n\t // check if new_value is defined\n\t if (new_value !== undefined) {\n\t this.$tbody.find('tr').removeClass('current');\n\t if (new_value) {\n\t this.$tbody.find('#' + new_value).addClass('current');\n\t }\n\t }\n\t \n\t // get current id/value\n\t var after = this.$tbody.find('.current').attr('id');\n\t if(after === undefined) {\n\t return null;\n\t } else {\n\t // fire onchange\n\t if (after != this.before && this.options.onchange) {\n\t this.options.onchange(new_value);\n\t }\n\t \n\t // return current value\n\t return after;\n\t }\n\t },\n\t \n\t // size\n\t size: function() {\n\t return this.$tbody.find('tr').length;\n\t },\n\t \n\t // commit\n\t _commit: function(id, fade, prepend) {\n\t // remove previous item with same id\n\t this.del(id);\n\t \n\t // add\n\t this.row.attr('id', id);\n\t \n\t // add row\n\t if (prepend) {\n\t this.$tbody.prepend(this.row);\n\t } else {\n\t this.$tbody.append(this.row);\n\t }\n\t \n\t // fade mode\n\t if (fade) {\n\t this.row.hide();\n\t this.row.fadeIn();\n\t }\n\t \n\t // row\n\t this.row = this._row();\n\t \n\t // row count\n\t this.row_count++;\n\t this._refresh();\n\t },\n\t \n\t // create new row\n\t _row: function() {\n\t return $('');\n\t },\n\t \n\t // onclick\n\t _onclick: function(e) {\n\t // get values\n\t var old_value = this.value();\n\t var new_value = $(e.target).closest('tr').attr('id');\n\t if (new_value != ''){\n\t // check equality\n\t if (new_value && old_value != new_value) {\n\t if (this.options.onconfirm) {\n\t this.options.onconfirm(new_value);\n\t } else {\n\t this.value(new_value);\n\t }\n\t }\n\t }\n\t },\n\t\n\t // ondblclick\n\t _ondblclick: function(e) {\n\t var value = this.value();\n\t if (value && this.options.ondblclick) {\n\t this.options.ondblclick(value);\n\t }\n\t },\n\t \n\t // refresh\n\t _refresh: function() {\n\t if (this.row_count == 0) {\n\t this.$tmessage.show();\n\t } else {\n\t this.$tmessage.hide();\n\t }\n\t },\n\t \n\t // load html template\n\t _template: function(options) {\n\t return '
' +\n\t '
' + column_names.join('') + '' + j + '').text(cell_contents);\n\t var column_types = this.model.get_metadata('column_types');\n\t if (colspan !== undefined) {\n\t $cell.attr('colspan', colspan).addClass('stringalign');\n\t } else if (column_types) {\n\t if (index < column_types.length) {\n\t if (column_types[index] === 'str' || column_types[index] === 'list') {\n\t /* Left align all str columns, right align the rest */\n\t $cell.addClass('stringalign');\n\t }\n\t }\n\t }\n\t return $cell;\n\t },\n\t\n\t _renderRow: function(line) {\n\t // Check length of cells to ensure this is a complete row.\n\t var cells = line.split('\\t'),\n\t row = $('
'));\n\t }\n\t else {\n\t // Comment line, just return the one cell.\n\t row.append(this._renderCell(line, 0, num_columns));\n\t }\n\t\n\t this.row_count++;\n\t return row;\n\t },\n\t\n\t _renderChunk: function(chunk) {\n\t var data_table = this.$el.find('table');\n\t _.each(chunk.ck_data.split('\\n'), function(line, index) {\n\t if (line !== ''){\n\t data_table.append(this._renderRow(line));\n\t }\n\t }, this);\n\t }\n\t});\n\t\n\t/**\n\t * Tabular view that is placed at the top level of page. Scrolling occurs\n\t * view top-level elements outside of view.\n\t */\n\tvar TopLevelTabularDatasetChunkedView = TabularDatasetChunkedView.extend({\n\t\n\t initialize: function(options) {\n\t TabularDatasetChunkedView.prototype.initialize.call(this, options);\n\t\n\t // Scrolling happens in top-level elements.\n\t scroll_elt = _.find(this.$el.parents(), function(p) {\n\t return $(p).css('overflow') === 'auto';\n\t });\n\t\n\t // If no scrolling element found, use window.\n\t if (!scroll_elt) { scroll_elt = window; }\n\t\n\t // Wrap scrolling element for easy access.\n\t this.scroll_elt = $(scroll_elt);\n\t },\n\t\n\t /**\n\t * Returns true if user has scrolled to the bottom of the view.\n\t */\n\t scrolled_to_bottom: function() {\n\t return (this.$el.height() - this.scroll_elt.scrollTop() - this.scroll_elt.height() <= 0);\n\t }\n\t\n\t});\n\t\n\t/**\n\t * Tabular view tnat is embedded in a page. Scrolling occurs in view's el.\n\t */\n\tvar EmbeddedTabularDatasetChunkedView = TabularDatasetChunkedView.extend({\n\t\n\t initialize: function(options) {\n\t TabularDatasetChunkedView.prototype.initialize.call(this, options);\n\t\n\t // Because view is embedded, set up div to do scrolling.\n\t this.scroll_elt = this.$el.css({\n\t position: 'relative',\n\t overflow: 'scroll',\n\t height: options.height || '500px'\n\t });\n\t },\n\t\n\t /**\n\t * Returns true if user has scrolled to the bottom of the view.\n\t */\n\t scrolled_to_bottom: function() {\n\t return this.$el.scrollTop() + this.$el.innerHeight() >= this.el.scrollHeight;\n\t }\n\t\n\t});\n\t\n\t// button for trackster visualization\n\tvar TabularButtonTracksterView = Backbone.View.extend({\n\t\n\t // gene region columns\n\t col: {\n\t chrom : null,\n\t start : null,\n\t end : null\n\t },\n\t\n\t // url for trackster\n\t url_viz : null,\n\t\n\t // dataset id\n\t dataset_id : null,\n\t\n\t // database key\n\t genome_build: null,\n\t\n\t // data type\n\t file_ext : null,\n\t\n\t // backbone initialize\n\t initialize: function (options) {\n\t // check if environment is available\n\t var Galaxy = parent.Galaxy;\n\t\n\t // link galaxy modal or create one\n\t if (Galaxy && Galaxy.modal) {\n\t this.modal = Galaxy.modal;\n\t }\n\t\n\t // link galaxy frames\n\t if (Galaxy && Galaxy.frame) {\n\t this.frame = Galaxy.frame;\n\t }\n\t\n\t // check\n\t if (!this.modal || !this.frame) {\n\t return;\n\t }\n\t\n\t // model/metadata\n\t var model = options.model;\n\t var metadata = model.get('metadata');\n\t\n\t // check for datatype\n\t if (!model.get('file_ext')) {\n\t return;\n\t }\n\t\n\t // get data type\n\t this.file_ext = model.get('file_ext');\n\t\n\t // check for bed-file format\n\t if (this.file_ext == 'bed')\n\t {\n\t // verify that metadata exists\n\t if (metadata.get('chromCol') && metadata.get('startCol') && metadata.get('endCol'))\n\t {\n\t // read in columns\n\t this.col.chrom = metadata.get('chromCol') - 1;\n\t this.col.start = metadata.get('startCol') - 1;\n\t this.col.end = metadata.get('endCol') - 1;\n\t } else {\n\t console.log('TabularButtonTrackster : Bed-file metadata incomplete.');\n\t return;\n\t }\n\t }\n\t\n\t // check for vcf-file format\n\t if (this.file_ext == 'vcf')\n\t {\n\t // search array\n\t function search (str, array) {\n\t for (var j = 0; j < array.length; j++)\n\t if (array[j].match(str)) return j;\n\t return -1;\n\t };\n\t\n\t // load\n\t this.col.chrom = search('Chrom', metadata.get('column_names'));\n\t this.col.start = search('Pos', metadata.get('column_names'));\n\t this.col.end = null;\n\t\n\t // verify that metadata exists\n\t if (this.col.chrom == -1 || this.col.start == -1) {\n\t console.log('TabularButtonTrackster : VCF-file metadata incomplete.');\n\t return;\n\t }\n\t }\n\t\n\t // check\n\t if(this.col.chrom === undefined) {\n\t return;\n\t }\n\t\n\t // get dataset id\n\t if (model.id) {\n\t this.dataset_id = model.id;\n\t } else {\n\t console.log('TabularButtonTrackster : Dataset identification is missing.');\n\t return;\n\t }\n\t\n\t // get url\n\t if (model.get('url_viz')) {\n\t this.url_viz = model.get('url_viz');\n\t } else {\n\t console.log('TabularButtonTrackster : Url for visualization controller is missing.');\n\t return;\n\t }\n\t\n\t // get genome_build / database key\n\t if (model.get('genome_build')) {\n\t this.genome_build = model.get('genome_build');\n\t }\n\t\n\t // create the icon\n\t var btn_viz = new mod_icon_btn.IconButtonView({\n\t model : new mod_icon_btn.IconButton({\n\t title : 'Visualize',\n\t icon_class : 'chart_curve',\n\t id : 'btn_viz'\n\t })\n\t });\n\t\n\t // set element\n\t this.setElement(options.$el);\n\t\n\t // add to element\n\t this.$el.append(btn_viz.render().$el);\n\t\n\t // hide the button\n\t this.hide();\n\t },\n\t\n\t // backbone events\n\t events:\n\t {\n\t 'mouseover tr' : 'show',\n\t 'mouseleave' : 'hide'\n\t },\n\t\n\t // show button\n\t show: function (e) {\n\t // is numeric\n\t function is_numeric(n) {\n\t return !isNaN(parseFloat(n)) && isFinite(n);\n\t };\n\t\n\t // check\n\t if(this.col.chrom === null)\n\t return;\n\t\n\t // get selected data line\n\t var row = $(e.target).parent();\n\t\n\t // verify that location has been found\n\t var chrom = row.children().eq(this.col.chrom).html();\n\t var start = row.children().eq(this.col.start).html();\n\t\n\t // end is optional\n\t var end = this.col.end ? row.children().eq(this.col.end).html() : start;\n\t\n\t // double check location\n\t if (!chrom.match(\"^#\") && chrom !== \"\" && is_numeric(start)) {\n\t\n\t // get target gene region\n\t var btn_viz_pars = {\n\t dataset_id : this.dataset_id,\n\t gene_region : chrom + \":\" + start + \"-\" + end\n\t };\n\t\n\t // get button position\n\t var offset = row.offset();\n\t var left = offset.left - 10;\n\t var top = offset.top - $(window).scrollTop() + 3;\n\t\n\t // update css\n\t $('#btn_viz').css({'position': 'fixed', 'top': top + 'px', 'left': left + 'px'});\n\t $('#btn_viz').off('click');\n\t $('#btn_viz').click(this.create_trackster_action(this.url_viz, btn_viz_pars, this.genome_build));\n\t\n\t // show the button\n\t $('#btn_viz').show();\n\t } else {\n\t // hide the button\n\t $('#btn_viz').hide();\n\t }\n\t },\n\t\n\t // hide button\n\t hide: function () {\n\t this.$el.find('#btn_viz').hide();\n\t },\n\t\n\t // create action\n\t create_trackster_action : function (vis_url, dataset_params, dbkey) {\n\t // link this\n\t var self = this;\n\t\n\t // create function\n\t return function() {\n\t var listTracksParams = {};\n\t if (dbkey) {\n\t listTracksParams[ 'f-dbkey' ] = dbkey;\n\t }\n\t $.ajax({\n\t url: vis_url + '/list_tracks?' + $.param( listTracksParams ),\n\t dataType: 'html',\n\t error: function() {\n\t // show error message\n\t self.modal.show({\n\t title : 'Something went wrong!',\n\t body : 'Unfortunately we could not add this dataset to the track browser. Please try again or contact us.',\n\t buttons : {\n\t 'Cancel': function(){\n\t self.modal.hide();\n\t }\n\t }\n\t });\n\t },\n\t success: function(table_html) {\n\t self.modal.show({\n\t title : 'View Data in a New or Saved Visualization',\n\t buttons :{\n\t 'Cancel': function(){\n\t self.modal.hide();\n\t },\n\t 'View in saved visualization': function(){\n\t // show modal with saved visualizations\n\t self.modal.show(\n\t {\n\t title : 'Add Data to Saved Visualization',\n\t body : table_html,\n\t buttons : {\n\t 'Cancel': function(){\n\t self.modal.hide();\n\t },\n\t 'Add to visualization': function(){\n\t // hide\n\t self.modal.hide();\n\t\n\t // search selected fields\n\t self.modal.$el.find('input[name=id]:checked').each(function(){\n\t // get visualization id\n\t var vis_id = $(this).val();\n\t dataset_params.id = vis_id;\n\t\n\t // add widget\n\t self.frame.add({\n\t title : 'Trackster',\n\t type : 'url',\n\t content : vis_url + '/trackster?' + $.param(dataset_params)\n\t });\n\t });\n\t }\n\t }\n\t });\n\t },\n\t 'View in new visualization': function(){\n\t // hide\n\t self.modal.hide();\n\t\n\t // add widget\n\t self.frame.add({\n\t title : 'Trackster',\n\t type : 'url',\n\t content : vis_url + '/trackster?' + $.param(dataset_params)\n\t });\n\t }\n\t }\n\t });\n\t }\n\t });\n\t return false;\n\t };\n\t }\n\t});\n\t\n\t// -- Utility functions. --\n\t\n\t/**\n\t * Create a model, attach it to a view, render view, and attach it to a parent element.\n\t */\n\tvar createModelAndView = function(model, view, model_config, parent_elt) {\n\t // Create model, view.\n\t var a_view = new view({\n\t model: new model(model_config)\n\t });\n\t\n\t // Render view and add to parent element.\n\t a_view.render();\n\t if (parent_elt) {\n\t parent_elt.append(a_view.$el);\n\t }\n\t\n\t return a_view;\n\t};\n\t\n\t/**\n\t * Create a tabular dataset chunked view (and requisite tabular dataset model)\n\t * and appends to parent_elt.\n\t */\n\tvar createTabularDatasetChunkedView = function(options) {\n\t // If no model, create and set model from dataset config.\n\t if (!options.model) {\n\t options.model = new TabularDataset(options.dataset_config);\n\t }\n\t\n\t var parent_elt = options.parent_elt;\n\t var embedded = options.embedded;\n\t\n\t // Clean up options so that only needed options are passed to view.\n\t delete options.embedded;\n\t delete options.parent_elt;\n\t delete options.dataset_config;\n\t\n\t // Create and set up view.\n\t var view = (embedded ? new EmbeddedTabularDatasetChunkedView(options) :\n\t new TopLevelTabularDatasetChunkedView(options));\n\t view.render();\n\t\n\t if (parent_elt) {\n\t parent_elt.append(view.$el);\n\t // If we're sticking this in another element, once it's appended check\n\t // to make sure we've filled enough space.\n\t // Without this, the scroll elements don't work.\n\t view.expand_to_container();\n\t }\n\t\n\t return view;\n\t};\n\t\n\treturn {\n\t Dataset: Dataset,\n\t TabularDataset: TabularDataset,\n\t DatasetCollection: DatasetCollection,\n\t TabularDatasetChunkedView: TabularDatasetChunkedView,\n\t createTabularDatasetChunkedView: createTabularDatasetChunkedView\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t//==============================================================================\n\t/** Map of possible HDA/collection/job states to their string equivalents.\n\t * A port of galaxy.model.Dataset.states.\n\t */\n\tvar STATES = {\n\t // NOT ready states\n\t /** is uploading and not ready */\n\t UPLOAD : 'upload',\n\t /** the job that will produce the dataset queued in the runner */\n\t QUEUED : 'queued',\n\t /** the job that will produce the dataset is running */\n\t RUNNING : 'running',\n\t /** metadata for the dataset is being discovered/set */\n\t SETTING_METADATA : 'setting_metadata',\n\t\n\t // ready states\n\t /** was created without a tool */\n\t NEW : 'new',\n\t /** has no data */\n\t EMPTY : 'empty',\n\t /** has successfully completed running */\n\t OK : 'ok',\n\t\n\t /** the job that will produce the dataset paused */\n\t PAUSED : 'paused',\n\t /** metadata discovery/setting failed or errored (but otherwise ok) */\n\t FAILED_METADATA : 'failed_metadata',\n\t//TODO: not in trans.app.model.Dataset.states - is in database\n\t /** not accessible to the current user (i.e. due to permissions) */\n\t NOT_VIEWABLE : 'noPermission',\n\t /** deleted while uploading */\n\t DISCARDED : 'discarded',\n\t /** the tool producing this dataset failed */\n\t ERROR : 'error'\n\t};\n\t\n\tSTATES.READY_STATES = [\n\t STATES.OK,\n\t STATES.EMPTY,\n\t STATES.PAUSED,\n\t STATES.FAILED_METADATA,\n\t STATES.NOT_VIEWABLE,\n\t STATES.DISCARDED,\n\t STATES.ERROR\n\t];\n\t\n\tSTATES.NOT_READY_STATES = [\n\t STATES.UPLOAD,\n\t STATES.QUEUED,\n\t STATES.RUNNING,\n\t STATES.SETTING_METADATA,\n\t STATES.NEW\n\t];\n\t\n\t\n\t//==============================================================================\n\t return STATES;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/** This class contains all button views.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\t /** This renders the default button which is used e.g. at the bottom of the upload modal.\n\t */\n\t var ButtonBase = Backbone.View.extend({\n\t initialize: function( options ) {\n\t this.options = Utils.merge( options, {\n\t id : Utils.uid(),\n\t title : '',\n\t floating : 'right',\n\t icon : '',\n\t cls : 'ui-button btn btn-default',\n\t cls_wait : 'btn btn-info'\n\t } );\n\t this.setElement( this._template( this.options ) );\n\t var self = this;\n\t $( this.el ).on( 'click' , function() {\n\t $( '.tooltip' ).hide();\n\t if ( options.onclick && !self.disabled ) {\n\t options.onclick();\n\t }\n\t } );\n\t $( this.el ).tooltip( { title: options.tooltip, placement: 'bottom' } );\n\t },\n\t\n\t // disable\n\t disable: function() {\n\t this.$el.addClass( 'disabled' );\n\t this.disabled = true;\n\t },\n\t\n\t // enable\n\t enable: function() {\n\t this.$el.removeClass( 'disabled' );\n\t this.disabled = false;\n\t },\n\t\n\t // show spinner\n\t wait: function() {\n\t this.$el.removeClass( this.options.cls ).addClass( this.options.cls_wait ).prop( 'disabled', true );\n\t this.$( '.icon' ).removeClass( this.options.icon ).addClass( 'fa-spinner fa-spin' );\n\t this.$( '.title' ).html( 'Sending...' );\n\t },\n\t\n\t // hide spinner\n\t unwait: function() {\n\t this.$el.removeClass( this.options.cls_wait ).addClass( this.options.cls ).prop( 'disabled', false );\n\t this.$( '.icon' ).removeClass( 'fa-spinner fa-spin' ).addClass( this.options.icon );\n\t this.$( '.title' ).html( this.options.title );\n\t },\n\t\n\t // template\n\t _template: function( options ) {\n\t var str = '';\n\t return str;\n\t }\n\t });\n\t\n\t /** This button allows the right-click/open-in-new-tab feature, its used e.g. for panel buttons.\n\t */\n\t var ButtonLink = ButtonBase.extend({\n\t initialize: function( options ) {\n\t ButtonBase.prototype.initialize.call( this, options );\n\t },\n\t _template: function( options ) {\n\t return '' + '' +\n\t '';\n\t }\n\t });\n\t\n\t /** The check button is used in the tool form and allows to distinguish between multiple states e.g. all, partially and nothing selected.\n\t */\n\t var ButtonCheck = Backbone.View.extend({\n\t initialize: function( options ) {\n\t // configure options\n\t this.options = Utils.merge(options, {\n\t title : 'Select/Unselect all',\n\t icons : ['fa fa-square-o', 'fa fa-minus-square-o', 'fa fa-check-square-o'],\n\t value : 0\n\t });\n\t\n\t // create new element\n\t this.setElement( this._template() );\n\t this.$title = this.$( '.title' );\n\t this.$icon = this.$( '.icon' );\n\t\n\t // set initial value\n\t this.value( this.options.value );\n\t\n\t // set title\n\t this.$title.html( this.options.title );\n\t\n\t // add event handler\n\t var self = this;\n\t this.$el.on('click', function() {\n\t self.current = ( self.current === 0 && 2 ) || 0;\n\t self.value( self.current );\n\t self.options.onclick && self.options.onclick();\n\t });\n\t },\n\t\n\t /* Sets a new value and/or returns the current value.\n\t * @param{Integer} new_val - Set a new value 0=unchecked, 1=partial and 2=checked.\n\t * OR:\n\t * @param{Integer} new_val - Number of selected options.\n\t * @param{Integer} total - Total number of available options.\n\t */\n\t value: function ( new_val, total ) {\n\t if ( new_val !== undefined ) {\n\t if ( total ) {\n\t if ( new_val !== 0 ) {\n\t new_val = ( new_val !== total ) && 1 || 2;\n\t }\n\t }\n\t this.current = new_val;\n\t this.$icon.removeClass()\n\t .addClass( 'icon' )\n\t .addClass( this.options.icons[ new_val ] );\n\t this.options.onchange && this.options.onchange( new_val );\n\t }\n\t return this.current;\n\t },\n\t\n\t /** Template containing the check button and the title\n\t */\n\t _template: function() {\n\t return '
' +\n\t '' +\n\t '' +\n\t '
';\n\t }\n\t });\n\t\n\t /** This renders a differently styled, more compact button version.\n\t TODO: Consolidate with icon-button.js and/or button-default.js.\n\t */\n\t var ButtonIcon = Backbone.View.extend({\n\t initialize : function( options ) {\n\t // get options\n\t this.options = Utils.merge( options, {\n\t id : Utils.uid(),\n\t title : '',\n\t floating : 'right',\n\t cls : 'ui-button-icon',\n\t icon : '',\n\t tooltip : '',\n\t onclick : null\n\t });\n\t\n\t // create new element\n\t this.setElement( this._template( this.options ) );\n\t\n\t // link button element\n\t this.$button = this.$el.find( '.button' );\n\t\n\t // add event\n\t var self = this;\n\t $(this.el).on('click', function() {\n\t // hide all tooltips\n\t $( '.tooltip' ).hide();\n\t\n\t // execute onclick callback\n\t if ( options.onclick && !self.disabled ) {\n\t options.onclick();\n\t }\n\t });\n\t\n\t // add tooltip\n\t this.$button.tooltip( { title: options.tooltip, placement: 'bottom' } );\n\t },\n\t\n\t // disable\n\t disable: function() {\n\t this.$button.addClass( 'disabled' );\n\t this.disabled = true;\n\t },\n\t\n\t // enable\n\t enable: function() {\n\t this.$button.removeClass( 'disabled' );\n\t this.disabled = false;\n\t },\n\t\n\t // change icon\n\t setIcon: function(icon_cls) {\n\t this.$('i').removeClass( this.options.icon ).addClass( icon_cls );\n\t this.options.icon = icon_cls;\n\t },\n\t\n\t // template\n\t _template: function( options ) {\n\t // width\n\t var width = '';\n\t if ( options.title ) {\n\t width = 'width: auto;';\n\t }\n\t\n\t // string\n\t var str = '
' +\n\t '
';\n\t if (options.title) {\n\t str += ' ' +\n\t '' + options.title + '';\n\t } else {\n\t str += '';\n\t }\n\t str += '
' +\n\t '
';\n\t return str;\n\t }\n\t });\n\t\n\t /** This class creates a button with dropdown menu. It extends the functionality of the Ui.ButtonIcon class.\n\t TODO: Consolidate class, use common base class\n\t */\n\t var ButtonMenu = Backbone.View.extend({\n\t // optional sub menu\n\t $menu: null,\n\t\n\t // initialize\n\t initialize: function ( options ) {\n\t // get options\n\t this.options = Utils.merge( options, {\n\t // same as Ui.ButtonIcon\n\t id : '',\n\t title : '',\n\t floating : 'right',\n\t pull : 'right',\n\t icon : null,\n\t onclick : null,\n\t cls : 'ui-button-icon ui-button-menu',\n\t tooltip : '',\n\t \n\t // additional options\n\t target : '',\n\t href : '',\n\t onunload : null,\n\t visible : true,\n\t tag : ''\n\t } );\n\t\n\t // add template for tab\n\t this.setElement( $( this._template( this.options ) ) );\n\t\n\t // find root\n\t var $root = $( this.el ).find( '.root' );\n\t\n\t // link head\n\t var self = this;\n\t $root.on( 'click', function( e ) {\n\t // hide all tooltips\n\t $( '.tooltip' ).hide();\n\t\n\t // prevent default\n\t e.preventDefault();\n\t\n\t // add click event\n\t if( self.options.onclick ) {\n\t self.options.onclick();\n\t }\n\t });\n\t\n\t // visiblity\n\t if ( !this.options.visible )\n\t this.hide();\n\t\n\t // add tooltip\n\t $root.tooltip( { title: options.tooltip, placement: 'bottom' } );\n\t },\n\t\n\t // show\n\t show: function() {\n\t $( this.el ).show();\n\t },\n\t\n\t // hide\n\t hide: function() {\n\t $( this.el ).hide();\n\t },\n\t\n\t // add menu item\n\t addMenu: function ( options ) {\n\t // menu option defaults\n\t var menuOptions = {\n\t title : '',\n\t target : '',\n\t href : '',\n\t onclick : null,\n\t divider : false,\n\t icon : null,\n\t cls : 'button-menu btn-group'\n\t }\n\t\n\t // get options\n\t menuOptions = Utils.merge( options, menuOptions );\n\t\n\t // check if submenu element is available\n\t if ( !this.$menu ) {\n\t // insert submenu element into root\n\t $( this.el ).append( this._templateMenu() );\n\t\n\t // update element link\n\t this.$menu = $( this.el ).find( '.menu' );\n\t }\n\t\n\t // create\n\t var $item = $( this._templateMenuItem( menuOptions ) );\n\t\n\t // add events\n\t $item.on( 'click', function( e ) {\n\t if( menuOptions.onclick ) {\n\t e.preventDefault();\n\t menuOptions.onclick();\n\t }\n\t });\n\t\n\t // append menu\n\t this.$menu.append( $item );\n\t\n\t // append divider\n\t if ( menuOptions.divider ) {\n\t this.$menu.append( $( this._templateDivider() ) );\n\t }\n\t },\n\t\n\t // fill template header\n\t _templateMenuItem: function ( options ) {\n\t var tmpl = '
  • ' +\n\t '';\n\t }\n\t tmpl += ' ' + options.title +\n\t '' +\n\t '
  • ';\n\t return tmpl;\n\t },\n\t\n\t // fill template header\n\t _templateMenu: function () {\n\t return '
      ';\n\t },\n\t\n\t _templateDivider: function() {\n\t return '
    • ';\n\t },\n\t\n\t // element\n\t _template: function(options) {\n\t // TODO: width/margin should be set in css\n\t var width = '';\n\t var margin = '';\n\t if ( options.title ) {\n\t width = 'width: auto;';\n\t } else {\n\t margin = 'margin: 0px;';\n\t }\n\t var str = '
      ' +\n\t '
      ' +\n\t '';\n\t if ( options.title ) {\n\t str += ' ' + options.title + '';\n\t }\n\t str += '
      ' +\n\t '
      ';\n\t return str;\n\t }\n\t });\n\t\n\t return {\n\t ButtonDefault : ButtonBase,\n\t ButtonLink : ButtonLink,\n\t ButtonIcon : ButtonIcon,\n\t ButtonCheck : ButtonCheck,\n\t ButtonMenu : ButtonMenu\n\t }\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\t\n\t/**\n\t * This class creates a ui table element.\n\t */\n\tvar View = Backbone.View.extend({\n\t // current row\n\t row: null,\n\t \n\t // count rows\n\t row_count: 0,\n\t \n\t // defaults options\n\t optionsDefault: {\n\t content : 'No content available.',\n\t onchange : null,\n\t ondblclick : null,\n\t onconfirm : null,\n\t cls : 'ui-table',\n\t cls_tr : ''\n\t },\n\t \n\t // events\n\t events : {\n\t 'click' : '_onclick',\n\t 'dblclick' : '_ondblclick'\n\t },\n\t \n\t // initialize\n\t initialize : function(options) {\n\t // configure options\n\t this.options = Utils.merge(options, this.optionsDefault);\n\t \n\t // create new element\n\t var $el = $(this._template(this.options));\n\t \n\t // link sub-elements\n\t this.$thead = $el.find('thead');\n\t this.$tbody = $el.find('tbody');\n\t this.$tmessage = $el.find('tmessage');\n\t \n\t // set element\n\t this.setElement($el);\n\t \n\t // initialize row\n\t this.row = this._row();\n\t },\n\t \n\t // add header cell\n\t addHeader: function($el) {\n\t var wrapper = $('
    ' +\n\t '' +\n\t '' +\n\t '
    ' +\n\t '' + options.content + '' +\n\t '
    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t //jquery\n\t //backbone\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t//=============================================================================\n\t/**\n\t * backbone model for icon buttons\n\t */\n\tvar IconButton = Backbone.Model.extend({\n\t defaults: {\n\t title : \"\",\n\t icon_class : \"\",\n\t on_click : null,\n\t menu_options : null,\n\t is_menu_button : true,\n\t id : null,\n\t href : null,\n\t target : null,\n\t enabled : true,\n\t visible : true,\n\t tooltip_config : {}\n\t }\n\t});\n\t\n\t/**\n\t * backbone view for icon buttons\n\t */\n\tvar IconButtonView = Backbone.View.extend({\n\t\n\t initialize : function(){\n\t // better rendering this way\n\t this.model.attributes.tooltip_config = { placement : 'bottom' };\n\t this.model.bind( 'change', this.render, this );\n\t },\n\t\n\t render : function( ){\n\t // hide tooltip\n\t this.$el.tooltip( 'hide' );\n\t\n\t var new_elem = this.template( this.model.toJSON() );\n\t // configure tooltip\n\t new_elem.tooltip( this.model.get( 'tooltip_config' ));\n\t this.$el.replaceWith( new_elem );\n\t this.setElement( new_elem );\n\t return this;\n\t },\n\t\n\t events : {\n\t 'click' : 'click'\n\t },\n\t\n\t click : function( event ){\n\t // if on_click pass to that function\n\t if( _.isFunction( this.model.get( 'on_click' ) ) ){\n\t this.model.get( 'on_click' )( event );\n\t return false;\n\t }\n\t // otherwise, bubble up ( to href or whatever )\n\t return true;\n\t },\n\t\n\t // generate html element\n\t template: function( options ){\n\t var buffer = 'title=\"' + options.title + '\" class=\"icon-button';\n\t\n\t if( options.is_menu_button ){\n\t buffer += ' menu-button';\n\t }\n\t\n\t buffer += ' ' + options.icon_class;\n\t\n\t if( !options.enabled ){\n\t buffer += '_disabled';\n\t }\n\t\n\t // close class tag\n\t buffer += '\"';\n\t\n\t if( options.id ){\n\t buffer += ' id=\"' + options.id + '\"';\n\t }\n\t\n\t buffer += ' href=\"' + options.href + '\"';\n\t // add target for href\n\t if( options.target ){\n\t buffer += ' target=\"' + options.target + '\"';\n\t }\n\t // set visibility\n\t if( !options.visible ){\n\t buffer += ' style=\"display: none;\"';\n\t }\n\t\n\t // enabled/disabled\n\t if ( options.enabled ){\n\t buffer = '';\n\t } else {\n\t buffer = '';\n\t }\n\t\n\t // return element\n\t return $( buffer );\n\t }\n\t} );\n\t\n\t// define collection\n\tvar IconButtonCollection = Backbone.Collection.extend({\n\t model: IconButton\n\t});\n\t\n\t/**\n\t * menu with multiple icon buttons\n\t * views are not needed nor used for individual buttons\n\t */\n\tvar IconButtonMenuView = Backbone.View.extend({\n\t\n\t tagName: 'div',\n\t\n\t initialize: function(){\n\t this.render();\n\t },\n\t\n\t render: function(){\n\t // initialize icon buttons\n\t var self = this;\n\t this.collection.each(function(button){\n\t // create and add icon button to menu\n\t var elt = $('')\n\t .attr('href', 'javascript:void(0)')\n\t .attr('title', button.attributes.title)\n\t .addClass('icon-button menu-button')\n\t .addClass(button.attributes.icon_class)\n\t .appendTo(self.$el)\n\t .click(button.attributes.on_click);\n\t\n\t // configure tooltip\n\t if (button.attributes.tooltip_config){\n\t elt.tooltip(button.attributes.tooltip_config);\n\t }\n\t\n\t // add popup menu to icon\n\t var menu_options = button.get('options');\n\t if (menu_options){\n\t make_popupmenu(elt, menu_options);\n\t }\n\t });\n\t\n\t // return\n\t return this;\n\t }\n\t});\n\t\n\t/**\n\t * Returns an IconButtonMenuView for the provided configuration.\n\t * Configuration is a list of dictionaries where each dictionary\n\t * defines an icon button. Each dictionary must have the following\n\t * elements: icon_class, title, and on_click.\n\t */\n\tvar create_icon_buttons_menu = function(config, global_config)\n\t{\n\t // initialize global configuration\n\t if (!global_config) global_config = {};\n\t\n\t // create and initialize menu\n\t var buttons = new IconButtonCollection(\n\t _.map(config, function(button_config){\n\t return new IconButton(_.extend(button_config, global_config));\n\t })\n\t );\n\t\n\t // return menu\n\t return new IconButtonMenuView( {collection: buttons} );\n\t};\n\t\n\t\n\t//=============================================================================\n\t return {\n\t IconButton : IconButton,\n\t IconButtonView : IconButtonView,\n\t IconButtonCollection : IconButtonCollection,\n\t IconButtonMenuView : IconButtonMenuView,\n\t create_icon_buttons_menu: create_icon_buttons_menu\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// from: https://raw.githubusercontent.com/umdjs/umd/master/jqueryPlugin.js\n\t// Uses AMD or browser globals to create a jQuery plugin.\n\t(function (factory) {\n\t if (true) {\n\t //TODO: So...this turns out to be an all or nothing thing. If I load jQuery in the define below, it will\n\t // (of course) wipe the old jquery *and all the plugins loaded into it*. So the define below *is still\n\t // relying on jquery being loaded globally* in order to preserve plugins.\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else {\n\t // Browser globals\n\t factory(jQuery);\n\t }\n\t\n\t}(function ( jQuery ) {\n\t'use_strict';\n\t\n\tvar $ = jQuery;\n\t\n\t// ============================================================================\n\t/**\n\t * Make an element with text editable: (a) when user clicks on text, a textbox/area\n\t * is provided for editing; (b) when enter key pressed, element's text is set and on_finish\n\t * is called.\n\t */\n\t$.fn.make_text_editable = function(config_dict) {\n\t // Get config options.\n\t var num_cols = (\"num_cols\" in config_dict ? config_dict.num_cols : 30),\n\t num_rows = (\"num_rows\" in config_dict ? config_dict.num_rows : 4),\n\t use_textarea = (\"use_textarea\" in config_dict ? config_dict.use_textarea : false),\n\t on_finish = (\"on_finish\" in config_dict ? config_dict.on_finish : null),\n\t help_text = (\"help_text\" in config_dict ? config_dict.help_text : null);\n\t\n\t // Add element behavior.\n\t var container = $(this);\n\t container.addClass(\"editable-text\").click(function(e) {\n\t // If there's already an input element, editing is active, so do nothing.\n\t if ($(this).children(\":input\").length > 0) {\n\t return;\n\t }\n\t\n\t container.removeClass(\"editable-text\");\n\t\n\t // Handler for setting element text.\n\t var set_text = function(new_text) {\n\t container.find(\":input\").remove();\n\t\n\t if (new_text !== \"\") {\n\t container.text(new_text);\n\t } else {\n\t // No text; need a line so that there is a click target.\n\t container.html(\"
    \");\n\t }\n\t container.addClass(\"editable-text\");\n\t\n\t if (on_finish) {\n\t on_finish(new_text);\n\t }\n\t };\n\t\n\t // Create input element(s) for editing.\n\t var cur_text = (\"cur_text\" in config_dict ? config_dict.cur_text : container.text() ),\n\t input_elt, button_elt;\n\t\n\t if (use_textarea) {\n\t input_elt = $(\"' +\n\t '
    ';\n\t },\n\t\n\t requirements: function(options) {\n\t var requirements_message = 'This tool requires ';\n\t for (var i in options.requirements) {\n\t var req = options.requirements[i];\n\t requirements_message += req.name;\n\t if (req.version) {\n\t requirements_message += ' (Version ' + req.version + ')';\n\t }\n\t if (i < options.requirements.length - 2) {\n\t requirements_message += ', ';\n\t }\n\t if (i == options.requirements.length - 2) {\n\t requirements_message += ' and ';\n\t }\n\t }\n\t return requirements_message + '. Click here for more information.';\n\t }\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(11), __webpack_require__(7)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Portlet, Ui) {\n\t\n\t// ui list element\n\tvar View = Backbone.View.extend({\n\t // create portlet to keep track of selected list elements\n\t initialize : function(options) {\n\t // link this\n\t var self = this;\n\t\n\t // initialize options\n\t this.options = options;\n\t this.name = options.name || 'element';\n\t this.multiple = options.multiple || false;\n\t\n\t // create message handler\n\t this.message = new Ui.Message({ cls: 'ui-margin-top' });\n\t\n\t // create portlet\n\t this.portlet = new Portlet.View({ cls: 'ui-portlet-section' });\n\t\n\t // create select field containing the options which can be inserted into the list\n\t this.select = new Ui.Select.View({ optional : options.optional });\n\t\n\t // create insert new list element button\n\t this.button = new Ui.ButtonIcon({\n\t icon : 'fa fa-sign-in',\n\t floating : 'left',\n\t tooltip : 'Insert new ' + this.name,\n\t onclick : function() {\n\t self.add({\n\t id : self.select.value(),\n\t name : self.select.text()\n\t });\n\t }\n\t });\n\t\n\t // build main element\n\t this.setElement(this._template(options));\n\t this.$('.ui-list-message').append(this.message.$el);\n\t this.$('.ui-list-portlet').append(this.portlet.$el);\n\t this.$('.ui-list-button').append(this.button.$el);\n\t this.$('.ui-list-select').append(this.select.$el);\n\t },\n\t\n\t /** Return/Set currently selected list elements */\n\t value: function(val) {\n\t // set new value\n\t if (val !== undefined) {\n\t this.portlet.empty();\n\t if ($.isArray(val)) {\n\t for (var i in val) {\n\t var v = val[i];\n\t var v_id = null;\n\t var v_name = null;\n\t if ($.type(v) != 'string') {\n\t v_id = v.id;\n\t v_name = v.name;\n\t } else {\n\t v_id = v_name = v;\n\t }\n\t if (v_id != null) {\n\t this.add({\n\t id : v_id,\n\t name : v_name\n\t });\n\t }\n\t }\n\t }\n\t this._refresh();\n\t }\n\t // get current value\n\t var lst = [];\n\t this.$('.ui-list-id').each(function() {\n\t lst.push({\n\t id : $(this).prop('id'),\n\t name : $(this).find('.ui-list-name').html()\n\t });\n\t });\n\t if (lst.length == 0) {\n\t return null;\n\t }\n\t return lst;\n\t },\n\t\n\t /** Add row */\n\t add: function(options) {\n\t var self = this;\n\t if (this.$('[id=\"' + options.id + '\"]').length === 0) {\n\t if (Utils.validate(options.id)) {\n\t var $el = $(this._templateRow({\n\t id : options.id,\n\t name : options.name\n\t }));\n\t $el.on('click', function() {\n\t $el.remove();\n\t self._refresh();\n\t });\n\t $el.on('mouseover', function() {\n\t $el.addClass('portlet-highlight');\n\t });\n\t $el.on('mouseout', function() {\n\t $el.removeClass('portlet-highlight');\n\t });\n\t this.portlet.append($el);\n\t this._refresh();\n\t } else {\n\t this.message.update({ message: 'Please select a valid ' + this.name + '.', status: 'danger' });\n\t }\n\t } else {\n\t this.message.update({ message: 'This ' + this.name + ' is already in the list.' });\n\t }\n\t },\n\t\n\t /** Update available options */\n\t update: function(options) {\n\t this.select.update(options);\n\t },\n\t\n\t /** Refresh view */\n\t _refresh: function() {\n\t if (this.$('.ui-list-id').length > 0) {\n\t !this.multiple && this.button.disable();\n\t this.$('.ui-list-portlet').show();\n\t } else {\n\t this.button.enable();\n\t this.$('.ui-list-portlet').hide();\n\t }\n\t this.options.onchange && this.options.onchange();\n\t },\n\t\n\t /** Main Template */\n\t _template: function(options) {\n\t return '
    ' +\n\t '
    ' +\n\t '' +\n\t '' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ';\n\t },\n\t\n\t /** Row Template */\n\t _templateRow: function(options) {\n\t return '
    ' +\n\t '' +\n\t '' + options.name + '' +\n\t '
    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(16)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Buttons) {\n\t\n\t/** Base class for options based ui elements **/\n\tvar Base = Backbone.View.extend({\n\t // initialize\n\t initialize: function(options) {\n\t // link this\n\t var self = this;\n\t\n\t // configure options\n\t this.options = Utils.merge(options, {\n\t visible : true,\n\t data : [],\n\t id : Utils.uid(),\n\t error_text : 'No options available.',\n\t wait_text : 'Please wait...',\n\t multiple : false\n\t });\n\t\n\t // create new element\n\t this.setElement('
    ');\n\t\n\t // create elements\n\t this.$message = $('
    ');\n\t this.$options = $(this._template(options));\n\t this.$menu = $('
    ');\n\t\n\t // append\n\t this.$el.append(this.$message);\n\t this.$el.append(this.$menu);\n\t this.$el.append(this.$options);\n\t\n\t // add select/unselect all button\n\t if (this.options.multiple) {\n\t this.all_button = new Buttons.ButtonCheck({\n\t onclick: function() {\n\t self.$('input').prop('checked', self.all_button.value() !== 0);\n\t self.trigger('change');\n\t }\n\t });\n\t this.$menu.append(this.all_button.$el);\n\t }\n\t\n\t // hide input field\n\t if (!this.options.visible) {\n\t this.$el.hide();\n\t }\n\t\n\t // initialize data\n\t this.update(this.options.data);\n\t\n\t // set initial value\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t\n\t // add change event. fires on trigger\n\t this.on('change', function() {\n\t this.options.onchange && this.options.onchange(this.value());\n\t });\n\t },\n\t\n\t /** Update options\n\t */\n\t update: function(options) {\n\t // backup current value\n\t var current = this._getValue();\n\t\n\t // remove all options\n\t this.$options.empty();\n\t\n\t // add new options using single option templates or full template\n\t if (this._templateOptions) {\n\t // rebuild options using full template\n\t this.$options.append(this._templateOptions(options));\n\t } else {\n\t // rebuild options using single option templates\n\t for (var key in options) {\n\t var $option = $(this._templateOption(options[key]));\n\t $option.addClass('ui-option');\n\t $option.tooltip({title: options[key].tooltip, placement: 'bottom'});\n\t this.$options.append($option);\n\t }\n\t }\n\t\n\t // add change events\n\t var self = this;\n\t this.$('input').on('change', function() {\n\t self.value(self._getValue());\n\t self.trigger('change');\n\t });\n\t\n\t // set previous value\n\t this.value(current);\n\t\n\t // data initialization has been completed\n\t this.unwait();\n\t },\n\t\n\t /** Return/Set current value\n\t */\n\t value: function (new_value) {\n\t // set new value if available\n\t if (new_value !== undefined) {\n\t // reset selection\n\t this.$('input').prop('checked', false);\n\t // set value\n\t if (new_value !== null) {\n\t // check if its an array\n\t if (!(new_value instanceof Array)) {\n\t new_value = [new_value];\n\t }\n\t // update to new selection\n\t for (var i in new_value) {\n\t this.$('input[value=\"' + new_value[i] + '\"]').first().prop('checked', true);\n\t }\n\t };\n\t }\n\t // get current value\n\t var current = this._getValue();\n\t if (this.all_button) {\n\t var value = current;\n\t if (!(value instanceof Array)) {\n\t value = 0;\n\t } else {\n\t value = value.length;\n\t }\n\t this.all_button.value(value, this._size());\n\t }\n\t return current;\n\t },\n\t\n\t /** Check if selected value exists (or any if multiple)\n\t */\n\t exists: function(value) {\n\t if (value !== undefined) {\n\t if (!(value instanceof Array)) {\n\t value = [value];\n\t }\n\t for (var i in value) {\n\t if (this.$('input[value=\"' + value[i] + '\"]').length > 0) {\n\t return true;\n\t }\n\t }\n\t }\n\t return false;\n\t },\n\t\n\t /** Return first available option\n\t */\n\t first: function() {\n\t var options = this.$('input').first();\n\t if (options.length > 0) {\n\t return options.val();\n\t } else {\n\t return null;\n\t }\n\t },\n\t\n\t /** Wait message during request processing\n\t */\n\t wait: function() {\n\t if (this._size() == 0) {\n\t this._messageShow(this.options.wait_text, 'info');\n\t this.$options.hide();\n\t this.$menu.hide();\n\t }\n\t },\n\t\n\t /** Hide wait message\n\t */\n\t unwait: function() {\n\t var total = this._size();\n\t if (total == 0) {\n\t this._messageShow(this.options.error_text, 'danger');\n\t this.$options.hide();\n\t this.$menu.hide();\n\t } else {\n\t this._messageHide();\n\t this.$options.css('display', 'inline-block');\n\t this.$menu.show();\n\t }\n\t },\n\t\n\t /** Return current selection\n\t */\n\t _getValue: function() {\n\t // track values in array\n\t var selected = [];\n\t this.$(':checked').each(function() {\n\t selected.push($(this).val());\n\t });\n\t\n\t // get selected elements\n\t if (!Utils.validate(selected)) {\n\t return null;\n\t }\n\t\n\t // return multiple or single value\n\t if (this.options.multiple) {\n\t return selected;\n\t } else {\n\t return selected[0];\n\t }\n\t },\n\t\n\t /** Returns the number of options\n\t */\n\t _size: function() {\n\t return this.$('.ui-option').length;\n\t },\n\t\n\t /** Show message instead if options\n\t */\n\t _messageShow: function(text, status) {\n\t this.$message.show();\n\t this.$message.removeClass();\n\t this.$message.addClass('ui-message alert alert-' + status);\n\t this.$message.html(text);\n\t },\n\t\n\t /** Hide message\n\t */\n\t _messageHide: function() {\n\t this.$message.hide();\n\t },\n\t\n\t /** Main template function\n\t */\n\t _template: function() {\n\t return '
    ';\n\t }\n\t});\n\t\n\t/** Iconized **/\n\tvar BaseIcons = Base.extend({\n\t _templateOption: function(pair) {\n\t var id = Utils.uid();\n\t return '
    ' +\n\t '' +\n\t '' +\n\t '
    ';\n\t }\n\t});\n\t\n\t/** Radio button field **/\n\tvar Radio = {};\n\tRadio.View = BaseIcons.extend({\n\t initialize: function(options) {\n\t options.type = 'radio';\n\t BaseIcons.prototype.initialize.call(this, options);\n\t }\n\t});\n\t\n\t/** Checkbox options field **/\n\tvar Checkbox = {};\n\tCheckbox.View = BaseIcons.extend({\n\t initialize: function(options) {\n\t options.multiple = true;\n\t options.type = 'checkbox';\n\t BaseIcons.prototype.initialize.call(this, options);\n\t }\n\t});\n\t\n\t/** Radio button options field styled as classic buttons **/\n\tvar RadioButton = {};\n\tRadioButton.View = Base.extend({\n\t // initialize\n\t initialize: function(options) {\n\t Base.prototype.initialize.call(this, options);\n\t },\n\t\n\t /** Return/Set current value\n\t */\n\t value: function (new_value) {\n\t // set new value\n\t if (new_value !== undefined) {\n\t this.$('input').prop('checked', false);\n\t this.$('label').removeClass('active');\n\t this.$('[value=\"' + new_value + '\"]').prop('checked', true).closest('label').addClass('active');\n\t }\n\t\n\t // get and return value\n\t return this._getValue();\n\t },\n\t\n\t /** Template for a single option\n\t */\n\t _templateOption: function(pair) {\n\t var cls = 'fa ' + pair.icon;\n\t if (!pair.label) {\n\t cls += ' no-padding';\n\t }\n\t var tmpl = '';\n\t return tmpl;\n\t },\n\t\n\t /** Main template function\n\t */\n\t _template: function() {\n\t return '
    ';\n\t }\n\t});\n\t\n\treturn {\n\t Base : Base,\n\t BaseIcons : BaseIcons,\n\t Radio : Radio,\n\t RadioButton : RadioButton,\n\t Checkbox : Checkbox\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function($, _) {(function (root, factory) {\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else {\n\t root.faIconButton = factory();\n\t }\n\t\n\t}(this, function () {\n\t//============================================================================\n\t /** Returns a jQuery object containing a clickable font-awesome button.\n\t * options:\n\t * tooltipConfig : option map for bootstrap tool tip\n\t * classes : array of class names (will always be classed as icon-btn)\n\t * disabled : T/F - add the 'disabled' class?\n\t * title : tooltip/title string\n\t * target : optional href target\n\t * href : optional href\n\t * faIcon : which font awesome icon to use\n\t * onclick : function to call when the button is clicked\n\t */\n\t var faIconButton = function( options ){\n\t options = options || {};\n\t options.tooltipConfig = options.tooltipConfig || { placement: 'bottom' };\n\t\n\t options.classes = [ 'icon-btn' ].concat( options.classes || [] );\n\t if( options.disabled ){\n\t options.classes.push( 'disabled' );\n\t }\n\t\n\t var html = [\n\t '',\n\t // could go with something less specific here - like 'html'\n\t '',\n\t ''\n\t ].join( '' );\n\t var $button = $( html ).tooltip( options.tooltipConfig );\n\t if( _.isFunction( options.onclick ) ){\n\t $button.click( options.onclick );\n\t }\n\t return $button;\n\t };\n\t\n\t//============================================================================\n\t return faIconButton;\n\t}));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.HandlebarsEnvironment = HandlebarsEnvironment;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\tvar _exception = __webpack_require__(9);\n\t\n\tvar _exception2 = _interopRequireDefault(_exception);\n\t\n\tvar _helpers = __webpack_require__(70);\n\t\n\tvar _decorators = __webpack_require__(68);\n\t\n\tvar _logger = __webpack_require__(78);\n\t\n\tvar _logger2 = _interopRequireDefault(_logger);\n\t\n\tvar VERSION = '4.0.5';\n\texports.VERSION = VERSION;\n\tvar COMPILER_REVISION = 7;\n\t\n\texports.COMPILER_REVISION = COMPILER_REVISION;\n\tvar REVISION_CHANGES = {\n\t 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n\t 2: '== 1.0.0-rc.3',\n\t 3: '== 1.0.0-rc.4',\n\t 4: '== 1.x.x',\n\t 5: '== 2.0.0-alpha.x',\n\t 6: '>= 2.0.0-beta.1',\n\t 7: '>= 4.0.0'\n\t};\n\t\n\texports.REVISION_CHANGES = REVISION_CHANGES;\n\tvar objectType = '[object Object]';\n\t\n\tfunction HandlebarsEnvironment(helpers, partials, decorators) {\n\t this.helpers = helpers || {};\n\t this.partials = partials || {};\n\t this.decorators = decorators || {};\n\t\n\t _helpers.registerDefaultHelpers(this);\n\t _decorators.registerDefaultDecorators(this);\n\t}\n\t\n\tHandlebarsEnvironment.prototype = {\n\t constructor: HandlebarsEnvironment,\n\t\n\t logger: _logger2['default'],\n\t log: _logger2['default'].log,\n\t\n\t registerHelper: function registerHelper(name, fn) {\n\t if (_utils.toString.call(name) === objectType) {\n\t if (fn) {\n\t throw new _exception2['default']('Arg not supported with multiple helpers');\n\t }\n\t _utils.extend(this.helpers, name);\n\t } else {\n\t this.helpers[name] = fn;\n\t }\n\t },\n\t unregisterHelper: function unregisterHelper(name) {\n\t delete this.helpers[name];\n\t },\n\t\n\t registerPartial: function registerPartial(name, partial) {\n\t if (_utils.toString.call(name) === objectType) {\n\t _utils.extend(this.partials, name);\n\t } else {\n\t if (typeof partial === 'undefined') {\n\t throw new _exception2['default']('Attempting to register a partial called \"' + name + '\" as undefined');\n\t }\n\t this.partials[name] = partial;\n\t }\n\t },\n\t unregisterPartial: function unregisterPartial(name) {\n\t delete this.partials[name];\n\t },\n\t\n\t registerDecorator: function registerDecorator(name, fn) {\n\t if (_utils.toString.call(name) === objectType) {\n\t if (fn) {\n\t throw new _exception2['default']('Arg not supported with multiple decorators');\n\t }\n\t _utils.extend(this.decorators, name);\n\t } else {\n\t this.decorators[name] = fn;\n\t }\n\t },\n\t unregisterDecorator: function unregisterDecorator(name) {\n\t delete this.decorators[name];\n\t }\n\t};\n\t\n\tvar log = _logger2['default'].log;\n\t\n\texports.log = log;\n\texports.createFrame = _utils.createFrame;\n\texports.logger = _logger2['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7cUJBQTRDLFNBQVM7O3lCQUMvQixhQUFhOzs7O3VCQUNFLFdBQVc7OzBCQUNSLGNBQWM7O3NCQUNuQyxVQUFVOzs7O0FBRXRCLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQzs7QUFDeEIsSUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7OztBQUU1QixJQUFNLGdCQUFnQixHQUFHO0FBQzlCLEdBQUMsRUFBRSxhQUFhO0FBQ2hCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxVQUFVO0FBQ2IsR0FBQyxFQUFFLGtCQUFrQjtBQUNyQixHQUFDLEVBQUUsaUJBQWlCO0FBQ3BCLEdBQUMsRUFBRSxVQUFVO0NBQ2QsQ0FBQzs7O0FBRUYsSUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7O0FBRTlCLFNBQVMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDbkUsTUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQzdCLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUMvQixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0FBRW5DLGtDQUF1QixJQUFJLENBQUMsQ0FBQztBQUM3Qix3Q0FBMEIsSUFBSSxDQUFDLENBQUM7Q0FDakM7O0FBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ2hDLGFBQVcsRUFBRSxxQkFBcUI7O0FBRWxDLFFBQU0scUJBQVE7QUFDZCxLQUFHLEVBQUUsb0JBQU8sR0FBRzs7QUFFZixnQkFBYyxFQUFFLHdCQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDakMsUUFBSSxnQkFBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3RDLFVBQUksRUFBRSxFQUFFO0FBQUUsY0FBTSwyQkFBYyx5Q0FBeUMsQ0FBQyxDQUFDO09BQUU7QUFDM0Usb0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QixNQUFNO0FBQ0wsVUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekI7R0FDRjtBQUNELGtCQUFnQixFQUFFLDBCQUFTLElBQUksRUFBRTtBQUMvQixXQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDM0I7O0FBRUQsaUJBQWUsRUFBRSx5QkFBUyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ3ZDLFFBQUksZ0JBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtBQUN0QyxvQkFBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdCLE1BQU07QUFDTCxVQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTtBQUNsQyxjQUFNLHlFQUEwRCxJQUFJLG9CQUFpQixDQUFDO09BQ3ZGO0FBQ0QsVUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7S0FDL0I7R0FDRjtBQUNELG1CQUFpQixFQUFFLDJCQUFTLElBQUksRUFBRTtBQUNoQyxXQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDNUI7O0FBRUQsbUJBQWlCLEVBQUUsMkJBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxRQUFJLGdCQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDdEMsVUFBSSxFQUFFLEVBQUU7QUFBRSxjQUFNLDJCQUFjLDRDQUE0QyxDQUFDLENBQUM7T0FBRTtBQUM5RSxvQkFBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQy9CLE1BQU07QUFDTCxVQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUM1QjtHQUNGO0FBQ0QscUJBQW1CLEVBQUUsNkJBQVMsSUFBSSxFQUFFO0FBQ2xDLFdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM5QjtDQUNGLENBQUM7O0FBRUssSUFBSSxHQUFHLEdBQUcsb0JBQU8sR0FBRyxDQUFDOzs7UUFFcEIsV0FBVztRQUFFLE1BQU0iLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4wLjUnO1xuZXhwb3J0IGNvbnN0IENPTVBJTEVSX1JFVklTSU9OID0gNztcblxuZXhwb3J0IGNvbnN0IFJFVklTSU9OX0NIQU5HRVMgPSB7XG4gIDE6ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFjdHVhbGx5IHJldjIgYnV0IGRvZXNuJ3QgcmVwb3J0IGl0XG4gIDI6ICc9PSAxLjAuMC1yYy4zJyxcbiAgMzogJz09IDEuMC4wLXJjLjQnLFxuICA0OiAnPT0gMS54LngnLFxuICA1OiAnPT0gMi4wLjAtYWxwaGEueCcsXG4gIDY6ICc+PSAyLjAuMC1iZXRhLjEnLFxuICA3OiAnPj0gNC4wLjAnXG59O1xuXG5jb25zdCBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMsIGRlY29yYXRvcnMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuICB0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzIHx8IHt9O1xuXG4gIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG4gIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBsb2dnZXIsXG4gIGxvZzogbG9nZ2VyLmxvZyxcblxuICByZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaGVscGVyc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgZXh0ZW5kKHRoaXMucGFydGlhbHMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHBhcnRpYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oYEF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIiR7bmFtZX1cIiBhcyB1bmRlZmluZWRgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSBwYXJ0aWFsO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJ0aWFsc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5kZWNvcmF0b3JzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvcmF0b3JzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuZGVjb3JhdG9yc1tuYW1lXTtcbiAgfVxufTtcblxuZXhwb3J0IGxldCBsb2cgPSBsb2dnZXIubG9nO1xuXG5leHBvcnQge2NyZWF0ZUZyYW1lLCBsb2dnZXJ9O1xuIl19\n\n\n/***/ },\n/* 28 */,\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {/**\n\t * Popover wrapper\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(4) ], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\tvar View = Backbone.View.extend({\n\t optionsDefault: {\n\t with_close : true,\n\t title : null,\n\t placement : 'top',\n\t container : 'body',\n\t body : null\n\t },\n\t\n\t initialize: function ( options ) {\n\t this.setElement( this._template() );\n\t this.uid = Utils.uid();\n\t this.options = _.defaults( options || {}, this.optionsDefault );\n\t this.options.container.parent().append( this.el );\n\t this.$title = this.$( '.popover-title-label' );\n\t this.$close = this.$( '.popover-close' );\n\t this.$body = this.$( '.popover-content' );\n\t\n\t // add initial content\n\t this.options.body && this.append( this.options.body );\n\t\n\t // add event to hide if click is outside of popup and not on container\n\t var self = this;\n\t $( 'body' ).on( 'mousedown.' + this.uid, function( e ) {\n\t // the 'is' for buttons that trigger popups\n\t // the 'has' for icons within a button that triggers a popup\n\t self.visible && !$( self.options.container ).is( e.target ) && !$( self.el ).is( e.target ) &&\n\t $( self.el ).has( e.target ).length === 0 && self.hide();\n\t });\n\t },\n\t\n\t /**\n\t * Render popover\n\t */\n\t render: function() {\n\t this.$title.html( this.options.title );\n\t this.$el.removeClass().addClass( 'ui-popover popover fade in' ).addClass( this.options.placement );\n\t this.$el.css( this._get_placement( this.options.placement ) );\n\t\n\t // configure close option\n\t var self = this;\n\t if ( this.options.with_close ) {\n\t this.$close.on( 'click', function() { self.hide() } ).show();\n\t } else {\n\t this.$close.off().hide();\n\t }\n\t },\n\t\n\t /**\n\t * Set the popover title\n\t * @params{ String } newTitle - New popover title\n\t */\n\t title: function( newTitle ) {\n\t if ( newTitle !== undefined ) {\n\t this.options.title = newTitle;\n\t this.$title.html( newTitle );\n\t }\n\t },\n\t\n\t /**\n\t * Show popover\n\t */\n\t show: function() {\n\t this.render();\n\t this.$el.show();\n\t this.visible = true;\n\t },\n\t\n\t /**\n\t * Hide popover\n\t */\n\t hide: function() {\n\t this.$el.hide();\n\t this.visible = false;\n\t },\n\t\n\t /**\n\t * Append new content to the popover\n\t * @params{ Object } $el - Dom element\n\t */\n\t append: function( $el ) {\n\t this.$body.append( $el );\n\t },\n\t\n\t /**\n\t * Remove all content\n\t */\n\t empty: function() {\n\t this.$body.empty();\n\t },\n\t\n\t /**\n\t * Remove popover\n\t */\n\t remove: function() {\n\t $( 'body' ).off( 'mousedown.' + this.uid );\n\t this.$el.remove();\n\t },\n\t\n\t /**\n\t * Improve popover location/placement\n\t */\n\t _get_placement: function( placement ) {\n\t // get popover dimensions\n\t var width = this._get_width( this.$el );\n\t var height = this.$el.height();\n\t\n\t // get container details\n\t var $container = this.options.container;\n\t var container_width = this._get_width( $container );\n\t var container_height = this._get_height( $container );\n\t var container_position = $container.position();\n\t\n\t // get position\n\t var top = left = 0;\n\t if ([ 'top', 'bottom' ].indexOf( placement ) != -1) {\n\t left = container_position.left - width + ( container_width + width ) / 2;\n\t switch ( placement ) {\n\t case 'top':\n\t top = container_position.top - height - 5;\n\t break;\n\t case 'bottom':\n\t top = container_position.top + container_height + 5;\n\t break;\n\t }\n\t } else {\n\t top = container_position.top - height + ( container_height + height ) / 2;\n\t switch ( placement ) {\n\t case 'right':\n\t left = container_position.left + container_width;\n\t break;\n\t }\n\t }\n\t return { top: top, left: left };\n\t },\n\t\n\t /**\n\t * Returns padding/margin corrected width\n\t */\n\t _get_width: function( $el ) {\n\t return $el.width() + parseInt( $el.css( 'padding-left' ) ) + parseInt( $el.css( 'margin-left' ) ) +\n\t parseInt( $el.css( 'padding-right' ) ) + parseInt( $el.css( 'margin-right' ) );\n\t },\n\t\n\t /**\n\t * Returns padding corrected height\n\t */\n\t _get_height: function( $el ) {\n\t return $el.height() + parseInt( $el.css( 'padding-top' ) ) + parseInt( $el.css( 'padding-bottom' ) );\n\t },\n\t\n\t /**\n\t * Return the popover template\n\t */\n\t _template: function( options ) {\n\t return '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\t\n\t/**\n\t * A plugin for initializing select2 input items.\n\t * Make sure the select2 library itself is loaded beforehand.\n\t * Also the element to which select2 will be appended has to \n\t * be created before select2 initialization (and passed as option).\n\t */\n\tvar View = Backbone.View.extend(\n\t{\n\t // options\n\t optionsDefault: {\n\t css : '',\n\t placeholder : 'No data available',\n\t data : [],\n\t value : null,\n\t multiple : false,\n\t minimumInputLength : 0,\n\t // example format of initial data: \"id:name,55:anotherrole@role.com,27:role@role.com\"\n\t initialData : ''\n\t },\n\t \n\t // initialize\n\t initialize : function(options) {\n\t // configure options\n\t this.options = Utils.merge(options, this.optionsDefault);\n\t \n\t // create new element\n\t this.setElement(this._template(this.options));\n\t \n\t // check if container exists\n\t if (!this.options.container) {\n\t console.log('ui-select::initialize() : container not specified.');\n\t return;\n\t }\n\t \n\t // add to dom\n\t this.options.container.append(this.$el);\n\t \n\t // link selection dictionary\n\t this.select_data = this.options.data;\n\t \n\t // refresh\n\t this._refresh();\n\t \n\t if (!this.options.multiple){\n\t // initial value\n\t if (this.options.value) {\n\t this._setValue(this.options.value);\n\t }\n\t \n\t // add change event\n\t var self = this;\n\t if (this.options.onchange) {\n\t this.$el.on('change', function() {\n\t self.options.onchange(self.value());\n\t });\n\t }\n\t }\n\t },\n\t \n\t // value\n\t value : function (new_value) {\n\t // get current id/value\n\t var before = this._getValue();\n\t \n\t // check if new_value is defined\n\t if (new_value !== undefined) {\n\t this._setValue(new_value);\n\t }\n\t \n\t // get current id/value\n\t var after = this._getValue();\n\t \n\t // fire onchange\n\t if ((after != before && this.options.onchange)) {\n\t this.options.onchange(after);\n\t }\n\t \n\t // return current value\n\t return after;\n\t },\n\t \n\t // label\n\t text : function () {\n\t return this.$el.select2('data').text;\n\t },\n\t \n\t // disabled\n\t disabled: function() {\n\t return !this.$el.select2('enable');\n\t },\n\t\n\t // enable\n\t enable: function() {\n\t this.$el.select2('enable', true);\n\t },\n\t \n\t // disable\n\t disable: function() {\n\t this.$el.select2('enable', false);\n\t },\n\t \n\t // add\n\t add: function(options) {\n\t // add options\n\t this.select_data.push({\n\t id : options.id,\n\t text : options.text\n\t });\n\t \n\t // refresh\n\t this._refresh();\n\t },\n\t \n\t // remove\n\t del: function(id) {\n\t // search option\n\t var index = this._getIndex(id);\n\t \n\t // check if found\n\t if (index != -1) {\n\t // remove options\n\t this.select_data.splice(index, 1);\n\t \n\t // refresh\n\t this._refresh();\n\t }\n\t },\n\t \n\t // remove\n\t remove: function() {\n\t this.$el.select2('destroy');\n\t },\n\t \n\t // update\n\t update: function(options) {\n\t // copy options\n\t this.select_data = [];\n\t for (var key in options.data) {\n\t this.select_data.push(options.data[key]);\n\t }\n\t \n\t // refresh\n\t this._refresh();\n\t },\n\t \n\t // refresh\n\t _refresh: function() {\n\t // add select2 data based on type of input\n\t if (!this.options.multiple){\n\t var selected = this._getValue();\n\t var select_opt = {\n\t data : this.select_data,\n\t containerCssClass : this.options.css,\n\t placeholder : this.options.placeholder,\n\t dropdownAutoWidth : true\n\t };\n\t this.$el.select2(select_opt);\n\t // select previous value (if exists)\n\t this._setValue(selected);\n\t } else {\n\t var select_opt = {\n\t multiple : this.options.multiple,\n\t containerCssClass : this.options.css,\n\t placeholder : this.options.placeholder,\n\t minimumInputLength : this.options.minimumInputLength,\n\t ajax : this.options.ajax,\n\t dropdownCssClass : this.options.dropdownCssClass,\n\t escapeMarkup : this.options.escapeMarkup,\n\t formatResult : this.options.formatResult,\n\t formatSelection : this.options.formatSelection,\n\t initSelection : this.options.initSelection,\n\t initialData : this.options.initialData\n\t };\n\t this.$el.select2(select_opt);\n\t }\n\t },\n\t \n\t // get index\n\t _getIndex: function(value) {\n\t // search index\n\t for (var key in this.select_data) {\n\t if (this.select_data[key].id == value) {\n\t return key;\n\t }\n\t }\n\t \n\t // not found\n\t return -1;\n\t },\n\t \n\t // get value\n\t _getValue: function() {\n\t return this.$el.select2('val');\n\t },\n\t \n\t // set value\n\t _setValue: function(new_value) {\n\t var index = this._getIndex(new_value);\n\t if (index == -1) {\n\t if (this.select_data.length > 0) {\n\t new_value = this.select_data[0].id;\n\t }\n\t }\n\t this.$el.select2('val', new_value);\n\t },\n\t \n\t // element\n\t _template: function(options) {\n\t return '';\n\t }\n\t});\n\t\n\treturn {\n\t View : View\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\t\n\t// return\n\tvar View = Backbone.View.extend({\n\t // defaults options\n\t optionsDefault: {\n\t title_new : '',\n\t operations : null,\n\t onnew : null,\n\t max : null,\n\t onchange : null\n\t },\n\t \n\t // initialize\n\t initialize : function(options) {\n\t // configure\n\t this.visible = false;\n\t this.$nav = null;\n\t this.$content = null;\n\t this.first_tab = null;\n\t this.current_id = null;\n\t \n\t // configure options\n\t this.options = Utils.merge(options, this.optionsDefault);\n\t \n\t // create tabs\n\t var $tabs = $(this._template(this.options));\n\t \n\t // link elements\n\t this.$nav = $tabs.find('.tab-navigation');\n\t this.$content = $tabs.find('.tab-content');\n\t \n\t // create new element\n\t this.setElement($tabs);\n\t \n\t // clear list\n\t this.list = {};\n\t \n\t // link this\n\t var self = this;\n\t \n\t // append operations\n\t if (this.options.operations) {\n\t $.each(this.options.operations, function(name, item) {\n\t item.$el.prop('id', name);\n\t self.$nav.find('.operations').append(item.$el);\n\t });\n\t }\n\t \n\t // add built-in add-new-tab tab\n\t if (this.options.onnew) {\n\t // create tab object\n\t var $tab_new = $(this._template_tab_new(this.options));\n\t \n\t // append to navbar\n\t this.$nav.append($tab_new);\n\t \n\t // add tooltip\n\t $tab_new.tooltip({title: 'Add a new tab', placement: 'bottom', container: self.$el});\n\t \n\t // link click event\n\t $tab_new.on('click', function(e) {\n\t $tab_new.tooltip('hide');\n\t self.options.onnew();\n\t });\n\t }\n\t },\n\t \n\t // size\n\t size: function() {\n\t return _.size(this.list);\n\t },\n\t \n\t // front\n\t current: function() {\n\t return this.$el.find('.tab-pane.active').attr('id');\n\t },\n\t \n\t // append\n\t add: function(options) {\n\t // self\n\t var self = this;\n\t \n\t // get tab id\n\t var id = options.id;\n\t\n\t // create tab object\n\t var $tab_title = $(this._template_tab(options));\n\t var $tab_content = $(this._template_tab_content(options));\n\t \n\t // add to list\n\t this.list[id] = options.ondel ? true : false;\n\t \n\t // add a new tab either before the add-new-tab tab or behind the last tab\n\t if (this.options.onnew) {\n\t this.$nav.find('#new-tab').before($tab_title);\n\t } else {\n\t this.$nav.append($tab_title);\n\t }\n\t \n\t // add content\n\t $tab_content.append(options.$el);\n\t this.$content.append($tab_content);\n\t \n\t // activate this tab if this is the first tab\n\t if (this.size() == 1) {\n\t $tab_title.addClass('active');\n\t $tab_content.addClass('active');\n\t this.first_tab = id;\n\t }\n\t \n\t // hide add tab\n\t if (this.options.max && this.size() >= this.options.max) {\n\t this.$el.find('#new-tab').hide();\n\t }\n\t \n\t // add click event to remove tab\n\t if (options.ondel) {\n\t var $del_icon = $tab_title.find('#delete');\n\t $del_icon.tooltip({title: 'Delete this tab', placement: 'bottom', container: self.$el});\n\t $del_icon.on('click', function() {\n\t $del_icon.tooltip('destroy');\n\t self.$el.find('.tooltip').remove();\n\t options.ondel();\n\t return false;\n\t });\n\t }\n\t \n\t // add custom click event handler\n\t $tab_title.on('click', function(e) {\n\t // prevent default\n\t e.preventDefault();\n\t \n\t // click\n\t if (options.onclick) {\n\t options.onclick();\n\t } else {\n\t self.show(id);\n\t }\n\t });\n\t \n\t // initialize current id\n\t if (!this.current_id) {\n\t this.current_id = id;\n\t }\n\t },\n\t \n\t // delete tab\n\t del: function(id) {\n\t // delete tab from dom\n\t this.$el.find('#tab-' + id).remove();\n\t this.$el.find('#' + id).remove();\n\t \n\t // check if first tab has been deleted\n\t if (this.first_tab == id) {\n\t this.first_tab = null;\n\t }\n\t \n\t // show first tab\n\t if (this.first_tab != null) {\n\t this.show(this.first_tab);\n\t }\n\t \n\t // delete from list\n\t if (this.list[id]) {\n\t delete this.list[id];\n\t }\n\t \n\t // show add tab\n\t if (this.size() < this.options.max) {\n\t this.$el.find('#new-tab').show();\n\t }\n\t },\n\t \n\t // delete tab\n\t delRemovable: function() {\n\t for (var id in this.list) {\n\t this.del(id);\n\t }\n\t },\n\t \n\t // show\n\t show: function(id){\n\t // show tab view\n\t this.$el.fadeIn('fast');\n\t this.visible = true;\n\t \n\t // show selected tab\n\t if (id) {\n\t // reassign active class\n\t this.$el.find('#tab-' + this.current_id).removeClass('active');\n\t this.$el.find('#' + this.current_id).removeClass('active');\n\t this.$el.find('#tab-' + id).addClass('active');\n\t this.$el.find('#' + id).addClass('active');\n\t \n\t // update current id\n\t this.current_id = id;\n\t }\n\t \n\t // change\n\t if (this.options.onchange) {\n\t this.options.onchange(id);\n\t }\n\t },\n\t \n\t // hide\n\t hide: function(){\n\t this.$el.fadeOut('fast');\n\t this.visible = false;\n\t },\n\t\n\t // hide operation\n\t hideOperation: function(id) {\n\t this.$nav.find('#' + id).hide();\n\t },\n\t\n\t // show operation\n\t showOperation: function(id) {\n\t this.$nav.find('#' + id).show();\n\t },\n\t \n\t // set operation\n\t setOperation: function(id, callback) {\n\t var $el = this.$nav.find('#' + id);\n\t $el.off('click');\n\t $el.on('click', callback);\n\t },\n\t \n\t // title\n\t title: function(id, new_title) {\n\t var $el = this.$el.find('#tab-title-text-' + id);\n\t if (new_title) {\n\t $el.html(new_title);\n\t }\n\t return $el.html();\n\t },\n\t \n\t // retitle\n\t retitle: function(new_title) {\n\t var index = 0;\n\t for (var id in this.list) {\n\t this.title(id, ++index + ': ' + new_title);\n\t }\n\t },\n\t \n\t // fill template\n\t _template: function(options) {\n\t return '
    ' +\n\t '
      ' +\n\t '
      ' +\n\t '
    '+\n\t '
    ' +\n\t '
    ';\n\t },\n\t \n\t // fill template tab\n\t _template_tab_new: function(options) {\n\t return '
  • ' +\n\t '' +\n\t '' +\n\t options.title_new +\n\t '' +\n\t '
  • ';\n\t },\n\t \n\t // fill template tab\n\t _template_tab: function(options) {\n\t var tmpl = '
  • ' +\n\t '' +\n\t '' + options.title + '';\n\t \n\t if (options.ondel) {\n\t tmpl += '';\n\t }\n\t \n\t tmpl += '' +\n\t '
  • ';\n\t \n\t return tmpl;\n\t },\n\t \n\t // fill template tab content\n\t _template_tab_content: function(options) {\n\t return '
    ';\n\t }\n\t});\n\t\n\treturn {\n\t View : View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 32 */\n/***/ function(module, exports) {\n\n\t/**\n\t * Parser.js\n\t * Copyright 2012-13 Mayank Lahiri\n\t * mlahiri@gmail.com\n\t * Released under the BSD License.\n\t *\n\t * A forgiving Bibtex parser that can:\n\t * \n\t * (1) operate in streaming or block mode, extracting entries as dictionaries. \n\t * (2) convert Latex special characters to UTF-8.\n\t * (3) best-effort parse malformed entries.\n\t * (4) run in a CommonJS environment or a browser, without any dependencies.\n\t * (5) be advanced-compiled by Google Closure Compiler.\n\t * \n\t * Handwritten as a labor of love, not auto-generated from a grammar. \n\t *\n\t * Modes of usage:\n\t *\n\t * (1) Synchronous, string\n\t *\n\t * var entries = BibtexParser(text);\n\t * console.log(entries);\n\t *\n\t * (2) Asynchronous, stream\n\t *\n\t * var entryCallback = function(entry) { console.log(entry); }\n\t * var parser = new BibtexParser(entryCallback);\n\t * parser.parse(chunk1);\n\t * parser.parse(chunk2);\n\t * ...\n\t * \n\t * @param {text|function(Object)} arg Either a Bibtex string or callback \n\t * function for processing parsed entries.\n\t * @constructor\n\t */\n\tfunction BibtexParser(arg0) {\n\t // Determine how this function is to be used\n\t if (typeof arg0 == 'string') {\n\t // Passed a string, synchronous call without 'new'\n\t var tempStorage = {};\n\t var entries = [];\n\t function accumulator(entry) {\n\t entries.push(entry);\n\t }\n\t var parser = BibtexParser.call(tempStorage, accumulator);\n\t parser.parse(arg0);\n\t return {\n\t 'entries': entries,\n\t 'errors': parser.getErrors()\n\t }\n\t }\n\t if (typeof arg0 != 'function') {\n\t throw 'Invalid parser construction.';\n\t }\n\t\n\t /** @enum {number} */\n\t this.STATES_ = {\n\t ENTRY_OR_JUNK: 0,\n\t OBJECT_TYPE: 1,\n\t ENTRY_KEY: 2, \n\t KV_KEY: 3, \n\t EQUALS: 4,\n\t KV_VALUE: 5 \n\t }\n\t /** @private */ this.DATA_ = {};\n\t /** @private */ this.CALLBACK_ = arg0;\n\t /** @private */ this.CHAR_ = 0;\n\t /** @private */ this.LINE_ = 1;\n\t /** @private */ this.CHAR_IN_LINE_ = 0;\n\t /** @private */ this.SKIPWS_ = true;\n\t /** @private */ this.SKIPCOMMENT_ = true;\n\t /** @private */ this.PARSETMP_ = {};\n\t /** @private */ this.SKIPTILLEOL_ = false;\n\t /** @private */ this.VALBRACES_ = null;\n\t /** @private */ this.BRACETYPE_ = null;\n\t /** @private */ this.BRACECOUNT_ = 0;\n\t /** @private */ this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t /** @private */ this.ERRORS_ = [];\n\t /** @private */ this.ENTRY_TYPES_ = {\n\t 'inproceedings' : 1,\n\t 'proceedings' : 2,\n\t 'article' : 3,\n\t 'techreport' : 4,\n\t 'misc' : 5,\n\t 'mastersthesis' : 6,\n\t 'book' : 7,\n\t 'phdthesis' : 8,\n\t 'incollection' : 9,\n\t 'unpublished' : 10,\n\t 'inbook' : 11,\n\t 'manual' : 12,\n\t 'periodical' : 13,\n\t 'booklet' : 14,\n\t 'masterthesis' : 15,\n\t 'conference' : 16\n\t ,'online' : 998 // Galaxy MOD: Handle @online entries for preprints.\n\t ,'data' : 999 // Galaxy MOD: Handle @data citations coming from figshare.\n\t }\n\t /** @private */ this.MACROS_ = {\n\t 'jan' : 'January',\n\t 'feb' : 'February',\n\t 'mar' : 'March',\n\t 'apr' : 'April',\n\t 'may' : 'May',\n\t 'jun' : 'June',\n\t 'jul' : 'July',\n\t 'aug' : 'August',\n\t 'sep' : 'September',\n\t 'oct' : 'October',\n\t 'nov' : 'November',\n\t 'dec' : 'December',\n\t 'Jan' : 'January',\n\t 'Feb' : 'February',\n\t 'Mar' : 'March',\n\t 'Apr' : 'April',\n\t 'May' : 'May',\n\t 'Jun' : 'June',\n\t 'Jul' : 'July',\n\t 'Aug' : 'August',\n\t 'Sep' : 'September',\n\t 'Oct' : 'October',\n\t 'Nov' : 'November',\n\t 'Dec' : 'December'\n\t }\n\t\n\t /**\n\t * Gets an array of all errors encountered during parsing.\n\t * Array entries are of the format:\n\t * [ line number, character in line, character in stream, error text ]\n\t *\n\t * @returns Array\n\t * @public\n\t */\n\t this.getErrors = function() {\n\t return this.ERRORS_;\n\t }\n\t\n\t /**\n\t * Processes a chunk of data\n\t * @public\n\t */\n\t this.parse = function(chunk) {\n\t for (var i = 0; i < chunk.length; i++)\n\t this.processCharacter_(chunk[i]);\n\t }\n\t\n\t /**\n\t * Logs error at current stream position.\n\t *\n\t * @private\n\t */\n\t this.error_ = function(text) {\n\t this.ERRORS_.push([ this.LINE_, \n\t this.CHAR_IN_LINE_,\n\t this.CHAR_,\n\t text ])\n\t }\n\t\n\t /**\n\t * Called after an entire entry has been parsed from the stream.\n\t * Performs post-processing and invokes the entry callback pointed to by\n\t * this.CALLBACK_. Parsed (but unprocessed) entry data is in this.DATA_.\n\t */\n\t this.processEntry_ = function() {\n\t var data = this.DATA_;\n\t if (data.Fields) \n\t for (var f in data.Fields) {\n\t var raw = data.Fields[f];\n\t\n\t // Convert Latex/Bibtex special characters to UTF-8 equivalents\n\t for (var i = 0; i < this.CHARCONV_.length; i++) {\n\t var re = this.CHARCONV_[i][0];\n\t var rep = this.CHARCONV_[i][1];\n\t raw = raw.replace(re, rep);\n\t }\n\t\n\t // Basic substitutions\n\t raw = raw.replace(/[\\n\\r\\t]/g, ' ')\n\t .replace(/\\s\\s+/g, ' ')\n\t .replace(/^\\s+|\\s+$/g, '')\n\t\n\t // Remove braces and backslashes\n\t var len = raw.length;\n\t var processed = '';\n\t for (var i = 0; i < len; i++) {\n\t var c = raw[i];\n\t var skip = false;\n\t if (c == '\\\\' && i < len-1) \n\t c = raw[++i];\n\t else {\n\t if (c == '{' || c == '}')\n\t skip = true;\n\t }\n\t if (!skip)\n\t processed += c;\n\t }\n\t data.Fields[f] = processed\n\t }\n\t\n\t if (data.ObjectType == 'string') {\n\t for (var f in data.Fields) { \n\t this.MACROS_[f] = data.Fields[f];\n\t }\n\t } else {\n\t // Parsed a new Bibtex entry\n\t this.CALLBACK_(data);\n\t }\n\t }\n\t\n\t\n\t /**\n\t * Processes next character in the stream, invoking the callback after \n\t * each entry has been found and processed.\n\t * \n\t * @private\n\t * @param {string} c Next character in input stream\n\t */\n\t this.processCharacter_ = function(c) {\n\t // Housekeeping\n\t this.CHAR_++;\n\t this.CHAR_IN_LINE_++;\n\t if (c == '\\n') {\n\t this.LINE_++;\n\t this.CHAR_IN_LINE_ = 1;\n\t }\n\t\n\t // Convenience states for skipping whitespace when needed\n\t if (this.SKIPTILLEOL_) {\n\t if (c == '\\n')\n\t this.SKIPTILLEOL_ = false;\n\t return;\n\t }\n\t if (this.SKIPCOMMENT_ && c == '%') {\n\t this.SKIPTILLEOL_ = true;\n\t return;\n\t }\n\t if (this.SKIPWS_ && /\\s/.test(c))\n\t return;\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t this.SKIPTILLEOL_ = false;\n\t\n\t // Main state machine\n\t var AnotherIteration = true;\n\t while (AnotherIteration) {\n\t //console.log(this.LINE_, this.CHAR_IN_LINE_, this.STATE_, c)\n\t AnotherIteration = false;\n\t switch(this.STATE_) {\n\t // -- Scan for an object marker ('@')\n\t // -- Reset temporary data structure in case previous entry was garbled\n\t case this.STATES_.ENTRY_OR_JUNK:\n\t if (c == '@') {\n\t // SUCCESS: Parsed a valid start-of-object marker.\n\t // NEXT_STATE: OBJECT_TYPE\n\t this.STATE_ = this.STATES_.OBJECT_TYPE;\n\t this.DATA_ = {\n\t ObjectType : ''\n\t };\n\t }\n\t this.BRACETYPE_ = null;\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t break;\n\t\n\t // Start at first non-whitespace character after start-of-object '@'\n\t // -- Accept [A-Za-z], break on non-matching character\n\t // -- Populate this.DATA_.EntryType and this.DATA_.ObjectType\n\t case this.STATES_.OBJECT_TYPE:\n\t if (/[A-Za-z]/.test(c)) {\n\t this.DATA_.ObjectType += c.toLowerCase();\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t } else {\n\t // Break from state and validate object type\n\t var ot = this.DATA_.ObjectType;\n\t if (ot == 'comment') {\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t } else {\n\t if (ot == 'string') {\n\t this.DATA_.ObjectType = ot;\n\t this.DATA_.Fields = {};\n\t this.BRACETYPE_ = c;\n\t this.BRACECOUNT_ = 1;\n\t this.STATE_ = this.STATES_.KV_KEY;\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.PARSETMP_ = {\n\t Key: ''\n\t }\n\t } else {\n\t if (ot == 'preamble') {\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t } else {\n\t if (ot in this.ENTRY_TYPES_) {\n\t // SUCCESS: Parsed a valid object type.\n\t // NEXT_STATE: ENTRY_KEY\n\t this.DATA_.ObjectType = 'entry';\n\t this.DATA_.EntryType = ot;\n\t this.DATA_.EntryKey = '';\n\t this.STATE_ = this.STATES_.ENTRY_KEY;\n\t AnotherIteration = true;\n\t } else {\n\t // ERROR: Unrecognized object type.\n\t // NEXT_STATE: ENTRY_OR_JUNK\n\t this.error_('Unrecognized object type: \"' +\n\t this.DATA_.ObjectType + '\"')\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t break;\n\t\n\t // Start at first non-alphabetic character after an entry type\n\t // -- Populate this.DATA_.EntryKey\n\t case this.STATES_.ENTRY_KEY:\n\t if ((c === '{' || c === '(') && this.BRACETYPE_ == null) {\n\t this.BRACETYPE_ = c;\n\t this.BRACECOUNT_ = 1;\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t break;\n\t }\n\t if (/[,%\\s]/.test(c)) {\n\t if (this.DATA_.EntryKey.length < 1) { \n\t // Skip comments and whitespace before entry key\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t } else {\n\t if (this.BRACETYPE_ == null) {\n\t // ERROR: No opening brace for object\n\t // NEXT_STATE: ENTRY_OR_JUNK\n\t this.error_('No opening brace for object.');\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t } else {\n\t // SUCCESS: Parsed an entry key\n\t // NEXT_STATE: KV_KEY\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t AnotherIteration = true;\n\t this.STATE_ = this.STATES_.KV_KEY;\n\t this.PARSETMP_.Key= '';\n\t this.DATA_.Fields = {};\n\t }\n\t }\n\t } else {\n\t this.DATA_.EntryKey += c;\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t }\n\t break;\n\t\n\t // Start at first non-whitespace/comment character after entry key.\n\t // -- Populate this.PARSETMP_.Key\n\t case this.STATES_.KV_KEY:\n\t // Test for end of entry\n\t if ((c == '}' && this.BRACETYPE_ == '{') ||\n\t (c == ')' && this.BRACETYPE_ == '(')) {\n\t // SUCCESS: Parsed an entry, possible incomplete\n\t // NEXT_STATE: ENTRY_OR_JUNK\n\t this.processEntry_();\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t break;\n\t }\n\t if (/[\\-A-Za-z:]/.test(c)) {\n\t // Add to key\n\t this.PARSETMP_.Key += c;\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t } else {\n\t // Either end of key or we haven't encountered start of key\n\t if (this.PARSETMP_.Key.length < 1) {\n\t // Keep going till we see a key\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t } else {\n\t // SUCCESS: Found full key in K/V pair\n\t // NEXT_STATE: EQUALS\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.EQUALS;\n\t AnotherIteration = true;\n\t }\n\t }\n\t break;\n\t\n\t // Start at first non-alphabetic character after K/V pair key.\n\t case this.STATES_.EQUALS:\n\t if ((c == '}' && this.BRACETYPE_ == '{') ||\n\t (c == ')' && this.BRACETYPE_ == '(')) {\n\t // ERROR: K/V pair with key but no value\n\t // NEXT_STATE: ENTRY_OR_JUNK\n\t this.error_('Key-value pair has key \"' +\n\t this.PARSETMP_.Key + '\", but no value.');\n\t this.processEntry_();\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t break;\n\t }\n\t if (c == '=') {\n\t // SUCCESS: found an equal signs separating key and value\n\t // NEXT_STATE: KV_VALUE\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.KV_VALUE;\n\t this.PARSETMP_.Value = '';\n\t this.VALBRACES_ = { '\"' : [], '{' : [] };\n\t }\n\t break;\n\t\n\t // Start at first non-whitespace/comment character after '=' \n\t // -- Populate this.PARSETMP_.Value\n\t case this.STATES_.KV_VALUE:\n\t var delim = this.VALBRACES_;\n\t var val = this.PARSETMP_.Value;\n\t var doneParsingValue = false;\n\t\n\t // Test for special characters\n\t if (c == '\"' || c == '{' || c == '}' || c == ',') {\n\t if (c == ',') {\n\t // This comma can mean:\n\t // (1) just another comma literal\n\t // (2) end of a macro reference\n\t if (0 === delim['\"'].length + delim['{'].length) {\n\t // end of a macro reference\n\t var macro = this.PARSETMP_.Value.trim();\n\t if (macro in this.MACROS_) {\n\t // Successful macro reference\n\t this.PARSETMP_.Value = this.MACROS_[macro];\n\t } else {\n\t // Reference to an undefined macro\n\t this.error_('Reference to an undefined macro: '+macro);\n\t }\n\t doneParsingValue = true;\n\t }\n\t }\n\t if (c == '\"') {\n\t // This quote can mean:\n\t // (1) opening delimiter\n\t // (2) closing delimiter\n\t // (3) literal, if we have a '{' on the stack\n\t if (0 === delim['\"'].length + delim['{'].length) {\n\t // opening delimiter\n\t delim['\"'].push(this.CHAR_)\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t break;\n\t }\n\t if (delim['\"'].length == 1 && delim['{'].length == 0 &&\n\t (val.length==0 || val[val.length-1] != '\\\\')) {\n\t // closing delimiter\n\t doneParsingValue = true;\n\t } else {\n\t // literal, add to value\n\t }\n\t }\n\t if (c == '{') {\n\t // This brace can mean:\n\t // (1) opening delimiter\n\t // (2) stacked verbatim delimiter\n\t if (val.length == 0 || val[val.length-1] != '\\\\') {\n\t delim['{'].push(this.CHAR_)\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t } else {\n\t // literal, add to value\n\t }\n\t }\n\t if (c == '}') {\n\t // This brace can mean:\n\t // (1) closing delimiter\n\t // (2) closing stacked verbatim delimiter\n\t // (3) end of object definition if value was a macro\n\t if (0 === delim['\"'].length + delim['{'].length) {\n\t // end of object definition, after macro\n\t var macro = this.PARSETMP_.Value.trim();\n\t if (macro in this.MACROS_) {\n\t // Successful macro reference\n\t this.PARSETMP_.Value = this.MACROS_[macro];\n\t } else {\n\t // Reference to an undefined macro\n\t this.error_('Reference to an undefined macro: '+macro);\n\t }\n\t AnotherIteration = true;\n\t doneParsingValue = true;\n\t } else {\n\t if (val.length == 0 || val[val.length-1] != '\\\\') {\n\t if (delim['{'].length > 0) {\n\t // pop stack for stacked verbatim delimiter\n\t delim['{'].splice(delim['{'].length-1, 1)\n\t if (0 == delim['{'].length + delim['\"'].length) {\n\t // closing delimiter\n\t doneParsingValue = true;\n\t } else {\n\t // end verbatim block\n\t }\n\t }\n\t } else {\n\t // literal, add to value\n\t }\n\t }\n\t }\n\t }\n\t\n\t // If here, then we are either done parsing the value or \n\t // have a literal that should be added to the value.\n\t if (doneParsingValue) {\n\t // SUCCESS: value parsed\n\t // NEXT_STATE: KV_KEY\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.KV_KEY;\n\t this.DATA_.Fields[this.PARSETMP_.Key] = this.PARSETMP_.Value;\n\t this.PARSETMP_ = { Key: '' };\n\t this.VALBRACES_ = null;\n\t } else {\n\t this.PARSETMP_.Value += c;\n\t }\n\t break;\n\t } // end switch (this.STATE_)\n\t } // end while(AnotherIteration)\n\t } // end function processCharacter \n\t\n\t /** @private */ this.CHARCONV_ = [\n\t [ /\\\\space /g, '\\u0020' ],\n\t [ /\\\\textdollar /g, '\\u0024' ],\n\t [ /\\\\textquotesingle /g, '\\u0027' ],\n\t [ /\\\\ast /g, '\\u002A' ],\n\t [ /\\\\textbackslash /g, '\\u005C' ],\n\t [ /\\\\\\^\\{\\}/g, '\\u005E' ],\n\t [ /\\\\textasciigrave /g, '\\u0060' ],\n\t [ /\\\\lbrace /g, '\\u007B' ],\n\t [ /\\\\vert /g, '\\u007C' ],\n\t [ /\\\\rbrace /g, '\\u007D' ],\n\t [ /\\\\textasciitilde /g, '\\u007E' ],\n\t [ /\\\\textexclamdown /g, '\\u00A1' ],\n\t [ /\\\\textcent /g, '\\u00A2' ],\n\t [ /\\\\textsterling /g, '\\u00A3' ],\n\t [ /\\\\textcurrency /g, '\\u00A4' ],\n\t [ /\\\\textyen /g, '\\u00A5' ],\n\t [ /\\\\textbrokenbar /g, '\\u00A6' ],\n\t [ /\\\\textsection /g, '\\u00A7' ],\n\t [ /\\\\textasciidieresis /g, '\\u00A8' ],\n\t [ /\\\\textcopyright /g, '\\u00A9' ],\n\t [ /\\\\textordfeminine /g, '\\u00AA' ],\n\t [ /\\\\guillemotleft /g, '\\u00AB' ],\n\t [ /\\\\lnot /g, '\\u00AC' ],\n\t [ /\\\\textregistered /g, '\\u00AE' ],\n\t [ /\\\\textasciimacron /g, '\\u00AF' ],\n\t [ /\\\\textdegree /g, '\\u00B0' ],\n\t [ /\\\\pm /g, '\\u00B1' ],\n\t [ /\\\\textasciiacute /g, '\\u00B4' ],\n\t [ /\\\\mathrm\\{\\\\mu\\}/g, '\\u00B5' ],\n\t [ /\\\\textparagraph /g, '\\u00B6' ],\n\t [ /\\\\cdot /g, '\\u00B7' ],\n\t [ /\\\\c\\{\\}/g, '\\u00B8' ],\n\t [ /\\\\textordmasculine /g, '\\u00BA' ],\n\t [ /\\\\guillemotright /g, '\\u00BB' ],\n\t [ /\\\\textonequarter /g, '\\u00BC' ],\n\t [ /\\\\textonehalf /g, '\\u00BD' ],\n\t [ /\\\\textthreequarters /g, '\\u00BE' ],\n\t [ /\\\\textquestiondown /g, '\\u00BF' ],\n\t [ /\\\\`\\{A\\}/g, '\\u00C0' ],\n\t [ /\\\\'\\{A\\}/g, '\\u00C1' ],\n\t [ /\\\\\\^\\{A\\}/g, '\\u00C2' ],\n\t [ /\\\\~\\{A\\}/g, '\\u00C3' ],\n\t [ /\\\\\"\\{A\\}/g, '\\u00C4' ],\n\t [ /\\\\AA /g, '\\u00C5' ],\n\t [ /\\\\AE /g, '\\u00C6' ],\n\t [ /\\\\c\\{C\\}/g, '\\u00C7' ],\n\t [ /\\\\`\\{E\\}/g, '\\u00C8' ],\n\t [ /\\\\'\\{E\\}/g, '\\u00C9' ],\n\t [ /\\\\\\^\\{E\\}/g, '\\u00CA' ],\n\t [ /\\\\\"\\{E\\}/g, '\\u00CB' ],\n\t [ /\\\\`\\{I\\}/g, '\\u00CC' ],\n\t [ /\\\\'\\{I\\}/g, '\\u00CD' ],\n\t [ /\\\\\\^\\{I\\}/g, '\\u00CE' ],\n\t [ /\\\\\"\\{I\\}/g, '\\u00CF' ],\n\t [ /\\\\DH /g, '\\u00D0' ],\n\t [ /\\\\~\\{N\\}/g, '\\u00D1' ],\n\t [ /\\\\`\\{O\\}/g, '\\u00D2' ],\n\t [ /\\\\'\\{O\\}/g, '\\u00D3' ],\n\t [ /\\\\\\^\\{O\\}/g, '\\u00D4' ],\n\t [ /\\\\~\\{O\\}/g, '\\u00D5' ],\n\t [ /\\\\\"\\{O\\}/g, '\\u00D6' ],\n\t [ /\\\\texttimes /g, '\\u00D7' ],\n\t [ /\\\\O /g, '\\u00D8' ],\n\t [ /\\\\`\\{U\\}/g, '\\u00D9' ],\n\t [ /\\\\'\\{U\\}/g, '\\u00DA' ],\n\t [ /\\\\\\^\\{U\\}/g, '\\u00DB' ],\n\t [ /\\\\\"\\{U\\}/g, '\\u00DC' ],\n\t [ /\\\\'\\{Y\\}/g, '\\u00DD' ],\n\t [ /\\\\TH /g, '\\u00DE' ],\n\t [ /\\\\ss /g, '\\u00DF' ],\n\t [ /\\\\`\\{a\\}/g, '\\u00E0' ],\n\t [ /\\\\'\\{a\\}/g, '\\u00E1' ],\n\t [ /\\\\\\^\\{a\\}/g, '\\u00E2' ],\n\t [ /\\\\~\\{a\\}/g, '\\u00E3' ],\n\t [ /\\\\\"\\{a\\}/g, '\\u00E4' ],\n\t [ /\\\\aa /g, '\\u00E5' ],\n\t [ /\\\\ae /g, '\\u00E6' ],\n\t [ /\\\\c\\{c\\}/g, '\\u00E7' ],\n\t [ /\\\\`\\{e\\}/g, '\\u00E8' ],\n\t [ /\\\\'\\{e\\}/g, '\\u00E9' ],\n\t [ /\\\\\\^\\{e\\}/g, '\\u00EA' ],\n\t [ /\\\\\"\\{e\\}/g, '\\u00EB' ],\n\t [ /\\\\`\\{\\\\i\\}/g, '\\u00EC' ],\n\t [ /\\\\'\\{\\\\i\\}/g, '\\u00ED' ],\n\t [ /\\\\\\^\\{\\\\i\\}/g, '\\u00EE' ],\n\t [ /\\\\\"\\{\\\\i\\}/g, '\\u00EF' ],\n\t [ /\\\\dh /g, '\\u00F0' ],\n\t [ /\\\\~\\{n\\}/g, '\\u00F1' ],\n\t [ /\\\\`\\{o\\}/g, '\\u00F2' ],\n\t [ /\\\\'\\{o\\}/g, '\\u00F3' ],\n\t [ /\\\\\\^\\{o\\}/g, '\\u00F4' ],\n\t [ /\\\\~\\{o\\}/g, '\\u00F5' ],\n\t [ /\\\\\"\\{o\\}/g, '\\u00F6' ],\n\t [ /\\\\div /g, '\\u00F7' ],\n\t [ /\\\\o /g, '\\u00F8' ],\n\t [ /\\\\`\\{u\\}/g, '\\u00F9' ],\n\t [ /\\\\'\\{u\\}/g, '\\u00FA' ],\n\t [ /\\\\\\^\\{u\\}/g, '\\u00FB' ],\n\t [ /\\\\\"\\{u\\}/g, '\\u00FC' ],\n\t [ /\\\\'\\{y\\}/g, '\\u00FD' ],\n\t [ /\\\\th /g, '\\u00FE' ],\n\t [ /\\\\\"\\{y\\}/g, '\\u00FF' ],\n\t [ /\\\\=\\{A\\}/g, '\\u0100' ],\n\t [ /\\\\=\\{a\\}/g, '\\u0101' ],\n\t [ /\\\\u\\{A\\}/g, '\\u0102' ],\n\t [ /\\\\u\\{a\\}/g, '\\u0103' ],\n\t [ /\\\\k\\{A\\}/g, '\\u0104' ],\n\t [ /\\\\k\\{a\\}/g, '\\u0105' ],\n\t [ /\\\\'\\{C\\}/g, '\\u0106' ],\n\t [ /\\\\'\\{c\\}/g, '\\u0107' ],\n\t [ /\\\\\\^\\{C\\}/g, '\\u0108' ],\n\t [ /\\\\\\^\\{c\\}/g, '\\u0109' ],\n\t [ /\\\\.\\{C\\}/g, '\\u010A' ],\n\t [ /\\\\.\\{c\\}/g, '\\u010B' ],\n\t [ /\\\\v\\{C\\}/g, '\\u010C' ],\n\t [ /\\\\v\\{c\\}/g, '\\u010D' ],\n\t [ /\\\\v\\{D\\}/g, '\\u010E' ],\n\t [ /\\\\v\\{d\\}/g, '\\u010F' ],\n\t [ /\\\\DJ /g, '\\u0110' ],\n\t [ /\\\\dj /g, '\\u0111' ],\n\t [ /\\\\=\\{E\\}/g, '\\u0112' ],\n\t [ /\\\\=\\{e\\}/g, '\\u0113' ],\n\t [ /\\\\u\\{E\\}/g, '\\u0114' ],\n\t [ /\\\\u\\{e\\}/g, '\\u0115' ],\n\t [ /\\\\.\\{E\\}/g, '\\u0116' ],\n\t [ /\\\\.\\{e\\}/g, '\\u0117' ],\n\t [ /\\\\k\\{E\\}/g, '\\u0118' ],\n\t [ /\\\\k\\{e\\}/g, '\\u0119' ],\n\t [ /\\\\v\\{E\\}/g, '\\u011A' ],\n\t [ /\\\\v\\{e\\}/g, '\\u011B' ],\n\t [ /\\\\\\^\\{G\\}/g, '\\u011C' ],\n\t [ /\\\\\\^\\{g\\}/g, '\\u011D' ],\n\t [ /\\\\u\\{G\\}/g, '\\u011E' ],\n\t [ /\\\\u\\{g\\}/g, '\\u011F' ],\n\t [ /\\\\.\\{G\\}/g, '\\u0120' ],\n\t [ /\\\\.\\{g\\}/g, '\\u0121' ],\n\t [ /\\\\c\\{G\\}/g, '\\u0122' ],\n\t [ /\\\\c\\{g\\}/g, '\\u0123' ],\n\t [ /\\\\\\^\\{H\\}/g, '\\u0124' ],\n\t [ /\\\\\\^\\{h\\}/g, '\\u0125' ],\n\t [ /\\\\Elzxh /g, '\\u0127' ],\n\t [ /\\\\~\\{I\\}/g, '\\u0128' ],\n\t [ /\\\\~\\{\\\\i\\}/g, '\\u0129' ],\n\t [ /\\\\=\\{I\\}/g, '\\u012A' ],\n\t [ /\\\\=\\{\\\\i\\}/g, '\\u012B' ],\n\t [ /\\\\u\\{I\\}/g, '\\u012C' ],\n\t [ /\\\\u\\{\\\\i\\}/g, '\\u012D' ],\n\t [ /\\\\k\\{I\\}/g, '\\u012E' ],\n\t [ /\\\\k\\{i\\}/g, '\\u012F' ],\n\t [ /\\\\.\\{I\\}/g, '\\u0130' ],\n\t [ /\\\\i /g, '\\u0131' ],\n\t [ /\\\\\\^\\{J\\}/g, '\\u0134' ],\n\t [ /\\\\\\^\\{\\\\j\\}/g, '\\u0135' ],\n\t [ /\\\\c\\{K\\}/g, '\\u0136' ],\n\t [ /\\\\c\\{k\\}/g, '\\u0137' ],\n\t [ /\\\\'\\{L\\}/g, '\\u0139' ],\n\t [ /\\\\'\\{l\\}/g, '\\u013A' ],\n\t [ /\\\\c\\{L\\}/g, '\\u013B' ],\n\t [ /\\\\c\\{l\\}/g, '\\u013C' ],\n\t [ /\\\\v\\{L\\}/g, '\\u013D' ],\n\t [ /\\\\v\\{l\\}/g, '\\u013E' ],\n\t [ /\\\\L /g, '\\u0141' ],\n\t [ /\\\\l /g, '\\u0142' ],\n\t [ /\\\\'\\{N\\}/g, '\\u0143' ],\n\t [ /\\\\'\\{n\\}/g, '\\u0144' ],\n\t [ /\\\\c\\{N\\}/g, '\\u0145' ],\n\t [ /\\\\c\\{n\\}/g, '\\u0146' ],\n\t [ /\\\\v\\{N\\}/g, '\\u0147' ],\n\t [ /\\\\v\\{n\\}/g, '\\u0148' ],\n\t [ /\\\\NG /g, '\\u014A' ],\n\t [ /\\\\ng /g, '\\u014B' ],\n\t [ /\\\\=\\{O\\}/g, '\\u014C' ],\n\t [ /\\\\=\\{o\\}/g, '\\u014D' ],\n\t [ /\\\\u\\{O\\}/g, '\\u014E' ],\n\t [ /\\\\u\\{o\\}/g, '\\u014F' ],\n\t [ /\\\\H\\{O\\}/g, '\\u0150' ],\n\t [ /\\\\H\\{o\\}/g, '\\u0151' ],\n\t [ /\\\\OE /g, '\\u0152' ],\n\t [ /\\\\oe /g, '\\u0153' ],\n\t [ /\\\\'\\{R\\}/g, '\\u0154' ],\n\t [ /\\\\'\\{r\\}/g, '\\u0155' ],\n\t [ /\\\\c\\{R\\}/g, '\\u0156' ],\n\t [ /\\\\c\\{r\\}/g, '\\u0157' ],\n\t [ /\\\\v\\{R\\}/g, '\\u0158' ],\n\t [ /\\\\v\\{r\\}/g, '\\u0159' ],\n\t [ /\\\\'\\{S\\}/g, '\\u015A' ],\n\t [ /\\\\'\\{s\\}/g, '\\u015B' ],\n\t [ /\\\\\\^\\{S\\}/g, '\\u015C' ],\n\t [ /\\\\\\^\\{s\\}/g, '\\u015D' ],\n\t [ /\\\\c\\{S\\}/g, '\\u015E' ],\n\t [ /\\\\c\\{s\\}/g, '\\u015F' ],\n\t [ /\\\\v\\{S\\}/g, '\\u0160' ],\n\t [ /\\\\v\\{s\\}/g, '\\u0161' ],\n\t [ /\\\\c\\{T\\}/g, '\\u0162' ],\n\t [ /\\\\c\\{t\\}/g, '\\u0163' ],\n\t [ /\\\\v\\{T\\}/g, '\\u0164' ],\n\t [ /\\\\v\\{t\\}/g, '\\u0165' ],\n\t [ /\\\\~\\{U\\}/g, '\\u0168' ],\n\t [ /\\\\~\\{u\\}/g, '\\u0169' ],\n\t [ /\\\\=\\{U\\}/g, '\\u016A' ],\n\t [ /\\\\=\\{u\\}/g, '\\u016B' ],\n\t [ /\\\\u\\{U\\}/g, '\\u016C' ],\n\t [ /\\\\u\\{u\\}/g, '\\u016D' ],\n\t [ /\\\\r\\{U\\}/g, '\\u016E' ],\n\t [ /\\\\r\\{u\\}/g, '\\u016F' ],\n\t [ /\\\\H\\{U\\}/g, '\\u0170' ],\n\t [ /\\\\H\\{u\\}/g, '\\u0171' ],\n\t [ /\\\\k\\{U\\}/g, '\\u0172' ],\n\t [ /\\\\k\\{u\\}/g, '\\u0173' ],\n\t [ /\\\\\\^\\{W\\}/g, '\\u0174' ],\n\t [ /\\\\\\^\\{w\\}/g, '\\u0175' ],\n\t [ /\\\\\\^\\{Y\\}/g, '\\u0176' ],\n\t [ /\\\\\\^\\{y\\}/g, '\\u0177' ],\n\t [ /\\\\\"\\{Y\\}/g, '\\u0178' ],\n\t [ /\\\\'\\{Z\\}/g, '\\u0179' ],\n\t [ /\\\\'\\{z\\}/g, '\\u017A' ],\n\t [ /\\\\.\\{Z\\}/g, '\\u017B' ],\n\t [ /\\\\.\\{z\\}/g, '\\u017C' ],\n\t [ /\\\\v\\{Z\\}/g, '\\u017D' ],\n\t [ /\\\\v\\{z\\}/g, '\\u017E' ],\n\t [ /\\\\texthvlig /g, '\\u0195' ],\n\t [ /\\\\textnrleg /g, '\\u019E' ],\n\t [ /\\\\eth /g, '\\u01AA' ],\n\t [ /\\\\textdoublepipe /g, '\\u01C2' ],\n\t [ /\\\\'\\{g\\}/g, '\\u01F5' ],\n\t [ /\\\\Elztrna /g, '\\u0250' ],\n\t [ /\\\\Elztrnsa /g, '\\u0252' ],\n\t [ /\\\\Elzopeno /g, '\\u0254' ],\n\t [ /\\\\Elzrtld /g, '\\u0256' ],\n\t [ /\\\\Elzschwa /g, '\\u0259' ],\n\t [ /\\\\varepsilon /g, '\\u025B' ],\n\t [ /\\\\Elzpgamma /g, '\\u0263' ],\n\t [ /\\\\Elzpbgam /g, '\\u0264' ],\n\t [ /\\\\Elztrnh /g, '\\u0265' ],\n\t [ /\\\\Elzbtdl /g, '\\u026C' ],\n\t [ /\\\\Elzrtll /g, '\\u026D' ],\n\t [ /\\\\Elztrnm /g, '\\u026F' ],\n\t [ /\\\\Elztrnmlr /g, '\\u0270' ],\n\t [ /\\\\Elzltlmr /g, '\\u0271' ],\n\t [ /\\\\Elzltln /g, '\\u0272' ],\n\t [ /\\\\Elzrtln /g, '\\u0273' ],\n\t [ /\\\\Elzclomeg /g, '\\u0277' ],\n\t [ /\\\\textphi /g, '\\u0278' ],\n\t [ /\\\\Elztrnr /g, '\\u0279' ],\n\t [ /\\\\Elztrnrl /g, '\\u027A' ],\n\t [ /\\\\Elzrttrnr /g, '\\u027B' ],\n\t [ /\\\\Elzrl /g, '\\u027C' ],\n\t [ /\\\\Elzrtlr /g, '\\u027D' ],\n\t [ /\\\\Elzfhr /g, '\\u027E' ],\n\t [ /\\\\Elzrtls /g, '\\u0282' ],\n\t [ /\\\\Elzesh /g, '\\u0283' ],\n\t [ /\\\\Elztrnt /g, '\\u0287' ],\n\t [ /\\\\Elzrtlt /g, '\\u0288' ],\n\t [ /\\\\Elzpupsil /g, '\\u028A' ],\n\t [ /\\\\Elzpscrv /g, '\\u028B' ],\n\t [ /\\\\Elzinvv /g, '\\u028C' ],\n\t [ /\\\\Elzinvw /g, '\\u028D' ],\n\t [ /\\\\Elztrny /g, '\\u028E' ],\n\t [ /\\\\Elzrtlz /g, '\\u0290' ],\n\t [ /\\\\Elzyogh /g, '\\u0292' ],\n\t [ /\\\\Elzglst /g, '\\u0294' ],\n\t [ /\\\\Elzreglst /g, '\\u0295' ],\n\t [ /\\\\Elzinglst /g, '\\u0296' ],\n\t [ /\\\\textturnk /g, '\\u029E' ],\n\t [ /\\\\Elzdyogh /g, '\\u02A4' ],\n\t [ /\\\\Elztesh /g, '\\u02A7' ],\n\t [ /\\\\textasciicaron /g, '\\u02C7' ],\n\t [ /\\\\Elzverts /g, '\\u02C8' ],\n\t [ /\\\\Elzverti /g, '\\u02CC' ],\n\t [ /\\\\Elzlmrk /g, '\\u02D0' ],\n\t [ /\\\\Elzhlmrk /g, '\\u02D1' ],\n\t [ /\\\\Elzsbrhr /g, '\\u02D2' ],\n\t [ /\\\\Elzsblhr /g, '\\u02D3' ],\n\t [ /\\\\Elzrais /g, '\\u02D4' ],\n\t [ /\\\\Elzlow /g, '\\u02D5' ],\n\t [ /\\\\textasciibreve /g, '\\u02D8' ],\n\t [ /\\\\textperiodcentered /g, '\\u02D9' ],\n\t [ /\\\\r\\{\\}/g, '\\u02DA' ],\n\t [ /\\\\k\\{\\}/g, '\\u02DB' ],\n\t [ /\\\\texttildelow /g, '\\u02DC' ],\n\t [ /\\\\H\\{\\}/g, '\\u02DD' ],\n\t [ /\\\\tone\\{55\\}/g, '\\u02E5' ],\n\t [ /\\\\tone\\{44\\}/g, '\\u02E6' ],\n\t [ /\\\\tone\\{33\\}/g, '\\u02E7' ],\n\t [ /\\\\tone\\{22\\}/g, '\\u02E8' ],\n\t [ /\\\\tone\\{11\\}/g, '\\u02E9' ],\n\t [ /\\\\cyrchar\\\\C/g, '\\u030F' ],\n\t [ /\\\\Elzpalh /g, '\\u0321' ],\n\t [ /\\\\Elzrh /g, '\\u0322' ],\n\t [ /\\\\Elzsbbrg /g, '\\u032A' ],\n\t [ /\\\\Elzxl /g, '\\u0335' ],\n\t [ /\\\\Elzbar /g, '\\u0336' ],\n\t [ /\\\\'\\{A\\}/g, '\\u0386' ],\n\t [ /\\\\'\\{E\\}/g, '\\u0388' ],\n\t [ /\\\\'\\{H\\}/g, '\\u0389' ],\n\t [ /\\\\'\\{\\}\\{I\\}/g, '\\u038A' ],\n\t [ /\\\\'\\{\\}O/g, '\\u038C' ],\n\t [ /\\\\mathrm\\{'Y\\}/g, '\\u038E' ],\n\t [ /\\\\mathrm\\{'\\\\Omega\\}/g, '\\u038F' ],\n\t [ /\\\\acute\\{\\\\ddot\\{\\\\iota\\}\\}/g, '\\u0390' ],\n\t [ /\\\\Alpha /g, '\\u0391' ],\n\t [ /\\\\Beta /g, '\\u0392' ],\n\t [ /\\\\Gamma /g, '\\u0393' ],\n\t [ /\\\\Delta /g, '\\u0394' ],\n\t [ /\\\\Epsilon /g, '\\u0395' ],\n\t [ /\\\\Zeta /g, '\\u0396' ],\n\t [ /\\\\Eta /g, '\\u0397' ],\n\t [ /\\\\Theta /g, '\\u0398' ],\n\t [ /\\\\Iota /g, '\\u0399' ],\n\t [ /\\\\Kappa /g, '\\u039A' ],\n\t [ /\\\\Lambda /g, '\\u039B' ],\n\t [ /\\\\Xi /g, '\\u039E' ],\n\t [ /\\\\Pi /g, '\\u03A0' ],\n\t [ /\\\\Rho /g, '\\u03A1' ],\n\t [ /\\\\Sigma /g, '\\u03A3' ],\n\t [ /\\\\Tau /g, '\\u03A4' ],\n\t [ /\\\\Upsilon /g, '\\u03A5' ],\n\t [ /\\\\Phi /g, '\\u03A6' ],\n\t [ /\\\\Chi /g, '\\u03A7' ],\n\t [ /\\\\Psi /g, '\\u03A8' ],\n\t [ /\\\\Omega /g, '\\u03A9' ],\n\t [ /\\\\mathrm\\{\\\\ddot\\{I\\}\\}/g, '\\u03AA' ],\n\t [ /\\\\mathrm\\{\\\\ddot\\{Y\\}\\}/g, '\\u03AB' ],\n\t [ /\\\\'\\{\\$\\\\alpha\\$\\}/g, '\\u03AC' ],\n\t [ /\\\\acute\\{\\\\epsilon\\}/g, '\\u03AD' ],\n\t [ /\\\\acute\\{\\\\eta\\}/g, '\\u03AE' ],\n\t [ /\\\\acute\\{\\\\iota\\}/g, '\\u03AF' ],\n\t [ /\\\\acute\\{\\\\ddot\\{\\\\upsilon\\}\\}/g, '\\u03B0' ],\n\t [ /\\\\alpha /g, '\\u03B1' ],\n\t [ /\\\\beta /g, '\\u03B2' ],\n\t [ /\\\\gamma /g, '\\u03B3' ],\n\t [ /\\\\delta /g, '\\u03B4' ],\n\t [ /\\\\epsilon /g, '\\u03B5' ],\n\t [ /\\\\zeta /g, '\\u03B6' ],\n\t [ /\\\\eta /g, '\\u03B7' ],\n\t [ /\\\\texttheta /g, '\\u03B8' ],\n\t [ /\\\\iota /g, '\\u03B9' ],\n\t [ /\\\\kappa /g, '\\u03BA' ],\n\t [ /\\\\lambda /g, '\\u03BB' ],\n\t [ /\\\\mu /g, '\\u03BC' ],\n\t [ /\\\\nu /g, '\\u03BD' ],\n\t [ /\\\\xi /g, '\\u03BE' ],\n\t [ /\\\\pi /g, '\\u03C0' ],\n\t [ /\\\\rho /g, '\\u03C1' ],\n\t [ /\\\\varsigma /g, '\\u03C2' ],\n\t [ /\\\\sigma /g, '\\u03C3' ],\n\t [ /\\\\tau /g, '\\u03C4' ],\n\t [ /\\\\upsilon /g, '\\u03C5' ],\n\t [ /\\\\varphi /g, '\\u03C6' ],\n\t [ /\\\\chi /g, '\\u03C7' ],\n\t [ /\\\\psi /g, '\\u03C8' ],\n\t [ /\\\\omega /g, '\\u03C9' ],\n\t [ /\\\\ddot\\{\\\\iota\\}/g, '\\u03CA' ],\n\t [ /\\\\ddot\\{\\\\upsilon\\}/g, '\\u03CB' ],\n\t [ /\\\\'\\{o\\}/g, '\\u03CC' ],\n\t [ /\\\\acute\\{\\\\upsilon\\}/g, '\\u03CD' ],\n\t [ /\\\\acute\\{\\\\omega\\}/g, '\\u03CE' ],\n\t [ /\\\\Pisymbol\\{ppi022\\}\\{87\\}/g, '\\u03D0' ],\n\t [ /\\\\textvartheta /g, '\\u03D1' ],\n\t [ /\\\\Upsilon /g, '\\u03D2' ],\n\t [ /\\\\phi /g, '\\u03D5' ],\n\t [ /\\\\varpi /g, '\\u03D6' ],\n\t [ /\\\\Stigma /g, '\\u03DA' ],\n\t [ /\\\\Digamma /g, '\\u03DC' ],\n\t [ /\\\\digamma /g, '\\u03DD' ],\n\t [ /\\\\Koppa /g, '\\u03DE' ],\n\t [ /\\\\Sampi /g, '\\u03E0' ],\n\t [ /\\\\varkappa /g, '\\u03F0' ],\n\t [ /\\\\varrho /g, '\\u03F1' ],\n\t [ /\\\\textTheta /g, '\\u03F4' ],\n\t [ /\\\\backepsilon /g, '\\u03F6' ],\n\t [ /\\\\cyrchar\\\\CYRYO /g, '\\u0401' ],\n\t [ /\\\\cyrchar\\\\CYRDJE /g, '\\u0402' ],\n\t [ /\\\\cyrchar\\{\\\\'\\\\CYRG\\}/g, '\\u0403' ],\n\t [ /\\\\cyrchar\\\\CYRIE /g, '\\u0404' ],\n\t [ /\\\\cyrchar\\\\CYRDZE /g, '\\u0405' ],\n\t [ /\\\\cyrchar\\\\CYRII /g, '\\u0406' ],\n\t [ /\\\\cyrchar\\\\CYRYI /g, '\\u0407' ],\n\t [ /\\\\cyrchar\\\\CYRJE /g, '\\u0408' ],\n\t [ /\\\\cyrchar\\\\CYRLJE /g, '\\u0409' ],\n\t [ /\\\\cyrchar\\\\CYRNJE /g, '\\u040A' ],\n\t [ /\\\\cyrchar\\\\CYRTSHE /g, '\\u040B' ],\n\t [ /\\\\cyrchar\\{\\\\'\\\\CYRK\\}/g, '\\u040C' ],\n\t [ /\\\\cyrchar\\\\CYRUSHRT /g, '\\u040E' ],\n\t [ /\\\\cyrchar\\\\CYRDZHE /g, '\\u040F' ],\n\t [ /\\\\cyrchar\\\\CYRA /g, '\\u0410' ],\n\t [ /\\\\cyrchar\\\\CYRB /g, '\\u0411' ],\n\t [ /\\\\cyrchar\\\\CYRV /g, '\\u0412' ],\n\t [ /\\\\cyrchar\\\\CYRG /g, '\\u0413' ],\n\t [ /\\\\cyrchar\\\\CYRD /g, '\\u0414' ],\n\t [ /\\\\cyrchar\\\\CYRE /g, '\\u0415' ],\n\t [ /\\\\cyrchar\\\\CYRZH /g, '\\u0416' ],\n\t [ /\\\\cyrchar\\\\CYRZ /g, '\\u0417' ],\n\t [ /\\\\cyrchar\\\\CYRI /g, '\\u0418' ],\n\t [ /\\\\cyrchar\\\\CYRISHRT /g, '\\u0419' ],\n\t [ /\\\\cyrchar\\\\CYRK /g, '\\u041A' ],\n\t [ /\\\\cyrchar\\\\CYRL /g, '\\u041B' ],\n\t [ /\\\\cyrchar\\\\CYRM /g, '\\u041C' ],\n\t [ /\\\\cyrchar\\\\CYRN /g, '\\u041D' ],\n\t [ /\\\\cyrchar\\\\CYRO /g, '\\u041E' ],\n\t [ /\\\\cyrchar\\\\CYRP /g, '\\u041F' ],\n\t [ /\\\\cyrchar\\\\CYRR /g, '\\u0420' ],\n\t [ /\\\\cyrchar\\\\CYRS /g, '\\u0421' ],\n\t [ /\\\\cyrchar\\\\CYRT /g, '\\u0422' ],\n\t [ /\\\\cyrchar\\\\CYRU /g, '\\u0423' ],\n\t [ /\\\\cyrchar\\\\CYRF /g, '\\u0424' ],\n\t [ /\\\\cyrchar\\\\CYRH /g, '\\u0425' ],\n\t [ /\\\\cyrchar\\\\CYRC /g, '\\u0426' ],\n\t [ /\\\\cyrchar\\\\CYRCH /g, '\\u0427' ],\n\t [ /\\\\cyrchar\\\\CYRSH /g, '\\u0428' ],\n\t [ /\\\\cyrchar\\\\CYRSHCH /g, '\\u0429' ],\n\t [ /\\\\cyrchar\\\\CYRHRDSN /g, '\\u042A' ],\n\t [ /\\\\cyrchar\\\\CYRERY /g, '\\u042B' ],\n\t [ /\\\\cyrchar\\\\CYRSFTSN /g, '\\u042C' ],\n\t [ /\\\\cyrchar\\\\CYREREV /g, '\\u042D' ],\n\t [ /\\\\cyrchar\\\\CYRYU /g, '\\u042E' ],\n\t [ /\\\\cyrchar\\\\CYRYA /g, '\\u042F' ],\n\t [ /\\\\cyrchar\\\\cyra /g, '\\u0430' ],\n\t [ /\\\\cyrchar\\\\cyrb /g, '\\u0431' ],\n\t [ /\\\\cyrchar\\\\cyrv /g, '\\u0432' ],\n\t [ /\\\\cyrchar\\\\cyrg /g, '\\u0433' ],\n\t [ /\\\\cyrchar\\\\cyrd /g, '\\u0434' ],\n\t [ /\\\\cyrchar\\\\cyre /g, '\\u0435' ],\n\t [ /\\\\cyrchar\\\\cyrzh /g, '\\u0436' ],\n\t [ /\\\\cyrchar\\\\cyrz /g, '\\u0437' ],\n\t [ /\\\\cyrchar\\\\cyri /g, '\\u0438' ],\n\t [ /\\\\cyrchar\\\\cyrishrt /g, '\\u0439' ],\n\t [ /\\\\cyrchar\\\\cyrk /g, '\\u043A' ],\n\t [ /\\\\cyrchar\\\\cyrl /g, '\\u043B' ],\n\t [ /\\\\cyrchar\\\\cyrm /g, '\\u043C' ],\n\t [ /\\\\cyrchar\\\\cyrn /g, '\\u043D' ],\n\t [ /\\\\cyrchar\\\\cyro /g, '\\u043E' ],\n\t [ /\\\\cyrchar\\\\cyrp /g, '\\u043F' ],\n\t [ /\\\\cyrchar\\\\cyrr /g, '\\u0440' ],\n\t [ /\\\\cyrchar\\\\cyrs /g, '\\u0441' ],\n\t [ /\\\\cyrchar\\\\cyrt /g, '\\u0442' ],\n\t [ /\\\\cyrchar\\\\cyru /g, '\\u0443' ],\n\t [ /\\\\cyrchar\\\\cyrf /g, '\\u0444' ],\n\t [ /\\\\cyrchar\\\\cyrh /g, '\\u0445' ],\n\t [ /\\\\cyrchar\\\\cyrc /g, '\\u0446' ],\n\t [ /\\\\cyrchar\\\\cyrch /g, '\\u0447' ],\n\t [ /\\\\cyrchar\\\\cyrsh /g, '\\u0448' ],\n\t [ /\\\\cyrchar\\\\cyrshch /g, '\\u0449' ],\n\t [ /\\\\cyrchar\\\\cyrhrdsn /g, '\\u044A' ],\n\t [ /\\\\cyrchar\\\\cyrery /g, '\\u044B' ],\n\t [ /\\\\cyrchar\\\\cyrsftsn /g, '\\u044C' ],\n\t [ /\\\\cyrchar\\\\cyrerev /g, '\\u044D' ],\n\t [ /\\\\cyrchar\\\\cyryu /g, '\\u044E' ],\n\t [ /\\\\cyrchar\\\\cyrya /g, '\\u044F' ],\n\t [ /\\\\cyrchar\\\\cyryo /g, '\\u0451' ],\n\t [ /\\\\cyrchar\\\\cyrdje /g, '\\u0452' ],\n\t [ /\\\\cyrchar\\{\\\\'\\\\cyrg\\}/g, '\\u0453' ],\n\t [ /\\\\cyrchar\\\\cyrie /g, '\\u0454' ],\n\t [ /\\\\cyrchar\\\\cyrdze /g, '\\u0455' ],\n\t [ /\\\\cyrchar\\\\cyrii /g, '\\u0456' ],\n\t [ /\\\\cyrchar\\\\cyryi /g, '\\u0457' ],\n\t [ /\\\\cyrchar\\\\cyrje /g, '\\u0458' ],\n\t [ /\\\\cyrchar\\\\cyrlje /g, '\\u0459' ],\n\t [ /\\\\cyrchar\\\\cyrnje /g, '\\u045A' ],\n\t [ /\\\\cyrchar\\\\cyrtshe /g, '\\u045B' ],\n\t [ /\\\\cyrchar\\{\\\\'\\\\cyrk\\}/g, '\\u045C' ],\n\t [ /\\\\cyrchar\\\\cyrushrt /g, '\\u045E' ],\n\t [ /\\\\cyrchar\\\\cyrdzhe /g, '\\u045F' ],\n\t [ /\\\\cyrchar\\\\CYROMEGA /g, '\\u0460' ],\n\t [ /\\\\cyrchar\\\\cyromega /g, '\\u0461' ],\n\t [ /\\\\cyrchar\\\\CYRYAT /g, '\\u0462' ],\n\t [ /\\\\cyrchar\\\\CYRIOTE /g, '\\u0464' ],\n\t [ /\\\\cyrchar\\\\cyriote /g, '\\u0465' ],\n\t [ /\\\\cyrchar\\\\CYRLYUS /g, '\\u0466' ],\n\t [ /\\\\cyrchar\\\\cyrlyus /g, '\\u0467' ],\n\t [ /\\\\cyrchar\\\\CYRIOTLYUS /g, '\\u0468' ],\n\t [ /\\\\cyrchar\\\\cyriotlyus /g, '\\u0469' ],\n\t [ /\\\\cyrchar\\\\CYRBYUS /g, '\\u046A' ],\n\t [ /\\\\cyrchar\\\\CYRIOTBYUS /g, '\\u046C' ],\n\t [ /\\\\cyrchar\\\\cyriotbyus /g, '\\u046D' ],\n\t [ /\\\\cyrchar\\\\CYRKSI /g, '\\u046E' ],\n\t [ /\\\\cyrchar\\\\cyrksi /g, '\\u046F' ],\n\t [ /\\\\cyrchar\\\\CYRPSI /g, '\\u0470' ],\n\t [ /\\\\cyrchar\\\\cyrpsi /g, '\\u0471' ],\n\t [ /\\\\cyrchar\\\\CYRFITA /g, '\\u0472' ],\n\t [ /\\\\cyrchar\\\\CYRIZH /g, '\\u0474' ],\n\t [ /\\\\cyrchar\\\\CYRUK /g, '\\u0478' ],\n\t [ /\\\\cyrchar\\\\cyruk /g, '\\u0479' ],\n\t [ /\\\\cyrchar\\\\CYROMEGARND /g, '\\u047A' ],\n\t [ /\\\\cyrchar\\\\cyromegarnd /g, '\\u047B' ],\n\t [ /\\\\cyrchar\\\\CYROMEGATITLO /g, '\\u047C' ],\n\t [ /\\\\cyrchar\\\\cyromegatitlo /g, '\\u047D' ],\n\t [ /\\\\cyrchar\\\\CYROT /g, '\\u047E' ],\n\t [ /\\\\cyrchar\\\\cyrot /g, '\\u047F' ],\n\t [ /\\\\cyrchar\\\\CYRKOPPA /g, '\\u0480' ],\n\t [ /\\\\cyrchar\\\\cyrkoppa /g, '\\u0481' ],\n\t [ /\\\\cyrchar\\\\cyrthousands /g, '\\u0482' ],\n\t [ /\\\\cyrchar\\\\cyrhundredthousands /g, '\\u0488' ],\n\t [ /\\\\cyrchar\\\\cyrmillions /g, '\\u0489' ],\n\t [ /\\\\cyrchar\\\\CYRSEMISFTSN /g, '\\u048C' ],\n\t [ /\\\\cyrchar\\\\cyrsemisftsn /g, '\\u048D' ],\n\t [ /\\\\cyrchar\\\\CYRRTICK /g, '\\u048E' ],\n\t [ /\\\\cyrchar\\\\cyrrtick /g, '\\u048F' ],\n\t [ /\\\\cyrchar\\\\CYRGUP /g, '\\u0490' ],\n\t [ /\\\\cyrchar\\\\cyrgup /g, '\\u0491' ],\n\t [ /\\\\cyrchar\\\\CYRGHCRS /g, '\\u0492' ],\n\t [ /\\\\cyrchar\\\\cyrghcrs /g, '\\u0493' ],\n\t [ /\\\\cyrchar\\\\CYRGHK /g, '\\u0494' ],\n\t [ /\\\\cyrchar\\\\cyrghk /g, '\\u0495' ],\n\t [ /\\\\cyrchar\\\\CYRZHDSC /g, '\\u0496' ],\n\t [ /\\\\cyrchar\\\\cyrzhdsc /g, '\\u0497' ],\n\t [ /\\\\cyrchar\\\\CYRZDSC /g, '\\u0498' ],\n\t [ /\\\\cyrchar\\\\cyrzdsc /g, '\\u0499' ],\n\t [ /\\\\cyrchar\\\\CYRKDSC /g, '\\u049A' ],\n\t [ /\\\\cyrchar\\\\cyrkdsc /g, '\\u049B' ],\n\t [ /\\\\cyrchar\\\\CYRKVCRS /g, '\\u049C' ],\n\t [ /\\\\cyrchar\\\\cyrkvcrs /g, '\\u049D' ],\n\t [ /\\\\cyrchar\\\\CYRKHCRS /g, '\\u049E' ],\n\t [ /\\\\cyrchar\\\\cyrkhcrs /g, '\\u049F' ],\n\t [ /\\\\cyrchar\\\\CYRKBEAK /g, '\\u04A0' ],\n\t [ /\\\\cyrchar\\\\cyrkbeak /g, '\\u04A1' ],\n\t [ /\\\\cyrchar\\\\CYRNDSC /g, '\\u04A2' ],\n\t [ /\\\\cyrchar\\\\cyrndsc /g, '\\u04A3' ],\n\t [ /\\\\cyrchar\\\\CYRNG /g, '\\u04A4' ],\n\t [ /\\\\cyrchar\\\\cyrng /g, '\\u04A5' ],\n\t [ /\\\\cyrchar\\\\CYRPHK /g, '\\u04A6' ],\n\t [ /\\\\cyrchar\\\\cyrphk /g, '\\u04A7' ],\n\t [ /\\\\cyrchar\\\\CYRABHHA /g, '\\u04A8' ],\n\t [ /\\\\cyrchar\\\\cyrabhha /g, '\\u04A9' ],\n\t [ /\\\\cyrchar\\\\CYRSDSC /g, '\\u04AA' ],\n\t [ /\\\\cyrchar\\\\cyrsdsc /g, '\\u04AB' ],\n\t [ /\\\\cyrchar\\\\CYRTDSC /g, '\\u04AC' ],\n\t [ /\\\\cyrchar\\\\cyrtdsc /g, '\\u04AD' ],\n\t [ /\\\\cyrchar\\\\CYRY /g, '\\u04AE' ],\n\t [ /\\\\cyrchar\\\\cyry /g, '\\u04AF' ],\n\t [ /\\\\cyrchar\\\\CYRYHCRS /g, '\\u04B0' ],\n\t [ /\\\\cyrchar\\\\cyryhcrs /g, '\\u04B1' ],\n\t [ /\\\\cyrchar\\\\CYRHDSC /g, '\\u04B2' ],\n\t [ /\\\\cyrchar\\\\cyrhdsc /g, '\\u04B3' ],\n\t [ /\\\\cyrchar\\\\CYRTETSE /g, '\\u04B4' ],\n\t [ /\\\\cyrchar\\\\cyrtetse /g, '\\u04B5' ],\n\t [ /\\\\cyrchar\\\\CYRCHRDSC /g, '\\u04B6' ],\n\t [ /\\\\cyrchar\\\\cyrchrdsc /g, '\\u04B7' ],\n\t [ /\\\\cyrchar\\\\CYRCHVCRS /g, '\\u04B8' ],\n\t [ /\\\\cyrchar\\\\cyrchvcrs /g, '\\u04B9' ],\n\t [ /\\\\cyrchar\\\\CYRSHHA /g, '\\u04BA' ],\n\t [ /\\\\cyrchar\\\\cyrshha /g, '\\u04BB' ],\n\t [ /\\\\cyrchar\\\\CYRABHCH /g, '\\u04BC' ],\n\t [ /\\\\cyrchar\\\\cyrabhch /g, '\\u04BD' ],\n\t [ /\\\\cyrchar\\\\CYRABHCHDSC /g, '\\u04BE' ],\n\t [ /\\\\cyrchar\\\\cyrabhchdsc /g, '\\u04BF' ],\n\t [ /\\\\cyrchar\\\\CYRpalochka /g, '\\u04C0' ],\n\t [ /\\\\cyrchar\\\\CYRKHK /g, '\\u04C3' ],\n\t [ /\\\\cyrchar\\\\cyrkhk /g, '\\u04C4' ],\n\t [ /\\\\cyrchar\\\\CYRNHK /g, '\\u04C7' ],\n\t [ /\\\\cyrchar\\\\cyrnhk /g, '\\u04C8' ],\n\t [ /\\\\cyrchar\\\\CYRCHLDSC /g, '\\u04CB' ],\n\t [ /\\\\cyrchar\\\\cyrchldsc /g, '\\u04CC' ],\n\t [ /\\\\cyrchar\\\\CYRAE /g, '\\u04D4' ],\n\t [ /\\\\cyrchar\\\\cyrae /g, '\\u04D5' ],\n\t [ /\\\\cyrchar\\\\CYRSCHWA /g, '\\u04D8' ],\n\t [ /\\\\cyrchar\\\\cyrschwa /g, '\\u04D9' ],\n\t [ /\\\\cyrchar\\\\CYRABHDZE /g, '\\u04E0' ],\n\t [ /\\\\cyrchar\\\\cyrabhdze /g, '\\u04E1' ],\n\t [ /\\\\cyrchar\\\\CYROTLD /g, '\\u04E8' ],\n\t [ /\\\\cyrchar\\\\cyrotld /g, '\\u04E9' ],\n\t [ /\\\\hspace\\{0.6em\\}/g, '\\u2002' ],\n\t [ /\\\\hspace\\{1em\\}/g, '\\u2003' ],\n\t [ /\\\\hspace\\{0.33em\\}/g, '\\u2004' ],\n\t [ /\\\\hspace\\{0.25em\\}/g, '\\u2005' ],\n\t [ /\\\\hspace\\{0.166em\\}/g, '\\u2006' ],\n\t [ /\\\\hphantom\\{0\\}/g, '\\u2007' ],\n\t [ /\\\\hphantom\\{,\\}/g, '\\u2008' ],\n\t [ /\\\\hspace\\{0.167em\\}/g, '\\u2009' ],\n\t [ /\\\\mkern1mu /g, '\\u200A' ],\n\t [ /\\\\textendash /g, '\\u2013' ],\n\t [ /\\\\textemdash /g, '\\u2014' ],\n\t [ /\\\\rule\\{1em\\}\\{1pt\\}/g, '\\u2015' ],\n\t [ /\\\\Vert /g, '\\u2016' ],\n\t [ /\\\\Elzreapos /g, '\\u201B' ],\n\t [ /\\\\textquotedblleft /g, '\\u201C' ],\n\t [ /\\\\textquotedblright /g, '\\u201D' ],\n\t [ /\\\\textdagger /g, '\\u2020' ],\n\t [ /\\\\textdaggerdbl /g, '\\u2021' ],\n\t [ /\\\\textbullet /g, '\\u2022' ],\n\t [ /\\\\ldots /g, '\\u2026' ],\n\t [ /\\\\textperthousand /g, '\\u2030' ],\n\t [ /\\\\textpertenthousand /g, '\\u2031' ],\n\t [ /\\\\backprime /g, '\\u2035' ],\n\t [ /\\\\guilsinglleft /g, '\\u2039' ],\n\t [ /\\\\guilsinglright /g, '\\u203A' ],\n\t [ /\\\\mkern4mu /g, '\\u205F' ],\n\t [ /\\\\nolinebreak /g, '\\u2060' ],\n\t [ /\\\\ensuremath\\{\\\\Elzpes\\}/g, '\\u20A7' ],\n\t [ /\\\\mbox\\{\\\\texteuro\\} /g, '\\u20AC' ],\n\t [ /\\\\dddot /g, '\\u20DB' ],\n\t [ /\\\\ddddot /g, '\\u20DC' ],\n\t [ /\\\\mathbb\\{C\\}/g, '\\u2102' ],\n\t [ /\\\\mathscr\\{g\\}/g, '\\u210A' ],\n\t [ /\\\\mathscr\\{H\\}/g, '\\u210B' ],\n\t [ /\\\\mathfrak\\{H\\}/g, '\\u210C' ],\n\t [ /\\\\mathbb\\{H\\}/g, '\\u210D' ],\n\t [ /\\\\hslash /g, '\\u210F' ],\n\t [ /\\\\mathscr\\{I\\}/g, '\\u2110' ],\n\t [ /\\\\mathfrak\\{I\\}/g, '\\u2111' ],\n\t [ /\\\\mathscr\\{L\\}/g, '\\u2112' ],\n\t [ /\\\\mathscr\\{l\\}/g, '\\u2113' ],\n\t [ /\\\\mathbb\\{N\\}/g, '\\u2115' ],\n\t [ /\\\\cyrchar\\\\textnumero /g, '\\u2116' ],\n\t [ /\\\\wp /g, '\\u2118' ],\n\t [ /\\\\mathbb\\{P\\}/g, '\\u2119' ],\n\t [ /\\\\mathbb\\{Q\\}/g, '\\u211A' ],\n\t [ /\\\\mathscr\\{R\\}/g, '\\u211B' ],\n\t [ /\\\\mathfrak\\{R\\}/g, '\\u211C' ],\n\t [ /\\\\mathbb\\{R\\}/g, '\\u211D' ],\n\t [ /\\\\Elzxrat /g, '\\u211E' ],\n\t [ /\\\\texttrademark /g, '\\u2122' ],\n\t [ /\\\\mathbb\\{Z\\}/g, '\\u2124' ],\n\t [ /\\\\Omega /g, '\\u2126' ],\n\t [ /\\\\mho /g, '\\u2127' ],\n\t [ /\\\\mathfrak\\{Z\\}/g, '\\u2128' ],\n\t [ /\\\\ElsevierGlyph\\{2129\\}/g, '\\u2129' ],\n\t [ /\\\\AA /g, '\\u212B' ],\n\t [ /\\\\mathscr\\{B\\}/g, '\\u212C' ],\n\t [ /\\\\mathfrak\\{C\\}/g, '\\u212D' ],\n\t [ /\\\\mathscr\\{e\\}/g, '\\u212F' ],\n\t [ /\\\\mathscr\\{E\\}/g, '\\u2130' ],\n\t [ /\\\\mathscr\\{F\\}/g, '\\u2131' ],\n\t [ /\\\\mathscr\\{M\\}/g, '\\u2133' ],\n\t [ /\\\\mathscr\\{o\\}/g, '\\u2134' ],\n\t [ /\\\\aleph /g, '\\u2135' ],\n\t [ /\\\\beth /g, '\\u2136' ],\n\t [ /\\\\gimel /g, '\\u2137' ],\n\t [ /\\\\daleth /g, '\\u2138' ],\n\t [ /\\\\textfrac\\{1\\}\\{3\\}/g, '\\u2153' ],\n\t [ /\\\\textfrac\\{2\\}\\{3\\}/g, '\\u2154' ],\n\t [ /\\\\textfrac\\{1\\}\\{5\\}/g, '\\u2155' ],\n\t [ /\\\\textfrac\\{2\\}\\{5\\}/g, '\\u2156' ],\n\t [ /\\\\textfrac\\{3\\}\\{5\\}/g, '\\u2157' ],\n\t [ /\\\\textfrac\\{4\\}\\{5\\}/g, '\\u2158' ],\n\t [ /\\\\textfrac\\{1\\}\\{6\\}/g, '\\u2159' ],\n\t [ /\\\\textfrac\\{5\\}\\{6\\}/g, '\\u215A' ],\n\t [ /\\\\textfrac\\{1\\}\\{8\\}/g, '\\u215B' ],\n\t [ /\\\\textfrac\\{3\\}\\{8\\}/g, '\\u215C' ],\n\t [ /\\\\textfrac\\{5\\}\\{8\\}/g, '\\u215D' ],\n\t [ /\\\\textfrac\\{7\\}\\{8\\}/g, '\\u215E' ],\n\t [ /\\\\leftarrow /g, '\\u2190' ],\n\t [ /\\\\uparrow /g, '\\u2191' ],\n\t [ /\\\\rightarrow /g, '\\u2192' ],\n\t [ /\\\\downarrow /g, '\\u2193' ],\n\t [ /\\\\leftrightarrow /g, '\\u2194' ],\n\t [ /\\\\updownarrow /g, '\\u2195' ],\n\t [ /\\\\nwarrow /g, '\\u2196' ],\n\t [ /\\\\nearrow /g, '\\u2197' ],\n\t [ /\\\\searrow /g, '\\u2198' ],\n\t [ /\\\\swarrow /g, '\\u2199' ],\n\t [ /\\\\nleftarrow /g, '\\u219A' ],\n\t [ /\\\\nrightarrow /g, '\\u219B' ],\n\t [ /\\\\arrowwaveright /g, '\\u219C' ],\n\t [ /\\\\arrowwaveright /g, '\\u219D' ],\n\t [ /\\\\twoheadleftarrow /g, '\\u219E' ],\n\t [ /\\\\twoheadrightarrow /g, '\\u21A0' ],\n\t [ /\\\\leftarrowtail /g, '\\u21A2' ],\n\t [ /\\\\rightarrowtail /g, '\\u21A3' ],\n\t [ /\\\\mapsto /g, '\\u21A6' ],\n\t [ /\\\\hookleftarrow /g, '\\u21A9' ],\n\t [ /\\\\hookrightarrow /g, '\\u21AA' ],\n\t [ /\\\\looparrowleft /g, '\\u21AB' ],\n\t [ /\\\\looparrowright /g, '\\u21AC' ],\n\t [ /\\\\leftrightsquigarrow /g, '\\u21AD' ],\n\t [ /\\\\nleftrightarrow /g, '\\u21AE' ],\n\t [ /\\\\Lsh /g, '\\u21B0' ],\n\t [ /\\\\Rsh /g, '\\u21B1' ],\n\t [ /\\\\ElsevierGlyph\\{21B3\\}/g, '\\u21B3' ],\n\t [ /\\\\curvearrowleft /g, '\\u21B6' ],\n\t [ /\\\\curvearrowright /g, '\\u21B7' ],\n\t [ /\\\\circlearrowleft /g, '\\u21BA' ],\n\t [ /\\\\circlearrowright /g, '\\u21BB' ],\n\t [ /\\\\leftharpoonup /g, '\\u21BC' ],\n\t [ /\\\\leftharpoondown /g, '\\u21BD' ],\n\t [ /\\\\upharpoonright /g, '\\u21BE' ],\n\t [ /\\\\upharpoonleft /g, '\\u21BF' ],\n\t [ /\\\\rightharpoonup /g, '\\u21C0' ],\n\t [ /\\\\rightharpoondown /g, '\\u21C1' ],\n\t [ /\\\\downharpoonright /g, '\\u21C2' ],\n\t [ /\\\\downharpoonleft /g, '\\u21C3' ],\n\t [ /\\\\rightleftarrows /g, '\\u21C4' ],\n\t [ /\\\\dblarrowupdown /g, '\\u21C5' ],\n\t [ /\\\\leftrightarrows /g, '\\u21C6' ],\n\t [ /\\\\leftleftarrows /g, '\\u21C7' ],\n\t [ /\\\\upuparrows /g, '\\u21C8' ],\n\t [ /\\\\rightrightarrows /g, '\\u21C9' ],\n\t [ /\\\\downdownarrows /g, '\\u21CA' ],\n\t [ /\\\\leftrightharpoons /g, '\\u21CB' ],\n\t [ /\\\\rightleftharpoons /g, '\\u21CC' ],\n\t [ /\\\\nLeftarrow /g, '\\u21CD' ],\n\t [ /\\\\nLeftrightarrow /g, '\\u21CE' ],\n\t [ /\\\\nRightarrow /g, '\\u21CF' ],\n\t [ /\\\\Leftarrow /g, '\\u21D0' ],\n\t [ /\\\\Uparrow /g, '\\u21D1' ],\n\t [ /\\\\Rightarrow /g, '\\u21D2' ],\n\t [ /\\\\Downarrow /g, '\\u21D3' ],\n\t [ /\\\\Leftrightarrow /g, '\\u21D4' ],\n\t [ /\\\\Updownarrow /g, '\\u21D5' ],\n\t [ /\\\\Lleftarrow /g, '\\u21DA' ],\n\t [ /\\\\Rrightarrow /g, '\\u21DB' ],\n\t [ /\\\\rightsquigarrow /g, '\\u21DD' ],\n\t [ /\\\\DownArrowUpArrow /g, '\\u21F5' ],\n\t [ /\\\\forall /g, '\\u2200' ],\n\t [ /\\\\complement /g, '\\u2201' ],\n\t [ /\\\\partial /g, '\\u2202' ],\n\t [ /\\\\exists /g, '\\u2203' ],\n\t [ /\\\\nexists /g, '\\u2204' ],\n\t [ /\\\\varnothing /g, '\\u2205' ],\n\t [ /\\\\nabla /g, '\\u2207' ],\n\t [ /\\\\in /g, '\\u2208' ],\n\t [ /\\\\not\\\\in /g, '\\u2209' ],\n\t [ /\\\\ni /g, '\\u220B' ],\n\t [ /\\\\not\\\\ni /g, '\\u220C' ],\n\t [ /\\\\prod /g, '\\u220F' ],\n\t [ /\\\\coprod /g, '\\u2210' ],\n\t [ /\\\\sum /g, '\\u2211' ],\n\t [ /\\\\mp /g, '\\u2213' ],\n\t [ /\\\\dotplus /g, '\\u2214' ],\n\t [ /\\\\setminus /g, '\\u2216' ],\n\t [ /\\\\circ /g, '\\u2218' ],\n\t [ /\\\\bullet /g, '\\u2219' ],\n\t [ /\\\\surd /g, '\\u221A' ],\n\t [ /\\\\propto /g, '\\u221D' ],\n\t [ /\\\\infty /g, '\\u221E' ],\n\t [ /\\\\rightangle /g, '\\u221F' ],\n\t [ /\\\\angle /g, '\\u2220' ],\n\t [ /\\\\measuredangle /g, '\\u2221' ],\n\t [ /\\\\sphericalangle /g, '\\u2222' ],\n\t [ /\\\\mid /g, '\\u2223' ],\n\t [ /\\\\nmid /g, '\\u2224' ],\n\t [ /\\\\parallel /g, '\\u2225' ],\n\t [ /\\\\nparallel /g, '\\u2226' ],\n\t [ /\\\\wedge /g, '\\u2227' ],\n\t [ /\\\\vee /g, '\\u2228' ],\n\t [ /\\\\cap /g, '\\u2229' ],\n\t [ /\\\\cup /g, '\\u222A' ],\n\t [ /\\\\int /g, '\\u222B' ],\n\t [ /\\\\int\\\\!\\\\int /g, '\\u222C' ],\n\t [ /\\\\int\\\\!\\\\int\\\\!\\\\int /g, '\\u222D' ],\n\t [ /\\\\oint /g, '\\u222E' ],\n\t [ /\\\\surfintegral /g, '\\u222F' ],\n\t [ /\\\\volintegral /g, '\\u2230' ],\n\t [ /\\\\clwintegral /g, '\\u2231' ],\n\t [ /\\\\ElsevierGlyph\\{2232\\}/g, '\\u2232' ],\n\t [ /\\\\ElsevierGlyph\\{2233\\}/g, '\\u2233' ],\n\t [ /\\\\therefore /g, '\\u2234' ],\n\t [ /\\\\because /g, '\\u2235' ],\n\t [ /\\\\Colon /g, '\\u2237' ],\n\t [ /\\\\ElsevierGlyph\\{2238\\}/g, '\\u2238' ],\n\t [ /\\\\mathbin\\{\\{:\\}\\\\!\\\\!\\{\\-\\}\\\\!\\\\!\\{:\\}\\}/g, '\\u223A' ],\n\t [ /\\\\homothetic /g, '\\u223B' ],\n\t [ /\\\\sim /g, '\\u223C' ],\n\t [ /\\\\backsim /g, '\\u223D' ],\n\t [ /\\\\lazysinv /g, '\\u223E' ],\n\t [ /\\\\wr /g, '\\u2240' ],\n\t [ /\\\\not\\\\sim /g, '\\u2241' ],\n\t [ /\\\\ElsevierGlyph\\{2242\\}/g, '\\u2242' ],\n\t [ /\\\\NotEqualTilde /g, '\\u2242-00338' ],\n\t [ /\\\\simeq /g, '\\u2243' ],\n\t [ /\\\\not\\\\simeq /g, '\\u2244' ],\n\t [ /\\\\cong /g, '\\u2245' ],\n\t [ /\\\\approxnotequal /g, '\\u2246' ],\n\t [ /\\\\not\\\\cong /g, '\\u2247' ],\n\t [ /\\\\approx /g, '\\u2248' ],\n\t [ /\\\\not\\\\approx /g, '\\u2249' ],\n\t [ /\\\\approxeq /g, '\\u224A' ],\n\t [ /\\\\tildetrpl /g, '\\u224B' ],\n\t [ /\\\\not\\\\apid /g, '\\u224B-00338' ],\n\t [ /\\\\allequal /g, '\\u224C' ],\n\t [ /\\\\asymp /g, '\\u224D' ],\n\t [ /\\\\Bumpeq /g, '\\u224E' ],\n\t [ /\\\\NotHumpDownHump /g, '\\u224E-00338' ],\n\t [ /\\\\bumpeq /g, '\\u224F' ],\n\t [ /\\\\NotHumpEqual /g, '\\u224F-00338' ],\n\t [ /\\\\doteq /g, '\\u2250' ],\n\t [ /\\\\not\\\\doteq/g, '\\u2250-00338' ],\n\t [ /\\\\doteqdot /g, '\\u2251' ],\n\t [ /\\\\fallingdotseq /g, '\\u2252' ],\n\t [ /\\\\risingdotseq /g, '\\u2253' ],\n\t [ /\\\\eqcirc /g, '\\u2256' ],\n\t [ /\\\\circeq /g, '\\u2257' ],\n\t [ /\\\\estimates /g, '\\u2259' ],\n\t [ /\\\\ElsevierGlyph\\{225A\\}/g, '\\u225A' ],\n\t [ /\\\\starequal /g, '\\u225B' ],\n\t [ /\\\\triangleq /g, '\\u225C' ],\n\t [ /\\\\ElsevierGlyph\\{225F\\}/g, '\\u225F' ],\n\t [ /\\\\not =/g, '\\u2260' ],\n\t [ /\\\\equiv /g, '\\u2261' ],\n\t [ /\\\\not\\\\equiv /g, '\\u2262' ],\n\t [ /\\\\leq /g, '\\u2264' ],\n\t [ /\\\\geq /g, '\\u2265' ],\n\t [ /\\\\leqq /g, '\\u2266' ],\n\t [ /\\\\geqq /g, '\\u2267' ],\n\t [ /\\\\lneqq /g, '\\u2268' ],\n\t [ /\\\\lvertneqq /g, '\\u2268-0FE00' ],\n\t [ /\\\\gneqq /g, '\\u2269' ],\n\t [ /\\\\gvertneqq /g, '\\u2269-0FE00' ],\n\t [ /\\\\ll /g, '\\u226A' ],\n\t [ /\\\\NotLessLess /g, '\\u226A-00338' ],\n\t [ /\\\\gg /g, '\\u226B' ],\n\t [ /\\\\NotGreaterGreater /g, '\\u226B-00338' ],\n\t [ /\\\\between /g, '\\u226C' ],\n\t [ /\\\\not\\\\kern\\-0.3em\\\\times /g, '\\u226D' ],\n\t [ /\\\\not/g, '\\u226F' ],\n\t [ /\\\\not\\\\leq /g, '\\u2270' ],\n\t [ /\\\\not\\\\geq /g, '\\u2271' ],\n\t [ /\\\\lessequivlnt /g, '\\u2272' ],\n\t [ /\\\\greaterequivlnt /g, '\\u2273' ],\n\t [ /\\\\ElsevierGlyph\\{2274\\}/g, '\\u2274' ],\n\t [ /\\\\ElsevierGlyph\\{2275\\}/g, '\\u2275' ],\n\t [ /\\\\lessgtr /g, '\\u2276' ],\n\t [ /\\\\gtrless /g, '\\u2277' ],\n\t [ /\\\\notlessgreater /g, '\\u2278' ],\n\t [ /\\\\notgreaterless /g, '\\u2279' ],\n\t [ /\\\\prec /g, '\\u227A' ],\n\t [ /\\\\succ /g, '\\u227B' ],\n\t [ /\\\\preccurlyeq /g, '\\u227C' ],\n\t [ /\\\\succcurlyeq /g, '\\u227D' ],\n\t [ /\\\\precapprox /g, '\\u227E' ],\n\t [ /\\\\NotPrecedesTilde /g, '\\u227E-00338' ],\n\t [ /\\\\succapprox /g, '\\u227F' ],\n\t [ /\\\\NotSucceedsTilde /g, '\\u227F-00338' ],\n\t [ /\\\\not\\\\prec /g, '\\u2280' ],\n\t [ /\\\\not\\\\succ /g, '\\u2281' ],\n\t [ /\\\\subset /g, '\\u2282' ],\n\t [ /\\\\supset /g, '\\u2283' ],\n\t [ /\\\\not\\\\subset /g, '\\u2284' ],\n\t [ /\\\\not\\\\supset /g, '\\u2285' ],\n\t [ /\\\\subseteq /g, '\\u2286' ],\n\t [ /\\\\supseteq /g, '\\u2287' ],\n\t [ /\\\\not\\\\subseteq /g, '\\u2288' ],\n\t [ /\\\\not\\\\supseteq /g, '\\u2289' ],\n\t [ /\\\\subsetneq /g, '\\u228A' ],\n\t [ /\\\\varsubsetneqq /g, '\\u228A-0FE00' ],\n\t [ /\\\\supsetneq /g, '\\u228B' ],\n\t [ /\\\\varsupsetneq /g, '\\u228B-0FE00' ],\n\t [ /\\\\uplus /g, '\\u228E' ],\n\t [ /\\\\sqsubset /g, '\\u228F' ],\n\t [ /\\\\NotSquareSubset /g, '\\u228F-00338' ],\n\t [ /\\\\sqsupset /g, '\\u2290' ],\n\t [ /\\\\NotSquareSuperset /g, '\\u2290-00338' ],\n\t [ /\\\\sqsubseteq /g, '\\u2291' ],\n\t [ /\\\\sqsupseteq /g, '\\u2292' ],\n\t [ /\\\\sqcap /g, '\\u2293' ],\n\t [ /\\\\sqcup /g, '\\u2294' ],\n\t [ /\\\\oplus /g, '\\u2295' ],\n\t [ /\\\\ominus /g, '\\u2296' ],\n\t [ /\\\\otimes /g, '\\u2297' ],\n\t [ /\\\\oslash /g, '\\u2298' ],\n\t [ /\\\\odot /g, '\\u2299' ],\n\t [ /\\\\circledcirc /g, '\\u229A' ],\n\t [ /\\\\circledast /g, '\\u229B' ],\n\t [ /\\\\circleddash /g, '\\u229D' ],\n\t [ /\\\\boxplus /g, '\\u229E' ],\n\t [ /\\\\boxminus /g, '\\u229F' ],\n\t [ /\\\\boxtimes /g, '\\u22A0' ],\n\t [ /\\\\boxdot /g, '\\u22A1' ],\n\t [ /\\\\vdash /g, '\\u22A2' ],\n\t [ /\\\\dashv /g, '\\u22A3' ],\n\t [ /\\\\top /g, '\\u22A4' ],\n\t [ /\\\\perp /g, '\\u22A5' ],\n\t [ /\\\\truestate /g, '\\u22A7' ],\n\t [ /\\\\forcesextra /g, '\\u22A8' ],\n\t [ /\\\\Vdash /g, '\\u22A9' ],\n\t [ /\\\\Vvdash /g, '\\u22AA' ],\n\t [ /\\\\VDash /g, '\\u22AB' ],\n\t [ /\\\\nvdash /g, '\\u22AC' ],\n\t [ /\\\\nvDash /g, '\\u22AD' ],\n\t [ /\\\\nVdash /g, '\\u22AE' ],\n\t [ /\\\\nVDash /g, '\\u22AF' ],\n\t [ /\\\\vartriangleleft /g, '\\u22B2' ],\n\t [ /\\\\vartriangleright /g, '\\u22B3' ],\n\t [ /\\\\trianglelefteq /g, '\\u22B4' ],\n\t [ /\\\\trianglerighteq /g, '\\u22B5' ],\n\t [ /\\\\original /g, '\\u22B6' ],\n\t [ /\\\\image /g, '\\u22B7' ],\n\t [ /\\\\multimap /g, '\\u22B8' ],\n\t [ /\\\\hermitconjmatrix /g, '\\u22B9' ],\n\t [ /\\\\intercal /g, '\\u22BA' ],\n\t [ /\\\\veebar /g, '\\u22BB' ],\n\t [ /\\\\rightanglearc /g, '\\u22BE' ],\n\t [ /\\\\ElsevierGlyph\\{22C0\\}/g, '\\u22C0' ],\n\t [ /\\\\ElsevierGlyph\\{22C1\\}/g, '\\u22C1' ],\n\t [ /\\\\bigcap /g, '\\u22C2' ],\n\t [ /\\\\bigcup /g, '\\u22C3' ],\n\t [ /\\\\diamond /g, '\\u22C4' ],\n\t [ /\\\\cdot /g, '\\u22C5' ],\n\t [ /\\\\star /g, '\\u22C6' ],\n\t [ /\\\\divideontimes /g, '\\u22C7' ],\n\t [ /\\\\bowtie /g, '\\u22C8' ],\n\t [ /\\\\ltimes /g, '\\u22C9' ],\n\t [ /\\\\rtimes /g, '\\u22CA' ],\n\t [ /\\\\leftthreetimes /g, '\\u22CB' ],\n\t [ /\\\\rightthreetimes /g, '\\u22CC' ],\n\t [ /\\\\backsimeq /g, '\\u22CD' ],\n\t [ /\\\\curlyvee /g, '\\u22CE' ],\n\t [ /\\\\curlywedge /g, '\\u22CF' ],\n\t [ /\\\\Subset /g, '\\u22D0' ],\n\t [ /\\\\Supset /g, '\\u22D1' ],\n\t [ /\\\\Cap /g, '\\u22D2' ],\n\t [ /\\\\Cup /g, '\\u22D3' ],\n\t [ /\\\\pitchfork /g, '\\u22D4' ],\n\t [ /\\\\lessdot /g, '\\u22D6' ],\n\t [ /\\\\gtrdot /g, '\\u22D7' ],\n\t [ /\\\\verymuchless /g, '\\u22D8' ],\n\t [ /\\\\verymuchgreater /g, '\\u22D9' ],\n\t [ /\\\\lesseqgtr /g, '\\u22DA' ],\n\t [ /\\\\gtreqless /g, '\\u22DB' ],\n\t [ /\\\\curlyeqprec /g, '\\u22DE' ],\n\t [ /\\\\curlyeqsucc /g, '\\u22DF' ],\n\t [ /\\\\not\\\\sqsubseteq /g, '\\u22E2' ],\n\t [ /\\\\not\\\\sqsupseteq /g, '\\u22E3' ],\n\t [ /\\\\Elzsqspne /g, '\\u22E5' ],\n\t [ /\\\\lnsim /g, '\\u22E6' ],\n\t [ /\\\\gnsim /g, '\\u22E7' ],\n\t [ /\\\\precedesnotsimilar /g, '\\u22E8' ],\n\t [ /\\\\succnsim /g, '\\u22E9' ],\n\t [ /\\\\ntriangleleft /g, '\\u22EA' ],\n\t [ /\\\\ntriangleright /g, '\\u22EB' ],\n\t [ /\\\\ntrianglelefteq /g, '\\u22EC' ],\n\t [ /\\\\ntrianglerighteq /g, '\\u22ED' ],\n\t [ /\\\\vdots /g, '\\u22EE' ],\n\t [ /\\\\cdots /g, '\\u22EF' ],\n\t [ /\\\\upslopeellipsis /g, '\\u22F0' ],\n\t [ /\\\\downslopeellipsis /g, '\\u22F1' ],\n\t [ /\\\\barwedge /g, '\\u2305' ],\n\t [ /\\\\perspcorrespond /g, '\\u2306' ],\n\t [ /\\\\lceil /g, '\\u2308' ],\n\t [ /\\\\rceil /g, '\\u2309' ],\n\t [ /\\\\lfloor /g, '\\u230A' ],\n\t [ /\\\\rfloor /g, '\\u230B' ],\n\t [ /\\\\recorder /g, '\\u2315' ],\n\t [ /\\\\mathchar\"2208/g, '\\u2316' ],\n\t [ /\\\\ulcorner /g, '\\u231C' ],\n\t [ /\\\\urcorner /g, '\\u231D' ],\n\t [ /\\\\llcorner /g, '\\u231E' ],\n\t [ /\\\\lrcorner /g, '\\u231F' ],\n\t [ /\\\\frown /g, '\\u2322' ],\n\t [ /\\\\smile /g, '\\u2323' ],\n\t [ /\\\\langle /g, '\\u2329' ],\n\t [ /\\\\rangle /g, '\\u232A' ],\n\t [ /\\\\ElsevierGlyph\\{E838\\}/g, '\\u233D' ],\n\t [ /\\\\Elzdlcorn /g, '\\u23A3' ],\n\t [ /\\\\lmoustache /g, '\\u23B0' ],\n\t [ /\\\\rmoustache /g, '\\u23B1' ],\n\t [ /\\\\textvisiblespace /g, '\\u2423' ],\n\t [ /\\\\ding\\{172\\}/g, '\\u2460' ],\n\t [ /\\\\ding\\{173\\}/g, '\\u2461' ],\n\t [ /\\\\ding\\{174\\}/g, '\\u2462' ],\n\t [ /\\\\ding\\{175\\}/g, '\\u2463' ],\n\t [ /\\\\ding\\{176\\}/g, '\\u2464' ],\n\t [ /\\\\ding\\{177\\}/g, '\\u2465' ],\n\t [ /\\\\ding\\{178\\}/g, '\\u2466' ],\n\t [ /\\\\ding\\{179\\}/g, '\\u2467' ],\n\t [ /\\\\ding\\{180\\}/g, '\\u2468' ],\n\t [ /\\\\ding\\{181\\}/g, '\\u2469' ],\n\t [ /\\\\circledS /g, '\\u24C8' ],\n\t [ /\\\\Elzdshfnc /g, '\\u2506' ],\n\t [ /\\\\Elzsqfnw /g, '\\u2519' ],\n\t [ /\\\\diagup /g, '\\u2571' ],\n\t [ /\\\\ding\\{110\\}/g, '\\u25A0' ],\n\t [ /\\\\square /g, '\\u25A1' ],\n\t [ /\\\\blacksquare /g, '\\u25AA' ],\n\t [ /\\\\fbox\\{~~\\}/g, '\\u25AD' ],\n\t [ /\\\\Elzvrecto /g, '\\u25AF' ],\n\t [ /\\\\ElsevierGlyph\\{E381\\}/g, '\\u25B1' ],\n\t [ /\\\\ding\\{115\\}/g, '\\u25B2' ],\n\t [ /\\\\bigtriangleup /g, '\\u25B3' ],\n\t [ /\\\\blacktriangle /g, '\\u25B4' ],\n\t [ /\\\\vartriangle /g, '\\u25B5' ],\n\t [ /\\\\blacktriangleright /g, '\\u25B8' ],\n\t [ /\\\\triangleright /g, '\\u25B9' ],\n\t [ /\\\\ding\\{116\\}/g, '\\u25BC' ],\n\t [ /\\\\bigtriangledown /g, '\\u25BD' ],\n\t [ /\\\\blacktriangledown /g, '\\u25BE' ],\n\t [ /\\\\triangledown /g, '\\u25BF' ],\n\t [ /\\\\blacktriangleleft /g, '\\u25C2' ],\n\t [ /\\\\triangleleft /g, '\\u25C3' ],\n\t [ /\\\\ding\\{117\\}/g, '\\u25C6' ],\n\t [ /\\\\lozenge /g, '\\u25CA' ],\n\t [ /\\\\bigcirc /g, '\\u25CB' ],\n\t [ /\\\\ding\\{108\\}/g, '\\u25CF' ],\n\t [ /\\\\Elzcirfl /g, '\\u25D0' ],\n\t [ /\\\\Elzcirfr /g, '\\u25D1' ],\n\t [ /\\\\Elzcirfb /g, '\\u25D2' ],\n\t [ /\\\\ding\\{119\\}/g, '\\u25D7' ],\n\t [ /\\\\Elzrvbull /g, '\\u25D8' ],\n\t [ /\\\\Elzsqfl /g, '\\u25E7' ],\n\t [ /\\\\Elzsqfr /g, '\\u25E8' ],\n\t [ /\\\\Elzsqfse /g, '\\u25EA' ],\n\t [ /\\\\bigcirc /g, '\\u25EF' ],\n\t [ /\\\\ding\\{72\\}/g, '\\u2605' ],\n\t [ /\\\\ding\\{73\\}/g, '\\u2606' ],\n\t [ /\\\\ding\\{37\\}/g, '\\u260E' ],\n\t [ /\\\\ding\\{42\\}/g, '\\u261B' ],\n\t [ /\\\\ding\\{43\\}/g, '\\u261E' ],\n\t [ /\\\\rightmoon /g, '\\u263E' ],\n\t [ /\\\\mercury /g, '\\u263F' ],\n\t [ /\\\\venus /g, '\\u2640' ],\n\t [ /\\\\male /g, '\\u2642' ],\n\t [ /\\\\jupiter /g, '\\u2643' ],\n\t [ /\\\\saturn /g, '\\u2644' ],\n\t [ /\\\\uranus /g, '\\u2645' ],\n\t [ /\\\\neptune /g, '\\u2646' ],\n\t [ /\\\\pluto /g, '\\u2647' ],\n\t [ /\\\\aries /g, '\\u2648' ],\n\t [ /\\\\taurus /g, '\\u2649' ],\n\t [ /\\\\gemini /g, '\\u264A' ],\n\t [ /\\\\cancer /g, '\\u264B' ],\n\t [ /\\\\leo /g, '\\u264C' ],\n\t [ /\\\\virgo /g, '\\u264D' ],\n\t [ /\\\\libra /g, '\\u264E' ],\n\t [ /\\\\scorpio /g, '\\u264F' ],\n\t [ /\\\\sagittarius /g, '\\u2650' ],\n\t [ /\\\\capricornus /g, '\\u2651' ],\n\t [ /\\\\aquarius /g, '\\u2652' ],\n\t [ /\\\\pisces /g, '\\u2653' ],\n\t [ /\\\\ding\\{171\\}/g, '\\u2660' ],\n\t [ /\\\\diamond /g, '\\u2662' ],\n\t [ /\\\\ding\\{168\\}/g, '\\u2663' ],\n\t [ /\\\\ding\\{170\\}/g, '\\u2665' ],\n\t [ /\\\\ding\\{169\\}/g, '\\u2666' ],\n\t [ /\\\\quarternote /g, '\\u2669' ],\n\t [ /\\\\eighthnote /g, '\\u266A' ],\n\t [ /\\\\flat /g, '\\u266D' ],\n\t [ /\\\\natural /g, '\\u266E' ],\n\t [ /\\\\sharp /g, '\\u266F' ],\n\t [ /\\\\ding\\{33\\}/g, '\\u2701' ],\n\t [ /\\\\ding\\{34\\}/g, '\\u2702' ],\n\t [ /\\\\ding\\{35\\}/g, '\\u2703' ],\n\t [ /\\\\ding\\{36\\}/g, '\\u2704' ],\n\t [ /\\\\ding\\{38\\}/g, '\\u2706' ],\n\t [ /\\\\ding\\{39\\}/g, '\\u2707' ],\n\t [ /\\\\ding\\{40\\}/g, '\\u2708' ],\n\t [ /\\\\ding\\{41\\}/g, '\\u2709' ],\n\t [ /\\\\ding\\{44\\}/g, '\\u270C' ],\n\t [ /\\\\ding\\{45\\}/g, '\\u270D' ],\n\t [ /\\\\ding\\{46\\}/g, '\\u270E' ],\n\t [ /\\\\ding\\{47\\}/g, '\\u270F' ],\n\t [ /\\\\ding\\{48\\}/g, '\\u2710' ],\n\t [ /\\\\ding\\{49\\}/g, '\\u2711' ],\n\t [ /\\\\ding\\{50\\}/g, '\\u2712' ],\n\t [ /\\\\ding\\{51\\}/g, '\\u2713' ],\n\t [ /\\\\ding\\{52\\}/g, '\\u2714' ],\n\t [ /\\\\ding\\{53\\}/g, '\\u2715' ],\n\t [ /\\\\ding\\{54\\}/g, '\\u2716' ],\n\t [ /\\\\ding\\{55\\}/g, '\\u2717' ],\n\t [ /\\\\ding\\{56\\}/g, '\\u2718' ],\n\t [ /\\\\ding\\{57\\}/g, '\\u2719' ],\n\t [ /\\\\ding\\{58\\}/g, '\\u271A' ],\n\t [ /\\\\ding\\{59\\}/g, '\\u271B' ],\n\t [ /\\\\ding\\{60\\}/g, '\\u271C' ],\n\t [ /\\\\ding\\{61\\}/g, '\\u271D' ],\n\t [ /\\\\ding\\{62\\}/g, '\\u271E' ],\n\t [ /\\\\ding\\{63\\}/g, '\\u271F' ],\n\t [ /\\\\ding\\{64\\}/g, '\\u2720' ],\n\t [ /\\\\ding\\{65\\}/g, '\\u2721' ],\n\t [ /\\\\ding\\{66\\}/g, '\\u2722' ],\n\t [ /\\\\ding\\{67\\}/g, '\\u2723' ],\n\t [ /\\\\ding\\{68\\}/g, '\\u2724' ],\n\t [ /\\\\ding\\{69\\}/g, '\\u2725' ],\n\t [ /\\\\ding\\{70\\}/g, '\\u2726' ],\n\t [ /\\\\ding\\{71\\}/g, '\\u2727' ],\n\t [ /\\\\ding\\{73\\}/g, '\\u2729' ],\n\t [ /\\\\ding\\{74\\}/g, '\\u272A' ],\n\t [ /\\\\ding\\{75\\}/g, '\\u272B' ],\n\t [ /\\\\ding\\{76\\}/g, '\\u272C' ],\n\t [ /\\\\ding\\{77\\}/g, '\\u272D' ],\n\t [ /\\\\ding\\{78\\}/g, '\\u272E' ],\n\t [ /\\\\ding\\{79\\}/g, '\\u272F' ],\n\t [ /\\\\ding\\{80\\}/g, '\\u2730' ],\n\t [ /\\\\ding\\{81\\}/g, '\\u2731' ],\n\t [ /\\\\ding\\{82\\}/g, '\\u2732' ],\n\t [ /\\\\ding\\{83\\}/g, '\\u2733' ],\n\t [ /\\\\ding\\{84\\}/g, '\\u2734' ],\n\t [ /\\\\ding\\{85\\}/g, '\\u2735' ],\n\t [ /\\\\ding\\{86\\}/g, '\\u2736' ],\n\t [ /\\\\ding\\{87\\}/g, '\\u2737' ],\n\t [ /\\\\ding\\{88\\}/g, '\\u2738' ],\n\t [ /\\\\ding\\{89\\}/g, '\\u2739' ],\n\t [ /\\\\ding\\{90\\}/g, '\\u273A' ],\n\t [ /\\\\ding\\{91\\}/g, '\\u273B' ],\n\t [ /\\\\ding\\{92\\}/g, '\\u273C' ],\n\t [ /\\\\ding\\{93\\}/g, '\\u273D' ],\n\t [ /\\\\ding\\{94\\}/g, '\\u273E' ],\n\t [ /\\\\ding\\{95\\}/g, '\\u273F' ],\n\t [ /\\\\ding\\{96\\}/g, '\\u2740' ],\n\t [ /\\\\ding\\{97\\}/g, '\\u2741' ],\n\t [ /\\\\ding\\{98\\}/g, '\\u2742' ],\n\t [ /\\\\ding\\{99\\}/g, '\\u2743' ],\n\t [ /\\\\ding\\{100\\}/g, '\\u2744' ],\n\t [ /\\\\ding\\{101\\}/g, '\\u2745' ],\n\t [ /\\\\ding\\{102\\}/g, '\\u2746' ],\n\t [ /\\\\ding\\{103\\}/g, '\\u2747' ],\n\t [ /\\\\ding\\{104\\}/g, '\\u2748' ],\n\t [ /\\\\ding\\{105\\}/g, '\\u2749' ],\n\t [ /\\\\ding\\{106\\}/g, '\\u274A' ],\n\t [ /\\\\ding\\{107\\}/g, '\\u274B' ],\n\t [ /\\\\ding\\{109\\}/g, '\\u274D' ],\n\t [ /\\\\ding\\{111\\}/g, '\\u274F' ],\n\t [ /\\\\ding\\{112\\}/g, '\\u2750' ],\n\t [ /\\\\ding\\{113\\}/g, '\\u2751' ],\n\t [ /\\\\ding\\{114\\}/g, '\\u2752' ],\n\t [ /\\\\ding\\{118\\}/g, '\\u2756' ],\n\t [ /\\\\ding\\{120\\}/g, '\\u2758' ],\n\t [ /\\\\ding\\{121\\}/g, '\\u2759' ],\n\t [ /\\\\ding\\{122\\}/g, '\\u275A' ],\n\t [ /\\\\ding\\{123\\}/g, '\\u275B' ],\n\t [ /\\\\ding\\{124\\}/g, '\\u275C' ],\n\t [ /\\\\ding\\{125\\}/g, '\\u275D' ],\n\t [ /\\\\ding\\{126\\}/g, '\\u275E' ],\n\t [ /\\\\ding\\{161\\}/g, '\\u2761' ],\n\t [ /\\\\ding\\{162\\}/g, '\\u2762' ],\n\t [ /\\\\ding\\{163\\}/g, '\\u2763' ],\n\t [ /\\\\ding\\{164\\}/g, '\\u2764' ],\n\t [ /\\\\ding\\{165\\}/g, '\\u2765' ],\n\t [ /\\\\ding\\{166\\}/g, '\\u2766' ],\n\t [ /\\\\ding\\{167\\}/g, '\\u2767' ],\n\t [ /\\\\ding\\{182\\}/g, '\\u2776' ],\n\t [ /\\\\ding\\{183\\}/g, '\\u2777' ],\n\t [ /\\\\ding\\{184\\}/g, '\\u2778' ],\n\t [ /\\\\ding\\{185\\}/g, '\\u2779' ],\n\t [ /\\\\ding\\{186\\}/g, '\\u277A' ],\n\t [ /\\\\ding\\{187\\}/g, '\\u277B' ],\n\t [ /\\\\ding\\{188\\}/g, '\\u277C' ],\n\t [ /\\\\ding\\{189\\}/g, '\\u277D' ],\n\t [ /\\\\ding\\{190\\}/g, '\\u277E' ],\n\t [ /\\\\ding\\{191\\}/g, '\\u277F' ],\n\t [ /\\\\ding\\{192\\}/g, '\\u2780' ],\n\t [ /\\\\ding\\{193\\}/g, '\\u2781' ],\n\t [ /\\\\ding\\{194\\}/g, '\\u2782' ],\n\t [ /\\\\ding\\{195\\}/g, '\\u2783' ],\n\t [ /\\\\ding\\{196\\}/g, '\\u2784' ],\n\t [ /\\\\ding\\{197\\}/g, '\\u2785' ],\n\t [ /\\\\ding\\{198\\}/g, '\\u2786' ],\n\t [ /\\\\ding\\{199\\}/g, '\\u2787' ],\n\t [ /\\\\ding\\{200\\}/g, '\\u2788' ],\n\t [ /\\\\ding\\{201\\}/g, '\\u2789' ],\n\t [ /\\\\ding\\{202\\}/g, '\\u278A' ],\n\t [ /\\\\ding\\{203\\}/g, '\\u278B' ],\n\t [ /\\\\ding\\{204\\}/g, '\\u278C' ],\n\t [ /\\\\ding\\{205\\}/g, '\\u278D' ],\n\t [ /\\\\ding\\{206\\}/g, '\\u278E' ],\n\t [ /\\\\ding\\{207\\}/g, '\\u278F' ],\n\t [ /\\\\ding\\{208\\}/g, '\\u2790' ],\n\t [ /\\\\ding\\{209\\}/g, '\\u2791' ],\n\t [ /\\\\ding\\{210\\}/g, '\\u2792' ],\n\t [ /\\\\ding\\{211\\}/g, '\\u2793' ],\n\t [ /\\\\ding\\{212\\}/g, '\\u2794' ],\n\t [ /\\\\ding\\{216\\}/g, '\\u2798' ],\n\t [ /\\\\ding\\{217\\}/g, '\\u2799' ],\n\t [ /\\\\ding\\{218\\}/g, '\\u279A' ],\n\t [ /\\\\ding\\{219\\}/g, '\\u279B' ],\n\t [ /\\\\ding\\{220\\}/g, '\\u279C' ],\n\t [ /\\\\ding\\{221\\}/g, '\\u279D' ],\n\t [ /\\\\ding\\{222\\}/g, '\\u279E' ],\n\t [ /\\\\ding\\{223\\}/g, '\\u279F' ],\n\t [ /\\\\ding\\{224\\}/g, '\\u27A0' ],\n\t [ /\\\\ding\\{225\\}/g, '\\u27A1' ],\n\t [ /\\\\ding\\{226\\}/g, '\\u27A2' ],\n\t [ /\\\\ding\\{227\\}/g, '\\u27A3' ],\n\t [ /\\\\ding\\{228\\}/g, '\\u27A4' ],\n\t [ /\\\\ding\\{229\\}/g, '\\u27A5' ],\n\t [ /\\\\ding\\{230\\}/g, '\\u27A6' ],\n\t [ /\\\\ding\\{231\\}/g, '\\u27A7' ],\n\t [ /\\\\ding\\{232\\}/g, '\\u27A8' ],\n\t [ /\\\\ding\\{233\\}/g, '\\u27A9' ],\n\t [ /\\\\ding\\{234\\}/g, '\\u27AA' ],\n\t [ /\\\\ding\\{235\\}/g, '\\u27AB' ],\n\t [ /\\\\ding\\{236\\}/g, '\\u27AC' ],\n\t [ /\\\\ding\\{237\\}/g, '\\u27AD' ],\n\t [ /\\\\ding\\{238\\}/g, '\\u27AE' ],\n\t [ /\\\\ding\\{239\\}/g, '\\u27AF' ],\n\t [ /\\\\ding\\{241\\}/g, '\\u27B1' ],\n\t [ /\\\\ding\\{242\\}/g, '\\u27B2' ],\n\t [ /\\\\ding\\{243\\}/g, '\\u27B3' ],\n\t [ /\\\\ding\\{244\\}/g, '\\u27B4' ],\n\t [ /\\\\ding\\{245\\}/g, '\\u27B5' ],\n\t [ /\\\\ding\\{246\\}/g, '\\u27B6' ],\n\t [ /\\\\ding\\{247\\}/g, '\\u27B7' ],\n\t [ /\\\\ding\\{248\\}/g, '\\u27B8' ],\n\t [ /\\\\ding\\{249\\}/g, '\\u27B9' ],\n\t [ /\\\\ding\\{250\\}/g, '\\u27BA' ],\n\t [ /\\\\ding\\{251\\}/g, '\\u27BB' ],\n\t [ /\\\\ding\\{252\\}/g, '\\u27BC' ],\n\t [ /\\\\ding\\{253\\}/g, '\\u27BD' ],\n\t [ /\\\\ding\\{254\\}/g, '\\u27BE' ],\n\t [ /\\\\longleftarrow /g, '\\u27F5' ],\n\t [ /\\\\longrightarrow /g, '\\u27F6' ],\n\t [ /\\\\longleftrightarrow /g, '\\u27F7' ],\n\t [ /\\\\Longleftarrow /g, '\\u27F8' ],\n\t [ /\\\\Longrightarrow /g, '\\u27F9' ],\n\t [ /\\\\Longleftrightarrow /g, '\\u27FA' ],\n\t [ /\\\\longmapsto /g, '\\u27FC' ],\n\t [ /\\\\sim\\\\joinrel\\\\leadsto/g, '\\u27FF' ],\n\t [ /\\\\ElsevierGlyph\\{E212\\}/g, '\\u2905' ],\n\t [ /\\\\UpArrowBar /g, '\\u2912' ],\n\t [ /\\\\DownArrowBar /g, '\\u2913' ],\n\t [ /\\\\ElsevierGlyph\\{E20C\\}/g, '\\u2923' ],\n\t [ /\\\\ElsevierGlyph\\{E20D\\}/g, '\\u2924' ],\n\t [ /\\\\ElsevierGlyph\\{E20B\\}/g, '\\u2925' ],\n\t [ /\\\\ElsevierGlyph\\{E20A\\}/g, '\\u2926' ],\n\t [ /\\\\ElsevierGlyph\\{E211\\}/g, '\\u2927' ],\n\t [ /\\\\ElsevierGlyph\\{E20E\\}/g, '\\u2928' ],\n\t [ /\\\\ElsevierGlyph\\{E20F\\}/g, '\\u2929' ],\n\t [ /\\\\ElsevierGlyph\\{E210\\}/g, '\\u292A' ],\n\t [ /\\\\ElsevierGlyph\\{E21C\\}/g, '\\u2933' ],\n\t [ /\\\\ElsevierGlyph\\{E21D\\}/g, '\\u2933-00338' ],\n\t [ /\\\\ElsevierGlyph\\{E21A\\}/g, '\\u2936' ],\n\t [ /\\\\ElsevierGlyph\\{E219\\}/g, '\\u2937' ],\n\t [ /\\\\Elolarr /g, '\\u2940' ],\n\t [ /\\\\Elorarr /g, '\\u2941' ],\n\t [ /\\\\ElzRlarr /g, '\\u2942' ],\n\t [ /\\\\ElzrLarr /g, '\\u2944' ],\n\t [ /\\\\Elzrarrx /g, '\\u2947' ],\n\t [ /\\\\LeftRightVector /g, '\\u294E' ],\n\t [ /\\\\RightUpDownVector /g, '\\u294F' ],\n\t [ /\\\\DownLeftRightVector /g, '\\u2950' ],\n\t [ /\\\\LeftUpDownVector /g, '\\u2951' ],\n\t [ /\\\\LeftVectorBar /g, '\\u2952' ],\n\t [ /\\\\RightVectorBar /g, '\\u2953' ],\n\t [ /\\\\RightUpVectorBar /g, '\\u2954' ],\n\t [ /\\\\RightDownVectorBar /g, '\\u2955' ],\n\t [ /\\\\DownLeftVectorBar /g, '\\u2956' ],\n\t [ /\\\\DownRightVectorBar /g, '\\u2957' ],\n\t [ /\\\\LeftUpVectorBar /g, '\\u2958' ],\n\t [ /\\\\LeftDownVectorBar /g, '\\u2959' ],\n\t [ /\\\\LeftTeeVector /g, '\\u295A' ],\n\t [ /\\\\RightTeeVector /g, '\\u295B' ],\n\t [ /\\\\RightUpTeeVector /g, '\\u295C' ],\n\t [ /\\\\RightDownTeeVector /g, '\\u295D' ],\n\t [ /\\\\DownLeftTeeVector /g, '\\u295E' ],\n\t [ /\\\\DownRightTeeVector /g, '\\u295F' ],\n\t [ /\\\\LeftUpTeeVector /g, '\\u2960' ],\n\t [ /\\\\LeftDownTeeVector /g, '\\u2961' ],\n\t [ /\\\\UpEquilibrium /g, '\\u296E' ],\n\t [ /\\\\ReverseUpEquilibrium /g, '\\u296F' ],\n\t [ /\\\\RoundImplies /g, '\\u2970' ],\n\t [ /\\\\ElsevierGlyph\\{E214\\}/g, '\\u297C' ],\n\t [ /\\\\ElsevierGlyph\\{E215\\}/g, '\\u297D' ],\n\t [ /\\\\Elztfnc /g, '\\u2980' ],\n\t [ /\\\\ElsevierGlyph\\{3018\\}/g, '\\u2985' ],\n\t [ /\\\\Elroang /g, '\\u2986' ],\n\t [ /\\\\ElsevierGlyph\\{E291\\}/g, '\\u2994' ],\n\t [ /\\\\Elzddfnc /g, '\\u2999' ],\n\t [ /\\\\Angle /g, '\\u299C' ],\n\t [ /\\\\Elzlpargt /g, '\\u29A0' ],\n\t [ /\\\\ElsevierGlyph\\{E260\\}/g, '\\u29B5' ],\n\t [ /\\\\ElsevierGlyph\\{E61B\\}/g, '\\u29B6' ],\n\t [ /\\\\ElzLap /g, '\\u29CA' ],\n\t [ /\\\\Elzdefas /g, '\\u29CB' ],\n\t [ /\\\\LeftTriangleBar /g, '\\u29CF' ],\n\t [ /\\\\NotLeftTriangleBar /g, '\\u29CF-00338' ],\n\t [ /\\\\RightTriangleBar /g, '\\u29D0' ],\n\t [ /\\\\NotRightTriangleBar /g, '\\u29D0-00338' ],\n\t [ /\\\\ElsevierGlyph\\{E372\\}/g, '\\u29DC' ],\n\t [ /\\\\blacklozenge /g, '\\u29EB' ],\n\t [ /\\\\RuleDelayed /g, '\\u29F4' ],\n\t [ /\\\\Elxuplus /g, '\\u2A04' ],\n\t [ /\\\\ElzThr /g, '\\u2A05' ],\n\t [ /\\\\Elxsqcup /g, '\\u2A06' ],\n\t [ /\\\\ElzInf /g, '\\u2A07' ],\n\t [ /\\\\ElzSup /g, '\\u2A08' ],\n\t [ /\\\\ElzCint /g, '\\u2A0D' ],\n\t [ /\\\\clockoint /g, '\\u2A0F' ],\n\t [ /\\\\ElsevierGlyph\\{E395\\}/g, '\\u2A10' ],\n\t [ /\\\\sqrint /g, '\\u2A16' ],\n\t [ /\\\\ElsevierGlyph\\{E25A\\}/g, '\\u2A25' ],\n\t [ /\\\\ElsevierGlyph\\{E25B\\}/g, '\\u2A2A' ],\n\t [ /\\\\ElsevierGlyph\\{E25C\\}/g, '\\u2A2D' ],\n\t [ /\\\\ElsevierGlyph\\{E25D\\}/g, '\\u2A2E' ],\n\t [ /\\\\ElzTimes /g, '\\u2A2F' ],\n\t [ /\\\\ElsevierGlyph\\{E25E\\}/g, '\\u2A34' ],\n\t [ /\\\\ElsevierGlyph\\{E25E\\}/g, '\\u2A35' ],\n\t [ /\\\\ElsevierGlyph\\{E259\\}/g, '\\u2A3C' ],\n\t [ /\\\\amalg /g, '\\u2A3F' ],\n\t [ /\\\\ElzAnd /g, '\\u2A53' ],\n\t [ /\\\\ElzOr /g, '\\u2A54' ],\n\t [ /\\\\ElsevierGlyph\\{E36E\\}/g, '\\u2A55' ],\n\t [ /\\\\ElOr /g, '\\u2A56' ],\n\t [ /\\\\perspcorrespond /g, '\\u2A5E' ],\n\t [ /\\\\Elzminhat /g, '\\u2A5F' ],\n\t [ /\\\\ElsevierGlyph\\{225A\\}/g, '\\u2A63' ],\n\t [ /\\\\stackrel\\{*\\}\\{=\\}/g, '\\u2A6E' ],\n\t [ /\\\\Equal /g, '\\u2A75' ],\n\t [ /\\\\leqslant /g, '\\u2A7D' ],\n\t [ /\\\\nleqslant /g, '\\u2A7D-00338' ],\n\t [ /\\\\geqslant /g, '\\u2A7E' ],\n\t [ /\\\\ngeqslant /g, '\\u2A7E-00338' ],\n\t [ /\\\\lessapprox /g, '\\u2A85' ],\n\t [ /\\\\gtrapprox /g, '\\u2A86' ],\n\t [ /\\\\lneq /g, '\\u2A87' ],\n\t [ /\\\\gneq /g, '\\u2A88' ],\n\t [ /\\\\lnapprox /g, '\\u2A89' ],\n\t [ /\\\\gnapprox /g, '\\u2A8A' ],\n\t [ /\\\\lesseqqgtr /g, '\\u2A8B' ],\n\t [ /\\\\gtreqqless /g, '\\u2A8C' ],\n\t [ /\\\\eqslantless /g, '\\u2A95' ],\n\t [ /\\\\eqslantgtr /g, '\\u2A96' ],\n\t [ /\\\\Pisymbol\\{ppi020\\}\\{117\\}/g, '\\u2A9D' ],\n\t [ /\\\\Pisymbol\\{ppi020\\}\\{105\\}/g, '\\u2A9E' ],\n\t [ /\\\\NestedLessLess /g, '\\u2AA1' ],\n\t [ /\\\\NotNestedLessLess /g, '\\u2AA1-00338' ],\n\t [ /\\\\NestedGreaterGreater /g, '\\u2AA2' ],\n\t [ /\\\\NotNestedGreaterGreater /g, '\\u2AA2-00338' ],\n\t [ /\\\\preceq /g, '\\u2AAF' ],\n\t [ /\\\\not\\\\preceq /g, '\\u2AAF-00338' ],\n\t [ /\\\\succeq /g, '\\u2AB0' ],\n\t [ /\\\\not\\\\succeq /g, '\\u2AB0-00338' ],\n\t [ /\\\\precneqq /g, '\\u2AB5' ],\n\t [ /\\\\succneqq /g, '\\u2AB6' ],\n\t [ /\\\\precapprox /g, '\\u2AB7' ],\n\t [ /\\\\succapprox /g, '\\u2AB8' ],\n\t [ /\\\\precnapprox /g, '\\u2AB9' ],\n\t [ /\\\\succnapprox /g, '\\u2ABA' ],\n\t [ /\\\\subseteqq /g, '\\u2AC5' ],\n\t [ /\\\\nsubseteqq /g, '\\u2AC5-00338' ],\n\t [ /\\\\supseteqq /g, '\\u2AC6' ],\n\t [ /\\\\nsupseteqq/g, '\\u2AC6-00338' ],\n\t [ /\\\\subsetneqq /g, '\\u2ACB' ],\n\t [ /\\\\supsetneqq /g, '\\u2ACC' ],\n\t [ /\\\\ElsevierGlyph\\{E30D\\}/g, '\\u2AEB' ],\n\t [ /\\\\Elztdcol /g, '\\u2AF6' ],\n\t [ /\\\\ElsevierGlyph\\{300A\\}/g, '\\u300A' ],\n\t [ /\\\\ElsevierGlyph\\{300B\\}/g, '\\u300B' ],\n\t [ /\\\\ElsevierGlyph\\{3018\\}/g, '\\u3018' ],\n\t [ /\\\\ElsevierGlyph\\{3019\\}/g, '\\u3019' ],\n\t [ /\\\\openbracketleft /g, '\\u301A' ],\n\t [ /\\\\openbracketright /g, '\\u301B' ]\n\t ]\n\t\n\t return this;\n\t} // end function BibtexParser\n\t\n\tif (typeof module !== 'undefined' && module.exports) {\n\t module.exports = BibtexParser;\n\t}\n\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(6),\n\t __webpack_require__(21),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( baseMVC, citationModel, _l ){\n\t\n\tvar CitationView = Backbone.View.extend({\n\t tagName: 'div',\n\t className: 'citations',\n\t render: function() {\n\t this.$el.append( \"

    \" + this.formattedReference() + \"

    \" );\n\t return this;\n\t },\n\t formattedReference: function() {\n\t var model = this.model;\n\t var entryType = model.entryType();\n\t var fields = model.fields();\n\t\n\t var ref = \"\";\n\t // Code inspired by...\n\t // https://github.com/vkaravir/bib-publication-list/blob/master/src/bib-publication-list.js\n\t var authorsAndYear = this._asSentence( (fields.author ? fields.author : \"\") + (fields.year ? (\" (\" + fields.year + \")\") : \"\") ) + \" \";\n\t var title = fields.title || \"\";\n\t var pages = fields.pages ? (\"pp. \" + fields.pages) : \"\";\n\t var address = fields.address;\n\t if( entryType == \"article\" ) {\n\t var volume = (fields.volume ? fields.volume : \"\") +\n\t (fields.number ? ( \" (\" + fields.number + \")\" ) : \"\") +\n\t (pages ? \", \" + pages : \"\");\n\t ref = authorsAndYear + this._asSentence(title) +\n\t (fields.journal ? (\"In \" + fields.journal + \", \") : \"\") +\n\t this._asSentence(volume) + \n\t this._asSentence(fields.address) +\n\t \"<\\/em>\";\n\t } else if( entryType == \"inproceedings\" || entryType == \"proceedings\" ) {\n\t ref = authorsAndYear + \n\t this._asSentence(title) + \n\t (fields.booktitle ? (\"In \" + fields.booktitle + \", \") : \"\") +\n\t (pages ? pages : \"\") +\n\t (address ? \", \" + address : \"\") + \n\t \".<\\/em>\";\n\t } else if( entryType == \"mastersthesis\" || entryType == \"phdthesis\" ) {\n\t ref = authorsAndYear + this._asSentence(title) +\n\t (fields.howpublished ? fields.howpublished + \". \" : \"\") +\n\t (fields.note ? fields.note + \".\" : \"\");\n\t } else if( entryType == \"techreport\" ) {\n\t ref = authorsAndYear + this._asSentence(title) +\n\t this._asSentence(fields.institution) +\n\t this._asSentence(fields.number) +\n\t this._asSentence(fields.type);\n\t } else if( entryType == \"book\" || entryType == \"inbook\" || entryType == \"incollection\" ) {\n\t ref = authorsAndYear + \" \" + this._formatBookInfo(fields);\n\t } else {\n\t ref = authorsAndYear + \" \" + this._asSentence(title) +\n\t this._asSentence(fields.howpublished) +\n\t this._asSentence(fields.note);\n\t }\n\t var doiUrl = \"\";\n\t if( fields.doi ) {\n\t doiUrl = 'http://dx.doi.org/' + fields.doi;\n\t ref += '[doi:' + fields.doi + \"]\";\n\t }\n\t var url = fields.url || doiUrl;\n\t if( url ) {\n\t ref += '[Link]';\n\t }\n\t return ref;\n\t },\n\t _formatBookInfo: function(fields) {\n\t var info = \"\";\n\t if( fields.chapter ) {\n\t info += fields.chapter + \" in \";\n\t }\n\t if( fields.title ) {\n\t info += \"\" + fields.title + \"<\\/em>\";\n\t }\n\t if( fields.editor ) {\n\t info += \", Edited by \" + fields.editor + \", \";\n\t }\n\t if( fields.publisher) {\n\t info += \", \" + fields.publisher;\n\t }\n\t if( fields.pages ) {\n\t info += \", pp. \" + fields.pages + \"\";\n\t }\n\t if( fields.series ) {\n\t info += \", \" + fields.series + \"<\\/em>\";\n\t }\n\t if( fields.volume ) {\n\t info += \", Vol.\" + fields.volume;\n\t }\n\t if( fields.issn ) {\n\t info += \", ISBN: \" + fields.issn;\n\t }\n\t return info + \".\";\n\t },\n\t _asSentence: function(str) {\n\t return (str && str.trim()) ? str + \". \" : \"\";\n\t }\n\t});\n\t\n\tvar CitationListView = Backbone.View.extend({\n\t el: '#citations',\n\t /**\n\t * Set up view.\n\t */\n\t initialize: function() {\n\t this.listenTo( this.collection, 'add', this.renderCitation );\n\t },\n\t\n\t events: {\n\t 'click .citations-to-bibtex': 'showBibtex',\n\t 'click .citations-to-formatted': 'showFormatted'\n\t },\n\t\n\t renderCitation: function( citation ) {\n\t var citationView = new CitationView( { model: citation } );\n\t this.$(\".citations-formatted\").append( citationView.render().el );\n\t var rawTextarea = this.$(\".citations-bibtex-text\");\n\t rawTextarea.val( rawTextarea.val() + \"\\n\\r\" + citation.attributes.content );\n\t },\n\t\n\t render: function() {\n\t this.$el.html(this.citationsElement());\n\t this.collection.each(function( item ){\n\t this.renderCitation( item );\n\t }, this);\n\t this.showFormatted();\n\t },\n\t\n\t showBibtex: function() {\n\t this.$(\".citations-to-formatted\").show();\n\t this.$(\".citations-to-bibtex\").hide();\n\t this.$(\".citations-bibtex\").show();\n\t this.$(\".citations-formatted\").hide();\n\t this.$(\".citations-bibtex-text\").select();\n\t },\n\t\n\t showFormatted: function() {\n\t this.$(\".citations-to-formatted\").hide();\n\t this.$(\".citations-to-bibtex\").show();\n\t this.$(\".citations-bibtex\").hide();\n\t this.$(\".citations-formatted\").show();\n\t },\n\t\n\t partialWarningElement: function() {\n\t if( this.collection.partial ) {\n\t return [\n\t '
    ',\n\t 'Warning: This is a experimental feature. Most Galaxy tools will not annotate',\n\t ' citations explicitly at this time. When writing up your analysis, please manually',\n\t ' review your histories and find all references',\n\t ' that should be cited in order to completely describe your work. Also, please remember to',\n\t ' cite Galaxy.',\n\t '
    ',\n\t ].join('');\n\t } else {\n\t return '';\n\t }\n\t },\n\t\n\t citationsElement: function() {\n\t return [\n\t '
    ',\n\t '
    ',\n\t _l(\"Citations\"),\n\t ' ',\n\t ' ',\n\t '
    ',\n\t '
    ',\n\t this.partialWarningElement(),\n\t '',\n\t '
    ',\n\t '
    ',\n\t '',\n\t '
    ',\n\t '
    '\n\t ].join( '' );\n\t }\n\t});\n\t\n\t//==============================================================================\n\treturn {\n\t CitationView : CitationView,\n\t CitationListView : CitationListView\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, $, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(48),\n\t __webpack_require__(37),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_ITEM, DATASET_LI, BASE_MVC, _l ){\n\t/* global Backbone */\n\t//==============================================================================\n\tvar FoldoutListItemView = LIST_ITEM.FoldoutListItemView,\n\t ListItemView = LIST_ITEM.ListItemView;\n\t/** @class Read only view for DatasetCollection.\n\t */\n\tvar DCListItemView = FoldoutListItemView.extend(\n\t/** @lends DCListItemView.prototype */{\n\t//TODO: may not be needed\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : FoldoutListItemView.prototype.className + \" dataset-collection\",\n\t id : function(){\n\t return [ 'dataset_collection', this.model.get( 'id' ) ].join( '-' );\n\t },\n\t\n\t /** override to add linkTarget */\n\t initialize : function( attributes ){\n\t this.linkTarget = attributes.linkTarget || '_blank';\n\t this.hasUser = attributes.hasUser;\n\t FoldoutListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t /** event listeners */\n\t _setUpListeners : function(){\n\t FoldoutListItemView.prototype._setUpListeners.call( this );\n\t // re-rendering on deletion\n\t this.model.on( 'change', function( model, options ){\n\t if( _.isEqual( _.keys( model.changed ), [ 'deleted' ] ) ){\n\t this.render();\n\t }\n\t }, this );\n\t },\n\t\n\t // ......................................................................... rendering\n\t //TODO:?? possibly move to listItem\n\t /** render a subtitle to show the user what sort of collection this is */\n\t _renderSubtitle : function(){\n\t var $subtitle = $( '
    ' );\n\t //TODO: would be good to get this in the subtitle\n\t //var len = this.model.elements.length;\n\t switch( this.model.get( 'collection_type' ) ){\n\t case 'list':\n\t return $subtitle.text( _l( 'a list of datasets' ) );\n\t case 'paired':\n\t return $subtitle.text( _l( 'a pair of datasets' ) );\n\t case 'list:paired':\n\t return $subtitle.text( _l( 'a list of paired datasets' ) );\n\t }\n\t return $subtitle;\n\t },\n\t\n\t // ......................................................................... foldout\n\t /** override to add linktarget to sub-panel */\n\t _getFoldoutPanelOptions : function(){\n\t var options = FoldoutListItemView.prototype._getFoldoutPanelOptions.call( this );\n\t return _.extend( options, {\n\t linkTarget : this.linkTarget,\n\t hasUser : this.hasUser\n\t });\n\t },\n\t\n\t /** override to not catch sub-panel selectors */\n\t $selector : function(){\n\t return this.$( '> .selector' );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DCListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDCListItemView.prototype.templates = (function(){\n\t\n\t var warnings = _.extend( {}, FoldoutListItemView.prototype.templates.warnings, {\n\t error : BASE_MVC.wrapTemplate([\n\t // error during index fetch - show error on dataset\n\t '<% if( model.error ){ %>',\n\t '
    ',\n\t _l( 'There was an error getting the data for this collection' ), ': <%- model.error %>',\n\t '
    ',\n\t '<% } %>'\n\t ]),\n\t purged : BASE_MVC.wrapTemplate([\n\t '<% if( model.purged ){ %>',\n\t '
    ',\n\t _l( 'This collection has been deleted and removed from disk' ),\n\t '
    ',\n\t '<% } %>'\n\t ]),\n\t deleted : BASE_MVC.wrapTemplate([\n\t // deleted not purged\n\t '<% if( model.deleted && !model.purged ){ %>',\n\t '
    ',\n\t _l( 'This collection has been deleted' ),\n\t '
    ',\n\t '<% } %>'\n\t ])\n\t });\n\t\n\t // use element identifier\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t '
    ',\n\t '<%- collection.element_identifier || collection.name %>',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ], 'collection' );\n\t\n\t return _.extend( {}, FoldoutListItemView.prototype.templates, {\n\t warnings : warnings,\n\t titleBar : titleBarTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** @class Read only view for DatasetCollectionElement.\n\t */\n\tvar DCEListItemView = ListItemView.extend(\n\t/** @lends DCEListItemView.prototype */{\n\t//TODO: this might be expendable - compacted with HDAListItemView\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** add the DCE class to the list item */\n\t className : ListItemView.prototype.className + \" dataset-collection-element\",\n\t\n\t /** set up */\n\t initialize : function( attributes ){\n\t if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n\t this.log( 'DCEListItemView.initialize:', attributes );\n\t ListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DCEListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDCEListItemView.prototype.templates = (function(){\n\t\n\t // use the element identifier here - since that will persist and the user will need it\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t '
    ',\n\t '<%- element.element_identifier %>',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ], 'element' );\n\t\n\t return _.extend( {}, ListItemView.prototype.templates, {\n\t titleBar : titleBarTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** @class Read only view for a DatasetCollectionElement that is also an DatasetAssociation\n\t * (a dataset contained in a dataset collection).\n\t */\n\tvar DatasetDCEListItemView = DATASET_LI.DatasetListItemView.extend(\n\t/** @lends DatasetDCEListItemView.prototype */{\n\t\n\t className : DATASET_LI.DatasetListItemView.prototype.className + \" dataset-collection-element\",\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** set up */\n\t initialize : function( attributes ){\n\t if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n\t this.log( 'DatasetDCEListItemView.initialize:', attributes );\n\t DATASET_LI.DatasetListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t /** In this override, only get details if in the ready state.\n\t * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n\t */\n\t _fetchModelDetails : function(){\n\t var view = this;\n\t if( view.model.inReadyState() && !view.model.hasDetails() ){\n\t return view.model.fetch({ silent: true });\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DatasetDCEListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDatasetDCEListItemView.prototype.templates = (function(){\n\t\n\t // use the element identifier here and not the dataset name\n\t //TODO:?? can we steal the DCE titlebar?\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t '',\n\t '
    ',\n\t '<%- element.element_identifier %>',\n\t '
    ',\n\t '
    '\n\t ], 'element' );\n\t\n\t return _.extend( {}, DATASET_LI.DatasetListItemView.prototype.templates, {\n\t titleBar : titleBarTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** @class Read only view for a DatasetCollectionElement that is also a DatasetCollection\n\t * (a nested DC).\n\t */\n\tvar NestedDCDCEListItemView = DCListItemView.extend(\n\t/** @lends NestedDCDCEListItemView.prototype */{\n\t\n\t className : DCListItemView.prototype.className + \" dataset-collection-element\",\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t // comment this out to suppress log output\n\t //logger : console,\n\t\n\t /** In this override, add the state as a class for use with state-based CSS */\n\t _swapNewRender : function( $newRender ){\n\t DCListItemView.prototype._swapNewRender.call( this, $newRender );\n\t//TODO: model currently has no state\n\t var state = this.model.get( 'state' ) || 'ok';\n\t //if( this.model.has( 'state' ) ){\n\t this.$el.addClass( 'state-' + state );\n\t //}\n\t return this.$el;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'NestedDCDCEListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t DCListItemView : DCListItemView,\n\t DCEListItemView : DCEListItemView,\n\t DatasetDCEListItemView : DatasetDCEListItemView,\n\t NestedDCDCEListItemView : NestedDCDCEListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, Backbone, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(95),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DATASET_MODEL, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t//==============================================================================\n\t/*\n\tNotes:\n\t\n\tTerminology:\n\t DatasetCollection/DC : a container of datasets or nested DatasetCollections\n\t Element/DatasetCollectionElement/DCE : an item contained in a DatasetCollection\n\t HistoryDatasetCollectionAssociation/HDCA: a DatasetCollection contained in a history\n\t\n\t\n\tThis all seems too complex unfortunately:\n\t\n\t- Terminology collision between DatasetCollections (DCs) and Backbone Collections.\n\t- In the DatasetCollections API JSON, DC Elements use a 'Has A' stucture to *contain*\n\t either a dataset or a nested DC. This would make the hierarchy much taller. I've\n\t decided to merge the contained JSON with the DC element json - making the 'has a'\n\t relation into an 'is a' relation. This seems simpler to me and allowed a lot of\n\t DRY in both models and views, but may make tracking or tracing within these models\n\t more difficult (since DatasetCollectionElements are now *also* DatasetAssociations\n\t or DatasetCollections (nested)). This also violates the rule of thumb about\n\t favoring aggregation over inheritance.\n\t- Currently, there are three DatasetCollection subclasses: List, Pair, and ListPaired.\n\t These each should a) be usable on their own, b) be usable in the context of\n\t nesting within a collection model (at least in the case of ListPaired), and\n\t c) be usable within the context of other container models (like History or\n\t LibraryFolder, etc.). I've tried to separate/extract classes in order to\n\t handle those three situations, but it's proven difficult to do in a simple,\n\t readable manner.\n\t- Ideally, histories and libraries would inherit from the same server models as\n\t dataset collections do since they are (in essence) dataset collections themselves -\n\t making the whole nested structure simpler. This would be a large, error-prone\n\t refactoring and migration.\n\t\n\tMany of the classes and heirarchy are meant as extension points so, while the\n\trelations and flow may be difficult to understand initially, they'll allow us to\n\thandle the growth or flux dataset collection in the future (w/o actually implementing\n\tany YAGNI).\n\t\n\t*/\n\t//_________________________________________________________________________________________________ ELEMENTS\n\t/** @class mixin for Dataset collection elements.\n\t * When collection elements are passed from the API, the underlying element is\n\t * in a sub-object 'object' (IOW, a DCE representing an HDA will have HDA json in element.object).\n\t * This mixin uses the constructor and parse methods to merge that JSON with the DCE attribtues\n\t * effectively changing a DCE from a container to a subclass (has a --> is a).\n\t */\n\tvar DatasetCollectionElementMixin = {\n\t\n\t /** default attributes used by elements in a dataset collection */\n\t defaults : {\n\t model_class : 'DatasetCollectionElement',\n\t element_identifier : null,\n\t element_index : null,\n\t element_type : null\n\t },\n\t\n\t /** merge the attributes of the sub-object 'object' into this model */\n\t _mergeObject : function( attributes ){\n\t // if we don't preserve and correct ids here, the element id becomes the object id\n\t // and collision in backbone's _byId will occur and only\n\t _.extend( attributes, attributes.object, { element_id: attributes.id });\n\t delete attributes.object;\n\t return attributes;\n\t },\n\t\n\t /** override to merge this.object into this */\n\t constructor : function( attributes, options ){\n\t // console.debug( '\\t DatasetCollectionElement.constructor:', attributes, options );\n\t attributes = this._mergeObject( attributes );\n\t this.idAttribute = 'element_id';\n\t Backbone.Model.apply( this, arguments );\n\t },\n\t\n\t /** when the model is fetched, merge this.object into this */\n\t parse : function( response, options ){\n\t var attributes = response;\n\t attributes = this._mergeObject( attributes );\n\t return attributes;\n\t }\n\t};\n\t\n\t//TODO: unused?\n\t/** @class Concrete class of Generic DatasetCollectionElement */\n\tvar DatasetCollectionElement = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( DatasetCollectionElementMixin )\n\t .extend({ _logNamespace : logNamespace });\n\t\n\t\n\t//==============================================================================\n\t/** @class Base/Abstract Backbone collection for Generic DCEs. */\n\tvar DCECollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(\n\t/** @lends DCECollection.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t model: DatasetCollectionElement,\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t//TODO: unused?\n\t /** Set up.\n\t * @see Backbone.Collection#initialize\n\t */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(DCECollection).initialize:', attributes, options );\n\t options = options || {};\n\t //this._setUpListeners();\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'DatasetCollectionElementCollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for a dataset collection element that is a dataset (HDA).\n\t */\n\tvar DatasetDCE = DATASET_MODEL.DatasetAssociation.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n\t/** @lends DatasetDCE.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** url fn */\n\t url : function(){\n\t // won't always be an hda\n\t if( !this.has( 'history_id' ) ){\n\t console.warn( 'no endpoint for non-hdas within a collection yet' );\n\t // (a little silly since this api endpoint *also* points at hdas)\n\t return Galaxy.root + 'api/datasets';\n\t }\n\t return Galaxy.root + 'api/histories/' + this.get( 'history_id' ) + '/contents/' + this.get( 'id' );\n\t },\n\t\n\t defaults : _.extend( {},\n\t DATASET_MODEL.DatasetAssociation.prototype.defaults,\n\t DatasetCollectionElementMixin.defaults\n\t ),\n\t\n\t // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n\t // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n\t // - re-apply manually for now\n\t /** call the mixin constructor */\n\t constructor : function( attributes, options ){\n\t this.debug( '\\t DatasetDCE.constructor:', attributes, options );\n\t //DATASET_MODEL.DatasetAssociation.prototype.constructor.call( this, attributes, options );\n\t DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n\t },\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(DatasetDCE).initialize:', attributes, options );\n\t DATASET_MODEL.DatasetAssociation.prototype.initialize.call( this, attributes, options );\n\t },\n\t\n\t /** Does this model already contain detailed data (as opposed to just summary level data)? */\n\t hasDetails : function(){\n\t // dataset collection api does return genome_build but doesn't return annotation\n\t return _.has( this.attributes, 'annotation' );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t var objStr = this.get( 'element_identifier' );\n\t return ([ 'DatasetDCE(', objStr, ')' ].join( '' ));\n\t }\n\t}));\n\t\n\t\n\t//==============================================================================\n\t/** @class DCECollection of DatasetDCE's (a list of datasets, a pair of datasets).\n\t */\n\tvar DatasetDCECollection = DCECollection.extend(\n\t/** @lends DatasetDCECollection.prototype */{\n\t model: DatasetDCE,\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(DatasetDCECollection).initialize:', attributes, options );\n\t DCECollection.prototype.initialize.call( this, attributes, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'DatasetDCECollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//_________________________________________________________________________________________________ COLLECTIONS\n\t/** @class Backbone model for Dataset Collections.\n\t * The DC API returns an array of JSON objects under the attribute elements.\n\t * This model:\n\t * - removes that array/attribute ('elements') from the model,\n\t * - creates a bbone collection (of the class defined in the 'collectionClass' attribute),\n\t * - passes that json onto the bbone collection\n\t * - caches the bbone collection in this.elements\n\t */\n\tvar DatasetCollection = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( BASE_MVC.SearchableModelMixin )\n\t .extend(/** @lends DatasetCollection.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** default attributes for a model */\n\t defaults : {\n\t /* 'list', 'paired', or 'list:paired' */\n\t collection_type : null,\n\t //??\n\t deleted : false\n\t },\n\t\n\t /** Which class to use for elements */\n\t collectionClass : DCECollection,\n\t\n\t /** set up: create elements instance var and (on changes to elements) update them */\n\t initialize : function( model, options ){\n\t this.debug( this + '(DatasetCollection).initialize:', model, options, this );\n\t //historyContent.HistoryContent.prototype.initialize.call( this, attrs, options );\n\t this.elements = this._createElementsModel();\n\t this.on( 'change:elements', function(){\n\t this.log( 'change:elements' );\n\t//TODO: prob. better to update the collection instead of re-creating it\n\t this.elements = this._createElementsModel();\n\t });\n\t },\n\t\n\t /** move elements model attribute to full collection */\n\t _createElementsModel : function(){\n\t this.debug( this + '._createElementsModel', this.collectionClass, this.get( 'elements' ), this.elements );\n\t//TODO: same patterns as DatasetCollectionElement _createObjectModel - refactor to BASE_MVC.hasSubModel?\n\t var elements = this.get( 'elements' ) || [];\n\t this.unset( 'elements', { silent: true });\n\t this.elements = new this.collectionClass( elements );\n\t //this.debug( 'collectionClass:', this.collectionClass + '', this.elements );\n\t return this.elements;\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** pass the elements back within the model json when this is serialized */\n\t toJSON : function(){\n\t var json = Backbone.Model.prototype.toJSON.call( this );\n\t if( this.elements ){\n\t json.elements = this.elements.toJSON();\n\t }\n\t return json;\n\t },\n\t\n\t /** Is this collection in a 'ready' state no processing (for the collection) is left\n\t * to do on the server.\n\t */\n\t inReadyState : function(){\n\t var populated = this.get( 'populated' );\n\t return ( this.isDeletedOrPurged() || populated );\n\t },\n\t\n\t //TODO:?? the following are the same interface as DatasetAssociation - can we combine?\n\t /** Does the DC contain any elements yet? Is a fetch() required? */\n\t hasDetails : function(){\n\t//TODO: this is incorrect for (accidentally) empty collections\n\t this.debug( 'hasDetails:', this.elements.length );\n\t return this.elements.length !== 0;\n\t },\n\t\n\t /** Given the filters, what models in this.elements would be returned? */\n\t getVisibleContents : function( filters ){\n\t // filters unused for now\n\t return this.elements;\n\t },\n\t\n\t // ........................................................................ ajax\n\t /** save this dataset, _Mark_ing it as deleted (just a flag) */\n\t 'delete' : function( options ){\n\t if( this.get( 'deleted' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: true }, options );\n\t },\n\t /** save this dataset, _Mark_ing it as undeleted */\n\t undelete : function( options ){\n\t if( !this.get( 'deleted' ) || this.get( 'purged' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: false }, options );\n\t },\n\t\n\t /** Is this collection deleted or purged? */\n\t isDeletedOrPurged : function(){\n\t return ( this.get( 'deleted' ) || this.get( 'purged' ) );\n\t },\n\t\n\t // ........................................................................ searchable\n\t /** searchable attributes for collections */\n\t searchAttributes : [\n\t 'name'\n\t ],\n\t\n\t // ........................................................................ misc\n\t /** String representation */\n\t toString : function(){\n\t var idAndName = [ this.get( 'id' ), this.get( 'name' ) || this.get( 'element_identifier' ) ];\n\t return 'DatasetCollection(' + ( idAndName.join(',') ) + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** Model for a DatasetCollection containing datasets (non-nested).\n\t */\n\tvar ListDatasetCollection = DatasetCollection.extend(\n\t/** @lends ListDatasetCollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** override since we know the collection will only contain datasets */\n\t collectionClass : DatasetDCECollection,\n\t\n\t//TODO: unused?\n\t initialize : function( attrs, options ){\n\t this.debug( this + '(ListDatasetCollection).initialize:', attrs, options );\n\t DatasetCollection.prototype.initialize.call( this, attrs, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'ListDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** Model for a DatasetCollection containing fwd/rev datasets (a list of 2).\n\t */\n\tvar PairDatasetCollection = ListDatasetCollection.extend(\n\t/** @lends PairDatasetCollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t//TODO: unused?\n\t /** */\n\t initialize : function( attrs, options ){\n\t this.debug( this + '(PairDatasetCollection).initialize:', attrs, options );\n\t ListDatasetCollection.prototype.initialize.call( this, attrs, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'PairDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//_________________________________________________________________________________________________ NESTED COLLECTIONS\n\t// this is where things get weird, man. Weird.\n\t//TODO: it might be possible to compact all the following...I think.\n\t//==============================================================================\n\t/** @class Backbone model for a Generic DatasetCollectionElement that is also a DatasetCollection\n\t * (a nested collection). Currently only list:paired.\n\t */\n\tvar NestedDCDCE = DatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n\t/** @lends NestedDCDCE.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n\t // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n\t // - re-apply manually it now\n\t /** call the mixin constructor */\n\t constructor : function( attributes, options ){\n\t this.debug( '\\t NestedDCDCE.constructor:', attributes, options );\n\t DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );\n\t return ([ 'NestedDCDCE(', objStr, ')' ].join( '' ));\n\t }\n\t}));\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone collection containing Generic NestedDCDCE's (nested dataset collections).\n\t */\n\tvar NestedDCDCECollection = DCECollection.extend(\n\t/** @lends NestedDCDCECollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** This is a collection of nested collections */\n\t model: NestedDCDCE,\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attrs, options ){\n\t this.debug( this + '(NestedDCDCECollection).initialize:', attrs, options );\n\t DCECollection.prototype.initialize.call( this, attrs, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'NestedDCDCECollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for a paired dataset collection within a list:paired dataset collection.\n\t */\n\tvar NestedPairDCDCE = PairDatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n\t/** @lends NestedPairDCDCE.prototype */{\n\t//TODO:?? possibly rename to NestedDatasetCollection?\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n\t // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n\t // - re-apply manually it now\n\t /** This is both a collection and a collection element - call the constructor */\n\t constructor : function( attributes, options ){\n\t this.debug( '\\t NestedPairDCDCE.constructor:', attributes, options );\n\t //DatasetCollection.constructor.call( this, attributes, options );\n\t DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );\n\t return ([ 'NestedPairDCDCE(', objStr, ')' ].join( '' ));\n\t }\n\t}));\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone collection for a backbone collection containing paired dataset collections.\n\t */\n\tvar NestedPairDCDCECollection = NestedDCDCECollection.extend(\n\t/** @lends PairDCDCECollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** We know this collection is composed of only nested pair collections */\n\t model: NestedPairDCDCE,\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attrs, options ){\n\t this.debug( this + '(NestedPairDCDCECollection).initialize:', attrs, options );\n\t NestedDCDCECollection.prototype.initialize.call( this, attrs, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'NestedPairDCDCECollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone Model for a DatasetCollection (list) that contains DatasetCollections (pairs).\n\t */\n\tvar ListPairedDatasetCollection = DatasetCollection.extend(\n\t/** @lends ListPairedDatasetCollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** list:paired is the only collection that itself contains collections */\n\t collectionClass : NestedPairDCDCECollection,\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(ListPairedDatasetCollection).initialize:', attributes, options );\n\t DatasetCollection.prototype.initialize.call( this, attributes, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'ListPairedDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t ListDatasetCollection : ListDatasetCollection,\n\t PairDatasetCollection : PairDatasetCollection,\n\t ListPairedDatasetCollection : ListPairedDatasetCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $, jQuery) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(45),\n\t __webpack_require__(15),\n\t __webpack_require__(6),\n\t __webpack_require__(10),\n\t __webpack_require__(110),\n\t __webpack_require__(5),\n\t __webpack_require__(107)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HDCA, STATES, BASE_MVC, UI_MODAL, naturalSort, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t/*==============================================================================\n\tTODO:\n\t use proper Element model and not just json\n\t straighten out createFn, collection.createHDCA\n\t possibly stop using modals for this\n\t It would be neat to do a drag and drop\n\t\n\t==============================================================================*/\n\t/** A view for both DatasetDCEs and NestedDCDCEs\n\t * (things that implement collection-model:DatasetCollectionElementMixin)\n\t */\n\tvar DatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t//TODO: use proper class (DatasetDCE or NestedDCDCE (or the union of both))\n\t tagName : 'li',\n\t className : 'collection-element',\n\t\n\t initialize : function( attributes ){\n\t this.element = attributes.element || {};\n\t this.selected = attributes.selected || false;\n\t },\n\t\n\t render : function(){\n\t this.$el\n\t .attr( 'data-element-id', this.element.id )\n\t .attr( 'draggable', true )\n\t .html( this.template({ element: this.element }) );\n\t if( this.selected ){\n\t this.$el.addClass( 'selected' );\n\t }\n\t return this;\n\t },\n\t\n\t //TODO: lots of unused space in the element - possibly load details and display them horiz.\n\t template : _.template([\n\t '',\n\t '<%- element.name %>',\n\t '',\n\t '',\n\t ].join('')),\n\t\n\t /** select this element and pub */\n\t select : function( toggle ){\n\t this.$el.toggleClass( 'selected', toggle );\n\t this.trigger( 'select', {\n\t source : this,\n\t selected : this.$el.hasClass( 'selected' )\n\t });\n\t },\n\t\n\t /** animate the removal of this element and pub */\n\t discard : function(){\n\t var view = this,\n\t parentWidth = this.$el.parent().width();\n\t this.$el.animate({ 'margin-right' : parentWidth }, 'fast', function(){\n\t view.trigger( 'discard', {\n\t source : view\n\t });\n\t view.destroy();\n\t });\n\t },\n\t\n\t /** remove the DOM and any listeners */\n\t destroy : function(){\n\t this.off();\n\t this.$el.remove();\n\t },\n\t\n\t events : {\n\t 'click' : '_click',\n\t 'click .name' : '_clickName',\n\t 'click .discard': '_clickDiscard',\n\t\n\t 'dragstart' : '_dragstart',\n\t 'dragend' : '_dragend',\n\t 'dragover' : '_sendToParent',\n\t 'drop' : '_sendToParent'\n\t },\n\t\n\t /** select when the li is clicked */\n\t _click : function( ev ){\n\t ev.stopPropagation();\n\t this.select( ev );\n\t },\n\t\n\t /** rename a pair when the name is clicked */\n\t _clickName : function( ev ){\n\t ev.stopPropagation();\n\t ev.preventDefault();\n\t var promptString = [ _l( 'Enter a new name for the element' ), ':\\n(',\n\t _l( 'Note that changing the name here will not rename the dataset' ), ')' ].join( '' ),\n\t response = prompt( _l( 'Enter a new name for the element' ) + ':', this.element.name );\n\t if( response ){\n\t this.element.name = response;\n\t this.render();\n\t }\n\t //TODO: cancelling with ESC leads to closure of the creator...\n\t },\n\t\n\t /** discard when the discard button is clicked */\n\t _clickDiscard : function( ev ){\n\t ev.stopPropagation();\n\t this.discard();\n\t },\n\t\n\t /** dragging pairs for re-ordering */\n\t _dragstart : function( ev ){\n\t if( ev.originalEvent ){ ev = ev.originalEvent; }\n\t ev.dataTransfer.effectAllowed = 'move';\n\t ev.dataTransfer.setData( 'text/plain', JSON.stringify( this.element ) );\n\t\n\t this.$el.addClass( 'dragging' );\n\t this.$el.parent().trigger( 'collection-element.dragstart', [ this ] );\n\t },\n\t\n\t /** dragging for re-ordering */\n\t _dragend : function( ev ){\n\t this.$el.removeClass( 'dragging' );\n\t this.$el.parent().trigger( 'collection-element.dragend', [ this ] );\n\t },\n\t\n\t /** manually bubble up an event to the parent/container */\n\t _sendToParent : function( ev ){\n\t this.$el.parent().trigger( ev );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){\n\t return 'DatasetCollectionElementView()';\n\t }\n\t});\n\t\n\t\n\t// ============================================================================\n\t/** An interface for building collections.\n\t */\n\tvar ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t /** the class used to display individual elements */\n\t elementViewClass : DatasetCollectionElementView,\n\t /** the class this creator will create and save */\n\t collectionClass : HDCA.HistoryListDatasetCollection,\n\t className : 'list-collection-creator collection-creator flex-row-container',\n\t\n\t /** minimum number of valid elements to start with in order to build a collection of this type */\n\t minElements : 1,\n\t\n\t defaultAttributes : {\n\t//TODO: remove - use new collectionClass().save()\n\t /** takes elements and creates the proper collection - returns a promise */\n\t creationFn : function(){ throw new TypeError( 'no creation fn for creator' ); },\n\t /** fn to call when the collection is created (scoped to this) */\n\t oncreate : function(){},\n\t /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n\t oncancel : function(){},\n\t /** distance from list edge to begin autoscrolling list */\n\t autoscrollDist : 24,\n\t /** Color passed to hoverhighlight */\n\t highlightClr : 'rgba( 64, 255, 255, 1.0 )'\n\t },\n\t\n\t /** set up initial options, instance vars, behaviors */\n\t initialize : function( attributes ){\n\t this.metric( 'ListCollectionCreator.initialize', attributes );\n\t var creator = this;\n\t _.each( this.defaultAttributes, function( value, key ){\n\t value = attributes[ key ] || value;\n\t creator[ key ] = value;\n\t });\n\t\n\t /** unordered, original list - cache to allow reversal */\n\t creator.initialElements = attributes.elements || [];\n\t\n\t this._instanceSetUp();\n\t this._elementsSetUp();\n\t this._setUpBehaviors();\n\t },\n\t\n\t /** set up instance vars */\n\t _instanceSetUp : function(){\n\t /** Ids of elements that have been selected by the user - to preserve over renders */\n\t this.selectedIds = {};\n\t /** DOM elements currently being dragged */\n\t this.$dragging = null;\n\t /** Used for blocking UI events during ajax/operations (don't post twice) */\n\t this.blocking = false;\n\t },\n\t\n\t // ------------------------------------------------------------------------ process raw list\n\t /** set up main data */\n\t _elementsSetUp : function(){\n\t //this.debug( '-- _dataSetUp' );\n\t /** a list of invalid elements and the reasons they aren't valid */\n\t this.invalidElements = [];\n\t//TODO: handle fundamental problem of syncing DOM, views, and list here\n\t /** data for list in progress */\n\t this.workingElements = [];\n\t /** views for workingElements */\n\t this.elementViews = [];\n\t\n\t // copy initial list, sort, add ids if needed\n\t this.workingElements = this.initialElements.slice( 0 );\n\t this._ensureElementIds();\n\t this._validateElements();\n\t this._mangleDuplicateNames();\n\t this._sortElements();\n\t },\n\t\n\t /** add ids to dataset objs in initial list if none */\n\t _ensureElementIds : function(){\n\t this.workingElements.forEach( function( element ){\n\t if( !element.hasOwnProperty( 'id' ) ){\n\t element.id = _.uniqueId();\n\t }\n\t });\n\t return this.workingElements;\n\t },\n\t\n\t /** separate working list into valid and invalid elements for this collection */\n\t _validateElements : function(){\n\t var creator = this,\n\t existingNames = {};\n\t creator.invalidElements = [];\n\t\n\t this.workingElements = this.workingElements.filter( function( element ){\n\t var problem = creator._isElementInvalid( element );\n\t if( problem ){\n\t creator.invalidElements.push({\n\t element : element,\n\t text : problem\n\t });\n\t }\n\t return !problem;\n\t });\n\t return this.workingElements;\n\t },\n\t\n\t /** describe what is wrong with a particular element if anything */\n\t _isElementInvalid : function( element ){\n\t if( element.history_content_type !== 'dataset' ){\n\t return _l( \"is not a dataset\" );\n\t }\n\t if( element.state !== STATES.OK ){\n\t if( _.contains( STATES.NOT_READY_STATES, element.state ) ){\n\t return _l( \"hasn't finished running yet\" );\n\t }\n\t return _l( \"has errored, is paused, or is not accessible\" );\n\t }\n\t if( element.deleted || element.purged ){\n\t return _l( \"has been deleted or purged\" );\n\t }\n\t return null;\n\t },\n\t\n\t /** mangle duplicate names using a mac-like '(counter)' addition to any duplicates */\n\t _mangleDuplicateNames : function(){\n\t var SAFETY = 900,\n\t counter = 1,\n\t existingNames = {};\n\t this.workingElements.forEach( function( element ){\n\t var currName = element.name;\n\t while( existingNames.hasOwnProperty( currName ) ){\n\t currName = element.name + ' (' + counter + ')';\n\t counter += 1;\n\t if( counter >= SAFETY ){\n\t throw new Error( 'Safety hit in while loop - thats impressive' );\n\t }\n\t }\n\t element.name = currName;\n\t existingNames[ element.name ] = true;\n\t });\n\t },\n\t\n\t /** sort a list of elements */\n\t _sortElements : function( list ){\n\t // // currently only natural sort by name\n\t // this.workingElements.sort( function( a, b ){ return naturalSort( a.name, b.name ); });\n\t // return this.workingElements;\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering\n\t // templates : ListCollectionCreator.templates,\n\t /** render the entire interface */\n\t render : function( speed, callback ){\n\t //this.debug( '-- _render' );\n\t if( this.workingElements.length < this.minElements ){\n\t return this._renderInvalid( speed, callback );\n\t }\n\t\n\t this.$el.empty().html( this.templates.main() );\n\t this._renderHeader( speed );\n\t this._renderMiddle( speed );\n\t this._renderFooter( speed );\n\t this._addPluginComponents();\n\t this.$( '.collection-name' ).focus();\n\t this.trigger( 'rendered', this );\n\t return this;\n\t },\n\t\n\t\n\t /** render a simplified interface aimed at telling the user why they can't move forward */\n\t _renderInvalid : function( speed, callback ){\n\t //this.debug( '-- _render' );\n\t this.$el.empty().html( this.templates.invalidInitial({\n\t problems: this.invalidElements,\n\t elements: this.workingElements,\n\t }));\n\t if( typeof this.oncancel === 'function' ){\n\t this.$( '.cancel-create.btn' ).show();\n\t }\n\t this.trigger( 'rendered', this );\n\t return this;\n\t },\n\t\n\t /** render the header section */\n\t _renderHeader : function( speed, callback ){\n\t var $header = this.$( '.header' ).empty().html( this.templates.header() )\n\t .find( '.help-content' ).prepend( $( this.templates.helpContent() ) );\n\t //TODO: should only show once despite calling _renderHeader again\n\t if( this.invalidElements.length ){\n\t this._invalidElementsAlert();\n\t }\n\t return $header;\n\t },\n\t\n\t /** render the middle including the elements */\n\t _renderMiddle : function( speed, callback ){\n\t var $middle = this.$( '.middle' ).empty().html( this.templates.middle() );\n\t this._renderList( speed );\n\t return $middle;\n\t },\n\t\n\t /** render the footer, completion controls, and cancel controls */\n\t _renderFooter : function( speed, callback ){\n\t var $footer = this.$( '.footer' ).empty().html( this.templates.footer() );\n\t if( typeof this.oncancel === 'function' ){\n\t this.$( '.cancel-create.btn' ).show();\n\t }\n\t return $footer;\n\t },\n\t\n\t /** add any jQuery/bootstrap/custom plugins to elements rendered */\n\t _addPluginComponents : function(){\n\t this.$( '.help-content i' ).hoverhighlight( '.collection-creator', this.highlightClr );\n\t },\n\t\n\t /** build and show an alert describing any elements that could not be included due to problems */\n\t _invalidElementsAlert : function(){\n\t this._showAlert( this.templates.invalidElements({ problems: this.invalidElements }), 'alert-warning' );\n\t },\n\t\n\t /** add (or clear if clear is truthy) a validation warning to the DOM element described in what */\n\t _validationWarning : function( what, clear ){\n\t var VALIDATION_CLASS = 'validation-warning';\n\t if( what === 'name' ){\n\t what = this.$( '.collection-name' ).add( this.$( '.collection-name-prompt' ) );\n\t this.$( '.collection-name' ).focus().select();\n\t }\n\t if( clear ){\n\t what = what || this.$( '.' + VALIDATION_CLASS );\n\t what.removeClass( VALIDATION_CLASS );\n\t } else {\n\t what.addClass( VALIDATION_CLASS );\n\t }\n\t },\n\t\n\t _disableNameAndCreate : function( disable ){\n\t disable = !_.isUndefined( disable )? disable : true;\n\t if( disable ){\n\t this.$( '.collection-name' ).prop( 'disabled', true );\n\t this.$( '.create-collection' ).toggleClass( 'disabled', true );\n\t // } else {\n\t // this.$( '.collection-name' ).prop( 'disabled', false );\n\t // this.$( '.create-collection' ).removeClass( 'disable' );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering elements\n\t /** conv. to the main list display DOM */\n\t $list : function(){\n\t return this.$( '.collection-elements' );\n\t },\n\t\n\t /** show or hide the clear selected control based on the num of selected elements */\n\t _renderClearSelected : function(){\n\t if( _.size( this.selectedIds ) ){\n\t this.$( '.collection-elements-controls > .clear-selected' ).show();\n\t } else {\n\t this.$( '.collection-elements-controls > .clear-selected' ).hide();\n\t }\n\t },\n\t\n\t /** render the elements in order (or a warning if no elements found) */\n\t _renderList : function( speed, callback ){\n\t //this.debug( '-- _renderList' );\n\t var creator = this,\n\t $tmp = jQuery( '
    ' ),\n\t $list = creator.$list();\n\t\n\t _.each( this.elementViews, function( view ){\n\t view.destroy();\n\t creator.removeElementView( view );\n\t });\n\t\n\t // if( !this.workingElements.length ){\n\t // this._renderNoValidElements();\n\t // return;\n\t // }\n\t\n\t creator.workingElements.forEach( function( element ){\n\t var elementView = creator._createElementView( element );\n\t $tmp.append( elementView.$el );\n\t });\n\t\n\t creator._renderClearSelected();\n\t $list.empty().append( $tmp.children() );\n\t _.invoke( creator.elementViews, 'render' );\n\t\n\t if( $list.height() > $list.css( 'max-height' ) ){\n\t $list.css( 'border-width', '1px 0px 1px 0px' );\n\t } else {\n\t $list.css( 'border-width', '0px' );\n\t }\n\t },\n\t\n\t /** create an element view, cache in elementViews, set up listeners, and return */\n\t _createElementView : function( element ){\n\t var elementView = new this.elementViewClass({\n\t//TODO: use non-generic class or not all\n\t // model : COLLECTION.DatasetDCE( element )\n\t element : element,\n\t selected: _.has( this.selectedIds, element.id )\n\t });\n\t this.elementViews.push( elementView );\n\t this._listenToElementView( elementView );\n\t return elementView;\n\t },\n\t\n\t /** listen to any element events */\n\t _listenToElementView : function( view ){\n\t var creator = this;\n\t creator.listenTo( view, {\n\t select : function( data ){\n\t var element = data.source.element;\n\t if( data.selected ){\n\t creator.selectedIds[ element.id ] = true;\n\t } else {\n\t delete creator.selectedIds[ element.id ];\n\t }\n\t creator.trigger( 'elements:select', data );\n\t },\n\t discard : function( data ){\n\t creator.trigger( 'elements:discard', data );\n\t }\n\t });\n\t },\n\t\n\t /** add a new element view based on the json in element */\n\t addElementView : function( element ){\n\t//TODO: workingElements is sorted, add element in appropo index\n\t // add element, sort elements, find element index\n\t // var view = this._createElementView( element );\n\t // return view;\n\t },\n\t\n\t /** stop listening to view and remove from caches */\n\t removeElementView : function( view ){\n\t delete this.selectedIds[ view.element.id ];\n\t this._renderClearSelected();\n\t\n\t this.elementViews = _.without( this.elementViews, view );\n\t this.stopListening( view );\n\t },\n\t\n\t /** render a message in the list that no elements remain to create a collection */\n\t _renderNoElementsLeft : function(){\n\t this._disableNameAndCreate( true );\n\t this.$( '.collection-elements' ).append( this.templates.noElementsLeft() );\n\t },\n\t\n\t // /** render a message in the list that no valid elements were found to create a collection */\n\t // _renderNoValidElements : function(){\n\t // this._disableNameAndCreate( true );\n\t // this.$( '.collection-elements' ).append( this.templates.noValidElements() );\n\t // },\n\t\n\t // ------------------------------------------------------------------------ API\n\t /** convert element into JSON compatible with the collections API */\n\t _elementToJSON : function( element ){\n\t // return element.toJSON();\n\t return element;\n\t },\n\t\n\t /** create the collection via the API\n\t * @returns {jQuery.xhr Object} the jquery ajax request\n\t */\n\t createList : function( name ){\n\t if( !this.workingElements.length ){\n\t var message = _l( 'No valid elements for final list' ) + '. ';\n\t message += '' + _l( 'Cancel' ) + ' ';\n\t message += _l( 'or' );\n\t message += ' ' + _l( 'start over' ) + '.';\n\t this._showAlert( message );\n\t return;\n\t }\n\t\n\t var creator = this,\n\t elements = this.workingElements.map( function( element ){\n\t return creator._elementToJSON( element );\n\t });\n\t\n\t creator.blocking = true;\n\t return creator.creationFn( elements, name )\n\t .always( function(){\n\t creator.blocking = false;\n\t })\n\t .fail( function( xhr, status, message ){\n\t creator.trigger( 'error', {\n\t xhr : xhr,\n\t status : status,\n\t message : _l( 'An error occurred while creating this collection' )\n\t });\n\t })\n\t .done( function( response, message, xhr ){\n\t creator.trigger( 'collection:created', response, message, xhr );\n\t creator.metric( 'collection:created', response );\n\t if( typeof creator.oncreate === 'function' ){\n\t creator.oncreate.call( this, response, message, xhr );\n\t }\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ events\n\t /** set up event handlers on self */\n\t _setUpBehaviors : function(){\n\t this.on( 'error', this._errorHandler );\n\t\n\t this.once( 'rendered', function(){\n\t this.trigger( 'rendered:initial', this );\n\t });\n\t\n\t this.on( 'elements:select', function( data ){\n\t this._renderClearSelected();\n\t });\n\t\n\t this.on( 'elements:discard', function( data ){\n\t var element = data.source.element;\n\t this.removeElementView( data.source );\n\t\n\t this.workingElements = _.without( this.workingElements, element );\n\t if( !this.workingElements.length ){\n\t this._renderNoElementsLeft();\n\t }\n\t });\n\t\n\t //this.on( 'all', function(){\n\t // this.info( arguments );\n\t //});\n\t return this;\n\t },\n\t\n\t /** handle errors with feedback and details to the user (if available) */\n\t _errorHandler : function( data ){\n\t this.error( data );\n\t\n\t var creator = this;\n\t content = data.message || _l( 'An error occurred' );\n\t if( data.xhr ){\n\t var xhr = data.xhr,\n\t message = data.message;\n\t if( xhr.readyState === 0 && xhr.status === 0 ){\n\t content += ': ' + _l( 'Galaxy could not be reached and may be updating.' ) +\n\t _l( ' Try again in a few minutes.' );\n\t } else if( xhr.responseJSON ){\n\t content += ':
    ' + JSON.stringify( xhr.responseJSON ) + '
    ';\n\t } else {\n\t content += ': ' + message;\n\t }\n\t }\n\t creator._showAlert( content, 'alert-danger' );\n\t },\n\t\n\t events : {\n\t // header\n\t 'click .more-help' : '_clickMoreHelp',\n\t 'click .less-help' : '_clickLessHelp',\n\t 'click .main-help' : '_toggleHelp',\n\t 'click .header .alert button' : '_hideAlert',\n\t\n\t 'click .reset' : 'reset',\n\t 'click .clear-selected' : 'clearSelectedElements',\n\t\n\t // elements - selection\n\t 'click .collection-elements' : 'clearSelectedElements',\n\t\n\t // elements - drop target\n\t // 'dragenter .collection-elements': '_dragenterElements',\n\t // 'dragleave .collection-elements': '_dragleaveElements',\n\t 'dragover .collection-elements' : '_dragoverElements',\n\t 'drop .collection-elements' : '_dropElements',\n\t\n\t // these bubble up from the elements as custom events\n\t 'collection-element.dragstart .collection-elements' : '_elementDragstart',\n\t 'collection-element.dragend .collection-elements' : '_elementDragend',\n\t\n\t // footer\n\t 'change .collection-name' : '_changeName',\n\t 'keydown .collection-name' : '_nameCheckForEnter',\n\t 'click .cancel-create' : function( ev ){\n\t if( typeof this.oncancel === 'function' ){\n\t this.oncancel.call( this );\n\t }\n\t },\n\t 'click .create-collection' : '_clickCreate'//,\n\t },\n\t\n\t // ........................................................................ header\n\t /** expand help */\n\t _clickMoreHelp : function( ev ){\n\t ev.stopPropagation();\n\t this.$( '.main-help' ).addClass( 'expanded' );\n\t this.$( '.more-help' ).hide();\n\t },\n\t /** collapse help */\n\t _clickLessHelp : function( ev ){\n\t ev.stopPropagation();\n\t this.$( '.main-help' ).removeClass( 'expanded' );\n\t this.$( '.more-help' ).show();\n\t },\n\t /** toggle help */\n\t _toggleHelp : function( ev ){\n\t ev.stopPropagation();\n\t this.$( '.main-help' ).toggleClass( 'expanded' );\n\t this.$( '.more-help' ).toggle();\n\t },\n\t\n\t /** show an alert on the top of the interface containing message (alertClass is bootstrap's alert-*) */\n\t _showAlert : function( message, alertClass ){\n\t alertClass = alertClass || 'alert-danger';\n\t this.$( '.main-help' ).hide();\n\t this.$( '.header .alert' )\n\t .attr( 'class', 'alert alert-dismissable' ).addClass( alertClass ).show()\n\t .find( '.alert-message' ).html( message );\n\t },\n\t /** hide the alerts at the top */\n\t _hideAlert : function( message ){\n\t this.$( '.main-help' ).show();\n\t this.$( '.header .alert' ).hide();\n\t },\n\t\n\t // ........................................................................ elements\n\t /** reset all data to the initial state */\n\t reset : function(){\n\t this._instanceSetUp();\n\t this._elementsSetUp();\n\t this.render();\n\t },\n\t\n\t /** deselect all elements */\n\t clearSelectedElements : function( ev ){\n\t this.$( '.collection-elements .collection-element' ).removeClass( 'selected' );\n\t this.$( '.collection-elements-controls > .clear-selected' ).hide();\n\t },\n\t\n\t //_dragenterElements : function( ev ){\n\t // //this.debug( '_dragenterElements:', ev );\n\t //},\n\t//TODO: if selected are dragged out of the list area - remove the placeholder - cuz it won't work anyway\n\t // _dragleaveElements : function( ev ){\n\t // //this.debug( '_dragleaveElements:', ev );\n\t // },\n\t\n\t /** track the mouse drag over the list adding a placeholder to show where the drop would occur */\n\t _dragoverElements : function( ev ){\n\t //this.debug( '_dragoverElements:', ev );\n\t ev.preventDefault();\n\t\n\t var $list = this.$list();\n\t this._checkForAutoscroll( $list, ev.originalEvent.clientY );\n\t var $nearest = this._getNearestElement( ev.originalEvent.clientY );\n\t\n\t //TODO: no need to re-create - move instead\n\t this.$( '.element-drop-placeholder' ).remove();\n\t var $placeholder = $( '
    ' );\n\t if( !$nearest.size() ){\n\t $list.append( $placeholder );\n\t } else {\n\t $nearest.before( $placeholder );\n\t }\n\t },\n\t\n\t /** If the mouse is near enough to the list's top or bottom, scroll the list */\n\t _checkForAutoscroll : function( $element, y ){\n\t var AUTOSCROLL_SPEED = 2,\n\t offset = $element.offset(),\n\t scrollTop = $element.scrollTop(),\n\t upperDist = y - offset.top,\n\t lowerDist = ( offset.top + $element.outerHeight() ) - y;\n\t if( upperDist >= 0 && upperDist < this.autoscrollDist ){\n\t $element.scrollTop( scrollTop - AUTOSCROLL_SPEED );\n\t } else if( lowerDist >= 0 && lowerDist < this.autoscrollDist ){\n\t $element.scrollTop( scrollTop + AUTOSCROLL_SPEED );\n\t }\n\t },\n\t\n\t /** get the nearest element based on the mouse's Y coordinate.\n\t * If the y is at the end of the list, return an empty jQuery object.\n\t */\n\t _getNearestElement : function( y ){\n\t var WIGGLE = 4,\n\t lis = this.$( '.collection-elements li.collection-element' ).toArray();\n\t for( var i=0; i y && top - halfHeight < y ){\n\t return $li;\n\t }\n\t }\n\t return $();\n\t },\n\t\n\t /** drop (dragged/selected elements) onto the list, re-ordering the internal list */\n\t _dropElements : function( ev ){\n\t if( ev.originalEvent ){ ev = ev.originalEvent; }\n\t // both required for firefox\n\t ev.preventDefault();\n\t ev.dataTransfer.dropEffect = 'move';\n\t\n\t // insert before the nearest element or after the last.\n\t var $nearest = this._getNearestElement( ev.clientY );\n\t if( $nearest.size() ){\n\t this.$dragging.insertBefore( $nearest );\n\t } else {\n\t // no nearest before - insert after last element\n\t this.$dragging.insertAfter( this.$( '.collection-elements .collection-element' ).last() );\n\t }\n\t // resync the creator's list based on the new DOM order\n\t this._syncOrderToDom();\n\t return false;\n\t },\n\t\n\t /** resync the creator's list of elements based on the DOM order */\n\t _syncOrderToDom : function(){\n\t var creator = this,\n\t newElements = [];\n\t //TODO: doesn't seem wise to use the dom to store these - can't we sync another way?\n\t this.$( '.collection-elements .collection-element' ).each( function(){\n\t var id = $( this ).attr( 'data-element-id' ),\n\t element = _.findWhere( creator.workingElements, { id: id });\n\t if( element ){\n\t newElements.push( element );\n\t } else {\n\t console.error( 'missing element: ', id );\n\t }\n\t });\n\t this.workingElements = newElements;\n\t this._renderList();\n\t },\n\t\n\t /** drag communication with element sub-views: dragstart */\n\t _elementDragstart : function( ev, element ){\n\t // auto select the element causing the event and move all selected\n\t element.select( true );\n\t this.$dragging = this.$( '.collection-elements .collection-element.selected' );\n\t },\n\t\n\t /** drag communication with element sub-views: dragend - remove the placeholder */\n\t _elementDragend : function( ev, element ){\n\t $( '.element-drop-placeholder' ).remove();\n\t this.$dragging = null;\n\t },\n\t\n\t // ........................................................................ footer\n\t /** handle a collection name change */\n\t _changeName : function( ev ){\n\t this._validationWarning( 'name', !!this._getName() );\n\t },\n\t\n\t /** check for enter key press when in the collection name and submit */\n\t _nameCheckForEnter : function( ev ){\n\t if( ev.keyCode === 13 && !this.blocking ){\n\t this._clickCreate();\n\t }\n\t },\n\t\n\t /** get the current collection name */\n\t _getName : function(){\n\t return _.escape( this.$( '.collection-name' ).val() );\n\t },\n\t\n\t /** attempt to create the current collection */\n\t _clickCreate : function( ev ){\n\t var name = this._getName();\n\t if( !name ){\n\t this._validationWarning( 'name' );\n\t } else if( !this.blocking ){\n\t this.createList( name );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ templates\n\t //TODO: move to require text plugin and load these as text\n\t //TODO: underscore currently unnecc. bc no vars are used\n\t //TODO: better way of localizing text-nodes in long strings\n\t /** underscore template fns attached to class */\n\t templates : {\n\t /** the skeleton */\n\t main : _.template([\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ].join('')),\n\t\n\t /** the header (not including help text) */\n\t header : _.template([\n\t '
    ',\n\t '', _l( 'More help' ), '',\n\t '
    ',\n\t '', _l( 'Less' ), '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '',\n\t '',\n\t '
    ',\n\t ].join('')),\n\t\n\t /** the middle: element list */\n\t middle : _.template([\n\t '',\n\t '
    ',\n\t '
    '\n\t ].join('')),\n\t\n\t /** creation and cancel controls */\n\t footer : _.template([\n\t '
    ',\n\t '
    ',\n\t '',\n\t '
    ', _l( 'Name' ), ':
    ',\n\t '
    ',\n\t '
    ',\n\t\n\t '
    ',\n\t '
    ',\n\t '',\n\t '
    ',\n\t '',\n\t '',\n\t '
    ',\n\t '
    ',\n\t\n\t '
    ',\n\t '',\n\t '
    ',\n\t '
    '\n\t ].join('')),\n\t\n\t /** help content */\n\t helpContent : _.template([\n\t '

    ', _l([\n\t 'Collections of datasets are permanent, ordered lists of datasets that can be passed to tools and ',\n\t 'workflows in order to have analyses done on each member of the entire group. This interface allows ',\n\t 'you to create a collection and re-order the final collection.'\n\t ].join( '' )), '

    ',\n\t '
      ',\n\t '
    • ', _l([\n\t 'Rename elements in the list by clicking on ',\n\t 'the existing name.'\n\t ].join( '' )), '
    • ',\n\t '
    • ', _l([\n\t 'Discard elements from the final created list by clicking on the ',\n\t '\"Discard\" button.'\n\t ].join( '' )), '
    • ',\n\t '
    • ', _l([\n\t 'Reorder the list by clicking and dragging elements. Select multiple elements by clicking on ',\n\t 'them and you can then move those selected by dragging the ',\n\t 'entire group. Deselect them by clicking them again or by clicking the ',\n\t 'the \"Clear selected\" link.'\n\t ].join( '' )), '
    • ',\n\t '
    • ', _l([\n\t 'Click the \"Start over\" link to begin again as if you had just opened ',\n\t 'the interface.'\n\t ].join( '' )), '
    • ',\n\t '
    • ', _l([\n\t 'Click the \"Cancel\" button to exit the interface.'\n\t ].join( '' )), '
    • ',\n\t '

    ',\n\t '

    ', _l([\n\t 'Once your collection is complete, enter a name and ',\n\t 'click \"Create list\".'\n\t ].join( '' )), '

    '\n\t ].join('')),\n\t\n\t /** shown in list when all elements are discarded */\n\t invalidElements : _.template([\n\t _l( 'The following selections could not be included due to problems:' ),\n\t '
      <% _.each( problems, function( problem ){ %>',\n\t '
    • <%- problem.element.name %>: <%- problem.text %>
    • ',\n\t '<% }); %>
    '\n\t ].join('')),\n\t\n\t /** shown in list when all elements are discarded */\n\t noElementsLeft : _.template([\n\t '
  • ',\n\t _l( 'No elements left! ' ),\n\t _l( 'Would you like to ' ), '', _l( 'start over' ), '?',\n\t '
  • '\n\t ].join('')),\n\t\n\t /** a simplified page communicating what went wrong and why the user needs to reselect something else */\n\t invalidInitial : _.template([\n\t '
    ',\n\t '
    ',\n\t '',\n\t '<% if( _.size( problems ) ){ %>',\n\t _l( 'The following selections could not be included due to problems' ), ':',\n\t '
      <% _.each( problems, function( problem ){ %>',\n\t '
    • <%- problem.element.name %>: <%- problem.text %>
    • ',\n\t '<% }); %>
    ',\n\t '<% } else if( _.size( elements ) < 1 ){ %>',\n\t _l( 'No datasets were selected' ), '.',\n\t '<% } %>',\n\t '
    ',\n\t _l( 'At least one element is needed for the collection' ), '. ',\n\t _l( 'You may need to ' ),\n\t '', _l( 'cancel' ), ' ',\n\t _l( 'and reselect new elements' ), '.',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '',\n\t // _l( 'Create a different kind of collection' ),\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ].join('')),\n\t },\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** string rep */\n\t toString : function(){ return 'ListCollectionCreator'; }\n\t});\n\t\n\t\n\t\n\t//=============================================================================\n\t/** Create a modal and load its body with the given CreatorClass creator type\n\t * @returns {Deferred} resolved when creator has built a collection.\n\t */\n\tvar collectionCreatorModal = function _collectionCreatorModal( elements, options, CreatorClass ){\n\t\n\t var deferred = jQuery.Deferred(),\n\t modal = Galaxy.modal || ( new UI_MODAL.View() ),\n\t creator;\n\t\n\t options = _.defaults( options || {}, {\n\t elements : elements,\n\t oncancel : function(){\n\t modal.hide();\n\t deferred.reject( 'cancelled' );\n\t },\n\t oncreate : function( creator, response ){\n\t modal.hide();\n\t deferred.resolve( response );\n\t }\n\t });\n\t\n\t creator = new CreatorClass( options );\n\t modal.show({\n\t title : options.title || _l( 'Create a collection' ),\n\t body : creator.$el,\n\t width : '80%',\n\t height : '100%',\n\t closing_events: true\n\t });\n\t creator.render();\n\t window._collectionCreator = creator;\n\t\n\t //TODO: remove modal header\n\t return deferred;\n\t};\n\t\n\t/** List collection flavor of collectionCreatorModal. */\n\tvar listCollectionCreatorModal = function _listCollectionCreatorModal( elements, options ){\n\t options = options || {};\n\t options.title = _l( 'Create a collection from a list of datasets' );\n\t return collectionCreatorModal( elements, options, ListCollectionCreator );\n\t};\n\t\n\t\n\t//==============================================================================\n\t/** Use a modal to create a list collection, then add it to the given history contents.\n\t * @returns {Deferred} resolved when the collection is added to the history.\n\t */\n\tfunction createListCollection( contents ){\n\t var elements = contents.toJSON(),\n\t promise = listCollectionCreatorModal( elements, {\n\t creationFn : function( elements, name ){\n\t elements = elements.map( function( element ){\n\t return {\n\t id : element.id,\n\t name : element.name,\n\t //TODO: this allows for list:list even if the filter above does not - reconcile\n\t src : ( element.history_content_type === 'dataset'? 'hda' : 'hdca' )\n\t };\n\t });\n\t return contents.createHDCA( elements, 'list', name );\n\t }\n\t });\n\t return promise;\n\t}\n\t\n\t//==============================================================================\n\t return {\n\t DatasetCollectionElementView: DatasetCollectionElementView,\n\t ListCollectionCreator : ListCollectionCreator,\n\t\n\t collectionCreatorModal : collectionCreatorModal,\n\t listCollectionCreatorModal : listCollectionCreatorModal,\n\t createListCollection : createListCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery, Backbone, $, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(48),\n\t __webpack_require__(15),\n\t __webpack_require__(26),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_ITEM, STATES, faIconButton, BASE_MVC, _l ){\n\t/* global Backbone */\n\t\n\tvar logNamespace = 'dataset';\n\t/*==============================================================================\n\tTODO:\n\t straighten out state rendering and templates used\n\t inaccessible/STATES.NOT_VIEWABLE is a special case\n\t simplify button rendering\n\t\n\t==============================================================================*/\n\tvar _super = LIST_ITEM.ListItemView;\n\t/** @class Read only list view for either LDDAs, HDAs, or HDADCEs.\n\t * Roughly, any DatasetInstance (and not a raw Dataset).\n\t */\n\tvar DatasetListItemView = _super.extend(\n\t/** @lends DatasetListItemView.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t className : _super.prototype.className + \" dataset\",\n\t //TODO:?? doesn't exactly match an hda's type_id\n\t id : function(){\n\t return [ 'dataset', this.model.get( 'id' ) ].join( '-' );\n\t },\n\t\n\t /** Set up: instance vars, options, and event handlers */\n\t initialize : function( attributes ){\n\t if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n\t this.log( this + '.initialize:', attributes );\n\t _super.prototype.initialize.call( this, attributes );\n\t\n\t /** where should pages from links be displayed? (default to new tab/window) */\n\t this.linkTarget = attributes.linkTarget || '_blank';\n\t },\n\t\n\t /** event listeners */\n\t _setUpListeners : function(){\n\t _super.prototype._setUpListeners.call( this );\n\t\n\t // re-rendering on any model changes\n\t this.model.on( 'change', function( model, options ){\n\t // if the model moved into the ready state and is expanded without details, fetch those details now\n\t if( this.model.changedAttributes().state && this.model.inReadyState()\n\t && this.expanded && !this.model.hasDetails() ){\n\t // will render automatically (due to fetch -> change)\n\t this.model.fetch();\n\t\n\t } else {\n\t this.render();\n\t }\n\t }, this );\n\t },\n\t\n\t // ......................................................................... expandable\n\t /** In this override, only get details if in the ready state, get rerunnable if in other states.\n\t * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n\t */\n\t _fetchModelDetails : function(){\n\t var view = this;\n\t if( view.model.inReadyState() && !view.model.hasDetails() ){\n\t return view.model.fetch({ silent: true });\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t // ......................................................................... removal\n\t /** Remove this view's html from the DOM and remove all event listeners.\n\t * @param {Number or String} speed jq effect speed\n\t * @param {Function} callback an optional function called when removal is done (scoped to this view)\n\t */\n\t remove : function( speed, callback ){\n\t var view = this;\n\t speed = speed || this.fxSpeed;\n\t this.$el.fadeOut( speed, function(){\n\t Backbone.View.prototype.remove.call( view );\n\t if( callback ){ callback.call( view ); }\n\t });\n\t },\n\t\n\t // ......................................................................... rendering\n\t /* TODO:\n\t dataset states are the issue primarily making dataset rendering complex\n\t each state should have it's own way of displaying/set of details\n\t often with different actions that can be applied\n\t throw in deleted/purged/visible and things get complicated easily\n\t I've considered (a couple of times) - creating a view for each state\n\t - but recreating the view during an update...seems wrong\n\t */\n\t /** Render this HDA, set up ui.\n\t * @param {Number or String} speed jq fx speed\n\t * @returns {Object} this\n\t */\n\t render : function( speed ){\n\t //HACK: hover exit doesn't seem to be called on prev. tooltips when RE-rendering - so: no tooltip hide\n\t // handle that here by removing previous view's tooltips\n\t //this.$el.find(\"[title]\").tooltip( \"destroy\" );\n\t return _super.prototype.render.call( this, speed );\n\t },\n\t\n\t /** In this override, add the dataset state as a class for use with state-based CSS */\n\t _swapNewRender : function( $newRender ){\n\t _super.prototype._swapNewRender.call( this, $newRender );\n\t if( this.model.has( 'state' ) ){\n\t this.$el.addClass( 'state-' + this.model.get( 'state' ) );\n\t }\n\t return this.$el;\n\t },\n\t\n\t // ................................................................................ titlebar\n\t /** In this override, add the dataset display button. */\n\t _renderPrimaryActions : function(){\n\t // render just the display for read-only\n\t return [ this._renderDisplayButton() ];\n\t },\n\t\n\t /** Render icon-button to display dataset data */\n\t _renderDisplayButton : function(){\n\t//TODO:?? too complex - possibly move into template\n\t // don't show display if not viewable or not accessible\n\t var state = this.model.get( 'state' );\n\t if( ( state === STATES.NOT_VIEWABLE )\n\t || ( state === STATES.DISCARDED )\n\t || ( !this.model.get( 'accessible' ) ) ){\n\t return null;\n\t }\n\t\n\t var displayBtnData = {\n\t target : this.linkTarget,\n\t classes : 'display-btn'\n\t };\n\t\n\t // show a disabled display if the data's been purged\n\t if( this.model.get( 'purged' ) ){\n\t displayBtnData.disabled = true;\n\t displayBtnData.title = _l( 'Cannot display datasets removed from disk' );\n\t\n\t // disable if still uploading\n\t } else if( state === STATES.UPLOAD ){\n\t displayBtnData.disabled = true;\n\t displayBtnData.title = _l( 'This dataset must finish uploading before it can be viewed' );\n\t\n\t // disable if still new\n\t } else if( state === STATES.NEW ){\n\t displayBtnData.disabled = true;\n\t displayBtnData.title = _l( 'This dataset is not yet viewable' );\n\t\n\t } else {\n\t displayBtnData.title = _l( 'View data' );\n\t\n\t // default link for dataset\n\t displayBtnData.href = this.model.urls.display;\n\t\n\t // add frame manager option onclick event\n\t var self = this;\n\t displayBtnData.onclick = function( ev ){\n\t if (Galaxy.frame && Galaxy.frame.active) {\n\t // Add dataset to frames.\n\t Galaxy.frame.addDataset(self.model.get('id'));\n\t ev.preventDefault();\n\t }\n\t };\n\t }\n\t displayBtnData.faIcon = 'fa-eye';\n\t return faIconButton( displayBtnData );\n\t },\n\t\n\t // ......................................................................... rendering details\n\t /** Render the enclosing div of the hda body and, if expanded, the html in the body\n\t * @returns {jQuery} rendered DOM\n\t */\n\t _renderDetails : function(){\n\t //TODO: generalize to be allow different details for each state\n\t\n\t // no access - render nothing but a message\n\t if( this.model.get( 'state' ) === STATES.NOT_VIEWABLE ){\n\t return $( this.templates.noAccess( this.model.toJSON(), this ) );\n\t }\n\t\n\t var $details = _super.prototype._renderDetails.call( this );\n\t $details.find( '.actions .left' ).empty().append( this._renderSecondaryActions() );\n\t $details.find( '.summary' ).html( this._renderSummary() )\n\t .prepend( this._renderDetailMessages() );\n\t $details.find( '.display-applications' ).html( this._renderDisplayApplications() );\n\t\n\t//TODO: double tap\n\t this._setUpBehaviors( $details );\n\t return $details;\n\t },\n\t\n\t /** Defer to the appropo summary rendering fn based on state */\n\t _renderSummary : function(){\n\t var json = this.model.toJSON(),\n\t summaryRenderFn = this.templates.summaries[ json.state ];\n\t summaryRenderFn = summaryRenderFn || this.templates.summaries.unknown;\n\t return summaryRenderFn( json, this );\n\t },\n\t\n\t /** Render messages to be displayed only when the details are shown */\n\t _renderDetailMessages : function(){\n\t var view = this,\n\t $warnings = $( '
    ' ),\n\t json = view.model.toJSON();\n\t//TODO:! unordered (map)\n\t _.each( view.templates.detailMessages, function( templateFn ){\n\t $warnings.append( $( templateFn( json, view ) ) );\n\t });\n\t return $warnings;\n\t },\n\t\n\t /** Render the external display application links */\n\t _renderDisplayApplications : function(){\n\t if( this.model.isDeletedOrPurged() ){ return ''; }\n\t // render both old and new display apps using the same template\n\t return [\n\t this.templates.displayApplications( this.model.get( 'display_apps' ), this ),\n\t this.templates.displayApplications( this.model.get( 'display_types' ), this )\n\t ].join( '' );\n\t },\n\t\n\t // ......................................................................... secondary/details actions\n\t /** A series of links/buttons for less commonly used actions: re-run, info, etc. */\n\t _renderSecondaryActions : function(){\n\t this.debug( '_renderSecondaryActions' );\n\t switch( this.model.get( 'state' ) ){\n\t case STATES.NOT_VIEWABLE:\n\t return [];\n\t case STATES.OK:\n\t case STATES.FAILED_METADATA:\n\t case STATES.ERROR:\n\t return [ this._renderDownloadButton(), this._renderShowParamsButton() ];\n\t }\n\t return [ this._renderShowParamsButton() ];\n\t },\n\t\n\t /** Render icon-button to show the input and output (stdout/err) for the job that created this.\n\t * @returns {jQuery} rendered DOM\n\t */\n\t _renderShowParamsButton : function(){\n\t // gen. safe to show in all cases\n\t return faIconButton({\n\t title : _l( 'View details' ),\n\t classes : 'params-btn',\n\t href : this.model.urls.show_params,\n\t target : this.linkTarget,\n\t faIcon : 'fa-info-circle'\n\t });\n\t },\n\t\n\t /** Render icon-button/popupmenu to download the data (and/or the associated meta files (bai, etc.)) for this.\n\t * @returns {jQuery} rendered DOM\n\t */\n\t _renderDownloadButton : function(){\n\t//TODO: to (its own) template fn\n\t // don't show anything if the data's been purged\n\t if( this.model.get( 'purged' ) || !this.model.hasData() ){ return null; }\n\t\n\t // return either: a popupmenu with links to download assoc. meta files (if there are meta files)\n\t // or a single download icon-button (if there are no meta files)\n\t if( !_.isEmpty( this.model.get( 'meta_files' ) ) ){\n\t return this._renderMetaFileDownloadButton();\n\t }\n\t\n\t return $([\n\t '',\n\t '',\n\t ''\n\t ].join( '' ));\n\t },\n\t\n\t /** Render the download button which opens a dropdown with links to download assoc. meta files (indeces, etc.) */\n\t _renderMetaFileDownloadButton : function(){\n\t var urls = this.model.urls;\n\t return $([\n\t '
    ',\n\t '',\n\t '',\n\t '',\n\t '',\n\t '
    '\n\t ].join( '\\n' ));\n\t },\n\t\n\t // ......................................................................... misc\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .display-btn' : function( ev ){ this.trigger( 'display', this, ev ); },\n\t 'click .params-btn' : function( ev ){ this.trigger( 'params', this, ev ); },\n\t 'click .download-btn' : function( ev ){ this.trigger( 'download', this, ev ); }\n\t }),\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DatasetListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDatasetListItemView.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t failed_metadata : BASE_MVC.wrapTemplate([\n\t // failed metadata is rendered as a warning on an otherwise ok dataset view\n\t '<% if( model.state === \"failed_metadata\" ){ %>',\n\t '
    ',\n\t _l( 'An error occurred setting the metadata for this dataset' ),\n\t '
    ',\n\t '<% } %>'\n\t ]),\n\t error : BASE_MVC.wrapTemplate([\n\t // error during index fetch - show error on dataset\n\t '<% if( model.error ){ %>',\n\t '
    ',\n\t _l( 'There was an error getting the data for this dataset' ), ': <%- model.error %>',\n\t '
    ',\n\t '<% } %>'\n\t ]),\n\t purged : BASE_MVC.wrapTemplate([\n\t '<% if( model.purged ){ %>',\n\t '
    ',\n\t _l( 'This dataset has been deleted and removed from disk' ),\n\t '
    ',\n\t '<% } %>'\n\t ]),\n\t deleted : BASE_MVC.wrapTemplate([\n\t // deleted not purged\n\t '<% if( model.deleted && !model.purged ){ %>',\n\t '
    ',\n\t _l( 'This dataset has been deleted' ),\n\t '
    ',\n\t '<% } %>'\n\t ])\n\t\n\t //NOTE: hidden warning is only needed for HDAs\n\t });\n\t\n\t var detailsTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t '
    ',\n\t\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t\n\t // do not display tags, annotation, display apps, or peek when deleted\n\t '<% if( !dataset.deleted && !dataset.purged ){ %>',\n\t '
    ',\n\t '
    ',\n\t\n\t '
    ',\n\t\n\t '<% if( dataset.peek ){ %>',\n\t '
    <%= dataset.peek %>
    ',\n\t '<% } %>',\n\t '<% } %>',\n\t '
    '\n\t ], 'dataset' );\n\t\n\t var noAccessTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t '
    ',\n\t _l( 'You do not have permission to view this dataset' ),\n\t '
    ',\n\t '
    '\n\t ], 'dataset' );\n\t\n\t//TODO: still toooooooooooooo complex - rework\n\t var summaryTemplates = {};\n\t summaryTemplates[ STATES.OK ] = summaryTemplates[ STATES.FAILED_METADATA ] = BASE_MVC.wrapTemplate([\n\t '<% if( dataset.misc_blurb ){ %>',\n\t '
    ',\n\t '<%- dataset.misc_blurb %>',\n\t '
    ',\n\t '<% } %>',\n\t\n\t '<% if( dataset.file_ext ){ %>',\n\t '
    ',\n\t '',\n\t '<%- dataset.file_ext %>',\n\t '
    ',\n\t '<% } %>',\n\t\n\t '<% if( dataset.metadata_dbkey ){ %>',\n\t '
    ',\n\t '',\n\t '',\n\t '<%- dataset.metadata_dbkey %>',\n\t '',\n\t '
    ',\n\t '<% } %>',\n\t\n\t '<% if( dataset.misc_info ){ %>',\n\t '
    ',\n\t '<%- dataset.misc_info %>',\n\t '
    ',\n\t '<% } %>'\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.NEW ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'This is a new dataset and not all of its data are available yet' ), '
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.NOT_VIEWABLE ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'You do not have permission to view this dataset' ), '
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.DISCARDED ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'The job creating this dataset was cancelled before completion' ), '
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.QUEUED ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'This job is waiting to run' ), '
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.RUNNING ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'This job is currently running' ), '
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.UPLOAD ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'This dataset is currently uploading' ), '
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.SETTING_METADATA ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'Metadata is being auto-detected' ), '
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.PAUSED ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume' ), '
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.ERROR ] = BASE_MVC.wrapTemplate([\n\t '<% if( !dataset.purged ){ %>',\n\t '
    <%- dataset.misc_blurb %>
    ',\n\t '<% } %>',\n\t '', _l( 'An error occurred with this dataset' ), ':',\n\t '
    <%- dataset.misc_info %>
    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.EMPTY ] = BASE_MVC.wrapTemplate([\n\t '
    ', _l( 'No data' ), ': <%- dataset.misc_blurb %>
    '\n\t ], 'dataset' );\n\t summaryTemplates.unknown = BASE_MVC.wrapTemplate([\n\t '
    Error: unknown dataset state: \"<%- dataset.state %>\"
    '\n\t ], 'dataset' );\n\t\n\t // messages to be displayed only within the details section ('below the fold')\n\t var detailMessageTemplates = {\n\t resubmitted : BASE_MVC.wrapTemplate([\n\t // deleted not purged\n\t '<% if( model.resubmitted ){ %>',\n\t '
    ',\n\t _l( 'The job creating this dataset has been resubmitted' ),\n\t '
    ',\n\t '<% } %>'\n\t ])\n\t };\n\t\n\t // this is applied to both old and new style display apps\n\t var displayApplicationsTemplate = BASE_MVC.wrapTemplate([\n\t '<% _.each( apps, function( app ){ %>',\n\t '
    ',\n\t '<%- app.label %> ',\n\t '',\n\t '<% _.each( app.links, function( link ){ %>',\n\t '\" href=\"<%- link.href %>\">',\n\t '<% print( _l( link.text ) ); %>',\n\t ' ',\n\t '<% }); %>',\n\t '',\n\t '
    ',\n\t '<% }); %>'\n\t ], 'apps' );\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t warnings : warnings,\n\t details : detailsTemplate,\n\t noAccess : noAccessTemplate,\n\t summaries : summaryTemplates,\n\t detailMessages : detailMessageTemplates,\n\t displayApplications : displayApplicationsTemplate\n\t });\n\t}());\n\t\n\t\n\t// ============================================================================\n\t return {\n\t DatasetListItemView : DatasetListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {/*\n\t This class maps the form dom to an api compatible javascript dictionary.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(4) ], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\t var Manager = Backbone.Model.extend({\n\t initialize: function( app ) {\n\t this.app = app;\n\t },\n\t\n\t /** Creates a checksum.\n\t */\n\t checksum: function() {\n\t var sum = '';\n\t var self = this;\n\t this.app.section.$el.find( '.section-row' ).each( function() {\n\t var id = $(this).attr( 'id' );\n\t var field = self.app.field_list[ id ];\n\t if ( field ) {\n\t sum += id + ':' + JSON.stringify( field.value && field.value() ) + ':' + field.collapsed + ';';\n\t }\n\t });\n\t return sum;\n\t },\n\t\n\t /** Convert dom into a dictionary of flat id/value pairs used e.g. on job submission.\n\t */\n\t create: function() {\n\t var self = this;\n\t\n\t // get raw dictionary from dom\n\t var dict = {};\n\t this._iterate( this.app.section.$el, dict );\n\t\n\t // add to result dictionary\n\t var result_dict = {};\n\t this.flat_dict = {};\n\t function add( flat_id, input_id, input_value ) {\n\t self.flat_dict[ flat_id ] = input_id;\n\t result_dict[ flat_id ] = input_value;\n\t };\n\t\n\t // converter between raw dictionary and job dictionary\n\t function convert( identifier, head ) {\n\t for ( var index in head ) {\n\t var node = head[ index ];\n\t if ( node.input ) {\n\t var input = node.input;\n\t var flat_id = identifier;\n\t if ( identifier != '' ) {\n\t flat_id += '|';\n\t }\n\t flat_id += input.name;\n\t switch ( input.type ) {\n\t case 'repeat':\n\t var section_label = 'section-';\n\t var block_indices = [];\n\t var block_prefix = null;\n\t for ( var block_label in node ) {\n\t var pos = block_label.indexOf( section_label );\n\t if ( pos != -1 ) {\n\t pos += section_label.length;\n\t block_indices.push( parseInt( block_label.substr( pos ) ));\n\t if ( !block_prefix ) {\n\t block_prefix = block_label.substr( 0, pos );\n\t }\n\t }\n\t }\n\t block_indices.sort( function( a, b ) { return a - b; });\n\t var index = 0;\n\t for ( var i in block_indices ) {\n\t convert( flat_id + '_' + index++, node[ block_prefix + block_indices[ i ] ]);\n\t }\n\t break;\n\t case 'conditional':\n\t var value = self.app.field_list[ input.id ].value();\n\t add ( flat_id + '|' + input.test_param.name, input.id, value );\n\t var selectedCase = matchCase( input, value );\n\t if ( selectedCase != -1 ) {\n\t convert( flat_id, head[ input.id + '-section-' + selectedCase ] );\n\t }\n\t break;\n\t case 'section':\n\t convert( !input.flat && flat_id || '', node );\n\t break;\n\t default:\n\t var field = self.app.field_list[ input.id ];\n\t if ( field && field.value ) {\n\t var value = field.value();\n\t if ( input.ignore === undefined || input.ignore != value ) {\n\t if ( field.collapsed && input.collapsible_value ) {\n\t value = input.collapsible_value;\n\t }\n\t add ( flat_id, input.id, value );\n\t if ( input.payload ) {\n\t for ( var p_id in input.payload ) {\n\t add ( p_id, input.id, input.payload[ p_id ] );\n\t }\n\t }\n\t }\n\t }\n\t }\n\t }\n\t }\n\t }\n\t convert( '', dict );\n\t return result_dict;\n\t },\n\t\n\t /** Matches flat ids to corresponding input element\n\t * @param{string} flat_id - Flat input id to be looked up.\n\t */\n\t match: function ( flat_id ) {\n\t return this.flat_dict && this.flat_dict[ flat_id ];\n\t },\n\t\n\t /** Match conditional values to selected cases\n\t */\n\t matchCase: function( input, value ) {\n\t return matchCase( input, value );\n\t },\n\t\n\t /** Matches a new tool model to the current input elements e.g. used to update dynamic options\n\t */\n\t matchModel: function( model, callback ) {\n\t return matchIds( model.inputs, this.flat_dict, callback );\n\t },\n\t\n\t /** Matches identifier from api response to input elements e.g. used to display validation errors\n\t */\n\t matchResponse: function( response ) {\n\t var result = {};\n\t var self = this;\n\t function search ( id, head ) {\n\t if ( typeof head === 'string' ) {\n\t var input_id = self.flat_dict[ id ];\n\t input_id && ( result[ input_id ] = head );\n\t } else {\n\t for ( var i in head ) {\n\t var new_id = i;\n\t if ( id !== '' ) {\n\t var separator = '|';\n\t if ( head instanceof Array ) {\n\t separator = '_';\n\t }\n\t new_id = id + separator + new_id;\n\t }\n\t search ( new_id, head[ i ] );\n\t }\n\t }\n\t }\n\t search( '', response );\n\t return result;\n\t },\n\t\n\t /** Map dom tree to dictionary tree with input elements.\n\t */\n\t _iterate: function( parent, dict ) {\n\t var self = this;\n\t var children = $( parent ).children();\n\t children.each( function() {\n\t var child = this;\n\t var id = $( child ).attr( 'id' );\n\t if ( $( child ).hasClass( 'section-row' ) ) {\n\t var input = self.app.input_list[ id ];\n\t dict[ id ] = ( input && { input : input } ) || {};\n\t self._iterate( child, dict[ id ] );\n\t } else {\n\t self._iterate( child, dict );\n\t }\n\t });\n\t }\n\t });\n\t\n\t /** Match conditional values to selected cases\n\t * @param{dict} input - Definition of conditional input parameter\n\t * @param{dict} value - Current value\n\t */\n\t var matchCase = function( input, value ) {\n\t if ( input.test_param.type == 'boolean' ) {\n\t if ( value == 'true' ) {\n\t value = input.test_param.truevalue || 'true';\n\t } else {\n\t value = input.test_param.falsevalue || 'false';\n\t }\n\t }\n\t for ( var i in input.cases ) {\n\t if ( input.cases[ i ].value == value ) {\n\t return i;\n\t }\n\t }\n\t return -1;\n\t };\n\t\n\t /** Match context\n\t * @param{dict} inputs - Dictionary of input elements\n\t * @param{dict} key - Reference key which is matched to an input name e.g. data_ref\n\t * @param{dict} callback - Called with matched context i.e. callback( input, referenced_input )\n\t */\n\t var matchContext = function( inputs, key, callback, context ) {\n\t context = $.extend( true, {}, context );\n\t _.each( inputs, function ( input ) {\n\t input && input.type && ( context[ input.name ] = input );\n\t });\n\t _.each( inputs, function ( input ) {\n\t if ( _.isObject( input ) ) {\n\t if ( input.type && context[ input[ key ] ] ) {\n\t callback ( input, context[ input[ key ] ] );\n\t } else {\n\t matchContext( input, key, callback, context );\n\t }\n\t }\n\t });\n\t };\n\t\n\t /** Matches a tool model to a dictionary, indexed with flat ids\n\t * @param{dict} inputs - Dictionary of input elements\n\t * @param{dict} mapping - Dictionary containing flat ids\n\t * @param{dict} callback - Called with the mapped dictionary object and corresponding model node\n\t */\n\t var matchIds = function( inputs, mapping, callback ) {\n\t var result = {};\n\t var self = this;\n\t function search ( id, head ) {\n\t for ( var i in head ) {\n\t var node = head[ i ];\n\t var index = node.name;\n\t id != '' && ( index = id + '|' + index );\n\t switch ( node.type ) {\n\t case 'repeat':\n\t for ( var j in node.cache ) {\n\t search ( index + '_' + j, node.cache[ j ] );\n\t }\n\t break;\n\t case 'conditional':\n\t var selectedCase = matchCase( node, node.test_param && node.test_param.value );\n\t selectedCase != -1 && search ( index, node.cases[ selectedCase ].inputs );\n\t break;\n\t case 'section':\n\t search ( index, node.inputs );\n\t break;\n\t default:\n\t var mapped = mapping[ index ];\n\t mapped && callback( mapped, node );\n\t }\n\t }\n\t }\n\t search( '', inputs );\n\t return result;\n\t };\n\t\n\t return {\n\t Manager : Manager,\n\t matchIds : matchIds,\n\t matchContext : matchContext\n\t }\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {/**\n\t This class creates a form input element wrapper\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t return Backbone.View.extend({\n\t initialize: function(app, options) {\n\t this.app = app;\n\t this.field = options.field;\n\t\n\t // set text labels and icons for collapsible button\n\t this.text_enable = app.options.text_enable || 'Enable';\n\t this.text_disable = app.options.text_disable || 'Disable';\n\t this.cls_enable = app.options.cls_enable || 'fa fa-caret-square-o-down';\n\t this.cls_disable = app.options.cls_disable || 'fa fa-caret-square-o-up';\n\t\n\t // set element\n\t this.setElement(this._template(options));\n\t\n\t // link elements\n\t this.$field = this.$('.ui-form-field');\n\t this.$preview = this.$('.ui-form-preview');\n\t this.$collapsible = this.$('.ui-form-collapsible');\n\t this.$collapsible_icon = this.$('.ui-form-collapsible').find('.icon');\n\t this.$error_text = this.$('.ui-form-error-text');\n\t this.$error = this.$('.ui-form-error');\n\t this.$backdrop = this.$('.ui-form-backdrop');\n\t\n\t // add field element\n\t this.$field.prepend(this.field.$el);\n\t\n\t // decide wether to expand or collapse fields\n\t this.field.collapsed = options.collapsible_value !== undefined && JSON.stringify( options.value ) == JSON.stringify( options.collapsible_value );\n\t\n\t // refresh view\n\t this._refresh();\n\t\n\t // add collapsible hide/show\n\t var self = this;\n\t this.$collapsible.on('click', function() {\n\t self.field.collapsed = !self.field.collapsed;\n\t self._refresh();\n\t });\n\t },\n\t\n\t /** Disable input element\n\t */\n\t disable: function( silent ) {\n\t this.$backdrop.show();\n\t silent && this.$backdrop.css({ 'opacity': 0, 'cursor': 'default' } );\n\t },\n\t\n\t /** Set error text\n\t */\n\t error: function(text) {\n\t this.$error_text.html(text);\n\t this.$error.show();\n\t this.$el.addClass('ui-error');\n\t },\n\t\n\t /** Reset this view\n\t */\n\t reset: function() {\n\t this.$error.hide();\n\t this.$el.removeClass('ui-error');\n\t },\n\t\n\t /** Refresh element\n\t */\n\t _refresh: function() {\n\t this.$collapsible_icon.removeClass().addClass('icon');\n\t if (!this.field.collapsed) {\n\t this.$field.fadeIn('fast');\n\t this.$preview.hide();\n\t this._tooltip(this.text_disable, this.cls_disable);\n\t } else {\n\t this.$field.hide();\n\t this.$preview.show();\n\t this._tooltip(this.text_enable, this.cls_enable);\n\t }\n\t this.app.trigger('change');\n\t },\n\t\n\t /** Set tooltip text\n\t */\n\t _tooltip: function(title, cls) {\n\t this.$collapsible_icon.addClass(cls)\n\t .tooltip({ placement: 'bottom' })\n\t .attr('data-original-title', title)\n\t .tooltip('fixTitle').tooltip('hide');\n\t },\n\t\n\t /** Main Template\n\t */\n\t _template: function(options) {\n\t var tmp = '
    ' +\n\t '
    ' +\n\t '' +\n\t '
    ' +\n\t '
    ';\n\t if ( !options.disabled && options.collapsible_value !== undefined ) {\n\t tmp += '
    ' +\n\t '' + options.label +\n\t '
    ';\n\t } else {\n\t tmp += options.label;\n\t }\n\t tmp += '
    ' +\n\t '
    ';\n\t tmp += '
    ';\n\t if (options.help) {\n\t tmp += options.help;\n\t if (options.argument && options.help.indexOf('(' + options.argument + ')') == -1) {\n\t tmp += ' (' + options.argument + ')';\n\t }\n\t }\n\t tmp += '
    ' +\n\t '
    ' +\n\t '
    ';\n\t if ( options.collapsible_preview ) {\n\t tmp += '
    ' + options.text_value + '
    ';\n\t }\n\t tmp += '
    ';\n\t return tmp;\n\t }\n\t });\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/**\n\t This class creates input elements. New input parameter types should be added to the types dictionary.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4),\n\t __webpack_require__(7),\n\t __webpack_require__(43),\n\t __webpack_require__(56),\n\t __webpack_require__(55),\n\t __webpack_require__(52)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Ui, SelectContent, SelectLibrary, SelectFtp, ColorPicker) {\n\t\n\t // create form view\n\t return Backbone.Model.extend({\n\t /** Available parameter types */\n\t types: {\n\t 'text' : '_fieldText',\n\t 'select' : '_fieldSelect',\n\t 'data_column' : '_fieldSelect',\n\t 'genomebuild' : '_fieldSelect',\n\t 'data' : '_fieldData',\n\t 'data_collection' : '_fieldData',\n\t 'integer' : '_fieldSlider',\n\t 'float' : '_fieldSlider',\n\t 'boolean' : '_fieldBoolean',\n\t 'drill_down' : '_fieldDrilldown',\n\t 'color' : '_fieldColor',\n\t 'hidden' : '_fieldHidden',\n\t 'hidden_data' : '_fieldHidden',\n\t 'baseurl' : '_fieldHidden',\n\t 'library_data' : '_fieldLibrary',\n\t 'ftpfile' : '_fieldFtp'\n\t },\n\t\n\t // initialize\n\t initialize: function(app, options) {\n\t this.app = app;\n\t },\n\t\n\t /** Returns an input field for a given field type\n\t */\n\t create: function(input_def) {\n\t // add regular/default value if missing\n\t if (input_def.value === undefined) {\n\t input_def.value = null;\n\t }\n\t if (input_def.default_value === undefined) {\n\t input_def.default_value = input_def.value;\n\t }\n\t\n\t // create field wrapper\n\t var field = null;\n\t var fieldClass = this.types[input_def.type];\n\t if (fieldClass && typeof(this[fieldClass]) === 'function') {\n\t field = this[fieldClass].call(this, input_def);\n\t }\n\t\n\t // match unavailable field types\n\t if (!field) {\n\t this.app.incompatible = true;\n\t if (input_def.options) {\n\t field = this._fieldSelect(input_def);\n\t } else {\n\t field = this._fieldText(input_def);\n\t }\n\t Galaxy.emit.debug('form-parameters::_addRow()', 'Auto matched field type (' + input_def.type + ').');\n\t }\n\t\n\t // set initial field value\n\t input_def.value !== undefined && ( field.value( input_def.value ) );\n\t return field;\n\t },\n\t\n\t /** Data input field\n\t */\n\t _fieldData: function(input_def) {\n\t var self = this;\n\t return new SelectContent.View(this.app, {\n\t id : 'field-' + input_def.id,\n\t extensions : input_def.extensions,\n\t optional : input_def.optional,\n\t multiple : input_def.multiple,\n\t type : input_def.type,\n\t data : input_def.options,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Select/Checkbox/Radio options field\n\t */\n\t _fieldSelect: function (input_def) {\n\t // show text field e.g. in workflow editor\n\t if( input_def.is_workflow ) {\n\t return this._fieldText( input_def );\n\t }\n\t\n\t // customize properties\n\t if (input_def.type == 'data_column') {\n\t input_def.error_text = 'Missing columns in referenced dataset.'\n\t }\n\t\n\t // configure options fields\n\t var options = [];\n\t for (var i in input_def.options) {\n\t var option = input_def.options[i];\n\t options.push({\n\t label: option[0],\n\t value: option[1]\n\t });\n\t }\n\t\n\t // identify display type\n\t var SelectClass = Ui.Select;\n\t switch (input_def.display) {\n\t case 'checkboxes':\n\t SelectClass = Ui.Checkbox;\n\t break;\n\t case 'radio':\n\t SelectClass = Ui.Radio;\n\t break;\n\t }\n\t\n\t // create select field\n\t var self = this;\n\t return new SelectClass.View({\n\t id : 'field-' + input_def.id,\n\t data : options,\n\t error_text : input_def.error_text || 'No options available',\n\t optional : input_def.optional && input_def.default_value === null,\n\t multiple : input_def.multiple,\n\t optional : input_def.optional,\n\t searchable : input_def.searchable,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Drill down options field\n\t */\n\t _fieldDrilldown: function (input_def) {\n\t // show text field e.g. in workflow editor\n\t if( input_def.is_workflow ) {\n\t return this._fieldText( input_def );\n\t }\n\t\n\t // create drill down field\n\t var self = this;\n\t return new Ui.Drilldown.View({\n\t id : 'field-' + input_def.id,\n\t data : input_def.options,\n\t display : input_def.display,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Text input field\n\t */\n\t _fieldText: function(input_def) {\n\t // field replaces e.g. a select field\n\t if (input_def.options) {\n\t input_def.area = input_def.multiple;\n\t if (!Utils.validate(input_def.value)) {\n\t input_def.value = null;\n\t } else {\n\t if ($.isArray(input_def.value)) {\n\t var str_value = '';\n\t for (var i in input_def.value) {\n\t str_value += String(input_def.value[i]);\n\t if (!input_def.multiple) {\n\t break;\n\t }\n\t str_value += '\\n';\n\t }\n\t input_def.value = str_value;\n\t }\n\t }\n\t }\n\t\n\t // create input element\n\t var self = this;\n\t return new Ui.Input({\n\t id : 'field-' + input_def.id,\n\t area : input_def.area,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Slider field\n\t */\n\t _fieldSlider: function(input_def) {\n\t var self = this;\n\t return new Ui.Slider.View({\n\t id : 'field-' + input_def.id,\n\t precise : input_def.type == 'float',\n\t is_workflow : input_def.is_workflow,\n\t min : input_def.min,\n\t max : input_def.max,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Hidden field\n\t */\n\t _fieldHidden: function(input_def) {\n\t return new Ui.Hidden({\n\t id : 'field-' + input_def.id,\n\t info : input_def.info\n\t });\n\t },\n\t\n\t /** Boolean field\n\t */\n\t _fieldBoolean: function(input_def) {\n\t var self = this;\n\t return new Ui.RadioButton.View({\n\t id : 'field-' + input_def.id,\n\t data : [ { label : 'Yes', value : 'true' },\n\t { label : 'No', value : 'false' }],\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Color picker field\n\t */\n\t _fieldColor: function(input_def) {\n\t var self = this;\n\t return new ColorPicker({\n\t id : 'field-' + input_def.id,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Library dataset field\n\t */\n\t _fieldLibrary: function(input_def) {\n\t var self = this;\n\t return new SelectLibrary.View({\n\t id : 'field-' + input_def.id,\n\t optional : input_def.optional,\n\t multiple : input_def.multiple,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** FTP file field\n\t */\n\t _fieldFtp: function(input_def) {\n\t var self = this;\n\t return new SelectFtp.View({\n\t id : 'field-' + input_def.id,\n\t optional : input_def.optional,\n\t multiple : input_def.multiple,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t }\n\t });\n\t\n\t return {\n\t View: View\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(17), __webpack_require__(11), __webpack_require__(7)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Table, Portlet, Ui) {\n\t\n\t/** This class creates a ui component which enables the dynamic creation of portlets\n\t*/\n\tvar View = Backbone.View.extend({\n\t /** Initialize\n\t */\n\t initialize : function(options) {\n\t this.options = Utils.merge(options, {\n\t title : 'Section',\n\t empty_text : 'Not available.',\n\t max : null,\n\t min : null\n\t });\n\t this.setElement('
    ');\n\t var self = this;\n\t\n\t // create button\n\t this.button_new = new Ui.ButtonIcon({\n\t icon : 'fa-plus',\n\t title : 'Insert ' + options.title_new,\n\t tooltip : 'Add new ' + options.title_new + ' block',\n\t floating: 'clear',\n\t onclick : function() {\n\t if (options.onnew) {\n\t options.onnew();\n\t }\n\t }\n\t });\n\t\n\t // create table\n\t this.table = new Table.View({\n\t cls : 'ui-table-plain',\n\t content : ''\n\t });\n\t this.$el.append(this.table.$el);\n\t this.$el.append($('
    ').append(this.button_new.$el));\n\t\n\t // reset list\n\t this.list = {};\n\t this.n = 0;\n\t },\n\t\n\t /** Number of repeat blocks\n\t */\n\t size: function() {\n\t return this.n;\n\t },\n\t\n\t /** Add new repeat block\n\t */\n\t add: function(options) {\n\t if (!options.id || this.list[options.id]) {\n\t Galaxy.emit.debug('form-repeat::add()', 'Duplicate repeat block id.');\n\t return;\n\t }\n\t this.n++;\n\t var button_delete = new Ui.ButtonIcon({\n\t icon : 'fa-trash-o',\n\t tooltip : 'Delete this repeat block',\n\t cls : 'ui-button-icon-plain',\n\t onclick : function() {\n\t if (options.ondel) {\n\t options.ondel();\n\t }\n\t }\n\t });\n\t var portlet = new Portlet.View({\n\t id : options.id,\n\t title : 'placeholder',\n\t cls : 'ui-portlet-repeat',\n\t operations : {\n\t button_delete : button_delete\n\t }\n\t });\n\t portlet.append(options.$el);\n\t portlet.$el.addClass('section-row');\n\t this.list[options.id] = portlet;\n\t this.table.add(portlet.$el);\n\t this.table.append('row_' + options.id, true);\n\t if (this.options.max > 0 && this.n >= this.options.max) {\n\t this.button_new.disable();\n\t }\n\t this._refresh();\n\t },\n\t\n\t /** Delete repeat block\n\t */\n\t del: function(id) {\n\t if (!this.list[id]) {\n\t Galaxy.emit.debug('form-repeat::del()', 'Invalid repeat block id.');\n\t return;\n\t }\n\t this.n--;\n\t var table_row = this.table.get('row_' + id);\n\t table_row.remove();\n\t delete this.list[id];\n\t this.button_new.enable();\n\t this._refresh();\n\t },\n\t\n\t /** Hides add/del options\n\t */\n\t hideOptions: function() {\n\t this.button_new.$el.hide();\n\t _.each( this.list, function( portlet ) {\n\t portlet.hideOperation('button_delete');\n\t });\n\t if( _.isEmpty( this.list ) ) {\n\t this.$el.append( $('
    ').addClass( 'ui-form-info' ).html( this.options.empty_text ) );\n\t }\n\t },\n\t\n\t /** Refresh view\n\t */\n\t _refresh: function() {\n\t var index = 0;\n\t for (var id in this.list) {\n\t var portlet = this.list[id];\n\t portlet.title(++index + ': ' + this.options.title);\n\t if (this.n > this.options.min) {\n\t portlet.showOperation('button_delete');\n\t } else {\n\t portlet.hideOperation('button_delete');\n\t }\n\t }\n\t }\n\t});\n\t\n\treturn {\n\t View : View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 42 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, jQuery, _, $) {/**\n\t This class creates a form section and populates it with input elements. It also handles repeat blocks and conditionals by recursively creating new sub sections.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4),\n\t __webpack_require__(17),\n\t __webpack_require__(7),\n\t __webpack_require__(11),\n\t __webpack_require__(41),\n\t __webpack_require__(39),\n\t __webpack_require__(40)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Table, Ui, Portlet, Repeat, InputElement, Parameters) {\n\t var View = Backbone.View.extend({\n\t initialize: function(app, options) {\n\t this.app = app;\n\t this.inputs = options.inputs;\n\t\n\t // fix table style\n\t options.cls = 'ui-table-plain';\n\t\n\t // add table class for tr tag\n\t // this assist in transforming the form into a json structure\n\t options.cls_tr = 'section-row';\n\t\n\t // create/render views\n\t this.table = new Table.View(options);\n\t this.parameters = new Parameters(app, options);\n\t this.setElement(this.table.$el);\n\t this.render();\n\t },\n\t\n\t /** Render section view\n\t */\n\t render: function() {\n\t this.table.delAll();\n\t for (var i in this.inputs) {\n\t this.add(this.inputs[i]);\n\t }\n\t },\n\t\n\t /** Add a new input element\n\t */\n\t add: function(input) {\n\t var self = this;\n\t var input_def = jQuery.extend(true, {}, input);\n\t input_def.id = input.id = Utils.uid();\n\t\n\t // add to sequential list of inputs\n\t this.app.input_list[input_def.id] = input_def;\n\t\n\t // identify field type\n\t var type = input_def.type;\n\t switch(type) {\n\t case 'conditional':\n\t this._addConditional(input_def);\n\t break;\n\t case 'repeat':\n\t this._addRepeat(input_def);\n\t break;\n\t case 'section':\n\t this._addSection(input_def);\n\t break;\n\t default:\n\t this._addRow(input_def);\n\t }\n\t },\n\t\n\t /** Add a conditional block\n\t */\n\t _addConditional: function(input_def) {\n\t var self = this;\n\t input_def.test_param.id = input_def.id;\n\t this.app.options.sustain_conditionals && ( input_def.test_param.disabled = true );\n\t var field = this._addRow( input_def.test_param );\n\t\n\t // set onchange event for test parameter\n\t field.options.onchange = function(value) {\n\t var selectedCase = self.app.data.matchCase(input_def, value);\n\t for (var i in input_def.cases) {\n\t var case_def = input_def.cases[i];\n\t var section_id = input_def.id + '-section-' + i;\n\t var section_row = self.table.get(section_id);\n\t var nonhidden = false;\n\t for (var j in case_def.inputs) {\n\t if (!case_def.inputs[j].hidden) {\n\t nonhidden = true;\n\t break;\n\t }\n\t }\n\t if (i == selectedCase && nonhidden) {\n\t section_row.fadeIn('fast');\n\t } else {\n\t section_row.hide();\n\t }\n\t }\n\t self.app.trigger('change');\n\t };\n\t\n\t // add conditional sub sections\n\t for (var i in input_def.cases) {\n\t var sub_section_id = input_def.id + '-section-' + i;\n\t var sub_section = new View(this.app, {\n\t inputs : input_def.cases[i].inputs\n\t });\n\t sub_section.$el.addClass('ui-table-section');\n\t this.table.add(sub_section.$el);\n\t this.table.append(sub_section_id);\n\t }\n\t\n\t // trigger refresh on conditional input field after all input elements have been created\n\t field.trigger('change');\n\t },\n\t\n\t /** Add a repeat block\n\t */\n\t _addRepeat: function(input_def) {\n\t var self = this;\n\t var block_index = 0;\n\t\n\t // create repeat block element\n\t var repeat = new Repeat.View({\n\t title : input_def.title || 'Repeat',\n\t title_new : input_def.title || '',\n\t min : input_def.min,\n\t max : input_def.max,\n\t onnew : function() {\n\t create(input_def.inputs);\n\t self.app.trigger('change');\n\t }\n\t });\n\t\n\t // helper function to create new repeat blocks\n\t function create (inputs) {\n\t var sub_section_id = input_def.id + '-section-' + (block_index++);\n\t var sub_section = new View(self.app, {\n\t inputs : inputs\n\t });\n\t repeat.add({\n\t id : sub_section_id,\n\t $el : sub_section.$el,\n\t ondel : function() {\n\t repeat.del(sub_section_id);\n\t self.app.trigger('change');\n\t }\n\t });\n\t }\n\t\n\t //\n\t // add parsed/minimum number of repeat blocks\n\t //\n\t var n_cache = _.size( input_def.cache );\n\t for ( var i = 0; i < Math.max( Math.max( n_cache, input_def.min ), input_def.default ); i++ ) {\n\t create( i < n_cache ? input_def.cache[ i ] : input_def.inputs );\n\t }\n\t\n\t // hide options\n\t this.app.options.sustain_repeats && repeat.hideOptions();\n\t\n\t // create input field wrapper\n\t var input_element = new InputElement(this.app, {\n\t label : input_def.title || input_def.name,\n\t help : input_def.help,\n\t field : repeat\n\t });\n\t this.table.add(input_element.$el);\n\t this.table.append(input_def.id);\n\t },\n\t\n\t /** Add a customized section\n\t */\n\t _addSection: function(input_def) {\n\t var self = this;\n\t\n\t // create sub section\n\t var sub_section = new View(self.app, {\n\t inputs : input_def.inputs\n\t });\n\t\n\t // delete button\n\t var button_visible = new Ui.ButtonIcon({\n\t icon : 'fa-eye-slash',\n\t tooltip : 'Show/hide section',\n\t cls : 'ui-button-icon-plain'\n\t });\n\t\n\t // create portlet for sub section\n\t var portlet = new Portlet.View({\n\t title : input_def.title || input_def.name,\n\t cls : 'ui-portlet-section',\n\t collapsible : true,\n\t collapsed : true,\n\t operations : {\n\t button_visible: button_visible\n\t }\n\t });\n\t portlet.append( sub_section.$el );\n\t portlet.append( $( '
    ' ).addClass( 'ui-form-info' ).html( input_def.help ) );\n\t portlet.setOperation( 'button_visible', function() {\n\t if( portlet.collapsed ) {\n\t portlet.expand();\n\t } else {\n\t portlet.collapse();\n\t }\n\t });\n\t\n\t // add expansion event handler\n\t portlet.on( 'expanded', function() {\n\t button_visible.setIcon( 'fa-eye' );\n\t });\n\t portlet.on( 'collapsed', function() {\n\t button_visible.setIcon( 'fa-eye-slash' );\n\t });\n\t this.app.on( 'expand', function( input_id ) {\n\t ( portlet.$( '#' + input_id ).length > 0 ) && portlet.expand();\n\t });\n\t\n\t // show sub section if requested\n\t input_def.expanded && portlet.expand();\n\t\n\t // create table row\n\t this.table.add(portlet.$el);\n\t this.table.append(input_def.id);\n\t },\n\t\n\t /** Add a single input field element\n\t */\n\t _addRow: function(input_def) {\n\t var id = input_def.id;\n\t var field = this.parameters.create(input_def);\n\t this.app.field_list[id] = field;\n\t var input_element = new InputElement(this.app, {\n\t name : input_def.name,\n\t label : input_def.label || input_def.name,\n\t value : input_def.value,\n\t default_value : input_def.default_value,\n\t text_value : input_def.text_value || input_def.value,\n\t collapsible_value : input_def.collapsible_value,\n\t collapsible_preview : input_def.collapsible_preview,\n\t help : input_def.help,\n\t argument : input_def.argument,\n\t disabled : input_def.disabled,\n\t field : field\n\t });\n\t this.app.element_list[id] = input_element;\n\t this.table.add(input_element.$el);\n\t this.table.append(id);\n\t input_def.hidden && this.table.get(id).hide();\n\t return field;\n\t }\n\t });\n\t\n\t return {\n\t View: View\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(7), __webpack_require__(31)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Ui, Tabs) {\n\t// hda/hdca content selector ui element\n\tvar View = Backbone.View.extend({\n\t // initialize\n\t initialize : function(app, options) {\n\t // link app and options\n\t this.app = app;\n\t this.options = options;\n\t\n\t // track current history elements\n\t this.history = {};\n\t\n\t\n\t // link this\n\t var self = this;\n\t\n\t // add element\n\t this.setElement('
    ');\n\t\n\t // list of select fieldsFormSection\n\t this.list = {};\n\t\n\t // radio button options\n\t var radio_buttons = [];\n\t\n\t // identify selector type\n\t if (options.type == 'data_collection') {\n\t this.mode = 'collection';\n\t } else {\n\t if (options.multiple) {\n\t this.mode = 'multiple';\n\t } else {\n\t this.mode = 'single';\n\t }\n\t }\n\t\n\t // set initial state\n\t this.current = this.mode;\n\t this.list = {};\n\t\n\t // error messages\n\t var extensions = Utils.textify(options.extensions);\n\t var hda_error = 'No dataset available.';\n\t if (extensions) {\n\t hda_error = 'No ' + extensions + ' dataset available.';\n\t }\n\t var hdca_error = 'No dataset list available.';\n\t if (extensions) {\n\t hdca_error = 'No ' + extensions + ' dataset collection available.';\n\t }\n\t\n\t // add single dataset selector\n\t if (this.mode == 'single') {\n\t radio_buttons.push({\n\t icon : 'fa-file-o',\n\t value : 'single',\n\t tooltip : 'Single dataset'\n\t });\n\t this.select_single = new Ui.Select.View({\n\t optional : options.optional,\n\t error_text : hda_error,\n\t onchange : function() {\n\t self.trigger('change');\n\t }\n\t });\n\t this.list['single'] = {\n\t field: this.select_single,\n\t type : 'hda'\n\t };\n\t }\n\t\n\t // add multiple dataset selector\n\t if (this.mode == 'single' || this.mode == 'multiple') {\n\t radio_buttons.push({\n\t icon : 'fa-files-o',\n\t value : 'multiple',\n\t tooltip : 'Multiple datasets'\n\t });\n\t this.select_multiple = new Ui.Select.View({\n\t multiple : true,\n\t searchable : false,\n\t optional : options.optional,\n\t error_text : hda_error,\n\t onchange : function() {\n\t self.trigger('change');\n\t }\n\t });\n\t this.list['multiple'] = {\n\t field: this.select_multiple,\n\t type : 'hda'\n\t };\n\t }\n\t\n\t // add collection selector\n\t if (this.mode == 'single' || this.mode == 'multiple' || this.mode == 'collection') {\n\t radio_buttons.push({\n\t icon : 'fa-folder-o',\n\t value : 'collection',\n\t tooltip : 'Dataset collection'\n\t });\n\t var multiple = this.mode == 'multiple';\n\t this.select_collection = new Ui.Select.View({\n\t error_text : hdca_error,\n\t multiple : multiple,\n\t searchable : false,\n\t optional : options.optional,\n\t onchange : function() {\n\t self.trigger('change');\n\t }\n\t });\n\t this.list['collection'] = {\n\t field: this.select_collection,\n\t type : 'hdca'\n\t };\n\t }\n\t\n\t // create button\n\t this.button_type = new Ui.RadioButton.View({\n\t value : this.current,\n\t data : radio_buttons,\n\t onchange: function(value) {\n\t self.current = value;\n\t self.refresh();\n\t self.trigger('change');\n\t }\n\t });\n\t\n\t // add batch mode information\n\t this.$batch = $(this.template_batch());\n\t\n\t // number of radio buttons\n\t var n_buttons = _.size(this.list);\n\t\n\t // add button to dom\n\t var button_width = 0;\n\t if (n_buttons > 1) {\n\t this.$el.append(this.button_type.$el);\n\t button_width = Math.max(0, _.size(this.list) * 35) + 'px';\n\t }\n\t\n\t // append field elements\n\t for (var i in this.list) {\n\t this.$el.append(this.list[i].field.$el.css({\n\t 'margin-left': button_width\n\t }));\n\t }\n\t\n\t // append batch message\n\t this.$el.append(this.$batch.css({\n\t 'margin-left': button_width\n\t }));\n\t\n\t // update options\n\t this.update(options.data);\n\t\n\t // set initial value\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t\n\t // refresh view\n\t this.refresh();\n\t\n\t // add change event. fires on trigger\n\t this.on('change', function() {\n\t if (options.onchange) {\n\t options.onchange(self.value());\n\t }\n\t });\n\t },\n\t\n\t /** Indicate that select fields are being updated */\n\t wait: function() {\n\t for (var i in this.list) {\n\t this.list[i].field.wait();\n\t }\n\t },\n\t\n\t /** Indicate that the options update has been completed */\n\t unwait: function() {\n\t for (var i in this.list) {\n\t this.list[i].field.unwait();\n\t }\n\t },\n\t\n\t /** Update content selector */\n\t update: function(options) {\n\t // update a particular select field\n\t var self = this;\n\t function _update(field, options) {\n\t if (field) {\n\t // identify available options\n\t var select_options = [];\n\t for (var i in options) {\n\t var item = options[i];\n\t select_options.push({\n\t hid : item.hid,\n\t label: item.hid + ': ' + item.name,\n\t value: item.id\n\t });\n\t // backup to local history\n\t self.history[item.id + '_' + item.src] = item;\n\t }\n\t // update field\n\t field.add( select_options, function( a, b ) { return b.hid - a.hid } );\n\t }\n\t }\n\t\n\t // update available options\n\t _update(this.select_single, options.hda);\n\t _update(this.select_multiple, options.hda);\n\t _update(this.select_collection, options.hdca);\n\t },\n\t\n\t /** Return the currently selected dataset values */\n\t value : function (new_value) {\n\t // update current value\n\t if (new_value !== undefined) {\n\t if (new_value && new_value.values) {\n\t try {\n\t // create list with values\n\t var list = [];\n\t for (var i in new_value.values) {\n\t list.push(new_value.values[i].id);\n\t }\n\t\n\t // identify suitable select field\n\t if (new_value && new_value.values.length > 0 && new_value.values[0].src == 'hdca') {\n\t this.current = 'collection';\n\t this.select_collection.value(list);\n\t } else {\n\t if (this.mode == 'multiple') {\n\t this.current = 'multiple';\n\t this.select_multiple.value(list);\n\t } else {\n\t this.current = 'single';\n\t this.select_single.value(list[0]);\n\t }\n\t }\n\t } catch (err) {\n\t Galaxy.emit.debug('tools-select-content::value()', 'Skipped.');\n\t }\n\t } else {\n\t for (var i in this.list) {\n\t this.list[i].field.value(null);\n\t }\n\t }\n\t }\n\t\n\t // refresh view\n\t this.refresh();\n\t\n\t // validate value\n\t var id_list = this._select().value();\n\t if (id_list === null) {\n\t return null;\n\t }\n\t\n\t // transform into an array\n\t if (!(id_list instanceof Array)) {\n\t id_list = [id_list];\n\t }\n\t\n\t // check if value exists\n\t if (id_list.length === 0) {\n\t return null;\n\t }\n\t\n\t // prepare result dict\n\t var result = {\n\t batch : this._batch(),\n\t values : []\n\t }\n\t\n\t // append to dataset ids\n\t for (var i in id_list) {\n\t var details = this.history[id_list[i] + '_' + this.list[this.current].type];\n\t if (details) {\n\t result.values.push(details);\n\t } else {\n\t return null;\n\t }\n\t }\n\t\n\t // sort by history ids\n\t result.values.sort(function(a, b){\n\t return a.hid - b.hid;\n\t });\n\t\n\t // return\n\t return result;\n\t },\n\t\n\t /** Refreshes data selection view */\n\t refresh: function() {\n\t this.button_type.value(this.current);\n\t for (var i in this.list) {\n\t var $el = this.list[i].field.$el;\n\t if (this.current == i) {\n\t $el.show();\n\t } else {\n\t $el.hide();\n\t }\n\t }\n\t if (this._batch()) {\n\t this.$batch.show();\n\t } else {\n\t this.$batch.hide();\n\t }\n\t },\n\t\n\t /** Assists in selecting the current field */\n\t _select: function() {\n\t return this.list[this.current].field;\n\t },\n\t\n\t /** Assists in identifying the batch mode */\n\t _batch: function() {\n\t if (this.current == 'collection') {\n\t var hdca = this.history[this._select().value() + '_hdca'];\n\t if (hdca && hdca.map_over_type) {\n\t return true;\n\t }\n\t }\n\t if (this.current != 'single') {\n\t if (this.mode == 'single') {\n\t return true;\n\t }\n\t }\n\t return false;\n\t },\n\t\n\t /** Batch message template */\n\t template_batch: function() {\n\t return '
    ' +\n\t '' +\n\t 'This is a batch mode input field. A separate job will be triggered for each dataset.' +\n\t '
    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {/**\n\t This is the main class of the form plugin. It is referenced as 'app' in all lower level modules.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(11), __webpack_require__(7), __webpack_require__(42), __webpack_require__(38)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Portlet, Ui, FormSection, FormData) {\n\t return Backbone.View.extend({\n\t initialize: function(options) {\n\t this.options = Utils.merge(options, {\n\t initial_errors : false,\n\t cls : 'ui-portlet-limited',\n\t icon : ''\n\t });\n\t this.modal = ( parent.Galaxy && parent.Galaxy.modal ) || new Ui.Modal.View();\n\t this.setElement('
    ');\n\t this.render();\n\t },\n\t\n\t /** Update available options */\n\t update: function(new_model){\n\t var self = this;\n\t this.data.matchModel(new_model, function(input_id, node) {\n\t var input = self.input_list[input_id];\n\t if (input && input.options) {\n\t if (!_.isEqual(input.options, node.options)) {\n\t // backup new options\n\t input.options = node.options;\n\t\n\t // get/update field\n\t var field = self.field_list[input_id];\n\t if (field.update) {\n\t var new_options = [];\n\t if ((['data', 'data_collection', 'drill_down']).indexOf(input.type) != -1) {\n\t new_options = input.options;\n\t } else {\n\t for (var i in node.options) {\n\t var opt = node.options[i];\n\t if (opt.length > 2) {\n\t new_options.push({\n\t 'label': opt[0],\n\t 'value': opt[1]\n\t });\n\t }\n\t }\n\t }\n\t field.update(new_options);\n\t field.trigger('change');\n\t Galaxy.emit.debug('form-view::update()', 'Updating options for ' + input_id);\n\t }\n\t }\n\t }\n\t });\n\t },\n\t\n\t /** Set form into wait mode */\n\t wait: function(active) {\n\t for (var i in this.input_list) {\n\t var field = this.field_list[i];\n\t var input = this.input_list[i];\n\t if (input.is_dynamic && field.wait && field.unwait) {\n\t if (active) {\n\t field.wait();\n\t } else {\n\t field.unwait();\n\t }\n\t }\n\t }\n\t },\n\t\n\t /** Highlight and scroll to input element (currently only used for error notifications)\n\t */\n\t highlight: function (input_id, message, silent) {\n\t // get input field\n\t var input_element = this.element_list[input_id];\n\t\n\t // check input element\n\t if (input_element) {\n\t // mark error\n\t input_element.error(message || 'Please verify this parameter.');\n\t\n\t // trigger expand event for parent containers\n\t this.trigger('expand', input_id);\n\t\n\t // scroll to first input element\n\t if (!silent) {\n\t if (self==top) {\n\t var $panel = this.$el.parents().filter(function() {\n\t return $(this).css('overflow') == 'auto';\n\t }).first();\n\t $panel.animate({ scrollTop : $panel.scrollTop() + input_element.$el.offset().top - 50 }, 500);\n\t } else {\n\t $('html, body').animate({ scrollTop : input_element.$el.offset().top - 20 }, 500);\n\t }\n\t }\n\t }\n\t },\n\t\n\t /** Highlights errors\n\t */\n\t errors: function(options) {\n\t // hide previous error statements\n\t this.trigger('reset');\n\t\n\t // highlight all errors\n\t if (options && options.errors) {\n\t var error_messages = this.data.matchResponse(options.errors);\n\t for (var input_id in this.element_list) {\n\t var input = this.element_list[input_id];\n\t if (error_messages[input_id]) {\n\t this.highlight(input_id, error_messages[input_id], true);\n\t }\n\t }\n\t }\n\t },\n\t\n\t /** Render tool form\n\t */\n\t render: function() {\n\t // link this\n\t var self = this;\n\t\n\t // reset events\n\t this.off('change');\n\t this.off('reset');\n\t\n\t // reset field list, which contains the input field elements\n\t this.field_list = {};\n\t\n\t // reset sequential input definition list, which contains the input definitions as provided from the api\n\t this.input_list = {};\n\t\n\t // reset input element list, which contains the dom elements of each input element (includes also the input field)\n\t this.element_list = {};\n\t\n\t // creates a json data structure from the input form\n\t this.data = new FormData.Manager(this);\n\t\n\t // create ui elements\n\t this._renderForm();\n\t\n\t // refresh data\n\t this.data.create();\n\t\n\t // show errors on startup\n\t if (this.options.initial_errors) {\n\t this.errors(this.options);\n\t }\n\t\n\t // add listener which triggers on checksum change\n\t var current_check = this.data.checksum();\n\t this.on('change', function() {\n\t var new_check = self.data.checksum();\n\t if (new_check != current_check) {\n\t current_check = new_check;\n\t self.options.onchange && self.options.onchange();\n\t }\n\t });\n\t\n\t // add reset listener\n\t this.on('reset', function() {\n\t for (var i in this.element_list) {\n\t this.element_list[i].reset();\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t /** Renders the UI elements required for the form\n\t */\n\t _renderForm: function() {\n\t // create message view\n\t this.message = new Ui.Message();\n\t\n\t // create tool form section\n\t this.section = new FormSection.View(this, {\n\t inputs : this.options.inputs\n\t });\n\t\n\t // remove tooltips\n\t $( '.tooltip' ).remove();\n\t\n\t // create portlet\n\t this.portlet = new Portlet.View({\n\t icon : this.options.icon,\n\t title : this.options.title,\n\t cls : this.options.cls,\n\t operations : this.options.operations,\n\t buttons : this.options.buttons,\n\t collapsible : this.options.collapsible,\n\t collapsed : this.options.collapsed\n\t });\n\t\n\t // append message\n\t this.portlet.append(this.message.$el.addClass('ui-margin-top'));\n\t\n\t // append tool section\n\t this.portlet.append(this.section.$el);\n\t\n\t // start form\n\t this.$el.empty();\n\t this.$el.append(this.portlet.$el);\n\t\n\t // show message if available in model\n\t if (this.options.message) {\n\t this.message.update({\n\t persistent : true,\n\t status : 'warning',\n\t message : this.options.message\n\t });\n\t }\n\t\n\t // log\n\t Galaxy.emit.debug('form-view::initialize()', 'Completed');\n\t }\n\t });\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(35),\n\t __webpack_require__(46),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DC_MODEL, HISTORY_CONTENT, _l ){\n\t/*==============================================================================\n\t\n\tModels for DatasetCollections contained within a history.\n\t\n\tTODO:\n\t these might be compactable to one class if some duplication with\n\t collection-model is used.\n\t\n\t==============================================================================*/\n\tvar hcontentMixin = HISTORY_CONTENT.HistoryContentMixin,\n\t ListDC = DC_MODEL.ListDatasetCollection,\n\t PairDC = DC_MODEL.PairDatasetCollection,\n\t ListPairedDC = DC_MODEL.ListPairedDatasetCollection;\n\t\n\t//==============================================================================\n\t/** Override to post to contents route w/o id. */\n\tfunction buildHDCASave( _super ){\n\t return function _save( attributes, options ){\n\t if( this.isNew() ){\n\t options = options || {};\n\t options.url = this.urlRoot + this.get( 'history_id' ) + '/contents';\n\t attributes = attributes || {};\n\t attributes.type = 'dataset_collection';\n\t }\n\t return _super.call( this, attributes, options );\n\t };\n\t}\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for List Dataset Collection within a History.\n\t */\n\tvar HistoryListDatasetCollection = ListDC.extend( hcontentMixin ).extend(\n\t/** @lends HistoryListDatasetCollection.prototype */{\n\t\n\t defaults : _.extend( _.clone( ListDC.prototype.defaults ), {\n\t history_content_type: 'dataset_collection',\n\t collection_type : 'list',\n\t model_class : 'HistoryDatasetCollectionAssociation'\n\t }),\n\t\n\t initialize : function( model, options ){\n\t ListDC.prototype.initialize.call( this, model, options );\n\t hcontentMixin.initialize.call( this, model, options );\n\t },\n\t\n\t /** Override to post to contents route w/o id. */\n\t save : buildHDCASave( ListDC.prototype.save ),\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'HistoryListDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for Pair Dataset Collection within a History.\n\t * @constructs\n\t */\n\tvar HistoryPairDatasetCollection = PairDC.extend( hcontentMixin ).extend(\n\t/** @lends HistoryPairDatasetCollection.prototype */{\n\t\n\t defaults : _.extend( _.clone( PairDC.prototype.defaults ), {\n\t history_content_type: 'dataset_collection',\n\t collection_type : 'paired',\n\t model_class : 'HistoryDatasetCollectionAssociation'\n\t }),\n\t\n\t initialize : function( model, options ){\n\t PairDC.prototype.initialize.call( this, model, options );\n\t hcontentMixin.initialize.call( this, model, options );\n\t },\n\t\n\t /** Override to post to contents route w/o id. */\n\t save : buildHDCASave( PairDC.prototype.save ),\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'HistoryPairDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for List of Pairs Dataset Collection within a History.\n\t * @constructs\n\t */\n\tvar HistoryListPairedDatasetCollection = ListPairedDC.extend( hcontentMixin ).extend(\n\t/** @lends HistoryListPairedDatasetCollection.prototype */{\n\t\n\t defaults : _.extend( _.clone( ListPairedDC.prototype.defaults ), {\n\t history_content_type: 'dataset_collection',\n\t collection_type : 'list:paired',\n\t model_class : 'HistoryDatasetCollectionAssociation'\n\t }),\n\t\n\t initialize : function( model, options ){\n\t ListPairedDC.prototype.initialize.call( this, model, options );\n\t hcontentMixin.initialize.call( this, model, options );\n\t },\n\t\n\t /** Override to post to contents route w/o id. */\n\t save : buildHDCASave( ListPairedDC.prototype.save ),\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'HistoryListPairedDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HistoryListDatasetCollection : HistoryListDatasetCollection,\n\t HistoryPairDatasetCollection : HistoryPairDatasetCollection,\n\t HistoryListPairedDatasetCollection : HistoryListPairedDatasetCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(15),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( STATES, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'history';\n\t//==============================================================================\n\t/** How the type_id attribute is built for the history's mixed contents collection */\n\tvar typeIdStr = function _typeIdStr( type, id ){\n\t return [ type, id ].join( '-' );\n\t};\n\t\n\t//==============================================================================\n\t/** @class Mixin for HistoryContents content (HDAs, HDCAs).\n\t */\n\tvar HistoryContentMixin = {\n\t//TODO:?? into true Backbone.Model?\n\t\n\t /** default attributes for a model */\n\t defaults : {\n\t /** parent (containing) history */\n\t history_id : null,\n\t /** some content_type (HistoryContents can contain mixed model classes) */\n\t history_content_type: null,\n\t /** indicating when/what order the content was generated in the context of the history */\n\t hid : null,\n\t /** whether the user wants the content shown (visible) */\n\t visible : true\n\t },\n\t\n\t // ........................................................................ mixed content element\n\t//TODO: there's got to be a way to move this into HistoryContents - if we can do that, this class might not be needed\n\t // In order to be part of a MIXED bbone collection, we can't rely on the id\n\t // (which may collide btwn models of different classes)\n\t // Build a new id (type_id) that prefixes the history_content_type so the bbone collection can differentiate\n\t idAttribute : 'type_id',\n\t\n\t /** override constructor to build type_id and insert into original attributes */\n\t constructor : function( attrs, options ){\n\t attrs.type_id = typeIdStr( attrs.history_content_type, attrs.id );\n\t this.debug( 'HistoryContentMixin.constructor:', attrs.type_id );\n\t Backbone.Model.apply( this, arguments );\n\t },\n\t\n\t /** object level fn for building the type_id string */\n\t _typeIdStr : function(){\n\t return typeIdStr( this.get( 'history_content_type' ), this.get( 'id' ) );\n\t },\n\t\n\t /** add listener to re-create type_id when the id changes */\n\t initialize : function( attrs, options ){\n\t this.on( 'change:id', this._createTypeId );\n\t },\n\t\n\t /** set the type_id in the model attributes */\n\t _createTypeId : function(){\n\t this.set( 'type_id', this._typeIdStr() );\n\t },\n\t\n\t /** override because backbone tests boolean( idAttribute ), but it's not an empty string even for new models\n\t * due to our use of type_id.\n\t */\n\t isNew : function(){\n\t return !this.get( 'id' );\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** the more common alias of visible */\n\t hidden : function(){\n\t return !this.get( 'visible' );\n\t },\n\t\n\t /** based on show_deleted, show_hidden (gen. from the container control),\n\t * would this ds show in the list of ds's?\n\t * @param {Boolean} show_deleted are we showing deleted hdas?\n\t * @param {Boolean} show_hidden are we showing hidden hdas?\n\t */\n\t isVisible : function( show_deleted, show_hidden ){\n\t//TODO:?? Another unfortunate name collision\n\t var isVisible = true;\n\t if( ( !show_deleted )\n\t && ( this.get( 'deleted' ) || this.get( 'purged' ) ) ){\n\t isVisible = false;\n\t }\n\t if( ( !show_hidden )\n\t && ( !this.get( 'visible' ) ) ){\n\t isVisible = false;\n\t }\n\t return isVisible;\n\t },\n\t\n\t // ........................................................................ ajax\n\t//TODO: global\n\t//TODO: these are probably better done on the leaf classes\n\t /** history content goes through the 'api/histories' API */\n\t urlRoot: Galaxy.root + 'api/histories/',\n\t\n\t /** full url spec. for this content */\n\t url : function(){\n\t var url = this.urlRoot + this.get( 'history_id' ) + '/contents/'\n\t + this.get('history_content_type') + 's/' + this.get( 'id' );\n\t return url;\n\t },\n\t\n\t /** save this content as not visible */\n\t hide : function( options ){\n\t if( !this.get( 'visible' ) ){ return jQuery.when(); }\n\t return this.save( { visible: false }, options );\n\t },\n\t /** save this content as visible */\n\t unhide : function( options ){\n\t if( this.get( 'visible' ) ){ return jQuery.when(); }\n\t return this.save( { visible: true }, options );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** String representation */\n\t toString : function(){\n\t var nameAndId = this.get( 'id' ) || '';\n\t if( this.get( 'name' ) ){\n\t nameAndId = this.get( 'hid' ) + ' :\"' + this.get( 'name' ) + '\",' + nameAndId;\n\t }\n\t return 'HistoryContent(' + nameAndId + ')';\n\t }\n\t};\n\t\n\t\n\t//==============================================================================\n\t//TODO: needed?\n\t/** @class (Concrete/non-mixin) base model for content items.\n\t */\n\tvar HistoryContent = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( HistoryContentMixin )\n\t .extend({ _logNamespace : logNamespace });\n\t\n\t\n\t//==============================================================================\n\t return {\n\t typeIdStr : typeIdStr,\n\t HistoryContentMixin : HistoryContentMixin,\n\t HistoryContent : HistoryContent\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(46),\n\t __webpack_require__(97),\n\t __webpack_require__(45),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HISTORY_CONTENT, HDA_MODEL, HDCA_MODEL, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'history';\n\t//==============================================================================\n\t/** @class Backbone collection for history content.\n\t * NOTE: history content seems like a dataset collection, but differs in that it is mixed:\n\t * each element can be either an HDA (dataset) or a DatasetCollection and co-exist on\n\t * the same level.\n\t * Dataset collections on the other hand are not mixed and (so far) can only contain either\n\t * HDAs or child dataset collections on one level.\n\t * This is why this does not inherit from any of the DatasetCollections (currently).\n\t */\n\tvar HistoryContents = Backbone.Collection\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend(/** @lends HistoryContents.prototype */{\n\t//TODO:?? may want to inherit from some MixedModelCollection\n\t//TODO:?? also consider inheriting from a 'DatasetList'\n\t//TODO: can we decorate the mixed models using the model fn below (instead of having them build their own type_id)?\n\t\n\t _logNamespace : logNamespace,\n\t\n\t /** since history content is a mix, override model fn into a factory, creating based on history_content_type */\n\t model : function( attrs, options ) {\n\t//TODO: can we move the type_id stuff here?\n\t //attrs.type_id = typeIdStr( attrs );\n\t\n\t if( attrs.history_content_type === \"dataset\" ) {\n\t return new HDA_MODEL.HistoryDatasetAssociation( attrs, options );\n\t\n\t } else if( attrs.history_content_type === \"dataset_collection\" ) {\n\t switch( attrs.collection_type ){\n\t case 'list':\n\t return new HDCA_MODEL.HistoryListDatasetCollection( attrs, options );\n\t case 'paired':\n\t return new HDCA_MODEL.HistoryPairDatasetCollection( attrs, options );\n\t case 'list:paired':\n\t return new HDCA_MODEL.HistoryListPairedDatasetCollection( attrs, options );\n\t }\n\t // This is a hack inside a hack:\n\t // Raise a plain object with validationError to fake a model.validationError\n\t // (since we don't have a model to use validate with)\n\t // (the outer hack being the mixed content/model function in this collection)\n\t return { validationError : 'Unknown collection_type: ' + attrs.history_content_type };\n\t }\n\t return { validationError : 'Unknown history_content_type: ' + attrs.history_content_type };\n\t },\n\t\n\t /** Set up.\n\t * @see Backbone.Collection#initialize\n\t */\n\t initialize : function( models, options ){\n\t options = options || {};\n\t//TODO: could probably use the contents.history_id instead\n\t this.historyId = options.historyId;\n\t //this._setUpListeners();\n\t\n\t // backbonejs uses collection.model.prototype.idAttribute to determine if a model is *already* in a collection\n\t // and either merged or replaced. In this case, our 'model' is a function so we need to add idAttribute\n\t // manually here - if we don't, contents will not merge but be replaced/swapped.\n\t this.model.prototype.idAttribute = 'type_id';\n\t\n\t this.on( 'all', function(){\n\t this.debug( this + '.event:', arguments );\n\t });\n\t },\n\t\n\t /** root api url */\n\t urlRoot : Galaxy.root + 'api/histories',\n\t /** complete api url */\n\t url : function(){\n\t return this.urlRoot + '/' + this.historyId + '/contents';\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** Get the ids of every item in this collection\n\t * @returns array of encoded ids\n\t */\n\t ids : function(){\n\t//TODO: is this still useful since type_id\n\t return this.map( function( item ){ return item.get('id'); });\n\t },\n\t\n\t /** Get contents that are not ready\n\t * @returns array of content models\n\t */\n\t notReady : function(){\n\t return this.filter( function( content ){\n\t return !content.inReadyState();\n\t });\n\t },\n\t\n\t /** Get the id of every model in this collection not in a 'ready' state (running).\n\t * @returns an array of model ids\n\t * @see HistoryDatasetAssociation#inReadyState\n\t */\n\t running : function(){\n\t var idList = [];\n\t this.each( function( item ){\n\t var isRunning = !item.inReadyState();\n\t if( isRunning ){\n\t//TODO: is this still correct since type_id\n\t idList.push( item.get( 'id' ) );\n\t }\n\t });\n\t return idList;\n\t },\n\t\n\t /** Get the model with the given hid\n\t * @param {Int} hid the hid to search for\n\t * @returns {HistoryDatasetAssociation} the model with the given hid or undefined if not found\n\t */\n\t getByHid : function( hid ){\n\t return _.first( this.filter( function( content ){ return content.get( 'hid' ) === hid; }) );\n\t },\n\t\n\t //TODO:?? this may belong in the containing view\n\t /** Get every 'shown' model in this collection based on show_deleted/hidden\n\t * @param {Boolean} show_deleted are we showing deleted content?\n\t * @param {Boolean} show_hidden are we showing hidden content?\n\t * @returns array of content models\n\t * @see HistoryDatasetAssociation#isVisible\n\t */\n\t getVisible : function( show_deleted, show_hidden, filters ){\n\t filters = filters || [];\n\t //this.debug( 'filters:', filters );\n\t // always filter by show deleted/hidden first\n\t this.debug( 'checking isVisible' );\n\t var filteredHdas = new HistoryContents( this.filter( function( item ){\n\t return item.isVisible( show_deleted, show_hidden );\n\t }));\n\t\n\t _.each( filters, function( filterFn ){\n\t if( !_.isFunction( filterFn ) ){ return; }\n\t filteredHdas = new HistoryContents( filteredHdas.filter( filterFn ) );\n\t });\n\t return filteredHdas;\n\t },\n\t\n\t /** return a new contents collection of only hidden items */\n\t hidden : function(){\n\t function filterFn( c ){ return c.hidden(); }\n\t return new HistoryContents( this.filter( filterFn ) );\n\t },\n\t\n\t /** return a new contents collection of only hidden items */\n\t deleted : function(){\n\t function filterFn( c ){ return c.get( 'deleted' ); }\n\t return new HistoryContents( this.filter( filterFn ) );\n\t },\n\t\n\t /** return true if any contents don't have details */\n\t haveDetails : function(){\n\t return this.all( function( content ){ return content.hasDetails(); });\n\t },\n\t\n\t // ........................................................................ ajax\n\t /** fetch detailed model data for all contents in this collection */\n\t fetchAllDetails : function( options ){\n\t options = options || {};\n\t var detailsFlag = { details: 'all' };\n\t options.data = ( options.data )?( _.extend( options.data, detailsFlag ) ):( detailsFlag );\n\t return this.fetch( options );\n\t },\n\t\n\t /** using a queue, perform ajaxFn on each of the models in this collection */\n\t ajaxQueue : function( ajaxFn, options ){\n\t var deferred = jQuery.Deferred(),\n\t startingLength = this.length,\n\t responses = [];\n\t\n\t if( !startingLength ){\n\t deferred.resolve([]);\n\t return deferred;\n\t }\n\t\n\t // use reverse order (stylistic choice)\n\t var ajaxFns = this.chain().reverse().map( function( content, i ){\n\t return function(){\n\t var xhr = ajaxFn.call( content, options );\n\t // if successful, notify using the deferred to allow tracking progress\n\t xhr.done( function( response ){\n\t deferred.notify({ curr: i, total: startingLength, response: response, model: content });\n\t });\n\t // (regardless of previous error or success) if not last ajax call, shift and call the next\n\t // if last fn, resolve deferred\n\t xhr.always( function( response ){\n\t responses.push( response );\n\t if( ajaxFns.length ){\n\t ajaxFns.shift()();\n\t } else {\n\t deferred.resolve( responses );\n\t }\n\t });\n\t };\n\t }).value();\n\t // start the queue\n\t ajaxFns.shift()();\n\t\n\t return deferred;\n\t },\n\t\n\t isCopyable : function( contentsJSON ){\n\t var copyableModelClasses = [\n\t 'HistoryDatasetAssociation',\n\t 'HistoryDatasetCollectionAssociation'\n\t ];\n\t return ( ( _.isObject( contentsJSON ) && contentsJSON.id )\n\t && ( _.contains( copyableModelClasses, contentsJSON.model_class ) ) );\n\t },\n\t\n\t /** copy an existing, accessible hda into this collection */\n\t copy : function( json ){\n\t var id, type, contentType;\n\t if( _.isString( json ) ){\n\t id = json;\n\t contentType = 'hda';\n\t type = 'dataset';\n\t } else {\n\t id = json.id;\n\t contentType = ({\n\t 'HistoryDatasetAssociation' : 'hda',\n\t 'LibraryDatasetDatasetAssociation' : 'ldda',\n\t 'HistoryDatasetCollectionAssociation' : 'hdca'\n\t })[ json.model_class ] || 'hda';\n\t type = ( contentType === 'hdca'? 'dataset_collection' : 'dataset' );\n\t }\n\t var collection = this,\n\t xhr = jQuery.post( this.url(), {\n\t content : id,\n\t source : contentType,\n\t type : type\n\t })\n\t .done( function( response ){\n\t collection.add([ response ]);\n\t })\n\t .fail( function( error, status, message ){\n\t collection.trigger( 'error', collection, xhr, {},\n\t 'Error copying contents', { type: type, id: id, source: contentType });\n\t });\n\t return xhr;\n\t },\n\t\n\t // ........................................................................ sorting/filtering\n\t /** return a new collection of contents whose attributes contain the substring matchesWhat */\n\t matches : function( matchesWhat ){\n\t return this.filter( function( content ){\n\t return content.matches( matchesWhat );\n\t });\n\t },\n\t\n\t // ........................................................................ misc\n\t /** override to ensure type id is set */\n\t set : function( models, options ){\n\t models = _.isArray( models )? models : [ models ];\n\t _.each( models, function( model ){\n\t if( !model.type_id || !model.get || !model.get( 'type_id' ) ){\n\t model.type_id = HISTORY_CONTENT.typeIdStr( model.history_content_type, model.id );\n\t }\n\t });\n\t Backbone.Collection.prototype.set.call( this, models, options );\n\t },\n\t\n\t /** */\n\t createHDCA : function( elementIdentifiers, collectionType, name, options ){\n\t //precondition: elementIdentifiers is an array of plain js objects\n\t // in the proper form to create the collectionType\n\t var contents = this,\n\t typeToModel = {\n\t list : HDCA_MODEL.HistoryListDatasetCollection,\n\t paired : HDCA_MODEL.HistoryPairDatasetCollection\n\t },\n\t hdca = new (typeToModel[ collectionType ])({\n\t history_id : this.historyId,\n\t name : name,\n\t // should probably be able to just send in a bunch of json here and restruct per class\n\t element_identifiers : elementIdentifiers\n\t });\n\t // do I even need to use new above, can I just pass the attrs here\n\t return hdca.save()\n\t .done( function( response ){\n\t contents.add( hdca );\n\t })\n\t .fail( function( xhr, status, message ){\n\t contents.trigger( 'error', xhr, status, message );\n\t });\n\t },\n\t\n\t\n\t /** In this override, copy the historyId to the clone */\n\t clone : function(){\n\t var clone = Backbone.Collection.prototype.clone.call( this );\n\t clone.historyId = this.historyId;\n\t return clone;\n\t },\n\t\n\t /** debugging */\n\t print : function(){\n\t var contents = this;\n\t contents.each( function( c ){\n\t contents.debug( c );\n\t if( c.elements ){\n\t contents.debug( '\\t elements:', c.elements );\n\t }\n\t });\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'HistoryContents(', [ this.historyId, this.length ].join(), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HistoryContents : HistoryContents\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'list';\n\t//==============================================================================\n\t/** A view which, when first rendered, shows only summary data/attributes, but\n\t * can be expanded to show further details (and optionally fetch those\n\t * details from the server).\n\t */\n\tvar ExpandableView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t//TODO: Although the reasoning behind them is different, this shares a lot with HiddenUntilActivated above: combine them\n\t //PRECONDITION: model must have method hasDetails\n\t //PRECONDITION: subclasses must have templates.el and templates.details\n\t\n\t initialize : function( attributes ){\n\t /** are the details of this view expanded/shown or not? */\n\t this.expanded = attributes.expanded || false;\n\t this.log( '\\t expanded:', this.expanded );\n\t this.fxSpeed = attributes.fxSpeed !== undefined? attributes.fxSpeed : this.fxSpeed;\n\t },\n\t\n\t // ........................................................................ render main\n\t /** jq fx speed */\n\t fxSpeed : 'fast',\n\t\n\t /** Render this content, set up ui.\n\t * @param {Number or String} speed the speed of the render\n\t */\n\t render : function( speed ){\n\t var $newRender = this._buildNewRender();\n\t this._setUpBehaviors( $newRender );\n\t this._queueNewRender( $newRender, speed );\n\t return this;\n\t },\n\t\n\t /** Build a temp div containing the new children for the view's $el.\n\t * If the view is already expanded, build the details as well.\n\t */\n\t _buildNewRender : function(){\n\t // create a new render using a skeleton template, render title buttons, render body, and set up events, etc.\n\t var $newRender = $( this.templates.el( this.model.toJSON(), this ) );\n\t if( this.expanded ){\n\t this.$details( $newRender ).replaceWith( this._renderDetails().show() );\n\t }\n\t return $newRender;\n\t },\n\t\n\t /** Fade out the old el, swap in the new contents, then fade in.\n\t * @param {Number or String} speed jq speed to use for rendering effects\n\t * @fires rendered when rendered\n\t */\n\t _queueNewRender : function( $newRender, speed ) {\n\t speed = ( speed === undefined )?( this.fxSpeed ):( speed );\n\t var view = this;\n\t\n\t $( view ).queue( 'fx', [\n\t function( next ){ this.$el.fadeOut( speed, next ); },\n\t function( next ){\n\t view._swapNewRender( $newRender );\n\t next();\n\t },\n\t function( next ){ this.$el.fadeIn( speed, next ); },\n\t function( next ){\n\t this.trigger( 'rendered', view );\n\t next();\n\t }\n\t ]);\n\t },\n\t\n\t /** empty out the current el, move the $newRender's children in */\n\t _swapNewRender : function( $newRender ){\n\t return this.$el.empty()\n\t .attr( 'class', _.isFunction( this.className )? this.className(): this.className )\n\t .append( $newRender.children() );\n\t },\n\t\n\t /** set up js behaviors, event handlers for elements within the given container\n\t * @param {jQuery} $container jq object that contains the elements to process (defaults to this.$el)\n\t */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t // set up canned behavior on children (bootstrap, popupmenus, editable_text, etc.)\n\t //make_popup_menus( $where );\n\t $where.find( '[title]' ).tooltip({ placement : 'bottom' });\n\t },\n\t\n\t // ......................................................................... details\n\t /** shortcut to details DOM (as jQ) */\n\t $details : function( $where ){\n\t $where = $where || this.$el;\n\t return $where.find( '> .details' );\n\t },\n\t\n\t /** build the DOM for the details and set up behaviors on it */\n\t _renderDetails : function(){\n\t var $newDetails = $( this.templates.details( this.model.toJSON(), this ) );\n\t this._setUpBehaviors( $newDetails );\n\t return $newDetails;\n\t },\n\t\n\t // ......................................................................... expansion/details\n\t /** Show or hide the details\n\t * @param {Boolean} expand if true, expand; if false, collapse\n\t */\n\t toggleExpanded : function( expand ){\n\t expand = ( expand === undefined )?( !this.expanded ):( expand );\n\t if( expand ){\n\t this.expand();\n\t } else {\n\t this.collapse();\n\t }\n\t return this;\n\t },\n\t\n\t /** Render and show the full, detailed body of this view including extra data and controls.\n\t * note: if the model does not have detailed data, fetch that data before showing the body\n\t * @fires expanded when a body has been expanded\n\t */\n\t expand : function(){\n\t var view = this;\n\t return view._fetchModelDetails().always( function(){\n\t view._expand();\n\t });\n\t },\n\t\n\t /** Check for model details and, if none, fetch them.\n\t * @returns {jQuery.promise} the model.fetch.xhr if details are being fetched, an empty promise if not\n\t */\n\t _fetchModelDetails : function(){\n\t if( !this.model.hasDetails() ){\n\t return this.model.fetch();\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t /** Inner fn called when expand (public) has fetched the details */\n\t _expand : function(){\n\t var view = this,\n\t $newDetails = view._renderDetails();\n\t view.$details().replaceWith( $newDetails );\n\t // needs to be set after the above or the slide will not show\n\t view.expanded = true;\n\t view.$details().slideDown({\n\t duration : view.fxSpeed,\n\t step: function(){\n\t view.trigger( 'expanding', view );\n\t },\n\t complete: function(){\n\t view.trigger( 'expanded', view );\n\t }\n\t });\n\t },\n\t\n\t /** Hide the body/details of an HDA.\n\t * @fires collapsed when a body has been collapsed\n\t */\n\t collapse : function(){\n\t this.debug( this + '(ExpandableView).collapse' );\n\t var view = this;\n\t view.expanded = false;\n\t this.$details().slideUp({\n\t duration : view.fxSpeed,\n\t step: function(){\n\t view.trigger( 'collapsing', view );\n\t },\n\t complete: function(){\n\t view.trigger( 'collapsed', view );\n\t }\n\t });\n\t }\n\t\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** A view that is displayed in some larger list/grid/collection.\n\t * Inherits from Expandable, Selectable, Draggable.\n\t * The DOM contains warnings, a title bar, and a series of primary action controls.\n\t * Primary actions are meant to be easily accessible item functions (such as delete)\n\t * that are rendered in the title bar.\n\t *\n\t * Details are rendered when the user clicks the title bar or presses enter/space when\n\t * the title bar is in focus.\n\t *\n\t * Designed as a base class for history panel contents - but usable elsewhere (I hope).\n\t */\n\tvar ListItemView = ExpandableView.extend(\n\t BASE_MVC.mixin( BASE_MVC.SelectableViewMixin, BASE_MVC.DraggableViewMixin, {\n\t\n\t//TODO: that's a little contradictory\n\t tagName : 'div',\n\t className : 'list-item',\n\t\n\t /** Set up the base class and all mixins */\n\t initialize : function( attributes ){\n\t ExpandableView.prototype.initialize.call( this, attributes );\n\t BASE_MVC.SelectableViewMixin.initialize.call( this, attributes );\n\t BASE_MVC.DraggableViewMixin.initialize.call( this, attributes );\n\t this._setUpListeners();\n\t },\n\t\n\t /** event listeners */\n\t _setUpListeners : function(){\n\t // hide the primary actions in the title bar when selectable and narrow\n\t this.on( 'selectable', function( isSelectable ){\n\t if( isSelectable ){\n\t this.$( '.primary-actions' ).hide();\n\t } else {\n\t this.$( '.primary-actions' ).show();\n\t }\n\t }, this );\n\t //this.on( 'all', function( event ){\n\t // this.log( event );\n\t //}, this );\n\t return this;\n\t },\n\t\n\t // ........................................................................ rendering\n\t /** In this override, call methods to build warnings, titlebar and primary actions */\n\t _buildNewRender : function(){\n\t var $newRender = ExpandableView.prototype._buildNewRender.call( this );\n\t $newRender.children( '.warnings' ).replaceWith( this._renderWarnings() );\n\t $newRender.children( '.title-bar' ).replaceWith( this._renderTitleBar() );\n\t $newRender.children( '.primary-actions' ).append( this._renderPrimaryActions() );\n\t $newRender.find( '> .title-bar .subtitle' ).replaceWith( this._renderSubtitle() );\n\t return $newRender;\n\t },\n\t\n\t /** In this override, render the selector controls and set up dragging before the swap */\n\t _swapNewRender : function( $newRender ){\n\t ExpandableView.prototype._swapNewRender.call( this, $newRender );\n\t if( this.selectable ){ this.showSelector( 0 ); }\n\t if( this.draggable ){ this.draggableOn(); }\n\t return this.$el;\n\t },\n\t\n\t /** Render any warnings the item may need to show (e.g. \"I'm deleted\") */\n\t _renderWarnings : function(){\n\t var view = this,\n\t $warnings = $( '
    ' ),\n\t json = view.model.toJSON();\n\t//TODO:! unordered (map)\n\t _.each( view.templates.warnings, function( templateFn ){\n\t $warnings.append( $( templateFn( json, view ) ) );\n\t });\n\t return $warnings;\n\t },\n\t\n\t /** Render the title bar (the main/exposed SUMMARY dom element) */\n\t _renderTitleBar : function(){\n\t return $( this.templates.titleBar( this.model.toJSON(), this ) );\n\t },\n\t\n\t /** Return an array of jQ objects containing common/easily-accessible item controls */\n\t _renderPrimaryActions : function(){\n\t // override this\n\t return [];\n\t },\n\t\n\t /** Render the title bar (the main/exposed SUMMARY dom element) */\n\t _renderSubtitle : function(){\n\t return $( this.templates.subtitle( this.model.toJSON(), this ) );\n\t },\n\t\n\t // ......................................................................... events\n\t /** event map */\n\t events : {\n\t // expand the body when the title is clicked or when in focus and space or enter is pressed\n\t 'click .title-bar' : '_clickTitleBar',\n\t 'keydown .title-bar' : '_keyDownTitleBar',\n\t\n\t // dragging - don't work, originalEvent === null\n\t //'dragstart .dataset-title-bar' : 'dragStartHandler',\n\t //'dragend .dataset-title-bar' : 'dragEndHandler'\n\t\n\t 'click .selector' : 'toggleSelect'\n\t },\n\t\n\t /** expand when the title bar is clicked */\n\t _clickTitleBar : function( event ){\n\t event.stopPropagation();\n\t if( event.altKey ){\n\t this.toggleSelect( event );\n\t if( !this.selectable ){\n\t this.showSelector();\n\t }\n\t } else {\n\t this.toggleExpanded();\n\t }\n\t },\n\t\n\t /** expand when the title bar is in focus and enter or space is pressed */\n\t _keyDownTitleBar : function( event ){\n\t // bail (with propagation) if keydown and not space or enter\n\t var KEYCODE_SPACE = 32, KEYCODE_RETURN = 13;\n\t if( event && ( event.type === 'keydown' )\n\t &&( event.keyCode === KEYCODE_SPACE || event.keyCode === KEYCODE_RETURN ) ){\n\t this.toggleExpanded();\n\t event.stopPropagation();\n\t return false;\n\t }\n\t return true;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'ListItemView(' + modelString + ')';\n\t }\n\t}));\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tListItemView.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var elTemplato = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t // errors, messages, etc.\n\t '
    ',\n\t\n\t // multi-select checkbox\n\t '
    ',\n\t '',\n\t '
    ',\n\t // space for title bar buttons - gen. floated to the right\n\t '
    ',\n\t '
    ',\n\t\n\t // expandable area for more details\n\t '
    ',\n\t '
    '\n\t ]);\n\t\n\t var warnings = {};\n\t\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t // adding a tabindex here allows focusing the title bar and the use of keydown to expand the dataset display\n\t '
    ',\n\t//TODO: prob. belongs in dataset-list-item\n\t '',\n\t '
    ',\n\t '<%- element.name %>',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ], 'element' );\n\t\n\t var subtitleTemplate = BASE_MVC.wrapTemplate([\n\t // override this\n\t '
    '\n\t ]);\n\t\n\t var detailsTemplate = BASE_MVC.wrapTemplate([\n\t // override this\n\t '
    '\n\t ]);\n\t\n\t return {\n\t el : elTemplato,\n\t warnings : warnings,\n\t titleBar : titleBarTemplate,\n\t subtitle : subtitleTemplate,\n\t details : detailsTemplate\n\t };\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** A view that is displayed in some larger list/grid/collection.\n\t * *AND* can display some sub-list of it's own when expanded (e.g. dataset collections).\n\t * This list will 'foldout' when the item is expanded depending on this.foldoutStyle:\n\t * If 'foldout': will expand vertically to show the nested list\n\t * If 'drilldown': will overlay the parent list\n\t *\n\t * Inherits from ListItemView.\n\t *\n\t * _renderDetails does the work of creating this.details: a sub-view that shows the nested list\n\t */\n\tvar FoldoutListItemView = ListItemView.extend({\n\t\n\t /** If 'foldout': show the sub-panel inside the expanded item\n\t * If 'drilldown': only fire events and handle by pub-sub\n\t * (allow the panel containing this item to attach it, hide itself, etc.)\n\t */\n\t foldoutStyle : 'foldout',\n\t /** Panel view class to instantiate for the sub-panel */\n\t foldoutPanelClass : null,\n\t\n\t /** override to:\n\t * add attributes foldoutStyle and foldoutPanelClass for config poly\n\t * disrespect attributes.expanded if drilldown\n\t */\n\t initialize : function( attributes ){\n\t//TODO: hackish\n\t if( this.foldoutStyle === 'drilldown' ){ this.expanded = false; }\n\t this.foldoutStyle = attributes.foldoutStyle || this.foldoutStyle;\n\t this.foldoutPanelClass = attributes.foldoutPanelClass || this.foldoutPanelClass;\n\t\n\t ListItemView.prototype.initialize.call( this, attributes );\n\t this.foldout = this._createFoldoutPanel();\n\t },\n\t\n\t//TODO:?? override to exclude foldout scope?\n\t //$ : function( selector ){\n\t // var $found = ListItemView.prototype.$.call( this, selector );\n\t // return $found;\n\t //},\n\t\n\t /** in this override, attach the foldout panel when rendering details */\n\t _renderDetails : function(){\n\t//TODO: hackish\n\t if( this.foldoutStyle === 'drilldown' ){ return $(); }\n\t var $newDetails = ListItemView.prototype._renderDetails.call( this );\n\t return this._attachFoldout( this.foldout, $newDetails );\n\t },\n\t\n\t /** In this override, handle collection expansion. */\n\t _createFoldoutPanel : function(){\n\t var model = this.model;\n\t var FoldoutClass = this._getFoldoutPanelClass( model ),\n\t options = this._getFoldoutPanelOptions( model ),\n\t foldout = new FoldoutClass( _.extend( options, {\n\t model : model\n\t }));\n\t return foldout;\n\t },\n\t\n\t /** Stub to return proper foldout panel class */\n\t _getFoldoutPanelClass : function(){\n\t // override\n\t return this.foldoutPanelClass;\n\t },\n\t\n\t /** Stub to return proper foldout panel options */\n\t _getFoldoutPanelOptions : function(){\n\t return {\n\t // propagate foldout style down\n\t foldoutStyle : this.foldoutStyle,\n\t fxSpeed : this.fxSpeed\n\t };\n\t },\n\t\n\t /** Render the foldout panel inside the view, hiding controls */\n\t _attachFoldout : function( foldout, $whereTo ){\n\t $whereTo = $whereTo || this.$( '> .details' );\n\t this.foldout = foldout.render( 0 );\n\t//TODO: hack\n\t foldout.$( '> .controls' ).hide();\n\t return $whereTo.append( foldout.$el );\n\t },\n\t\n\t /** In this override, branch on foldoutStyle to show expanded */\n\t expand : function(){\n\t var view = this;\n\t return view._fetchModelDetails()\n\t .always(function(){\n\t if( view.foldoutStyle === 'foldout' ){\n\t view._expand();\n\t } else if( view.foldoutStyle === 'drilldown' ){\n\t view._expandByDrilldown();\n\t }\n\t });\n\t },\n\t\n\t /** For drilldown, set up close handler and fire expanded:drilldown\n\t * containing views can listen to this and handle other things\n\t * (like hiding themselves) by listening for expanded/collapsed:drilldown\n\t */\n\t _expandByDrilldown : function(){\n\t var view = this;\n\t // attachment and rendering done by listener\n\t view.foldout.on( 'close', function(){\n\t view.trigger( 'collapsed:drilldown', view, view.foldout );\n\t });\n\t view.trigger( 'expanded:drilldown', view, view.foldout );\n\t }\n\t\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tFoldoutListItemView.prototype.templates = (function(){\n\t\n\t//TODO:?? unnecessary?\n\t // use element identifier\n\t var detailsTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t // override with more info (that goes above the panel)\n\t '
    '\n\t ], 'collection' );\n\t\n\t return _.extend( {}, ListItemView.prototype.templates, {\n\t details : detailsTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t ExpandableView : ExpandableView,\n\t ListItemView : ListItemView,\n\t FoldoutListItemView : FoldoutListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function($) {/**\n\t This is the base class of the tool form plugin. This class is e.g. inherited by the regular and the workflow tool form.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(60), __webpack_require__(7), __webpack_require__(44),\n\t __webpack_require__(23), __webpack_require__(21), __webpack_require__(33)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Deferred, Ui, FormBase, ToolTemplate, CitationModel, CitationView) {\n\t return FormBase.extend({\n\t initialize: function(options) {\n\t var self = this;\n\t FormBase.prototype.initialize.call(this, options);\n\t this.deferred = new Deferred();\n\t if (options.inputs) {\n\t this._buildForm(options);\n\t options.needs_update && this.deferred.execute( function( process ) {\n\t self._updateModel( process );\n\t });\n\t } else {\n\t this.deferred.execute(function(process) {\n\t self._buildModel(process, options, true);\n\t });\n\t }\n\t },\n\t\n\t /** Wait for deferred build processes before removal */\n\t remove: function() {\n\t var self = this;\n\t this.$el.hide();\n\t this.deferred.execute(function(){\n\t FormBase.prototype.remove.call(self);\n\t Galaxy.emit.debug('tool-form-base::remove()', 'Destroy view.');\n\t });\n\t },\n\t\n\t /** Build form */\n\t _buildForm: function(options) {\n\t var self = this;\n\t this.options = Utils.merge(options, this.options);\n\t this.options = Utils.merge({\n\t icon : ( (options.icon === undefined) && 'fa-wrench' ) || '',\n\t title : '' + options.name + ' ' + options.description + ' (Galaxy Version ' + options.version + ')',\n\t operations : this._operations(),\n\t onchange : function() {\n\t self.deferred.reset();\n\t self.deferred.execute(function(process) {\n\t self._updateModel(process);\n\t });\n\t }\n\t }, this.options);\n\t this.options.customize && this.options.customize( this.options );\n\t this.render();\n\t if ( !this.options.collapsible ) {\n\t this.$el.append( $( '
    ' ).addClass( 'ui-margin-top-large' ).append( this._footer() ) );\n\t }\n\t },\n\t\n\t /** Builds a new model through api call and recreates the entire form\n\t */\n\t _buildModel: function(process, options, hide_message) {\n\t var self = this;\n\t this.options.id = options.id;\n\t this.options.version = options.version;\n\t\n\t // build request url\n\t var build_url = '';\n\t var build_data = {};\n\t if ( options.job_id ) {\n\t build_url = Galaxy.root + 'api/jobs/' + options.job_id + '/build_for_rerun';\n\t } else {\n\t build_url = Galaxy.root + 'api/tools/' + options.id + '/build';\n\t if ( Galaxy.params && Galaxy.params.tool_id == options.id ) {\n\t build_data = $.extend( {}, Galaxy.params );\n\t options.version && ( build_data[ 'tool_version' ] = options.version );\n\t }\n\t }\n\t\n\t // get initial model\n\t Utils.request({\n\t type : 'GET',\n\t url : build_url,\n\t data : build_data,\n\t success : function(new_model) {\n\t new_model = new_model.tool_model || new_model;\n\t if( !new_model.display ) {\n\t window.location = Galaxy.root;\n\t return;\n\t }\n\t self._buildForm(new_model);\n\t !hide_message && self.message.update({\n\t status : 'success',\n\t message : 'Now you are using \\'' + self.options.name + '\\' version ' + self.options.version + ', id \\'' + self.options.id + '\\'.',\n\t persistent : false\n\t });\n\t Galaxy.emit.debug('tool-form-base::initialize()', 'Initial tool model ready.', new_model);\n\t process.resolve();\n\t },\n\t error : function(response, xhr) {\n\t var error_message = ( response && response.err_msg ) || 'Uncaught error.';\n\t if ( xhr.status == 401 ) {\n\t window.location = Galaxy.root + 'user/login?' + $.param({ redirect : Galaxy.root + '?tool_id=' + self.options.id });\n\t } else if ( self.$el.is(':empty') ) {\n\t self.$el.prepend((new Ui.Message({\n\t message : error_message,\n\t status : 'danger',\n\t persistent : true,\n\t large : true\n\t })).$el);\n\t } else {\n\t Galaxy.modal.show({\n\t title : 'Tool request failed',\n\t body : error_message,\n\t buttons : {\n\t 'Close' : function() {\n\t Galaxy.modal.hide();\n\t }\n\t }\n\t });\n\t }\n\t Galaxy.emit.debug('tool-form::initialize()', 'Initial tool model request failed.', response);\n\t process.reject();\n\t }\n\t });\n\t },\n\t\n\t /** Request a new model for an already created tool form and updates the form inputs\n\t */\n\t _updateModel: function(process) {\n\t // link this\n\t var self = this;\n\t var model_url = this.options.update_url || Galaxy.root + 'api/tools/' + this.options.id + '/build';\n\t var current_state = {\n\t tool_id : this.options.id,\n\t tool_version : this.options.version,\n\t inputs : $.extend(true, {}, self.data.create())\n\t }\n\t this.wait(true);\n\t\n\t // log tool state\n\t Galaxy.emit.debug('tool-form-base::_updateModel()', 'Sending current state.', current_state);\n\t\n\t // post job\n\t Utils.request({\n\t type : 'POST',\n\t url : model_url,\n\t data : current_state,\n\t success : function(new_model) {\n\t self.update(new_model['tool_model'] || new_model);\n\t self.options.update && self.options.update(new_model);\n\t self.wait(false);\n\t Galaxy.emit.debug('tool-form-base::_updateModel()', 'Received new model.', new_model);\n\t process.resolve();\n\t },\n\t error : function(response) {\n\t Galaxy.emit.debug('tool-form-base::_updateModel()', 'Refresh request failed.', response);\n\t process.reject();\n\t }\n\t });\n\t },\n\t\n\t /** Create tool operation menu\n\t */\n\t _operations: function() {\n\t var self = this;\n\t var options = this.options;\n\t\n\t // button for version selection\n\t var versions_button = new Ui.ButtonMenu({\n\t icon : 'fa-cubes',\n\t title : (!options.narrow && 'Versions') || null,\n\t tooltip : 'Select another tool version'\n\t });\n\t if (!options.sustain_version && options.versions && options.versions.length > 1) {\n\t for (var i in options.versions) {\n\t var version = options.versions[i];\n\t if (version != options.version) {\n\t versions_button.addMenu({\n\t title : 'Switch to ' + version,\n\t version : version,\n\t icon : 'fa-cube',\n\t onclick : function() {\n\t // here we update the tool version (some tools encode the version also in the id)\n\t var id = options.id.replace(options.version, this.version);\n\t var version = this.version;\n\t // queue model request\n\t self.deferred.reset();\n\t self.deferred.execute(function(process) {\n\t self._buildModel(process, {id: id, version: version})\n\t });\n\t }\n\t });\n\t }\n\t }\n\t } else {\n\t versions_button.$el.hide();\n\t }\n\t\n\t // button for options e.g. search, help\n\t var menu_button = new Ui.ButtonMenu({\n\t icon : 'fa-caret-down',\n\t title : (!options.narrow && 'Options') || null,\n\t tooltip : 'View available options'\n\t });\n\t if(options.biostar_url) {\n\t menu_button.addMenu({\n\t icon : 'fa-question-circle',\n\t title : 'Question?',\n\t tooltip : 'Ask a question about this tool (Biostar)',\n\t onclick : function() {\n\t window.open(options.biostar_url + '/p/new/post/');\n\t }\n\t });\n\t menu_button.addMenu({\n\t icon : 'fa-search',\n\t title : 'Search',\n\t tooltip : 'Search help for this tool (Biostar)',\n\t onclick : function() {\n\t window.open(options.biostar_url + '/local/search/page/?q=' + options.name);\n\t }\n\t });\n\t };\n\t menu_button.addMenu({\n\t icon : 'fa-share',\n\t title : 'Share',\n\t tooltip : 'Share this tool',\n\t onclick : function() {\n\t prompt('Copy to clipboard: Ctrl+C, Enter', window.location.origin + Galaxy.root + 'root?tool_id=' + options.id);\n\t }\n\t });\n\t\n\t // add admin operations\n\t if (Galaxy.user && Galaxy.user.get('is_admin')) {\n\t menu_button.addMenu({\n\t icon : 'fa-download',\n\t title : 'Download',\n\t tooltip : 'Download this tool',\n\t onclick : function() {\n\t window.location.href = Galaxy.root + 'api/tools/' + options.id + '/download';\n\t }\n\t });\n\t }\n\t\n\t // button for version selection\n\t if (options.requirements && options.requirements.length > 0) {\n\t menu_button.addMenu({\n\t icon : 'fa-info-circle',\n\t title : 'Requirements',\n\t tooltip : 'Display tool requirements',\n\t onclick : function() {\n\t if (!this.visible) {\n\t this.visible = true;\n\t self.message.update({\n\t persistent : true,\n\t message : ToolTemplate.requirements(options),\n\t status : 'info'\n\t });\n\t } else {\n\t this.visible = false;\n\t self.message.update({\n\t message : ''\n\t });\n\t }\n\t }\n\t });\n\t }\n\t\n\t // add toolshed url\n\t if (options.sharable_url) {\n\t menu_button.addMenu({\n\t icon : 'fa-external-link',\n\t title : 'See in Tool Shed',\n\t tooltip : 'Access the repository',\n\t onclick : function() {\n\t window.open(options.sharable_url);\n\t }\n\t });\n\t }\n\t\n\t return {\n\t menu : menu_button,\n\t versions : versions_button\n\t }\n\t },\n\t\n\t /** Create footer\n\t */\n\t _footer: function() {\n\t var options = this.options;\n\t var $el = $( '
    ' ).append( ToolTemplate.help( options ) );\n\t if ( options.citations ) {\n\t var $citations = $( '
    ' );\n\t var citations = new CitationModel.ToolCitationCollection();\n\t citations.tool_id = options.id;\n\t var citation_list_view = new CitationView.CitationListView({ el: $citations, collection: citations });\n\t citation_list_view.render();\n\t citations.fetch();\n\t $el.append( $citations );\n\t }\n\t return $el;\n\t }\n\t });\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/**\n\t * Model, view, and controller objects for Galaxy tools and tool panel.\n\t */\n\t\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(3),\n\t __webpack_require__(20),\n\t __webpack_require__(14),\n\t __webpack_require__(22),\n\t __webpack_require__(64),\n\t __webpack_require__(65),\n\t __webpack_require__(63),\n\t __webpack_require__(66),\n\t\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(_, util, data, ToolForm, tool_form_template, tool_link_template, panel_section_template, tool_search_template) {\n\t\n\t/**\n\t * Mixin for tracking model visibility.\n\t */\n\tvar VisibilityMixin = {\n\t hidden: false,\n\t\n\t show: function() {\n\t this.set(\"hidden\", false);\n\t },\n\t\n\t hide: function() {\n\t this.set(\"hidden\", true);\n\t },\n\t\n\t toggle: function() {\n\t this.set(\"hidden\", !this.get(\"hidden\"));\n\t },\n\t\n\t is_visible: function() {\n\t return !this.attributes.hidden;\n\t }\n\t\n\t};\n\t\n\t/**\n\t * A tool parameter.\n\t */\n\tvar ToolParameter = Backbone.Model.extend({\n\t defaults: {\n\t name: null,\n\t label: null,\n\t type: null,\n\t value: null,\n\t html: null,\n\t num_samples: 5\n\t },\n\t\n\t initialize: function(options) {\n\t this.attributes.html = unescape(this.attributes.html);\n\t },\n\t\n\t copy: function() {\n\t return new ToolParameter(this.toJSON());\n\t },\n\t\n\t set_value: function(value) {\n\t this.set('value', value || '');\n\t }\n\t});\n\t\n\tvar ToolParameterCollection = Backbone.Collection.extend({\n\t model: ToolParameter\n\t});\n\t\n\t/**\n\t * A data tool parameter.\n\t */\n\tvar DataToolParameter = ToolParameter.extend({});\n\t\n\t/**\n\t * An integer tool parameter.\n\t */\n\tvar IntegerToolParameter = ToolParameter.extend({\n\t set_value: function(value) {\n\t this.set('value', parseInt(value, 10));\n\t },\n\t\n\t /**\n\t * Returns samples from a tool input.\n\t */\n\t get_samples: function() {\n\t return d3.scale.linear()\n\t .domain([this.get('min'), this.get('max')])\n\t .ticks(this.get('num_samples'));\n\t }\n\t});\n\t\n\tvar FloatToolParameter = IntegerToolParameter.extend({\n\t set_value: function(value) {\n\t this.set('value', parseFloat(value));\n\t }\n\t});\n\t\n\t/**\n\t * A select tool parameter.\n\t */\n\tvar SelectToolParameter = ToolParameter.extend({\n\t /**\n\t * Returns tool options.\n\t */\n\t get_samples: function() {\n\t return _.map(this.get('options'), function(option) {\n\t return option[0];\n\t });\n\t }\n\t});\n\t\n\t// Set up dictionary of parameter types.\n\tToolParameter.subModelTypes = {\n\t 'integer': IntegerToolParameter,\n\t 'float': FloatToolParameter,\n\t 'data': DataToolParameter,\n\t 'select': SelectToolParameter\n\t};\n\t\n\t/**\n\t * A Galaxy tool.\n\t */\n\tvar Tool = Backbone.Model.extend({\n\t // Default attributes.\n\t defaults: {\n\t id: null,\n\t name: null,\n\t description: null,\n\t target: null,\n\t inputs: [],\n\t outputs: []\n\t },\n\t\n\t urlRoot: Galaxy.root + 'api/tools',\n\t\n\t initialize: function(options) {\n\t\n\t // Set parameters.\n\t this.set('inputs', new ToolParameterCollection(_.map(options.inputs, function(p) {\n\t var p_class = ToolParameter.subModelTypes[p.type] || ToolParameter;\n\t return new p_class(p);\n\t })));\n\t },\n\t\n\t /**\n\t *\n\t */\n\t toJSON: function() {\n\t var rval = Backbone.Model.prototype.toJSON.call(this);\n\t\n\t // Convert inputs to JSON manually.\n\t rval.inputs = this.get('inputs').map(function(i) { return i.toJSON(); });\n\t return rval;\n\t },\n\t\n\t /**\n\t * Removes inputs of a particular type; this is useful because not all inputs can be handled by\n\t * client and server yet.\n\t */\n\t remove_inputs: function(types) {\n\t var tool = this,\n\t incompatible_inputs = tool.get('inputs').filter( function(input) {\n\t return ( types.indexOf( input.get('type') ) !== -1);\n\t });\n\t tool.get('inputs').remove(incompatible_inputs);\n\t },\n\t\n\t /**\n\t * Returns object copy, optionally including only inputs that can be sampled.\n\t */\n\t copy: function(only_samplable_inputs) {\n\t var copy = new Tool(this.toJSON());\n\t\n\t // Return only samplable inputs if flag is set.\n\t if (only_samplable_inputs) {\n\t var valid_inputs = new Backbone.Collection();\n\t copy.get('inputs').each(function(input) {\n\t if (input.get_samples()) {\n\t valid_inputs.push(input);\n\t }\n\t });\n\t copy.set('inputs', valid_inputs);\n\t }\n\t\n\t return copy;\n\t },\n\t\n\t apply_search_results: function(results) {\n\t ( _.indexOf(results, this.attributes.id) !== -1 ? this.show() : this.hide() );\n\t return this.is_visible();\n\t },\n\t\n\t /**\n\t * Set a tool input's value.\n\t */\n\t set_input_value: function(name, value) {\n\t this.get('inputs').find(function(input) {\n\t return input.get('name') === name;\n\t }).set('value', value);\n\t },\n\t\n\t /**\n\t * Set many input values at once.\n\t */\n\t set_input_values: function(inputs_dict) {\n\t var self = this;\n\t _.each(_.keys(inputs_dict), function(input_name) {\n\t self.set_input_value(input_name, inputs_dict[input_name]);\n\t });\n\t },\n\t\n\t /**\n\t * Run tool; returns a Deferred that resolves to the tool's output(s).\n\t */\n\t run: function() {\n\t return this._run();\n\t },\n\t\n\t /**\n\t * Rerun tool using regions and a target dataset.\n\t */\n\t rerun: function(target_dataset, regions) {\n\t return this._run({\n\t action: 'rerun',\n\t target_dataset_id: target_dataset.id,\n\t regions: regions\n\t });\n\t },\n\t\n\t /**\n\t * Returns input dict for tool's inputs.\n\t */\n\t get_inputs_dict: function() {\n\t var input_dict = {};\n\t this.get('inputs').each(function(input) {\n\t input_dict[input.get('name')] = input.get('value');\n\t });\n\t return input_dict;\n\t },\n\t\n\t /**\n\t * Run tool; returns a Deferred that resolves to the tool's output(s).\n\t * NOTE: this method is a helper method and should not be called directly.\n\t */\n\t _run: function(additional_params) {\n\t // Create payload.\n\t var payload = _.extend({\n\t tool_id: this.id,\n\t inputs: this.get_inputs_dict()\n\t }, additional_params);\n\t\n\t // Because job may require indexing datasets, use server-side\n\t // deferred to ensure that job is run. Also use deferred that\n\t // resolves to outputs from tool.\n\t var run_deferred = $.Deferred(),\n\t ss_deferred = new util.ServerStateDeferred({\n\t ajax_settings: {\n\t url: this.urlRoot,\n\t data: JSON.stringify(payload),\n\t dataType: \"json\",\n\t contentType: 'application/json',\n\t type: \"POST\"\n\t },\n\t interval: 2000,\n\t success_fn: function(response) {\n\t return response !== \"pending\";\n\t }\n\t });\n\t\n\t // Run job and resolve run_deferred to tool outputs.\n\t $.when(ss_deferred.go()).then(function(result) {\n\t run_deferred.resolve(new data.DatasetCollection(result));\n\t });\n\t return run_deferred;\n\t }\n\t});\n\t_.extend(Tool.prototype, VisibilityMixin);\n\t\n\t/**\n\t * Tool view.\n\t */\n\tvar ToolView = Backbone.View.extend({\n\t\n\t});\n\t\n\t/**\n\t * Wrap collection of tools for fast access/manipulation.\n\t */\n\tvar ToolCollection = Backbone.Collection.extend({\n\t model: Tool\n\t});\n\t\n\t/**\n\t * Label or section header in tool panel.\n\t */\n\tvar ToolSectionLabel = Backbone.Model.extend(VisibilityMixin);\n\t\n\t/**\n\t * Section of tool panel with elements (labels and tools).\n\t */\n\tvar ToolSection = Backbone.Model.extend({\n\t defaults: {\n\t elems: [],\n\t open: false\n\t },\n\t\n\t clear_search_results: function() {\n\t _.each(this.attributes.elems, function(elt) {\n\t elt.show();\n\t });\n\t\n\t this.show();\n\t this.set(\"open\", false);\n\t },\n\t\n\t apply_search_results: function(results) {\n\t var all_hidden = true,\n\t cur_label;\n\t _.each(this.attributes.elems, function(elt) {\n\t if (elt instanceof ToolSectionLabel) {\n\t cur_label = elt;\n\t cur_label.hide();\n\t }\n\t else if (elt instanceof Tool) {\n\t if (elt.apply_search_results(results)) {\n\t all_hidden = false;\n\t if (cur_label) {\n\t cur_label.show();\n\t }\n\t }\n\t }\n\t });\n\t\n\t if (all_hidden) {\n\t this.hide();\n\t }\n\t else {\n\t this.show();\n\t this.set(\"open\", true);\n\t }\n\t }\n\t});\n\t_.extend(ToolSection.prototype, VisibilityMixin);\n\t\n\t/**\n\t * Tool search that updates results when query is changed. Result value of null\n\t * indicates that query was not run; if not null, results are from search using\n\t * query.\n\t */\n\tvar ToolSearch = Backbone.Model.extend({\n\t defaults: {\n\t search_hint_string: \"search tools\",\n\t min_chars_for_search: 3,\n\t spinner_url: \"\",\n\t clear_btn_url: \"\",\n\t search_url: \"\",\n\t visible: true,\n\t query: \"\",\n\t results: null,\n\t // ESC (27) will clear the input field and tool search filters\n\t clear_key: 27\n\t },\n\t\n\t urlRoot: Galaxy.root + 'api/tools',\n\t\n\t initialize: function() {\n\t this.on(\"change:query\", this.do_search);\n\t },\n\t\n\t /**\n\t * Do the search and update the results.\n\t */\n\t do_search: function() {\n\t var query = this.attributes.query;\n\t\n\t // If query is too short, do not search.\n\t if (query.length < this.attributes.min_chars_for_search) {\n\t this.set(\"results\", null);\n\t return;\n\t }\n\t\n\t // Do search via AJAX.\n\t var q = query;\n\t // Stop previous ajax-request\n\t if (this.timer) {\n\t clearTimeout(this.timer);\n\t }\n\t // Start a new ajax-request in X ms\n\t $(\"#search-clear-btn\").hide();\n\t $(\"#search-spinner\").show();\n\t var self = this;\n\t this.timer = setTimeout(function () {\n\t // log the search to analytics if present\n\t if ( typeof ga !== 'undefined' ) {\n\t ga( 'send', 'pageview', Galaxy.root + '?q=' + q );\n\t }\n\t $.get( self.urlRoot, { q: q }, function (data) {\n\t self.set(\"results\", data);\n\t $(\"#search-spinner\").hide();\n\t $(\"#search-clear-btn\").show();\n\t }, \"json\" );\n\t }, 400 );\n\t },\n\t\n\t clear_search: function() {\n\t this.set(\"query\", \"\");\n\t this.set(\"results\", null);\n\t }\n\t\n\t});\n\t_.extend(ToolSearch.prototype, VisibilityMixin);\n\t\n\t/**\n\t * Tool Panel.\n\t */\n\tvar ToolPanel = Backbone.Model.extend({\n\t\n\t initialize: function(options) {\n\t this.attributes.tool_search = options.tool_search;\n\t this.attributes.tool_search.on(\"change:results\", this.apply_search_results, this);\n\t this.attributes.tools = options.tools;\n\t this.attributes.layout = new Backbone.Collection( this.parse(options.layout) );\n\t },\n\t\n\t /**\n\t * Parse tool panel dictionary and return collection of tool panel elements.\n\t */\n\t parse: function(response) {\n\t // Recursive function to parse tool panel elements.\n\t var self = this,\n\t // Helper to recursively parse tool panel.\n\t parse_elt = function(elt_dict) {\n\t var type = elt_dict.model_class;\n\t // There are many types of tools; for now, anything that ends in 'Tool'\n\t // is treated as a generic tool.\n\t if ( type.indexOf('Tool') === type.length - 4 ) {\n\t return self.attributes.tools.get(elt_dict.id);\n\t }\n\t else if (type === 'ToolSection') {\n\t // Parse elements.\n\t var elems = _.map(elt_dict.elems, parse_elt);\n\t elt_dict.elems = elems;\n\t return new ToolSection(elt_dict);\n\t }\n\t else if (type === 'ToolSectionLabel') {\n\t return new ToolSectionLabel(elt_dict);\n\t }\n\t };\n\t\n\t return _.map(response, parse_elt);\n\t },\n\t\n\t clear_search_results: function() {\n\t this.get('layout').each(function(panel_elt) {\n\t if (panel_elt instanceof ToolSection) {\n\t panel_elt.clear_search_results();\n\t }\n\t else {\n\t // Label or tool, so just show.\n\t panel_elt.show();\n\t }\n\t });\n\t },\n\t\n\t apply_search_results: function() {\n\t var results = this.get('tool_search').get('results');\n\t if (results === null) {\n\t this.clear_search_results();\n\t return;\n\t }\n\t\n\t var cur_label = null;\n\t this.get('layout').each(function(panel_elt) {\n\t if (panel_elt instanceof ToolSectionLabel) {\n\t cur_label = panel_elt;\n\t cur_label.hide();\n\t }\n\t else if (panel_elt instanceof Tool) {\n\t if (panel_elt.apply_search_results(results)) {\n\t if (cur_label) {\n\t cur_label.show();\n\t }\n\t }\n\t }\n\t else {\n\t // Starting new section, so clear current label.\n\t cur_label = null;\n\t panel_elt.apply_search_results(results);\n\t }\n\t });\n\t }\n\t});\n\t\n\t/**\n\t * View classes for Galaxy tools and tool panel.\n\t *\n\t * Views use precompiled Handlebars templates for rendering. Views update as needed\n\t * based on (a) model/collection events and (b) user interactions; in this sense,\n\t * they are controllers are well and the HTML is the real view in the MVC architecture.\n\t */\n\t\n\t/**\n\t * Base view that handles visibility based on model's hidden attribute.\n\t */\n\tvar BaseView = Backbone.View.extend({\n\t initialize: function() {\n\t this.model.on(\"change:hidden\", this.update_visible, this);\n\t this.update_visible();\n\t },\n\t update_visible: function() {\n\t ( this.model.attributes.hidden ? this.$el.hide() : this.$el.show() );\n\t }\n\t});\n\t\n\t/**\n\t * Link to a tool.\n\t */\n\tvar ToolLinkView = BaseView.extend({\n\t tagName: 'div',\n\t\n\t render: function() {\n\t // create element\n\t var $link = $('
    ');\n\t $link.append(tool_link_template(this.model.toJSON()));\n\t\n\t // open upload dialog for upload tool\n\t if (this.model.id === 'upload1') {\n\t $link.find('a').on('click', function(e) {\n\t e.preventDefault();\n\t Galaxy.upload.show();\n\t });\n\t }\n\t else if ( this.model.get( 'model_class' ) === 'Tool' ) { // regular tools\n\t var self = this;\n\t $link.find('a').on('click', function(e) {\n\t e.preventDefault();\n\t var form = new ToolForm.View( { id : self.model.id, version : self.model.get('version') } );\n\t form.deferred.execute(function() {\n\t Galaxy.app.display( form );\n\t });\n\t });\n\t }\n\t\n\t // add element\n\t this.$el.append($link);\n\t return this;\n\t }\n\t});\n\t\n\t/**\n\t * Panel label/section header.\n\t */\n\tvar ToolSectionLabelView = BaseView.extend({\n\t tagName: 'div',\n\t className: 'toolPanelLabel',\n\t\n\t render: function() {\n\t this.$el.append( $(\"\").text(this.model.attributes.text) );\n\t return this;\n\t }\n\t});\n\t\n\t/**\n\t * Panel section.\n\t */\n\tvar ToolSectionView = BaseView.extend({\n\t tagName: 'div',\n\t className: 'toolSectionWrapper',\n\t\n\t initialize: function() {\n\t BaseView.prototype.initialize.call(this);\n\t this.model.on(\"change:open\", this.update_open, this);\n\t },\n\t\n\t render: function() {\n\t // Build using template.\n\t this.$el.append( panel_section_template(this.model.toJSON()) );\n\t\n\t // Add tools to section.\n\t var section_body = this.$el.find(\".toolSectionBody\");\n\t _.each(this.model.attributes.elems, function(elt) {\n\t if (elt instanceof Tool) {\n\t var tool_view = new ToolLinkView({model: elt, className: \"toolTitle\"});\n\t tool_view.render();\n\t section_body.append(tool_view.$el);\n\t }\n\t else if (elt instanceof ToolSectionLabel) {\n\t var label_view = new ToolSectionLabelView({model: elt});\n\t label_view.render();\n\t section_body.append(label_view.$el);\n\t }\n\t else {\n\t // TODO: handle nested section bodies?\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t events: {\n\t 'click .toolSectionTitle > a': 'toggle'\n\t },\n\t\n\t /**\n\t * Toggle visibility of tool section.\n\t */\n\t toggle: function() {\n\t this.model.set(\"open\", !this.model.attributes.open);\n\t },\n\t\n\t /**\n\t * Update whether section is open or close.\n\t */\n\t update_open: function() {\n\t (this.model.attributes.open ?\n\t this.$el.children(\".toolSectionBody\").slideDown(\"fast\") :\n\t this.$el.children(\".toolSectionBody\").slideUp(\"fast\")\n\t );\n\t }\n\t});\n\t\n\tvar ToolSearchView = Backbone.View.extend({\n\t tagName: 'div',\n\t id: 'tool-search',\n\t className: 'bar',\n\t\n\t events: {\n\t 'click': 'focus_and_select',\n\t 'keyup :input': 'query_changed',\n\t 'click #search-clear-btn': 'clear'\n\t },\n\t\n\t render: function() {\n\t this.$el.append( tool_search_template(this.model.toJSON()) );\n\t if (!this.model.is_visible()) {\n\t this.$el.hide();\n\t }\n\t this.$el.find('[title]').tooltip();\n\t return this;\n\t },\n\t\n\t focus_and_select: function() {\n\t this.$el.find(\":input\").focus().select();\n\t },\n\t\n\t clear: function() {\n\t this.model.clear_search();\n\t this.$el.find(\":input\").val('');\n\t this.focus_and_select();\n\t return false;\n\t },\n\t\n\t query_changed: function( evData ) {\n\t // check for the 'clear key' (ESC) first\n\t if( ( this.model.attributes.clear_key ) &&\n\t ( this.model.attributes.clear_key === evData.which ) ){\n\t this.clear();\n\t return false;\n\t }\n\t this.model.set(\"query\", this.$el.find(\":input\").val());\n\t }\n\t});\n\t\n\t/**\n\t * Tool panel view. Events triggered include:\n\t * tool_link_click(click event, tool_model)\n\t */\n\tvar ToolPanelView = Backbone.View.extend({\n\t tagName: 'div',\n\t className: 'toolMenu',\n\t\n\t /**\n\t * Set up view.\n\t */\n\t initialize: function() {\n\t this.model.get('tool_search').on(\"change:results\", this.handle_search_results, this);\n\t },\n\t\n\t render: function() {\n\t var self = this;\n\t\n\t // Render search.\n\t var search_view = new ToolSearchView( { model: this.model.get('tool_search') } );\n\t search_view.render();\n\t self.$el.append(search_view.$el);\n\t\n\t // Render panel.\n\t this.model.get('layout').each(function(panel_elt) {\n\t if (panel_elt instanceof ToolSection) {\n\t var section_title_view = new ToolSectionView({model: panel_elt});\n\t section_title_view.render();\n\t self.$el.append(section_title_view.$el);\n\t }\n\t else if (panel_elt instanceof Tool) {\n\t var tool_view = new ToolLinkView({model: panel_elt, className: \"toolTitleNoSection\"});\n\t tool_view.render();\n\t self.$el.append(tool_view.$el);\n\t }\n\t else if (panel_elt instanceof ToolSectionLabel) {\n\t var label_view = new ToolSectionLabelView({model: panel_elt});\n\t label_view.render();\n\t self.$el.append(label_view.$el);\n\t }\n\t });\n\t\n\t // Setup tool link click eventing.\n\t self.$el.find(\"a.tool-link\").click(function(e) {\n\t // Tool id is always the first class.\n\t var\n\t tool_id = $(this).attr('class').split(/\\s+/)[0],\n\t tool = self.model.get('tools').get(tool_id);\n\t\n\t self.trigger(\"tool_link_click\", e, tool);\n\t });\n\t\n\t return this;\n\t },\n\t\n\t handle_search_results: function() {\n\t var results = this.model.get('tool_search').get('results');\n\t if (results && results.length === 0) {\n\t $(\"#search-no-results\").show();\n\t }\n\t else {\n\t $(\"#search-no-results\").hide();\n\t }\n\t }\n\t});\n\t\n\t/**\n\t * View for working with a tool: setting parameters and inputs and executing the tool.\n\t */\n\tvar ToolFormView = Backbone.View.extend({\n\t className: 'toolForm',\n\t\n\t render: function() {\n\t this.$el.children().remove();\n\t this.$el.append( tool_form_template(this.model.toJSON()) );\n\t }\n\t});\n\t\n\t/**\n\t * Integrated tool menu + tool execution.\n\t */\n\tvar IntegratedToolMenuAndView = Backbone.View.extend({\n\t className: 'toolMenuAndView',\n\t\n\t initialize: function() {\n\t this.tool_panel_view = new ToolPanelView({collection: this.collection});\n\t this.tool_form_view = new ToolFormView();\n\t },\n\t\n\t render: function() {\n\t // Render and append tool panel.\n\t this.tool_panel_view.render();\n\t this.tool_panel_view.$el.css(\"float\", \"left\");\n\t this.$el.append(this.tool_panel_view.$el);\n\t\n\t // Append tool form view.\n\t this.tool_form_view.$el.hide();\n\t this.$el.append(this.tool_form_view.$el);\n\t\n\t // On tool link click, show tool.\n\t var self = this;\n\t this.tool_panel_view.on(\"tool_link_click\", function(e, tool) {\n\t // Prevents click from activating link:\n\t e.preventDefault();\n\t // Show tool that was clicked on:\n\t self.show_tool(tool);\n\t });\n\t },\n\t\n\t /**\n\t * Fetch and display tool.\n\t */\n\t show_tool: function(tool) {\n\t var self = this;\n\t tool.fetch().done( function() {\n\t self.tool_form_view.model = tool;\n\t self.tool_form_view.render();\n\t self.tool_form_view.$el.show();\n\t $('#left').width(\"650px\");\n\t });\n\t }\n\t});\n\t\n\t// Exports\n\treturn {\n\t ToolParameter: ToolParameter,\n\t IntegerToolParameter: IntegerToolParameter,\n\t SelectToolParameter: SelectToolParameter,\n\t Tool: Tool,\n\t ToolCollection: ToolCollection,\n\t ToolSearch: ToolSearch,\n\t ToolPanel: ToolPanel,\n\t ToolPanelView: ToolPanelView,\n\t ToolFormView: ToolFormView\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t //jquery\n\t //backbone\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t// =============================================================================\n\t/**\n\t * view for a popup menu\n\t */\n\tvar PopupMenu = Backbone.View.extend({\n\t//TODO: maybe better as singleton off the Galaxy obj\n\t /** Cache the desired button element and options, set up the button click handler\n\t * NOTE: attaches this view as HTML/jQ data on the button for later use.\n\t */\n\t initialize: function( $button, options ){\n\t // default settings\n\t this.$button = $button;\n\t if( !this.$button.size() ){\n\t this.$button = $( '
    ' );\n\t }\n\t this.options = options || [];\n\t this.$button.data( 'popupmenu', this );\n\t\n\t // set up button click -> open menu behavior\n\t var menu = this;\n\t this.$button.click( function( event ){\n\t // if there's already a menu open, remove it\n\t $( '.popmenu-wrapper' ).remove();\n\t menu._renderAndShow( event );\n\t return false;\n\t });\n\t },\n\t\n\t // render the menu, append to the page body at the click position, and set up the 'click-away' handlers, show\n\t _renderAndShow: function( clickEvent ){\n\t this.render();\n\t this.$el.appendTo( 'body' ).css( this._getShownPosition( clickEvent )).show();\n\t this._setUpCloseBehavior();\n\t },\n\t\n\t // render the menu\n\t // this menu doesn't attach itself to the DOM ( see _renderAndShow )\n\t render: function(){\n\t // render the menu body absolute and hidden, fill with template\n\t this.$el.addClass( 'popmenu-wrapper' ).hide()\n\t .css({ position : 'absolute' })\n\t .html( this.template( this.$button.attr( 'id' ), this.options ));\n\t\n\t // set up behavior on each link/anchor elem\n\t if( this.options.length ){\n\t var menu = this;\n\t //precondition: there should be one option per li\n\t this.$el.find( 'li' ).each( function( i, li ){\n\t var option = menu.options[i];\n\t\n\t // if the option has 'func', call that function when the anchor is clicked\n\t if( option.func ){\n\t $( this ).children( 'a.popupmenu-option' ).click( function( event ){\n\t option.func.call( menu, event, option );\n\t // We must preventDefault otherwise clicking \"cancel\"\n\t // on a purge or something still navigates and causes\n\t // the action.\n\t event.preventDefault();\n\t // bubble up so that an option click will call the close behavior\n\t });\n\t }\n\t });\n\t }\n\t return this;\n\t },\n\t\n\t template : function( id, options ){\n\t return [\n\t '
      ', this._templateOptions( options ), '
    '\n\t ].join( '' );\n\t },\n\t\n\t _templateOptions : function( options ){\n\t if( !options.length ){\n\t return '
  • (no options)
  • ';\n\t }\n\t return _.map( options, function( option ){\n\t if( option.divider ){\n\t return '
  • ';\n\t } else if( option.header ){\n\t return [ '
  • ', option.html, '
  • ' ].join( '' );\n\t }\n\t var href = option.href || 'javascript:void(0);',\n\t target = ( option.target )?( ' target=\"' + option.target + '\"' ):( '' ),\n\t check = ( option.checked )?( '' ):( '' );\n\t return [\n\t '
  • ',\n\t check, option.html,\n\t '
  • '\n\t ].join( '' );\n\t }).join( '' );\n\t },\n\t\n\t // get the absolute position/offset for the menu\n\t _getShownPosition : function( clickEvent ){\n\t\n\t // display menu horiz. centered on click...\n\t var menuWidth = this.$el.width();\n\t var x = clickEvent.pageX - menuWidth / 2 ;\n\t\n\t // adjust to handle horiz. scroll and window dimensions ( draw entirely on visible screen area )\n\t x = Math.min( x, $( document ).scrollLeft() + $( window ).width() - menuWidth - 5 );\n\t x = Math.max( x, $( document ).scrollLeft() + 5 );\n\t return {\n\t top: clickEvent.pageY,\n\t left: x\n\t };\n\t },\n\t\n\t // bind an event handler to all available frames so that when anything is clicked\n\t // the menu is removed from the DOM and the event handler unbinds itself\n\t _setUpCloseBehavior: function(){\n\t var menu = this;\n\t//TODO: alternately: focus hack, blocking overlay, jquery.blockui\n\t\n\t // function to close popup and unbind itself\n\t function closePopup( event ){\n\t $( document ).off( 'click.close_popup' );\n\t if( window && window.parent !== window ){\n\t try {\n\t $( window.parent.document ).off( \"click.close_popup\" );\n\t } catch( err ){}\n\t } else {\n\t try {\n\t $( 'iframe#galaxy_main' ).contents().off( \"click.close_popup\" );\n\t } catch( err ){}\n\t }\n\t menu.remove();\n\t }\n\t\n\t $( 'html' ).one( \"click.close_popup\", closePopup );\n\t if( window && window.parent !== window ){\n\t try {\n\t $( window.parent.document ).find( 'html' ).one( \"click.close_popup\", closePopup );\n\t } catch( err ){}\n\t } else {\n\t try {\n\t $( 'iframe#galaxy_main' ).contents().one( \"click.close_popup\", closePopup );\n\t } catch( err ){}\n\t }\n\t },\n\t\n\t // add a menu option/item at the given index\n\t addItem: function( item, index ){\n\t // append to end if no index\n\t index = ( index >= 0 ) ? index : this.options.length;\n\t this.options.splice( index, 0, item );\n\t return this;\n\t },\n\t\n\t // remove a menu option/item at the given index\n\t removeItem: function( index ){\n\t if( index >=0 ){\n\t this.options.splice( index, 1 );\n\t }\n\t return this;\n\t },\n\t\n\t // search for a menu option by its html\n\t findIndexByHtml: function( html ){\n\t for( var i = 0; i < this.options.length; i++ ){\n\t if( _.has( this.options[i], 'html' ) && ( this.options[i].html === html )){\n\t return i;\n\t }\n\t }\n\t return null;\n\t },\n\t\n\t // search for a menu option by its html\n\t findItemByHtml: function( html ){\n\t return this.options[( this.findIndexByHtml( html ))];\n\t },\n\t\n\t // string representation\n\t toString: function(){\n\t return 'PopupMenu';\n\t }\n\t});\n\t/** shortcut to new for when you don't need to preserve the ref */\n\tPopupMenu.create = function _create( $button, options ){\n\t return new PopupMenu( $button, options );\n\t};\n\t\n\t// -----------------------------------------------------------------------------\n\t// the following class functions are bridges from the original make_popupmenu and make_popup_menus\n\t// to the newer backbone.js PopupMenu\n\t\n\t/** Create a PopupMenu from simple map initial_options activated by clicking button_element.\n\t * Converts initial_options to object array used by PopupMenu.\n\t * @param {jQuery|DOMElement} button_element element which, when clicked, activates menu\n\t * @param {Object} initial_options map of key -> values, where\n\t * key is option text, value is fn to call when option is clicked\n\t * @returns {PopupMenu} the PopupMenu created\n\t */\n\tPopupMenu.make_popupmenu = function( button_element, initial_options ){\n\t var convertedOptions = [];\n\t _.each( initial_options, function( optionVal, optionKey ){\n\t var newOption = { html: optionKey };\n\t\n\t // keys with null values indicate: header\n\t if( optionVal === null ){ // !optionVal? (null only?)\n\t newOption.header = true;\n\t\n\t // keys with function values indicate: a menu option\n\t } else if( jQuery.type( optionVal ) === 'function' ){\n\t newOption.func = optionVal;\n\t }\n\t //TODO:?? any other special optionVals?\n\t // there was no divider option originally\n\t convertedOptions.push( newOption );\n\t });\n\t return new PopupMenu( $( button_element ), convertedOptions );\n\t};\n\t\n\t/** Find all anchors in $parent (using selector) and covert anchors into a PopupMenu options map.\n\t * @param {jQuery} $parent the element that contains the links to convert to options\n\t * @param {String} selector jq selector string to find links\n\t * @returns {Object[]} the options array to initialize a PopupMenu\n\t */\n\t//TODO: lose parent and selector, pass in array of links, use map to return options\n\tPopupMenu.convertLinksToOptions = function( $parent, selector ){\n\t $parent = $( $parent );\n\t selector = selector || 'a';\n\t var options = [];\n\t $parent.find( selector ).each( function( elem, i ){\n\t var option = {}, $link = $( elem );\n\t\n\t // convert link text to the option text (html) and the href into the option func\n\t option.html = $link.text();\n\t if( $link.attr( 'href' ) ){\n\t var linkHref = $link.attr( 'href' ),\n\t linkTarget = $link.attr( 'target' ),\n\t confirmText = $link.attr( 'confirm' );\n\t\n\t option.func = function(){\n\t // if there's a \"confirm\" attribute, throw up a confirmation dialog, and\n\t // if the user cancels - do nothing\n\t if( ( confirmText ) && ( !confirm( confirmText ) ) ){ return; }\n\t\n\t // if there's no confirm attribute, or the user accepted the confirm dialog:\n\t switch( linkTarget ){\n\t // relocate the center panel\n\t case '_parent':\n\t window.parent.location = linkHref;\n\t break;\n\t\n\t // relocate the entire window\n\t case '_top':\n\t window.top.location = linkHref;\n\t break;\n\t\n\t // relocate this panel\n\t default:\n\t window.location = linkHref;\n\t }\n\t };\n\t }\n\t options.push( option );\n\t });\n\t return options;\n\t};\n\t\n\t/** Create a single popupmenu from existing DOM button and anchor elements\n\t * @param {jQuery} $buttonElement the element that when clicked will open the menu\n\t * @param {jQuery} $menuElement the element that contains the anchors to convert into a menu\n\t * @param {String} menuElementLinkSelector jq selector string used to find anchors to be made into menu options\n\t * @returns {PopupMenu} the PopupMenu (Backbone View) that can render, control the menu\n\t */\n\tPopupMenu.fromExistingDom = function( $buttonElement, $menuElement, menuElementLinkSelector ){\n\t $buttonElement = $( $buttonElement );\n\t $menuElement = $( $menuElement );\n\t var options = PopupMenu.convertLinksToOptions( $menuElement, menuElementLinkSelector );\n\t // we're done with the menu (having converted it to an options map)\n\t $menuElement.remove();\n\t return new PopupMenu( $buttonElement, options );\n\t};\n\t\n\t/** Create all popupmenus within a document or a more specific element\n\t * @param {DOMElement} parent the DOM element in which to search for popupmenus to build (defaults to document)\n\t * @param {String} menuSelector jq selector string to find popupmenu menu elements (defaults to \"div[popupmenu]\")\n\t * @param {Function} buttonSelectorBuildFn the function to build the jq button selector.\n\t * Will be passed $menuElement, parent.\n\t * (Defaults to return '#' + $menuElement.attr( 'popupmenu' ); )\n\t * @returns {PopupMenu[]} array of popupmenus created\n\t */\n\tPopupMenu.make_popup_menus = function( parent, menuSelector, buttonSelectorBuildFn ){\n\t parent = parent || document;\n\t // orig. Glx popupmenu menus have a (non-std) attribute 'popupmenu'\n\t // which contains the id of the button that activates the menu\n\t menuSelector = menuSelector || 'div[popupmenu]';\n\t // default to (orig. Glx) matching button to menu by using the popupmenu attr of the menu as the id of the button\n\t buttonSelectorBuildFn = buttonSelectorBuildFn || function( $menuElement, parent ){\n\t return '#' + $menuElement.attr( 'popupmenu' );\n\t };\n\t\n\t // aggregate and return all PopupMenus\n\t var popupMenusCreated = [];\n\t $( parent ).find( menuSelector ).each( function(){\n\t var $menuElement = $( this ),\n\t $buttonElement = $( parent ).find( buttonSelectorBuildFn( $menuElement, parent ) );\n\t popupMenusCreated.push( PopupMenu.fromDom( $buttonElement, $menuElement ) );\n\t $buttonElement.addClass( 'popup' );\n\t });\n\t return popupMenusCreated;\n\t};\n\t\n\t\n\t// =============================================================================\n\t return PopupMenu;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/** Renders the color picker used e.g. in the tool form **/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\t return Backbone.View.extend({\n\t colors: {\n\t standard: ['c00000','ff0000','ffc000','ffff00','92d050','00b050','00b0f0','0070c0','002060','7030a0'],\n\t base : ['ffffff','000000','eeece1','1f497d','4f81bd','c0504d','9bbb59','8064a2','4bacc6','f79646'],\n\t theme :[['f2f2f2','7f7f7f','ddd9c3','c6d9f0','dbe5f1','f2dcdb','ebf1dd','e5e0ec','dbeef3','fdeada'],\n\t ['d8d8d8','595959','c4bd97','8db3e2','b8cce4','e5b9b7','d7e3bc','ccc1d9','b7dde8','fbd5b5'],\n\t ['bfbfbf','3f3f3f','938953','548dd4','95b3d7','d99694','c3d69b','b2a2c7','92cddc','fac08f'],\n\t ['a5a5a5','262626','494429','17365d','366092','953734','76923c','5f497a','31859b','e36c09'],\n\t ['7f7f7e','0c0c0c','1d1b10','0f243e','244061','632423','4f6128','3f3151','205867','974806']]\n\t },\n\t initialize : function( options ) {\n\t this.options = Utils.merge( options, {} );\n\t this.setElement( this._template() );\n\t\n\t // link components\n\t this.$panel = this.$( '.ui-color-picker-panel' );\n\t this.$view = this.$( '.ui-color-picker-view' );\n\t this.$value = this.$( '.ui-color-picker-value' );\n\t this.$header = this.$( '.ui-color-picker-header' );\n\t\n\t // build panel\n\t this._build();\n\t\n\t // hide panel on start up\n\t this.visible = false;\n\t\n\t // set initial value\n\t this.value( this.options.value );\n\t\n\t // link boxes\n\t this.$boxes = this.$( '.ui-color-picker-box' );\n\t\n\t // add event handler\n\t var self = this;\n\t this.$boxes.on( 'click', function() {\n\t self.value( $( this ).css( 'background-color' ) );\n\t self.$header.trigger( 'click' );\n\t } );\n\t this.$header.on( 'click', function() {\n\t self.visible = !self.visible;\n\t if ( self.visible ) {\n\t self.$view.fadeIn( 'fast' );\n\t } else {\n\t self.$view.fadeOut( 'fast' );\n\t }\n\t } );\n\t },\n\t\n\t // value\n\t value : function ( new_val ) {\n\t if ( new_val !== undefined && new_val !== null ) {\n\t // update color value\n\t this.$value.css( 'background-color', new_val );\n\t \n\t // check selected color in panel\n\t this.$( '.ui-color-picker-box' ).empty();\n\t this.$( this._getValue() ).html( this._templateCheck() );\n\t\n\t // trigger custom event\n\t this.options.onchange && this.options.onchange( new_val );\n\t }\n\t\n\t // return current value\n\t return this._getValue();\n\t },\n\t\n\t // get value from dom\n\t _getValue: function() {\n\t var rgb = this.$value.css( 'background-color' );\n\t rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n\t if ( rgb ) {\n\t function hex( x ) {\n\t return ( '0' + parseInt( x ).toString( 16 ) ).slice( -2 );\n\t }\n\t return '#' + hex( rgb[ 1] ) + hex( rgb[ 2 ] ) + hex( rgb[ 3 ] );\n\t } else {\n\t return null;\n\t }\n\t },\n\t\n\t // build panel\n\t _build: function() {\n\t var $content = this._content({\n\t label : 'Theme Colors',\n\t colors : this.colors.base,\n\t padding : 10\n\t });\n\t for ( var i in this.colors.theme ) {\n\t var line_def = {};\n\t if ( i == 0 ) {\n\t line_def[ 'bottom' ] = true;\n\t } else {\n\t if ( i != this.colors.theme.length - 1 ) {\n\t line_def[ 'top' ] = true;\n\t line_def[ 'bottom' ] = true;\n\t } else {\n\t line_def[ 'top' ] = true;\n\t line_def[ 'padding' ] = 5;\n\t }\n\t }\n\t line_def[ 'colors' ] = this.colors.theme[ i ];\n\t this._content( line_def );\n\t }\n\t this._content({\n\t label : 'Standard Colors',\n\t colors : this.colors.standard,\n\t padding : 5\n\t });\n\t },\n\t\n\t // create content\n\t _content: function( options ) {\n\t // get parameters\n\t var label = options.label;\n\t var colors = options.colors;\n\t var padding = options.padding;\n\t var top = options.top;\n\t var bottom = options.bottom;\n\t\n\t // create lines\n\t var $content = $( this._templateContent() );\n\t\n\t // set label\n\t var $label = $content.find( '.label' );\n\t if ( options.label ) {\n\t $label.html( options.label );\n\t } else {\n\t $label.hide();\n\t }\n\t\n\t // build line\n\t var $line = $content.find( '.line' );\n\t this.$panel.append( $content );\n\t for ( var i in colors ) {\n\t var $box = $( this._templateBox( colors[ i ] ) );\n\t if ( top ) {\n\t $box.css( 'border-top', 'none' );\n\t $box.css( 'border-top-left-radius', '0px' );\n\t $box.css( 'border-top-right-radius', '0px' );\n\t }\n\t if ( bottom ) {\n\t $box.css( 'border-bottom', 'none' );\n\t $box.css( 'border-bottom-left-radius', '0px' );\n\t $box.css( 'border-bottom-right-radius', '0px' );\n\t }\n\t $line.append( $box );\n\t }\n\t if (padding) {\n\t $line.css( 'padding-bottom', padding );\n\t }\n\t return $content;\n\t },\n\t\n\t // check icon\n\t _templateCheck: function() {\n\t return '
    ';\n\t },\n\t\n\t // content template\n\t _templateContent: function() {\n\t return '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ';\n\t },\n\t\n\t // box template\n\t _templateBox: function( color ) {\n\t return '
    ';\n\t },\n\t\n\t // template\n\t _template: function() {\n\t return '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    Select a color
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    ' +\n\t '
    '\n\t '
    ';\n\t }\n\t });\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function($) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(25)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Options) {\n\t\n\t/**\n\t * This class creates/wraps a drill down element.\n\t */\n\tvar View = Options.BaseIcons.extend({\n\t // initialize\n\t initialize: function(options) {\n\t options.type = options.display || 'checkbox';\n\t options.multiple = (options.display == 'checkbox');\n\t Options.BaseIcons.prototype.initialize.call(this, options);\n\t this.initial = true;\n\t },\n\t\n\t // set expand states for initial value\n\t value: function (new_val) {\n\t var val = Options.BaseIcons.prototype.value.call(this, new_val);\n\t if (this.initial && val !== null && this.header_index) {\n\t this.initial = false;\n\t var values = val;\n\t if (!$.isArray(values)) {\n\t values = [values];\n\t }\n\t for (var i in values) {\n\t var list = this.header_index[values[i]];\n\t for (var j in list) {\n\t this._setState(list[j], true);\n\t }\n\t }\n\t }\n\t return val;\n\t },\n\t\n\t /** Expand/collapse a sub group\n\t */\n\t _setState: function (header_id, is_expanded) {\n\t var $button = this.$('.button-' + header_id);\n\t var $subgroup = this.$('.subgroup-' + header_id);\n\t $button.data('is_expanded', is_expanded);\n\t if (is_expanded) {\n\t $subgroup.fadeIn('fast')\n\t $button.removeClass('fa-plus-square');\n\t $button.addClass('fa-minus-square');\n\t } else {\n\t $subgroup.hide();\n\t $button.removeClass('fa-minus-square');\n\t $button.addClass('fa-plus-square');\n\t }\n\t },\n\t\n\t /** Template to create options tree\n\t */\n\t _templateOptions: function(options) {\n\t // link this\n\t var self = this;\n\t\n\t // link data\n\t this.header_index = {};\n\t \n\t // attach event handler\n\t function attach($el, header_id) {\n\t var $button = $el.find('.button-' + header_id);\n\t $button.on('click', function() {\n\t self._setState(header_id, !$button.data('is_expanded'));\n\t });\n\t }\n\t\n\t // recursive function which iterates through options\n\t function iterate ($tmpl, options, header) {\n\t header = header || [];\n\t for (i in options) {\n\t // current option level in hierarchy\n\t var level = options[i];\n\t\n\t // check for options\n\t var has_options = level.options.length > 0;\n\t\n\t // copy current header list\n\t var new_header = header.slice(0);\n\t\n\t // keep track of header list\n\t self.header_index[level.value] = new_header.slice(0);\n\t\n\t // build template\n\t var $group = $('
    ');\n\t if (has_options) {\n\t // create button and subgroup\n\t var header_id = Utils.uid();\n\t var $button = $('');\n\t var $subgroup = $('
    ');\n\t\n\t // keep track of button and subgroup\n\t new_header.push(header_id);\n\t\n\t // create expandable header section\n\t var $buttongroup = $('
    ');\n\t $buttongroup.append($button);\n\t $buttongroup.append(self._templateOption({\n\t label: level.name,\n\t value: level.value\n\t }));\n\t $group.append($buttongroup);\n\t iterate($subgroup, level.options, new_header);\n\t $group.append($subgroup);\n\t\n\t // attach expand/collapse events\n\t attach($group, header_id);\n\t } else {\n\t // append child options\n\t $group.append(self._templateOption({\n\t label: level.name,\n\t value: level.value\n\t }));\n\t }\n\t $tmpl.append($group);\n\t }\n\t }\n\t\n\t // iterate through options and create dom\n\t var $tmpl = $('
    ');\n\t iterate($tmpl, options);\n\t\n\t // return template\n\t return $tmpl;\n\t },\n\t\n\t /** Template for drill down view\n\t */\n\t _template: function(options) {\n\t return '
    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {/**\n\t * This class creates/wraps a default html select field as backbone class.\n\t */\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(16)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Buttons) {\n\tvar View = Backbone.View.extend({\n\t // options\n\t optionsDefault: {\n\t id : Utils.uid(),\n\t cls : 'ui-select',\n\t error_text : 'No options available',\n\t empty_text : 'Nothing selected',\n\t visible : true,\n\t wait : false,\n\t multiple : false,\n\t searchable : true,\n\t optional : false\n\t },\n\t\n\t // initialize\n\t initialize: function(options) {\n\t // link this\n\t var self = this;\n\t this.model = new Backbone.Model();\n\t\n\t // configure options\n\t this.options = Utils.merge(options, this.optionsDefault);\n\t\n\t // create new element\n\t this.setElement(this._template(this.options));\n\t\n\t // link elements\n\t this.$select = this.$el.find('.select');\n\t this.$icon_dropdown = this.$el.find('.icon-dropdown');\n\t this.$icon_dropdown.on( 'click', function() { self.$select.select2 && self.$select.select2( 'open' ) });\n\t\n\t // allow regular multi-select field to be resized\n\t var minHeight = null;\n\t this.$('.icon-resize').on('mousedown', function(event) {\n\t var currentY = event.pageY;\n\t var currentHeight = self.$select.height();\n\t minHeight = minHeight || currentHeight;\n\t $('#dd-helper').show().on('mousemove', function(event) {\n\t self.$select.height(Math.max(currentHeight + (event.pageY - currentY), minHeight));\n\t }).on('mouseup mouseleave', function() {\n\t $('#dd-helper').hide().off();\n\t });\n\t });\n\t\n\t // multiple select fields have an additional button and other custom properties\n\t if (this.options.multiple) {\n\t // create select all button\n\t if (this.options.searchable) {\n\t this.all_button = new Buttons.ButtonCheck({\n\t onclick: function() {\n\t var new_value = [];\n\t if (self.all_button.value() !== 0) {\n\t new_value = self._availableOptions();\n\t }\n\t self.value(new_value);\n\t self.trigger('change');\n\t }\n\t });\n\t this.$el.prepend(this.all_button.$el);\n\t } else {\n\t this.$el.addClass('ui-select-multiple');\n\t }\n\t this.$select.prop('multiple', true);\n\t this.$icon_dropdown.remove();\n\t }\n\t\n\t // update initial options\n\t this.update(this.options.data);\n\t\n\t // set initial value\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t\n\t // show/hide\n\t if (!this.options.visible) {\n\t this.hide();\n\t }\n\t\n\t // wait\n\t if (this.options.wait) {\n\t this.wait();\n\t } else {\n\t this.show();\n\t }\n\t\n\t // add change event. fires only on user activity\n\t this.$select.on('change', function() {\n\t self.trigger('change');\n\t });\n\t\n\t // add change event. fires on trigger\n\t this.on('change', function() {\n\t self.options.onchange && self.options.onchange(this.value());\n\t });\n\t },\n\t\n\t /** Return/Set current selection\n\t */\n\t value: function (new_value) {\n\t // set new value\n\t if (new_value !== undefined) {\n\t if (new_value === null) {\n\t new_value = '__null__';\n\t }\n\t if (this.exists(new_value) || this.options.multiple) {\n\t this.$select.val(new_value);\n\t if (this.$select.select2) {\n\t this.$select.select2('val', new_value);\n\t }\n\t }\n\t }\n\t // get current value\n\t var current = this._getValue();\n\t if (this.all_button) {\n\t this.all_button.value($.isArray(current) && current.length || 0, this._size());\n\t }\n\t return current;\n\t },\n\t\n\t /** Return the first select option\n\t */\n\t first: function() {\n\t var options = this.$select.find('option').first();\n\t if (options.length > 0) {\n\t return options.val();\n\t } else {\n\t return null;\n\t }\n\t },\n\t\n\t /** Return the label/text of the current selection\n\t */\n\t text: function () {\n\t return this.$select.find('option:selected').text();\n\t },\n\t\n\t /** Show the select field\n\t */\n\t show: function() {\n\t this.unwait();\n\t this.$select.show();\n\t this.$el.show();\n\t },\n\t\n\t /** Hide the select field\n\t */\n\t hide: function() {\n\t this.$el.hide();\n\t },\n\t\n\t /** Show a spinner indicating that the select options are currently loaded\n\t */\n\t wait: function() {\n\t this.$icon_dropdown.removeClass();\n\t this.$icon_dropdown.addClass('icon-dropdown fa fa-spinner fa-spin');\n\t },\n\t\n\t /** Hide spinner indicating that the request has been completed\n\t */\n\t unwait: function() {\n\t this.$icon_dropdown.removeClass();\n\t this.$icon_dropdown.addClass('icon-dropdown fa fa-caret-down');\n\t },\n\t\n\t /** Returns true if the field is disabled\n\t */\n\t disabled: function() {\n\t return this.$select.is(':disabled');\n\t },\n\t\n\t /** Enable the select field\n\t */\n\t enable: function() {\n\t this.$select.prop('disabled', false);\n\t },\n\t\n\t /** Disable the select field\n\t */\n\t disable: function() {\n\t this.$select.prop('disabled', true);\n\t },\n\t\n\t /** Update all available options at once\n\t */\n\t add: function( options, sorter ) {\n\t _.each( this.model.get( 'options' ), function( v ) {\n\t !_.findWhere( options, v ) && options.push( v );\n\t });\n\t sorter && options.sort( sorter );\n\t this.update( options );\n\t },\n\t update: function(options) {\n\t // backup current value\n\t var current = this._getValue();\n\t\n\t // remove all options\n\t this.$select.find('option').remove();\n\t\n\t // add optional field\n\t if (!this.options.multiple && this.options.optional) {\n\t this.$select.append(this._templateOption({value : '__null__', label : this.options.empty_text}));\n\t }\n\t\n\t // add new options\n\t this.model.set( 'options', options );\n\t for (var key in options) {\n\t this.$select.append(this._templateOption(options[key]));\n\t }\n\t\n\t // count remaining entries\n\t if (this._size() == 0) {\n\t // disable select field\n\t this.disable();\n\t\n\t // create placeholder\n\t this.$select.append(this._templateOption({value : '__null__', label : this.options.error_text}));\n\t } else {\n\t // enable select field\n\t this.enable();\n\t }\n\t\n\t // update to searchable field (in this case select2)\n\t if (this.options.searchable) {\n\t this.$select.select2('destroy');\n\t this.$select.select2({ closeOnSelect: !this.options.multiple });\n\t this.$( '.select2-container .select2-search input' ).off( 'blur' );\n\t }\n\t\n\t // set previous value\n\t this.value(current);\n\t\n\t // check if any value was set\n\t if (this._getValue() === null && !(this.options.multiple && this.options.optional)) {\n\t this.value(this.first());\n\t }\n\t },\n\t\n\t /** Set the custom onchange callback function\n\t */\n\t setOnChange: function(callback) {\n\t this.options.onchange = callback;\n\t },\n\t\n\t /** Check if a value is an existing option\n\t */\n\t exists: function(value) {\n\t return this.$select.find('option[value=\"' + value + '\"]').length > 0;\n\t },\n\t\n\t /** Get current value from dom\n\t */\n\t _getValue: function() {\n\t var val = this.$select.val();\n\t if (!Utils.validate(val)) {\n\t return null;\n\t }\n\t return val;\n\t },\n\t\n\t /** Returns all currently available options\n\t */\n\t _availableOptions: function() {\n\t var available = [];\n\t this.$select.find('option').each(function(i, e){\n\t available.push($(e).attr('value'));\n\t });\n\t return available;\n\t },\n\t\n\t /** Number of available options\n\t */\n\t _size: function() {\n\t return this.$select.find('option').length;\n\t },\n\t\n\t /** Template for select options\n\t */\n\t _templateOption: function(options) {\n\t return '';\n\t },\n\t\n\t /** Template for select view\n\t */\n\t _template: function(options) {\n\t return '
    ' +\n\t '' +\n\t '
    ' +\n\t '
    ';\n\t }\n\t});\n\t\n\treturn {\n\t View : View\n\t};\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t\n\t// model\n\tvar Model = Backbone.Model.extend({\n\t defaults: {\n\t extension : 'auto',\n\t genome : '?',\n\t url_paste : '',\n\t status : 'init',\n\t info : null,\n\t file_name : '',\n\t file_mode : '',\n\t file_size : 0,\n\t file_type : null,\n\t file_path : '',\n\t file_data : null,\n\t percentage : 0,\n\t space_to_tab : false,\n\t to_posix_lines : true,\n\t enabled : true\n\t },\n\t reset: function(attr) {\n\t this.clear().set(this.defaults).set(attr);\n\t }\n\t});\n\t\n\t// collection\n\tvar Collection = Backbone.Collection.extend({\n\t model: Model\n\t});\n\t\n\t// return\n\treturn {\n\t Model: Model,\n\t Collection : Collection\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 59 */,\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/**\n\t * This class defines a queue to ensure that multiple deferred callbacks are executed sequentially.\n\t */\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\treturn Backbone.Model.extend({\n\t initialize: function(){\n\t this.active = {};\n\t this.last = null;\n\t },\n\t\n\t /** Adds a callback to the queue. Upon execution a deferred object is parsed to the callback i.e. callback( deferred ).\n\t * If the callback does not take any arguments, the deferred is resolved instantly.\n\t */\n\t execute: function( callback ) {\n\t var self = this;\n\t var id = Utils.uid();\n\t var has_deferred = callback.length > 0;\n\t\n\t // register process\n\t this.active[ id ] = true;\n\t\n\t // deferred process\n\t var process = $.Deferred();\n\t process.promise().always(function() {\n\t delete self.active[ id ];\n\t has_deferred && Galaxy.emit.debug( 'deferred::execute()', this.state().charAt(0).toUpperCase() + this.state().slice(1) + ' ' + id );\n\t });\n\t\n\t // deferred queue\n\t $.when( this.last ).always(function() {\n\t if ( self.active[ id ] ) {\n\t has_deferred && Galaxy.emit.debug( 'deferred::execute()', 'Running ' + id );\n\t callback( process );\n\t !has_deferred && process.resolve();\n\t } else {\n\t process.reject();\n\t }\n\t });\n\t this.last = process.promise();\n\t },\n\t\n\t /** Resets the promise queue. All currently queued but unexecuted callbacks/promises will be rejected.\n\t */\n\t reset: function() {\n\t Galaxy.emit.debug('deferred::execute()', 'Reset');\n\t for ( var i in this.active ) {\n\t this.active[ i ] = false;\n\t }\n\t },\n\t\n\t /** Returns true if all processes are done.\n\t */\n\t ready: function() {\n\t return $.isEmptyObject( this.active );\n\t }\n\t});\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t// ============================================================================\n\tfunction get( key, queryString ){\n\t queryString = queryString || window.location.search.substr( 1 );\n\t var keyRegex = new RegExp( key + '=([^&#$]+)' ),\n\t matches = queryString.match( keyRegex );\n\t if( !matches || !matches.length ){\n\t return undefined;\n\t }\n\t matches = matches.splice( 1 );\n\t if( matches.length === 1 ){\n\t return matches[0];\n\t }\n\t return matches;\n\t}\n\t\n\tfunction parse( queryString ){\n\t if( !queryString ){ return {}; }\n\t var parsed = {},\n\t split = queryString.split( '&' );\n\t split.forEach( function( pairString ){\n\t var pair = pairString.split( '=' );\n\t parsed[ pair[0] ] = decodeURI( pair[1] );\n\t });\n\t return parsed;\n\t}\n\t\n\t// ============================================================================\n\t return {\n\t get : get,\n\t parse : parse,\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 62 */,\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Handlebars = __webpack_require__(12);\n\tfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\n\tmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n\t var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"\\n
    \\n
    \\n
    \";\n\t},\"useData\":true});\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Handlebars = __webpack_require__(12);\n\tfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\n\tmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n\t var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"
    \\n \\n
    \\n \"\n\t + ((stack1 = ((helper = (helper = helpers.html || (depth0 != null ? depth0.html : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"html\",\"hash\":{},\"data\":data}) : helper))) != null ? stack1 : \"\")\n\t + \"\\n
    \\n
    \\n \"\n\t + alias4(((helper = (helper = helpers.help || (depth0 != null ? depth0.help : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"help\",\"hash\":{},\"data\":data}) : helper)))\n\t + \"\\n
    \\n
    \\n
    \\n\";\n\t},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n\t var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"
    \"\n\t + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n\t + \" (version \"\n\t + alias4(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n\t + \")
    \\n
    \\n\"\n\t + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.inputs : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n\t + \"
    \\n
    \\n \\n
    \\n
    \\n
    \"\n\t + alias4(((helper = (helper = helpers.help || (depth0 != null ? depth0.help : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"help\",\"hash\":{},\"data\":data}) : helper)))\n\t + \"
    \\n
    \";\n\t},\"useData\":true});\n\n/***/ },\n/* 65 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Handlebars = __webpack_require__(12);\n\tfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\n\tmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n\t var alias1=container.lambda, alias2=container.escapeExpression;\n\t\n\t return \"\"\n\t + alias2(alias1(depth0, depth0))\n\t + \" \";\n\t},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n\t var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"\"\n\t + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.labels : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n\t + \"\\n\"\n\t + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n\t + \"\\n\"\n\t + alias4(((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"description\",\"hash\":{},\"data\":data}) : helper)))\n\t + \"\\n\";\n\t},\"useData\":true});\n\n/***/ },\n/* 66 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Handlebars = __webpack_require__(12);\n\tfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\n\tmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n\t var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"\\n \\n\\n\";\n\t},\"useData\":true});\n\n/***/ },\n/* 67 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\t\n\tvar _handlebarsBase = __webpack_require__(27);\n\t\n\tvar base = _interopRequireWildcard(_handlebarsBase);\n\t\n\t// Each of these augment the Handlebars object. No need to setup here.\n\t// (This is done to easily share code between commonjs and browse envs)\n\t\n\tvar _handlebarsSafeString = __webpack_require__(81);\n\t\n\tvar _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);\n\t\n\tvar _handlebarsException = __webpack_require__(9);\n\t\n\tvar _handlebarsException2 = _interopRequireDefault(_handlebarsException);\n\t\n\tvar _handlebarsUtils = __webpack_require__(8);\n\t\n\tvar Utils = _interopRequireWildcard(_handlebarsUtils);\n\t\n\tvar _handlebarsRuntime = __webpack_require__(80);\n\t\n\tvar runtime = _interopRequireWildcard(_handlebarsRuntime);\n\t\n\tvar _handlebarsNoConflict = __webpack_require__(79);\n\t\n\tvar _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);\n\t\n\t// For compatibility and usage outside of module systems, make the Handlebars object a namespace\n\tfunction create() {\n\t var hb = new base.HandlebarsEnvironment();\n\t\n\t Utils.extend(hb, base);\n\t hb.SafeString = _handlebarsSafeString2['default'];\n\t hb.Exception = _handlebarsException2['default'];\n\t hb.Utils = Utils;\n\t hb.escapeExpression = Utils.escapeExpression;\n\t\n\t hb.VM = runtime;\n\t hb.template = function (spec) {\n\t return runtime.template(spec, hb);\n\t };\n\t\n\t return hb;\n\t}\n\t\n\tvar inst = create();\n\tinst.create = create;\n\t\n\t_handlebarsNoConflict2['default'](inst);\n\t\n\tinst['default'] = inst;\n\t\n\texports['default'] = inst;\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oYW5kbGViYXJzLnJ1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OEJBQXNCLG1CQUFtQjs7SUFBN0IsSUFBSTs7Ozs7b0NBSU8sMEJBQTBCOzs7O21DQUMzQix3QkFBd0I7Ozs7K0JBQ3ZCLG9CQUFvQjs7SUFBL0IsS0FBSzs7aUNBQ1Esc0JBQXNCOztJQUFuQyxPQUFPOztvQ0FFSSwwQkFBMEI7Ozs7O0FBR2pELFNBQVMsTUFBTSxHQUFHO0FBQ2hCLE1BQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0FBRTFDLE9BQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLElBQUUsQ0FBQyxVQUFVLG9DQUFhLENBQUM7QUFDM0IsSUFBRSxDQUFDLFNBQVMsbUNBQVksQ0FBQztBQUN6QixJQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNqQixJQUFFLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDOztBQUU3QyxJQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNoQixJQUFFLENBQUMsUUFBUSxHQUFHLFVBQVMsSUFBSSxFQUFFO0FBQzNCLFdBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDbkMsQ0FBQzs7QUFFRixTQUFPLEVBQUUsQ0FBQztDQUNYOztBQUVELElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztBQUVyQixrQ0FBVyxJQUFJLENBQUMsQ0FBQzs7QUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzs7cUJBRVIsSUFBSSIsImZpbGUiOiJoYW5kbGViYXJzLnJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iXX0=\n\n\n/***/ },\n/* 68 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.registerDefaultDecorators = registerDefaultDecorators;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _decoratorsInline = __webpack_require__(69);\n\t\n\tvar _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);\n\t\n\tfunction registerDefaultDecorators(instance) {\n\t _decoratorsInline2['default'](instance);\n\t}\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Z0NBQTJCLHFCQUFxQjs7OztBQUV6QyxTQUFTLHlCQUF5QixDQUFDLFFBQVEsRUFBRTtBQUNsRCxnQ0FBZSxRQUFRLENBQUMsQ0FBQztDQUMxQiIsImZpbGUiOiJkZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlZ2lzdGVySW5saW5lIGZyb20gJy4vZGVjb3JhdG9ycy9pbmxpbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICByZWdpc3RlcklubGluZShpbnN0YW5jZSk7XG59XG5cbiJdfQ==\n\n\n/***/ },\n/* 69 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerDecorator('inline', function (fn, props, container, options) {\n\t var ret = fn;\n\t if (!props.partials) {\n\t props.partials = {};\n\t ret = function (context, options) {\n\t // Create a new partials stack frame prior to exec.\n\t var original = container.partials;\n\t container.partials = _utils.extend({}, original, props.partials);\n\t var ret = fn(context, options);\n\t container.partials = original;\n\t return ret;\n\t };\n\t }\n\t\n\t props.partials[options.args[0]] = options.fn;\n\t\n\t return ret;\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMvaW5saW5lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQXFCLFVBQVU7O3FCQUVoQixVQUFTLFFBQVEsRUFBRTtBQUNoQyxVQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNiLFFBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ25CLFdBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQUcsR0FBRyxVQUFTLE9BQU8sRUFBRSxPQUFPLEVBQUU7O0FBRS9CLFlBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDbEMsaUJBQVMsQ0FBQyxRQUFRLEdBQUcsY0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRCxZQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLGlCQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixlQUFPLEdBQUcsQ0FBQztPQUNaLENBQUM7S0FDSDs7QUFFRCxTQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUU3QyxXQUFPLEdBQUcsQ0FBQztHQUNaLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6ImlubGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIGxldCByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFydGlhbHMgc3RhY2sgZnJhbWUgcHJpb3IgdG8gZXhlYy5cbiAgICAgICAgbGV0IG9yaWdpbmFsID0gY29udGFpbmVyLnBhcnRpYWxzO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBleHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7XG4gICAgICAgIGxldCByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHByb3BzLnBhcnRpYWxzW29wdGlvbnMuYXJnc1swXV0gPSBvcHRpb25zLmZuO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG4iXX0=\n\n\n/***/ },\n/* 70 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.registerDefaultHelpers = registerDefaultHelpers;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _helpersBlockHelperMissing = __webpack_require__(71);\n\t\n\tvar _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);\n\t\n\tvar _helpersEach = __webpack_require__(72);\n\t\n\tvar _helpersEach2 = _interopRequireDefault(_helpersEach);\n\t\n\tvar _helpersHelperMissing = __webpack_require__(73);\n\t\n\tvar _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);\n\t\n\tvar _helpersIf = __webpack_require__(74);\n\t\n\tvar _helpersIf2 = _interopRequireDefault(_helpersIf);\n\t\n\tvar _helpersLog = __webpack_require__(75);\n\t\n\tvar _helpersLog2 = _interopRequireDefault(_helpersLog);\n\t\n\tvar _helpersLookup = __webpack_require__(76);\n\t\n\tvar _helpersLookup2 = _interopRequireDefault(_helpersLookup);\n\t\n\tvar _helpersWith = __webpack_require__(77);\n\t\n\tvar _helpersWith2 = _interopRequireDefault(_helpersWith);\n\t\n\tfunction registerDefaultHelpers(instance) {\n\t _helpersBlockHelperMissing2['default'](instance);\n\t _helpersEach2['default'](instance);\n\t _helpersHelperMissing2['default'](instance);\n\t _helpersIf2['default'](instance);\n\t _helpersLog2['default'](instance);\n\t _helpersLookup2['default'](instance);\n\t _helpersWith2['default'](instance);\n\t}\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7eUNBQXVDLGdDQUFnQzs7OzsyQkFDOUMsZ0JBQWdCOzs7O29DQUNQLDBCQUEwQjs7Ozt5QkFDckMsY0FBYzs7OzswQkFDYixlQUFlOzs7OzZCQUNaLGtCQUFrQjs7OzsyQkFDcEIsZ0JBQWdCOzs7O0FBRWxDLFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO0FBQy9DLHlDQUEyQixRQUFRLENBQUMsQ0FBQztBQUNyQywyQkFBYSxRQUFRLENBQUMsQ0FBQztBQUN2QixvQ0FBc0IsUUFBUSxDQUFDLENBQUM7QUFDaEMseUJBQVcsUUFBUSxDQUFDLENBQUM7QUFDckIsMEJBQVksUUFBUSxDQUFDLENBQUM7QUFDdEIsNkJBQWUsUUFBUSxDQUFDLENBQUM7QUFDekIsMkJBQWEsUUFBUSxDQUFDLENBQUM7Q0FDeEIiLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIl19\n\n\n/***/ },\n/* 71 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('blockHelperMissing', function (context, options) {\n\t var inverse = options.inverse,\n\t fn = options.fn;\n\t\n\t if (context === true) {\n\t return fn(this);\n\t } else if (context === false || context == null) {\n\t return inverse(this);\n\t } else if (_utils.isArray(context)) {\n\t if (context.length > 0) {\n\t if (options.ids) {\n\t options.ids = [options.name];\n\t }\n\t\n\t return instance.helpers.each(context, options);\n\t } else {\n\t return inverse(this);\n\t }\n\t } else {\n\t if (options.data && options.ids) {\n\t var data = _utils.createFrame(options.data);\n\t data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);\n\t options = { data: data };\n\t }\n\t\n\t return fn(context, options);\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBc0QsVUFBVTs7cUJBRWpELFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3ZFLFFBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPO1FBQ3pCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDcEIsYUFBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakIsTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUMvQyxhQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QixNQUFNLElBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUMzQixVQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3RCLFlBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUNmLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCOztBQUVELGVBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQ2hELE1BQU07QUFDTCxlQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN0QjtLQUNGLE1BQU07QUFDTCxVQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixZQUFJLElBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLGVBQU8sR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztPQUN4Qjs7QUFFRCxhQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0I7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJibG9jay1oZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGNyZWF0ZUZyYW1lLCBpc0FycmF5fSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgbGV0IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgaWYgKGNvbnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgICBvcHRpb25zLmlkcyA9IFtvcHRpb25zLm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGxldCBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHtkYXRhOiBkYXRhfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=\n\n\n/***/ },\n/* 72 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\tvar _exception = __webpack_require__(9);\n\t\n\tvar _exception2 = _interopRequireDefault(_exception);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('each', function (context, options) {\n\t if (!options) {\n\t throw new _exception2['default']('Must pass iterator to #each');\n\t }\n\t\n\t var fn = options.fn,\n\t inverse = options.inverse,\n\t i = 0,\n\t ret = '',\n\t data = undefined,\n\t contextPath = undefined;\n\t\n\t if (options.data && options.ids) {\n\t contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n\t }\n\t\n\t if (_utils.isFunction(context)) {\n\t context = context.call(this);\n\t }\n\t\n\t if (options.data) {\n\t data = _utils.createFrame(options.data);\n\t }\n\t\n\t function execIteration(field, index, last) {\n\t if (data) {\n\t data.key = field;\n\t data.index = index;\n\t data.first = index === 0;\n\t data.last = !!last;\n\t\n\t if (contextPath) {\n\t data.contextPath = contextPath + field;\n\t }\n\t }\n\t\n\t ret = ret + fn(context[field], {\n\t data: data,\n\t blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])\n\t });\n\t }\n\t\n\t if (context && typeof context === 'object') {\n\t if (_utils.isArray(context)) {\n\t for (var j = context.length; i < j; i++) {\n\t if (i in context) {\n\t execIteration(i, i, i === context.length - 1);\n\t }\n\t }\n\t } else {\n\t var priorKey = undefined;\n\t\n\t for (var key in context) {\n\t if (context.hasOwnProperty(key)) {\n\t // We're running the iterations one step out of sync so we can detect\n\t // the last iteration without have to scan the object twice and create\n\t // an itermediate keys array.\n\t if (priorKey !== undefined) {\n\t execIteration(priorKey, i - 1);\n\t }\n\t priorKey = key;\n\t i++;\n\t }\n\t }\n\t if (priorKey !== undefined) {\n\t execIteration(priorKey, i - 1, true);\n\t }\n\t }\n\t }\n\t\n\t if (i === 0) {\n\t ret = inverse(this);\n\t }\n\t\n\t return ret;\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvZWFjaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUErRSxVQUFVOzt5QkFDbkUsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksQ0FBQyxPQUFPLEVBQUU7QUFDWixZQUFNLDJCQUFjLDZCQUE2QixDQUFDLENBQUM7S0FDcEQ7O0FBRUQsUUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUU7UUFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU87UUFDekIsQ0FBQyxHQUFHLENBQUM7UUFDTCxHQUFHLEdBQUcsRUFBRTtRQUNSLElBQUksWUFBQTtRQUNKLFdBQVcsWUFBQSxDQUFDOztBQUVoQixRQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixpQkFBVyxHQUFHLHlCQUFrQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pGOztBQUVELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDaEIsVUFBSSxHQUFHLG1CQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQzs7QUFFRCxhQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN6QyxVQUFJLElBQUksRUFBRTtBQUNSLFlBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUN6QixZQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0FBRW5CLFlBQUksV0FBVyxFQUFFO0FBQ2YsY0FBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3hDO09BQ0Y7O0FBRUQsU0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQUksRUFBRSxJQUFJO0FBQ1YsbUJBQVcsRUFBRSxtQkFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDL0UsQ0FBQyxDQUFDO0tBQ0o7O0FBRUQsUUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQzFDLFVBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNwQixhQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxjQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDaEIseUJBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1dBQy9DO1NBQ0Y7T0FDRixNQUFNO0FBQ0wsWUFBSSxRQUFRLFlBQUEsQ0FBQzs7QUFFYixhQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRTtBQUN2QixjQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Ozs7QUFJL0IsZ0JBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQiwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDaEM7QUFDRCxvQkFBUSxHQUFHLEdBQUcsQ0FBQztBQUNmLGFBQUMsRUFBRSxDQUFDO1dBQ0w7U0FDRjtBQUNELFlBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQix1QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDWCxTQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCOztBQUVELFdBQU8sR0FBRyxDQUFDO0dBQ1osQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoiZWFjaC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ },\n/* 73 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _exception = __webpack_require__(9);\n\t\n\tvar _exception2 = _interopRequireDefault(_exception);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('helperMissing', function () /* [args, ]options */{\n\t if (arguments.length === 1) {\n\t // A missing field in a {{foo}} construct.\n\t return undefined;\n\t } else {\n\t // Someone is actually trying to call something, blow up.\n\t throw new _exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozt5QkFBc0IsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsaUNBQWdDO0FBQ3ZFLFFBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O0FBRTFCLGFBQU8sU0FBUyxDQUFDO0tBQ2xCLE1BQU07O0FBRUwsWUFBTSwyQkFBYyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDdkY7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJoZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIl19\n\n\n/***/ },\n/* 74 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('if', function (conditional, options) {\n\t if (_utils.isFunction(conditional)) {\n\t conditional = conditional.call(this);\n\t }\n\t\n\t // Default behavior is to render the positive path if the value is truthy and not empty.\n\t // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n\t // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n\t if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {\n\t return options.inverse(this);\n\t } else {\n\t return options.fn(this);\n\t }\n\t });\n\t\n\t instance.registerHelper('unless', function (conditional, options) {\n\t return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBa0MsVUFBVTs7cUJBRTdCLFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVMsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMzRCxRQUFJLGtCQUFXLFdBQVcsQ0FBQyxFQUFFO0FBQUUsaUJBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQUU7Ozs7O0FBS3RFLFFBQUksQUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxJQUFLLGVBQVEsV0FBVyxDQUFDLEVBQUU7QUFDdkUsYUFBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCLE1BQU07QUFDTCxhQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7R0FDRixDQUFDLENBQUM7O0FBRUgsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxXQUFXLEVBQUUsT0FBTyxFQUFFO0FBQy9ELFdBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztHQUN2SCxDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJpZi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNFbXB0eSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkgeyBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7IH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCkgfHwgaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pO1xuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ },\n/* 75 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('log', function () /* message, options */{\n\t var args = [undefined],\n\t options = arguments[arguments.length - 1];\n\t for (var i = 0; i < arguments.length - 1; i++) {\n\t args.push(arguments[i]);\n\t }\n\t\n\t var level = 1;\n\t if (options.hash.level != null) {\n\t level = options.hash.level;\n\t } else if (options.data && options.data.level != null) {\n\t level = options.data.level;\n\t }\n\t args[0] = level;\n\t\n\t instance.log.apply(instance, args);\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0NBQWlDO0FBQzlELFFBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2xCLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsVUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6Qjs7QUFFRCxRQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxRQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtBQUM5QixXQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ3JELFdBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM1QjtBQUNELFFBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0FBRWhCLFlBQVEsQ0FBQyxHQUFHLE1BQUEsQ0FBWixRQUFRLEVBQVMsSUFBSSxDQUFDLENBQUM7R0FDeEIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIl19\n\n\n/***/ },\n/* 76 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('lookup', function (obj, field) {\n\t return obj && obj[field];\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3JELFdBQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUMxQixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJsb29rdXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9va3VwJywgZnVuY3Rpb24ob2JqLCBmaWVsZCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iXX0=\n\n\n/***/ },\n/* 77 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('with', function (context, options) {\n\t if (_utils.isFunction(context)) {\n\t context = context.call(this);\n\t }\n\t\n\t var fn = options.fn;\n\t\n\t if (!_utils.isEmpty(context)) {\n\t var data = options.data;\n\t if (options.data && options.ids) {\n\t data = _utils.createFrame(options.data);\n\t data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);\n\t }\n\t\n\t return fn(context, {\n\t data: data,\n\t blockParams: _utils.blockParams([context], [data && data.contextPath])\n\t });\n\t } else {\n\t return options.inverse(this);\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvd2l0aC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUErRSxVQUFVOztxQkFFMUUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLENBQUMsZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNyQixVQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLFVBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQy9CLFlBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ2hGOztBQUVELGFBQU8sRUFBRSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLEVBQUUsSUFBSTtBQUNWLG1CQUFXLEVBQUUsbUJBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7T0FDaEUsQ0FBQyxDQUFDO0tBQ0osTUFBTTtBQUNMLGFBQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QjtHQUNGLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6IndpdGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ },\n/* 78 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\tvar logger = {\n\t methodMap: ['debug', 'info', 'warn', 'error'],\n\t level: 'info',\n\t\n\t // Maps a given level value to the `methodMap` indexes above.\n\t lookupLevel: function lookupLevel(level) {\n\t if (typeof level === 'string') {\n\t var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());\n\t if (levelMap >= 0) {\n\t level = levelMap;\n\t } else {\n\t level = parseInt(level, 10);\n\t }\n\t }\n\t\n\t return level;\n\t },\n\t\n\t // Can be overridden in the host environment\n\t log: function log(level) {\n\t level = logger.lookupLevel(level);\n\t\n\t if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n\t var method = logger.methodMap[level];\n\t if (!console[method]) {\n\t // eslint-disable-line no-console\n\t method = 'log';\n\t }\n\t\n\t for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t message[_key - 1] = arguments[_key];\n\t }\n\t\n\t console[method].apply(console, message); // eslint-disable-line no-console\n\t }\n\t }\n\t};\n\t\n\texports['default'] = logger;\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFzQixTQUFTOztBQUUvQixJQUFJLE1BQU0sR0FBRztBQUNYLFdBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUM3QyxPQUFLLEVBQUUsTUFBTTs7O0FBR2IsYUFBVyxFQUFFLHFCQUFTLEtBQUssRUFBRTtBQUMzQixRQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUM3QixVQUFJLFFBQVEsR0FBRyxlQUFRLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUQsVUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxRQUFRLENBQUM7T0FDbEIsTUFBTTtBQUNMLGFBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO09BQzdCO0tBQ0Y7O0FBRUQsV0FBTyxLQUFLLENBQUM7R0FDZDs7O0FBR0QsS0FBRyxFQUFFLGFBQVMsS0FBSyxFQUFjO0FBQy9CLFNBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVsQyxRQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDL0UsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxVQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFOztBQUNwQixjQUFNLEdBQUcsS0FBSyxDQUFDO09BQ2hCOzt3Q0FQbUIsT0FBTztBQUFQLGVBQU87OztBQVEzQixhQUFPLENBQUMsTUFBTSxPQUFDLENBQWYsT0FBTyxFQUFZLE9BQU8sQ0FBQyxDQUFDO0tBQzdCO0dBQ0Y7Q0FDRixDQUFDOztxQkFFYSxNQUFNIiwiZmlsZSI6ImxvZ2dlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIG1ldGhvZCA9ICdsb2cnO1xuICAgICAgfVxuICAgICAgY29uc29sZVttZXRob2RdKC4uLm1lc3NhZ2UpOyAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlcjtcbiJdfQ==\n\n\n/***/ },\n/* 79 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {/* global window */\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\texports['default'] = function (Handlebars) {\n\t /* istanbul ignore next */\n\t var root = typeof global !== 'undefined' ? global : window,\n\t $Handlebars = root.Handlebars;\n\t /* istanbul ignore next */\n\t Handlebars.noConflict = function () {\n\t if (root.Handlebars === Handlebars) {\n\t root.Handlebars = $Handlebars;\n\t }\n\t return Handlebars;\n\t };\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O3FCQUNlLFVBQVMsVUFBVSxFQUFFOztBQUVsQyxNQUFJLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU07TUFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0FBRWxDLFlBQVUsQ0FBQyxVQUFVLEdBQUcsWUFBVztBQUNqQyxRQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO0FBQ2xDLFVBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0tBQy9CO0FBQ0QsV0FBTyxVQUFVLENBQUM7R0FDbkIsQ0FBQztDQUNIIiwiZmlsZSI6Im5vLWNvbmZsaWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBsZXQgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgICByZXR1cm4gSGFuZGxlYmFycztcbiAgfTtcbn1cbiJdfQ==\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 80 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.checkRevision = checkRevision;\n\texports.template = template;\n\texports.wrapProgram = wrapProgram;\n\texports.resolvePartial = resolvePartial;\n\texports.invokePartial = invokePartial;\n\texports.noop = noop;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\tvar Utils = _interopRequireWildcard(_utils);\n\t\n\tvar _exception = __webpack_require__(9);\n\t\n\tvar _exception2 = _interopRequireDefault(_exception);\n\t\n\tvar _base = __webpack_require__(27);\n\t\n\tfunction checkRevision(compilerInfo) {\n\t var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n\t currentRevision = _base.COMPILER_REVISION;\n\t\n\t if (compilerRevision !== currentRevision) {\n\t if (compilerRevision < currentRevision) {\n\t var runtimeVersions = _base.REVISION_CHANGES[currentRevision],\n\t compilerVersions = _base.REVISION_CHANGES[compilerRevision];\n\t throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n\t } else {\n\t // Use the embedded version info since the runtime doesn't know about this revision yet\n\t throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n\t }\n\t }\n\t}\n\t\n\tfunction template(templateSpec, env) {\n\t /* istanbul ignore next */\n\t if (!env) {\n\t throw new _exception2['default']('No environment passed to template');\n\t }\n\t if (!templateSpec || !templateSpec.main) {\n\t throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);\n\t }\n\t\n\t templateSpec.main.decorator = templateSpec.main_d;\n\t\n\t // Note: Using env.VM references rather than local var references throughout this section to allow\n\t // for external users to override these as psuedo-supported APIs.\n\t env.VM.checkRevision(templateSpec.compiler);\n\t\n\t function invokePartialWrapper(partial, context, options) {\n\t if (options.hash) {\n\t context = Utils.extend({}, context, options.hash);\n\t if (options.ids) {\n\t options.ids[0] = true;\n\t }\n\t }\n\t\n\t partial = env.VM.resolvePartial.call(this, partial, context, options);\n\t var result = env.VM.invokePartial.call(this, partial, context, options);\n\t\n\t if (result == null && env.compile) {\n\t options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n\t result = options.partials[options.name](context, options);\n\t }\n\t if (result != null) {\n\t if (options.indent) {\n\t var lines = result.split('\\n');\n\t for (var i = 0, l = lines.length; i < l; i++) {\n\t if (!lines[i] && i + 1 === l) {\n\t break;\n\t }\n\t\n\t lines[i] = options.indent + lines[i];\n\t }\n\t result = lines.join('\\n');\n\t }\n\t return result;\n\t } else {\n\t throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n\t }\n\t }\n\t\n\t // Just add water\n\t var container = {\n\t strict: function strict(obj, name) {\n\t if (!(name in obj)) {\n\t throw new _exception2['default']('\"' + name + '\" not defined in ' + obj);\n\t }\n\t return obj[name];\n\t },\n\t lookup: function lookup(depths, name) {\n\t var len = depths.length;\n\t for (var i = 0; i < len; i++) {\n\t if (depths[i] && depths[i][name] != null) {\n\t return depths[i][name];\n\t }\n\t }\n\t },\n\t lambda: function lambda(current, context) {\n\t return typeof current === 'function' ? current.call(context) : current;\n\t },\n\t\n\t escapeExpression: Utils.escapeExpression,\n\t invokePartial: invokePartialWrapper,\n\t\n\t fn: function fn(i) {\n\t var ret = templateSpec[i];\n\t ret.decorator = templateSpec[i + '_d'];\n\t return ret;\n\t },\n\t\n\t programs: [],\n\t program: function program(i, data, declaredBlockParams, blockParams, depths) {\n\t var programWrapper = this.programs[i],\n\t fn = this.fn(i);\n\t if (data || depths || blockParams || declaredBlockParams) {\n\t programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n\t } else if (!programWrapper) {\n\t programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n\t }\n\t return programWrapper;\n\t },\n\t\n\t data: function data(value, depth) {\n\t while (value && depth--) {\n\t value = value._parent;\n\t }\n\t return value;\n\t },\n\t merge: function merge(param, common) {\n\t var obj = param || common;\n\t\n\t if (param && common && param !== common) {\n\t obj = Utils.extend({}, common, param);\n\t }\n\t\n\t return obj;\n\t },\n\t\n\t noop: env.VM.noop,\n\t compilerInfo: templateSpec.compiler\n\t };\n\t\n\t function ret(context) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t var data = options.data;\n\t\n\t ret._setup(options);\n\t if (!options.partial && templateSpec.useData) {\n\t data = initData(context, data);\n\t }\n\t var depths = undefined,\n\t blockParams = templateSpec.useBlockParams ? [] : undefined;\n\t if (templateSpec.useDepths) {\n\t if (options.depths) {\n\t depths = context !== options.depths[0] ? [context].concat(options.depths) : options.depths;\n\t } else {\n\t depths = [context];\n\t }\n\t }\n\t\n\t function main(context /*, options*/) {\n\t return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n\t }\n\t main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n\t return main(context, options);\n\t }\n\t ret.isTop = true;\n\t\n\t ret._setup = function (options) {\n\t if (!options.partial) {\n\t container.helpers = container.merge(options.helpers, env.helpers);\n\t\n\t if (templateSpec.usePartial) {\n\t container.partials = container.merge(options.partials, env.partials);\n\t }\n\t if (templateSpec.usePartial || templateSpec.useDecorators) {\n\t container.decorators = container.merge(options.decorators, env.decorators);\n\t }\n\t } else {\n\t container.helpers = options.helpers;\n\t container.partials = options.partials;\n\t container.decorators = options.decorators;\n\t }\n\t };\n\t\n\t ret._child = function (i, data, blockParams, depths) {\n\t if (templateSpec.useBlockParams && !blockParams) {\n\t throw new _exception2['default']('must pass block params');\n\t }\n\t if (templateSpec.useDepths && !depths) {\n\t throw new _exception2['default']('must pass parent depths');\n\t }\n\t\n\t return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n\t };\n\t return ret;\n\t}\n\t\n\tfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n\t function prog(context) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t var currentDepths = depths;\n\t if (depths && context !== depths[0]) {\n\t currentDepths = [context].concat(depths);\n\t }\n\t\n\t return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);\n\t }\n\t\n\t prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\t\n\t prog.program = i;\n\t prog.depth = depths ? depths.length : 0;\n\t prog.blockParams = declaredBlockParams || 0;\n\t return prog;\n\t}\n\t\n\tfunction resolvePartial(partial, context, options) {\n\t if (!partial) {\n\t if (options.name === '@partial-block') {\n\t partial = options.data['partial-block'];\n\t } else {\n\t partial = options.partials[options.name];\n\t }\n\t } else if (!partial.call && !options.name) {\n\t // This is a dynamic partial that returned a string\n\t options.name = partial;\n\t partial = options.partials[partial];\n\t }\n\t return partial;\n\t}\n\t\n\tfunction invokePartial(partial, context, options) {\n\t options.partial = true;\n\t if (options.ids) {\n\t options.data.contextPath = options.ids[0] || options.data.contextPath;\n\t }\n\t\n\t var partialBlock = undefined;\n\t if (options.fn && options.fn !== noop) {\n\t options.data = _base.createFrame(options.data);\n\t partialBlock = options.data['partial-block'] = options.fn;\n\t\n\t if (partialBlock.partials) {\n\t options.partials = Utils.extend({}, options.partials, partialBlock.partials);\n\t }\n\t }\n\t\n\t if (partial === undefined && partialBlock) {\n\t partial = partialBlock;\n\t }\n\t\n\t if (partial === undefined) {\n\t throw new _exception2['default']('The partial ' + options.name + ' could not be found');\n\t } else if (partial instanceof Function) {\n\t return partial(context, options);\n\t }\n\t}\n\t\n\tfunction noop() {\n\t return '';\n\t}\n\t\n\tfunction initData(context, data) {\n\t if (!data || !('root' in data)) {\n\t data = data ? _base.createFrame(data) : {};\n\t data.root = context;\n\t }\n\t return data;\n\t}\n\t\n\tfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n\t if (fn.decorator) {\n\t var props = {};\n\t prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n\t Utils.extend(prog, props);\n\t }\n\t return prog;\n\t}\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQXVCLFNBQVM7O0lBQXBCLEtBQUs7O3lCQUNLLGFBQWE7Ozs7b0JBQzhCLFFBQVE7O0FBRWxFLFNBQVMsYUFBYSxDQUFDLFlBQVksRUFBRTtBQUMxQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztNQUN2RCxlQUFlLDBCQUFvQixDQUFDOztBQUUxQyxNQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRTtBQUN4QyxRQUFJLGdCQUFnQixHQUFHLGVBQWUsRUFBRTtBQUN0QyxVQUFNLGVBQWUsR0FBRyx1QkFBaUIsZUFBZSxDQUFDO1VBQ25ELGdCQUFnQixHQUFHLHVCQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVELFlBQU0sMkJBQWMseUZBQXlGLEdBQ3ZHLHFEQUFxRCxHQUFHLGVBQWUsR0FBRyxtREFBbUQsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNoSyxNQUFNOztBQUVMLFlBQU0sMkJBQWMsd0ZBQXdGLEdBQ3RHLGlEQUFpRCxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNuRjtHQUNGO0NBQ0Y7O0FBRU0sU0FBUyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTs7QUFFMUMsTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNSLFVBQU0sMkJBQWMsbUNBQW1DLENBQUMsQ0FBQztHQUMxRDtBQUNELE1BQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ3ZDLFVBQU0sMkJBQWMsMkJBQTJCLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQztHQUN4RTs7QUFFRCxjQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDOzs7O0FBSWxELEtBQUcs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U0FBUyxJQUFJLEdBQUc7QUFBRSxTQUFPLEVBQUUsQ0FBQztDQUFFOztBQUVyQyxTQUFTLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQy9CLE1BQUksQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFBLEFBQUMsRUFBRTtBQUM5QixRQUFJLEdBQUcsSUFBSSxHQUFHLGtCQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztHQUNyQjtBQUNELFNBQU8sSUFBSSxDQUFDO0NBQ2I7O0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtBQUN6RSxNQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUU7QUFDaEIsUUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ2YsUUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVGLFNBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0dBQzNCO0FBQ0QsU0FBTyxJQUFJLENBQUM7Q0FDYiIsImZpbGUiOiJydW50aW1lLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vZXhjZXB0aW9uJztcbmltcG9ydCB7IENPTVBJTEVSX1JFVklTSU9OLCBSRVZJU0lPTl9DSEFOR0VTLCBjcmVhdGVGcmFtZSB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICBjb25zdCBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLFxuICAgICAgICBjdXJyZW50UmV2aXNpb24gPSBDT01QSUxFUl9SRVZJU0lPTjtcblxuICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7XG4gICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlzaW9uXSxcbiAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dO1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIHJ1bnRpbWVWZXJzaW9ucyArICcpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVyVmVyc2lvbnMgKyAnKS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVySW5mb1sxXSArICcpLicpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGUnKTtcbiAgfVxuICBpZiAoIXRlbXBsYXRlU3BlYyB8fCAhdGVtcGxhdGVTcGVjLm1haW4pIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmtub3duIHRlbXBsYXRlIG9iamVjdDogJyArIHR5cGVvZiB0ZW1wbGF0ZVNwZWMpO1xuICB9XG5cbiAgdGVtcGxhdGVTcGVjLm1haW4uZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjLm1haW5fZDtcblxuICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvd1xuICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLlxuICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpO1xuXG4gIGZ1bmN0aW9uIGludm9rZVBhcnRpYWxXcmFwcGVyKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICBjb250ZXh0ID0gVXRpbHMuZXh0ZW5kKHt9LCBjb250ZXh0LCBvcHRpb25zLmhhc2gpO1xuICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIG9wdGlvbnMuaWRzWzBdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJ0aWFsID0gZW52LlZNLnJlc29sdmVQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG4gICAgbGV0IHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7XG4gICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaW5lc1tpXSAmJiBpICsgMSA9PT0gbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGluZXNbaV0gPSBvcHRpb25zLmluZGVudCArIGxpbmVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGNvbXBpbGVkIHdoZW4gcnVubmluZyBpbiBydW50aW1lLW9ubHkgbW9kZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEp1c3QgYWRkIHdhdGVyXG4gIGxldCBjb250YWluZXIgPSB7XG4gICAgc3RyaWN0OiBmdW5jdGlvbihvYmosIG5hbWUpIHtcbiAgICAgIGlmICghKG5hbWUgaW4gb2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdcIicgKyBuYW1lICsgJ1wiIG5vdCBkZWZpbmVkIGluICcgKyBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgICB9LFxuICAgIGxvb2t1cDogZnVuY3Rpb24oZGVwdGhzLCBuYW1lKSB7XG4gICAgICBjb25zdCBsZW4gPSBkZXB0aHMubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZGVwdGhzW2ldICYmIGRlcHRoc1tpXVtuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbihjdXJyZW50LCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50O1xuICAgIH0sXG5cbiAgICBlc2NhcGVFeHByZXNzaW9uOiBVdGlscy5lc2NhcGVFeHByZXNzaW9uLFxuICAgIGludm9rZVBhcnRpYWw6IGludm9rZVBhcnRpYWxXcmFwcGVyLFxuXG4gICAgZm46IGZ1bmN0aW9uKGkpIHtcbiAgICAgIGxldCByZXQgPSB0ZW1wbGF0ZVNwZWNbaV07XG4gICAgICByZXQuZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjW2kgKyAnX2QnXTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSxcblxuICAgIHByb2dyYW1zOiBbXSxcbiAgICBwcm9ncmFtOiBmdW5jdGlvbihpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICBsZXQgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZSwgZGVwdGgpIHtcbiAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbihwYXJhbSwgY29tbW9uKSB7XG4gICAgICBsZXQgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIChwYXJhbSAhPT0gY29tbW9uKSkge1xuICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICBub29wOiBlbnYuVk0ubm9vcCxcbiAgICBjb21waWxlckluZm86IHRlbXBsYXRlU3BlYy5jb21waWxlclxuICB9O1xuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuICAgIHJldC5fc2V0dXAob3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHtcbiAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTtcbiAgICB9XG4gICAgbGV0IGRlcHRocyxcbiAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykge1xuICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7XG4gICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRocztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWluKGNvbnRleHQvKiwgb3B0aW9ucyovKSB7XG4gICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIH1cbiAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTtcbiAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxuICByZXQuaXNUb3AgPSB0cnVlO1xuXG4gIHJldC5fc2V0dXAgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHtcbiAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpO1xuXG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwpIHtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMucGFydGlhbHMsIGVudi5wYXJ0aWFscyk7XG4gICAgICB9XG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwgfHwgdGVtcGxhdGVTcGVjLnVzZURlY29yYXRvcnMpIHtcbiAgICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5kZWNvcmF0b3JzLCBlbnYuZGVjb3JhdG9ycyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gb3B0aW9ucy5oZWxwZXJzO1xuICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3B0aW9ucy5wYXJ0aWFscztcbiAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gb3B0aW9ucy5kZWNvcmF0b3JzO1xuICAgIH1cbiAgfTtcblxuICByZXQuX2NoaWxkID0gZnVuY3Rpb24oaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgJiYgIWJsb2NrUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7XG4gICAgfVxuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ211c3QgcGFzcyBwYXJlbnQgZGVwdGhzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgZnVuY3Rpb24gcHJvZyhjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgY3VycmVudERlcHRocyA9IGRlcHRocztcbiAgICBpZiAoZGVwdGhzICYmIGNvbnRleHQgIT09IGRlcHRoc1swXSkge1xuICAgICAgY3VycmVudERlcHRocyA9IFtjb250ZXh0XS5jb25jYXQoZGVwdGhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oY29udGFpbmVyLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLFxuICAgICAgICBvcHRpb25zLmRhdGEgfHwgZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXMgJiYgW29wdGlvbnMuYmxvY2tQYXJhbXNdLmNvbmNhdChibG9ja1BhcmFtcyksXG4gICAgICAgIGN1cnJlbnREZXB0aHMpO1xuICB9XG5cbiAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpO1xuXG4gIHByb2cucHJvZ3JhbSA9IGk7XG4gIHByb2cuZGVwdGggPSBkZXB0aHMgPyBkZXB0aHMubGVuZ3RoIDogMDtcbiAgcHJvZy5ibG9ja1BhcmFtcyA9IGRlY2xhcmVkQmxvY2tQYXJhbXMgfHwgMDtcbiAgcmV0dXJuIHByb2c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghcGFydGlhbCkge1xuICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHtcbiAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nXG4gICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTtcbiAgfVxuICByZXR1cm4gcGFydGlhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVBhcnRpYWwocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICBvcHRpb25zLnBhcnRpYWwgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICBvcHRpb25zLmRhdGEuY29udGV4dFBhdGggPSBvcHRpb25zLmlkc1swXSB8fCBvcHRpb25zLmRhdGEuY29udGV4dFBhdGg7XG4gIH1cblxuICBsZXQgcGFydGlhbEJsb2NrO1xuICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7XG4gICAgb3B0aW9ucy5kYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAocGFydGlhbEJsb2NrLnBhcnRpYWxzKSB7XG4gICAgICBvcHRpb25zLnBhcnRpYWxzID0gVXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zLnBhcnRpYWxzLCBwYXJ0aWFsQmxvY2sucGFydGlhbHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQgJiYgcGFydGlhbEJsb2NrKSB7XG4gICAgcGFydGlhbCA9IHBhcnRpYWxCbG9jaztcbiAgfVxuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgfSBlbHNlIGlmIChwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpIHsgcmV0dXJuICcnOyB9XG5cbmZ1bmN0aW9uIGluaXREYXRhKGNvbnRleHQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICEoJ3Jvb3QnIGluIGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEgPyBjcmVhdGVGcmFtZShkYXRhKSA6IHt9O1xuICAgIGRhdGEucm9vdCA9IGNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpIHtcbiAgaWYgKGZuLmRlY29yYXRvcikge1xuICAgIGxldCBwcm9wcyA9IHt9O1xuICAgIHByb2cgPSBmbi5kZWNvcmF0b3IocHJvZywgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGhzICYmIGRlcHRoc1swXSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgVXRpbHMuZXh0ZW5kKHByb2csIHByb3BzKTtcbiAgfVxuICByZXR1cm4gcHJvZztcbn1cbiJdfQ==\n\n\n/***/ },\n/* 81 */\n/***/ function(module, exports) {\n\n\t// Build out our basic SafeString type\n\t'use strict';\n\t\n\texports.__esModule = true;\n\tfunction SafeString(string) {\n\t this.string = string;\n\t}\n\t\n\tSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n\t return '' + this.string;\n\t};\n\t\n\texports['default'] = SafeString;\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDMUIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEI7O0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBVztBQUN2RSxTQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3pCLENBQUM7O3FCQUVhLFVBQVUiLCJmaWxlIjoic2FmZS1zdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiJdfQ==\n\n\n/***/ },\n/* 82 */,\n/* 83 */,\n/* 84 */,\n/* 85 */,\n/* 86 */,\n/* 87 */,\n/* 88 */,\n/* 89 */,\n/* 90 */,\n/* 91 */,\n/* 92 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(19),\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( baseMVC, _l ){\n\t// =============================================================================\n\t/** A view on any model that has a 'annotation' attribute\n\t */\n\tvar AnnotationEditor = Backbone.View\n\t .extend( baseMVC.LoggableMixin )\n\t .extend( baseMVC.HiddenUntilActivatedViewMixin ).extend({\n\t\n\t tagName : 'div',\n\t className : 'annotation-display',\n\t\n\t /** Set up listeners, parse options */\n\t initialize : function( options ){\n\t options = options || {};\n\t this.tooltipConfig = options.tooltipConfig || { placement: 'bottom' };\n\t //console.debug( this, options );\n\t // only listen to the model only for changes to annotations\n\t this.listenTo( this.model, 'change:annotation', function(){\n\t this.render();\n\t });\n\t this.hiddenUntilActivated( options.$activator, options );\n\t },\n\t\n\t /** Build the DOM elements, call select to on the created input, and set up behaviors */\n\t render : function(){\n\t var view = this;\n\t this.$el.html( this._template() );\n\t this.$el.find( \"[title]\" ).tooltip( this.tooltipConfig );\n\t\n\t //TODO: handle empties better\n\t this.$annotation().make_text_editable({\n\t use_textarea: true,\n\t on_finish: function( newAnnotation ){\n\t view.$annotation().text( newAnnotation );\n\t view.model.save({ annotation: newAnnotation }, { silent: true })\n\t .fail( function(){\n\t view.$annotation().text( view.model.previous( 'annotation' ) );\n\t });\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t /** @returns {String} the html text used to build the view's DOM */\n\t _template : function(){\n\t var annotation = this.model.get( 'annotation' );\n\t //if( !annotation ){\n\t // //annotation = [ '', _l( 'Click to add an annotation' ), '' ].join( '' );\n\t // annotation = [ '' ].join( '' );\n\t //}\n\t return [\n\t //TODO: make prompt optional\n\t '',\n\t // set up initial tags by adding as CSV to input vals (necc. to init select2)\n\t '
    ',\n\t _.escape( annotation ),\n\t '
    '\n\t ].join( '' );\n\t },\n\t\n\t /** @returns {jQuery} the main element for this view */\n\t $annotation : function(){\n\t return this.$el.find( '.annotation' );\n\t },\n\t\n\t /** shut down event listeners and remove this view's DOM */\n\t remove : function(){\n\t this.$annotation.off();\n\t this.stopListening( this.model );\n\t Backbone.View.prototype.remove.call( this );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){ return [ 'AnnotationEditor(', this.model + '', ')' ].join(''); }\n\t});\n\t// =============================================================================\n\treturn {\n\t AnnotationEditor : AnnotationEditor\n\t};\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3)))\n\n/***/ },\n/* 93 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(100),\n\t __webpack_require__(35),\n\t __webpack_require__(34),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_VIEW, DC_MODEL, DC_LI, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\t/** @class non-editable, read-only View/Controller for a dataset collection.\n\t */\n\tvar _super = LIST_VIEW.ModelListPanel;\n\tvar CollectionView = _super.extend(\n\t/** @lends CollectionView.prototype */{\n\t //MODEL is either a DatasetCollection (or subclass) or a DatasetCollectionElement (list of pairs)\n\t _logNamespace : logNamespace,\n\t\n\t className : _super.prototype.className + ' dataset-collection-panel',\n\t\n\t /** sub view class used for datasets */\n\t DatasetDCEViewClass : DC_LI.DatasetDCEListItemView,\n\t /** sub view class used for nested collections */\n\t NestedDCDCEViewClass: DC_LI.NestedDCDCEListItemView,\n\t /** key of attribute in model to assign to this.collection */\n\t modelCollectionKey : 'elements',\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events\n\t * @param {Object} attributes optional settings for the panel\n\t */\n\t initialize : function( attributes ){\n\t _super.prototype.initialize.call( this, attributes );\n\t this.linkTarget = attributes.linkTarget || '_blank';\n\t\n\t this.hasUser = attributes.hasUser;\n\t /** A stack of panels that currently cover or hide this panel */\n\t this.panelStack = [];\n\t /** The text of the link to go back to the panel containing this one */\n\t this.parentName = attributes.parentName;\n\t /** foldout or drilldown */\n\t this.foldoutStyle = attributes.foldoutStyle || 'foldout';\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-views\n\t /** In this override, use model.getVisibleContents */\n\t _filterCollection : function(){\n\t//TODO: should *not* be model.getVisibleContents - visibility is not model related\n\t return this.model.getVisibleContents();\n\t },\n\t\n\t /** override to return proper view class based on element_type */\n\t _getItemViewClass : function( model ){\n\t //this.debug( this + '._getItemViewClass:', model );\n\t//TODO: subclasses use DCEViewClass - but are currently unused - decide\n\t switch( model.get( 'element_type' ) ){\n\t case 'hda':\n\t return this.DatasetDCEViewClass;\n\t case 'dataset_collection':\n\t return this.NestedDCDCEViewClass;\n\t }\n\t throw new TypeError( 'Unknown element type:', model.get( 'element_type' ) );\n\t },\n\t\n\t /** override to add link target and anon */\n\t _getItemViewOptions : function( model ){\n\t var options = _super.prototype._getItemViewOptions.call( this, model );\n\t return _.extend( options, {\n\t linkTarget : this.linkTarget,\n\t hasUser : this.hasUser,\n\t//TODO: could move to only nested: list:paired\n\t foldoutStyle : this.foldoutStyle\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ collection sub-views\n\t /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n\t _setUpItemViewListeners : function( view ){\n\t var panel = this;\n\t _super.prototype._setUpItemViewListeners.call( panel, view );\n\t\n\t // use pub-sub to: handle drilldown expansion and collapse\n\t view.on( 'expanded:drilldown', function( v, drilldown ){\n\t this._expandDrilldownPanel( drilldown );\n\t }, this );\n\t view.on( 'collapsed:drilldown', function( v, drilldown ){\n\t this._collapseDrilldownPanel( drilldown );\n\t }, this );\n\t return this;\n\t },\n\t\n\t /** Handle drill down by hiding this panels list and controls and showing the sub-panel */\n\t _expandDrilldownPanel : function( drilldown ){\n\t this.panelStack.push( drilldown );\n\t // hide this panel's controls and list, set the name for back navigation, and attach to the $el\n\t this.$( '> .controls' ).add( this.$list() ).hide();\n\t drilldown.parentName = this.model.get( 'name' );\n\t this.$el.append( drilldown.render().$el );\n\t },\n\t\n\t /** Handle drilldown close by freeing the panel and re-rendering this panel */\n\t _collapseDrilldownPanel : function( drilldown ){\n\t this.panelStack.pop();\n\t this.render();\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel events\n\t /** event map */\n\t events : {\n\t 'click .navigation .back' : 'close'\n\t },\n\t\n\t /** close/remove this collection panel */\n\t close : function( event ){\n\t this.$el.remove();\n\t this.trigger( 'close' );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'CollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//------------------------------------------------------------------------------ TEMPLATES\n\tCollectionView.prototype.templates = (function(){\n\t\n\t var controlsTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t '',\n\t\n\t '
    ',\n\t '
    <%- collection.name || collection.element_identifier %>
    ',\n\t '
    ',\n\t//TODO: remove logic from template\n\t '<% if( collection.collection_type === \"list\" ){ %>',\n\t _l( 'a list of datasets' ),\n\t '<% } else if( collection.collection_type === \"paired\" ){ %>',\n\t _l( 'a pair of datasets' ),\n\t '<% } else if( collection.collection_type === \"list:paired\" ){ %>',\n\t _l( 'a list of paired datasets' ),\n\t '<% } %>',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ], 'collection' );\n\t\n\t return _.extend( _.clone( _super.prototype.templates ), {\n\t controls : controlsTemplate\n\t });\n\t}());\n\t\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar ListCollectionView = CollectionView.extend(\n\t/** @lends ListCollectionView.prototype */{\n\t\n\t //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n\t /** sub view class used for datasets */\n\t DatasetDCEViewClass : DC_LI.DatasetDCEListItemView,\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'ListCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar PairCollectionView = ListCollectionView.extend(\n\t/** @lends PairCollectionView.prototype */{\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'PairCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar ListOfPairsCollectionView = CollectionView.extend(\n\t/** @lends ListOfPairsCollectionView.prototype */{\n\t\n\t //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n\t /** sub view class used for nested collections */\n\t NestedDCDCEViewClass : DC_LI.NestedDCDCEListItemView.extend({\n\t foldoutPanelClass : PairCollectionView\n\t }),\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'ListOfPairsCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t CollectionView : CollectionView,\n\t ListCollectionView : ListCollectionView,\n\t PairCollectionView : PairCollectionView,\n\t ListOfPairsCollectionView : ListOfPairsCollectionView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 94 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(15),\n\t __webpack_require__(37),\n\t __webpack_require__(101),\n\t __webpack_require__(92),\n\t __webpack_require__(26),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( STATES, DATASET_LI, TAGS, ANNOTATIONS, faIconButton, BASE_MVC, _l ){\n\t//==============================================================================\n\tvar _super = DATASET_LI.DatasetListItemView;\n\t/** @class Editing view for DatasetAssociation.\n\t */\n\tvar DatasetListItemEdit = _super.extend(\n\t/** @lends DatasetListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** set up: options */\n\t initialize : function( attributes ){\n\t _super.prototype.initialize.call( this, attributes );\n\t//TODO: shouldn't this err if false?\n\t this.hasUser = attributes.hasUser;\n\t\n\t /** allow user purge of dataset files? */\n\t this.purgeAllowed = attributes.purgeAllowed || false;\n\t\n\t //TODO: move to HiddenUntilActivatedViewMixin\n\t /** should the tags editor be shown or hidden initially? */\n\t this.tagsEditorShown = attributes.tagsEditorShown || false;\n\t /** should the tags editor be shown or hidden initially? */\n\t this.annotationEditorShown = attributes.annotationEditorShown || false;\n\t },\n\t\n\t // ......................................................................... titlebar actions\n\t /** In this override, add the other two primary actions: edit and delete */\n\t _renderPrimaryActions : function(){\n\t var actions = _super.prototype._renderPrimaryActions.call( this );\n\t if( this.model.get( 'state' ) === STATES.NOT_VIEWABLE ){\n\t return actions;\n\t }\n\t // render the display, edit attr and delete icon-buttons\n\t return _super.prototype._renderPrimaryActions.call( this ).concat([\n\t this._renderEditButton(),\n\t this._renderDeleteButton()\n\t ]);\n\t },\n\t\n\t//TODO: move titleButtons into state renderers, remove state checks in the buttons\n\t\n\t /** Render icon-button to edit the attributes (format, permissions, etc.) this dataset. */\n\t _renderEditButton : function(){\n\t // don't show edit while uploading, in-accessible\n\t // DO show if in error (ala previous history panel)\n\t if( ( this.model.get( 'state' ) === STATES.DISCARDED )\n\t || ( !this.model.get( 'accessible' ) ) ){\n\t return null;\n\t }\n\t\n\t var purged = this.model.get( 'purged' ),\n\t deleted = this.model.get( 'deleted' ),\n\t editBtnData = {\n\t title : _l( 'Edit attributes' ),\n\t href : this.model.urls.edit,\n\t target : this.linkTarget,\n\t faIcon : 'fa-pencil',\n\t classes : 'edit-btn'\n\t };\n\t\n\t // disable if purged or deleted and explain why in the tooltip\n\t if( deleted || purged ){\n\t editBtnData.disabled = true;\n\t if( purged ){\n\t editBtnData.title = _l( 'Cannot edit attributes of datasets removed from disk' );\n\t } else if( deleted ){\n\t editBtnData.title = _l( 'Undelete dataset to edit attributes' );\n\t }\n\t\n\t // disable if still uploading or new\n\t } else if( _.contains( [ STATES.UPLOAD, STATES.NEW ], this.model.get( 'state' ) ) ){\n\t editBtnData.disabled = true;\n\t editBtnData.title = _l( 'This dataset is not yet editable' );\n\t }\n\t return faIconButton( editBtnData );\n\t },\n\t\n\t /** Render icon-button to delete this hda. */\n\t _renderDeleteButton : function(){\n\t // don't show delete if...\n\t if( ( !this.model.get( 'accessible' ) ) ){\n\t return null;\n\t }\n\t\n\t var self = this,\n\t deletedAlready = this.model.isDeletedOrPurged();\n\t return faIconButton({\n\t title : !deletedAlready? _l( 'Delete' ) : _l( 'Dataset is already deleted' ),\n\t disabled : deletedAlready,\n\t faIcon : 'fa-times',\n\t classes : 'delete-btn',\n\t onclick : function() {\n\t // ...bler... tooltips being left behind in DOM (hover out never called on deletion)\n\t self.$el.find( '.icon-btn.delete-btn' ).trigger( 'mouseout' );\n\t self.model[ 'delete' ]();\n\t }\n\t });\n\t },\n\t\n\t // ......................................................................... details\n\t /** In this override, add tags and annotations controls, make the ? dbkey a link to editing page */\n\t _renderDetails : function(){\n\t //TODO: generalize to be allow different details for each state\n\t var $details = _super.prototype._renderDetails.call( this ),\n\t state = this.model.get( 'state' );\n\t\n\t if( !this.model.isDeletedOrPurged() && _.contains([ STATES.OK, STATES.FAILED_METADATA ], state ) ){\n\t this._renderTags( $details );\n\t this._renderAnnotation( $details );\n\t this._makeDbkeyEditLink( $details );\n\t }\n\t\n\t//TODO: TRIPLE tap, ugh.\n\t this._setUpBehaviors( $details );\n\t return $details;\n\t },\n\t\n\t /** Add less commonly used actions in the details section based on state */\n\t _renderSecondaryActions : function(){\n\t var actions = _super.prototype._renderSecondaryActions.call( this );\n\t switch( this.model.get( 'state' ) ){\n\t case STATES.UPLOAD:\n\t case STATES.NOT_VIEWABLE:\n\t return actions;\n\t case STATES.ERROR:\n\t // error button comes first\n\t actions.unshift( this._renderErrButton() );\n\t return actions.concat([ this._renderRerunButton() ]);\n\t case STATES.OK:\n\t case STATES.FAILED_METADATA:\n\t return actions.concat([ this._renderRerunButton(), this._renderVisualizationsButton() ]);\n\t }\n\t return actions.concat([ this._renderRerunButton() ]);\n\t },\n\t\n\t /** Render icon-button to report an error on this dataset to the galaxy admin. */\n\t _renderErrButton : function(){\n\t return faIconButton({\n\t title : _l( 'View or report this error' ),\n\t href : this.model.urls.report_error,\n\t classes : 'report-error-btn',\n\t target : this.linkTarget,\n\t faIcon : 'fa-bug'\n\t });\n\t },\n\t\n\t /** Render icon-button to re-run the job that created this dataset. */\n\t _renderRerunButton : function(){\n\t var creating_job = this.model.get( 'creating_job' );\n\t if( this.model.get( 'rerunnable' ) ){\n\t return faIconButton({\n\t title : _l( 'Run this job again' ),\n\t href : this.model.urls.rerun,\n\t classes : 'rerun-btn',\n\t target : this.linkTarget,\n\t faIcon : 'fa-refresh',\n\t onclick : function( ev ) {\n\t ev.preventDefault();\n\t // create webpack split point in order to load the tool form async\n\t // TODO: split not working (tool loads fine)\n\t !/* require */(/* empty */function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [ __webpack_require__(22) ]; (function( ToolForm ){\n\t var form = new ToolForm.View({ 'job_id' : creating_job });\n\t form.deferred.execute( function(){\n\t Galaxy.app.display( form );\n\t });\n\t }.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));}());\n\t }\n\t });\n\t }\n\t },\n\t\n\t /** Render an icon-button or popupmenu of links based on the applicable visualizations */\n\t _renderVisualizationsButton : function(){\n\t //TODO: someday - lazyload visualizations\n\t var visualizations = this.model.get( 'visualizations' );\n\t if( ( this.model.isDeletedOrPurged() )\n\t || ( !this.hasUser )\n\t || ( !this.model.hasData() )\n\t || ( _.isEmpty( visualizations ) ) ){\n\t return null;\n\t }\n\t if( !_.isObject( visualizations[0] ) ){\n\t this.warn( 'Visualizations have been switched off' );\n\t return null;\n\t }\n\t\n\t var $visualizations = $( this.templates.visualizations( visualizations, this ) );\n\t //HACK: need to re-write those directed at galaxy_main with linkTarget\n\t $visualizations.find( '[target=\"galaxy_main\"]').attr( 'target', this.linkTarget );\n\t // use addBack here to include the root $visualizations elem (for the case of 1 visualization)\n\t this._addScratchBookFn( $visualizations.find( '.visualization-link' ).addBack( '.visualization-link' ) );\n\t return $visualizations;\n\t },\n\t\n\t /** add scratchbook functionality to visualization links */\n\t _addScratchBookFn : function( $links ){\n\t var li = this;\n\t $links.click( function( ev ){\n\t if( Galaxy.frame && Galaxy.frame.active ){\n\t Galaxy.frame.add({\n\t title : 'Visualization',\n\t url : $( this ).attr( 'href' )\n\t });\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t }\n\t });\n\t },\n\t\n\t//TODO: if possible move these to readonly view - but display the owner's tags/annotation (no edit)\n\t /** Render the tags list/control */\n\t _renderTags : function( $where ){\n\t if( !this.hasUser ){ return; }\n\t var view = this;\n\t this.tagsEditor = new TAGS.TagsEditor({\n\t model : this.model,\n\t el : $where.find( '.tags-display' ),\n\t onshowFirstTime : function(){ this.render(); },\n\t // persist state on the hda view (and not the editor) since these are currently re-created each time\n\t onshow : function(){ view.tagsEditorShown = true; },\n\t onhide : function(){ view.tagsEditorShown = false; },\n\t $activator : faIconButton({\n\t title : _l( 'Edit dataset tags' ),\n\t classes : 'tag-btn',\n\t faIcon : 'fa-tags'\n\t }).appendTo( $where.find( '.actions .right' ) )\n\t });\n\t if( this.tagsEditorShown ){ this.tagsEditor.toggle( true ); }\n\t },\n\t\n\t /** Render the annotation display/control */\n\t _renderAnnotation : function( $where ){\n\t if( !this.hasUser ){ return; }\n\t var view = this;\n\t this.annotationEditor = new ANNOTATIONS.AnnotationEditor({\n\t model : this.model,\n\t el : $where.find( '.annotation-display' ),\n\t onshowFirstTime : function(){ this.render(); },\n\t // persist state on the hda view (and not the editor) since these are currently re-created each time\n\t onshow : function(){ view.annotationEditorShown = true; },\n\t onhide : function(){ view.annotationEditorShown = false; },\n\t $activator : faIconButton({\n\t title : _l( 'Edit dataset annotation' ),\n\t classes : 'annotate-btn',\n\t faIcon : 'fa-comment'\n\t }).appendTo( $where.find( '.actions .right' ) )\n\t });\n\t if( this.annotationEditorShown ){ this.annotationEditor.toggle( true ); }\n\t },\n\t\n\t /** If the format/dbkey/genome_build isn't set, make the display a link to the edit page */\n\t _makeDbkeyEditLink : function( $details ){\n\t // make the dbkey a link to editing\n\t if( this.model.get( 'metadata_dbkey' ) === '?'\n\t && !this.model.isDeletedOrPurged() ){\n\t var editableDbkey = $( '?' )\n\t .attr( 'href', this.model.urls.edit )\n\t .attr( 'target', this.linkTarget );\n\t $details.find( '.dbkey .value' ).replaceWith( editableDbkey );\n\t }\n\t },\n\t\n\t // ......................................................................... events\n\t /** event map */\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .undelete-link' : '_clickUndeleteLink',\n\t 'click .purge-link' : '_clickPurgeLink',\n\t\n\t 'click .edit-btn' : function( ev ){ this.trigger( 'edit', this, ev ); },\n\t 'click .delete-btn' : function( ev ){ this.trigger( 'delete', this, ev ); },\n\t 'click .rerun-btn' : function( ev ){ this.trigger( 'rerun', this, ev ); },\n\t 'click .report-err-btn' : function( ev ){ this.trigger( 'report-err', this, ev ); },\n\t 'click .visualization-btn' : function( ev ){ this.trigger( 'visualize', this, ev ); },\n\t 'click .dbkey a' : function( ev ){ this.trigger( 'edit', this, ev ); }\n\t }),\n\t\n\t\n\t /** listener for item undelete (in the messages section) */\n\t _clickUndeleteLink : function( ev ){\n\t this.model.undelete();\n\t return false;\n\t },\n\t\n\t /** listener for item purge (in the messages section) */\n\t _clickPurgeLink : function( ev ){\n\t//TODO: confirm dialog\n\t this.model.purge();\n\t return false;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** string rep */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDAEditView(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDatasetListItemEdit.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t failed_metadata : BASE_MVC.wrapTemplate([\n\t // in this override, provide a link to the edit page\n\t '<% if( dataset.state === \"failed_metadata\" ){ %>',\n\t '',\n\t '<% } %>'\n\t ], 'dataset' ),\n\t\n\t deleted : BASE_MVC.wrapTemplate([\n\t // in this override, provide links to undelete or purge the dataset\n\t '<% if( dataset.deleted && !dataset.purged ){ %>',\n\t // deleted not purged\n\t '
    ',\n\t _l( 'This dataset has been deleted' ),\n\t '
    ', _l( 'Undelete it' ), '',\n\t '<% if( view.purgeAllowed ){ %>',\n\t '
    ',\n\t _l( 'Permanently remove it from disk' ),\n\t '',\n\t '<% } %>',\n\t '
    ',\n\t '<% } %>'\n\t ], 'dataset' )\n\t });\n\t\n\t var visualizationsTemplate = BASE_MVC.wrapTemplate([\n\t '<% if( visualizations.length === 1 ){ %>',\n\t '\"',\n\t ' target=\"<%- visualizations[0].target %>\" title=\"', _l( 'Visualize in' ),\n\t ' <%- visualizations[0].html %>\">',\n\t '',\n\t '',\n\t\n\t '<% } else { %>',\n\t '
    ',\n\t '',\n\t '',\n\t '',\n\t '',\n\t '
    ',\n\t '<% } %>'\n\t ], 'visualizations' );\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t warnings : warnings,\n\t visualizations : visualizationsTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t DatasetListItemEdit : DatasetListItemEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 95 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(15),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( STATES, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'dataset';\n\t//==============================================================================\n\tvar searchableMixin = BASE_MVC.SearchableModelMixin;\n\t/** @class base model for any DatasetAssociation (HDAs, LDDAs, DatasetCollectionDAs).\n\t * No knowledge of what type (HDA/LDDA/DCDA) should be needed here.\n\t * The DA's are made searchable (by attribute) by mixing in SearchableModelMixin.\n\t */\n\tvar DatasetAssociation = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( BASE_MVC.mixin( searchableMixin, /** @lends DatasetAssociation.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t /** default attributes for a model */\n\t defaults : {\n\t state : STATES.NEW,\n\t deleted : false,\n\t purged : false,\n\t\n\t // unreliable attribute\n\t name : '(unnamed dataset)',\n\t\n\t//TODO: update to false when this is correctly passed from the API (when we have a security model for this)\n\t accessible : true,\n\t\n\t // sniffed datatype (sam, tabular, bed, etc.)\n\t data_type : '',\n\t file_ext : '',\n\t\n\t // size in bytes\n\t file_size : 0,\n\t\n\t // array of associated file types (eg. [ 'bam_index', ... ])\n\t meta_files : [],\n\t\n\t misc_blurb : '',\n\t misc_info : '',\n\t\n\t tags : []\n\t // do NOT default on annotation, as this default is valid and will be passed on 'save'\n\t // which is incorrect behavior when the model is only partially fetched (annos are not passed in summary data)\n\t //annotation : ''\n\t },\n\t\n\t /** instance vars and listeners */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(Dataset).initialize', attributes, options );\n\t\n\t //!! this state is not in trans.app.model.Dataset.states - set it here -\n\t if( !this.get( 'accessible' ) ){\n\t this.set( 'state', STATES.NOT_VIEWABLE );\n\t }\n\t\n\t /** Datasets rely/use some web controllers - have the model generate those URLs on startup */\n\t this.urls = this._generateUrls();\n\t\n\t this._setUpListeners();\n\t },\n\t\n\t /** returns misc. web urls for rendering things like re-run, display, etc. */\n\t _generateUrls : function(){\n\t//TODO: would be nice if the API did this\n\t var id = this.get( 'id' );\n\t if( !id ){ return {}; }\n\t var urls = {\n\t 'purge' : 'datasets/' + id + '/purge_async',\n\t 'display' : 'datasets/' + id + '/display/?preview=True',\n\t 'edit' : 'datasets/' + id + '/edit',\n\t 'download' : 'datasets/' + id + '/display?to_ext=' + this.get( 'file_ext' ),\n\t 'report_error' : 'dataset/errors?id=' + id,\n\t 'rerun' : 'tool_runner/rerun?id=' + id,\n\t 'show_params' : 'datasets/' + id + '/show_params',\n\t 'visualization' : 'visualization',\n\t 'meta_download' : 'dataset/get_metadata_file?hda_id=' + id + '&metadata_name='\n\t };\n\t//TODO: global\n\t _.each( urls, function( value, key ){\n\t urls[ key ] = Galaxy.root + value;\n\t });\n\t this.urls = urls;\n\t return urls;\n\t },\n\t\n\t /** set up any event listeners\n\t * event: state:ready fired when this DA moves into/is already in a ready state\n\t */\n\t _setUpListeners : function(){\n\t // if the state has changed and the new state is a ready state, fire an event\n\t this.on( 'change:state', function( currModel, newState ){\n\t this.log( this + ' has changed state:', currModel, newState );\n\t if( this.inReadyState() ){\n\t this.trigger( 'state:ready', currModel, newState, this.previous( 'state' ) );\n\t }\n\t });\n\t // the download url (currently) relies on having a correct file extension\n\t this.on( 'change:id change:file_ext', function( currModel ){\n\t this._generateUrls();\n\t });\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** override to add urls */\n\t toJSON : function(){\n\t var json = Backbone.Model.prototype.toJSON.call( this );\n\t //console.warn( 'returning json?' );\n\t //return json;\n\t return _.extend( json, {\n\t urls : this.urls\n\t });\n\t },\n\t\n\t /** Is this dataset deleted or purged? */\n\t isDeletedOrPurged : function(){\n\t return ( this.get( 'deleted' ) || this.get( 'purged' ) );\n\t },\n\t\n\t /** Is this dataset in a 'ready' state; where 'Ready' states are states where no\n\t * processing (for the ds) is left to do on the server.\n\t */\n\t inReadyState : function(){\n\t var ready = _.contains( STATES.READY_STATES, this.get( 'state' ) );\n\t return ( this.isDeletedOrPurged() || ready );\n\t },\n\t\n\t /** Does this model already contain detailed data (as opposed to just summary level data)? */\n\t hasDetails : function(){\n\t //?? this may not be reliable\n\t return _.has( this.attributes, 'genome_build' );\n\t },\n\t\n\t /** Convenience function to match dataset.has_data. */\n\t hasData : function(){\n\t return ( this.get( 'file_size' ) > 0 );\n\t },\n\t\n\t // ........................................................................ ajax\n\t fetch : function( options ){\n\t var dataset = this;\n\t return Backbone.Model.prototype.fetch.call( this, options )\n\t .always( function(){\n\t dataset._generateUrls();\n\t });\n\t },\n\t\n\t //NOTE: subclasses of DA's will need to implement url and urlRoot in order to have these work properly\n\t /** save this dataset, _Mark_ing it as deleted (just a flag) */\n\t 'delete' : function( options ){\n\t if( this.get( 'deleted' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: true }, options );\n\t },\n\t /** save this dataset, _Mark_ing it as undeleted */\n\t undelete : function( options ){\n\t if( !this.get( 'deleted' ) || this.get( 'purged' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: false }, options );\n\t },\n\t\n\t /** remove the file behind this dataset from the filesystem (if permitted) */\n\t purge : function _purge( options ){\n\t//TODO: use, override model.destroy, HDA.delete({ purge: true })\n\t if( this.get( 'purged' ) ){ return jQuery.when(); }\n\t options = options || {};\n\t //var hda = this,\n\t // //xhr = jQuery.ajax( this.url() + '?' + jQuery.param({ purge: true }), _.extend({\n\t // xhr = jQuery.ajax( this.url(), _.extend({\n\t // type : 'DELETE',\n\t // data : {\n\t // purge : true\n\t // }\n\t // }, options ));\n\t //\n\t //xhr.done( function( response ){\n\t // hda.debug( 'response', response );\n\t // //hda.set({ deleted: true, purged: true });\n\t // hda.set( response );\n\t //});\n\t //return xhr;\n\t\n\t options.url = this.urls.purge;\n\t\n\t //TODO: ideally this would be a DELETE call to the api\n\t // using purge async for now\n\t var hda = this,\n\t xhr = jQuery.ajax( options );\n\t xhr.done( function( message, status, responseObj ){\n\t hda.set({ deleted: true, purged: true });\n\t });\n\t xhr.fail( function( xhr, status, message ){\n\t // Exception messages are hidden within error page including: '...not allowed in this Galaxy instance.'\n\t // unbury and re-add to xhr\n\t var error = _l( \"Unable to purge dataset\" );\n\t var messageBuriedInUnfortunatelyFormattedError = ( 'Removal of datasets by users '\n\t + 'is not allowed in this Galaxy instance' );\n\t if( xhr.responseJSON && xhr.responseJSON.error ){\n\t error = xhr.responseJSON.error;\n\t } else if( xhr.responseText.indexOf( messageBuriedInUnfortunatelyFormattedError ) !== -1 ){\n\t error = messageBuriedInUnfortunatelyFormattedError;\n\t }\n\t xhr.responseText = error;\n\t hda.trigger( 'error', hda, xhr, options, _l( error ), { error: error } );\n\t });\n\t return xhr;\n\t },\n\t\n\t // ........................................................................ searching\n\t // see base-mvc, SearchableModelMixin\n\t\n\t /** what attributes of an HDA will be used in a text search */\n\t searchAttributes : [\n\t 'name', 'file_ext', 'genome_build', 'misc_blurb', 'misc_info', 'annotation', 'tags'\n\t ],\n\t\n\t /** our attr keys don't often match the labels we display to the user - so, when using\n\t * attribute specifiers ('name=\"bler\"') in a term, allow passing in aliases for the\n\t * following attr keys.\n\t */\n\t searchAliases : {\n\t title : 'name',\n\t format : 'file_ext',\n\t database : 'genome_build',\n\t blurb : 'misc_blurb',\n\t description : 'misc_blurb',\n\t info : 'misc_info',\n\t tag : 'tags'\n\t },\n\t\n\t // ........................................................................ misc\n\t /** String representation */\n\t toString : function(){\n\t var nameAndId = this.get( 'id' ) || '';\n\t if( this.get( 'name' ) ){\n\t nameAndId = '\"' + this.get( 'name' ) + '\",' + nameAndId;\n\t }\n\t return 'Dataset(' + nameAndId + ')';\n\t }\n\t}));\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone collection for dataset associations.\n\t */\n\tvar DatasetAssociationCollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(\n\t/** @lends HistoryContents.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t model : DatasetAssociation,\n\t\n\t /** root api url */\n\t urlRoot : Galaxy.root + 'api/datasets',\n\t\n\t /** url fn */\n\t url : function(){\n\t return this.urlRoot;\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** Get the ids of every item in this collection\n\t * @returns array of encoded ids\n\t */\n\t ids : function(){\n\t return this.map( function( item ){ return item.get('id'); });\n\t },\n\t\n\t /** Get contents that are not ready\n\t * @returns array of content models\n\t */\n\t notReady : function(){\n\t return this.filter( function( content ){\n\t return !content.inReadyState();\n\t });\n\t },\n\t\n\t /** return true if any datasets don't have details */\n\t haveDetails : function(){\n\t return this.all( function( dataset ){ return dataset.hasDetails(); });\n\t },\n\t\n\t // ........................................................................ ajax\n\t /** using a queue, perform ajaxFn on each of the models in this collection */\n\t ajaxQueue : function( ajaxFn, options ){\n\t var deferred = jQuery.Deferred(),\n\t startingLength = this.length,\n\t responses = [];\n\t\n\t if( !startingLength ){\n\t deferred.resolve([]);\n\t return deferred;\n\t }\n\t\n\t // use reverse order (stylistic choice)\n\t var ajaxFns = this.chain().reverse().map( function( dataset, i ){\n\t return function(){\n\t var xhr = ajaxFn.call( dataset, options );\n\t // if successful, notify using the deferred to allow tracking progress\n\t xhr.done( function( response ){\n\t deferred.notify({ curr: i, total: startingLength, response: response, model: dataset });\n\t });\n\t // (regardless of previous error or success) if not last ajax call, shift and call the next\n\t // if last fn, resolve deferred\n\t xhr.always( function( response ){\n\t responses.push( response );\n\t if( ajaxFns.length ){\n\t ajaxFns.shift()();\n\t } else {\n\t deferred.resolve( responses );\n\t }\n\t });\n\t };\n\t }).value();\n\t // start the queue\n\t ajaxFns.shift()();\n\t\n\t return deferred;\n\t },\n\t\n\t // ........................................................................ sorting/filtering\n\t /** return a new collection of datasets whose attributes contain the substring matchesWhat */\n\t matches : function( matchesWhat ){\n\t return this.filter( function( dataset ){\n\t return dataset.matches( matchesWhat );\n\t });\n\t },\n\t\n\t // ........................................................................ misc\n\t ///** Convert this ad-hoc collection of hdas to a formal collection tracked\n\t // by the server.\n\t //**/\n\t //promoteToHistoryDatasetCollection : function _promote( history, collection_type, options ){\n\t //},\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'DatasetAssociationCollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t DatasetAssociation : DatasetAssociation,\n\t DatasetAssociationCollection : DatasetAssociationCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 96 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(37),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DATASET_LI, BASE_MVC, _l ){\n\t/* global Backbone */\n\t//==============================================================================\n\tvar _super = DATASET_LI.DatasetListItemView;\n\t/** @class Read only view for HistoryDatasetAssociation.\n\t * Since there are no controls on the HDAView to hide the dataset,\n\t * the primary thing this class does (currently) is override templates\n\t * to render the HID.\n\t */\n\tvar HDAListItemView = _super.extend(\n\t/** @lends HDAListItemView.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : _super.prototype.className + \" history-content\",\n\t\n\t initialize : function( attributes, options ){\n\t _super.prototype.initialize.call( this, attributes, options );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDAListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tHDAListItemView.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t // adding the hid display to the title\n\t '
    ',\n\t '',\n\t '
    ',\n\t //TODO: remove whitespace and use margin-right\n\t '<%- dataset.hid %> ',\n\t '<%- dataset.name %>',\n\t '
    ',\n\t '
    '\n\t ], 'dataset' );\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t hidden : BASE_MVC.wrapTemplate([\n\t // add a warning when hidden\n\t '<% if( !dataset.visible ){ %>',\n\t '
    ',\n\t _l( 'This dataset has been hidden' ),\n\t '
    ',\n\t '<% } %>'\n\t ], 'dataset' )\n\t });\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t titleBar : titleBarTemplate,\n\t warnings : warnings\n\t });\n\t}());\n\t\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HDAListItemView : HDAListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 97 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(95),\n\t __webpack_require__(46),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DATASET, HISTORY_CONTENT, BASE_MVC, _l ){\n\t//==============================================================================\n\tvar _super = DATASET.DatasetAssociation,\n\t hcontentMixin = HISTORY_CONTENT.HistoryContentMixin;\n\t/** @class (HDA) model for a Galaxy dataset contained in and related to a history.\n\t */\n\tvar HistoryDatasetAssociation = _super.extend( BASE_MVC.mixin( hcontentMixin,\n\t/** @lends HistoryDatasetAssociation.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n\t // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n\t // - re-apply manually it now\n\t /** call the mixin constructor */\n\t constructor : function( attrs, options ){\n\t hcontentMixin.constructor.call( this, attrs, options );\n\t },\n\t\n\t /** default attributes for a model */\n\t defaults : _.extend( {}, _super.prototype.defaults, hcontentMixin.defaults, {\n\t model_class : 'HistoryDatasetAssociation'\n\t }),\n\t\n\t /** Set up the model, determine if accessible, bind listeners\n\t */\n\t initialize : function( attributes, options ){\n\t _super.prototype.initialize.call( this, attributes, options );\n\t hcontentMixin.initialize.call( this, attributes, options );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** String representation */\n\t toString : function(){\n\t var nameAndId = this.get( 'id' ) || '';\n\t if( this.get( 'name' ) ){\n\t nameAndId = this.get( 'hid' ) + ' :\"' + this.get( 'name' ) + '\",' + nameAndId;\n\t }\n\t return 'HDA(' + nameAndId + ')';\n\t }\n\t}));\n\t\n\t//==============================================================================\n\t return {\n\t HistoryDatasetAssociation : HistoryDatasetAssociation\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 98 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(15),\n\t __webpack_require__(34),\n\t __webpack_require__(93),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( STATES, DC_LI, DC_VIEW, BASE_MVC, _l ){\n\t/* global Backbone */\n\t//==============================================================================\n\tvar _super = DC_LI.DCListItemView;\n\t/** @class Read only view for HistoryDatasetCollectionAssociation (a dataset collection inside a history).\n\t */\n\tvar HDCAListItemView = _super.extend(\n\t/** @lends HDCAListItemView.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : _super.prototype.className + \" history-content\",\n\t\n\t /** event listeners */\n\t _setUpListeners : function(){\n\t _super.prototype._setUpListeners.call( this );\n\t\n\t this.model.on({\n\t 'change:populated change:visible' : function( model, options ){ this.render(); },\n\t }, this );\n\t },\n\t\n\t /** Override to provide the proper collections panels as the foldout */\n\t _getFoldoutPanelClass : function(){\n\t switch( this.model.get( 'collection_type' ) ){\n\t case 'list':\n\t return DC_VIEW.ListCollectionView;\n\t case 'paired':\n\t return DC_VIEW.PairCollectionView;\n\t case 'list:paired':\n\t return DC_VIEW.ListOfPairsCollectionView;\n\t }\n\t throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );\n\t },\n\t\n\t /** In this override, add the state as a class for use with state-based CSS */\n\t _swapNewRender : function( $newRender ){\n\t _super.prototype._swapNewRender.call( this, $newRender );\n\t//TODO: model currently has no state\n\t var state = !this.model.get( 'populated' ) ? STATES.RUNNING : STATES.OK;\n\t //if( this.model.has( 'state' ) ){\n\t this.$el.addClass( 'state-' + state );\n\t //}\n\t return this.$el;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDCAListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t/** underscore templates */\n\tHDCAListItemView.prototype.templates = (function(){\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t hidden : BASE_MVC.wrapTemplate([\n\t // add a warning when hidden\n\t '<% if( !collection.visible ){ %>',\n\t '
    ',\n\t _l( 'This collection has been hidden' ),\n\t '
    ',\n\t '<% } %>'\n\t ], 'collection' )\n\t });\n\t\n\t// could steal this from hda-base (or use mixed content)\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t // adding the hid display to the title\n\t '
    ',\n\t '',\n\t '
    ',\n\t //TODO: remove whitespace and use margin-right\n\t '<%- collection.hid %> ',\n\t '<%- collection.name %>',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ], 'collection' );\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t warnings : warnings,\n\t titleBar : titleBarTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HDCAListItemView : HDCAListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 99 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, jQuery, _) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(47),\n\t __webpack_require__(4),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HISTORY_CONTENTS, UTILS, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'history';\n\t//==============================================================================\n\t/** @class Model for a Galaxy history resource - both a record of user\n\t * tool use and a collection of the datasets those tools produced.\n\t * @name History\n\t * @augments Backbone.Model\n\t */\n\tvar History = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( BASE_MVC.mixin( BASE_MVC.SearchableModelMixin, /** @lends History.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t // values from api (may need more)\n\t defaults : {\n\t model_class : 'History',\n\t id : null,\n\t name : 'Unnamed History',\n\t state : 'new',\n\t\n\t deleted : false\n\t },\n\t\n\t // ........................................................................ urls\n\t urlRoot: Galaxy.root + 'api/histories',\n\t\n\t // ........................................................................ set up/tear down\n\t /** Set up the model\n\t * @param {Object} historyJSON model data for this History\n\t * @param {Object[]} contentsJSON array of model data for this History's contents (hdas or collections)\n\t * @param {Object} options any extra settings including logger\n\t */\n\t initialize : function( historyJSON, contentsJSON, options ){\n\t options = options || {};\n\t this.logger = options.logger || null;\n\t this.log( this + \".initialize:\", historyJSON, contentsJSON, options );\n\t\n\t /** HistoryContents collection of the HDAs contained in this history. */\n\t this.log( 'creating history contents:', contentsJSON );\n\t this.contents = new HISTORY_CONTENTS.HistoryContents( contentsJSON || [], { historyId: this.get( 'id' )});\n\t //// if we've got hdas passed in the constructor, load them\n\t //if( contentsJSON && _.isArray( contentsJSON ) ){\n\t // this.log( 'resetting history contents:', contentsJSON );\n\t // this.contents.reset( contentsJSON );\n\t //}\n\t\n\t this._setUpListeners();\n\t\n\t /** cached timeout id for the dataset updater */\n\t this.updateTimeoutId = null;\n\t // set up update timeout if needed\n\t //this.checkForUpdates();\n\t },\n\t\n\t /** set up any event listeners for this history including those to the contained HDAs\n\t * events: error:contents if an error occurred with the contents collection\n\t */\n\t _setUpListeners : function(){\n\t this.on( 'error', function( model, xhr, options, msg, details ){\n\t this.errorHandler( model, xhr, options, msg, details );\n\t });\n\t\n\t // hda collection listening\n\t if( this.contents ){\n\t this.listenTo( this.contents, 'error', function(){\n\t this.trigger.apply( this, [ 'error:contents' ].concat( jQuery.makeArray( arguments ) ) );\n\t });\n\t }\n\t // if the model's id changes ('current' or null -> an actual id), update the contents history_id\n\t this.on( 'change:id', function( model, newId ){\n\t if( this.contents ){\n\t this.contents.historyId = newId;\n\t }\n\t }, this );\n\t },\n\t\n\t //TODO: see base-mvc\n\t //onFree : function(){\n\t // if( this.contents ){\n\t // this.contents.free();\n\t // }\n\t //},\n\t\n\t /** event listener for errors. Generally errors are handled outside this model */\n\t errorHandler : function( model, xhr, options, msg, details ){\n\t // clear update timeout on model err\n\t this.clearUpdateTimeout();\n\t },\n\t\n\t /** convert size in bytes to a more human readable version */\n\t nice_size : function(){\n\t return UTILS.bytesToString( this.get( 'size' ), true, 2 );\n\t },\n\t\n\t /** override to add nice_size */\n\t toJSON : function(){\n\t return _.extend( Backbone.Model.prototype.toJSON.call( this ), {\n\t nice_size : this.nice_size()\n\t });\n\t },\n\t\n\t /** override to allow getting nice_size */\n\t get : function( key ){\n\t if( key === 'nice_size' ){\n\t return this.nice_size();\n\t }\n\t return Backbone.Model.prototype.get.apply( this, arguments );\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** T/F is this history owned by the current user (Galaxy.user)\n\t * Note: that this will return false for an anon user even if the history is theirs.\n\t */\n\t ownedByCurrUser : function(){\n\t // no currUser\n\t if( !Galaxy || !Galaxy.user ){\n\t return false;\n\t }\n\t // user is anon or history isn't owned\n\t if( Galaxy.user.isAnonymous() || Galaxy.user.id !== this.get( 'user_id' ) ){\n\t return false;\n\t }\n\t return true;\n\t },\n\t\n\t /** */\n\t contentsCount : function(){\n\t return _.reduce( _.values( this.get( 'state_details' ) ), function( memo, num ){ return memo + num; }, 0 );\n\t },\n\t\n\t // ........................................................................ search\n\t /** What model fields to search with */\n\t searchAttributes : [\n\t 'name', 'annotation', 'tags'\n\t ],\n\t\n\t /** Adding title and singular tag */\n\t searchAliases : {\n\t title : 'name',\n\t tag : 'tags'\n\t },\n\t\n\t // ........................................................................ updates\n\t /** does the contents collection indicate they're still running and need to be updated later?\n\t * delay + update if needed\n\t * @param {Function} onReadyCallback function to run when all contents are in the ready state\n\t * events: ready\n\t */\n\t checkForUpdates : function( onReadyCallback ){\n\t //this.info( 'checkForUpdates' )\n\t\n\t // get overall History state from collection, run updater if History has running/queued contents\n\t // boiling it down on the client to running/not\n\t if( this.contents.running().length ){\n\t this.setUpdateTimeout();\n\t\n\t } else {\n\t this.trigger( 'ready' );\n\t if( _.isFunction( onReadyCallback ) ){\n\t onReadyCallback.call( this );\n\t }\n\t }\n\t return this;\n\t },\n\t\n\t /** create a timeout (after UPDATE_DELAY or delay ms) to refetch the contents. Clear any prev. timeout */\n\t setUpdateTimeout : function( delay ){\n\t delay = delay || History.UPDATE_DELAY;\n\t var history = this;\n\t\n\t // prevent buildup of updater timeouts by clearing previous if any, then set new and cache id\n\t this.clearUpdateTimeout();\n\t this.updateTimeoutId = setTimeout( function(){\n\t history.refresh();\n\t }, delay );\n\t return this.updateTimeoutId;\n\t },\n\t\n\t /** clear the timeout and the cached timeout id */\n\t clearUpdateTimeout : function(){\n\t if( this.updateTimeoutId ){\n\t clearTimeout( this.updateTimeoutId );\n\t this.updateTimeoutId = null;\n\t }\n\t },\n\t\n\t /* update the contents, getting full detailed model data for any whose id is in detailIds\n\t * set up to run this again in some interval of time\n\t * @param {String[]} detailIds list of content ids to get detailed model data for\n\t * @param {Object} options std. backbone fetch options map\n\t */\n\t refresh : function( detailIds, options ){\n\t //this.info( 'refresh:', detailIds, this.contents );\n\t detailIds = detailIds || [];\n\t options = options || {};\n\t var history = this;\n\t\n\t // add detailIds to options as CSV string\n\t options.data = options.data || {};\n\t if( detailIds.length ){\n\t options.data.details = detailIds.join( ',' );\n\t }\n\t var xhr = this.contents.fetch( options );\n\t xhr.done( function( models ){\n\t history.checkForUpdates( function(){\n\t // fetch the history inside onReadyCallback in order to recalc history size\n\t this.fetch();\n\t });\n\t });\n\t return xhr;\n\t },\n\t\n\t // ........................................................................ ajax\n\t /** save this history, _Mark_ing it as deleted (just a flag) */\n\t _delete : function( options ){\n\t if( this.get( 'deleted' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: true }, options );\n\t },\n\t /** purge this history, _Mark_ing it as purged and removing all dataset data from the server */\n\t purge : function( options ){\n\t if( this.get( 'purged' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: true, purged: true }, options );\n\t },\n\t /** save this history, _Mark_ing it as undeleted */\n\t undelete : function( options ){\n\t if( !this.get( 'deleted' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: false }, options );\n\t },\n\t\n\t /** Make a copy of this history on the server\n\t * @param {Boolean} current if true, set the copy as the new current history (default: true)\n\t * @param {String} name name of new history (default: none - server sets to: Copy of )\n\t * @fires copied passed this history and the response JSON from the copy\n\t * @returns {xhr}\n\t */\n\t copy : function( current, name, allDatasets ){\n\t current = ( current !== undefined )?( current ):( true );\n\t if( !this.id ){\n\t throw new Error( 'You must set the history ID before copying it.' );\n\t }\n\t\n\t var postData = { history_id : this.id };\n\t if( current ){\n\t postData.current = true;\n\t }\n\t if( name ){\n\t postData.name = name;\n\t }\n\t if( !allDatasets ){\n\t postData.all_datasets = false;\n\t }\n\t\n\t var history = this,\n\t copy = jQuery.post( this.urlRoot, postData );\n\t // if current - queue to setAsCurrent before firing 'copied'\n\t if( current ){\n\t return copy.then( function( response ){\n\t var newHistory = new History( response );\n\t return newHistory.setAsCurrent()\n\t .done( function(){\n\t history.trigger( 'copied', history, response );\n\t });\n\t });\n\t }\n\t return copy.done( function( response ){\n\t history.trigger( 'copied', history, response );\n\t });\n\t },\n\t\n\t setAsCurrent : function(){\n\t var history = this,\n\t xhr = jQuery.getJSON( Galaxy.root + 'history/set_as_current?id=' + this.id );\n\t\n\t xhr.done( function(){\n\t history.trigger( 'set-as-current', history );\n\t });\n\t return xhr;\n\t },\n\t\n\t // ........................................................................ misc\n\t toString : function(){\n\t return 'History(' + this.get( 'id' ) + ',' + this.get( 'name' ) + ')';\n\t }\n\t}));\n\t\n\t//------------------------------------------------------------------------------ CLASS VARS\n\t/** When the history has running hdas,\n\t * this is the amount of time between update checks from the server\n\t */\n\tHistory.UPDATE_DELAY = 4000;\n\t\n\t/** Get data for a history then its hdas using a sequential ajax call, return a deferred to receive both */\n\tHistory.getHistoryData = function getHistoryData( historyId, options ){\n\t options = options || {};\n\t var detailIdsFn = options.detailIdsFn || [];\n\t var hdcaDetailIds = options.hdcaDetailIds || [];\n\t //console.debug( 'getHistoryData:', historyId, options );\n\t\n\t var df = jQuery.Deferred(),\n\t historyJSON = null;\n\t\n\t function getHistory( id ){\n\t // get the history data\n\t if( historyId === 'current' ){\n\t return jQuery.getJSON( Galaxy.root + 'history/current_history_json' );\n\t }\n\t return jQuery.ajax( Galaxy.root + 'api/histories/' + historyId );\n\t }\n\t function isEmpty( historyData ){\n\t // get the number of hdas accrd. to the history\n\t return historyData && historyData.empty;\n\t }\n\t function getContents( historyData ){\n\t // get the hda data\n\t // if no hdas accrd. to history: return empty immed.\n\t if( isEmpty( historyData ) ){ return []; }\n\t // if there are hdas accrd. to history: get those as well\n\t if( _.isFunction( detailIdsFn ) ){\n\t detailIdsFn = detailIdsFn( historyData );\n\t }\n\t if( _.isFunction( hdcaDetailIds ) ){\n\t hdcaDetailIds = hdcaDetailIds( historyData );\n\t }\n\t var data = {};\n\t if( detailIdsFn.length ) {\n\t data.dataset_details = detailIdsFn.join( ',' );\n\t }\n\t if( hdcaDetailIds.length ) {\n\t // for symmetry, not actually used by backend of consumed\n\t // by frontend.\n\t data.dataset_collection_details = hdcaDetailIds.join( ',' );\n\t }\n\t return jQuery.ajax( Galaxy.root + 'api/histories/' + historyData.id + '/contents', { data: data });\n\t }\n\t\n\t // getting these concurrently is 400% slower (sqlite, local, vanilla) - so:\n\t // chain the api calls - getting history first then contents\n\t\n\t var historyFn = options.historyFn || getHistory,\n\t contentsFn = options.contentsFn || getContents;\n\t\n\t // chain ajax calls: get history first, then hdas\n\t var historyXHR = historyFn( historyId );\n\t historyXHR.done( function( json ){\n\t // set outer scope var here for use below\n\t historyJSON = json;\n\t df.notify({ status: 'history data retrieved', historyJSON: historyJSON });\n\t });\n\t historyXHR.fail( function( xhr, status, message ){\n\t // call reject on the outer deferred to allow its fail callback to run\n\t df.reject( xhr, 'loading the history' );\n\t });\n\t\n\t var contentsXHR = historyXHR.then( contentsFn );\n\t contentsXHR.then( function( contentsJSON ){\n\t df.notify({ status: 'contents data retrieved', historyJSON: historyJSON, contentsJSON: contentsJSON });\n\t // we've got both: resolve the outer scope deferred\n\t df.resolve( historyJSON, contentsJSON );\n\t });\n\t contentsXHR.fail( function( xhr, status, message ){\n\t // call reject on the outer deferred to allow its fail callback to run\n\t df.reject( xhr, 'loading the contents', { history: historyJSON } );\n\t });\n\t\n\t return df;\n\t};\n\t\n\t\n\t//==============================================================================\n\tvar ControlledFetchMixin = {\n\t\n\t /** Override to convert certain options keys into API index parameters */\n\t fetch : function( options ){\n\t options = options || {};\n\t options.data = options.data || this._buildFetchData( options );\n\t // use repeated params for arrays, e.g. q=1&qv=1&q=2&qv=2\n\t options.traditional = true;\n\t return Backbone.Collection.prototype.fetch.call( this, options );\n\t },\n\t\n\t /** These attribute keys are valid params to fetch/API-index */\n\t _fetchOptions : [\n\t /** model dependent string to control the order of models returned */\n\t 'order',\n\t /** limit the number of models returned from a fetch */\n\t 'limit',\n\t /** skip this number of models when fetching */\n\t 'offset',\n\t /** what series of attributes to return (model dependent) */\n\t 'view',\n\t /** individual keys to return for the models (see api/histories.index) */\n\t 'keys'\n\t ],\n\t\n\t /** Build the data dictionary to send to fetch's XHR as data */\n\t _buildFetchData : function( options ){\n\t var data = {},\n\t fetchDefaults = this._fetchDefaults();\n\t options = _.defaults( options || {}, fetchDefaults );\n\t data = _.pick( options, this._fetchOptions );\n\t\n\t var filters = _.has( options, 'filters' )? options.filters : ( fetchDefaults.filters || {} );\n\t if( !_.isEmpty( filters ) ){\n\t _.extend( data, this._buildFetchFilters( filters ) );\n\t }\n\t return data;\n\t },\n\t\n\t /** Override to have defaults for fetch options and filters */\n\t _fetchDefaults : function(){\n\t // to be overridden\n\t return {};\n\t },\n\t\n\t /** Convert dictionary filters to qqv style arrays */\n\t _buildFetchFilters : function( filters ){\n\t var filterMap = {\n\t q : [],\n\t qv : []\n\t };\n\t _.each( filters, function( v, k ){\n\t if( v === true ){ v = 'True'; }\n\t if( v === false ){ v = 'False'; }\n\t filterMap.q.push( k );\n\t filterMap.qv.push( v );\n\t });\n\t return filterMap;\n\t },\n\t};\n\t\n\t//==============================================================================\n\t/** @class A collection of histories (per user).\n\t * (stub) currently unused.\n\t */\n\tvar HistoryCollection = Backbone.Collection\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( ControlledFetchMixin )\n\t .extend(/** @lends HistoryCollection.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t model : History,\n\t\n\t /** @type {String} the default sortOrders key for sorting */\n\t DEFAULT_ORDER : 'update_time',\n\t\n\t /** @type {Object} map of collection sorting orders generally containing a getter to return the attribute\n\t * sorted by and asc T/F if it is an ascending sort.\n\t */\n\t sortOrders : {\n\t 'update_time' : {\n\t getter : function( h ){ return new Date( h.get( 'update_time' ) ); },\n\t asc : false\n\t },\n\t 'update_time-asc' : {\n\t getter : function( h ){ return new Date( h.get( 'update_time' ) ); },\n\t asc : true\n\t },\n\t 'name' : {\n\t getter : function( h ){ return h.get( 'name' ); },\n\t asc : true\n\t },\n\t 'name-dsc' : {\n\t getter : function( h ){ return h.get( 'name' ); },\n\t asc : false\n\t },\n\t 'size' : {\n\t getter : function( h ){ return h.get( 'size' ); },\n\t asc : false\n\t },\n\t 'size-asc' : {\n\t getter : function( h ){ return h.get( 'size' ); },\n\t asc : true\n\t }\n\t },\n\t\n\t initialize : function( models, options ){\n\t options = options || {};\n\t this.log( 'HistoryCollection.initialize', arguments );\n\t\n\t // instance vars\n\t /** @type {boolean} should deleted histories be included */\n\t this.includeDeleted = options.includeDeleted || false;\n\t // set the sort order\n\t this.setOrder( options.order || this.DEFAULT_ORDER );\n\t /** @type {String} encoded id of the history that's current */\n\t this.currentHistoryId = options.currentHistoryId;\n\t /** @type {boolean} have all histories been fetched and in the collection? */\n\t this.allFetched = options.allFetched || false;\n\t\n\t // this.on( 'all', function(){\n\t // console.info( 'event:', arguments );\n\t // });\n\t this.setUpListeners();\n\t },\n\t\n\t urlRoot : Galaxy.root + 'api/histories',\n\t url : function(){ return this.urlRoot; },\n\t\n\t /** returns map of default filters and settings for fetching from the API */\n\t _fetchDefaults : function(){\n\t // to be overridden\n\t var defaults = {\n\t order : this.order,\n\t view : 'detailed'\n\t };\n\t if( !this.includeDeleted ){\n\t defaults.filters = {\n\t deleted : false,\n\t purged : false,\n\t };\n\t }\n\t return defaults;\n\t },\n\t\n\t /** set up reflexive event handlers */\n\t setUpListeners : function setUpListeners(){\n\t this.on({\n\t // when a history is deleted, remove it from the collection (if optionally set to do so)\n\t 'change:deleted' : function( history ){\n\t // TODO: this becomes complicated when more filters are used\n\t this.debug( 'change:deleted', this.includeDeleted, history.get( 'deleted' ) );\n\t if( !this.includeDeleted && history.get( 'deleted' ) ){\n\t this.remove( history );\n\t }\n\t },\n\t // listen for a history copy, setting it to current\n\t 'copied' : function( original, newData ){\n\t this.setCurrent( new History( newData, [] ) );\n\t },\n\t // when a history is made current, track the id in the collection\n\t 'set-as-current' : function( history ){\n\t var oldCurrentId = this.currentHistoryId;\n\t this.trigger( 'no-longer-current', oldCurrentId );\n\t this.currentHistoryId = history.id;\n\t }\n\t }, this );\n\t },\n\t\n\t /** override to allow passing options.order and setting the sort order to one of sortOrders */\n\t sort : function( options ){\n\t options = options || {};\n\t this.setOrder( options.order );\n\t return Backbone.Collection.prototype.sort.call( this, options );\n\t },\n\t\n\t /** build the comparator used to sort this collection using the sortOrder map and the given order key\n\t * @event 'changed-order' passed the new order and the collection\n\t */\n\t setOrder : function( order ){\n\t var collection = this,\n\t sortOrder = this.sortOrders[ order ];\n\t if( _.isUndefined( sortOrder ) ){ return; }\n\t\n\t collection.order = order;\n\t collection.comparator = function comparator( a, b ){\n\t var currentHistoryId = collection.currentHistoryId;\n\t // current always first\n\t if( a.id === currentHistoryId ){ return -1; }\n\t if( b.id === currentHistoryId ){ return 1; }\n\t // then compare by an attribute\n\t a = sortOrder.getter( a );\n\t b = sortOrder.getter( b );\n\t return sortOrder.asc?\n\t ( ( a === b )?( 0 ):( a > b ? 1 : -1 ) ):\n\t ( ( a === b )?( 0 ):( a > b ? -1 : 1 ) );\n\t };\n\t collection.trigger( 'changed-order', collection.order, collection );\n\t return collection;\n\t },\n\t\n\t /** override to provide order and offsets based on instance vars, set limit if passed,\n\t * and set allFetched/fire 'all-fetched' when xhr returns\n\t */\n\t fetch : function( options ){\n\t options = options || {};\n\t if( this.allFetched ){ return jQuery.when({}); }\n\t var collection = this,\n\t fetchOptions = _.defaults( options, {\n\t remove : false,\n\t offset : collection.length >= 1? ( collection.length - 1 ) : 0,\n\t order : collection.order\n\t }),\n\t limit = options.limit;\n\t if( !_.isUndefined( limit ) ){\n\t fetchOptions.limit = limit;\n\t }\n\t\n\t return ControlledFetchMixin.fetch.call( this, fetchOptions )\n\t .done( function _postFetchMore( fetchData ){\n\t var numFetched = _.isArray( fetchData )? fetchData.length : 0;\n\t // anything less than a full page means we got all there is to get\n\t if( !limit || numFetched < limit ){\n\t collection.allFetched = true;\n\t collection.trigger( 'all-fetched', collection );\n\t }\n\t }\n\t );\n\t },\n\t\n\t /** create a new history and by default set it to be the current history */\n\t create : function create( data, hdas, historyOptions, xhrOptions ){\n\t //TODO: .create is actually a collection function that's overridden here\n\t var collection = this,\n\t xhr = jQuery.getJSON( Galaxy.root + 'history/create_new_current' );\n\t return xhr.done( function( newData ){\n\t collection.setCurrent( new History( newData, [], historyOptions || {} ) );\n\t });\n\t },\n\t\n\t /** set the current history to the given history, placing it first in the collection.\n\t * Pass standard bbone options for use in unshift.\n\t * @triggers new-current passed history and this collection\n\t */\n\t setCurrent : function( history, options ){\n\t options = options || {};\n\t // new histories go in the front\n\t this.unshift( history, options );\n\t this.currentHistoryId = history.get( 'id' );\n\t if( !options.silent ){\n\t this.trigger( 'new-current', history, this );\n\t }\n\t return this;\n\t },\n\t\n\t /** override to reset allFetched flag to false */\n\t reset : function( models, options ){\n\t this.allFetched = false;\n\t return Backbone.Collection.prototype.reset.call( this, models, options );\n\t },\n\t\n\t toString: function toString(){\n\t return 'HistoryCollection(' + this.length + ')';\n\t }\n\t});\n\t\n\t//==============================================================================\n\treturn {\n\t History : History,\n\t HistoryCollection : HistoryCollection\n\t};}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 100 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(48),\n\t __webpack_require__(143),\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(108)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_ITEM, LoadingIndicator, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'list';\n\t/* ============================================================================\n\tTODO:\n\t\n\t============================================================================ */\n\t/** @class View for a list/collection of models and the sub-views of those models.\n\t * Sub-views must (at least have the interface if not) inherit from ListItemView.\n\t * (For a list panel that also includes some 'container' model (History->HistoryContents)\n\t * use ModelWithListPanel)\n\t *\n\t * Allows for:\n\t * searching collection/sub-views\n\t * selecting/multi-selecting sub-views\n\t *\n\t * Currently used:\n\t * for dataset/dataset-choice\n\t * as superclass of ModelListPanel\n\t */\n\tvar ListPanel = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend(/** @lends ListPanel.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t /** class to use for constructing the sub-views */\n\t viewClass : LIST_ITEM.ListItemView,\n\t /** class to used for constructing collection of sub-view models */\n\t collectionClass : Backbone.Collection,\n\t\n\t tagName : 'div',\n\t className : 'list-panel',\n\t\n\t /** (in ms) that jquery effects will use */\n\t fxSpeed : 'fast',\n\t\n\t /** string to display when the collection has no contents */\n\t emptyMsg : _l( 'This list is empty' ),\n\t /** displayed when no items match the search terms */\n\t noneFoundMsg : _l( 'No matching items found' ),\n\t /** string used for search placeholder */\n\t searchPlaceholder : _l( 'search' ),\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events\n\t * @param {Object} attributes optional settings for the list\n\t */\n\t initialize : function( attributes, options ){\n\t attributes = attributes || {};\n\t // set the logger if requested\n\t if( attributes.logger ){\n\t this.logger = attributes.logger;\n\t }\n\t this.log( this + '.initialize:', attributes );\n\t\n\t // ---- instance vars\n\t /** how quickly should jquery fx run? */\n\t this.fxSpeed = _.has( attributes, 'fxSpeed' )?( attributes.fxSpeed ):( this.fxSpeed );\n\t\n\t /** filters for displaying subviews */\n\t this.filters = [];\n\t /** current search terms */\n\t this.searchFor = attributes.searchFor || '';\n\t\n\t /** loading indicator */\n\t this.indicator = new LoadingIndicator( this.$el );\n\t\n\t /** currently showing selectors on items? */\n\t this.selecting = ( attributes.selecting !== undefined )? attributes.selecting : true;\n\t //this.selecting = false;\n\t\n\t /** cached selected item.model.ids to persist btwn renders */\n\t this.selected = attributes.selected || [];\n\t /** the last selected item.model.id */\n\t this.lastSelected = null;\n\t\n\t /** are sub-views draggable */\n\t this.dragItems = attributes.dragItems || false;\n\t\n\t /** list item view class (when passed models) */\n\t this.viewClass = attributes.viewClass || this.viewClass;\n\t\n\t /** list item views */\n\t this.views = [];\n\t /** list item models */\n\t this.collection = attributes.collection || ( new this.collectionClass([]) );\n\t\n\t /** filter fns run over collection items to see if they should show in the list */\n\t this.filters = attributes.filters || [];\n\t\n\t /** override $scrollContainer fn via attributes - fn should return jq for elem to call scrollTo on */\n\t this.$scrollContainer = attributes.$scrollContainer || this.$scrollContainer;\n\t\n\t//TODO: remove\n\t this.title = attributes.title || '';\n\t this.subtitle = attributes.subtitle || '';\n\t\n\t this._setUpListeners();\n\t },\n\t\n\t /** free any sub-views the list has */\n\t freeViews : function(){\n\t//TODO: stopListening? remove?\n\t _.each( this.views, function( view ){\n\t view.off();\n\t });\n\t this.views = [];\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ listeners\n\t /** create any event listeners for the list\n\t */\n\t _setUpListeners : function(){\n\t this.off();\n\t\n\t //TODO: move errorHandler down into list-view from history-view or\n\t // pass to global error handler (Galaxy)\n\t this.on( 'error', function( model, xhr, options, msg, details ){\n\t //this.errorHandler( model, xhr, options, msg, details );\n\t console.error( model, xhr, options, msg, details );\n\t }, this );\n\t\n\t // show hide the loading indicator\n\t this.on( 'loading', function(){\n\t this._showLoadingIndicator( 'loading...', 40 );\n\t }, this );\n\t this.on( 'loading-done', function(){\n\t this._hideLoadingIndicator( 40 );\n\t }, this );\n\t\n\t // throw the first render up as a diff namespace using once (for outside consumption)\n\t this.once( 'rendered', function(){\n\t this.trigger( 'rendered:initial', this );\n\t }, this );\n\t\n\t // debugging\n\t if( this.logger ){\n\t this.on( 'all', function( event ){\n\t this.log( this + '', arguments );\n\t }, this );\n\t }\n\t\n\t this._setUpCollectionListeners();\n\t this._setUpViewListeners();\n\t return this;\n\t },\n\t\n\t /** listening for collection events */\n\t _setUpCollectionListeners : function(){\n\t this.log( this + '._setUpCollectionListeners', this.collection );\n\t this.collection.off();\n\t\n\t // bubble up error events\n\t this.collection.on( 'error', function( model, xhr, options, msg, details ){\n\t this.trigger( 'error', model, xhr, options, msg, details );\n\t }, this );\n\t\n\t this.collection.on( 'reset', function(){\n\t this.renderItems();\n\t }, this );\n\t this.collection.on( 'add', this.addItemView, this );\n\t this.collection.on( 'remove', this.removeItemView, this );\n\t\n\t // debugging\n\t if( this.logger ){\n\t this.collection.on( 'all', function( event ){\n\t this.info( this + '(collection)', arguments );\n\t }, this );\n\t }\n\t return this;\n\t },\n\t\n\t /** listening for sub-view events that bubble up with the 'view:' prefix */\n\t _setUpViewListeners : function(){\n\t this.log( this + '._setUpViewListeners' );\n\t\n\t // shift to select a range\n\t this.on( 'view:selected', function( view, ev ){\n\t if( ev && ev.shiftKey && this.lastSelected ){\n\t var lastSelectedView = this.viewFromModelId( this.lastSelected );\n\t if( lastSelectedView ){\n\t this.selectRange( view, lastSelectedView );\n\t }\n\t } else if( ev && ev.altKey && !this.selecting ){\n\t this.showSelectors();\n\t }\n\t this.selected.push( view.model.id );\n\t this.lastSelected = view.model.id;\n\t }, this );\n\t\n\t this.on( 'view:de-selected', function( view, ev ){\n\t this.selected = _.without( this.selected, view.model.id );\n\t //this.lastSelected = view.model.id;\n\t }, this );\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering\n\t /** Render this content, set up ui.\n\t * @param {Number or String} speed the speed of the render\n\t */\n\t render : function( speed ){\n\t this.log( this + '.render', speed );\n\t var $newRender = this._buildNewRender();\n\t this._setUpBehaviors( $newRender );\n\t this._queueNewRender( $newRender, speed );\n\t return this;\n\t },\n\t\n\t /** Build a temp div containing the new children for the view's $el.\n\t */\n\t _buildNewRender : function(){\n\t this.debug( this + '(ListPanel)._buildNewRender' );\n\t var $newRender = $( this.templates.el( {}, this ) );\n\t this._renderControls( $newRender );\n\t this._renderTitle( $newRender );\n\t this._renderSubtitle( $newRender );\n\t this._renderSearch( $newRender );\n\t this.renderItems( $newRender );\n\t return $newRender;\n\t },\n\t\n\t /** Build a temp div containing the new children for the view's $el.\n\t */\n\t _renderControls : function( $newRender ){\n\t this.debug( this + '(ListPanel)._renderControls' );\n\t var $controls = $( this.templates.controls( {}, this ) );\n\t $newRender.find( '.controls' ).replaceWith( $controls );\n\t return $controls;\n\t },\n\t\n\t /**\n\t */\n\t _renderTitle : function( $where ){\n\t //$where = $where || this.$el;\n\t //$where.find( '.title' ).replaceWith( ... )\n\t },\n\t\n\t /**\n\t */\n\t _renderSubtitle : function( $where ){\n\t //$where = $where || this.$el;\n\t //$where.find( '.title' ).replaceWith( ... )\n\t },\n\t\n\t /** Fade out the old el, swap in the new contents, then fade in.\n\t * @param {Number or String} speed jq speed to use for rendering effects\n\t * @fires rendered when rendered\n\t */\n\t _queueNewRender : function( $newRender, speed ) {\n\t speed = ( speed === undefined )?( this.fxSpeed ):( speed );\n\t var panel = this;\n\t panel.log( '_queueNewRender:', $newRender, speed );\n\t\n\t $( panel ).queue( 'fx', [\n\t function( next ){ this.$el.fadeOut( speed, next ); },\n\t function( next ){\n\t panel._swapNewRender( $newRender );\n\t next();\n\t },\n\t function( next ){ this.$el.fadeIn( speed, next ); },\n\t function( next ){\n\t panel.trigger( 'rendered', panel );\n\t next();\n\t }\n\t ]);\n\t },\n\t\n\t /** empty out the current el, move the $newRender's children in */\n\t _swapNewRender : function( $newRender ){\n\t this.$el.empty().attr( 'class', this.className ).append( $newRender.children() );\n\t if( this.selecting ){ this.showSelectors( 0 ); }\n\t return this;\n\t },\n\t\n\t /** */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t $where.find( '.controls [title]' ).tooltip({ placement: 'bottom' });\n\t // set up the pupup for actions available when multi selecting\n\t this._renderMultiselectActionMenu( $where );\n\t return this;\n\t },\n\t\n\t /** render a menu containing the actions available to sets of selected items */\n\t _renderMultiselectActionMenu : function( $where ){\n\t $where = $where || this.$el;\n\t var $menu = $where.find( '.list-action-menu' ),\n\t actions = this.multiselectActions();\n\t if( !actions.length ){\n\t return $menu.empty();\n\t }\n\t\n\t var $newMenu = $([\n\t '
    ',\n\t '',\n\t '
      ', '
    ',\n\t '
    '\n\t ].join(''));\n\t var $actions = actions.map( function( action ){\n\t var html = [ '
  • ', action.html, '
  • ' ].join( '' );\n\t return $( html ).click( function( ev ){\n\t ev.preventDefault();\n\t return action.func( ev );\n\t });\n\t });\n\t $newMenu.find( 'ul' ).append( $actions );\n\t $menu.replaceWith( $newMenu );\n\t return $newMenu;\n\t },\n\t\n\t /** return a list of plain objects used to render multiselect actions menu. Each object should have:\n\t * html: an html string used as the anchor contents\n\t * func: a function called when the anchor is clicked (passed the click event)\n\t */\n\t multiselectActions : function(){\n\t return [];\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-$element shortcuts\n\t /** the scroll container for this panel - can be $el, $el.parent(), or grandparent depending on context */\n\t $scrollContainer : function(){\n\t // override or set via attributes.$scrollContainer\n\t return this.$el.parent().parent();\n\t },\n\t /** */\n\t $list : function( $where ){\n\t return ( $where || this.$el ).find( '> .list-items' );\n\t },\n\t /** container where list messages are attached */\n\t $messages : function( $where ){\n\t return ( $where || this.$el ).find( '> .controls .messages' );\n\t },\n\t /** the message displayed when no views can be shown (no views, none matching search) */\n\t $emptyMessage : function( $where ){\n\t return ( $where || this.$el ).find( '> .empty-message' );\n\t },\n\t\n\t // ------------------------------------------------------------------------ hda sub-views\n\t /**\n\t * @param {jQuery} $whereTo what dom element to prepend the sub-views to\n\t * @returns the visible item views\n\t */\n\t renderItems : function( $whereTo ){\n\t $whereTo = $whereTo || this.$el;\n\t var panel = this;\n\t panel.log( this + '.renderItems', $whereTo );\n\t\n\t var $list = panel.$list( $whereTo );\n\t//TODO: free prev. views?\n\t panel.views = panel._filterCollection().map( function( itemModel ){\n\t//TODO: creates views each time - not neccessarily good\n\t//TODO: pass speed here\n\t return panel._createItemView( itemModel ).render( 0 );\n\t });\n\t //panel.debug( item$els );\n\t //panel.debug( newViews );\n\t\n\t $list.empty();\n\t if( panel.views.length ){\n\t panel._attachItems( $whereTo );\n\t panel.$emptyMessage( $whereTo ).hide();\n\t\n\t } else {\n\t panel._renderEmptyMessage( $whereTo ).show();\n\t }\n\t panel.trigger( 'views:ready', panel.views );\n\t\n\t return panel.views;\n\t },\n\t\n\t /** Filter the collection to only those models that should be currently viewed */\n\t _filterCollection : function(){\n\t // override this\n\t var panel = this;\n\t return panel.collection.filter( _.bind( panel._filterItem, panel ) );\n\t },\n\t\n\t /** Should the model be viewable in the current state?\n\t * Checks against this.filters and this.searchFor\n\t */\n\t _filterItem : function( model ){\n\t // override this\n\t var panel = this;\n\t return ( _.every( panel.filters.map( function( fn ){ return fn.call( model ); }) ) )\n\t && ( !panel.searchFor || model.matchesAll( panel.searchFor ) );\n\t },\n\t\n\t /** Create a view for a model and set up it's listeners */\n\t _createItemView : function( model ){\n\t var ViewClass = this._getItemViewClass( model ),\n\t options = _.extend( this._getItemViewOptions( model ), {\n\t model : model\n\t }),\n\t view = new ViewClass( options );\n\t this._setUpItemViewListeners( view );\n\t return view;\n\t },\n\t\n\t /** Get the bbone view class based on the model */\n\t _getItemViewClass : function( model ){\n\t // override this\n\t return this.viewClass;\n\t },\n\t\n\t /** Get the options passed to the new view based on the model */\n\t _getItemViewOptions : function( model ){\n\t // override this\n\t return {\n\t //logger : this.logger,\n\t fxSpeed : this.fxSpeed,\n\t expanded : false,\n\t selectable : this.selecting,\n\t selected : _.contains( this.selected, model.id ),\n\t draggable : this.dragItems\n\t };\n\t },\n\t\n\t /** Set up listeners for new models */\n\t _setUpItemViewListeners : function( view ){\n\t var panel = this;\n\t // send all events to the panel, re-namspaceing them with the view prefix\n\t view.on( 'all', function(){\n\t var args = Array.prototype.slice.call( arguments, 0 );\n\t args[0] = 'view:' + args[0];\n\t panel.trigger.apply( panel, args );\n\t });\n\t\n\t // drag multiple - hijack ev.setData to add all selected items\n\t view.on( 'draggable:dragstart', function( ev, v ){\n\t //TODO: set multiple drag data here\n\t var json = {},\n\t selected = this.getSelectedModels();\n\t if( selected.length ){\n\t json = selected.toJSON();\n\t } else {\n\t json = [ v.model.toJSON() ];\n\t }\n\t ev.dataTransfer.setData( 'text', JSON.stringify( json ) );\n\t //ev.dataTransfer.setDragImage( v.el, 60, 60 );\n\t }, this );\n\t\n\t // debugging\n\t //if( this.logger ){\n\t // view.on( 'all', function( event ){\n\t // this.log( this + '(view)', arguments );\n\t // }, this );\n\t //}\n\t return panel;\n\t },\n\t\n\t /** Attach views in this.views to the model based on $whereTo */\n\t _attachItems : function( $whereTo ){\n\t //ASSUMES: $list has been emptied\n\t this.$list( $whereTo ).append( this.views.map( function( view ){\n\t return view.$el;\n\t }));\n\t return this;\n\t },\n\t\n\t /** render the empty/none-found message */\n\t _renderEmptyMessage : function( $whereTo ){\n\t this.debug( '_renderEmptyMessage', $whereTo, this.searchFor );\n\t var text = this.searchFor? this.noneFoundMsg : this.emptyMsg;\n\t return this.$emptyMessage( $whereTo ).text( text );\n\t },\n\t\n\t /** collapse all item views */\n\t expandAll : function(){\n\t _.each( this.views, function( view ){\n\t view.expand();\n\t });\n\t },\n\t\n\t /** collapse all item views */\n\t collapseAll : function(){\n\t _.each( this.views, function( view ){\n\t view.collapse();\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ collection/views syncing\n\t /** Add a view (if the model should be viewable) to the panel */\n\t addItemView : function( model, collection, options ){\n\t this.log( this + '.addItemView:', model );\n\t var panel = this;\n\t if( !panel._filterItem( model ) ){ return undefined; }\n\t\n\t var view = panel._createItemView( model );\n\t // hide the empty message if only view\n\t $( view ).queue( 'fx', [\n\t //TODO:? could poss. pubsub this\n\t function( next ){ panel.$emptyMessage().fadeOut( panel.fxSpeed, next ); },\n\t function( next ){\n\t panel._attachView( view );\n\t next();\n\t }\n\t ]);\n\t return view;\n\t },\n\t\n\t /** internal fn to add view (to both panel.views and panel.$list) */\n\t _attachView : function( view ){\n\t var panel = this;\n\t // override to control where the view is added, how/whether it's rendered\n\t panel.views.push( view );\n\t panel.$list().append( view.render( 0 ).$el.hide() );\n\t panel.trigger( 'view:attached', view );\n\t view.$el.slideDown( panel.fxSpeed, function(){\n\t panel.trigger( 'view:attached:rendered' );\n\t });\n\t },\n\t\n\t /** Remove a view from the panel (if found) */\n\t removeItemView : function( model, collection, options ){\n\t this.log( this + '.removeItemView:', model );\n\t var panel = this,\n\t view = panel.viewFromModel( model );\n\t if( !view ){ return undefined; }\n\t panel.views = _.without( panel.views, view );\n\t panel.trigger( 'view:removed', view );\n\t\n\t // potentially show the empty message if no views left\n\t // use anonymous queue here - since remove can happen multiple times\n\t $({}).queue( 'fx', [\n\t function( next ){ view.$el.fadeOut( panel.fxSpeed, next ); },\n\t function( next ){\n\t view.remove();\n\t panel.trigger( 'view:removed:rendered' );\n\t if( !panel.views.length ){\n\t panel._renderEmptyMessage().fadeIn( panel.fxSpeed, next );\n\t } else {\n\t next();\n\t }\n\t }\n\t ]);\n\t return view;\n\t },\n\t\n\t /** get views based on model.id */\n\t viewFromModelId : function( id ){\n\t for( var i = 0; i < this.views.length; i++ ){\n\t if( this.views[i].model.id === id ){\n\t return this.views[i];\n\t }\n\t }\n\t return undefined;\n\t },\n\t\n\t /** get views based on model */\n\t viewFromModel : function( model ){\n\t if( !model ){ return undefined; }\n\t return this.viewFromModelId( model.id );\n\t },\n\t\n\t /** get views based on model properties */\n\t viewsWhereModel : function( properties ){\n\t return this.views.filter( function( view ){\n\t //return view.model.matches( properties );\n\t//TODO: replace with _.matches (underscore 1.6.0)\n\t var json = view.model.toJSON();\n\t for( var key in properties ){\n\t if( properties.hasOwnProperty( key ) ){\n\t if( json[ key ] !== view.model.get( key ) ){\n\t return false;\n\t }\n\t }\n\t }\n\t return true;\n\t });\n\t },\n\t\n\t /** A range of views between (and including) viewA and viewB */\n\t viewRange : function( viewA, viewB ){\n\t if( viewA === viewB ){ return ( viewA )?( [ viewA ] ):( [] ); }\n\t\n\t var indexA = this.views.indexOf( viewA ),\n\t indexB = this.views.indexOf( viewB );\n\t\n\t // handle not found\n\t if( indexA === -1 || indexB === -1 ){\n\t if( indexA === indexB ){ return []; }\n\t return ( indexA === -1 )?( [ viewB ] ):( [ viewA ] );\n\t }\n\t // reverse if indeces are\n\t //note: end inclusive\n\t return ( indexA < indexB )?\n\t this.views.slice( indexA, indexB + 1 ) :\n\t this.views.slice( indexB, indexA + 1 );\n\t },\n\t\n\t // ------------------------------------------------------------------------ searching\n\t /** render a search input for filtering datasets shown\n\t * (see SearchableMixin in base-mvc for implementation of the actual searching)\n\t * return will start the search\n\t * esc will clear the search\n\t * clicking the clear button will clear the search\n\t * uses searchInput in ui.js\n\t */\n\t _renderSearch : function( $where ){\n\t $where.find( '.controls .search-input' ).searchInput({\n\t placeholder : this.searchPlaceholder,\n\t initialVal : this.searchFor,\n\t onfirstsearch : _.bind( this._firstSearch, this ),\n\t onsearch : _.bind( this.searchItems, this ),\n\t onclear : _.bind( this.clearSearch, this )\n\t });\n\t return $where;\n\t },\n\t\n\t /** What to do on the first search entered */\n\t _firstSearch : function( searchFor ){\n\t // override to load model details if necc.\n\t this.log( 'onFirstSearch', searchFor );\n\t return this.searchItems( searchFor );\n\t },\n\t\n\t /** filter view list to those that contain the searchFor terms */\n\t searchItems : function( searchFor ){\n\t this.searchFor = searchFor;\n\t this.trigger( 'search:searching', searchFor, this );\n\t this.renderItems();\n\t this.$( '> .controls .search-query' ).val( searchFor );\n\t return this;\n\t },\n\t\n\t /** clear the search filters and show all views that are normally shown */\n\t clearSearch : function( searchFor ){\n\t //this.log( 'onSearchClear', this );\n\t this.searchFor = '';\n\t this.trigger( 'search:clear', this );\n\t this.$( '> .controls .search-query' ).val( '' );\n\t this.renderItems();\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ selection\n\t /** @type Integer when the number of list item views is >= to this, don't animate selectors */\n\t THROTTLE_SELECTORS_AT : 20,\n\t\n\t /** show selectors on all visible itemViews and associated controls */\n\t showSelectors : function( speed ){\n\t speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n\t this.selecting = true;\n\t this.$( '.list-actions' ).slideDown( speed );\n\t speed = this.views.length >= this.THROTTLE_SELECTORS_AT? 0 : speed;\n\t _.each( this.views, function( view ){\n\t view.showSelector( speed );\n\t });\n\t //this.selected = [];\n\t //this.lastSelected = null;\n\t },\n\t\n\t /** hide selectors on all visible itemViews and associated controls */\n\t hideSelectors : function( speed ){\n\t speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n\t this.selecting = false;\n\t this.$( '.list-actions' ).slideUp( speed );\n\t speed = this.views.length >= this.THROTTLE_SELECTORS_AT? 0 : speed;\n\t _.each( this.views, function( view ){\n\t view.hideSelector( speed );\n\t });\n\t this.selected = [];\n\t this.lastSelected = null;\n\t },\n\t\n\t /** show or hide selectors on all visible itemViews and associated controls */\n\t toggleSelectors : function(){\n\t if( !this.selecting ){\n\t this.showSelectors();\n\t } else {\n\t this.hideSelectors();\n\t }\n\t },\n\t\n\t /** select all visible items */\n\t selectAll : function( event ){\n\t _.each( this.views, function( view ){\n\t view.select( event );\n\t });\n\t },\n\t\n\t /** deselect all visible items */\n\t deselectAll : function( event ){\n\t this.lastSelected = null;\n\t _.each( this.views, function( view ){\n\t view.deselect( event );\n\t });\n\t },\n\t\n\t /** select a range of datasets between A and B */\n\t selectRange : function( viewA, viewB ){\n\t var range = this.viewRange( viewA, viewB );\n\t _.each( range, function( view ){\n\t view.select();\n\t });\n\t return range;\n\t },\n\t\n\t /** return an array of all currently selected itemViews */\n\t getSelectedViews : function(){\n\t return _.filter( this.views, function( v ){\n\t return v.selected;\n\t });\n\t },\n\t\n\t /** return a collection of the models of all currenly selected items */\n\t getSelectedModels : function(){\n\t return new this.collection.constructor( _.map( this.getSelectedViews(), function( view ){\n\t return view.model;\n\t }));\n\t },\n\t\n\t // ------------------------------------------------------------------------ loading indicator\n\t//TODO: questionable\n\t /** hide the $el and display a loading indicator (in the $el's parent) when loading new data */\n\t _showLoadingIndicator : function( msg, speed, callback ){\n\t this.debug( '_showLoadingIndicator', this.indicator, msg, speed, callback );\n\t speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n\t if( !this.indicator ){\n\t this.indicator = new LoadingIndicator( this.$el, this.$el.parent() );\n\t this.debug( '\\t created', this.indicator );\n\t }\n\t if( !this.$el.is( ':visible' ) ){\n\t this.indicator.show( 0, callback );\n\t } else {\n\t this.$el.fadeOut( speed );\n\t this.indicator.show( msg, speed, callback );\n\t }\n\t },\n\t\n\t /** hide the loading indicator */\n\t _hideLoadingIndicator : function( speed, callback ){\n\t this.debug( '_hideLoadingIndicator', this.indicator, speed, callback );\n\t speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n\t if( this.indicator ){\n\t this.indicator.hide( speed, callback );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ scrolling\n\t /** get the current scroll position of the panel in its parent */\n\t scrollPosition : function(){\n\t return this.$scrollContainer().scrollTop();\n\t },\n\t\n\t /** set the current scroll position of the panel in its parent */\n\t scrollTo : function( pos, speed ){\n\t speed = speed || 0;\n\t this.$scrollContainer().animate({ scrollTop: pos }, speed );\n\t return this;\n\t },\n\t\n\t /** Scrolls the panel to the top. */\n\t scrollToTop : function( speed ){\n\t return this.scrollTo( 0, speed );\n\t },\n\t\n\t /** */\n\t scrollToItem : function( view, speed ){\n\t if( !view ){ return this; }\n\t //var itemTop = view.$el.offset().top;\n\t var itemTop = view.$el.position().top;\n\t return this.scrollTo( itemTop, speed );\n\t },\n\t\n\t /** Scrolls the panel to show the content with the given id. */\n\t scrollToId : function( id, speed ){\n\t return this.scrollToItem( this.viewFromModelId( id ), speed );\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel events\n\t /** event map */\n\t events : {\n\t 'click .select-all' : 'selectAll',\n\t 'click .deselect-all' : 'deselectAll'\n\t },\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** Return a string rep of the panel */\n\t toString : function(){\n\t return 'ListPanel(' + this.collection + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tListPanel.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var elTemplate = BASE_MVC.wrapTemplate([\n\t // temp container\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ]);\n\t\n\t var controlsTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t '
    ',\n\t '
    <%- view.title %>
    ',\n\t '
    ',\n\t '
    <%- view.subtitle %>
    ',\n\t // buttons, controls go here\n\t '
    ',\n\t // deleted msg, etc.\n\t '
    ',\n\t\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t\n\t // show when selectors are shown\n\t '
    ',\n\t '
    ',\n\t '',\n\t '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ]);\n\t\n\t return {\n\t el : elTemplate,\n\t controls : controlsTemplate\n\t };\n\t}());\n\t\n\t\n\t//=============================================================================\n\t/** View for a model that has a sub-collection (e.g. History, DatasetCollection)\n\t * Allows:\n\t * the model to be reset\n\t * auto assign panel.collection to panel.model[ panel.modelCollectionKey ]\n\t *\n\t */\n\tvar ModelListPanel = ListPanel.extend({\n\t\n\t /** key of attribute in model to assign to this.collection */\n\t modelCollectionKey : 'contents',\n\t\n\t initialize : function( attributes ){\n\t ListPanel.prototype.initialize.call( this, attributes );\n\t this.selecting = ( attributes.selecting !== undefined )? attributes.selecting : false;\n\t\n\t this.setModel( this.model, attributes );\n\t },\n\t\n\t /** release/free/shutdown old models and set up panel for new models\n\t * @fires new-model with the panel as parameter\n\t */\n\t setModel : function( model, attributes ){\n\t attributes = attributes || {};\n\t this.debug( this + '.setModel:', model, attributes );\n\t\n\t this.freeModel();\n\t this.freeViews();\n\t\n\t if( model ){\n\t var oldModelId = this.model? this.model.get( 'id' ): null;\n\t\n\t // set up the new model with user, logger, storage, events\n\t this.model = model;\n\t if( this.logger ){\n\t this.model.logger = this.logger;\n\t }\n\t this._setUpModelListeners();\n\t\n\t//TODO: relation btwn model, collection becoming tangled here\n\t // free the collection, and assign the new collection to either\n\t // the model[ modelCollectionKey ], attributes.collection, or an empty vanilla collection\n\t this.collection.off();\n\t this.collection = ( this.model[ this.modelCollectionKey ] )?\n\t this.model[ this.modelCollectionKey ]:\n\t ( attributes.collection || ( new this.collectionClass([]) ) );\n\t this._setUpCollectionListeners();\n\t\n\t if( oldModelId && model.get( 'id' ) !== oldModelId ){\n\t this.trigger( 'new-model', this );\n\t }\n\t }\n\t return this;\n\t },\n\t\n\t /** free the current model and all listeners for it, free any views for the model */\n\t freeModel : function(){\n\t // stop/release the previous model, and clear cache to sub-views\n\t if( this.model ){\n\t this.stopListening( this.model );\n\t //TODO: see base-mvc\n\t //this.model.free();\n\t //this.model = null;\n\t }\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ listening\n\t /** listening for model events */\n\t _setUpModelListeners : function(){\n\t // override\n\t this.log( this + '._setUpModelListeners', this.model );\n\t // bounce model errors up to the panel\n\t this.model.on( 'error', function(){\n\t var args = Array.prototype.slice.call( arguments, 0 );\n\t //args.unshift( 'model:error' );\n\t args.unshift( 'error' );\n\t this.trigger.apply( this, args );\n\t }, this );\n\t return this;\n\t },\n\t\n\t /** Build a temp div containing the new children for the view's $el.\n\t */\n\t _renderControls : function( $newRender ){\n\t this.debug( this + '(ListPanel)._renderControls' );\n\t var json = this.model? this.model.toJSON() : {},\n\t $controls = $( this.templates.controls( json, this ) );\n\t $newRender.find( '.controls' ).replaceWith( $controls );\n\t return $controls;\n\t },\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** Return a string rep of the panel */\n\t toString : function(){\n\t return 'ModelListPanel(' + this.model + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tModelListPanel.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var controlsTemplate = BASE_MVC.wrapTemplate([\n\t '
    ',\n\t '
    ',\n\t//TODO: this is really the only difference - consider factoring titlebar out\n\t '
    <%- model.name %>
    ',\n\t '
    ',\n\t '
    <%- view.subtitle %>
    ',\n\t '
    ',\n\t '
    ',\n\t\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t\n\t '
    ',\n\t '
    ',\n\t '',\n\t '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ]);\n\t\n\t return _.extend( _.clone( ListPanel.prototype.templates ), {\n\t controls : controlsTemplate\n\t });\n\t}());\n\t\n\t\n\t//=============================================================================\n\t return {\n\t ListPanel : ListPanel,\n\t ModelListPanel : ModelListPanel\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 101 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( baseMVC, _l ){\n\t// =============================================================================\n\t/** A view on any model that has a 'tags' attribute (a list of tag strings)\n\t * Incorporates the select2 jQuery plugin for tags display/editing:\n\t * http://ivaynberg.github.io/select2/\n\t */\n\tvar TagsEditor = Backbone.View\n\t .extend( baseMVC.LoggableMixin )\n\t .extend( baseMVC.HiddenUntilActivatedViewMixin ).extend({\n\t\n\t tagName : 'div',\n\t className : 'tags-display',\n\t\n\t /** Set up listeners, parse options */\n\t initialize : function( options ){\n\t //console.debug( this, options );\n\t // only listen to the model only for changes to tags - re-render\n\t this.listenTo( this.model, 'change:tags', function(){\n\t this.render();\n\t });\n\t this.hiddenUntilActivated( options.$activator, options );\n\t },\n\t\n\t /** Build the DOM elements, call select to on the created input, and set up behaviors */\n\t render : function(){\n\t var view = this;\n\t this.$el.html( this._template() );\n\t\n\t this.$input().select2({\n\t placeholder : 'Add tags',\n\t width : '100%',\n\t tags : function(){\n\t // initialize possible tags in the dropdown based on all the tags the user has used so far\n\t return view._getTagsUsed();\n\t }\n\t });\n\t\n\t this._setUpBehaviors();\n\t return this;\n\t },\n\t\n\t /** @returns {String} the html text used to build the view's DOM */\n\t _template : function(){\n\t return [\n\t //TODO: make prompt optional\n\t '',\n\t // set up initial tags by adding as CSV to input vals (necc. to init select2)\n\t ''\n\t ].join( '' );\n\t },\n\t\n\t /** @returns {String} the sorted, comma-separated tags from the model */\n\t tagsToCSV : function(){\n\t var tagsArray = this.model.get( 'tags' );\n\t if( !_.isArray( tagsArray ) || _.isEmpty( tagsArray ) ){\n\t return '';\n\t }\n\t return tagsArray.map( function( tag ){\n\t return _.escape( tag );\n\t }).sort().join( ',' );\n\t },\n\t\n\t /** @returns {jQuery} the input for this view */\n\t $input : function(){\n\t return this.$el.find( 'input.tags-input' );\n\t },\n\t\n\t /** @returns {String[]} all tags used by the current user */\n\t _getTagsUsed : function(){\n\t//TODO: global\n\t return Galaxy.user.get( 'tags_used' );\n\t },\n\t\n\t /** set up any event listeners on the view's DOM (mostly handled by select2) */\n\t _setUpBehaviors : function(){\n\t var view = this;\n\t this.$input().on( 'change', function( event ){\n\t // save the model's tags in either remove or added event\n\t view.model.save({ tags: event.val }, { silent: true });\n\t // if it's new, add the tag to the users tags\n\t if( event.added ){\n\t //??: solve weird behavior in FF on test.galaxyproject.org where\n\t // event.added.text is string object: 'String{ 0=\"o\", 1=\"n\", 2=\"e\" }'\n\t view._addNewTagToTagsUsed( event.added.text + '' );\n\t }\n\t });\n\t },\n\t\n\t /** add a new tag (if not already there) to the list of all tags used by the user\n\t * @param {String} newTag the tag to add to the list of used\n\t */\n\t _addNewTagToTagsUsed : function( newTag ){\n\t//TODO: global\n\t var tagsUsed = Galaxy.user.get( 'tags_used' );\n\t if( !_.contains( tagsUsed, newTag ) ){\n\t tagsUsed.push( newTag );\n\t tagsUsed.sort();\n\t Galaxy.user.set( 'tags_used', tagsUsed );\n\t }\n\t },\n\t\n\t /** shut down event listeners and remove this view's DOM */\n\t remove : function(){\n\t this.$input.off();\n\t this.stopListening( this.model );\n\t Backbone.View.prototype.remove.call( this );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){ return [ 'TagsEditor(', this.model + '', ')' ].join(''); }\n\t});\n\t\n\t// =============================================================================\n\treturn {\n\t TagsEditor : TagsEditor\n\t};\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3)))\n\n/***/ },\n/* 102 */,\n/* 103 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/** This renders the content of the ftp popup **/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\treturn Backbone.View.extend({\n\t // render\n\t initialize: function(options) {\n\t // link options\n\t this.options = Utils.merge(options, {\n\t class_add : 'upload-icon-button fa fa-square-o',\n\t class_remove : 'upload-icon-button fa fa-check-square-o',\n\t class_partial : 'upload-icon-button fa fa-minus-square-o',\n\t collection : null,\n\t onchange : function() {},\n\t onadd : function() {},\n\t onremove : function() {}\n\t });\n\t\n\t // link this\n\t var self = this;\n\t\n\t // link app\n\t this.collection = this.options.collection;\n\t\n\t // set template\n\t this.setElement(this._template());\n\t\n\t // list of rows\n\t this.rows = [];\n\t\n\t // load extension\n\t Utils.get({\n\t url : Galaxy.root + 'api/remote_files',\n\t success : function(ftp_files) { self._fill(ftp_files); },\n\t error : function() { self._fill(); }\n\t });\n\t },\n\t\n\t // fill table\n\t _fill: function(ftp_files) {\n\t if (ftp_files && ftp_files.length > 0) {\n\t // add table\n\t this.$el.find('#upload-ftp-content').html($(this._templateTable()));\n\t\n\t // add files to table\n\t var size = 0;\n\t for (index in ftp_files) {\n\t this.rows.push(this._add(ftp_files[index]));\n\t size += ftp_files[index].size;\n\t }\n\t\n\t // update stats\n\t this.$el.find('#upload-ftp-number').html(ftp_files.length + ' files');\n\t this.$el.find('#upload-ftp-disk').html(Utils.bytesToString (size, true));\n\t\n\t // add event handler to select/unselect all\n\t if (this.collection) {\n\t var self = this;\n\t this.$('._has_collection').show();\n\t this.$select_all = $('#upload-selectall');\n\t this.$select_all.addClass(this.options.class_add);\n\t this.$select_all.on('click', function() {\n\t var add = self.$select_all.hasClass(self.options.class_add);\n\t for (index in ftp_files) {\n\t var ftp_file = ftp_files[index];\n\t var model_index = self._find(ftp_file);\n\t if(!model_index && add || model_index && !add) {\n\t self.rows[index].trigger('click');\n\t }\n\t }\n\t });\n\t this._refresh();\n\t }\n\t } else {\n\t this.$el.find('#upload-ftp-content').html($(this._templateInfo()));\n\t }\n\t this.$el.find('#upload-ftp-wait').hide();\n\t },\n\t\n\t // add\n\t _add: function(ftp_file) {\n\t // link this\n\t var self = this;\n\t\n\t // create new item\n\t var $it = $(this._templateRow(ftp_file));\n\t\n\t // identify icon\n\t var $icon = $it.find('.icon');\n\t\n\t // append to table\n\t $(this.el).find('tbody').append($it);\n\t\n\t // collection mode with add/remove triggers\n\t if (this.collection) {\n\t // find model and set initial 'add' icon class\n\t var icon_class = '';\n\t if (this._find(ftp_file)) {\n\t icon_class = this.options.class_remove;\n\t } else {\n\t icon_class = this.options.class_add;\n\t }\n\t $icon.addClass(icon_class);\n\t\n\t // click triggers add/remove events\n\t $it.on('click', function() {\n\t var model_index = self._find(ftp_file);\n\t $icon.removeClass();\n\t if (!model_index) {\n\t self.options.onadd(ftp_file);\n\t $icon.addClass(self.options.class_remove);\n\t } else {\n\t self.options.onremove(model_index);\n\t $icon.addClass(self.options.class_add);\n\t }\n\t self._refresh();\n\t });\n\t } else {\n\t // click triggers only change\n\t $it.on('click', function() {\n\t self.options.onchange(ftp_file);\n\t });\n\t }\n\t\n\t // return dom handler\n\t return $it;\n\t },\n\t\n\t // refresh\n\t _refresh: function() {\n\t var filtered = this.collection.where({file_mode: 'ftp', enabled: true});\n\t this.$select_all.removeClass();\n\t if (filtered.length == 0) {\n\t this.$select_all.addClass(this.options.class_add);\n\t } else {\n\t if (filtered.length == this.rows.length) {\n\t this.$select_all.addClass(this.options.class_remove);\n\t } else {\n\t this.$select_all.addClass(this.options.class_partial);\n\t }\n\t }\n\t },\n\t\n\t // get model index\n\t _find: function(ftp_file) {\n\t var item = this.collection.findWhere({\n\t file_path : ftp_file.path,\n\t file_mode : 'ftp',\n\t enabled : true\n\t });\n\t return item && item.get('id');\n\t },\n\t\n\t // template row\n\t _templateRow: function(options) {\n\t return '' +\n\t '
    ' +\n\t '' + options.path + '' +\n\t '' + Utils.bytesToString(options.size) + '' +\n\t '' + options.ctime + '' +\n\t '';\n\t },\n\t\n\t // load table template\n\t _templateTable: function() {\n\t return 'Available files: ' +\n\t '' +\n\t '' +\n\t '  ' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '
    NameSizeCreated
    ';\n\t },\n\t\n\t // load table template\n\t _templateInfo: function() {\n\t return '
    ' +\n\t 'Your FTP directory does not contain any files.' +\n\t '
    ';\n\t },\n\t\n\t // load html template\n\t _template: function() {\n\t return '
    ' +\n\t '
    ' +\n\t '
    This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at ' + this.options.ftp_upload_site + ' using your Galaxy credentials (email address and password).
    ' +\n\t '
    ' +\n\t '
    ';\n\t }\n\t});\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 104 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {/** This renders the content of the settings popup, allowing users to specify flags i.e. for space-to-tab conversion **/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\treturn Backbone.View.extend({\n\t // options\n\t options: {\n\t class_check : 'upload-icon-button fa fa-check-square-o',\n\t class_uncheck : 'upload-icon-button fa fa-square-o'\n\t },\n\t\n\t // initialize\n\t initialize: function(app) {\n\t // link app\n\t this.app = app;\n\t\n\t // link this\n\t var self = this;\n\t\n\t // set template\n\t this.setElement(this._template());\n\t\n\t // link model\n\t this.model = this.app.model;\n\t\n\t // ui event: space-to-tab\n\t this.$('#upload-space-to-tab').on('click', function() {\n\t self._switchState('#upload-space-to-tab', 'space_to_tab');\n\t });\n\t\n\t // ui event: to-posix-lines\n\t this.$('#upload-to-posix-lines').on('click', function() {\n\t self._switchState('#upload-to-posix-lines', 'to_posix_lines');\n\t });\n\t\n\t // render\n\t this.render();\n\t },\n\t\n\t // render\n\t render: function() {\n\t // render states\n\t this._renderState('#upload-space-to-tab', this.model.get('space_to_tab'));\n\t this._renderState('#upload-to-posix-lines', this.model.get('to_posix_lines'));\n\t\n\t // disable options\n\t var $cover = this.$('#upload-settings-cover');\n\t if (!this.model.get('enabled')) {\n\t $cover.show();\n\t } else {\n\t $cover.hide();\n\t }\n\t },\n\t\n\t // switch state\n\t _switchState: function (element_id, parameter_id) {\n\t if (this.model.get('enabled')) {\n\t var checked = !this.model.get(parameter_id);\n\t this.model.set(parameter_id, checked);\n\t this._renderState(element_id, checked);\n\t }\n\t },\n\t\n\t // render state\n\t _renderState: function (element_id, checked) {\n\t var $it = this.$(element_id);\n\t $it.removeClass();\n\t if (checked) {\n\t $it.addClass(this.options.class_check);\n\t } else {\n\t $it.addClass(this.options.class_uncheck);\n\t }\n\t },\n\t\n\t // load template\n\t _template: function() {\n\t return '
    ' +\n\t '
    ' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '
    Convert spaces to tabs
    Use POSIX standard
    ' +\n\t '
    ';\n\t }\n\t});\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 105 */,\n/* 106 */,\n/* 107 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery, $) {(function (factory) {\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else {\n\t // Browser globals\n\t factory(jQuery);\n\t }\n\t\n\t}(function () {\n\t//=============================================================================\n\t\n\t jQuery.fn.extend({\n\t hoverhighlight : function $hoverhighlight( scope, color ){\n\t scope = scope || 'body';\n\t if( !this.size() ){ return this; }\n\t\n\t $( this ).each( function(){\n\t var $this = $( this ),\n\t targetSelector = $this.data( 'target' );\n\t\n\t if( targetSelector ){\n\t $this.mouseover( function( ev ){\n\t $( targetSelector, scope ).css({\n\t background: color\n\t });\n\t })\n\t .mouseout( function( ev ){\n\t $( targetSelector ).css({\n\t background: ''\n\t });\n\t });\n\t }\n\t });\n\t return this;\n\t }\n\t });\n\t}));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 108 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function($, jQuery) {// from: https://raw.githubusercontent.com/umdjs/umd/master/jqueryPlugin.js\n\t// Uses AMD or browser globals to create a jQuery plugin.\n\t(function (factory) {\n\t if (true) {\n\t //TODO: So...this turns out to be an all or nothing thing. If I load jQuery in the define below, it will\n\t // (of course) wipe the old jquery *and all the plugins loaded into it*. So the define below *is still\n\t // relying on jquery being loaded globally* in order to preserve plugins.\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else {\n\t // Browser globals\n\t factory(jQuery);\n\t }\n\t\n\t}(function () {\n\t var _l = window._l || function( s ){ return s; };\n\t\n\t /** searchInput: (jQuery plugin)\n\t * Creates a search input, a clear button, and loading indicator\n\t * within the selected node.\n\t *\n\t * When the user either presses return or enters some minimal number\n\t * of characters, a callback is called. Pressing ESC when the input\n\t * is focused will clear the input and call a separate callback.\n\t */\n\t function searchInput( parentNode, options ){\n\t//TODO: consolidate with tool menu functionality, use there\n\t var KEYCODE_ESC = 27,\n\t KEYCODE_RETURN = 13,\n\t $parentNode = $( parentNode ),\n\t firstSearch = true,\n\t defaults = {\n\t initialVal : '',\n\t name : 'search',\n\t placeholder : 'search',\n\t classes : '',\n\t onclear : function(){},\n\t onfirstsearch : null,\n\t onsearch : function( inputVal ){},\n\t minSearchLen : 0,\n\t escWillClear : true,\n\t oninit : function(){}\n\t };\n\t\n\t // .................................................................... input rendering and events\n\t // visually clear the search, trigger an event, and call the callback\n\t function clearSearchInput( event ){\n\t var $input = $( this ).parent().children( 'input' );\n\t //console.debug( this, 'clear', $input );\n\t $input.focus().val( '' ).trigger( 'clear:searchInput' );\n\t options.onclear();\n\t }\n\t\n\t // search for searchTerms, trigger an event, call the appropo callback (based on whether this is the first)\n\t function search( event, searchTerms ){\n\t //console.debug( this, 'searching', searchTerms );\n\t //TODO: I don't think this is classic jq custom event form? search.searchInput?\n\t $( this ).trigger( 'search:searchInput', searchTerms );\n\t if( typeof options.onfirstsearch === 'function' && firstSearch ){\n\t firstSearch = false;\n\t options.onfirstsearch( searchTerms );\n\t } else {\n\t options.onsearch( searchTerms );\n\t }\n\t }\n\t\n\t // .................................................................... input rendering and events\n\t function inputTemplate(){\n\t // class search-query is bootstrap 2.3 style that now lives in base.less\n\t return [ '' ].join( '' );\n\t }\n\t\n\t // the search input that responds to keyboard events and displays the search value\n\t function $input(){\n\t return $( inputTemplate() )\n\t // select all text on a focus\n\t .focus( function( event ){\n\t $( this ).select();\n\t })\n\t // attach behaviors to esc, return if desired, search on some min len string\n\t .keyup( function( event ){\n\t event.preventDefault();\n\t event.stopPropagation();\n\t//TODO: doesn't work\n\t if( !$( this ).val() ){ $( this ).blur(); }\n\t\n\t // esc key will clear if desired\n\t if( event.which === KEYCODE_ESC && options.escWillClear ){\n\t clearSearchInput.call( this, event );\n\t\n\t } else {\n\t var searchTerms = $( this ).val();\n\t // return key or the search string len > minSearchLen (if not 0) triggers search\n\t if( ( event.which === KEYCODE_RETURN )\n\t || ( options.minSearchLen && searchTerms.length >= options.minSearchLen ) ){\n\t search.call( this, event, searchTerms );\n\t } else if( !searchTerms.length ){\n\t clearSearchInput.call( this, event );\n\t }\n\t }\n\t })\n\t .on( 'change', function( event ){\n\t search.call( this, event, $( this ).val() );\n\t })\n\t .val( options.initialVal );\n\t }\n\t\n\t // .................................................................... clear button rendering and events\n\t // a button for clearing the search bar, placed on the right hand side\n\t function $clearBtn(){\n\t return $([ '' ].join('') )\n\t .tooltip({ placement: 'bottom' })\n\t .click( function( event ){\n\t clearSearchInput.call( this, event );\n\t });\n\t }\n\t\n\t // .................................................................... loadingIndicator rendering\n\t // a button for clearing the search bar, placed on the right hand side\n\t function $loadingIndicator(){\n\t return $([ '' ].join('') )\n\t .hide().tooltip({ placement: 'bottom' });\n\t }\n\t\n\t // .................................................................... commands\n\t // visually swap the load, clear buttons\n\t function toggleLoadingIndicator(){\n\t $parentNode.find( '.search-loading' ).toggle();\n\t $parentNode.find( '.search-clear' ).toggle();\n\t }\n\t\n\t // .................................................................... init\n\t // string command (not constructor)\n\t if( jQuery.type( options ) === 'string' ){\n\t if( options === 'toggle-loading' ){\n\t toggleLoadingIndicator();\n\t }\n\t return $parentNode;\n\t }\n\t\n\t // initial render\n\t if( jQuery.type( options ) === 'object' ){\n\t options = jQuery.extend( true, {}, defaults, options );\n\t }\n\t //NOTE: prepended\n\t return $parentNode.addClass( 'search-input' ).prepend([ $input(), $clearBtn(), $loadingIndicator() ]);\n\t }\n\t\n\t // as jq plugin\n\t jQuery.fn.extend({\n\t searchInput : function $searchInput( options ){\n\t return this.each( function(){\n\t return searchInput( this, options );\n\t });\n\t }\n\t });\n\t}));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 109 */,\n/* 110 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t// Alphanumeric/natural sort fn\n\tfunction naturalSort(a, b) {\n\t // setup temp-scope variables for comparison evauluation\n\t var re = /(-?[0-9\\.]+)/g,\n\t x = a.toString().toLowerCase() || '',\n\t y = b.toString().toLowerCase() || '',\n\t nC = String.fromCharCode(0),\n\t xN = x.replace( re, nC + '$1' + nC ).split(nC),\n\t yN = y.replace( re, nC + '$1' + nC ).split(nC),\n\t xD = (new Date(x)).getTime(),\n\t yD = xD ? (new Date(y)).getTime() : null;\n\t // natural sorting of dates\n\t if ( yD ) {\n\t if ( xD < yD ) { return -1; }\n\t else if ( xD > yD ) { return 1; }\n\t }\n\t // natural sorting through split numeric strings and default strings\n\t var oFxNcL, oFyNcL;\n\t for ( var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++ ) {\n\t oFxNcL = parseFloat(xN[cLoc]) || xN[cLoc];\n\t oFyNcL = parseFloat(yN[cLoc]) || yN[cLoc];\n\t if (oFxNcL < oFyNcL) { return -1; }\n\t else if (oFxNcL > oFyNcL) { return 1; }\n\t }\n\t return 0;\n\t}\n\t\n\treturn naturalSort;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n\n\n/***/ },\n/* 111 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery, _) {/*\n\t galaxy upload plugins - requires FormData and XMLHttpRequest\n\t*/\n\t;(function($){\n\t // add event properties\n\t jQuery.event.props.push(\"dataTransfer\");\n\t\n\t /**\n\t Posts file data to the API\n\t */\n\t $.uploadpost = function (config) {\n\t // parse options\n\t var cnf = $.extend({}, {\n\t data : {},\n\t success : function() {},\n\t error : function() {},\n\t progress : function() {},\n\t url : null,\n\t maxfilesize : 2048,\n\t error_filesize : 'File exceeds 2GB. Please use a FTP client.',\n\t error_default : 'Please make sure the file is available.',\n\t error_server : 'Upload request failed.',\n\t error_login : 'Uploads require you to log in.'\n\t }, config);\n\t\n\t // link data\n\t var data = cnf.data;\n\t\n\t // check errors\n\t if (data.error_message) {\n\t cnf.error(data.error_message);\n\t return;\n\t }\n\t\n\t // construct form data\n\t var form = new FormData();\n\t for (var key in data.payload) {\n\t form.append(key, data.payload[key]);\n\t }\n\t\n\t // add files to submission\n\t var sizes = 0;\n\t for (var key in data.files) {\n\t var d = data.files[key];\n\t form.append(d.name, d.file, d.file.name);\n\t sizes += d.file.size;\n\t }\n\t\n\t // check file size, unless it's an ftp file\n\t if (sizes > 1048576 * cnf.maxfilesize) {\n\t cnf.error(cnf.error_filesize);\n\t return;\n\t }\n\t\n\t // prepare request\n\t xhr = new XMLHttpRequest();\n\t xhr.open('POST', cnf.url, true);\n\t xhr.setRequestHeader('Accept', 'application/json');\n\t xhr.setRequestHeader('Cache-Control', 'no-cache');\n\t xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\n\t // captures state changes\n\t xhr.onreadystatechange = function() {\n\t // check for request completed, server connection closed\n\t if (xhr.readyState == xhr.DONE) {\n\t // parse response\n\t var response = null;\n\t if (xhr.responseText) {\n\t try {\n\t response = jQuery.parseJSON(xhr.responseText);\n\t } catch (e) {\n\t response = xhr.responseText;\n\t }\n\t }\n\t // pass any error to the error option\n\t if (xhr.status < 200 || xhr.status > 299) {\n\t var text = xhr.statusText;\n\t if (xhr.status == 403) {\n\t text = cnf.error_login;\n\t } else if (xhr.status == 0) {\n\t text = cnf.error_server;\n\t } else if (!text) {\n\t text = cnf.error_default;\n\t }\n\t cnf.error(text + ' (' + xhr.status + ')');\n\t } else {\n\t cnf.success(response);\n\t }\n\t }\n\t }\n\t\n\t // prepare upload progress\n\t xhr.upload.addEventListener('progress', function(e) {\n\t if (e.lengthComputable) {\n\t cnf.progress(Math.round((e.loaded * 100) / e.total));\n\t }\n\t }, false);\n\t\n\t // send request\n\t Galaxy.emit.debug('uploadbox::uploadpost()', 'Posting following data.', cnf);\n\t xhr.send(form);\n\t }\n\t\n\t /**\n\t Handles the upload events drag/drop etc.\n\t */\n\t $.fn.uploadinput = function(options) {\n\t // initialize\n\t var el = this;\n\t var opts = $.extend({}, {\n\t ondragover : function() {},\n\t ondragleave : function() {},\n\t onchange : function() {},\n\t multiple : false\n\t }, options);\n\t\n\t // append hidden upload field\n\t var $input = $('');\n\t el.append($input.change(function (e) {\n\t opts.onchange(e.target.files);\n\t $(this).val('');\n\t }));\n\t\n\t // drag/drop events\n\t el.on('drop', function (e) {\n\t opts.ondragleave(e);\n\t if(e.dataTransfer) {\n\t opts.onchange(e.dataTransfer.files);\n\t e.preventDefault();\n\t }\n\t });\n\t el.on('dragover', function (e) {\n\t e.preventDefault();\n\t opts.ondragover(e);\n\t });\n\t el.on('dragleave', function (e) {\n\t e.stopPropagation();\n\t opts.ondragleave(e);\n\t });\n\t\n\t // exports\n\t return {\n\t dialog: function () {\n\t $input.trigger('click');\n\t }\n\t }\n\t }\n\t\n\t /**\n\t Handles the upload queue and events such as drag/drop etc.\n\t */\n\t $.fn.uploadbox = function(options) {\n\t // parse options\n\t var opts = $.extend({}, {\n\t dragover : function() {},\n\t dragleave : function() {},\n\t announce : function(d) {},\n\t initialize : function(d) {},\n\t progress : function(d, m) {},\n\t success : function(d, m) {},\n\t error : function(d, m) { alert(m); },\n\t complete : function() {}\n\t }, options);\n\t\n\t // file queue\n\t var queue = {};\n\t\n\t // queue index/length counter\n\t var queue_index = 0;\n\t var queue_length = 0;\n\t\n\t // indicates if queue is currently running\n\t var queue_running = false;\n\t var queue_stop = false;\n\t\n\t // element\n\t var uploadinput = $(this).uploadinput({\n\t multiple : true,\n\t onchange : function(files) { add(files); },\n\t ondragover : options.ondragover,\n\t ondragleave : options.ondragleave\n\t });\n\t\n\t // add new files to upload queue\n\t function add(files) {\n\t if (files && files.length && !queue_running) {\n\t var current_index = queue_index;\n\t _.each(files, function(file, key) {\n\t if (file.mode !== 'new' && _.filter(queue, function(f) {\n\t return f.name === file.name && f.size === file.size;\n\t }).length) {\n\t file.duplicate = true;\n\t }\n\t });\n\t _.each(files, function(file) {\n\t if (!file.duplicate) {\n\t var index = String(queue_index++);\n\t queue[index] = file;\n\t opts.announce(index, queue[index]);\n\t queue_length++;\n\t }\n\t });\n\t return current_index;\n\t }\n\t }\n\t\n\t // remove file from queue\n\t function remove(index) {\n\t if (queue[index]) {\n\t delete queue[index];\n\t queue_length--;\n\t }\n\t }\n\t\n\t // process an upload, recursive\n\t function process() {\n\t // validate\n\t if (queue_length == 0 || queue_stop) {\n\t queue_stop = false;\n\t queue_running = false;\n\t opts.complete();\n\t return;\n\t } else {\n\t queue_running = true;\n\t }\n\t\n\t // get an identifier from the queue\n\t var index = -1;\n\t for (var key in queue) {\n\t index = key;\n\t break;\n\t }\n\t\n\t // get current file from queue\n\t var file = queue[index];\n\t\n\t // remove from queue\n\t remove(index)\n\t\n\t // create and submit data\n\t $.uploadpost({\n\t url : opts.url,\n\t data : opts.initialize(index),\n\t success : function(message) { opts.success(index, message); process();},\n\t error : function(message) { opts.error(index, message); process();},\n\t progress : function(percentage) { opts.progress(index, percentage); }\n\t });\n\t }\n\t\n\t /*\n\t public interface\n\t */\n\t\n\t // open file browser for selection\n\t function select() {\n\t uploadinput.dialog();\n\t }\n\t\n\t // remove all entries from queue\n\t function reset(index) {\n\t for (index in queue) {\n\t remove(index);\n\t }\n\t }\n\t\n\t // initiate upload process\n\t function start() {\n\t if (!queue_running) {\n\t queue_running = true;\n\t process();\n\t }\n\t }\n\t\n\t // stop upload process\n\t function stop() {\n\t queue_stop = true;\n\t }\n\t\n\t // set options\n\t function configure(options) {\n\t opts = $.extend({}, opts, options);\n\t return opts;\n\t }\n\t\n\t // verify browser compatibility\n\t function compatible() {\n\t return window.File && window.FormData && window.XMLHttpRequest && window.FileList;\n\t }\n\t\n\t // export functions\n\t return {\n\t 'select' : select,\n\t 'add' : add,\n\t 'remove' : remove,\n\t 'start' : start,\n\t 'stop' : stop,\n\t 'reset' : reset,\n\t 'configure' : configure,\n\t 'compatible' : compatible\n\t };\n\t }\n\t})(jQuery);\n\t\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 112 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar RightPanel = __webpack_require__( 13 ).RightPanel,\n\t Ui = __webpack_require__( 7 ),\n\t historyOptionsMenu = __webpack_require__( 133 );\n\t CurrentHistoryView = __webpack_require__( 130 ).CurrentHistoryView,\n\t _l = __webpack_require__( 5 );\n\t\n\t/** the right hand panel in the analysis page that shows the current history */\n\tvar HistoryPanel = RightPanel.extend({\n\t\n\t title : _l( 'History' ),\n\t\n\t initialize : function( options ){\n\t RightPanel.prototype.initialize.call( this, options );\n\t var self = this;\n\t\n\t // this button re-fetches the history and contents and re-renders the history panel\n\t this.refreshButton = new Ui.ButtonLink({\n\t id : 'history-refresh-button',\n\t title : _l( 'Refresh history' ),\n\t cls : 'panel-header-button',\n\t icon : 'fa fa-refresh',\n\t onclick : function() {\n\t self.historyView.loadCurrentHistory();\n\t }\n\t });\n\t // opens a drop down menu with history related functions (like view all, delete, share, etc.)\n\t this.optionsButton = new Ui.ButtonLink({\n\t id : 'history-options-button',\n\t title : _l( 'History options' ),\n\t cls : 'panel-header-button',\n\t icon : 'fa fa-cog',\n\t });\n\t // goes to a page showing all the users histories in panel form (for logged in users)\n\t this.viewMultiButton = null;\n\t if( !options.userIsAnonymous ){\n\t this.viewMultiButton = new Ui.ButtonLink({\n\t id : 'history-view-multi-button',\n\t title : _l( 'View all histories' ),\n\t cls : 'panel-header-button',\n\t icon : 'fa fa-columns',\n\t href : options.galaxyRoot + 'history/view_multiple'\n\t });\n\t }\n\t\n\t // build history options menu\n\t this.optionsMenu = historyOptionsMenu( this.optionsButton.$el, {\n\t anonymous : options.userIsAnonymous,\n\t purgeAllowed : options.allow_user_dataset_purge,\n\t root : options.galaxyRoot\n\t });\n\t\n\t // view of the current history\n\t this.historyView = new CurrentHistoryView({\n\t purgeAllowed : options.allow_user_dataset_purge,\n\t linkTarget : 'galaxy_main',\n\t $scrollContainer: function(){ return this.$el.parent(); }\n\t });\n\t },\n\t\n\t render : function(){\n\t RightPanel.prototype.render.call( this );\n\t this.$( '.unified-panel-header' ).addClass( 'history-panel-header' );\n\t this.$( '.panel-header-buttons' ).append([\n\t this.refreshButton.$el,\n\t this.optionsButton.$el,\n\t this.viewMultiButton? this.viewMultiButton.$el : null,\n\t ]);\n\t this.historyView\n\t .setElement( this.$( '.history-panel' ) );\n\t // causes blink/flash due to loadCurrentHistory rendering as well\n\t // .render();\n\t },\n\t\n\t _templateBody : function( data ){\n\t return [\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ].join('');\n\t },\n\t\n\t toString : function(){ return 'HistoryPanel'; }\n\t});\n\t\n\tmodule.exports = HistoryPanel;\n\n/***/ },\n/* 113 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function($, _) {var LeftPanel = __webpack_require__( 13 ).LeftPanel,\n\t Tools = __webpack_require__( 50 ),\n\t Upload = __webpack_require__( 139 ),\n\t _l = __webpack_require__( 5 );\n\t\n\t/* Builds the tool menu panel on the left of the analysis page */\n\tvar ToolPanel = LeftPanel.extend({\n\t\n\t title : _l( 'Tools' ),\n\t\n\t initialize: function( options ){\n\t LeftPanel.prototype.initialize.call( this, options );\n\t this.log( this + '.initialize:', options );\n\t\n\t /** @type {Object[]} descriptions of user's workflows to be shown in the tool menu */\n\t this.stored_workflow_menu_entries = options.stored_workflow_menu_entries || [];\n\t\n\t // create tool search, tool panel, and tool panel view.\n\t var tool_search = new Tools.ToolSearch({\n\t spinner_url : options.spinner_url,\n\t search_url : options.search_url,\n\t hidden : false\n\t });\n\t var tools = new Tools.ToolCollection( options.toolbox );\n\t this.tool_panel = new Tools.ToolPanel({\n\t tool_search : tool_search,\n\t tools : tools,\n\t layout : options.toolbox_in_panel\n\t });\n\t this.tool_panel_view = new Tools.ToolPanelView({ model: this.tool_panel });\n\t\n\t // add upload modal\n\t this.uploadButton = new Upload({\n\t nginx_upload_path : options.nginx_upload_path,\n\t ftp_upload_site : options.ftp_upload_site,\n\t default_genome : options.default_genome,\n\t default_extension : options.default_extension,\n\t });\n\t },\n\t\n\t render : function(){\n\t var self = this;\n\t LeftPanel.prototype.render.call( self );\n\t self.$( '.panel-header-buttons' ).append( self.uploadButton.$el );\n\t\n\t // if there are tools, render panel and display everything\n\t if (self.tool_panel.get( 'layout' ).size() > 0) {\n\t self.tool_panel_view.render();\n\t //TODO: why the hide/show?\n\t self.$( '.toolMenu' ).show();\n\t }\n\t self.$( '.toolMenuContainer' ).prepend( self.tool_panel_view.$el );\n\t\n\t self._renderWorkflowMenu();\n\t\n\t // if a tool link has the minsizehint attribute, handle it here (gen. by hiding the tool panel)\n\t self.$( 'a[minsizehint]' ).click( function() {\n\t if ( parent.handle_minwidth_hint ) {\n\t parent.handle_minwidth_hint( $( self ).attr( 'minsizehint' ) );\n\t }\n\t });\n\t },\n\t\n\t /** build the dom for the workflow portion of the tool menu */\n\t _renderWorkflowMenu : function(){\n\t var self = this;\n\t // add internal workflow list\n\t self.$( '#internal-workflows' ).append( self._templateTool({\n\t title : _l( 'All workflows' ),\n\t href : 'workflow/list_for_run'\n\t }));\n\t _.each( self.stored_workflow_menu_entries, function( menu_entry ){\n\t self.$( '#internal-workflows' ).append( self._templateTool({\n\t title : menu_entry.stored_workflow.name,\n\t href : 'workflow/run?id=' + menu_entry.encoded_stored_workflow_id\n\t }));\n\t });\n\t },\n\t\n\t /** build a link to one tool */\n\t _templateTool: function( tool ) {\n\t return [\n\t '
    ',\n\t // global\n\t '', tool.title, '',\n\t '
    '\n\t ].join('');\n\t },\n\t\n\t /** override to include inital menu dom and workflow section */\n\t _templateBody : function(){\n\t return [\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '', _l( 'Search did not match any tools.' ), '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '', _l( 'Workflows' ), '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ].join('');\n\t },\n\t\n\t toString : function(){ return 'ToolPanel'; }\n\t});\n\t\n\tmodule.exports = ToolPanel;\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 114 */,\n/* 115 */,\n/* 116 */,\n/* 117 */,\n/* 118 */,\n/* 119 */,\n/* 120 */,\n/* 121 */,\n/* 122 */,\n/* 123 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(34),\n\t __webpack_require__(94),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DC_LI, DATASET_LI_EDIT, BASE_MVC, _l ){\n\t/* global Backbone */\n\t//==============================================================================\n\tvar DCListItemView = DC_LI.DCListItemView;\n\t/** @class Edit view for DatasetCollection.\n\t */\n\tvar DCListItemEdit = DCListItemView.extend(\n\t/** @lends DCListItemEdit.prototype */{\n\t//TODO: may not be needed\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** override to add linkTarget */\n\t initialize : function( attributes ){\n\t DCListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DCListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\tvar DCEListItemView = DC_LI.DCEListItemView;\n\t/** @class Read only view for DatasetCollectionElement.\n\t */\n\tvar DCEListItemEdit = DCEListItemView.extend(\n\t/** @lends DCEListItemEdit.prototype */{\n\t//TODO: this might be expendable - compacted with HDAListItemView\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** set up */\n\t initialize : function( attributes ){\n\t DCEListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DCEListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t// NOTE: this does not inherit from DatasetDCEListItemView as you would expect\n\t//TODO: but should - if we can find something simpler than using diamond\n\t/** @class Editable view for a DatasetCollectionElement that is also an DatasetAssociation\n\t * (a dataset contained in a dataset collection).\n\t */\n\tvar DatasetDCEListItemEdit = DATASET_LI_EDIT.DatasetListItemEdit.extend(\n\t/** @lends DatasetDCEListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** set up */\n\t initialize : function( attributes ){\n\t DATASET_LI_EDIT.DatasetListItemEdit.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t // NOTE: this does not inherit from DatasetDCEListItemView - so we duplicate this here\n\t //TODO: fix\n\t /** In this override, only get details if in the ready state.\n\t * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n\t */\n\t _fetchModelDetails : function(){\n\t var view = this;\n\t if( view.model.inReadyState() && !view.model.hasDetails() ){\n\t return view.model.fetch({ silent: true });\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t /** Override to remove delete button */\n\t _renderDeleteButton : function(){\n\t return null;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DatasetDCEListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDatasetDCEListItemEdit.prototype.templates = (function(){\n\t\n\t return _.extend( {}, DATASET_LI_EDIT.DatasetListItemEdit.prototype.templates, {\n\t titleBar : DC_LI.DatasetDCEListItemView.prototype.templates.titleBar\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** @class Read only view for a DatasetCollectionElement that is also a DatasetCollection\n\t * (a nested DC).\n\t */\n\tvar NestedDCDCEListItemEdit = DC_LI.NestedDCDCEListItemView.extend(\n\t/** @lends NestedDCDCEListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t // comment this out to suppress log output\n\t //logger : console,\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'NestedDCDCEListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t DCListItemEdit : DCListItemEdit,\n\t DCEListItemEdit : DCEListItemEdit,\n\t DatasetDCEListItemEdit : DatasetDCEListItemEdit,\n\t NestedDCDCEListItemEdit : NestedDCDCEListItemEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 124 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(93),\n\t __webpack_require__(35),\n\t __webpack_require__(123),\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(19),\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DC_VIEW, DC_MODEL, DC_EDIT, BASE_MVC, _l ){\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\t/** @class editable View/Controller for a dataset collection.\n\t */\n\tvar _super = DC_VIEW.CollectionView;\n\tvar CollectionViewEdit = _super.extend(\n\t/** @lends CollectionView.prototype */{\n\t //MODEL is either a DatasetCollection (or subclass) or a DatasetCollectionElement (list of pairs)\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** sub view class used for datasets */\n\t DatasetDCEViewClass : DC_EDIT.DatasetDCEListItemEdit,\n\t /** sub view class used for nested collections */\n\t NestedDCDCEViewClass: DC_EDIT.NestedDCDCEListItemEdit,\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events\n\t * @param {Object} attributes optional settings for the panel\n\t */\n\t initialize : function( attributes ){\n\t _super.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t /** In this override, make the collection name editable\n\t */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t _super.prototype._setUpBehaviors.call( this, $where );\n\t if( !this.model ){ return; }\n\t\n\t // anon users shouldn't have access to any of the following\n\t if( !Galaxy.user || Galaxy.user.isAnonymous() ){\n\t return;\n\t }\n\t\n\t //TODO: extract\n\t var panel = this,\n\t nameSelector = '> .controls .name';\n\t $where.find( nameSelector )\n\t .attr( 'title', _l( 'Click to rename collection' ) )\n\t .tooltip({ placement: 'bottom' })\n\t .make_text_editable({\n\t on_finish: function( newName ){\n\t var previousName = panel.model.get( 'name' );\n\t if( newName && newName !== previousName ){\n\t panel.$el.find( nameSelector ).text( newName );\n\t panel.model.save({ name: newName })\n\t .fail( function(){\n\t panel.$el.find( nameSelector ).text( panel.model.previous( 'name' ) );\n\t });\n\t } else {\n\t panel.$el.find( nameSelector ).text( previousName );\n\t }\n\t }\n\t });\n\t },\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'CollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar ListCollectionViewEdit = CollectionViewEdit.extend(\n\t/** @lends ListCollectionView.prototype */{\n\t\n\t //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n\t /** sub view class used for datasets */\n\t DatasetDCEViewClass : DC_EDIT.DatasetDCEListItemEdit,\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'ListCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class Editable, read-only View/Controller for a dataset collection. */\n\tvar PairCollectionViewEdit = ListCollectionViewEdit.extend(\n\t/** @lends PairCollectionViewEdit.prototype */{\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'PairCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class Editable (roughly since these collections are immutable),\n\t * View/Controller for a dataset collection.\n\t */\n\tvar NestedPairCollectionViewEdit = PairCollectionViewEdit.extend(\n\t/** @lends NestedPairCollectionViewEdit.prototype */{\n\t\n\t /** Override to remove the editable text from the name/identifier - these collections are considered immutable */\n\t _setUpBehaviors : function( $where ){\n\t _super.prototype._setUpBehaviors.call( this, $where );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'NestedPairCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar ListOfPairsCollectionViewEdit = CollectionViewEdit.extend(\n\t/** @lends ListOfPairsCollectionView.prototype */{\n\t\n\t //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n\t /** sub view class used for nested collections */\n\t NestedDCDCEViewClass : DC_EDIT.NestedDCDCEListItemEdit.extend({\n\t foldoutPanelClass : NestedPairCollectionViewEdit\n\t }),\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'ListOfPairsCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t CollectionViewEdit : CollectionViewEdit,\n\t ListCollectionViewEdit : ListCollectionViewEdit,\n\t PairCollectionViewEdit : PairCollectionViewEdit,\n\t ListOfPairsCollectionViewEdit : ListOfPairsCollectionViewEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 125 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, jQuery, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(146),\n\t __webpack_require__(110),\n\t __webpack_require__(36),\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(107)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( levenshteinDistance, naturalSort, LIST_COLLECTION_CREATOR, baseMVC, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t/* ============================================================================\n\tTODO:\n\t\n\t\n\tPROGRAMMATICALLY:\n\tcurrPanel.once( 'rendered', function(){\n\t currPanel.showSelectors();\n\t currPanel.selectAll();\n\t _.last( currPanel.actionsPopup.options ).func();\n\t});\n\t\n\t============================================================================ */\n\t/** A view for paired datasets in the collections creator.\n\t */\n\tvar PairView = Backbone.View.extend( baseMVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t tagName : 'li',\n\t className : 'dataset paired',\n\t\n\t initialize : function( attributes ){\n\t this.pair = attributes.pair || {};\n\t },\n\t\n\t template : _.template([\n\t '<%- pair.forward.name %>',\n\t '',\n\t '<%- pair.name %>',\n\t '',\n\t '<%- pair.reverse.name %>'\n\t ].join('')),\n\t\n\t render : function(){\n\t this.$el\n\t .attr( 'draggable', true )\n\t .data( 'pair', this.pair )\n\t .html( this.template({ pair: this.pair }) )\n\t .addClass( 'flex-column-container' );\n\t return this;\n\t },\n\t\n\t events : {\n\t 'dragstart' : '_dragstart',\n\t 'dragend' : '_dragend',\n\t 'dragover' : '_sendToParent',\n\t 'drop' : '_sendToParent'\n\t },\n\t\n\t /** dragging pairs for re-ordering */\n\t _dragstart : function( ev ){\n\t ev.currentTarget.style.opacity = '0.4';\n\t if( ev.originalEvent ){ ev = ev.originalEvent; }\n\t\n\t ev.dataTransfer.effectAllowed = 'move';\n\t ev.dataTransfer.setData( 'text/plain', JSON.stringify( this.pair ) );\n\t\n\t this.$el.parent().trigger( 'pair.dragstart', [ this ] );\n\t },\n\t\n\t /** dragging pairs for re-ordering */\n\t _dragend : function( ev ){\n\t ev.currentTarget.style.opacity = '1.0';\n\t this.$el.parent().trigger( 'pair.dragend', [ this ] );\n\t },\n\t\n\t /** manually bubble up an event to the parent/container */\n\t _sendToParent : function( ev ){\n\t this.$el.parent().trigger( ev );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){\n\t return 'PairView(' + this.pair.name + ')';\n\t }\n\t});\n\t\n\t\n\t// ============================================================================\n\t/** returns an autopair function that uses the provided options.match function */\n\tfunction autoPairFnBuilder( options ){\n\t options = options || {};\n\t options.createPair = options.createPair || function _defaultCreatePair( params ){\n\t params = params || {};\n\t var a = params.listA.splice( params.indexA, 1 )[0],\n\t b = params.listB.splice( params.indexB, 1 )[0],\n\t aInBIndex = params.listB.indexOf( a ),\n\t bInAIndex = params.listA.indexOf( b );\n\t if( aInBIndex !== -1 ){ params.listB.splice( aInBIndex, 1 ); }\n\t if( bInAIndex !== -1 ){ params.listA.splice( bInAIndex, 1 ); }\n\t return this._pair( a, b, { silent: true });\n\t };\n\t // compile these here outside of the loop\n\t var _regexps = [];\n\t function getRegExps(){\n\t if( !_regexps.length ){\n\t _regexps = [\n\t new RegExp( this.filters[0] ),\n\t new RegExp( this.filters[1] )\n\t ];\n\t }\n\t return _regexps;\n\t }\n\t // mangle params as needed\n\t options.preprocessMatch = options.preprocessMatch || function _defaultPreprocessMatch( params ){\n\t var regexps = getRegExps.call( this );\n\t return _.extend( params, {\n\t matchTo : params.matchTo.name.replace( regexps[0], '' ),\n\t possible : params.possible.name.replace( regexps[1], '' )\n\t });\n\t };\n\t\n\t return function _strategy( params ){\n\t this.debug( 'autopair _strategy ---------------------------' );\n\t params = params || {};\n\t var listA = params.listA,\n\t listB = params.listB,\n\t indexA = 0, indexB,\n\t bestMatch = {\n\t score : 0.0,\n\t index : null\n\t },\n\t paired = [];\n\t //console.debug( 'params:', JSON.stringify( params, null, ' ' ) );\n\t this.debug( 'starting list lens:', listA.length, listB.length );\n\t this.debug( 'bestMatch (starting):', JSON.stringify( bestMatch, null, ' ' ) );\n\t\n\t while( indexA < listA.length ){\n\t var matchTo = listA[ indexA ];\n\t bestMatch.score = 0.0;\n\t\n\t for( indexB=0; indexB= scoreThreshold ){\n\t //console.debug( 'autoPairFnBuilder.strategy', listA[ indexA ].name, listB[ bestMatch.index ].name );\n\t paired.push( options.createPair.call( this, {\n\t listA : listA,\n\t indexA : indexA,\n\t listB : listB,\n\t indexB : bestMatch.index\n\t }));\n\t //console.debug( 'list lens now:', listA.length, listB.length );\n\t } else {\n\t indexA += 1;\n\t }\n\t if( !listA.length || !listB.length ){\n\t return paired;\n\t }\n\t }\n\t this.debug( 'paired:', JSON.stringify( paired, null, ' ' ) );\n\t this.debug( 'autopair _strategy ---------------------------' );\n\t return paired;\n\t };\n\t}\n\t\n\t\n\t// ============================================================================\n\t/** An interface for building collections of paired datasets.\n\t */\n\tvar PairedCollectionCreator = Backbone.View.extend( baseMVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t className: 'list-of-pairs-collection-creator collection-creator flex-row-container',\n\t\n\t /** set up initial options, instance vars, behaviors, and autopair (if set to do so) */\n\t initialize : function( attributes ){\n\t this.metric( 'PairedCollectionCreator.initialize', attributes );\n\t //this.debug( '-- PairedCollectionCreator:', attributes );\n\t\n\t attributes = _.defaults( attributes, {\n\t datasets : [],\n\t filters : this.DEFAULT_FILTERS,\n\t automaticallyPair : true,\n\t strategy : 'lcs',\n\t matchPercentage : 0.9,\n\t twoPassAutopairing : true\n\t });\n\t\n\t /** unordered, original list */\n\t this.initialList = attributes.datasets;\n\t\n\t /** is this from a history? if so, what's its id? */\n\t this.historyId = attributes.historyId;\n\t\n\t /** which filters should be used initially? (String[2] or name in commonFilters) */\n\t this.filters = this.commonFilters[ attributes.filters ] || this.commonFilters[ this.DEFAULT_FILTERS ];\n\t if( _.isArray( attributes.filters ) ){\n\t this.filters = attributes.filters;\n\t }\n\t\n\t /** try to auto pair the unpaired datasets on load? */\n\t this.automaticallyPair = attributes.automaticallyPair;\n\t\n\t /** what method to use for auto pairing (will be passed aggression level) */\n\t this.strategy = this.strategies[ attributes.strategy ] || this.strategies[ this.DEFAULT_STRATEGY ];\n\t if( _.isFunction( attributes.strategy ) ){\n\t this.strategy = attributes.strategy;\n\t }\n\t\n\t /** distance/mismatch level allowed for autopairing */\n\t this.matchPercentage = attributes.matchPercentage;\n\t\n\t /** try to autopair using simple first, then this.strategy on the remainder */\n\t this.twoPassAutopairing = attributes.twoPassAutopairing;\n\t\n\t /** remove file extensions (\\.*) from created pair names? */\n\t this.removeExtensions = true;\n\t //this.removeExtensions = false;\n\t\n\t /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n\t this.oncancel = attributes.oncancel;\n\t /** fn to call when the collection is created (scoped to this) */\n\t this.oncreate = attributes.oncreate;\n\t\n\t /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n\t this.autoscrollDist = attributes.autoscrollDist || 24;\n\t\n\t /** is the unpaired panel shown? */\n\t this.unpairedPanelHidden = false;\n\t /** is the paired panel shown? */\n\t this.pairedPanelHidden = false;\n\t\n\t /** DOM elements currently being dragged */\n\t this.$dragging = null;\n\t\n\t /** Used for blocking UI events during ajax/operations (don't post twice) */\n\t this.blocking = false;\n\t\n\t this._setUpBehaviors();\n\t this._dataSetUp();\n\t },\n\t\n\t /** map of common filter pairs by name */\n\t commonFilters : {\n\t illumina : [ '_1', '_2' ],\n\t Rs : [ '_R1', '_R2' ]\n\t },\n\t /** which commonFilter to use by default */\n\t DEFAULT_FILTERS : 'illumina',\n\t\n\t /** map of name->fn for autopairing */\n\t strategies : {\n\t 'simple' : 'autopairSimple',\n\t 'lcs' : 'autopairLCS',\n\t 'levenshtein' : 'autopairLevenshtein'\n\t },\n\t /** default autopair strategy name */\n\t DEFAULT_STRATEGY : 'lcs',\n\t\n\t // ------------------------------------------------------------------------ process raw list\n\t /** set up main data: cache initialList, sort, and autopair */\n\t _dataSetUp : function(){\n\t //this.debug( '-- _dataSetUp' );\n\t\n\t this.paired = [];\n\t this.unpaired = [];\n\t\n\t this.selectedIds = [];\n\t\n\t // sort initial list, add ids if needed, and save new working copy to unpaired\n\t this._sortInitialList();\n\t this._ensureIds();\n\t this.unpaired = this.initialList.slice( 0 );\n\t\n\t if( this.automaticallyPair ){\n\t this.autoPair();\n\t this.once( 'rendered:initial', function(){\n\t this.trigger( 'autopair' );\n\t });\n\t }\n\t },\n\t\n\t /** sort initial list */\n\t _sortInitialList : function(){\n\t //this.debug( '-- _sortInitialList' );\n\t this._sortDatasetList( this.initialList );\n\t },\n\t\n\t /** sort a list of datasets */\n\t _sortDatasetList : function( list ){\n\t // currently only natural sort by name\n\t list.sort( function( a, b ){ return naturalSort( a.name, b.name ); });\n\t return list;\n\t },\n\t\n\t /** add ids to dataset objs in initial list if none */\n\t _ensureIds : function(){\n\t this.initialList.forEach( function( dataset ){\n\t if( !dataset.hasOwnProperty( 'id' ) ){\n\t dataset.id = _.uniqueId();\n\t }\n\t });\n\t return this.initialList;\n\t },\n\t\n\t /** split initial list into two lists, those that pass forward filters & those passing reverse */\n\t _splitByFilters : function(){\n\t var regexFilters = this.filters.map( function( stringFilter ){\n\t return new RegExp( stringFilter );\n\t }),\n\t split = [ [], [] ];\n\t\n\t function _filter( unpaired, filter ){\n\t return filter.test( unpaired.name );\n\t //return dataset.name.indexOf( filter ) >= 0;\n\t }\n\t this.unpaired.forEach( function _filterEach( unpaired ){\n\t // 90% of the time this seems to work, but:\n\t //TODO: this treats *all* strings as regex which may confuse people - possibly check for // surrounding?\n\t // would need explanation in help as well\n\t regexFilters.forEach( function( filter, i ){\n\t if( _filter( unpaired, filter ) ){\n\t split[i].push( unpaired );\n\t }\n\t });\n\t });\n\t return split;\n\t },\n\t\n\t /** add a dataset to the unpaired list in it's proper order */\n\t _addToUnpaired : function( dataset ){\n\t // currently, unpaired is natural sorted by name, use binary search to find insertion point\n\t var binSearchSortedIndex = function( low, hi ){\n\t if( low === hi ){ return low; }\n\t\n\t var mid = Math.floor( ( hi - low ) / 2 ) + low,\n\t compared = naturalSort( dataset.name, this.unpaired[ mid ].name );\n\t\n\t if( compared < 0 ){\n\t return binSearchSortedIndex( low, mid );\n\t } else if( compared > 0 ){\n\t return binSearchSortedIndex( mid + 1, hi );\n\t }\n\t // walk the equal to find the last\n\t while( this.unpaired[ mid ] && this.unpaired[ mid ].name === dataset.name ){ mid++; }\n\t return mid;\n\t\n\t }.bind( this );\n\t\n\t this.unpaired.splice( binSearchSortedIndex( 0, this.unpaired.length ), 0, dataset );\n\t },\n\t\n\t // ------------------------------------------------------------------------ auto pairing\n\t /** two passes to automatically create pairs:\n\t * use both simpleAutoPair, then the fn mentioned in strategy\n\t */\n\t autoPair : function( strategy ){\n\t // split first using exact matching\n\t var split = this._splitByFilters(),\n\t paired = [];\n\t if( this.twoPassAutopairing ){\n\t paired = this.autopairSimple({\n\t listA : split[0],\n\t listB : split[1]\n\t });\n\t split = this._splitByFilters();\n\t }\n\t\n\t // uncomment to see printlns while running tests\n\t //this.debug = function(){ console.log.apply( console, arguments ); };\n\t\n\t // then try the remainder with something less strict\n\t strategy = strategy || this.strategy;\n\t split = this._splitByFilters();\n\t paired = paired.concat( this[ strategy ].call( this, {\n\t listA : split[0],\n\t listB : split[1]\n\t }));\n\t return paired;\n\t },\n\t\n\t /** autopair by exact match */\n\t autopairSimple : autoPairFnBuilder({\n\t scoreThreshold: function(){ return 1.0; },\n\t match : function _match( params ){\n\t params = params || {};\n\t if( params.matchTo === params.possible ){\n\t return {\n\t index: params.index,\n\t score: 1.0\n\t };\n\t }\n\t return params.bestMatch;\n\t }\n\t }),\n\t\n\t /** autopair by levenshtein edit distance scoring */\n\t autopairLevenshtein : autoPairFnBuilder({\n\t scoreThreshold: function(){ return this.matchPercentage; },\n\t match : function _matches( params ){\n\t params = params || {};\n\t var distance = levenshteinDistance( params.matchTo, params.possible ),\n\t score = 1.0 - ( distance / ( Math.max( params.matchTo.length, params.possible.length ) ) );\n\t if( score > params.bestMatch.score ){\n\t return {\n\t index: params.index,\n\t score: score\n\t };\n\t }\n\t return params.bestMatch;\n\t }\n\t }),\n\t\n\t /** autopair by longest common substrings scoring */\n\t autopairLCS : autoPairFnBuilder({\n\t scoreThreshold: function(){ return this.matchPercentage; },\n\t match : function _matches( params ){\n\t params = params || {};\n\t var match = this._naiveStartingAndEndingLCS( params.matchTo, params.possible ).length,\n\t score = match / ( Math.max( params.matchTo.length, params.possible.length ) );\n\t if( score > params.bestMatch.score ){\n\t return {\n\t index: params.index,\n\t score: score\n\t };\n\t }\n\t return params.bestMatch;\n\t }\n\t }),\n\t\n\t /** return the concat'd longest common prefix and suffix from two strings */\n\t _naiveStartingAndEndingLCS : function( s1, s2 ){\n\t var fwdLCS = '',\n\t revLCS = '',\n\t i = 0, j = 0;\n\t while( i < s1.length && i < s2.length ){\n\t if( s1[ i ] !== s2[ i ] ){\n\t break;\n\t }\n\t fwdLCS += s1[ i ];\n\t i += 1;\n\t }\n\t if( i === s1.length ){ return s1; }\n\t if( i === s2.length ){ return s2; }\n\t\n\t i = ( s1.length - 1 );\n\t j = ( s2.length - 1 );\n\t while( i >= 0 && j >= 0 ){\n\t if( s1[ i ] !== s2[ j ] ){\n\t break;\n\t }\n\t revLCS = [ s1[ i ], revLCS ].join( '' );\n\t i -= 1;\n\t j -= 1;\n\t }\n\t return fwdLCS + revLCS;\n\t },\n\t\n\t // ------------------------------------------------------------------------ pairing / unpairing\n\t /** create a pair from fwd and rev, removing them from unpaired, and placing the new pair in paired */\n\t _pair : function( fwd, rev, options ){\n\t options = options || {};\n\t this.debug( '_pair:', fwd, rev );\n\t var pair = this._createPair( fwd, rev, options.name );\n\t this.paired.push( pair );\n\t this.unpaired = _.without( this.unpaired, fwd, rev );\n\t if( !options.silent ){\n\t this.trigger( 'pair:new', pair );\n\t }\n\t return pair;\n\t },\n\t\n\t /** create a pair Object from fwd and rev, adding the name attribute (will guess if not given) */\n\t _createPair : function( fwd, rev, name ){\n\t // ensure existance and don't pair something with itself\n\t if( !( fwd && rev ) || ( fwd === rev ) ){\n\t throw new Error( 'Bad pairing: ' + [ JSON.stringify( fwd ), JSON.stringify( rev ) ] );\n\t }\n\t name = name || this._guessNameForPair( fwd, rev );\n\t return { forward : fwd, name : name, reverse : rev };\n\t },\n\t\n\t /** try to find a good pair name for the given fwd and rev datasets */\n\t _guessNameForPair : function( fwd, rev, removeExtensions ){\n\t removeExtensions = ( removeExtensions !== undefined )?( removeExtensions ):( this.removeExtensions );\n\t var fwdName = fwd.name,\n\t revName = rev.name,\n\t lcs = this._naiveStartingAndEndingLCS(\n\t fwdName.replace( new RegExp( this.filters[0] ), '' ),\n\t revName.replace( new RegExp( this.filters[1] ), '' )\n\t );\n\t if( removeExtensions ){\n\t var lastDotIndex = lcs.lastIndexOf( '.' );\n\t if( lastDotIndex > 0 ){\n\t var extension = lcs.slice( lastDotIndex, lcs.length );\n\t lcs = lcs.replace( extension, '' );\n\t fwdName = fwdName.replace( extension, '' );\n\t revName = revName.replace( extension, '' );\n\t }\n\t }\n\t return lcs || ( fwdName + ' & ' + revName );\n\t },\n\t\n\t /** unpair a pair, removing it from paired, and adding the fwd,rev datasets back into unpaired */\n\t _unpair : function( pair, options ){\n\t options = options || {};\n\t if( !pair ){\n\t throw new Error( 'Bad pair: ' + JSON.stringify( pair ) );\n\t }\n\t this.paired = _.without( this.paired, pair );\n\t this._addToUnpaired( pair.forward );\n\t this._addToUnpaired( pair.reverse );\n\t\n\t if( !options.silent ){\n\t this.trigger( 'pair:unpair', [ pair ] );\n\t }\n\t return pair;\n\t },\n\t\n\t /** unpair all paired datasets */\n\t unpairAll : function(){\n\t var pairs = [];\n\t while( this.paired.length ){\n\t pairs.push( this._unpair( this.paired[ 0 ], { silent: true }) );\n\t }\n\t this.trigger( 'pair:unpair', pairs );\n\t },\n\t\n\t // ------------------------------------------------------------------------ API\n\t /** convert a pair into JSON compatible with the collections API */\n\t _pairToJSON : function( pair, src ){\n\t src = src || 'hda';\n\t //TODO: consider making this the pair structure when created instead\n\t return {\n\t collection_type : 'paired',\n\t src : 'new_collection',\n\t name : pair.name,\n\t element_identifiers : [{\n\t name : 'forward',\n\t id : pair.forward.id,\n\t src : src\n\t }, {\n\t name : 'reverse',\n\t id : pair.reverse.id,\n\t src : src\n\t }]\n\t };\n\t },\n\t\n\t /** create the collection via the API\n\t * @returns {jQuery.xhr Object} the jquery ajax request\n\t */\n\t createList : function( name ){\n\t var creator = this,\n\t url = Galaxy.root + 'api/histories/' + this.historyId + '/contents/dataset_collections';\n\t\n\t //TODO: use ListPairedCollection.create()\n\t var ajaxData = {\n\t type : 'dataset_collection',\n\t collection_type : 'list:paired',\n\t name : _.escape( name || creator.$( '.collection-name' ).val() ),\n\t element_identifiers : creator.paired.map( function( pair ){\n\t return creator._pairToJSON( pair );\n\t })\n\t\n\t };\n\t //this.debug( JSON.stringify( ajaxData ) );\n\t creator.blocking = true;\n\t return jQuery.ajax( url, {\n\t type : 'POST',\n\t contentType : 'application/json',\n\t dataType : 'json',\n\t data : JSON.stringify( ajaxData )\n\t })\n\t .always( function(){\n\t creator.blocking = false;\n\t })\n\t .fail( function( xhr, status, message ){\n\t creator._ajaxErrHandler( xhr, status, message );\n\t })\n\t .done( function( response, message, xhr ){\n\t //this.info( 'ok', response, message, xhr );\n\t creator.trigger( 'collection:created', response, message, xhr );\n\t creator.metric( 'collection:created', response );\n\t if( typeof creator.oncreate === 'function' ){\n\t creator.oncreate.call( this, response, message, xhr );\n\t }\n\t });\n\t },\n\t\n\t /** handle ajax errors with feedback and details to the user (if available) */\n\t _ajaxErrHandler : function( xhr, status, message ){\n\t this.error( xhr, status, message );\n\t var content = _l( 'An error occurred while creating this collection' );\n\t if( xhr ){\n\t if( xhr.readyState === 0 && xhr.status === 0 ){\n\t content += ': ' + _l( 'Galaxy could not be reached and may be updating.' )\n\t + _l( ' Try again in a few minutes.' );\n\t } else if( xhr.responseJSON ){\n\t content += '
    ' + JSON.stringify( xhr.responseJSON ) + '
    ';\n\t } else {\n\t content += ': ' + message;\n\t }\n\t }\n\t creator._showAlert( content, 'alert-danger' );\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering\n\t /** render the entire interface */\n\t render : function( speed, callback ){\n\t //this.debug( '-- _render' );\n\t //this.$el.empty().html( PairedCollectionCreator.templates.main() );\n\t this.$el.empty().html( PairedCollectionCreator.templates.main() );\n\t this._renderHeader( speed );\n\t this._renderMiddle( speed );\n\t this._renderFooter( speed );\n\t this._addPluginComponents();\n\t this.trigger( 'rendered', this );\n\t return this;\n\t },\n\t\n\t /** render the header section */\n\t _renderHeader : function( speed, callback ){\n\t //this.debug( '-- _renderHeader' );\n\t var $header = this.$( '.header' ).empty().html( PairedCollectionCreator.templates.header() )\n\t .find( '.help-content' ).prepend( $( PairedCollectionCreator.templates.helpContent() ) );\n\t\n\t this._renderFilters();\n\t return $header;\n\t },\n\t /** fill the filter inputs with the filter values */\n\t _renderFilters : function(){\n\t return this.$( '.forward-column .column-header input' ).val( this.filters[0] )\n\t .add( this.$( '.reverse-column .column-header input' ).val( this.filters[1] ) );\n\t },\n\t\n\t /** render the middle including unpaired and paired sections (which may be hidden) */\n\t _renderMiddle : function( speed, callback ){\n\t var $middle = this.$( '.middle' ).empty().html( PairedCollectionCreator.templates.middle() );\n\t\n\t // (re-) hide the un/paired panels based on instance vars\n\t if( this.unpairedPanelHidden ){\n\t this.$( '.unpaired-columns' ).hide();\n\t } else if( this.pairedPanelHidden ){\n\t this.$( '.paired-columns' ).hide();\n\t }\n\t\n\t this._renderUnpaired();\n\t this._renderPaired();\n\t return $middle;\n\t },\n\t /** render the unpaired section, showing datasets accrd. to filters, update the unpaired counts */\n\t _renderUnpaired : function( speed, callback ){\n\t //this.debug( '-- _renderUnpaired' );\n\t var creator = this,\n\t $fwd, $rev, $prd = [],\n\t split = this._splitByFilters();\n\t // update unpaired counts\n\t this.$( '.forward-column .title' )\n\t .text([ split[0].length, _l( 'unpaired forward' ) ].join( ' ' ));\n\t this.$( '.forward-column .unpaired-info' )\n\t .text( this._renderUnpairedDisplayStr( this.unpaired.length - split[0].length ) );\n\t this.$( '.reverse-column .title' )\n\t .text([ split[1].length, _l( 'unpaired reverse' ) ].join( ' ' ));\n\t this.$( '.reverse-column .unpaired-info' )\n\t .text( this._renderUnpairedDisplayStr( this.unpaired.length - split[1].length ) );\n\t\n\t this.$( '.unpaired-columns .column-datasets' ).empty();\n\t\n\t // show/hide the auto pair button if any unpaired are left\n\t this.$( '.autopair-link' ).toggle( this.unpaired.length !== 0 );\n\t if( this.unpaired.length === 0 ){\n\t this._renderUnpairedEmpty();\n\t return;\n\t }\n\t\n\t // create the dataset dom arrays\n\t $rev = split[1].map( function( dataset, i ){\n\t // if there'll be a fwd dataset across the way, add a button to pair the row\n\t if( ( split[0][ i ] !== undefined )\n\t && ( split[0][ i ] !== dataset ) ){\n\t $prd.push( creator._renderPairButton() );\n\t }\n\t return creator._renderUnpairedDataset( dataset );\n\t });\n\t $fwd = split[0].map( function( dataset ){\n\t return creator._renderUnpairedDataset( dataset );\n\t });\n\t\n\t if( !$fwd.length && !$rev.length ){\n\t this._renderUnpairedNotShown();\n\t return;\n\t }\n\t // add to appropo cols\n\t //TODO: not the best way to render - consider rendering the entire unpaired-columns section in a fragment\n\t // and swapping out that\n\t this.$( '.unpaired-columns .forward-column .column-datasets' ).append( $fwd )\n\t .add( this.$( '.unpaired-columns .paired-column .column-datasets' ).append( $prd ) )\n\t .add( this.$( '.unpaired-columns .reverse-column .column-datasets' ).append( $rev ) );\n\t this._adjUnpairedOnScrollbar();\n\t },\n\t /** return a string to display the count of filtered out datasets */\n\t _renderUnpairedDisplayStr : function( numFiltered ){\n\t return [ '(', numFiltered, ' ', _l( 'filtered out' ), ')' ].join('');\n\t },\n\t /** return an unattached jQuery DOM element to represent an unpaired dataset */\n\t _renderUnpairedDataset : function( dataset ){\n\t //TODO: to underscore template\n\t return $( '
  • ')\n\t .attr( 'id', 'dataset-' + dataset.id )\n\t .addClass( 'dataset unpaired' )\n\t .attr( 'draggable', true )\n\t .addClass( dataset.selected? 'selected': '' )\n\t .append( $( '' ).addClass( 'dataset-name' ).text( dataset.name ) )\n\t //??\n\t .data( 'dataset', dataset );\n\t },\n\t /** render the button that may go between unpaired datasets, allowing the user to pair a row */\n\t _renderPairButton : function(){\n\t //TODO: *not* a dataset - don't pretend like it is\n\t return $( '
  • ').addClass( 'dataset unpaired' )\n\t .append( $( '' ).addClass( 'dataset-name' ).text( _l( 'Pair these datasets' ) ) );\n\t },\n\t /** a message to display when no unpaired left */\n\t _renderUnpairedEmpty : function(){\n\t //this.debug( '-- renderUnpairedEmpty' );\n\t var $msg = $( '
    ' )\n\t .text( '(' + _l( 'no remaining unpaired datasets' ) + ')' );\n\t this.$( '.unpaired-columns .paired-column .column-datasets' ).empty().prepend( $msg );\n\t return $msg;\n\t },\n\t /** a message to display when no unpaired can be shown with the current filters */\n\t _renderUnpairedNotShown : function(){\n\t //this.debug( '-- renderUnpairedEmpty' );\n\t var $msg = $( '
    ' )\n\t .text( '(' + _l( 'no datasets were found matching the current filters' ) + ')' );\n\t this.$( '.unpaired-columns .paired-column .column-datasets' ).empty().prepend( $msg );\n\t return $msg;\n\t },\n\t /** try to detect if the unpaired section has a scrollbar and adjust left column for better centering of all */\n\t _adjUnpairedOnScrollbar : function(){\n\t var $unpairedColumns = this.$( '.unpaired-columns' ).last(),\n\t $firstDataset = this.$( '.unpaired-columns .reverse-column .dataset' ).first();\n\t if( !$firstDataset.size() ){ return; }\n\t var ucRight = $unpairedColumns.offset().left + $unpairedColumns.outerWidth(),\n\t dsRight = $firstDataset.offset().left + $firstDataset.outerWidth(),\n\t rightDiff = Math.floor( ucRight ) - Math.floor( dsRight );\n\t //this.debug( 'rightDiff:', ucRight, '-', dsRight, '=', rightDiff );\n\t this.$( '.unpaired-columns .forward-column' )\n\t .css( 'margin-left', ( rightDiff > 0 )? rightDiff: 0 );\n\t },\n\t\n\t /** render the paired section and update counts of paired datasets */\n\t _renderPaired : function( speed, callback ){\n\t //this.debug( '-- _renderPaired' );\n\t this.$( '.paired-column-title .title' ).text([ this.paired.length, _l( 'paired' ) ].join( ' ' ) );\n\t // show/hide the unpair all link\n\t this.$( '.unpair-all-link' ).toggle( this.paired.length !== 0 );\n\t if( this.paired.length === 0 ){\n\t this._renderPairedEmpty();\n\t return;\n\t //TODO: would be best to return here (the $columns)\n\t } else {\n\t // show/hide 'remove extensions link' when any paired and they seem to have extensions\n\t this.$( '.remove-extensions-link' ).show();\n\t }\n\t\n\t this.$( '.paired-columns .column-datasets' ).empty();\n\t var creator = this;\n\t this.paired.forEach( function( pair, i ){\n\t //TODO: cache these?\n\t var pairView = new PairView({ pair: pair });\n\t creator.$( '.paired-columns .column-datasets' )\n\t .append( pairView.render().$el )\n\t .append([\n\t ''\n\t ].join( '' ));\n\t });\n\t },\n\t /** a message to display when none paired */\n\t _renderPairedEmpty : function(){\n\t var $msg = $( '
    ' )\n\t .text( '(' + _l( 'no paired datasets yet' ) + ')' );\n\t this.$( '.paired-columns .column-datasets' ).empty().prepend( $msg );\n\t return $msg;\n\t },\n\t\n\t /** render the footer, completion controls, and cancel controls */\n\t _renderFooter : function( speed, callback ){\n\t var $footer = this.$( '.footer' ).empty().html( PairedCollectionCreator.templates.footer() );\n\t this.$( '.remove-extensions' ).prop( 'checked', this.removeExtensions );\n\t if( typeof this.oncancel === 'function' ){\n\t this.$( '.cancel-create.btn' ).show();\n\t }\n\t return $footer;\n\t },\n\t\n\t /** add any jQuery/bootstrap/custom plugins to elements rendered */\n\t _addPluginComponents : function(){\n\t this._chooseFiltersPopover( '.choose-filters-link' );\n\t this.$( '.help-content i' ).hoverhighlight( '.collection-creator', 'rgba( 64, 255, 255, 1.0 )' );\n\t },\n\t\n\t /** build a filter selection popover allowing selection of common filter pairs */\n\t _chooseFiltersPopover : function( selector ){\n\t function filterChoice( val1, val2 ){\n\t return [\n\t ''\n\t ].join('');\n\t }\n\t var $popoverContent = $( _.template([\n\t '
    ',\n\t '
    ',\n\t _l( 'Choose from the following filters to change which unpaired reads are shown in the display' ),\n\t ':
    ',\n\t _.values( this.commonFilters ).map( function( filterSet ){\n\t return filterChoice( filterSet[0], filterSet[1] );\n\t }).join( '' ),\n\t '
    '\n\t ].join(''))({}));\n\t\n\t return this.$( selector ).popover({\n\t container : '.collection-creator',\n\t placement : 'bottom',\n\t html : true,\n\t //animation : false,\n\t content : $popoverContent\n\t });\n\t },\n\t\n\t /** add (or clear if clear is truthy) a validation warning to what */\n\t _validationWarning : function( what, clear ){\n\t var VALIDATION_CLASS = 'validation-warning';\n\t if( what === 'name' ){\n\t what = this.$( '.collection-name' ).add( this.$( '.collection-name-prompt' ) );\n\t this.$( '.collection-name' ).focus().select();\n\t }\n\t if( clear ){\n\t what = what || this.$( '.' + VALIDATION_CLASS );\n\t what.removeClass( VALIDATION_CLASS );\n\t } else {\n\t what.addClass( VALIDATION_CLASS );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ events\n\t /** set up event handlers on self */\n\t _setUpBehaviors : function(){\n\t this.once( 'rendered', function(){\n\t this.trigger( 'rendered:initial', this );\n\t });\n\t\n\t this.on( 'pair:new', function(){\n\t //TODO: ideally only re-render the columns (or even elements) involved\n\t this._renderUnpaired();\n\t this._renderPaired();\n\t\n\t // scroll to bottom where new pairs are added\n\t //TODO: this doesn't seem to work - innerHeight sticks at 133...\n\t // may have to do with improper flex columns\n\t //var $pairedView = this.$( '.paired-columns' );\n\t //$pairedView.scrollTop( $pairedView.innerHeight() );\n\t //this.debug( $pairedView.height() )\n\t this.$( '.paired-columns' ).scrollTop( 8000000 );\n\t });\n\t this.on( 'pair:unpair', function( pairs ){\n\t //TODO: ideally only re-render the columns (or even elements) involved\n\t this._renderUnpaired();\n\t this._renderPaired();\n\t this.splitView();\n\t });\n\t\n\t this.on( 'filter-change', function(){\n\t this.filters = [\n\t this.$( '.forward-unpaired-filter input' ).val(),\n\t this.$( '.reverse-unpaired-filter input' ).val()\n\t ];\n\t this.metric( 'filter-change', this.filters );\n\t this._renderFilters();\n\t this._renderUnpaired();\n\t });\n\t\n\t this.on( 'autopair', function(){\n\t this._renderUnpaired();\n\t this._renderPaired();\n\t\n\t var message, msgClass = null;\n\t if( this.paired.length ){\n\t msgClass = 'alert-success';\n\t message = this.paired.length + ' ' + _l( 'pairs created' );\n\t if( !this.unpaired.length ){\n\t message += ': ' + _l( 'all datasets have been successfully paired' );\n\t this.hideUnpaired();\n\t this.$( '.collection-name' ).focus();\n\t }\n\t } else {\n\t message = _l([\n\t 'Could not automatically create any pairs from the given dataset names.',\n\t 'You may want to choose or enter different filters and try auto-pairing again.',\n\t 'Close this message using the X on the right to view more help.'\n\t ].join( ' ' ));\n\t }\n\t this._showAlert( message, msgClass );\n\t });\n\t\n\t //this.on( 'all', function(){\n\t // this.info( arguments );\n\t //});\n\t return this;\n\t },\n\t\n\t events : {\n\t // header\n\t 'click .more-help' : '_clickMoreHelp',\n\t 'click .less-help' : '_clickLessHelp',\n\t 'click .header .alert button' : '_hideAlert',\n\t 'click .forward-column .column-title' : '_clickShowOnlyUnpaired',\n\t 'click .reverse-column .column-title' : '_clickShowOnlyUnpaired',\n\t 'click .unpair-all-link' : '_clickUnpairAll',\n\t //TODO: this seems kinda backasswards - re-sending jq event as a backbone event, can we listen directly?\n\t 'change .forward-unpaired-filter input' : function( ev ){ this.trigger( 'filter-change' ); },\n\t 'focus .forward-unpaired-filter input' : function( ev ){ $( ev.currentTarget ).select(); },\n\t 'click .autopair-link' : '_clickAutopair',\n\t 'click .choose-filters .filter-choice' : '_clickFilterChoice',\n\t 'click .clear-filters-link' : '_clearFilters',\n\t 'change .reverse-unpaired-filter input' : function( ev ){ this.trigger( 'filter-change' ); },\n\t 'focus .reverse-unpaired-filter input' : function( ev ){ $( ev.currentTarget ).select(); },\n\t // unpaired\n\t 'click .forward-column .dataset.unpaired' : '_clickUnpairedDataset',\n\t 'click .reverse-column .dataset.unpaired' : '_clickUnpairedDataset',\n\t 'click .paired-column .dataset.unpaired' : '_clickPairRow',\n\t 'click .unpaired-columns' : 'clearSelectedUnpaired',\n\t 'mousedown .unpaired-columns .dataset' : '_mousedownUnpaired',\n\t // divider\n\t 'click .paired-column-title' : '_clickShowOnlyPaired',\n\t 'mousedown .flexible-partition-drag' : '_startPartitionDrag',\n\t // paired\n\t 'click .paired-columns .dataset.paired' : 'selectPair',\n\t 'click .paired-columns' : 'clearSelectedPaired',\n\t 'click .paired-columns .pair-name' : '_clickPairName',\n\t 'click .unpair-btn' : '_clickUnpair',\n\t // paired - drop target\n\t //'dragenter .paired-columns' : '_dragenterPairedColumns',\n\t //'dragleave .paired-columns .column-datasets': '_dragleavePairedColumns',\n\t 'dragover .paired-columns .column-datasets' : '_dragoverPairedColumns',\n\t 'drop .paired-columns .column-datasets' : '_dropPairedColumns',\n\t\n\t 'pair.dragstart .paired-columns .column-datasets' : '_pairDragstart',\n\t 'pair.dragend .paired-columns .column-datasets' : '_pairDragend',\n\t\n\t // footer\n\t 'change .remove-extensions' : function( ev ){ this.toggleExtensions(); },\n\t 'change .collection-name' : '_changeName',\n\t 'keydown .collection-name' : '_nameCheckForEnter',\n\t 'click .cancel-create' : function( ev ){\n\t if( typeof this.oncancel === 'function' ){\n\t this.oncancel.call( this );\n\t }\n\t },\n\t 'click .create-collection' : '_clickCreate'//,\n\t },\n\t\n\t // ........................................................................ header\n\t /** expand help */\n\t _clickMoreHelp : function( ev ){\n\t this.$( '.main-help' ).addClass( 'expanded' );\n\t this.$( '.more-help' ).hide();\n\t },\n\t /** collapse help */\n\t _clickLessHelp : function( ev ){\n\t this.$( '.main-help' ).removeClass( 'expanded' );\n\t this.$( '.more-help' ).show();\n\t },\n\t\n\t /** show an alert on the top of the interface containing message (alertClass is bootstrap's alert-*)*/\n\t _showAlert : function( message, alertClass ){\n\t alertClass = alertClass || 'alert-danger';\n\t this.$( '.main-help' ).hide();\n\t this.$( '.header .alert' ).attr( 'class', 'alert alert-dismissable' ).addClass( alertClass ).show()\n\t .find( '.alert-message' ).html( message );\n\t },\n\t /** hide the alerts at the top */\n\t _hideAlert : function( message ){\n\t this.$( '.main-help' ).show();\n\t this.$( '.header .alert' ).hide();\n\t },\n\t\n\t /** toggle between showing only unpaired and split view */\n\t _clickShowOnlyUnpaired : function( ev ){\n\t //this.debug( 'click unpaired', ev.currentTarget );\n\t if( this.$( '.paired-columns' ).is( ':visible' ) ){\n\t this.hidePaired();\n\t } else {\n\t this.splitView();\n\t }\n\t },\n\t /** toggle between showing only paired and split view */\n\t _clickShowOnlyPaired : function( ev ){\n\t //this.debug( 'click paired' );\n\t if( this.$( '.unpaired-columns' ).is( ':visible' ) ){\n\t this.hideUnpaired();\n\t } else {\n\t this.splitView();\n\t }\n\t },\n\t\n\t /** hide unpaired, show paired */\n\t hideUnpaired : function( speed, callback ){\n\t this.unpairedPanelHidden = true;\n\t this.pairedPanelHidden = false;\n\t this._renderMiddle( speed, callback );\n\t },\n\t /** hide paired, show unpaired */\n\t hidePaired : function( speed, callback ){\n\t this.unpairedPanelHidden = false;\n\t this.pairedPanelHidden = true;\n\t this._renderMiddle( speed, callback );\n\t },\n\t /** show both paired and unpaired (splitting evenly) */\n\t splitView : function( speed, callback ){\n\t this.unpairedPanelHidden = this.pairedPanelHidden = false;\n\t this._renderMiddle( speed, callback );\n\t return this;\n\t },\n\t\n\t /** unpair all paired and do other super neat stuff which I'm not really sure about yet... */\n\t _clickUnpairAll : function( ev ){\n\t this.metric( 'unpairAll' );\n\t this.unpairAll();\n\t },\n\t\n\t /** attempt to autopair */\n\t _clickAutopair : function( ev ){\n\t var paired = this.autoPair();\n\t this.metric( 'autopair', paired.length, this.unpaired.length );\n\t this.trigger( 'autopair' );\n\t },\n\t\n\t /** set the filters based on the data attributes of the button click target */\n\t _clickFilterChoice : function( ev ){\n\t var $selected = $( ev.currentTarget );\n\t this.$( '.forward-unpaired-filter input' ).val( $selected.data( 'forward' ) );\n\t this.$( '.reverse-unpaired-filter input' ).val( $selected.data( 'reverse' ) );\n\t this._hideChooseFilters();\n\t this.trigger( 'filter-change' );\n\t },\n\t\n\t /** hide the choose filters popover */\n\t _hideChooseFilters : function(){\n\t //TODO: update bootstrap and remove the following hack\n\t // see also: https://github.com/twbs/bootstrap/issues/10260\n\t this.$( '.choose-filters-link' ).popover( 'hide' );\n\t this.$( '.popover' ).css( 'display', 'none' );\n\t },\n\t\n\t /** clear both filters */\n\t _clearFilters : function( ev ){\n\t this.$( '.forward-unpaired-filter input' ).val( '' );\n\t this.$( '.reverse-unpaired-filter input' ).val( '' );\n\t this.trigger( 'filter-change' );\n\t },\n\t\n\t // ........................................................................ unpaired\n\t /** select an unpaired dataset */\n\t _clickUnpairedDataset : function( ev ){\n\t ev.stopPropagation();\n\t return this.toggleSelectUnpaired( $( ev.currentTarget ) );\n\t },\n\t\n\t /** Toggle the selection of an unpaired dataset representation.\n\t * @param [jQuery] $dataset the unpaired dataset dom rep to select\n\t * @param [Boolean] options.force if defined, force selection based on T/F; otherwise, toggle\n\t */\n\t toggleSelectUnpaired : function( $dataset, options ){\n\t options = options || {};\n\t var dataset = $dataset.data( 'dataset' ),\n\t select = options.force !== undefined? options.force: !$dataset.hasClass( 'selected' );\n\t //this.debug( id, options.force, $dataset, dataset );\n\t if( !$dataset.size() || dataset === undefined ){ return $dataset; }\n\t\n\t if( select ){\n\t $dataset.addClass( 'selected' );\n\t if( !options.waitToPair ){\n\t this.pairAllSelected();\n\t }\n\t\n\t } else {\n\t $dataset.removeClass( 'selected' );\n\t //delete dataset.selected;\n\t }\n\t return $dataset;\n\t },\n\t\n\t /** pair all the currently selected unpaired datasets */\n\t pairAllSelected : function( options ){\n\t options = options || {};\n\t var creator = this,\n\t fwds = [],\n\t revs = [],\n\t pairs = [];\n\t creator.$( '.unpaired-columns .forward-column .dataset.selected' ).each( function(){\n\t fwds.push( $( this ).data( 'dataset' ) );\n\t });\n\t creator.$( '.unpaired-columns .reverse-column .dataset.selected' ).each( function(){\n\t revs.push( $( this ).data( 'dataset' ) );\n\t });\n\t fwds.length = revs.length = Math.min( fwds.length, revs.length );\n\t //this.debug( fwds );\n\t //this.debug( revs );\n\t fwds.forEach( function( fwd, i ){\n\t try {\n\t pairs.push( creator._pair( fwd, revs[i], { silent: true }) );\n\t\n\t } catch( err ){\n\t //TODO: preserve selected state of those that couldn't be paired\n\t //TODO: warn that some could not be paired\n\t creator.error( err );\n\t }\n\t });\n\t if( pairs.length && !options.silent ){\n\t this.trigger( 'pair:new', pairs );\n\t }\n\t return pairs;\n\t },\n\t\n\t /** clear the selection on all unpaired datasets */\n\t clearSelectedUnpaired : function(){\n\t this.$( '.unpaired-columns .dataset.selected' ).removeClass( 'selected' );\n\t },\n\t\n\t /** when holding down the shift key on a click, 'paint' the moused over datasets as selected */\n\t _mousedownUnpaired : function( ev ){\n\t if( ev.shiftKey ){\n\t var creator = this,\n\t $startTarget = $( ev.target ).addClass( 'selected' ),\n\t moveListener = function( ev ){\n\t creator.$( ev.target ).filter( '.dataset' ).addClass( 'selected' );\n\t };\n\t $startTarget.parent().on( 'mousemove', moveListener );\n\t\n\t // on any mouseup, stop listening to the move and try to pair any selected\n\t $( document ).one( 'mouseup', function( ev ){\n\t $startTarget.parent().off( 'mousemove', moveListener );\n\t creator.pairAllSelected();\n\t });\n\t }\n\t },\n\t\n\t /** attempt to pair two datasets directly across from one another */\n\t _clickPairRow : function( ev ){\n\t //if( !ev.currentTarget ){ return true; }\n\t var rowIndex = $( ev.currentTarget ).index(),\n\t fwd = $( '.unpaired-columns .forward-column .dataset' ).eq( rowIndex ).data( 'dataset' ),\n\t rev = $( '.unpaired-columns .reverse-column .dataset' ).eq( rowIndex ).data( 'dataset' );\n\t //this.debug( 'row:', rowIndex, fwd, rev );\n\t this._pair( fwd, rev );\n\t },\n\t\n\t // ........................................................................ divider/partition\n\t /** start dragging the visible divider/partition between unpaired and paired panes */\n\t _startPartitionDrag : function( ev ){\n\t var creator = this,\n\t startingY = ev.pageY;\n\t //this.debug( 'partition drag START:', ev );\n\t $( 'body' ).css( 'cursor', 'ns-resize' );\n\t creator.$( '.flexible-partition-drag' ).css( 'color', 'black' );\n\t\n\t function endDrag( ev ){\n\t //creator.debug( 'partition drag STOP:', ev );\n\t // doing this by an added class didn't really work well - kept flashing still\n\t creator.$( '.flexible-partition-drag' ).css( 'color', '' );\n\t $( 'body' ).css( 'cursor', '' ).unbind( 'mousemove', trackMouse );\n\t }\n\t function trackMouse( ev ){\n\t var offset = ev.pageY - startingY;\n\t //creator.debug( 'partition:', startingY, offset );\n\t if( !creator.adjPartition( offset ) ){\n\t //creator.debug( 'mouseup triggered' );\n\t $( 'body' ).trigger( 'mouseup' );\n\t }\n\t creator._adjUnpairedOnScrollbar();\n\t startingY += offset;\n\t }\n\t $( 'body' ).mousemove( trackMouse );\n\t $( 'body' ).one( 'mouseup', endDrag );\n\t },\n\t\n\t /** adjust the parition up/down +/-adj pixels */\n\t adjPartition : function( adj ){\n\t var $unpaired = this.$( '.unpaired-columns' ),\n\t $paired = this.$( '.paired-columns' ),\n\t unpairedHi = parseInt( $unpaired.css( 'height' ), 10 ),\n\t pairedHi = parseInt( $paired.css( 'height' ), 10 );\n\t //this.debug( adj, 'hi\\'s:', unpairedHi, pairedHi, unpairedHi + adj, pairedHi - adj );\n\t\n\t unpairedHi = Math.max( 10, unpairedHi + adj );\n\t pairedHi = pairedHi - adj;\n\t\n\t var movingUpwards = adj < 0;\n\t // when the divider gets close to the top - lock into hiding the unpaired section\n\t if( movingUpwards ){\n\t if( this.unpairedPanelHidden ){\n\t return false;\n\t } else if( unpairedHi <= 10 ){\n\t this.hideUnpaired();\n\t return false;\n\t }\n\t } else {\n\t if( this.unpairedPanelHidden ){\n\t $unpaired.show();\n\t this.unpairedPanelHidden = false;\n\t }\n\t }\n\t\n\t // when the divider gets close to the bottom - lock into hiding the paired section\n\t if( !movingUpwards ){\n\t if( this.pairedPanelHidden ){\n\t return false;\n\t } else if( pairedHi <= 15 ){\n\t this.hidePaired();\n\t return false;\n\t }\n\t\n\t } else {\n\t if( this.pairedPanelHidden ){\n\t $paired.show();\n\t this.pairedPanelHidden = false;\n\t }\n\t }\n\t\n\t $unpaired.css({\n\t height : unpairedHi + 'px',\n\t flex : '0 0 auto'\n\t });\n\t return true;\n\t },\n\t\n\t // ........................................................................ paired\n\t /** select a pair when clicked */\n\t selectPair : function( ev ){\n\t ev.stopPropagation();\n\t $( ev.currentTarget ).toggleClass( 'selected' );\n\t },\n\t\n\t /** deselect all pairs */\n\t clearSelectedPaired : function( ev ){\n\t this.$( '.paired-columns .dataset.selected' ).removeClass( 'selected' );\n\t },\n\t\n\t /** rename a pair when the pair name is clicked */\n\t _clickPairName : function( ev ){\n\t ev.stopPropagation();\n\t var $name = $( ev.currentTarget ),\n\t $pair = $name.parent().parent(),\n\t index = $pair.index( '.dataset.paired' ),\n\t pair = this.paired[ index ],\n\t response = prompt( 'Enter a new name for the pair:', pair.name );\n\t if( response ){\n\t pair.name = response;\n\t // set a flag (which won't be passed in json creation) for manual naming so we don't overwrite these\n\t // when adding/removing extensions\n\t //hackish\n\t pair.customizedName = true;\n\t $name.text( pair.name );\n\t }\n\t },\n\t\n\t /** unpair this pair */\n\t _clickUnpair : function( ev ){\n\t //if( !ev.currentTarget ){ return true; }\n\t var pairIndex = Math.floor( $( ev.currentTarget ).index( '.unpair-btn' ) );\n\t //this.debug( 'pair:', pairIndex );\n\t this._unpair( this.paired[ pairIndex ] );\n\t },\n\t\n\t // ........................................................................ paired - drag and drop re-ordering\n\t //_dragenterPairedColumns : function( ev ){\n\t // this.debug( '_dragenterPairedColumns:', ev );\n\t //},\n\t //_dragleavePairedColumns : function( ev ){\n\t // //this.debug( '_dragleavePairedColumns:', ev );\n\t //},\n\t /** track the mouse drag over the paired list adding a placeholder to show where the drop would occur */\n\t _dragoverPairedColumns : function( ev ){\n\t //this.debug( '_dragoverPairedColumns:', ev );\n\t ev.preventDefault();\n\t\n\t var $list = this.$( '.paired-columns .column-datasets' );\n\t this._checkForAutoscroll( $list, ev.originalEvent.clientY );\n\t //this.debug( ev.originalEvent.clientX, ev.originalEvent.clientY );\n\t var $nearest = this._getNearestPairedDatasetLi( ev.originalEvent.clientY );\n\t\n\t $( '.element-drop-placeholder' ).remove();\n\t var $placeholder = $( '
    ' );\n\t if( !$nearest.size() ){\n\t $list.append( $placeholder );\n\t } else {\n\t $nearest.before( $placeholder );\n\t }\n\t },\n\t\n\t /** If the mouse is near enough to the list's top or bottom, scroll the list */\n\t _checkForAutoscroll : function( $element, y ){\n\t var AUTOSCROLL_SPEED = 2;\n\t var offset = $element.offset(),\n\t scrollTop = $element.scrollTop(),\n\t upperDist = y - offset.top,\n\t lowerDist = ( offset.top + $element.outerHeight() ) - y;\n\t //this.debug( '_checkForAutoscroll:', scrollTop, upperDist, lowerDist );\n\t if( upperDist >= 0 && upperDist < this.autoscrollDist ){\n\t $element.scrollTop( scrollTop - AUTOSCROLL_SPEED );\n\t } else if( lowerDist >= 0 && lowerDist < this.autoscrollDist ){\n\t $element.scrollTop( scrollTop + AUTOSCROLL_SPEED );\n\t }\n\t },\n\t\n\t /** get the nearest *previous* paired dataset PairView based on the mouse's Y coordinate.\n\t * If the y is at the end of the list, return an empty jQuery object.\n\t */\n\t _getNearestPairedDatasetLi : function( y ){\n\t var WIGGLE = 4,\n\t lis = this.$( '.paired-columns .column-datasets li' ).toArray();\n\t for( var i=0; i y && top - halfHeight < y ){\n\t //this.debug( y, top + halfHeight, top - halfHeight )\n\t return $li;\n\t }\n\t }\n\t return $();\n\t },\n\t /** drop (dragged/selected PairViews) onto the list, re-ordering both the DOM and the internal array of pairs */\n\t _dropPairedColumns : function( ev ){\n\t // both required for firefox\n\t ev.preventDefault();\n\t ev.dataTransfer.dropEffect = 'move';\n\t\n\t var $nearest = this._getNearestPairedDatasetLi( ev.originalEvent.clientY );\n\t if( $nearest.size() ){\n\t this.$dragging.insertBefore( $nearest );\n\t\n\t } else {\n\t // no nearest before - insert after last element (unpair button)\n\t this.$dragging.insertAfter( this.$( '.paired-columns .unpair-btn' ).last() );\n\t }\n\t // resync the creator's list of paired based on the new DOM order\n\t this._syncPairsToDom();\n\t return false;\n\t },\n\t /** resync the creator's list of paired based on the DOM order of pairs */\n\t _syncPairsToDom : function(){\n\t var newPaired = [];\n\t //TODO: doesn't seem wise to use the dom to store these - can't we sync another way?\n\t this.$( '.paired-columns .dataset.paired' ).each( function(){\n\t newPaired.push( $( this ).data( 'pair' ) );\n\t });\n\t //this.debug( newPaired );\n\t this.paired = newPaired;\n\t this._renderPaired();\n\t },\n\t /** drag communication with pair sub-views: dragstart */\n\t _pairDragstart : function( ev, pair ){\n\t //this.debug( '_pairDragstart', ev, pair )\n\t // auto select the pair causing the event and move all selected\n\t pair.$el.addClass( 'selected' );\n\t var $selected = this.$( '.paired-columns .dataset.selected' );\n\t this.$dragging = $selected;\n\t },\n\t /** drag communication with pair sub-views: dragend - remove the placeholder */\n\t _pairDragend : function( ev, pair ){\n\t //this.debug( '_pairDragend', ev, pair )\n\t $( '.element-drop-placeholder' ).remove();\n\t this.$dragging = null;\n\t },\n\t\n\t // ........................................................................ footer\n\t toggleExtensions : function( force ){\n\t var creator = this;\n\t creator.removeExtensions = ( force !== undefined )?( force ):( !creator.removeExtensions );\n\t\n\t _.each( creator.paired, function( pair ){\n\t // don't overwrite custom names\n\t if( pair.customizedName ){ return; }\n\t pair.name = creator._guessNameForPair( pair.forward, pair.reverse );\n\t });\n\t\n\t creator._renderPaired();\n\t creator._renderFooter();\n\t },\n\t\n\t /** handle a collection name change */\n\t _changeName : function( ev ){\n\t this._validationWarning( 'name', !!this._getName() );\n\t },\n\t\n\t /** check for enter key press when in the collection name and submit */\n\t _nameCheckForEnter : function( ev ){\n\t if( ev.keyCode === 13 && !this.blocking ){\n\t this._clickCreate();\n\t }\n\t },\n\t\n\t /** get the current collection name */\n\t _getName : function(){\n\t return _.escape( this.$( '.collection-name' ).val() );\n\t },\n\t\n\t /** attempt to create the current collection */\n\t _clickCreate : function( ev ){\n\t var name = this._getName();\n\t if( !name ){\n\t this._validationWarning( 'name' );\n\t } else if( !this.blocking ){\n\t this.createList();\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** debug a dataset list */\n\t _printList : function( list ){\n\t var creator = this;\n\t _.each( list, function( e ){\n\t if( list === creator.paired ){\n\t creator._printPair( e );\n\t } else {\n\t //creator.debug( e );\n\t }\n\t });\n\t },\n\t\n\t /** print a pair Object */\n\t _printPair : function( pair ){\n\t this.debug( pair.forward.name, pair.reverse.name, ': ->', pair.name );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){ return 'PairedCollectionCreator'; }\n\t});\n\t\n\t\n\t//TODO: move to require text plugin and load these as text\n\t//TODO: underscore currently unnecc. bc no vars are used\n\t//TODO: better way of localizing text-nodes in long strings\n\t/** underscore template fns attached to class */\n\tPairedCollectionCreator.templates = PairedCollectionCreator.templates || {\n\t\n\t /** the skeleton */\n\t main : _.template([\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ].join('')),\n\t\n\t /** the header (not including help text) */\n\t header : _.template([\n\t '
    ',\n\t '', _l( 'More help' ), '',\n\t '
    ',\n\t '', _l( 'Less' ), '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '',\n\t '',\n\t '
    ',\n\t\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '', _l( 'Unpaired forward' ), '',\n\t '',\n\t '
    ',\n\t '
    ',\n\t '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '', _l( 'Unpaired reverse' ), '',\n\t '',\n\t '
    ',\n\t '
    ',\n\t '',\n\t '
    ',\n\t '
    ',\n\t '
    ',\n\t '
    '\n\t ].join('')),\n\t\n\t /** the middle: unpaired, divider, and paired */\n\t middle : _.template([\n\t // contains two flex rows (rows that fill available space) and a divider btwn\n\t '
    ',\n\t '
    ',\n\t '
      ',\n\t '
      ',\n\t '
      ',\n\t '
        ',\n\t '
        ',\n\t '
        ',\n\t '
          ',\n\t '
          ',\n\t '
          ',\n\t '
          ',\n\t '
          ',\n\t '
          ',\n\t '
          ',\n\t '',\n\t '
          ',\n\t '',\n\t _l( 'Unpair all' ),\n\t '',\n\t '
          ',\n\t '
          ',\n\t '
          ',\n\t '
            ',\n\t '
            '\n\t ].join('')),\n\t\n\t /** creation and cancel controls */\n\t footer : _.template([\n\t '
            ',\n\t '
            ',\n\t '',\n\t '
            ',\n\t '
            ',\n\t '',\n\t '
            ', _l( 'Name' ), ':
            ',\n\t '
            ',\n\t '
            ',\n\t\n\t '
            ',\n\t '
            ',\n\t '',\n\t '
            ',\n\t '',\n\t '',\n\t '
            ',\n\t '
            ',\n\t\n\t '
            ',\n\t '',\n\t '
            ',\n\t '
            '\n\t ].join('')),\n\t\n\t /** help content */\n\t helpContent : _.template([\n\t '

            ', _l([\n\t 'Collections of paired datasets are ordered lists of dataset pairs (often forward and reverse reads). ',\n\t 'These collections can be passed to tools and workflows in order to have analyses done on each member of ',\n\t 'the entire group. This interface allows you to create a collection, choose which datasets are paired, ',\n\t 'and re-order the final collection.'\n\t ].join( '' )), '

            ',\n\t '

            ', _l([\n\t 'Unpaired datasets are shown in the unpaired section ',\n\t '(hover over the underlined words to highlight below). ',\n\t 'Paired datasets are shown in the paired section.',\n\t '

              To pair datasets, you can:',\n\t '
            • Click a dataset in the ',\n\t 'forward column ',\n\t 'to select it then click a dataset in the ',\n\t 'reverse column.',\n\t '
            • ',\n\t '
            • Click one of the \"Pair these datasets\" buttons in the ',\n\t 'middle column ',\n\t 'to pair the datasets in a particular row.',\n\t '
            • ',\n\t '
            • Click \"Auto-pair\" ',\n\t 'to have your datasets automatically paired based on name.',\n\t '
            • ',\n\t '
            '\n\t ].join( '' )), '

            ',\n\t '

            ', _l([\n\t '

              You can filter what is shown in the unpaired sections by:',\n\t '
            • Entering partial dataset names in either the ',\n\t 'forward filter or ',\n\t 'reverse filter.',\n\t '
            • ',\n\t '
            • Choosing from a list of preset filters by clicking the ',\n\t '\"Choose filters\" link.',\n\t '
            • ',\n\t '
            • Entering regular expressions to match dataset names. See: ',\n\t 'MDN\\'s JavaScript Regular Expression Tutorial. ',\n\t 'Note: forward slashes (\\\\) are not needed.',\n\t '
            • ',\n\t '
            • Clearing the filters by clicking the ',\n\t '\"Clear filters\" link.',\n\t '
            • ',\n\t '
            '\n\t ].join( '' )), '

            ',\n\t '

            ', _l([\n\t 'To unpair individual dataset pairs, click the ',\n\t 'unpair buttons ( ). ',\n\t 'Click the \"Unpair all\" link to unpair all pairs.'\n\t ].join( '' )), '

            ',\n\t '

            ', _l([\n\t 'You can include or remove the file extensions (e.g. \".fastq\") from your pair names by toggling the ',\n\t '\"Remove file extensions from pair names?\" control.'\n\t ].join( '' )), '

            ',\n\t '

            ', _l([\n\t 'Once your collection is complete, enter a name and ',\n\t 'click \"Create list\". ',\n\t '(Note: you do not have to pair all unpaired datasets to finish.)'\n\t ].join( '' )), '

            '\n\t ].join(''))\n\t};\n\t\n\t\n\t//=============================================================================\n\t/** a modal version of the paired collection creator */\n\tvar pairedCollectionCreatorModal = function _pairedCollectionCreatorModal( datasets, options ){\n\t\n\t var deferred = jQuery.Deferred(),\n\t creator;\n\t\n\t options = _.defaults( options || {}, {\n\t datasets : datasets,\n\t oncancel : function(){\n\t Galaxy.modal.hide();\n\t deferred.reject( 'cancelled' );\n\t },\n\t oncreate : function( creator, response ){\n\t Galaxy.modal.hide();\n\t deferred.resolve( response );\n\t }\n\t });\n\t\n\t if( !window.Galaxy || !Galaxy.modal ){\n\t throw new Error( 'Galaxy or Galaxy.modal not found' );\n\t }\n\t\n\t creator = new PairedCollectionCreator( options );\n\t Galaxy.modal.show({\n\t title : 'Create a collection of paired datasets',\n\t body : creator.$el,\n\t width : '80%',\n\t height : '800px',\n\t closing_events: true\n\t });\n\t creator.render();\n\t window.creator = creator;\n\t\n\t //TODO: remove modal header\n\t return deferred;\n\t};\n\t\n\t\n\t//=============================================================================\n\tfunction createListOfPairsCollection( collection ){\n\t var elements = collection.toJSON();\n\t//TODO: validate elements\n\t return pairedCollectionCreatorModal( elements, {\n\t historyId : collection.historyId\n\t });\n\t}\n\t\n\t\n\t//=============================================================================\n\t return {\n\t PairedCollectionCreator : PairedCollectionCreator,\n\t pairedCollectionCreatorModal : pairedCollectionCreatorModal,\n\t createListOfPairsCollection : createListOfPairsCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 126 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(36),\n\t __webpack_require__(45),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_CREATOR, HDCA, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t/*==============================================================================\n\tTODO:\n\t the paired creator doesn't really mesh with the list creator as parent\n\t it may be better to make an abstract super class for both\n\t composites may inherit from this (or vis-versa)\n\t PairedDatasetCollectionElementView doesn't make a lot of sense\n\t\n\t==============================================================================*/\n\t/** */\n\tvar PairedDatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t//TODO: use proper class (DatasetDCE or NestedDCDCE (or the union of both))\n\t tagName : 'li',\n\t className : 'collection-element',\n\t\n\t initialize : function( attributes ){\n\t this.element = attributes.element || {};\n\t this.identifier = attributes.identifier;\n\t },\n\t\n\t render : function(){\n\t this.$el\n\t .attr( 'data-element-id', this.element.id )\n\t .html( this.template({ identifier: this.identifier, element: this.element }) );\n\t return this;\n\t },\n\t\n\t //TODO: lots of unused space in the element - possibly load details and display them horiz.\n\t template : _.template([\n\t '<%- identifier %>',\n\t '<%- element.name %>',\n\t ].join('')),\n\t\n\t /** remove the DOM and any listeners */\n\t destroy : function(){\n\t this.off();\n\t this.$el.remove();\n\t },\n\t\n\t /** string rep */\n\t toString : function(){\n\t return 'DatasetCollectionElementView()';\n\t }\n\t});\n\t\n\t\n\t// ============================================================================\n\tvar _super = LIST_CREATOR.ListCollectionCreator;\n\t\n\t/** An interface for building collections.\n\t */\n\tvar PairCollectionCreator = _super.extend({\n\t\n\t /** the class used to display individual elements */\n\t elementViewClass : PairedDatasetCollectionElementView,\n\t /** the class this creator will create and save */\n\t collectionClass : HDCA.HistoryPairDatasetCollection,\n\t className : 'pair-collection-creator collection-creator flex-row-container',\n\t\n\t /** override to no-op */\n\t _mangleDuplicateNames : function(){},\n\t\n\t // TODO: this whole pattern sucks. There needs to be two classes of problem area:\n\t // bad inital choices and\n\t // when the user has painted his/her self into a corner during creation/use-of-the-creator\n\t /** render the entire interface */\n\t render : function( speed, callback ){\n\t if( this.workingElements.length === 2 ){\n\t return _super.prototype.render.call( this, speed, callback );\n\t }\n\t return this._renderInvalid( speed, callback );\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering elements\n\t /** render forward/reverse */\n\t _renderList : function( speed, callback ){\n\t //this.debug( '-- _renderList' );\n\t //precondition: there are two valid elements in workingElements\n\t var creator = this,\n\t $tmp = jQuery( '
            ' ),\n\t $list = creator.$list();\n\t\n\t // lose the original views, create the new, append all at once, then call their renders\n\t _.each( this.elementViews, function( view ){\n\t view.destroy();\n\t creator.removeElementView( view );\n\t });\n\t $tmp.append( creator._createForwardElementView().$el );\n\t $tmp.append( creator._createReverseElementView().$el );\n\t $list.empty().append( $tmp.children() );\n\t _.invoke( creator.elementViews, 'render' );\n\t },\n\t\n\t /** create the forward element view */\n\t _createForwardElementView : function(){\n\t return this._createElementView( this.workingElements[0], { identifier: 'forward' } );\n\t },\n\t\n\t /** create the forward element view */\n\t _createReverseElementView : function(){\n\t return this._createElementView( this.workingElements[1], { identifier: 'reverse' } );\n\t },\n\t\n\t /** create an element view, cache in elementViews, and return */\n\t _createElementView : function( element, options ){\n\t var elementView = new this.elementViewClass( _.extend( options, {\n\t element : element,\n\t }));\n\t this.elementViews.push( elementView );\n\t return elementView;\n\t },\n\t\n\t /** swap the forward, reverse elements and re-render */\n\t swap : function(){\n\t this.workingElements = [\n\t this.workingElements[1],\n\t this.workingElements[0],\n\t ];\n\t this._renderList();\n\t },\n\t\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .swap' : 'swap',\n\t }),\n\t\n\t // ------------------------------------------------------------------------ templates\n\t //TODO: move to require text plugin and load these as text\n\t //TODO: underscore currently unnecc. bc no vars are used\n\t //TODO: better way of localizing text-nodes in long strings\n\t /** underscore template fns attached to class */\n\t templates : _.extend( _.clone( _super.prototype.templates ), {\n\t /** the middle: element list */\n\t middle : _.template([\n\t '',\n\t '
            ',\n\t '
            '\n\t ].join('')),\n\t\n\t /** help content */\n\t helpContent : _.template([\n\t '

            ', _l([\n\t 'Pair collections are permanent collections containing two datasets: one forward and one reverse. ',\n\t 'Often these are forward and reverse reads. The pair collections can be passed to tools and ',\n\t 'workflows in order to have analyses done on both datasets. This interface allows ',\n\t 'you to create a pair, name it, and swap which is forward and which reverse.'\n\t ].join( '' )), '

            ',\n\t '
              ',\n\t '
            • ', _l([\n\t 'Click the \"Swap\" link to make your forward dataset the reverse ',\n\t 'and the reverse dataset forward.'\n\t ].join( '' )), '
            • ',\n\t '
            • ', _l([\n\t 'Click the \"Cancel\" button to exit the interface.'\n\t ].join( '' )), '
            • ',\n\t '

            ',\n\t '

            ', _l([\n\t 'Once your collection is complete, enter a name and ',\n\t 'click \"Create list\".'\n\t ].join( '' )), '

            '\n\t ].join('')),\n\t\n\t /** a simplified page communicating what went wrong and why the user needs to reselect something else */\n\t invalidInitial : _.template([\n\t '
            ',\n\t '
            ',\n\t '',\n\t '<% if( _.size( problems ) ){ %>',\n\t _l( 'The following selections could not be included due to problems' ),\n\t '
              <% _.each( problems, function( problem ){ %>',\n\t '
            • <%- problem.element.name %>: <%- problem.text %>
            • ',\n\t '<% }); %>
            ',\n\t '<% } else if( _.size( elements ) === 0 ){ %>',\n\t _l( 'No datasets were selected' ), '.',\n\t '<% } else if( _.size( elements ) === 1 ){ %>',\n\t _l( 'Only one dataset was selected' ), ': <%- elements[0].name %>',\n\t '<% } else if( _.size( elements ) > 2 ){ %>',\n\t _l( 'Too many datasets were selected' ),\n\t ': <%- _.pluck( elements, \"name\" ).join( \", \") %>',\n\t '<% } %>',\n\t '
            ',\n\t _l( 'Two (and only two) elements are needed for the pair' ), '. ',\n\t _l( 'You may need to ' ),\n\t '', _l( 'cancel' ), ' ',\n\t _l( 'and reselect new elements' ), '.',\n\t '
            ',\n\t '
            ',\n\t '
            ',\n\t '
            ',\n\t '
            ',\n\t '
            ',\n\t '',\n\t // _l( 'Create a different kind of collection' ),\n\t '
            ',\n\t '
            ',\n\t '
            '\n\t ].join('')),\n\t }),\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** string rep */\n\t toString : function(){ return 'PairCollectionCreator'; }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** List collection flavor of collectionCreatorModal. */\n\tvar pairCollectionCreatorModal = function _pairCollectionCreatorModal( elements, options ){\n\t options = options || {};\n\t options.title = _l( 'Create a collection from a pair of datasets' );\n\t return LIST_CREATOR.collectionCreatorModal( elements, options, PairCollectionCreator );\n\t};\n\t\n\t\n\t//==============================================================================\n\t/** Use a modal to create a pair collection, then add it to the given history contents.\n\t * @returns {Deferred} resolved when the collection is added to the history.\n\t */\n\tfunction createPairCollection( contents ){\n\t var elements = contents.toJSON(),\n\t promise = pairCollectionCreatorModal( elements, {\n\t creationFn : function( elements, name ){\n\t elements = [\n\t { name: \"forward\", src: \"hda\", id: elements[0].id },\n\t { name: \"reverse\", src: \"hda\", id: elements[1].id }\n\t ];\n\t return contents.createHDCA( elements, 'paired', name );\n\t }\n\t });\n\t return promise;\n\t}\n\t\n\t//==============================================================================\n\t return {\n\t PairCollectionCreator : PairCollectionCreator,\n\t pairCollectionCreatorModal : pairCollectionCreatorModal,\n\t createPairCollection : createPairCollection,\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 127 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, jQuery, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(10),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( MODAL, _l ){\n\t\n\t\"use strict\";\n\t//==============================================================================\n\t/**\n\t * A dialog/modal that allows copying a user history or 'importing' from user\n\t * another. Generally called via historyCopyDialog below.\n\t * @type {Object}\n\t */\n\tvar CopyDialog = {\n\t\n\t // language related strings/fns\n\t defaultName : _.template( \"Copy of '<%- name %>'\" ),\n\t title : _.template( _l( 'Copying history' ) + ' \"<%- name %>\"' ),\n\t submitLabel : _l( 'Copy' ),\n\t errorMessage : _l( 'History could not be copied' ),\n\t progressive : _l( 'Copying history' ),\n\t activeLabel : _l( 'Copy only the active, non-deleted datasets' ),\n\t allLabel : _l( 'Copy all datasets including deleted ones' ),\n\t anonWarning : _l( 'As an anonymous user, unless you login or register, you will lose your current history ' ) +\n\t _l( 'after copying this history. ' ),\n\t\n\t // template for modal body\n\t _template : _.template([\n\t //TODO: remove inline styles\n\t // show a warning message for losing current to anon users\n\t '<% if( isAnon ){ %>',\n\t '
            ',\n\t '<%- anonWarning %>',\n\t _l( 'You can' ),\n\t ' ', _l( 'login here' ), ' ', _l( 'or' ), ' ',\n\t ' ', _l( 'register here' ), '.',\n\t '
            ',\n\t '<% } %>',\n\t '
            ',\n\t '
            ',\n\t // TODO: could use required here and the form validators\n\t // NOTE: use unescaped here if escaped in the modal function below\n\t '\" />',\n\t '

            ',\n\t _l( 'Please enter a valid history title' ),\n\t '

            ',\n\t // if allowAll, add the option to copy deleted datasets, too\n\t '<% if( allowAll ){ %>',\n\t '
            ',\n\t '

            ', _l( 'Choose which datasets from the original history to include:' ), '

            ',\n\t // copy non-deleted is the default\n\t '/>',\n\t '',\n\t '
            ',\n\t '/>',\n\t '',\n\t '<% } %>',\n\t '
            '\n\t ].join( '' )),\n\t\n\t // empty modal body and let the user know the copy is happening\n\t _showAjaxIndicator : function _showAjaxIndicator(){\n\t var indicator = '

            ' + this.progressive + '...

            ';\n\t this.modal.$( '.modal-body' ).empty().append( indicator ).css({ 'margin-top': '8px' });\n\t },\n\t\n\t // (sorta) public interface - display the modal, render the form, and potentially copy the history\n\t // returns a jQuery.Deferred done->history copied, fail->user cancelled\n\t dialog : function _dialog( modal, history, options ){\n\t options = options || {};\n\t\n\t var dialog = this,\n\t deferred = jQuery.Deferred(),\n\t // TODO: getting a little byzantine here\n\t defaultCopyNameFn = options.nameFn || this.defaultName,\n\t defaultCopyName = defaultCopyNameFn({ name: history.get( 'name' ) }),\n\t // TODO: these two might be simpler as one 3 state option (all,active,no-choice)\n\t defaultCopyWhat = options.allDatasets? 'copy-all' : 'copy-non-deleted',\n\t allowAll = !_.isUndefined( options.allowAll )? options.allowAll : true,\n\t autoClose = !_.isUndefined( options.autoClose )? options.autoClose : true;\n\t\n\t this.modal = modal;\n\t\n\t\n\t // validate the name and copy if good\n\t function checkNameAndCopy(){\n\t var name = modal.$( '#copy-modal-title' ).val();\n\t if( !name ){\n\t modal.$( '.invalid-title' ).show();\n\t return;\n\t }\n\t // get further settings, shut down and indicate the ajax call, then hide and resolve/reject\n\t var copyAllDatasets = modal.$( 'input[name=\"copy-what\"]:checked' ).val() === 'copy-all';\n\t modal.$( 'button' ).prop( 'disabled', true );\n\t dialog._showAjaxIndicator();\n\t history.copy( true, name, copyAllDatasets )\n\t .done( function( response ){\n\t deferred.resolve( response );\n\t })\n\t //TODO: make this unneccessary with pub-sub error or handling via Galaxy\n\t .fail( function(){\n\t alert([ dialog.errorMessage, _l( 'Please contact a Galaxy administrator' ) ].join( '. ' ));\n\t deferred.rejectWith( deferred, arguments );\n\t })\n\t .always( function(){\n\t if( autoClose ){ modal.hide(); }\n\t });\n\t }\n\t\n\t var originalClosingCallback = options.closing_callback;\n\t modal.show( _.extend( options, {\n\t title : this.title({ name: history.get( 'name' ) }),\n\t body : $( dialog._template({\n\t name : defaultCopyName,\n\t isAnon : Galaxy.user.isAnonymous(),\n\t allowAll : allowAll,\n\t copyWhat : defaultCopyWhat,\n\t activeLabel : this.activeLabel,\n\t allLabel : this.allLabel,\n\t anonWarning : this.anonWarning,\n\t })),\n\t buttons : _.object([\n\t [ _l( 'Cancel' ), function(){ modal.hide(); } ],\n\t [ this.submitLabel, checkNameAndCopy ]\n\t ]),\n\t height : 'auto',\n\t closing_events : true,\n\t closing_callback: function _historyCopyClose( cancelled ){\n\t if( cancelled ){\n\t deferred.reject({ cancelled : true });\n\t }\n\t if( originalClosingCallback ){\n\t originalClosingCallback( cancelled );\n\t }\n\t }\n\t }));\n\t\n\t // set the default dataset copy, autofocus the title, and set up for a simple return\n\t modal.$( '#copy-modal-title' ).focus().select();\n\t modal.$( '#copy-modal-title' ).on( 'keydown', function( ev ){\n\t if( ev.keyCode === 13 ){\n\t ev.preventDefault();\n\t checkNameAndCopy();\n\t }\n\t });\n\t\n\t return deferred;\n\t },\n\t};\n\t\n\t//==============================================================================\n\t// maintain the (slight) distinction between copy and import\n\t/**\n\t * Subclass CopyDialog to use the import language.\n\t */\n\tvar ImportDialog = _.extend( {}, CopyDialog, {\n\t defaultName : _.template( \"imported: <%- name %>\" ),\n\t title : _.template( _l( 'Importing history' ) + ' \"<%- name %>\"' ),\n\t submitLabel : _l( 'Import' ),\n\t errorMessage : _l( 'History could not be imported' ),\n\t progressive : _l( 'Importing history' ),\n\t activeLabel : _l( 'Import only the active, non-deleted datasets' ),\n\t allLabel : _l( 'Import all datasets including deleted ones' ),\n\t anonWarning : _l( 'As an anonymous user, unless you login or register, you will lose your current history ' ) +\n\t _l( 'after importing this history. ' ),\n\t\n\t});\n\t\n\t//==============================================================================\n\t/**\n\t * Main interface for both history import and history copy dialogs.\n\t * @param {Backbone.Model} history the history to copy\n\t * @param {Object} options a hash\n\t * @return {jQuery.Deferred} promise that fails on close and succeeds on copy\n\t *\n\t * options:\n\t * (this object is also passed to the modal used to display the dialog and accepts modal options)\n\t * {Function} nameFn if defined, use this to build the default name shown to the user\n\t * (the fn is passed: {name: })\n\t * {bool} useImport if true, use the 'import' language (instead of Copy)\n\t * {bool} allowAll if true, allow the user to choose between copying all datasets and\n\t * only non-deleted datasets\n\t * {String} allDatasets default initial checked radio button: 'copy-all' or 'copy-non-deleted',\n\t */\n\tvar historyCopyDialog = function( history, options ){\n\t options = options || {};\n\t // create our own modal if Galaxy doesn't have one (mako tab without use_panels)\n\t var modal = window.parent.Galaxy.modal || new MODAL.View({});\n\t return options.useImport?\n\t ImportDialog.dialog( modal, history, options ):\n\t CopyDialog.dialog( modal, history, options );\n\t};\n\t\n\t\n\t//==============================================================================\n\t return historyCopyDialog;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 128 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(94),\n\t __webpack_require__(96),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DATASET_LI_EDIT, HDA_LI, BASE_MVC, _l ){\n\t//==============================================================================\n\tvar _super = DATASET_LI_EDIT.DatasetListItemEdit;\n\t/** @class Editing view for HistoryDatasetAssociation.\n\t */\n\tvar HDAListItemEdit = _super.extend(\n\t/** @lends HDAListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : _super.prototype.className + \" history-content\",\n\t\n\t /** In this override, only get details if in the ready state, get rerunnable if in other states.\n\t * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n\t */\n\t _fetchModelDetails : function(){\n\t var view = this;\n\t if( view.model.inReadyState() && !view.model.hasDetails() ){\n\t return view.model.fetch({ silent: true });\n\t\n\t // special case the need for the rerunnable and creating_job attributes\n\t // needed for rendering re-run button on queued, running datasets\n\t } else if( !view.model.has( 'rerunnable' ) ){\n\t return view.model.fetch({ silent: true, data: {\n\t // only fetch rerunnable and creating_job to keep overhead down\n\t keys: [ 'rerunnable', 'creating_job' ].join(',')\n\t }});\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t /** event map */\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .unhide-link' : function( ev ){ this.model.unhide(); return false; }\n\t }),\n\t\n\t /** string rep */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDAListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tHDAListItemEdit.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t hidden : BASE_MVC.wrapTemplate([\n\t '<% if( !dataset.visible ){ %>',\n\t // add a link to unhide a dataset\n\t '
            ',\n\t _l( 'This dataset has been hidden' ),\n\t '
            ', _l( 'Unhide it' ), '',\n\t '
            ',\n\t '<% } %>'\n\t ], 'dataset' )\n\t });\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t //NOTE: *steal* the HDAListItemView titleBar\n\t titleBar : HDA_LI.HDAListItemView.prototype.templates.titleBar,\n\t warnings : warnings\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HDAListItemEdit : HDAListItemEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 129 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(98),\n\t __webpack_require__(124),\n\t __webpack_require__(26),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HDCA_LI, DC_VIEW_EDIT, faIconButton, _l ){\n\t//==============================================================================\n\tvar _super = HDCA_LI.HDCAListItemView;\n\t/** @class Editing view for HistoryDatasetCollectionAssociation.\n\t */\n\tvar HDCAListItemEdit = _super.extend(\n\t/** @lends HDCAListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** Override to return editable versions of the collection panels */\n\t _getFoldoutPanelClass : function(){\n\t switch( this.model.get( 'collection_type' ) ){\n\t case 'list':\n\t return DC_VIEW_EDIT.ListCollectionViewEdit;\n\t case 'paired':\n\t return DC_VIEW_EDIT.PairCollectionViewEdit;\n\t case 'list:paired':\n\t return DC_VIEW_EDIT.ListOfPairsCollectionViewEdit;\n\t }\n\t throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );\n\t },\n\t\n\t // ......................................................................... delete\n\t /** In this override, add the delete button. */\n\t _renderPrimaryActions : function(){\n\t this.log( this + '._renderPrimaryActions' );\n\t // render the display, edit attr and delete icon-buttons\n\t return _super.prototype._renderPrimaryActions.call( this )\n\t .concat([\n\t this._renderDeleteButton()\n\t ]);\n\t },\n\t\n\t /** Render icon-button to delete this collection. */\n\t _renderDeleteButton : function(){\n\t var self = this,\n\t deleted = this.model.get( 'deleted' );\n\t return faIconButton({\n\t title : deleted? _l( 'Dataset collection is already deleted' ): _l( 'Delete' ),\n\t classes : 'delete-btn',\n\t faIcon : 'fa-times',\n\t disabled : deleted,\n\t onclick : function() {\n\t // ...bler... tooltips being left behind in DOM (hover out never called on deletion)\n\t self.$el.find( '.icon-btn.delete-btn' ).trigger( 'mouseout' );\n\t self.model[ 'delete' ]();\n\t }\n\t });\n\t },\n\t\n\t // ......................................................................... misc\n\t /** string rep */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDCAListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t//==============================================================================\n\t return {\n\t HDCAListItemEdit : HDCAListItemEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 130 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, jQuery, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(99),\n\t __webpack_require__(131),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HISTORY_MODEL, HISTORY_VIEW_EDIT, BASE_MVC, _l ){\n\t// ============================================================================\n\t/** session storage for history panel preferences (and to maintain state)\n\t */\n\tvar HistoryViewPrefs = BASE_MVC.SessionStorageModel.extend(\n\t/** @lends HistoryViewPrefs.prototype */{\n\t defaults : {\n\t /** should the tags editor be shown or hidden initially? */\n\t tagsEditorShown : false,\n\t /** should the annotation editor be shown or hidden initially? */\n\t annotationEditorShown : false,\n\t ///** what is the currently focused content (dataset or collection) in the current history?\n\t // * (the history panel will highlight and scroll to the focused content view)\n\t // */\n\t //focusedContentId : null\n\t /** Current scroll position */\n\t scrollPosition : 0\n\t },\n\t toString : function(){\n\t return 'HistoryViewPrefs(' + JSON.stringify( this.toJSON() ) + ')';\n\t }\n\t});\n\t\n\t/** key string to store panel prefs (made accessible on class so you can access sessionStorage directly) */\n\tHistoryViewPrefs.storageKey = function storageKey(){\n\t return ( 'history-panel' );\n\t};\n\t\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\tvar _super = HISTORY_VIEW_EDIT.HistoryViewEdit;\n\t// used in root/index.mako\n\t/** @class View/Controller for the user's current history model as used in the history\n\t * panel (current right hand panel) of the analysis page.\n\t *\n\t * The only history panel that:\n\t * will poll for updates.\n\t * displays datasets in reverse hid order.\n\t */\n\tvar CurrentHistoryView = _super.extend(\n\t/** @lends CurrentHistoryView.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : _super.prototype.className + ' current-history-panel',\n\t\n\t emptyMsg : _l( \"This history is empty. Click 'Get Data' on the left tool menu to start\" ),\n\t noneFoundMsg : _l( \"No matching datasets found\" ),\n\t\n\t /** */\n\t HDCAViewClass : _super.prototype.HDCAViewClass.extend({\n\t foldoutStyle : 'drilldown'\n\t }),\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events */\n\t initialize : function( attributes ){\n\t attributes = attributes || {};\n\t\n\t // ---- persistent preferences\n\t /** maintain state / preferences over page loads */\n\t this.preferences = new HistoryViewPrefs( _.extend({\n\t id : HistoryViewPrefs.storageKey()\n\t }, _.pick( attributes, _.keys( HistoryViewPrefs.prototype.defaults ) )));\n\t\n\t _super.prototype.initialize.call( this, attributes );\n\t\n\t /** sub-views that will overlay this panel (collections) */\n\t this.panelStack = [];\n\t\n\t /** id of currently focused content */\n\t this.currentContentId = attributes.currentContentId || null;\n\t //NOTE: purposely not sent to localstorage since panel recreation roughly lines up with a reset of this value\n\t },\n\t\n\t /** Override to cache the current scroll position with a listener */\n\t _setUpListeners : function(){\n\t _super.prototype._setUpListeners.call( this );\n\t\n\t var panel = this;\n\t // reset scroll position when there's a new history\n\t this.on( 'new-model', function(){\n\t panel.preferences.set( 'scrollPosition', 0 );\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ loading history/item models\n\t /** (re-)loads the user's current history & contents w/ details */\n\t loadCurrentHistory : function( attributes ){\n\t this.debug( this + '.loadCurrentHistory' );\n\t // implemented as a 'fresh start' or for when there is no model (intial panel render)\n\t var panel = this;\n\t return this.loadHistoryWithDetails( 'current', attributes )\n\t .then(function( historyData, contentsData ){\n\t panel.trigger( 'current-history', panel );\n\t });\n\t },\n\t\n\t /** loads a history & contents w/ details and makes them the current history */\n\t switchToHistory : function( historyId, attributes ){\n\t //this.info( 'switchToHistory:', historyId, attributes );\n\t var panel = this,\n\t historyFn = function(){\n\t // make this current and get history data with one call\n\t return jQuery.getJSON( Galaxy.root + 'history/set_as_current?id=' + historyId );\n\t // method : 'PUT'\n\t //});\n\t };\n\t return this.loadHistoryWithDetails( historyId, attributes, historyFn )\n\t .then( function( historyData, contentsData ){\n\t panel.trigger( 'switched-history', panel );\n\t });\n\t },\n\t\n\t /** creates a new history on the server and sets it as the user's current history */\n\t createNewHistory : function( attributes ){\n\t if( !Galaxy || !Galaxy.user || Galaxy.user.isAnonymous() ){\n\t this.displayMessage( 'error', _l( 'You must be logged in to create histories' ) );\n\t return $.when();\n\t }\n\t var panel = this,\n\t historyFn = function(){\n\t // create a new history and save: the server will return the proper JSON\n\t return jQuery.getJSON( Galaxy.root + 'history/create_new_current' );\n\t };\n\t\n\t // id undefined bc there is no historyId yet - the server will provide\n\t // (no need for details - nothing expanded in new history)\n\t return this.loadHistory( undefined, attributes, historyFn )\n\t .then(function( historyData, contentsData ){\n\t panel.trigger( 'new-history', panel );\n\t });\n\t },\n\t\n\t /** release/free/shutdown old models and set up panel for new models */\n\t setModel : function( model, attributes, render ){\n\t _super.prototype.setModel.call( this, model, attributes, render );\n\t if( this.model ){\n\t this.log( 'checking for updates' );\n\t this.model.checkForUpdates();\n\t }\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ history/content event listening\n\t /** listening for collection events */\n\t _setUpCollectionListeners : function(){\n\t _super.prototype._setUpCollectionListeners.call( this );\n\t\n\t //TODO:?? may not be needed? see history-view-edit, 369\n\t // if a hidden item is created (gen. by a workflow), moves thru the updater to the ready state,\n\t // then: remove it from the collection if the panel is set to NOT show hidden datasets\n\t this.collection.on( 'state:ready', function( model, newState, oldState ){\n\t if( ( !model.get( 'visible' ) )\n\t && ( !this.storage.get( 'show_hidden' ) ) ){\n\t this.removeItemView( model );\n\t }\n\t }, this );\n\t },\n\t\n\t /** listening for history events */\n\t _setUpModelListeners : function(){\n\t _super.prototype._setUpModelListeners.call( this );\n\t // ---- history\n\t // re-broadcast any model change events so that listeners don't have to re-bind to each history\n\t this.listenTo( this.model, 'change:nice_size change:size', function(){\n\t this.trigger( 'history-size-change', this, this.model, arguments );\n\t }, this );\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel rendering\n\t /** override to add a handler to capture the scroll position when the parent scrolls */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t // we need to call this in _setUpBehaviors which is called after render since the $el\n\t // may not be attached to $el.parent and $scrollContainer() may not work\n\t var panel = this;\n\t _super.prototype._setUpBehaviors.call( panel, $where );\n\t\n\t // cache the handler to remove and re-add so we don't pile up the handlers\n\t if( !this._debouncedScrollCaptureHandler ){\n\t this._debouncedScrollCaptureHandler = _.debounce( function scrollCapture(){\n\t // cache the scroll position (only if visible)\n\t if( panel.$el.is( ':visible' ) ){\n\t panel.preferences.set( 'scrollPosition', $( this ).scrollTop() );\n\t }\n\t }, 40 );\n\t }\n\t\n\t panel.$scrollContainer()\n\t .off( 'scroll', this._debouncedScrollCaptureHandler )\n\t .on( 'scroll', this._debouncedScrollCaptureHandler );\n\t return panel;\n\t },\n\t\n\t /** In this override, handle null models and move the search input to the top */\n\t _buildNewRender : function(){\n\t if( !this.model ){ return $(); }\n\t var $newRender = _super.prototype._buildNewRender.call( this );\n\t //TODO: hacky\n\t $newRender.find( '.search' ).prependTo( $newRender.find( '.controls' ) );\n\t this._renderQuotaMessage( $newRender );\n\t return $newRender;\n\t },\n\t\n\t /** render the message displayed when a user is over quota and can't run jobs */\n\t _renderQuotaMessage : function( $whereTo ){\n\t $whereTo = $whereTo || this.$el;\n\t return $( this.templates.quotaMsg( {}, this ) ).prependTo( $whereTo.find( '.messages' ) );\n\t },\n\t\n\t /** In this override, add links to open data uploader or get data in the tools section */\n\t _renderEmptyMessage : function( $whereTo ){\n\t var panel = this,\n\t $emptyMsg = panel.$emptyMessage( $whereTo ),\n\t $toolMenu = $( '.toolMenuContainer' );\n\t\n\t if( ( _.isEmpty( panel.views ) && !panel.searchFor )\n\t && ( Galaxy && Galaxy.upload && $toolMenu.size() ) ){\n\t $emptyMsg.empty();\n\t\n\t $emptyMsg.html([\n\t _l( 'This history is empty' ), '. ', _l( 'You can ' ),\n\t '',\n\t _l( 'load your own data' ),\n\t '',\n\t _l( ' or ' ), '',\n\t _l( 'get data from an external source' ),\n\t ''\n\t ].join('') );\n\t $emptyMsg.find( '.uploader-link' ).click( function( ev ){\n\t Galaxy.upload.show( ev );\n\t });\n\t $emptyMsg.find( '.get-data-link' ).click( function( ev ){\n\t $toolMenu.parent().scrollTop( 0 );\n\t $toolMenu.find( 'span:contains(\"Get Data\")' )\n\t .click();\n\t //.fadeTo( 200, 0.1, function(){\n\t // this.debug( this )\n\t // $( this ).fadeTo( 200, 1.0 );\n\t //});\n\t });\n\t return $emptyMsg.show();\n\t }\n\t return _super.prototype._renderEmptyMessage.call( this, $whereTo );\n\t },\n\t\n\t /** In this override, get and set current panel preferences when editor is used */\n\t _renderTags : function( $where ){\n\t var panel = this;\n\t // render tags and show/hide based on preferences\n\t _super.prototype._renderTags.call( this, $where );\n\t if( this.preferences.get( 'tagsEditorShown' ) ){\n\t this.tagsEditor.toggle( true );\n\t }\n\t // store preference when shown or hidden\n\t this.tagsEditor.on( 'hiddenUntilActivated:shown hiddenUntilActivated:hidden',\n\t function( tagsEditor ){\n\t panel.preferences.set( 'tagsEditorShown', tagsEditor.hidden );\n\t });\n\t },\n\t\n\t /** In this override, get and set current panel preferences when editor is used */\n\t _renderAnnotation : function( $where ){\n\t var panel = this;\n\t // render annotation and show/hide based on preferences\n\t _super.prototype._renderAnnotation.call( this, $where );\n\t if( this.preferences.get( 'annotationEditorShown' ) ){\n\t this.annotationEditor.toggle( true );\n\t }\n\t // store preference when shown or hidden\n\t this.annotationEditor.on( 'hiddenUntilActivated:shown hiddenUntilActivated:hidden',\n\t function( annotationEditor ){\n\t panel.preferences.set( 'annotationEditorShown', annotationEditor.hidden );\n\t }\n\t );\n\t },\n\t\n\t /** Override to scroll to cached position (in prefs) after swapping */\n\t _swapNewRender : function( $newRender ){\n\t _super.prototype._swapNewRender.call( this, $newRender );\n\t var panel = this;\n\t _.delay( function(){\n\t var pos = panel.preferences.get( 'scrollPosition' );\n\t if( pos ){\n\t panel.scrollTo( pos, 0 );\n\t }\n\t }, 10 );\n\t //TODO: is this enough of a delay on larger histories?\n\t\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-views\n\t /** Override to add the current-content highlight class to currentContentId's view */\n\t _attachItems : function( $whereTo ){\n\t _super.prototype._attachItems.call( this, $whereTo );\n\t var panel = this;\n\t if( panel.currentContentId ){\n\t panel._setCurrentContentById( panel.currentContentId );\n\t }\n\t return this;\n\t },\n\t\n\t /** Override to remove any drill down panels */\n\t addItemView : function( model, collection, options ){\n\t var view = _super.prototype.addItemView.call( this, model, collection, options );\n\t if( !view ){ return view; }\n\t if( this.panelStack.length ){ return this._collapseDrilldownPanel(); }\n\t return view;\n\t },\n\t\n\t // ------------------------------------------------------------------------ collection sub-views\n\t /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n\t _setUpItemViewListeners : function( view ){\n\t var panel = this;\n\t _super.prototype._setUpItemViewListeners.call( panel, view );\n\t\n\t // use pub-sub to: handle drilldown expansion and collapse\n\t view.on( 'expanded:drilldown', function( v, drilldown ){\n\t this._expandDrilldownPanel( drilldown );\n\t }, this );\n\t view.on( 'collapsed:drilldown', function( v, drilldown ){\n\t this._collapseDrilldownPanel( drilldown );\n\t }, this );\n\t\n\t // when content is manipulated, make it the current-content\n\t // view.on( 'visualize', function( v, ev ){\n\t // this.setCurrentContent( v );\n\t // }, this );\n\t\n\t return this;\n\t },\n\t\n\t /** display 'current content': add a visible highlight and store the id of a content item */\n\t setCurrentContent : function( view ){\n\t this.$( '.history-content.current-content' ).removeClass( 'current-content' );\n\t if( view ){\n\t view.$el.addClass( 'current-content' );\n\t this.currentContentId = view.model.id;\n\t } else {\n\t this.currentContentId = null;\n\t }\n\t },\n\t\n\t /** find the view with the id and then call setCurrentContent on it */\n\t _setCurrentContentById : function( id ){\n\t var view = this.viewFromModelId( id ) || null;\n\t this.setCurrentContent( view );\n\t },\n\t\n\t /** Handle drill down by hiding this panels list and controls and showing the sub-panel */\n\t _expandDrilldownPanel : function( drilldown ){\n\t this.panelStack.push( drilldown );\n\t // hide this panel's controls and list, set the name for back navigation, and attach to the $el\n\t this.$( '> .controls' ).add( this.$list() ).hide();\n\t drilldown.parentName = this.model.get( 'name' );\n\t this.$el.append( drilldown.render().$el );\n\t },\n\t\n\t /** Handle drilldown close by freeing the panel and re-rendering this panel */\n\t _collapseDrilldownPanel : function( drilldown ){\n\t this.panelStack.pop();\n\t//TODO: MEM: free the panel\n\t this.render();\n\t },\n\t\n\t // ........................................................................ external objects/MVC\n\t listenToGalaxy : function( galaxy ){\n\t // TODO: MEM: questionable reference island / closure practice\n\t galaxy.on( 'galaxy_main:load', function( data ){\n\t var pathToMatch = data.fullpath,\n\t useToURLRegexMap = {\n\t 'display' : /datasets\\/([a-f0-9]+)\\/display/,\n\t 'edit' : /datasets\\/([a-f0-9]+)\\/edit/,\n\t 'report_error' : /dataset\\/errors\\?id=([a-f0-9]+)/,\n\t 'rerun' : /tool_runner\\/rerun\\?id=([a-f0-9]+)/,\n\t 'show_params' : /datasets\\/([a-f0-9]+)\\/show_params/,\n\t // no great way to do this here? (leave it in the dataset event handlers above?)\n\t // 'visualization' : 'visualization',\n\t },\n\t hdaId = null,\n\t hdaUse = null;\n\t _.find( useToURLRegexMap, function( regex, use ){\n\t var match = pathToMatch.match( regex );\n\t if( match && match.length == 2 ){\n\t hdaId = match[1];\n\t hdaUse = use;\n\t return true;\n\t }\n\t return false;\n\t });\n\t // need to type mangle to go from web route to history contents\n\t hdaId = 'dataset-' + hdaId;\n\t this._setCurrentContentById( hdaId );\n\t }, this );\n\t },\n\t\n\t//TODO: remove quota meter from panel and remove this\n\t /** add listeners to an external quota meter (mvc/user/user-quotameter.js) */\n\t connectToQuotaMeter : function( quotaMeter ){\n\t if( !quotaMeter ){\n\t return this;\n\t }\n\t // show/hide the 'over quota message' in the history when the meter tells it to\n\t this.listenTo( quotaMeter, 'quota:over', this.showQuotaMessage );\n\t this.listenTo( quotaMeter, 'quota:under', this.hideQuotaMessage );\n\t\n\t // having to add this to handle re-render of hview while overquota (the above do not fire)\n\t this.on( 'rendered rendered:initial', function(){\n\t if( quotaMeter && quotaMeter.isOverQuota() ){\n\t this.showQuotaMessage();\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t//TODO: this seems more like a per user message than a history message; IOW, this doesn't belong here\n\t /** Override to preserve the quota message */\n\t clearMessages : function( ev ){\n\t var $target = !_.isUndefined( ev )?\n\t $( ev.currentTarget )\n\t :this.$messages().children( '[class$=\"message\"]' );\n\t $target = $target.not( '.quota-message' );\n\t $target.fadeOut( this.fxSpeed, function(){\n\t $( this ).remove();\n\t });\n\t return this;\n\t },\n\t\n\t /** Show the over quota message (which happens to be in the history panel).\n\t */\n\t showQuotaMessage : function(){\n\t var $msg = this.$( '.quota-message' );\n\t if( $msg.is( ':hidden' ) ){ $msg.slideDown( this.fxSpeed ); }\n\t },\n\t\n\t//TODO: this seems more like a per user message than a history message\n\t /** Hide the over quota message (which happens to be in the history panel).\n\t */\n\t hideQuotaMessage : function(){\n\t var $msg = this.$( '.quota-message' );\n\t if( !$msg.is( ':hidden' ) ){ $msg.slideUp( this.fxSpeed ); }\n\t },\n\t\n\t /** Return a string rep of the history\n\t */\n\t toString : function(){\n\t return 'CurrentHistoryView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//------------------------------------------------------------------------------ TEMPLATES\n\tCurrentHistoryView.prototype.templates = (function(){\n\t\n\t var quotaMsgTemplate = BASE_MVC.wrapTemplate([\n\t '
            ',\n\t _l( 'You are over your disk quota' ), '. ',\n\t _l( 'Tool execution is on hold until your disk usage drops below your allocated quota' ), '.',\n\t '
            '\n\t ], 'history' );\n\t return _.extend( _.clone( _super.prototype.templates ), {\n\t quotaMsg : quotaMsgTemplate\n\t });\n\t\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t CurrentHistoryView : CurrentHistoryView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 131 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, $, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(132),\n\t __webpack_require__(47),\n\t __webpack_require__(15),\n\t __webpack_require__(97),\n\t __webpack_require__(128),\n\t __webpack_require__(129),\n\t __webpack_require__(101),\n\t __webpack_require__(92),\n\t __webpack_require__(36),\n\t __webpack_require__(126),\n\t __webpack_require__(125),\n\t __webpack_require__(26),\n\t __webpack_require__(51),\n\t __webpack_require__(5),\n\t __webpack_require__(19),\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(\n\t HISTORY_VIEW,\n\t HISTORY_CONTENTS,\n\t STATES,\n\t HDA_MODEL,\n\t HDA_LI_EDIT,\n\t HDCA_LI_EDIT,\n\t TAGS,\n\t ANNOTATIONS,\n\t LIST_COLLECTION_CREATOR,\n\t PAIR_COLLECTION_CREATOR,\n\t LIST_OF_PAIRS_COLLECTION_CREATOR,\n\t faIconButton,\n\t PopupMenu,\n\t _l\n\t){\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\tvar _super = HISTORY_VIEW.HistoryView;\n\t// base class for history-view-edit-current and used as-is in history/view.mako\n\t/** @class Editable View/Controller for the history model.\n\t *\n\t * Allows:\n\t * (everything HistoryView allows)\n\t * changing the name\n\t * displaying and editing tags and annotations\n\t * multi-selection and operations on mulitple content items\n\t */\n\tvar HistoryViewEdit = _super.extend(\n\t/** @lends HistoryViewEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** class to use for constructing the HistoryDatasetAssociation views */\n\t HDAViewClass : HDA_LI_EDIT.HDAListItemEdit,\n\t /** class to use for constructing the HistoryDatasetCollectionAssociation views */\n\t HDCAViewClass : HDCA_LI_EDIT.HDCAListItemEdit,\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events\n\t * @param {Object} attributes\n\t */\n\t initialize : function( attributes ){\n\t attributes = attributes || {};\n\t _super.prototype.initialize.call( this, attributes );\n\t\n\t // ---- set up instance vars\n\t /** editor for tags - sub-view */\n\t this.tagsEditor = null;\n\t /** editor for annotations - sub-view */\n\t this.annotationEditor = null;\n\t\n\t /** allow user purge of dataset files? */\n\t this.purgeAllowed = attributes.purgeAllowed || false;\n\t\n\t // states/modes the panel can be in\n\t /** is the panel currently showing the dataset selection controls? */\n\t this.annotationEditorShown = attributes.annotationEditorShown || false;\n\t this.tagsEditorShown = attributes.tagsEditorShown || false;\n\t },\n\t\n\t /** Override to handle history as drag-drop target */\n\t _setUpListeners : function(){\n\t var panel = this;\n\t _super.prototype._setUpListeners.call( panel );\n\t\n\t panel.on( 'drop', function( ev, data ){\n\t panel.dataDropped( data );\n\t // remove the drop target\n\t panel.dropTargetOff();\n\t });\n\t panel.on( 'view:attached view:removed', function(){\n\t panel._renderCounts();\n\t }, panel );\n\t },\n\t\n\t // ------------------------------------------------------------------------ listeners\n\t /** listening for collection events */\n\t _setUpCollectionListeners : function(){\n\t _super.prototype._setUpCollectionListeners.call( this );\n\t\n\t this.collection.on( 'change:deleted', this._handleHdaDeletionChange, this );\n\t this.collection.on( 'change:visible', this._handleHdaVisibleChange, this );\n\t this.collection.on( 'change:purged', function( model ){\n\t // hafta get the new nice-size w/o the purged model\n\t this.model.fetch();\n\t }, this );\n\t return this;\n\t },\n\t\n\t /** listening for history and HDA events */\n\t _setUpModelListeners : function(){\n\t _super.prototype._setUpModelListeners.call( this );\n\t this.model.on( 'change:size', this.updateHistoryDiskSize, this );\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel rendering\n\t /** In this override, add tag and annotation editors and a btn to toggle the selectors */\n\t _buildNewRender : function(){\n\t // create a new render using a skeleton template, render title buttons, render body, and set up events, etc.\n\t var $newRender = _super.prototype._buildNewRender.call( this );\n\t if( !this.model ){ return $newRender; }\n\t\n\t if( Galaxy && Galaxy.user && Galaxy.user.id && Galaxy.user.id === this.model.get( 'user_id' ) ){\n\t this._renderTags( $newRender );\n\t this._renderAnnotation( $newRender );\n\t }\n\t return $newRender;\n\t },\n\t\n\t /** override to render counts when the items are rendered */\n\t renderItems : function( $whereTo ){\n\t var views = _super.prototype.renderItems.call( this, $whereTo );\n\t this._renderCounts( $whereTo );\n\t return views;\n\t },\n\t\n\t /** override to show counts, what's deleted/hidden, and links to toggle those */\n\t _renderCounts : function( $whereTo ){\n\t//TODO: too complicated\n\t function toggleLink( _class, text ){\n\t return [ '', text, '' ].join( '' );\n\t }\n\t $whereTo = $whereTo || this.$el;\n\t var deleted = this.collection.where({ deleted: true }),\n\t hidden = this.collection.where({ visible: false }),\n\t msgs = [];\n\t\n\t if( this.views.length ){\n\t msgs.push( [ this.views.length, _l( 'shown' ) ].join( ' ' ) );\n\t }\n\t if( deleted.length ){\n\t msgs.push( ( !this.showDeleted )?\n\t ([ deleted.length, toggleLink( 'toggle-deleted-link', _l( 'deleted' ) ) ].join( ' ' ))\n\t :( toggleLink( 'toggle-deleted-link', _l( 'hide deleted' ) ) )\n\t );\n\t }\n\t if( hidden.length ){\n\t msgs.push( ( !this.showHidden )?\n\t ([ hidden.length, toggleLink( 'toggle-hidden-link', _l( 'hidden' ) ) ].join( ' ' ))\n\t :( toggleLink( 'toggle-hidden-link', _l( 'hide hidden' ) ) )\n\t );\n\t }\n\t return $whereTo.find( '> .controls .subtitle' ).html( msgs.join( ', ' ) );\n\t },\n\t\n\t /** render the tags sub-view controller */\n\t _renderTags : function( $where ){\n\t var panel = this;\n\t this.tagsEditor = new TAGS.TagsEditor({\n\t model : this.model,\n\t el : $where.find( '.controls .tags-display' ),\n\t onshowFirstTime : function(){ this.render(); },\n\t // show hide sub-view tag editors when this is shown/hidden\n\t onshow : function(){\n\t panel.toggleHDATagEditors( true, panel.fxSpeed );\n\t },\n\t onhide : function(){\n\t panel.toggleHDATagEditors( false, panel.fxSpeed );\n\t },\n\t $activator : faIconButton({\n\t title : _l( 'Edit history tags' ),\n\t classes : 'history-tag-btn',\n\t faIcon : 'fa-tags'\n\t }).appendTo( $where.find( '.controls .actions' ) )\n\t });\n\t },\n\t /** render the annotation sub-view controller */\n\t _renderAnnotation : function( $where ){\n\t var panel = this;\n\t this.annotationEditor = new ANNOTATIONS.AnnotationEditor({\n\t model : this.model,\n\t el : $where.find( '.controls .annotation-display' ),\n\t onshowFirstTime : function(){ this.render(); },\n\t // show hide sub-view view annotation editors when this is shown/hidden\n\t onshow : function(){\n\t panel.toggleHDAAnnotationEditors( true, panel.fxSpeed );\n\t },\n\t onhide : function(){\n\t panel.toggleHDAAnnotationEditors( false, panel.fxSpeed );\n\t },\n\t $activator : faIconButton({\n\t title : _l( 'Edit history annotation' ),\n\t classes : 'history-annotate-btn',\n\t faIcon : 'fa-comment'\n\t }).appendTo( $where.find( '.controls .actions' ) )\n\t });\n\t },\n\t\n\t /** Set up HistoryViewEdit js/widget behaviours\n\t * In this override, make the name editable\n\t */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t _super.prototype._setUpBehaviors.call( this, $where );\n\t if( !this.model ){ return; }\n\t\n\t // anon users shouldn't have access to any of the following\n\t if( ( !Galaxy.user || Galaxy.user.isAnonymous() )\n\t || ( Galaxy.user.id !== this.model.get( 'user_id' ) ) ){\n\t return;\n\t }\n\t\n\t var panel = this,\n\t nameSelector = '> .controls .name';\n\t $where.find( nameSelector )\n\t .attr( 'title', _l( 'Click to rename history' ) )\n\t .tooltip({ placement: 'bottom' })\n\t .make_text_editable({\n\t on_finish: function( newName ){\n\t var previousName = panel.model.get( 'name' );\n\t if( newName && newName !== previousName ){\n\t panel.$el.find( nameSelector ).text( newName );\n\t panel.model.save({ name: newName })\n\t .fail( function(){\n\t panel.$el.find( nameSelector ).text( panel.model.previous( 'name' ) );\n\t });\n\t } else {\n\t panel.$el.find( nameSelector ).text( previousName );\n\t }\n\t }\n\t });\n\t },\n\t\n\t /** return a new popup menu for choosing a multi selection action\n\t * ajax calls made for multiple datasets are queued\n\t */\n\t multiselectActions : function(){\n\t var panel = this,\n\t actions = [\n\t { html: _l( 'Hide datasets' ), func: function(){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype.hide;\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t },\n\t { html: _l( 'Unhide datasets' ), func: function(){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype.unhide;\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t },\n\t { html: _l( 'Delete datasets' ), func: function(){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype['delete'];\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t },\n\t { html: _l( 'Undelete datasets' ), func: function(){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype.undelete;\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t }\n\t ];\n\t if( panel.purgeAllowed ){\n\t actions.push({\n\t html: _l( 'Permanently delete datasets' ), func: function(){\n\t if( confirm( _l( 'This will permanently remove the data in your datasets. Are you sure?' ) ) ){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype.purge;\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t }\n\t });\n\t }\n\t actions = actions.concat( panel._collectionActions() );\n\t return actions;\n\t },\n\t\n\t /** */\n\t _collectionActions : function(){\n\t var panel = this;\n\t return [\n\t { html: _l( 'Build Dataset List' ), func: function() {\n\t LIST_COLLECTION_CREATOR.createListCollection( panel.getSelectedModels() )\n\t .done( function(){ panel.model.refresh() });\n\t }\n\t },\n\t // TODO: Only show quick pair if two things selected.\n\t { html: _l( 'Build Dataset Pair' ), func: function() {\n\t PAIR_COLLECTION_CREATOR.createPairCollection( panel.getSelectedModels() )\n\t .done( function(){ panel.model.refresh() });\n\t }\n\t },\n\t { html: _l( 'Build List of Dataset Pairs' ), func: function() {\n\t LIST_OF_PAIRS_COLLECTION_CREATOR.createListOfPairsCollection( panel.getSelectedModels() )\n\t .done( function(){ panel.model.refresh() });\n\t }\n\t },\n\t ];\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-views\n\t // reverse HID order\n\t /** Override to reverse order of views - newest contents on top */\n\t _attachItems : function( $whereTo ){\n\t this.$list( $whereTo ).append( this.views.reverse().map( function( view ){\n\t return view.$el;\n\t }));\n\t return this;\n\t },\n\t\n\t /** Override to add new contents at the top */\n\t _attachView : function( view ){\n\t var panel = this;\n\t // override to control where the view is added, how/whether it's rendered\n\t panel.views.unshift( view );\n\t panel.$list().prepend( view.render( 0 ).$el.hide() );\n\t panel.trigger( 'view:attached', view );\n\t view.$el.slideDown( panel.fxSpeed, function(){\n\t panel.trigger( 'view:attached:rendered' );\n\t });\n\t },\n\t\n\t /** In this override, add purgeAllowed and whether tags/annotation editors should be shown */\n\t _getItemViewOptions : function( model ){\n\t var options = _super.prototype._getItemViewOptions.call( this, model );\n\t _.extend( options, {\n\t purgeAllowed : this.purgeAllowed,\n\t//TODO: not working\n\t tagsEditorShown : ( this.tagsEditor && !this.tagsEditor.hidden ),\n\t annotationEditorShown : ( this.annotationEditor && !this.annotationEditor.hidden )\n\t });\n\t return options;\n\t },\n\t\n\t ///** Override to alter data in drag based on multiselection */\n\t //_setUpItemViewListeners : function( view ){\n\t // var panel = this;\n\t // _super.prototype._setUpItemViewListeners.call( panel, view );\n\t //\n\t //},\n\t\n\t /** If this item is deleted and we're not showing deleted items, remove the view\n\t * @param {Model} the item model to check\n\t */\n\t _handleHdaDeletionChange : function( itemModel ){\n\t if( itemModel.get( 'deleted' ) && !this.showDeleted ){\n\t this.removeItemView( itemModel );\n\t }\n\t this._renderCounts();\n\t },\n\t\n\t /** If this item is hidden and we're not showing hidden items, remove the view\n\t * @param {Model} the item model to check\n\t */\n\t _handleHdaVisibleChange : function( itemModel ){\n\t if( itemModel.hidden() && !this.showHidden ){\n\t this.removeItemView( itemModel );\n\t }\n\t this._renderCounts();\n\t },\n\t\n\t /** toggle the visibility of each content's tagsEditor applying all the args sent to this function */\n\t toggleHDATagEditors : function( showOrHide ){\n\t var args = Array.prototype.slice.call( arguments, 1 );\n\t _.each( this.views, function( view ){\n\t if( view.tagsEditor ){\n\t view.tagsEditor.toggle.apply( view.tagsEditor, args );\n\t }\n\t });\n\t },\n\t\n\t /** toggle the visibility of each content's annotationEditor applying all the args sent to this function */\n\t toggleHDAAnnotationEditors : function( showOrHide ){\n\t var args = Array.prototype.slice.call( arguments, 1 );\n\t _.each( this.views, function( view ){\n\t if( view.annotationEditor ){\n\t view.annotationEditor.toggle.apply( view.annotationEditor, args );\n\t }\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel events\n\t /** event map */\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .show-selectors-btn' : 'toggleSelectors',\n\t 'click .toggle-deleted-link' : function( ev ){ this.toggleShowDeleted(); },\n\t 'click .toggle-hidden-link' : function( ev ){ this.toggleShowHidden(); }\n\t }),\n\t\n\t /** Update the history size display (curr. upper right of panel).\n\t */\n\t updateHistoryDiskSize : function(){\n\t this.$el.find( '.history-size' ).text( this.model.get( 'nice_size' ) );\n\t },\n\t\n\t // ------------------------------------------------------------------------ as drop target\n\t /** */\n\t dropTargetOn : function(){\n\t if( this.dropTarget ){ return this; }\n\t this.dropTarget = true;\n\t\n\t //TODO: to init\n\t var dropHandlers = {\n\t 'dragenter' : _.bind( this.dragenter, this ),\n\t 'dragover' : _.bind( this.dragover, this ),\n\t 'dragleave' : _.bind( this.dragleave, this ),\n\t 'drop' : _.bind( this.drop, this )\n\t };\n\t//TODO: scroll to top\n\t var $dropTarget = this._renderDropTarget();\n\t this.$list().before([ this._renderDropTargetHelp(), $dropTarget ]);\n\t for( var evName in dropHandlers ){\n\t if( dropHandlers.hasOwnProperty( evName ) ){\n\t //console.debug( evName, dropHandlers[ evName ] );\n\t $dropTarget.on( evName, dropHandlers[ evName ] );\n\t }\n\t }\n\t return this;\n\t },\n\t\n\t /** */\n\t _renderDropTarget : function(){\n\t this.$( '.history-drop-target' ).remove();\n\t return $( '
            ' ).addClass( 'history-drop-target' )\n\t .css({\n\t 'height': '64px',\n\t 'margin': '0px 10px 10px 10px',\n\t 'border': '1px dashed black',\n\t 'border-radius' : '3px'\n\t });\n\t },\n\t\n\t /** */\n\t _renderDropTargetHelp : function(){\n\t this.$( '.history-drop-target-help' ).remove();\n\t return $( '
            ' ).addClass( 'history-drop-target-help' )\n\t .css({\n\t 'margin' : '10px 10px 4px 10px',\n\t 'color' : 'grey',\n\t 'font-size' : '80%',\n\t 'font-style' : 'italic'\n\t })\n\t .text( _l( 'Drag datasets here to copy them to the current history' ) );\n\t },\n\t\n\t /** */\n\t dropTargetOff : function(){\n\t if( !this.dropTarget ){ return this; }\n\t //this.log( 'dropTargetOff' );\n\t this.dropTarget = false;\n\t var dropTarget = this.$( '.history-drop-target' ).get(0);\n\t for( var evName in this._dropHandlers ){\n\t if( this._dropHandlers.hasOwnProperty( evName ) ){\n\t dropTarget.off( evName, this._dropHandlers[ evName ] );\n\t }\n\t }\n\t this.$( '.history-drop-target' ).remove();\n\t this.$( '.history-drop-target-help' ).remove();\n\t return this;\n\t },\n\t /** */\n\t dropTargetToggle : function(){\n\t if( this.dropTarget ){\n\t this.dropTargetOff();\n\t } else {\n\t this.dropTargetOn();\n\t }\n\t return this;\n\t },\n\t\n\t /** */\n\t dragenter : function( ev ){\n\t //console.debug( 'dragenter:', this, ev );\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t this.$( '.history-drop-target' ).css( 'border', '2px solid black' );\n\t },\n\t /** */\n\t dragover : function( ev ){\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t },\n\t /** */\n\t dragleave : function( ev ){\n\t //console.debug( 'dragleave:', this, ev );\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t this.$( '.history-drop-target' ).css( 'border', '1px dashed black' );\n\t },\n\t /** */\n\t drop : function( ev ){\n\t ev.preventDefault();\n\t //ev.stopPropagation();\n\t\n\t var dataTransfer = ev.originalEvent.dataTransfer;\n\t dataTransfer.dropEffect = 'move';\n\t\n\t var panel = this,\n\t data = dataTransfer.getData( \"text\" );\n\t try {\n\t data = JSON.parse( data );\n\t\n\t } catch( err ){\n\t this.warn( 'error parsing JSON from drop:', data );\n\t }\n\t this.trigger( 'droptarget:drop', ev, data, panel );\n\t return false;\n\t },\n\t\n\t /** */\n\t dataDropped : function( data ){\n\t var panel = this;\n\t // HDA: dropping will copy it to the history\n\t if( _.isObject( data ) && data.model_class === 'HistoryDatasetAssociation' && data.id ){\n\t return panel.model.contents.copy( data.id );\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t // ........................................................................ misc\n\t /** Return a string rep of the history */\n\t toString : function(){\n\t return 'HistoryViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t//==============================================================================\n\t return {\n\t HistoryViewEdit : HistoryViewEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 132 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(100),\n\t __webpack_require__(99),\n\t __webpack_require__(47),\n\t __webpack_require__(96),\n\t __webpack_require__(98),\n\t __webpack_require__(105),\n\t __webpack_require__(26),\n\t __webpack_require__(51),\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(108)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(\n\t LIST_VIEW,\n\t HISTORY_MODEL,\n\t HISTORY_CONTENTS,\n\t HDA_LI,\n\t HDCA_LI,\n\t USER,\n\t faIconButton,\n\t PopupMenu,\n\t BASE_MVC,\n\t _l\n\t){\n\t\n\tvar logNamespace = 'history';\n\t\n\t// ============================================================================\n\t/** session storage for individual history preferences */\n\tvar HistoryPrefs = BASE_MVC.SessionStorageModel.extend(\n\t/** @lends HistoryPrefs.prototype */{\n\t//TODO:?? possibly mark as current T/F - have History.currId() (a class method) return that value\n\t defaults : {\n\t//TODO:?? expandedIds to array?\n\t expandedIds : {},\n\t //TODO:?? move to user?\n\t show_deleted : false,\n\t show_hidden : false\n\t //TODO: add scroll position?\n\t },\n\t /** add an hda id to the hash of expanded hdas */\n\t addExpanded : function( model ){\n\t var key = 'expandedIds';\n\t//TODO:?? is this right anymore?\n\t this.save( key, _.extend( this.get( key ), _.object([ model.id ], [ model.get( 'id' ) ]) ) );\n\t },\n\t /** remove an hda id from the hash of expanded hdas */\n\t removeExpanded : function( model ){\n\t var key = 'expandedIds';\n\t this.save( key, _.omit( this.get( key ), model.id ) );\n\t },\n\t toString : function(){\n\t return 'HistoryPrefs(' + this.id + ')';\n\t }\n\t});\n\t// class lvl for access w/o instantiation\n\tHistoryPrefs.storageKeyPrefix = 'history:';\n\t\n\t/** key string to store each histories settings under */\n\tHistoryPrefs.historyStorageKey = function historyStorageKey( historyId ){\n\t if( !historyId ){\n\t throw new Error( 'HistoryPrefs.historyStorageKey needs valid id: ' + historyId );\n\t }\n\t // single point of change\n\t return ( HistoryPrefs.storageKeyPrefix + historyId );\n\t};\n\t/** return the existing storage for the history with the given id (or create one if it doesn't exist) */\n\tHistoryPrefs.get = function get( historyId ){\n\t return new HistoryPrefs({ id: HistoryPrefs.historyStorageKey( historyId ) });\n\t};\n\t/** clear all history related items in sessionStorage */\n\tHistoryPrefs.clearAll = function clearAll( historyId ){\n\t for( var key in sessionStorage ){\n\t if( key.indexOf( HistoryPrefs.storageKeyPrefix ) === 0 ){\n\t sessionStorage.removeItem( key );\n\t }\n\t }\n\t};\n\t\n\t\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\t/** @class non-editable, read-only View/Controller for a history model.\n\t * Allows:\n\t * changing the loaded history\n\t * displaying data, info, and download\n\t * tracking history attrs: size, tags, annotations, name, etc.\n\t * Does not allow:\n\t * changing the name\n\t */\n\tvar _super = LIST_VIEW.ModelListPanel;\n\tvar HistoryView = _super.extend(\n\t/** @lends HistoryView.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t /** class to use for constructing the HDA views */\n\t HDAViewClass : HDA_LI.HDAListItemView,\n\t /** class to use for constructing the HDCA views */\n\t HDCAViewClass : HDCA_LI.HDCAListItemView,\n\t /** class to used for constructing collection of sub-view models */\n\t collectionClass : HISTORY_CONTENTS.HistoryContents,\n\t /** key of attribute in model to assign to this.collection */\n\t modelCollectionKey : 'contents',\n\t\n\t tagName : 'div',\n\t className : _super.prototype.className + ' history-panel',\n\t\n\t /** string to display when the collection is empty */\n\t emptyMsg : _l( 'This history is empty' ),\n\t /** displayed when no items match the search terms */\n\t noneFoundMsg : _l( 'No matching datasets found' ),\n\t /** string used for search placeholder */\n\t searchPlaceholder : _l( 'search datasets' ),\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, bind listeners.\n\t * @param {Object} attributes optional settings for the panel\n\t */\n\t initialize : function( attributes ){\n\t _super.prototype.initialize.call( this, attributes );\n\t // ---- instance vars\n\t // control contents/behavior based on where (and in what context) the panel is being used\n\t /** where should pages from links be displayed? (default to new tab/window) */\n\t this.linkTarget = attributes.linkTarget || '_blank';\n\t },\n\t\n\t /** In this override, clear the update timer on the model */\n\t freeModel : function(){\n\t _super.prototype.freeModel.call( this );\n\t//TODO: move to History.free()\n\t if( this.model ){\n\t this.model.clearUpdateTimeout();\n\t }\n\t return this;\n\t },\n\t\n\t /** create any event listeners for the panel\n\t * @fires: rendered:initial on the first render\n\t * @fires: empty-history when switching to a history with no contents or creating a new history\n\t */\n\t _setUpListeners : function(){\n\t _super.prototype._setUpListeners.call( this );\n\t this.on({\n\t error : function( model, xhr, options, msg, details ){\n\t this.errorHandler( model, xhr, options, msg, details );\n\t },\n\t 'loading-done' : function(){\n\t //TODO:?? if( this.collection.length ){\n\t if( !this.views.length ){\n\t this.trigger( 'empty-history', this );\n\t }\n\t },\n\t 'views:ready view:attached view:removed' : function( view ){\n\t this._renderSelectButton();\n\t }\n\t });\n\t // this.on( 'all', function(){ console.debug( arguments ); });\n\t },\n\t\n\t // ------------------------------------------------------------------------ loading history/hda models\n\t //NOTE: all the following fns replace the existing history model with a new model\n\t // (in the following 'details' refers to the full set of contents api data (urls, display_apps, misc_info, etc.)\n\t // - contents w/o details will have summary data only (name, hid, deleted, visible, state, etc.))\n\t//TODO: too tangled...\n\t\n\t /** loads a history & contents, getting details of any contents whose ids are stored in sessionStorage\n\t * (but does not make them the current history)\n\t */\n\t loadHistoryWithDetails : function( historyId, attributes, historyFn, contentsFn ){\n\t this.info( 'loadHistoryWithDetails:', historyId, attributes, historyFn, contentsFn );\n\t var detailIdsFn = function( historyData ){\n\t // will be called to get content ids that need details from the api\n\t//TODO:! non-visible contents are getting details loaded... either stop loading them at all or filter ids thru isVisible\n\t return _.values( HistoryPrefs.get( historyData.id ).get( 'expandedIds' ) );\n\t };\n\t return this.loadHistory( historyId, attributes, historyFn, contentsFn, detailIdsFn );\n\t },\n\t\n\t /** loads a history & contents (but does not make them the current history) */\n\t loadHistory : function( historyId, attributes, historyFn, contentsFn, detailIdsFn ){\n\t this.info( 'loadHistory:', historyId, attributes, historyFn, contentsFn, detailIdsFn );\n\t var panel = this;\n\t attributes = attributes || {};\n\t\n\t panel.trigger( 'loading', panel );\n\t //this.info( 'loadHistory:', historyId, attributes, historyFn, contentsFn, detailIdsFn );\n\t var xhr = HISTORY_MODEL.History.getHistoryData( historyId, {\n\t historyFn : historyFn,\n\t contentsFn : contentsFn,\n\t detailIdsFn : attributes.initiallyExpanded || detailIdsFn\n\t });\n\t\n\t return panel._loadHistoryFromXHR( xhr, attributes )\n\t .fail( function( xhr, where, history ){\n\t // throw an error up for the error handler\n\t panel.trigger( 'error', panel, xhr, attributes, _l( 'An error was encountered while ' + where ),\n\t { historyId: historyId, history: history || {} });\n\t })\n\t .always( function(){\n\t // bc _hideLoadingIndicator relies on this firing\n\t panel.trigger( 'loading-done', panel );\n\t });\n\t },\n\t\n\t /** given an xhr that will provide both history and contents data, pass data to set model or handle xhr errors */\n\t _loadHistoryFromXHR : function( xhr, attributes ){\n\t var panel = this;\n\t xhr.then( function( historyJSON, contentsJSON ){\n\t panel.JSONToModel( historyJSON, contentsJSON, attributes );\n\t panel.render();\n\t });\n\t xhr.fail( function( xhr, where ){\n\t // render anyways - whether we get a model or not\n\t panel.render();\n\t });\n\t return xhr;\n\t },\n\t\n\t /** convenience alias to the model. Updates the item list only (not the history) */\n\t refreshContents : function( detailIds, options ){\n\t if( this.model ){\n\t return this.model.refresh( detailIds, options );\n\t }\n\t // may have callbacks - so return an empty promise\n\t return $.when();\n\t },\n\t\n\t//TODO:?? seems unneccesary\n\t//TODO: Maybe better in History?\n\t /** create a new history model from JSON and call setModel on it */\n\t JSONToModel : function( newHistoryJSON, newHdaJSON, attributes ){\n\t this.log( 'JSONToModel:', newHistoryJSON, newHdaJSON, attributes );\n\t attributes = attributes || {};\n\t //this.log( 'JSONToModel:', newHistoryJSON, newHdaJSON.length, attributes );\n\t\n\t var model = new HISTORY_MODEL.History( newHistoryJSON, newHdaJSON, attributes );\n\t//TODO:?? here?\n\t this.setModel( model );\n\t return model;\n\t },\n\t\n\t /** release/free/shutdown old models and set up panel for new models\n\t * @fires new-model with the panel as parameter\n\t */\n\t setModel : function( model, attributes ){\n\t attributes = attributes || {};\n\t _super.prototype.setModel.call( this, model, attributes );\n\t if( this.model ){\n\t this._setUpWebStorage( attributes.initiallyExpanded, attributes.show_deleted, attributes.show_hidden );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ browser stored prefs\n\t /** Set up client side storage. Currently PersistanStorage keyed under 'history:'\n\t * @param {Object} initiallyExpanded\n\t * @param {Boolean} show_deleted whether to show deleted contents (overrides stored)\n\t * @param {Boolean} show_hidden\n\t * @see PersistentStorage\n\t */\n\t _setUpWebStorage : function( initiallyExpanded, show_deleted, show_hidden ){\n\t //if( !this.model ){ return this; }\n\t //this.log( '_setUpWebStorage', initiallyExpanded, show_deleted, show_hidden );\n\t if( this.storage ){\n\t this.stopListening( this.storage );\n\t }\n\t\n\t this.storage = new HistoryPrefs({\n\t id: HistoryPrefs.historyStorageKey( this.model.get( 'id' ) )\n\t });\n\t\n\t // expandedIds is a map of content.ids -> a boolean repr'ing whether that item's body is already expanded\n\t // store any pre-expanded ids passed in\n\t if( _.isObject( initiallyExpanded ) ){\n\t this.storage.set( 'expandedIds', initiallyExpanded );\n\t }\n\t\n\t // get the show_deleted/hidden settings giving priority to values passed in, using web storage otherwise\n\t // if the page has specifically requested show_deleted/hidden, these will be either true or false\n\t // (as opposed to undefined, null) - and we give priority to that setting\n\t if( _.isBoolean( show_deleted ) ){\n\t this.storage.set( 'show_deleted', show_deleted );\n\t }\n\t if( _.isBoolean( show_hidden ) ){\n\t this.storage.set( 'show_hidden', show_hidden );\n\t }\n\t\n\t this.trigger( 'new-storage', this.storage, this );\n\t this.log( this + ' (init\\'d) storage:', this.storage.get() );\n\t\n\t this.listenTo( this.storage, {\n\t 'change:show_deleted' : function( view, newVal ){\n\t this.showDeleted = newVal;\n\t },\n\t 'change:show_hidden' : function( view, newVal ){\n\t this.showHidden = newVal;\n\t }\n\t }, this );\n\t this.showDeleted = ( show_deleted !== undefined )? show_deleted : this.storage.get( 'show_deleted' );\n\t this.showHidden = ( show_hidden !== undefined )? show_hidden : this.storage.get( 'show_hidden' );\n\t\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel rendering\n\t /** In this override, add a btn to toggle the selectors */\n\t _buildNewRender : function(){\n\t var $newRender = _super.prototype._buildNewRender.call( this );\n\t this._renderSelectButton( $newRender );\n\t return $newRender;\n\t },\n\t\n\t /** button for starting select mode */\n\t _renderSelectButton : function( $where ){\n\t $where = $where || this.$el;\n\t // do not render selector option if no actions\n\t if( !this.multiselectActions().length ){\n\t return null;\n\t }\n\t // do not render (and remove even) if nothing to select\n\t if( !this.views.length ){\n\t this.hideSelectors();\n\t $where.find( '.controls .actions .show-selectors-btn' ).remove();\n\t return null;\n\t }\n\t // don't bother rendering if there's one already\n\t var $existing = $where.find( '.controls .actions .show-selectors-btn' );\n\t if( $existing.size() ){\n\t return $existing;\n\t }\n\t\n\t return faIconButton({\n\t title : _l( 'Operations on multiple datasets' ),\n\t classes : 'show-selectors-btn',\n\t faIcon : 'fa-check-square-o'\n\t }).prependTo( $where.find( '.controls .actions' ) );\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-views\n\t /** In this override, since history contents are mixed,\n\t * get the appropo view class based on history_content_type\n\t */\n\t _getItemViewClass : function( model ){\n\t var contentType = model.get( \"history_content_type\" );\n\t switch( contentType ){\n\t case 'dataset':\n\t return this.HDAViewClass;\n\t case 'dataset_collection':\n\t return this.HDCAViewClass;\n\t }\n\t throw new TypeError( 'Unknown history_content_type: ' + contentType );\n\t },\n\t\n\t /** in this override, check if the contents would also display based on show_deleted/hidden */\n\t _filterItem : function( model ){\n\t var panel = this;\n\t return ( _super.prototype._filterItem.call( panel, model )\n\t && ( !model.hidden() || panel.showHidden )\n\t && ( !model.isDeletedOrPurged() || panel.showDeleted ) );\n\t },\n\t\n\t /** in this override, add a linktarget, and expand if id is in web storage */\n\t _getItemViewOptions : function( model ){\n\t var options = _super.prototype._getItemViewOptions.call( this, model );\n\t return _.extend( options, {\n\t linkTarget : this.linkTarget,\n\t expanded : !!this.storage.get( 'expandedIds' )[ model.id ],\n\t hasUser : this.model.ownedByCurrUser()\n\t });\n\t },\n\t\n\t /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n\t _setUpItemViewListeners : function( view ){\n\t var panel = this;\n\t _super.prototype._setUpItemViewListeners.call( panel, view );\n\t\n\t //TODO:?? could use 'view:expanded' here?\n\t // maintain a list of items whose bodies are expanded\n\t view.on( 'expanded', function( v ){\n\t panel.storage.addExpanded( v.model );\n\t });\n\t view.on( 'collapsed', function( v ){\n\t panel.storage.removeExpanded( v.model );\n\t });\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ selection\n\t /** Override to correctly set the historyId of the new collection */\n\t getSelectedModels : function(){\n\t var collection = _super.prototype.getSelectedModels.call( this );\n\t collection.historyId = this.collection.historyId;\n\t return collection;\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel events\n\t /** event map */\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t // toggle list item selectors\n\t 'click .show-selectors-btn' : 'toggleSelectors',\n\t // allow (error) messages to be clicked away\n\t 'click .messages [class$=message]' : 'clearMessages'\n\t }),\n\t\n\t /** Handle the user toggling the deleted visibility by:\n\t * (1) storing the new value in the persistent storage\n\t * (2) re-rendering the history\n\t * @returns {Boolean} new show_deleted setting\n\t */\n\t toggleShowDeleted : function( show, store ){\n\t show = ( show !== undefined )?( show ):( !this.showDeleted );\n\t store = ( store !== undefined )?( store ):( true );\n\t this.showDeleted = show;\n\t if( store ){\n\t this.storage.set( 'show_deleted', show );\n\t }\n\t //TODO:?? to events on storage('change:show_deleted')\n\t this.renderItems();\n\t this.trigger( 'show-deleted', show );\n\t return this.showDeleted;\n\t },\n\t\n\t /** Handle the user toggling the hidden visibility by:\n\t * (1) storing the new value in the persistent storage\n\t * (2) re-rendering the history\n\t * @returns {Boolean} new show_hidden setting\n\t */\n\t toggleShowHidden : function( show, store ){\n\t show = ( show !== undefined )?( show ):( !this.showHidden );\n\t store = ( store !== undefined )?( store ):( true );\n\t this.showHidden = show;\n\t if( store ){\n\t this.storage.set( 'show_hidden', show );\n\t }\n\t //TODO:?? to events on storage('change:show_deleted')\n\t this.renderItems();\n\t this.trigger( 'show-hidden', show );\n\t return this.showHidden;\n\t },\n\t\n\t /** On the first search, if there are no details - load them, then search */\n\t _firstSearch : function( searchFor ){\n\t var panel = this,\n\t inputSelector = '.history-search-input';\n\t this.log( 'onFirstSearch', searchFor );\n\t\n\t if( panel.model.contents.haveDetails() ){\n\t panel.searchItems( searchFor );\n\t return;\n\t }\n\t\n\t panel.$el.find( inputSelector ).searchInput( 'toggle-loading' );\n\t panel.model.contents.fetchAllDetails({ silent: true })\n\t .always( function(){\n\t panel.$el.find( inputSelector ).searchInput( 'toggle-loading' );\n\t })\n\t .done( function(){\n\t panel.searchItems( panel.searchFor );\n\t });\n\t },\n\t\n\t//TODO: break this out\n\t // ........................................................................ error handling\n\t /** Event handler for errors (from the panel, the history, or the history's contents)\n\t * @param {Model or View} model the (Backbone) source of the error\n\t * @param {XMLHTTPRequest} xhr any ajax obj. assoc. with the error\n\t * @param {Object} options the options map commonly used with bbone ajax\n\t * @param {String} msg optional message passed to ease error location\n\t * @param {Object} msg optional object containing error details\n\t */\n\t errorHandler : function( model, xhr, options, msg, details ){\n\t this.error( model, xhr, options, msg, details );\n\t\n\t // interrupted ajax\n\t if( xhr && xhr.status === 0 && xhr.readyState === 0 ){\n\t //TODO: gmail style 'retrying in Ns'\n\t\n\t // bad gateway\n\t } else if( xhr && xhr.status === 502 ){\n\t //TODO: gmail style 'retrying in Ns'\n\t\n\t // otherwise, show an error message inside the panel\n\t } else {\n\t // if sentry is available, attempt to get the event id\n\t var parsed = this._parseErrorMessage( model, xhr, options, msg, details );\n\t // it's possible to have a triggered error before the message container is rendered - wait for it to show\n\t if( !this.$messages().is( ':visible' ) ){\n\t this.once( 'rendered', function(){\n\t this.displayMessage( 'error', parsed.message, parsed.details );\n\t });\n\t } else {\n\t this.displayMessage( 'error', parsed.message, parsed.details );\n\t }\n\t }\n\t },\n\t\n\t /** Parse an error event into an Object usable by displayMessage based on the parameters\n\t * note: see errorHandler for more info on params\n\t */\n\t _parseErrorMessage : function( model, xhr, options, msg, details, sentryId ){\n\t //if( xhr.responseText ){\n\t // xhr.responseText = _.escape( xhr.responseText );\n\t //}\n\t var user = Galaxy.user,\n\t // add the args (w/ some extra info) into an obj\n\t parsed = {\n\t message : this._bePolite( msg ),\n\t details : {\n\t message : msg,\n\t raven : ( window.Raven && _.isFunction( Raven.lastEventId) )?\n\t ( Raven.lastEventId() ):( undefined ),\n\t agent : navigator.userAgent,\n\t // add ajax data from Galaxy object cache\n\t url : ( window.Galaxy )?( Galaxy.lastAjax.url ):( undefined ),\n\t data : ( window.Galaxy )?( Galaxy.lastAjax.data ):( undefined ),\n\t options : ( xhr )?( _.omit( options, 'xhr' ) ):( options ),\n\t xhr : xhr,\n\t source : ( _.isFunction( model.toJSON ) )?( model.toJSON() ):( model + '' ),\n\t user : ( user instanceof USER.User )?( user.toJSON() ):( user + '' )\n\t }\n\t };\n\t\n\t // add any extra details passed in\n\t _.extend( parsed.details, details || {} );\n\t // fancy xhr.header parsing (--> obj)\n\t if( xhr && _.isFunction( xhr.getAllResponseHeaders ) ){\n\t var responseHeaders = xhr.getAllResponseHeaders();\n\t responseHeaders = _.compact( responseHeaders.split( '\\n' ) );\n\t responseHeaders = _.map( responseHeaders, function( header ){\n\t return header.split( ': ' );\n\t });\n\t parsed.details.xhr.responseHeaders = _.object( responseHeaders );\n\t }\n\t return parsed;\n\t },\n\t\n\t /** Modify an error message to be fancy and wear a monocle. */\n\t _bePolite : function( msg ){\n\t msg = msg || _l( 'An error occurred while getting updates from the server' );\n\t return msg + '. ' + _l( 'Please contact a Galaxy administrator if the problem persists' ) + '.';\n\t },\n\t\n\t // ........................................................................ (error) messages\n\t /** Display a message in the top of the panel.\n\t * @param {String} type type of message ('done', 'error', 'warning')\n\t * @param {String} msg the message to display\n\t * @param {Object or HTML} modal contents displayed when the user clicks 'details' in the message\n\t */\n\t displayMessage : function( type, msg, details ){\n\t //precondition: msgContainer must have been rendered even if there's no model\n\t var panel = this;\n\t //this.log( 'displayMessage', type, msg, details );\n\t\n\t this.scrollToTop();\n\t var $msgContainer = this.$messages(),\n\t $msg = $( '
            ' ).addClass( type + 'message' ).html( msg );\n\t //this.log( ' ', $msgContainer );\n\t\n\t if( !_.isEmpty( details ) ){\n\t var $detailsLink = $( 'Details' )\n\t .click( function(){\n\t Galaxy.modal.show( panel._messageToModalOptions( type, msg, details ) );\n\t return false;\n\t });\n\t $msg.append( ' ', $detailsLink );\n\t }\n\t return $msgContainer.append( $msg );\n\t },\n\t\n\t /** convert msg and details into modal options usable by Galaxy.modal */\n\t _messageToModalOptions : function( type, msg, details ){\n\t // only error is fleshed out here\n\t var panel = this,\n\t options = { title: 'Details' };\n\t if( _.isObject( details ) ){\n\t\n\t details = _.omit( details, _.functions( details ) );\n\t var text = JSON.stringify( details, null, ' ' ),\n\t pre = $( '
            ' ).text( text );\n\t            options.body = $( '
            ' ).append( pre );\n\t\n\t } else {\n\t options.body = $( '
            ' ).html( details );\n\t }\n\t\n\t options.buttons = {\n\t 'Ok': function(){\n\t Galaxy.modal.hide();\n\t panel.clearMessages();\n\t }\n\t //TODO: if( type === 'error' ){ options.buttons[ 'Report this error' ] = function(){} }\n\t };\n\t return options;\n\t },\n\t\n\t /** Remove all messages from the panel. */\n\t clearMessages : function( ev ){\n\t var $target = !_.isUndefined( ev )?\n\t $( ev.currentTarget )\n\t :this.$messages().children( '[class$=\"message\"]' );\n\t $target.fadeOut( this.fxSpeed, function(){\n\t $( this ).remove();\n\t });\n\t return this;\n\t },\n\t\n\t // ........................................................................ scrolling\n\t /** Scrolls the panel to show the content sub-view with the given hid.\n\t * @param {Integer} hid the hid of item to scroll into view\n\t * @returns {HistoryView} the panel\n\t */\n\t scrollToHid : function( hid ){\n\t return this.scrollToItem( _.first( this.viewsWhereModel({ hid: hid }) ) );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** Return a string rep of the history */\n\t toString : function(){\n\t return 'HistoryView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//------------------------------------------------------------------------------ TEMPLATES\n\tHistoryView.prototype.templates = (function(){\n\t\n\t var controlsTemplate = BASE_MVC.wrapTemplate([\n\t '
            ',\n\t '
            ',\n\t '
            <%- history.name %>
            ',\n\t '
            ',\n\t '
            ',\n\t '
            <%- history.nice_size %>
            ',\n\t\n\t '
            ',\n\t\n\t '
            ',\n\t '<% if( history.deleted && history.purged ){ %>',\n\t '
            ',\n\t _l( 'This history has been purged and deleted' ),\n\t '
            ',\n\t '<% } else if( history.deleted ){ %>',\n\t '
            ',\n\t _l( 'This history has been deleted' ),\n\t '
            ',\n\t '<% } else if( history.purged ){ %>',\n\t '
            ',\n\t _l( 'This history has been purged' ),\n\t '
            ',\n\t '<% } %>',\n\t\n\t '<% if( history.message ){ %>',\n\t // should already be localized\n\t '
            messagesmall\">',\n\t '<%= history.message.text %>',\n\t '
            ',\n\t '<% } %>',\n\t '
            ',\n\t\n\t // add tags and annotations\n\t '
            ',\n\t '
            ',\n\t\n\t '
            ',\n\t '
            ',\n\t '
            ',\n\t\n\t '
            ',\n\t '
            ',\n\t '',\n\t '',\n\t '
            ',\n\t '
            ',\n\t '
            ',\n\t '
            ',\n\t '
            '\n\t ], 'history' );\n\t\n\t return _.extend( _.clone( _super.prototype.templates ), {\n\t controls : controlsTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HistoryView: HistoryView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 133 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(51),\n\t __webpack_require__(127),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( PopupMenu, historyCopyDialog, BASE_MVC, _l ){\n\t\n\t\"use strict\";\n\t// ============================================================================\n\tvar menu = [\n\t {\n\t html : _l( 'History Lists' ),\n\t header : true\n\t },\n\t {\n\t html : _l( 'Saved Histories' ),\n\t href : 'history/list',\n\t },\n\t {\n\t html : _l( 'Histories Shared with Me' ),\n\t href : 'history/list_shared'\n\t },\n\t\n\t {\n\t html : _l( 'History Actions' ),\n\t header : true,\n\t anon : true\n\t },\n\t {\n\t html : _l( 'Create New' ),\n\t func : function() {\n\t if( Galaxy && Galaxy.currHistoryPanel ){\n\t Galaxy.currHistoryPanel.createNewHistory();\n\t }\n\t },\n\t },\n\t {\n\t html : _l( 'Copy History' ),\n\t func : function() {\n\t historyCopyDialog( Galaxy.currHistoryPanel.model )\n\t .done( function(){\n\t Galaxy.currHistoryPanel.loadCurrentHistory();\n\t });\n\t },\n\t },\n\t {\n\t html : _l( 'Share or Publish' ),\n\t href : 'history/sharing',\n\t },\n\t {\n\t html : _l( 'Show Structure' ),\n\t href : 'history/display_structured',\n\t anon : true,\n\t },\n\t {\n\t html : _l( 'Extract Workflow' ),\n\t href : 'workflow/build_from_current_history',\n\t },\n\t {\n\t html : _l( 'Delete' ),\n\t confirm : _l( 'Really delete the current history?' ),\n\t href : 'history/delete_current',\n\t },\n\t {\n\t html : _l( 'Delete Permanently' ),\n\t confirm : _l( 'Really delete the current history permanently? This cannot be undone.' ),\n\t href : 'history/delete_current?purge=True',\n\t purge : true,\n\t anon : true,\n\t },\n\t\n\t\n\t {\n\t html : _l( 'Dataset Actions' ),\n\t header : true,\n\t anon : true\n\t },\n\t {\n\t html : _l( 'Copy Datasets' ),\n\t href : 'dataset/copy_datasets',\n\t },\n\t {\n\t html : _l( 'Dataset Security' ),\n\t href : 'root/history_set_default_permissions',\n\t },\n\t {\n\t html : _l( 'Resume Paused Jobs' ),\n\t href : 'history/resume_paused_jobs?current=True',\n\t anon : true,\n\t },\n\t {\n\t html : _l( 'Collapse Expanded Datasets' ),\n\t func : function() {\n\t if( Galaxy && Galaxy.currHistoryPanel ){\n\t Galaxy.currHistoryPanel.collapseAll();\n\t }\n\t },\n\t },\n\t {\n\t html : _l( 'Unhide Hidden Datasets' ),\n\t anon : true,\n\t func : function() {\n\t if( Galaxy && Galaxy.currHistoryPanel && confirm( _l( 'Really unhide all hidden datasets?' ) ) ){\n\t var filtered = Galaxy.currHistoryPanel.model.contents.hidden();\n\t //TODO: batch\n\t filtered.ajaxQueue( Backbone.Model.prototype.save, { visible : true })\n\t .done( function(){\n\t Galaxy.currHistoryPanel.renderItems();\n\t })\n\t .fail( function(){\n\t alert( 'There was an error unhiding the datasets' );\n\t console.error( arguments );\n\t });\n\t }\n\t },\n\t },\n\t {\n\t html : _l( 'Delete Hidden Datasets' ),\n\t anon : true,\n\t func : function() {\n\t if( Galaxy && Galaxy.currHistoryPanel && confirm( _l( 'Really delete all hidden datasets?' ) ) ){\n\t var filtered = Galaxy.currHistoryPanel.model.contents.hidden();\n\t //TODO: batch\n\t // both delete *and* unhide them\n\t filtered.ajaxQueue( Backbone.Model.prototype.save, { deleted : true, visible: true })\n\t .done( function(){\n\t Galaxy.currHistoryPanel.renderItems();\n\t })\n\t .fail( function(){\n\t alert( 'There was an error deleting the datasets' );\n\t console.error( arguments );\n\t });\n\t }\n\t },\n\t },\n\t {\n\t html : _l( 'Purge Deleted Datasets' ),\n\t confirm : _l( 'Really delete all deleted datasets permanently? This cannot be undone.' ),\n\t href : 'history/purge_deleted_datasets',\n\t purge : true,\n\t anon : true,\n\t },\n\t\n\t\n\t {\n\t html : _l( 'Downloads' ),\n\t header : true\n\t },\n\t {\n\t html : _l( 'Export Tool Citations' ),\n\t href : 'history/citations',\n\t anon : true,\n\t },\n\t {\n\t html : _l( 'Export History to File' ),\n\t href : 'history/export_archive?preview=True',\n\t anon : true,\n\t },\n\t\n\t {\n\t html : _l( 'Other Actions' ),\n\t header : true\n\t },\n\t {\n\t html : _l( 'Import from File' ),\n\t href : 'history/import_archive',\n\t }\n\t];\n\t\n\tfunction buildMenu( isAnon, purgeAllowed, urlRoot ){\n\t return _.clone( menu ).filter( function( menuOption ){\n\t if( isAnon && !menuOption.anon ){\n\t return false;\n\t }\n\t if( !purgeAllowed && menuOption.purge ){\n\t return false;\n\t }\n\t\n\t //TODO:?? hard-coded galaxy_main\n\t if( menuOption.href ){\n\t menuOption.href = urlRoot + menuOption.href;\n\t menuOption.target = 'galaxy_main';\n\t }\n\t\n\t if( menuOption.confirm ){\n\t menuOption.func = function(){\n\t if( confirm( menuOption.confirm ) ){\n\t galaxy_main.location = menuOption.href;\n\t }\n\t };\n\t }\n\t return true;\n\t });\n\t}\n\t\n\tvar create = function( $button, options ){\n\t options = options || {};\n\t var isAnon = options.anonymous === undefined? true : options.anonymous,\n\t purgeAllowed = options.purgeAllowed || false,\n\t menu = buildMenu( isAnon, purgeAllowed, Galaxy.root );\n\t //console.debug( 'menu:', menu );\n\t return new PopupMenu( $button, menu );\n\t};\n\t\n\t\n\t// ============================================================================\n\t return create;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3)))\n\n/***/ },\n/* 134 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4),\n\t __webpack_require__(104),\n\t __webpack_require__(103),\n\t __webpack_require__(29),\n\t __webpack_require__(7),\n\t __webpack_require__(30),\n\t __webpack_require__(111)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils,\n\t UploadSettings,\n\t UploadFtp,\n\t Popover,\n\t Ui,\n\t Select\n\t ) {\n\t\n\t// renders the composite upload row view\n\treturn Backbone.View.extend({\n\t // states\n\t status_classes : {\n\t init : 'upload-mode fa fa-exclamation text-primary',\n\t ready : 'upload-mode fa fa-check text-success',\n\t running : 'upload-mode fa fa-spinner fa-spin',\n\t success : 'upload-mode fa fa-check',\n\t error : 'upload-mode fa fa-exclamation-triangle'\n\t },\n\t\n\t // initialize\n\t initialize: function(app, options) {\n\t // link app\n\t this.app = app;\n\t\n\t // link this\n\t var self = this;\n\t\n\t // create model\n\t this.model = options.model;\n\t\n\t // add upload row\n\t this.setElement(this._template(options.model));\n\t\n\t // build upload functions\n\t this.uploadinput = this.$el.uploadinput({\n\t ondragover: function() {\n\t if (self.model.get('enabled')) {\n\t self.$el.addClass('warning');\n\t }\n\t },\n\t ondragleave: function() {\n\t self.$el.removeClass('warning');\n\t },\n\t onchange: function(files) {\n\t if (self.model.get('status') != 'running' && files && files.length > 0) {\n\t self.model.reset({\n\t 'file_data': files[0],\n\t 'file_name': files[0].name,\n\t 'file_size': files[0].size,\n\t 'file_mode': files[0].mode || 'local'\n\t });\n\t self._refreshReady();\n\t }\n\t }\n\t });\n\t\n\t // source selection popup\n\t this.button_menu = new Ui.ButtonMenu({\n\t icon : 'fa-caret-down',\n\t title : 'Select',\n\t pull : 'left'\n\t });\n\t this.$('#source').append(this.button_menu.$el);\n\t this.button_menu.addMenu({\n\t icon : 'fa-laptop',\n\t title : 'Choose local file',\n\t onclick : function() {\n\t self.uploadinput.dialog();\n\t }\n\t });\n\t if (this.app.ftp_upload_site) {\n\t this.button_menu.addMenu({\n\t icon : 'fa-folder-open-o',\n\t title : 'Choose FTP file',\n\t onclick : function() {\n\t self._showFtp();\n\t }\n\t });\n\t }\n\t this.button_menu.addMenu({\n\t icon : 'fa-edit',\n\t title : 'Paste/Fetch data',\n\t onclick : function() {\n\t self.model.reset({\n\t 'file_mode': 'new',\n\t 'file_name': 'New File'\n\t });\n\t }\n\t });\n\t\n\t // add ftp file viewer\n\t this.ftp = new Popover.View({\n\t title : 'Choose FTP file:',\n\t container : this.$('#source').find('.ui-button-menu'),\n\t placement : 'right'\n\t });\n\t\n\t // append popup to settings icon\n\t this.settings = new Popover.View({\n\t title : 'Upload configuration',\n\t container : this.$('#settings'),\n\t placement : 'bottom'\n\t });\n\t\n\t //\n\t // ui events\n\t //\n\t\n\t // handle text editing event\n\t this.$('#text-content').on('change input', function(e) {\n\t self.model.set('url_paste', $(e.target).val());\n\t self.model.set('file_size', $(e.target).val().length);\n\t self._refreshReady();\n\t });\n\t\n\t // handle settings popover\n\t this.$('#settings').on('click' , function(e) { self._showSettings(); })\n\t .on('mousedown', function(e) { e.preventDefault(); });\n\t\n\t //\n\t // model events\n\t //\n\t this.model.on('change:percentage', function() {\n\t self._refreshPercentage();\n\t });\n\t this.model.on('change:status', function() {\n\t self._refreshStatus();\n\t });\n\t this.model.on('change:info', function() {\n\t self._refreshInfo();\n\t });\n\t this.model.on('change:file_name', function() {\n\t self._refreshFileName();\n\t });\n\t this.model.on('change:file_mode', function() {\n\t self._refreshMode();\n\t });\n\t this.model.on('change:file_size', function() {\n\t self._refreshFileSize();\n\t });\n\t this.model.on('remove', function() {\n\t self.remove();\n\t });\n\t this.app.collection.on('reset', function() {\n\t self.remove();\n\t });\n\t },\n\t\n\t // render\n\t render: function() {\n\t this.$('#file_name').html(this.model.get('file_name') || '-');\n\t this.$('#file_desc').html(this.model.get('file_desc') || 'Unavailable');\n\t this.$('#file_size').html(Utils.bytesToString (this.model.get('file_size')));\n\t this.$('#status').removeClass().addClass(this.status_classes.init);\n\t },\n\t\n\t // remove\n\t remove: function() {\n\t // call the base class remove method\n\t Backbone.View.prototype.remove.apply(this);\n\t },\n\t\n\t //\n\t // handle model events\n\t //\n\t\n\t // refresh ready or not states\n\t _refreshReady: function() {\n\t this.app.collection.each(function(model) {\n\t model.set('status', (model.get('file_size') > 0) && 'ready' || 'init');\n\t });\n\t },\n\t\n\t // refresh mode and e.g. show/hide textarea field\n\t _refreshMode: function() {\n\t var file_mode = this.model.get('file_mode');\n\t if (file_mode == 'new') {\n\t this.height = this.$el.height();\n\t this.$('#text').css({\n\t 'width' : this.$el.width() - 16 + 'px',\n\t 'top' : this.$el.height() - 8 + 'px'\n\t }).show();\n\t this.$el.height(this.$el.height() - 8 + this.$('#text').height() + 16);\n\t this.$('#text-content').val('').trigger('keyup');\n\t } else {\n\t this.$el.height(this.height);\n\t this.$('#text').hide();\n\t }\n\t },\n\t\n\t // information\n\t _refreshInfo: function() {\n\t var info = this.model.get('info');\n\t if (info) {\n\t this.$('#info-text').html('Failed: ' + info).show();\n\t } else {\n\t this.$('#info-text').hide();\n\t }\n\t },\n\t\n\t // percentage\n\t _refreshPercentage : function() {\n\t var percentage = parseInt(this.model.get('percentage'));\n\t if (percentage != 0) {\n\t this.$('.progress-bar').css({ width : percentage + '%' });\n\t } else {\n\t this.$('.progress-bar').addClass('no-transition');\n\t this.$('.progress-bar').css({ width : '0%' });\n\t this.$('.progress-bar')[0].offsetHeight;\n\t this.$('.progress-bar').removeClass('no-transition');\n\t }\n\t if (percentage != 100) {\n\t this.$('#percentage').html(percentage + '%');\n\t } else {\n\t this.$('#percentage').html('Adding to history...');\n\t }\n\t },\n\t\n\t // status\n\t _refreshStatus : function() {\n\t // identify new status\n\t var status = this.model.get('status');\n\t\n\t // identify symbol and reset classes\n\t this.$('#status').removeClass().addClass(this.status_classes[status]);\n\t\n\t // enable/disable model flag\n\t this.model.set('enabled', status != 'running');\n\t\n\t // enable/disable row fields\n\t this.$('#text-content').attr('disabled', !this.model.get('enabled'));\n\t\n\t // remove status classes\n\t this.$el.removeClass('success danger warning');\n\t\n\t // set status classes\n\t if (status == 'running' || status == 'ready') {\n\t this.model.set('percentage', 0);\n\t }\n\t if (status == 'running') {\n\t this.$('#source').find('.button').addClass('disabled');\n\t } else {\n\t this.$('#source').find('.button').removeClass('disabled');\n\t }\n\t if (status == 'success') {\n\t this.$el.addClass('success');\n\t this.model.set('percentage', 100);\n\t this.$('#percentage').html('100%');\n\t }\n\t if (status == 'error') {\n\t this.$el.addClass('danger');\n\t this.model.set('percentage', 0);\n\t this.$('#info-progress').hide();\n\t this.$('#info-text').show();\n\t } else {\n\t this.$('#info-progress').show();\n\t this.$('#info-text').hide();\n\t }\n\t },\n\t\n\t // file name\n\t _refreshFileName: function() {\n\t this.$('#file_name').html(this.model.get('file_name') || '-');\n\t },\n\t\n\t // file size\n\t _refreshFileSize: function() {\n\t this.$('#file_size').html(Utils.bytesToString (this.model.get('file_size')));\n\t },\n\t\n\t // show/hide ftp popup\n\t _showFtp: function() {\n\t if (!this.ftp.visible) {\n\t this.ftp.empty();\n\t var self = this;\n\t this.ftp.append((new UploadFtp({\n\t ftp_upload_site: this.app.ftp_upload_site,\n\t onchange: function(ftp_file) {\n\t self.ftp.hide();\n\t if (self.model.get('status') != 'running' && ftp_file) {\n\t self.model.reset({\n\t 'file_mode': 'ftp',\n\t 'file_name': ftp_file.path,\n\t 'file_size': ftp_file.size,\n\t 'file_path': ftp_file.path\n\t });\n\t self._refreshReady();\n\t }\n\t }\n\t })).$el);\n\t this.ftp.show();\n\t } else {\n\t this.ftp.hide();\n\t }\n\t },\n\t\n\t // show/hide settings popup\n\t _showSettings : function() {\n\t if (!this.settings.visible) {\n\t this.settings.empty();\n\t this.settings.append((new UploadSettings(this)).$el);\n\t this.settings.show();\n\t } else {\n\t this.settings.hide();\n\t }\n\t },\n\t\n\t // template\n\t _template: function(options) {\n\t return '' +\n\t '' +\n\t '
            ' +\n\t '
            ' +\n\t '
            ' +\n\t '
            You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.
            ' +\n\t '';\n } else {\n return '';\n }\n }\n });\n\n /** Creates a hidden element input field used e.g. in the tool form */\n var Hidden = Backbone.View.extend({\n initialize : function(options) {\n this.options = options;\n this.setElement(this._template(this.options));\n if (this.options.value !== undefined) {\n this.value(this.options.value);\n }\n },\n value : function (new_val) {\n if (new_val !== undefined) {\n this.$('hidden').val(new_val);\n }\n return this.$('hidden').val();\n },\n _template: function(options) {\n var tmpl = '
            ';\n if (options.info) {\n tmpl += '
            ' + options.info + '
            ';\n }\n tmpl += '' +\n '
            ';\n return tmpl;\n }\n });\n\n return {\n Anchor : Anchor,\n Button : Buttons.ButtonDefault,\n ButtonIcon : Buttons.ButtonIcon,\n ButtonCheck : Buttons.ButtonCheck,\n ButtonMenu : Buttons.ButtonMenu,\n ButtonLink : Buttons.ButtonLink,\n Icon : Icon,\n Image : Image,\n Input : Input,\n Label : Label,\n Message : Message,\n Modal : Modal,\n RadioButton : Options.RadioButton,\n Checkbox : Options.Checkbox,\n Radio : Options.Radio,\n Searchbox : Searchbox,\n Select : Select,\n Hidden : Hidden,\n Slider : Slider,\n Drilldown : Drilldown\n }\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-misc.js\n ** module id = 7\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.extend = extend;\nexports.indexOf = indexOf;\nexports.escapeExpression = escapeExpression;\nexports.isEmpty = isEmpty;\nexports.createFrame = createFrame;\nexports.blockParams = blockParams;\nexports.appendContextPath = appendContextPath;\nvar escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n '=': '='\n};\n\nvar badChars = /[&<>\"'`=]/g,\n possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n return escape[chr];\n}\n\nfunction extend(obj /* , ...source */) {\n for (var i = 1; i < arguments.length; i++) {\n for (var key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n}\n\nvar toString = Object.prototype.toString;\n\nexports.toString = toString;\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/* eslint-disable func-style */\nvar isFunction = function isFunction(value) {\n return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n exports.isFunction = isFunction = function (value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n}\nexports.isFunction = isFunction;\n\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\nvar isArray = Array.isArray || function (value) {\n return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n};\n\nexports.isArray = isArray;\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\nfunction indexOf(array, value) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n}\n\nfunction escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) {\n return string;\n }\n return string.replace(badChars, escapeChar);\n}\n\nfunction isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction createFrame(object) {\n var frame = extend({}, object);\n frame._parent = object;\n return frame;\n}\n\nfunction blockParams(params, ids) {\n params.path = ids;\n return params;\n}\n\nfunction appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxJQUFNLE1BQU0sR0FBRztBQUNiLEtBQUcsRUFBRSxPQUFPO0FBQ1osS0FBRyxFQUFFLE1BQU07QUFDWCxLQUFHLEVBQUUsTUFBTTtBQUNYLEtBQUcsRUFBRSxRQUFRO0FBQ2IsS0FBRyxFQUFFLFFBQVE7QUFDYixLQUFHLEVBQUUsUUFBUTtBQUNiLEtBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQzs7QUFFRixJQUFNLFFBQVEsR0FBRyxZQUFZO0lBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUM7O0FBRTdCLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN2QixTQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQjs7QUFFTSxTQUFTLE1BQU0sQ0FBQyxHQUFHLG9CQUFtQjtBQUMzQyxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxTQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1QixVQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDM0QsV0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUM5QjtLQUNGO0dBQ0Y7O0FBRUQsU0FBTyxHQUFHLENBQUM7Q0FDWjs7QUFFTSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0FBS2hELElBQUksVUFBVSxHQUFHLG9CQUFTLEtBQUssRUFBRTtBQUMvQixTQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDOzs7QUFHRixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNuQixVQUlNLFVBQVUsR0FKaEIsVUFBVSxHQUFHLFVBQVMsS0FBSyxFQUFFO0FBQzNCLFdBQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssbUJBQW1CLENBQUM7R0FDcEYsQ0FBQztDQUNIO1FBQ08sVUFBVSxHQUFWLFVBQVU7Ozs7O0FBSVgsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxVQUFTLEtBQUssRUFBRTtBQUN0RCxTQUFPLEFBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUNqRyxDQUFDOzs7OztBQUdLLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDcEMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxRQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDdEIsYUFBTyxDQUFDLENBQUM7S0FDVjtHQUNGO0FBQ0QsU0FBTyxDQUFDLENBQUMsQ0FBQztDQUNYOztBQUdNLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLE1BQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFOztBQUU5QixRQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQzNCLGFBQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ3hCLE1BQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3pCLGFBQU8sRUFBRSxDQUFDO0tBQ1gsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2xCLGFBQU8sTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUNwQjs7Ozs7QUFLRCxVQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUN0Qjs7QUFFRCxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUFFLFdBQU8sTUFBTSxDQUFDO0dBQUU7QUFDOUMsU0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztDQUM3Qzs7QUFFTSxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDN0IsTUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLFdBQU8sSUFBSSxDQUFDO0dBQ2IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxXQUFPLElBQUksQ0FBQztHQUNiLE1BQU07QUFDTCxXQUFPLEtBQUssQ0FBQztHQUNkO0NBQ0Y7O0FBRU0sU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0FBQ2xDLE1BQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0IsT0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDdkIsU0FBTyxLQUFLLENBQUM7Q0FDZDs7QUFFTSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLFFBQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLFNBQU8sTUFBTSxDQUFDO0NBQ2Y7O0FBRU0sU0FBUyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO0FBQ2pELFNBQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUEsR0FBSSxFQUFFLENBQUM7Q0FDcEQiLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/utils.js\n ** module id = 8\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n var loc = node && node.loc,\n line = undefined,\n column = undefined;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n var tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (var idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n /* istanbul ignore else */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n if (loc) {\n this.lineNumber = line;\n this.column = column;\n }\n}\n\nException.prototype = new Error();\n\nexports['default'] = Exception;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsSUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbkcsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUNoQyxNQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7TUFDdEIsSUFBSSxZQUFBO01BQ0osTUFBTSxZQUFBLENBQUM7QUFDWCxNQUFJLEdBQUcsRUFBRTtBQUNQLFFBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN0QixVQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBRTFCLFdBQU8sSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDeEM7O0FBRUQsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7O0FBRzFELE9BQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ2hELFFBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDOUM7OztBQUdELE1BQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO0FBQzNCLFNBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDMUM7O0FBRUQsTUFBSSxHQUFHLEVBQUU7QUFDUCxRQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUN2QixRQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztHQUN0QjtDQUNGOztBQUVELFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQzs7cUJBRW5CLFNBQVMiLCJmaWxlIjoiZXhjZXB0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2snXTtcblxuZnVuY3Rpb24gRXhjZXB0aW9uKG1lc3NhZ2UsIG5vZGUpIHtcbiAgbGV0IGxvYyA9IG5vZGUgJiYgbm9kZS5sb2MsXG4gICAgICBsaW5lLFxuICAgICAgY29sdW1uO1xuICBpZiAobG9jKSB7XG4gICAgbGluZSA9IGxvYy5zdGFydC5saW5lO1xuICAgIGNvbHVtbiA9IGxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjtcbiAgfVxuXG4gIGxldCB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay5cbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1wW2Vycm9yUHJvcHNbaWR4XV07XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG5cbiAgaWYgKGxvYykge1xuICAgIHRoaXMubGluZU51bWJlciA9IGxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gIH1cbn1cblxuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnQgZGVmYXVsdCBFeGNlcHRpb247XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/exception.js\n ** module id = 9\n ** module chunks = 0 3\n **/","define(['utils/utils'], function( Utils ) {\nvar View = Backbone.View.extend({\n visible : false,\n initialize : function( options ) {\n var self = this;\n this.options = Utils.merge( options, {\n id : Utils.uid(),\n title : '',\n icon : '',\n buttons : null,\n body : null,\n scrollable : true,\n nopadding : false,\n operations : null,\n placement : 'bottom',\n cls : 'ui-portlet',\n operations_flt : 'right',\n collapsible : false,\n collapsed : false\n });\n this.setElement( this._template( this.options ) );\n\n // link content\n this.$body = this.$( '.portlet-body' );\n this.$title = this.$( '.portlet-title-text' );\n this.$header = this.$( '.portlet-header' );\n this.$content = this.$( '.portlet-content' );\n this.$footer = this.$( '.portlet-footer' );\n\n // set content padding\n if ( this.options.nopadding ) {\n this.$content.css( 'padding', '0px' );\n this.$body.css( 'padding', '0px' );\n }\n\n // append buttons\n this.$buttons = this.$( '.portlet-buttons' );\n if ( this.options.buttons ) {\n $.each( this.options.buttons, function( name, item ) {\n item.$el.prop( 'id', name );\n self.$buttons.append( item.$el );\n });\n } else {\n this.$buttons.remove();\n }\n\n // append operations\n this.$operations = this.$( '.portlet-operations' );\n if ( this.options.operations ) {\n $.each( this.options.operations, function( name, item ) {\n item.$el.prop( 'id', name );\n self.$operations.append( item.$el );\n });\n }\n\n // add body\n this.options.body && this.append( this.options.body );\n\n // make portlet collapsible\n this.collapsed = false;\n if ( this.options.collapsible ) {\n this.$title.addClass( 'no-highlight' ).css({\n 'cursor' : 'pointer',\n 'text-decoration' : 'underline'\n });\n this.$title.on( 'click', function() {\n if ( self.collapsed ) { self.expand(); } else { self.collapse(); }\n });\n this.options.collapsed && this.collapse();\n }\n },\n\n // append\n append: function( $el ) {\n this.$body.append( $el );\n },\n\n // remove all content\n empty: function() {\n this.$body.empty();\n },\n\n // header\n header: function() {\n return this.$header;\n },\n\n // body\n body: function() {\n return this.$body;\n },\n\n // footer\n footer: function() {\n return this.$footer;\n },\n\n // show\n show: function(){\n this.visible = true;\n this.$el.fadeIn( 'fast' );\n },\n\n // hide\n hide: function(){\n this.visible = false;\n this.$el.fadeOut( 'fast' );\n },\n\n // enable buttons\n enableButton: function( id ) {\n this.$buttons.find( '#' + id ).prop( 'disabled', false );\n },\n\n // disable buttons\n disableButton: function( id ) {\n this.$buttons.find( '#' + id ).prop( 'disabled', true );\n },\n\n // hide operation\n hideOperation: function( id ) {\n this.$operations.find( '#' + id ).hide();\n },\n\n // show operation\n showOperation: function( id ) {\n this.$operations.find( '#' + id ).show();\n },\n\n // set operation\n setOperation: function( id, callback ) {\n var $el = this.$operations.find( '#' + id );\n $el.off( 'click' );\n $el.on( 'click', callback );\n },\n\n // title\n title: function( new_title ) {\n var $el = this.$title;\n if ( new_title ) {\n $el.html( new_title );\n }\n return $el.html();\n },\n\n // collapse portlet\n collapse: function() {\n this.collapsed = true;\n this.$content.height( '0%' );\n this.$body.hide();\n this.$footer.hide();\n this.trigger( 'collapsed' );\n },\n\n // expand portlet\n expand: function() {\n this.collapsed = false;\n this.$content.height( '100%' );\n this.$body.fadeIn( 'fast' );\n this.$footer.fadeIn( 'fast' );\n this.trigger( 'expanded' );\n },\n\n // disable content access\n disable: function() {\n this.$( '.portlet-backdrop' ).show();\n },\n\n // enable content access\n enable: function() {\n this.$( '.portlet-backdrop' ).hide();\n },\n\n // fill regular modal template\n _template: function( options ) {\n var tmpl = '
            ';\n if ( options.title ) {\n tmpl += '
            ' +\n '
            ' +\n '
            ';\n if ( options.icon ) {\n tmpl += ' ';\n }\n tmpl += '' + options.title + '' +\n '
            ' +\n '
            ';\n }\n tmpl += '
            ';\n if ( options.placement == 'top' ) {\n tmpl += '
            ';\n }\n tmpl += '
            ';\n if ( options.placement == 'bottom' ) {\n tmpl += '
            ';\n }\n tmpl += '
            ' +\n '
            ' +\n '
            ' +\n '
            ';\n return tmpl;\n }\n});\nreturn {\n View : View\n}\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-portlet.js\n ** module id = 11\n ** module chunks = 0 3\n **/","// Create a simple path alias to allow browserify to resolve\n// the runtime on a supported path.\nmodule.exports = require('./dist/cjs/handlebars.runtime')['default'];\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/runtime.js\n ** module id = 12\n ** module chunks = 0 3\n **/","// Additional dependencies: jQuery, underscore.\ndefine(['mvc/ui/ui-modal', 'mvc/ui/ui-frames', 'mvc/ui/icon-button'], function(Modal, Frames, mod_icon_btn) {\n\n/**\n * Dataset metedata.\n */\nvar DatasetMetadata = Backbone.Model.extend({});\n\n/**\n * A dataset. In Galaxy, datasets are associated with a history, so\n * this object is also known as a HistoryDatasetAssociation.\n */\nvar Dataset = Backbone.Model.extend({\n defaults: {\n id: '',\n type: '',\n name: '',\n hda_ldda: 'hda',\n metadata: null\n },\n\n initialize: function() {\n // Metadata can be passed in as a model or a set of attributes; if it's\n // already a model, there's no need to set metadata.\n if (!this.get('metadata')) {\n this._set_metadata();\n }\n\n // Update metadata on change.\n this.on('change', this._set_metadata, this);\n },\n\n _set_metadata: function() {\n var metadata = new DatasetMetadata();\n\n // Move metadata from dataset attributes to metadata object.\n _.each(_.keys(this.attributes), function(k) {\n if (k.indexOf('metadata_') === 0) {\n // Found metadata.\n var new_key = k.split('metadata_')[1];\n metadata.set(new_key, this.attributes[k]);\n delete this.attributes[k];\n }\n }, this);\n\n // Because this is an internal change, silence it.\n this.set('metadata', metadata, { 'silent': true });\n },\n\n /**\n * Returns dataset metadata for a given attribute.\n */\n get_metadata: function(attribute) {\n return this.attributes.metadata.get(attribute);\n },\n\n urlRoot: Galaxy.root + \"api/datasets\"\n});\n\n/**\n * A tabular dataset. This object extends dataset to provide incremental chunked data.\n */\nvar TabularDataset = Dataset.extend({\n defaults: _.extend({}, Dataset.prototype.defaults, {\n chunk_url: null,\n first_data_chunk: null,\n chunk_index: -1,\n at_eof: false\n }),\n\n initialize: function(options) {\n Dataset.prototype.initialize.call(this);\n\n // If first data chunk is available, next chunk is 1.\n this.attributes.chunk_index = (this.attributes.first_data_chunk ? 1 : 0);\n this.attributes.chunk_url = Galaxy.root + 'dataset/display?dataset_id=' + this.id;\n this.attributes.url_viz = Galaxy.root + 'visualization';\n },\n\n /**\n * Returns a jQuery Deferred object that resolves to the next data chunk or null if at EOF.\n */\n get_next_chunk: function() {\n // If already at end of file, do nothing.\n if (this.attributes.at_eof) {\n return null;\n }\n\n // Get next chunk.\n var self = this,\n next_chunk = $.Deferred();\n $.getJSON(this.attributes.chunk_url, {\n chunk: self.attributes.chunk_index++\n }).success(function(chunk) {\n var rval;\n if (chunk.ck_data !== '') {\n // Found chunk.\n rval = chunk;\n }\n else {\n // At EOF.\n self.attributes.at_eof = true;\n rval = null;\n }\n next_chunk.resolve(rval);\n });\n\n return next_chunk;\n }\n});\n\nvar DatasetCollection = Backbone.Collection.extend({\n model: Dataset\n});\n\n/**\n * Provides a base for table-based, dynamic view of a tabular dataset.\n * Do not instantiate directly; use either TopLevelTabularDatasetChunkedView\n * or EmbeddedTabularDatasetChunkedView.\n */\nvar TabularDatasetChunkedView = Backbone.View.extend({\n\n /**\n * Initialize view and, importantly, set a scroll element.\n */\n initialize: function(options) {\n // Row count for rendering.\n this.row_count = 0;\n this.loading_chunk = false;\n\n // load trackster button\n new TabularButtonTracksterView({\n model : options.model,\n $el : this.$el\n });\n },\n\n expand_to_container: function(){\n if (this.$el.height() < this.scroll_elt.height()){\n this.attempt_to_fetch();\n }\n },\n\n attempt_to_fetch: function( func ){\n var self = this;\n if ( !this.loading_chunk && this.scrolled_to_bottom() ) {\n this.loading_chunk = true;\n this.loading_indicator.show();\n $.when(self.model.get_next_chunk()).then(function(result) {\n if (result) {\n self._renderChunk(result);\n self.loading_chunk = false;\n }\n self.loading_indicator.hide();\n self.expand_to_container();\n });\n }\n },\n\n render: function() {\n // Add loading indicator.\n this.loading_indicator = $('
            ').attr('id', 'loading_indicator');\n this.$el.append(this.loading_indicator);\n\n // Add data table and header.\n var data_table = $('').attr({\n id: 'content_table',\n cellpadding: 0\n });\n this.$el.append(data_table);\n var column_names = this.model.get_metadata('column_names'),\n header_container = $('').appendTo(data_table),\n header_row = $('').appendTo(header_container);\n if (column_names) {\n header_row.append('');\n } else {\n for (var j = 1; j <= this.model.get_metadata('columns'); j++) {\n header_row.append('');\n }\n }\n\n // Render first chunk.\n var self = this,\n first_chunk = this.model.get('first_data_chunk');\n if (first_chunk) {\n // First chunk is bootstrapped, so render now.\n this._renderChunk(first_chunk);\n }\n else {\n // No bootstrapping, so get first chunk and then render.\n $.when(self.model.get_next_chunk()).then(function(result) {\n self._renderChunk(result);\n });\n }\n\n // -- Show new chunks during scrolling. --\n\n // Set up chunk loading when scrolling using the scrolling element.\n this.scroll_elt.scroll(function(){\n self.attempt_to_fetch();\n });\n },\n\n /**\n * Returns true if user has scrolled to the bottom of the view.\n */\n scrolled_to_bottom: function() {\n return false;\n },\n\n // -- Helper functions. --\n\n _renderCell: function(cell_contents, index, colspan) {\n var $cell = $(''),\n num_columns = this.model.get_metadata('columns');\n\n if (this.row_count % 2 !== 0) {\n row.addClass('dark_row');\n }\n\n if (cells.length === num_columns) {\n _.each(cells, function(cell_contents, index) {\n row.append(this._renderCell(cell_contents, index));\n }, this);\n }\n else if (cells.length > num_columns) {\n // SAM file or like format with optional metadata included.\n _.each(cells.slice(0, num_columns - 1), function(cell_contents, index) {\n row.append(this._renderCell(cell_contents, index));\n }, this);\n row.append(this._renderCell(cells.slice(num_columns - 1).join('\\t'), num_columns - 1));\n }\n else if (num_columns > 5 && cells.length === num_columns - 1 ) {\n // SAM file or like format with optional metadata missing.\n _.each(cells, function(cell_contents, index) {\n row.append(this._renderCell(cell_contents, index));\n }, this);\n row.append($('');\n wrapper.append($el);\n this.row.append(wrapper);\n },\n \n // header\n appendHeader: function() {\n // append header row\n this.$thead.append(this.row);\n\n // row\n this.row = $('');\n },\n \n // add row cell\n add: function($el, width, align) {\n var wrapper = $('');\n if (width) {\n wrapper.css('width', width);\n }\n if (align) {\n wrapper.css('text-align', align);\n }\n wrapper.append($el);\n this.row.append(wrapper);\n },\n \n // append\n append: function(id, fade) {\n this._commit(id, fade, false);\n },\n \n // prepend\n prepend: function(id, fade) {\n this._commit(id, fade, true);\n },\n \n // get element\n get: function(id) {\n return this.$el.find('#' + id);\n },\n \n // delete\n del: function(id) {\n var item = this.$tbody.find('#' + id);\n if (item.length > 0) {\n item.remove();\n this.row_count--;\n this._refresh();\n }\n },\n\n // delete all\n delAll: function() {\n this.$tbody.empty();\n this.row_count = 0;\n this._refresh();\n },\n \n // value\n value: function(new_value) {\n // get current id/value\n this.before = this.$tbody.find('.current').attr('id');\n \n // check if new_value is defined\n if (new_value !== undefined) {\n this.$tbody.find('tr').removeClass('current');\n if (new_value) {\n this.$tbody.find('#' + new_value).addClass('current');\n }\n }\n \n // get current id/value\n var after = this.$tbody.find('.current').attr('id');\n if(after === undefined) {\n return null;\n } else {\n // fire onchange\n if (after != this.before && this.options.onchange) {\n this.options.onchange(new_value);\n }\n \n // return current value\n return after;\n }\n },\n \n // size\n size: function() {\n return this.$tbody.find('tr').length;\n },\n \n // commit\n _commit: function(id, fade, prepend) {\n // remove previous item with same id\n this.del(id);\n \n // add\n this.row.attr('id', id);\n \n // add row\n if (prepend) {\n this.$tbody.prepend(this.row);\n } else {\n this.$tbody.append(this.row);\n }\n \n // fade mode\n if (fade) {\n this.row.hide();\n this.row.fadeIn();\n }\n \n // row\n this.row = this._row();\n \n // row count\n this.row_count++;\n this._refresh();\n },\n \n // create new row\n _row: function() {\n return $('');\n },\n \n // onclick\n _onclick: function(e) {\n // get values\n var old_value = this.value();\n var new_value = $(e.target).closest('tr').attr('id');\n if (new_value != ''){\n // check equality\n if (new_value && old_value != new_value) {\n if (this.options.onconfirm) {\n this.options.onconfirm(new_value);\n } else {\n this.value(new_value);\n }\n }\n }\n },\n\n // ondblclick\n _ondblclick: function(e) {\n var value = this.value();\n if (value && this.options.ondblclick) {\n this.options.ondblclick(value);\n }\n },\n \n // refresh\n _refresh: function() {\n if (this.row_count == 0) {\n this.$tmessage.show();\n } else {\n this.$tmessage.hide();\n }\n },\n \n // load html template\n _template: function(options) {\n return '
            ' +\n '
            ' + column_names.join('') + '' + j + '').text(cell_contents);\n var column_types = this.model.get_metadata('column_types');\n if (colspan !== undefined) {\n $cell.attr('colspan', colspan).addClass('stringalign');\n } else if (column_types) {\n if (index < column_types.length) {\n if (column_types[index] === 'str' || column_types[index] === 'list') {\n /* Left align all str columns, right align the rest */\n $cell.addClass('stringalign');\n }\n }\n }\n return $cell;\n },\n\n _renderRow: function(line) {\n // Check length of cells to ensure this is a complete row.\n var cells = line.split('\\t'),\n row = $('
            '));\n }\n else {\n // Comment line, just return the one cell.\n row.append(this._renderCell(line, 0, num_columns));\n }\n\n this.row_count++;\n return row;\n },\n\n _renderChunk: function(chunk) {\n var data_table = this.$el.find('table');\n _.each(chunk.ck_data.split('\\n'), function(line, index) {\n if (line !== ''){\n data_table.append(this._renderRow(line));\n }\n }, this);\n }\n});\n\n/**\n * Tabular view that is placed at the top level of page. Scrolling occurs\n * view top-level elements outside of view.\n */\nvar TopLevelTabularDatasetChunkedView = TabularDatasetChunkedView.extend({\n\n initialize: function(options) {\n TabularDatasetChunkedView.prototype.initialize.call(this, options);\n\n // Scrolling happens in top-level elements.\n scroll_elt = _.find(this.$el.parents(), function(p) {\n return $(p).css('overflow') === 'auto';\n });\n\n // If no scrolling element found, use window.\n if (!scroll_elt) { scroll_elt = window; }\n\n // Wrap scrolling element for easy access.\n this.scroll_elt = $(scroll_elt);\n },\n\n /**\n * Returns true if user has scrolled to the bottom of the view.\n */\n scrolled_to_bottom: function() {\n return (this.$el.height() - this.scroll_elt.scrollTop() - this.scroll_elt.height() <= 0);\n }\n\n});\n\n/**\n * Tabular view tnat is embedded in a page. Scrolling occurs in view's el.\n */\nvar EmbeddedTabularDatasetChunkedView = TabularDatasetChunkedView.extend({\n\n initialize: function(options) {\n TabularDatasetChunkedView.prototype.initialize.call(this, options);\n\n // Because view is embedded, set up div to do scrolling.\n this.scroll_elt = this.$el.css({\n position: 'relative',\n overflow: 'scroll',\n height: options.height || '500px'\n });\n },\n\n /**\n * Returns true if user has scrolled to the bottom of the view.\n */\n scrolled_to_bottom: function() {\n return this.$el.scrollTop() + this.$el.innerHeight() >= this.el.scrollHeight;\n }\n\n});\n\n// button for trackster visualization\nvar TabularButtonTracksterView = Backbone.View.extend({\n\n // gene region columns\n col: {\n chrom : null,\n start : null,\n end : null\n },\n\n // url for trackster\n url_viz : null,\n\n // dataset id\n dataset_id : null,\n\n // database key\n genome_build: null,\n\n // data type\n file_ext : null,\n\n // backbone initialize\n initialize: function (options) {\n // check if environment is available\n var Galaxy = parent.Galaxy;\n\n // link galaxy modal or create one\n if (Galaxy && Galaxy.modal) {\n this.modal = Galaxy.modal;\n }\n\n // link galaxy frames\n if (Galaxy && Galaxy.frame) {\n this.frame = Galaxy.frame;\n }\n\n // check\n if (!this.modal || !this.frame) {\n return;\n }\n\n // model/metadata\n var model = options.model;\n var metadata = model.get('metadata');\n\n // check for datatype\n if (!model.get('file_ext')) {\n return;\n }\n\n // get data type\n this.file_ext = model.get('file_ext');\n\n // check for bed-file format\n if (this.file_ext == 'bed')\n {\n // verify that metadata exists\n if (metadata.get('chromCol') && metadata.get('startCol') && metadata.get('endCol'))\n {\n // read in columns\n this.col.chrom = metadata.get('chromCol') - 1;\n this.col.start = metadata.get('startCol') - 1;\n this.col.end = metadata.get('endCol') - 1;\n } else {\n console.log('TabularButtonTrackster : Bed-file metadata incomplete.');\n return;\n }\n }\n\n // check for vcf-file format\n if (this.file_ext == 'vcf')\n {\n // search array\n function search (str, array) {\n for (var j = 0; j < array.length; j++)\n if (array[j].match(str)) return j;\n return -1;\n };\n\n // load\n this.col.chrom = search('Chrom', metadata.get('column_names'));\n this.col.start = search('Pos', metadata.get('column_names'));\n this.col.end = null;\n\n // verify that metadata exists\n if (this.col.chrom == -1 || this.col.start == -1) {\n console.log('TabularButtonTrackster : VCF-file metadata incomplete.');\n return;\n }\n }\n\n // check\n if(this.col.chrom === undefined) {\n return;\n }\n\n // get dataset id\n if (model.id) {\n this.dataset_id = model.id;\n } else {\n console.log('TabularButtonTrackster : Dataset identification is missing.');\n return;\n }\n\n // get url\n if (model.get('url_viz')) {\n this.url_viz = model.get('url_viz');\n } else {\n console.log('TabularButtonTrackster : Url for visualization controller is missing.');\n return;\n }\n\n // get genome_build / database key\n if (model.get('genome_build')) {\n this.genome_build = model.get('genome_build');\n }\n\n // create the icon\n var btn_viz = new mod_icon_btn.IconButtonView({\n model : new mod_icon_btn.IconButton({\n title : 'Visualize',\n icon_class : 'chart_curve',\n id : 'btn_viz'\n })\n });\n\n // set element\n this.setElement(options.$el);\n\n // add to element\n this.$el.append(btn_viz.render().$el);\n\n // hide the button\n this.hide();\n },\n\n // backbone events\n events:\n {\n 'mouseover tr' : 'show',\n 'mouseleave' : 'hide'\n },\n\n // show button\n show: function (e) {\n // is numeric\n function is_numeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n\n // check\n if(this.col.chrom === null)\n return;\n\n // get selected data line\n var row = $(e.target).parent();\n\n // verify that location has been found\n var chrom = row.children().eq(this.col.chrom).html();\n var start = row.children().eq(this.col.start).html();\n\n // end is optional\n var end = this.col.end ? row.children().eq(this.col.end).html() : start;\n\n // double check location\n if (!chrom.match(\"^#\") && chrom !== \"\" && is_numeric(start)) {\n\n // get target gene region\n var btn_viz_pars = {\n dataset_id : this.dataset_id,\n gene_region : chrom + \":\" + start + \"-\" + end\n };\n\n // get button position\n var offset = row.offset();\n var left = offset.left - 10;\n var top = offset.top - $(window).scrollTop() + 3;\n\n // update css\n $('#btn_viz').css({'position': 'fixed', 'top': top + 'px', 'left': left + 'px'});\n $('#btn_viz').off('click');\n $('#btn_viz').click(this.create_trackster_action(this.url_viz, btn_viz_pars, this.genome_build));\n\n // show the button\n $('#btn_viz').show();\n } else {\n // hide the button\n $('#btn_viz').hide();\n }\n },\n\n // hide button\n hide: function () {\n this.$el.find('#btn_viz').hide();\n },\n\n // create action\n create_trackster_action : function (vis_url, dataset_params, dbkey) {\n // link this\n var self = this;\n\n // create function\n return function() {\n var listTracksParams = {};\n if (dbkey) {\n listTracksParams[ 'f-dbkey' ] = dbkey;\n }\n $.ajax({\n url: vis_url + '/list_tracks?' + $.param( listTracksParams ),\n dataType: 'html',\n error: function() {\n // show error message\n self.modal.show({\n title : 'Something went wrong!',\n body : 'Unfortunately we could not add this dataset to the track browser. Please try again or contact us.',\n buttons : {\n 'Cancel': function(){\n self.modal.hide();\n }\n }\n });\n },\n success: function(table_html) {\n self.modal.show({\n title : 'View Data in a New or Saved Visualization',\n buttons :{\n 'Cancel': function(){\n self.modal.hide();\n },\n 'View in saved visualization': function(){\n // show modal with saved visualizations\n self.modal.show(\n {\n title : 'Add Data to Saved Visualization',\n body : table_html,\n buttons : {\n 'Cancel': function(){\n self.modal.hide();\n },\n 'Add to visualization': function(){\n // hide\n self.modal.hide();\n\n // search selected fields\n self.modal.$el.find('input[name=id]:checked').each(function(){\n // get visualization id\n var vis_id = $(this).val();\n dataset_params.id = vis_id;\n\n // add widget\n self.frame.add({\n title : 'Trackster',\n type : 'url',\n content : vis_url + '/trackster?' + $.param(dataset_params)\n });\n });\n }\n }\n });\n },\n 'View in new visualization': function(){\n // hide\n self.modal.hide();\n\n // add widget\n self.frame.add({\n title : 'Trackster',\n type : 'url',\n content : vis_url + '/trackster?' + $.param(dataset_params)\n });\n }\n }\n });\n }\n });\n return false;\n };\n }\n});\n\n// -- Utility functions. --\n\n/**\n * Create a model, attach it to a view, render view, and attach it to a parent element.\n */\nvar createModelAndView = function(model, view, model_config, parent_elt) {\n // Create model, view.\n var a_view = new view({\n model: new model(model_config)\n });\n\n // Render view and add to parent element.\n a_view.render();\n if (parent_elt) {\n parent_elt.append(a_view.$el);\n }\n\n return a_view;\n};\n\n/**\n * Create a tabular dataset chunked view (and requisite tabular dataset model)\n * and appends to parent_elt.\n */\nvar createTabularDatasetChunkedView = function(options) {\n // If no model, create and set model from dataset config.\n if (!options.model) {\n options.model = new TabularDataset(options.dataset_config);\n }\n\n var parent_elt = options.parent_elt;\n var embedded = options.embedded;\n\n // Clean up options so that only needed options are passed to view.\n delete options.embedded;\n delete options.parent_elt;\n delete options.dataset_config;\n\n // Create and set up view.\n var view = (embedded ? new EmbeddedTabularDatasetChunkedView(options) :\n new TopLevelTabularDatasetChunkedView(options));\n view.render();\n\n if (parent_elt) {\n parent_elt.append(view.$el);\n // If we're sticking this in another element, once it's appended check\n // to make sure we've filled enough space.\n // Without this, the scroll elements don't work.\n view.expand_to_container();\n }\n\n return view;\n};\n\nreturn {\n Dataset: Dataset,\n TabularDataset: TabularDataset,\n DatasetCollection: DatasetCollection,\n TabularDatasetChunkedView: TabularDatasetChunkedView,\n createTabularDatasetChunkedView: createTabularDatasetChunkedView\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/data.js\n ** module id = 14\n ** module chunks = 0 1 3\n **/","define([\n], function(){\n//==============================================================================\n/** Map of possible HDA/collection/job states to their string equivalents.\n * A port of galaxy.model.Dataset.states.\n */\nvar STATES = {\n // NOT ready states\n /** is uploading and not ready */\n UPLOAD : 'upload',\n /** the job that will produce the dataset queued in the runner */\n QUEUED : 'queued',\n /** the job that will produce the dataset is running */\n RUNNING : 'running',\n /** metadata for the dataset is being discovered/set */\n SETTING_METADATA : 'setting_metadata',\n\n // ready states\n /** was created without a tool */\n NEW : 'new',\n /** has no data */\n EMPTY : 'empty',\n /** has successfully completed running */\n OK : 'ok',\n\n /** the job that will produce the dataset paused */\n PAUSED : 'paused',\n /** metadata discovery/setting failed or errored (but otherwise ok) */\n FAILED_METADATA : 'failed_metadata',\n//TODO: not in trans.app.model.Dataset.states - is in database\n /** not accessible to the current user (i.e. due to permissions) */\n NOT_VIEWABLE : 'noPermission',\n /** deleted while uploading */\n DISCARDED : 'discarded',\n /** the tool producing this dataset failed */\n ERROR : 'error'\n};\n\nSTATES.READY_STATES = [\n STATES.OK,\n STATES.EMPTY,\n STATES.PAUSED,\n STATES.FAILED_METADATA,\n STATES.NOT_VIEWABLE,\n STATES.DISCARDED,\n STATES.ERROR\n];\n\nSTATES.NOT_READY_STATES = [\n STATES.UPLOAD,\n STATES.QUEUED,\n STATES.RUNNING,\n STATES.SETTING_METADATA,\n STATES.NEW\n];\n\n\n//==============================================================================\n return STATES;\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/states.js\n ** module id = 15\n ** module chunks = 3\n **/","/** This class contains all button views.\n*/\ndefine(['utils/utils'], function( Utils ) {\n /** This renders the default button which is used e.g. at the bottom of the upload modal.\n */\n var ButtonBase = Backbone.View.extend({\n initialize: function( options ) {\n this.options = Utils.merge( options, {\n id : Utils.uid(),\n title : '',\n floating : 'right',\n icon : '',\n cls : 'ui-button btn btn-default',\n cls_wait : 'btn btn-info'\n } );\n this.setElement( this._template( this.options ) );\n var self = this;\n $( this.el ).on( 'click' , function() {\n $( '.tooltip' ).hide();\n if ( options.onclick && !self.disabled ) {\n options.onclick();\n }\n } );\n $( this.el ).tooltip( { title: options.tooltip, placement: 'bottom' } );\n },\n\n // disable\n disable: function() {\n this.$el.addClass( 'disabled' );\n this.disabled = true;\n },\n\n // enable\n enable: function() {\n this.$el.removeClass( 'disabled' );\n this.disabled = false;\n },\n\n // show spinner\n wait: function() {\n this.$el.removeClass( this.options.cls ).addClass( this.options.cls_wait ).prop( 'disabled', true );\n this.$( '.icon' ).removeClass( this.options.icon ).addClass( 'fa-spinner fa-spin' );\n this.$( '.title' ).html( 'Sending...' );\n },\n\n // hide spinner\n unwait: function() {\n this.$el.removeClass( this.options.cls_wait ).addClass( this.options.cls ).prop( 'disabled', false );\n this.$( '.icon' ).removeClass( 'fa-spinner fa-spin' ).addClass( this.options.icon );\n this.$( '.title' ).html( this.options.title );\n },\n\n // template\n _template: function( options ) {\n var str = '';\n return str;\n }\n });\n\n /** This button allows the right-click/open-in-new-tab feature, its used e.g. for panel buttons.\n */\n var ButtonLink = ButtonBase.extend({\n initialize: function( options ) {\n ButtonBase.prototype.initialize.call( this, options );\n },\n _template: function( options ) {\n return '' + '' +\n '';\n }\n });\n\n /** The check button is used in the tool form and allows to distinguish between multiple states e.g. all, partially and nothing selected.\n */\n var ButtonCheck = Backbone.View.extend({\n initialize: function( options ) {\n // configure options\n this.options = Utils.merge(options, {\n title : 'Select/Unselect all',\n icons : ['fa fa-square-o', 'fa fa-minus-square-o', 'fa fa-check-square-o'],\n value : 0\n });\n\n // create new element\n this.setElement( this._template() );\n this.$title = this.$( '.title' );\n this.$icon = this.$( '.icon' );\n\n // set initial value\n this.value( this.options.value );\n\n // set title\n this.$title.html( this.options.title );\n\n // add event handler\n var self = this;\n this.$el.on('click', function() {\n self.current = ( self.current === 0 && 2 ) || 0;\n self.value( self.current );\n self.options.onclick && self.options.onclick();\n });\n },\n\n /* Sets a new value and/or returns the current value.\n * @param{Integer} new_val - Set a new value 0=unchecked, 1=partial and 2=checked.\n * OR:\n * @param{Integer} new_val - Number of selected options.\n * @param{Integer} total - Total number of available options.\n */\n value: function ( new_val, total ) {\n if ( new_val !== undefined ) {\n if ( total ) {\n if ( new_val !== 0 ) {\n new_val = ( new_val !== total ) && 1 || 2;\n }\n }\n this.current = new_val;\n this.$icon.removeClass()\n .addClass( 'icon' )\n .addClass( this.options.icons[ new_val ] );\n this.options.onchange && this.options.onchange( new_val );\n }\n return this.current;\n },\n\n /** Template containing the check button and the title\n */\n _template: function() {\n return '
            ' +\n '' +\n '' +\n '
            ';\n }\n });\n\n /** This renders a differently styled, more compact button version.\n TODO: Consolidate with icon-button.js and/or button-default.js.\n */\n var ButtonIcon = Backbone.View.extend({\n initialize : function( options ) {\n // get options\n this.options = Utils.merge( options, {\n id : Utils.uid(),\n title : '',\n floating : 'right',\n cls : 'ui-button-icon',\n icon : '',\n tooltip : '',\n onclick : null\n });\n\n // create new element\n this.setElement( this._template( this.options ) );\n\n // link button element\n this.$button = this.$el.find( '.button' );\n\n // add event\n var self = this;\n $(this.el).on('click', function() {\n // hide all tooltips\n $( '.tooltip' ).hide();\n\n // execute onclick callback\n if ( options.onclick && !self.disabled ) {\n options.onclick();\n }\n });\n\n // add tooltip\n this.$button.tooltip( { title: options.tooltip, placement: 'bottom' } );\n },\n\n // disable\n disable: function() {\n this.$button.addClass( 'disabled' );\n this.disabled = true;\n },\n\n // enable\n enable: function() {\n this.$button.removeClass( 'disabled' );\n this.disabled = false;\n },\n\n // change icon\n setIcon: function(icon_cls) {\n this.$('i').removeClass( this.options.icon ).addClass( icon_cls );\n this.options.icon = icon_cls;\n },\n\n // template\n _template: function( options ) {\n // width\n var width = '';\n if ( options.title ) {\n width = 'width: auto;';\n }\n\n // string\n var str = '
            ' +\n '
            ';\n if (options.title) {\n str += ' ' +\n '' + options.title + '';\n } else {\n str += '';\n }\n str += '
            ' +\n '
            ';\n return str;\n }\n });\n\n /** This class creates a button with dropdown menu. It extends the functionality of the Ui.ButtonIcon class.\n TODO: Consolidate class, use common base class\n */\n var ButtonMenu = Backbone.View.extend({\n // optional sub menu\n $menu: null,\n\n // initialize\n initialize: function ( options ) {\n // get options\n this.options = Utils.merge( options, {\n // same as Ui.ButtonIcon\n id : '',\n title : '',\n floating : 'right',\n pull : 'right',\n icon : null,\n onclick : null,\n cls : 'ui-button-icon ui-button-menu',\n tooltip : '',\n \n // additional options\n target : '',\n href : '',\n onunload : null,\n visible : true,\n tag : ''\n } );\n\n // add template for tab\n this.setElement( $( this._template( this.options ) ) );\n\n // find root\n var $root = $( this.el ).find( '.root' );\n\n // link head\n var self = this;\n $root.on( 'click', function( e ) {\n // hide all tooltips\n $( '.tooltip' ).hide();\n\n // prevent default\n e.preventDefault();\n\n // add click event\n if( self.options.onclick ) {\n self.options.onclick();\n }\n });\n\n // visiblity\n if ( !this.options.visible )\n this.hide();\n\n // add tooltip\n $root.tooltip( { title: options.tooltip, placement: 'bottom' } );\n },\n\n // show\n show: function() {\n $( this.el ).show();\n },\n\n // hide\n hide: function() {\n $( this.el ).hide();\n },\n\n // add menu item\n addMenu: function ( options ) {\n // menu option defaults\n var menuOptions = {\n title : '',\n target : '',\n href : '',\n onclick : null,\n divider : false,\n icon : null,\n cls : 'button-menu btn-group'\n }\n\n // get options\n menuOptions = Utils.merge( options, menuOptions );\n\n // check if submenu element is available\n if ( !this.$menu ) {\n // insert submenu element into root\n $( this.el ).append( this._templateMenu() );\n\n // update element link\n this.$menu = $( this.el ).find( '.menu' );\n }\n\n // create\n var $item = $( this._templateMenuItem( menuOptions ) );\n\n // add events\n $item.on( 'click', function( e ) {\n if( menuOptions.onclick ) {\n e.preventDefault();\n menuOptions.onclick();\n }\n });\n\n // append menu\n this.$menu.append( $item );\n\n // append divider\n if ( menuOptions.divider ) {\n this.$menu.append( $( this._templateDivider() ) );\n }\n },\n\n // fill template header\n _templateMenuItem: function ( options ) {\n var tmpl = '
          1. ' +\n '';\n }\n tmpl += ' ' + options.title +\n '' +\n '
          2. ';\n return tmpl;\n },\n\n // fill template header\n _templateMenu: function () {\n return '
              ';\n },\n\n _templateDivider: function() {\n return '
            • ';\n },\n\n // element\n _template: function(options) {\n // TODO: width/margin should be set in css\n var width = '';\n var margin = '';\n if ( options.title ) {\n width = 'width: auto;';\n } else {\n margin = 'margin: 0px;';\n }\n var str = '
              ' +\n '
              ' +\n '';\n if ( options.title ) {\n str += ' ' + options.title + '';\n }\n str += '
              ' +\n '
              ';\n return str;\n }\n });\n\n return {\n ButtonDefault : ButtonBase,\n ButtonLink : ButtonLink,\n ButtonIcon : ButtonIcon,\n ButtonCheck : ButtonCheck,\n ButtonMenu : ButtonMenu\n }\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-buttons.js\n ** module id = 16\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils'], function(Utils) {\n\n/**\n * This class creates a ui table element.\n */\nvar View = Backbone.View.extend({\n // current row\n row: null,\n \n // count rows\n row_count: 0,\n \n // defaults options\n optionsDefault: {\n content : 'No content available.',\n onchange : null,\n ondblclick : null,\n onconfirm : null,\n cls : 'ui-table',\n cls_tr : ''\n },\n \n // events\n events : {\n 'click' : '_onclick',\n 'dblclick' : '_ondblclick'\n },\n \n // initialize\n initialize : function(options) {\n // configure options\n this.options = Utils.merge(options, this.optionsDefault);\n \n // create new element\n var $el = $(this._template(this.options));\n \n // link sub-elements\n this.$thead = $el.find('thead');\n this.$tbody = $el.find('tbody');\n this.$tmessage = $el.find('tmessage');\n \n // set element\n this.setElement($el);\n \n // initialize row\n this.row = this._row();\n },\n \n // add header cell\n addHeader: function($el) {\n var wrapper = $('
            ' +\n '' +\n '' +\n '
            ' +\n '' + options.content + '' +\n '
            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-table.js\n ** module id = 17\n ** module chunks = 0 3\n **/","define([\n //jquery\n //backbone\n], function(){\n//=============================================================================\n/**\n * backbone model for icon buttons\n */\nvar IconButton = Backbone.Model.extend({\n defaults: {\n title : \"\",\n icon_class : \"\",\n on_click : null,\n menu_options : null,\n is_menu_button : true,\n id : null,\n href : null,\n target : null,\n enabled : true,\n visible : true,\n tooltip_config : {}\n }\n});\n\n/**\n * backbone view for icon buttons\n */\nvar IconButtonView = Backbone.View.extend({\n\n initialize : function(){\n // better rendering this way\n this.model.attributes.tooltip_config = { placement : 'bottom' };\n this.model.bind( 'change', this.render, this );\n },\n\n render : function( ){\n // hide tooltip\n this.$el.tooltip( 'hide' );\n\n var new_elem = this.template( this.model.toJSON() );\n // configure tooltip\n new_elem.tooltip( this.model.get( 'tooltip_config' ));\n this.$el.replaceWith( new_elem );\n this.setElement( new_elem );\n return this;\n },\n\n events : {\n 'click' : 'click'\n },\n\n click : function( event ){\n // if on_click pass to that function\n if( _.isFunction( this.model.get( 'on_click' ) ) ){\n this.model.get( 'on_click' )( event );\n return false;\n }\n // otherwise, bubble up ( to href or whatever )\n return true;\n },\n\n // generate html element\n template: function( options ){\n var buffer = 'title=\"' + options.title + '\" class=\"icon-button';\n\n if( options.is_menu_button ){\n buffer += ' menu-button';\n }\n\n buffer += ' ' + options.icon_class;\n\n if( !options.enabled ){\n buffer += '_disabled';\n }\n\n // close class tag\n buffer += '\"';\n\n if( options.id ){\n buffer += ' id=\"' + options.id + '\"';\n }\n\n buffer += ' href=\"' + options.href + '\"';\n // add target for href\n if( options.target ){\n buffer += ' target=\"' + options.target + '\"';\n }\n // set visibility\n if( !options.visible ){\n buffer += ' style=\"display: none;\"';\n }\n\n // enabled/disabled\n if ( options.enabled ){\n buffer = '';\n } else {\n buffer = '';\n }\n\n // return element\n return $( buffer );\n }\n} );\n\n// define collection\nvar IconButtonCollection = Backbone.Collection.extend({\n model: IconButton\n});\n\n/**\n * menu with multiple icon buttons\n * views are not needed nor used for individual buttons\n */\nvar IconButtonMenuView = Backbone.View.extend({\n\n tagName: 'div',\n\n initialize: function(){\n this.render();\n },\n\n render: function(){\n // initialize icon buttons\n var self = this;\n this.collection.each(function(button){\n // create and add icon button to menu\n var elt = $('')\n .attr('href', 'javascript:void(0)')\n .attr('title', button.attributes.title)\n .addClass('icon-button menu-button')\n .addClass(button.attributes.icon_class)\n .appendTo(self.$el)\n .click(button.attributes.on_click);\n\n // configure tooltip\n if (button.attributes.tooltip_config){\n elt.tooltip(button.attributes.tooltip_config);\n }\n\n // add popup menu to icon\n var menu_options = button.get('options');\n if (menu_options){\n make_popupmenu(elt, menu_options);\n }\n });\n\n // return\n return this;\n }\n});\n\n/**\n * Returns an IconButtonMenuView for the provided configuration.\n * Configuration is a list of dictionaries where each dictionary\n * defines an icon button. Each dictionary must have the following\n * elements: icon_class, title, and on_click.\n */\nvar create_icon_buttons_menu = function(config, global_config)\n{\n // initialize global configuration\n if (!global_config) global_config = {};\n\n // create and initialize menu\n var buttons = new IconButtonCollection(\n _.map(config, function(button_config){\n return new IconButton(_.extend(button_config, global_config));\n })\n );\n\n // return menu\n return new IconButtonMenuView( {collection: buttons} );\n};\n\n\n//=============================================================================\n return {\n IconButton : IconButton,\n IconButtonView : IconButtonView,\n IconButtonCollection : IconButtonCollection,\n IconButtonMenuView : IconButtonMenuView,\n create_icon_buttons_menu: create_icon_buttons_menu\n };\n})\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/icon-button.js\n ** module id = 18\n ** module chunks = 0 1 3\n **/","// from: https://raw.githubusercontent.com/umdjs/umd/master/jqueryPlugin.js\n// Uses AMD or browser globals to create a jQuery plugin.\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n //TODO: So...this turns out to be an all or nothing thing. If I load jQuery in the define below, it will\n // (of course) wipe the old jquery *and all the plugins loaded into it*. So the define below *is still\n // relying on jquery being loaded globally* in order to preserve plugins.\n define([ 'jquery' ], factory);\n } else {\n // Browser globals\n factory(jQuery);\n }\n\n}(function ( jQuery ) {\n'use_strict';\n\nvar $ = jQuery;\n\n// ============================================================================\n/**\n * Make an element with text editable: (a) when user clicks on text, a textbox/area\n * is provided for editing; (b) when enter key pressed, element's text is set and on_finish\n * is called.\n */\n$.fn.make_text_editable = function(config_dict) {\n // Get config options.\n var num_cols = (\"num_cols\" in config_dict ? config_dict.num_cols : 30),\n num_rows = (\"num_rows\" in config_dict ? config_dict.num_rows : 4),\n use_textarea = (\"use_textarea\" in config_dict ? config_dict.use_textarea : false),\n on_finish = (\"on_finish\" in config_dict ? config_dict.on_finish : null),\n help_text = (\"help_text\" in config_dict ? config_dict.help_text : null);\n\n // Add element behavior.\n var container = $(this);\n container.addClass(\"editable-text\").click(function(e) {\n // If there's already an input element, editing is active, so do nothing.\n if ($(this).children(\":input\").length > 0) {\n return;\n }\n\n container.removeClass(\"editable-text\");\n\n // Handler for setting element text.\n var set_text = function(new_text) {\n container.find(\":input\").remove();\n\n if (new_text !== \"\") {\n container.text(new_text);\n } else {\n // No text; need a line so that there is a click target.\n container.html(\"
            \");\n }\n container.addClass(\"editable-text\");\n\n if (on_finish) {\n on_finish(new_text);\n }\n };\n\n // Create input element(s) for editing.\n var cur_text = (\"cur_text\" in config_dict ? config_dict.cur_text : container.text() ),\n input_elt, button_elt;\n\n if (use_textarea) {\n input_elt = $(\"' +\n '
            ';\n },\n\n requirements: function(options) {\n var requirements_message = 'This tool requires ';\n for (var i in options.requirements) {\n var req = options.requirements[i];\n requirements_message += req.name;\n if (req.version) {\n requirements_message += ' (Version ' + req.version + ')';\n }\n if (i < options.requirements.length - 2) {\n requirements_message += ', ';\n }\n if (i == options.requirements.length - 2) {\n requirements_message += ' and ';\n }\n }\n return requirements_message + '. Click here for more information.';\n }\n};\n\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/tool/tool-template.js\n ** module id = 23\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-portlet', 'mvc/ui/ui-misc'], function(Utils, Portlet, Ui) {\n\n// ui list element\nvar View = Backbone.View.extend({\n // create portlet to keep track of selected list elements\n initialize : function(options) {\n // link this\n var self = this;\n\n // initialize options\n this.options = options;\n this.name = options.name || 'element';\n this.multiple = options.multiple || false;\n\n // create message handler\n this.message = new Ui.Message({ cls: 'ui-margin-top' });\n\n // create portlet\n this.portlet = new Portlet.View({ cls: 'ui-portlet-section' });\n\n // create select field containing the options which can be inserted into the list\n this.select = new Ui.Select.View({ optional : options.optional });\n\n // create insert new list element button\n this.button = new Ui.ButtonIcon({\n icon : 'fa fa-sign-in',\n floating : 'left',\n tooltip : 'Insert new ' + this.name,\n onclick : function() {\n self.add({\n id : self.select.value(),\n name : self.select.text()\n });\n }\n });\n\n // build main element\n this.setElement(this._template(options));\n this.$('.ui-list-message').append(this.message.$el);\n this.$('.ui-list-portlet').append(this.portlet.$el);\n this.$('.ui-list-button').append(this.button.$el);\n this.$('.ui-list-select').append(this.select.$el);\n },\n\n /** Return/Set currently selected list elements */\n value: function(val) {\n // set new value\n if (val !== undefined) {\n this.portlet.empty();\n if ($.isArray(val)) {\n for (var i in val) {\n var v = val[i];\n var v_id = null;\n var v_name = null;\n if ($.type(v) != 'string') {\n v_id = v.id;\n v_name = v.name;\n } else {\n v_id = v_name = v;\n }\n if (v_id != null) {\n this.add({\n id : v_id,\n name : v_name\n });\n }\n }\n }\n this._refresh();\n }\n // get current value\n var lst = [];\n this.$('.ui-list-id').each(function() {\n lst.push({\n id : $(this).prop('id'),\n name : $(this).find('.ui-list-name').html()\n });\n });\n if (lst.length == 0) {\n return null;\n }\n return lst;\n },\n\n /** Add row */\n add: function(options) {\n var self = this;\n if (this.$('[id=\"' + options.id + '\"]').length === 0) {\n if (Utils.validate(options.id)) {\n var $el = $(this._templateRow({\n id : options.id,\n name : options.name\n }));\n $el.on('click', function() {\n $el.remove();\n self._refresh();\n });\n $el.on('mouseover', function() {\n $el.addClass('portlet-highlight');\n });\n $el.on('mouseout', function() {\n $el.removeClass('portlet-highlight');\n });\n this.portlet.append($el);\n this._refresh();\n } else {\n this.message.update({ message: 'Please select a valid ' + this.name + '.', status: 'danger' });\n }\n } else {\n this.message.update({ message: 'This ' + this.name + ' is already in the list.' });\n }\n },\n\n /** Update available options */\n update: function(options) {\n this.select.update(options);\n },\n\n /** Refresh view */\n _refresh: function() {\n if (this.$('.ui-list-id').length > 0) {\n !this.multiple && this.button.disable();\n this.$('.ui-list-portlet').show();\n } else {\n this.button.enable();\n this.$('.ui-list-portlet').hide();\n }\n this.options.onchange && this.options.onchange();\n },\n\n /** Main Template */\n _template: function(options) {\n return '
            ' +\n '
            ' +\n '' +\n '' +\n '
            ' +\n '
            ' +\n '
            ' +\n '
            ';\n },\n\n /** Row Template */\n _templateRow: function(options) {\n return '
            ' +\n '' +\n '' + options.name + '' +\n '
            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-list.js\n ** module id = 24\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-buttons'], function(Utils, Buttons) {\n\n/** Base class for options based ui elements **/\nvar Base = Backbone.View.extend({\n // initialize\n initialize: function(options) {\n // link this\n var self = this;\n\n // configure options\n this.options = Utils.merge(options, {\n visible : true,\n data : [],\n id : Utils.uid(),\n error_text : 'No options available.',\n wait_text : 'Please wait...',\n multiple : false\n });\n\n // create new element\n this.setElement('
            ');\n\n // create elements\n this.$message = $('
            ');\n this.$options = $(this._template(options));\n this.$menu = $('
            ');\n\n // append\n this.$el.append(this.$message);\n this.$el.append(this.$menu);\n this.$el.append(this.$options);\n\n // add select/unselect all button\n if (this.options.multiple) {\n this.all_button = new Buttons.ButtonCheck({\n onclick: function() {\n self.$('input').prop('checked', self.all_button.value() !== 0);\n self.trigger('change');\n }\n });\n this.$menu.append(this.all_button.$el);\n }\n\n // hide input field\n if (!this.options.visible) {\n this.$el.hide();\n }\n\n // initialize data\n this.update(this.options.data);\n\n // set initial value\n if (this.options.value !== undefined) {\n this.value(this.options.value);\n }\n\n // add change event. fires on trigger\n this.on('change', function() {\n this.options.onchange && this.options.onchange(this.value());\n });\n },\n\n /** Update options\n */\n update: function(options) {\n // backup current value\n var current = this._getValue();\n\n // remove all options\n this.$options.empty();\n\n // add new options using single option templates or full template\n if (this._templateOptions) {\n // rebuild options using full template\n this.$options.append(this._templateOptions(options));\n } else {\n // rebuild options using single option templates\n for (var key in options) {\n var $option = $(this._templateOption(options[key]));\n $option.addClass('ui-option');\n $option.tooltip({title: options[key].tooltip, placement: 'bottom'});\n this.$options.append($option);\n }\n }\n\n // add change events\n var self = this;\n this.$('input').on('change', function() {\n self.value(self._getValue());\n self.trigger('change');\n });\n\n // set previous value\n this.value(current);\n\n // data initialization has been completed\n this.unwait();\n },\n\n /** Return/Set current value\n */\n value: function (new_value) {\n // set new value if available\n if (new_value !== undefined) {\n // reset selection\n this.$('input').prop('checked', false);\n // set value\n if (new_value !== null) {\n // check if its an array\n if (!(new_value instanceof Array)) {\n new_value = [new_value];\n }\n // update to new selection\n for (var i in new_value) {\n this.$('input[value=\"' + new_value[i] + '\"]').first().prop('checked', true);\n }\n };\n }\n // get current value\n var current = this._getValue();\n if (this.all_button) {\n var value = current;\n if (!(value instanceof Array)) {\n value = 0;\n } else {\n value = value.length;\n }\n this.all_button.value(value, this._size());\n }\n return current;\n },\n\n /** Check if selected value exists (or any if multiple)\n */\n exists: function(value) {\n if (value !== undefined) {\n if (!(value instanceof Array)) {\n value = [value];\n }\n for (var i in value) {\n if (this.$('input[value=\"' + value[i] + '\"]').length > 0) {\n return true;\n }\n }\n }\n return false;\n },\n\n /** Return first available option\n */\n first: function() {\n var options = this.$('input').first();\n if (options.length > 0) {\n return options.val();\n } else {\n return null;\n }\n },\n\n /** Wait message during request processing\n */\n wait: function() {\n if (this._size() == 0) {\n this._messageShow(this.options.wait_text, 'info');\n this.$options.hide();\n this.$menu.hide();\n }\n },\n\n /** Hide wait message\n */\n unwait: function() {\n var total = this._size();\n if (total == 0) {\n this._messageShow(this.options.error_text, 'danger');\n this.$options.hide();\n this.$menu.hide();\n } else {\n this._messageHide();\n this.$options.css('display', 'inline-block');\n this.$menu.show();\n }\n },\n\n /** Return current selection\n */\n _getValue: function() {\n // track values in array\n var selected = [];\n this.$(':checked').each(function() {\n selected.push($(this).val());\n });\n\n // get selected elements\n if (!Utils.validate(selected)) {\n return null;\n }\n\n // return multiple or single value\n if (this.options.multiple) {\n return selected;\n } else {\n return selected[0];\n }\n },\n\n /** Returns the number of options\n */\n _size: function() {\n return this.$('.ui-option').length;\n },\n\n /** Show message instead if options\n */\n _messageShow: function(text, status) {\n this.$message.show();\n this.$message.removeClass();\n this.$message.addClass('ui-message alert alert-' + status);\n this.$message.html(text);\n },\n\n /** Hide message\n */\n _messageHide: function() {\n this.$message.hide();\n },\n\n /** Main template function\n */\n _template: function() {\n return '
            ';\n }\n});\n\n/** Iconized **/\nvar BaseIcons = Base.extend({\n _templateOption: function(pair) {\n var id = Utils.uid();\n return '
            ' +\n '' +\n '' +\n '
            ';\n }\n});\n\n/** Radio button field **/\nvar Radio = {};\nRadio.View = BaseIcons.extend({\n initialize: function(options) {\n options.type = 'radio';\n BaseIcons.prototype.initialize.call(this, options);\n }\n});\n\n/** Checkbox options field **/\nvar Checkbox = {};\nCheckbox.View = BaseIcons.extend({\n initialize: function(options) {\n options.multiple = true;\n options.type = 'checkbox';\n BaseIcons.prototype.initialize.call(this, options);\n }\n});\n\n/** Radio button options field styled as classic buttons **/\nvar RadioButton = {};\nRadioButton.View = Base.extend({\n // initialize\n initialize: function(options) {\n Base.prototype.initialize.call(this, options);\n },\n\n /** Return/Set current value\n */\n value: function (new_value) {\n // set new value\n if (new_value !== undefined) {\n this.$('input').prop('checked', false);\n this.$('label').removeClass('active');\n this.$('[value=\"' + new_value + '\"]').prop('checked', true).closest('label').addClass('active');\n }\n\n // get and return value\n return this._getValue();\n },\n\n /** Template for a single option\n */\n _templateOption: function(pair) {\n var cls = 'fa ' + pair.icon;\n if (!pair.label) {\n cls += ' no-padding';\n }\n var tmpl = '';\n return tmpl;\n },\n\n /** Main template function\n */\n _template: function() {\n return '
            ';\n }\n});\n\nreturn {\n Base : Base,\n BaseIcons : BaseIcons,\n Radio : Radio,\n RadioButton : RadioButton,\n Checkbox : Checkbox\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-options.js\n ** module id = 25\n ** module chunks = 0 3\n **/","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else {\n root.faIconButton = factory();\n }\n\n}(this, function () {\n//============================================================================\n /** Returns a jQuery object containing a clickable font-awesome button.\n * options:\n * tooltipConfig : option map for bootstrap tool tip\n * classes : array of class names (will always be classed as icon-btn)\n * disabled : T/F - add the 'disabled' class?\n * title : tooltip/title string\n * target : optional href target\n * href : optional href\n * faIcon : which font awesome icon to use\n * onclick : function to call when the button is clicked\n */\n var faIconButton = function( options ){\n options = options || {};\n options.tooltipConfig = options.tooltipConfig || { placement: 'bottom' };\n\n options.classes = [ 'icon-btn' ].concat( options.classes || [] );\n if( options.disabled ){\n options.classes.push( 'disabled' );\n }\n\n var html = [\n '',\n // could go with something less specific here - like 'html'\n '',\n ''\n ].join( '' );\n var $button = $( html ).tooltip( options.tooltipConfig );\n if( _.isFunction( options.onclick ) ){\n $button.click( options.onclick );\n }\n return $button;\n };\n\n//============================================================================\n return faIconButton;\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/ui/fa-icon-button.js\n ** module id = 26\n ** module chunks = 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.HandlebarsEnvironment = HandlebarsEnvironment;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _utils = require('./utils');\n\nvar _exception = require('./exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _helpers = require('./helpers');\n\nvar _decorators = require('./decorators');\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar VERSION = '4.0.5';\nexports.VERSION = VERSION;\nvar COMPILER_REVISION = 7;\n\nexports.COMPILER_REVISION = COMPILER_REVISION;\nvar REVISION_CHANGES = {\n 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n 2: '== 1.0.0-rc.3',\n 3: '== 1.0.0-rc.4',\n 4: '== 1.x.x',\n 5: '== 2.0.0-alpha.x',\n 6: '>= 2.0.0-beta.1',\n 7: '>= 4.0.0'\n};\n\nexports.REVISION_CHANGES = REVISION_CHANGES;\nvar objectType = '[object Object]';\n\nfunction HandlebarsEnvironment(helpers, partials, decorators) {\n this.helpers = helpers || {};\n this.partials = partials || {};\n this.decorators = decorators || {};\n\n _helpers.registerDefaultHelpers(this);\n _decorators.registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n constructor: HandlebarsEnvironment,\n\n logger: _logger2['default'],\n log: _logger2['default'].log,\n\n registerHelper: function registerHelper(name, fn) {\n if (_utils.toString.call(name) === objectType) {\n if (fn) {\n throw new _exception2['default']('Arg not supported with multiple helpers');\n }\n _utils.extend(this.helpers, name);\n } else {\n this.helpers[name] = fn;\n }\n },\n unregisterHelper: function unregisterHelper(name) {\n delete this.helpers[name];\n },\n\n registerPartial: function registerPartial(name, partial) {\n if (_utils.toString.call(name) === objectType) {\n _utils.extend(this.partials, name);\n } else {\n if (typeof partial === 'undefined') {\n throw new _exception2['default']('Attempting to register a partial called \"' + name + '\" as undefined');\n }\n this.partials[name] = partial;\n }\n },\n unregisterPartial: function unregisterPartial(name) {\n delete this.partials[name];\n },\n\n registerDecorator: function registerDecorator(name, fn) {\n if (_utils.toString.call(name) === objectType) {\n if (fn) {\n throw new _exception2['default']('Arg not supported with multiple decorators');\n }\n _utils.extend(this.decorators, name);\n } else {\n this.decorators[name] = fn;\n }\n },\n unregisterDecorator: function unregisterDecorator(name) {\n delete this.decorators[name];\n }\n};\n\nvar log = _logger2['default'].log;\n\nexports.log = log;\nexports.createFrame = _utils.createFrame;\nexports.logger = _logger2['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7cUJBQTRDLFNBQVM7O3lCQUMvQixhQUFhOzs7O3VCQUNFLFdBQVc7OzBCQUNSLGNBQWM7O3NCQUNuQyxVQUFVOzs7O0FBRXRCLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQzs7QUFDeEIsSUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7OztBQUU1QixJQUFNLGdCQUFnQixHQUFHO0FBQzlCLEdBQUMsRUFBRSxhQUFhO0FBQ2hCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxVQUFVO0FBQ2IsR0FBQyxFQUFFLGtCQUFrQjtBQUNyQixHQUFDLEVBQUUsaUJBQWlCO0FBQ3BCLEdBQUMsRUFBRSxVQUFVO0NBQ2QsQ0FBQzs7O0FBRUYsSUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7O0FBRTlCLFNBQVMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDbkUsTUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQzdCLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUMvQixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0FBRW5DLGtDQUF1QixJQUFJLENBQUMsQ0FBQztBQUM3Qix3Q0FBMEIsSUFBSSxDQUFDLENBQUM7Q0FDakM7O0FBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ2hDLGFBQVcsRUFBRSxxQkFBcUI7O0FBRWxDLFFBQU0scUJBQVE7QUFDZCxLQUFHLEVBQUUsb0JBQU8sR0FBRzs7QUFFZixnQkFBYyxFQUFFLHdCQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDakMsUUFBSSxnQkFBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3RDLFVBQUksRUFBRSxFQUFFO0FBQUUsY0FBTSwyQkFBYyx5Q0FBeUMsQ0FBQyxDQUFDO09BQUU7QUFDM0Usb0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QixNQUFNO0FBQ0wsVUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekI7R0FDRjtBQUNELGtCQUFnQixFQUFFLDBCQUFTLElBQUksRUFBRTtBQUMvQixXQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDM0I7O0FBRUQsaUJBQWUsRUFBRSx5QkFBUyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ3ZDLFFBQUksZ0JBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtBQUN0QyxvQkFBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdCLE1BQU07QUFDTCxVQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTtBQUNsQyxjQUFNLHlFQUEwRCxJQUFJLG9CQUFpQixDQUFDO09BQ3ZGO0FBQ0QsVUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7S0FDL0I7R0FDRjtBQUNELG1CQUFpQixFQUFFLDJCQUFTLElBQUksRUFBRTtBQUNoQyxXQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDNUI7O0FBRUQsbUJBQWlCLEVBQUUsMkJBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxRQUFJLGdCQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDdEMsVUFBSSxFQUFFLEVBQUU7QUFBRSxjQUFNLDJCQUFjLDRDQUE0QyxDQUFDLENBQUM7T0FBRTtBQUM5RSxvQkFBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQy9CLE1BQU07QUFDTCxVQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUM1QjtHQUNGO0FBQ0QscUJBQW1CLEVBQUUsNkJBQVMsSUFBSSxFQUFFO0FBQ2xDLFdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM5QjtDQUNGLENBQUM7O0FBRUssSUFBSSxHQUFHLEdBQUcsb0JBQU8sR0FBRyxDQUFDOzs7UUFFcEIsV0FBVztRQUFFLE1BQU0iLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4wLjUnO1xuZXhwb3J0IGNvbnN0IENPTVBJTEVSX1JFVklTSU9OID0gNztcblxuZXhwb3J0IGNvbnN0IFJFVklTSU9OX0NIQU5HRVMgPSB7XG4gIDE6ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFjdHVhbGx5IHJldjIgYnV0IGRvZXNuJ3QgcmVwb3J0IGl0XG4gIDI6ICc9PSAxLjAuMC1yYy4zJyxcbiAgMzogJz09IDEuMC4wLXJjLjQnLFxuICA0OiAnPT0gMS54LngnLFxuICA1OiAnPT0gMi4wLjAtYWxwaGEueCcsXG4gIDY6ICc+PSAyLjAuMC1iZXRhLjEnLFxuICA3OiAnPj0gNC4wLjAnXG59O1xuXG5jb25zdCBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMsIGRlY29yYXRvcnMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuICB0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzIHx8IHt9O1xuXG4gIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG4gIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBsb2dnZXIsXG4gIGxvZzogbG9nZ2VyLmxvZyxcblxuICByZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaGVscGVyc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgZXh0ZW5kKHRoaXMucGFydGlhbHMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHBhcnRpYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oYEF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIiR7bmFtZX1cIiBhcyB1bmRlZmluZWRgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSBwYXJ0aWFsO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJ0aWFsc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5kZWNvcmF0b3JzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvcmF0b3JzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuZGVjb3JhdG9yc1tuYW1lXTtcbiAgfVxufTtcblxuZXhwb3J0IGxldCBsb2cgPSBsb2dnZXIubG9nO1xuXG5leHBvcnQge2NyZWF0ZUZyYW1lLCBsb2dnZXJ9O1xuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/base.js\n ** module id = 27\n ** module chunks = 0 3\n **/","/**\n * Popover wrapper\n*/\ndefine([ 'utils/utils' ], function( Utils ) {\nvar View = Backbone.View.extend({\n optionsDefault: {\n with_close : true,\n title : null,\n placement : 'top',\n container : 'body',\n body : null\n },\n\n initialize: function ( options ) {\n this.setElement( this._template() );\n this.uid = Utils.uid();\n this.options = _.defaults( options || {}, this.optionsDefault );\n this.options.container.parent().append( this.el );\n this.$title = this.$( '.popover-title-label' );\n this.$close = this.$( '.popover-close' );\n this.$body = this.$( '.popover-content' );\n\n // add initial content\n this.options.body && this.append( this.options.body );\n\n // add event to hide if click is outside of popup and not on container\n var self = this;\n $( 'body' ).on( 'mousedown.' + this.uid, function( e ) {\n // the 'is' for buttons that trigger popups\n // the 'has' for icons within a button that triggers a popup\n self.visible && !$( self.options.container ).is( e.target ) && !$( self.el ).is( e.target ) &&\n $( self.el ).has( e.target ).length === 0 && self.hide();\n });\n },\n\n /**\n * Render popover\n */\n render: function() {\n this.$title.html( this.options.title );\n this.$el.removeClass().addClass( 'ui-popover popover fade in' ).addClass( this.options.placement );\n this.$el.css( this._get_placement( this.options.placement ) );\n\n // configure close option\n var self = this;\n if ( this.options.with_close ) {\n this.$close.on( 'click', function() { self.hide() } ).show();\n } else {\n this.$close.off().hide();\n }\n },\n\n /**\n * Set the popover title\n * @params{ String } newTitle - New popover title\n */\n title: function( newTitle ) {\n if ( newTitle !== undefined ) {\n this.options.title = newTitle;\n this.$title.html( newTitle );\n }\n },\n\n /**\n * Show popover\n */\n show: function() {\n this.render();\n this.$el.show();\n this.visible = true;\n },\n\n /**\n * Hide popover\n */\n hide: function() {\n this.$el.hide();\n this.visible = false;\n },\n\n /**\n * Append new content to the popover\n * @params{ Object } $el - Dom element\n */\n append: function( $el ) {\n this.$body.append( $el );\n },\n\n /**\n * Remove all content\n */\n empty: function() {\n this.$body.empty();\n },\n\n /**\n * Remove popover\n */\n remove: function() {\n $( 'body' ).off( 'mousedown.' + this.uid );\n this.$el.remove();\n },\n\n /**\n * Improve popover location/placement\n */\n _get_placement: function( placement ) {\n // get popover dimensions\n var width = this._get_width( this.$el );\n var height = this.$el.height();\n\n // get container details\n var $container = this.options.container;\n var container_width = this._get_width( $container );\n var container_height = this._get_height( $container );\n var container_position = $container.position();\n\n // get position\n var top = left = 0;\n if ([ 'top', 'bottom' ].indexOf( placement ) != -1) {\n left = container_position.left - width + ( container_width + width ) / 2;\n switch ( placement ) {\n case 'top':\n top = container_position.top - height - 5;\n break;\n case 'bottom':\n top = container_position.top + container_height + 5;\n break;\n }\n } else {\n top = container_position.top - height + ( container_height + height ) / 2;\n switch ( placement ) {\n case 'right':\n left = container_position.left + container_width;\n break;\n }\n }\n return { top: top, left: left };\n },\n\n /**\n * Returns padding/margin corrected width\n */\n _get_width: function( $el ) {\n return $el.width() + parseInt( $el.css( 'padding-left' ) ) + parseInt( $el.css( 'margin-left' ) ) +\n parseInt( $el.css( 'padding-right' ) ) + parseInt( $el.css( 'margin-right' ) );\n },\n\n /**\n * Returns padding corrected height\n */\n _get_height: function( $el ) {\n return $el.height() + parseInt( $el.css( 'padding-top' ) ) + parseInt( $el.css( 'padding-bottom' ) );\n },\n\n /**\n * Return the popover template\n */\n _template: function( options ) {\n return '
            ' +\n '
            ' +\n '
            ' +\n '
            ' +\n '
            ' +\n '
            ' +\n '
            ' +\n '
            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-popover.js\n ** module id = 29\n ** module chunks = 3\n **/","// dependencies\ndefine(['utils/utils'], function(Utils) {\n\n/**\n * A plugin for initializing select2 input items.\n * Make sure the select2 library itself is loaded beforehand.\n * Also the element to which select2 will be appended has to \n * be created before select2 initialization (and passed as option).\n */\nvar View = Backbone.View.extend(\n{\n // options\n optionsDefault: {\n css : '',\n placeholder : 'No data available',\n data : [],\n value : null,\n multiple : false,\n minimumInputLength : 0,\n // example format of initial data: \"id:name,55:anotherrole@role.com,27:role@role.com\"\n initialData : ''\n },\n \n // initialize\n initialize : function(options) {\n // configure options\n this.options = Utils.merge(options, this.optionsDefault);\n \n // create new element\n this.setElement(this._template(this.options));\n \n // check if container exists\n if (!this.options.container) {\n console.log('ui-select::initialize() : container not specified.');\n return;\n }\n \n // add to dom\n this.options.container.append(this.$el);\n \n // link selection dictionary\n this.select_data = this.options.data;\n \n // refresh\n this._refresh();\n \n if (!this.options.multiple){\n // initial value\n if (this.options.value) {\n this._setValue(this.options.value);\n }\n \n // add change event\n var self = this;\n if (this.options.onchange) {\n this.$el.on('change', function() {\n self.options.onchange(self.value());\n });\n }\n }\n },\n \n // value\n value : function (new_value) {\n // get current id/value\n var before = this._getValue();\n \n // check if new_value is defined\n if (new_value !== undefined) {\n this._setValue(new_value);\n }\n \n // get current id/value\n var after = this._getValue();\n \n // fire onchange\n if ((after != before && this.options.onchange)) {\n this.options.onchange(after);\n }\n \n // return current value\n return after;\n },\n \n // label\n text : function () {\n return this.$el.select2('data').text;\n },\n \n // disabled\n disabled: function() {\n return !this.$el.select2('enable');\n },\n\n // enable\n enable: function() {\n this.$el.select2('enable', true);\n },\n \n // disable\n disable: function() {\n this.$el.select2('enable', false);\n },\n \n // add\n add: function(options) {\n // add options\n this.select_data.push({\n id : options.id,\n text : options.text\n });\n \n // refresh\n this._refresh();\n },\n \n // remove\n del: function(id) {\n // search option\n var index = this._getIndex(id);\n \n // check if found\n if (index != -1) {\n // remove options\n this.select_data.splice(index, 1);\n \n // refresh\n this._refresh();\n }\n },\n \n // remove\n remove: function() {\n this.$el.select2('destroy');\n },\n \n // update\n update: function(options) {\n // copy options\n this.select_data = [];\n for (var key in options.data) {\n this.select_data.push(options.data[key]);\n }\n \n // refresh\n this._refresh();\n },\n \n // refresh\n _refresh: function() {\n // add select2 data based on type of input\n if (!this.options.multiple){\n var selected = this._getValue();\n var select_opt = {\n data : this.select_data,\n containerCssClass : this.options.css,\n placeholder : this.options.placeholder,\n dropdownAutoWidth : true\n };\n this.$el.select2(select_opt);\n // select previous value (if exists)\n this._setValue(selected);\n } else {\n var select_opt = {\n multiple : this.options.multiple,\n containerCssClass : this.options.css,\n placeholder : this.options.placeholder,\n minimumInputLength : this.options.minimumInputLength,\n ajax : this.options.ajax,\n dropdownCssClass : this.options.dropdownCssClass,\n escapeMarkup : this.options.escapeMarkup,\n formatResult : this.options.formatResult,\n formatSelection : this.options.formatSelection,\n initSelection : this.options.initSelection,\n initialData : this.options.initialData\n };\n this.$el.select2(select_opt);\n }\n },\n \n // get index\n _getIndex: function(value) {\n // search index\n for (var key in this.select_data) {\n if (this.select_data[key].id == value) {\n return key;\n }\n }\n \n // not found\n return -1;\n },\n \n // get value\n _getValue: function() {\n return this.$el.select2('val');\n },\n \n // set value\n _setValue: function(new_value) {\n var index = this._getIndex(new_value);\n if (index == -1) {\n if (this.select_data.length > 0) {\n new_value = this.select_data[0].id;\n }\n }\n this.$el.select2('val', new_value);\n },\n \n // element\n _template: function(options) {\n return '';\n }\n});\n\nreturn {\n View : View\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-select.js\n ** module id = 30\n ** module chunks = 3\n **/","// dependencies\ndefine(['utils/utils'], function(Utils) {\n\n// return\nvar View = Backbone.View.extend({\n // defaults options\n optionsDefault: {\n title_new : '',\n operations : null,\n onnew : null,\n max : null,\n onchange : null\n },\n \n // initialize\n initialize : function(options) {\n // configure\n this.visible = false;\n this.$nav = null;\n this.$content = null;\n this.first_tab = null;\n this.current_id = null;\n \n // configure options\n this.options = Utils.merge(options, this.optionsDefault);\n \n // create tabs\n var $tabs = $(this._template(this.options));\n \n // link elements\n this.$nav = $tabs.find('.tab-navigation');\n this.$content = $tabs.find('.tab-content');\n \n // create new element\n this.setElement($tabs);\n \n // clear list\n this.list = {};\n \n // link this\n var self = this;\n \n // append operations\n if (this.options.operations) {\n $.each(this.options.operations, function(name, item) {\n item.$el.prop('id', name);\n self.$nav.find('.operations').append(item.$el);\n });\n }\n \n // add built-in add-new-tab tab\n if (this.options.onnew) {\n // create tab object\n var $tab_new = $(this._template_tab_new(this.options));\n \n // append to navbar\n this.$nav.append($tab_new);\n \n // add tooltip\n $tab_new.tooltip({title: 'Add a new tab', placement: 'bottom', container: self.$el});\n \n // link click event\n $tab_new.on('click', function(e) {\n $tab_new.tooltip('hide');\n self.options.onnew();\n });\n }\n },\n \n // size\n size: function() {\n return _.size(this.list);\n },\n \n // front\n current: function() {\n return this.$el.find('.tab-pane.active').attr('id');\n },\n \n // append\n add: function(options) {\n // self\n var self = this;\n \n // get tab id\n var id = options.id;\n\n // create tab object\n var $tab_title = $(this._template_tab(options));\n var $tab_content = $(this._template_tab_content(options));\n \n // add to list\n this.list[id] = options.ondel ? true : false;\n \n // add a new tab either before the add-new-tab tab or behind the last tab\n if (this.options.onnew) {\n this.$nav.find('#new-tab').before($tab_title);\n } else {\n this.$nav.append($tab_title);\n }\n \n // add content\n $tab_content.append(options.$el);\n this.$content.append($tab_content);\n \n // activate this tab if this is the first tab\n if (this.size() == 1) {\n $tab_title.addClass('active');\n $tab_content.addClass('active');\n this.first_tab = id;\n }\n \n // hide add tab\n if (this.options.max && this.size() >= this.options.max) {\n this.$el.find('#new-tab').hide();\n }\n \n // add click event to remove tab\n if (options.ondel) {\n var $del_icon = $tab_title.find('#delete');\n $del_icon.tooltip({title: 'Delete this tab', placement: 'bottom', container: self.$el});\n $del_icon.on('click', function() {\n $del_icon.tooltip('destroy');\n self.$el.find('.tooltip').remove();\n options.ondel();\n return false;\n });\n }\n \n // add custom click event handler\n $tab_title.on('click', function(e) {\n // prevent default\n e.preventDefault();\n \n // click\n if (options.onclick) {\n options.onclick();\n } else {\n self.show(id);\n }\n });\n \n // initialize current id\n if (!this.current_id) {\n this.current_id = id;\n }\n },\n \n // delete tab\n del: function(id) {\n // delete tab from dom\n this.$el.find('#tab-' + id).remove();\n this.$el.find('#' + id).remove();\n \n // check if first tab has been deleted\n if (this.first_tab == id) {\n this.first_tab = null;\n }\n \n // show first tab\n if (this.first_tab != null) {\n this.show(this.first_tab);\n }\n \n // delete from list\n if (this.list[id]) {\n delete this.list[id];\n }\n \n // show add tab\n if (this.size() < this.options.max) {\n this.$el.find('#new-tab').show();\n }\n },\n \n // delete tab\n delRemovable: function() {\n for (var id in this.list) {\n this.del(id);\n }\n },\n \n // show\n show: function(id){\n // show tab view\n this.$el.fadeIn('fast');\n this.visible = true;\n \n // show selected tab\n if (id) {\n // reassign active class\n this.$el.find('#tab-' + this.current_id).removeClass('active');\n this.$el.find('#' + this.current_id).removeClass('active');\n this.$el.find('#tab-' + id).addClass('active');\n this.$el.find('#' + id).addClass('active');\n \n // update current id\n this.current_id = id;\n }\n \n // change\n if (this.options.onchange) {\n this.options.onchange(id);\n }\n },\n \n // hide\n hide: function(){\n this.$el.fadeOut('fast');\n this.visible = false;\n },\n\n // hide operation\n hideOperation: function(id) {\n this.$nav.find('#' + id).hide();\n },\n\n // show operation\n showOperation: function(id) {\n this.$nav.find('#' + id).show();\n },\n \n // set operation\n setOperation: function(id, callback) {\n var $el = this.$nav.find('#' + id);\n $el.off('click');\n $el.on('click', callback);\n },\n \n // title\n title: function(id, new_title) {\n var $el = this.$el.find('#tab-title-text-' + id);\n if (new_title) {\n $el.html(new_title);\n }\n return $el.html();\n },\n \n // retitle\n retitle: function(new_title) {\n var index = 0;\n for (var id in this.list) {\n this.title(id, ++index + ': ' + new_title);\n }\n },\n \n // fill template\n _template: function(options) {\n return '
            ' +\n '
              ' +\n '
              ' +\n '
            '+\n '
            ' +\n '
            ';\n },\n \n // fill template tab\n _template_tab_new: function(options) {\n return '
          3. ' +\n '' +\n '' +\n options.title_new +\n '' +\n '
          4. ';\n },\n \n // fill template tab\n _template_tab: function(options) {\n var tmpl = '
          5. ' +\n '' +\n '' + options.title + '';\n \n if (options.ondel) {\n tmpl += '';\n }\n \n tmpl += '' +\n '
          6. ';\n \n return tmpl;\n },\n \n // fill template tab content\n _template_tab_content: function(options) {\n return '
            ';\n }\n});\n\nreturn {\n View : View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-tabs.js\n ** module id = 31\n ** module chunks = 0 3\n **/","/**\n * Parser.js\n * Copyright 2012-13 Mayank Lahiri\n * mlahiri@gmail.com\n * Released under the BSD License.\n *\n * A forgiving Bibtex parser that can:\n * \n * (1) operate in streaming or block mode, extracting entries as dictionaries. \n * (2) convert Latex special characters to UTF-8.\n * (3) best-effort parse malformed entries.\n * (4) run in a CommonJS environment or a browser, without any dependencies.\n * (5) be advanced-compiled by Google Closure Compiler.\n * \n * Handwritten as a labor of love, not auto-generated from a grammar. \n *\n * Modes of usage:\n *\n * (1) Synchronous, string\n *\n * var entries = BibtexParser(text);\n * console.log(entries);\n *\n * (2) Asynchronous, stream\n *\n * var entryCallback = function(entry) { console.log(entry); }\n * var parser = new BibtexParser(entryCallback);\n * parser.parse(chunk1);\n * parser.parse(chunk2);\n * ...\n * \n * @param {text|function(Object)} arg Either a Bibtex string or callback \n * function for processing parsed entries.\n * @constructor\n */\nfunction BibtexParser(arg0) {\n // Determine how this function is to be used\n if (typeof arg0 == 'string') {\n // Passed a string, synchronous call without 'new'\n var tempStorage = {};\n var entries = [];\n function accumulator(entry) {\n entries.push(entry);\n }\n var parser = BibtexParser.call(tempStorage, accumulator);\n parser.parse(arg0);\n return {\n 'entries': entries,\n 'errors': parser.getErrors()\n }\n }\n if (typeof arg0 != 'function') {\n throw 'Invalid parser construction.';\n }\n\n /** @enum {number} */\n this.STATES_ = {\n ENTRY_OR_JUNK: 0,\n OBJECT_TYPE: 1,\n ENTRY_KEY: 2, \n KV_KEY: 3, \n EQUALS: 4,\n KV_VALUE: 5 \n }\n /** @private */ this.DATA_ = {};\n /** @private */ this.CALLBACK_ = arg0;\n /** @private */ this.CHAR_ = 0;\n /** @private */ this.LINE_ = 1;\n /** @private */ this.CHAR_IN_LINE_ = 0;\n /** @private */ this.SKIPWS_ = true;\n /** @private */ this.SKIPCOMMENT_ = true;\n /** @private */ this.PARSETMP_ = {};\n /** @private */ this.SKIPTILLEOL_ = false;\n /** @private */ this.VALBRACES_ = null;\n /** @private */ this.BRACETYPE_ = null;\n /** @private */ this.BRACECOUNT_ = 0;\n /** @private */ this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n /** @private */ this.ERRORS_ = [];\n /** @private */ this.ENTRY_TYPES_ = {\n 'inproceedings' : 1,\n 'proceedings' : 2,\n 'article' : 3,\n 'techreport' : 4,\n 'misc' : 5,\n 'mastersthesis' : 6,\n 'book' : 7,\n 'phdthesis' : 8,\n 'incollection' : 9,\n 'unpublished' : 10,\n 'inbook' : 11,\n 'manual' : 12,\n 'periodical' : 13,\n 'booklet' : 14,\n 'masterthesis' : 15,\n 'conference' : 16\n ,'online' : 998 // Galaxy MOD: Handle @online entries for preprints.\n ,'data' : 999 // Galaxy MOD: Handle @data citations coming from figshare.\n }\n /** @private */ this.MACROS_ = {\n 'jan' : 'January',\n 'feb' : 'February',\n 'mar' : 'March',\n 'apr' : 'April',\n 'may' : 'May',\n 'jun' : 'June',\n 'jul' : 'July',\n 'aug' : 'August',\n 'sep' : 'September',\n 'oct' : 'October',\n 'nov' : 'November',\n 'dec' : 'December',\n 'Jan' : 'January',\n 'Feb' : 'February',\n 'Mar' : 'March',\n 'Apr' : 'April',\n 'May' : 'May',\n 'Jun' : 'June',\n 'Jul' : 'July',\n 'Aug' : 'August',\n 'Sep' : 'September',\n 'Oct' : 'October',\n 'Nov' : 'November',\n 'Dec' : 'December'\n }\n\n /**\n * Gets an array of all errors encountered during parsing.\n * Array entries are of the format:\n * [ line number, character in line, character in stream, error text ]\n *\n * @returns Array\n * @public\n */\n this.getErrors = function() {\n return this.ERRORS_;\n }\n\n /**\n * Processes a chunk of data\n * @public\n */\n this.parse = function(chunk) {\n for (var i = 0; i < chunk.length; i++)\n this.processCharacter_(chunk[i]);\n }\n\n /**\n * Logs error at current stream position.\n *\n * @private\n */\n this.error_ = function(text) {\n this.ERRORS_.push([ this.LINE_, \n this.CHAR_IN_LINE_,\n this.CHAR_,\n text ])\n }\n\n /**\n * Called after an entire entry has been parsed from the stream.\n * Performs post-processing and invokes the entry callback pointed to by\n * this.CALLBACK_. Parsed (but unprocessed) entry data is in this.DATA_.\n */\n this.processEntry_ = function() {\n var data = this.DATA_;\n if (data.Fields) \n for (var f in data.Fields) {\n var raw = data.Fields[f];\n\n // Convert Latex/Bibtex special characters to UTF-8 equivalents\n for (var i = 0; i < this.CHARCONV_.length; i++) {\n var re = this.CHARCONV_[i][0];\n var rep = this.CHARCONV_[i][1];\n raw = raw.replace(re, rep);\n }\n\n // Basic substitutions\n raw = raw.replace(/[\\n\\r\\t]/g, ' ')\n .replace(/\\s\\s+/g, ' ')\n .replace(/^\\s+|\\s+$/g, '')\n\n // Remove braces and backslashes\n var len = raw.length;\n var processed = '';\n for (var i = 0; i < len; i++) {\n var c = raw[i];\n var skip = false;\n if (c == '\\\\' && i < len-1) \n c = raw[++i];\n else {\n if (c == '{' || c == '}')\n skip = true;\n }\n if (!skip)\n processed += c;\n }\n data.Fields[f] = processed\n }\n\n if (data.ObjectType == 'string') {\n for (var f in data.Fields) { \n this.MACROS_[f] = data.Fields[f];\n }\n } else {\n // Parsed a new Bibtex entry\n this.CALLBACK_(data);\n }\n }\n\n\n /**\n * Processes next character in the stream, invoking the callback after \n * each entry has been found and processed.\n * \n * @private\n * @param {string} c Next character in input stream\n */\n this.processCharacter_ = function(c) {\n // Housekeeping\n this.CHAR_++;\n this.CHAR_IN_LINE_++;\n if (c == '\\n') {\n this.LINE_++;\n this.CHAR_IN_LINE_ = 1;\n }\n\n // Convenience states for skipping whitespace when needed\n if (this.SKIPTILLEOL_) {\n if (c == '\\n')\n this.SKIPTILLEOL_ = false;\n return;\n }\n if (this.SKIPCOMMENT_ && c == '%') {\n this.SKIPTILLEOL_ = true;\n return;\n }\n if (this.SKIPWS_ && /\\s/.test(c))\n return;\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n this.SKIPTILLEOL_ = false;\n\n // Main state machine\n var AnotherIteration = true;\n while (AnotherIteration) {\n //console.log(this.LINE_, this.CHAR_IN_LINE_, this.STATE_, c)\n AnotherIteration = false;\n switch(this.STATE_) {\n // -- Scan for an object marker ('@')\n // -- Reset temporary data structure in case previous entry was garbled\n case this.STATES_.ENTRY_OR_JUNK:\n if (c == '@') {\n // SUCCESS: Parsed a valid start-of-object marker.\n // NEXT_STATE: OBJECT_TYPE\n this.STATE_ = this.STATES_.OBJECT_TYPE;\n this.DATA_ = {\n ObjectType : ''\n };\n }\n this.BRACETYPE_ = null;\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n break;\n\n // Start at first non-whitespace character after start-of-object '@'\n // -- Accept [A-Za-z], break on non-matching character\n // -- Populate this.DATA_.EntryType and this.DATA_.ObjectType\n case this.STATES_.OBJECT_TYPE:\n if (/[A-Za-z]/.test(c)) {\n this.DATA_.ObjectType += c.toLowerCase();\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n } else {\n // Break from state and validate object type\n var ot = this.DATA_.ObjectType;\n if (ot == 'comment') {\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n } else {\n if (ot == 'string') {\n this.DATA_.ObjectType = ot;\n this.DATA_.Fields = {};\n this.BRACETYPE_ = c;\n this.BRACECOUNT_ = 1;\n this.STATE_ = this.STATES_.KV_KEY;\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.PARSETMP_ = {\n Key: ''\n }\n } else {\n if (ot == 'preamble') {\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n } else {\n if (ot in this.ENTRY_TYPES_) {\n // SUCCESS: Parsed a valid object type.\n // NEXT_STATE: ENTRY_KEY\n this.DATA_.ObjectType = 'entry';\n this.DATA_.EntryType = ot;\n this.DATA_.EntryKey = '';\n this.STATE_ = this.STATES_.ENTRY_KEY;\n AnotherIteration = true;\n } else {\n // ERROR: Unrecognized object type.\n // NEXT_STATE: ENTRY_OR_JUNK\n this.error_('Unrecognized object type: \"' +\n this.DATA_.ObjectType + '\"')\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n }\n }\n }\n }\n }\n break;\n\n // Start at first non-alphabetic character after an entry type\n // -- Populate this.DATA_.EntryKey\n case this.STATES_.ENTRY_KEY:\n if ((c === '{' || c === '(') && this.BRACETYPE_ == null) {\n this.BRACETYPE_ = c;\n this.BRACECOUNT_ = 1;\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n break;\n }\n if (/[,%\\s]/.test(c)) {\n if (this.DATA_.EntryKey.length < 1) { \n // Skip comments and whitespace before entry key\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n } else {\n if (this.BRACETYPE_ == null) {\n // ERROR: No opening brace for object\n // NEXT_STATE: ENTRY_OR_JUNK\n this.error_('No opening brace for object.');\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n } else {\n // SUCCESS: Parsed an entry key\n // NEXT_STATE: KV_KEY\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n AnotherIteration = true;\n this.STATE_ = this.STATES_.KV_KEY;\n this.PARSETMP_.Key= '';\n this.DATA_.Fields = {};\n }\n }\n } else {\n this.DATA_.EntryKey += c;\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n }\n break;\n\n // Start at first non-whitespace/comment character after entry key.\n // -- Populate this.PARSETMP_.Key\n case this.STATES_.KV_KEY:\n // Test for end of entry\n if ((c == '}' && this.BRACETYPE_ == '{') ||\n (c == ')' && this.BRACETYPE_ == '(')) {\n // SUCCESS: Parsed an entry, possible incomplete\n // NEXT_STATE: ENTRY_OR_JUNK\n this.processEntry_();\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n break;\n }\n if (/[\\-A-Za-z:]/.test(c)) {\n // Add to key\n this.PARSETMP_.Key += c;\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n } else {\n // Either end of key or we haven't encountered start of key\n if (this.PARSETMP_.Key.length < 1) {\n // Keep going till we see a key\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n } else {\n // SUCCESS: Found full key in K/V pair\n // NEXT_STATE: EQUALS\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.EQUALS;\n AnotherIteration = true;\n }\n }\n break;\n\n // Start at first non-alphabetic character after K/V pair key.\n case this.STATES_.EQUALS:\n if ((c == '}' && this.BRACETYPE_ == '{') ||\n (c == ')' && this.BRACETYPE_ == '(')) {\n // ERROR: K/V pair with key but no value\n // NEXT_STATE: ENTRY_OR_JUNK\n this.error_('Key-value pair has key \"' +\n this.PARSETMP_.Key + '\", but no value.');\n this.processEntry_();\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n break;\n }\n if (c == '=') {\n // SUCCESS: found an equal signs separating key and value\n // NEXT_STATE: KV_VALUE\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.KV_VALUE;\n this.PARSETMP_.Value = '';\n this.VALBRACES_ = { '\"' : [], '{' : [] };\n }\n break;\n\n // Start at first non-whitespace/comment character after '=' \n // -- Populate this.PARSETMP_.Value\n case this.STATES_.KV_VALUE:\n var delim = this.VALBRACES_;\n var val = this.PARSETMP_.Value;\n var doneParsingValue = false;\n\n // Test for special characters\n if (c == '\"' || c == '{' || c == '}' || c == ',') {\n if (c == ',') {\n // This comma can mean:\n // (1) just another comma literal\n // (2) end of a macro reference\n if (0 === delim['\"'].length + delim['{'].length) {\n // end of a macro reference\n var macro = this.PARSETMP_.Value.trim();\n if (macro in this.MACROS_) {\n // Successful macro reference\n this.PARSETMP_.Value = this.MACROS_[macro];\n } else {\n // Reference to an undefined macro\n this.error_('Reference to an undefined macro: '+macro);\n }\n doneParsingValue = true;\n }\n }\n if (c == '\"') {\n // This quote can mean:\n // (1) opening delimiter\n // (2) closing delimiter\n // (3) literal, if we have a '{' on the stack\n if (0 === delim['\"'].length + delim['{'].length) {\n // opening delimiter\n delim['\"'].push(this.CHAR_)\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n break;\n }\n if (delim['\"'].length == 1 && delim['{'].length == 0 &&\n (val.length==0 || val[val.length-1] != '\\\\')) {\n // closing delimiter\n doneParsingValue = true;\n } else {\n // literal, add to value\n }\n }\n if (c == '{') {\n // This brace can mean:\n // (1) opening delimiter\n // (2) stacked verbatim delimiter\n if (val.length == 0 || val[val.length-1] != '\\\\') {\n delim['{'].push(this.CHAR_)\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n } else {\n // literal, add to value\n }\n }\n if (c == '}') {\n // This brace can mean:\n // (1) closing delimiter\n // (2) closing stacked verbatim delimiter\n // (3) end of object definition if value was a macro\n if (0 === delim['\"'].length + delim['{'].length) {\n // end of object definition, after macro\n var macro = this.PARSETMP_.Value.trim();\n if (macro in this.MACROS_) {\n // Successful macro reference\n this.PARSETMP_.Value = this.MACROS_[macro];\n } else {\n // Reference to an undefined macro\n this.error_('Reference to an undefined macro: '+macro);\n }\n AnotherIteration = true;\n doneParsingValue = true;\n } else {\n if (val.length == 0 || val[val.length-1] != '\\\\') {\n if (delim['{'].length > 0) {\n // pop stack for stacked verbatim delimiter\n delim['{'].splice(delim['{'].length-1, 1)\n if (0 == delim['{'].length + delim['\"'].length) {\n // closing delimiter\n doneParsingValue = true;\n } else {\n // end verbatim block\n }\n }\n } else {\n // literal, add to value\n }\n }\n }\n }\n\n // If here, then we are either done parsing the value or \n // have a literal that should be added to the value.\n if (doneParsingValue) {\n // SUCCESS: value parsed\n // NEXT_STATE: KV_KEY\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.KV_KEY;\n this.DATA_.Fields[this.PARSETMP_.Key] = this.PARSETMP_.Value;\n this.PARSETMP_ = { Key: '' };\n this.VALBRACES_ = null;\n } else {\n this.PARSETMP_.Value += c;\n }\n break;\n } // end switch (this.STATE_)\n } // end while(AnotherIteration)\n } // end function processCharacter \n\n /** @private */ this.CHARCONV_ = [\n [ /\\\\space /g, '\\u0020' ],\n [ /\\\\textdollar /g, '\\u0024' ],\n [ /\\\\textquotesingle /g, '\\u0027' ],\n [ /\\\\ast /g, '\\u002A' ],\n [ /\\\\textbackslash /g, '\\u005C' ],\n [ /\\\\\\^\\{\\}/g, '\\u005E' ],\n [ /\\\\textasciigrave /g, '\\u0060' ],\n [ /\\\\lbrace /g, '\\u007B' ],\n [ /\\\\vert /g, '\\u007C' ],\n [ /\\\\rbrace /g, '\\u007D' ],\n [ /\\\\textasciitilde /g, '\\u007E' ],\n [ /\\\\textexclamdown /g, '\\u00A1' ],\n [ /\\\\textcent /g, '\\u00A2' ],\n [ /\\\\textsterling /g, '\\u00A3' ],\n [ /\\\\textcurrency /g, '\\u00A4' ],\n [ /\\\\textyen /g, '\\u00A5' ],\n [ /\\\\textbrokenbar /g, '\\u00A6' ],\n [ /\\\\textsection /g, '\\u00A7' ],\n [ /\\\\textasciidieresis /g, '\\u00A8' ],\n [ /\\\\textcopyright /g, '\\u00A9' ],\n [ /\\\\textordfeminine /g, '\\u00AA' ],\n [ /\\\\guillemotleft /g, '\\u00AB' ],\n [ /\\\\lnot /g, '\\u00AC' ],\n [ /\\\\textregistered /g, '\\u00AE' ],\n [ /\\\\textasciimacron /g, '\\u00AF' ],\n [ /\\\\textdegree /g, '\\u00B0' ],\n [ /\\\\pm /g, '\\u00B1' ],\n [ /\\\\textasciiacute /g, '\\u00B4' ],\n [ /\\\\mathrm\\{\\\\mu\\}/g, '\\u00B5' ],\n [ /\\\\textparagraph /g, '\\u00B6' ],\n [ /\\\\cdot /g, '\\u00B7' ],\n [ /\\\\c\\{\\}/g, '\\u00B8' ],\n [ /\\\\textordmasculine /g, '\\u00BA' ],\n [ /\\\\guillemotright /g, '\\u00BB' ],\n [ /\\\\textonequarter /g, '\\u00BC' ],\n [ /\\\\textonehalf /g, '\\u00BD' ],\n [ /\\\\textthreequarters /g, '\\u00BE' ],\n [ /\\\\textquestiondown /g, '\\u00BF' ],\n [ /\\\\`\\{A\\}/g, '\\u00C0' ],\n [ /\\\\'\\{A\\}/g, '\\u00C1' ],\n [ /\\\\\\^\\{A\\}/g, '\\u00C2' ],\n [ /\\\\~\\{A\\}/g, '\\u00C3' ],\n [ /\\\\\"\\{A\\}/g, '\\u00C4' ],\n [ /\\\\AA /g, '\\u00C5' ],\n [ /\\\\AE /g, '\\u00C6' ],\n [ /\\\\c\\{C\\}/g, '\\u00C7' ],\n [ /\\\\`\\{E\\}/g, '\\u00C8' ],\n [ /\\\\'\\{E\\}/g, '\\u00C9' ],\n [ /\\\\\\^\\{E\\}/g, '\\u00CA' ],\n [ /\\\\\"\\{E\\}/g, '\\u00CB' ],\n [ /\\\\`\\{I\\}/g, '\\u00CC' ],\n [ /\\\\'\\{I\\}/g, '\\u00CD' ],\n [ /\\\\\\^\\{I\\}/g, '\\u00CE' ],\n [ /\\\\\"\\{I\\}/g, '\\u00CF' ],\n [ /\\\\DH /g, '\\u00D0' ],\n [ /\\\\~\\{N\\}/g, '\\u00D1' ],\n [ /\\\\`\\{O\\}/g, '\\u00D2' ],\n [ /\\\\'\\{O\\}/g, '\\u00D3' ],\n [ /\\\\\\^\\{O\\}/g, '\\u00D4' ],\n [ /\\\\~\\{O\\}/g, '\\u00D5' ],\n [ /\\\\\"\\{O\\}/g, '\\u00D6' ],\n [ /\\\\texttimes /g, '\\u00D7' ],\n [ /\\\\O /g, '\\u00D8' ],\n [ /\\\\`\\{U\\}/g, '\\u00D9' ],\n [ /\\\\'\\{U\\}/g, '\\u00DA' ],\n [ /\\\\\\^\\{U\\}/g, '\\u00DB' ],\n [ /\\\\\"\\{U\\}/g, '\\u00DC' ],\n [ /\\\\'\\{Y\\}/g, '\\u00DD' ],\n [ /\\\\TH /g, '\\u00DE' ],\n [ /\\\\ss /g, '\\u00DF' ],\n [ /\\\\`\\{a\\}/g, '\\u00E0' ],\n [ /\\\\'\\{a\\}/g, '\\u00E1' ],\n [ /\\\\\\^\\{a\\}/g, '\\u00E2' ],\n [ /\\\\~\\{a\\}/g, '\\u00E3' ],\n [ /\\\\\"\\{a\\}/g, '\\u00E4' ],\n [ /\\\\aa /g, '\\u00E5' ],\n [ /\\\\ae /g, '\\u00E6' ],\n [ /\\\\c\\{c\\}/g, '\\u00E7' ],\n [ /\\\\`\\{e\\}/g, '\\u00E8' ],\n [ /\\\\'\\{e\\}/g, '\\u00E9' ],\n [ /\\\\\\^\\{e\\}/g, '\\u00EA' ],\n [ /\\\\\"\\{e\\}/g, '\\u00EB' ],\n [ /\\\\`\\{\\\\i\\}/g, '\\u00EC' ],\n [ /\\\\'\\{\\\\i\\}/g, '\\u00ED' ],\n [ /\\\\\\^\\{\\\\i\\}/g, '\\u00EE' ],\n [ /\\\\\"\\{\\\\i\\}/g, '\\u00EF' ],\n [ /\\\\dh /g, '\\u00F0' ],\n [ /\\\\~\\{n\\}/g, '\\u00F1' ],\n [ /\\\\`\\{o\\}/g, '\\u00F2' ],\n [ /\\\\'\\{o\\}/g, '\\u00F3' ],\n [ /\\\\\\^\\{o\\}/g, '\\u00F4' ],\n [ /\\\\~\\{o\\}/g, '\\u00F5' ],\n [ /\\\\\"\\{o\\}/g, '\\u00F6' ],\n [ /\\\\div /g, '\\u00F7' ],\n [ /\\\\o /g, '\\u00F8' ],\n [ /\\\\`\\{u\\}/g, '\\u00F9' ],\n [ /\\\\'\\{u\\}/g, '\\u00FA' ],\n [ /\\\\\\^\\{u\\}/g, '\\u00FB' ],\n [ /\\\\\"\\{u\\}/g, '\\u00FC' ],\n [ /\\\\'\\{y\\}/g, '\\u00FD' ],\n [ /\\\\th /g, '\\u00FE' ],\n [ /\\\\\"\\{y\\}/g, '\\u00FF' ],\n [ /\\\\=\\{A\\}/g, '\\u0100' ],\n [ /\\\\=\\{a\\}/g, '\\u0101' ],\n [ /\\\\u\\{A\\}/g, '\\u0102' ],\n [ /\\\\u\\{a\\}/g, '\\u0103' ],\n [ /\\\\k\\{A\\}/g, '\\u0104' ],\n [ /\\\\k\\{a\\}/g, '\\u0105' ],\n [ /\\\\'\\{C\\}/g, '\\u0106' ],\n [ /\\\\'\\{c\\}/g, '\\u0107' ],\n [ /\\\\\\^\\{C\\}/g, '\\u0108' ],\n [ /\\\\\\^\\{c\\}/g, '\\u0109' ],\n [ /\\\\.\\{C\\}/g, '\\u010A' ],\n [ /\\\\.\\{c\\}/g, '\\u010B' ],\n [ /\\\\v\\{C\\}/g, '\\u010C' ],\n [ /\\\\v\\{c\\}/g, '\\u010D' ],\n [ /\\\\v\\{D\\}/g, '\\u010E' ],\n [ /\\\\v\\{d\\}/g, '\\u010F' ],\n [ /\\\\DJ /g, '\\u0110' ],\n [ /\\\\dj /g, '\\u0111' ],\n [ /\\\\=\\{E\\}/g, '\\u0112' ],\n [ /\\\\=\\{e\\}/g, '\\u0113' ],\n [ /\\\\u\\{E\\}/g, '\\u0114' ],\n [ /\\\\u\\{e\\}/g, '\\u0115' ],\n [ /\\\\.\\{E\\}/g, '\\u0116' ],\n [ /\\\\.\\{e\\}/g, '\\u0117' ],\n [ /\\\\k\\{E\\}/g, '\\u0118' ],\n [ /\\\\k\\{e\\}/g, '\\u0119' ],\n [ /\\\\v\\{E\\}/g, '\\u011A' ],\n [ /\\\\v\\{e\\}/g, '\\u011B' ],\n [ /\\\\\\^\\{G\\}/g, '\\u011C' ],\n [ /\\\\\\^\\{g\\}/g, '\\u011D' ],\n [ /\\\\u\\{G\\}/g, '\\u011E' ],\n [ /\\\\u\\{g\\}/g, '\\u011F' ],\n [ /\\\\.\\{G\\}/g, '\\u0120' ],\n [ /\\\\.\\{g\\}/g, '\\u0121' ],\n [ /\\\\c\\{G\\}/g, '\\u0122' ],\n [ /\\\\c\\{g\\}/g, '\\u0123' ],\n [ /\\\\\\^\\{H\\}/g, '\\u0124' ],\n [ /\\\\\\^\\{h\\}/g, '\\u0125' ],\n [ /\\\\Elzxh /g, '\\u0127' ],\n [ /\\\\~\\{I\\}/g, '\\u0128' ],\n [ /\\\\~\\{\\\\i\\}/g, '\\u0129' ],\n [ /\\\\=\\{I\\}/g, '\\u012A' ],\n [ /\\\\=\\{\\\\i\\}/g, '\\u012B' ],\n [ /\\\\u\\{I\\}/g, '\\u012C' ],\n [ /\\\\u\\{\\\\i\\}/g, '\\u012D' ],\n [ /\\\\k\\{I\\}/g, '\\u012E' ],\n [ /\\\\k\\{i\\}/g, '\\u012F' ],\n [ /\\\\.\\{I\\}/g, '\\u0130' ],\n [ /\\\\i /g, '\\u0131' ],\n [ /\\\\\\^\\{J\\}/g, '\\u0134' ],\n [ /\\\\\\^\\{\\\\j\\}/g, '\\u0135' ],\n [ /\\\\c\\{K\\}/g, '\\u0136' ],\n [ /\\\\c\\{k\\}/g, '\\u0137' ],\n [ /\\\\'\\{L\\}/g, '\\u0139' ],\n [ /\\\\'\\{l\\}/g, '\\u013A' ],\n [ /\\\\c\\{L\\}/g, '\\u013B' ],\n [ /\\\\c\\{l\\}/g, '\\u013C' ],\n [ /\\\\v\\{L\\}/g, '\\u013D' ],\n [ /\\\\v\\{l\\}/g, '\\u013E' ],\n [ /\\\\L /g, '\\u0141' ],\n [ /\\\\l /g, '\\u0142' ],\n [ /\\\\'\\{N\\}/g, '\\u0143' ],\n [ /\\\\'\\{n\\}/g, '\\u0144' ],\n [ /\\\\c\\{N\\}/g, '\\u0145' ],\n [ /\\\\c\\{n\\}/g, '\\u0146' ],\n [ /\\\\v\\{N\\}/g, '\\u0147' ],\n [ /\\\\v\\{n\\}/g, '\\u0148' ],\n [ /\\\\NG /g, '\\u014A' ],\n [ /\\\\ng /g, '\\u014B' ],\n [ /\\\\=\\{O\\}/g, '\\u014C' ],\n [ /\\\\=\\{o\\}/g, '\\u014D' ],\n [ /\\\\u\\{O\\}/g, '\\u014E' ],\n [ /\\\\u\\{o\\}/g, '\\u014F' ],\n [ /\\\\H\\{O\\}/g, '\\u0150' ],\n [ /\\\\H\\{o\\}/g, '\\u0151' ],\n [ /\\\\OE /g, '\\u0152' ],\n [ /\\\\oe /g, '\\u0153' ],\n [ /\\\\'\\{R\\}/g, '\\u0154' ],\n [ /\\\\'\\{r\\}/g, '\\u0155' ],\n [ /\\\\c\\{R\\}/g, '\\u0156' ],\n [ /\\\\c\\{r\\}/g, '\\u0157' ],\n [ /\\\\v\\{R\\}/g, '\\u0158' ],\n [ /\\\\v\\{r\\}/g, '\\u0159' ],\n [ /\\\\'\\{S\\}/g, '\\u015A' ],\n [ /\\\\'\\{s\\}/g, '\\u015B' ],\n [ /\\\\\\^\\{S\\}/g, '\\u015C' ],\n [ /\\\\\\^\\{s\\}/g, '\\u015D' ],\n [ /\\\\c\\{S\\}/g, '\\u015E' ],\n [ /\\\\c\\{s\\}/g, '\\u015F' ],\n [ /\\\\v\\{S\\}/g, '\\u0160' ],\n [ /\\\\v\\{s\\}/g, '\\u0161' ],\n [ /\\\\c\\{T\\}/g, '\\u0162' ],\n [ /\\\\c\\{t\\}/g, '\\u0163' ],\n [ /\\\\v\\{T\\}/g, '\\u0164' ],\n [ /\\\\v\\{t\\}/g, '\\u0165' ],\n [ /\\\\~\\{U\\}/g, '\\u0168' ],\n [ /\\\\~\\{u\\}/g, '\\u0169' ],\n [ /\\\\=\\{U\\}/g, '\\u016A' ],\n [ /\\\\=\\{u\\}/g, '\\u016B' ],\n [ /\\\\u\\{U\\}/g, '\\u016C' ],\n [ /\\\\u\\{u\\}/g, '\\u016D' ],\n [ /\\\\r\\{U\\}/g, '\\u016E' ],\n [ /\\\\r\\{u\\}/g, '\\u016F' ],\n [ /\\\\H\\{U\\}/g, '\\u0170' ],\n [ /\\\\H\\{u\\}/g, '\\u0171' ],\n [ /\\\\k\\{U\\}/g, '\\u0172' ],\n [ /\\\\k\\{u\\}/g, '\\u0173' ],\n [ /\\\\\\^\\{W\\}/g, '\\u0174' ],\n [ /\\\\\\^\\{w\\}/g, '\\u0175' ],\n [ /\\\\\\^\\{Y\\}/g, '\\u0176' ],\n [ /\\\\\\^\\{y\\}/g, '\\u0177' ],\n [ /\\\\\"\\{Y\\}/g, '\\u0178' ],\n [ /\\\\'\\{Z\\}/g, '\\u0179' ],\n [ /\\\\'\\{z\\}/g, '\\u017A' ],\n [ /\\\\.\\{Z\\}/g, '\\u017B' ],\n [ /\\\\.\\{z\\}/g, '\\u017C' ],\n [ /\\\\v\\{Z\\}/g, '\\u017D' ],\n [ /\\\\v\\{z\\}/g, '\\u017E' ],\n [ /\\\\texthvlig /g, '\\u0195' ],\n [ /\\\\textnrleg /g, '\\u019E' ],\n [ /\\\\eth /g, '\\u01AA' ],\n [ /\\\\textdoublepipe /g, '\\u01C2' ],\n [ /\\\\'\\{g\\}/g, '\\u01F5' ],\n [ /\\\\Elztrna /g, '\\u0250' ],\n [ /\\\\Elztrnsa /g, '\\u0252' ],\n [ /\\\\Elzopeno /g, '\\u0254' ],\n [ /\\\\Elzrtld /g, '\\u0256' ],\n [ /\\\\Elzschwa /g, '\\u0259' ],\n [ /\\\\varepsilon /g, '\\u025B' ],\n [ /\\\\Elzpgamma /g, '\\u0263' ],\n [ /\\\\Elzpbgam /g, '\\u0264' ],\n [ /\\\\Elztrnh /g, '\\u0265' ],\n [ /\\\\Elzbtdl /g, '\\u026C' ],\n [ /\\\\Elzrtll /g, '\\u026D' ],\n [ /\\\\Elztrnm /g, '\\u026F' ],\n [ /\\\\Elztrnmlr /g, '\\u0270' ],\n [ /\\\\Elzltlmr /g, '\\u0271' ],\n [ /\\\\Elzltln /g, '\\u0272' ],\n [ /\\\\Elzrtln /g, '\\u0273' ],\n [ /\\\\Elzclomeg /g, '\\u0277' ],\n [ /\\\\textphi /g, '\\u0278' ],\n [ /\\\\Elztrnr /g, '\\u0279' ],\n [ /\\\\Elztrnrl /g, '\\u027A' ],\n [ /\\\\Elzrttrnr /g, '\\u027B' ],\n [ /\\\\Elzrl /g, '\\u027C' ],\n [ /\\\\Elzrtlr /g, '\\u027D' ],\n [ /\\\\Elzfhr /g, '\\u027E' ],\n [ /\\\\Elzrtls /g, '\\u0282' ],\n [ /\\\\Elzesh /g, '\\u0283' ],\n [ /\\\\Elztrnt /g, '\\u0287' ],\n [ /\\\\Elzrtlt /g, '\\u0288' ],\n [ /\\\\Elzpupsil /g, '\\u028A' ],\n [ /\\\\Elzpscrv /g, '\\u028B' ],\n [ /\\\\Elzinvv /g, '\\u028C' ],\n [ /\\\\Elzinvw /g, '\\u028D' ],\n [ /\\\\Elztrny /g, '\\u028E' ],\n [ /\\\\Elzrtlz /g, '\\u0290' ],\n [ /\\\\Elzyogh /g, '\\u0292' ],\n [ /\\\\Elzglst /g, '\\u0294' ],\n [ /\\\\Elzreglst /g, '\\u0295' ],\n [ /\\\\Elzinglst /g, '\\u0296' ],\n [ /\\\\textturnk /g, '\\u029E' ],\n [ /\\\\Elzdyogh /g, '\\u02A4' ],\n [ /\\\\Elztesh /g, '\\u02A7' ],\n [ /\\\\textasciicaron /g, '\\u02C7' ],\n [ /\\\\Elzverts /g, '\\u02C8' ],\n [ /\\\\Elzverti /g, '\\u02CC' ],\n [ /\\\\Elzlmrk /g, '\\u02D0' ],\n [ /\\\\Elzhlmrk /g, '\\u02D1' ],\n [ /\\\\Elzsbrhr /g, '\\u02D2' ],\n [ /\\\\Elzsblhr /g, '\\u02D3' ],\n [ /\\\\Elzrais /g, '\\u02D4' ],\n [ /\\\\Elzlow /g, '\\u02D5' ],\n [ /\\\\textasciibreve /g, '\\u02D8' ],\n [ /\\\\textperiodcentered /g, '\\u02D9' ],\n [ /\\\\r\\{\\}/g, '\\u02DA' ],\n [ /\\\\k\\{\\}/g, '\\u02DB' ],\n [ /\\\\texttildelow /g, '\\u02DC' ],\n [ /\\\\H\\{\\}/g, '\\u02DD' ],\n [ /\\\\tone\\{55\\}/g, '\\u02E5' ],\n [ /\\\\tone\\{44\\}/g, '\\u02E6' ],\n [ /\\\\tone\\{33\\}/g, '\\u02E7' ],\n [ /\\\\tone\\{22\\}/g, '\\u02E8' ],\n [ /\\\\tone\\{11\\}/g, '\\u02E9' ],\n [ /\\\\cyrchar\\\\C/g, '\\u030F' ],\n [ /\\\\Elzpalh /g, '\\u0321' ],\n [ /\\\\Elzrh /g, '\\u0322' ],\n [ /\\\\Elzsbbrg /g, '\\u032A' ],\n [ /\\\\Elzxl /g, '\\u0335' ],\n [ /\\\\Elzbar /g, '\\u0336' ],\n [ /\\\\'\\{A\\}/g, '\\u0386' ],\n [ /\\\\'\\{E\\}/g, '\\u0388' ],\n [ /\\\\'\\{H\\}/g, '\\u0389' ],\n [ /\\\\'\\{\\}\\{I\\}/g, '\\u038A' ],\n [ /\\\\'\\{\\}O/g, '\\u038C' ],\n [ /\\\\mathrm\\{'Y\\}/g, '\\u038E' ],\n [ /\\\\mathrm\\{'\\\\Omega\\}/g, '\\u038F' ],\n [ /\\\\acute\\{\\\\ddot\\{\\\\iota\\}\\}/g, '\\u0390' ],\n [ /\\\\Alpha /g, '\\u0391' ],\n [ /\\\\Beta /g, '\\u0392' ],\n [ /\\\\Gamma /g, '\\u0393' ],\n [ /\\\\Delta /g, '\\u0394' ],\n [ /\\\\Epsilon /g, '\\u0395' ],\n [ /\\\\Zeta /g, '\\u0396' ],\n [ /\\\\Eta /g, '\\u0397' ],\n [ /\\\\Theta /g, '\\u0398' ],\n [ /\\\\Iota /g, '\\u0399' ],\n [ /\\\\Kappa /g, '\\u039A' ],\n [ /\\\\Lambda /g, '\\u039B' ],\n [ /\\\\Xi /g, '\\u039E' ],\n [ /\\\\Pi /g, '\\u03A0' ],\n [ /\\\\Rho /g, '\\u03A1' ],\n [ /\\\\Sigma /g, '\\u03A3' ],\n [ /\\\\Tau /g, '\\u03A4' ],\n [ /\\\\Upsilon /g, '\\u03A5' ],\n [ /\\\\Phi /g, '\\u03A6' ],\n [ /\\\\Chi /g, '\\u03A7' ],\n [ /\\\\Psi /g, '\\u03A8' ],\n [ /\\\\Omega /g, '\\u03A9' ],\n [ /\\\\mathrm\\{\\\\ddot\\{I\\}\\}/g, '\\u03AA' ],\n [ /\\\\mathrm\\{\\\\ddot\\{Y\\}\\}/g, '\\u03AB' ],\n [ /\\\\'\\{\\$\\\\alpha\\$\\}/g, '\\u03AC' ],\n [ /\\\\acute\\{\\\\epsilon\\}/g, '\\u03AD' ],\n [ /\\\\acute\\{\\\\eta\\}/g, '\\u03AE' ],\n [ /\\\\acute\\{\\\\iota\\}/g, '\\u03AF' ],\n [ /\\\\acute\\{\\\\ddot\\{\\\\upsilon\\}\\}/g, '\\u03B0' ],\n [ /\\\\alpha /g, '\\u03B1' ],\n [ /\\\\beta /g, '\\u03B2' ],\n [ /\\\\gamma /g, '\\u03B3' ],\n [ /\\\\delta /g, '\\u03B4' ],\n [ /\\\\epsilon /g, '\\u03B5' ],\n [ /\\\\zeta /g, '\\u03B6' ],\n [ /\\\\eta /g, '\\u03B7' ],\n [ /\\\\texttheta /g, '\\u03B8' ],\n [ /\\\\iota /g, '\\u03B9' ],\n [ /\\\\kappa /g, '\\u03BA' ],\n [ /\\\\lambda /g, '\\u03BB' ],\n [ /\\\\mu /g, '\\u03BC' ],\n [ /\\\\nu /g, '\\u03BD' ],\n [ /\\\\xi /g, '\\u03BE' ],\n [ /\\\\pi /g, '\\u03C0' ],\n [ /\\\\rho /g, '\\u03C1' ],\n [ /\\\\varsigma /g, '\\u03C2' ],\n [ /\\\\sigma /g, '\\u03C3' ],\n [ /\\\\tau /g, '\\u03C4' ],\n [ /\\\\upsilon /g, '\\u03C5' ],\n [ /\\\\varphi /g, '\\u03C6' ],\n [ /\\\\chi /g, '\\u03C7' ],\n [ /\\\\psi /g, '\\u03C8' ],\n [ /\\\\omega /g, '\\u03C9' ],\n [ /\\\\ddot\\{\\\\iota\\}/g, '\\u03CA' ],\n [ /\\\\ddot\\{\\\\upsilon\\}/g, '\\u03CB' ],\n [ /\\\\'\\{o\\}/g, '\\u03CC' ],\n [ /\\\\acute\\{\\\\upsilon\\}/g, '\\u03CD' ],\n [ /\\\\acute\\{\\\\omega\\}/g, '\\u03CE' ],\n [ /\\\\Pisymbol\\{ppi022\\}\\{87\\}/g, '\\u03D0' ],\n [ /\\\\textvartheta /g, '\\u03D1' ],\n [ /\\\\Upsilon /g, '\\u03D2' ],\n [ /\\\\phi /g, '\\u03D5' ],\n [ /\\\\varpi /g, '\\u03D6' ],\n [ /\\\\Stigma /g, '\\u03DA' ],\n [ /\\\\Digamma /g, '\\u03DC' ],\n [ /\\\\digamma /g, '\\u03DD' ],\n [ /\\\\Koppa /g, '\\u03DE' ],\n [ /\\\\Sampi /g, '\\u03E0' ],\n [ /\\\\varkappa /g, '\\u03F0' ],\n [ /\\\\varrho /g, '\\u03F1' ],\n [ /\\\\textTheta /g, '\\u03F4' ],\n [ /\\\\backepsilon /g, '\\u03F6' ],\n [ /\\\\cyrchar\\\\CYRYO /g, '\\u0401' ],\n [ /\\\\cyrchar\\\\CYRDJE /g, '\\u0402' ],\n [ /\\\\cyrchar\\{\\\\'\\\\CYRG\\}/g, '\\u0403' ],\n [ /\\\\cyrchar\\\\CYRIE /g, '\\u0404' ],\n [ /\\\\cyrchar\\\\CYRDZE /g, '\\u0405' ],\n [ /\\\\cyrchar\\\\CYRII /g, '\\u0406' ],\n [ /\\\\cyrchar\\\\CYRYI /g, '\\u0407' ],\n [ /\\\\cyrchar\\\\CYRJE /g, '\\u0408' ],\n [ /\\\\cyrchar\\\\CYRLJE /g, '\\u0409' ],\n [ /\\\\cyrchar\\\\CYRNJE /g, '\\u040A' ],\n [ /\\\\cyrchar\\\\CYRTSHE /g, '\\u040B' ],\n [ /\\\\cyrchar\\{\\\\'\\\\CYRK\\}/g, '\\u040C' ],\n [ /\\\\cyrchar\\\\CYRUSHRT /g, '\\u040E' ],\n [ /\\\\cyrchar\\\\CYRDZHE /g, '\\u040F' ],\n [ /\\\\cyrchar\\\\CYRA /g, '\\u0410' ],\n [ /\\\\cyrchar\\\\CYRB /g, '\\u0411' ],\n [ /\\\\cyrchar\\\\CYRV /g, '\\u0412' ],\n [ /\\\\cyrchar\\\\CYRG /g, '\\u0413' ],\n [ /\\\\cyrchar\\\\CYRD /g, '\\u0414' ],\n [ /\\\\cyrchar\\\\CYRE /g, '\\u0415' ],\n [ /\\\\cyrchar\\\\CYRZH /g, '\\u0416' ],\n [ /\\\\cyrchar\\\\CYRZ /g, '\\u0417' ],\n [ /\\\\cyrchar\\\\CYRI /g, '\\u0418' ],\n [ /\\\\cyrchar\\\\CYRISHRT /g, '\\u0419' ],\n [ /\\\\cyrchar\\\\CYRK /g, '\\u041A' ],\n [ /\\\\cyrchar\\\\CYRL /g, '\\u041B' ],\n [ /\\\\cyrchar\\\\CYRM /g, '\\u041C' ],\n [ /\\\\cyrchar\\\\CYRN /g, '\\u041D' ],\n [ /\\\\cyrchar\\\\CYRO /g, '\\u041E' ],\n [ /\\\\cyrchar\\\\CYRP /g, '\\u041F' ],\n [ /\\\\cyrchar\\\\CYRR /g, '\\u0420' ],\n [ /\\\\cyrchar\\\\CYRS /g, '\\u0421' ],\n [ /\\\\cyrchar\\\\CYRT /g, '\\u0422' ],\n [ /\\\\cyrchar\\\\CYRU /g, '\\u0423' ],\n [ /\\\\cyrchar\\\\CYRF /g, '\\u0424' ],\n [ /\\\\cyrchar\\\\CYRH /g, '\\u0425' ],\n [ /\\\\cyrchar\\\\CYRC /g, '\\u0426' ],\n [ /\\\\cyrchar\\\\CYRCH /g, '\\u0427' ],\n [ /\\\\cyrchar\\\\CYRSH /g, '\\u0428' ],\n [ /\\\\cyrchar\\\\CYRSHCH /g, '\\u0429' ],\n [ /\\\\cyrchar\\\\CYRHRDSN /g, '\\u042A' ],\n [ /\\\\cyrchar\\\\CYRERY /g, '\\u042B' ],\n [ /\\\\cyrchar\\\\CYRSFTSN /g, '\\u042C' ],\n [ /\\\\cyrchar\\\\CYREREV /g, '\\u042D' ],\n [ /\\\\cyrchar\\\\CYRYU /g, '\\u042E' ],\n [ /\\\\cyrchar\\\\CYRYA /g, '\\u042F' ],\n [ /\\\\cyrchar\\\\cyra /g, '\\u0430' ],\n [ /\\\\cyrchar\\\\cyrb /g, '\\u0431' ],\n [ /\\\\cyrchar\\\\cyrv /g, '\\u0432' ],\n [ /\\\\cyrchar\\\\cyrg /g, '\\u0433' ],\n [ /\\\\cyrchar\\\\cyrd /g, '\\u0434' ],\n [ /\\\\cyrchar\\\\cyre /g, '\\u0435' ],\n [ /\\\\cyrchar\\\\cyrzh /g, '\\u0436' ],\n [ /\\\\cyrchar\\\\cyrz /g, '\\u0437' ],\n [ /\\\\cyrchar\\\\cyri /g, '\\u0438' ],\n [ /\\\\cyrchar\\\\cyrishrt /g, '\\u0439' ],\n [ /\\\\cyrchar\\\\cyrk /g, '\\u043A' ],\n [ /\\\\cyrchar\\\\cyrl /g, '\\u043B' ],\n [ /\\\\cyrchar\\\\cyrm /g, '\\u043C' ],\n [ /\\\\cyrchar\\\\cyrn /g, '\\u043D' ],\n [ /\\\\cyrchar\\\\cyro /g, '\\u043E' ],\n [ /\\\\cyrchar\\\\cyrp /g, '\\u043F' ],\n [ /\\\\cyrchar\\\\cyrr /g, '\\u0440' ],\n [ /\\\\cyrchar\\\\cyrs /g, '\\u0441' ],\n [ /\\\\cyrchar\\\\cyrt /g, '\\u0442' ],\n [ /\\\\cyrchar\\\\cyru /g, '\\u0443' ],\n [ /\\\\cyrchar\\\\cyrf /g, '\\u0444' ],\n [ /\\\\cyrchar\\\\cyrh /g, '\\u0445' ],\n [ /\\\\cyrchar\\\\cyrc /g, '\\u0446' ],\n [ /\\\\cyrchar\\\\cyrch /g, '\\u0447' ],\n [ /\\\\cyrchar\\\\cyrsh /g, '\\u0448' ],\n [ /\\\\cyrchar\\\\cyrshch /g, '\\u0449' ],\n [ /\\\\cyrchar\\\\cyrhrdsn /g, '\\u044A' ],\n [ /\\\\cyrchar\\\\cyrery /g, '\\u044B' ],\n [ /\\\\cyrchar\\\\cyrsftsn /g, '\\u044C' ],\n [ /\\\\cyrchar\\\\cyrerev /g, '\\u044D' ],\n [ /\\\\cyrchar\\\\cyryu /g, '\\u044E' ],\n [ /\\\\cyrchar\\\\cyrya /g, '\\u044F' ],\n [ /\\\\cyrchar\\\\cyryo /g, '\\u0451' ],\n [ /\\\\cyrchar\\\\cyrdje /g, '\\u0452' ],\n [ /\\\\cyrchar\\{\\\\'\\\\cyrg\\}/g, '\\u0453' ],\n [ /\\\\cyrchar\\\\cyrie /g, '\\u0454' ],\n [ /\\\\cyrchar\\\\cyrdze /g, '\\u0455' ],\n [ /\\\\cyrchar\\\\cyrii /g, '\\u0456' ],\n [ /\\\\cyrchar\\\\cyryi /g, '\\u0457' ],\n [ /\\\\cyrchar\\\\cyrje /g, '\\u0458' ],\n [ /\\\\cyrchar\\\\cyrlje /g, '\\u0459' ],\n [ /\\\\cyrchar\\\\cyrnje /g, '\\u045A' ],\n [ /\\\\cyrchar\\\\cyrtshe /g, '\\u045B' ],\n [ /\\\\cyrchar\\{\\\\'\\\\cyrk\\}/g, '\\u045C' ],\n [ /\\\\cyrchar\\\\cyrushrt /g, '\\u045E' ],\n [ /\\\\cyrchar\\\\cyrdzhe /g, '\\u045F' ],\n [ /\\\\cyrchar\\\\CYROMEGA /g, '\\u0460' ],\n [ /\\\\cyrchar\\\\cyromega /g, '\\u0461' ],\n [ /\\\\cyrchar\\\\CYRYAT /g, '\\u0462' ],\n [ /\\\\cyrchar\\\\CYRIOTE /g, '\\u0464' ],\n [ /\\\\cyrchar\\\\cyriote /g, '\\u0465' ],\n [ /\\\\cyrchar\\\\CYRLYUS /g, '\\u0466' ],\n [ /\\\\cyrchar\\\\cyrlyus /g, '\\u0467' ],\n [ /\\\\cyrchar\\\\CYRIOTLYUS /g, '\\u0468' ],\n [ /\\\\cyrchar\\\\cyriotlyus /g, '\\u0469' ],\n [ /\\\\cyrchar\\\\CYRBYUS /g, '\\u046A' ],\n [ /\\\\cyrchar\\\\CYRIOTBYUS /g, '\\u046C' ],\n [ /\\\\cyrchar\\\\cyriotbyus /g, '\\u046D' ],\n [ /\\\\cyrchar\\\\CYRKSI /g, '\\u046E' ],\n [ /\\\\cyrchar\\\\cyrksi /g, '\\u046F' ],\n [ /\\\\cyrchar\\\\CYRPSI /g, '\\u0470' ],\n [ /\\\\cyrchar\\\\cyrpsi /g, '\\u0471' ],\n [ /\\\\cyrchar\\\\CYRFITA /g, '\\u0472' ],\n [ /\\\\cyrchar\\\\CYRIZH /g, '\\u0474' ],\n [ /\\\\cyrchar\\\\CYRUK /g, '\\u0478' ],\n [ /\\\\cyrchar\\\\cyruk /g, '\\u0479' ],\n [ /\\\\cyrchar\\\\CYROMEGARND /g, '\\u047A' ],\n [ /\\\\cyrchar\\\\cyromegarnd /g, '\\u047B' ],\n [ /\\\\cyrchar\\\\CYROMEGATITLO /g, '\\u047C' ],\n [ /\\\\cyrchar\\\\cyromegatitlo /g, '\\u047D' ],\n [ /\\\\cyrchar\\\\CYROT /g, '\\u047E' ],\n [ /\\\\cyrchar\\\\cyrot /g, '\\u047F' ],\n [ /\\\\cyrchar\\\\CYRKOPPA /g, '\\u0480' ],\n [ /\\\\cyrchar\\\\cyrkoppa /g, '\\u0481' ],\n [ /\\\\cyrchar\\\\cyrthousands /g, '\\u0482' ],\n [ /\\\\cyrchar\\\\cyrhundredthousands /g, '\\u0488' ],\n [ /\\\\cyrchar\\\\cyrmillions /g, '\\u0489' ],\n [ /\\\\cyrchar\\\\CYRSEMISFTSN /g, '\\u048C' ],\n [ /\\\\cyrchar\\\\cyrsemisftsn /g, '\\u048D' ],\n [ /\\\\cyrchar\\\\CYRRTICK /g, '\\u048E' ],\n [ /\\\\cyrchar\\\\cyrrtick /g, '\\u048F' ],\n [ /\\\\cyrchar\\\\CYRGUP /g, '\\u0490' ],\n [ /\\\\cyrchar\\\\cyrgup /g, '\\u0491' ],\n [ /\\\\cyrchar\\\\CYRGHCRS /g, '\\u0492' ],\n [ /\\\\cyrchar\\\\cyrghcrs /g, '\\u0493' ],\n [ /\\\\cyrchar\\\\CYRGHK /g, '\\u0494' ],\n [ /\\\\cyrchar\\\\cyrghk /g, '\\u0495' ],\n [ /\\\\cyrchar\\\\CYRZHDSC /g, '\\u0496' ],\n [ /\\\\cyrchar\\\\cyrzhdsc /g, '\\u0497' ],\n [ /\\\\cyrchar\\\\CYRZDSC /g, '\\u0498' ],\n [ /\\\\cyrchar\\\\cyrzdsc /g, '\\u0499' ],\n [ /\\\\cyrchar\\\\CYRKDSC /g, '\\u049A' ],\n [ /\\\\cyrchar\\\\cyrkdsc /g, '\\u049B' ],\n [ /\\\\cyrchar\\\\CYRKVCRS /g, '\\u049C' ],\n [ /\\\\cyrchar\\\\cyrkvcrs /g, '\\u049D' ],\n [ /\\\\cyrchar\\\\CYRKHCRS /g, '\\u049E' ],\n [ /\\\\cyrchar\\\\cyrkhcrs /g, '\\u049F' ],\n [ /\\\\cyrchar\\\\CYRKBEAK /g, '\\u04A0' ],\n [ /\\\\cyrchar\\\\cyrkbeak /g, '\\u04A1' ],\n [ /\\\\cyrchar\\\\CYRNDSC /g, '\\u04A2' ],\n [ /\\\\cyrchar\\\\cyrndsc /g, '\\u04A3' ],\n [ /\\\\cyrchar\\\\CYRNG /g, '\\u04A4' ],\n [ /\\\\cyrchar\\\\cyrng /g, '\\u04A5' ],\n [ /\\\\cyrchar\\\\CYRPHK /g, '\\u04A6' ],\n [ /\\\\cyrchar\\\\cyrphk /g, '\\u04A7' ],\n [ /\\\\cyrchar\\\\CYRABHHA /g, '\\u04A8' ],\n [ /\\\\cyrchar\\\\cyrabhha /g, '\\u04A9' ],\n [ /\\\\cyrchar\\\\CYRSDSC /g, '\\u04AA' ],\n [ /\\\\cyrchar\\\\cyrsdsc /g, '\\u04AB' ],\n [ /\\\\cyrchar\\\\CYRTDSC /g, '\\u04AC' ],\n [ /\\\\cyrchar\\\\cyrtdsc /g, '\\u04AD' ],\n [ /\\\\cyrchar\\\\CYRY /g, '\\u04AE' ],\n [ /\\\\cyrchar\\\\cyry /g, '\\u04AF' ],\n [ /\\\\cyrchar\\\\CYRYHCRS /g, '\\u04B0' ],\n [ /\\\\cyrchar\\\\cyryhcrs /g, '\\u04B1' ],\n [ /\\\\cyrchar\\\\CYRHDSC /g, '\\u04B2' ],\n [ /\\\\cyrchar\\\\cyrhdsc /g, '\\u04B3' ],\n [ /\\\\cyrchar\\\\CYRTETSE /g, '\\u04B4' ],\n [ /\\\\cyrchar\\\\cyrtetse /g, '\\u04B5' ],\n [ /\\\\cyrchar\\\\CYRCHRDSC /g, '\\u04B6' ],\n [ /\\\\cyrchar\\\\cyrchrdsc /g, '\\u04B7' ],\n [ /\\\\cyrchar\\\\CYRCHVCRS /g, '\\u04B8' ],\n [ /\\\\cyrchar\\\\cyrchvcrs /g, '\\u04B9' ],\n [ /\\\\cyrchar\\\\CYRSHHA /g, '\\u04BA' ],\n [ /\\\\cyrchar\\\\cyrshha /g, '\\u04BB' ],\n [ /\\\\cyrchar\\\\CYRABHCH /g, '\\u04BC' ],\n [ /\\\\cyrchar\\\\cyrabhch /g, '\\u04BD' ],\n [ /\\\\cyrchar\\\\CYRABHCHDSC /g, '\\u04BE' ],\n [ /\\\\cyrchar\\\\cyrabhchdsc /g, '\\u04BF' ],\n [ /\\\\cyrchar\\\\CYRpalochka /g, '\\u04C0' ],\n [ /\\\\cyrchar\\\\CYRKHK /g, '\\u04C3' ],\n [ /\\\\cyrchar\\\\cyrkhk /g, '\\u04C4' ],\n [ /\\\\cyrchar\\\\CYRNHK /g, '\\u04C7' ],\n [ /\\\\cyrchar\\\\cyrnhk /g, '\\u04C8' ],\n [ /\\\\cyrchar\\\\CYRCHLDSC /g, '\\u04CB' ],\n [ /\\\\cyrchar\\\\cyrchldsc /g, '\\u04CC' ],\n [ /\\\\cyrchar\\\\CYRAE /g, '\\u04D4' ],\n [ /\\\\cyrchar\\\\cyrae /g, '\\u04D5' ],\n [ /\\\\cyrchar\\\\CYRSCHWA /g, '\\u04D8' ],\n [ /\\\\cyrchar\\\\cyrschwa /g, '\\u04D9' ],\n [ /\\\\cyrchar\\\\CYRABHDZE /g, '\\u04E0' ],\n [ /\\\\cyrchar\\\\cyrabhdze /g, '\\u04E1' ],\n [ /\\\\cyrchar\\\\CYROTLD /g, '\\u04E8' ],\n [ /\\\\cyrchar\\\\cyrotld /g, '\\u04E9' ],\n [ /\\\\hspace\\{0.6em\\}/g, '\\u2002' ],\n [ /\\\\hspace\\{1em\\}/g, '\\u2003' ],\n [ /\\\\hspace\\{0.33em\\}/g, '\\u2004' ],\n [ /\\\\hspace\\{0.25em\\}/g, '\\u2005' ],\n [ /\\\\hspace\\{0.166em\\}/g, '\\u2006' ],\n [ /\\\\hphantom\\{0\\}/g, '\\u2007' ],\n [ /\\\\hphantom\\{,\\}/g, '\\u2008' ],\n [ /\\\\hspace\\{0.167em\\}/g, '\\u2009' ],\n [ /\\\\mkern1mu /g, '\\u200A' ],\n [ /\\\\textendash /g, '\\u2013' ],\n [ /\\\\textemdash /g, '\\u2014' ],\n [ /\\\\rule\\{1em\\}\\{1pt\\}/g, '\\u2015' ],\n [ /\\\\Vert /g, '\\u2016' ],\n [ /\\\\Elzreapos /g, '\\u201B' ],\n [ /\\\\textquotedblleft /g, '\\u201C' ],\n [ /\\\\textquotedblright /g, '\\u201D' ],\n [ /\\\\textdagger /g, '\\u2020' ],\n [ /\\\\textdaggerdbl /g, '\\u2021' ],\n [ /\\\\textbullet /g, '\\u2022' ],\n [ /\\\\ldots /g, '\\u2026' ],\n [ /\\\\textperthousand /g, '\\u2030' ],\n [ /\\\\textpertenthousand /g, '\\u2031' ],\n [ /\\\\backprime /g, '\\u2035' ],\n [ /\\\\guilsinglleft /g, '\\u2039' ],\n [ /\\\\guilsinglright /g, '\\u203A' ],\n [ /\\\\mkern4mu /g, '\\u205F' ],\n [ /\\\\nolinebreak /g, '\\u2060' ],\n [ /\\\\ensuremath\\{\\\\Elzpes\\}/g, '\\u20A7' ],\n [ /\\\\mbox\\{\\\\texteuro\\} /g, '\\u20AC' ],\n [ /\\\\dddot /g, '\\u20DB' ],\n [ /\\\\ddddot /g, '\\u20DC' ],\n [ /\\\\mathbb\\{C\\}/g, '\\u2102' ],\n [ /\\\\mathscr\\{g\\}/g, '\\u210A' ],\n [ /\\\\mathscr\\{H\\}/g, '\\u210B' ],\n [ /\\\\mathfrak\\{H\\}/g, '\\u210C' ],\n [ /\\\\mathbb\\{H\\}/g, '\\u210D' ],\n [ /\\\\hslash /g, '\\u210F' ],\n [ /\\\\mathscr\\{I\\}/g, '\\u2110' ],\n [ /\\\\mathfrak\\{I\\}/g, '\\u2111' ],\n [ /\\\\mathscr\\{L\\}/g, '\\u2112' ],\n [ /\\\\mathscr\\{l\\}/g, '\\u2113' ],\n [ /\\\\mathbb\\{N\\}/g, '\\u2115' ],\n [ /\\\\cyrchar\\\\textnumero /g, '\\u2116' ],\n [ /\\\\wp /g, '\\u2118' ],\n [ /\\\\mathbb\\{P\\}/g, '\\u2119' ],\n [ /\\\\mathbb\\{Q\\}/g, '\\u211A' ],\n [ /\\\\mathscr\\{R\\}/g, '\\u211B' ],\n [ /\\\\mathfrak\\{R\\}/g, '\\u211C' ],\n [ /\\\\mathbb\\{R\\}/g, '\\u211D' ],\n [ /\\\\Elzxrat /g, '\\u211E' ],\n [ /\\\\texttrademark /g, '\\u2122' ],\n [ /\\\\mathbb\\{Z\\}/g, '\\u2124' ],\n [ /\\\\Omega /g, '\\u2126' ],\n [ /\\\\mho /g, '\\u2127' ],\n [ /\\\\mathfrak\\{Z\\}/g, '\\u2128' ],\n [ /\\\\ElsevierGlyph\\{2129\\}/g, '\\u2129' ],\n [ /\\\\AA /g, '\\u212B' ],\n [ /\\\\mathscr\\{B\\}/g, '\\u212C' ],\n [ /\\\\mathfrak\\{C\\}/g, '\\u212D' ],\n [ /\\\\mathscr\\{e\\}/g, '\\u212F' ],\n [ /\\\\mathscr\\{E\\}/g, '\\u2130' ],\n [ /\\\\mathscr\\{F\\}/g, '\\u2131' ],\n [ /\\\\mathscr\\{M\\}/g, '\\u2133' ],\n [ /\\\\mathscr\\{o\\}/g, '\\u2134' ],\n [ /\\\\aleph /g, '\\u2135' ],\n [ /\\\\beth /g, '\\u2136' ],\n [ /\\\\gimel /g, '\\u2137' ],\n [ /\\\\daleth /g, '\\u2138' ],\n [ /\\\\textfrac\\{1\\}\\{3\\}/g, '\\u2153' ],\n [ /\\\\textfrac\\{2\\}\\{3\\}/g, '\\u2154' ],\n [ /\\\\textfrac\\{1\\}\\{5\\}/g, '\\u2155' ],\n [ /\\\\textfrac\\{2\\}\\{5\\}/g, '\\u2156' ],\n [ /\\\\textfrac\\{3\\}\\{5\\}/g, '\\u2157' ],\n [ /\\\\textfrac\\{4\\}\\{5\\}/g, '\\u2158' ],\n [ /\\\\textfrac\\{1\\}\\{6\\}/g, '\\u2159' ],\n [ /\\\\textfrac\\{5\\}\\{6\\}/g, '\\u215A' ],\n [ /\\\\textfrac\\{1\\}\\{8\\}/g, '\\u215B' ],\n [ /\\\\textfrac\\{3\\}\\{8\\}/g, '\\u215C' ],\n [ /\\\\textfrac\\{5\\}\\{8\\}/g, '\\u215D' ],\n [ /\\\\textfrac\\{7\\}\\{8\\}/g, '\\u215E' ],\n [ /\\\\leftarrow /g, '\\u2190' ],\n [ /\\\\uparrow /g, '\\u2191' ],\n [ /\\\\rightarrow /g, '\\u2192' ],\n [ /\\\\downarrow /g, '\\u2193' ],\n [ /\\\\leftrightarrow /g, '\\u2194' ],\n [ /\\\\updownarrow /g, '\\u2195' ],\n [ /\\\\nwarrow /g, '\\u2196' ],\n [ /\\\\nearrow /g, '\\u2197' ],\n [ /\\\\searrow /g, '\\u2198' ],\n [ /\\\\swarrow /g, '\\u2199' ],\n [ /\\\\nleftarrow /g, '\\u219A' ],\n [ /\\\\nrightarrow /g, '\\u219B' ],\n [ /\\\\arrowwaveright /g, '\\u219C' ],\n [ /\\\\arrowwaveright /g, '\\u219D' ],\n [ /\\\\twoheadleftarrow /g, '\\u219E' ],\n [ /\\\\twoheadrightarrow /g, '\\u21A0' ],\n [ /\\\\leftarrowtail /g, '\\u21A2' ],\n [ /\\\\rightarrowtail /g, '\\u21A3' ],\n [ /\\\\mapsto /g, '\\u21A6' ],\n [ /\\\\hookleftarrow /g, '\\u21A9' ],\n [ /\\\\hookrightarrow /g, '\\u21AA' ],\n [ /\\\\looparrowleft /g, '\\u21AB' ],\n [ /\\\\looparrowright /g, '\\u21AC' ],\n [ /\\\\leftrightsquigarrow /g, '\\u21AD' ],\n [ /\\\\nleftrightarrow /g, '\\u21AE' ],\n [ /\\\\Lsh /g, '\\u21B0' ],\n [ /\\\\Rsh /g, '\\u21B1' ],\n [ /\\\\ElsevierGlyph\\{21B3\\}/g, '\\u21B3' ],\n [ /\\\\curvearrowleft /g, '\\u21B6' ],\n [ /\\\\curvearrowright /g, '\\u21B7' ],\n [ /\\\\circlearrowleft /g, '\\u21BA' ],\n [ /\\\\circlearrowright /g, '\\u21BB' ],\n [ /\\\\leftharpoonup /g, '\\u21BC' ],\n [ /\\\\leftharpoondown /g, '\\u21BD' ],\n [ /\\\\upharpoonright /g, '\\u21BE' ],\n [ /\\\\upharpoonleft /g, '\\u21BF' ],\n [ /\\\\rightharpoonup /g, '\\u21C0' ],\n [ /\\\\rightharpoondown /g, '\\u21C1' ],\n [ /\\\\downharpoonright /g, '\\u21C2' ],\n [ /\\\\downharpoonleft /g, '\\u21C3' ],\n [ /\\\\rightleftarrows /g, '\\u21C4' ],\n [ /\\\\dblarrowupdown /g, '\\u21C5' ],\n [ /\\\\leftrightarrows /g, '\\u21C6' ],\n [ /\\\\leftleftarrows /g, '\\u21C7' ],\n [ /\\\\upuparrows /g, '\\u21C8' ],\n [ /\\\\rightrightarrows /g, '\\u21C9' ],\n [ /\\\\downdownarrows /g, '\\u21CA' ],\n [ /\\\\leftrightharpoons /g, '\\u21CB' ],\n [ /\\\\rightleftharpoons /g, '\\u21CC' ],\n [ /\\\\nLeftarrow /g, '\\u21CD' ],\n [ /\\\\nLeftrightarrow /g, '\\u21CE' ],\n [ /\\\\nRightarrow /g, '\\u21CF' ],\n [ /\\\\Leftarrow /g, '\\u21D0' ],\n [ /\\\\Uparrow /g, '\\u21D1' ],\n [ /\\\\Rightarrow /g, '\\u21D2' ],\n [ /\\\\Downarrow /g, '\\u21D3' ],\n [ /\\\\Leftrightarrow /g, '\\u21D4' ],\n [ /\\\\Updownarrow /g, '\\u21D5' ],\n [ /\\\\Lleftarrow /g, '\\u21DA' ],\n [ /\\\\Rrightarrow /g, '\\u21DB' ],\n [ /\\\\rightsquigarrow /g, '\\u21DD' ],\n [ /\\\\DownArrowUpArrow /g, '\\u21F5' ],\n [ /\\\\forall /g, '\\u2200' ],\n [ /\\\\complement /g, '\\u2201' ],\n [ /\\\\partial /g, '\\u2202' ],\n [ /\\\\exists /g, '\\u2203' ],\n [ /\\\\nexists /g, '\\u2204' ],\n [ /\\\\varnothing /g, '\\u2205' ],\n [ /\\\\nabla /g, '\\u2207' ],\n [ /\\\\in /g, '\\u2208' ],\n [ /\\\\not\\\\in /g, '\\u2209' ],\n [ /\\\\ni /g, '\\u220B' ],\n [ /\\\\not\\\\ni /g, '\\u220C' ],\n [ /\\\\prod /g, '\\u220F' ],\n [ /\\\\coprod /g, '\\u2210' ],\n [ /\\\\sum /g, '\\u2211' ],\n [ /\\\\mp /g, '\\u2213' ],\n [ /\\\\dotplus /g, '\\u2214' ],\n [ /\\\\setminus /g, '\\u2216' ],\n [ /\\\\circ /g, '\\u2218' ],\n [ /\\\\bullet /g, '\\u2219' ],\n [ /\\\\surd /g, '\\u221A' ],\n [ /\\\\propto /g, '\\u221D' ],\n [ /\\\\infty /g, '\\u221E' ],\n [ /\\\\rightangle /g, '\\u221F' ],\n [ /\\\\angle /g, '\\u2220' ],\n [ /\\\\measuredangle /g, '\\u2221' ],\n [ /\\\\sphericalangle /g, '\\u2222' ],\n [ /\\\\mid /g, '\\u2223' ],\n [ /\\\\nmid /g, '\\u2224' ],\n [ /\\\\parallel /g, '\\u2225' ],\n [ /\\\\nparallel /g, '\\u2226' ],\n [ /\\\\wedge /g, '\\u2227' ],\n [ /\\\\vee /g, '\\u2228' ],\n [ /\\\\cap /g, '\\u2229' ],\n [ /\\\\cup /g, '\\u222A' ],\n [ /\\\\int /g, '\\u222B' ],\n [ /\\\\int\\\\!\\\\int /g, '\\u222C' ],\n [ /\\\\int\\\\!\\\\int\\\\!\\\\int /g, '\\u222D' ],\n [ /\\\\oint /g, '\\u222E' ],\n [ /\\\\surfintegral /g, '\\u222F' ],\n [ /\\\\volintegral /g, '\\u2230' ],\n [ /\\\\clwintegral /g, '\\u2231' ],\n [ /\\\\ElsevierGlyph\\{2232\\}/g, '\\u2232' ],\n [ /\\\\ElsevierGlyph\\{2233\\}/g, '\\u2233' ],\n [ /\\\\therefore /g, '\\u2234' ],\n [ /\\\\because /g, '\\u2235' ],\n [ /\\\\Colon /g, '\\u2237' ],\n [ /\\\\ElsevierGlyph\\{2238\\}/g, '\\u2238' ],\n [ /\\\\mathbin\\{\\{:\\}\\\\!\\\\!\\{\\-\\}\\\\!\\\\!\\{:\\}\\}/g, '\\u223A' ],\n [ /\\\\homothetic /g, '\\u223B' ],\n [ /\\\\sim /g, '\\u223C' ],\n [ /\\\\backsim /g, '\\u223D' ],\n [ /\\\\lazysinv /g, '\\u223E' ],\n [ /\\\\wr /g, '\\u2240' ],\n [ /\\\\not\\\\sim /g, '\\u2241' ],\n [ /\\\\ElsevierGlyph\\{2242\\}/g, '\\u2242' ],\n [ /\\\\NotEqualTilde /g, '\\u2242-00338' ],\n [ /\\\\simeq /g, '\\u2243' ],\n [ /\\\\not\\\\simeq /g, '\\u2244' ],\n [ /\\\\cong /g, '\\u2245' ],\n [ /\\\\approxnotequal /g, '\\u2246' ],\n [ /\\\\not\\\\cong /g, '\\u2247' ],\n [ /\\\\approx /g, '\\u2248' ],\n [ /\\\\not\\\\approx /g, '\\u2249' ],\n [ /\\\\approxeq /g, '\\u224A' ],\n [ /\\\\tildetrpl /g, '\\u224B' ],\n [ /\\\\not\\\\apid /g, '\\u224B-00338' ],\n [ /\\\\allequal /g, '\\u224C' ],\n [ /\\\\asymp /g, '\\u224D' ],\n [ /\\\\Bumpeq /g, '\\u224E' ],\n [ /\\\\NotHumpDownHump /g, '\\u224E-00338' ],\n [ /\\\\bumpeq /g, '\\u224F' ],\n [ /\\\\NotHumpEqual /g, '\\u224F-00338' ],\n [ /\\\\doteq /g, '\\u2250' ],\n [ /\\\\not\\\\doteq/g, '\\u2250-00338' ],\n [ /\\\\doteqdot /g, '\\u2251' ],\n [ /\\\\fallingdotseq /g, '\\u2252' ],\n [ /\\\\risingdotseq /g, '\\u2253' ],\n [ /\\\\eqcirc /g, '\\u2256' ],\n [ /\\\\circeq /g, '\\u2257' ],\n [ /\\\\estimates /g, '\\u2259' ],\n [ /\\\\ElsevierGlyph\\{225A\\}/g, '\\u225A' ],\n [ /\\\\starequal /g, '\\u225B' ],\n [ /\\\\triangleq /g, '\\u225C' ],\n [ /\\\\ElsevierGlyph\\{225F\\}/g, '\\u225F' ],\n [ /\\\\not =/g, '\\u2260' ],\n [ /\\\\equiv /g, '\\u2261' ],\n [ /\\\\not\\\\equiv /g, '\\u2262' ],\n [ /\\\\leq /g, '\\u2264' ],\n [ /\\\\geq /g, '\\u2265' ],\n [ /\\\\leqq /g, '\\u2266' ],\n [ /\\\\geqq /g, '\\u2267' ],\n [ /\\\\lneqq /g, '\\u2268' ],\n [ /\\\\lvertneqq /g, '\\u2268-0FE00' ],\n [ /\\\\gneqq /g, '\\u2269' ],\n [ /\\\\gvertneqq /g, '\\u2269-0FE00' ],\n [ /\\\\ll /g, '\\u226A' ],\n [ /\\\\NotLessLess /g, '\\u226A-00338' ],\n [ /\\\\gg /g, '\\u226B' ],\n [ /\\\\NotGreaterGreater /g, '\\u226B-00338' ],\n [ /\\\\between /g, '\\u226C' ],\n [ /\\\\not\\\\kern\\-0.3em\\\\times /g, '\\u226D' ],\n [ /\\\\not/g, '\\u226F' ],\n [ /\\\\not\\\\leq /g, '\\u2270' ],\n [ /\\\\not\\\\geq /g, '\\u2271' ],\n [ /\\\\lessequivlnt /g, '\\u2272' ],\n [ /\\\\greaterequivlnt /g, '\\u2273' ],\n [ /\\\\ElsevierGlyph\\{2274\\}/g, '\\u2274' ],\n [ /\\\\ElsevierGlyph\\{2275\\}/g, '\\u2275' ],\n [ /\\\\lessgtr /g, '\\u2276' ],\n [ /\\\\gtrless /g, '\\u2277' ],\n [ /\\\\notlessgreater /g, '\\u2278' ],\n [ /\\\\notgreaterless /g, '\\u2279' ],\n [ /\\\\prec /g, '\\u227A' ],\n [ /\\\\succ /g, '\\u227B' ],\n [ /\\\\preccurlyeq /g, '\\u227C' ],\n [ /\\\\succcurlyeq /g, '\\u227D' ],\n [ /\\\\precapprox /g, '\\u227E' ],\n [ /\\\\NotPrecedesTilde /g, '\\u227E-00338' ],\n [ /\\\\succapprox /g, '\\u227F' ],\n [ /\\\\NotSucceedsTilde /g, '\\u227F-00338' ],\n [ /\\\\not\\\\prec /g, '\\u2280' ],\n [ /\\\\not\\\\succ /g, '\\u2281' ],\n [ /\\\\subset /g, '\\u2282' ],\n [ /\\\\supset /g, '\\u2283' ],\n [ /\\\\not\\\\subset /g, '\\u2284' ],\n [ /\\\\not\\\\supset /g, '\\u2285' ],\n [ /\\\\subseteq /g, '\\u2286' ],\n [ /\\\\supseteq /g, '\\u2287' ],\n [ /\\\\not\\\\subseteq /g, '\\u2288' ],\n [ /\\\\not\\\\supseteq /g, '\\u2289' ],\n [ /\\\\subsetneq /g, '\\u228A' ],\n [ /\\\\varsubsetneqq /g, '\\u228A-0FE00' ],\n [ /\\\\supsetneq /g, '\\u228B' ],\n [ /\\\\varsupsetneq /g, '\\u228B-0FE00' ],\n [ /\\\\uplus /g, '\\u228E' ],\n [ /\\\\sqsubset /g, '\\u228F' ],\n [ /\\\\NotSquareSubset /g, '\\u228F-00338' ],\n [ /\\\\sqsupset /g, '\\u2290' ],\n [ /\\\\NotSquareSuperset /g, '\\u2290-00338' ],\n [ /\\\\sqsubseteq /g, '\\u2291' ],\n [ /\\\\sqsupseteq /g, '\\u2292' ],\n [ /\\\\sqcap /g, '\\u2293' ],\n [ /\\\\sqcup /g, '\\u2294' ],\n [ /\\\\oplus /g, '\\u2295' ],\n [ /\\\\ominus /g, '\\u2296' ],\n [ /\\\\otimes /g, '\\u2297' ],\n [ /\\\\oslash /g, '\\u2298' ],\n [ /\\\\odot /g, '\\u2299' ],\n [ /\\\\circledcirc /g, '\\u229A' ],\n [ /\\\\circledast /g, '\\u229B' ],\n [ /\\\\circleddash /g, '\\u229D' ],\n [ /\\\\boxplus /g, '\\u229E' ],\n [ /\\\\boxminus /g, '\\u229F' ],\n [ /\\\\boxtimes /g, '\\u22A0' ],\n [ /\\\\boxdot /g, '\\u22A1' ],\n [ /\\\\vdash /g, '\\u22A2' ],\n [ /\\\\dashv /g, '\\u22A3' ],\n [ /\\\\top /g, '\\u22A4' ],\n [ /\\\\perp /g, '\\u22A5' ],\n [ /\\\\truestate /g, '\\u22A7' ],\n [ /\\\\forcesextra /g, '\\u22A8' ],\n [ /\\\\Vdash /g, '\\u22A9' ],\n [ /\\\\Vvdash /g, '\\u22AA' ],\n [ /\\\\VDash /g, '\\u22AB' ],\n [ /\\\\nvdash /g, '\\u22AC' ],\n [ /\\\\nvDash /g, '\\u22AD' ],\n [ /\\\\nVdash /g, '\\u22AE' ],\n [ /\\\\nVDash /g, '\\u22AF' ],\n [ /\\\\vartriangleleft /g, '\\u22B2' ],\n [ /\\\\vartriangleright /g, '\\u22B3' ],\n [ /\\\\trianglelefteq /g, '\\u22B4' ],\n [ /\\\\trianglerighteq /g, '\\u22B5' ],\n [ /\\\\original /g, '\\u22B6' ],\n [ /\\\\image /g, '\\u22B7' ],\n [ /\\\\multimap /g, '\\u22B8' ],\n [ /\\\\hermitconjmatrix /g, '\\u22B9' ],\n [ /\\\\intercal /g, '\\u22BA' ],\n [ /\\\\veebar /g, '\\u22BB' ],\n [ /\\\\rightanglearc /g, '\\u22BE' ],\n [ /\\\\ElsevierGlyph\\{22C0\\}/g, '\\u22C0' ],\n [ /\\\\ElsevierGlyph\\{22C1\\}/g, '\\u22C1' ],\n [ /\\\\bigcap /g, '\\u22C2' ],\n [ /\\\\bigcup /g, '\\u22C3' ],\n [ /\\\\diamond /g, '\\u22C4' ],\n [ /\\\\cdot /g, '\\u22C5' ],\n [ /\\\\star /g, '\\u22C6' ],\n [ /\\\\divideontimes /g, '\\u22C7' ],\n [ /\\\\bowtie /g, '\\u22C8' ],\n [ /\\\\ltimes /g, '\\u22C9' ],\n [ /\\\\rtimes /g, '\\u22CA' ],\n [ /\\\\leftthreetimes /g, '\\u22CB' ],\n [ /\\\\rightthreetimes /g, '\\u22CC' ],\n [ /\\\\backsimeq /g, '\\u22CD' ],\n [ /\\\\curlyvee /g, '\\u22CE' ],\n [ /\\\\curlywedge /g, '\\u22CF' ],\n [ /\\\\Subset /g, '\\u22D0' ],\n [ /\\\\Supset /g, '\\u22D1' ],\n [ /\\\\Cap /g, '\\u22D2' ],\n [ /\\\\Cup /g, '\\u22D3' ],\n [ /\\\\pitchfork /g, '\\u22D4' ],\n [ /\\\\lessdot /g, '\\u22D6' ],\n [ /\\\\gtrdot /g, '\\u22D7' ],\n [ /\\\\verymuchless /g, '\\u22D8' ],\n [ /\\\\verymuchgreater /g, '\\u22D9' ],\n [ /\\\\lesseqgtr /g, '\\u22DA' ],\n [ /\\\\gtreqless /g, '\\u22DB' ],\n [ /\\\\curlyeqprec /g, '\\u22DE' ],\n [ /\\\\curlyeqsucc /g, '\\u22DF' ],\n [ /\\\\not\\\\sqsubseteq /g, '\\u22E2' ],\n [ /\\\\not\\\\sqsupseteq /g, '\\u22E3' ],\n [ /\\\\Elzsqspne /g, '\\u22E5' ],\n [ /\\\\lnsim /g, '\\u22E6' ],\n [ /\\\\gnsim /g, '\\u22E7' ],\n [ /\\\\precedesnotsimilar /g, '\\u22E8' ],\n [ /\\\\succnsim /g, '\\u22E9' ],\n [ /\\\\ntriangleleft /g, '\\u22EA' ],\n [ /\\\\ntriangleright /g, '\\u22EB' ],\n [ /\\\\ntrianglelefteq /g, '\\u22EC' ],\n [ /\\\\ntrianglerighteq /g, '\\u22ED' ],\n [ /\\\\vdots /g, '\\u22EE' ],\n [ /\\\\cdots /g, '\\u22EF' ],\n [ /\\\\upslopeellipsis /g, '\\u22F0' ],\n [ /\\\\downslopeellipsis /g, '\\u22F1' ],\n [ /\\\\barwedge /g, '\\u2305' ],\n [ /\\\\perspcorrespond /g, '\\u2306' ],\n [ /\\\\lceil /g, '\\u2308' ],\n [ /\\\\rceil /g, '\\u2309' ],\n [ /\\\\lfloor /g, '\\u230A' ],\n [ /\\\\rfloor /g, '\\u230B' ],\n [ /\\\\recorder /g, '\\u2315' ],\n [ /\\\\mathchar\"2208/g, '\\u2316' ],\n [ /\\\\ulcorner /g, '\\u231C' ],\n [ /\\\\urcorner /g, '\\u231D' ],\n [ /\\\\llcorner /g, '\\u231E' ],\n [ /\\\\lrcorner /g, '\\u231F' ],\n [ /\\\\frown /g, '\\u2322' ],\n [ /\\\\smile /g, '\\u2323' ],\n [ /\\\\langle /g, '\\u2329' ],\n [ /\\\\rangle /g, '\\u232A' ],\n [ /\\\\ElsevierGlyph\\{E838\\}/g, '\\u233D' ],\n [ /\\\\Elzdlcorn /g, '\\u23A3' ],\n [ /\\\\lmoustache /g, '\\u23B0' ],\n [ /\\\\rmoustache /g, '\\u23B1' ],\n [ /\\\\textvisiblespace /g, '\\u2423' ],\n [ /\\\\ding\\{172\\}/g, '\\u2460' ],\n [ /\\\\ding\\{173\\}/g, '\\u2461' ],\n [ /\\\\ding\\{174\\}/g, '\\u2462' ],\n [ /\\\\ding\\{175\\}/g, '\\u2463' ],\n [ /\\\\ding\\{176\\}/g, '\\u2464' ],\n [ /\\\\ding\\{177\\}/g, '\\u2465' ],\n [ /\\\\ding\\{178\\}/g, '\\u2466' ],\n [ /\\\\ding\\{179\\}/g, '\\u2467' ],\n [ /\\\\ding\\{180\\}/g, '\\u2468' ],\n [ /\\\\ding\\{181\\}/g, '\\u2469' ],\n [ /\\\\circledS /g, '\\u24C8' ],\n [ /\\\\Elzdshfnc /g, '\\u2506' ],\n [ /\\\\Elzsqfnw /g, '\\u2519' ],\n [ /\\\\diagup /g, '\\u2571' ],\n [ /\\\\ding\\{110\\}/g, '\\u25A0' ],\n [ /\\\\square /g, '\\u25A1' ],\n [ /\\\\blacksquare /g, '\\u25AA' ],\n [ /\\\\fbox\\{~~\\}/g, '\\u25AD' ],\n [ /\\\\Elzvrecto /g, '\\u25AF' ],\n [ /\\\\ElsevierGlyph\\{E381\\}/g, '\\u25B1' ],\n [ /\\\\ding\\{115\\}/g, '\\u25B2' ],\n [ /\\\\bigtriangleup /g, '\\u25B3' ],\n [ /\\\\blacktriangle /g, '\\u25B4' ],\n [ /\\\\vartriangle /g, '\\u25B5' ],\n [ /\\\\blacktriangleright /g, '\\u25B8' ],\n [ /\\\\triangleright /g, '\\u25B9' ],\n [ /\\\\ding\\{116\\}/g, '\\u25BC' ],\n [ /\\\\bigtriangledown /g, '\\u25BD' ],\n [ /\\\\blacktriangledown /g, '\\u25BE' ],\n [ /\\\\triangledown /g, '\\u25BF' ],\n [ /\\\\blacktriangleleft /g, '\\u25C2' ],\n [ /\\\\triangleleft /g, '\\u25C3' ],\n [ /\\\\ding\\{117\\}/g, '\\u25C6' ],\n [ /\\\\lozenge /g, '\\u25CA' ],\n [ /\\\\bigcirc /g, '\\u25CB' ],\n [ /\\\\ding\\{108\\}/g, '\\u25CF' ],\n [ /\\\\Elzcirfl /g, '\\u25D0' ],\n [ /\\\\Elzcirfr /g, '\\u25D1' ],\n [ /\\\\Elzcirfb /g, '\\u25D2' ],\n [ /\\\\ding\\{119\\}/g, '\\u25D7' ],\n [ /\\\\Elzrvbull /g, '\\u25D8' ],\n [ /\\\\Elzsqfl /g, '\\u25E7' ],\n [ /\\\\Elzsqfr /g, '\\u25E8' ],\n [ /\\\\Elzsqfse /g, '\\u25EA' ],\n [ /\\\\bigcirc /g, '\\u25EF' ],\n [ /\\\\ding\\{72\\}/g, '\\u2605' ],\n [ /\\\\ding\\{73\\}/g, '\\u2606' ],\n [ /\\\\ding\\{37\\}/g, '\\u260E' ],\n [ /\\\\ding\\{42\\}/g, '\\u261B' ],\n [ /\\\\ding\\{43\\}/g, '\\u261E' ],\n [ /\\\\rightmoon /g, '\\u263E' ],\n [ /\\\\mercury /g, '\\u263F' ],\n [ /\\\\venus /g, '\\u2640' ],\n [ /\\\\male /g, '\\u2642' ],\n [ /\\\\jupiter /g, '\\u2643' ],\n [ /\\\\saturn /g, '\\u2644' ],\n [ /\\\\uranus /g, '\\u2645' ],\n [ /\\\\neptune /g, '\\u2646' ],\n [ /\\\\pluto /g, '\\u2647' ],\n [ /\\\\aries /g, '\\u2648' ],\n [ /\\\\taurus /g, '\\u2649' ],\n [ /\\\\gemini /g, '\\u264A' ],\n [ /\\\\cancer /g, '\\u264B' ],\n [ /\\\\leo /g, '\\u264C' ],\n [ /\\\\virgo /g, '\\u264D' ],\n [ /\\\\libra /g, '\\u264E' ],\n [ /\\\\scorpio /g, '\\u264F' ],\n [ /\\\\sagittarius /g, '\\u2650' ],\n [ /\\\\capricornus /g, '\\u2651' ],\n [ /\\\\aquarius /g, '\\u2652' ],\n [ /\\\\pisces /g, '\\u2653' ],\n [ /\\\\ding\\{171\\}/g, '\\u2660' ],\n [ /\\\\diamond /g, '\\u2662' ],\n [ /\\\\ding\\{168\\}/g, '\\u2663' ],\n [ /\\\\ding\\{170\\}/g, '\\u2665' ],\n [ /\\\\ding\\{169\\}/g, '\\u2666' ],\n [ /\\\\quarternote /g, '\\u2669' ],\n [ /\\\\eighthnote /g, '\\u266A' ],\n [ /\\\\flat /g, '\\u266D' ],\n [ /\\\\natural /g, '\\u266E' ],\n [ /\\\\sharp /g, '\\u266F' ],\n [ /\\\\ding\\{33\\}/g, '\\u2701' ],\n [ /\\\\ding\\{34\\}/g, '\\u2702' ],\n [ /\\\\ding\\{35\\}/g, '\\u2703' ],\n [ /\\\\ding\\{36\\}/g, '\\u2704' ],\n [ /\\\\ding\\{38\\}/g, '\\u2706' ],\n [ /\\\\ding\\{39\\}/g, '\\u2707' ],\n [ /\\\\ding\\{40\\}/g, '\\u2708' ],\n [ /\\\\ding\\{41\\}/g, '\\u2709' ],\n [ /\\\\ding\\{44\\}/g, '\\u270C' ],\n [ /\\\\ding\\{45\\}/g, '\\u270D' ],\n [ /\\\\ding\\{46\\}/g, '\\u270E' ],\n [ /\\\\ding\\{47\\}/g, '\\u270F' ],\n [ /\\\\ding\\{48\\}/g, '\\u2710' ],\n [ /\\\\ding\\{49\\}/g, '\\u2711' ],\n [ /\\\\ding\\{50\\}/g, '\\u2712' ],\n [ /\\\\ding\\{51\\}/g, '\\u2713' ],\n [ /\\\\ding\\{52\\}/g, '\\u2714' ],\n [ /\\\\ding\\{53\\}/g, '\\u2715' ],\n [ /\\\\ding\\{54\\}/g, '\\u2716' ],\n [ /\\\\ding\\{55\\}/g, '\\u2717' ],\n [ /\\\\ding\\{56\\}/g, '\\u2718' ],\n [ /\\\\ding\\{57\\}/g, '\\u2719' ],\n [ /\\\\ding\\{58\\}/g, '\\u271A' ],\n [ /\\\\ding\\{59\\}/g, '\\u271B' ],\n [ /\\\\ding\\{60\\}/g, '\\u271C' ],\n [ /\\\\ding\\{61\\}/g, '\\u271D' ],\n [ /\\\\ding\\{62\\}/g, '\\u271E' ],\n [ /\\\\ding\\{63\\}/g, '\\u271F' ],\n [ /\\\\ding\\{64\\}/g, '\\u2720' ],\n [ /\\\\ding\\{65\\}/g, '\\u2721' ],\n [ /\\\\ding\\{66\\}/g, '\\u2722' ],\n [ /\\\\ding\\{67\\}/g, '\\u2723' ],\n [ /\\\\ding\\{68\\}/g, '\\u2724' ],\n [ /\\\\ding\\{69\\}/g, '\\u2725' ],\n [ /\\\\ding\\{70\\}/g, '\\u2726' ],\n [ /\\\\ding\\{71\\}/g, '\\u2727' ],\n [ /\\\\ding\\{73\\}/g, '\\u2729' ],\n [ /\\\\ding\\{74\\}/g, '\\u272A' ],\n [ /\\\\ding\\{75\\}/g, '\\u272B' ],\n [ /\\\\ding\\{76\\}/g, '\\u272C' ],\n [ /\\\\ding\\{77\\}/g, '\\u272D' ],\n [ /\\\\ding\\{78\\}/g, '\\u272E' ],\n [ /\\\\ding\\{79\\}/g, '\\u272F' ],\n [ /\\\\ding\\{80\\}/g, '\\u2730' ],\n [ /\\\\ding\\{81\\}/g, '\\u2731' ],\n [ /\\\\ding\\{82\\}/g, '\\u2732' ],\n [ /\\\\ding\\{83\\}/g, '\\u2733' ],\n [ /\\\\ding\\{84\\}/g, '\\u2734' ],\n [ /\\\\ding\\{85\\}/g, '\\u2735' ],\n [ /\\\\ding\\{86\\}/g, '\\u2736' ],\n [ /\\\\ding\\{87\\}/g, '\\u2737' ],\n [ /\\\\ding\\{88\\}/g, '\\u2738' ],\n [ /\\\\ding\\{89\\}/g, '\\u2739' ],\n [ /\\\\ding\\{90\\}/g, '\\u273A' ],\n [ /\\\\ding\\{91\\}/g, '\\u273B' ],\n [ /\\\\ding\\{92\\}/g, '\\u273C' ],\n [ /\\\\ding\\{93\\}/g, '\\u273D' ],\n [ /\\\\ding\\{94\\}/g, '\\u273E' ],\n [ /\\\\ding\\{95\\}/g, '\\u273F' ],\n [ /\\\\ding\\{96\\}/g, '\\u2740' ],\n [ /\\\\ding\\{97\\}/g, '\\u2741' ],\n [ /\\\\ding\\{98\\}/g, '\\u2742' ],\n [ /\\\\ding\\{99\\}/g, '\\u2743' ],\n [ /\\\\ding\\{100\\}/g, '\\u2744' ],\n [ /\\\\ding\\{101\\}/g, '\\u2745' ],\n [ /\\\\ding\\{102\\}/g, '\\u2746' ],\n [ /\\\\ding\\{103\\}/g, '\\u2747' ],\n [ /\\\\ding\\{104\\}/g, '\\u2748' ],\n [ /\\\\ding\\{105\\}/g, '\\u2749' ],\n [ /\\\\ding\\{106\\}/g, '\\u274A' ],\n [ /\\\\ding\\{107\\}/g, '\\u274B' ],\n [ /\\\\ding\\{109\\}/g, '\\u274D' ],\n [ /\\\\ding\\{111\\}/g, '\\u274F' ],\n [ /\\\\ding\\{112\\}/g, '\\u2750' ],\n [ /\\\\ding\\{113\\}/g, '\\u2751' ],\n [ /\\\\ding\\{114\\}/g, '\\u2752' ],\n [ /\\\\ding\\{118\\}/g, '\\u2756' ],\n [ /\\\\ding\\{120\\}/g, '\\u2758' ],\n [ /\\\\ding\\{121\\}/g, '\\u2759' ],\n [ /\\\\ding\\{122\\}/g, '\\u275A' ],\n [ /\\\\ding\\{123\\}/g, '\\u275B' ],\n [ /\\\\ding\\{124\\}/g, '\\u275C' ],\n [ /\\\\ding\\{125\\}/g, '\\u275D' ],\n [ /\\\\ding\\{126\\}/g, '\\u275E' ],\n [ /\\\\ding\\{161\\}/g, '\\u2761' ],\n [ /\\\\ding\\{162\\}/g, '\\u2762' ],\n [ /\\\\ding\\{163\\}/g, '\\u2763' ],\n [ /\\\\ding\\{164\\}/g, '\\u2764' ],\n [ /\\\\ding\\{165\\}/g, '\\u2765' ],\n [ /\\\\ding\\{166\\}/g, '\\u2766' ],\n [ /\\\\ding\\{167\\}/g, '\\u2767' ],\n [ /\\\\ding\\{182\\}/g, '\\u2776' ],\n [ /\\\\ding\\{183\\}/g, '\\u2777' ],\n [ /\\\\ding\\{184\\}/g, '\\u2778' ],\n [ /\\\\ding\\{185\\}/g, '\\u2779' ],\n [ /\\\\ding\\{186\\}/g, '\\u277A' ],\n [ /\\\\ding\\{187\\}/g, '\\u277B' ],\n [ /\\\\ding\\{188\\}/g, '\\u277C' ],\n [ /\\\\ding\\{189\\}/g, '\\u277D' ],\n [ /\\\\ding\\{190\\}/g, '\\u277E' ],\n [ /\\\\ding\\{191\\}/g, '\\u277F' ],\n [ /\\\\ding\\{192\\}/g, '\\u2780' ],\n [ /\\\\ding\\{193\\}/g, '\\u2781' ],\n [ /\\\\ding\\{194\\}/g, '\\u2782' ],\n [ /\\\\ding\\{195\\}/g, '\\u2783' ],\n [ /\\\\ding\\{196\\}/g, '\\u2784' ],\n [ /\\\\ding\\{197\\}/g, '\\u2785' ],\n [ /\\\\ding\\{198\\}/g, '\\u2786' ],\n [ /\\\\ding\\{199\\}/g, '\\u2787' ],\n [ /\\\\ding\\{200\\}/g, '\\u2788' ],\n [ /\\\\ding\\{201\\}/g, '\\u2789' ],\n [ /\\\\ding\\{202\\}/g, '\\u278A' ],\n [ /\\\\ding\\{203\\}/g, '\\u278B' ],\n [ /\\\\ding\\{204\\}/g, '\\u278C' ],\n [ /\\\\ding\\{205\\}/g, '\\u278D' ],\n [ /\\\\ding\\{206\\}/g, '\\u278E' ],\n [ /\\\\ding\\{207\\}/g, '\\u278F' ],\n [ /\\\\ding\\{208\\}/g, '\\u2790' ],\n [ /\\\\ding\\{209\\}/g, '\\u2791' ],\n [ /\\\\ding\\{210\\}/g, '\\u2792' ],\n [ /\\\\ding\\{211\\}/g, '\\u2793' ],\n [ /\\\\ding\\{212\\}/g, '\\u2794' ],\n [ /\\\\ding\\{216\\}/g, '\\u2798' ],\n [ /\\\\ding\\{217\\}/g, '\\u2799' ],\n [ /\\\\ding\\{218\\}/g, '\\u279A' ],\n [ /\\\\ding\\{219\\}/g, '\\u279B' ],\n [ /\\\\ding\\{220\\}/g, '\\u279C' ],\n [ /\\\\ding\\{221\\}/g, '\\u279D' ],\n [ /\\\\ding\\{222\\}/g, '\\u279E' ],\n [ /\\\\ding\\{223\\}/g, '\\u279F' ],\n [ /\\\\ding\\{224\\}/g, '\\u27A0' ],\n [ /\\\\ding\\{225\\}/g, '\\u27A1' ],\n [ /\\\\ding\\{226\\}/g, '\\u27A2' ],\n [ /\\\\ding\\{227\\}/g, '\\u27A3' ],\n [ /\\\\ding\\{228\\}/g, '\\u27A4' ],\n [ /\\\\ding\\{229\\}/g, '\\u27A5' ],\n [ /\\\\ding\\{230\\}/g, '\\u27A6' ],\n [ /\\\\ding\\{231\\}/g, '\\u27A7' ],\n [ /\\\\ding\\{232\\}/g, '\\u27A8' ],\n [ /\\\\ding\\{233\\}/g, '\\u27A9' ],\n [ /\\\\ding\\{234\\}/g, '\\u27AA' ],\n [ /\\\\ding\\{235\\}/g, '\\u27AB' ],\n [ /\\\\ding\\{236\\}/g, '\\u27AC' ],\n [ /\\\\ding\\{237\\}/g, '\\u27AD' ],\n [ /\\\\ding\\{238\\}/g, '\\u27AE' ],\n [ /\\\\ding\\{239\\}/g, '\\u27AF' ],\n [ /\\\\ding\\{241\\}/g, '\\u27B1' ],\n [ /\\\\ding\\{242\\}/g, '\\u27B2' ],\n [ /\\\\ding\\{243\\}/g, '\\u27B3' ],\n [ /\\\\ding\\{244\\}/g, '\\u27B4' ],\n [ /\\\\ding\\{245\\}/g, '\\u27B5' ],\n [ /\\\\ding\\{246\\}/g, '\\u27B6' ],\n [ /\\\\ding\\{247\\}/g, '\\u27B7' ],\n [ /\\\\ding\\{248\\}/g, '\\u27B8' ],\n [ /\\\\ding\\{249\\}/g, '\\u27B9' ],\n [ /\\\\ding\\{250\\}/g, '\\u27BA' ],\n [ /\\\\ding\\{251\\}/g, '\\u27BB' ],\n [ /\\\\ding\\{252\\}/g, '\\u27BC' ],\n [ /\\\\ding\\{253\\}/g, '\\u27BD' ],\n [ /\\\\ding\\{254\\}/g, '\\u27BE' ],\n [ /\\\\longleftarrow /g, '\\u27F5' ],\n [ /\\\\longrightarrow /g, '\\u27F6' ],\n [ /\\\\longleftrightarrow /g, '\\u27F7' ],\n [ /\\\\Longleftarrow /g, '\\u27F8' ],\n [ /\\\\Longrightarrow /g, '\\u27F9' ],\n [ /\\\\Longleftrightarrow /g, '\\u27FA' ],\n [ /\\\\longmapsto /g, '\\u27FC' ],\n [ /\\\\sim\\\\joinrel\\\\leadsto/g, '\\u27FF' ],\n [ /\\\\ElsevierGlyph\\{E212\\}/g, '\\u2905' ],\n [ /\\\\UpArrowBar /g, '\\u2912' ],\n [ /\\\\DownArrowBar /g, '\\u2913' ],\n [ /\\\\ElsevierGlyph\\{E20C\\}/g, '\\u2923' ],\n [ /\\\\ElsevierGlyph\\{E20D\\}/g, '\\u2924' ],\n [ /\\\\ElsevierGlyph\\{E20B\\}/g, '\\u2925' ],\n [ /\\\\ElsevierGlyph\\{E20A\\}/g, '\\u2926' ],\n [ /\\\\ElsevierGlyph\\{E211\\}/g, '\\u2927' ],\n [ /\\\\ElsevierGlyph\\{E20E\\}/g, '\\u2928' ],\n [ /\\\\ElsevierGlyph\\{E20F\\}/g, '\\u2929' ],\n [ /\\\\ElsevierGlyph\\{E210\\}/g, '\\u292A' ],\n [ /\\\\ElsevierGlyph\\{E21C\\}/g, '\\u2933' ],\n [ /\\\\ElsevierGlyph\\{E21D\\}/g, '\\u2933-00338' ],\n [ /\\\\ElsevierGlyph\\{E21A\\}/g, '\\u2936' ],\n [ /\\\\ElsevierGlyph\\{E219\\}/g, '\\u2937' ],\n [ /\\\\Elolarr /g, '\\u2940' ],\n [ /\\\\Elorarr /g, '\\u2941' ],\n [ /\\\\ElzRlarr /g, '\\u2942' ],\n [ /\\\\ElzrLarr /g, '\\u2944' ],\n [ /\\\\Elzrarrx /g, '\\u2947' ],\n [ /\\\\LeftRightVector /g, '\\u294E' ],\n [ /\\\\RightUpDownVector /g, '\\u294F' ],\n [ /\\\\DownLeftRightVector /g, '\\u2950' ],\n [ /\\\\LeftUpDownVector /g, '\\u2951' ],\n [ /\\\\LeftVectorBar /g, '\\u2952' ],\n [ /\\\\RightVectorBar /g, '\\u2953' ],\n [ /\\\\RightUpVectorBar /g, '\\u2954' ],\n [ /\\\\RightDownVectorBar /g, '\\u2955' ],\n [ /\\\\DownLeftVectorBar /g, '\\u2956' ],\n [ /\\\\DownRightVectorBar /g, '\\u2957' ],\n [ /\\\\LeftUpVectorBar /g, '\\u2958' ],\n [ /\\\\LeftDownVectorBar /g, '\\u2959' ],\n [ /\\\\LeftTeeVector /g, '\\u295A' ],\n [ /\\\\RightTeeVector /g, '\\u295B' ],\n [ /\\\\RightUpTeeVector /g, '\\u295C' ],\n [ /\\\\RightDownTeeVector /g, '\\u295D' ],\n [ /\\\\DownLeftTeeVector /g, '\\u295E' ],\n [ /\\\\DownRightTeeVector /g, '\\u295F' ],\n [ /\\\\LeftUpTeeVector /g, '\\u2960' ],\n [ /\\\\LeftDownTeeVector /g, '\\u2961' ],\n [ /\\\\UpEquilibrium /g, '\\u296E' ],\n [ /\\\\ReverseUpEquilibrium /g, '\\u296F' ],\n [ /\\\\RoundImplies /g, '\\u2970' ],\n [ /\\\\ElsevierGlyph\\{E214\\}/g, '\\u297C' ],\n [ /\\\\ElsevierGlyph\\{E215\\}/g, '\\u297D' ],\n [ /\\\\Elztfnc /g, '\\u2980' ],\n [ /\\\\ElsevierGlyph\\{3018\\}/g, '\\u2985' ],\n [ /\\\\Elroang /g, '\\u2986' ],\n [ /\\\\ElsevierGlyph\\{E291\\}/g, '\\u2994' ],\n [ /\\\\Elzddfnc /g, '\\u2999' ],\n [ /\\\\Angle /g, '\\u299C' ],\n [ /\\\\Elzlpargt /g, '\\u29A0' ],\n [ /\\\\ElsevierGlyph\\{E260\\}/g, '\\u29B5' ],\n [ /\\\\ElsevierGlyph\\{E61B\\}/g, '\\u29B6' ],\n [ /\\\\ElzLap /g, '\\u29CA' ],\n [ /\\\\Elzdefas /g, '\\u29CB' ],\n [ /\\\\LeftTriangleBar /g, '\\u29CF' ],\n [ /\\\\NotLeftTriangleBar /g, '\\u29CF-00338' ],\n [ /\\\\RightTriangleBar /g, '\\u29D0' ],\n [ /\\\\NotRightTriangleBar /g, '\\u29D0-00338' ],\n [ /\\\\ElsevierGlyph\\{E372\\}/g, '\\u29DC' ],\n [ /\\\\blacklozenge /g, '\\u29EB' ],\n [ /\\\\RuleDelayed /g, '\\u29F4' ],\n [ /\\\\Elxuplus /g, '\\u2A04' ],\n [ /\\\\ElzThr /g, '\\u2A05' ],\n [ /\\\\Elxsqcup /g, '\\u2A06' ],\n [ /\\\\ElzInf /g, '\\u2A07' ],\n [ /\\\\ElzSup /g, '\\u2A08' ],\n [ /\\\\ElzCint /g, '\\u2A0D' ],\n [ /\\\\clockoint /g, '\\u2A0F' ],\n [ /\\\\ElsevierGlyph\\{E395\\}/g, '\\u2A10' ],\n [ /\\\\sqrint /g, '\\u2A16' ],\n [ /\\\\ElsevierGlyph\\{E25A\\}/g, '\\u2A25' ],\n [ /\\\\ElsevierGlyph\\{E25B\\}/g, '\\u2A2A' ],\n [ /\\\\ElsevierGlyph\\{E25C\\}/g, '\\u2A2D' ],\n [ /\\\\ElsevierGlyph\\{E25D\\}/g, '\\u2A2E' ],\n [ /\\\\ElzTimes /g, '\\u2A2F' ],\n [ /\\\\ElsevierGlyph\\{E25E\\}/g, '\\u2A34' ],\n [ /\\\\ElsevierGlyph\\{E25E\\}/g, '\\u2A35' ],\n [ /\\\\ElsevierGlyph\\{E259\\}/g, '\\u2A3C' ],\n [ /\\\\amalg /g, '\\u2A3F' ],\n [ /\\\\ElzAnd /g, '\\u2A53' ],\n [ /\\\\ElzOr /g, '\\u2A54' ],\n [ /\\\\ElsevierGlyph\\{E36E\\}/g, '\\u2A55' ],\n [ /\\\\ElOr /g, '\\u2A56' ],\n [ /\\\\perspcorrespond /g, '\\u2A5E' ],\n [ /\\\\Elzminhat /g, '\\u2A5F' ],\n [ /\\\\ElsevierGlyph\\{225A\\}/g, '\\u2A63' ],\n [ /\\\\stackrel\\{*\\}\\{=\\}/g, '\\u2A6E' ],\n [ /\\\\Equal /g, '\\u2A75' ],\n [ /\\\\leqslant /g, '\\u2A7D' ],\n [ /\\\\nleqslant /g, '\\u2A7D-00338' ],\n [ /\\\\geqslant /g, '\\u2A7E' ],\n [ /\\\\ngeqslant /g, '\\u2A7E-00338' ],\n [ /\\\\lessapprox /g, '\\u2A85' ],\n [ /\\\\gtrapprox /g, '\\u2A86' ],\n [ /\\\\lneq /g, '\\u2A87' ],\n [ /\\\\gneq /g, '\\u2A88' ],\n [ /\\\\lnapprox /g, '\\u2A89' ],\n [ /\\\\gnapprox /g, '\\u2A8A' ],\n [ /\\\\lesseqqgtr /g, '\\u2A8B' ],\n [ /\\\\gtreqqless /g, '\\u2A8C' ],\n [ /\\\\eqslantless /g, '\\u2A95' ],\n [ /\\\\eqslantgtr /g, '\\u2A96' ],\n [ /\\\\Pisymbol\\{ppi020\\}\\{117\\}/g, '\\u2A9D' ],\n [ /\\\\Pisymbol\\{ppi020\\}\\{105\\}/g, '\\u2A9E' ],\n [ /\\\\NestedLessLess /g, '\\u2AA1' ],\n [ /\\\\NotNestedLessLess /g, '\\u2AA1-00338' ],\n [ /\\\\NestedGreaterGreater /g, '\\u2AA2' ],\n [ /\\\\NotNestedGreaterGreater /g, '\\u2AA2-00338' ],\n [ /\\\\preceq /g, '\\u2AAF' ],\n [ /\\\\not\\\\preceq /g, '\\u2AAF-00338' ],\n [ /\\\\succeq /g, '\\u2AB0' ],\n [ /\\\\not\\\\succeq /g, '\\u2AB0-00338' ],\n [ /\\\\precneqq /g, '\\u2AB5' ],\n [ /\\\\succneqq /g, '\\u2AB6' ],\n [ /\\\\precapprox /g, '\\u2AB7' ],\n [ /\\\\succapprox /g, '\\u2AB8' ],\n [ /\\\\precnapprox /g, '\\u2AB9' ],\n [ /\\\\succnapprox /g, '\\u2ABA' ],\n [ /\\\\subseteqq /g, '\\u2AC5' ],\n [ /\\\\nsubseteqq /g, '\\u2AC5-00338' ],\n [ /\\\\supseteqq /g, '\\u2AC6' ],\n [ /\\\\nsupseteqq/g, '\\u2AC6-00338' ],\n [ /\\\\subsetneqq /g, '\\u2ACB' ],\n [ /\\\\supsetneqq /g, '\\u2ACC' ],\n [ /\\\\ElsevierGlyph\\{E30D\\}/g, '\\u2AEB' ],\n [ /\\\\Elztdcol /g, '\\u2AF6' ],\n [ /\\\\ElsevierGlyph\\{300A\\}/g, '\\u300A' ],\n [ /\\\\ElsevierGlyph\\{300B\\}/g, '\\u300B' ],\n [ /\\\\ElsevierGlyph\\{3018\\}/g, '\\u3018' ],\n [ /\\\\ElsevierGlyph\\{3019\\}/g, '\\u3019' ],\n [ /\\\\openbracketleft /g, '\\u301A' ],\n [ /\\\\openbracketright /g, '\\u301B' ]\n ]\n\n return this;\n} // end function BibtexParser\n\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = BibtexParser;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/libs/bibtex.js\n ** module id = 32\n ** module chunks = 0 3\n **/","define([\n \"mvc/base-mvc\",\n \"mvc/citation/citation-model\",\n \"utils/localization\"\n], function( baseMVC, citationModel, _l ){\n\nvar CitationView = Backbone.View.extend({\n tagName: 'div',\n className: 'citations',\n render: function() {\n this.$el.append( \"

            \" + this.formattedReference() + \"

            \" );\n return this;\n },\n formattedReference: function() {\n var model = this.model;\n var entryType = model.entryType();\n var fields = model.fields();\n\n var ref = \"\";\n // Code inspired by...\n // https://github.com/vkaravir/bib-publication-list/blob/master/src/bib-publication-list.js\n var authorsAndYear = this._asSentence( (fields.author ? fields.author : \"\") + (fields.year ? (\" (\" + fields.year + \")\") : \"\") ) + \" \";\n var title = fields.title || \"\";\n var pages = fields.pages ? (\"pp. \" + fields.pages) : \"\";\n var address = fields.address;\n if( entryType == \"article\" ) {\n var volume = (fields.volume ? fields.volume : \"\") +\n (fields.number ? ( \" (\" + fields.number + \")\" ) : \"\") +\n (pages ? \", \" + pages : \"\");\n ref = authorsAndYear + this._asSentence(title) +\n (fields.journal ? (\"In \" + fields.journal + \", \") : \"\") +\n this._asSentence(volume) + \n this._asSentence(fields.address) +\n \"<\\/em>\";\n } else if( entryType == \"inproceedings\" || entryType == \"proceedings\" ) {\n ref = authorsAndYear + \n this._asSentence(title) + \n (fields.booktitle ? (\"In \" + fields.booktitle + \", \") : \"\") +\n (pages ? pages : \"\") +\n (address ? \", \" + address : \"\") + \n \".<\\/em>\";\n } else if( entryType == \"mastersthesis\" || entryType == \"phdthesis\" ) {\n ref = authorsAndYear + this._asSentence(title) +\n (fields.howpublished ? fields.howpublished + \". \" : \"\") +\n (fields.note ? fields.note + \".\" : \"\");\n } else if( entryType == \"techreport\" ) {\n ref = authorsAndYear + this._asSentence(title) +\n this._asSentence(fields.institution) +\n this._asSentence(fields.number) +\n this._asSentence(fields.type);\n } else if( entryType == \"book\" || entryType == \"inbook\" || entryType == \"incollection\" ) {\n ref = authorsAndYear + \" \" + this._formatBookInfo(fields);\n } else {\n ref = authorsAndYear + \" \" + this._asSentence(title) +\n this._asSentence(fields.howpublished) +\n this._asSentence(fields.note);\n }\n var doiUrl = \"\";\n if( fields.doi ) {\n doiUrl = 'http://dx.doi.org/' + fields.doi;\n ref += '[doi:' + fields.doi + \"]\";\n }\n var url = fields.url || doiUrl;\n if( url ) {\n ref += '[Link]';\n }\n return ref;\n },\n _formatBookInfo: function(fields) {\n var info = \"\";\n if( fields.chapter ) {\n info += fields.chapter + \" in \";\n }\n if( fields.title ) {\n info += \"\" + fields.title + \"<\\/em>\";\n }\n if( fields.editor ) {\n info += \", Edited by \" + fields.editor + \", \";\n }\n if( fields.publisher) {\n info += \", \" + fields.publisher;\n }\n if( fields.pages ) {\n info += \", pp. \" + fields.pages + \"\";\n }\n if( fields.series ) {\n info += \", \" + fields.series + \"<\\/em>\";\n }\n if( fields.volume ) {\n info += \", Vol.\" + fields.volume;\n }\n if( fields.issn ) {\n info += \", ISBN: \" + fields.issn;\n }\n return info + \".\";\n },\n _asSentence: function(str) {\n return (str && str.trim()) ? str + \". \" : \"\";\n }\n});\n\nvar CitationListView = Backbone.View.extend({\n el: '#citations',\n /**\n * Set up view.\n */\n initialize: function() {\n this.listenTo( this.collection, 'add', this.renderCitation );\n },\n\n events: {\n 'click .citations-to-bibtex': 'showBibtex',\n 'click .citations-to-formatted': 'showFormatted'\n },\n\n renderCitation: function( citation ) {\n var citationView = new CitationView( { model: citation } );\n this.$(\".citations-formatted\").append( citationView.render().el );\n var rawTextarea = this.$(\".citations-bibtex-text\");\n rawTextarea.val( rawTextarea.val() + \"\\n\\r\" + citation.attributes.content );\n },\n\n render: function() {\n this.$el.html(this.citationsElement());\n this.collection.each(function( item ){\n this.renderCitation( item );\n }, this);\n this.showFormatted();\n },\n\n showBibtex: function() {\n this.$(\".citations-to-formatted\").show();\n this.$(\".citations-to-bibtex\").hide();\n this.$(\".citations-bibtex\").show();\n this.$(\".citations-formatted\").hide();\n this.$(\".citations-bibtex-text\").select();\n },\n\n showFormatted: function() {\n this.$(\".citations-to-formatted\").hide();\n this.$(\".citations-to-bibtex\").show();\n this.$(\".citations-bibtex\").hide();\n this.$(\".citations-formatted\").show();\n },\n\n partialWarningElement: function() {\n if( this.collection.partial ) {\n return [\n '
            ',\n 'Warning: This is a experimental feature. Most Galaxy tools will not annotate',\n ' citations explicitly at this time. When writing up your analysis, please manually',\n ' review your histories and find all references',\n ' that should be cited in order to completely describe your work. Also, please remember to',\n ' cite Galaxy.',\n '
            ',\n ].join('');\n } else {\n return '';\n }\n },\n\n citationsElement: function() {\n return [\n '
            ',\n '
            ',\n _l(\"Citations\"),\n ' ',\n ' ',\n '
            ',\n '
            ',\n this.partialWarningElement(),\n '',\n '
            ',\n '
            ',\n '',\n '
            ',\n '
            '\n ].join( '' );\n }\n});\n\n//==============================================================================\nreturn {\n CitationView : CitationView,\n CitationListView : CitationListView\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/citation/citation-view.js\n ** module id = 33\n ** module chunks = 0 3\n **/","define([\n \"mvc/list/list-item\",\n \"mvc/dataset/dataset-li\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( LIST_ITEM, DATASET_LI, BASE_MVC, _l ){\n/* global Backbone */\n//==============================================================================\nvar FoldoutListItemView = LIST_ITEM.FoldoutListItemView,\n ListItemView = LIST_ITEM.ListItemView;\n/** @class Read only view for DatasetCollection.\n */\nvar DCListItemView = FoldoutListItemView.extend(\n/** @lends DCListItemView.prototype */{\n//TODO: may not be needed\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : FoldoutListItemView.prototype.className + \" dataset-collection\",\n id : function(){\n return [ 'dataset_collection', this.model.get( 'id' ) ].join( '-' );\n },\n\n /** override to add linkTarget */\n initialize : function( attributes ){\n this.linkTarget = attributes.linkTarget || '_blank';\n this.hasUser = attributes.hasUser;\n FoldoutListItemView.prototype.initialize.call( this, attributes );\n },\n\n /** event listeners */\n _setUpListeners : function(){\n FoldoutListItemView.prototype._setUpListeners.call( this );\n // re-rendering on deletion\n this.model.on( 'change', function( model, options ){\n if( _.isEqual( _.keys( model.changed ), [ 'deleted' ] ) ){\n this.render();\n }\n }, this );\n },\n\n // ......................................................................... rendering\n //TODO:?? possibly move to listItem\n /** render a subtitle to show the user what sort of collection this is */\n _renderSubtitle : function(){\n var $subtitle = $( '
            ' );\n //TODO: would be good to get this in the subtitle\n //var len = this.model.elements.length;\n switch( this.model.get( 'collection_type' ) ){\n case 'list':\n return $subtitle.text( _l( 'a list of datasets' ) );\n case 'paired':\n return $subtitle.text( _l( 'a pair of datasets' ) );\n case 'list:paired':\n return $subtitle.text( _l( 'a list of paired datasets' ) );\n }\n return $subtitle;\n },\n\n // ......................................................................... foldout\n /** override to add linktarget to sub-panel */\n _getFoldoutPanelOptions : function(){\n var options = FoldoutListItemView.prototype._getFoldoutPanelOptions.call( this );\n return _.extend( options, {\n linkTarget : this.linkTarget,\n hasUser : this.hasUser\n });\n },\n\n /** override to not catch sub-panel selectors */\n $selector : function(){\n return this.$( '> .selector' );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DCListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDCListItemView.prototype.templates = (function(){\n\n var warnings = _.extend( {}, FoldoutListItemView.prototype.templates.warnings, {\n error : BASE_MVC.wrapTemplate([\n // error during index fetch - show error on dataset\n '<% if( model.error ){ %>',\n '
            ',\n _l( 'There was an error getting the data for this collection' ), ': <%- model.error %>',\n '
            ',\n '<% } %>'\n ]),\n purged : BASE_MVC.wrapTemplate([\n '<% if( model.purged ){ %>',\n '
            ',\n _l( 'This collection has been deleted and removed from disk' ),\n '
            ',\n '<% } %>'\n ]),\n deleted : BASE_MVC.wrapTemplate([\n // deleted not purged\n '<% if( model.deleted && !model.purged ){ %>',\n '
            ',\n _l( 'This collection has been deleted' ),\n '
            ',\n '<% } %>'\n ])\n });\n\n // use element identifier\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n '
            ',\n '<%- collection.element_identifier || collection.name %>',\n '
            ',\n '
            ',\n '
            '\n ], 'collection' );\n\n return _.extend( {}, FoldoutListItemView.prototype.templates, {\n warnings : warnings,\n titleBar : titleBarTemplate\n });\n}());\n\n\n//==============================================================================\n/** @class Read only view for DatasetCollectionElement.\n */\nvar DCEListItemView = ListItemView.extend(\n/** @lends DCEListItemView.prototype */{\n//TODO: this might be expendable - compacted with HDAListItemView\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** add the DCE class to the list item */\n className : ListItemView.prototype.className + \" dataset-collection-element\",\n\n /** set up */\n initialize : function( attributes ){\n if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n this.log( 'DCEListItemView.initialize:', attributes );\n ListItemView.prototype.initialize.call( this, attributes );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DCEListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDCEListItemView.prototype.templates = (function(){\n\n // use the element identifier here - since that will persist and the user will need it\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n '
            ',\n '<%- element.element_identifier %>',\n '
            ',\n '
            ',\n '
            '\n ], 'element' );\n\n return _.extend( {}, ListItemView.prototype.templates, {\n titleBar : titleBarTemplate\n });\n}());\n\n\n//==============================================================================\n/** @class Read only view for a DatasetCollectionElement that is also an DatasetAssociation\n * (a dataset contained in a dataset collection).\n */\nvar DatasetDCEListItemView = DATASET_LI.DatasetListItemView.extend(\n/** @lends DatasetDCEListItemView.prototype */{\n\n className : DATASET_LI.DatasetListItemView.prototype.className + \" dataset-collection-element\",\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** set up */\n initialize : function( attributes ){\n if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n this.log( 'DatasetDCEListItemView.initialize:', attributes );\n DATASET_LI.DatasetListItemView.prototype.initialize.call( this, attributes );\n },\n\n /** In this override, only get details if in the ready state.\n * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n */\n _fetchModelDetails : function(){\n var view = this;\n if( view.model.inReadyState() && !view.model.hasDetails() ){\n return view.model.fetch({ silent: true });\n }\n return jQuery.when();\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DatasetDCEListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDatasetDCEListItemView.prototype.templates = (function(){\n\n // use the element identifier here and not the dataset name\n //TODO:?? can we steal the DCE titlebar?\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n '',\n '
            ',\n '<%- element.element_identifier %>',\n '
            ',\n '
            '\n ], 'element' );\n\n return _.extend( {}, DATASET_LI.DatasetListItemView.prototype.templates, {\n titleBar : titleBarTemplate\n });\n}());\n\n\n//==============================================================================\n/** @class Read only view for a DatasetCollectionElement that is also a DatasetCollection\n * (a nested DC).\n */\nvar NestedDCDCEListItemView = DCListItemView.extend(\n/** @lends NestedDCDCEListItemView.prototype */{\n\n className : DCListItemView.prototype.className + \" dataset-collection-element\",\n\n /** logger used to record this.log messages, commonly set to console */\n // comment this out to suppress log output\n //logger : console,\n\n /** In this override, add the state as a class for use with state-based CSS */\n _swapNewRender : function( $newRender ){\n DCListItemView.prototype._swapNewRender.call( this, $newRender );\n//TODO: model currently has no state\n var state = this.model.get( 'state' ) || 'ok';\n //if( this.model.has( 'state' ) ){\n this.$el.addClass( 'state-' + state );\n //}\n return this.$el;\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'NestedDCDCEListItemView(' + modelString + ')';\n }\n});\n\n\n//==============================================================================\n return {\n DCListItemView : DCListItemView,\n DCEListItemView : DCEListItemView,\n DatasetDCEListItemView : DatasetDCEListItemView,\n NestedDCDCEListItemView : NestedDCDCEListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-li.js\n ** module id = 34\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/dataset-model\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DATASET_MODEL, BASE_MVC, _l ){\n\nvar logNamespace = 'collections';\n//==============================================================================\n/*\nNotes:\n\nTerminology:\n DatasetCollection/DC : a container of datasets or nested DatasetCollections\n Element/DatasetCollectionElement/DCE : an item contained in a DatasetCollection\n HistoryDatasetCollectionAssociation/HDCA: a DatasetCollection contained in a history\n\n\nThis all seems too complex unfortunately:\n\n- Terminology collision between DatasetCollections (DCs) and Backbone Collections.\n- In the DatasetCollections API JSON, DC Elements use a 'Has A' stucture to *contain*\n either a dataset or a nested DC. This would make the hierarchy much taller. I've\n decided to merge the contained JSON with the DC element json - making the 'has a'\n relation into an 'is a' relation. This seems simpler to me and allowed a lot of\n DRY in both models and views, but may make tracking or tracing within these models\n more difficult (since DatasetCollectionElements are now *also* DatasetAssociations\n or DatasetCollections (nested)). This also violates the rule of thumb about\n favoring aggregation over inheritance.\n- Currently, there are three DatasetCollection subclasses: List, Pair, and ListPaired.\n These each should a) be usable on their own, b) be usable in the context of\n nesting within a collection model (at least in the case of ListPaired), and\n c) be usable within the context of other container models (like History or\n LibraryFolder, etc.). I've tried to separate/extract classes in order to\n handle those three situations, but it's proven difficult to do in a simple,\n readable manner.\n- Ideally, histories and libraries would inherit from the same server models as\n dataset collections do since they are (in essence) dataset collections themselves -\n making the whole nested structure simpler. This would be a large, error-prone\n refactoring and migration.\n\nMany of the classes and heirarchy are meant as extension points so, while the\nrelations and flow may be difficult to understand initially, they'll allow us to\nhandle the growth or flux dataset collection in the future (w/o actually implementing\nany YAGNI).\n\n*/\n//_________________________________________________________________________________________________ ELEMENTS\n/** @class mixin for Dataset collection elements.\n * When collection elements are passed from the API, the underlying element is\n * in a sub-object 'object' (IOW, a DCE representing an HDA will have HDA json in element.object).\n * This mixin uses the constructor and parse methods to merge that JSON with the DCE attribtues\n * effectively changing a DCE from a container to a subclass (has a --> is a).\n */\nvar DatasetCollectionElementMixin = {\n\n /** default attributes used by elements in a dataset collection */\n defaults : {\n model_class : 'DatasetCollectionElement',\n element_identifier : null,\n element_index : null,\n element_type : null\n },\n\n /** merge the attributes of the sub-object 'object' into this model */\n _mergeObject : function( attributes ){\n // if we don't preserve and correct ids here, the element id becomes the object id\n // and collision in backbone's _byId will occur and only\n _.extend( attributes, attributes.object, { element_id: attributes.id });\n delete attributes.object;\n return attributes;\n },\n\n /** override to merge this.object into this */\n constructor : function( attributes, options ){\n // console.debug( '\\t DatasetCollectionElement.constructor:', attributes, options );\n attributes = this._mergeObject( attributes );\n this.idAttribute = 'element_id';\n Backbone.Model.apply( this, arguments );\n },\n\n /** when the model is fetched, merge this.object into this */\n parse : function( response, options ){\n var attributes = response;\n attributes = this._mergeObject( attributes );\n return attributes;\n }\n};\n\n//TODO: unused?\n/** @class Concrete class of Generic DatasetCollectionElement */\nvar DatasetCollectionElement = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( DatasetCollectionElementMixin )\n .extend({ _logNamespace : logNamespace });\n\n\n//==============================================================================\n/** @class Base/Abstract Backbone collection for Generic DCEs. */\nvar DCECollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(\n/** @lends DCECollection.prototype */{\n _logNamespace : logNamespace,\n\n model: DatasetCollectionElement,\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n//TODO: unused?\n /** Set up.\n * @see Backbone.Collection#initialize\n */\n initialize : function( attributes, options ){\n this.debug( this + '(DCECollection).initialize:', attributes, options );\n options = options || {};\n //this._setUpListeners();\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'DatasetCollectionElementCollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone model for a dataset collection element that is a dataset (HDA).\n */\nvar DatasetDCE = DATASET_MODEL.DatasetAssociation.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n/** @lends DatasetDCE.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** url fn */\n url : function(){\n // won't always be an hda\n if( !this.has( 'history_id' ) ){\n console.warn( 'no endpoint for non-hdas within a collection yet' );\n // (a little silly since this api endpoint *also* points at hdas)\n return Galaxy.root + 'api/datasets';\n }\n return Galaxy.root + 'api/histories/' + this.get( 'history_id' ) + '/contents/' + this.get( 'id' );\n },\n\n defaults : _.extend( {},\n DATASET_MODEL.DatasetAssociation.prototype.defaults,\n DatasetCollectionElementMixin.defaults\n ),\n\n // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n // - re-apply manually for now\n /** call the mixin constructor */\n constructor : function( attributes, options ){\n this.debug( '\\t DatasetDCE.constructor:', attributes, options );\n //DATASET_MODEL.DatasetAssociation.prototype.constructor.call( this, attributes, options );\n DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n },\n\n//TODO: unused?\n /** set up */\n initialize : function( attributes, options ){\n this.debug( this + '(DatasetDCE).initialize:', attributes, options );\n DATASET_MODEL.DatasetAssociation.prototype.initialize.call( this, attributes, options );\n },\n\n /** Does this model already contain detailed data (as opposed to just summary level data)? */\n hasDetails : function(){\n // dataset collection api does return genome_build but doesn't return annotation\n return _.has( this.attributes, 'annotation' );\n },\n\n /** String representation. */\n toString : function(){\n var objStr = this.get( 'element_identifier' );\n return ([ 'DatasetDCE(', objStr, ')' ].join( '' ));\n }\n}));\n\n\n//==============================================================================\n/** @class DCECollection of DatasetDCE's (a list of datasets, a pair of datasets).\n */\nvar DatasetDCECollection = DCECollection.extend(\n/** @lends DatasetDCECollection.prototype */{\n model: DatasetDCE,\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n//TODO: unused?\n /** set up */\n initialize : function( attributes, options ){\n this.debug( this + '(DatasetDCECollection).initialize:', attributes, options );\n DCECollection.prototype.initialize.call( this, attributes, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'DatasetDCECollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//_________________________________________________________________________________________________ COLLECTIONS\n/** @class Backbone model for Dataset Collections.\n * The DC API returns an array of JSON objects under the attribute elements.\n * This model:\n * - removes that array/attribute ('elements') from the model,\n * - creates a bbone collection (of the class defined in the 'collectionClass' attribute),\n * - passes that json onto the bbone collection\n * - caches the bbone collection in this.elements\n */\nvar DatasetCollection = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( BASE_MVC.SearchableModelMixin )\n .extend(/** @lends DatasetCollection.prototype */{\n _logNamespace : logNamespace,\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** default attributes for a model */\n defaults : {\n /* 'list', 'paired', or 'list:paired' */\n collection_type : null,\n //??\n deleted : false\n },\n\n /** Which class to use for elements */\n collectionClass : DCECollection,\n\n /** set up: create elements instance var and (on changes to elements) update them */\n initialize : function( model, options ){\n this.debug( this + '(DatasetCollection).initialize:', model, options, this );\n //historyContent.HistoryContent.prototype.initialize.call( this, attrs, options );\n this.elements = this._createElementsModel();\n this.on( 'change:elements', function(){\n this.log( 'change:elements' );\n//TODO: prob. better to update the collection instead of re-creating it\n this.elements = this._createElementsModel();\n });\n },\n\n /** move elements model attribute to full collection */\n _createElementsModel : function(){\n this.debug( this + '._createElementsModel', this.collectionClass, this.get( 'elements' ), this.elements );\n//TODO: same patterns as DatasetCollectionElement _createObjectModel - refactor to BASE_MVC.hasSubModel?\n var elements = this.get( 'elements' ) || [];\n this.unset( 'elements', { silent: true });\n this.elements = new this.collectionClass( elements );\n //this.debug( 'collectionClass:', this.collectionClass + '', this.elements );\n return this.elements;\n },\n\n // ........................................................................ common queries\n /** pass the elements back within the model json when this is serialized */\n toJSON : function(){\n var json = Backbone.Model.prototype.toJSON.call( this );\n if( this.elements ){\n json.elements = this.elements.toJSON();\n }\n return json;\n },\n\n /** Is this collection in a 'ready' state no processing (for the collection) is left\n * to do on the server.\n */\n inReadyState : function(){\n var populated = this.get( 'populated' );\n return ( this.isDeletedOrPurged() || populated );\n },\n\n //TODO:?? the following are the same interface as DatasetAssociation - can we combine?\n /** Does the DC contain any elements yet? Is a fetch() required? */\n hasDetails : function(){\n//TODO: this is incorrect for (accidentally) empty collections\n this.debug( 'hasDetails:', this.elements.length );\n return this.elements.length !== 0;\n },\n\n /** Given the filters, what models in this.elements would be returned? */\n getVisibleContents : function( filters ){\n // filters unused for now\n return this.elements;\n },\n\n // ........................................................................ ajax\n /** save this dataset, _Mark_ing it as deleted (just a flag) */\n 'delete' : function( options ){\n if( this.get( 'deleted' ) ){ return jQuery.when(); }\n return this.save( { deleted: true }, options );\n },\n /** save this dataset, _Mark_ing it as undeleted */\n undelete : function( options ){\n if( !this.get( 'deleted' ) || this.get( 'purged' ) ){ return jQuery.when(); }\n return this.save( { deleted: false }, options );\n },\n\n /** Is this collection deleted or purged? */\n isDeletedOrPurged : function(){\n return ( this.get( 'deleted' ) || this.get( 'purged' ) );\n },\n\n // ........................................................................ searchable\n /** searchable attributes for collections */\n searchAttributes : [\n 'name'\n ],\n\n // ........................................................................ misc\n /** String representation */\n toString : function(){\n var idAndName = [ this.get( 'id' ), this.get( 'name' ) || this.get( 'element_identifier' ) ];\n return 'DatasetCollection(' + ( idAndName.join(',') ) + ')';\n }\n});\n\n\n//==============================================================================\n/** Model for a DatasetCollection containing datasets (non-nested).\n */\nvar ListDatasetCollection = DatasetCollection.extend(\n/** @lends ListDatasetCollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** override since we know the collection will only contain datasets */\n collectionClass : DatasetDCECollection,\n\n//TODO: unused?\n initialize : function( attrs, options ){\n this.debug( this + '(ListDatasetCollection).initialize:', attrs, options );\n DatasetCollection.prototype.initialize.call( this, attrs, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'ListDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** Model for a DatasetCollection containing fwd/rev datasets (a list of 2).\n */\nvar PairDatasetCollection = ListDatasetCollection.extend(\n/** @lends PairDatasetCollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n//TODO: unused?\n /** */\n initialize : function( attrs, options ){\n this.debug( this + '(PairDatasetCollection).initialize:', attrs, options );\n ListDatasetCollection.prototype.initialize.call( this, attrs, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'PairDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//_________________________________________________________________________________________________ NESTED COLLECTIONS\n// this is where things get weird, man. Weird.\n//TODO: it might be possible to compact all the following...I think.\n//==============================================================================\n/** @class Backbone model for a Generic DatasetCollectionElement that is also a DatasetCollection\n * (a nested collection). Currently only list:paired.\n */\nvar NestedDCDCE = DatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n/** @lends NestedDCDCE.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n // - re-apply manually it now\n /** call the mixin constructor */\n constructor : function( attributes, options ){\n this.debug( '\\t NestedDCDCE.constructor:', attributes, options );\n DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n },\n\n /** String representation. */\n toString : function(){\n var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );\n return ([ 'NestedDCDCE(', objStr, ')' ].join( '' ));\n }\n}));\n\n\n//==============================================================================\n/** @class Backbone collection containing Generic NestedDCDCE's (nested dataset collections).\n */\nvar NestedDCDCECollection = DCECollection.extend(\n/** @lends NestedDCDCECollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** This is a collection of nested collections */\n model: NestedDCDCE,\n\n//TODO: unused?\n /** set up */\n initialize : function( attrs, options ){\n this.debug( this + '(NestedDCDCECollection).initialize:', attrs, options );\n DCECollection.prototype.initialize.call( this, attrs, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'NestedDCDCECollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone model for a paired dataset collection within a list:paired dataset collection.\n */\nvar NestedPairDCDCE = PairDatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n/** @lends NestedPairDCDCE.prototype */{\n//TODO:?? possibly rename to NestedDatasetCollection?\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n // - re-apply manually it now\n /** This is both a collection and a collection element - call the constructor */\n constructor : function( attributes, options ){\n this.debug( '\\t NestedPairDCDCE.constructor:', attributes, options );\n //DatasetCollection.constructor.call( this, attributes, options );\n DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n },\n\n /** String representation. */\n toString : function(){\n var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );\n return ([ 'NestedPairDCDCE(', objStr, ')' ].join( '' ));\n }\n}));\n\n\n//==============================================================================\n/** @class Backbone collection for a backbone collection containing paired dataset collections.\n */\nvar NestedPairDCDCECollection = NestedDCDCECollection.extend(\n/** @lends PairDCDCECollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** We know this collection is composed of only nested pair collections */\n model: NestedPairDCDCE,\n\n//TODO: unused?\n /** set up */\n initialize : function( attrs, options ){\n this.debug( this + '(NestedPairDCDCECollection).initialize:', attrs, options );\n NestedDCDCECollection.prototype.initialize.call( this, attrs, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'NestedPairDCDCECollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone Model for a DatasetCollection (list) that contains DatasetCollections (pairs).\n */\nvar ListPairedDatasetCollection = DatasetCollection.extend(\n/** @lends ListPairedDatasetCollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** list:paired is the only collection that itself contains collections */\n collectionClass : NestedPairDCDCECollection,\n\n//TODO: unused?\n /** set up */\n initialize : function( attributes, options ){\n this.debug( this + '(ListPairedDatasetCollection).initialize:', attributes, options );\n DatasetCollection.prototype.initialize.call( this, attributes, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'ListPairedDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n return {\n ListDatasetCollection : ListDatasetCollection,\n PairDatasetCollection : PairDatasetCollection,\n ListPairedDatasetCollection : ListPairedDatasetCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-model.js\n ** module id = 35\n ** module chunks = 3\n **/","\ndefine([\n \"mvc/history/hdca-model\",\n \"mvc/dataset/states\",\n \"mvc/base-mvc\",\n \"mvc/ui/ui-modal\",\n \"utils/natural-sort\",\n \"utils/localization\",\n \"ui/hoverhighlight\"\n], function( HDCA, STATES, BASE_MVC, UI_MODAL, naturalSort, _l ){\n\nvar logNamespace = 'collections';\n/*==============================================================================\nTODO:\n use proper Element model and not just json\n straighten out createFn, collection.createHDCA\n possibly stop using modals for this\n It would be neat to do a drag and drop\n\n==============================================================================*/\n/** A view for both DatasetDCEs and NestedDCDCEs\n * (things that implement collection-model:DatasetCollectionElementMixin)\n */\nvar DatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n//TODO: use proper class (DatasetDCE or NestedDCDCE (or the union of both))\n tagName : 'li',\n className : 'collection-element',\n\n initialize : function( attributes ){\n this.element = attributes.element || {};\n this.selected = attributes.selected || false;\n },\n\n render : function(){\n this.$el\n .attr( 'data-element-id', this.element.id )\n .attr( 'draggable', true )\n .html( this.template({ element: this.element }) );\n if( this.selected ){\n this.$el.addClass( 'selected' );\n }\n return this;\n },\n\n //TODO: lots of unused space in the element - possibly load details and display them horiz.\n template : _.template([\n '',\n '<%- element.name %>',\n '',\n '',\n ].join('')),\n\n /** select this element and pub */\n select : function( toggle ){\n this.$el.toggleClass( 'selected', toggle );\n this.trigger( 'select', {\n source : this,\n selected : this.$el.hasClass( 'selected' )\n });\n },\n\n /** animate the removal of this element and pub */\n discard : function(){\n var view = this,\n parentWidth = this.$el.parent().width();\n this.$el.animate({ 'margin-right' : parentWidth }, 'fast', function(){\n view.trigger( 'discard', {\n source : view\n });\n view.destroy();\n });\n },\n\n /** remove the DOM and any listeners */\n destroy : function(){\n this.off();\n this.$el.remove();\n },\n\n events : {\n 'click' : '_click',\n 'click .name' : '_clickName',\n 'click .discard': '_clickDiscard',\n\n 'dragstart' : '_dragstart',\n 'dragend' : '_dragend',\n 'dragover' : '_sendToParent',\n 'drop' : '_sendToParent'\n },\n\n /** select when the li is clicked */\n _click : function( ev ){\n ev.stopPropagation();\n this.select( ev );\n },\n\n /** rename a pair when the name is clicked */\n _clickName : function( ev ){\n ev.stopPropagation();\n ev.preventDefault();\n var promptString = [ _l( 'Enter a new name for the element' ), ':\\n(',\n _l( 'Note that changing the name here will not rename the dataset' ), ')' ].join( '' ),\n response = prompt( _l( 'Enter a new name for the element' ) + ':', this.element.name );\n if( response ){\n this.element.name = response;\n this.render();\n }\n //TODO: cancelling with ESC leads to closure of the creator...\n },\n\n /** discard when the discard button is clicked */\n _clickDiscard : function( ev ){\n ev.stopPropagation();\n this.discard();\n },\n\n /** dragging pairs for re-ordering */\n _dragstart : function( ev ){\n if( ev.originalEvent ){ ev = ev.originalEvent; }\n ev.dataTransfer.effectAllowed = 'move';\n ev.dataTransfer.setData( 'text/plain', JSON.stringify( this.element ) );\n\n this.$el.addClass( 'dragging' );\n this.$el.parent().trigger( 'collection-element.dragstart', [ this ] );\n },\n\n /** dragging for re-ordering */\n _dragend : function( ev ){\n this.$el.removeClass( 'dragging' );\n this.$el.parent().trigger( 'collection-element.dragend', [ this ] );\n },\n\n /** manually bubble up an event to the parent/container */\n _sendToParent : function( ev ){\n this.$el.parent().trigger( ev );\n },\n\n /** string rep */\n toString : function(){\n return 'DatasetCollectionElementView()';\n }\n});\n\n\n// ============================================================================\n/** An interface for building collections.\n */\nvar ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n /** the class used to display individual elements */\n elementViewClass : DatasetCollectionElementView,\n /** the class this creator will create and save */\n collectionClass : HDCA.HistoryListDatasetCollection,\n className : 'list-collection-creator collection-creator flex-row-container',\n\n /** minimum number of valid elements to start with in order to build a collection of this type */\n minElements : 1,\n\n defaultAttributes : {\n//TODO: remove - use new collectionClass().save()\n /** takes elements and creates the proper collection - returns a promise */\n creationFn : function(){ throw new TypeError( 'no creation fn for creator' ); },\n /** fn to call when the collection is created (scoped to this) */\n oncreate : function(){},\n /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n oncancel : function(){},\n /** distance from list edge to begin autoscrolling list */\n autoscrollDist : 24,\n /** Color passed to hoverhighlight */\n highlightClr : 'rgba( 64, 255, 255, 1.0 )'\n },\n\n /** set up initial options, instance vars, behaviors */\n initialize : function( attributes ){\n this.metric( 'ListCollectionCreator.initialize', attributes );\n var creator = this;\n _.each( this.defaultAttributes, function( value, key ){\n value = attributes[ key ] || value;\n creator[ key ] = value;\n });\n\n /** unordered, original list - cache to allow reversal */\n creator.initialElements = attributes.elements || [];\n\n this._instanceSetUp();\n this._elementsSetUp();\n this._setUpBehaviors();\n },\n\n /** set up instance vars */\n _instanceSetUp : function(){\n /** Ids of elements that have been selected by the user - to preserve over renders */\n this.selectedIds = {};\n /** DOM elements currently being dragged */\n this.$dragging = null;\n /** Used for blocking UI events during ajax/operations (don't post twice) */\n this.blocking = false;\n },\n\n // ------------------------------------------------------------------------ process raw list\n /** set up main data */\n _elementsSetUp : function(){\n //this.debug( '-- _dataSetUp' );\n /** a list of invalid elements and the reasons they aren't valid */\n this.invalidElements = [];\n//TODO: handle fundamental problem of syncing DOM, views, and list here\n /** data for list in progress */\n this.workingElements = [];\n /** views for workingElements */\n this.elementViews = [];\n\n // copy initial list, sort, add ids if needed\n this.workingElements = this.initialElements.slice( 0 );\n this._ensureElementIds();\n this._validateElements();\n this._mangleDuplicateNames();\n this._sortElements();\n },\n\n /** add ids to dataset objs in initial list if none */\n _ensureElementIds : function(){\n this.workingElements.forEach( function( element ){\n if( !element.hasOwnProperty( 'id' ) ){\n element.id = _.uniqueId();\n }\n });\n return this.workingElements;\n },\n\n /** separate working list into valid and invalid elements for this collection */\n _validateElements : function(){\n var creator = this,\n existingNames = {};\n creator.invalidElements = [];\n\n this.workingElements = this.workingElements.filter( function( element ){\n var problem = creator._isElementInvalid( element );\n if( problem ){\n creator.invalidElements.push({\n element : element,\n text : problem\n });\n }\n return !problem;\n });\n return this.workingElements;\n },\n\n /** describe what is wrong with a particular element if anything */\n _isElementInvalid : function( element ){\n if( element.history_content_type !== 'dataset' ){\n return _l( \"is not a dataset\" );\n }\n if( element.state !== STATES.OK ){\n if( _.contains( STATES.NOT_READY_STATES, element.state ) ){\n return _l( \"hasn't finished running yet\" );\n }\n return _l( \"has errored, is paused, or is not accessible\" );\n }\n if( element.deleted || element.purged ){\n return _l( \"has been deleted or purged\" );\n }\n return null;\n },\n\n /** mangle duplicate names using a mac-like '(counter)' addition to any duplicates */\n _mangleDuplicateNames : function(){\n var SAFETY = 900,\n counter = 1,\n existingNames = {};\n this.workingElements.forEach( function( element ){\n var currName = element.name;\n while( existingNames.hasOwnProperty( currName ) ){\n currName = element.name + ' (' + counter + ')';\n counter += 1;\n if( counter >= SAFETY ){\n throw new Error( 'Safety hit in while loop - thats impressive' );\n }\n }\n element.name = currName;\n existingNames[ element.name ] = true;\n });\n },\n\n /** sort a list of elements */\n _sortElements : function( list ){\n // // currently only natural sort by name\n // this.workingElements.sort( function( a, b ){ return naturalSort( a.name, b.name ); });\n // return this.workingElements;\n },\n\n // ------------------------------------------------------------------------ rendering\n // templates : ListCollectionCreator.templates,\n /** render the entire interface */\n render : function( speed, callback ){\n //this.debug( '-- _render' );\n if( this.workingElements.length < this.minElements ){\n return this._renderInvalid( speed, callback );\n }\n\n this.$el.empty().html( this.templates.main() );\n this._renderHeader( speed );\n this._renderMiddle( speed );\n this._renderFooter( speed );\n this._addPluginComponents();\n this.$( '.collection-name' ).focus();\n this.trigger( 'rendered', this );\n return this;\n },\n\n\n /** render a simplified interface aimed at telling the user why they can't move forward */\n _renderInvalid : function( speed, callback ){\n //this.debug( '-- _render' );\n this.$el.empty().html( this.templates.invalidInitial({\n problems: this.invalidElements,\n elements: this.workingElements,\n }));\n if( typeof this.oncancel === 'function' ){\n this.$( '.cancel-create.btn' ).show();\n }\n this.trigger( 'rendered', this );\n return this;\n },\n\n /** render the header section */\n _renderHeader : function( speed, callback ){\n var $header = this.$( '.header' ).empty().html( this.templates.header() )\n .find( '.help-content' ).prepend( $( this.templates.helpContent() ) );\n //TODO: should only show once despite calling _renderHeader again\n if( this.invalidElements.length ){\n this._invalidElementsAlert();\n }\n return $header;\n },\n\n /** render the middle including the elements */\n _renderMiddle : function( speed, callback ){\n var $middle = this.$( '.middle' ).empty().html( this.templates.middle() );\n this._renderList( speed );\n return $middle;\n },\n\n /** render the footer, completion controls, and cancel controls */\n _renderFooter : function( speed, callback ){\n var $footer = this.$( '.footer' ).empty().html( this.templates.footer() );\n if( typeof this.oncancel === 'function' ){\n this.$( '.cancel-create.btn' ).show();\n }\n return $footer;\n },\n\n /** add any jQuery/bootstrap/custom plugins to elements rendered */\n _addPluginComponents : function(){\n this.$( '.help-content i' ).hoverhighlight( '.collection-creator', this.highlightClr );\n },\n\n /** build and show an alert describing any elements that could not be included due to problems */\n _invalidElementsAlert : function(){\n this._showAlert( this.templates.invalidElements({ problems: this.invalidElements }), 'alert-warning' );\n },\n\n /** add (or clear if clear is truthy) a validation warning to the DOM element described in what */\n _validationWarning : function( what, clear ){\n var VALIDATION_CLASS = 'validation-warning';\n if( what === 'name' ){\n what = this.$( '.collection-name' ).add( this.$( '.collection-name-prompt' ) );\n this.$( '.collection-name' ).focus().select();\n }\n if( clear ){\n what = what || this.$( '.' + VALIDATION_CLASS );\n what.removeClass( VALIDATION_CLASS );\n } else {\n what.addClass( VALIDATION_CLASS );\n }\n },\n\n _disableNameAndCreate : function( disable ){\n disable = !_.isUndefined( disable )? disable : true;\n if( disable ){\n this.$( '.collection-name' ).prop( 'disabled', true );\n this.$( '.create-collection' ).toggleClass( 'disabled', true );\n // } else {\n // this.$( '.collection-name' ).prop( 'disabled', false );\n // this.$( '.create-collection' ).removeClass( 'disable' );\n }\n },\n\n // ------------------------------------------------------------------------ rendering elements\n /** conv. to the main list display DOM */\n $list : function(){\n return this.$( '.collection-elements' );\n },\n\n /** show or hide the clear selected control based on the num of selected elements */\n _renderClearSelected : function(){\n if( _.size( this.selectedIds ) ){\n this.$( '.collection-elements-controls > .clear-selected' ).show();\n } else {\n this.$( '.collection-elements-controls > .clear-selected' ).hide();\n }\n },\n\n /** render the elements in order (or a warning if no elements found) */\n _renderList : function( speed, callback ){\n //this.debug( '-- _renderList' );\n var creator = this,\n $tmp = jQuery( '
            ' ),\n $list = creator.$list();\n\n _.each( this.elementViews, function( view ){\n view.destroy();\n creator.removeElementView( view );\n });\n\n // if( !this.workingElements.length ){\n // this._renderNoValidElements();\n // return;\n // }\n\n creator.workingElements.forEach( function( element ){\n var elementView = creator._createElementView( element );\n $tmp.append( elementView.$el );\n });\n\n creator._renderClearSelected();\n $list.empty().append( $tmp.children() );\n _.invoke( creator.elementViews, 'render' );\n\n if( $list.height() > $list.css( 'max-height' ) ){\n $list.css( 'border-width', '1px 0px 1px 0px' );\n } else {\n $list.css( 'border-width', '0px' );\n }\n },\n\n /** create an element view, cache in elementViews, set up listeners, and return */\n _createElementView : function( element ){\n var elementView = new this.elementViewClass({\n//TODO: use non-generic class or not all\n // model : COLLECTION.DatasetDCE( element )\n element : element,\n selected: _.has( this.selectedIds, element.id )\n });\n this.elementViews.push( elementView );\n this._listenToElementView( elementView );\n return elementView;\n },\n\n /** listen to any element events */\n _listenToElementView : function( view ){\n var creator = this;\n creator.listenTo( view, {\n select : function( data ){\n var element = data.source.element;\n if( data.selected ){\n creator.selectedIds[ element.id ] = true;\n } else {\n delete creator.selectedIds[ element.id ];\n }\n creator.trigger( 'elements:select', data );\n },\n discard : function( data ){\n creator.trigger( 'elements:discard', data );\n }\n });\n },\n\n /** add a new element view based on the json in element */\n addElementView : function( element ){\n//TODO: workingElements is sorted, add element in appropo index\n // add element, sort elements, find element index\n // var view = this._createElementView( element );\n // return view;\n },\n\n /** stop listening to view and remove from caches */\n removeElementView : function( view ){\n delete this.selectedIds[ view.element.id ];\n this._renderClearSelected();\n\n this.elementViews = _.without( this.elementViews, view );\n this.stopListening( view );\n },\n\n /** render a message in the list that no elements remain to create a collection */\n _renderNoElementsLeft : function(){\n this._disableNameAndCreate( true );\n this.$( '.collection-elements' ).append( this.templates.noElementsLeft() );\n },\n\n // /** render a message in the list that no valid elements were found to create a collection */\n // _renderNoValidElements : function(){\n // this._disableNameAndCreate( true );\n // this.$( '.collection-elements' ).append( this.templates.noValidElements() );\n // },\n\n // ------------------------------------------------------------------------ API\n /** convert element into JSON compatible with the collections API */\n _elementToJSON : function( element ){\n // return element.toJSON();\n return element;\n },\n\n /** create the collection via the API\n * @returns {jQuery.xhr Object} the jquery ajax request\n */\n createList : function( name ){\n if( !this.workingElements.length ){\n var message = _l( 'No valid elements for final list' ) + '. ';\n message += '' + _l( 'Cancel' ) + ' ';\n message += _l( 'or' );\n message += ' ' + _l( 'start over' ) + '.';\n this._showAlert( message );\n return;\n }\n\n var creator = this,\n elements = this.workingElements.map( function( element ){\n return creator._elementToJSON( element );\n });\n\n creator.blocking = true;\n return creator.creationFn( elements, name )\n .always( function(){\n creator.blocking = false;\n })\n .fail( function( xhr, status, message ){\n creator.trigger( 'error', {\n xhr : xhr,\n status : status,\n message : _l( 'An error occurred while creating this collection' )\n });\n })\n .done( function( response, message, xhr ){\n creator.trigger( 'collection:created', response, message, xhr );\n creator.metric( 'collection:created', response );\n if( typeof creator.oncreate === 'function' ){\n creator.oncreate.call( this, response, message, xhr );\n }\n });\n },\n\n // ------------------------------------------------------------------------ events\n /** set up event handlers on self */\n _setUpBehaviors : function(){\n this.on( 'error', this._errorHandler );\n\n this.once( 'rendered', function(){\n this.trigger( 'rendered:initial', this );\n });\n\n this.on( 'elements:select', function( data ){\n this._renderClearSelected();\n });\n\n this.on( 'elements:discard', function( data ){\n var element = data.source.element;\n this.removeElementView( data.source );\n\n this.workingElements = _.without( this.workingElements, element );\n if( !this.workingElements.length ){\n this._renderNoElementsLeft();\n }\n });\n\n //this.on( 'all', function(){\n // this.info( arguments );\n //});\n return this;\n },\n\n /** handle errors with feedback and details to the user (if available) */\n _errorHandler : function( data ){\n this.error( data );\n\n var creator = this;\n content = data.message || _l( 'An error occurred' );\n if( data.xhr ){\n var xhr = data.xhr,\n message = data.message;\n if( xhr.readyState === 0 && xhr.status === 0 ){\n content += ': ' + _l( 'Galaxy could not be reached and may be updating.' ) +\n _l( ' Try again in a few minutes.' );\n } else if( xhr.responseJSON ){\n content += ':
            ' + JSON.stringify( xhr.responseJSON ) + '
            ';\n } else {\n content += ': ' + message;\n }\n }\n creator._showAlert( content, 'alert-danger' );\n },\n\n events : {\n // header\n 'click .more-help' : '_clickMoreHelp',\n 'click .less-help' : '_clickLessHelp',\n 'click .main-help' : '_toggleHelp',\n 'click .header .alert button' : '_hideAlert',\n\n 'click .reset' : 'reset',\n 'click .clear-selected' : 'clearSelectedElements',\n\n // elements - selection\n 'click .collection-elements' : 'clearSelectedElements',\n\n // elements - drop target\n // 'dragenter .collection-elements': '_dragenterElements',\n // 'dragleave .collection-elements': '_dragleaveElements',\n 'dragover .collection-elements' : '_dragoverElements',\n 'drop .collection-elements' : '_dropElements',\n\n // these bubble up from the elements as custom events\n 'collection-element.dragstart .collection-elements' : '_elementDragstart',\n 'collection-element.dragend .collection-elements' : '_elementDragend',\n\n // footer\n 'change .collection-name' : '_changeName',\n 'keydown .collection-name' : '_nameCheckForEnter',\n 'click .cancel-create' : function( ev ){\n if( typeof this.oncancel === 'function' ){\n this.oncancel.call( this );\n }\n },\n 'click .create-collection' : '_clickCreate'//,\n },\n\n // ........................................................................ header\n /** expand help */\n _clickMoreHelp : function( ev ){\n ev.stopPropagation();\n this.$( '.main-help' ).addClass( 'expanded' );\n this.$( '.more-help' ).hide();\n },\n /** collapse help */\n _clickLessHelp : function( ev ){\n ev.stopPropagation();\n this.$( '.main-help' ).removeClass( 'expanded' );\n this.$( '.more-help' ).show();\n },\n /** toggle help */\n _toggleHelp : function( ev ){\n ev.stopPropagation();\n this.$( '.main-help' ).toggleClass( 'expanded' );\n this.$( '.more-help' ).toggle();\n },\n\n /** show an alert on the top of the interface containing message (alertClass is bootstrap's alert-*) */\n _showAlert : function( message, alertClass ){\n alertClass = alertClass || 'alert-danger';\n this.$( '.main-help' ).hide();\n this.$( '.header .alert' )\n .attr( 'class', 'alert alert-dismissable' ).addClass( alertClass ).show()\n .find( '.alert-message' ).html( message );\n },\n /** hide the alerts at the top */\n _hideAlert : function( message ){\n this.$( '.main-help' ).show();\n this.$( '.header .alert' ).hide();\n },\n\n // ........................................................................ elements\n /** reset all data to the initial state */\n reset : function(){\n this._instanceSetUp();\n this._elementsSetUp();\n this.render();\n },\n\n /** deselect all elements */\n clearSelectedElements : function( ev ){\n this.$( '.collection-elements .collection-element' ).removeClass( 'selected' );\n this.$( '.collection-elements-controls > .clear-selected' ).hide();\n },\n\n //_dragenterElements : function( ev ){\n // //this.debug( '_dragenterElements:', ev );\n //},\n//TODO: if selected are dragged out of the list area - remove the placeholder - cuz it won't work anyway\n // _dragleaveElements : function( ev ){\n // //this.debug( '_dragleaveElements:', ev );\n // },\n\n /** track the mouse drag over the list adding a placeholder to show where the drop would occur */\n _dragoverElements : function( ev ){\n //this.debug( '_dragoverElements:', ev );\n ev.preventDefault();\n\n var $list = this.$list();\n this._checkForAutoscroll( $list, ev.originalEvent.clientY );\n var $nearest = this._getNearestElement( ev.originalEvent.clientY );\n\n //TODO: no need to re-create - move instead\n this.$( '.element-drop-placeholder' ).remove();\n var $placeholder = $( '
            ' );\n if( !$nearest.size() ){\n $list.append( $placeholder );\n } else {\n $nearest.before( $placeholder );\n }\n },\n\n /** If the mouse is near enough to the list's top or bottom, scroll the list */\n _checkForAutoscroll : function( $element, y ){\n var AUTOSCROLL_SPEED = 2,\n offset = $element.offset(),\n scrollTop = $element.scrollTop(),\n upperDist = y - offset.top,\n lowerDist = ( offset.top + $element.outerHeight() ) - y;\n if( upperDist >= 0 && upperDist < this.autoscrollDist ){\n $element.scrollTop( scrollTop - AUTOSCROLL_SPEED );\n } else if( lowerDist >= 0 && lowerDist < this.autoscrollDist ){\n $element.scrollTop( scrollTop + AUTOSCROLL_SPEED );\n }\n },\n\n /** get the nearest element based on the mouse's Y coordinate.\n * If the y is at the end of the list, return an empty jQuery object.\n */\n _getNearestElement : function( y ){\n var WIGGLE = 4,\n lis = this.$( '.collection-elements li.collection-element' ).toArray();\n for( var i=0; i y && top - halfHeight < y ){\n return $li;\n }\n }\n return $();\n },\n\n /** drop (dragged/selected elements) onto the list, re-ordering the internal list */\n _dropElements : function( ev ){\n if( ev.originalEvent ){ ev = ev.originalEvent; }\n // both required for firefox\n ev.preventDefault();\n ev.dataTransfer.dropEffect = 'move';\n\n // insert before the nearest element or after the last.\n var $nearest = this._getNearestElement( ev.clientY );\n if( $nearest.size() ){\n this.$dragging.insertBefore( $nearest );\n } else {\n // no nearest before - insert after last element\n this.$dragging.insertAfter( this.$( '.collection-elements .collection-element' ).last() );\n }\n // resync the creator's list based on the new DOM order\n this._syncOrderToDom();\n return false;\n },\n\n /** resync the creator's list of elements based on the DOM order */\n _syncOrderToDom : function(){\n var creator = this,\n newElements = [];\n //TODO: doesn't seem wise to use the dom to store these - can't we sync another way?\n this.$( '.collection-elements .collection-element' ).each( function(){\n var id = $( this ).attr( 'data-element-id' ),\n element = _.findWhere( creator.workingElements, { id: id });\n if( element ){\n newElements.push( element );\n } else {\n console.error( 'missing element: ', id );\n }\n });\n this.workingElements = newElements;\n this._renderList();\n },\n\n /** drag communication with element sub-views: dragstart */\n _elementDragstart : function( ev, element ){\n // auto select the element causing the event and move all selected\n element.select( true );\n this.$dragging = this.$( '.collection-elements .collection-element.selected' );\n },\n\n /** drag communication with element sub-views: dragend - remove the placeholder */\n _elementDragend : function( ev, element ){\n $( '.element-drop-placeholder' ).remove();\n this.$dragging = null;\n },\n\n // ........................................................................ footer\n /** handle a collection name change */\n _changeName : function( ev ){\n this._validationWarning( 'name', !!this._getName() );\n },\n\n /** check for enter key press when in the collection name and submit */\n _nameCheckForEnter : function( ev ){\n if( ev.keyCode === 13 && !this.blocking ){\n this._clickCreate();\n }\n },\n\n /** get the current collection name */\n _getName : function(){\n return _.escape( this.$( '.collection-name' ).val() );\n },\n\n /** attempt to create the current collection */\n _clickCreate : function( ev ){\n var name = this._getName();\n if( !name ){\n this._validationWarning( 'name' );\n } else if( !this.blocking ){\n this.createList( name );\n }\n },\n\n // ------------------------------------------------------------------------ templates\n //TODO: move to require text plugin and load these as text\n //TODO: underscore currently unnecc. bc no vars are used\n //TODO: better way of localizing text-nodes in long strings\n /** underscore template fns attached to class */\n templates : {\n /** the skeleton */\n main : _.template([\n '
            ',\n '
            ',\n '
            '\n ].join('')),\n\n /** the header (not including help text) */\n header : _.template([\n '
            ',\n '', _l( 'More help' ), '',\n '
            ',\n '', _l( 'Less' ), '',\n '
            ',\n '
            ',\n '
            ',\n '',\n '',\n '
            ',\n ].join('')),\n\n /** the middle: element list */\n middle : _.template([\n '',\n '
            ',\n '
            '\n ].join('')),\n\n /** creation and cancel controls */\n footer : _.template([\n '
            ',\n '
            ',\n '',\n '
            ', _l( 'Name' ), ':
            ',\n '
            ',\n '
            ',\n\n '
            ',\n '
            ',\n '',\n '
            ',\n '',\n '',\n '
            ',\n '
            ',\n\n '
            ',\n '',\n '
            ',\n '
            '\n ].join('')),\n\n /** help content */\n helpContent : _.template([\n '

            ', _l([\n 'Collections of datasets are permanent, ordered lists of datasets that can be passed to tools and ',\n 'workflows in order to have analyses done on each member of the entire group. This interface allows ',\n 'you to create a collection and re-order the final collection.'\n ].join( '' )), '

            ',\n '
              ',\n '
            • ', _l([\n 'Rename elements in the list by clicking on ',\n 'the existing name.'\n ].join( '' )), '
            • ',\n '
            • ', _l([\n 'Discard elements from the final created list by clicking on the ',\n '\"Discard\" button.'\n ].join( '' )), '
            • ',\n '
            • ', _l([\n 'Reorder the list by clicking and dragging elements. Select multiple elements by clicking on ',\n 'them and you can then move those selected by dragging the ',\n 'entire group. Deselect them by clicking them again or by clicking the ',\n 'the \"Clear selected\" link.'\n ].join( '' )), '
            • ',\n '
            • ', _l([\n 'Click the \"Start over\" link to begin again as if you had just opened ',\n 'the interface.'\n ].join( '' )), '
            • ',\n '
            • ', _l([\n 'Click the \"Cancel\" button to exit the interface.'\n ].join( '' )), '
            • ',\n '

            ',\n '

            ', _l([\n 'Once your collection is complete, enter a name and ',\n 'click \"Create list\".'\n ].join( '' )), '

            '\n ].join('')),\n\n /** shown in list when all elements are discarded */\n invalidElements : _.template([\n _l( 'The following selections could not be included due to problems:' ),\n '
              <% _.each( problems, function( problem ){ %>',\n '
            • <%- problem.element.name %>: <%- problem.text %>
            • ',\n '<% }); %>
            '\n ].join('')),\n\n /** shown in list when all elements are discarded */\n noElementsLeft : _.template([\n '
          7. ',\n _l( 'No elements left! ' ),\n _l( 'Would you like to ' ), '', _l( 'start over' ), '?',\n '
          8. '\n ].join('')),\n\n /** a simplified page communicating what went wrong and why the user needs to reselect something else */\n invalidInitial : _.template([\n '
            ',\n '
            ',\n '',\n '<% if( _.size( problems ) ){ %>',\n _l( 'The following selections could not be included due to problems' ), ':',\n '
              <% _.each( problems, function( problem ){ %>',\n '
            • <%- problem.element.name %>: <%- problem.text %>
            • ',\n '<% }); %>
            ',\n '<% } else if( _.size( elements ) < 1 ){ %>',\n _l( 'No datasets were selected' ), '.',\n '<% } %>',\n '
            ',\n _l( 'At least one element is needed for the collection' ), '. ',\n _l( 'You may need to ' ),\n '', _l( 'cancel' ), ' ',\n _l( 'and reselect new elements' ), '.',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '',\n // _l( 'Create a different kind of collection' ),\n '
            ',\n '
            ',\n '
            '\n ].join('')),\n },\n\n // ------------------------------------------------------------------------ misc\n /** string rep */\n toString : function(){ return 'ListCollectionCreator'; }\n});\n\n\n\n//=============================================================================\n/** Create a modal and load its body with the given CreatorClass creator type\n * @returns {Deferred} resolved when creator has built a collection.\n */\nvar collectionCreatorModal = function _collectionCreatorModal( elements, options, CreatorClass ){\n\n var deferred = jQuery.Deferred(),\n modal = Galaxy.modal || ( new UI_MODAL.View() ),\n creator;\n\n options = _.defaults( options || {}, {\n elements : elements,\n oncancel : function(){\n modal.hide();\n deferred.reject( 'cancelled' );\n },\n oncreate : function( creator, response ){\n modal.hide();\n deferred.resolve( response );\n }\n });\n\n creator = new CreatorClass( options );\n modal.show({\n title : options.title || _l( 'Create a collection' ),\n body : creator.$el,\n width : '80%',\n height : '100%',\n closing_events: true\n });\n creator.render();\n window._collectionCreator = creator;\n\n //TODO: remove modal header\n return deferred;\n};\n\n/** List collection flavor of collectionCreatorModal. */\nvar listCollectionCreatorModal = function _listCollectionCreatorModal( elements, options ){\n options = options || {};\n options.title = _l( 'Create a collection from a list of datasets' );\n return collectionCreatorModal( elements, options, ListCollectionCreator );\n};\n\n\n//==============================================================================\n/** Use a modal to create a list collection, then add it to the given history contents.\n * @returns {Deferred} resolved when the collection is added to the history.\n */\nfunction createListCollection( contents ){\n var elements = contents.toJSON(),\n promise = listCollectionCreatorModal( elements, {\n creationFn : function( elements, name ){\n elements = elements.map( function( element ){\n return {\n id : element.id,\n name : element.name,\n //TODO: this allows for list:list even if the filter above does not - reconcile\n src : ( element.history_content_type === 'dataset'? 'hda' : 'hdca' )\n };\n });\n return contents.createHDCA( elements, 'list', name );\n }\n });\n return promise;\n}\n\n//==============================================================================\n return {\n DatasetCollectionElementView: DatasetCollectionElementView,\n ListCollectionCreator : ListCollectionCreator,\n\n collectionCreatorModal : collectionCreatorModal,\n listCollectionCreatorModal : listCollectionCreatorModal,\n createListCollection : createListCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/list-collection-creator.js\n ** module id = 36\n ** module chunks = 3\n **/","define([\n \"mvc/list/list-item\",\n \"mvc/dataset/states\",\n \"ui/fa-icon-button\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( LIST_ITEM, STATES, faIconButton, BASE_MVC, _l ){\n/* global Backbone */\n\nvar logNamespace = 'dataset';\n/*==============================================================================\nTODO:\n straighten out state rendering and templates used\n inaccessible/STATES.NOT_VIEWABLE is a special case\n simplify button rendering\n\n==============================================================================*/\nvar _super = LIST_ITEM.ListItemView;\n/** @class Read only list view for either LDDAs, HDAs, or HDADCEs.\n * Roughly, any DatasetInstance (and not a raw Dataset).\n */\nvar DatasetListItemView = _super.extend(\n/** @lends DatasetListItemView.prototype */{\n _logNamespace : logNamespace,\n\n className : _super.prototype.className + \" dataset\",\n //TODO:?? doesn't exactly match an hda's type_id\n id : function(){\n return [ 'dataset', this.model.get( 'id' ) ].join( '-' );\n },\n\n /** Set up: instance vars, options, and event handlers */\n initialize : function( attributes ){\n if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n this.log( this + '.initialize:', attributes );\n _super.prototype.initialize.call( this, attributes );\n\n /** where should pages from links be displayed? (default to new tab/window) */\n this.linkTarget = attributes.linkTarget || '_blank';\n },\n\n /** event listeners */\n _setUpListeners : function(){\n _super.prototype._setUpListeners.call( this );\n\n // re-rendering on any model changes\n this.model.on( 'change', function( model, options ){\n // if the model moved into the ready state and is expanded without details, fetch those details now\n if( this.model.changedAttributes().state && this.model.inReadyState()\n && this.expanded && !this.model.hasDetails() ){\n // will render automatically (due to fetch -> change)\n this.model.fetch();\n\n } else {\n this.render();\n }\n }, this );\n },\n\n // ......................................................................... expandable\n /** In this override, only get details if in the ready state, get rerunnable if in other states.\n * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n */\n _fetchModelDetails : function(){\n var view = this;\n if( view.model.inReadyState() && !view.model.hasDetails() ){\n return view.model.fetch({ silent: true });\n }\n return jQuery.when();\n },\n\n // ......................................................................... removal\n /** Remove this view's html from the DOM and remove all event listeners.\n * @param {Number or String} speed jq effect speed\n * @param {Function} callback an optional function called when removal is done (scoped to this view)\n */\n remove : function( speed, callback ){\n var view = this;\n speed = speed || this.fxSpeed;\n this.$el.fadeOut( speed, function(){\n Backbone.View.prototype.remove.call( view );\n if( callback ){ callback.call( view ); }\n });\n },\n\n // ......................................................................... rendering\n /* TODO:\n dataset states are the issue primarily making dataset rendering complex\n each state should have it's own way of displaying/set of details\n often with different actions that can be applied\n throw in deleted/purged/visible and things get complicated easily\n I've considered (a couple of times) - creating a view for each state\n - but recreating the view during an update...seems wrong\n */\n /** Render this HDA, set up ui.\n * @param {Number or String} speed jq fx speed\n * @returns {Object} this\n */\n render : function( speed ){\n //HACK: hover exit doesn't seem to be called on prev. tooltips when RE-rendering - so: no tooltip hide\n // handle that here by removing previous view's tooltips\n //this.$el.find(\"[title]\").tooltip( \"destroy\" );\n return _super.prototype.render.call( this, speed );\n },\n\n /** In this override, add the dataset state as a class for use with state-based CSS */\n _swapNewRender : function( $newRender ){\n _super.prototype._swapNewRender.call( this, $newRender );\n if( this.model.has( 'state' ) ){\n this.$el.addClass( 'state-' + this.model.get( 'state' ) );\n }\n return this.$el;\n },\n\n // ................................................................................ titlebar\n /** In this override, add the dataset display button. */\n _renderPrimaryActions : function(){\n // render just the display for read-only\n return [ this._renderDisplayButton() ];\n },\n\n /** Render icon-button to display dataset data */\n _renderDisplayButton : function(){\n//TODO:?? too complex - possibly move into template\n // don't show display if not viewable or not accessible\n var state = this.model.get( 'state' );\n if( ( state === STATES.NOT_VIEWABLE )\n || ( state === STATES.DISCARDED )\n || ( !this.model.get( 'accessible' ) ) ){\n return null;\n }\n\n var displayBtnData = {\n target : this.linkTarget,\n classes : 'display-btn'\n };\n\n // show a disabled display if the data's been purged\n if( this.model.get( 'purged' ) ){\n displayBtnData.disabled = true;\n displayBtnData.title = _l( 'Cannot display datasets removed from disk' );\n\n // disable if still uploading\n } else if( state === STATES.UPLOAD ){\n displayBtnData.disabled = true;\n displayBtnData.title = _l( 'This dataset must finish uploading before it can be viewed' );\n\n // disable if still new\n } else if( state === STATES.NEW ){\n displayBtnData.disabled = true;\n displayBtnData.title = _l( 'This dataset is not yet viewable' );\n\n } else {\n displayBtnData.title = _l( 'View data' );\n\n // default link for dataset\n displayBtnData.href = this.model.urls.display;\n\n // add frame manager option onclick event\n var self = this;\n displayBtnData.onclick = function( ev ){\n if (Galaxy.frame && Galaxy.frame.active) {\n // Add dataset to frames.\n Galaxy.frame.addDataset(self.model.get('id'));\n ev.preventDefault();\n }\n };\n }\n displayBtnData.faIcon = 'fa-eye';\n return faIconButton( displayBtnData );\n },\n\n // ......................................................................... rendering details\n /** Render the enclosing div of the hda body and, if expanded, the html in the body\n * @returns {jQuery} rendered DOM\n */\n _renderDetails : function(){\n //TODO: generalize to be allow different details for each state\n\n // no access - render nothing but a message\n if( this.model.get( 'state' ) === STATES.NOT_VIEWABLE ){\n return $( this.templates.noAccess( this.model.toJSON(), this ) );\n }\n\n var $details = _super.prototype._renderDetails.call( this );\n $details.find( '.actions .left' ).empty().append( this._renderSecondaryActions() );\n $details.find( '.summary' ).html( this._renderSummary() )\n .prepend( this._renderDetailMessages() );\n $details.find( '.display-applications' ).html( this._renderDisplayApplications() );\n\n//TODO: double tap\n this._setUpBehaviors( $details );\n return $details;\n },\n\n /** Defer to the appropo summary rendering fn based on state */\n _renderSummary : function(){\n var json = this.model.toJSON(),\n summaryRenderFn = this.templates.summaries[ json.state ];\n summaryRenderFn = summaryRenderFn || this.templates.summaries.unknown;\n return summaryRenderFn( json, this );\n },\n\n /** Render messages to be displayed only when the details are shown */\n _renderDetailMessages : function(){\n var view = this,\n $warnings = $( '
            ' ),\n json = view.model.toJSON();\n//TODO:! unordered (map)\n _.each( view.templates.detailMessages, function( templateFn ){\n $warnings.append( $( templateFn( json, view ) ) );\n });\n return $warnings;\n },\n\n /** Render the external display application links */\n _renderDisplayApplications : function(){\n if( this.model.isDeletedOrPurged() ){ return ''; }\n // render both old and new display apps using the same template\n return [\n this.templates.displayApplications( this.model.get( 'display_apps' ), this ),\n this.templates.displayApplications( this.model.get( 'display_types' ), this )\n ].join( '' );\n },\n\n // ......................................................................... secondary/details actions\n /** A series of links/buttons for less commonly used actions: re-run, info, etc. */\n _renderSecondaryActions : function(){\n this.debug( '_renderSecondaryActions' );\n switch( this.model.get( 'state' ) ){\n case STATES.NOT_VIEWABLE:\n return [];\n case STATES.OK:\n case STATES.FAILED_METADATA:\n case STATES.ERROR:\n return [ this._renderDownloadButton(), this._renderShowParamsButton() ];\n }\n return [ this._renderShowParamsButton() ];\n },\n\n /** Render icon-button to show the input and output (stdout/err) for the job that created this.\n * @returns {jQuery} rendered DOM\n */\n _renderShowParamsButton : function(){\n // gen. safe to show in all cases\n return faIconButton({\n title : _l( 'View details' ),\n classes : 'params-btn',\n href : this.model.urls.show_params,\n target : this.linkTarget,\n faIcon : 'fa-info-circle'\n });\n },\n\n /** Render icon-button/popupmenu to download the data (and/or the associated meta files (bai, etc.)) for this.\n * @returns {jQuery} rendered DOM\n */\n _renderDownloadButton : function(){\n//TODO: to (its own) template fn\n // don't show anything if the data's been purged\n if( this.model.get( 'purged' ) || !this.model.hasData() ){ return null; }\n\n // return either: a popupmenu with links to download assoc. meta files (if there are meta files)\n // or a single download icon-button (if there are no meta files)\n if( !_.isEmpty( this.model.get( 'meta_files' ) ) ){\n return this._renderMetaFileDownloadButton();\n }\n\n return $([\n '',\n '',\n ''\n ].join( '' ));\n },\n\n /** Render the download button which opens a dropdown with links to download assoc. meta files (indeces, etc.) */\n _renderMetaFileDownloadButton : function(){\n var urls = this.model.urls;\n return $([\n '
            ',\n '',\n '',\n '',\n '',\n '
            '\n ].join( '\\n' ));\n },\n\n // ......................................................................... misc\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .display-btn' : function( ev ){ this.trigger( 'display', this, ev ); },\n 'click .params-btn' : function( ev ){ this.trigger( 'params', this, ev ); },\n 'click .download-btn' : function( ev ){ this.trigger( 'download', this, ev ); }\n }),\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DatasetListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDatasetListItemView.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n failed_metadata : BASE_MVC.wrapTemplate([\n // failed metadata is rendered as a warning on an otherwise ok dataset view\n '<% if( model.state === \"failed_metadata\" ){ %>',\n '
            ',\n _l( 'An error occurred setting the metadata for this dataset' ),\n '
            ',\n '<% } %>'\n ]),\n error : BASE_MVC.wrapTemplate([\n // error during index fetch - show error on dataset\n '<% if( model.error ){ %>',\n '
            ',\n _l( 'There was an error getting the data for this dataset' ), ': <%- model.error %>',\n '
            ',\n '<% } %>'\n ]),\n purged : BASE_MVC.wrapTemplate([\n '<% if( model.purged ){ %>',\n '
            ',\n _l( 'This dataset has been deleted and removed from disk' ),\n '
            ',\n '<% } %>'\n ]),\n deleted : BASE_MVC.wrapTemplate([\n // deleted not purged\n '<% if( model.deleted && !model.purged ){ %>',\n '
            ',\n _l( 'This dataset has been deleted' ),\n '
            ',\n '<% } %>'\n ])\n\n //NOTE: hidden warning is only needed for HDAs\n });\n\n var detailsTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n '
            ',\n\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n\n // do not display tags, annotation, display apps, or peek when deleted\n '<% if( !dataset.deleted && !dataset.purged ){ %>',\n '
            ',\n '
            ',\n\n '
            ',\n\n '<% if( dataset.peek ){ %>',\n '
            <%= dataset.peek %>
            ',\n '<% } %>',\n '<% } %>',\n '
            '\n ], 'dataset' );\n\n var noAccessTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n '
            ',\n _l( 'You do not have permission to view this dataset' ),\n '
            ',\n '
            '\n ], 'dataset' );\n\n//TODO: still toooooooooooooo complex - rework\n var summaryTemplates = {};\n summaryTemplates[ STATES.OK ] = summaryTemplates[ STATES.FAILED_METADATA ] = BASE_MVC.wrapTemplate([\n '<% if( dataset.misc_blurb ){ %>',\n '
            ',\n '<%- dataset.misc_blurb %>',\n '
            ',\n '<% } %>',\n\n '<% if( dataset.file_ext ){ %>',\n '
            ',\n '',\n '<%- dataset.file_ext %>',\n '
            ',\n '<% } %>',\n\n '<% if( dataset.metadata_dbkey ){ %>',\n '
            ',\n '',\n '',\n '<%- dataset.metadata_dbkey %>',\n '',\n '
            ',\n '<% } %>',\n\n '<% if( dataset.misc_info ){ %>',\n '
            ',\n '<%- dataset.misc_info %>',\n '
            ',\n '<% } %>'\n ], 'dataset' );\n summaryTemplates[ STATES.NEW ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'This is a new dataset and not all of its data are available yet' ), '
            '\n ], 'dataset' );\n summaryTemplates[ STATES.NOT_VIEWABLE ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'You do not have permission to view this dataset' ), '
            '\n ], 'dataset' );\n summaryTemplates[ STATES.DISCARDED ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'The job creating this dataset was cancelled before completion' ), '
            '\n ], 'dataset' );\n summaryTemplates[ STATES.QUEUED ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'This job is waiting to run' ), '
            '\n ], 'dataset' );\n summaryTemplates[ STATES.RUNNING ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'This job is currently running' ), '
            '\n ], 'dataset' );\n summaryTemplates[ STATES.UPLOAD ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'This dataset is currently uploading' ), '
            '\n ], 'dataset' );\n summaryTemplates[ STATES.SETTING_METADATA ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'Metadata is being auto-detected' ), '
            '\n ], 'dataset' );\n summaryTemplates[ STATES.PAUSED ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume' ), '
            '\n ], 'dataset' );\n summaryTemplates[ STATES.ERROR ] = BASE_MVC.wrapTemplate([\n '<% if( !dataset.purged ){ %>',\n '
            <%- dataset.misc_blurb %>
            ',\n '<% } %>',\n '', _l( 'An error occurred with this dataset' ), ':',\n '
            <%- dataset.misc_info %>
            '\n ], 'dataset' );\n summaryTemplates[ STATES.EMPTY ] = BASE_MVC.wrapTemplate([\n '
            ', _l( 'No data' ), ': <%- dataset.misc_blurb %>
            '\n ], 'dataset' );\n summaryTemplates.unknown = BASE_MVC.wrapTemplate([\n '
            Error: unknown dataset state: \"<%- dataset.state %>\"
            '\n ], 'dataset' );\n\n // messages to be displayed only within the details section ('below the fold')\n var detailMessageTemplates = {\n resubmitted : BASE_MVC.wrapTemplate([\n // deleted not purged\n '<% if( model.resubmitted ){ %>',\n '
            ',\n _l( 'The job creating this dataset has been resubmitted' ),\n '
            ',\n '<% } %>'\n ])\n };\n\n // this is applied to both old and new style display apps\n var displayApplicationsTemplate = BASE_MVC.wrapTemplate([\n '<% _.each( apps, function( app ){ %>',\n '
            ',\n '<%- app.label %> ',\n '',\n '<% _.each( app.links, function( link ){ %>',\n '\" href=\"<%- link.href %>\">',\n '<% print( _l( link.text ) ); %>',\n ' ',\n '<% }); %>',\n '',\n '
            ',\n '<% }); %>'\n ], 'apps' );\n\n return _.extend( {}, _super.prototype.templates, {\n warnings : warnings,\n details : detailsTemplate,\n noAccess : noAccessTemplate,\n summaries : summaryTemplates,\n detailMessages : detailMessageTemplates,\n displayApplications : displayApplicationsTemplate\n });\n}());\n\n\n// ============================================================================\n return {\n DatasetListItemView : DatasetListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/dataset-li.js\n ** module id = 37\n ** module chunks = 3\n **/","/*\n This class maps the form dom to an api compatible javascript dictionary.\n*/\ndefine([ 'utils/utils' ], function( Utils ) {\n var Manager = Backbone.Model.extend({\n initialize: function( app ) {\n this.app = app;\n },\n\n /** Creates a checksum.\n */\n checksum: function() {\n var sum = '';\n var self = this;\n this.app.section.$el.find( '.section-row' ).each( function() {\n var id = $(this).attr( 'id' );\n var field = self.app.field_list[ id ];\n if ( field ) {\n sum += id + ':' + JSON.stringify( field.value && field.value() ) + ':' + field.collapsed + ';';\n }\n });\n return sum;\n },\n\n /** Convert dom into a dictionary of flat id/value pairs used e.g. on job submission.\n */\n create: function() {\n var self = this;\n\n // get raw dictionary from dom\n var dict = {};\n this._iterate( this.app.section.$el, dict );\n\n // add to result dictionary\n var result_dict = {};\n this.flat_dict = {};\n function add( flat_id, input_id, input_value ) {\n self.flat_dict[ flat_id ] = input_id;\n result_dict[ flat_id ] = input_value;\n };\n\n // converter between raw dictionary and job dictionary\n function convert( identifier, head ) {\n for ( var index in head ) {\n var node = head[ index ];\n if ( node.input ) {\n var input = node.input;\n var flat_id = identifier;\n if ( identifier != '' ) {\n flat_id += '|';\n }\n flat_id += input.name;\n switch ( input.type ) {\n case 'repeat':\n var section_label = 'section-';\n var block_indices = [];\n var block_prefix = null;\n for ( var block_label in node ) {\n var pos = block_label.indexOf( section_label );\n if ( pos != -1 ) {\n pos += section_label.length;\n block_indices.push( parseInt( block_label.substr( pos ) ));\n if ( !block_prefix ) {\n block_prefix = block_label.substr( 0, pos );\n }\n }\n }\n block_indices.sort( function( a, b ) { return a - b; });\n var index = 0;\n for ( var i in block_indices ) {\n convert( flat_id + '_' + index++, node[ block_prefix + block_indices[ i ] ]);\n }\n break;\n case 'conditional':\n var value = self.app.field_list[ input.id ].value();\n add ( flat_id + '|' + input.test_param.name, input.id, value );\n var selectedCase = matchCase( input, value );\n if ( selectedCase != -1 ) {\n convert( flat_id, head[ input.id + '-section-' + selectedCase ] );\n }\n break;\n case 'section':\n convert( !input.flat && flat_id || '', node );\n break;\n default:\n var field = self.app.field_list[ input.id ];\n if ( field && field.value ) {\n var value = field.value();\n if ( input.ignore === undefined || input.ignore != value ) {\n if ( field.collapsed && input.collapsible_value ) {\n value = input.collapsible_value;\n }\n add ( flat_id, input.id, value );\n if ( input.payload ) {\n for ( var p_id in input.payload ) {\n add ( p_id, input.id, input.payload[ p_id ] );\n }\n }\n }\n }\n }\n }\n }\n }\n convert( '', dict );\n return result_dict;\n },\n\n /** Matches flat ids to corresponding input element\n * @param{string} flat_id - Flat input id to be looked up.\n */\n match: function ( flat_id ) {\n return this.flat_dict && this.flat_dict[ flat_id ];\n },\n\n /** Match conditional values to selected cases\n */\n matchCase: function( input, value ) {\n return matchCase( input, value );\n },\n\n /** Matches a new tool model to the current input elements e.g. used to update dynamic options\n */\n matchModel: function( model, callback ) {\n return matchIds( model.inputs, this.flat_dict, callback );\n },\n\n /** Matches identifier from api response to input elements e.g. used to display validation errors\n */\n matchResponse: function( response ) {\n var result = {};\n var self = this;\n function search ( id, head ) {\n if ( typeof head === 'string' ) {\n var input_id = self.flat_dict[ id ];\n input_id && ( result[ input_id ] = head );\n } else {\n for ( var i in head ) {\n var new_id = i;\n if ( id !== '' ) {\n var separator = '|';\n if ( head instanceof Array ) {\n separator = '_';\n }\n new_id = id + separator + new_id;\n }\n search ( new_id, head[ i ] );\n }\n }\n }\n search( '', response );\n return result;\n },\n\n /** Map dom tree to dictionary tree with input elements.\n */\n _iterate: function( parent, dict ) {\n var self = this;\n var children = $( parent ).children();\n children.each( function() {\n var child = this;\n var id = $( child ).attr( 'id' );\n if ( $( child ).hasClass( 'section-row' ) ) {\n var input = self.app.input_list[ id ];\n dict[ id ] = ( input && { input : input } ) || {};\n self._iterate( child, dict[ id ] );\n } else {\n self._iterate( child, dict );\n }\n });\n }\n });\n\n /** Match conditional values to selected cases\n * @param{dict} input - Definition of conditional input parameter\n * @param{dict} value - Current value\n */\n var matchCase = function( input, value ) {\n if ( input.test_param.type == 'boolean' ) {\n if ( value == 'true' ) {\n value = input.test_param.truevalue || 'true';\n } else {\n value = input.test_param.falsevalue || 'false';\n }\n }\n for ( var i in input.cases ) {\n if ( input.cases[ i ].value == value ) {\n return i;\n }\n }\n return -1;\n };\n\n /** Match context\n * @param{dict} inputs - Dictionary of input elements\n * @param{dict} key - Reference key which is matched to an input name e.g. data_ref\n * @param{dict} callback - Called with matched context i.e. callback( input, referenced_input )\n */\n var matchContext = function( inputs, key, callback, context ) {\n context = $.extend( true, {}, context );\n _.each( inputs, function ( input ) {\n input && input.type && ( context[ input.name ] = input );\n });\n _.each( inputs, function ( input ) {\n if ( _.isObject( input ) ) {\n if ( input.type && context[ input[ key ] ] ) {\n callback ( input, context[ input[ key ] ] );\n } else {\n matchContext( input, key, callback, context );\n }\n }\n });\n };\n\n /** Matches a tool model to a dictionary, indexed with flat ids\n * @param{dict} inputs - Dictionary of input elements\n * @param{dict} mapping - Dictionary containing flat ids\n * @param{dict} callback - Called with the mapped dictionary object and corresponding model node\n */\n var matchIds = function( inputs, mapping, callback ) {\n var result = {};\n var self = this;\n function search ( id, head ) {\n for ( var i in head ) {\n var node = head[ i ];\n var index = node.name;\n id != '' && ( index = id + '|' + index );\n switch ( node.type ) {\n case 'repeat':\n for ( var j in node.cache ) {\n search ( index + '_' + j, node.cache[ j ] );\n }\n break;\n case 'conditional':\n var selectedCase = matchCase( node, node.test_param && node.test_param.value );\n selectedCase != -1 && search ( index, node.cases[ selectedCase ].inputs );\n break;\n case 'section':\n search ( index, node.inputs );\n break;\n default:\n var mapped = mapping[ index ];\n mapped && callback( mapped, node );\n }\n }\n }\n search( '', inputs );\n return result;\n };\n\n return {\n Manager : Manager,\n matchIds : matchIds,\n matchContext : matchContext\n }\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-data.js\n ** module id = 38\n ** module chunks = 0 3\n **/","/**\n This class creates a form input element wrapper\n*/\ndefine([], function() {\n return Backbone.View.extend({\n initialize: function(app, options) {\n this.app = app;\n this.field = options.field;\n\n // set text labels and icons for collapsible button\n this.text_enable = app.options.text_enable || 'Enable';\n this.text_disable = app.options.text_disable || 'Disable';\n this.cls_enable = app.options.cls_enable || 'fa fa-caret-square-o-down';\n this.cls_disable = app.options.cls_disable || 'fa fa-caret-square-o-up';\n\n // set element\n this.setElement(this._template(options));\n\n // link elements\n this.$field = this.$('.ui-form-field');\n this.$preview = this.$('.ui-form-preview');\n this.$collapsible = this.$('.ui-form-collapsible');\n this.$collapsible_icon = this.$('.ui-form-collapsible').find('.icon');\n this.$error_text = this.$('.ui-form-error-text');\n this.$error = this.$('.ui-form-error');\n this.$backdrop = this.$('.ui-form-backdrop');\n\n // add field element\n this.$field.prepend(this.field.$el);\n\n // decide wether to expand or collapse fields\n this.field.collapsed = options.collapsible_value !== undefined && JSON.stringify( options.value ) == JSON.stringify( options.collapsible_value );\n\n // refresh view\n this._refresh();\n\n // add collapsible hide/show\n var self = this;\n this.$collapsible.on('click', function() {\n self.field.collapsed = !self.field.collapsed;\n self._refresh();\n });\n },\n\n /** Disable input element\n */\n disable: function( silent ) {\n this.$backdrop.show();\n silent && this.$backdrop.css({ 'opacity': 0, 'cursor': 'default' } );\n },\n\n /** Set error text\n */\n error: function(text) {\n this.$error_text.html(text);\n this.$error.show();\n this.$el.addClass('ui-error');\n },\n\n /** Reset this view\n */\n reset: function() {\n this.$error.hide();\n this.$el.removeClass('ui-error');\n },\n\n /** Refresh element\n */\n _refresh: function() {\n this.$collapsible_icon.removeClass().addClass('icon');\n if (!this.field.collapsed) {\n this.$field.fadeIn('fast');\n this.$preview.hide();\n this._tooltip(this.text_disable, this.cls_disable);\n } else {\n this.$field.hide();\n this.$preview.show();\n this._tooltip(this.text_enable, this.cls_enable);\n }\n this.app.trigger('change');\n },\n\n /** Set tooltip text\n */\n _tooltip: function(title, cls) {\n this.$collapsible_icon.addClass(cls)\n .tooltip({ placement: 'bottom' })\n .attr('data-original-title', title)\n .tooltip('fixTitle').tooltip('hide');\n },\n\n /** Main Template\n */\n _template: function(options) {\n var tmp = '
            ' +\n '
            ' +\n '' +\n '
            ' +\n '
            ';\n if ( !options.disabled && options.collapsible_value !== undefined ) {\n tmp += '
            ' +\n '' + options.label +\n '
            ';\n } else {\n tmp += options.label;\n }\n tmp += '
            ' +\n '
            ';\n tmp += '
            ';\n if (options.help) {\n tmp += options.help;\n if (options.argument && options.help.indexOf('(' + options.argument + ')') == -1) {\n tmp += ' (' + options.argument + ')';\n }\n }\n tmp += '
            ' +\n '
            ' +\n '
            ';\n if ( options.collapsible_preview ) {\n tmp += '
            ' + options.text_value + '
            ';\n }\n tmp += '
            ';\n return tmp;\n }\n });\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-input.js\n ** module id = 39\n ** module chunks = 0 3\n **/","/**\n This class creates input elements. New input parameter types should be added to the types dictionary.\n*/\ndefine(['utils/utils',\n 'mvc/ui/ui-misc',\n 'mvc/form/form-select-content',\n 'mvc/ui/ui-select-library',\n 'mvc/ui/ui-select-ftp',\n 'mvc/ui/ui-color-picker'],\n function(Utils, Ui, SelectContent, SelectLibrary, SelectFtp, ColorPicker) {\n\n // create form view\n return Backbone.Model.extend({\n /** Available parameter types */\n types: {\n 'text' : '_fieldText',\n 'select' : '_fieldSelect',\n 'data_column' : '_fieldSelect',\n 'genomebuild' : '_fieldSelect',\n 'data' : '_fieldData',\n 'data_collection' : '_fieldData',\n 'integer' : '_fieldSlider',\n 'float' : '_fieldSlider',\n 'boolean' : '_fieldBoolean',\n 'drill_down' : '_fieldDrilldown',\n 'color' : '_fieldColor',\n 'hidden' : '_fieldHidden',\n 'hidden_data' : '_fieldHidden',\n 'baseurl' : '_fieldHidden',\n 'library_data' : '_fieldLibrary',\n 'ftpfile' : '_fieldFtp'\n },\n\n // initialize\n initialize: function(app, options) {\n this.app = app;\n },\n\n /** Returns an input field for a given field type\n */\n create: function(input_def) {\n // add regular/default value if missing\n if (input_def.value === undefined) {\n input_def.value = null;\n }\n if (input_def.default_value === undefined) {\n input_def.default_value = input_def.value;\n }\n\n // create field wrapper\n var field = null;\n var fieldClass = this.types[input_def.type];\n if (fieldClass && typeof(this[fieldClass]) === 'function') {\n field = this[fieldClass].call(this, input_def);\n }\n\n // match unavailable field types\n if (!field) {\n this.app.incompatible = true;\n if (input_def.options) {\n field = this._fieldSelect(input_def);\n } else {\n field = this._fieldText(input_def);\n }\n Galaxy.emit.debug('form-parameters::_addRow()', 'Auto matched field type (' + input_def.type + ').');\n }\n\n // set initial field value\n input_def.value !== undefined && ( field.value( input_def.value ) );\n return field;\n },\n\n /** Data input field\n */\n _fieldData: function(input_def) {\n var self = this;\n return new SelectContent.View(this.app, {\n id : 'field-' + input_def.id,\n extensions : input_def.extensions,\n optional : input_def.optional,\n multiple : input_def.multiple,\n type : input_def.type,\n data : input_def.options,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Select/Checkbox/Radio options field\n */\n _fieldSelect: function (input_def) {\n // show text field e.g. in workflow editor\n if( input_def.is_workflow ) {\n return this._fieldText( input_def );\n }\n\n // customize properties\n if (input_def.type == 'data_column') {\n input_def.error_text = 'Missing columns in referenced dataset.'\n }\n\n // configure options fields\n var options = [];\n for (var i in input_def.options) {\n var option = input_def.options[i];\n options.push({\n label: option[0],\n value: option[1]\n });\n }\n\n // identify display type\n var SelectClass = Ui.Select;\n switch (input_def.display) {\n case 'checkboxes':\n SelectClass = Ui.Checkbox;\n break;\n case 'radio':\n SelectClass = Ui.Radio;\n break;\n }\n\n // create select field\n var self = this;\n return new SelectClass.View({\n id : 'field-' + input_def.id,\n data : options,\n error_text : input_def.error_text || 'No options available',\n optional : input_def.optional && input_def.default_value === null,\n multiple : input_def.multiple,\n optional : input_def.optional,\n searchable : input_def.searchable,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Drill down options field\n */\n _fieldDrilldown: function (input_def) {\n // show text field e.g. in workflow editor\n if( input_def.is_workflow ) {\n return this._fieldText( input_def );\n }\n\n // create drill down field\n var self = this;\n return new Ui.Drilldown.View({\n id : 'field-' + input_def.id,\n data : input_def.options,\n display : input_def.display,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Text input field\n */\n _fieldText: function(input_def) {\n // field replaces e.g. a select field\n if (input_def.options) {\n input_def.area = input_def.multiple;\n if (!Utils.validate(input_def.value)) {\n input_def.value = null;\n } else {\n if ($.isArray(input_def.value)) {\n var str_value = '';\n for (var i in input_def.value) {\n str_value += String(input_def.value[i]);\n if (!input_def.multiple) {\n break;\n }\n str_value += '\\n';\n }\n input_def.value = str_value;\n }\n }\n }\n\n // create input element\n var self = this;\n return new Ui.Input({\n id : 'field-' + input_def.id,\n area : input_def.area,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Slider field\n */\n _fieldSlider: function(input_def) {\n var self = this;\n return new Ui.Slider.View({\n id : 'field-' + input_def.id,\n precise : input_def.type == 'float',\n is_workflow : input_def.is_workflow,\n min : input_def.min,\n max : input_def.max,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Hidden field\n */\n _fieldHidden: function(input_def) {\n return new Ui.Hidden({\n id : 'field-' + input_def.id,\n info : input_def.info\n });\n },\n\n /** Boolean field\n */\n _fieldBoolean: function(input_def) {\n var self = this;\n return new Ui.RadioButton.View({\n id : 'field-' + input_def.id,\n data : [ { label : 'Yes', value : 'true' },\n { label : 'No', value : 'false' }],\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Color picker field\n */\n _fieldColor: function(input_def) {\n var self = this;\n return new ColorPicker({\n id : 'field-' + input_def.id,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Library dataset field\n */\n _fieldLibrary: function(input_def) {\n var self = this;\n return new SelectLibrary.View({\n id : 'field-' + input_def.id,\n optional : input_def.optional,\n multiple : input_def.multiple,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** FTP file field\n */\n _fieldFtp: function(input_def) {\n var self = this;\n return new SelectFtp.View({\n id : 'field-' + input_def.id,\n optional : input_def.optional,\n multiple : input_def.multiple,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n }\n });\n\n return {\n View: View\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-parameters.js\n ** module id = 40\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-table', 'mvc/ui/ui-portlet', 'mvc/ui/ui-misc'],\n function(Utils, Table, Portlet, Ui) {\n\n/** This class creates a ui component which enables the dynamic creation of portlets\n*/\nvar View = Backbone.View.extend({\n /** Initialize\n */\n initialize : function(options) {\n this.options = Utils.merge(options, {\n title : 'Section',\n empty_text : 'Not available.',\n max : null,\n min : null\n });\n this.setElement('
            ');\n var self = this;\n\n // create button\n this.button_new = new Ui.ButtonIcon({\n icon : 'fa-plus',\n title : 'Insert ' + options.title_new,\n tooltip : 'Add new ' + options.title_new + ' block',\n floating: 'clear',\n onclick : function() {\n if (options.onnew) {\n options.onnew();\n }\n }\n });\n\n // create table\n this.table = new Table.View({\n cls : 'ui-table-plain',\n content : ''\n });\n this.$el.append(this.table.$el);\n this.$el.append($('
            ').append(this.button_new.$el));\n\n // reset list\n this.list = {};\n this.n = 0;\n },\n\n /** Number of repeat blocks\n */\n size: function() {\n return this.n;\n },\n\n /** Add new repeat block\n */\n add: function(options) {\n if (!options.id || this.list[options.id]) {\n Galaxy.emit.debug('form-repeat::add()', 'Duplicate repeat block id.');\n return;\n }\n this.n++;\n var button_delete = new Ui.ButtonIcon({\n icon : 'fa-trash-o',\n tooltip : 'Delete this repeat block',\n cls : 'ui-button-icon-plain',\n onclick : function() {\n if (options.ondel) {\n options.ondel();\n }\n }\n });\n var portlet = new Portlet.View({\n id : options.id,\n title : 'placeholder',\n cls : 'ui-portlet-repeat',\n operations : {\n button_delete : button_delete\n }\n });\n portlet.append(options.$el);\n portlet.$el.addClass('section-row');\n this.list[options.id] = portlet;\n this.table.add(portlet.$el);\n this.table.append('row_' + options.id, true);\n if (this.options.max > 0 && this.n >= this.options.max) {\n this.button_new.disable();\n }\n this._refresh();\n },\n\n /** Delete repeat block\n */\n del: function(id) {\n if (!this.list[id]) {\n Galaxy.emit.debug('form-repeat::del()', 'Invalid repeat block id.');\n return;\n }\n this.n--;\n var table_row = this.table.get('row_' + id);\n table_row.remove();\n delete this.list[id];\n this.button_new.enable();\n this._refresh();\n },\n\n /** Hides add/del options\n */\n hideOptions: function() {\n this.button_new.$el.hide();\n _.each( this.list, function( portlet ) {\n portlet.hideOperation('button_delete');\n });\n if( _.isEmpty( this.list ) ) {\n this.$el.append( $('
            ').addClass( 'ui-form-info' ).html( this.options.empty_text ) );\n }\n },\n\n /** Refresh view\n */\n _refresh: function() {\n var index = 0;\n for (var id in this.list) {\n var portlet = this.list[id];\n portlet.title(++index + ': ' + this.options.title);\n if (this.n > this.options.min) {\n portlet.showOperation('button_delete');\n } else {\n portlet.hideOperation('button_delete');\n }\n }\n }\n});\n\nreturn {\n View : View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-repeat.js\n ** module id = 41\n ** module chunks = 0 3\n **/","/**\n This class creates a form section and populates it with input elements. It also handles repeat blocks and conditionals by recursively creating new sub sections.\n*/\ndefine(['utils/utils',\n 'mvc/ui/ui-table',\n 'mvc/ui/ui-misc',\n 'mvc/ui/ui-portlet',\n 'mvc/form/form-repeat',\n 'mvc/form/form-input',\n 'mvc/form/form-parameters'],\n function(Utils, Table, Ui, Portlet, Repeat, InputElement, Parameters) {\n var View = Backbone.View.extend({\n initialize: function(app, options) {\n this.app = app;\n this.inputs = options.inputs;\n\n // fix table style\n options.cls = 'ui-table-plain';\n\n // add table class for tr tag\n // this assist in transforming the form into a json structure\n options.cls_tr = 'section-row';\n\n // create/render views\n this.table = new Table.View(options);\n this.parameters = new Parameters(app, options);\n this.setElement(this.table.$el);\n this.render();\n },\n\n /** Render section view\n */\n render: function() {\n this.table.delAll();\n for (var i in this.inputs) {\n this.add(this.inputs[i]);\n }\n },\n\n /** Add a new input element\n */\n add: function(input) {\n var self = this;\n var input_def = jQuery.extend(true, {}, input);\n input_def.id = input.id = Utils.uid();\n\n // add to sequential list of inputs\n this.app.input_list[input_def.id] = input_def;\n\n // identify field type\n var type = input_def.type;\n switch(type) {\n case 'conditional':\n this._addConditional(input_def);\n break;\n case 'repeat':\n this._addRepeat(input_def);\n break;\n case 'section':\n this._addSection(input_def);\n break;\n default:\n this._addRow(input_def);\n }\n },\n\n /** Add a conditional block\n */\n _addConditional: function(input_def) {\n var self = this;\n input_def.test_param.id = input_def.id;\n this.app.options.sustain_conditionals && ( input_def.test_param.disabled = true );\n var field = this._addRow( input_def.test_param );\n\n // set onchange event for test parameter\n field.options.onchange = function(value) {\n var selectedCase = self.app.data.matchCase(input_def, value);\n for (var i in input_def.cases) {\n var case_def = input_def.cases[i];\n var section_id = input_def.id + '-section-' + i;\n var section_row = self.table.get(section_id);\n var nonhidden = false;\n for (var j in case_def.inputs) {\n if (!case_def.inputs[j].hidden) {\n nonhidden = true;\n break;\n }\n }\n if (i == selectedCase && nonhidden) {\n section_row.fadeIn('fast');\n } else {\n section_row.hide();\n }\n }\n self.app.trigger('change');\n };\n\n // add conditional sub sections\n for (var i in input_def.cases) {\n var sub_section_id = input_def.id + '-section-' + i;\n var sub_section = new View(this.app, {\n inputs : input_def.cases[i].inputs\n });\n sub_section.$el.addClass('ui-table-section');\n this.table.add(sub_section.$el);\n this.table.append(sub_section_id);\n }\n\n // trigger refresh on conditional input field after all input elements have been created\n field.trigger('change');\n },\n\n /** Add a repeat block\n */\n _addRepeat: function(input_def) {\n var self = this;\n var block_index = 0;\n\n // create repeat block element\n var repeat = new Repeat.View({\n title : input_def.title || 'Repeat',\n title_new : input_def.title || '',\n min : input_def.min,\n max : input_def.max,\n onnew : function() {\n create(input_def.inputs);\n self.app.trigger('change');\n }\n });\n\n // helper function to create new repeat blocks\n function create (inputs) {\n var sub_section_id = input_def.id + '-section-' + (block_index++);\n var sub_section = new View(self.app, {\n inputs : inputs\n });\n repeat.add({\n id : sub_section_id,\n $el : sub_section.$el,\n ondel : function() {\n repeat.del(sub_section_id);\n self.app.trigger('change');\n }\n });\n }\n\n //\n // add parsed/minimum number of repeat blocks\n //\n var n_cache = _.size( input_def.cache );\n for ( var i = 0; i < Math.max( Math.max( n_cache, input_def.min ), input_def.default ); i++ ) {\n create( i < n_cache ? input_def.cache[ i ] : input_def.inputs );\n }\n\n // hide options\n this.app.options.sustain_repeats && repeat.hideOptions();\n\n // create input field wrapper\n var input_element = new InputElement(this.app, {\n label : input_def.title || input_def.name,\n help : input_def.help,\n field : repeat\n });\n this.table.add(input_element.$el);\n this.table.append(input_def.id);\n },\n\n /** Add a customized section\n */\n _addSection: function(input_def) {\n var self = this;\n\n // create sub section\n var sub_section = new View(self.app, {\n inputs : input_def.inputs\n });\n\n // delete button\n var button_visible = new Ui.ButtonIcon({\n icon : 'fa-eye-slash',\n tooltip : 'Show/hide section',\n cls : 'ui-button-icon-plain'\n });\n\n // create portlet for sub section\n var portlet = new Portlet.View({\n title : input_def.title || input_def.name,\n cls : 'ui-portlet-section',\n collapsible : true,\n collapsed : true,\n operations : {\n button_visible: button_visible\n }\n });\n portlet.append( sub_section.$el );\n portlet.append( $( '
            ' ).addClass( 'ui-form-info' ).html( input_def.help ) );\n portlet.setOperation( 'button_visible', function() {\n if( portlet.collapsed ) {\n portlet.expand();\n } else {\n portlet.collapse();\n }\n });\n\n // add expansion event handler\n portlet.on( 'expanded', function() {\n button_visible.setIcon( 'fa-eye' );\n });\n portlet.on( 'collapsed', function() {\n button_visible.setIcon( 'fa-eye-slash' );\n });\n this.app.on( 'expand', function( input_id ) {\n ( portlet.$( '#' + input_id ).length > 0 ) && portlet.expand();\n });\n\n // show sub section if requested\n input_def.expanded && portlet.expand();\n\n // create table row\n this.table.add(portlet.$el);\n this.table.append(input_def.id);\n },\n\n /** Add a single input field element\n */\n _addRow: function(input_def) {\n var id = input_def.id;\n var field = this.parameters.create(input_def);\n this.app.field_list[id] = field;\n var input_element = new InputElement(this.app, {\n name : input_def.name,\n label : input_def.label || input_def.name,\n value : input_def.value,\n default_value : input_def.default_value,\n text_value : input_def.text_value || input_def.value,\n collapsible_value : input_def.collapsible_value,\n collapsible_preview : input_def.collapsible_preview,\n help : input_def.help,\n argument : input_def.argument,\n disabled : input_def.disabled,\n field : field\n });\n this.app.element_list[id] = input_element;\n this.table.add(input_element.$el);\n this.table.append(id);\n input_def.hidden && this.table.get(id).hide();\n return field;\n }\n });\n\n return {\n View: View\n };\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-section.js\n ** module id = 42\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Utils, Ui, Tabs) {\n// hda/hdca content selector ui element\nvar View = Backbone.View.extend({\n // initialize\n initialize : function(app, options) {\n // link app and options\n this.app = app;\n this.options = options;\n\n // track current history elements\n this.history = {};\n\n\n // link this\n var self = this;\n\n // add element\n this.setElement('
            ');\n\n // list of select fieldsFormSection\n this.list = {};\n\n // radio button options\n var radio_buttons = [];\n\n // identify selector type\n if (options.type == 'data_collection') {\n this.mode = 'collection';\n } else {\n if (options.multiple) {\n this.mode = 'multiple';\n } else {\n this.mode = 'single';\n }\n }\n\n // set initial state\n this.current = this.mode;\n this.list = {};\n\n // error messages\n var extensions = Utils.textify(options.extensions);\n var hda_error = 'No dataset available.';\n if (extensions) {\n hda_error = 'No ' + extensions + ' dataset available.';\n }\n var hdca_error = 'No dataset list available.';\n if (extensions) {\n hdca_error = 'No ' + extensions + ' dataset collection available.';\n }\n\n // add single dataset selector\n if (this.mode == 'single') {\n radio_buttons.push({\n icon : 'fa-file-o',\n value : 'single',\n tooltip : 'Single dataset'\n });\n this.select_single = new Ui.Select.View({\n optional : options.optional,\n error_text : hda_error,\n onchange : function() {\n self.trigger('change');\n }\n });\n this.list['single'] = {\n field: this.select_single,\n type : 'hda'\n };\n }\n\n // add multiple dataset selector\n if (this.mode == 'single' || this.mode == 'multiple') {\n radio_buttons.push({\n icon : 'fa-files-o',\n value : 'multiple',\n tooltip : 'Multiple datasets'\n });\n this.select_multiple = new Ui.Select.View({\n multiple : true,\n searchable : false,\n optional : options.optional,\n error_text : hda_error,\n onchange : function() {\n self.trigger('change');\n }\n });\n this.list['multiple'] = {\n field: this.select_multiple,\n type : 'hda'\n };\n }\n\n // add collection selector\n if (this.mode == 'single' || this.mode == 'multiple' || this.mode == 'collection') {\n radio_buttons.push({\n icon : 'fa-folder-o',\n value : 'collection',\n tooltip : 'Dataset collection'\n });\n var multiple = this.mode == 'multiple';\n this.select_collection = new Ui.Select.View({\n error_text : hdca_error,\n multiple : multiple,\n searchable : false,\n optional : options.optional,\n onchange : function() {\n self.trigger('change');\n }\n });\n this.list['collection'] = {\n field: this.select_collection,\n type : 'hdca'\n };\n }\n\n // create button\n this.button_type = new Ui.RadioButton.View({\n value : this.current,\n data : radio_buttons,\n onchange: function(value) {\n self.current = value;\n self.refresh();\n self.trigger('change');\n }\n });\n\n // add batch mode information\n this.$batch = $(this.template_batch());\n\n // number of radio buttons\n var n_buttons = _.size(this.list);\n\n // add button to dom\n var button_width = 0;\n if (n_buttons > 1) {\n this.$el.append(this.button_type.$el);\n button_width = Math.max(0, _.size(this.list) * 35) + 'px';\n }\n\n // append field elements\n for (var i in this.list) {\n this.$el.append(this.list[i].field.$el.css({\n 'margin-left': button_width\n }));\n }\n\n // append batch message\n this.$el.append(this.$batch.css({\n 'margin-left': button_width\n }));\n\n // update options\n this.update(options.data);\n\n // set initial value\n if (this.options.value !== undefined) {\n this.value(this.options.value);\n }\n\n // refresh view\n this.refresh();\n\n // add change event. fires on trigger\n this.on('change', function() {\n if (options.onchange) {\n options.onchange(self.value());\n }\n });\n },\n\n /** Indicate that select fields are being updated */\n wait: function() {\n for (var i in this.list) {\n this.list[i].field.wait();\n }\n },\n\n /** Indicate that the options update has been completed */\n unwait: function() {\n for (var i in this.list) {\n this.list[i].field.unwait();\n }\n },\n\n /** Update content selector */\n update: function(options) {\n // update a particular select field\n var self = this;\n function _update(field, options) {\n if (field) {\n // identify available options\n var select_options = [];\n for (var i in options) {\n var item = options[i];\n select_options.push({\n hid : item.hid,\n label: item.hid + ': ' + item.name,\n value: item.id\n });\n // backup to local history\n self.history[item.id + '_' + item.src] = item;\n }\n // update field\n field.add( select_options, function( a, b ) { return b.hid - a.hid } );\n }\n }\n\n // update available options\n _update(this.select_single, options.hda);\n _update(this.select_multiple, options.hda);\n _update(this.select_collection, options.hdca);\n },\n\n /** Return the currently selected dataset values */\n value : function (new_value) {\n // update current value\n if (new_value !== undefined) {\n if (new_value && new_value.values) {\n try {\n // create list with values\n var list = [];\n for (var i in new_value.values) {\n list.push(new_value.values[i].id);\n }\n\n // identify suitable select field\n if (new_value && new_value.values.length > 0 && new_value.values[0].src == 'hdca') {\n this.current = 'collection';\n this.select_collection.value(list);\n } else {\n if (this.mode == 'multiple') {\n this.current = 'multiple';\n this.select_multiple.value(list);\n } else {\n this.current = 'single';\n this.select_single.value(list[0]);\n }\n }\n } catch (err) {\n Galaxy.emit.debug('tools-select-content::value()', 'Skipped.');\n }\n } else {\n for (var i in this.list) {\n this.list[i].field.value(null);\n }\n }\n }\n\n // refresh view\n this.refresh();\n\n // validate value\n var id_list = this._select().value();\n if (id_list === null) {\n return null;\n }\n\n // transform into an array\n if (!(id_list instanceof Array)) {\n id_list = [id_list];\n }\n\n // check if value exists\n if (id_list.length === 0) {\n return null;\n }\n\n // prepare result dict\n var result = {\n batch : this._batch(),\n values : []\n }\n\n // append to dataset ids\n for (var i in id_list) {\n var details = this.history[id_list[i] + '_' + this.list[this.current].type];\n if (details) {\n result.values.push(details);\n } else {\n return null;\n }\n }\n\n // sort by history ids\n result.values.sort(function(a, b){\n return a.hid - b.hid;\n });\n\n // return\n return result;\n },\n\n /** Refreshes data selection view */\n refresh: function() {\n this.button_type.value(this.current);\n for (var i in this.list) {\n var $el = this.list[i].field.$el;\n if (this.current == i) {\n $el.show();\n } else {\n $el.hide();\n }\n }\n if (this._batch()) {\n this.$batch.show();\n } else {\n this.$batch.hide();\n }\n },\n\n /** Assists in selecting the current field */\n _select: function() {\n return this.list[this.current].field;\n },\n\n /** Assists in identifying the batch mode */\n _batch: function() {\n if (this.current == 'collection') {\n var hdca = this.history[this._select().value() + '_hdca'];\n if (hdca && hdca.map_over_type) {\n return true;\n }\n }\n if (this.current != 'single') {\n if (this.mode == 'single') {\n return true;\n }\n }\n return false;\n },\n\n /** Batch message template */\n template_batch: function() {\n return '
            ' +\n '' +\n 'This is a batch mode input field. A separate job will be triggered for each dataset.' +\n '
            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-select-content.js\n ** module id = 43\n ** module chunks = 0 3\n **/","/**\n This is the main class of the form plugin. It is referenced as 'app' in all lower level modules.\n*/\ndefine(['utils/utils', 'mvc/ui/ui-portlet', 'mvc/ui/ui-misc', 'mvc/form/form-section', 'mvc/form/form-data'],\n function(Utils, Portlet, Ui, FormSection, FormData) {\n return Backbone.View.extend({\n initialize: function(options) {\n this.options = Utils.merge(options, {\n initial_errors : false,\n cls : 'ui-portlet-limited',\n icon : ''\n });\n this.modal = ( parent.Galaxy && parent.Galaxy.modal ) || new Ui.Modal.View();\n this.setElement('
            ');\n this.render();\n },\n\n /** Update available options */\n update: function(new_model){\n var self = this;\n this.data.matchModel(new_model, function(input_id, node) {\n var input = self.input_list[input_id];\n if (input && input.options) {\n if (!_.isEqual(input.options, node.options)) {\n // backup new options\n input.options = node.options;\n\n // get/update field\n var field = self.field_list[input_id];\n if (field.update) {\n var new_options = [];\n if ((['data', 'data_collection', 'drill_down']).indexOf(input.type) != -1) {\n new_options = input.options;\n } else {\n for (var i in node.options) {\n var opt = node.options[i];\n if (opt.length > 2) {\n new_options.push({\n 'label': opt[0],\n 'value': opt[1]\n });\n }\n }\n }\n field.update(new_options);\n field.trigger('change');\n Galaxy.emit.debug('form-view::update()', 'Updating options for ' + input_id);\n }\n }\n }\n });\n },\n\n /** Set form into wait mode */\n wait: function(active) {\n for (var i in this.input_list) {\n var field = this.field_list[i];\n var input = this.input_list[i];\n if (input.is_dynamic && field.wait && field.unwait) {\n if (active) {\n field.wait();\n } else {\n field.unwait();\n }\n }\n }\n },\n\n /** Highlight and scroll to input element (currently only used for error notifications)\n */\n highlight: function (input_id, message, silent) {\n // get input field\n var input_element = this.element_list[input_id];\n\n // check input element\n if (input_element) {\n // mark error\n input_element.error(message || 'Please verify this parameter.');\n\n // trigger expand event for parent containers\n this.trigger('expand', input_id);\n\n // scroll to first input element\n if (!silent) {\n if (self==top) {\n var $panel = this.$el.parents().filter(function() {\n return $(this).css('overflow') == 'auto';\n }).first();\n $panel.animate({ scrollTop : $panel.scrollTop() + input_element.$el.offset().top - 50 }, 500);\n } else {\n $('html, body').animate({ scrollTop : input_element.$el.offset().top - 20 }, 500);\n }\n }\n }\n },\n\n /** Highlights errors\n */\n errors: function(options) {\n // hide previous error statements\n this.trigger('reset');\n\n // highlight all errors\n if (options && options.errors) {\n var error_messages = this.data.matchResponse(options.errors);\n for (var input_id in this.element_list) {\n var input = this.element_list[input_id];\n if (error_messages[input_id]) {\n this.highlight(input_id, error_messages[input_id], true);\n }\n }\n }\n },\n\n /** Render tool form\n */\n render: function() {\n // link this\n var self = this;\n\n // reset events\n this.off('change');\n this.off('reset');\n\n // reset field list, which contains the input field elements\n this.field_list = {};\n\n // reset sequential input definition list, which contains the input definitions as provided from the api\n this.input_list = {};\n\n // reset input element list, which contains the dom elements of each input element (includes also the input field)\n this.element_list = {};\n\n // creates a json data structure from the input form\n this.data = new FormData.Manager(this);\n\n // create ui elements\n this._renderForm();\n\n // refresh data\n this.data.create();\n\n // show errors on startup\n if (this.options.initial_errors) {\n this.errors(this.options);\n }\n\n // add listener which triggers on checksum change\n var current_check = this.data.checksum();\n this.on('change', function() {\n var new_check = self.data.checksum();\n if (new_check != current_check) {\n current_check = new_check;\n self.options.onchange && self.options.onchange();\n }\n });\n\n // add reset listener\n this.on('reset', function() {\n for (var i in this.element_list) {\n this.element_list[i].reset();\n }\n });\n return this;\n },\n\n /** Renders the UI elements required for the form\n */\n _renderForm: function() {\n // create message view\n this.message = new Ui.Message();\n\n // create tool form section\n this.section = new FormSection.View(this, {\n inputs : this.options.inputs\n });\n\n // remove tooltips\n $( '.tooltip' ).remove();\n\n // create portlet\n this.portlet = new Portlet.View({\n icon : this.options.icon,\n title : this.options.title,\n cls : this.options.cls,\n operations : this.options.operations,\n buttons : this.options.buttons,\n collapsible : this.options.collapsible,\n collapsed : this.options.collapsed\n });\n\n // append message\n this.portlet.append(this.message.$el.addClass('ui-margin-top'));\n\n // append tool section\n this.portlet.append(this.section.$el);\n\n // start form\n this.$el.empty();\n this.$el.append(this.portlet.$el);\n\n // show message if available in model\n if (this.options.message) {\n this.message.update({\n persistent : true,\n status : 'warning',\n message : this.options.message\n });\n }\n\n // log\n Galaxy.emit.debug('form-view::initialize()', 'Completed');\n }\n });\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-view.js\n ** module id = 44\n ** module chunks = 0 3\n **/","define([\n \"mvc/collection/collection-model\",\n \"mvc/history/history-content-model\",\n \"utils/localization\"\n], function( DC_MODEL, HISTORY_CONTENT, _l ){\n/*==============================================================================\n\nModels for DatasetCollections contained within a history.\n\nTODO:\n these might be compactable to one class if some duplication with\n collection-model is used.\n\n==============================================================================*/\nvar hcontentMixin = HISTORY_CONTENT.HistoryContentMixin,\n ListDC = DC_MODEL.ListDatasetCollection,\n PairDC = DC_MODEL.PairDatasetCollection,\n ListPairedDC = DC_MODEL.ListPairedDatasetCollection;\n\n//==============================================================================\n/** Override to post to contents route w/o id. */\nfunction buildHDCASave( _super ){\n return function _save( attributes, options ){\n if( this.isNew() ){\n options = options || {};\n options.url = this.urlRoot + this.get( 'history_id' ) + '/contents';\n attributes = attributes || {};\n attributes.type = 'dataset_collection';\n }\n return _super.call( this, attributes, options );\n };\n}\n\n\n//==============================================================================\n/** @class Backbone model for List Dataset Collection within a History.\n */\nvar HistoryListDatasetCollection = ListDC.extend( hcontentMixin ).extend(\n/** @lends HistoryListDatasetCollection.prototype */{\n\n defaults : _.extend( _.clone( ListDC.prototype.defaults ), {\n history_content_type: 'dataset_collection',\n collection_type : 'list',\n model_class : 'HistoryDatasetCollectionAssociation'\n }),\n\n initialize : function( model, options ){\n ListDC.prototype.initialize.call( this, model, options );\n hcontentMixin.initialize.call( this, model, options );\n },\n\n /** Override to post to contents route w/o id. */\n save : buildHDCASave( ListDC.prototype.save ),\n\n /** String representation. */\n toString : function(){\n return ([ 'HistoryListDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone model for Pair Dataset Collection within a History.\n * @constructs\n */\nvar HistoryPairDatasetCollection = PairDC.extend( hcontentMixin ).extend(\n/** @lends HistoryPairDatasetCollection.prototype */{\n\n defaults : _.extend( _.clone( PairDC.prototype.defaults ), {\n history_content_type: 'dataset_collection',\n collection_type : 'paired',\n model_class : 'HistoryDatasetCollectionAssociation'\n }),\n\n initialize : function( model, options ){\n PairDC.prototype.initialize.call( this, model, options );\n hcontentMixin.initialize.call( this, model, options );\n },\n\n /** Override to post to contents route w/o id. */\n save : buildHDCASave( PairDC.prototype.save ),\n\n /** String representation. */\n toString : function(){\n return ([ 'HistoryPairDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone model for List of Pairs Dataset Collection within a History.\n * @constructs\n */\nvar HistoryListPairedDatasetCollection = ListPairedDC.extend( hcontentMixin ).extend(\n/** @lends HistoryListPairedDatasetCollection.prototype */{\n\n defaults : _.extend( _.clone( ListPairedDC.prototype.defaults ), {\n history_content_type: 'dataset_collection',\n collection_type : 'list:paired',\n model_class : 'HistoryDatasetCollectionAssociation'\n }),\n\n initialize : function( model, options ){\n ListPairedDC.prototype.initialize.call( this, model, options );\n hcontentMixin.initialize.call( this, model, options );\n },\n\n /** Override to post to contents route w/o id. */\n save : buildHDCASave( ListPairedDC.prototype.save ),\n\n /** String representation. */\n toString : function(){\n return ([ 'HistoryListPairedDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n return {\n HistoryListDatasetCollection : HistoryListDatasetCollection,\n HistoryPairDatasetCollection : HistoryPairDatasetCollection,\n HistoryListPairedDatasetCollection : HistoryListPairedDatasetCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hdca-model.js\n ** module id = 45\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/states\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( STATES, BASE_MVC, _l ){\n\nvar logNamespace = 'history';\n//==============================================================================\n/** How the type_id attribute is built for the history's mixed contents collection */\nvar typeIdStr = function _typeIdStr( type, id ){\n return [ type, id ].join( '-' );\n};\n\n//==============================================================================\n/** @class Mixin for HistoryContents content (HDAs, HDCAs).\n */\nvar HistoryContentMixin = {\n//TODO:?? into true Backbone.Model?\n\n /** default attributes for a model */\n defaults : {\n /** parent (containing) history */\n history_id : null,\n /** some content_type (HistoryContents can contain mixed model classes) */\n history_content_type: null,\n /** indicating when/what order the content was generated in the context of the history */\n hid : null,\n /** whether the user wants the content shown (visible) */\n visible : true\n },\n\n // ........................................................................ mixed content element\n//TODO: there's got to be a way to move this into HistoryContents - if we can do that, this class might not be needed\n // In order to be part of a MIXED bbone collection, we can't rely on the id\n // (which may collide btwn models of different classes)\n // Build a new id (type_id) that prefixes the history_content_type so the bbone collection can differentiate\n idAttribute : 'type_id',\n\n /** override constructor to build type_id and insert into original attributes */\n constructor : function( attrs, options ){\n attrs.type_id = typeIdStr( attrs.history_content_type, attrs.id );\n this.debug( 'HistoryContentMixin.constructor:', attrs.type_id );\n Backbone.Model.apply( this, arguments );\n },\n\n /** object level fn for building the type_id string */\n _typeIdStr : function(){\n return typeIdStr( this.get( 'history_content_type' ), this.get( 'id' ) );\n },\n\n /** add listener to re-create type_id when the id changes */\n initialize : function( attrs, options ){\n this.on( 'change:id', this._createTypeId );\n },\n\n /** set the type_id in the model attributes */\n _createTypeId : function(){\n this.set( 'type_id', this._typeIdStr() );\n },\n\n /** override because backbone tests boolean( idAttribute ), but it's not an empty string even for new models\n * due to our use of type_id.\n */\n isNew : function(){\n return !this.get( 'id' );\n },\n\n // ........................................................................ common queries\n /** the more common alias of visible */\n hidden : function(){\n return !this.get( 'visible' );\n },\n\n /** based on show_deleted, show_hidden (gen. from the container control),\n * would this ds show in the list of ds's?\n * @param {Boolean} show_deleted are we showing deleted hdas?\n * @param {Boolean} show_hidden are we showing hidden hdas?\n */\n isVisible : function( show_deleted, show_hidden ){\n//TODO:?? Another unfortunate name collision\n var isVisible = true;\n if( ( !show_deleted )\n && ( this.get( 'deleted' ) || this.get( 'purged' ) ) ){\n isVisible = false;\n }\n if( ( !show_hidden )\n && ( !this.get( 'visible' ) ) ){\n isVisible = false;\n }\n return isVisible;\n },\n\n // ........................................................................ ajax\n//TODO: global\n//TODO: these are probably better done on the leaf classes\n /** history content goes through the 'api/histories' API */\n urlRoot: Galaxy.root + 'api/histories/',\n\n /** full url spec. for this content */\n url : function(){\n var url = this.urlRoot + this.get( 'history_id' ) + '/contents/'\n + this.get('history_content_type') + 's/' + this.get( 'id' );\n return url;\n },\n\n /** save this content as not visible */\n hide : function( options ){\n if( !this.get( 'visible' ) ){ return jQuery.when(); }\n return this.save( { visible: false }, options );\n },\n /** save this content as visible */\n unhide : function( options ){\n if( this.get( 'visible' ) ){ return jQuery.when(); }\n return this.save( { visible: true }, options );\n },\n\n // ........................................................................ misc\n /** String representation */\n toString : function(){\n var nameAndId = this.get( 'id' ) || '';\n if( this.get( 'name' ) ){\n nameAndId = this.get( 'hid' ) + ' :\"' + this.get( 'name' ) + '\",' + nameAndId;\n }\n return 'HistoryContent(' + nameAndId + ')';\n }\n};\n\n\n//==============================================================================\n//TODO: needed?\n/** @class (Concrete/non-mixin) base model for content items.\n */\nvar HistoryContent = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( HistoryContentMixin )\n .extend({ _logNamespace : logNamespace });\n\n\n//==============================================================================\n return {\n typeIdStr : typeIdStr,\n HistoryContentMixin : HistoryContentMixin,\n HistoryContent : HistoryContent\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-content-model.js\n ** module id = 46\n ** module chunks = 3\n **/","define([\n \"mvc/history/history-content-model\",\n \"mvc/history/hda-model\",\n \"mvc/history/hdca-model\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( HISTORY_CONTENT, HDA_MODEL, HDCA_MODEL, BASE_MVC, _l ){\n\nvar logNamespace = 'history';\n//==============================================================================\n/** @class Backbone collection for history content.\n * NOTE: history content seems like a dataset collection, but differs in that it is mixed:\n * each element can be either an HDA (dataset) or a DatasetCollection and co-exist on\n * the same level.\n * Dataset collections on the other hand are not mixed and (so far) can only contain either\n * HDAs or child dataset collections on one level.\n * This is why this does not inherit from any of the DatasetCollections (currently).\n */\nvar HistoryContents = Backbone.Collection\n .extend( BASE_MVC.LoggableMixin )\n .extend(/** @lends HistoryContents.prototype */{\n//TODO:?? may want to inherit from some MixedModelCollection\n//TODO:?? also consider inheriting from a 'DatasetList'\n//TODO: can we decorate the mixed models using the model fn below (instead of having them build their own type_id)?\n\n _logNamespace : logNamespace,\n\n /** since history content is a mix, override model fn into a factory, creating based on history_content_type */\n model : function( attrs, options ) {\n//TODO: can we move the type_id stuff here?\n //attrs.type_id = typeIdStr( attrs );\n\n if( attrs.history_content_type === \"dataset\" ) {\n return new HDA_MODEL.HistoryDatasetAssociation( attrs, options );\n\n } else if( attrs.history_content_type === \"dataset_collection\" ) {\n switch( attrs.collection_type ){\n case 'list':\n return new HDCA_MODEL.HistoryListDatasetCollection( attrs, options );\n case 'paired':\n return new HDCA_MODEL.HistoryPairDatasetCollection( attrs, options );\n case 'list:paired':\n return new HDCA_MODEL.HistoryListPairedDatasetCollection( attrs, options );\n }\n // This is a hack inside a hack:\n // Raise a plain object with validationError to fake a model.validationError\n // (since we don't have a model to use validate with)\n // (the outer hack being the mixed content/model function in this collection)\n return { validationError : 'Unknown collection_type: ' + attrs.history_content_type };\n }\n return { validationError : 'Unknown history_content_type: ' + attrs.history_content_type };\n },\n\n /** Set up.\n * @see Backbone.Collection#initialize\n */\n initialize : function( models, options ){\n options = options || {};\n//TODO: could probably use the contents.history_id instead\n this.historyId = options.historyId;\n //this._setUpListeners();\n\n // backbonejs uses collection.model.prototype.idAttribute to determine if a model is *already* in a collection\n // and either merged or replaced. In this case, our 'model' is a function so we need to add idAttribute\n // manually here - if we don't, contents will not merge but be replaced/swapped.\n this.model.prototype.idAttribute = 'type_id';\n\n this.on( 'all', function(){\n this.debug( this + '.event:', arguments );\n });\n },\n\n /** root api url */\n urlRoot : Galaxy.root + 'api/histories',\n /** complete api url */\n url : function(){\n return this.urlRoot + '/' + this.historyId + '/contents';\n },\n\n // ........................................................................ common queries\n /** Get the ids of every item in this collection\n * @returns array of encoded ids\n */\n ids : function(){\n//TODO: is this still useful since type_id\n return this.map( function( item ){ return item.get('id'); });\n },\n\n /** Get contents that are not ready\n * @returns array of content models\n */\n notReady : function(){\n return this.filter( function( content ){\n return !content.inReadyState();\n });\n },\n\n /** Get the id of every model in this collection not in a 'ready' state (running).\n * @returns an array of model ids\n * @see HistoryDatasetAssociation#inReadyState\n */\n running : function(){\n var idList = [];\n this.each( function( item ){\n var isRunning = !item.inReadyState();\n if( isRunning ){\n//TODO: is this still correct since type_id\n idList.push( item.get( 'id' ) );\n }\n });\n return idList;\n },\n\n /** Get the model with the given hid\n * @param {Int} hid the hid to search for\n * @returns {HistoryDatasetAssociation} the model with the given hid or undefined if not found\n */\n getByHid : function( hid ){\n return _.first( this.filter( function( content ){ return content.get( 'hid' ) === hid; }) );\n },\n\n //TODO:?? this may belong in the containing view\n /** Get every 'shown' model in this collection based on show_deleted/hidden\n * @param {Boolean} show_deleted are we showing deleted content?\n * @param {Boolean} show_hidden are we showing hidden content?\n * @returns array of content models\n * @see HistoryDatasetAssociation#isVisible\n */\n getVisible : function( show_deleted, show_hidden, filters ){\n filters = filters || [];\n //this.debug( 'filters:', filters );\n // always filter by show deleted/hidden first\n this.debug( 'checking isVisible' );\n var filteredHdas = new HistoryContents( this.filter( function( item ){\n return item.isVisible( show_deleted, show_hidden );\n }));\n\n _.each( filters, function( filterFn ){\n if( !_.isFunction( filterFn ) ){ return; }\n filteredHdas = new HistoryContents( filteredHdas.filter( filterFn ) );\n });\n return filteredHdas;\n },\n\n /** return a new contents collection of only hidden items */\n hidden : function(){\n function filterFn( c ){ return c.hidden(); }\n return new HistoryContents( this.filter( filterFn ) );\n },\n\n /** return a new contents collection of only hidden items */\n deleted : function(){\n function filterFn( c ){ return c.get( 'deleted' ); }\n return new HistoryContents( this.filter( filterFn ) );\n },\n\n /** return true if any contents don't have details */\n haveDetails : function(){\n return this.all( function( content ){ return content.hasDetails(); });\n },\n\n // ........................................................................ ajax\n /** fetch detailed model data for all contents in this collection */\n fetchAllDetails : function( options ){\n options = options || {};\n var detailsFlag = { details: 'all' };\n options.data = ( options.data )?( _.extend( options.data, detailsFlag ) ):( detailsFlag );\n return this.fetch( options );\n },\n\n /** using a queue, perform ajaxFn on each of the models in this collection */\n ajaxQueue : function( ajaxFn, options ){\n var deferred = jQuery.Deferred(),\n startingLength = this.length,\n responses = [];\n\n if( !startingLength ){\n deferred.resolve([]);\n return deferred;\n }\n\n // use reverse order (stylistic choice)\n var ajaxFns = this.chain().reverse().map( function( content, i ){\n return function(){\n var xhr = ajaxFn.call( content, options );\n // if successful, notify using the deferred to allow tracking progress\n xhr.done( function( response ){\n deferred.notify({ curr: i, total: startingLength, response: response, model: content });\n });\n // (regardless of previous error or success) if not last ajax call, shift and call the next\n // if last fn, resolve deferred\n xhr.always( function( response ){\n responses.push( response );\n if( ajaxFns.length ){\n ajaxFns.shift()();\n } else {\n deferred.resolve( responses );\n }\n });\n };\n }).value();\n // start the queue\n ajaxFns.shift()();\n\n return deferred;\n },\n\n isCopyable : function( contentsJSON ){\n var copyableModelClasses = [\n 'HistoryDatasetAssociation',\n 'HistoryDatasetCollectionAssociation'\n ];\n return ( ( _.isObject( contentsJSON ) && contentsJSON.id )\n && ( _.contains( copyableModelClasses, contentsJSON.model_class ) ) );\n },\n\n /** copy an existing, accessible hda into this collection */\n copy : function( json ){\n var id, type, contentType;\n if( _.isString( json ) ){\n id = json;\n contentType = 'hda';\n type = 'dataset';\n } else {\n id = json.id;\n contentType = ({\n 'HistoryDatasetAssociation' : 'hda',\n 'LibraryDatasetDatasetAssociation' : 'ldda',\n 'HistoryDatasetCollectionAssociation' : 'hdca'\n })[ json.model_class ] || 'hda';\n type = ( contentType === 'hdca'? 'dataset_collection' : 'dataset' );\n }\n var collection = this,\n xhr = jQuery.post( this.url(), {\n content : id,\n source : contentType,\n type : type\n })\n .done( function( response ){\n collection.add([ response ]);\n })\n .fail( function( error, status, message ){\n collection.trigger( 'error', collection, xhr, {},\n 'Error copying contents', { type: type, id: id, source: contentType });\n });\n return xhr;\n },\n\n // ........................................................................ sorting/filtering\n /** return a new collection of contents whose attributes contain the substring matchesWhat */\n matches : function( matchesWhat ){\n return this.filter( function( content ){\n return content.matches( matchesWhat );\n });\n },\n\n // ........................................................................ misc\n /** override to ensure type id is set */\n set : function( models, options ){\n models = _.isArray( models )? models : [ models ];\n _.each( models, function( model ){\n if( !model.type_id || !model.get || !model.get( 'type_id' ) ){\n model.type_id = HISTORY_CONTENT.typeIdStr( model.history_content_type, model.id );\n }\n });\n Backbone.Collection.prototype.set.call( this, models, options );\n },\n\n /** */\n createHDCA : function( elementIdentifiers, collectionType, name, options ){\n //precondition: elementIdentifiers is an array of plain js objects\n // in the proper form to create the collectionType\n var contents = this,\n typeToModel = {\n list : HDCA_MODEL.HistoryListDatasetCollection,\n paired : HDCA_MODEL.HistoryPairDatasetCollection\n },\n hdca = new (typeToModel[ collectionType ])({\n history_id : this.historyId,\n name : name,\n // should probably be able to just send in a bunch of json here and restruct per class\n element_identifiers : elementIdentifiers\n });\n // do I even need to use new above, can I just pass the attrs here\n return hdca.save()\n .done( function( response ){\n contents.add( hdca );\n })\n .fail( function( xhr, status, message ){\n contents.trigger( 'error', xhr, status, message );\n });\n },\n\n\n /** In this override, copy the historyId to the clone */\n clone : function(){\n var clone = Backbone.Collection.prototype.clone.call( this );\n clone.historyId = this.historyId;\n return clone;\n },\n\n /** debugging */\n print : function(){\n var contents = this;\n contents.each( function( c ){\n contents.debug( c );\n if( c.elements ){\n contents.debug( '\\t elements:', c.elements );\n }\n });\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'HistoryContents(', [ this.historyId, this.length ].join(), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n return {\n HistoryContents : HistoryContents\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-contents.js\n ** module id = 47\n ** module chunks = 3\n **/","define([\n 'mvc/base-mvc',\n 'utils/localization'\n], function( BASE_MVC, _l ){\n\nvar logNamespace = 'list';\n//==============================================================================\n/** A view which, when first rendered, shows only summary data/attributes, but\n * can be expanded to show further details (and optionally fetch those\n * details from the server).\n */\nvar ExpandableView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n//TODO: Although the reasoning behind them is different, this shares a lot with HiddenUntilActivated above: combine them\n //PRECONDITION: model must have method hasDetails\n //PRECONDITION: subclasses must have templates.el and templates.details\n\n initialize : function( attributes ){\n /** are the details of this view expanded/shown or not? */\n this.expanded = attributes.expanded || false;\n this.log( '\\t expanded:', this.expanded );\n this.fxSpeed = attributes.fxSpeed !== undefined? attributes.fxSpeed : this.fxSpeed;\n },\n\n // ........................................................................ render main\n /** jq fx speed */\n fxSpeed : 'fast',\n\n /** Render this content, set up ui.\n * @param {Number or String} speed the speed of the render\n */\n render : function( speed ){\n var $newRender = this._buildNewRender();\n this._setUpBehaviors( $newRender );\n this._queueNewRender( $newRender, speed );\n return this;\n },\n\n /** Build a temp div containing the new children for the view's $el.\n * If the view is already expanded, build the details as well.\n */\n _buildNewRender : function(){\n // create a new render using a skeleton template, render title buttons, render body, and set up events, etc.\n var $newRender = $( this.templates.el( this.model.toJSON(), this ) );\n if( this.expanded ){\n this.$details( $newRender ).replaceWith( this._renderDetails().show() );\n }\n return $newRender;\n },\n\n /** Fade out the old el, swap in the new contents, then fade in.\n * @param {Number or String} speed jq speed to use for rendering effects\n * @fires rendered when rendered\n */\n _queueNewRender : function( $newRender, speed ) {\n speed = ( speed === undefined )?( this.fxSpeed ):( speed );\n var view = this;\n\n $( view ).queue( 'fx', [\n function( next ){ this.$el.fadeOut( speed, next ); },\n function( next ){\n view._swapNewRender( $newRender );\n next();\n },\n function( next ){ this.$el.fadeIn( speed, next ); },\n function( next ){\n this.trigger( 'rendered', view );\n next();\n }\n ]);\n },\n\n /** empty out the current el, move the $newRender's children in */\n _swapNewRender : function( $newRender ){\n return this.$el.empty()\n .attr( 'class', _.isFunction( this.className )? this.className(): this.className )\n .append( $newRender.children() );\n },\n\n /** set up js behaviors, event handlers for elements within the given container\n * @param {jQuery} $container jq object that contains the elements to process (defaults to this.$el)\n */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n // set up canned behavior on children (bootstrap, popupmenus, editable_text, etc.)\n //make_popup_menus( $where );\n $where.find( '[title]' ).tooltip({ placement : 'bottom' });\n },\n\n // ......................................................................... details\n /** shortcut to details DOM (as jQ) */\n $details : function( $where ){\n $where = $where || this.$el;\n return $where.find( '> .details' );\n },\n\n /** build the DOM for the details and set up behaviors on it */\n _renderDetails : function(){\n var $newDetails = $( this.templates.details( this.model.toJSON(), this ) );\n this._setUpBehaviors( $newDetails );\n return $newDetails;\n },\n\n // ......................................................................... expansion/details\n /** Show or hide the details\n * @param {Boolean} expand if true, expand; if false, collapse\n */\n toggleExpanded : function( expand ){\n expand = ( expand === undefined )?( !this.expanded ):( expand );\n if( expand ){\n this.expand();\n } else {\n this.collapse();\n }\n return this;\n },\n\n /** Render and show the full, detailed body of this view including extra data and controls.\n * note: if the model does not have detailed data, fetch that data before showing the body\n * @fires expanded when a body has been expanded\n */\n expand : function(){\n var view = this;\n return view._fetchModelDetails().always( function(){\n view._expand();\n });\n },\n\n /** Check for model details and, if none, fetch them.\n * @returns {jQuery.promise} the model.fetch.xhr if details are being fetched, an empty promise if not\n */\n _fetchModelDetails : function(){\n if( !this.model.hasDetails() ){\n return this.model.fetch();\n }\n return jQuery.when();\n },\n\n /** Inner fn called when expand (public) has fetched the details */\n _expand : function(){\n var view = this,\n $newDetails = view._renderDetails();\n view.$details().replaceWith( $newDetails );\n // needs to be set after the above or the slide will not show\n view.expanded = true;\n view.$details().slideDown({\n duration : view.fxSpeed,\n step: function(){\n view.trigger( 'expanding', view );\n },\n complete: function(){\n view.trigger( 'expanded', view );\n }\n });\n },\n\n /** Hide the body/details of an HDA.\n * @fires collapsed when a body has been collapsed\n */\n collapse : function(){\n this.debug( this + '(ExpandableView).collapse' );\n var view = this;\n view.expanded = false;\n this.$details().slideUp({\n duration : view.fxSpeed,\n step: function(){\n view.trigger( 'collapsing', view );\n },\n complete: function(){\n view.trigger( 'collapsed', view );\n }\n });\n }\n\n});\n\n\n//==============================================================================\n/** A view that is displayed in some larger list/grid/collection.\n * Inherits from Expandable, Selectable, Draggable.\n * The DOM contains warnings, a title bar, and a series of primary action controls.\n * Primary actions are meant to be easily accessible item functions (such as delete)\n * that are rendered in the title bar.\n *\n * Details are rendered when the user clicks the title bar or presses enter/space when\n * the title bar is in focus.\n *\n * Designed as a base class for history panel contents - but usable elsewhere (I hope).\n */\nvar ListItemView = ExpandableView.extend(\n BASE_MVC.mixin( BASE_MVC.SelectableViewMixin, BASE_MVC.DraggableViewMixin, {\n\n//TODO: that's a little contradictory\n tagName : 'div',\n className : 'list-item',\n\n /** Set up the base class and all mixins */\n initialize : function( attributes ){\n ExpandableView.prototype.initialize.call( this, attributes );\n BASE_MVC.SelectableViewMixin.initialize.call( this, attributes );\n BASE_MVC.DraggableViewMixin.initialize.call( this, attributes );\n this._setUpListeners();\n },\n\n /** event listeners */\n _setUpListeners : function(){\n // hide the primary actions in the title bar when selectable and narrow\n this.on( 'selectable', function( isSelectable ){\n if( isSelectable ){\n this.$( '.primary-actions' ).hide();\n } else {\n this.$( '.primary-actions' ).show();\n }\n }, this );\n //this.on( 'all', function( event ){\n // this.log( event );\n //}, this );\n return this;\n },\n\n // ........................................................................ rendering\n /** In this override, call methods to build warnings, titlebar and primary actions */\n _buildNewRender : function(){\n var $newRender = ExpandableView.prototype._buildNewRender.call( this );\n $newRender.children( '.warnings' ).replaceWith( this._renderWarnings() );\n $newRender.children( '.title-bar' ).replaceWith( this._renderTitleBar() );\n $newRender.children( '.primary-actions' ).append( this._renderPrimaryActions() );\n $newRender.find( '> .title-bar .subtitle' ).replaceWith( this._renderSubtitle() );\n return $newRender;\n },\n\n /** In this override, render the selector controls and set up dragging before the swap */\n _swapNewRender : function( $newRender ){\n ExpandableView.prototype._swapNewRender.call( this, $newRender );\n if( this.selectable ){ this.showSelector( 0 ); }\n if( this.draggable ){ this.draggableOn(); }\n return this.$el;\n },\n\n /** Render any warnings the item may need to show (e.g. \"I'm deleted\") */\n _renderWarnings : function(){\n var view = this,\n $warnings = $( '
            ' ),\n json = view.model.toJSON();\n//TODO:! unordered (map)\n _.each( view.templates.warnings, function( templateFn ){\n $warnings.append( $( templateFn( json, view ) ) );\n });\n return $warnings;\n },\n\n /** Render the title bar (the main/exposed SUMMARY dom element) */\n _renderTitleBar : function(){\n return $( this.templates.titleBar( this.model.toJSON(), this ) );\n },\n\n /** Return an array of jQ objects containing common/easily-accessible item controls */\n _renderPrimaryActions : function(){\n // override this\n return [];\n },\n\n /** Render the title bar (the main/exposed SUMMARY dom element) */\n _renderSubtitle : function(){\n return $( this.templates.subtitle( this.model.toJSON(), this ) );\n },\n\n // ......................................................................... events\n /** event map */\n events : {\n // expand the body when the title is clicked or when in focus and space or enter is pressed\n 'click .title-bar' : '_clickTitleBar',\n 'keydown .title-bar' : '_keyDownTitleBar',\n\n // dragging - don't work, originalEvent === null\n //'dragstart .dataset-title-bar' : 'dragStartHandler',\n //'dragend .dataset-title-bar' : 'dragEndHandler'\n\n 'click .selector' : 'toggleSelect'\n },\n\n /** expand when the title bar is clicked */\n _clickTitleBar : function( event ){\n event.stopPropagation();\n if( event.altKey ){\n this.toggleSelect( event );\n if( !this.selectable ){\n this.showSelector();\n }\n } else {\n this.toggleExpanded();\n }\n },\n\n /** expand when the title bar is in focus and enter or space is pressed */\n _keyDownTitleBar : function( event ){\n // bail (with propagation) if keydown and not space or enter\n var KEYCODE_SPACE = 32, KEYCODE_RETURN = 13;\n if( event && ( event.type === 'keydown' )\n &&( event.keyCode === KEYCODE_SPACE || event.keyCode === KEYCODE_RETURN ) ){\n this.toggleExpanded();\n event.stopPropagation();\n return false;\n }\n return true;\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'ListItemView(' + modelString + ')';\n }\n}));\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nListItemView.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var elTemplato = BASE_MVC.wrapTemplate([\n '
            ',\n // errors, messages, etc.\n '
            ',\n\n // multi-select checkbox\n '
            ',\n '',\n '
            ',\n // space for title bar buttons - gen. floated to the right\n '
            ',\n '
            ',\n\n // expandable area for more details\n '
            ',\n '
            '\n ]);\n\n var warnings = {};\n\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n // adding a tabindex here allows focusing the title bar and the use of keydown to expand the dataset display\n '
            ',\n//TODO: prob. belongs in dataset-list-item\n '',\n '
            ',\n '<%- element.name %>',\n '
            ',\n '
            ',\n '
            '\n ], 'element' );\n\n var subtitleTemplate = BASE_MVC.wrapTemplate([\n // override this\n '
            '\n ]);\n\n var detailsTemplate = BASE_MVC.wrapTemplate([\n // override this\n '
            '\n ]);\n\n return {\n el : elTemplato,\n warnings : warnings,\n titleBar : titleBarTemplate,\n subtitle : subtitleTemplate,\n details : detailsTemplate\n };\n}());\n\n\n//==============================================================================\n/** A view that is displayed in some larger list/grid/collection.\n * *AND* can display some sub-list of it's own when expanded (e.g. dataset collections).\n * This list will 'foldout' when the item is expanded depending on this.foldoutStyle:\n * If 'foldout': will expand vertically to show the nested list\n * If 'drilldown': will overlay the parent list\n *\n * Inherits from ListItemView.\n *\n * _renderDetails does the work of creating this.details: a sub-view that shows the nested list\n */\nvar FoldoutListItemView = ListItemView.extend({\n\n /** If 'foldout': show the sub-panel inside the expanded item\n * If 'drilldown': only fire events and handle by pub-sub\n * (allow the panel containing this item to attach it, hide itself, etc.)\n */\n foldoutStyle : 'foldout',\n /** Panel view class to instantiate for the sub-panel */\n foldoutPanelClass : null,\n\n /** override to:\n * add attributes foldoutStyle and foldoutPanelClass for config poly\n * disrespect attributes.expanded if drilldown\n */\n initialize : function( attributes ){\n//TODO: hackish\n if( this.foldoutStyle === 'drilldown' ){ this.expanded = false; }\n this.foldoutStyle = attributes.foldoutStyle || this.foldoutStyle;\n this.foldoutPanelClass = attributes.foldoutPanelClass || this.foldoutPanelClass;\n\n ListItemView.prototype.initialize.call( this, attributes );\n this.foldout = this._createFoldoutPanel();\n },\n\n//TODO:?? override to exclude foldout scope?\n //$ : function( selector ){\n // var $found = ListItemView.prototype.$.call( this, selector );\n // return $found;\n //},\n\n /** in this override, attach the foldout panel when rendering details */\n _renderDetails : function(){\n//TODO: hackish\n if( this.foldoutStyle === 'drilldown' ){ return $(); }\n var $newDetails = ListItemView.prototype._renderDetails.call( this );\n return this._attachFoldout( this.foldout, $newDetails );\n },\n\n /** In this override, handle collection expansion. */\n _createFoldoutPanel : function(){\n var model = this.model;\n var FoldoutClass = this._getFoldoutPanelClass( model ),\n options = this._getFoldoutPanelOptions( model ),\n foldout = new FoldoutClass( _.extend( options, {\n model : model\n }));\n return foldout;\n },\n\n /** Stub to return proper foldout panel class */\n _getFoldoutPanelClass : function(){\n // override\n return this.foldoutPanelClass;\n },\n\n /** Stub to return proper foldout panel options */\n _getFoldoutPanelOptions : function(){\n return {\n // propagate foldout style down\n foldoutStyle : this.foldoutStyle,\n fxSpeed : this.fxSpeed\n };\n },\n\n /** Render the foldout panel inside the view, hiding controls */\n _attachFoldout : function( foldout, $whereTo ){\n $whereTo = $whereTo || this.$( '> .details' );\n this.foldout = foldout.render( 0 );\n//TODO: hack\n foldout.$( '> .controls' ).hide();\n return $whereTo.append( foldout.$el );\n },\n\n /** In this override, branch on foldoutStyle to show expanded */\n expand : function(){\n var view = this;\n return view._fetchModelDetails()\n .always(function(){\n if( view.foldoutStyle === 'foldout' ){\n view._expand();\n } else if( view.foldoutStyle === 'drilldown' ){\n view._expandByDrilldown();\n }\n });\n },\n\n /** For drilldown, set up close handler and fire expanded:drilldown\n * containing views can listen to this and handle other things\n * (like hiding themselves) by listening for expanded/collapsed:drilldown\n */\n _expandByDrilldown : function(){\n var view = this;\n // attachment and rendering done by listener\n view.foldout.on( 'close', function(){\n view.trigger( 'collapsed:drilldown', view, view.foldout );\n });\n view.trigger( 'expanded:drilldown', view, view.foldout );\n }\n\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nFoldoutListItemView.prototype.templates = (function(){\n\n//TODO:?? unnecessary?\n // use element identifier\n var detailsTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n // override with more info (that goes above the panel)\n '
            '\n ], 'collection' );\n\n return _.extend( {}, ListItemView.prototype.templates, {\n details : detailsTemplate\n });\n}());\n\n\n//==============================================================================\n return {\n ExpandableView : ExpandableView,\n ListItemView : ListItemView,\n FoldoutListItemView : FoldoutListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/list/list-item.js\n ** module id = 48\n ** module chunks = 3\n **/","/**\n This is the base class of the tool form plugin. This class is e.g. inherited by the regular and the workflow tool form.\n*/\ndefine(['utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view',\n 'mvc/tool/tool-template', 'mvc/citation/citation-model', 'mvc/citation/citation-view'],\n function(Utils, Deferred, Ui, FormBase, ToolTemplate, CitationModel, CitationView) {\n return FormBase.extend({\n initialize: function(options) {\n var self = this;\n FormBase.prototype.initialize.call(this, options);\n this.deferred = new Deferred();\n if (options.inputs) {\n this._buildForm(options);\n options.needs_update && this.deferred.execute( function( process ) {\n self._updateModel( process );\n });\n } else {\n this.deferred.execute(function(process) {\n self._buildModel(process, options, true);\n });\n }\n },\n\n /** Wait for deferred build processes before removal */\n remove: function() {\n var self = this;\n this.$el.hide();\n this.deferred.execute(function(){\n FormBase.prototype.remove.call(self);\n Galaxy.emit.debug('tool-form-base::remove()', 'Destroy view.');\n });\n },\n\n /** Build form */\n _buildForm: function(options) {\n var self = this;\n this.options = Utils.merge(options, this.options);\n this.options = Utils.merge({\n icon : ( (options.icon === undefined) && 'fa-wrench' ) || '',\n title : '' + options.name + ' ' + options.description + ' (Galaxy Version ' + options.version + ')',\n operations : this._operations(),\n onchange : function() {\n self.deferred.reset();\n self.deferred.execute(function(process) {\n self._updateModel(process);\n });\n }\n }, this.options);\n this.options.customize && this.options.customize( this.options );\n this.render();\n if ( !this.options.collapsible ) {\n this.$el.append( $( '
            ' ).addClass( 'ui-margin-top-large' ).append( this._footer() ) );\n }\n },\n\n /** Builds a new model through api call and recreates the entire form\n */\n _buildModel: function(process, options, hide_message) {\n var self = this;\n this.options.id = options.id;\n this.options.version = options.version;\n\n // build request url\n var build_url = '';\n var build_data = {};\n if ( options.job_id ) {\n build_url = Galaxy.root + 'api/jobs/' + options.job_id + '/build_for_rerun';\n } else {\n build_url = Galaxy.root + 'api/tools/' + options.id + '/build';\n if ( Galaxy.params && Galaxy.params.tool_id == options.id ) {\n build_data = $.extend( {}, Galaxy.params );\n options.version && ( build_data[ 'tool_version' ] = options.version );\n }\n }\n\n // get initial model\n Utils.request({\n type : 'GET',\n url : build_url,\n data : build_data,\n success : function(new_model) {\n new_model = new_model.tool_model || new_model;\n if( !new_model.display ) {\n window.location = Galaxy.root;\n return;\n }\n self._buildForm(new_model);\n !hide_message && self.message.update({\n status : 'success',\n message : 'Now you are using \\'' + self.options.name + '\\' version ' + self.options.version + ', id \\'' + self.options.id + '\\'.',\n persistent : false\n });\n Galaxy.emit.debug('tool-form-base::initialize()', 'Initial tool model ready.', new_model);\n process.resolve();\n },\n error : function(response, xhr) {\n var error_message = ( response && response.err_msg ) || 'Uncaught error.';\n if ( xhr.status == 401 ) {\n window.location = Galaxy.root + 'user/login?' + $.param({ redirect : Galaxy.root + '?tool_id=' + self.options.id });\n } else if ( self.$el.is(':empty') ) {\n self.$el.prepend((new Ui.Message({\n message : error_message,\n status : 'danger',\n persistent : true,\n large : true\n })).$el);\n } else {\n Galaxy.modal.show({\n title : 'Tool request failed',\n body : error_message,\n buttons : {\n 'Close' : function() {\n Galaxy.modal.hide();\n }\n }\n });\n }\n Galaxy.emit.debug('tool-form::initialize()', 'Initial tool model request failed.', response);\n process.reject();\n }\n });\n },\n\n /** Request a new model for an already created tool form and updates the form inputs\n */\n _updateModel: function(process) {\n // link this\n var self = this;\n var model_url = this.options.update_url || Galaxy.root + 'api/tools/' + this.options.id + '/build';\n var current_state = {\n tool_id : this.options.id,\n tool_version : this.options.version,\n inputs : $.extend(true, {}, self.data.create())\n }\n this.wait(true);\n\n // log tool state\n Galaxy.emit.debug('tool-form-base::_updateModel()', 'Sending current state.', current_state);\n\n // post job\n Utils.request({\n type : 'POST',\n url : model_url,\n data : current_state,\n success : function(new_model) {\n self.update(new_model['tool_model'] || new_model);\n self.options.update && self.options.update(new_model);\n self.wait(false);\n Galaxy.emit.debug('tool-form-base::_updateModel()', 'Received new model.', new_model);\n process.resolve();\n },\n error : function(response) {\n Galaxy.emit.debug('tool-form-base::_updateModel()', 'Refresh request failed.', response);\n process.reject();\n }\n });\n },\n\n /** Create tool operation menu\n */\n _operations: function() {\n var self = this;\n var options = this.options;\n\n // button for version selection\n var versions_button = new Ui.ButtonMenu({\n icon : 'fa-cubes',\n title : (!options.narrow && 'Versions') || null,\n tooltip : 'Select another tool version'\n });\n if (!options.sustain_version && options.versions && options.versions.length > 1) {\n for (var i in options.versions) {\n var version = options.versions[i];\n if (version != options.version) {\n versions_button.addMenu({\n title : 'Switch to ' + version,\n version : version,\n icon : 'fa-cube',\n onclick : function() {\n // here we update the tool version (some tools encode the version also in the id)\n var id = options.id.replace(options.version, this.version);\n var version = this.version;\n // queue model request\n self.deferred.reset();\n self.deferred.execute(function(process) {\n self._buildModel(process, {id: id, version: version})\n });\n }\n });\n }\n }\n } else {\n versions_button.$el.hide();\n }\n\n // button for options e.g. search, help\n var menu_button = new Ui.ButtonMenu({\n icon : 'fa-caret-down',\n title : (!options.narrow && 'Options') || null,\n tooltip : 'View available options'\n });\n if(options.biostar_url) {\n menu_button.addMenu({\n icon : 'fa-question-circle',\n title : 'Question?',\n tooltip : 'Ask a question about this tool (Biostar)',\n onclick : function() {\n window.open(options.biostar_url + '/p/new/post/');\n }\n });\n menu_button.addMenu({\n icon : 'fa-search',\n title : 'Search',\n tooltip : 'Search help for this tool (Biostar)',\n onclick : function() {\n window.open(options.biostar_url + '/local/search/page/?q=' + options.name);\n }\n });\n };\n menu_button.addMenu({\n icon : 'fa-share',\n title : 'Share',\n tooltip : 'Share this tool',\n onclick : function() {\n prompt('Copy to clipboard: Ctrl+C, Enter', window.location.origin + Galaxy.root + 'root?tool_id=' + options.id);\n }\n });\n\n // add admin operations\n if (Galaxy.user && Galaxy.user.get('is_admin')) {\n menu_button.addMenu({\n icon : 'fa-download',\n title : 'Download',\n tooltip : 'Download this tool',\n onclick : function() {\n window.location.href = Galaxy.root + 'api/tools/' + options.id + '/download';\n }\n });\n }\n\n // button for version selection\n if (options.requirements && options.requirements.length > 0) {\n menu_button.addMenu({\n icon : 'fa-info-circle',\n title : 'Requirements',\n tooltip : 'Display tool requirements',\n onclick : function() {\n if (!this.visible) {\n this.visible = true;\n self.message.update({\n persistent : true,\n message : ToolTemplate.requirements(options),\n status : 'info'\n });\n } else {\n this.visible = false;\n self.message.update({\n message : ''\n });\n }\n }\n });\n }\n\n // add toolshed url\n if (options.sharable_url) {\n menu_button.addMenu({\n icon : 'fa-external-link',\n title : 'See in Tool Shed',\n tooltip : 'Access the repository',\n onclick : function() {\n window.open(options.sharable_url);\n }\n });\n }\n\n return {\n menu : menu_button,\n versions : versions_button\n }\n },\n\n /** Create footer\n */\n _footer: function() {\n var options = this.options;\n var $el = $( '
            ' ).append( ToolTemplate.help( options ) );\n if ( options.citations ) {\n var $citations = $( '
            ' );\n var citations = new CitationModel.ToolCitationCollection();\n citations.tool_id = options.id;\n var citation_list_view = new CitationView.CitationListView({ el: $citations, collection: citations });\n citation_list_view.render();\n citations.fetch();\n $el.append( $citations );\n }\n return $el;\n }\n });\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/tool/tool-form-base.js\n ** module id = 49\n ** module chunks = 0 3\n **/","/**\n * Model, view, and controller objects for Galaxy tools and tool panel.\n */\n\n define([\n \"libs/underscore\",\n \"viz/trackster/util\",\n \"mvc/dataset/data\",\n \"mvc/tool/tool-form\",\n \"templates/tool_form.handlebars\",\n \"templates/tool_link.handlebars\",\n \"templates/panel_section.handlebars\",\n \"templates/tool_search.handlebars\",\n\n], function(_, util, data, ToolForm, tool_form_template, tool_link_template, panel_section_template, tool_search_template) {\n\n/**\n * Mixin for tracking model visibility.\n */\nvar VisibilityMixin = {\n hidden: false,\n\n show: function() {\n this.set(\"hidden\", false);\n },\n\n hide: function() {\n this.set(\"hidden\", true);\n },\n\n toggle: function() {\n this.set(\"hidden\", !this.get(\"hidden\"));\n },\n\n is_visible: function() {\n return !this.attributes.hidden;\n }\n\n};\n\n/**\n * A tool parameter.\n */\nvar ToolParameter = Backbone.Model.extend({\n defaults: {\n name: null,\n label: null,\n type: null,\n value: null,\n html: null,\n num_samples: 5\n },\n\n initialize: function(options) {\n this.attributes.html = unescape(this.attributes.html);\n },\n\n copy: function() {\n return new ToolParameter(this.toJSON());\n },\n\n set_value: function(value) {\n this.set('value', value || '');\n }\n});\n\nvar ToolParameterCollection = Backbone.Collection.extend({\n model: ToolParameter\n});\n\n/**\n * A data tool parameter.\n */\nvar DataToolParameter = ToolParameter.extend({});\n\n/**\n * An integer tool parameter.\n */\nvar IntegerToolParameter = ToolParameter.extend({\n set_value: function(value) {\n this.set('value', parseInt(value, 10));\n },\n\n /**\n * Returns samples from a tool input.\n */\n get_samples: function() {\n return d3.scale.linear()\n .domain([this.get('min'), this.get('max')])\n .ticks(this.get('num_samples'));\n }\n});\n\nvar FloatToolParameter = IntegerToolParameter.extend({\n set_value: function(value) {\n this.set('value', parseFloat(value));\n }\n});\n\n/**\n * A select tool parameter.\n */\nvar SelectToolParameter = ToolParameter.extend({\n /**\n * Returns tool options.\n */\n get_samples: function() {\n return _.map(this.get('options'), function(option) {\n return option[0];\n });\n }\n});\n\n// Set up dictionary of parameter types.\nToolParameter.subModelTypes = {\n 'integer': IntegerToolParameter,\n 'float': FloatToolParameter,\n 'data': DataToolParameter,\n 'select': SelectToolParameter\n};\n\n/**\n * A Galaxy tool.\n */\nvar Tool = Backbone.Model.extend({\n // Default attributes.\n defaults: {\n id: null,\n name: null,\n description: null,\n target: null,\n inputs: [],\n outputs: []\n },\n\n urlRoot: Galaxy.root + 'api/tools',\n\n initialize: function(options) {\n\n // Set parameters.\n this.set('inputs', new ToolParameterCollection(_.map(options.inputs, function(p) {\n var p_class = ToolParameter.subModelTypes[p.type] || ToolParameter;\n return new p_class(p);\n })));\n },\n\n /**\n *\n */\n toJSON: function() {\n var rval = Backbone.Model.prototype.toJSON.call(this);\n\n // Convert inputs to JSON manually.\n rval.inputs = this.get('inputs').map(function(i) { return i.toJSON(); });\n return rval;\n },\n\n /**\n * Removes inputs of a particular type; this is useful because not all inputs can be handled by\n * client and server yet.\n */\n remove_inputs: function(types) {\n var tool = this,\n incompatible_inputs = tool.get('inputs').filter( function(input) {\n return ( types.indexOf( input.get('type') ) !== -1);\n });\n tool.get('inputs').remove(incompatible_inputs);\n },\n\n /**\n * Returns object copy, optionally including only inputs that can be sampled.\n */\n copy: function(only_samplable_inputs) {\n var copy = new Tool(this.toJSON());\n\n // Return only samplable inputs if flag is set.\n if (only_samplable_inputs) {\n var valid_inputs = new Backbone.Collection();\n copy.get('inputs').each(function(input) {\n if (input.get_samples()) {\n valid_inputs.push(input);\n }\n });\n copy.set('inputs', valid_inputs);\n }\n\n return copy;\n },\n\n apply_search_results: function(results) {\n ( _.indexOf(results, this.attributes.id) !== -1 ? this.show() : this.hide() );\n return this.is_visible();\n },\n\n /**\n * Set a tool input's value.\n */\n set_input_value: function(name, value) {\n this.get('inputs').find(function(input) {\n return input.get('name') === name;\n }).set('value', value);\n },\n\n /**\n * Set many input values at once.\n */\n set_input_values: function(inputs_dict) {\n var self = this;\n _.each(_.keys(inputs_dict), function(input_name) {\n self.set_input_value(input_name, inputs_dict[input_name]);\n });\n },\n\n /**\n * Run tool; returns a Deferred that resolves to the tool's output(s).\n */\n run: function() {\n return this._run();\n },\n\n /**\n * Rerun tool using regions and a target dataset.\n */\n rerun: function(target_dataset, regions) {\n return this._run({\n action: 'rerun',\n target_dataset_id: target_dataset.id,\n regions: regions\n });\n },\n\n /**\n * Returns input dict for tool's inputs.\n */\n get_inputs_dict: function() {\n var input_dict = {};\n this.get('inputs').each(function(input) {\n input_dict[input.get('name')] = input.get('value');\n });\n return input_dict;\n },\n\n /**\n * Run tool; returns a Deferred that resolves to the tool's output(s).\n * NOTE: this method is a helper method and should not be called directly.\n */\n _run: function(additional_params) {\n // Create payload.\n var payload = _.extend({\n tool_id: this.id,\n inputs: this.get_inputs_dict()\n }, additional_params);\n\n // Because job may require indexing datasets, use server-side\n // deferred to ensure that job is run. Also use deferred that\n // resolves to outputs from tool.\n var run_deferred = $.Deferred(),\n ss_deferred = new util.ServerStateDeferred({\n ajax_settings: {\n url: this.urlRoot,\n data: JSON.stringify(payload),\n dataType: \"json\",\n contentType: 'application/json',\n type: \"POST\"\n },\n interval: 2000,\n success_fn: function(response) {\n return response !== \"pending\";\n }\n });\n\n // Run job and resolve run_deferred to tool outputs.\n $.when(ss_deferred.go()).then(function(result) {\n run_deferred.resolve(new data.DatasetCollection(result));\n });\n return run_deferred;\n }\n});\n_.extend(Tool.prototype, VisibilityMixin);\n\n/**\n * Tool view.\n */\nvar ToolView = Backbone.View.extend({\n\n});\n\n/**\n * Wrap collection of tools for fast access/manipulation.\n */\nvar ToolCollection = Backbone.Collection.extend({\n model: Tool\n});\n\n/**\n * Label or section header in tool panel.\n */\nvar ToolSectionLabel = Backbone.Model.extend(VisibilityMixin);\n\n/**\n * Section of tool panel with elements (labels and tools).\n */\nvar ToolSection = Backbone.Model.extend({\n defaults: {\n elems: [],\n open: false\n },\n\n clear_search_results: function() {\n _.each(this.attributes.elems, function(elt) {\n elt.show();\n });\n\n this.show();\n this.set(\"open\", false);\n },\n\n apply_search_results: function(results) {\n var all_hidden = true,\n cur_label;\n _.each(this.attributes.elems, function(elt) {\n if (elt instanceof ToolSectionLabel) {\n cur_label = elt;\n cur_label.hide();\n }\n else if (elt instanceof Tool) {\n if (elt.apply_search_results(results)) {\n all_hidden = false;\n if (cur_label) {\n cur_label.show();\n }\n }\n }\n });\n\n if (all_hidden) {\n this.hide();\n }\n else {\n this.show();\n this.set(\"open\", true);\n }\n }\n});\n_.extend(ToolSection.prototype, VisibilityMixin);\n\n/**\n * Tool search that updates results when query is changed. Result value of null\n * indicates that query was not run; if not null, results are from search using\n * query.\n */\nvar ToolSearch = Backbone.Model.extend({\n defaults: {\n search_hint_string: \"search tools\",\n min_chars_for_search: 3,\n spinner_url: \"\",\n clear_btn_url: \"\",\n search_url: \"\",\n visible: true,\n query: \"\",\n results: null,\n // ESC (27) will clear the input field and tool search filters\n clear_key: 27\n },\n\n urlRoot: Galaxy.root + 'api/tools',\n\n initialize: function() {\n this.on(\"change:query\", this.do_search);\n },\n\n /**\n * Do the search and update the results.\n */\n do_search: function() {\n var query = this.attributes.query;\n\n // If query is too short, do not search.\n if (query.length < this.attributes.min_chars_for_search) {\n this.set(\"results\", null);\n return;\n }\n\n // Do search via AJAX.\n var q = query;\n // Stop previous ajax-request\n if (this.timer) {\n clearTimeout(this.timer);\n }\n // Start a new ajax-request in X ms\n $(\"#search-clear-btn\").hide();\n $(\"#search-spinner\").show();\n var self = this;\n this.timer = setTimeout(function () {\n // log the search to analytics if present\n if ( typeof ga !== 'undefined' ) {\n ga( 'send', 'pageview', Galaxy.root + '?q=' + q );\n }\n $.get( self.urlRoot, { q: q }, function (data) {\n self.set(\"results\", data);\n $(\"#search-spinner\").hide();\n $(\"#search-clear-btn\").show();\n }, \"json\" );\n }, 400 );\n },\n\n clear_search: function() {\n this.set(\"query\", \"\");\n this.set(\"results\", null);\n }\n\n});\n_.extend(ToolSearch.prototype, VisibilityMixin);\n\n/**\n * Tool Panel.\n */\nvar ToolPanel = Backbone.Model.extend({\n\n initialize: function(options) {\n this.attributes.tool_search = options.tool_search;\n this.attributes.tool_search.on(\"change:results\", this.apply_search_results, this);\n this.attributes.tools = options.tools;\n this.attributes.layout = new Backbone.Collection( this.parse(options.layout) );\n },\n\n /**\n * Parse tool panel dictionary and return collection of tool panel elements.\n */\n parse: function(response) {\n // Recursive function to parse tool panel elements.\n var self = this,\n // Helper to recursively parse tool panel.\n parse_elt = function(elt_dict) {\n var type = elt_dict.model_class;\n // There are many types of tools; for now, anything that ends in 'Tool'\n // is treated as a generic tool.\n if ( type.indexOf('Tool') === type.length - 4 ) {\n return self.attributes.tools.get(elt_dict.id);\n }\n else if (type === 'ToolSection') {\n // Parse elements.\n var elems = _.map(elt_dict.elems, parse_elt);\n elt_dict.elems = elems;\n return new ToolSection(elt_dict);\n }\n else if (type === 'ToolSectionLabel') {\n return new ToolSectionLabel(elt_dict);\n }\n };\n\n return _.map(response, parse_elt);\n },\n\n clear_search_results: function() {\n this.get('layout').each(function(panel_elt) {\n if (panel_elt instanceof ToolSection) {\n panel_elt.clear_search_results();\n }\n else {\n // Label or tool, so just show.\n panel_elt.show();\n }\n });\n },\n\n apply_search_results: function() {\n var results = this.get('tool_search').get('results');\n if (results === null) {\n this.clear_search_results();\n return;\n }\n\n var cur_label = null;\n this.get('layout').each(function(panel_elt) {\n if (panel_elt instanceof ToolSectionLabel) {\n cur_label = panel_elt;\n cur_label.hide();\n }\n else if (panel_elt instanceof Tool) {\n if (panel_elt.apply_search_results(results)) {\n if (cur_label) {\n cur_label.show();\n }\n }\n }\n else {\n // Starting new section, so clear current label.\n cur_label = null;\n panel_elt.apply_search_results(results);\n }\n });\n }\n});\n\n/**\n * View classes for Galaxy tools and tool panel.\n *\n * Views use precompiled Handlebars templates for rendering. Views update as needed\n * based on (a) model/collection events and (b) user interactions; in this sense,\n * they are controllers are well and the HTML is the real view in the MVC architecture.\n */\n\n/**\n * Base view that handles visibility based on model's hidden attribute.\n */\nvar BaseView = Backbone.View.extend({\n initialize: function() {\n this.model.on(\"change:hidden\", this.update_visible, this);\n this.update_visible();\n },\n update_visible: function() {\n ( this.model.attributes.hidden ? this.$el.hide() : this.$el.show() );\n }\n});\n\n/**\n * Link to a tool.\n */\nvar ToolLinkView = BaseView.extend({\n tagName: 'div',\n\n render: function() {\n // create element\n var $link = $('
            ');\n $link.append(tool_link_template(this.model.toJSON()));\n\n // open upload dialog for upload tool\n if (this.model.id === 'upload1') {\n $link.find('a').on('click', function(e) {\n e.preventDefault();\n Galaxy.upload.show();\n });\n }\n else if ( this.model.get( 'model_class' ) === 'Tool' ) { // regular tools\n var self = this;\n $link.find('a').on('click', function(e) {\n e.preventDefault();\n var form = new ToolForm.View( { id : self.model.id, version : self.model.get('version') } );\n form.deferred.execute(function() {\n Galaxy.app.display( form );\n });\n });\n }\n\n // add element\n this.$el.append($link);\n return this;\n }\n});\n\n/**\n * Panel label/section header.\n */\nvar ToolSectionLabelView = BaseView.extend({\n tagName: 'div',\n className: 'toolPanelLabel',\n\n render: function() {\n this.$el.append( $(\"\").text(this.model.attributes.text) );\n return this;\n }\n});\n\n/**\n * Panel section.\n */\nvar ToolSectionView = BaseView.extend({\n tagName: 'div',\n className: 'toolSectionWrapper',\n\n initialize: function() {\n BaseView.prototype.initialize.call(this);\n this.model.on(\"change:open\", this.update_open, this);\n },\n\n render: function() {\n // Build using template.\n this.$el.append( panel_section_template(this.model.toJSON()) );\n\n // Add tools to section.\n var section_body = this.$el.find(\".toolSectionBody\");\n _.each(this.model.attributes.elems, function(elt) {\n if (elt instanceof Tool) {\n var tool_view = new ToolLinkView({model: elt, className: \"toolTitle\"});\n tool_view.render();\n section_body.append(tool_view.$el);\n }\n else if (elt instanceof ToolSectionLabel) {\n var label_view = new ToolSectionLabelView({model: elt});\n label_view.render();\n section_body.append(label_view.$el);\n }\n else {\n // TODO: handle nested section bodies?\n }\n });\n return this;\n },\n\n events: {\n 'click .toolSectionTitle > a': 'toggle'\n },\n\n /**\n * Toggle visibility of tool section.\n */\n toggle: function() {\n this.model.set(\"open\", !this.model.attributes.open);\n },\n\n /**\n * Update whether section is open or close.\n */\n update_open: function() {\n (this.model.attributes.open ?\n this.$el.children(\".toolSectionBody\").slideDown(\"fast\") :\n this.$el.children(\".toolSectionBody\").slideUp(\"fast\")\n );\n }\n});\n\nvar ToolSearchView = Backbone.View.extend({\n tagName: 'div',\n id: 'tool-search',\n className: 'bar',\n\n events: {\n 'click': 'focus_and_select',\n 'keyup :input': 'query_changed',\n 'click #search-clear-btn': 'clear'\n },\n\n render: function() {\n this.$el.append( tool_search_template(this.model.toJSON()) );\n if (!this.model.is_visible()) {\n this.$el.hide();\n }\n this.$el.find('[title]').tooltip();\n return this;\n },\n\n focus_and_select: function() {\n this.$el.find(\":input\").focus().select();\n },\n\n clear: function() {\n this.model.clear_search();\n this.$el.find(\":input\").val('');\n this.focus_and_select();\n return false;\n },\n\n query_changed: function( evData ) {\n // check for the 'clear key' (ESC) first\n if( ( this.model.attributes.clear_key ) &&\n ( this.model.attributes.clear_key === evData.which ) ){\n this.clear();\n return false;\n }\n this.model.set(\"query\", this.$el.find(\":input\").val());\n }\n});\n\n/**\n * Tool panel view. Events triggered include:\n * tool_link_click(click event, tool_model)\n */\nvar ToolPanelView = Backbone.View.extend({\n tagName: 'div',\n className: 'toolMenu',\n\n /**\n * Set up view.\n */\n initialize: function() {\n this.model.get('tool_search').on(\"change:results\", this.handle_search_results, this);\n },\n\n render: function() {\n var self = this;\n\n // Render search.\n var search_view = new ToolSearchView( { model: this.model.get('tool_search') } );\n search_view.render();\n self.$el.append(search_view.$el);\n\n // Render panel.\n this.model.get('layout').each(function(panel_elt) {\n if (panel_elt instanceof ToolSection) {\n var section_title_view = new ToolSectionView({model: panel_elt});\n section_title_view.render();\n self.$el.append(section_title_view.$el);\n }\n else if (panel_elt instanceof Tool) {\n var tool_view = new ToolLinkView({model: panel_elt, className: \"toolTitleNoSection\"});\n tool_view.render();\n self.$el.append(tool_view.$el);\n }\n else if (panel_elt instanceof ToolSectionLabel) {\n var label_view = new ToolSectionLabelView({model: panel_elt});\n label_view.render();\n self.$el.append(label_view.$el);\n }\n });\n\n // Setup tool link click eventing.\n self.$el.find(\"a.tool-link\").click(function(e) {\n // Tool id is always the first class.\n var\n tool_id = $(this).attr('class').split(/\\s+/)[0],\n tool = self.model.get('tools').get(tool_id);\n\n self.trigger(\"tool_link_click\", e, tool);\n });\n\n return this;\n },\n\n handle_search_results: function() {\n var results = this.model.get('tool_search').get('results');\n if (results && results.length === 0) {\n $(\"#search-no-results\").show();\n }\n else {\n $(\"#search-no-results\").hide();\n }\n }\n});\n\n/**\n * View for working with a tool: setting parameters and inputs and executing the tool.\n */\nvar ToolFormView = Backbone.View.extend({\n className: 'toolForm',\n\n render: function() {\n this.$el.children().remove();\n this.$el.append( tool_form_template(this.model.toJSON()) );\n }\n});\n\n/**\n * Integrated tool menu + tool execution.\n */\nvar IntegratedToolMenuAndView = Backbone.View.extend({\n className: 'toolMenuAndView',\n\n initialize: function() {\n this.tool_panel_view = new ToolPanelView({collection: this.collection});\n this.tool_form_view = new ToolFormView();\n },\n\n render: function() {\n // Render and append tool panel.\n this.tool_panel_view.render();\n this.tool_panel_view.$el.css(\"float\", \"left\");\n this.$el.append(this.tool_panel_view.$el);\n\n // Append tool form view.\n this.tool_form_view.$el.hide();\n this.$el.append(this.tool_form_view.$el);\n\n // On tool link click, show tool.\n var self = this;\n this.tool_panel_view.on(\"tool_link_click\", function(e, tool) {\n // Prevents click from activating link:\n e.preventDefault();\n // Show tool that was clicked on:\n self.show_tool(tool);\n });\n },\n\n /**\n * Fetch and display tool.\n */\n show_tool: function(tool) {\n var self = this;\n tool.fetch().done( function() {\n self.tool_form_view.model = tool;\n self.tool_form_view.render();\n self.tool_form_view.$el.show();\n $('#left').width(\"650px\");\n });\n }\n});\n\n// Exports\nreturn {\n ToolParameter: ToolParameter,\n IntegerToolParameter: IntegerToolParameter,\n SelectToolParameter: SelectToolParameter,\n Tool: Tool,\n ToolCollection: ToolCollection,\n ToolSearch: ToolSearch,\n ToolPanel: ToolPanel,\n ToolPanelView: ToolPanelView,\n ToolFormView: ToolFormView\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/tool/tools.js\n ** module id = 50\n ** module chunks = 0 3\n **/","define([\n //jquery\n //backbone\n], function(){\n// =============================================================================\n/**\n * view for a popup menu\n */\nvar PopupMenu = Backbone.View.extend({\n//TODO: maybe better as singleton off the Galaxy obj\n /** Cache the desired button element and options, set up the button click handler\n * NOTE: attaches this view as HTML/jQ data on the button for later use.\n */\n initialize: function( $button, options ){\n // default settings\n this.$button = $button;\n if( !this.$button.size() ){\n this.$button = $( '
            ' );\n }\n this.options = options || [];\n this.$button.data( 'popupmenu', this );\n\n // set up button click -> open menu behavior\n var menu = this;\n this.$button.click( function( event ){\n // if there's already a menu open, remove it\n $( '.popmenu-wrapper' ).remove();\n menu._renderAndShow( event );\n return false;\n });\n },\n\n // render the menu, append to the page body at the click position, and set up the 'click-away' handlers, show\n _renderAndShow: function( clickEvent ){\n this.render();\n this.$el.appendTo( 'body' ).css( this._getShownPosition( clickEvent )).show();\n this._setUpCloseBehavior();\n },\n\n // render the menu\n // this menu doesn't attach itself to the DOM ( see _renderAndShow )\n render: function(){\n // render the menu body absolute and hidden, fill with template\n this.$el.addClass( 'popmenu-wrapper' ).hide()\n .css({ position : 'absolute' })\n .html( this.template( this.$button.attr( 'id' ), this.options ));\n\n // set up behavior on each link/anchor elem\n if( this.options.length ){\n var menu = this;\n //precondition: there should be one option per li\n this.$el.find( 'li' ).each( function( i, li ){\n var option = menu.options[i];\n\n // if the option has 'func', call that function when the anchor is clicked\n if( option.func ){\n $( this ).children( 'a.popupmenu-option' ).click( function( event ){\n option.func.call( menu, event, option );\n // We must preventDefault otherwise clicking \"cancel\"\n // on a purge or something still navigates and causes\n // the action.\n event.preventDefault();\n // bubble up so that an option click will call the close behavior\n });\n }\n });\n }\n return this;\n },\n\n template : function( id, options ){\n return [\n '
              ', this._templateOptions( options ), '
            '\n ].join( '' );\n },\n\n _templateOptions : function( options ){\n if( !options.length ){\n return '
          9. (no options)
          10. ';\n }\n return _.map( options, function( option ){\n if( option.divider ){\n return '
          11. ';\n } else if( option.header ){\n return [ '
          12. ', option.html, '
          13. ' ].join( '' );\n }\n var href = option.href || 'javascript:void(0);',\n target = ( option.target )?( ' target=\"' + option.target + '\"' ):( '' ),\n check = ( option.checked )?( '' ):( '' );\n return [\n '
          14. ',\n check, option.html,\n '
          15. '\n ].join( '' );\n }).join( '' );\n },\n\n // get the absolute position/offset for the menu\n _getShownPosition : function( clickEvent ){\n\n // display menu horiz. centered on click...\n var menuWidth = this.$el.width();\n var x = clickEvent.pageX - menuWidth / 2 ;\n\n // adjust to handle horiz. scroll and window dimensions ( draw entirely on visible screen area )\n x = Math.min( x, $( document ).scrollLeft() + $( window ).width() - menuWidth - 5 );\n x = Math.max( x, $( document ).scrollLeft() + 5 );\n return {\n top: clickEvent.pageY,\n left: x\n };\n },\n\n // bind an event handler to all available frames so that when anything is clicked\n // the menu is removed from the DOM and the event handler unbinds itself\n _setUpCloseBehavior: function(){\n var menu = this;\n//TODO: alternately: focus hack, blocking overlay, jquery.blockui\n\n // function to close popup and unbind itself\n function closePopup( event ){\n $( document ).off( 'click.close_popup' );\n if( window && window.parent !== window ){\n try {\n $( window.parent.document ).off( \"click.close_popup\" );\n } catch( err ){}\n } else {\n try {\n $( 'iframe#galaxy_main' ).contents().off( \"click.close_popup\" );\n } catch( err ){}\n }\n menu.remove();\n }\n\n $( 'html' ).one( \"click.close_popup\", closePopup );\n if( window && window.parent !== window ){\n try {\n $( window.parent.document ).find( 'html' ).one( \"click.close_popup\", closePopup );\n } catch( err ){}\n } else {\n try {\n $( 'iframe#galaxy_main' ).contents().one( \"click.close_popup\", closePopup );\n } catch( err ){}\n }\n },\n\n // add a menu option/item at the given index\n addItem: function( item, index ){\n // append to end if no index\n index = ( index >= 0 ) ? index : this.options.length;\n this.options.splice( index, 0, item );\n return this;\n },\n\n // remove a menu option/item at the given index\n removeItem: function( index ){\n if( index >=0 ){\n this.options.splice( index, 1 );\n }\n return this;\n },\n\n // search for a menu option by its html\n findIndexByHtml: function( html ){\n for( var i = 0; i < this.options.length; i++ ){\n if( _.has( this.options[i], 'html' ) && ( this.options[i].html === html )){\n return i;\n }\n }\n return null;\n },\n\n // search for a menu option by its html\n findItemByHtml: function( html ){\n return this.options[( this.findIndexByHtml( html ))];\n },\n\n // string representation\n toString: function(){\n return 'PopupMenu';\n }\n});\n/** shortcut to new for when you don't need to preserve the ref */\nPopupMenu.create = function _create( $button, options ){\n return new PopupMenu( $button, options );\n};\n\n// -----------------------------------------------------------------------------\n// the following class functions are bridges from the original make_popupmenu and make_popup_menus\n// to the newer backbone.js PopupMenu\n\n/** Create a PopupMenu from simple map initial_options activated by clicking button_element.\n * Converts initial_options to object array used by PopupMenu.\n * @param {jQuery|DOMElement} button_element element which, when clicked, activates menu\n * @param {Object} initial_options map of key -> values, where\n * key is option text, value is fn to call when option is clicked\n * @returns {PopupMenu} the PopupMenu created\n */\nPopupMenu.make_popupmenu = function( button_element, initial_options ){\n var convertedOptions = [];\n _.each( initial_options, function( optionVal, optionKey ){\n var newOption = { html: optionKey };\n\n // keys with null values indicate: header\n if( optionVal === null ){ // !optionVal? (null only?)\n newOption.header = true;\n\n // keys with function values indicate: a menu option\n } else if( jQuery.type( optionVal ) === 'function' ){\n newOption.func = optionVal;\n }\n //TODO:?? any other special optionVals?\n // there was no divider option originally\n convertedOptions.push( newOption );\n });\n return new PopupMenu( $( button_element ), convertedOptions );\n};\n\n/** Find all anchors in $parent (using selector) and covert anchors into a PopupMenu options map.\n * @param {jQuery} $parent the element that contains the links to convert to options\n * @param {String} selector jq selector string to find links\n * @returns {Object[]} the options array to initialize a PopupMenu\n */\n//TODO: lose parent and selector, pass in array of links, use map to return options\nPopupMenu.convertLinksToOptions = function( $parent, selector ){\n $parent = $( $parent );\n selector = selector || 'a';\n var options = [];\n $parent.find( selector ).each( function( elem, i ){\n var option = {}, $link = $( elem );\n\n // convert link text to the option text (html) and the href into the option func\n option.html = $link.text();\n if( $link.attr( 'href' ) ){\n var linkHref = $link.attr( 'href' ),\n linkTarget = $link.attr( 'target' ),\n confirmText = $link.attr( 'confirm' );\n\n option.func = function(){\n // if there's a \"confirm\" attribute, throw up a confirmation dialog, and\n // if the user cancels - do nothing\n if( ( confirmText ) && ( !confirm( confirmText ) ) ){ return; }\n\n // if there's no confirm attribute, or the user accepted the confirm dialog:\n switch( linkTarget ){\n // relocate the center panel\n case '_parent':\n window.parent.location = linkHref;\n break;\n\n // relocate the entire window\n case '_top':\n window.top.location = linkHref;\n break;\n\n // relocate this panel\n default:\n window.location = linkHref;\n }\n };\n }\n options.push( option );\n });\n return options;\n};\n\n/** Create a single popupmenu from existing DOM button and anchor elements\n * @param {jQuery} $buttonElement the element that when clicked will open the menu\n * @param {jQuery} $menuElement the element that contains the anchors to convert into a menu\n * @param {String} menuElementLinkSelector jq selector string used to find anchors to be made into menu options\n * @returns {PopupMenu} the PopupMenu (Backbone View) that can render, control the menu\n */\nPopupMenu.fromExistingDom = function( $buttonElement, $menuElement, menuElementLinkSelector ){\n $buttonElement = $( $buttonElement );\n $menuElement = $( $menuElement );\n var options = PopupMenu.convertLinksToOptions( $menuElement, menuElementLinkSelector );\n // we're done with the menu (having converted it to an options map)\n $menuElement.remove();\n return new PopupMenu( $buttonElement, options );\n};\n\n/** Create all popupmenus within a document or a more specific element\n * @param {DOMElement} parent the DOM element in which to search for popupmenus to build (defaults to document)\n * @param {String} menuSelector jq selector string to find popupmenu menu elements (defaults to \"div[popupmenu]\")\n * @param {Function} buttonSelectorBuildFn the function to build the jq button selector.\n * Will be passed $menuElement, parent.\n * (Defaults to return '#' + $menuElement.attr( 'popupmenu' ); )\n * @returns {PopupMenu[]} array of popupmenus created\n */\nPopupMenu.make_popup_menus = function( parent, menuSelector, buttonSelectorBuildFn ){\n parent = parent || document;\n // orig. Glx popupmenu menus have a (non-std) attribute 'popupmenu'\n // which contains the id of the button that activates the menu\n menuSelector = menuSelector || 'div[popupmenu]';\n // default to (orig. Glx) matching button to menu by using the popupmenu attr of the menu as the id of the button\n buttonSelectorBuildFn = buttonSelectorBuildFn || function( $menuElement, parent ){\n return '#' + $menuElement.attr( 'popupmenu' );\n };\n\n // aggregate and return all PopupMenus\n var popupMenusCreated = [];\n $( parent ).find( menuSelector ).each( function(){\n var $menuElement = $( this ),\n $buttonElement = $( parent ).find( buttonSelectorBuildFn( $menuElement, parent ) );\n popupMenusCreated.push( PopupMenu.fromDom( $buttonElement, $menuElement ) );\n $buttonElement.addClass( 'popup' );\n });\n return popupMenusCreated;\n};\n\n\n// =============================================================================\n return PopupMenu;\n});\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/popup-menu.js\n ** module id = 51\n ** module chunks = 3\n **/","/** Renders the color picker used e.g. in the tool form **/\ndefine(['utils/utils'], function( Utils ) {\n return Backbone.View.extend({\n colors: {\n standard: ['c00000','ff0000','ffc000','ffff00','92d050','00b050','00b0f0','0070c0','002060','7030a0'],\n base : ['ffffff','000000','eeece1','1f497d','4f81bd','c0504d','9bbb59','8064a2','4bacc6','f79646'],\n theme :[['f2f2f2','7f7f7f','ddd9c3','c6d9f0','dbe5f1','f2dcdb','ebf1dd','e5e0ec','dbeef3','fdeada'],\n ['d8d8d8','595959','c4bd97','8db3e2','b8cce4','e5b9b7','d7e3bc','ccc1d9','b7dde8','fbd5b5'],\n ['bfbfbf','3f3f3f','938953','548dd4','95b3d7','d99694','c3d69b','b2a2c7','92cddc','fac08f'],\n ['a5a5a5','262626','494429','17365d','366092','953734','76923c','5f497a','31859b','e36c09'],\n ['7f7f7e','0c0c0c','1d1b10','0f243e','244061','632423','4f6128','3f3151','205867','974806']]\n },\n initialize : function( options ) {\n this.options = Utils.merge( options, {} );\n this.setElement( this._template() );\n\n // link components\n this.$panel = this.$( '.ui-color-picker-panel' );\n this.$view = this.$( '.ui-color-picker-view' );\n this.$value = this.$( '.ui-color-picker-value' );\n this.$header = this.$( '.ui-color-picker-header' );\n\n // build panel\n this._build();\n\n // hide panel on start up\n this.visible = false;\n\n // set initial value\n this.value( this.options.value );\n\n // link boxes\n this.$boxes = this.$( '.ui-color-picker-box' );\n\n // add event handler\n var self = this;\n this.$boxes.on( 'click', function() {\n self.value( $( this ).css( 'background-color' ) );\n self.$header.trigger( 'click' );\n } );\n this.$header.on( 'click', function() {\n self.visible = !self.visible;\n if ( self.visible ) {\n self.$view.fadeIn( 'fast' );\n } else {\n self.$view.fadeOut( 'fast' );\n }\n } );\n },\n\n // value\n value : function ( new_val ) {\n if ( new_val !== undefined && new_val !== null ) {\n // update color value\n this.$value.css( 'background-color', new_val );\n \n // check selected color in panel\n this.$( '.ui-color-picker-box' ).empty();\n this.$( this._getValue() ).html( this._templateCheck() );\n\n // trigger custom event\n this.options.onchange && this.options.onchange( new_val );\n }\n\n // return current value\n return this._getValue();\n },\n\n // get value from dom\n _getValue: function() {\n var rgb = this.$value.css( 'background-color' );\n rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n if ( rgb ) {\n function hex( x ) {\n return ( '0' + parseInt( x ).toString( 16 ) ).slice( -2 );\n }\n return '#' + hex( rgb[ 1] ) + hex( rgb[ 2 ] ) + hex( rgb[ 3 ] );\n } else {\n return null;\n }\n },\n\n // build panel\n _build: function() {\n var $content = this._content({\n label : 'Theme Colors',\n colors : this.colors.base,\n padding : 10\n });\n for ( var i in this.colors.theme ) {\n var line_def = {};\n if ( i == 0 ) {\n line_def[ 'bottom' ] = true;\n } else {\n if ( i != this.colors.theme.length - 1 ) {\n line_def[ 'top' ] = true;\n line_def[ 'bottom' ] = true;\n } else {\n line_def[ 'top' ] = true;\n line_def[ 'padding' ] = 5;\n }\n }\n line_def[ 'colors' ] = this.colors.theme[ i ];\n this._content( line_def );\n }\n this._content({\n label : 'Standard Colors',\n colors : this.colors.standard,\n padding : 5\n });\n },\n\n // create content\n _content: function( options ) {\n // get parameters\n var label = options.label;\n var colors = options.colors;\n var padding = options.padding;\n var top = options.top;\n var bottom = options.bottom;\n\n // create lines\n var $content = $( this._templateContent() );\n\n // set label\n var $label = $content.find( '.label' );\n if ( options.label ) {\n $label.html( options.label );\n } else {\n $label.hide();\n }\n\n // build line\n var $line = $content.find( '.line' );\n this.$panel.append( $content );\n for ( var i in colors ) {\n var $box = $( this._templateBox( colors[ i ] ) );\n if ( top ) {\n $box.css( 'border-top', 'none' );\n $box.css( 'border-top-left-radius', '0px' );\n $box.css( 'border-top-right-radius', '0px' );\n }\n if ( bottom ) {\n $box.css( 'border-bottom', 'none' );\n $box.css( 'border-bottom-left-radius', '0px' );\n $box.css( 'border-bottom-right-radius', '0px' );\n }\n $line.append( $box );\n }\n if (padding) {\n $line.css( 'padding-bottom', padding );\n }\n return $content;\n },\n\n // check icon\n _templateCheck: function() {\n return '
            ';\n },\n\n // content template\n _templateContent: function() {\n return '
            ' +\n '
            ' +\n '
            ' +\n '
            ';\n },\n\n // box template\n _templateBox: function( color ) {\n return '
            ';\n },\n\n // template\n _template: function() {\n return '
            ' +\n '
            ' +\n '
            ' +\n '
            Select a color
            ' +\n '
            ' +\n '
            ' +\n '
            ' +\n '
            '\n '
            ';\n }\n });\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-color-picker.js\n ** module id = 52\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-options'], function(Utils, Options) {\n\n/**\n * This class creates/wraps a drill down element.\n */\nvar View = Options.BaseIcons.extend({\n // initialize\n initialize: function(options) {\n options.type = options.display || 'checkbox';\n options.multiple = (options.display == 'checkbox');\n Options.BaseIcons.prototype.initialize.call(this, options);\n this.initial = true;\n },\n\n // set expand states for initial value\n value: function (new_val) {\n var val = Options.BaseIcons.prototype.value.call(this, new_val);\n if (this.initial && val !== null && this.header_index) {\n this.initial = false;\n var values = val;\n if (!$.isArray(values)) {\n values = [values];\n }\n for (var i in values) {\n var list = this.header_index[values[i]];\n for (var j in list) {\n this._setState(list[j], true);\n }\n }\n }\n return val;\n },\n\n /** Expand/collapse a sub group\n */\n _setState: function (header_id, is_expanded) {\n var $button = this.$('.button-' + header_id);\n var $subgroup = this.$('.subgroup-' + header_id);\n $button.data('is_expanded', is_expanded);\n if (is_expanded) {\n $subgroup.fadeIn('fast')\n $button.removeClass('fa-plus-square');\n $button.addClass('fa-minus-square');\n } else {\n $subgroup.hide();\n $button.removeClass('fa-minus-square');\n $button.addClass('fa-plus-square');\n }\n },\n\n /** Template to create options tree\n */\n _templateOptions: function(options) {\n // link this\n var self = this;\n\n // link data\n this.header_index = {};\n \n // attach event handler\n function attach($el, header_id) {\n var $button = $el.find('.button-' + header_id);\n $button.on('click', function() {\n self._setState(header_id, !$button.data('is_expanded'));\n });\n }\n\n // recursive function which iterates through options\n function iterate ($tmpl, options, header) {\n header = header || [];\n for (i in options) {\n // current option level in hierarchy\n var level = options[i];\n\n // check for options\n var has_options = level.options.length > 0;\n\n // copy current header list\n var new_header = header.slice(0);\n\n // keep track of header list\n self.header_index[level.value] = new_header.slice(0);\n\n // build template\n var $group = $('
            ');\n if (has_options) {\n // create button and subgroup\n var header_id = Utils.uid();\n var $button = $('');\n var $subgroup = $('
            ');\n\n // keep track of button and subgroup\n new_header.push(header_id);\n\n // create expandable header section\n var $buttongroup = $('
            ');\n $buttongroup.append($button);\n $buttongroup.append(self._templateOption({\n label: level.name,\n value: level.value\n }));\n $group.append($buttongroup);\n iterate($subgroup, level.options, new_header);\n $group.append($subgroup);\n\n // attach expand/collapse events\n attach($group, header_id);\n } else {\n // append child options\n $group.append(self._templateOption({\n label: level.name,\n value: level.value\n }));\n }\n $tmpl.append($group);\n }\n }\n\n // iterate through options and create dom\n var $tmpl = $('
            ');\n iterate($tmpl, options);\n\n // return template\n return $tmpl;\n },\n\n /** Template for drill down view\n */\n _template: function(options) {\n return '
            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-drilldown.js\n ** module id = 53\n ** module chunks = 0 3\n **/","/**\n * This class creates/wraps a default html select field as backbone class.\n */\ndefine(['utils/utils', 'mvc/ui/ui-buttons'], function(Utils, Buttons) {\nvar View = Backbone.View.extend({\n // options\n optionsDefault: {\n id : Utils.uid(),\n cls : 'ui-select',\n error_text : 'No options available',\n empty_text : 'Nothing selected',\n visible : true,\n wait : false,\n multiple : false,\n searchable : true,\n optional : false\n },\n\n // initialize\n initialize: function(options) {\n // link this\n var self = this;\n this.model = new Backbone.Model();\n\n // configure options\n this.options = Utils.merge(options, this.optionsDefault);\n\n // create new element\n this.setElement(this._template(this.options));\n\n // link elements\n this.$select = this.$el.find('.select');\n this.$icon_dropdown = this.$el.find('.icon-dropdown');\n this.$icon_dropdown.on( 'click', function() { self.$select.select2 && self.$select.select2( 'open' ) });\n\n // allow regular multi-select field to be resized\n var minHeight = null;\n this.$('.icon-resize').on('mousedown', function(event) {\n var currentY = event.pageY;\n var currentHeight = self.$select.height();\n minHeight = minHeight || currentHeight;\n $('#dd-helper').show().on('mousemove', function(event) {\n self.$select.height(Math.max(currentHeight + (event.pageY - currentY), minHeight));\n }).on('mouseup mouseleave', function() {\n $('#dd-helper').hide().off();\n });\n });\n\n // multiple select fields have an additional button and other custom properties\n if (this.options.multiple) {\n // create select all button\n if (this.options.searchable) {\n this.all_button = new Buttons.ButtonCheck({\n onclick: function() {\n var new_value = [];\n if (self.all_button.value() !== 0) {\n new_value = self._availableOptions();\n }\n self.value(new_value);\n self.trigger('change');\n }\n });\n this.$el.prepend(this.all_button.$el);\n } else {\n this.$el.addClass('ui-select-multiple');\n }\n this.$select.prop('multiple', true);\n this.$icon_dropdown.remove();\n }\n\n // update initial options\n this.update(this.options.data);\n\n // set initial value\n if (this.options.value !== undefined) {\n this.value(this.options.value);\n }\n\n // show/hide\n if (!this.options.visible) {\n this.hide();\n }\n\n // wait\n if (this.options.wait) {\n this.wait();\n } else {\n this.show();\n }\n\n // add change event. fires only on user activity\n this.$select.on('change', function() {\n self.trigger('change');\n });\n\n // add change event. fires on trigger\n this.on('change', function() {\n self.options.onchange && self.options.onchange(this.value());\n });\n },\n\n /** Return/Set current selection\n */\n value: function (new_value) {\n // set new value\n if (new_value !== undefined) {\n if (new_value === null) {\n new_value = '__null__';\n }\n if (this.exists(new_value) || this.options.multiple) {\n this.$select.val(new_value);\n if (this.$select.select2) {\n this.$select.select2('val', new_value);\n }\n }\n }\n // get current value\n var current = this._getValue();\n if (this.all_button) {\n this.all_button.value($.isArray(current) && current.length || 0, this._size());\n }\n return current;\n },\n\n /** Return the first select option\n */\n first: function() {\n var options = this.$select.find('option').first();\n if (options.length > 0) {\n return options.val();\n } else {\n return null;\n }\n },\n\n /** Return the label/text of the current selection\n */\n text: function () {\n return this.$select.find('option:selected').text();\n },\n\n /** Show the select field\n */\n show: function() {\n this.unwait();\n this.$select.show();\n this.$el.show();\n },\n\n /** Hide the select field\n */\n hide: function() {\n this.$el.hide();\n },\n\n /** Show a spinner indicating that the select options are currently loaded\n */\n wait: function() {\n this.$icon_dropdown.removeClass();\n this.$icon_dropdown.addClass('icon-dropdown fa fa-spinner fa-spin');\n },\n\n /** Hide spinner indicating that the request has been completed\n */\n unwait: function() {\n this.$icon_dropdown.removeClass();\n this.$icon_dropdown.addClass('icon-dropdown fa fa-caret-down');\n },\n\n /** Returns true if the field is disabled\n */\n disabled: function() {\n return this.$select.is(':disabled');\n },\n\n /** Enable the select field\n */\n enable: function() {\n this.$select.prop('disabled', false);\n },\n\n /** Disable the select field\n */\n disable: function() {\n this.$select.prop('disabled', true);\n },\n\n /** Update all available options at once\n */\n add: function( options, sorter ) {\n _.each( this.model.get( 'options' ), function( v ) {\n !_.findWhere( options, v ) && options.push( v );\n });\n sorter && options.sort( sorter );\n this.update( options );\n },\n update: function(options) {\n // backup current value\n var current = this._getValue();\n\n // remove all options\n this.$select.find('option').remove();\n\n // add optional field\n if (!this.options.multiple && this.options.optional) {\n this.$select.append(this._templateOption({value : '__null__', label : this.options.empty_text}));\n }\n\n // add new options\n this.model.set( 'options', options );\n for (var key in options) {\n this.$select.append(this._templateOption(options[key]));\n }\n\n // count remaining entries\n if (this._size() == 0) {\n // disable select field\n this.disable();\n\n // create placeholder\n this.$select.append(this._templateOption({value : '__null__', label : this.options.error_text}));\n } else {\n // enable select field\n this.enable();\n }\n\n // update to searchable field (in this case select2)\n if (this.options.searchable) {\n this.$select.select2('destroy');\n this.$select.select2({ closeOnSelect: !this.options.multiple });\n this.$( '.select2-container .select2-search input' ).off( 'blur' );\n }\n\n // set previous value\n this.value(current);\n\n // check if any value was set\n if (this._getValue() === null && !(this.options.multiple && this.options.optional)) {\n this.value(this.first());\n }\n },\n\n /** Set the custom onchange callback function\n */\n setOnChange: function(callback) {\n this.options.onchange = callback;\n },\n\n /** Check if a value is an existing option\n */\n exists: function(value) {\n return this.$select.find('option[value=\"' + value + '\"]').length > 0;\n },\n\n /** Get current value from dom\n */\n _getValue: function() {\n var val = this.$select.val();\n if (!Utils.validate(val)) {\n return null;\n }\n return val;\n },\n\n /** Returns all currently available options\n */\n _availableOptions: function() {\n var available = [];\n this.$select.find('option').each(function(i, e){\n available.push($(e).attr('value'));\n });\n return available;\n },\n\n /** Number of available options\n */\n _size: function() {\n return this.$select.find('option').length;\n },\n\n /** Template for select options\n */\n _templateOption: function(options) {\n return '';\n },\n\n /** Template for select view\n */\n _template: function(options) {\n return '
            ' +\n '' +\n '
            ' +\n '
            ';\n }\n});\n\nreturn {\n View : View\n};\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-slider.js\n ** module id = 57\n ** module chunks = 0 3\n **/","// dependencies\ndefine([], function() {\n\n// model\nvar Model = Backbone.Model.extend({\n defaults: {\n extension : 'auto',\n genome : '?',\n url_paste : '',\n status : 'init',\n info : null,\n file_name : '',\n file_mode : '',\n file_size : 0,\n file_type : null,\n file_path : '',\n file_data : null,\n percentage : 0,\n space_to_tab : false,\n to_posix_lines : true,\n enabled : true\n },\n reset: function(attr) {\n this.clear().set(this.defaults).set(attr);\n }\n});\n\n// collection\nvar Collection = Backbone.Collection.extend({\n model: Model\n});\n\n// return\nreturn {\n Model: Model,\n Collection : Collection\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/upload/upload-model.js\n ** module id = 58\n ** module chunks = 3\n **/","/**\n * This class defines a queue to ensure that multiple deferred callbacks are executed sequentially.\n */\ndefine(['utils/utils'], function( Utils ) {\nreturn Backbone.Model.extend({\n initialize: function(){\n this.active = {};\n this.last = null;\n },\n\n /** Adds a callback to the queue. Upon execution a deferred object is parsed to the callback i.e. callback( deferred ).\n * If the callback does not take any arguments, the deferred is resolved instantly.\n */\n execute: function( callback ) {\n var self = this;\n var id = Utils.uid();\n var has_deferred = callback.length > 0;\n\n // register process\n this.active[ id ] = true;\n\n // deferred process\n var process = $.Deferred();\n process.promise().always(function() {\n delete self.active[ id ];\n has_deferred && Galaxy.emit.debug( 'deferred::execute()', this.state().charAt(0).toUpperCase() + this.state().slice(1) + ' ' + id );\n });\n\n // deferred queue\n $.when( this.last ).always(function() {\n if ( self.active[ id ] ) {\n has_deferred && Galaxy.emit.debug( 'deferred::execute()', 'Running ' + id );\n callback( process );\n !has_deferred && process.resolve();\n } else {\n process.reject();\n }\n });\n this.last = process.promise();\n },\n\n /** Resets the promise queue. All currently queued but unexecuted callbacks/promises will be rejected.\n */\n reset: function() {\n Galaxy.emit.debug('deferred::execute()', 'Reset');\n for ( var i in this.active ) {\n this.active[ i ] = false;\n }\n },\n\n /** Returns true if all processes are done.\n */\n ready: function() {\n return $.isEmptyObject( this.active );\n }\n});\n\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/utils/deferred.js\n ** module id = 60\n ** module chunks = 0 3\n **/","define([], function(){\n// ============================================================================\nfunction get( key, queryString ){\n queryString = queryString || window.location.search.substr( 1 );\n var keyRegex = new RegExp( key + '=([^&#$]+)' ),\n matches = queryString.match( keyRegex );\n if( !matches || !matches.length ){\n return undefined;\n }\n matches = matches.splice( 1 );\n if( matches.length === 1 ){\n return matches[0];\n }\n return matches;\n}\n\nfunction parse( queryString ){\n if( !queryString ){ return {}; }\n var parsed = {},\n split = queryString.split( '&' );\n split.forEach( function( pairString ){\n var pair = pairString.split( '=' );\n parsed[ pair[0] ] = decodeURI( pair[1] );\n });\n return parsed;\n}\n\n// ============================================================================\n return {\n get : get,\n parse : parse,\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/utils/query-string-parsing.js\n ** module id = 61\n ** module chunks = 0 3\n **/","var Handlebars = require(\"/Users/guerler/galaxy/client/node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"\\n
            \\n
            \\n
            \";\n},\"useData\":true});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/templates/panel_section.handlebars\n ** module id = 63\n ** module chunks = 0 3\n **/","var Handlebars = require(\"/Users/guerler/galaxy/client/node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
            \\n \\n
            \\n \"\n + ((stack1 = ((helper = (helper = helpers.html || (depth0 != null ? depth0.html : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"html\",\"hash\":{},\"data\":data}) : helper))) != null ? stack1 : \"\")\n + \"\\n
            \\n
            \\n \"\n + alias4(((helper = (helper = helpers.help || (depth0 != null ? depth0.help : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"help\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n
            \\n
            \\n
            \\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
            \"\n + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n + \" (version \"\n + alias4(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n + \")
            \\n
            \\n\"\n + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.inputs : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
            \\n
            \\n \\n
            \\n
            \\n
            \"\n + alias4(((helper = (helper = helpers.help || (depth0 != null ? depth0.help : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"help\",\"hash\":{},\"data\":data}) : helper)))\n + \"
            \\n
            \";\n},\"useData\":true});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/templates/tool_form.handlebars\n ** module id = 64\n ** module chunks = 0 3\n **/","var Handlebars = require(\"/Users/guerler/galaxy/client/node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n var alias1=container.lambda, alias2=container.escapeExpression;\n\n return \"\"\n + alias2(alias1(depth0, depth0))\n + \" \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"\"\n + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.labels : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n\"\n + alias4(((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"description\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n\";\n},\"useData\":true});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/templates/tool_link.handlebars\n ** module id = 65\n ** module chunks = 0 3\n **/","var Handlebars = require(\"/Users/guerler/galaxy/client/node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"\\n \\n\\n\";\n},\"useData\":true});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/templates/tool_search.handlebars\n ** module id = 66\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// istanbul ignore next\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _handlebarsBase = require('./handlebars/base');\n\nvar base = _interopRequireWildcard(_handlebarsBase);\n\n// Each of these augment the Handlebars object. No need to setup here.\n// (This is done to easily share code between commonjs and browse envs)\n\nvar _handlebarsSafeString = require('./handlebars/safe-string');\n\nvar _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);\n\nvar _handlebarsException = require('./handlebars/exception');\n\nvar _handlebarsException2 = _interopRequireDefault(_handlebarsException);\n\nvar _handlebarsUtils = require('./handlebars/utils');\n\nvar Utils = _interopRequireWildcard(_handlebarsUtils);\n\nvar _handlebarsRuntime = require('./handlebars/runtime');\n\nvar runtime = _interopRequireWildcard(_handlebarsRuntime);\n\nvar _handlebarsNoConflict = require('./handlebars/no-conflict');\n\nvar _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);\n\n// For compatibility and usage outside of module systems, make the Handlebars object a namespace\nfunction create() {\n var hb = new base.HandlebarsEnvironment();\n\n Utils.extend(hb, base);\n hb.SafeString = _handlebarsSafeString2['default'];\n hb.Exception = _handlebarsException2['default'];\n hb.Utils = Utils;\n hb.escapeExpression = Utils.escapeExpression;\n\n hb.VM = runtime;\n hb.template = function (spec) {\n return runtime.template(spec, hb);\n };\n\n return hb;\n}\n\nvar inst = create();\ninst.create = create;\n\n_handlebarsNoConflict2['default'](inst);\n\ninst['default'] = inst;\n\nexports['default'] = inst;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oYW5kbGViYXJzLnJ1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OEJBQXNCLG1CQUFtQjs7SUFBN0IsSUFBSTs7Ozs7b0NBSU8sMEJBQTBCOzs7O21DQUMzQix3QkFBd0I7Ozs7K0JBQ3ZCLG9CQUFvQjs7SUFBL0IsS0FBSzs7aUNBQ1Esc0JBQXNCOztJQUFuQyxPQUFPOztvQ0FFSSwwQkFBMEI7Ozs7O0FBR2pELFNBQVMsTUFBTSxHQUFHO0FBQ2hCLE1BQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0FBRTFDLE9BQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLElBQUUsQ0FBQyxVQUFVLG9DQUFhLENBQUM7QUFDM0IsSUFBRSxDQUFDLFNBQVMsbUNBQVksQ0FBQztBQUN6QixJQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNqQixJQUFFLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDOztBQUU3QyxJQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNoQixJQUFFLENBQUMsUUFBUSxHQUFHLFVBQVMsSUFBSSxFQUFFO0FBQzNCLFdBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDbkMsQ0FBQzs7QUFFRixTQUFPLEVBQUUsQ0FBQztDQUNYOztBQUVELElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztBQUVyQixrQ0FBVyxJQUFJLENBQUMsQ0FBQzs7QUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzs7cUJBRVIsSUFBSSIsImZpbGUiOiJoYW5kbGViYXJzLnJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars.runtime.js\n ** module id = 67\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.registerDefaultDecorators = registerDefaultDecorators;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _decoratorsInline = require('./decorators/inline');\n\nvar _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);\n\nfunction registerDefaultDecorators(instance) {\n _decoratorsInline2['default'](instance);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Z0NBQTJCLHFCQUFxQjs7OztBQUV6QyxTQUFTLHlCQUF5QixDQUFDLFFBQVEsRUFBRTtBQUNsRCxnQ0FBZSxRQUFRLENBQUMsQ0FBQztDQUMxQiIsImZpbGUiOiJkZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlZ2lzdGVySW5saW5lIGZyb20gJy4vZGVjb3JhdG9ycy9pbmxpbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICByZWdpc3RlcklubGluZShpbnN0YW5jZSk7XG59XG5cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/decorators.js\n ** module id = 68\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n instance.registerDecorator('inline', function (fn, props, container, options) {\n var ret = fn;\n if (!props.partials) {\n props.partials = {};\n ret = function (context, options) {\n // Create a new partials stack frame prior to exec.\n var original = container.partials;\n container.partials = _utils.extend({}, original, props.partials);\n var ret = fn(context, options);\n container.partials = original;\n return ret;\n };\n }\n\n props.partials[options.args[0]] = options.fn;\n\n return ret;\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMvaW5saW5lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQXFCLFVBQVU7O3FCQUVoQixVQUFTLFFBQVEsRUFBRTtBQUNoQyxVQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNiLFFBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ25CLFdBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQUcsR0FBRyxVQUFTLE9BQU8sRUFBRSxPQUFPLEVBQUU7O0FBRS9CLFlBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDbEMsaUJBQVMsQ0FBQyxRQUFRLEdBQUcsY0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRCxZQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLGlCQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixlQUFPLEdBQUcsQ0FBQztPQUNaLENBQUM7S0FDSDs7QUFFRCxTQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUU3QyxXQUFPLEdBQUcsQ0FBQztHQUNaLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6ImlubGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIGxldCByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFydGlhbHMgc3RhY2sgZnJhbWUgcHJpb3IgdG8gZXhlYy5cbiAgICAgICAgbGV0IG9yaWdpbmFsID0gY29udGFpbmVyLnBhcnRpYWxzO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBleHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7XG4gICAgICAgIGxldCByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHByb3BzLnBhcnRpYWxzW29wdGlvbnMuYXJnc1swXV0gPSBvcHRpb25zLmZuO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/decorators/inline.js\n ** module id = 69\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.registerDefaultHelpers = registerDefaultHelpers;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _helpersBlockHelperMissing = require('./helpers/block-helper-missing');\n\nvar _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);\n\nvar _helpersEach = require('./helpers/each');\n\nvar _helpersEach2 = _interopRequireDefault(_helpersEach);\n\nvar _helpersHelperMissing = require('./helpers/helper-missing');\n\nvar _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);\n\nvar _helpersIf = require('./helpers/if');\n\nvar _helpersIf2 = _interopRequireDefault(_helpersIf);\n\nvar _helpersLog = require('./helpers/log');\n\nvar _helpersLog2 = _interopRequireDefault(_helpersLog);\n\nvar _helpersLookup = require('./helpers/lookup');\n\nvar _helpersLookup2 = _interopRequireDefault(_helpersLookup);\n\nvar _helpersWith = require('./helpers/with');\n\nvar _helpersWith2 = _interopRequireDefault(_helpersWith);\n\nfunction registerDefaultHelpers(instance) {\n _helpersBlockHelperMissing2['default'](instance);\n _helpersEach2['default'](instance);\n _helpersHelperMissing2['default'](instance);\n _helpersIf2['default'](instance);\n _helpersLog2['default'](instance);\n _helpersLookup2['default'](instance);\n _helpersWith2['default'](instance);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7eUNBQXVDLGdDQUFnQzs7OzsyQkFDOUMsZ0JBQWdCOzs7O29DQUNQLDBCQUEwQjs7Ozt5QkFDckMsY0FBYzs7OzswQkFDYixlQUFlOzs7OzZCQUNaLGtCQUFrQjs7OzsyQkFDcEIsZ0JBQWdCOzs7O0FBRWxDLFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO0FBQy9DLHlDQUEyQixRQUFRLENBQUMsQ0FBQztBQUNyQywyQkFBYSxRQUFRLENBQUMsQ0FBQztBQUN2QixvQ0FBc0IsUUFBUSxDQUFDLENBQUM7QUFDaEMseUJBQVcsUUFBUSxDQUFDLENBQUM7QUFDckIsMEJBQVksUUFBUSxDQUFDLENBQUM7QUFDdEIsNkJBQWUsUUFBUSxDQUFDLENBQUM7QUFDekIsMkJBQWEsUUFBUSxDQUFDLENBQUM7Q0FDeEIiLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers.js\n ** module id = 70\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n instance.registerHelper('blockHelperMissing', function (context, options) {\n var inverse = options.inverse,\n fn = options.fn;\n\n if (context === true) {\n return fn(this);\n } else if (context === false || context == null) {\n return inverse(this);\n } else if (_utils.isArray(context)) {\n if (context.length > 0) {\n if (options.ids) {\n options.ids = [options.name];\n }\n\n return instance.helpers.each(context, options);\n } else {\n return inverse(this);\n }\n } else {\n if (options.data && options.ids) {\n var data = _utils.createFrame(options.data);\n data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);\n options = { data: data };\n }\n\n return fn(context, options);\n }\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBc0QsVUFBVTs7cUJBRWpELFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3ZFLFFBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPO1FBQ3pCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDcEIsYUFBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakIsTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUMvQyxhQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QixNQUFNLElBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUMzQixVQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3RCLFlBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUNmLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCOztBQUVELGVBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQ2hELE1BQU07QUFDTCxlQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN0QjtLQUNGLE1BQU07QUFDTCxVQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixZQUFJLElBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLGVBQU8sR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztPQUN4Qjs7QUFFRCxhQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0I7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJibG9jay1oZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGNyZWF0ZUZyYW1lLCBpc0FycmF5fSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgbGV0IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgaWYgKGNvbnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgICBvcHRpb25zLmlkcyA9IFtvcHRpb25zLm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGxldCBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHtkYXRhOiBkYXRhfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js\n ** module id = 71\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _utils = require('../utils');\n\nvar _exception = require('../exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n instance.registerHelper('each', function (context, options) {\n if (!options) {\n throw new _exception2['default']('Must pass iterator to #each');\n }\n\n var fn = options.fn,\n inverse = options.inverse,\n i = 0,\n ret = '',\n data = undefined,\n contextPath = undefined;\n\n if (options.data && options.ids) {\n contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n }\n\n if (_utils.isFunction(context)) {\n context = context.call(this);\n }\n\n if (options.data) {\n data = _utils.createFrame(options.data);\n }\n\n function execIteration(field, index, last) {\n if (data) {\n data.key = field;\n data.index = index;\n data.first = index === 0;\n data.last = !!last;\n\n if (contextPath) {\n data.contextPath = contextPath + field;\n }\n }\n\n ret = ret + fn(context[field], {\n data: data,\n blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])\n });\n }\n\n if (context && typeof context === 'object') {\n if (_utils.isArray(context)) {\n for (var j = context.length; i < j; i++) {\n if (i in context) {\n execIteration(i, i, i === context.length - 1);\n }\n }\n } else {\n var priorKey = undefined;\n\n for (var key in context) {\n if (context.hasOwnProperty(key)) {\n // We're running the iterations one step out of sync so we can detect\n // the last iteration without have to scan the object twice and create\n // an itermediate keys array.\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1);\n }\n priorKey = key;\n i++;\n }\n }\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1, true);\n }\n }\n }\n\n if (i === 0) {\n ret = inverse(this);\n }\n\n return ret;\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvZWFjaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUErRSxVQUFVOzt5QkFDbkUsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksQ0FBQyxPQUFPLEVBQUU7QUFDWixZQUFNLDJCQUFjLDZCQUE2QixDQUFDLENBQUM7S0FDcEQ7O0FBRUQsUUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUU7UUFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU87UUFDekIsQ0FBQyxHQUFHLENBQUM7UUFDTCxHQUFHLEdBQUcsRUFBRTtRQUNSLElBQUksWUFBQTtRQUNKLFdBQVcsWUFBQSxDQUFDOztBQUVoQixRQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixpQkFBVyxHQUFHLHlCQUFrQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pGOztBQUVELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDaEIsVUFBSSxHQUFHLG1CQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQzs7QUFFRCxhQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN6QyxVQUFJLElBQUksRUFBRTtBQUNSLFlBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUN6QixZQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0FBRW5CLFlBQUksV0FBVyxFQUFFO0FBQ2YsY0FBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3hDO09BQ0Y7O0FBRUQsU0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQUksRUFBRSxJQUFJO0FBQ1YsbUJBQVcsRUFBRSxtQkFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDL0UsQ0FBQyxDQUFDO0tBQ0o7O0FBRUQsUUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQzFDLFVBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNwQixhQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxjQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDaEIseUJBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1dBQy9DO1NBQ0Y7T0FDRixNQUFNO0FBQ0wsWUFBSSxRQUFRLFlBQUEsQ0FBQzs7QUFFYixhQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRTtBQUN2QixjQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Ozs7QUFJL0IsZ0JBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQiwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDaEM7QUFDRCxvQkFBUSxHQUFHLEdBQUcsQ0FBQztBQUNmLGFBQUMsRUFBRSxDQUFDO1dBQ0w7U0FDRjtBQUNELFlBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQix1QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDWCxTQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCOztBQUVELFdBQU8sR0FBRyxDQUFDO0dBQ1osQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoiZWFjaC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/each.js\n ** module id = 72\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _exception = require('../exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n instance.registerHelper('helperMissing', function () /* [args, ]options */{\n if (arguments.length === 1) {\n // A missing field in a {{foo}} construct.\n return undefined;\n } else {\n // Someone is actually trying to call something, blow up.\n throw new _exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n }\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozt5QkFBc0IsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsaUNBQWdDO0FBQ3ZFLFFBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O0FBRTFCLGFBQU8sU0FBUyxDQUFDO0tBQ2xCLE1BQU07O0FBRUwsWUFBTSwyQkFBYyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDdkY7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJoZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/helper-missing.js\n ** module id = 73\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n instance.registerHelper('if', function (conditional, options) {\n if (_utils.isFunction(conditional)) {\n conditional = conditional.call(this);\n }\n\n // Default behavior is to render the positive path if the value is truthy and not empty.\n // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {\n return options.inverse(this);\n } else {\n return options.fn(this);\n }\n });\n\n instance.registerHelper('unless', function (conditional, options) {\n return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBa0MsVUFBVTs7cUJBRTdCLFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVMsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMzRCxRQUFJLGtCQUFXLFdBQVcsQ0FBQyxFQUFFO0FBQUUsaUJBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQUU7Ozs7O0FBS3RFLFFBQUksQUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxJQUFLLGVBQVEsV0FBVyxDQUFDLEVBQUU7QUFDdkUsYUFBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCLE1BQU07QUFDTCxhQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7R0FDRixDQUFDLENBQUM7O0FBRUgsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxXQUFXLEVBQUUsT0FBTyxFQUFFO0FBQy9ELFdBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztHQUN2SCxDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJpZi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNFbXB0eSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkgeyBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7IH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCkgfHwgaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pO1xuICB9KTtcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/if.js\n ** module id = 74\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n instance.registerHelper('log', function () /* message, options */{\n var args = [undefined],\n options = arguments[arguments.length - 1];\n for (var i = 0; i < arguments.length - 1; i++) {\n args.push(arguments[i]);\n }\n\n var level = 1;\n if (options.hash.level != null) {\n level = options.hash.level;\n } else if (options.data && options.data.level != null) {\n level = options.data.level;\n }\n args[0] = level;\n\n instance.log.apply(instance, args);\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0NBQWlDO0FBQzlELFFBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2xCLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsVUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6Qjs7QUFFRCxRQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxRQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtBQUM5QixXQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ3JELFdBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM1QjtBQUNELFFBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0FBRWhCLFlBQVEsQ0FBQyxHQUFHLE1BQUEsQ0FBWixRQUFRLEVBQVMsSUFBSSxDQUFDLENBQUM7R0FDeEIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/log.js\n ** module id = 75\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n instance.registerHelper('lookup', function (obj, field) {\n return obj && obj[field];\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3JELFdBQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUMxQixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJsb29rdXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9va3VwJywgZnVuY3Rpb24ob2JqLCBmaWVsZCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/lookup.js\n ** module id = 76\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n instance.registerHelper('with', function (context, options) {\n if (_utils.isFunction(context)) {\n context = context.call(this);\n }\n\n var fn = options.fn;\n\n if (!_utils.isEmpty(context)) {\n var data = options.data;\n if (options.data && options.ids) {\n data = _utils.createFrame(options.data);\n data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);\n }\n\n return fn(context, {\n data: data,\n blockParams: _utils.blockParams([context], [data && data.contextPath])\n });\n } else {\n return options.inverse(this);\n }\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvd2l0aC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUErRSxVQUFVOztxQkFFMUUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLENBQUMsZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNyQixVQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLFVBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQy9CLFlBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ2hGOztBQUVELGFBQU8sRUFBRSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLEVBQUUsSUFBSTtBQUNWLG1CQUFXLEVBQUUsbUJBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7T0FDaEUsQ0FBQyxDQUFDO0tBQ0osTUFBTTtBQUNMLGFBQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QjtHQUNGLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6IndpdGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/with.js\n ** module id = 77\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('./utils');\n\nvar logger = {\n methodMap: ['debug', 'info', 'warn', 'error'],\n level: 'info',\n\n // Maps a given level value to the `methodMap` indexes above.\n lookupLevel: function lookupLevel(level) {\n if (typeof level === 'string') {\n var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());\n if (levelMap >= 0) {\n level = levelMap;\n } else {\n level = parseInt(level, 10);\n }\n }\n\n return level;\n },\n\n // Can be overridden in the host environment\n log: function log(level) {\n level = logger.lookupLevel(level);\n\n if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n var method = logger.methodMap[level];\n if (!console[method]) {\n // eslint-disable-line no-console\n method = 'log';\n }\n\n for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n message[_key - 1] = arguments[_key];\n }\n\n console[method].apply(console, message); // eslint-disable-line no-console\n }\n }\n};\n\nexports['default'] = logger;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFzQixTQUFTOztBQUUvQixJQUFJLE1BQU0sR0FBRztBQUNYLFdBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUM3QyxPQUFLLEVBQUUsTUFBTTs7O0FBR2IsYUFBVyxFQUFFLHFCQUFTLEtBQUssRUFBRTtBQUMzQixRQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUM3QixVQUFJLFFBQVEsR0FBRyxlQUFRLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUQsVUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxRQUFRLENBQUM7T0FDbEIsTUFBTTtBQUNMLGFBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO09BQzdCO0tBQ0Y7O0FBRUQsV0FBTyxLQUFLLENBQUM7R0FDZDs7O0FBR0QsS0FBRyxFQUFFLGFBQVMsS0FBSyxFQUFjO0FBQy9CLFNBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVsQyxRQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDL0UsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxVQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFOztBQUNwQixjQUFNLEdBQUcsS0FBSyxDQUFDO09BQ2hCOzt3Q0FQbUIsT0FBTztBQUFQLGVBQU87OztBQVEzQixhQUFPLENBQUMsTUFBTSxPQUFDLENBQWYsT0FBTyxFQUFZLE9BQU8sQ0FBQyxDQUFDO0tBQzdCO0dBQ0Y7Q0FDRixDQUFDOztxQkFFYSxNQUFNIiwiZmlsZSI6ImxvZ2dlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIG1ldGhvZCA9ICdsb2cnO1xuICAgICAgfVxuICAgICAgY29uc29sZVttZXRob2RdKC4uLm1lc3NhZ2UpOyAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlcjtcbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/logger.js\n ** module id = 78\n ** module chunks = 0 3\n **/","/* global window */\n'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (Handlebars) {\n /* istanbul ignore next */\n var root = typeof global !== 'undefined' ? global : window,\n $Handlebars = root.Handlebars;\n /* istanbul ignore next */\n Handlebars.noConflict = function () {\n if (root.Handlebars === Handlebars) {\n root.Handlebars = $Handlebars;\n }\n return Handlebars;\n };\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O3FCQUNlLFVBQVMsVUFBVSxFQUFFOztBQUVsQyxNQUFJLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU07TUFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0FBRWxDLFlBQVUsQ0FBQyxVQUFVLEdBQUcsWUFBVztBQUNqQyxRQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO0FBQ2xDLFVBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0tBQy9CO0FBQ0QsV0FBTyxVQUFVLENBQUM7R0FDbkIsQ0FBQztDQUNIIiwiZmlsZSI6Im5vLWNvbmZsaWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBsZXQgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgICByZXR1cm4gSGFuZGxlYmFycztcbiAgfTtcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/no-conflict.js\n ** module id = 79\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.checkRevision = checkRevision;\nexports.template = template;\nexports.wrapProgram = wrapProgram;\nexports.resolvePartial = resolvePartial;\nexports.invokePartial = invokePartial;\nexports.noop = noop;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// istanbul ignore next\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _utils = require('./utils');\n\nvar Utils = _interopRequireWildcard(_utils);\n\nvar _exception = require('./exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _base = require('./base');\n\nfunction checkRevision(compilerInfo) {\n var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n currentRevision = _base.COMPILER_REVISION;\n\n if (compilerRevision !== currentRevision) {\n if (compilerRevision < currentRevision) {\n var runtimeVersions = _base.REVISION_CHANGES[currentRevision],\n compilerVersions = _base.REVISION_CHANGES[compilerRevision];\n throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n } else {\n // Use the embedded version info since the runtime doesn't know about this revision yet\n throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n }\n }\n}\n\nfunction template(templateSpec, env) {\n /* istanbul ignore next */\n if (!env) {\n throw new _exception2['default']('No environment passed to template');\n }\n if (!templateSpec || !templateSpec.main) {\n throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);\n }\n\n templateSpec.main.decorator = templateSpec.main_d;\n\n // Note: Using env.VM references rather than local var references throughout this section to allow\n // for external users to override these as psuedo-supported APIs.\n env.VM.checkRevision(templateSpec.compiler);\n\n function invokePartialWrapper(partial, context, options) {\n if (options.hash) {\n context = Utils.extend({}, context, options.hash);\n if (options.ids) {\n options.ids[0] = true;\n }\n }\n\n partial = env.VM.resolvePartial.call(this, partial, context, options);\n var result = env.VM.invokePartial.call(this, partial, context, options);\n\n if (result == null && env.compile) {\n options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n result = options.partials[options.name](context, options);\n }\n if (result != null) {\n if (options.indent) {\n var lines = result.split('\\n');\n for (var i = 0, l = lines.length; i < l; i++) {\n if (!lines[i] && i + 1 === l) {\n break;\n }\n\n lines[i] = options.indent + lines[i];\n }\n result = lines.join('\\n');\n }\n return result;\n } else {\n throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n }\n }\n\n // Just add water\n var container = {\n strict: function strict(obj, name) {\n if (!(name in obj)) {\n throw new _exception2['default']('\"' + name + '\" not defined in ' + obj);\n }\n return obj[name];\n },\n lookup: function lookup(depths, name) {\n var len = depths.length;\n for (var i = 0; i < len; i++) {\n if (depths[i] && depths[i][name] != null) {\n return depths[i][name];\n }\n }\n },\n lambda: function lambda(current, context) {\n return typeof current === 'function' ? current.call(context) : current;\n },\n\n escapeExpression: Utils.escapeExpression,\n invokePartial: invokePartialWrapper,\n\n fn: function fn(i) {\n var ret = templateSpec[i];\n ret.decorator = templateSpec[i + '_d'];\n return ret;\n },\n\n programs: [],\n program: function program(i, data, declaredBlockParams, blockParams, depths) {\n var programWrapper = this.programs[i],\n fn = this.fn(i);\n if (data || depths || blockParams || declaredBlockParams) {\n programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n } else if (!programWrapper) {\n programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n }\n return programWrapper;\n },\n\n data: function data(value, depth) {\n while (value && depth--) {\n value = value._parent;\n }\n return value;\n },\n merge: function merge(param, common) {\n var obj = param || common;\n\n if (param && common && param !== common) {\n obj = Utils.extend({}, common, param);\n }\n\n return obj;\n },\n\n noop: env.VM.noop,\n compilerInfo: templateSpec.compiler\n };\n\n function ret(context) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var data = options.data;\n\n ret._setup(options);\n if (!options.partial && templateSpec.useData) {\n data = initData(context, data);\n }\n var depths = undefined,\n blockParams = templateSpec.useBlockParams ? [] : undefined;\n if (templateSpec.useDepths) {\n if (options.depths) {\n depths = context !== options.depths[0] ? [context].concat(options.depths) : options.depths;\n } else {\n depths = [context];\n }\n }\n\n function main(context /*, options*/) {\n return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n }\n main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n return main(context, options);\n }\n ret.isTop = true;\n\n ret._setup = function (options) {\n if (!options.partial) {\n container.helpers = container.merge(options.helpers, env.helpers);\n\n if (templateSpec.usePartial) {\n container.partials = container.merge(options.partials, env.partials);\n }\n if (templateSpec.usePartial || templateSpec.useDecorators) {\n container.decorators = container.merge(options.decorators, env.decorators);\n }\n } else {\n container.helpers = options.helpers;\n container.partials = options.partials;\n container.decorators = options.decorators;\n }\n };\n\n ret._child = function (i, data, blockParams, depths) {\n if (templateSpec.useBlockParams && !blockParams) {\n throw new _exception2['default']('must pass block params');\n }\n if (templateSpec.useDepths && !depths) {\n throw new _exception2['default']('must pass parent depths');\n }\n\n return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n };\n return ret;\n}\n\nfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n function prog(context) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var currentDepths = depths;\n if (depths && context !== depths[0]) {\n currentDepths = [context].concat(depths);\n }\n\n return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);\n }\n\n prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\n prog.program = i;\n prog.depth = depths ? depths.length : 0;\n prog.blockParams = declaredBlockParams || 0;\n return prog;\n}\n\nfunction resolvePartial(partial, context, options) {\n if (!partial) {\n if (options.name === '@partial-block') {\n partial = options.data['partial-block'];\n } else {\n partial = options.partials[options.name];\n }\n } else if (!partial.call && !options.name) {\n // This is a dynamic partial that returned a string\n options.name = partial;\n partial = options.partials[partial];\n }\n return partial;\n}\n\nfunction invokePartial(partial, context, options) {\n options.partial = true;\n if (options.ids) {\n options.data.contextPath = options.ids[0] || options.data.contextPath;\n }\n\n var partialBlock = undefined;\n if (options.fn && options.fn !== noop) {\n options.data = _base.createFrame(options.data);\n partialBlock = options.data['partial-block'] = options.fn;\n\n if (partialBlock.partials) {\n options.partials = Utils.extend({}, options.partials, partialBlock.partials);\n }\n }\n\n if (partial === undefined && partialBlock) {\n partial = partialBlock;\n }\n\n if (partial === undefined) {\n throw new _exception2['default']('The partial ' + options.name + ' could not be found');\n } else if (partial instanceof Function) {\n return partial(context, options);\n }\n}\n\nfunction noop() {\n return '';\n}\n\nfunction initData(context, data) {\n if (!data || !('root' in data)) {\n data = data ? _base.createFrame(data) : {};\n data.root = context;\n }\n return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n if (fn.decorator) {\n var props = {};\n prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n Utils.extend(prog, props);\n }\n return prog;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQXVCLFNBQVM7O0lBQXBCLEtBQUs7O3lCQUNLLGFBQWE7Ozs7b0JBQzhCLFFBQVE7O0FBRWxFLFNBQVMsYUFBYSxDQUFDLFlBQVksRUFBRTtBQUMxQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztNQUN2RCxlQUFlLDBCQUFvQixDQUFDOztBQUUxQyxNQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRTtBQUN4QyxRQUFJLGdCQUFnQixHQUFHLGVBQWUsRUFBRTtBQUN0QyxVQUFNLGVBQWUsR0FBRyx1QkFBaUIsZUFBZSxDQUFDO1VBQ25ELGdCQUFnQixHQUFHLHVCQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVELFlBQU0sMkJBQWMseUZBQXlGLEdBQ3ZHLHFEQUFxRCxHQUFHLGVBQWUsR0FBRyxtREFBbUQsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNoSyxNQUFNOztBQUVMLFlBQU0sMkJBQWMsd0ZBQXdGLEdBQ3RHLGlEQUFpRCxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNuRjtHQUNGO0NBQ0Y7O0FBRU0sU0FBUyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTs7QUFFMUMsTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNSLFVBQU0sMkJBQWMsbUNBQW1DLENBQUMsQ0FBQztHQUMxRDtBQUNELE1BQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ3ZDLFVBQU0sMkJBQWMsMkJBQTJCLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQztHQUN4RTs7QUFFRCxjQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDOzs7O0FBSWxELEtBQUcs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U0FBUyxJQUFJLEdBQUc7QUFBRSxTQUFPLEVBQUUsQ0FBQztDQUFFOztBQUVyQyxTQUFTLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQy9CLE1BQUksQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFBLEFBQUMsRUFBRTtBQUM5QixRQUFJLEdBQUcsSUFBSSxHQUFHLGtCQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztHQUNyQjtBQUNELFNBQU8sSUFBSSxDQUFDO0NBQ2I7O0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtBQUN6RSxNQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUU7QUFDaEIsUUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ2YsUUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVGLFNBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0dBQzNCO0FBQ0QsU0FBTyxJQUFJLENBQUM7Q0FDYiIsImZpbGUiOiJydW50aW1lLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vZXhjZXB0aW9uJztcbmltcG9ydCB7IENPTVBJTEVSX1JFVklTSU9OLCBSRVZJU0lPTl9DSEFOR0VTLCBjcmVhdGVGcmFtZSB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICBjb25zdCBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLFxuICAgICAgICBjdXJyZW50UmV2aXNpb24gPSBDT01QSUxFUl9SRVZJU0lPTjtcblxuICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7XG4gICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlzaW9uXSxcbiAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dO1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIHJ1bnRpbWVWZXJzaW9ucyArICcpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVyVmVyc2lvbnMgKyAnKS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVySW5mb1sxXSArICcpLicpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGUnKTtcbiAgfVxuICBpZiAoIXRlbXBsYXRlU3BlYyB8fCAhdGVtcGxhdGVTcGVjLm1haW4pIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmtub3duIHRlbXBsYXRlIG9iamVjdDogJyArIHR5cGVvZiB0ZW1wbGF0ZVNwZWMpO1xuICB9XG5cbiAgdGVtcGxhdGVTcGVjLm1haW4uZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjLm1haW5fZDtcblxuICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvd1xuICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLlxuICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpO1xuXG4gIGZ1bmN0aW9uIGludm9rZVBhcnRpYWxXcmFwcGVyKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICBjb250ZXh0ID0gVXRpbHMuZXh0ZW5kKHt9LCBjb250ZXh0LCBvcHRpb25zLmhhc2gpO1xuICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIG9wdGlvbnMuaWRzWzBdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJ0aWFsID0gZW52LlZNLnJlc29sdmVQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG4gICAgbGV0IHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7XG4gICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaW5lc1tpXSAmJiBpICsgMSA9PT0gbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGluZXNbaV0gPSBvcHRpb25zLmluZGVudCArIGxpbmVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGNvbXBpbGVkIHdoZW4gcnVubmluZyBpbiBydW50aW1lLW9ubHkgbW9kZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEp1c3QgYWRkIHdhdGVyXG4gIGxldCBjb250YWluZXIgPSB7XG4gICAgc3RyaWN0OiBmdW5jdGlvbihvYmosIG5hbWUpIHtcbiAgICAgIGlmICghKG5hbWUgaW4gb2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdcIicgKyBuYW1lICsgJ1wiIG5vdCBkZWZpbmVkIGluICcgKyBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgICB9LFxuICAgIGxvb2t1cDogZnVuY3Rpb24oZGVwdGhzLCBuYW1lKSB7XG4gICAgICBjb25zdCBsZW4gPSBkZXB0aHMubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZGVwdGhzW2ldICYmIGRlcHRoc1tpXVtuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbihjdXJyZW50LCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50O1xuICAgIH0sXG5cbiAgICBlc2NhcGVFeHByZXNzaW9uOiBVdGlscy5lc2NhcGVFeHByZXNzaW9uLFxuICAgIGludm9rZVBhcnRpYWw6IGludm9rZVBhcnRpYWxXcmFwcGVyLFxuXG4gICAgZm46IGZ1bmN0aW9uKGkpIHtcbiAgICAgIGxldCByZXQgPSB0ZW1wbGF0ZVNwZWNbaV07XG4gICAgICByZXQuZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjW2kgKyAnX2QnXTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSxcblxuICAgIHByb2dyYW1zOiBbXSxcbiAgICBwcm9ncmFtOiBmdW5jdGlvbihpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICBsZXQgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZSwgZGVwdGgpIHtcbiAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbihwYXJhbSwgY29tbW9uKSB7XG4gICAgICBsZXQgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIChwYXJhbSAhPT0gY29tbW9uKSkge1xuICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICBub29wOiBlbnYuVk0ubm9vcCxcbiAgICBjb21waWxlckluZm86IHRlbXBsYXRlU3BlYy5jb21waWxlclxuICB9O1xuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuICAgIHJldC5fc2V0dXAob3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHtcbiAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTtcbiAgICB9XG4gICAgbGV0IGRlcHRocyxcbiAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykge1xuICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7XG4gICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRocztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWluKGNvbnRleHQvKiwgb3B0aW9ucyovKSB7XG4gICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIH1cbiAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTtcbiAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxuICByZXQuaXNUb3AgPSB0cnVlO1xuXG4gIHJldC5fc2V0dXAgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHtcbiAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpO1xuXG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwpIHtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMucGFydGlhbHMsIGVudi5wYXJ0aWFscyk7XG4gICAgICB9XG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwgfHwgdGVtcGxhdGVTcGVjLnVzZURlY29yYXRvcnMpIHtcbiAgICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5kZWNvcmF0b3JzLCBlbnYuZGVjb3JhdG9ycyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gb3B0aW9ucy5oZWxwZXJzO1xuICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3B0aW9ucy5wYXJ0aWFscztcbiAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gb3B0aW9ucy5kZWNvcmF0b3JzO1xuICAgIH1cbiAgfTtcblxuICByZXQuX2NoaWxkID0gZnVuY3Rpb24oaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgJiYgIWJsb2NrUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7XG4gICAgfVxuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ211c3QgcGFzcyBwYXJlbnQgZGVwdGhzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgZnVuY3Rpb24gcHJvZyhjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgY3VycmVudERlcHRocyA9IGRlcHRocztcbiAgICBpZiAoZGVwdGhzICYmIGNvbnRleHQgIT09IGRlcHRoc1swXSkge1xuICAgICAgY3VycmVudERlcHRocyA9IFtjb250ZXh0XS5jb25jYXQoZGVwdGhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oY29udGFpbmVyLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLFxuICAgICAgICBvcHRpb25zLmRhdGEgfHwgZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXMgJiYgW29wdGlvbnMuYmxvY2tQYXJhbXNdLmNvbmNhdChibG9ja1BhcmFtcyksXG4gICAgICAgIGN1cnJlbnREZXB0aHMpO1xuICB9XG5cbiAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpO1xuXG4gIHByb2cucHJvZ3JhbSA9IGk7XG4gIHByb2cuZGVwdGggPSBkZXB0aHMgPyBkZXB0aHMubGVuZ3RoIDogMDtcbiAgcHJvZy5ibG9ja1BhcmFtcyA9IGRlY2xhcmVkQmxvY2tQYXJhbXMgfHwgMDtcbiAgcmV0dXJuIHByb2c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghcGFydGlhbCkge1xuICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHtcbiAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nXG4gICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTtcbiAgfVxuICByZXR1cm4gcGFydGlhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVBhcnRpYWwocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICBvcHRpb25zLnBhcnRpYWwgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICBvcHRpb25zLmRhdGEuY29udGV4dFBhdGggPSBvcHRpb25zLmlkc1swXSB8fCBvcHRpb25zLmRhdGEuY29udGV4dFBhdGg7XG4gIH1cblxuICBsZXQgcGFydGlhbEJsb2NrO1xuICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7XG4gICAgb3B0aW9ucy5kYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAocGFydGlhbEJsb2NrLnBhcnRpYWxzKSB7XG4gICAgICBvcHRpb25zLnBhcnRpYWxzID0gVXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zLnBhcnRpYWxzLCBwYXJ0aWFsQmxvY2sucGFydGlhbHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQgJiYgcGFydGlhbEJsb2NrKSB7XG4gICAgcGFydGlhbCA9IHBhcnRpYWxCbG9jaztcbiAgfVxuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgfSBlbHNlIGlmIChwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpIHsgcmV0dXJuICcnOyB9XG5cbmZ1bmN0aW9uIGluaXREYXRhKGNvbnRleHQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICEoJ3Jvb3QnIGluIGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEgPyBjcmVhdGVGcmFtZShkYXRhKSA6IHt9O1xuICAgIGRhdGEucm9vdCA9IGNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpIHtcbiAgaWYgKGZuLmRlY29yYXRvcikge1xuICAgIGxldCBwcm9wcyA9IHt9O1xuICAgIHByb2cgPSBmbi5kZWNvcmF0b3IocHJvZywgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGhzICYmIGRlcHRoc1swXSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgVXRpbHMuZXh0ZW5kKHByb2csIHByb3BzKTtcbiAgfVxuICByZXR1cm4gcHJvZztcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/runtime.js\n ** module id = 80\n ** module chunks = 0 3\n **/","// Build out our basic SafeString type\n'use strict';\n\nexports.__esModule = true;\nfunction SafeString(string) {\n this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n return '' + this.string;\n};\n\nexports['default'] = SafeString;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDMUIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEI7O0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBVztBQUN2RSxTQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3pCLENBQUM7O3FCQUVhLFVBQVUiLCJmaWxlIjoic2FmZS1zdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/safe-string.js\n ** module id = 81\n ** module chunks = 0 3\n **/","define([\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/editable-text\",\n], function( baseMVC, _l ){\n// =============================================================================\n/** A view on any model that has a 'annotation' attribute\n */\nvar AnnotationEditor = Backbone.View\n .extend( baseMVC.LoggableMixin )\n .extend( baseMVC.HiddenUntilActivatedViewMixin ).extend({\n\n tagName : 'div',\n className : 'annotation-display',\n\n /** Set up listeners, parse options */\n initialize : function( options ){\n options = options || {};\n this.tooltipConfig = options.tooltipConfig || { placement: 'bottom' };\n //console.debug( this, options );\n // only listen to the model only for changes to annotations\n this.listenTo( this.model, 'change:annotation', function(){\n this.render();\n });\n this.hiddenUntilActivated( options.$activator, options );\n },\n\n /** Build the DOM elements, call select to on the created input, and set up behaviors */\n render : function(){\n var view = this;\n this.$el.html( this._template() );\n this.$el.find( \"[title]\" ).tooltip( this.tooltipConfig );\n\n //TODO: handle empties better\n this.$annotation().make_text_editable({\n use_textarea: true,\n on_finish: function( newAnnotation ){\n view.$annotation().text( newAnnotation );\n view.model.save({ annotation: newAnnotation }, { silent: true })\n .fail( function(){\n view.$annotation().text( view.model.previous( 'annotation' ) );\n });\n }\n });\n return this;\n },\n\n /** @returns {String} the html text used to build the view's DOM */\n _template : function(){\n var annotation = this.model.get( 'annotation' );\n //if( !annotation ){\n // //annotation = [ '', _l( 'Click to add an annotation' ), '' ].join( '' );\n // annotation = [ '' ].join( '' );\n //}\n return [\n //TODO: make prompt optional\n '',\n // set up initial tags by adding as CSV to input vals (necc. to init select2)\n '
            ',\n _.escape( annotation ),\n '
            '\n ].join( '' );\n },\n\n /** @returns {jQuery} the main element for this view */\n $annotation : function(){\n return this.$el.find( '.annotation' );\n },\n\n /** shut down event listeners and remove this view's DOM */\n remove : function(){\n this.$annotation.off();\n this.stopListening( this.model );\n Backbone.View.prototype.remove.call( this );\n },\n\n /** string rep */\n toString : function(){ return [ 'AnnotationEditor(', this.model + '', ')' ].join(''); }\n});\n// =============================================================================\nreturn {\n AnnotationEditor : AnnotationEditor\n};\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/annotation.js\n ** module id = 92\n ** module chunks = 3\n **/","define([\n \"mvc/list/list-view\",\n \"mvc/collection/collection-model\",\n \"mvc/collection/collection-li\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( LIST_VIEW, DC_MODEL, DC_LI, BASE_MVC, _l ){\n\nvar logNamespace = 'collections';\n/* =============================================================================\nTODO:\n\n============================================================================= */\n/** @class non-editable, read-only View/Controller for a dataset collection.\n */\nvar _super = LIST_VIEW.ModelListPanel;\nvar CollectionView = _super.extend(\n/** @lends CollectionView.prototype */{\n //MODEL is either a DatasetCollection (or subclass) or a DatasetCollectionElement (list of pairs)\n _logNamespace : logNamespace,\n\n className : _super.prototype.className + ' dataset-collection-panel',\n\n /** sub view class used for datasets */\n DatasetDCEViewClass : DC_LI.DatasetDCEListItemView,\n /** sub view class used for nested collections */\n NestedDCDCEViewClass: DC_LI.NestedDCDCEListItemView,\n /** key of attribute in model to assign to this.collection */\n modelCollectionKey : 'elements',\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events\n * @param {Object} attributes optional settings for the panel\n */\n initialize : function( attributes ){\n _super.prototype.initialize.call( this, attributes );\n this.linkTarget = attributes.linkTarget || '_blank';\n\n this.hasUser = attributes.hasUser;\n /** A stack of panels that currently cover or hide this panel */\n this.panelStack = [];\n /** The text of the link to go back to the panel containing this one */\n this.parentName = attributes.parentName;\n /** foldout or drilldown */\n this.foldoutStyle = attributes.foldoutStyle || 'foldout';\n },\n\n // ------------------------------------------------------------------------ sub-views\n /** In this override, use model.getVisibleContents */\n _filterCollection : function(){\n//TODO: should *not* be model.getVisibleContents - visibility is not model related\n return this.model.getVisibleContents();\n },\n\n /** override to return proper view class based on element_type */\n _getItemViewClass : function( model ){\n //this.debug( this + '._getItemViewClass:', model );\n//TODO: subclasses use DCEViewClass - but are currently unused - decide\n switch( model.get( 'element_type' ) ){\n case 'hda':\n return this.DatasetDCEViewClass;\n case 'dataset_collection':\n return this.NestedDCDCEViewClass;\n }\n throw new TypeError( 'Unknown element type:', model.get( 'element_type' ) );\n },\n\n /** override to add link target and anon */\n _getItemViewOptions : function( model ){\n var options = _super.prototype._getItemViewOptions.call( this, model );\n return _.extend( options, {\n linkTarget : this.linkTarget,\n hasUser : this.hasUser,\n//TODO: could move to only nested: list:paired\n foldoutStyle : this.foldoutStyle\n });\n },\n\n // ------------------------------------------------------------------------ collection sub-views\n /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n _setUpItemViewListeners : function( view ){\n var panel = this;\n _super.prototype._setUpItemViewListeners.call( panel, view );\n\n // use pub-sub to: handle drilldown expansion and collapse\n view.on( 'expanded:drilldown', function( v, drilldown ){\n this._expandDrilldownPanel( drilldown );\n }, this );\n view.on( 'collapsed:drilldown', function( v, drilldown ){\n this._collapseDrilldownPanel( drilldown );\n }, this );\n return this;\n },\n\n /** Handle drill down by hiding this panels list and controls and showing the sub-panel */\n _expandDrilldownPanel : function( drilldown ){\n this.panelStack.push( drilldown );\n // hide this panel's controls and list, set the name for back navigation, and attach to the $el\n this.$( '> .controls' ).add( this.$list() ).hide();\n drilldown.parentName = this.model.get( 'name' );\n this.$el.append( drilldown.render().$el );\n },\n\n /** Handle drilldown close by freeing the panel and re-rendering this panel */\n _collapseDrilldownPanel : function( drilldown ){\n this.panelStack.pop();\n this.render();\n },\n\n // ------------------------------------------------------------------------ panel events\n /** event map */\n events : {\n 'click .navigation .back' : 'close'\n },\n\n /** close/remove this collection panel */\n close : function( event ){\n this.$el.remove();\n this.trigger( 'close' );\n },\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'CollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//------------------------------------------------------------------------------ TEMPLATES\nCollectionView.prototype.templates = (function(){\n\n var controlsTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n '',\n\n '
            ',\n '
            <%- collection.name || collection.element_identifier %>
            ',\n '
            ',\n//TODO: remove logic from template\n '<% if( collection.collection_type === \"list\" ){ %>',\n _l( 'a list of datasets' ),\n '<% } else if( collection.collection_type === \"paired\" ){ %>',\n _l( 'a pair of datasets' ),\n '<% } else if( collection.collection_type === \"list:paired\" ){ %>',\n _l( 'a list of paired datasets' ),\n '<% } %>',\n '
            ',\n '
            ',\n '
            '\n ], 'collection' );\n\n return _.extend( _.clone( _super.prototype.templates ), {\n controls : controlsTemplate\n });\n}());\n\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar ListCollectionView = CollectionView.extend(\n/** @lends ListCollectionView.prototype */{\n\n //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n /** sub view class used for datasets */\n DatasetDCEViewClass : DC_LI.DatasetDCEListItemView,\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'ListCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar PairCollectionView = ListCollectionView.extend(\n/** @lends PairCollectionView.prototype */{\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'PairCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar ListOfPairsCollectionView = CollectionView.extend(\n/** @lends ListOfPairsCollectionView.prototype */{\n\n //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n /** sub view class used for nested collections */\n NestedDCDCEViewClass : DC_LI.NestedDCDCEListItemView.extend({\n foldoutPanelClass : PairCollectionView\n }),\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'ListOfPairsCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//==============================================================================\n return {\n CollectionView : CollectionView,\n ListCollectionView : ListCollectionView,\n PairCollectionView : PairCollectionView,\n ListOfPairsCollectionView : ListOfPairsCollectionView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-view.js\n ** module id = 93\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/states\",\n \"mvc/dataset/dataset-li\",\n \"mvc/tag\",\n \"mvc/annotation\",\n \"ui/fa-icon-button\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( STATES, DATASET_LI, TAGS, ANNOTATIONS, faIconButton, BASE_MVC, _l ){\n//==============================================================================\nvar _super = DATASET_LI.DatasetListItemView;\n/** @class Editing view for DatasetAssociation.\n */\nvar DatasetListItemEdit = _super.extend(\n/** @lends DatasetListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** set up: options */\n initialize : function( attributes ){\n _super.prototype.initialize.call( this, attributes );\n//TODO: shouldn't this err if false?\n this.hasUser = attributes.hasUser;\n\n /** allow user purge of dataset files? */\n this.purgeAllowed = attributes.purgeAllowed || false;\n\n //TODO: move to HiddenUntilActivatedViewMixin\n /** should the tags editor be shown or hidden initially? */\n this.tagsEditorShown = attributes.tagsEditorShown || false;\n /** should the tags editor be shown or hidden initially? */\n this.annotationEditorShown = attributes.annotationEditorShown || false;\n },\n\n // ......................................................................... titlebar actions\n /** In this override, add the other two primary actions: edit and delete */\n _renderPrimaryActions : function(){\n var actions = _super.prototype._renderPrimaryActions.call( this );\n if( this.model.get( 'state' ) === STATES.NOT_VIEWABLE ){\n return actions;\n }\n // render the display, edit attr and delete icon-buttons\n return _super.prototype._renderPrimaryActions.call( this ).concat([\n this._renderEditButton(),\n this._renderDeleteButton()\n ]);\n },\n\n//TODO: move titleButtons into state renderers, remove state checks in the buttons\n\n /** Render icon-button to edit the attributes (format, permissions, etc.) this dataset. */\n _renderEditButton : function(){\n // don't show edit while uploading, in-accessible\n // DO show if in error (ala previous history panel)\n if( ( this.model.get( 'state' ) === STATES.DISCARDED )\n || ( !this.model.get( 'accessible' ) ) ){\n return null;\n }\n\n var purged = this.model.get( 'purged' ),\n deleted = this.model.get( 'deleted' ),\n editBtnData = {\n title : _l( 'Edit attributes' ),\n href : this.model.urls.edit,\n target : this.linkTarget,\n faIcon : 'fa-pencil',\n classes : 'edit-btn'\n };\n\n // disable if purged or deleted and explain why in the tooltip\n if( deleted || purged ){\n editBtnData.disabled = true;\n if( purged ){\n editBtnData.title = _l( 'Cannot edit attributes of datasets removed from disk' );\n } else if( deleted ){\n editBtnData.title = _l( 'Undelete dataset to edit attributes' );\n }\n\n // disable if still uploading or new\n } else if( _.contains( [ STATES.UPLOAD, STATES.NEW ], this.model.get( 'state' ) ) ){\n editBtnData.disabled = true;\n editBtnData.title = _l( 'This dataset is not yet editable' );\n }\n return faIconButton( editBtnData );\n },\n\n /** Render icon-button to delete this hda. */\n _renderDeleteButton : function(){\n // don't show delete if...\n if( ( !this.model.get( 'accessible' ) ) ){\n return null;\n }\n\n var self = this,\n deletedAlready = this.model.isDeletedOrPurged();\n return faIconButton({\n title : !deletedAlready? _l( 'Delete' ) : _l( 'Dataset is already deleted' ),\n disabled : deletedAlready,\n faIcon : 'fa-times',\n classes : 'delete-btn',\n onclick : function() {\n // ...bler... tooltips being left behind in DOM (hover out never called on deletion)\n self.$el.find( '.icon-btn.delete-btn' ).trigger( 'mouseout' );\n self.model[ 'delete' ]();\n }\n });\n },\n\n // ......................................................................... details\n /** In this override, add tags and annotations controls, make the ? dbkey a link to editing page */\n _renderDetails : function(){\n //TODO: generalize to be allow different details for each state\n var $details = _super.prototype._renderDetails.call( this ),\n state = this.model.get( 'state' );\n\n if( !this.model.isDeletedOrPurged() && _.contains([ STATES.OK, STATES.FAILED_METADATA ], state ) ){\n this._renderTags( $details );\n this._renderAnnotation( $details );\n this._makeDbkeyEditLink( $details );\n }\n\n//TODO: TRIPLE tap, ugh.\n this._setUpBehaviors( $details );\n return $details;\n },\n\n /** Add less commonly used actions in the details section based on state */\n _renderSecondaryActions : function(){\n var actions = _super.prototype._renderSecondaryActions.call( this );\n switch( this.model.get( 'state' ) ){\n case STATES.UPLOAD:\n case STATES.NOT_VIEWABLE:\n return actions;\n case STATES.ERROR:\n // error button comes first\n actions.unshift( this._renderErrButton() );\n return actions.concat([ this._renderRerunButton() ]);\n case STATES.OK:\n case STATES.FAILED_METADATA:\n return actions.concat([ this._renderRerunButton(), this._renderVisualizationsButton() ]);\n }\n return actions.concat([ this._renderRerunButton() ]);\n },\n\n /** Render icon-button to report an error on this dataset to the galaxy admin. */\n _renderErrButton : function(){\n return faIconButton({\n title : _l( 'View or report this error' ),\n href : this.model.urls.report_error,\n classes : 'report-error-btn',\n target : this.linkTarget,\n faIcon : 'fa-bug'\n });\n },\n\n /** Render icon-button to re-run the job that created this dataset. */\n _renderRerunButton : function(){\n var creating_job = this.model.get( 'creating_job' );\n if( this.model.get( 'rerunnable' ) ){\n return faIconButton({\n title : _l( 'Run this job again' ),\n href : this.model.urls.rerun,\n classes : 'rerun-btn',\n target : this.linkTarget,\n faIcon : 'fa-refresh',\n onclick : function( ev ) {\n ev.preventDefault();\n // create webpack split point in order to load the tool form async\n // TODO: split not working (tool loads fine)\n require([ 'mvc/tool/tool-form' ], function( ToolForm ){\n var form = new ToolForm.View({ 'job_id' : creating_job });\n form.deferred.execute( function(){\n Galaxy.app.display( form );\n });\n });\n }\n });\n }\n },\n\n /** Render an icon-button or popupmenu of links based on the applicable visualizations */\n _renderVisualizationsButton : function(){\n //TODO: someday - lazyload visualizations\n var visualizations = this.model.get( 'visualizations' );\n if( ( this.model.isDeletedOrPurged() )\n || ( !this.hasUser )\n || ( !this.model.hasData() )\n || ( _.isEmpty( visualizations ) ) ){\n return null;\n }\n if( !_.isObject( visualizations[0] ) ){\n this.warn( 'Visualizations have been switched off' );\n return null;\n }\n\n var $visualizations = $( this.templates.visualizations( visualizations, this ) );\n //HACK: need to re-write those directed at galaxy_main with linkTarget\n $visualizations.find( '[target=\"galaxy_main\"]').attr( 'target', this.linkTarget );\n // use addBack here to include the root $visualizations elem (for the case of 1 visualization)\n this._addScratchBookFn( $visualizations.find( '.visualization-link' ).addBack( '.visualization-link' ) );\n return $visualizations;\n },\n\n /** add scratchbook functionality to visualization links */\n _addScratchBookFn : function( $links ){\n var li = this;\n $links.click( function( ev ){\n if( Galaxy.frame && Galaxy.frame.active ){\n Galaxy.frame.add({\n title : 'Visualization',\n url : $( this ).attr( 'href' )\n });\n ev.preventDefault();\n ev.stopPropagation();\n }\n });\n },\n\n//TODO: if possible move these to readonly view - but display the owner's tags/annotation (no edit)\n /** Render the tags list/control */\n _renderTags : function( $where ){\n if( !this.hasUser ){ return; }\n var view = this;\n this.tagsEditor = new TAGS.TagsEditor({\n model : this.model,\n el : $where.find( '.tags-display' ),\n onshowFirstTime : function(){ this.render(); },\n // persist state on the hda view (and not the editor) since these are currently re-created each time\n onshow : function(){ view.tagsEditorShown = true; },\n onhide : function(){ view.tagsEditorShown = false; },\n $activator : faIconButton({\n title : _l( 'Edit dataset tags' ),\n classes : 'tag-btn',\n faIcon : 'fa-tags'\n }).appendTo( $where.find( '.actions .right' ) )\n });\n if( this.tagsEditorShown ){ this.tagsEditor.toggle( true ); }\n },\n\n /** Render the annotation display/control */\n _renderAnnotation : function( $where ){\n if( !this.hasUser ){ return; }\n var view = this;\n this.annotationEditor = new ANNOTATIONS.AnnotationEditor({\n model : this.model,\n el : $where.find( '.annotation-display' ),\n onshowFirstTime : function(){ this.render(); },\n // persist state on the hda view (and not the editor) since these are currently re-created each time\n onshow : function(){ view.annotationEditorShown = true; },\n onhide : function(){ view.annotationEditorShown = false; },\n $activator : faIconButton({\n title : _l( 'Edit dataset annotation' ),\n classes : 'annotate-btn',\n faIcon : 'fa-comment'\n }).appendTo( $where.find( '.actions .right' ) )\n });\n if( this.annotationEditorShown ){ this.annotationEditor.toggle( true ); }\n },\n\n /** If the format/dbkey/genome_build isn't set, make the display a link to the edit page */\n _makeDbkeyEditLink : function( $details ){\n // make the dbkey a link to editing\n if( this.model.get( 'metadata_dbkey' ) === '?'\n && !this.model.isDeletedOrPurged() ){\n var editableDbkey = $( '?' )\n .attr( 'href', this.model.urls.edit )\n .attr( 'target', this.linkTarget );\n $details.find( '.dbkey .value' ).replaceWith( editableDbkey );\n }\n },\n\n // ......................................................................... events\n /** event map */\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .undelete-link' : '_clickUndeleteLink',\n 'click .purge-link' : '_clickPurgeLink',\n\n 'click .edit-btn' : function( ev ){ this.trigger( 'edit', this, ev ); },\n 'click .delete-btn' : function( ev ){ this.trigger( 'delete', this, ev ); },\n 'click .rerun-btn' : function( ev ){ this.trigger( 'rerun', this, ev ); },\n 'click .report-err-btn' : function( ev ){ this.trigger( 'report-err', this, ev ); },\n 'click .visualization-btn' : function( ev ){ this.trigger( 'visualize', this, ev ); },\n 'click .dbkey a' : function( ev ){ this.trigger( 'edit', this, ev ); }\n }),\n\n\n /** listener for item undelete (in the messages section) */\n _clickUndeleteLink : function( ev ){\n this.model.undelete();\n return false;\n },\n\n /** listener for item purge (in the messages section) */\n _clickPurgeLink : function( ev ){\n//TODO: confirm dialog\n this.model.purge();\n return false;\n },\n\n // ......................................................................... misc\n /** string rep */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDAEditView(' + modelString + ')';\n }\n});\n\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDatasetListItemEdit.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n failed_metadata : BASE_MVC.wrapTemplate([\n // in this override, provide a link to the edit page\n '<% if( dataset.state === \"failed_metadata\" ){ %>',\n '',\n '<% } %>'\n ], 'dataset' ),\n\n deleted : BASE_MVC.wrapTemplate([\n // in this override, provide links to undelete or purge the dataset\n '<% if( dataset.deleted && !dataset.purged ){ %>',\n // deleted not purged\n '
            ',\n _l( 'This dataset has been deleted' ),\n '
            ', _l( 'Undelete it' ), '',\n '<% if( view.purgeAllowed ){ %>',\n '
            ',\n _l( 'Permanently remove it from disk' ),\n '',\n '<% } %>',\n '
            ',\n '<% } %>'\n ], 'dataset' )\n });\n\n var visualizationsTemplate = BASE_MVC.wrapTemplate([\n '<% if( visualizations.length === 1 ){ %>',\n '\"',\n ' target=\"<%- visualizations[0].target %>\" title=\"', _l( 'Visualize in' ),\n ' <%- visualizations[0].html %>\">',\n '',\n '',\n\n '<% } else { %>',\n '
            ',\n '',\n '',\n '',\n '',\n '
            ',\n '<% } %>'\n ], 'visualizations' );\n\n return _.extend( {}, _super.prototype.templates, {\n warnings : warnings,\n visualizations : visualizationsTemplate\n });\n}());\n\n\n//==============================================================================\n return {\n DatasetListItemEdit : DatasetListItemEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/dataset-li-edit.js\n ** module id = 94\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/states\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( STATES, BASE_MVC, _l ){\n\nvar logNamespace = 'dataset';\n//==============================================================================\nvar searchableMixin = BASE_MVC.SearchableModelMixin;\n/** @class base model for any DatasetAssociation (HDAs, LDDAs, DatasetCollectionDAs).\n * No knowledge of what type (HDA/LDDA/DCDA) should be needed here.\n * The DA's are made searchable (by attribute) by mixing in SearchableModelMixin.\n */\nvar DatasetAssociation = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( BASE_MVC.mixin( searchableMixin, /** @lends DatasetAssociation.prototype */{\n _logNamespace : logNamespace,\n\n /** default attributes for a model */\n defaults : {\n state : STATES.NEW,\n deleted : false,\n purged : false,\n\n // unreliable attribute\n name : '(unnamed dataset)',\n\n//TODO: update to false when this is correctly passed from the API (when we have a security model for this)\n accessible : true,\n\n // sniffed datatype (sam, tabular, bed, etc.)\n data_type : '',\n file_ext : '',\n\n // size in bytes\n file_size : 0,\n\n // array of associated file types (eg. [ 'bam_index', ... ])\n meta_files : [],\n\n misc_blurb : '',\n misc_info : '',\n\n tags : []\n // do NOT default on annotation, as this default is valid and will be passed on 'save'\n // which is incorrect behavior when the model is only partially fetched (annos are not passed in summary data)\n //annotation : ''\n },\n\n /** instance vars and listeners */\n initialize : function( attributes, options ){\n this.debug( this + '(Dataset).initialize', attributes, options );\n\n //!! this state is not in trans.app.model.Dataset.states - set it here -\n if( !this.get( 'accessible' ) ){\n this.set( 'state', STATES.NOT_VIEWABLE );\n }\n\n /** Datasets rely/use some web controllers - have the model generate those URLs on startup */\n this.urls = this._generateUrls();\n\n this._setUpListeners();\n },\n\n /** returns misc. web urls for rendering things like re-run, display, etc. */\n _generateUrls : function(){\n//TODO: would be nice if the API did this\n var id = this.get( 'id' );\n if( !id ){ return {}; }\n var urls = {\n 'purge' : 'datasets/' + id + '/purge_async',\n 'display' : 'datasets/' + id + '/display/?preview=True',\n 'edit' : 'datasets/' + id + '/edit',\n 'download' : 'datasets/' + id + '/display?to_ext=' + this.get( 'file_ext' ),\n 'report_error' : 'dataset/errors?id=' + id,\n 'rerun' : 'tool_runner/rerun?id=' + id,\n 'show_params' : 'datasets/' + id + '/show_params',\n 'visualization' : 'visualization',\n 'meta_download' : 'dataset/get_metadata_file?hda_id=' + id + '&metadata_name='\n };\n//TODO: global\n _.each( urls, function( value, key ){\n urls[ key ] = Galaxy.root + value;\n });\n this.urls = urls;\n return urls;\n },\n\n /** set up any event listeners\n * event: state:ready fired when this DA moves into/is already in a ready state\n */\n _setUpListeners : function(){\n // if the state has changed and the new state is a ready state, fire an event\n this.on( 'change:state', function( currModel, newState ){\n this.log( this + ' has changed state:', currModel, newState );\n if( this.inReadyState() ){\n this.trigger( 'state:ready', currModel, newState, this.previous( 'state' ) );\n }\n });\n // the download url (currently) relies on having a correct file extension\n this.on( 'change:id change:file_ext', function( currModel ){\n this._generateUrls();\n });\n },\n\n // ........................................................................ common queries\n /** override to add urls */\n toJSON : function(){\n var json = Backbone.Model.prototype.toJSON.call( this );\n //console.warn( 'returning json?' );\n //return json;\n return _.extend( json, {\n urls : this.urls\n });\n },\n\n /** Is this dataset deleted or purged? */\n isDeletedOrPurged : function(){\n return ( this.get( 'deleted' ) || this.get( 'purged' ) );\n },\n\n /** Is this dataset in a 'ready' state; where 'Ready' states are states where no\n * processing (for the ds) is left to do on the server.\n */\n inReadyState : function(){\n var ready = _.contains( STATES.READY_STATES, this.get( 'state' ) );\n return ( this.isDeletedOrPurged() || ready );\n },\n\n /** Does this model already contain detailed data (as opposed to just summary level data)? */\n hasDetails : function(){\n //?? this may not be reliable\n return _.has( this.attributes, 'genome_build' );\n },\n\n /** Convenience function to match dataset.has_data. */\n hasData : function(){\n return ( this.get( 'file_size' ) > 0 );\n },\n\n // ........................................................................ ajax\n fetch : function( options ){\n var dataset = this;\n return Backbone.Model.prototype.fetch.call( this, options )\n .always( function(){\n dataset._generateUrls();\n });\n },\n\n //NOTE: subclasses of DA's will need to implement url and urlRoot in order to have these work properly\n /** save this dataset, _Mark_ing it as deleted (just a flag) */\n 'delete' : function( options ){\n if( this.get( 'deleted' ) ){ return jQuery.when(); }\n return this.save( { deleted: true }, options );\n },\n /** save this dataset, _Mark_ing it as undeleted */\n undelete : function( options ){\n if( !this.get( 'deleted' ) || this.get( 'purged' ) ){ return jQuery.when(); }\n return this.save( { deleted: false }, options );\n },\n\n /** remove the file behind this dataset from the filesystem (if permitted) */\n purge : function _purge( options ){\n//TODO: use, override model.destroy, HDA.delete({ purge: true })\n if( this.get( 'purged' ) ){ return jQuery.when(); }\n options = options || {};\n //var hda = this,\n // //xhr = jQuery.ajax( this.url() + '?' + jQuery.param({ purge: true }), _.extend({\n // xhr = jQuery.ajax( this.url(), _.extend({\n // type : 'DELETE',\n // data : {\n // purge : true\n // }\n // }, options ));\n //\n //xhr.done( function( response ){\n // hda.debug( 'response', response );\n // //hda.set({ deleted: true, purged: true });\n // hda.set( response );\n //});\n //return xhr;\n\n options.url = this.urls.purge;\n\n //TODO: ideally this would be a DELETE call to the api\n // using purge async for now\n var hda = this,\n xhr = jQuery.ajax( options );\n xhr.done( function( message, status, responseObj ){\n hda.set({ deleted: true, purged: true });\n });\n xhr.fail( function( xhr, status, message ){\n // Exception messages are hidden within error page including: '...not allowed in this Galaxy instance.'\n // unbury and re-add to xhr\n var error = _l( \"Unable to purge dataset\" );\n var messageBuriedInUnfortunatelyFormattedError = ( 'Removal of datasets by users '\n + 'is not allowed in this Galaxy instance' );\n if( xhr.responseJSON && xhr.responseJSON.error ){\n error = xhr.responseJSON.error;\n } else if( xhr.responseText.indexOf( messageBuriedInUnfortunatelyFormattedError ) !== -1 ){\n error = messageBuriedInUnfortunatelyFormattedError;\n }\n xhr.responseText = error;\n hda.trigger( 'error', hda, xhr, options, _l( error ), { error: error } );\n });\n return xhr;\n },\n\n // ........................................................................ searching\n // see base-mvc, SearchableModelMixin\n\n /** what attributes of an HDA will be used in a text search */\n searchAttributes : [\n 'name', 'file_ext', 'genome_build', 'misc_blurb', 'misc_info', 'annotation', 'tags'\n ],\n\n /** our attr keys don't often match the labels we display to the user - so, when using\n * attribute specifiers ('name=\"bler\"') in a term, allow passing in aliases for the\n * following attr keys.\n */\n searchAliases : {\n title : 'name',\n format : 'file_ext',\n database : 'genome_build',\n blurb : 'misc_blurb',\n description : 'misc_blurb',\n info : 'misc_info',\n tag : 'tags'\n },\n\n // ........................................................................ misc\n /** String representation */\n toString : function(){\n var nameAndId = this.get( 'id' ) || '';\n if( this.get( 'name' ) ){\n nameAndId = '\"' + this.get( 'name' ) + '\",' + nameAndId;\n }\n return 'Dataset(' + nameAndId + ')';\n }\n}));\n\n\n//==============================================================================\n/** @class Backbone collection for dataset associations.\n */\nvar DatasetAssociationCollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(\n/** @lends HistoryContents.prototype */{\n _logNamespace : logNamespace,\n\n model : DatasetAssociation,\n\n /** root api url */\n urlRoot : Galaxy.root + 'api/datasets',\n\n /** url fn */\n url : function(){\n return this.urlRoot;\n },\n\n // ........................................................................ common queries\n /** Get the ids of every item in this collection\n * @returns array of encoded ids\n */\n ids : function(){\n return this.map( function( item ){ return item.get('id'); });\n },\n\n /** Get contents that are not ready\n * @returns array of content models\n */\n notReady : function(){\n return this.filter( function( content ){\n return !content.inReadyState();\n });\n },\n\n /** return true if any datasets don't have details */\n haveDetails : function(){\n return this.all( function( dataset ){ return dataset.hasDetails(); });\n },\n\n // ........................................................................ ajax\n /** using a queue, perform ajaxFn on each of the models in this collection */\n ajaxQueue : function( ajaxFn, options ){\n var deferred = jQuery.Deferred(),\n startingLength = this.length,\n responses = [];\n\n if( !startingLength ){\n deferred.resolve([]);\n return deferred;\n }\n\n // use reverse order (stylistic choice)\n var ajaxFns = this.chain().reverse().map( function( dataset, i ){\n return function(){\n var xhr = ajaxFn.call( dataset, options );\n // if successful, notify using the deferred to allow tracking progress\n xhr.done( function( response ){\n deferred.notify({ curr: i, total: startingLength, response: response, model: dataset });\n });\n // (regardless of previous error or success) if not last ajax call, shift and call the next\n // if last fn, resolve deferred\n xhr.always( function( response ){\n responses.push( response );\n if( ajaxFns.length ){\n ajaxFns.shift()();\n } else {\n deferred.resolve( responses );\n }\n });\n };\n }).value();\n // start the queue\n ajaxFns.shift()();\n\n return deferred;\n },\n\n // ........................................................................ sorting/filtering\n /** return a new collection of datasets whose attributes contain the substring matchesWhat */\n matches : function( matchesWhat ){\n return this.filter( function( dataset ){\n return dataset.matches( matchesWhat );\n });\n },\n\n // ........................................................................ misc\n ///** Convert this ad-hoc collection of hdas to a formal collection tracked\n // by the server.\n //**/\n //promoteToHistoryDatasetCollection : function _promote( history, collection_type, options ){\n //},\n\n /** String representation. */\n toString : function(){\n return ([ 'DatasetAssociationCollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n return {\n DatasetAssociation : DatasetAssociation,\n DatasetAssociationCollection : DatasetAssociationCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/dataset-model.js\n ** module id = 95\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/dataset-li\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DATASET_LI, BASE_MVC, _l ){\n/* global Backbone */\n//==============================================================================\nvar _super = DATASET_LI.DatasetListItemView;\n/** @class Read only view for HistoryDatasetAssociation.\n * Since there are no controls on the HDAView to hide the dataset,\n * the primary thing this class does (currently) is override templates\n * to render the HID.\n */\nvar HDAListItemView = _super.extend(\n/** @lends HDAListItemView.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : _super.prototype.className + \" history-content\",\n\n initialize : function( attributes, options ){\n _super.prototype.initialize.call( this, attributes, options );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDAListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nHDAListItemView.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n // adding the hid display to the title\n '
            ',\n '',\n '
            ',\n //TODO: remove whitespace and use margin-right\n '<%- dataset.hid %> ',\n '<%- dataset.name %>',\n '
            ',\n '
            '\n ], 'dataset' );\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n hidden : BASE_MVC.wrapTemplate([\n // add a warning when hidden\n '<% if( !dataset.visible ){ %>',\n '
            ',\n _l( 'This dataset has been hidden' ),\n '
            ',\n '<% } %>'\n ], 'dataset' )\n });\n\n return _.extend( {}, _super.prototype.templates, {\n titleBar : titleBarTemplate,\n warnings : warnings\n });\n}());\n\n\n\n//==============================================================================\n return {\n HDAListItemView : HDAListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hda-li.js\n ** module id = 96\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/dataset-model\",\n \"mvc/history/history-content-model\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DATASET, HISTORY_CONTENT, BASE_MVC, _l ){\n//==============================================================================\nvar _super = DATASET.DatasetAssociation,\n hcontentMixin = HISTORY_CONTENT.HistoryContentMixin;\n/** @class (HDA) model for a Galaxy dataset contained in and related to a history.\n */\nvar HistoryDatasetAssociation = _super.extend( BASE_MVC.mixin( hcontentMixin,\n/** @lends HistoryDatasetAssociation.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n // - re-apply manually it now\n /** call the mixin constructor */\n constructor : function( attrs, options ){\n hcontentMixin.constructor.call( this, attrs, options );\n },\n\n /** default attributes for a model */\n defaults : _.extend( {}, _super.prototype.defaults, hcontentMixin.defaults, {\n model_class : 'HistoryDatasetAssociation'\n }),\n\n /** Set up the model, determine if accessible, bind listeners\n */\n initialize : function( attributes, options ){\n _super.prototype.initialize.call( this, attributes, options );\n hcontentMixin.initialize.call( this, attributes, options );\n },\n\n // ........................................................................ misc\n /** String representation */\n toString : function(){\n var nameAndId = this.get( 'id' ) || '';\n if( this.get( 'name' ) ){\n nameAndId = this.get( 'hid' ) + ' :\"' + this.get( 'name' ) + '\",' + nameAndId;\n }\n return 'HDA(' + nameAndId + ')';\n }\n}));\n\n//==============================================================================\n return {\n HistoryDatasetAssociation : HistoryDatasetAssociation\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hda-model.js\n ** module id = 97\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/states\",\n \"mvc/collection/collection-li\",\n \"mvc/collection/collection-view\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( STATES, DC_LI, DC_VIEW, BASE_MVC, _l ){\n/* global Backbone */\n//==============================================================================\nvar _super = DC_LI.DCListItemView;\n/** @class Read only view for HistoryDatasetCollectionAssociation (a dataset collection inside a history).\n */\nvar HDCAListItemView = _super.extend(\n/** @lends HDCAListItemView.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : _super.prototype.className + \" history-content\",\n\n /** event listeners */\n _setUpListeners : function(){\n _super.prototype._setUpListeners.call( this );\n\n this.model.on({\n 'change:populated change:visible' : function( model, options ){ this.render(); },\n }, this );\n },\n\n /** Override to provide the proper collections panels as the foldout */\n _getFoldoutPanelClass : function(){\n switch( this.model.get( 'collection_type' ) ){\n case 'list':\n return DC_VIEW.ListCollectionView;\n case 'paired':\n return DC_VIEW.PairCollectionView;\n case 'list:paired':\n return DC_VIEW.ListOfPairsCollectionView;\n }\n throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );\n },\n\n /** In this override, add the state as a class for use with state-based CSS */\n _swapNewRender : function( $newRender ){\n _super.prototype._swapNewRender.call( this, $newRender );\n//TODO: model currently has no state\n var state = !this.model.get( 'populated' ) ? STATES.RUNNING : STATES.OK;\n //if( this.model.has( 'state' ) ){\n this.$el.addClass( 'state-' + state );\n //}\n return this.$el;\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDCAListItemView(' + modelString + ')';\n }\n});\n\n/** underscore templates */\nHDCAListItemView.prototype.templates = (function(){\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n hidden : BASE_MVC.wrapTemplate([\n // add a warning when hidden\n '<% if( !collection.visible ){ %>',\n '
            ',\n _l( 'This collection has been hidden' ),\n '
            ',\n '<% } %>'\n ], 'collection' )\n });\n\n// could steal this from hda-base (or use mixed content)\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n // adding the hid display to the title\n '
            ',\n '',\n '
            ',\n //TODO: remove whitespace and use margin-right\n '<%- collection.hid %> ',\n '<%- collection.name %>',\n '
            ',\n '
            ',\n '
            '\n ], 'collection' );\n\n return _.extend( {}, _super.prototype.templates, {\n warnings : warnings,\n titleBar : titleBarTemplate\n });\n}());\n\n\n//==============================================================================\n return {\n HDCAListItemView : HDCAListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hdca-li.js\n ** module id = 98\n ** module chunks = 3\n **/","\ndefine([\n \"mvc/history/history-contents\",\n \"utils/utils\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( HISTORY_CONTENTS, UTILS, BASE_MVC, _l ){\n\nvar logNamespace = 'history';\n//==============================================================================\n/** @class Model for a Galaxy history resource - both a record of user\n * tool use and a collection of the datasets those tools produced.\n * @name History\n * @augments Backbone.Model\n */\nvar History = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( BASE_MVC.mixin( BASE_MVC.SearchableModelMixin, /** @lends History.prototype */{\n _logNamespace : logNamespace,\n\n // values from api (may need more)\n defaults : {\n model_class : 'History',\n id : null,\n name : 'Unnamed History',\n state : 'new',\n\n deleted : false\n },\n\n // ........................................................................ urls\n urlRoot: Galaxy.root + 'api/histories',\n\n // ........................................................................ set up/tear down\n /** Set up the model\n * @param {Object} historyJSON model data for this History\n * @param {Object[]} contentsJSON array of model data for this History's contents (hdas or collections)\n * @param {Object} options any extra settings including logger\n */\n initialize : function( historyJSON, contentsJSON, options ){\n options = options || {};\n this.logger = options.logger || null;\n this.log( this + \".initialize:\", historyJSON, contentsJSON, options );\n\n /** HistoryContents collection of the HDAs contained in this history. */\n this.log( 'creating history contents:', contentsJSON );\n this.contents = new HISTORY_CONTENTS.HistoryContents( contentsJSON || [], { historyId: this.get( 'id' )});\n //// if we've got hdas passed in the constructor, load them\n //if( contentsJSON && _.isArray( contentsJSON ) ){\n // this.log( 'resetting history contents:', contentsJSON );\n // this.contents.reset( contentsJSON );\n //}\n\n this._setUpListeners();\n\n /** cached timeout id for the dataset updater */\n this.updateTimeoutId = null;\n // set up update timeout if needed\n //this.checkForUpdates();\n },\n\n /** set up any event listeners for this history including those to the contained HDAs\n * events: error:contents if an error occurred with the contents collection\n */\n _setUpListeners : function(){\n this.on( 'error', function( model, xhr, options, msg, details ){\n this.errorHandler( model, xhr, options, msg, details );\n });\n\n // hda collection listening\n if( this.contents ){\n this.listenTo( this.contents, 'error', function(){\n this.trigger.apply( this, [ 'error:contents' ].concat( jQuery.makeArray( arguments ) ) );\n });\n }\n // if the model's id changes ('current' or null -> an actual id), update the contents history_id\n this.on( 'change:id', function( model, newId ){\n if( this.contents ){\n this.contents.historyId = newId;\n }\n }, this );\n },\n\n //TODO: see base-mvc\n //onFree : function(){\n // if( this.contents ){\n // this.contents.free();\n // }\n //},\n\n /** event listener for errors. Generally errors are handled outside this model */\n errorHandler : function( model, xhr, options, msg, details ){\n // clear update timeout on model err\n this.clearUpdateTimeout();\n },\n\n /** convert size in bytes to a more human readable version */\n nice_size : function(){\n return UTILS.bytesToString( this.get( 'size' ), true, 2 );\n },\n\n /** override to add nice_size */\n toJSON : function(){\n return _.extend( Backbone.Model.prototype.toJSON.call( this ), {\n nice_size : this.nice_size()\n });\n },\n\n /** override to allow getting nice_size */\n get : function( key ){\n if( key === 'nice_size' ){\n return this.nice_size();\n }\n return Backbone.Model.prototype.get.apply( this, arguments );\n },\n\n // ........................................................................ common queries\n /** T/F is this history owned by the current user (Galaxy.user)\n * Note: that this will return false for an anon user even if the history is theirs.\n */\n ownedByCurrUser : function(){\n // no currUser\n if( !Galaxy || !Galaxy.user ){\n return false;\n }\n // user is anon or history isn't owned\n if( Galaxy.user.isAnonymous() || Galaxy.user.id !== this.get( 'user_id' ) ){\n return false;\n }\n return true;\n },\n\n /** */\n contentsCount : function(){\n return _.reduce( _.values( this.get( 'state_details' ) ), function( memo, num ){ return memo + num; }, 0 );\n },\n\n // ........................................................................ search\n /** What model fields to search with */\n searchAttributes : [\n 'name', 'annotation', 'tags'\n ],\n\n /** Adding title and singular tag */\n searchAliases : {\n title : 'name',\n tag : 'tags'\n },\n\n // ........................................................................ updates\n /** does the contents collection indicate they're still running and need to be updated later?\n * delay + update if needed\n * @param {Function} onReadyCallback function to run when all contents are in the ready state\n * events: ready\n */\n checkForUpdates : function( onReadyCallback ){\n //this.info( 'checkForUpdates' )\n\n // get overall History state from collection, run updater if History has running/queued contents\n // boiling it down on the client to running/not\n if( this.contents.running().length ){\n this.setUpdateTimeout();\n\n } else {\n this.trigger( 'ready' );\n if( _.isFunction( onReadyCallback ) ){\n onReadyCallback.call( this );\n }\n }\n return this;\n },\n\n /** create a timeout (after UPDATE_DELAY or delay ms) to refetch the contents. Clear any prev. timeout */\n setUpdateTimeout : function( delay ){\n delay = delay || History.UPDATE_DELAY;\n var history = this;\n\n // prevent buildup of updater timeouts by clearing previous if any, then set new and cache id\n this.clearUpdateTimeout();\n this.updateTimeoutId = setTimeout( function(){\n history.refresh();\n }, delay );\n return this.updateTimeoutId;\n },\n\n /** clear the timeout and the cached timeout id */\n clearUpdateTimeout : function(){\n if( this.updateTimeoutId ){\n clearTimeout( this.updateTimeoutId );\n this.updateTimeoutId = null;\n }\n },\n\n /* update the contents, getting full detailed model data for any whose id is in detailIds\n * set up to run this again in some interval of time\n * @param {String[]} detailIds list of content ids to get detailed model data for\n * @param {Object} options std. backbone fetch options map\n */\n refresh : function( detailIds, options ){\n //this.info( 'refresh:', detailIds, this.contents );\n detailIds = detailIds || [];\n options = options || {};\n var history = this;\n\n // add detailIds to options as CSV string\n options.data = options.data || {};\n if( detailIds.length ){\n options.data.details = detailIds.join( ',' );\n }\n var xhr = this.contents.fetch( options );\n xhr.done( function( models ){\n history.checkForUpdates( function(){\n // fetch the history inside onReadyCallback in order to recalc history size\n this.fetch();\n });\n });\n return xhr;\n },\n\n // ........................................................................ ajax\n /** save this history, _Mark_ing it as deleted (just a flag) */\n _delete : function( options ){\n if( this.get( 'deleted' ) ){ return jQuery.when(); }\n return this.save( { deleted: true }, options );\n },\n /** purge this history, _Mark_ing it as purged and removing all dataset data from the server */\n purge : function( options ){\n if( this.get( 'purged' ) ){ return jQuery.when(); }\n return this.save( { deleted: true, purged: true }, options );\n },\n /** save this history, _Mark_ing it as undeleted */\n undelete : function( options ){\n if( !this.get( 'deleted' ) ){ return jQuery.when(); }\n return this.save( { deleted: false }, options );\n },\n\n /** Make a copy of this history on the server\n * @param {Boolean} current if true, set the copy as the new current history (default: true)\n * @param {String} name name of new history (default: none - server sets to: Copy of )\n * @fires copied passed this history and the response JSON from the copy\n * @returns {xhr}\n */\n copy : function( current, name, allDatasets ){\n current = ( current !== undefined )?( current ):( true );\n if( !this.id ){\n throw new Error( 'You must set the history ID before copying it.' );\n }\n\n var postData = { history_id : this.id };\n if( current ){\n postData.current = true;\n }\n if( name ){\n postData.name = name;\n }\n if( !allDatasets ){\n postData.all_datasets = false;\n }\n\n var history = this,\n copy = jQuery.post( this.urlRoot, postData );\n // if current - queue to setAsCurrent before firing 'copied'\n if( current ){\n return copy.then( function( response ){\n var newHistory = new History( response );\n return newHistory.setAsCurrent()\n .done( function(){\n history.trigger( 'copied', history, response );\n });\n });\n }\n return copy.done( function( response ){\n history.trigger( 'copied', history, response );\n });\n },\n\n setAsCurrent : function(){\n var history = this,\n xhr = jQuery.getJSON( Galaxy.root + 'history/set_as_current?id=' + this.id );\n\n xhr.done( function(){\n history.trigger( 'set-as-current', history );\n });\n return xhr;\n },\n\n // ........................................................................ misc\n toString : function(){\n return 'History(' + this.get( 'id' ) + ',' + this.get( 'name' ) + ')';\n }\n}));\n\n//------------------------------------------------------------------------------ CLASS VARS\n/** When the history has running hdas,\n * this is the amount of time between update checks from the server\n */\nHistory.UPDATE_DELAY = 4000;\n\n/** Get data for a history then its hdas using a sequential ajax call, return a deferred to receive both */\nHistory.getHistoryData = function getHistoryData( historyId, options ){\n options = options || {};\n var detailIdsFn = options.detailIdsFn || [];\n var hdcaDetailIds = options.hdcaDetailIds || [];\n //console.debug( 'getHistoryData:', historyId, options );\n\n var df = jQuery.Deferred(),\n historyJSON = null;\n\n function getHistory( id ){\n // get the history data\n if( historyId === 'current' ){\n return jQuery.getJSON( Galaxy.root + 'history/current_history_json' );\n }\n return jQuery.ajax( Galaxy.root + 'api/histories/' + historyId );\n }\n function isEmpty( historyData ){\n // get the number of hdas accrd. to the history\n return historyData && historyData.empty;\n }\n function getContents( historyData ){\n // get the hda data\n // if no hdas accrd. to history: return empty immed.\n if( isEmpty( historyData ) ){ return []; }\n // if there are hdas accrd. to history: get those as well\n if( _.isFunction( detailIdsFn ) ){\n detailIdsFn = detailIdsFn( historyData );\n }\n if( _.isFunction( hdcaDetailIds ) ){\n hdcaDetailIds = hdcaDetailIds( historyData );\n }\n var data = {};\n if( detailIdsFn.length ) {\n data.dataset_details = detailIdsFn.join( ',' );\n }\n if( hdcaDetailIds.length ) {\n // for symmetry, not actually used by backend of consumed\n // by frontend.\n data.dataset_collection_details = hdcaDetailIds.join( ',' );\n }\n return jQuery.ajax( Galaxy.root + 'api/histories/' + historyData.id + '/contents', { data: data });\n }\n\n // getting these concurrently is 400% slower (sqlite, local, vanilla) - so:\n // chain the api calls - getting history first then contents\n\n var historyFn = options.historyFn || getHistory,\n contentsFn = options.contentsFn || getContents;\n\n // chain ajax calls: get history first, then hdas\n var historyXHR = historyFn( historyId );\n historyXHR.done( function( json ){\n // set outer scope var here for use below\n historyJSON = json;\n df.notify({ status: 'history data retrieved', historyJSON: historyJSON });\n });\n historyXHR.fail( function( xhr, status, message ){\n // call reject on the outer deferred to allow its fail callback to run\n df.reject( xhr, 'loading the history' );\n });\n\n var contentsXHR = historyXHR.then( contentsFn );\n contentsXHR.then( function( contentsJSON ){\n df.notify({ status: 'contents data retrieved', historyJSON: historyJSON, contentsJSON: contentsJSON });\n // we've got both: resolve the outer scope deferred\n df.resolve( historyJSON, contentsJSON );\n });\n contentsXHR.fail( function( xhr, status, message ){\n // call reject on the outer deferred to allow its fail callback to run\n df.reject( xhr, 'loading the contents', { history: historyJSON } );\n });\n\n return df;\n};\n\n\n//==============================================================================\nvar ControlledFetchMixin = {\n\n /** Override to convert certain options keys into API index parameters */\n fetch : function( options ){\n options = options || {};\n options.data = options.data || this._buildFetchData( options );\n // use repeated params for arrays, e.g. q=1&qv=1&q=2&qv=2\n options.traditional = true;\n return Backbone.Collection.prototype.fetch.call( this, options );\n },\n\n /** These attribute keys are valid params to fetch/API-index */\n _fetchOptions : [\n /** model dependent string to control the order of models returned */\n 'order',\n /** limit the number of models returned from a fetch */\n 'limit',\n /** skip this number of models when fetching */\n 'offset',\n /** what series of attributes to return (model dependent) */\n 'view',\n /** individual keys to return for the models (see api/histories.index) */\n 'keys'\n ],\n\n /** Build the data dictionary to send to fetch's XHR as data */\n _buildFetchData : function( options ){\n var data = {},\n fetchDefaults = this._fetchDefaults();\n options = _.defaults( options || {}, fetchDefaults );\n data = _.pick( options, this._fetchOptions );\n\n var filters = _.has( options, 'filters' )? options.filters : ( fetchDefaults.filters || {} );\n if( !_.isEmpty( filters ) ){\n _.extend( data, this._buildFetchFilters( filters ) );\n }\n return data;\n },\n\n /** Override to have defaults for fetch options and filters */\n _fetchDefaults : function(){\n // to be overridden\n return {};\n },\n\n /** Convert dictionary filters to qqv style arrays */\n _buildFetchFilters : function( filters ){\n var filterMap = {\n q : [],\n qv : []\n };\n _.each( filters, function( v, k ){\n if( v === true ){ v = 'True'; }\n if( v === false ){ v = 'False'; }\n filterMap.q.push( k );\n filterMap.qv.push( v );\n });\n return filterMap;\n },\n};\n\n//==============================================================================\n/** @class A collection of histories (per user).\n * (stub) currently unused.\n */\nvar HistoryCollection = Backbone.Collection\n .extend( BASE_MVC.LoggableMixin )\n .extend( ControlledFetchMixin )\n .extend(/** @lends HistoryCollection.prototype */{\n _logNamespace : logNamespace,\n\n model : History,\n\n /** @type {String} the default sortOrders key for sorting */\n DEFAULT_ORDER : 'update_time',\n\n /** @type {Object} map of collection sorting orders generally containing a getter to return the attribute\n * sorted by and asc T/F if it is an ascending sort.\n */\n sortOrders : {\n 'update_time' : {\n getter : function( h ){ return new Date( h.get( 'update_time' ) ); },\n asc : false\n },\n 'update_time-asc' : {\n getter : function( h ){ return new Date( h.get( 'update_time' ) ); },\n asc : true\n },\n 'name' : {\n getter : function( h ){ return h.get( 'name' ); },\n asc : true\n },\n 'name-dsc' : {\n getter : function( h ){ return h.get( 'name' ); },\n asc : false\n },\n 'size' : {\n getter : function( h ){ return h.get( 'size' ); },\n asc : false\n },\n 'size-asc' : {\n getter : function( h ){ return h.get( 'size' ); },\n asc : true\n }\n },\n\n initialize : function( models, options ){\n options = options || {};\n this.log( 'HistoryCollection.initialize', arguments );\n\n // instance vars\n /** @type {boolean} should deleted histories be included */\n this.includeDeleted = options.includeDeleted || false;\n // set the sort order\n this.setOrder( options.order || this.DEFAULT_ORDER );\n /** @type {String} encoded id of the history that's current */\n this.currentHistoryId = options.currentHistoryId;\n /** @type {boolean} have all histories been fetched and in the collection? */\n this.allFetched = options.allFetched || false;\n\n // this.on( 'all', function(){\n // console.info( 'event:', arguments );\n // });\n this.setUpListeners();\n },\n\n urlRoot : Galaxy.root + 'api/histories',\n url : function(){ return this.urlRoot; },\n\n /** returns map of default filters and settings for fetching from the API */\n _fetchDefaults : function(){\n // to be overridden\n var defaults = {\n order : this.order,\n view : 'detailed'\n };\n if( !this.includeDeleted ){\n defaults.filters = {\n deleted : false,\n purged : false,\n };\n }\n return defaults;\n },\n\n /** set up reflexive event handlers */\n setUpListeners : function setUpListeners(){\n this.on({\n // when a history is deleted, remove it from the collection (if optionally set to do so)\n 'change:deleted' : function( history ){\n // TODO: this becomes complicated when more filters are used\n this.debug( 'change:deleted', this.includeDeleted, history.get( 'deleted' ) );\n if( !this.includeDeleted && history.get( 'deleted' ) ){\n this.remove( history );\n }\n },\n // listen for a history copy, setting it to current\n 'copied' : function( original, newData ){\n this.setCurrent( new History( newData, [] ) );\n },\n // when a history is made current, track the id in the collection\n 'set-as-current' : function( history ){\n var oldCurrentId = this.currentHistoryId;\n this.trigger( 'no-longer-current', oldCurrentId );\n this.currentHistoryId = history.id;\n }\n }, this );\n },\n\n /** override to allow passing options.order and setting the sort order to one of sortOrders */\n sort : function( options ){\n options = options || {};\n this.setOrder( options.order );\n return Backbone.Collection.prototype.sort.call( this, options );\n },\n\n /** build the comparator used to sort this collection using the sortOrder map and the given order key\n * @event 'changed-order' passed the new order and the collection\n */\n setOrder : function( order ){\n var collection = this,\n sortOrder = this.sortOrders[ order ];\n if( _.isUndefined( sortOrder ) ){ return; }\n\n collection.order = order;\n collection.comparator = function comparator( a, b ){\n var currentHistoryId = collection.currentHistoryId;\n // current always first\n if( a.id === currentHistoryId ){ return -1; }\n if( b.id === currentHistoryId ){ return 1; }\n // then compare by an attribute\n a = sortOrder.getter( a );\n b = sortOrder.getter( b );\n return sortOrder.asc?\n ( ( a === b )?( 0 ):( a > b ? 1 : -1 ) ):\n ( ( a === b )?( 0 ):( a > b ? -1 : 1 ) );\n };\n collection.trigger( 'changed-order', collection.order, collection );\n return collection;\n },\n\n /** override to provide order and offsets based on instance vars, set limit if passed,\n * and set allFetched/fire 'all-fetched' when xhr returns\n */\n fetch : function( options ){\n options = options || {};\n if( this.allFetched ){ return jQuery.when({}); }\n var collection = this,\n fetchOptions = _.defaults( options, {\n remove : false,\n offset : collection.length >= 1? ( collection.length - 1 ) : 0,\n order : collection.order\n }),\n limit = options.limit;\n if( !_.isUndefined( limit ) ){\n fetchOptions.limit = limit;\n }\n\n return ControlledFetchMixin.fetch.call( this, fetchOptions )\n .done( function _postFetchMore( fetchData ){\n var numFetched = _.isArray( fetchData )? fetchData.length : 0;\n // anything less than a full page means we got all there is to get\n if( !limit || numFetched < limit ){\n collection.allFetched = true;\n collection.trigger( 'all-fetched', collection );\n }\n }\n );\n },\n\n /** create a new history and by default set it to be the current history */\n create : function create( data, hdas, historyOptions, xhrOptions ){\n //TODO: .create is actually a collection function that's overridden here\n var collection = this,\n xhr = jQuery.getJSON( Galaxy.root + 'history/create_new_current' );\n return xhr.done( function( newData ){\n collection.setCurrent( new History( newData, [], historyOptions || {} ) );\n });\n },\n\n /** set the current history to the given history, placing it first in the collection.\n * Pass standard bbone options for use in unshift.\n * @triggers new-current passed history and this collection\n */\n setCurrent : function( history, options ){\n options = options || {};\n // new histories go in the front\n this.unshift( history, options );\n this.currentHistoryId = history.get( 'id' );\n if( !options.silent ){\n this.trigger( 'new-current', history, this );\n }\n return this;\n },\n\n /** override to reset allFetched flag to false */\n reset : function( models, options ){\n this.allFetched = false;\n return Backbone.Collection.prototype.reset.call( this, models, options );\n },\n\n toString: function toString(){\n return 'HistoryCollection(' + this.length + ')';\n }\n});\n\n//==============================================================================\nreturn {\n History : History,\n HistoryCollection : HistoryCollection\n};});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-model.js\n ** module id = 99\n ** module chunks = 3\n **/","define([\n \"mvc/list/list-item\",\n \"ui/loading-indicator\",\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/search-input\"\n], function( LIST_ITEM, LoadingIndicator, BASE_MVC, _l ){\n\nvar logNamespace = 'list';\n/* ============================================================================\nTODO:\n\n============================================================================ */\n/** @class View for a list/collection of models and the sub-views of those models.\n * Sub-views must (at least have the interface if not) inherit from ListItemView.\n * (For a list panel that also includes some 'container' model (History->HistoryContents)\n * use ModelWithListPanel)\n *\n * Allows for:\n * searching collection/sub-views\n * selecting/multi-selecting sub-views\n *\n * Currently used:\n * for dataset/dataset-choice\n * as superclass of ModelListPanel\n */\nvar ListPanel = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend(/** @lends ListPanel.prototype */{\n _logNamespace : logNamespace,\n\n /** class to use for constructing the sub-views */\n viewClass : LIST_ITEM.ListItemView,\n /** class to used for constructing collection of sub-view models */\n collectionClass : Backbone.Collection,\n\n tagName : 'div',\n className : 'list-panel',\n\n /** (in ms) that jquery effects will use */\n fxSpeed : 'fast',\n\n /** string to display when the collection has no contents */\n emptyMsg : _l( 'This list is empty' ),\n /** displayed when no items match the search terms */\n noneFoundMsg : _l( 'No matching items found' ),\n /** string used for search placeholder */\n searchPlaceholder : _l( 'search' ),\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events\n * @param {Object} attributes optional settings for the list\n */\n initialize : function( attributes, options ){\n attributes = attributes || {};\n // set the logger if requested\n if( attributes.logger ){\n this.logger = attributes.logger;\n }\n this.log( this + '.initialize:', attributes );\n\n // ---- instance vars\n /** how quickly should jquery fx run? */\n this.fxSpeed = _.has( attributes, 'fxSpeed' )?( attributes.fxSpeed ):( this.fxSpeed );\n\n /** filters for displaying subviews */\n this.filters = [];\n /** current search terms */\n this.searchFor = attributes.searchFor || '';\n\n /** loading indicator */\n this.indicator = new LoadingIndicator( this.$el );\n\n /** currently showing selectors on items? */\n this.selecting = ( attributes.selecting !== undefined )? attributes.selecting : true;\n //this.selecting = false;\n\n /** cached selected item.model.ids to persist btwn renders */\n this.selected = attributes.selected || [];\n /** the last selected item.model.id */\n this.lastSelected = null;\n\n /** are sub-views draggable */\n this.dragItems = attributes.dragItems || false;\n\n /** list item view class (when passed models) */\n this.viewClass = attributes.viewClass || this.viewClass;\n\n /** list item views */\n this.views = [];\n /** list item models */\n this.collection = attributes.collection || ( new this.collectionClass([]) );\n\n /** filter fns run over collection items to see if they should show in the list */\n this.filters = attributes.filters || [];\n\n /** override $scrollContainer fn via attributes - fn should return jq for elem to call scrollTo on */\n this.$scrollContainer = attributes.$scrollContainer || this.$scrollContainer;\n\n//TODO: remove\n this.title = attributes.title || '';\n this.subtitle = attributes.subtitle || '';\n\n this._setUpListeners();\n },\n\n /** free any sub-views the list has */\n freeViews : function(){\n//TODO: stopListening? remove?\n _.each( this.views, function( view ){\n view.off();\n });\n this.views = [];\n return this;\n },\n\n // ------------------------------------------------------------------------ listeners\n /** create any event listeners for the list\n */\n _setUpListeners : function(){\n this.off();\n\n //TODO: move errorHandler down into list-view from history-view or\n // pass to global error handler (Galaxy)\n this.on( 'error', function( model, xhr, options, msg, details ){\n //this.errorHandler( model, xhr, options, msg, details );\n console.error( model, xhr, options, msg, details );\n }, this );\n\n // show hide the loading indicator\n this.on( 'loading', function(){\n this._showLoadingIndicator( 'loading...', 40 );\n }, this );\n this.on( 'loading-done', function(){\n this._hideLoadingIndicator( 40 );\n }, this );\n\n // throw the first render up as a diff namespace using once (for outside consumption)\n this.once( 'rendered', function(){\n this.trigger( 'rendered:initial', this );\n }, this );\n\n // debugging\n if( this.logger ){\n this.on( 'all', function( event ){\n this.log( this + '', arguments );\n }, this );\n }\n\n this._setUpCollectionListeners();\n this._setUpViewListeners();\n return this;\n },\n\n /** listening for collection events */\n _setUpCollectionListeners : function(){\n this.log( this + '._setUpCollectionListeners', this.collection );\n this.collection.off();\n\n // bubble up error events\n this.collection.on( 'error', function( model, xhr, options, msg, details ){\n this.trigger( 'error', model, xhr, options, msg, details );\n }, this );\n\n this.collection.on( 'reset', function(){\n this.renderItems();\n }, this );\n this.collection.on( 'add', this.addItemView, this );\n this.collection.on( 'remove', this.removeItemView, this );\n\n // debugging\n if( this.logger ){\n this.collection.on( 'all', function( event ){\n this.info( this + '(collection)', arguments );\n }, this );\n }\n return this;\n },\n\n /** listening for sub-view events that bubble up with the 'view:' prefix */\n _setUpViewListeners : function(){\n this.log( this + '._setUpViewListeners' );\n\n // shift to select a range\n this.on( 'view:selected', function( view, ev ){\n if( ev && ev.shiftKey && this.lastSelected ){\n var lastSelectedView = this.viewFromModelId( this.lastSelected );\n if( lastSelectedView ){\n this.selectRange( view, lastSelectedView );\n }\n } else if( ev && ev.altKey && !this.selecting ){\n this.showSelectors();\n }\n this.selected.push( view.model.id );\n this.lastSelected = view.model.id;\n }, this );\n\n this.on( 'view:de-selected', function( view, ev ){\n this.selected = _.without( this.selected, view.model.id );\n //this.lastSelected = view.model.id;\n }, this );\n },\n\n // ------------------------------------------------------------------------ rendering\n /** Render this content, set up ui.\n * @param {Number or String} speed the speed of the render\n */\n render : function( speed ){\n this.log( this + '.render', speed );\n var $newRender = this._buildNewRender();\n this._setUpBehaviors( $newRender );\n this._queueNewRender( $newRender, speed );\n return this;\n },\n\n /** Build a temp div containing the new children for the view's $el.\n */\n _buildNewRender : function(){\n this.debug( this + '(ListPanel)._buildNewRender' );\n var $newRender = $( this.templates.el( {}, this ) );\n this._renderControls( $newRender );\n this._renderTitle( $newRender );\n this._renderSubtitle( $newRender );\n this._renderSearch( $newRender );\n this.renderItems( $newRender );\n return $newRender;\n },\n\n /** Build a temp div containing the new children for the view's $el.\n */\n _renderControls : function( $newRender ){\n this.debug( this + '(ListPanel)._renderControls' );\n var $controls = $( this.templates.controls( {}, this ) );\n $newRender.find( '.controls' ).replaceWith( $controls );\n return $controls;\n },\n\n /**\n */\n _renderTitle : function( $where ){\n //$where = $where || this.$el;\n //$where.find( '.title' ).replaceWith( ... )\n },\n\n /**\n */\n _renderSubtitle : function( $where ){\n //$where = $where || this.$el;\n //$where.find( '.title' ).replaceWith( ... )\n },\n\n /** Fade out the old el, swap in the new contents, then fade in.\n * @param {Number or String} speed jq speed to use for rendering effects\n * @fires rendered when rendered\n */\n _queueNewRender : function( $newRender, speed ) {\n speed = ( speed === undefined )?( this.fxSpeed ):( speed );\n var panel = this;\n panel.log( '_queueNewRender:', $newRender, speed );\n\n $( panel ).queue( 'fx', [\n function( next ){ this.$el.fadeOut( speed, next ); },\n function( next ){\n panel._swapNewRender( $newRender );\n next();\n },\n function( next ){ this.$el.fadeIn( speed, next ); },\n function( next ){\n panel.trigger( 'rendered', panel );\n next();\n }\n ]);\n },\n\n /** empty out the current el, move the $newRender's children in */\n _swapNewRender : function( $newRender ){\n this.$el.empty().attr( 'class', this.className ).append( $newRender.children() );\n if( this.selecting ){ this.showSelectors( 0 ); }\n return this;\n },\n\n /** */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n $where.find( '.controls [title]' ).tooltip({ placement: 'bottom' });\n // set up the pupup for actions available when multi selecting\n this._renderMultiselectActionMenu( $where );\n return this;\n },\n\n /** render a menu containing the actions available to sets of selected items */\n _renderMultiselectActionMenu : function( $where ){\n $where = $where || this.$el;\n var $menu = $where.find( '.list-action-menu' ),\n actions = this.multiselectActions();\n if( !actions.length ){\n return $menu.empty();\n }\n\n var $newMenu = $([\n '
            ',\n '',\n '
              ', '
            ',\n '
            '\n ].join(''));\n var $actions = actions.map( function( action ){\n var html = [ '
          16. ', action.html, '
          17. ' ].join( '' );\n return $( html ).click( function( ev ){\n ev.preventDefault();\n return action.func( ev );\n });\n });\n $newMenu.find( 'ul' ).append( $actions );\n $menu.replaceWith( $newMenu );\n return $newMenu;\n },\n\n /** return a list of plain objects used to render multiselect actions menu. Each object should have:\n * html: an html string used as the anchor contents\n * func: a function called when the anchor is clicked (passed the click event)\n */\n multiselectActions : function(){\n return [];\n },\n\n // ------------------------------------------------------------------------ sub-$element shortcuts\n /** the scroll container for this panel - can be $el, $el.parent(), or grandparent depending on context */\n $scrollContainer : function(){\n // override or set via attributes.$scrollContainer\n return this.$el.parent().parent();\n },\n /** */\n $list : function( $where ){\n return ( $where || this.$el ).find( '> .list-items' );\n },\n /** container where list messages are attached */\n $messages : function( $where ){\n return ( $where || this.$el ).find( '> .controls .messages' );\n },\n /** the message displayed when no views can be shown (no views, none matching search) */\n $emptyMessage : function( $where ){\n return ( $where || this.$el ).find( '> .empty-message' );\n },\n\n // ------------------------------------------------------------------------ hda sub-views\n /**\n * @param {jQuery} $whereTo what dom element to prepend the sub-views to\n * @returns the visible item views\n */\n renderItems : function( $whereTo ){\n $whereTo = $whereTo || this.$el;\n var panel = this;\n panel.log( this + '.renderItems', $whereTo );\n\n var $list = panel.$list( $whereTo );\n//TODO: free prev. views?\n panel.views = panel._filterCollection().map( function( itemModel ){\n//TODO: creates views each time - not neccessarily good\n//TODO: pass speed here\n return panel._createItemView( itemModel ).render( 0 );\n });\n //panel.debug( item$els );\n //panel.debug( newViews );\n\n $list.empty();\n if( panel.views.length ){\n panel._attachItems( $whereTo );\n panel.$emptyMessage( $whereTo ).hide();\n\n } else {\n panel._renderEmptyMessage( $whereTo ).show();\n }\n panel.trigger( 'views:ready', panel.views );\n\n return panel.views;\n },\n\n /** Filter the collection to only those models that should be currently viewed */\n _filterCollection : function(){\n // override this\n var panel = this;\n return panel.collection.filter( _.bind( panel._filterItem, panel ) );\n },\n\n /** Should the model be viewable in the current state?\n * Checks against this.filters and this.searchFor\n */\n _filterItem : function( model ){\n // override this\n var panel = this;\n return ( _.every( panel.filters.map( function( fn ){ return fn.call( model ); }) ) )\n && ( !panel.searchFor || model.matchesAll( panel.searchFor ) );\n },\n\n /** Create a view for a model and set up it's listeners */\n _createItemView : function( model ){\n var ViewClass = this._getItemViewClass( model ),\n options = _.extend( this._getItemViewOptions( model ), {\n model : model\n }),\n view = new ViewClass( options );\n this._setUpItemViewListeners( view );\n return view;\n },\n\n /** Get the bbone view class based on the model */\n _getItemViewClass : function( model ){\n // override this\n return this.viewClass;\n },\n\n /** Get the options passed to the new view based on the model */\n _getItemViewOptions : function( model ){\n // override this\n return {\n //logger : this.logger,\n fxSpeed : this.fxSpeed,\n expanded : false,\n selectable : this.selecting,\n selected : _.contains( this.selected, model.id ),\n draggable : this.dragItems\n };\n },\n\n /** Set up listeners for new models */\n _setUpItemViewListeners : function( view ){\n var panel = this;\n // send all events to the panel, re-namspaceing them with the view prefix\n view.on( 'all', function(){\n var args = Array.prototype.slice.call( arguments, 0 );\n args[0] = 'view:' + args[0];\n panel.trigger.apply( panel, args );\n });\n\n // drag multiple - hijack ev.setData to add all selected items\n view.on( 'draggable:dragstart', function( ev, v ){\n //TODO: set multiple drag data here\n var json = {},\n selected = this.getSelectedModels();\n if( selected.length ){\n json = selected.toJSON();\n } else {\n json = [ v.model.toJSON() ];\n }\n ev.dataTransfer.setData( 'text', JSON.stringify( json ) );\n //ev.dataTransfer.setDragImage( v.el, 60, 60 );\n }, this );\n\n // debugging\n //if( this.logger ){\n // view.on( 'all', function( event ){\n // this.log( this + '(view)', arguments );\n // }, this );\n //}\n return panel;\n },\n\n /** Attach views in this.views to the model based on $whereTo */\n _attachItems : function( $whereTo ){\n //ASSUMES: $list has been emptied\n this.$list( $whereTo ).append( this.views.map( function( view ){\n return view.$el;\n }));\n return this;\n },\n\n /** render the empty/none-found message */\n _renderEmptyMessage : function( $whereTo ){\n this.debug( '_renderEmptyMessage', $whereTo, this.searchFor );\n var text = this.searchFor? this.noneFoundMsg : this.emptyMsg;\n return this.$emptyMessage( $whereTo ).text( text );\n },\n\n /** collapse all item views */\n expandAll : function(){\n _.each( this.views, function( view ){\n view.expand();\n });\n },\n\n /** collapse all item views */\n collapseAll : function(){\n _.each( this.views, function( view ){\n view.collapse();\n });\n },\n\n // ------------------------------------------------------------------------ collection/views syncing\n /** Add a view (if the model should be viewable) to the panel */\n addItemView : function( model, collection, options ){\n this.log( this + '.addItemView:', model );\n var panel = this;\n if( !panel._filterItem( model ) ){ return undefined; }\n\n var view = panel._createItemView( model );\n // hide the empty message if only view\n $( view ).queue( 'fx', [\n //TODO:? could poss. pubsub this\n function( next ){ panel.$emptyMessage().fadeOut( panel.fxSpeed, next ); },\n function( next ){\n panel._attachView( view );\n next();\n }\n ]);\n return view;\n },\n\n /** internal fn to add view (to both panel.views and panel.$list) */\n _attachView : function( view ){\n var panel = this;\n // override to control where the view is added, how/whether it's rendered\n panel.views.push( view );\n panel.$list().append( view.render( 0 ).$el.hide() );\n panel.trigger( 'view:attached', view );\n view.$el.slideDown( panel.fxSpeed, function(){\n panel.trigger( 'view:attached:rendered' );\n });\n },\n\n /** Remove a view from the panel (if found) */\n removeItemView : function( model, collection, options ){\n this.log( this + '.removeItemView:', model );\n var panel = this,\n view = panel.viewFromModel( model );\n if( !view ){ return undefined; }\n panel.views = _.without( panel.views, view );\n panel.trigger( 'view:removed', view );\n\n // potentially show the empty message if no views left\n // use anonymous queue here - since remove can happen multiple times\n $({}).queue( 'fx', [\n function( next ){ view.$el.fadeOut( panel.fxSpeed, next ); },\n function( next ){\n view.remove();\n panel.trigger( 'view:removed:rendered' );\n if( !panel.views.length ){\n panel._renderEmptyMessage().fadeIn( panel.fxSpeed, next );\n } else {\n next();\n }\n }\n ]);\n return view;\n },\n\n /** get views based on model.id */\n viewFromModelId : function( id ){\n for( var i = 0; i < this.views.length; i++ ){\n if( this.views[i].model.id === id ){\n return this.views[i];\n }\n }\n return undefined;\n },\n\n /** get views based on model */\n viewFromModel : function( model ){\n if( !model ){ return undefined; }\n return this.viewFromModelId( model.id );\n },\n\n /** get views based on model properties */\n viewsWhereModel : function( properties ){\n return this.views.filter( function( view ){\n //return view.model.matches( properties );\n//TODO: replace with _.matches (underscore 1.6.0)\n var json = view.model.toJSON();\n for( var key in properties ){\n if( properties.hasOwnProperty( key ) ){\n if( json[ key ] !== view.model.get( key ) ){\n return false;\n }\n }\n }\n return true;\n });\n },\n\n /** A range of views between (and including) viewA and viewB */\n viewRange : function( viewA, viewB ){\n if( viewA === viewB ){ return ( viewA )?( [ viewA ] ):( [] ); }\n\n var indexA = this.views.indexOf( viewA ),\n indexB = this.views.indexOf( viewB );\n\n // handle not found\n if( indexA === -1 || indexB === -1 ){\n if( indexA === indexB ){ return []; }\n return ( indexA === -1 )?( [ viewB ] ):( [ viewA ] );\n }\n // reverse if indeces are\n //note: end inclusive\n return ( indexA < indexB )?\n this.views.slice( indexA, indexB + 1 ) :\n this.views.slice( indexB, indexA + 1 );\n },\n\n // ------------------------------------------------------------------------ searching\n /** render a search input for filtering datasets shown\n * (see SearchableMixin in base-mvc for implementation of the actual searching)\n * return will start the search\n * esc will clear the search\n * clicking the clear button will clear the search\n * uses searchInput in ui.js\n */\n _renderSearch : function( $where ){\n $where.find( '.controls .search-input' ).searchInput({\n placeholder : this.searchPlaceholder,\n initialVal : this.searchFor,\n onfirstsearch : _.bind( this._firstSearch, this ),\n onsearch : _.bind( this.searchItems, this ),\n onclear : _.bind( this.clearSearch, this )\n });\n return $where;\n },\n\n /** What to do on the first search entered */\n _firstSearch : function( searchFor ){\n // override to load model details if necc.\n this.log( 'onFirstSearch', searchFor );\n return this.searchItems( searchFor );\n },\n\n /** filter view list to those that contain the searchFor terms */\n searchItems : function( searchFor ){\n this.searchFor = searchFor;\n this.trigger( 'search:searching', searchFor, this );\n this.renderItems();\n this.$( '> .controls .search-query' ).val( searchFor );\n return this;\n },\n\n /** clear the search filters and show all views that are normally shown */\n clearSearch : function( searchFor ){\n //this.log( 'onSearchClear', this );\n this.searchFor = '';\n this.trigger( 'search:clear', this );\n this.$( '> .controls .search-query' ).val( '' );\n this.renderItems();\n return this;\n },\n\n // ------------------------------------------------------------------------ selection\n /** @type Integer when the number of list item views is >= to this, don't animate selectors */\n THROTTLE_SELECTORS_AT : 20,\n\n /** show selectors on all visible itemViews and associated controls */\n showSelectors : function( speed ){\n speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n this.selecting = true;\n this.$( '.list-actions' ).slideDown( speed );\n speed = this.views.length >= this.THROTTLE_SELECTORS_AT? 0 : speed;\n _.each( this.views, function( view ){\n view.showSelector( speed );\n });\n //this.selected = [];\n //this.lastSelected = null;\n },\n\n /** hide selectors on all visible itemViews and associated controls */\n hideSelectors : function( speed ){\n speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n this.selecting = false;\n this.$( '.list-actions' ).slideUp( speed );\n speed = this.views.length >= this.THROTTLE_SELECTORS_AT? 0 : speed;\n _.each( this.views, function( view ){\n view.hideSelector( speed );\n });\n this.selected = [];\n this.lastSelected = null;\n },\n\n /** show or hide selectors on all visible itemViews and associated controls */\n toggleSelectors : function(){\n if( !this.selecting ){\n this.showSelectors();\n } else {\n this.hideSelectors();\n }\n },\n\n /** select all visible items */\n selectAll : function( event ){\n _.each( this.views, function( view ){\n view.select( event );\n });\n },\n\n /** deselect all visible items */\n deselectAll : function( event ){\n this.lastSelected = null;\n _.each( this.views, function( view ){\n view.deselect( event );\n });\n },\n\n /** select a range of datasets between A and B */\n selectRange : function( viewA, viewB ){\n var range = this.viewRange( viewA, viewB );\n _.each( range, function( view ){\n view.select();\n });\n return range;\n },\n\n /** return an array of all currently selected itemViews */\n getSelectedViews : function(){\n return _.filter( this.views, function( v ){\n return v.selected;\n });\n },\n\n /** return a collection of the models of all currenly selected items */\n getSelectedModels : function(){\n return new this.collection.constructor( _.map( this.getSelectedViews(), function( view ){\n return view.model;\n }));\n },\n\n // ------------------------------------------------------------------------ loading indicator\n//TODO: questionable\n /** hide the $el and display a loading indicator (in the $el's parent) when loading new data */\n _showLoadingIndicator : function( msg, speed, callback ){\n this.debug( '_showLoadingIndicator', this.indicator, msg, speed, callback );\n speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n if( !this.indicator ){\n this.indicator = new LoadingIndicator( this.$el, this.$el.parent() );\n this.debug( '\\t created', this.indicator );\n }\n if( !this.$el.is( ':visible' ) ){\n this.indicator.show( 0, callback );\n } else {\n this.$el.fadeOut( speed );\n this.indicator.show( msg, speed, callback );\n }\n },\n\n /** hide the loading indicator */\n _hideLoadingIndicator : function( speed, callback ){\n this.debug( '_hideLoadingIndicator', this.indicator, speed, callback );\n speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n if( this.indicator ){\n this.indicator.hide( speed, callback );\n }\n },\n\n // ------------------------------------------------------------------------ scrolling\n /** get the current scroll position of the panel in its parent */\n scrollPosition : function(){\n return this.$scrollContainer().scrollTop();\n },\n\n /** set the current scroll position of the panel in its parent */\n scrollTo : function( pos, speed ){\n speed = speed || 0;\n this.$scrollContainer().animate({ scrollTop: pos }, speed );\n return this;\n },\n\n /** Scrolls the panel to the top. */\n scrollToTop : function( speed ){\n return this.scrollTo( 0, speed );\n },\n\n /** */\n scrollToItem : function( view, speed ){\n if( !view ){ return this; }\n //var itemTop = view.$el.offset().top;\n var itemTop = view.$el.position().top;\n return this.scrollTo( itemTop, speed );\n },\n\n /** Scrolls the panel to show the content with the given id. */\n scrollToId : function( id, speed ){\n return this.scrollToItem( this.viewFromModelId( id ), speed );\n },\n\n // ------------------------------------------------------------------------ panel events\n /** event map */\n events : {\n 'click .select-all' : 'selectAll',\n 'click .deselect-all' : 'deselectAll'\n },\n\n // ------------------------------------------------------------------------ misc\n /** Return a string rep of the panel */\n toString : function(){\n return 'ListPanel(' + this.collection + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nListPanel.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var elTemplate = BASE_MVC.wrapTemplate([\n // temp container\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '
            '\n ]);\n\n var controlsTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n '
            ',\n '
            <%- view.title %>
            ',\n '
            ',\n '
            <%- view.subtitle %>
            ',\n // buttons, controls go here\n '
            ',\n // deleted msg, etc.\n '
            ',\n\n '
            ',\n '
            ',\n '
            ',\n\n // show when selectors are shown\n '
            ',\n '
            ',\n '',\n '',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '
            '\n ]);\n\n return {\n el : elTemplate,\n controls : controlsTemplate\n };\n}());\n\n\n//=============================================================================\n/** View for a model that has a sub-collection (e.g. History, DatasetCollection)\n * Allows:\n * the model to be reset\n * auto assign panel.collection to panel.model[ panel.modelCollectionKey ]\n *\n */\nvar ModelListPanel = ListPanel.extend({\n\n /** key of attribute in model to assign to this.collection */\n modelCollectionKey : 'contents',\n\n initialize : function( attributes ){\n ListPanel.prototype.initialize.call( this, attributes );\n this.selecting = ( attributes.selecting !== undefined )? attributes.selecting : false;\n\n this.setModel( this.model, attributes );\n },\n\n /** release/free/shutdown old models and set up panel for new models\n * @fires new-model with the panel as parameter\n */\n setModel : function( model, attributes ){\n attributes = attributes || {};\n this.debug( this + '.setModel:', model, attributes );\n\n this.freeModel();\n this.freeViews();\n\n if( model ){\n var oldModelId = this.model? this.model.get( 'id' ): null;\n\n // set up the new model with user, logger, storage, events\n this.model = model;\n if( this.logger ){\n this.model.logger = this.logger;\n }\n this._setUpModelListeners();\n\n//TODO: relation btwn model, collection becoming tangled here\n // free the collection, and assign the new collection to either\n // the model[ modelCollectionKey ], attributes.collection, or an empty vanilla collection\n this.collection.off();\n this.collection = ( this.model[ this.modelCollectionKey ] )?\n this.model[ this.modelCollectionKey ]:\n ( attributes.collection || ( new this.collectionClass([]) ) );\n this._setUpCollectionListeners();\n\n if( oldModelId && model.get( 'id' ) !== oldModelId ){\n this.trigger( 'new-model', this );\n }\n }\n return this;\n },\n\n /** free the current model and all listeners for it, free any views for the model */\n freeModel : function(){\n // stop/release the previous model, and clear cache to sub-views\n if( this.model ){\n this.stopListening( this.model );\n //TODO: see base-mvc\n //this.model.free();\n //this.model = null;\n }\n return this;\n },\n\n // ------------------------------------------------------------------------ listening\n /** listening for model events */\n _setUpModelListeners : function(){\n // override\n this.log( this + '._setUpModelListeners', this.model );\n // bounce model errors up to the panel\n this.model.on( 'error', function(){\n var args = Array.prototype.slice.call( arguments, 0 );\n //args.unshift( 'model:error' );\n args.unshift( 'error' );\n this.trigger.apply( this, args );\n }, this );\n return this;\n },\n\n /** Build a temp div containing the new children for the view's $el.\n */\n _renderControls : function( $newRender ){\n this.debug( this + '(ListPanel)._renderControls' );\n var json = this.model? this.model.toJSON() : {},\n $controls = $( this.templates.controls( json, this ) );\n $newRender.find( '.controls' ).replaceWith( $controls );\n return $controls;\n },\n\n // ------------------------------------------------------------------------ misc\n /** Return a string rep of the panel */\n toString : function(){\n return 'ModelListPanel(' + this.model + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nModelListPanel.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var controlsTemplate = BASE_MVC.wrapTemplate([\n '
            ',\n '
            ',\n//TODO: this is really the only difference - consider factoring titlebar out\n '
            <%- model.name %>
            ',\n '
            ',\n '
            <%- view.subtitle %>
            ',\n '
            ',\n '
            ',\n\n '
            ',\n '
            ',\n '
            ',\n\n '
            ',\n '
            ',\n '',\n '',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '
            '\n ]);\n\n return _.extend( _.clone( ListPanel.prototype.templates ), {\n controls : controlsTemplate\n });\n}());\n\n\n//=============================================================================\n return {\n ListPanel : ListPanel,\n ModelListPanel : ModelListPanel\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/list/list-view.js\n ** module id = 100\n ** module chunks = 3\n **/","define([\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( baseMVC, _l ){\n// =============================================================================\n/** A view on any model that has a 'tags' attribute (a list of tag strings)\n * Incorporates the select2 jQuery plugin for tags display/editing:\n * http://ivaynberg.github.io/select2/\n */\nvar TagsEditor = Backbone.View\n .extend( baseMVC.LoggableMixin )\n .extend( baseMVC.HiddenUntilActivatedViewMixin ).extend({\n\n tagName : 'div',\n className : 'tags-display',\n\n /** Set up listeners, parse options */\n initialize : function( options ){\n //console.debug( this, options );\n // only listen to the model only for changes to tags - re-render\n this.listenTo( this.model, 'change:tags', function(){\n this.render();\n });\n this.hiddenUntilActivated( options.$activator, options );\n },\n\n /** Build the DOM elements, call select to on the created input, and set up behaviors */\n render : function(){\n var view = this;\n this.$el.html( this._template() );\n\n this.$input().select2({\n placeholder : 'Add tags',\n width : '100%',\n tags : function(){\n // initialize possible tags in the dropdown based on all the tags the user has used so far\n return view._getTagsUsed();\n }\n });\n\n this._setUpBehaviors();\n return this;\n },\n\n /** @returns {String} the html text used to build the view's DOM */\n _template : function(){\n return [\n //TODO: make prompt optional\n '',\n // set up initial tags by adding as CSV to input vals (necc. to init select2)\n ''\n ].join( '' );\n },\n\n /** @returns {String} the sorted, comma-separated tags from the model */\n tagsToCSV : function(){\n var tagsArray = this.model.get( 'tags' );\n if( !_.isArray( tagsArray ) || _.isEmpty( tagsArray ) ){\n return '';\n }\n return tagsArray.map( function( tag ){\n return _.escape( tag );\n }).sort().join( ',' );\n },\n\n /** @returns {jQuery} the input for this view */\n $input : function(){\n return this.$el.find( 'input.tags-input' );\n },\n\n /** @returns {String[]} all tags used by the current user */\n _getTagsUsed : function(){\n//TODO: global\n return Galaxy.user.get( 'tags_used' );\n },\n\n /** set up any event listeners on the view's DOM (mostly handled by select2) */\n _setUpBehaviors : function(){\n var view = this;\n this.$input().on( 'change', function( event ){\n // save the model's tags in either remove or added event\n view.model.save({ tags: event.val }, { silent: true });\n // if it's new, add the tag to the users tags\n if( event.added ){\n //??: solve weird behavior in FF on test.galaxyproject.org where\n // event.added.text is string object: 'String{ 0=\"o\", 1=\"n\", 2=\"e\" }'\n view._addNewTagToTagsUsed( event.added.text + '' );\n }\n });\n },\n\n /** add a new tag (if not already there) to the list of all tags used by the user\n * @param {String} newTag the tag to add to the list of used\n */\n _addNewTagToTagsUsed : function( newTag ){\n//TODO: global\n var tagsUsed = Galaxy.user.get( 'tags_used' );\n if( !_.contains( tagsUsed, newTag ) ){\n tagsUsed.push( newTag );\n tagsUsed.sort();\n Galaxy.user.set( 'tags_used', tagsUsed );\n }\n },\n\n /** shut down event listeners and remove this view's DOM */\n remove : function(){\n this.$input.off();\n this.stopListening( this.model );\n Backbone.View.prototype.remove.call( this );\n },\n\n /** string rep */\n toString : function(){ return [ 'TagsEditor(', this.model + '', ')' ].join(''); }\n});\n\n// =============================================================================\nreturn {\n TagsEditor : TagsEditor\n};\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/tag.js\n ** module id = 101\n ** module chunks = 3\n **/","/** This renders the content of the ftp popup **/\ndefine(['utils/utils'], function(Utils) {\nreturn Backbone.View.extend({\n // render\n initialize: function(options) {\n // link options\n this.options = Utils.merge(options, {\n class_add : 'upload-icon-button fa fa-square-o',\n class_remove : 'upload-icon-button fa fa-check-square-o',\n class_partial : 'upload-icon-button fa fa-minus-square-o',\n collection : null,\n onchange : function() {},\n onadd : function() {},\n onremove : function() {}\n });\n\n // link this\n var self = this;\n\n // link app\n this.collection = this.options.collection;\n\n // set template\n this.setElement(this._template());\n\n // list of rows\n this.rows = [];\n\n // load extension\n Utils.get({\n url : Galaxy.root + 'api/remote_files',\n success : function(ftp_files) { self._fill(ftp_files); },\n error : function() { self._fill(); }\n });\n },\n\n // fill table\n _fill: function(ftp_files) {\n if (ftp_files && ftp_files.length > 0) {\n // add table\n this.$el.find('#upload-ftp-content').html($(this._templateTable()));\n\n // add files to table\n var size = 0;\n for (index in ftp_files) {\n this.rows.push(this._add(ftp_files[index]));\n size += ftp_files[index].size;\n }\n\n // update stats\n this.$el.find('#upload-ftp-number').html(ftp_files.length + ' files');\n this.$el.find('#upload-ftp-disk').html(Utils.bytesToString (size, true));\n\n // add event handler to select/unselect all\n if (this.collection) {\n var self = this;\n this.$('._has_collection').show();\n this.$select_all = $('#upload-selectall');\n this.$select_all.addClass(this.options.class_add);\n this.$select_all.on('click', function() {\n var add = self.$select_all.hasClass(self.options.class_add);\n for (index in ftp_files) {\n var ftp_file = ftp_files[index];\n var model_index = self._find(ftp_file);\n if(!model_index && add || model_index && !add) {\n self.rows[index].trigger('click');\n }\n }\n });\n this._refresh();\n }\n } else {\n this.$el.find('#upload-ftp-content').html($(this._templateInfo()));\n }\n this.$el.find('#upload-ftp-wait').hide();\n },\n\n // add\n _add: function(ftp_file) {\n // link this\n var self = this;\n\n // create new item\n var $it = $(this._templateRow(ftp_file));\n\n // identify icon\n var $icon = $it.find('.icon');\n\n // append to table\n $(this.el).find('tbody').append($it);\n\n // collection mode with add/remove triggers\n if (this.collection) {\n // find model and set initial 'add' icon class\n var icon_class = '';\n if (this._find(ftp_file)) {\n icon_class = this.options.class_remove;\n } else {\n icon_class = this.options.class_add;\n }\n $icon.addClass(icon_class);\n\n // click triggers add/remove events\n $it.on('click', function() {\n var model_index = self._find(ftp_file);\n $icon.removeClass();\n if (!model_index) {\n self.options.onadd(ftp_file);\n $icon.addClass(self.options.class_remove);\n } else {\n self.options.onremove(model_index);\n $icon.addClass(self.options.class_add);\n }\n self._refresh();\n });\n } else {\n // click triggers only change\n $it.on('click', function() {\n self.options.onchange(ftp_file);\n });\n }\n\n // return dom handler\n return $it;\n },\n\n // refresh\n _refresh: function() {\n var filtered = this.collection.where({file_mode: 'ftp', enabled: true});\n this.$select_all.removeClass();\n if (filtered.length == 0) {\n this.$select_all.addClass(this.options.class_add);\n } else {\n if (filtered.length == this.rows.length) {\n this.$select_all.addClass(this.options.class_remove);\n } else {\n this.$select_all.addClass(this.options.class_partial);\n }\n }\n },\n\n // get model index\n _find: function(ftp_file) {\n var item = this.collection.findWhere({\n file_path : ftp_file.path,\n file_mode : 'ftp',\n enabled : true\n });\n return item && item.get('id');\n },\n\n // template row\n _templateRow: function(options) {\n return '' +\n '
            ' +\n '' + options.path + '' +\n '' + Utils.bytesToString(options.size) + '' +\n '' + options.ctime + '' +\n '';\n },\n\n // load table template\n _templateTable: function() {\n return 'Available files: ' +\n '' +\n '' +\n '  ' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
            NameSizeCreated
            ';\n },\n\n // load table template\n _templateInfo: function() {\n return '
            ' +\n 'Your FTP directory does not contain any files.' +\n '
            ';\n },\n\n // load html template\n _template: function() {\n return '
            ' +\n '
            ' +\n '
            This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at ' + this.options.ftp_upload_site + ' using your Galaxy credentials (email address and password).
            ' +\n '
            ' +\n '
            ';\n }\n});\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/upload/upload-ftp.js\n ** module id = 103\n ** module chunks = 3\n **/","/** This renders the content of the settings popup, allowing users to specify flags i.e. for space-to-tab conversion **/\ndefine(['utils/utils'], function(Utils) {\nreturn Backbone.View.extend({\n // options\n options: {\n class_check : 'upload-icon-button fa fa-check-square-o',\n class_uncheck : 'upload-icon-button fa fa-square-o'\n },\n\n // initialize\n initialize: function(app) {\n // link app\n this.app = app;\n\n // link this\n var self = this;\n\n // set template\n this.setElement(this._template());\n\n // link model\n this.model = this.app.model;\n\n // ui event: space-to-tab\n this.$('#upload-space-to-tab').on('click', function() {\n self._switchState('#upload-space-to-tab', 'space_to_tab');\n });\n\n // ui event: to-posix-lines\n this.$('#upload-to-posix-lines').on('click', function() {\n self._switchState('#upload-to-posix-lines', 'to_posix_lines');\n });\n\n // render\n this.render();\n },\n\n // render\n render: function() {\n // render states\n this._renderState('#upload-space-to-tab', this.model.get('space_to_tab'));\n this._renderState('#upload-to-posix-lines', this.model.get('to_posix_lines'));\n\n // disable options\n var $cover = this.$('#upload-settings-cover');\n if (!this.model.get('enabled')) {\n $cover.show();\n } else {\n $cover.hide();\n }\n },\n\n // switch state\n _switchState: function (element_id, parameter_id) {\n if (this.model.get('enabled')) {\n var checked = !this.model.get(parameter_id);\n this.model.set(parameter_id, checked);\n this._renderState(element_id, checked);\n }\n },\n\n // render state\n _renderState: function (element_id, checked) {\n var $it = this.$(element_id);\n $it.removeClass();\n if (checked) {\n $it.addClass(this.options.class_check);\n } else {\n $it.addClass(this.options.class_uncheck);\n }\n },\n\n // load template\n _template: function() {\n return '
            ' +\n '
            ' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
            Convert spaces to tabs
            Use POSIX standard
            ' +\n '
            ';\n }\n});\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/upload/upload-settings.js\n ** module id = 104\n ** module chunks = 3\n **/","(function (factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else {\n // Browser globals\n factory(jQuery);\n }\n\n}(function () {\n//=============================================================================\n\n jQuery.fn.extend({\n hoverhighlight : function $hoverhighlight( scope, color ){\n scope = scope || 'body';\n if( !this.size() ){ return this; }\n\n $( this ).each( function(){\n var $this = $( this ),\n targetSelector = $this.data( 'target' );\n\n if( targetSelector ){\n $this.mouseover( function( ev ){\n $( targetSelector, scope ).css({\n background: color\n });\n })\n .mouseout( function( ev ){\n $( targetSelector ).css({\n background: ''\n });\n });\n }\n });\n return this;\n }\n });\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/ui/hoverhighlight.js\n ** module id = 107\n ** module chunks = 3\n **/","// from: https://raw.githubusercontent.com/umdjs/umd/master/jqueryPlugin.js\n// Uses AMD or browser globals to create a jQuery plugin.\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n //TODO: So...this turns out to be an all or nothing thing. If I load jQuery in the define below, it will\n // (of course) wipe the old jquery *and all the plugins loaded into it*. So the define below *is still\n // relying on jquery being loaded globally* in order to preserve plugins.\n define([], factory);\n } else {\n // Browser globals\n factory(jQuery);\n }\n\n}(function () {\n var _l = window._l || function( s ){ return s; };\n\n /** searchInput: (jQuery plugin)\n * Creates a search input, a clear button, and loading indicator\n * within the selected node.\n *\n * When the user either presses return or enters some minimal number\n * of characters, a callback is called. Pressing ESC when the input\n * is focused will clear the input and call a separate callback.\n */\n function searchInput( parentNode, options ){\n//TODO: consolidate with tool menu functionality, use there\n var KEYCODE_ESC = 27,\n KEYCODE_RETURN = 13,\n $parentNode = $( parentNode ),\n firstSearch = true,\n defaults = {\n initialVal : '',\n name : 'search',\n placeholder : 'search',\n classes : '',\n onclear : function(){},\n onfirstsearch : null,\n onsearch : function( inputVal ){},\n minSearchLen : 0,\n escWillClear : true,\n oninit : function(){}\n };\n\n // .................................................................... input rendering and events\n // visually clear the search, trigger an event, and call the callback\n function clearSearchInput( event ){\n var $input = $( this ).parent().children( 'input' );\n //console.debug( this, 'clear', $input );\n $input.focus().val( '' ).trigger( 'clear:searchInput' );\n options.onclear();\n }\n\n // search for searchTerms, trigger an event, call the appropo callback (based on whether this is the first)\n function search( event, searchTerms ){\n //console.debug( this, 'searching', searchTerms );\n //TODO: I don't think this is classic jq custom event form? search.searchInput?\n $( this ).trigger( 'search:searchInput', searchTerms );\n if( typeof options.onfirstsearch === 'function' && firstSearch ){\n firstSearch = false;\n options.onfirstsearch( searchTerms );\n } else {\n options.onsearch( searchTerms );\n }\n }\n\n // .................................................................... input rendering and events\n function inputTemplate(){\n // class search-query is bootstrap 2.3 style that now lives in base.less\n return [ '' ].join( '' );\n }\n\n // the search input that responds to keyboard events and displays the search value\n function $input(){\n return $( inputTemplate() )\n // select all text on a focus\n .focus( function( event ){\n $( this ).select();\n })\n // attach behaviors to esc, return if desired, search on some min len string\n .keyup( function( event ){\n event.preventDefault();\n event.stopPropagation();\n//TODO: doesn't work\n if( !$( this ).val() ){ $( this ).blur(); }\n\n // esc key will clear if desired\n if( event.which === KEYCODE_ESC && options.escWillClear ){\n clearSearchInput.call( this, event );\n\n } else {\n var searchTerms = $( this ).val();\n // return key or the search string len > minSearchLen (if not 0) triggers search\n if( ( event.which === KEYCODE_RETURN )\n || ( options.minSearchLen && searchTerms.length >= options.minSearchLen ) ){\n search.call( this, event, searchTerms );\n } else if( !searchTerms.length ){\n clearSearchInput.call( this, event );\n }\n }\n })\n .on( 'change', function( event ){\n search.call( this, event, $( this ).val() );\n })\n .val( options.initialVal );\n }\n\n // .................................................................... clear button rendering and events\n // a button for clearing the search bar, placed on the right hand side\n function $clearBtn(){\n return $([ '' ].join('') )\n .tooltip({ placement: 'bottom' })\n .click( function( event ){\n clearSearchInput.call( this, event );\n });\n }\n\n // .................................................................... loadingIndicator rendering\n // a button for clearing the search bar, placed on the right hand side\n function $loadingIndicator(){\n return $([ '' ].join('') )\n .hide().tooltip({ placement: 'bottom' });\n }\n\n // .................................................................... commands\n // visually swap the load, clear buttons\n function toggleLoadingIndicator(){\n $parentNode.find( '.search-loading' ).toggle();\n $parentNode.find( '.search-clear' ).toggle();\n }\n\n // .................................................................... init\n // string command (not constructor)\n if( jQuery.type( options ) === 'string' ){\n if( options === 'toggle-loading' ){\n toggleLoadingIndicator();\n }\n return $parentNode;\n }\n\n // initial render\n if( jQuery.type( options ) === 'object' ){\n options = jQuery.extend( true, {}, defaults, options );\n }\n //NOTE: prepended\n return $parentNode.addClass( 'search-input' ).prepend([ $input(), $clearBtn(), $loadingIndicator() ]);\n }\n\n // as jq plugin\n jQuery.fn.extend({\n searchInput : function $searchInput( options ){\n return this.each( function(){\n return searchInput( this, options );\n });\n }\n });\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/ui/search-input.js\n ** module id = 108\n ** module chunks = 3\n **/","define([], function(){\n// Alphanumeric/natural sort fn\nfunction naturalSort(a, b) {\n // setup temp-scope variables for comparison evauluation\n var re = /(-?[0-9\\.]+)/g,\n x = a.toString().toLowerCase() || '',\n y = b.toString().toLowerCase() || '',\n nC = String.fromCharCode(0),\n xN = x.replace( re, nC + '$1' + nC ).split(nC),\n yN = y.replace( re, nC + '$1' + nC ).split(nC),\n xD = (new Date(x)).getTime(),\n yD = xD ? (new Date(y)).getTime() : null;\n // natural sorting of dates\n if ( yD ) {\n if ( xD < yD ) { return -1; }\n else if ( xD > yD ) { return 1; }\n }\n // natural sorting through split numeric strings and default strings\n var oFxNcL, oFyNcL;\n for ( var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++ ) {\n oFxNcL = parseFloat(xN[cLoc]) || xN[cLoc];\n oFyNcL = parseFloat(yN[cLoc]) || yN[cLoc];\n if (oFxNcL < oFyNcL) { return -1; }\n else if (oFxNcL > oFyNcL) { return 1; }\n }\n return 0;\n}\n\nreturn naturalSort;\n})\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/utils/natural-sort.js\n ** module id = 110\n ** module chunks = 3\n **/","/*\n galaxy upload plugins - requires FormData and XMLHttpRequest\n*/\n;(function($){\n // add event properties\n jQuery.event.props.push(\"dataTransfer\");\n\n /**\n Posts file data to the API\n */\n $.uploadpost = function (config) {\n // parse options\n var cnf = $.extend({}, {\n data : {},\n success : function() {},\n error : function() {},\n progress : function() {},\n url : null,\n maxfilesize : 2048,\n error_filesize : 'File exceeds 2GB. Please use a FTP client.',\n error_default : 'Please make sure the file is available.',\n error_server : 'Upload request failed.',\n error_login : 'Uploads require you to log in.'\n }, config);\n\n // link data\n var data = cnf.data;\n\n // check errors\n if (data.error_message) {\n cnf.error(data.error_message);\n return;\n }\n\n // construct form data\n var form = new FormData();\n for (var key in data.payload) {\n form.append(key, data.payload[key]);\n }\n\n // add files to submission\n var sizes = 0;\n for (var key in data.files) {\n var d = data.files[key];\n form.append(d.name, d.file, d.file.name);\n sizes += d.file.size;\n }\n\n // check file size, unless it's an ftp file\n if (sizes > 1048576 * cnf.maxfilesize) {\n cnf.error(cnf.error_filesize);\n return;\n }\n\n // prepare request\n xhr = new XMLHttpRequest();\n xhr.open('POST', cnf.url, true);\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.setRequestHeader('Cache-Control', 'no-cache');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n // captures state changes\n xhr.onreadystatechange = function() {\n // check for request completed, server connection closed\n if (xhr.readyState == xhr.DONE) {\n // parse response\n var response = null;\n if (xhr.responseText) {\n try {\n response = jQuery.parseJSON(xhr.responseText);\n } catch (e) {\n response = xhr.responseText;\n }\n }\n // pass any error to the error option\n if (xhr.status < 200 || xhr.status > 299) {\n var text = xhr.statusText;\n if (xhr.status == 403) {\n text = cnf.error_login;\n } else if (xhr.status == 0) {\n text = cnf.error_server;\n } else if (!text) {\n text = cnf.error_default;\n }\n cnf.error(text + ' (' + xhr.status + ')');\n } else {\n cnf.success(response);\n }\n }\n }\n\n // prepare upload progress\n xhr.upload.addEventListener('progress', function(e) {\n if (e.lengthComputable) {\n cnf.progress(Math.round((e.loaded * 100) / e.total));\n }\n }, false);\n\n // send request\n Galaxy.emit.debug('uploadbox::uploadpost()', 'Posting following data.', cnf);\n xhr.send(form);\n }\n\n /**\n Handles the upload events drag/drop etc.\n */\n $.fn.uploadinput = function(options) {\n // initialize\n var el = this;\n var opts = $.extend({}, {\n ondragover : function() {},\n ondragleave : function() {},\n onchange : function() {},\n multiple : false\n }, options);\n\n // append hidden upload field\n var $input = $('');\n el.append($input.change(function (e) {\n opts.onchange(e.target.files);\n $(this).val('');\n }));\n\n // drag/drop events\n el.on('drop', function (e) {\n opts.ondragleave(e);\n if(e.dataTransfer) {\n opts.onchange(e.dataTransfer.files);\n e.preventDefault();\n }\n });\n el.on('dragover', function (e) {\n e.preventDefault();\n opts.ondragover(e);\n });\n el.on('dragleave', function (e) {\n e.stopPropagation();\n opts.ondragleave(e);\n });\n\n // exports\n return {\n dialog: function () {\n $input.trigger('click');\n }\n }\n }\n\n /**\n Handles the upload queue and events such as drag/drop etc.\n */\n $.fn.uploadbox = function(options) {\n // parse options\n var opts = $.extend({}, {\n dragover : function() {},\n dragleave : function() {},\n announce : function(d) {},\n initialize : function(d) {},\n progress : function(d, m) {},\n success : function(d, m) {},\n error : function(d, m) { alert(m); },\n complete : function() {}\n }, options);\n\n // file queue\n var queue = {};\n\n // queue index/length counter\n var queue_index = 0;\n var queue_length = 0;\n\n // indicates if queue is currently running\n var queue_running = false;\n var queue_stop = false;\n\n // element\n var uploadinput = $(this).uploadinput({\n multiple : true,\n onchange : function(files) { add(files); },\n ondragover : options.ondragover,\n ondragleave : options.ondragleave\n });\n\n // add new files to upload queue\n function add(files) {\n if (files && files.length && !queue_running) {\n var current_index = queue_index;\n _.each(files, function(file, key) {\n if (file.mode !== 'new' && _.filter(queue, function(f) {\n return f.name === file.name && f.size === file.size;\n }).length) {\n file.duplicate = true;\n }\n });\n _.each(files, function(file) {\n if (!file.duplicate) {\n var index = String(queue_index++);\n queue[index] = file;\n opts.announce(index, queue[index]);\n queue_length++;\n }\n });\n return current_index;\n }\n }\n\n // remove file from queue\n function remove(index) {\n if (queue[index]) {\n delete queue[index];\n queue_length--;\n }\n }\n\n // process an upload, recursive\n function process() {\n // validate\n if (queue_length == 0 || queue_stop) {\n queue_stop = false;\n queue_running = false;\n opts.complete();\n return;\n } else {\n queue_running = true;\n }\n\n // get an identifier from the queue\n var index = -1;\n for (var key in queue) {\n index = key;\n break;\n }\n\n // get current file from queue\n var file = queue[index];\n\n // remove from queue\n remove(index)\n\n // create and submit data\n $.uploadpost({\n url : opts.url,\n data : opts.initialize(index),\n success : function(message) { opts.success(index, message); process();},\n error : function(message) { opts.error(index, message); process();},\n progress : function(percentage) { opts.progress(index, percentage); }\n });\n }\n\n /*\n public interface\n */\n\n // open file browser for selection\n function select() {\n uploadinput.dialog();\n }\n\n // remove all entries from queue\n function reset(index) {\n for (index in queue) {\n remove(index);\n }\n }\n\n // initiate upload process\n function start() {\n if (!queue_running) {\n queue_running = true;\n process();\n }\n }\n\n // stop upload process\n function stop() {\n queue_stop = true;\n }\n\n // set options\n function configure(options) {\n opts = $.extend({}, opts, options);\n return opts;\n }\n\n // verify browser compatibility\n function compatible() {\n return window.File && window.FormData && window.XMLHttpRequest && window.FileList;\n }\n\n // export functions\n return {\n 'select' : select,\n 'add' : add,\n 'remove' : remove,\n 'start' : start,\n 'stop' : stop,\n 'reset' : reset,\n 'configure' : configure,\n 'compatible' : compatible\n };\n }\n})(jQuery);\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/utils/uploadbox.js\n ** module id = 111\n ** module chunks = 3\n **/","var RightPanel = require( 'layout/panel' ).RightPanel,\n Ui = require( 'mvc/ui/ui-misc' ),\n historyOptionsMenu = require( 'mvc/history/options-menu' );\n CurrentHistoryView = require( 'mvc/history/history-view-edit-current' ).CurrentHistoryView,\n _l = require( 'utils/localization' );\n\n/** the right hand panel in the analysis page that shows the current history */\nvar HistoryPanel = RightPanel.extend({\n\n title : _l( 'History' ),\n\n initialize : function( options ){\n RightPanel.prototype.initialize.call( this, options );\n var self = this;\n\n // this button re-fetches the history and contents and re-renders the history panel\n this.refreshButton = new Ui.ButtonLink({\n id : 'history-refresh-button',\n title : _l( 'Refresh history' ),\n cls : 'panel-header-button',\n icon : 'fa fa-refresh',\n onclick : function() {\n self.historyView.loadCurrentHistory();\n }\n });\n // opens a drop down menu with history related functions (like view all, delete, share, etc.)\n this.optionsButton = new Ui.ButtonLink({\n id : 'history-options-button',\n title : _l( 'History options' ),\n cls : 'panel-header-button',\n icon : 'fa fa-cog',\n });\n // goes to a page showing all the users histories in panel form (for logged in users)\n this.viewMultiButton = null;\n if( !options.userIsAnonymous ){\n this.viewMultiButton = new Ui.ButtonLink({\n id : 'history-view-multi-button',\n title : _l( 'View all histories' ),\n cls : 'panel-header-button',\n icon : 'fa fa-columns',\n href : options.galaxyRoot + 'history/view_multiple'\n });\n }\n\n // build history options menu\n this.optionsMenu = historyOptionsMenu( this.optionsButton.$el, {\n anonymous : options.userIsAnonymous,\n purgeAllowed : options.allow_user_dataset_purge,\n root : options.galaxyRoot\n });\n\n // view of the current history\n this.historyView = new CurrentHistoryView({\n purgeAllowed : options.allow_user_dataset_purge,\n linkTarget : 'galaxy_main',\n $scrollContainer: function(){ return this.$el.parent(); }\n });\n },\n\n render : function(){\n RightPanel.prototype.render.call( this );\n this.$( '.unified-panel-header' ).addClass( 'history-panel-header' );\n this.$( '.panel-header-buttons' ).append([\n this.refreshButton.$el,\n this.optionsButton.$el,\n this.viewMultiButton? this.viewMultiButton.$el : null,\n ]);\n this.historyView\n .setElement( this.$( '.history-panel' ) );\n // causes blink/flash due to loadCurrentHistory rendering as well\n // .render();\n },\n\n _templateBody : function( data ){\n return [\n '
            ',\n '
            ',\n '
            '\n ].join('');\n },\n\n toString : function(){ return 'HistoryPanel'; }\n});\n\nmodule.exports = HistoryPanel;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/apps/history-panel.js\n ** module id = 112\n ** module chunks = 3\n **/","var LeftPanel = require( 'layout/panel' ).LeftPanel,\n Tools = require( 'mvc/tool/tools' ),\n Upload = require( 'mvc/upload/upload-view' ),\n _l = require( 'utils/localization' );\n\n/* Builds the tool menu panel on the left of the analysis page */\nvar ToolPanel = LeftPanel.extend({\n\n title : _l( 'Tools' ),\n\n initialize: function( options ){\n LeftPanel.prototype.initialize.call( this, options );\n this.log( this + '.initialize:', options );\n\n /** @type {Object[]} descriptions of user's workflows to be shown in the tool menu */\n this.stored_workflow_menu_entries = options.stored_workflow_menu_entries || [];\n\n // create tool search, tool panel, and tool panel view.\n var tool_search = new Tools.ToolSearch({\n spinner_url : options.spinner_url,\n search_url : options.search_url,\n hidden : false\n });\n var tools = new Tools.ToolCollection( options.toolbox );\n this.tool_panel = new Tools.ToolPanel({\n tool_search : tool_search,\n tools : tools,\n layout : options.toolbox_in_panel\n });\n this.tool_panel_view = new Tools.ToolPanelView({ model: this.tool_panel });\n\n // add upload modal\n this.uploadButton = new Upload({\n nginx_upload_path : options.nginx_upload_path,\n ftp_upload_site : options.ftp_upload_site,\n default_genome : options.default_genome,\n default_extension : options.default_extension,\n });\n },\n\n render : function(){\n var self = this;\n LeftPanel.prototype.render.call( self );\n self.$( '.panel-header-buttons' ).append( self.uploadButton.$el );\n\n // if there are tools, render panel and display everything\n if (self.tool_panel.get( 'layout' ).size() > 0) {\n self.tool_panel_view.render();\n //TODO: why the hide/show?\n self.$( '.toolMenu' ).show();\n }\n self.$( '.toolMenuContainer' ).prepend( self.tool_panel_view.$el );\n\n self._renderWorkflowMenu();\n\n // if a tool link has the minsizehint attribute, handle it here (gen. by hiding the tool panel)\n self.$( 'a[minsizehint]' ).click( function() {\n if ( parent.handle_minwidth_hint ) {\n parent.handle_minwidth_hint( $( self ).attr( 'minsizehint' ) );\n }\n });\n },\n\n /** build the dom for the workflow portion of the tool menu */\n _renderWorkflowMenu : function(){\n var self = this;\n // add internal workflow list\n self.$( '#internal-workflows' ).append( self._templateTool({\n title : _l( 'All workflows' ),\n href : 'workflow/list_for_run'\n }));\n _.each( self.stored_workflow_menu_entries, function( menu_entry ){\n self.$( '#internal-workflows' ).append( self._templateTool({\n title : menu_entry.stored_workflow.name,\n href : 'workflow/run?id=' + menu_entry.encoded_stored_workflow_id\n }));\n });\n },\n\n /** build a link to one tool */\n _templateTool: function( tool ) {\n return [\n '
            ',\n // global\n '', tool.title, '',\n '
            '\n ].join('');\n },\n\n /** override to include inital menu dom and workflow section */\n _templateBody : function(){\n return [\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '', _l( 'Search did not match any tools.' ), '',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '', _l( 'Workflows' ), '',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '
            '\n ].join('');\n },\n\n toString : function(){ return 'ToolPanel'; }\n});\n\nmodule.exports = ToolPanel;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/apps/tool-panel.js\n ** module id = 113\n ** module chunks = 3\n **/","define([\n \"mvc/collection/collection-li\",\n \"mvc/dataset/dataset-li-edit\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DC_LI, DATASET_LI_EDIT, BASE_MVC, _l ){\n/* global Backbone */\n//==============================================================================\nvar DCListItemView = DC_LI.DCListItemView;\n/** @class Edit view for DatasetCollection.\n */\nvar DCListItemEdit = DCListItemView.extend(\n/** @lends DCListItemEdit.prototype */{\n//TODO: may not be needed\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** override to add linkTarget */\n initialize : function( attributes ){\n DCListItemView.prototype.initialize.call( this, attributes );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DCListItemEdit(' + modelString + ')';\n }\n});\n\n\n//==============================================================================\nvar DCEListItemView = DC_LI.DCEListItemView;\n/** @class Read only view for DatasetCollectionElement.\n */\nvar DCEListItemEdit = DCEListItemView.extend(\n/** @lends DCEListItemEdit.prototype */{\n//TODO: this might be expendable - compacted with HDAListItemView\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** set up */\n initialize : function( attributes ){\n DCEListItemView.prototype.initialize.call( this, attributes );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DCEListItemEdit(' + modelString + ')';\n }\n});\n\n\n//==============================================================================\n// NOTE: this does not inherit from DatasetDCEListItemView as you would expect\n//TODO: but should - if we can find something simpler than using diamond\n/** @class Editable view for a DatasetCollectionElement that is also an DatasetAssociation\n * (a dataset contained in a dataset collection).\n */\nvar DatasetDCEListItemEdit = DATASET_LI_EDIT.DatasetListItemEdit.extend(\n/** @lends DatasetDCEListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** set up */\n initialize : function( attributes ){\n DATASET_LI_EDIT.DatasetListItemEdit.prototype.initialize.call( this, attributes );\n },\n\n // NOTE: this does not inherit from DatasetDCEListItemView - so we duplicate this here\n //TODO: fix\n /** In this override, only get details if in the ready state.\n * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n */\n _fetchModelDetails : function(){\n var view = this;\n if( view.model.inReadyState() && !view.model.hasDetails() ){\n return view.model.fetch({ silent: true });\n }\n return jQuery.when();\n },\n\n /** Override to remove delete button */\n _renderDeleteButton : function(){\n return null;\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DatasetDCEListItemEdit(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDatasetDCEListItemEdit.prototype.templates = (function(){\n\n return _.extend( {}, DATASET_LI_EDIT.DatasetListItemEdit.prototype.templates, {\n titleBar : DC_LI.DatasetDCEListItemView.prototype.templates.titleBar\n });\n}());\n\n\n//==============================================================================\n/** @class Read only view for a DatasetCollectionElement that is also a DatasetCollection\n * (a nested DC).\n */\nvar NestedDCDCEListItemEdit = DC_LI.NestedDCDCEListItemView.extend(\n/** @lends NestedDCDCEListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n // comment this out to suppress log output\n //logger : console,\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'NestedDCDCEListItemEdit(' + modelString + ')';\n }\n});\n\n\n//==============================================================================\n return {\n DCListItemEdit : DCListItemEdit,\n DCEListItemEdit : DCEListItemEdit,\n DatasetDCEListItemEdit : DatasetDCEListItemEdit,\n NestedDCDCEListItemEdit : NestedDCDCEListItemEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-li-edit.js\n ** module id = 123\n ** module chunks = 3\n **/","define([\n \"mvc/collection/collection-view\",\n \"mvc/collection/collection-model\",\n \"mvc/collection/collection-li-edit\",\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/editable-text\",\n], function( DC_VIEW, DC_MODEL, DC_EDIT, BASE_MVC, _l ){\n/* =============================================================================\nTODO:\n\n============================================================================= */\n/** @class editable View/Controller for a dataset collection.\n */\nvar _super = DC_VIEW.CollectionView;\nvar CollectionViewEdit = _super.extend(\n/** @lends CollectionView.prototype */{\n //MODEL is either a DatasetCollection (or subclass) or a DatasetCollectionElement (list of pairs)\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** sub view class used for datasets */\n DatasetDCEViewClass : DC_EDIT.DatasetDCEListItemEdit,\n /** sub view class used for nested collections */\n NestedDCDCEViewClass: DC_EDIT.NestedDCDCEListItemEdit,\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events\n * @param {Object} attributes optional settings for the panel\n */\n initialize : function( attributes ){\n _super.prototype.initialize.call( this, attributes );\n },\n\n /** In this override, make the collection name editable\n */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n _super.prototype._setUpBehaviors.call( this, $where );\n if( !this.model ){ return; }\n\n // anon users shouldn't have access to any of the following\n if( !Galaxy.user || Galaxy.user.isAnonymous() ){\n return;\n }\n\n //TODO: extract\n var panel = this,\n nameSelector = '> .controls .name';\n $where.find( nameSelector )\n .attr( 'title', _l( 'Click to rename collection' ) )\n .tooltip({ placement: 'bottom' })\n .make_text_editable({\n on_finish: function( newName ){\n var previousName = panel.model.get( 'name' );\n if( newName && newName !== previousName ){\n panel.$el.find( nameSelector ).text( newName );\n panel.model.save({ name: newName })\n .fail( function(){\n panel.$el.find( nameSelector ).text( panel.model.previous( 'name' ) );\n });\n } else {\n panel.$el.find( nameSelector ).text( previousName );\n }\n }\n });\n },\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'CollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar ListCollectionViewEdit = CollectionViewEdit.extend(\n/** @lends ListCollectionView.prototype */{\n\n //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n /** sub view class used for datasets */\n DatasetDCEViewClass : DC_EDIT.DatasetDCEListItemEdit,\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'ListCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class Editable, read-only View/Controller for a dataset collection. */\nvar PairCollectionViewEdit = ListCollectionViewEdit.extend(\n/** @lends PairCollectionViewEdit.prototype */{\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'PairCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class Editable (roughly since these collections are immutable),\n * View/Controller for a dataset collection.\n */\nvar NestedPairCollectionViewEdit = PairCollectionViewEdit.extend(\n/** @lends NestedPairCollectionViewEdit.prototype */{\n\n /** Override to remove the editable text from the name/identifier - these collections are considered immutable */\n _setUpBehaviors : function( $where ){\n _super.prototype._setUpBehaviors.call( this, $where );\n },\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'NestedPairCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar ListOfPairsCollectionViewEdit = CollectionViewEdit.extend(\n/** @lends ListOfPairsCollectionView.prototype */{\n\n //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n /** sub view class used for nested collections */\n NestedDCDCEViewClass : DC_EDIT.NestedDCDCEListItemEdit.extend({\n foldoutPanelClass : NestedPairCollectionViewEdit\n }),\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'ListOfPairsCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//==============================================================================\n return {\n CollectionViewEdit : CollectionViewEdit,\n ListCollectionViewEdit : ListCollectionViewEdit,\n PairCollectionViewEdit : PairCollectionViewEdit,\n ListOfPairsCollectionViewEdit : ListOfPairsCollectionViewEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-view-edit.js\n ** module id = 124\n ** module chunks = 3\n **/","define([\n \"utils/levenshtein\",\n \"utils/natural-sort\",\n \"mvc/collection/list-collection-creator\",\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/hoverhighlight\"\n], function( levenshteinDistance, naturalSort, LIST_COLLECTION_CREATOR, baseMVC, _l ){\n\nvar logNamespace = 'collections';\n/* ============================================================================\nTODO:\n\n\nPROGRAMMATICALLY:\ncurrPanel.once( 'rendered', function(){\n currPanel.showSelectors();\n currPanel.selectAll();\n _.last( currPanel.actionsPopup.options ).func();\n});\n\n============================================================================ */\n/** A view for paired datasets in the collections creator.\n */\nvar PairView = Backbone.View.extend( baseMVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n tagName : 'li',\n className : 'dataset paired',\n\n initialize : function( attributes ){\n this.pair = attributes.pair || {};\n },\n\n template : _.template([\n '<%- pair.forward.name %>',\n '',\n '<%- pair.name %>',\n '',\n '<%- pair.reverse.name %>'\n ].join('')),\n\n render : function(){\n this.$el\n .attr( 'draggable', true )\n .data( 'pair', this.pair )\n .html( this.template({ pair: this.pair }) )\n .addClass( 'flex-column-container' );\n return this;\n },\n\n events : {\n 'dragstart' : '_dragstart',\n 'dragend' : '_dragend',\n 'dragover' : '_sendToParent',\n 'drop' : '_sendToParent'\n },\n\n /** dragging pairs for re-ordering */\n _dragstart : function( ev ){\n ev.currentTarget.style.opacity = '0.4';\n if( ev.originalEvent ){ ev = ev.originalEvent; }\n\n ev.dataTransfer.effectAllowed = 'move';\n ev.dataTransfer.setData( 'text/plain', JSON.stringify( this.pair ) );\n\n this.$el.parent().trigger( 'pair.dragstart', [ this ] );\n },\n\n /** dragging pairs for re-ordering */\n _dragend : function( ev ){\n ev.currentTarget.style.opacity = '1.0';\n this.$el.parent().trigger( 'pair.dragend', [ this ] );\n },\n\n /** manually bubble up an event to the parent/container */\n _sendToParent : function( ev ){\n this.$el.parent().trigger( ev );\n },\n\n /** string rep */\n toString : function(){\n return 'PairView(' + this.pair.name + ')';\n }\n});\n\n\n// ============================================================================\n/** returns an autopair function that uses the provided options.match function */\nfunction autoPairFnBuilder( options ){\n options = options || {};\n options.createPair = options.createPair || function _defaultCreatePair( params ){\n params = params || {};\n var a = params.listA.splice( params.indexA, 1 )[0],\n b = params.listB.splice( params.indexB, 1 )[0],\n aInBIndex = params.listB.indexOf( a ),\n bInAIndex = params.listA.indexOf( b );\n if( aInBIndex !== -1 ){ params.listB.splice( aInBIndex, 1 ); }\n if( bInAIndex !== -1 ){ params.listA.splice( bInAIndex, 1 ); }\n return this._pair( a, b, { silent: true });\n };\n // compile these here outside of the loop\n var _regexps = [];\n function getRegExps(){\n if( !_regexps.length ){\n _regexps = [\n new RegExp( this.filters[0] ),\n new RegExp( this.filters[1] )\n ];\n }\n return _regexps;\n }\n // mangle params as needed\n options.preprocessMatch = options.preprocessMatch || function _defaultPreprocessMatch( params ){\n var regexps = getRegExps.call( this );\n return _.extend( params, {\n matchTo : params.matchTo.name.replace( regexps[0], '' ),\n possible : params.possible.name.replace( regexps[1], '' )\n });\n };\n\n return function _strategy( params ){\n this.debug( 'autopair _strategy ---------------------------' );\n params = params || {};\n var listA = params.listA,\n listB = params.listB,\n indexA = 0, indexB,\n bestMatch = {\n score : 0.0,\n index : null\n },\n paired = [];\n //console.debug( 'params:', JSON.stringify( params, null, ' ' ) );\n this.debug( 'starting list lens:', listA.length, listB.length );\n this.debug( 'bestMatch (starting):', JSON.stringify( bestMatch, null, ' ' ) );\n\n while( indexA < listA.length ){\n var matchTo = listA[ indexA ];\n bestMatch.score = 0.0;\n\n for( indexB=0; indexB= scoreThreshold ){\n //console.debug( 'autoPairFnBuilder.strategy', listA[ indexA ].name, listB[ bestMatch.index ].name );\n paired.push( options.createPair.call( this, {\n listA : listA,\n indexA : indexA,\n listB : listB,\n indexB : bestMatch.index\n }));\n //console.debug( 'list lens now:', listA.length, listB.length );\n } else {\n indexA += 1;\n }\n if( !listA.length || !listB.length ){\n return paired;\n }\n }\n this.debug( 'paired:', JSON.stringify( paired, null, ' ' ) );\n this.debug( 'autopair _strategy ---------------------------' );\n return paired;\n };\n}\n\n\n// ============================================================================\n/** An interface for building collections of paired datasets.\n */\nvar PairedCollectionCreator = Backbone.View.extend( baseMVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n className: 'list-of-pairs-collection-creator collection-creator flex-row-container',\n\n /** set up initial options, instance vars, behaviors, and autopair (if set to do so) */\n initialize : function( attributes ){\n this.metric( 'PairedCollectionCreator.initialize', attributes );\n //this.debug( '-- PairedCollectionCreator:', attributes );\n\n attributes = _.defaults( attributes, {\n datasets : [],\n filters : this.DEFAULT_FILTERS,\n automaticallyPair : true,\n strategy : 'lcs',\n matchPercentage : 0.9,\n twoPassAutopairing : true\n });\n\n /** unordered, original list */\n this.initialList = attributes.datasets;\n\n /** is this from a history? if so, what's its id? */\n this.historyId = attributes.historyId;\n\n /** which filters should be used initially? (String[2] or name in commonFilters) */\n this.filters = this.commonFilters[ attributes.filters ] || this.commonFilters[ this.DEFAULT_FILTERS ];\n if( _.isArray( attributes.filters ) ){\n this.filters = attributes.filters;\n }\n\n /** try to auto pair the unpaired datasets on load? */\n this.automaticallyPair = attributes.automaticallyPair;\n\n /** what method to use for auto pairing (will be passed aggression level) */\n this.strategy = this.strategies[ attributes.strategy ] || this.strategies[ this.DEFAULT_STRATEGY ];\n if( _.isFunction( attributes.strategy ) ){\n this.strategy = attributes.strategy;\n }\n\n /** distance/mismatch level allowed for autopairing */\n this.matchPercentage = attributes.matchPercentage;\n\n /** try to autopair using simple first, then this.strategy on the remainder */\n this.twoPassAutopairing = attributes.twoPassAutopairing;\n\n /** remove file extensions (\\.*) from created pair names? */\n this.removeExtensions = true;\n //this.removeExtensions = false;\n\n /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n this.oncancel = attributes.oncancel;\n /** fn to call when the collection is created (scoped to this) */\n this.oncreate = attributes.oncreate;\n\n /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n this.autoscrollDist = attributes.autoscrollDist || 24;\n\n /** is the unpaired panel shown? */\n this.unpairedPanelHidden = false;\n /** is the paired panel shown? */\n this.pairedPanelHidden = false;\n\n /** DOM elements currently being dragged */\n this.$dragging = null;\n\n /** Used for blocking UI events during ajax/operations (don't post twice) */\n this.blocking = false;\n\n this._setUpBehaviors();\n this._dataSetUp();\n },\n\n /** map of common filter pairs by name */\n commonFilters : {\n illumina : [ '_1', '_2' ],\n Rs : [ '_R1', '_R2' ]\n },\n /** which commonFilter to use by default */\n DEFAULT_FILTERS : 'illumina',\n\n /** map of name->fn for autopairing */\n strategies : {\n 'simple' : 'autopairSimple',\n 'lcs' : 'autopairLCS',\n 'levenshtein' : 'autopairLevenshtein'\n },\n /** default autopair strategy name */\n DEFAULT_STRATEGY : 'lcs',\n\n // ------------------------------------------------------------------------ process raw list\n /** set up main data: cache initialList, sort, and autopair */\n _dataSetUp : function(){\n //this.debug( '-- _dataSetUp' );\n\n this.paired = [];\n this.unpaired = [];\n\n this.selectedIds = [];\n\n // sort initial list, add ids if needed, and save new working copy to unpaired\n this._sortInitialList();\n this._ensureIds();\n this.unpaired = this.initialList.slice( 0 );\n\n if( this.automaticallyPair ){\n this.autoPair();\n this.once( 'rendered:initial', function(){\n this.trigger( 'autopair' );\n });\n }\n },\n\n /** sort initial list */\n _sortInitialList : function(){\n //this.debug( '-- _sortInitialList' );\n this._sortDatasetList( this.initialList );\n },\n\n /** sort a list of datasets */\n _sortDatasetList : function( list ){\n // currently only natural sort by name\n list.sort( function( a, b ){ return naturalSort( a.name, b.name ); });\n return list;\n },\n\n /** add ids to dataset objs in initial list if none */\n _ensureIds : function(){\n this.initialList.forEach( function( dataset ){\n if( !dataset.hasOwnProperty( 'id' ) ){\n dataset.id = _.uniqueId();\n }\n });\n return this.initialList;\n },\n\n /** split initial list into two lists, those that pass forward filters & those passing reverse */\n _splitByFilters : function(){\n var regexFilters = this.filters.map( function( stringFilter ){\n return new RegExp( stringFilter );\n }),\n split = [ [], [] ];\n\n function _filter( unpaired, filter ){\n return filter.test( unpaired.name );\n //return dataset.name.indexOf( filter ) >= 0;\n }\n this.unpaired.forEach( function _filterEach( unpaired ){\n // 90% of the time this seems to work, but:\n //TODO: this treats *all* strings as regex which may confuse people - possibly check for // surrounding?\n // would need explanation in help as well\n regexFilters.forEach( function( filter, i ){\n if( _filter( unpaired, filter ) ){\n split[i].push( unpaired );\n }\n });\n });\n return split;\n },\n\n /** add a dataset to the unpaired list in it's proper order */\n _addToUnpaired : function( dataset ){\n // currently, unpaired is natural sorted by name, use binary search to find insertion point\n var binSearchSortedIndex = function( low, hi ){\n if( low === hi ){ return low; }\n\n var mid = Math.floor( ( hi - low ) / 2 ) + low,\n compared = naturalSort( dataset.name, this.unpaired[ mid ].name );\n\n if( compared < 0 ){\n return binSearchSortedIndex( low, mid );\n } else if( compared > 0 ){\n return binSearchSortedIndex( mid + 1, hi );\n }\n // walk the equal to find the last\n while( this.unpaired[ mid ] && this.unpaired[ mid ].name === dataset.name ){ mid++; }\n return mid;\n\n }.bind( this );\n\n this.unpaired.splice( binSearchSortedIndex( 0, this.unpaired.length ), 0, dataset );\n },\n\n // ------------------------------------------------------------------------ auto pairing\n /** two passes to automatically create pairs:\n * use both simpleAutoPair, then the fn mentioned in strategy\n */\n autoPair : function( strategy ){\n // split first using exact matching\n var split = this._splitByFilters(),\n paired = [];\n if( this.twoPassAutopairing ){\n paired = this.autopairSimple({\n listA : split[0],\n listB : split[1]\n });\n split = this._splitByFilters();\n }\n\n // uncomment to see printlns while running tests\n //this.debug = function(){ console.log.apply( console, arguments ); };\n\n // then try the remainder with something less strict\n strategy = strategy || this.strategy;\n split = this._splitByFilters();\n paired = paired.concat( this[ strategy ].call( this, {\n listA : split[0],\n listB : split[1]\n }));\n return paired;\n },\n\n /** autopair by exact match */\n autopairSimple : autoPairFnBuilder({\n scoreThreshold: function(){ return 1.0; },\n match : function _match( params ){\n params = params || {};\n if( params.matchTo === params.possible ){\n return {\n index: params.index,\n score: 1.0\n };\n }\n return params.bestMatch;\n }\n }),\n\n /** autopair by levenshtein edit distance scoring */\n autopairLevenshtein : autoPairFnBuilder({\n scoreThreshold: function(){ return this.matchPercentage; },\n match : function _matches( params ){\n params = params || {};\n var distance = levenshteinDistance( params.matchTo, params.possible ),\n score = 1.0 - ( distance / ( Math.max( params.matchTo.length, params.possible.length ) ) );\n if( score > params.bestMatch.score ){\n return {\n index: params.index,\n score: score\n };\n }\n return params.bestMatch;\n }\n }),\n\n /** autopair by longest common substrings scoring */\n autopairLCS : autoPairFnBuilder({\n scoreThreshold: function(){ return this.matchPercentage; },\n match : function _matches( params ){\n params = params || {};\n var match = this._naiveStartingAndEndingLCS( params.matchTo, params.possible ).length,\n score = match / ( Math.max( params.matchTo.length, params.possible.length ) );\n if( score > params.bestMatch.score ){\n return {\n index: params.index,\n score: score\n };\n }\n return params.bestMatch;\n }\n }),\n\n /** return the concat'd longest common prefix and suffix from two strings */\n _naiveStartingAndEndingLCS : function( s1, s2 ){\n var fwdLCS = '',\n revLCS = '',\n i = 0, j = 0;\n while( i < s1.length && i < s2.length ){\n if( s1[ i ] !== s2[ i ] ){\n break;\n }\n fwdLCS += s1[ i ];\n i += 1;\n }\n if( i === s1.length ){ return s1; }\n if( i === s2.length ){ return s2; }\n\n i = ( s1.length - 1 );\n j = ( s2.length - 1 );\n while( i >= 0 && j >= 0 ){\n if( s1[ i ] !== s2[ j ] ){\n break;\n }\n revLCS = [ s1[ i ], revLCS ].join( '' );\n i -= 1;\n j -= 1;\n }\n return fwdLCS + revLCS;\n },\n\n // ------------------------------------------------------------------------ pairing / unpairing\n /** create a pair from fwd and rev, removing them from unpaired, and placing the new pair in paired */\n _pair : function( fwd, rev, options ){\n options = options || {};\n this.debug( '_pair:', fwd, rev );\n var pair = this._createPair( fwd, rev, options.name );\n this.paired.push( pair );\n this.unpaired = _.without( this.unpaired, fwd, rev );\n if( !options.silent ){\n this.trigger( 'pair:new', pair );\n }\n return pair;\n },\n\n /** create a pair Object from fwd and rev, adding the name attribute (will guess if not given) */\n _createPair : function( fwd, rev, name ){\n // ensure existance and don't pair something with itself\n if( !( fwd && rev ) || ( fwd === rev ) ){\n throw new Error( 'Bad pairing: ' + [ JSON.stringify( fwd ), JSON.stringify( rev ) ] );\n }\n name = name || this._guessNameForPair( fwd, rev );\n return { forward : fwd, name : name, reverse : rev };\n },\n\n /** try to find a good pair name for the given fwd and rev datasets */\n _guessNameForPair : function( fwd, rev, removeExtensions ){\n removeExtensions = ( removeExtensions !== undefined )?( removeExtensions ):( this.removeExtensions );\n var fwdName = fwd.name,\n revName = rev.name,\n lcs = this._naiveStartingAndEndingLCS(\n fwdName.replace( new RegExp( this.filters[0] ), '' ),\n revName.replace( new RegExp( this.filters[1] ), '' )\n );\n if( removeExtensions ){\n var lastDotIndex = lcs.lastIndexOf( '.' );\n if( lastDotIndex > 0 ){\n var extension = lcs.slice( lastDotIndex, lcs.length );\n lcs = lcs.replace( extension, '' );\n fwdName = fwdName.replace( extension, '' );\n revName = revName.replace( extension, '' );\n }\n }\n return lcs || ( fwdName + ' & ' + revName );\n },\n\n /** unpair a pair, removing it from paired, and adding the fwd,rev datasets back into unpaired */\n _unpair : function( pair, options ){\n options = options || {};\n if( !pair ){\n throw new Error( 'Bad pair: ' + JSON.stringify( pair ) );\n }\n this.paired = _.without( this.paired, pair );\n this._addToUnpaired( pair.forward );\n this._addToUnpaired( pair.reverse );\n\n if( !options.silent ){\n this.trigger( 'pair:unpair', [ pair ] );\n }\n return pair;\n },\n\n /** unpair all paired datasets */\n unpairAll : function(){\n var pairs = [];\n while( this.paired.length ){\n pairs.push( this._unpair( this.paired[ 0 ], { silent: true }) );\n }\n this.trigger( 'pair:unpair', pairs );\n },\n\n // ------------------------------------------------------------------------ API\n /** convert a pair into JSON compatible with the collections API */\n _pairToJSON : function( pair, src ){\n src = src || 'hda';\n //TODO: consider making this the pair structure when created instead\n return {\n collection_type : 'paired',\n src : 'new_collection',\n name : pair.name,\n element_identifiers : [{\n name : 'forward',\n id : pair.forward.id,\n src : src\n }, {\n name : 'reverse',\n id : pair.reverse.id,\n src : src\n }]\n };\n },\n\n /** create the collection via the API\n * @returns {jQuery.xhr Object} the jquery ajax request\n */\n createList : function( name ){\n var creator = this,\n url = Galaxy.root + 'api/histories/' + this.historyId + '/contents/dataset_collections';\n\n //TODO: use ListPairedCollection.create()\n var ajaxData = {\n type : 'dataset_collection',\n collection_type : 'list:paired',\n name : _.escape( name || creator.$( '.collection-name' ).val() ),\n element_identifiers : creator.paired.map( function( pair ){\n return creator._pairToJSON( pair );\n })\n\n };\n //this.debug( JSON.stringify( ajaxData ) );\n creator.blocking = true;\n return jQuery.ajax( url, {\n type : 'POST',\n contentType : 'application/json',\n dataType : 'json',\n data : JSON.stringify( ajaxData )\n })\n .always( function(){\n creator.blocking = false;\n })\n .fail( function( xhr, status, message ){\n creator._ajaxErrHandler( xhr, status, message );\n })\n .done( function( response, message, xhr ){\n //this.info( 'ok', response, message, xhr );\n creator.trigger( 'collection:created', response, message, xhr );\n creator.metric( 'collection:created', response );\n if( typeof creator.oncreate === 'function' ){\n creator.oncreate.call( this, response, message, xhr );\n }\n });\n },\n\n /** handle ajax errors with feedback and details to the user (if available) */\n _ajaxErrHandler : function( xhr, status, message ){\n this.error( xhr, status, message );\n var content = _l( 'An error occurred while creating this collection' );\n if( xhr ){\n if( xhr.readyState === 0 && xhr.status === 0 ){\n content += ': ' + _l( 'Galaxy could not be reached and may be updating.' )\n + _l( ' Try again in a few minutes.' );\n } else if( xhr.responseJSON ){\n content += '
            ' + JSON.stringify( xhr.responseJSON ) + '
            ';\n } else {\n content += ': ' + message;\n }\n }\n creator._showAlert( content, 'alert-danger' );\n },\n\n // ------------------------------------------------------------------------ rendering\n /** render the entire interface */\n render : function( speed, callback ){\n //this.debug( '-- _render' );\n //this.$el.empty().html( PairedCollectionCreator.templates.main() );\n this.$el.empty().html( PairedCollectionCreator.templates.main() );\n this._renderHeader( speed );\n this._renderMiddle( speed );\n this._renderFooter( speed );\n this._addPluginComponents();\n this.trigger( 'rendered', this );\n return this;\n },\n\n /** render the header section */\n _renderHeader : function( speed, callback ){\n //this.debug( '-- _renderHeader' );\n var $header = this.$( '.header' ).empty().html( PairedCollectionCreator.templates.header() )\n .find( '.help-content' ).prepend( $( PairedCollectionCreator.templates.helpContent() ) );\n\n this._renderFilters();\n return $header;\n },\n /** fill the filter inputs with the filter values */\n _renderFilters : function(){\n return this.$( '.forward-column .column-header input' ).val( this.filters[0] )\n .add( this.$( '.reverse-column .column-header input' ).val( this.filters[1] ) );\n },\n\n /** render the middle including unpaired and paired sections (which may be hidden) */\n _renderMiddle : function( speed, callback ){\n var $middle = this.$( '.middle' ).empty().html( PairedCollectionCreator.templates.middle() );\n\n // (re-) hide the un/paired panels based on instance vars\n if( this.unpairedPanelHidden ){\n this.$( '.unpaired-columns' ).hide();\n } else if( this.pairedPanelHidden ){\n this.$( '.paired-columns' ).hide();\n }\n\n this._renderUnpaired();\n this._renderPaired();\n return $middle;\n },\n /** render the unpaired section, showing datasets accrd. to filters, update the unpaired counts */\n _renderUnpaired : function( speed, callback ){\n //this.debug( '-- _renderUnpaired' );\n var creator = this,\n $fwd, $rev, $prd = [],\n split = this._splitByFilters();\n // update unpaired counts\n this.$( '.forward-column .title' )\n .text([ split[0].length, _l( 'unpaired forward' ) ].join( ' ' ));\n this.$( '.forward-column .unpaired-info' )\n .text( this._renderUnpairedDisplayStr( this.unpaired.length - split[0].length ) );\n this.$( '.reverse-column .title' )\n .text([ split[1].length, _l( 'unpaired reverse' ) ].join( ' ' ));\n this.$( '.reverse-column .unpaired-info' )\n .text( this._renderUnpairedDisplayStr( this.unpaired.length - split[1].length ) );\n\n this.$( '.unpaired-columns .column-datasets' ).empty();\n\n // show/hide the auto pair button if any unpaired are left\n this.$( '.autopair-link' ).toggle( this.unpaired.length !== 0 );\n if( this.unpaired.length === 0 ){\n this._renderUnpairedEmpty();\n return;\n }\n\n // create the dataset dom arrays\n $rev = split[1].map( function( dataset, i ){\n // if there'll be a fwd dataset across the way, add a button to pair the row\n if( ( split[0][ i ] !== undefined )\n && ( split[0][ i ] !== dataset ) ){\n $prd.push( creator._renderPairButton() );\n }\n return creator._renderUnpairedDataset( dataset );\n });\n $fwd = split[0].map( function( dataset ){\n return creator._renderUnpairedDataset( dataset );\n });\n\n if( !$fwd.length && !$rev.length ){\n this._renderUnpairedNotShown();\n return;\n }\n // add to appropo cols\n //TODO: not the best way to render - consider rendering the entire unpaired-columns section in a fragment\n // and swapping out that\n this.$( '.unpaired-columns .forward-column .column-datasets' ).append( $fwd )\n .add( this.$( '.unpaired-columns .paired-column .column-datasets' ).append( $prd ) )\n .add( this.$( '.unpaired-columns .reverse-column .column-datasets' ).append( $rev ) );\n this._adjUnpairedOnScrollbar();\n },\n /** return a string to display the count of filtered out datasets */\n _renderUnpairedDisplayStr : function( numFiltered ){\n return [ '(', numFiltered, ' ', _l( 'filtered out' ), ')' ].join('');\n },\n /** return an unattached jQuery DOM element to represent an unpaired dataset */\n _renderUnpairedDataset : function( dataset ){\n //TODO: to underscore template\n return $( '
          18. ')\n .attr( 'id', 'dataset-' + dataset.id )\n .addClass( 'dataset unpaired' )\n .attr( 'draggable', true )\n .addClass( dataset.selected? 'selected': '' )\n .append( $( '' ).addClass( 'dataset-name' ).text( dataset.name ) )\n //??\n .data( 'dataset', dataset );\n },\n /** render the button that may go between unpaired datasets, allowing the user to pair a row */\n _renderPairButton : function(){\n //TODO: *not* a dataset - don't pretend like it is\n return $( '
          19. ').addClass( 'dataset unpaired' )\n .append( $( '' ).addClass( 'dataset-name' ).text( _l( 'Pair these datasets' ) ) );\n },\n /** a message to display when no unpaired left */\n _renderUnpairedEmpty : function(){\n //this.debug( '-- renderUnpairedEmpty' );\n var $msg = $( '
            ' )\n .text( '(' + _l( 'no remaining unpaired datasets' ) + ')' );\n this.$( '.unpaired-columns .paired-column .column-datasets' ).empty().prepend( $msg );\n return $msg;\n },\n /** a message to display when no unpaired can be shown with the current filters */\n _renderUnpairedNotShown : function(){\n //this.debug( '-- renderUnpairedEmpty' );\n var $msg = $( '
            ' )\n .text( '(' + _l( 'no datasets were found matching the current filters' ) + ')' );\n this.$( '.unpaired-columns .paired-column .column-datasets' ).empty().prepend( $msg );\n return $msg;\n },\n /** try to detect if the unpaired section has a scrollbar and adjust left column for better centering of all */\n _adjUnpairedOnScrollbar : function(){\n var $unpairedColumns = this.$( '.unpaired-columns' ).last(),\n $firstDataset = this.$( '.unpaired-columns .reverse-column .dataset' ).first();\n if( !$firstDataset.size() ){ return; }\n var ucRight = $unpairedColumns.offset().left + $unpairedColumns.outerWidth(),\n dsRight = $firstDataset.offset().left + $firstDataset.outerWidth(),\n rightDiff = Math.floor( ucRight ) - Math.floor( dsRight );\n //this.debug( 'rightDiff:', ucRight, '-', dsRight, '=', rightDiff );\n this.$( '.unpaired-columns .forward-column' )\n .css( 'margin-left', ( rightDiff > 0 )? rightDiff: 0 );\n },\n\n /** render the paired section and update counts of paired datasets */\n _renderPaired : function( speed, callback ){\n //this.debug( '-- _renderPaired' );\n this.$( '.paired-column-title .title' ).text([ this.paired.length, _l( 'paired' ) ].join( ' ' ) );\n // show/hide the unpair all link\n this.$( '.unpair-all-link' ).toggle( this.paired.length !== 0 );\n if( this.paired.length === 0 ){\n this._renderPairedEmpty();\n return;\n //TODO: would be best to return here (the $columns)\n } else {\n // show/hide 'remove extensions link' when any paired and they seem to have extensions\n this.$( '.remove-extensions-link' ).show();\n }\n\n this.$( '.paired-columns .column-datasets' ).empty();\n var creator = this;\n this.paired.forEach( function( pair, i ){\n //TODO: cache these?\n var pairView = new PairView({ pair: pair });\n creator.$( '.paired-columns .column-datasets' )\n .append( pairView.render().$el )\n .append([\n ''\n ].join( '' ));\n });\n },\n /** a message to display when none paired */\n _renderPairedEmpty : function(){\n var $msg = $( '
            ' )\n .text( '(' + _l( 'no paired datasets yet' ) + ')' );\n this.$( '.paired-columns .column-datasets' ).empty().prepend( $msg );\n return $msg;\n },\n\n /** render the footer, completion controls, and cancel controls */\n _renderFooter : function( speed, callback ){\n var $footer = this.$( '.footer' ).empty().html( PairedCollectionCreator.templates.footer() );\n this.$( '.remove-extensions' ).prop( 'checked', this.removeExtensions );\n if( typeof this.oncancel === 'function' ){\n this.$( '.cancel-create.btn' ).show();\n }\n return $footer;\n },\n\n /** add any jQuery/bootstrap/custom plugins to elements rendered */\n _addPluginComponents : function(){\n this._chooseFiltersPopover( '.choose-filters-link' );\n this.$( '.help-content i' ).hoverhighlight( '.collection-creator', 'rgba( 64, 255, 255, 1.0 )' );\n },\n\n /** build a filter selection popover allowing selection of common filter pairs */\n _chooseFiltersPopover : function( selector ){\n function filterChoice( val1, val2 ){\n return [\n ''\n ].join('');\n }\n var $popoverContent = $( _.template([\n '
            ',\n '
            ',\n _l( 'Choose from the following filters to change which unpaired reads are shown in the display' ),\n ':
            ',\n _.values( this.commonFilters ).map( function( filterSet ){\n return filterChoice( filterSet[0], filterSet[1] );\n }).join( '' ),\n '
            '\n ].join(''))({}));\n\n return this.$( selector ).popover({\n container : '.collection-creator',\n placement : 'bottom',\n html : true,\n //animation : false,\n content : $popoverContent\n });\n },\n\n /** add (or clear if clear is truthy) a validation warning to what */\n _validationWarning : function( what, clear ){\n var VALIDATION_CLASS = 'validation-warning';\n if( what === 'name' ){\n what = this.$( '.collection-name' ).add( this.$( '.collection-name-prompt' ) );\n this.$( '.collection-name' ).focus().select();\n }\n if( clear ){\n what = what || this.$( '.' + VALIDATION_CLASS );\n what.removeClass( VALIDATION_CLASS );\n } else {\n what.addClass( VALIDATION_CLASS );\n }\n },\n\n // ------------------------------------------------------------------------ events\n /** set up event handlers on self */\n _setUpBehaviors : function(){\n this.once( 'rendered', function(){\n this.trigger( 'rendered:initial', this );\n });\n\n this.on( 'pair:new', function(){\n //TODO: ideally only re-render the columns (or even elements) involved\n this._renderUnpaired();\n this._renderPaired();\n\n // scroll to bottom where new pairs are added\n //TODO: this doesn't seem to work - innerHeight sticks at 133...\n // may have to do with improper flex columns\n //var $pairedView = this.$( '.paired-columns' );\n //$pairedView.scrollTop( $pairedView.innerHeight() );\n //this.debug( $pairedView.height() )\n this.$( '.paired-columns' ).scrollTop( 8000000 );\n });\n this.on( 'pair:unpair', function( pairs ){\n //TODO: ideally only re-render the columns (or even elements) involved\n this._renderUnpaired();\n this._renderPaired();\n this.splitView();\n });\n\n this.on( 'filter-change', function(){\n this.filters = [\n this.$( '.forward-unpaired-filter input' ).val(),\n this.$( '.reverse-unpaired-filter input' ).val()\n ];\n this.metric( 'filter-change', this.filters );\n this._renderFilters();\n this._renderUnpaired();\n });\n\n this.on( 'autopair', function(){\n this._renderUnpaired();\n this._renderPaired();\n\n var message, msgClass = null;\n if( this.paired.length ){\n msgClass = 'alert-success';\n message = this.paired.length + ' ' + _l( 'pairs created' );\n if( !this.unpaired.length ){\n message += ': ' + _l( 'all datasets have been successfully paired' );\n this.hideUnpaired();\n this.$( '.collection-name' ).focus();\n }\n } else {\n message = _l([\n 'Could not automatically create any pairs from the given dataset names.',\n 'You may want to choose or enter different filters and try auto-pairing again.',\n 'Close this message using the X on the right to view more help.'\n ].join( ' ' ));\n }\n this._showAlert( message, msgClass );\n });\n\n //this.on( 'all', function(){\n // this.info( arguments );\n //});\n return this;\n },\n\n events : {\n // header\n 'click .more-help' : '_clickMoreHelp',\n 'click .less-help' : '_clickLessHelp',\n 'click .header .alert button' : '_hideAlert',\n 'click .forward-column .column-title' : '_clickShowOnlyUnpaired',\n 'click .reverse-column .column-title' : '_clickShowOnlyUnpaired',\n 'click .unpair-all-link' : '_clickUnpairAll',\n //TODO: this seems kinda backasswards - re-sending jq event as a backbone event, can we listen directly?\n 'change .forward-unpaired-filter input' : function( ev ){ this.trigger( 'filter-change' ); },\n 'focus .forward-unpaired-filter input' : function( ev ){ $( ev.currentTarget ).select(); },\n 'click .autopair-link' : '_clickAutopair',\n 'click .choose-filters .filter-choice' : '_clickFilterChoice',\n 'click .clear-filters-link' : '_clearFilters',\n 'change .reverse-unpaired-filter input' : function( ev ){ this.trigger( 'filter-change' ); },\n 'focus .reverse-unpaired-filter input' : function( ev ){ $( ev.currentTarget ).select(); },\n // unpaired\n 'click .forward-column .dataset.unpaired' : '_clickUnpairedDataset',\n 'click .reverse-column .dataset.unpaired' : '_clickUnpairedDataset',\n 'click .paired-column .dataset.unpaired' : '_clickPairRow',\n 'click .unpaired-columns' : 'clearSelectedUnpaired',\n 'mousedown .unpaired-columns .dataset' : '_mousedownUnpaired',\n // divider\n 'click .paired-column-title' : '_clickShowOnlyPaired',\n 'mousedown .flexible-partition-drag' : '_startPartitionDrag',\n // paired\n 'click .paired-columns .dataset.paired' : 'selectPair',\n 'click .paired-columns' : 'clearSelectedPaired',\n 'click .paired-columns .pair-name' : '_clickPairName',\n 'click .unpair-btn' : '_clickUnpair',\n // paired - drop target\n //'dragenter .paired-columns' : '_dragenterPairedColumns',\n //'dragleave .paired-columns .column-datasets': '_dragleavePairedColumns',\n 'dragover .paired-columns .column-datasets' : '_dragoverPairedColumns',\n 'drop .paired-columns .column-datasets' : '_dropPairedColumns',\n\n 'pair.dragstart .paired-columns .column-datasets' : '_pairDragstart',\n 'pair.dragend .paired-columns .column-datasets' : '_pairDragend',\n\n // footer\n 'change .remove-extensions' : function( ev ){ this.toggleExtensions(); },\n 'change .collection-name' : '_changeName',\n 'keydown .collection-name' : '_nameCheckForEnter',\n 'click .cancel-create' : function( ev ){\n if( typeof this.oncancel === 'function' ){\n this.oncancel.call( this );\n }\n },\n 'click .create-collection' : '_clickCreate'//,\n },\n\n // ........................................................................ header\n /** expand help */\n _clickMoreHelp : function( ev ){\n this.$( '.main-help' ).addClass( 'expanded' );\n this.$( '.more-help' ).hide();\n },\n /** collapse help */\n _clickLessHelp : function( ev ){\n this.$( '.main-help' ).removeClass( 'expanded' );\n this.$( '.more-help' ).show();\n },\n\n /** show an alert on the top of the interface containing message (alertClass is bootstrap's alert-*)*/\n _showAlert : function( message, alertClass ){\n alertClass = alertClass || 'alert-danger';\n this.$( '.main-help' ).hide();\n this.$( '.header .alert' ).attr( 'class', 'alert alert-dismissable' ).addClass( alertClass ).show()\n .find( '.alert-message' ).html( message );\n },\n /** hide the alerts at the top */\n _hideAlert : function( message ){\n this.$( '.main-help' ).show();\n this.$( '.header .alert' ).hide();\n },\n\n /** toggle between showing only unpaired and split view */\n _clickShowOnlyUnpaired : function( ev ){\n //this.debug( 'click unpaired', ev.currentTarget );\n if( this.$( '.paired-columns' ).is( ':visible' ) ){\n this.hidePaired();\n } else {\n this.splitView();\n }\n },\n /** toggle between showing only paired and split view */\n _clickShowOnlyPaired : function( ev ){\n //this.debug( 'click paired' );\n if( this.$( '.unpaired-columns' ).is( ':visible' ) ){\n this.hideUnpaired();\n } else {\n this.splitView();\n }\n },\n\n /** hide unpaired, show paired */\n hideUnpaired : function( speed, callback ){\n this.unpairedPanelHidden = true;\n this.pairedPanelHidden = false;\n this._renderMiddle( speed, callback );\n },\n /** hide paired, show unpaired */\n hidePaired : function( speed, callback ){\n this.unpairedPanelHidden = false;\n this.pairedPanelHidden = true;\n this._renderMiddle( speed, callback );\n },\n /** show both paired and unpaired (splitting evenly) */\n splitView : function( speed, callback ){\n this.unpairedPanelHidden = this.pairedPanelHidden = false;\n this._renderMiddle( speed, callback );\n return this;\n },\n\n /** unpair all paired and do other super neat stuff which I'm not really sure about yet... */\n _clickUnpairAll : function( ev ){\n this.metric( 'unpairAll' );\n this.unpairAll();\n },\n\n /** attempt to autopair */\n _clickAutopair : function( ev ){\n var paired = this.autoPair();\n this.metric( 'autopair', paired.length, this.unpaired.length );\n this.trigger( 'autopair' );\n },\n\n /** set the filters based on the data attributes of the button click target */\n _clickFilterChoice : function( ev ){\n var $selected = $( ev.currentTarget );\n this.$( '.forward-unpaired-filter input' ).val( $selected.data( 'forward' ) );\n this.$( '.reverse-unpaired-filter input' ).val( $selected.data( 'reverse' ) );\n this._hideChooseFilters();\n this.trigger( 'filter-change' );\n },\n\n /** hide the choose filters popover */\n _hideChooseFilters : function(){\n //TODO: update bootstrap and remove the following hack\n // see also: https://github.com/twbs/bootstrap/issues/10260\n this.$( '.choose-filters-link' ).popover( 'hide' );\n this.$( '.popover' ).css( 'display', 'none' );\n },\n\n /** clear both filters */\n _clearFilters : function( ev ){\n this.$( '.forward-unpaired-filter input' ).val( '' );\n this.$( '.reverse-unpaired-filter input' ).val( '' );\n this.trigger( 'filter-change' );\n },\n\n // ........................................................................ unpaired\n /** select an unpaired dataset */\n _clickUnpairedDataset : function( ev ){\n ev.stopPropagation();\n return this.toggleSelectUnpaired( $( ev.currentTarget ) );\n },\n\n /** Toggle the selection of an unpaired dataset representation.\n * @param [jQuery] $dataset the unpaired dataset dom rep to select\n * @param [Boolean] options.force if defined, force selection based on T/F; otherwise, toggle\n */\n toggleSelectUnpaired : function( $dataset, options ){\n options = options || {};\n var dataset = $dataset.data( 'dataset' ),\n select = options.force !== undefined? options.force: !$dataset.hasClass( 'selected' );\n //this.debug( id, options.force, $dataset, dataset );\n if( !$dataset.size() || dataset === undefined ){ return $dataset; }\n\n if( select ){\n $dataset.addClass( 'selected' );\n if( !options.waitToPair ){\n this.pairAllSelected();\n }\n\n } else {\n $dataset.removeClass( 'selected' );\n //delete dataset.selected;\n }\n return $dataset;\n },\n\n /** pair all the currently selected unpaired datasets */\n pairAllSelected : function( options ){\n options = options || {};\n var creator = this,\n fwds = [],\n revs = [],\n pairs = [];\n creator.$( '.unpaired-columns .forward-column .dataset.selected' ).each( function(){\n fwds.push( $( this ).data( 'dataset' ) );\n });\n creator.$( '.unpaired-columns .reverse-column .dataset.selected' ).each( function(){\n revs.push( $( this ).data( 'dataset' ) );\n });\n fwds.length = revs.length = Math.min( fwds.length, revs.length );\n //this.debug( fwds );\n //this.debug( revs );\n fwds.forEach( function( fwd, i ){\n try {\n pairs.push( creator._pair( fwd, revs[i], { silent: true }) );\n\n } catch( err ){\n //TODO: preserve selected state of those that couldn't be paired\n //TODO: warn that some could not be paired\n creator.error( err );\n }\n });\n if( pairs.length && !options.silent ){\n this.trigger( 'pair:new', pairs );\n }\n return pairs;\n },\n\n /** clear the selection on all unpaired datasets */\n clearSelectedUnpaired : function(){\n this.$( '.unpaired-columns .dataset.selected' ).removeClass( 'selected' );\n },\n\n /** when holding down the shift key on a click, 'paint' the moused over datasets as selected */\n _mousedownUnpaired : function( ev ){\n if( ev.shiftKey ){\n var creator = this,\n $startTarget = $( ev.target ).addClass( 'selected' ),\n moveListener = function( ev ){\n creator.$( ev.target ).filter( '.dataset' ).addClass( 'selected' );\n };\n $startTarget.parent().on( 'mousemove', moveListener );\n\n // on any mouseup, stop listening to the move and try to pair any selected\n $( document ).one( 'mouseup', function( ev ){\n $startTarget.parent().off( 'mousemove', moveListener );\n creator.pairAllSelected();\n });\n }\n },\n\n /** attempt to pair two datasets directly across from one another */\n _clickPairRow : function( ev ){\n //if( !ev.currentTarget ){ return true; }\n var rowIndex = $( ev.currentTarget ).index(),\n fwd = $( '.unpaired-columns .forward-column .dataset' ).eq( rowIndex ).data( 'dataset' ),\n rev = $( '.unpaired-columns .reverse-column .dataset' ).eq( rowIndex ).data( 'dataset' );\n //this.debug( 'row:', rowIndex, fwd, rev );\n this._pair( fwd, rev );\n },\n\n // ........................................................................ divider/partition\n /** start dragging the visible divider/partition between unpaired and paired panes */\n _startPartitionDrag : function( ev ){\n var creator = this,\n startingY = ev.pageY;\n //this.debug( 'partition drag START:', ev );\n $( 'body' ).css( 'cursor', 'ns-resize' );\n creator.$( '.flexible-partition-drag' ).css( 'color', 'black' );\n\n function endDrag( ev ){\n //creator.debug( 'partition drag STOP:', ev );\n // doing this by an added class didn't really work well - kept flashing still\n creator.$( '.flexible-partition-drag' ).css( 'color', '' );\n $( 'body' ).css( 'cursor', '' ).unbind( 'mousemove', trackMouse );\n }\n function trackMouse( ev ){\n var offset = ev.pageY - startingY;\n //creator.debug( 'partition:', startingY, offset );\n if( !creator.adjPartition( offset ) ){\n //creator.debug( 'mouseup triggered' );\n $( 'body' ).trigger( 'mouseup' );\n }\n creator._adjUnpairedOnScrollbar();\n startingY += offset;\n }\n $( 'body' ).mousemove( trackMouse );\n $( 'body' ).one( 'mouseup', endDrag );\n },\n\n /** adjust the parition up/down +/-adj pixels */\n adjPartition : function( adj ){\n var $unpaired = this.$( '.unpaired-columns' ),\n $paired = this.$( '.paired-columns' ),\n unpairedHi = parseInt( $unpaired.css( 'height' ), 10 ),\n pairedHi = parseInt( $paired.css( 'height' ), 10 );\n //this.debug( adj, 'hi\\'s:', unpairedHi, pairedHi, unpairedHi + adj, pairedHi - adj );\n\n unpairedHi = Math.max( 10, unpairedHi + adj );\n pairedHi = pairedHi - adj;\n\n var movingUpwards = adj < 0;\n // when the divider gets close to the top - lock into hiding the unpaired section\n if( movingUpwards ){\n if( this.unpairedPanelHidden ){\n return false;\n } else if( unpairedHi <= 10 ){\n this.hideUnpaired();\n return false;\n }\n } else {\n if( this.unpairedPanelHidden ){\n $unpaired.show();\n this.unpairedPanelHidden = false;\n }\n }\n\n // when the divider gets close to the bottom - lock into hiding the paired section\n if( !movingUpwards ){\n if( this.pairedPanelHidden ){\n return false;\n } else if( pairedHi <= 15 ){\n this.hidePaired();\n return false;\n }\n\n } else {\n if( this.pairedPanelHidden ){\n $paired.show();\n this.pairedPanelHidden = false;\n }\n }\n\n $unpaired.css({\n height : unpairedHi + 'px',\n flex : '0 0 auto'\n });\n return true;\n },\n\n // ........................................................................ paired\n /** select a pair when clicked */\n selectPair : function( ev ){\n ev.stopPropagation();\n $( ev.currentTarget ).toggleClass( 'selected' );\n },\n\n /** deselect all pairs */\n clearSelectedPaired : function( ev ){\n this.$( '.paired-columns .dataset.selected' ).removeClass( 'selected' );\n },\n\n /** rename a pair when the pair name is clicked */\n _clickPairName : function( ev ){\n ev.stopPropagation();\n var $name = $( ev.currentTarget ),\n $pair = $name.parent().parent(),\n index = $pair.index( '.dataset.paired' ),\n pair = this.paired[ index ],\n response = prompt( 'Enter a new name for the pair:', pair.name );\n if( response ){\n pair.name = response;\n // set a flag (which won't be passed in json creation) for manual naming so we don't overwrite these\n // when adding/removing extensions\n //hackish\n pair.customizedName = true;\n $name.text( pair.name );\n }\n },\n\n /** unpair this pair */\n _clickUnpair : function( ev ){\n //if( !ev.currentTarget ){ return true; }\n var pairIndex = Math.floor( $( ev.currentTarget ).index( '.unpair-btn' ) );\n //this.debug( 'pair:', pairIndex );\n this._unpair( this.paired[ pairIndex ] );\n },\n\n // ........................................................................ paired - drag and drop re-ordering\n //_dragenterPairedColumns : function( ev ){\n // this.debug( '_dragenterPairedColumns:', ev );\n //},\n //_dragleavePairedColumns : function( ev ){\n // //this.debug( '_dragleavePairedColumns:', ev );\n //},\n /** track the mouse drag over the paired list adding a placeholder to show where the drop would occur */\n _dragoverPairedColumns : function( ev ){\n //this.debug( '_dragoverPairedColumns:', ev );\n ev.preventDefault();\n\n var $list = this.$( '.paired-columns .column-datasets' );\n this._checkForAutoscroll( $list, ev.originalEvent.clientY );\n //this.debug( ev.originalEvent.clientX, ev.originalEvent.clientY );\n var $nearest = this._getNearestPairedDatasetLi( ev.originalEvent.clientY );\n\n $( '.element-drop-placeholder' ).remove();\n var $placeholder = $( '
            ' );\n if( !$nearest.size() ){\n $list.append( $placeholder );\n } else {\n $nearest.before( $placeholder );\n }\n },\n\n /** If the mouse is near enough to the list's top or bottom, scroll the list */\n _checkForAutoscroll : function( $element, y ){\n var AUTOSCROLL_SPEED = 2;\n var offset = $element.offset(),\n scrollTop = $element.scrollTop(),\n upperDist = y - offset.top,\n lowerDist = ( offset.top + $element.outerHeight() ) - y;\n //this.debug( '_checkForAutoscroll:', scrollTop, upperDist, lowerDist );\n if( upperDist >= 0 && upperDist < this.autoscrollDist ){\n $element.scrollTop( scrollTop - AUTOSCROLL_SPEED );\n } else if( lowerDist >= 0 && lowerDist < this.autoscrollDist ){\n $element.scrollTop( scrollTop + AUTOSCROLL_SPEED );\n }\n },\n\n /** get the nearest *previous* paired dataset PairView based on the mouse's Y coordinate.\n * If the y is at the end of the list, return an empty jQuery object.\n */\n _getNearestPairedDatasetLi : function( y ){\n var WIGGLE = 4,\n lis = this.$( '.paired-columns .column-datasets li' ).toArray();\n for( var i=0; i y && top - halfHeight < y ){\n //this.debug( y, top + halfHeight, top - halfHeight )\n return $li;\n }\n }\n return $();\n },\n /** drop (dragged/selected PairViews) onto the list, re-ordering both the DOM and the internal array of pairs */\n _dropPairedColumns : function( ev ){\n // both required for firefox\n ev.preventDefault();\n ev.dataTransfer.dropEffect = 'move';\n\n var $nearest = this._getNearestPairedDatasetLi( ev.originalEvent.clientY );\n if( $nearest.size() ){\n this.$dragging.insertBefore( $nearest );\n\n } else {\n // no nearest before - insert after last element (unpair button)\n this.$dragging.insertAfter( this.$( '.paired-columns .unpair-btn' ).last() );\n }\n // resync the creator's list of paired based on the new DOM order\n this._syncPairsToDom();\n return false;\n },\n /** resync the creator's list of paired based on the DOM order of pairs */\n _syncPairsToDom : function(){\n var newPaired = [];\n //TODO: doesn't seem wise to use the dom to store these - can't we sync another way?\n this.$( '.paired-columns .dataset.paired' ).each( function(){\n newPaired.push( $( this ).data( 'pair' ) );\n });\n //this.debug( newPaired );\n this.paired = newPaired;\n this._renderPaired();\n },\n /** drag communication with pair sub-views: dragstart */\n _pairDragstart : function( ev, pair ){\n //this.debug( '_pairDragstart', ev, pair )\n // auto select the pair causing the event and move all selected\n pair.$el.addClass( 'selected' );\n var $selected = this.$( '.paired-columns .dataset.selected' );\n this.$dragging = $selected;\n },\n /** drag communication with pair sub-views: dragend - remove the placeholder */\n _pairDragend : function( ev, pair ){\n //this.debug( '_pairDragend', ev, pair )\n $( '.element-drop-placeholder' ).remove();\n this.$dragging = null;\n },\n\n // ........................................................................ footer\n toggleExtensions : function( force ){\n var creator = this;\n creator.removeExtensions = ( force !== undefined )?( force ):( !creator.removeExtensions );\n\n _.each( creator.paired, function( pair ){\n // don't overwrite custom names\n if( pair.customizedName ){ return; }\n pair.name = creator._guessNameForPair( pair.forward, pair.reverse );\n });\n\n creator._renderPaired();\n creator._renderFooter();\n },\n\n /** handle a collection name change */\n _changeName : function( ev ){\n this._validationWarning( 'name', !!this._getName() );\n },\n\n /** check for enter key press when in the collection name and submit */\n _nameCheckForEnter : function( ev ){\n if( ev.keyCode === 13 && !this.blocking ){\n this._clickCreate();\n }\n },\n\n /** get the current collection name */\n _getName : function(){\n return _.escape( this.$( '.collection-name' ).val() );\n },\n\n /** attempt to create the current collection */\n _clickCreate : function( ev ){\n var name = this._getName();\n if( !name ){\n this._validationWarning( 'name' );\n } else if( !this.blocking ){\n this.createList();\n }\n },\n\n // ------------------------------------------------------------------------ misc\n /** debug a dataset list */\n _printList : function( list ){\n var creator = this;\n _.each( list, function( e ){\n if( list === creator.paired ){\n creator._printPair( e );\n } else {\n //creator.debug( e );\n }\n });\n },\n\n /** print a pair Object */\n _printPair : function( pair ){\n this.debug( pair.forward.name, pair.reverse.name, ': ->', pair.name );\n },\n\n /** string rep */\n toString : function(){ return 'PairedCollectionCreator'; }\n});\n\n\n//TODO: move to require text plugin and load these as text\n//TODO: underscore currently unnecc. bc no vars are used\n//TODO: better way of localizing text-nodes in long strings\n/** underscore template fns attached to class */\nPairedCollectionCreator.templates = PairedCollectionCreator.templates || {\n\n /** the skeleton */\n main : _.template([\n '
            ',\n '
            ',\n '
            '\n ].join('')),\n\n /** the header (not including help text) */\n header : _.template([\n '
            ',\n '', _l( 'More help' ), '',\n '
            ',\n '', _l( 'Less' ), '',\n '
            ',\n '
            ',\n '
            ',\n '',\n '',\n '
            ',\n\n '
            ',\n '
            ',\n '
            ',\n '
            ',\n '', _l( 'Unpaired forward' ), '',\n '',\n '
            ',\n '
            ',\n '',\n '
            ',\n '
            ',\n '
            ',\n '',\n '
            ',\n '
            ',\n '
            ',\n '', _l( 'Unpaired reverse' ), '',\n '',\n '
            ',\n '
            ',\n '',\n '
            ',\n '
            ',\n '
            ',\n '
            '\n ].join('')),\n\n /** the middle: unpaired, divider, and paired */\n middle : _.template([\n // contains two flex rows (rows that fill available space) and a divider btwn\n '
            ',\n '
            ',\n '
              ',\n '
              ',\n '
              ',\n '
                ',\n '
                ',\n '
                ',\n '
                  ',\n '
                  ',\n '
                  ',\n '
                  ',\n '
                  ',\n '
                  ',\n '
                  ',\n '',\n '
                  ',\n '',\n _l( 'Unpair all' ),\n '',\n '
                  ',\n '
                  ',\n '
                  ',\n '
                    ',\n '
                    '\n ].join('')),\n\n /** creation and cancel controls */\n footer : _.template([\n '
                    ',\n '
                    ',\n '',\n '
                    ',\n '
                    ',\n '',\n '
                    ', _l( 'Name' ), ':
                    ',\n '
                    ',\n '
                    ',\n\n '
                    ',\n '
                    ',\n '',\n '
                    ',\n '',\n '',\n '
                    ',\n '
                    ',\n\n '
                    ',\n '',\n '
                    ',\n '
                    '\n ].join('')),\n\n /** help content */\n helpContent : _.template([\n '

                    ', _l([\n 'Collections of paired datasets are ordered lists of dataset pairs (often forward and reverse reads). ',\n 'These collections can be passed to tools and workflows in order to have analyses done on each member of ',\n 'the entire group. This interface allows you to create a collection, choose which datasets are paired, ',\n 'and re-order the final collection.'\n ].join( '' )), '

                    ',\n '

                    ', _l([\n 'Unpaired datasets are shown in the unpaired section ',\n '(hover over the underlined words to highlight below). ',\n 'Paired datasets are shown in the paired section.',\n '

                      To pair datasets, you can:',\n '
                    • Click a dataset in the ',\n 'forward column ',\n 'to select it then click a dataset in the ',\n 'reverse column.',\n '
                    • ',\n '
                    • Click one of the \"Pair these datasets\" buttons in the ',\n 'middle column ',\n 'to pair the datasets in a particular row.',\n '
                    • ',\n '
                    • Click \"Auto-pair\" ',\n 'to have your datasets automatically paired based on name.',\n '
                    • ',\n '
                    '\n ].join( '' )), '

                    ',\n '

                    ', _l([\n '

                      You can filter what is shown in the unpaired sections by:',\n '
                    • Entering partial dataset names in either the ',\n 'forward filter or ',\n 'reverse filter.',\n '
                    • ',\n '
                    • Choosing from a list of preset filters by clicking the ',\n '\"Choose filters\" link.',\n '
                    • ',\n '
                    • Entering regular expressions to match dataset names. See: ',\n 'MDN\\'s JavaScript Regular Expression Tutorial. ',\n 'Note: forward slashes (\\\\) are not needed.',\n '
                    • ',\n '
                    • Clearing the filters by clicking the ',\n '\"Clear filters\" link.',\n '
                    • ',\n '
                    '\n ].join( '' )), '

                    ',\n '

                    ', _l([\n 'To unpair individual dataset pairs, click the ',\n 'unpair buttons ( ). ',\n 'Click the \"Unpair all\" link to unpair all pairs.'\n ].join( '' )), '

                    ',\n '

                    ', _l([\n 'You can include or remove the file extensions (e.g. \".fastq\") from your pair names by toggling the ',\n '\"Remove file extensions from pair names?\" control.'\n ].join( '' )), '

                    ',\n '

                    ', _l([\n 'Once your collection is complete, enter a name and ',\n 'click \"Create list\". ',\n '(Note: you do not have to pair all unpaired datasets to finish.)'\n ].join( '' )), '

                    '\n ].join(''))\n};\n\n\n//=============================================================================\n/** a modal version of the paired collection creator */\nvar pairedCollectionCreatorModal = function _pairedCollectionCreatorModal( datasets, options ){\n\n var deferred = jQuery.Deferred(),\n creator;\n\n options = _.defaults( options || {}, {\n datasets : datasets,\n oncancel : function(){\n Galaxy.modal.hide();\n deferred.reject( 'cancelled' );\n },\n oncreate : function( creator, response ){\n Galaxy.modal.hide();\n deferred.resolve( response );\n }\n });\n\n if( !window.Galaxy || !Galaxy.modal ){\n throw new Error( 'Galaxy or Galaxy.modal not found' );\n }\n\n creator = new PairedCollectionCreator( options );\n Galaxy.modal.show({\n title : 'Create a collection of paired datasets',\n body : creator.$el,\n width : '80%',\n height : '800px',\n closing_events: true\n });\n creator.render();\n window.creator = creator;\n\n //TODO: remove modal header\n return deferred;\n};\n\n\n//=============================================================================\nfunction createListOfPairsCollection( collection ){\n var elements = collection.toJSON();\n//TODO: validate elements\n return pairedCollectionCreatorModal( elements, {\n historyId : collection.historyId\n });\n}\n\n\n//=============================================================================\n return {\n PairedCollectionCreator : PairedCollectionCreator,\n pairedCollectionCreatorModal : pairedCollectionCreatorModal,\n createListOfPairsCollection : createListOfPairsCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/list-of-pairs-collection-creator.js\n ** module id = 125\n ** module chunks = 3\n **/","define([\n \"mvc/collection/list-collection-creator\",\n \"mvc/history/hdca-model\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( LIST_CREATOR, HDCA, BASE_MVC, _l ){\n\nvar logNamespace = 'collections';\n/*==============================================================================\nTODO:\n the paired creator doesn't really mesh with the list creator as parent\n it may be better to make an abstract super class for both\n composites may inherit from this (or vis-versa)\n PairedDatasetCollectionElementView doesn't make a lot of sense\n\n==============================================================================*/\n/** */\nvar PairedDatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n//TODO: use proper class (DatasetDCE or NestedDCDCE (or the union of both))\n tagName : 'li',\n className : 'collection-element',\n\n initialize : function( attributes ){\n this.element = attributes.element || {};\n this.identifier = attributes.identifier;\n },\n\n render : function(){\n this.$el\n .attr( 'data-element-id', this.element.id )\n .html( this.template({ identifier: this.identifier, element: this.element }) );\n return this;\n },\n\n //TODO: lots of unused space in the element - possibly load details and display them horiz.\n template : _.template([\n '<%- identifier %>',\n '<%- element.name %>',\n ].join('')),\n\n /** remove the DOM and any listeners */\n destroy : function(){\n this.off();\n this.$el.remove();\n },\n\n /** string rep */\n toString : function(){\n return 'DatasetCollectionElementView()';\n }\n});\n\n\n// ============================================================================\nvar _super = LIST_CREATOR.ListCollectionCreator;\n\n/** An interface for building collections.\n */\nvar PairCollectionCreator = _super.extend({\n\n /** the class used to display individual elements */\n elementViewClass : PairedDatasetCollectionElementView,\n /** the class this creator will create and save */\n collectionClass : HDCA.HistoryPairDatasetCollection,\n className : 'pair-collection-creator collection-creator flex-row-container',\n\n /** override to no-op */\n _mangleDuplicateNames : function(){},\n\n // TODO: this whole pattern sucks. There needs to be two classes of problem area:\n // bad inital choices and\n // when the user has painted his/her self into a corner during creation/use-of-the-creator\n /** render the entire interface */\n render : function( speed, callback ){\n if( this.workingElements.length === 2 ){\n return _super.prototype.render.call( this, speed, callback );\n }\n return this._renderInvalid( speed, callback );\n },\n\n // ------------------------------------------------------------------------ rendering elements\n /** render forward/reverse */\n _renderList : function( speed, callback ){\n //this.debug( '-- _renderList' );\n //precondition: there are two valid elements in workingElements\n var creator = this,\n $tmp = jQuery( '
                    ' ),\n $list = creator.$list();\n\n // lose the original views, create the new, append all at once, then call their renders\n _.each( this.elementViews, function( view ){\n view.destroy();\n creator.removeElementView( view );\n });\n $tmp.append( creator._createForwardElementView().$el );\n $tmp.append( creator._createReverseElementView().$el );\n $list.empty().append( $tmp.children() );\n _.invoke( creator.elementViews, 'render' );\n },\n\n /** create the forward element view */\n _createForwardElementView : function(){\n return this._createElementView( this.workingElements[0], { identifier: 'forward' } );\n },\n\n /** create the forward element view */\n _createReverseElementView : function(){\n return this._createElementView( this.workingElements[1], { identifier: 'reverse' } );\n },\n\n /** create an element view, cache in elementViews, and return */\n _createElementView : function( element, options ){\n var elementView = new this.elementViewClass( _.extend( options, {\n element : element,\n }));\n this.elementViews.push( elementView );\n return elementView;\n },\n\n /** swap the forward, reverse elements and re-render */\n swap : function(){\n this.workingElements = [\n this.workingElements[1],\n this.workingElements[0],\n ];\n this._renderList();\n },\n\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .swap' : 'swap',\n }),\n\n // ------------------------------------------------------------------------ templates\n //TODO: move to require text plugin and load these as text\n //TODO: underscore currently unnecc. bc no vars are used\n //TODO: better way of localizing text-nodes in long strings\n /** underscore template fns attached to class */\n templates : _.extend( _.clone( _super.prototype.templates ), {\n /** the middle: element list */\n middle : _.template([\n '',\n '
                    ',\n '
                    '\n ].join('')),\n\n /** help content */\n helpContent : _.template([\n '

                    ', _l([\n 'Pair collections are permanent collections containing two datasets: one forward and one reverse. ',\n 'Often these are forward and reverse reads. The pair collections can be passed to tools and ',\n 'workflows in order to have analyses done on both datasets. This interface allows ',\n 'you to create a pair, name it, and swap which is forward and which reverse.'\n ].join( '' )), '

                    ',\n '
                      ',\n '
                    • ', _l([\n 'Click the \"Swap\" link to make your forward dataset the reverse ',\n 'and the reverse dataset forward.'\n ].join( '' )), '
                    • ',\n '
                    • ', _l([\n 'Click the \"Cancel\" button to exit the interface.'\n ].join( '' )), '
                    • ',\n '

                    ',\n '

                    ', _l([\n 'Once your collection is complete, enter a name and ',\n 'click \"Create list\".'\n ].join( '' )), '

                    '\n ].join('')),\n\n /** a simplified page communicating what went wrong and why the user needs to reselect something else */\n invalidInitial : _.template([\n '
                    ',\n '
                    ',\n '',\n '<% if( _.size( problems ) ){ %>',\n _l( 'The following selections could not be included due to problems' ),\n '
                      <% _.each( problems, function( problem ){ %>',\n '
                    • <%- problem.element.name %>: <%- problem.text %>
                    • ',\n '<% }); %>
                    ',\n '<% } else if( _.size( elements ) === 0 ){ %>',\n _l( 'No datasets were selected' ), '.',\n '<% } else if( _.size( elements ) === 1 ){ %>',\n _l( 'Only one dataset was selected' ), ': <%- elements[0].name %>',\n '<% } else if( _.size( elements ) > 2 ){ %>',\n _l( 'Too many datasets were selected' ),\n ': <%- _.pluck( elements, \"name\" ).join( \", \") %>',\n '<% } %>',\n '
                    ',\n _l( 'Two (and only two) elements are needed for the pair' ), '. ',\n _l( 'You may need to ' ),\n '', _l( 'cancel' ), ' ',\n _l( 'and reselect new elements' ), '.',\n '
                    ',\n '
                    ',\n '
                    ',\n '
                    ',\n '
                    ',\n '
                    ',\n '',\n // _l( 'Create a different kind of collection' ),\n '
                    ',\n '
                    ',\n '
                    '\n ].join('')),\n }),\n\n // ------------------------------------------------------------------------ misc\n /** string rep */\n toString : function(){ return 'PairCollectionCreator'; }\n});\n\n\n//==============================================================================\n/** List collection flavor of collectionCreatorModal. */\nvar pairCollectionCreatorModal = function _pairCollectionCreatorModal( elements, options ){\n options = options || {};\n options.title = _l( 'Create a collection from a pair of datasets' );\n return LIST_CREATOR.collectionCreatorModal( elements, options, PairCollectionCreator );\n};\n\n\n//==============================================================================\n/** Use a modal to create a pair collection, then add it to the given history contents.\n * @returns {Deferred} resolved when the collection is added to the history.\n */\nfunction createPairCollection( contents ){\n var elements = contents.toJSON(),\n promise = pairCollectionCreatorModal( elements, {\n creationFn : function( elements, name ){\n elements = [\n { name: \"forward\", src: \"hda\", id: elements[0].id },\n { name: \"reverse\", src: \"hda\", id: elements[1].id }\n ];\n return contents.createHDCA( elements, 'paired', name );\n }\n });\n return promise;\n}\n\n//==============================================================================\n return {\n PairCollectionCreator : PairCollectionCreator,\n pairCollectionCreatorModal : pairCollectionCreatorModal,\n createPairCollection : createPairCollection,\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/pair-collection-creator.js\n ** module id = 126\n ** module chunks = 3\n **/","define([\n \"mvc/ui/ui-modal\",\n \"utils/localization\"\n], function( MODAL, _l ){\n\n\"use strict\";\n//==============================================================================\n/**\n * A dialog/modal that allows copying a user history or 'importing' from user\n * another. Generally called via historyCopyDialog below.\n * @type {Object}\n */\nvar CopyDialog = {\n\n // language related strings/fns\n defaultName : _.template( \"Copy of '<%- name %>'\" ),\n title : _.template( _l( 'Copying history' ) + ' \"<%- name %>\"' ),\n submitLabel : _l( 'Copy' ),\n errorMessage : _l( 'History could not be copied' ),\n progressive : _l( 'Copying history' ),\n activeLabel : _l( 'Copy only the active, non-deleted datasets' ),\n allLabel : _l( 'Copy all datasets including deleted ones' ),\n anonWarning : _l( 'As an anonymous user, unless you login or register, you will lose your current history ' ) +\n _l( 'after copying this history. ' ),\n\n // template for modal body\n _template : _.template([\n //TODO: remove inline styles\n // show a warning message for losing current to anon users\n '<% if( isAnon ){ %>',\n '
                    ',\n '<%- anonWarning %>',\n _l( 'You can' ),\n ' ', _l( 'login here' ), ' ', _l( 'or' ), ' ',\n ' ', _l( 'register here' ), '.',\n '
                    ',\n '<% } %>',\n '
                    ',\n '
                    ',\n // TODO: could use required here and the form validators\n // NOTE: use unescaped here if escaped in the modal function below\n '\" />',\n '

                    ',\n _l( 'Please enter a valid history title' ),\n '

                    ',\n // if allowAll, add the option to copy deleted datasets, too\n '<% if( allowAll ){ %>',\n '
                    ',\n '

                    ', _l( 'Choose which datasets from the original history to include:' ), '

                    ',\n // copy non-deleted is the default\n '/>',\n '',\n '
                    ',\n '/>',\n '',\n '<% } %>',\n '
                    '\n ].join( '' )),\n\n // empty modal body and let the user know the copy is happening\n _showAjaxIndicator : function _showAjaxIndicator(){\n var indicator = '

                    ' + this.progressive + '...

                    ';\n this.modal.$( '.modal-body' ).empty().append( indicator ).css({ 'margin-top': '8px' });\n },\n\n // (sorta) public interface - display the modal, render the form, and potentially copy the history\n // returns a jQuery.Deferred done->history copied, fail->user cancelled\n dialog : function _dialog( modal, history, options ){\n options = options || {};\n\n var dialog = this,\n deferred = jQuery.Deferred(),\n // TODO: getting a little byzantine here\n defaultCopyNameFn = options.nameFn || this.defaultName,\n defaultCopyName = defaultCopyNameFn({ name: history.get( 'name' ) }),\n // TODO: these two might be simpler as one 3 state option (all,active,no-choice)\n defaultCopyWhat = options.allDatasets? 'copy-all' : 'copy-non-deleted',\n allowAll = !_.isUndefined( options.allowAll )? options.allowAll : true,\n autoClose = !_.isUndefined( options.autoClose )? options.autoClose : true;\n\n this.modal = modal;\n\n\n // validate the name and copy if good\n function checkNameAndCopy(){\n var name = modal.$( '#copy-modal-title' ).val();\n if( !name ){\n modal.$( '.invalid-title' ).show();\n return;\n }\n // get further settings, shut down and indicate the ajax call, then hide and resolve/reject\n var copyAllDatasets = modal.$( 'input[name=\"copy-what\"]:checked' ).val() === 'copy-all';\n modal.$( 'button' ).prop( 'disabled', true );\n dialog._showAjaxIndicator();\n history.copy( true, name, copyAllDatasets )\n .done( function( response ){\n deferred.resolve( response );\n })\n //TODO: make this unneccessary with pub-sub error or handling via Galaxy\n .fail( function(){\n alert([ dialog.errorMessage, _l( 'Please contact a Galaxy administrator' ) ].join( '. ' ));\n deferred.rejectWith( deferred, arguments );\n })\n .always( function(){\n if( autoClose ){ modal.hide(); }\n });\n }\n\n var originalClosingCallback = options.closing_callback;\n modal.show( _.extend( options, {\n title : this.title({ name: history.get( 'name' ) }),\n body : $( dialog._template({\n name : defaultCopyName,\n isAnon : Galaxy.user.isAnonymous(),\n allowAll : allowAll,\n copyWhat : defaultCopyWhat,\n activeLabel : this.activeLabel,\n allLabel : this.allLabel,\n anonWarning : this.anonWarning,\n })),\n buttons : _.object([\n [ _l( 'Cancel' ), function(){ modal.hide(); } ],\n [ this.submitLabel, checkNameAndCopy ]\n ]),\n height : 'auto',\n closing_events : true,\n closing_callback: function _historyCopyClose( cancelled ){\n if( cancelled ){\n deferred.reject({ cancelled : true });\n }\n if( originalClosingCallback ){\n originalClosingCallback( cancelled );\n }\n }\n }));\n\n // set the default dataset copy, autofocus the title, and set up for a simple return\n modal.$( '#copy-modal-title' ).focus().select();\n modal.$( '#copy-modal-title' ).on( 'keydown', function( ev ){\n if( ev.keyCode === 13 ){\n ev.preventDefault();\n checkNameAndCopy();\n }\n });\n\n return deferred;\n },\n};\n\n//==============================================================================\n// maintain the (slight) distinction between copy and import\n/**\n * Subclass CopyDialog to use the import language.\n */\nvar ImportDialog = _.extend( {}, CopyDialog, {\n defaultName : _.template( \"imported: <%- name %>\" ),\n title : _.template( _l( 'Importing history' ) + ' \"<%- name %>\"' ),\n submitLabel : _l( 'Import' ),\n errorMessage : _l( 'History could not be imported' ),\n progressive : _l( 'Importing history' ),\n activeLabel : _l( 'Import only the active, non-deleted datasets' ),\n allLabel : _l( 'Import all datasets including deleted ones' ),\n anonWarning : _l( 'As an anonymous user, unless you login or register, you will lose your current history ' ) +\n _l( 'after importing this history. ' ),\n\n});\n\n//==============================================================================\n/**\n * Main interface for both history import and history copy dialogs.\n * @param {Backbone.Model} history the history to copy\n * @param {Object} options a hash\n * @return {jQuery.Deferred} promise that fails on close and succeeds on copy\n *\n * options:\n * (this object is also passed to the modal used to display the dialog and accepts modal options)\n * {Function} nameFn if defined, use this to build the default name shown to the user\n * (the fn is passed: {name: })\n * {bool} useImport if true, use the 'import' language (instead of Copy)\n * {bool} allowAll if true, allow the user to choose between copying all datasets and\n * only non-deleted datasets\n * {String} allDatasets default initial checked radio button: 'copy-all' or 'copy-non-deleted',\n */\nvar historyCopyDialog = function( history, options ){\n options = options || {};\n // create our own modal if Galaxy doesn't have one (mako tab without use_panels)\n var modal = window.parent.Galaxy.modal || new MODAL.View({});\n return options.useImport?\n ImportDialog.dialog( modal, history, options ):\n CopyDialog.dialog( modal, history, options );\n};\n\n\n//==============================================================================\n return historyCopyDialog;\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/copy-dialog.js\n ** module id = 127\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/dataset-li-edit\",\n \"mvc/history/hda-li\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DATASET_LI_EDIT, HDA_LI, BASE_MVC, _l ){\n//==============================================================================\nvar _super = DATASET_LI_EDIT.DatasetListItemEdit;\n/** @class Editing view for HistoryDatasetAssociation.\n */\nvar HDAListItemEdit = _super.extend(\n/** @lends HDAListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : _super.prototype.className + \" history-content\",\n\n /** In this override, only get details if in the ready state, get rerunnable if in other states.\n * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n */\n _fetchModelDetails : function(){\n var view = this;\n if( view.model.inReadyState() && !view.model.hasDetails() ){\n return view.model.fetch({ silent: true });\n\n // special case the need for the rerunnable and creating_job attributes\n // needed for rendering re-run button on queued, running datasets\n } else if( !view.model.has( 'rerunnable' ) ){\n return view.model.fetch({ silent: true, data: {\n // only fetch rerunnable and creating_job to keep overhead down\n keys: [ 'rerunnable', 'creating_job' ].join(',')\n }});\n }\n return jQuery.when();\n },\n\n /** event map */\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .unhide-link' : function( ev ){ this.model.unhide(); return false; }\n }),\n\n /** string rep */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDAListItemEdit(' + modelString + ')';\n }\n});\n\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nHDAListItemEdit.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n hidden : BASE_MVC.wrapTemplate([\n '<% if( !dataset.visible ){ %>',\n // add a link to unhide a dataset\n '
                    ',\n _l( 'This dataset has been hidden' ),\n '
                    ', _l( 'Unhide it' ), '',\n '
                    ',\n '<% } %>'\n ], 'dataset' )\n });\n\n return _.extend( {}, _super.prototype.templates, {\n //NOTE: *steal* the HDAListItemView titleBar\n titleBar : HDA_LI.HDAListItemView.prototype.templates.titleBar,\n warnings : warnings\n });\n}());\n\n\n//==============================================================================\n return {\n HDAListItemEdit : HDAListItemEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hda-li-edit.js\n ** module id = 128\n ** module chunks = 3\n **/","define([\n \"mvc/history/hdca-li\",\n \"mvc/collection/collection-view-edit\",\n \"ui/fa-icon-button\",\n \"utils/localization\"\n], function( HDCA_LI, DC_VIEW_EDIT, faIconButton, _l ){\n//==============================================================================\nvar _super = HDCA_LI.HDCAListItemView;\n/** @class Editing view for HistoryDatasetCollectionAssociation.\n */\nvar HDCAListItemEdit = _super.extend(\n/** @lends HDCAListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** Override to return editable versions of the collection panels */\n _getFoldoutPanelClass : function(){\n switch( this.model.get( 'collection_type' ) ){\n case 'list':\n return DC_VIEW_EDIT.ListCollectionViewEdit;\n case 'paired':\n return DC_VIEW_EDIT.PairCollectionViewEdit;\n case 'list:paired':\n return DC_VIEW_EDIT.ListOfPairsCollectionViewEdit;\n }\n throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );\n },\n\n // ......................................................................... delete\n /** In this override, add the delete button. */\n _renderPrimaryActions : function(){\n this.log( this + '._renderPrimaryActions' );\n // render the display, edit attr and delete icon-buttons\n return _super.prototype._renderPrimaryActions.call( this )\n .concat([\n this._renderDeleteButton()\n ]);\n },\n\n /** Render icon-button to delete this collection. */\n _renderDeleteButton : function(){\n var self = this,\n deleted = this.model.get( 'deleted' );\n return faIconButton({\n title : deleted? _l( 'Dataset collection is already deleted' ): _l( 'Delete' ),\n classes : 'delete-btn',\n faIcon : 'fa-times',\n disabled : deleted,\n onclick : function() {\n // ...bler... tooltips being left behind in DOM (hover out never called on deletion)\n self.$el.find( '.icon-btn.delete-btn' ).trigger( 'mouseout' );\n self.model[ 'delete' ]();\n }\n });\n },\n\n // ......................................................................... misc\n /** string rep */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDCAListItemEdit(' + modelString + ')';\n }\n});\n\n//==============================================================================\n return {\n HDCAListItemEdit : HDCAListItemEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hdca-li-edit.js\n ** module id = 129\n ** module chunks = 3\n **/","define([\n \"mvc/history/history-model\",\n \"mvc/history/history-view-edit\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( HISTORY_MODEL, HISTORY_VIEW_EDIT, BASE_MVC, _l ){\n// ============================================================================\n/** session storage for history panel preferences (and to maintain state)\n */\nvar HistoryViewPrefs = BASE_MVC.SessionStorageModel.extend(\n/** @lends HistoryViewPrefs.prototype */{\n defaults : {\n /** should the tags editor be shown or hidden initially? */\n tagsEditorShown : false,\n /** should the annotation editor be shown or hidden initially? */\n annotationEditorShown : false,\n ///** what is the currently focused content (dataset or collection) in the current history?\n // * (the history panel will highlight and scroll to the focused content view)\n // */\n //focusedContentId : null\n /** Current scroll position */\n scrollPosition : 0\n },\n toString : function(){\n return 'HistoryViewPrefs(' + JSON.stringify( this.toJSON() ) + ')';\n }\n});\n\n/** key string to store panel prefs (made accessible on class so you can access sessionStorage directly) */\nHistoryViewPrefs.storageKey = function storageKey(){\n return ( 'history-panel' );\n};\n\n/* =============================================================================\nTODO:\n\n============================================================================= */\nvar _super = HISTORY_VIEW_EDIT.HistoryViewEdit;\n// used in root/index.mako\n/** @class View/Controller for the user's current history model as used in the history\n * panel (current right hand panel) of the analysis page.\n *\n * The only history panel that:\n * will poll for updates.\n * displays datasets in reverse hid order.\n */\nvar CurrentHistoryView = _super.extend(\n/** @lends CurrentHistoryView.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : _super.prototype.className + ' current-history-panel',\n\n emptyMsg : _l( \"This history is empty. Click 'Get Data' on the left tool menu to start\" ),\n noneFoundMsg : _l( \"No matching datasets found\" ),\n\n /** */\n HDCAViewClass : _super.prototype.HDCAViewClass.extend({\n foldoutStyle : 'drilldown'\n }),\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events */\n initialize : function( attributes ){\n attributes = attributes || {};\n\n // ---- persistent preferences\n /** maintain state / preferences over page loads */\n this.preferences = new HistoryViewPrefs( _.extend({\n id : HistoryViewPrefs.storageKey()\n }, _.pick( attributes, _.keys( HistoryViewPrefs.prototype.defaults ) )));\n\n _super.prototype.initialize.call( this, attributes );\n\n /** sub-views that will overlay this panel (collections) */\n this.panelStack = [];\n\n /** id of currently focused content */\n this.currentContentId = attributes.currentContentId || null;\n //NOTE: purposely not sent to localstorage since panel recreation roughly lines up with a reset of this value\n },\n\n /** Override to cache the current scroll position with a listener */\n _setUpListeners : function(){\n _super.prototype._setUpListeners.call( this );\n\n var panel = this;\n // reset scroll position when there's a new history\n this.on( 'new-model', function(){\n panel.preferences.set( 'scrollPosition', 0 );\n });\n },\n\n // ------------------------------------------------------------------------ loading history/item models\n /** (re-)loads the user's current history & contents w/ details */\n loadCurrentHistory : function( attributes ){\n this.debug( this + '.loadCurrentHistory' );\n // implemented as a 'fresh start' or for when there is no model (intial panel render)\n var panel = this;\n return this.loadHistoryWithDetails( 'current', attributes )\n .then(function( historyData, contentsData ){\n panel.trigger( 'current-history', panel );\n });\n },\n\n /** loads a history & contents w/ details and makes them the current history */\n switchToHistory : function( historyId, attributes ){\n //this.info( 'switchToHistory:', historyId, attributes );\n var panel = this,\n historyFn = function(){\n // make this current and get history data with one call\n return jQuery.getJSON( Galaxy.root + 'history/set_as_current?id=' + historyId );\n // method : 'PUT'\n //});\n };\n return this.loadHistoryWithDetails( historyId, attributes, historyFn )\n .then( function( historyData, contentsData ){\n panel.trigger( 'switched-history', panel );\n });\n },\n\n /** creates a new history on the server and sets it as the user's current history */\n createNewHistory : function( attributes ){\n if( !Galaxy || !Galaxy.user || Galaxy.user.isAnonymous() ){\n this.displayMessage( 'error', _l( 'You must be logged in to create histories' ) );\n return $.when();\n }\n var panel = this,\n historyFn = function(){\n // create a new history and save: the server will return the proper JSON\n return jQuery.getJSON( Galaxy.root + 'history/create_new_current' );\n };\n\n // id undefined bc there is no historyId yet - the server will provide\n // (no need for details - nothing expanded in new history)\n return this.loadHistory( undefined, attributes, historyFn )\n .then(function( historyData, contentsData ){\n panel.trigger( 'new-history', panel );\n });\n },\n\n /** release/free/shutdown old models and set up panel for new models */\n setModel : function( model, attributes, render ){\n _super.prototype.setModel.call( this, model, attributes, render );\n if( this.model ){\n this.log( 'checking for updates' );\n this.model.checkForUpdates();\n }\n return this;\n },\n\n // ------------------------------------------------------------------------ history/content event listening\n /** listening for collection events */\n _setUpCollectionListeners : function(){\n _super.prototype._setUpCollectionListeners.call( this );\n\n //TODO:?? may not be needed? see history-view-edit, 369\n // if a hidden item is created (gen. by a workflow), moves thru the updater to the ready state,\n // then: remove it from the collection if the panel is set to NOT show hidden datasets\n this.collection.on( 'state:ready', function( model, newState, oldState ){\n if( ( !model.get( 'visible' ) )\n && ( !this.storage.get( 'show_hidden' ) ) ){\n this.removeItemView( model );\n }\n }, this );\n },\n\n /** listening for history events */\n _setUpModelListeners : function(){\n _super.prototype._setUpModelListeners.call( this );\n // ---- history\n // re-broadcast any model change events so that listeners don't have to re-bind to each history\n this.listenTo( this.model, 'change:nice_size change:size', function(){\n this.trigger( 'history-size-change', this, this.model, arguments );\n }, this );\n },\n\n // ------------------------------------------------------------------------ panel rendering\n /** override to add a handler to capture the scroll position when the parent scrolls */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n // we need to call this in _setUpBehaviors which is called after render since the $el\n // may not be attached to $el.parent and $scrollContainer() may not work\n var panel = this;\n _super.prototype._setUpBehaviors.call( panel, $where );\n\n // cache the handler to remove and re-add so we don't pile up the handlers\n if( !this._debouncedScrollCaptureHandler ){\n this._debouncedScrollCaptureHandler = _.debounce( function scrollCapture(){\n // cache the scroll position (only if visible)\n if( panel.$el.is( ':visible' ) ){\n panel.preferences.set( 'scrollPosition', $( this ).scrollTop() );\n }\n }, 40 );\n }\n\n panel.$scrollContainer()\n .off( 'scroll', this._debouncedScrollCaptureHandler )\n .on( 'scroll', this._debouncedScrollCaptureHandler );\n return panel;\n },\n\n /** In this override, handle null models and move the search input to the top */\n _buildNewRender : function(){\n if( !this.model ){ return $(); }\n var $newRender = _super.prototype._buildNewRender.call( this );\n //TODO: hacky\n $newRender.find( '.search' ).prependTo( $newRender.find( '.controls' ) );\n this._renderQuotaMessage( $newRender );\n return $newRender;\n },\n\n /** render the message displayed when a user is over quota and can't run jobs */\n _renderQuotaMessage : function( $whereTo ){\n $whereTo = $whereTo || this.$el;\n return $( this.templates.quotaMsg( {}, this ) ).prependTo( $whereTo.find( '.messages' ) );\n },\n\n /** In this override, add links to open data uploader or get data in the tools section */\n _renderEmptyMessage : function( $whereTo ){\n var panel = this,\n $emptyMsg = panel.$emptyMessage( $whereTo ),\n $toolMenu = $( '.toolMenuContainer' );\n\n if( ( _.isEmpty( panel.views ) && !panel.searchFor )\n && ( Galaxy && Galaxy.upload && $toolMenu.size() ) ){\n $emptyMsg.empty();\n\n $emptyMsg.html([\n _l( 'This history is empty' ), '. ', _l( 'You can ' ),\n '',\n _l( 'load your own data' ),\n '',\n _l( ' or ' ), '',\n _l( 'get data from an external source' ),\n ''\n ].join('') );\n $emptyMsg.find( '.uploader-link' ).click( function( ev ){\n Galaxy.upload.show( ev );\n });\n $emptyMsg.find( '.get-data-link' ).click( function( ev ){\n $toolMenu.parent().scrollTop( 0 );\n $toolMenu.find( 'span:contains(\"Get Data\")' )\n .click();\n //.fadeTo( 200, 0.1, function(){\n // this.debug( this )\n // $( this ).fadeTo( 200, 1.0 );\n //});\n });\n return $emptyMsg.show();\n }\n return _super.prototype._renderEmptyMessage.call( this, $whereTo );\n },\n\n /** In this override, get and set current panel preferences when editor is used */\n _renderTags : function( $where ){\n var panel = this;\n // render tags and show/hide based on preferences\n _super.prototype._renderTags.call( this, $where );\n if( this.preferences.get( 'tagsEditorShown' ) ){\n this.tagsEditor.toggle( true );\n }\n // store preference when shown or hidden\n this.tagsEditor.on( 'hiddenUntilActivated:shown hiddenUntilActivated:hidden',\n function( tagsEditor ){\n panel.preferences.set( 'tagsEditorShown', tagsEditor.hidden );\n });\n },\n\n /** In this override, get and set current panel preferences when editor is used */\n _renderAnnotation : function( $where ){\n var panel = this;\n // render annotation and show/hide based on preferences\n _super.prototype._renderAnnotation.call( this, $where );\n if( this.preferences.get( 'annotationEditorShown' ) ){\n this.annotationEditor.toggle( true );\n }\n // store preference when shown or hidden\n this.annotationEditor.on( 'hiddenUntilActivated:shown hiddenUntilActivated:hidden',\n function( annotationEditor ){\n panel.preferences.set( 'annotationEditorShown', annotationEditor.hidden );\n }\n );\n },\n\n /** Override to scroll to cached position (in prefs) after swapping */\n _swapNewRender : function( $newRender ){\n _super.prototype._swapNewRender.call( this, $newRender );\n var panel = this;\n _.delay( function(){\n var pos = panel.preferences.get( 'scrollPosition' );\n if( pos ){\n panel.scrollTo( pos, 0 );\n }\n }, 10 );\n //TODO: is this enough of a delay on larger histories?\n\n return this;\n },\n\n // ------------------------------------------------------------------------ sub-views\n /** Override to add the current-content highlight class to currentContentId's view */\n _attachItems : function( $whereTo ){\n _super.prototype._attachItems.call( this, $whereTo );\n var panel = this;\n if( panel.currentContentId ){\n panel._setCurrentContentById( panel.currentContentId );\n }\n return this;\n },\n\n /** Override to remove any drill down panels */\n addItemView : function( model, collection, options ){\n var view = _super.prototype.addItemView.call( this, model, collection, options );\n if( !view ){ return view; }\n if( this.panelStack.length ){ return this._collapseDrilldownPanel(); }\n return view;\n },\n\n // ------------------------------------------------------------------------ collection sub-views\n /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n _setUpItemViewListeners : function( view ){\n var panel = this;\n _super.prototype._setUpItemViewListeners.call( panel, view );\n\n // use pub-sub to: handle drilldown expansion and collapse\n view.on( 'expanded:drilldown', function( v, drilldown ){\n this._expandDrilldownPanel( drilldown );\n }, this );\n view.on( 'collapsed:drilldown', function( v, drilldown ){\n this._collapseDrilldownPanel( drilldown );\n }, this );\n\n // when content is manipulated, make it the current-content\n // view.on( 'visualize', function( v, ev ){\n // this.setCurrentContent( v );\n // }, this );\n\n return this;\n },\n\n /** display 'current content': add a visible highlight and store the id of a content item */\n setCurrentContent : function( view ){\n this.$( '.history-content.current-content' ).removeClass( 'current-content' );\n if( view ){\n view.$el.addClass( 'current-content' );\n this.currentContentId = view.model.id;\n } else {\n this.currentContentId = null;\n }\n },\n\n /** find the view with the id and then call setCurrentContent on it */\n _setCurrentContentById : function( id ){\n var view = this.viewFromModelId( id ) || null;\n this.setCurrentContent( view );\n },\n\n /** Handle drill down by hiding this panels list and controls and showing the sub-panel */\n _expandDrilldownPanel : function( drilldown ){\n this.panelStack.push( drilldown );\n // hide this panel's controls and list, set the name for back navigation, and attach to the $el\n this.$( '> .controls' ).add( this.$list() ).hide();\n drilldown.parentName = this.model.get( 'name' );\n this.$el.append( drilldown.render().$el );\n },\n\n /** Handle drilldown close by freeing the panel and re-rendering this panel */\n _collapseDrilldownPanel : function( drilldown ){\n this.panelStack.pop();\n//TODO: MEM: free the panel\n this.render();\n },\n\n // ........................................................................ external objects/MVC\n listenToGalaxy : function( galaxy ){\n // TODO: MEM: questionable reference island / closure practice\n galaxy.on( 'galaxy_main:load', function( data ){\n var pathToMatch = data.fullpath,\n useToURLRegexMap = {\n 'display' : /datasets\\/([a-f0-9]+)\\/display/,\n 'edit' : /datasets\\/([a-f0-9]+)\\/edit/,\n 'report_error' : /dataset\\/errors\\?id=([a-f0-9]+)/,\n 'rerun' : /tool_runner\\/rerun\\?id=([a-f0-9]+)/,\n 'show_params' : /datasets\\/([a-f0-9]+)\\/show_params/,\n // no great way to do this here? (leave it in the dataset event handlers above?)\n // 'visualization' : 'visualization',\n },\n hdaId = null,\n hdaUse = null;\n _.find( useToURLRegexMap, function( regex, use ){\n var match = pathToMatch.match( regex );\n if( match && match.length == 2 ){\n hdaId = match[1];\n hdaUse = use;\n return true;\n }\n return false;\n });\n // need to type mangle to go from web route to history contents\n hdaId = 'dataset-' + hdaId;\n this._setCurrentContentById( hdaId );\n }, this );\n },\n\n//TODO: remove quota meter from panel and remove this\n /** add listeners to an external quota meter (mvc/user/user-quotameter.js) */\n connectToQuotaMeter : function( quotaMeter ){\n if( !quotaMeter ){\n return this;\n }\n // show/hide the 'over quota message' in the history when the meter tells it to\n this.listenTo( quotaMeter, 'quota:over', this.showQuotaMessage );\n this.listenTo( quotaMeter, 'quota:under', this.hideQuotaMessage );\n\n // having to add this to handle re-render of hview while overquota (the above do not fire)\n this.on( 'rendered rendered:initial', function(){\n if( quotaMeter && quotaMeter.isOverQuota() ){\n this.showQuotaMessage();\n }\n });\n return this;\n },\n\n//TODO: this seems more like a per user message than a history message; IOW, this doesn't belong here\n /** Override to preserve the quota message */\n clearMessages : function( ev ){\n var $target = !_.isUndefined( ev )?\n $( ev.currentTarget )\n :this.$messages().children( '[class$=\"message\"]' );\n $target = $target.not( '.quota-message' );\n $target.fadeOut( this.fxSpeed, function(){\n $( this ).remove();\n });\n return this;\n },\n\n /** Show the over quota message (which happens to be in the history panel).\n */\n showQuotaMessage : function(){\n var $msg = this.$( '.quota-message' );\n if( $msg.is( ':hidden' ) ){ $msg.slideDown( this.fxSpeed ); }\n },\n\n//TODO: this seems more like a per user message than a history message\n /** Hide the over quota message (which happens to be in the history panel).\n */\n hideQuotaMessage : function(){\n var $msg = this.$( '.quota-message' );\n if( !$msg.is( ':hidden' ) ){ $msg.slideUp( this.fxSpeed ); }\n },\n\n /** Return a string rep of the history\n */\n toString : function(){\n return 'CurrentHistoryView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//------------------------------------------------------------------------------ TEMPLATES\nCurrentHistoryView.prototype.templates = (function(){\n\n var quotaMsgTemplate = BASE_MVC.wrapTemplate([\n '
                    ',\n _l( 'You are over your disk quota' ), '. ',\n _l( 'Tool execution is on hold until your disk usage drops below your allocated quota' ), '.',\n '
                    '\n ], 'history' );\n return _.extend( _.clone( _super.prototype.templates ), {\n quotaMsg : quotaMsgTemplate\n });\n\n}());\n\n\n//==============================================================================\n return {\n CurrentHistoryView : CurrentHistoryView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-view-edit-current.js\n ** module id = 130\n ** module chunks = 3\n **/","define([\n \"mvc/history/history-view\",\n \"mvc/history/history-contents\",\n \"mvc/dataset/states\",\n \"mvc/history/hda-model\",\n \"mvc/history/hda-li-edit\",\n \"mvc/history/hdca-li-edit\",\n \"mvc/tag\",\n \"mvc/annotation\",\n \"mvc/collection/list-collection-creator\",\n \"mvc/collection/pair-collection-creator\",\n \"mvc/collection/list-of-pairs-collection-creator\",\n \"ui/fa-icon-button\",\n \"mvc/ui/popup-menu\",\n \"utils/localization\",\n \"ui/editable-text\",\n], function(\n HISTORY_VIEW,\n HISTORY_CONTENTS,\n STATES,\n HDA_MODEL,\n HDA_LI_EDIT,\n HDCA_LI_EDIT,\n TAGS,\n ANNOTATIONS,\n LIST_COLLECTION_CREATOR,\n PAIR_COLLECTION_CREATOR,\n LIST_OF_PAIRS_COLLECTION_CREATOR,\n faIconButton,\n PopupMenu,\n _l\n){\n/* =============================================================================\nTODO:\n\n============================================================================= */\nvar _super = HISTORY_VIEW.HistoryView;\n// base class for history-view-edit-current and used as-is in history/view.mako\n/** @class Editable View/Controller for the history model.\n *\n * Allows:\n * (everything HistoryView allows)\n * changing the name\n * displaying and editing tags and annotations\n * multi-selection and operations on mulitple content items\n */\nvar HistoryViewEdit = _super.extend(\n/** @lends HistoryViewEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** class to use for constructing the HistoryDatasetAssociation views */\n HDAViewClass : HDA_LI_EDIT.HDAListItemEdit,\n /** class to use for constructing the HistoryDatasetCollectionAssociation views */\n HDCAViewClass : HDCA_LI_EDIT.HDCAListItemEdit,\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events\n * @param {Object} attributes\n */\n initialize : function( attributes ){\n attributes = attributes || {};\n _super.prototype.initialize.call( this, attributes );\n\n // ---- set up instance vars\n /** editor for tags - sub-view */\n this.tagsEditor = null;\n /** editor for annotations - sub-view */\n this.annotationEditor = null;\n\n /** allow user purge of dataset files? */\n this.purgeAllowed = attributes.purgeAllowed || false;\n\n // states/modes the panel can be in\n /** is the panel currently showing the dataset selection controls? */\n this.annotationEditorShown = attributes.annotationEditorShown || false;\n this.tagsEditorShown = attributes.tagsEditorShown || false;\n },\n\n /** Override to handle history as drag-drop target */\n _setUpListeners : function(){\n var panel = this;\n _super.prototype._setUpListeners.call( panel );\n\n panel.on( 'drop', function( ev, data ){\n panel.dataDropped( data );\n // remove the drop target\n panel.dropTargetOff();\n });\n panel.on( 'view:attached view:removed', function(){\n panel._renderCounts();\n }, panel );\n },\n\n // ------------------------------------------------------------------------ listeners\n /** listening for collection events */\n _setUpCollectionListeners : function(){\n _super.prototype._setUpCollectionListeners.call( this );\n\n this.collection.on( 'change:deleted', this._handleHdaDeletionChange, this );\n this.collection.on( 'change:visible', this._handleHdaVisibleChange, this );\n this.collection.on( 'change:purged', function( model ){\n // hafta get the new nice-size w/o the purged model\n this.model.fetch();\n }, this );\n return this;\n },\n\n /** listening for history and HDA events */\n _setUpModelListeners : function(){\n _super.prototype._setUpModelListeners.call( this );\n this.model.on( 'change:size', this.updateHistoryDiskSize, this );\n return this;\n },\n\n // ------------------------------------------------------------------------ panel rendering\n /** In this override, add tag and annotation editors and a btn to toggle the selectors */\n _buildNewRender : function(){\n // create a new render using a skeleton template, render title buttons, render body, and set up events, etc.\n var $newRender = _super.prototype._buildNewRender.call( this );\n if( !this.model ){ return $newRender; }\n\n if( Galaxy && Galaxy.user && Galaxy.user.id && Galaxy.user.id === this.model.get( 'user_id' ) ){\n this._renderTags( $newRender );\n this._renderAnnotation( $newRender );\n }\n return $newRender;\n },\n\n /** override to render counts when the items are rendered */\n renderItems : function( $whereTo ){\n var views = _super.prototype.renderItems.call( this, $whereTo );\n this._renderCounts( $whereTo );\n return views;\n },\n\n /** override to show counts, what's deleted/hidden, and links to toggle those */\n _renderCounts : function( $whereTo ){\n//TODO: too complicated\n function toggleLink( _class, text ){\n return [ '', text, '' ].join( '' );\n }\n $whereTo = $whereTo || this.$el;\n var deleted = this.collection.where({ deleted: true }),\n hidden = this.collection.where({ visible: false }),\n msgs = [];\n\n if( this.views.length ){\n msgs.push( [ this.views.length, _l( 'shown' ) ].join( ' ' ) );\n }\n if( deleted.length ){\n msgs.push( ( !this.showDeleted )?\n ([ deleted.length, toggleLink( 'toggle-deleted-link', _l( 'deleted' ) ) ].join( ' ' ))\n :( toggleLink( 'toggle-deleted-link', _l( 'hide deleted' ) ) )\n );\n }\n if( hidden.length ){\n msgs.push( ( !this.showHidden )?\n ([ hidden.length, toggleLink( 'toggle-hidden-link', _l( 'hidden' ) ) ].join( ' ' ))\n :( toggleLink( 'toggle-hidden-link', _l( 'hide hidden' ) ) )\n );\n }\n return $whereTo.find( '> .controls .subtitle' ).html( msgs.join( ', ' ) );\n },\n\n /** render the tags sub-view controller */\n _renderTags : function( $where ){\n var panel = this;\n this.tagsEditor = new TAGS.TagsEditor({\n model : this.model,\n el : $where.find( '.controls .tags-display' ),\n onshowFirstTime : function(){ this.render(); },\n // show hide sub-view tag editors when this is shown/hidden\n onshow : function(){\n panel.toggleHDATagEditors( true, panel.fxSpeed );\n },\n onhide : function(){\n panel.toggleHDATagEditors( false, panel.fxSpeed );\n },\n $activator : faIconButton({\n title : _l( 'Edit history tags' ),\n classes : 'history-tag-btn',\n faIcon : 'fa-tags'\n }).appendTo( $where.find( '.controls .actions' ) )\n });\n },\n /** render the annotation sub-view controller */\n _renderAnnotation : function( $where ){\n var panel = this;\n this.annotationEditor = new ANNOTATIONS.AnnotationEditor({\n model : this.model,\n el : $where.find( '.controls .annotation-display' ),\n onshowFirstTime : function(){ this.render(); },\n // show hide sub-view view annotation editors when this is shown/hidden\n onshow : function(){\n panel.toggleHDAAnnotationEditors( true, panel.fxSpeed );\n },\n onhide : function(){\n panel.toggleHDAAnnotationEditors( false, panel.fxSpeed );\n },\n $activator : faIconButton({\n title : _l( 'Edit history annotation' ),\n classes : 'history-annotate-btn',\n faIcon : 'fa-comment'\n }).appendTo( $where.find( '.controls .actions' ) )\n });\n },\n\n /** Set up HistoryViewEdit js/widget behaviours\n * In this override, make the name editable\n */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n _super.prototype._setUpBehaviors.call( this, $where );\n if( !this.model ){ return; }\n\n // anon users shouldn't have access to any of the following\n if( ( !Galaxy.user || Galaxy.user.isAnonymous() )\n || ( Galaxy.user.id !== this.model.get( 'user_id' ) ) ){\n return;\n }\n\n var panel = this,\n nameSelector = '> .controls .name';\n $where.find( nameSelector )\n .attr( 'title', _l( 'Click to rename history' ) )\n .tooltip({ placement: 'bottom' })\n .make_text_editable({\n on_finish: function( newName ){\n var previousName = panel.model.get( 'name' );\n if( newName && newName !== previousName ){\n panel.$el.find( nameSelector ).text( newName );\n panel.model.save({ name: newName })\n .fail( function(){\n panel.$el.find( nameSelector ).text( panel.model.previous( 'name' ) );\n });\n } else {\n panel.$el.find( nameSelector ).text( previousName );\n }\n }\n });\n },\n\n /** return a new popup menu for choosing a multi selection action\n * ajax calls made for multiple datasets are queued\n */\n multiselectActions : function(){\n var panel = this,\n actions = [\n { html: _l( 'Hide datasets' ), func: function(){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype.hide;\n panel.getSelectedModels().ajaxQueue( action );\n }\n },\n { html: _l( 'Unhide datasets' ), func: function(){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype.unhide;\n panel.getSelectedModels().ajaxQueue( action );\n }\n },\n { html: _l( 'Delete datasets' ), func: function(){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype['delete'];\n panel.getSelectedModels().ajaxQueue( action );\n }\n },\n { html: _l( 'Undelete datasets' ), func: function(){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype.undelete;\n panel.getSelectedModels().ajaxQueue( action );\n }\n }\n ];\n if( panel.purgeAllowed ){\n actions.push({\n html: _l( 'Permanently delete datasets' ), func: function(){\n if( confirm( _l( 'This will permanently remove the data in your datasets. Are you sure?' ) ) ){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype.purge;\n panel.getSelectedModels().ajaxQueue( action );\n }\n }\n });\n }\n actions = actions.concat( panel._collectionActions() );\n return actions;\n },\n\n /** */\n _collectionActions : function(){\n var panel = this;\n return [\n { html: _l( 'Build Dataset List' ), func: function() {\n LIST_COLLECTION_CREATOR.createListCollection( panel.getSelectedModels() )\n .done( function(){ panel.model.refresh() });\n }\n },\n // TODO: Only show quick pair if two things selected.\n { html: _l( 'Build Dataset Pair' ), func: function() {\n PAIR_COLLECTION_CREATOR.createPairCollection( panel.getSelectedModels() )\n .done( function(){ panel.model.refresh() });\n }\n },\n { html: _l( 'Build List of Dataset Pairs' ), func: function() {\n LIST_OF_PAIRS_COLLECTION_CREATOR.createListOfPairsCollection( panel.getSelectedModels() )\n .done( function(){ panel.model.refresh() });\n }\n },\n ];\n },\n\n // ------------------------------------------------------------------------ sub-views\n // reverse HID order\n /** Override to reverse order of views - newest contents on top */\n _attachItems : function( $whereTo ){\n this.$list( $whereTo ).append( this.views.reverse().map( function( view ){\n return view.$el;\n }));\n return this;\n },\n\n /** Override to add new contents at the top */\n _attachView : function( view ){\n var panel = this;\n // override to control where the view is added, how/whether it's rendered\n panel.views.unshift( view );\n panel.$list().prepend( view.render( 0 ).$el.hide() );\n panel.trigger( 'view:attached', view );\n view.$el.slideDown( panel.fxSpeed, function(){\n panel.trigger( 'view:attached:rendered' );\n });\n },\n\n /** In this override, add purgeAllowed and whether tags/annotation editors should be shown */\n _getItemViewOptions : function( model ){\n var options = _super.prototype._getItemViewOptions.call( this, model );\n _.extend( options, {\n purgeAllowed : this.purgeAllowed,\n//TODO: not working\n tagsEditorShown : ( this.tagsEditor && !this.tagsEditor.hidden ),\n annotationEditorShown : ( this.annotationEditor && !this.annotationEditor.hidden )\n });\n return options;\n },\n\n ///** Override to alter data in drag based on multiselection */\n //_setUpItemViewListeners : function( view ){\n // var panel = this;\n // _super.prototype._setUpItemViewListeners.call( panel, view );\n //\n //},\n\n /** If this item is deleted and we're not showing deleted items, remove the view\n * @param {Model} the item model to check\n */\n _handleHdaDeletionChange : function( itemModel ){\n if( itemModel.get( 'deleted' ) && !this.showDeleted ){\n this.removeItemView( itemModel );\n }\n this._renderCounts();\n },\n\n /** If this item is hidden and we're not showing hidden items, remove the view\n * @param {Model} the item model to check\n */\n _handleHdaVisibleChange : function( itemModel ){\n if( itemModel.hidden() && !this.showHidden ){\n this.removeItemView( itemModel );\n }\n this._renderCounts();\n },\n\n /** toggle the visibility of each content's tagsEditor applying all the args sent to this function */\n toggleHDATagEditors : function( showOrHide ){\n var args = Array.prototype.slice.call( arguments, 1 );\n _.each( this.views, function( view ){\n if( view.tagsEditor ){\n view.tagsEditor.toggle.apply( view.tagsEditor, args );\n }\n });\n },\n\n /** toggle the visibility of each content's annotationEditor applying all the args sent to this function */\n toggleHDAAnnotationEditors : function( showOrHide ){\n var args = Array.prototype.slice.call( arguments, 1 );\n _.each( this.views, function( view ){\n if( view.annotationEditor ){\n view.annotationEditor.toggle.apply( view.annotationEditor, args );\n }\n });\n },\n\n // ------------------------------------------------------------------------ panel events\n /** event map */\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .show-selectors-btn' : 'toggleSelectors',\n 'click .toggle-deleted-link' : function( ev ){ this.toggleShowDeleted(); },\n 'click .toggle-hidden-link' : function( ev ){ this.toggleShowHidden(); }\n }),\n\n /** Update the history size display (curr. upper right of panel).\n */\n updateHistoryDiskSize : function(){\n this.$el.find( '.history-size' ).text( this.model.get( 'nice_size' ) );\n },\n\n // ------------------------------------------------------------------------ as drop target\n /** */\n dropTargetOn : function(){\n if( this.dropTarget ){ return this; }\n this.dropTarget = true;\n\n //TODO: to init\n var dropHandlers = {\n 'dragenter' : _.bind( this.dragenter, this ),\n 'dragover' : _.bind( this.dragover, this ),\n 'dragleave' : _.bind( this.dragleave, this ),\n 'drop' : _.bind( this.drop, this )\n };\n//TODO: scroll to top\n var $dropTarget = this._renderDropTarget();\n this.$list().before([ this._renderDropTargetHelp(), $dropTarget ]);\n for( var evName in dropHandlers ){\n if( dropHandlers.hasOwnProperty( evName ) ){\n //console.debug( evName, dropHandlers[ evName ] );\n $dropTarget.on( evName, dropHandlers[ evName ] );\n }\n }\n return this;\n },\n\n /** */\n _renderDropTarget : function(){\n this.$( '.history-drop-target' ).remove();\n return $( '
                    ' ).addClass( 'history-drop-target' )\n .css({\n 'height': '64px',\n 'margin': '0px 10px 10px 10px',\n 'border': '1px dashed black',\n 'border-radius' : '3px'\n });\n },\n\n /** */\n _renderDropTargetHelp : function(){\n this.$( '.history-drop-target-help' ).remove();\n return $( '
                    ' ).addClass( 'history-drop-target-help' )\n .css({\n 'margin' : '10px 10px 4px 10px',\n 'color' : 'grey',\n 'font-size' : '80%',\n 'font-style' : 'italic'\n })\n .text( _l( 'Drag datasets here to copy them to the current history' ) );\n },\n\n /** */\n dropTargetOff : function(){\n if( !this.dropTarget ){ return this; }\n //this.log( 'dropTargetOff' );\n this.dropTarget = false;\n var dropTarget = this.$( '.history-drop-target' ).get(0);\n for( var evName in this._dropHandlers ){\n if( this._dropHandlers.hasOwnProperty( evName ) ){\n dropTarget.off( evName, this._dropHandlers[ evName ] );\n }\n }\n this.$( '.history-drop-target' ).remove();\n this.$( '.history-drop-target-help' ).remove();\n return this;\n },\n /** */\n dropTargetToggle : function(){\n if( this.dropTarget ){\n this.dropTargetOff();\n } else {\n this.dropTargetOn();\n }\n return this;\n },\n\n /** */\n dragenter : function( ev ){\n //console.debug( 'dragenter:', this, ev );\n ev.preventDefault();\n ev.stopPropagation();\n this.$( '.history-drop-target' ).css( 'border', '2px solid black' );\n },\n /** */\n dragover : function( ev ){\n ev.preventDefault();\n ev.stopPropagation();\n },\n /** */\n dragleave : function( ev ){\n //console.debug( 'dragleave:', this, ev );\n ev.preventDefault();\n ev.stopPropagation();\n this.$( '.history-drop-target' ).css( 'border', '1px dashed black' );\n },\n /** */\n drop : function( ev ){\n ev.preventDefault();\n //ev.stopPropagation();\n\n var dataTransfer = ev.originalEvent.dataTransfer;\n dataTransfer.dropEffect = 'move';\n\n var panel = this,\n data = dataTransfer.getData( \"text\" );\n try {\n data = JSON.parse( data );\n\n } catch( err ){\n this.warn( 'error parsing JSON from drop:', data );\n }\n this.trigger( 'droptarget:drop', ev, data, panel );\n return false;\n },\n\n /** */\n dataDropped : function( data ){\n var panel = this;\n // HDA: dropping will copy it to the history\n if( _.isObject( data ) && data.model_class === 'HistoryDatasetAssociation' && data.id ){\n return panel.model.contents.copy( data.id );\n }\n return jQuery.when();\n },\n\n // ........................................................................ misc\n /** Return a string rep of the history */\n toString : function(){\n return 'HistoryViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n//==============================================================================\n return {\n HistoryViewEdit : HistoryViewEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-view-edit.js\n ** module id = 131\n ** module chunks = 3\n **/","define([\n \"mvc/list/list-view\",\n \"mvc/history/history-model\",\n \"mvc/history/history-contents\",\n \"mvc/history/hda-li\",\n \"mvc/history/hdca-li\",\n \"mvc/user/user-model\",\n \"ui/fa-icon-button\",\n \"mvc/ui/popup-menu\",\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/search-input\"\n], function(\n LIST_VIEW,\n HISTORY_MODEL,\n HISTORY_CONTENTS,\n HDA_LI,\n HDCA_LI,\n USER,\n faIconButton,\n PopupMenu,\n BASE_MVC,\n _l\n){\n\nvar logNamespace = 'history';\n\n// ============================================================================\n/** session storage for individual history preferences */\nvar HistoryPrefs = BASE_MVC.SessionStorageModel.extend(\n/** @lends HistoryPrefs.prototype */{\n//TODO:?? possibly mark as current T/F - have History.currId() (a class method) return that value\n defaults : {\n//TODO:?? expandedIds to array?\n expandedIds : {},\n //TODO:?? move to user?\n show_deleted : false,\n show_hidden : false\n //TODO: add scroll position?\n },\n /** add an hda id to the hash of expanded hdas */\n addExpanded : function( model ){\n var key = 'expandedIds';\n//TODO:?? is this right anymore?\n this.save( key, _.extend( this.get( key ), _.object([ model.id ], [ model.get( 'id' ) ]) ) );\n },\n /** remove an hda id from the hash of expanded hdas */\n removeExpanded : function( model ){\n var key = 'expandedIds';\n this.save( key, _.omit( this.get( key ), model.id ) );\n },\n toString : function(){\n return 'HistoryPrefs(' + this.id + ')';\n }\n});\n// class lvl for access w/o instantiation\nHistoryPrefs.storageKeyPrefix = 'history:';\n\n/** key string to store each histories settings under */\nHistoryPrefs.historyStorageKey = function historyStorageKey( historyId ){\n if( !historyId ){\n throw new Error( 'HistoryPrefs.historyStorageKey needs valid id: ' + historyId );\n }\n // single point of change\n return ( HistoryPrefs.storageKeyPrefix + historyId );\n};\n/** return the existing storage for the history with the given id (or create one if it doesn't exist) */\nHistoryPrefs.get = function get( historyId ){\n return new HistoryPrefs({ id: HistoryPrefs.historyStorageKey( historyId ) });\n};\n/** clear all history related items in sessionStorage */\nHistoryPrefs.clearAll = function clearAll( historyId ){\n for( var key in sessionStorage ){\n if( key.indexOf( HistoryPrefs.storageKeyPrefix ) === 0 ){\n sessionStorage.removeItem( key );\n }\n }\n};\n\n\n/* =============================================================================\nTODO:\n\n============================================================================= */\n/** @class non-editable, read-only View/Controller for a history model.\n * Allows:\n * changing the loaded history\n * displaying data, info, and download\n * tracking history attrs: size, tags, annotations, name, etc.\n * Does not allow:\n * changing the name\n */\nvar _super = LIST_VIEW.ModelListPanel;\nvar HistoryView = _super.extend(\n/** @lends HistoryView.prototype */{\n _logNamespace : logNamespace,\n\n /** class to use for constructing the HDA views */\n HDAViewClass : HDA_LI.HDAListItemView,\n /** class to use for constructing the HDCA views */\n HDCAViewClass : HDCA_LI.HDCAListItemView,\n /** class to used for constructing collection of sub-view models */\n collectionClass : HISTORY_CONTENTS.HistoryContents,\n /** key of attribute in model to assign to this.collection */\n modelCollectionKey : 'contents',\n\n tagName : 'div',\n className : _super.prototype.className + ' history-panel',\n\n /** string to display when the collection is empty */\n emptyMsg : _l( 'This history is empty' ),\n /** displayed when no items match the search terms */\n noneFoundMsg : _l( 'No matching datasets found' ),\n /** string used for search placeholder */\n searchPlaceholder : _l( 'search datasets' ),\n\n // ......................................................................... SET UP\n /** Set up the view, bind listeners.\n * @param {Object} attributes optional settings for the panel\n */\n initialize : function( attributes ){\n _super.prototype.initialize.call( this, attributes );\n // ---- instance vars\n // control contents/behavior based on where (and in what context) the panel is being used\n /** where should pages from links be displayed? (default to new tab/window) */\n this.linkTarget = attributes.linkTarget || '_blank';\n },\n\n /** In this override, clear the update timer on the model */\n freeModel : function(){\n _super.prototype.freeModel.call( this );\n//TODO: move to History.free()\n if( this.model ){\n this.model.clearUpdateTimeout();\n }\n return this;\n },\n\n /** create any event listeners for the panel\n * @fires: rendered:initial on the first render\n * @fires: empty-history when switching to a history with no contents or creating a new history\n */\n _setUpListeners : function(){\n _super.prototype._setUpListeners.call( this );\n this.on({\n error : function( model, xhr, options, msg, details ){\n this.errorHandler( model, xhr, options, msg, details );\n },\n 'loading-done' : function(){\n //TODO:?? if( this.collection.length ){\n if( !this.views.length ){\n this.trigger( 'empty-history', this );\n }\n },\n 'views:ready view:attached view:removed' : function( view ){\n this._renderSelectButton();\n }\n });\n // this.on( 'all', function(){ console.debug( arguments ); });\n },\n\n // ------------------------------------------------------------------------ loading history/hda models\n //NOTE: all the following fns replace the existing history model with a new model\n // (in the following 'details' refers to the full set of contents api data (urls, display_apps, misc_info, etc.)\n // - contents w/o details will have summary data only (name, hid, deleted, visible, state, etc.))\n//TODO: too tangled...\n\n /** loads a history & contents, getting details of any contents whose ids are stored in sessionStorage\n * (but does not make them the current history)\n */\n loadHistoryWithDetails : function( historyId, attributes, historyFn, contentsFn ){\n this.info( 'loadHistoryWithDetails:', historyId, attributes, historyFn, contentsFn );\n var detailIdsFn = function( historyData ){\n // will be called to get content ids that need details from the api\n//TODO:! non-visible contents are getting details loaded... either stop loading them at all or filter ids thru isVisible\n return _.values( HistoryPrefs.get( historyData.id ).get( 'expandedIds' ) );\n };\n return this.loadHistory( historyId, attributes, historyFn, contentsFn, detailIdsFn );\n },\n\n /** loads a history & contents (but does not make them the current history) */\n loadHistory : function( historyId, attributes, historyFn, contentsFn, detailIdsFn ){\n this.info( 'loadHistory:', historyId, attributes, historyFn, contentsFn, detailIdsFn );\n var panel = this;\n attributes = attributes || {};\n\n panel.trigger( 'loading', panel );\n //this.info( 'loadHistory:', historyId, attributes, historyFn, contentsFn, detailIdsFn );\n var xhr = HISTORY_MODEL.History.getHistoryData( historyId, {\n historyFn : historyFn,\n contentsFn : contentsFn,\n detailIdsFn : attributes.initiallyExpanded || detailIdsFn\n });\n\n return panel._loadHistoryFromXHR( xhr, attributes )\n .fail( function( xhr, where, history ){\n // throw an error up for the error handler\n panel.trigger( 'error', panel, xhr, attributes, _l( 'An error was encountered while ' + where ),\n { historyId: historyId, history: history || {} });\n })\n .always( function(){\n // bc _hideLoadingIndicator relies on this firing\n panel.trigger( 'loading-done', panel );\n });\n },\n\n /** given an xhr that will provide both history and contents data, pass data to set model or handle xhr errors */\n _loadHistoryFromXHR : function( xhr, attributes ){\n var panel = this;\n xhr.then( function( historyJSON, contentsJSON ){\n panel.JSONToModel( historyJSON, contentsJSON, attributes );\n panel.render();\n });\n xhr.fail( function( xhr, where ){\n // render anyways - whether we get a model or not\n panel.render();\n });\n return xhr;\n },\n\n /** convenience alias to the model. Updates the item list only (not the history) */\n refreshContents : function( detailIds, options ){\n if( this.model ){\n return this.model.refresh( detailIds, options );\n }\n // may have callbacks - so return an empty promise\n return $.when();\n },\n\n//TODO:?? seems unneccesary\n//TODO: Maybe better in History?\n /** create a new history model from JSON and call setModel on it */\n JSONToModel : function( newHistoryJSON, newHdaJSON, attributes ){\n this.log( 'JSONToModel:', newHistoryJSON, newHdaJSON, attributes );\n attributes = attributes || {};\n //this.log( 'JSONToModel:', newHistoryJSON, newHdaJSON.length, attributes );\n\n var model = new HISTORY_MODEL.History( newHistoryJSON, newHdaJSON, attributes );\n//TODO:?? here?\n this.setModel( model );\n return model;\n },\n\n /** release/free/shutdown old models and set up panel for new models\n * @fires new-model with the panel as parameter\n */\n setModel : function( model, attributes ){\n attributes = attributes || {};\n _super.prototype.setModel.call( this, model, attributes );\n if( this.model ){\n this._setUpWebStorage( attributes.initiallyExpanded, attributes.show_deleted, attributes.show_hidden );\n }\n },\n\n // ------------------------------------------------------------------------ browser stored prefs\n /** Set up client side storage. Currently PersistanStorage keyed under 'history:'\n * @param {Object} initiallyExpanded\n * @param {Boolean} show_deleted whether to show deleted contents (overrides stored)\n * @param {Boolean} show_hidden\n * @see PersistentStorage\n */\n _setUpWebStorage : function( initiallyExpanded, show_deleted, show_hidden ){\n //if( !this.model ){ return this; }\n //this.log( '_setUpWebStorage', initiallyExpanded, show_deleted, show_hidden );\n if( this.storage ){\n this.stopListening( this.storage );\n }\n\n this.storage = new HistoryPrefs({\n id: HistoryPrefs.historyStorageKey( this.model.get( 'id' ) )\n });\n\n // expandedIds is a map of content.ids -> a boolean repr'ing whether that item's body is already expanded\n // store any pre-expanded ids passed in\n if( _.isObject( initiallyExpanded ) ){\n this.storage.set( 'expandedIds', initiallyExpanded );\n }\n\n // get the show_deleted/hidden settings giving priority to values passed in, using web storage otherwise\n // if the page has specifically requested show_deleted/hidden, these will be either true or false\n // (as opposed to undefined, null) - and we give priority to that setting\n if( _.isBoolean( show_deleted ) ){\n this.storage.set( 'show_deleted', show_deleted );\n }\n if( _.isBoolean( show_hidden ) ){\n this.storage.set( 'show_hidden', show_hidden );\n }\n\n this.trigger( 'new-storage', this.storage, this );\n this.log( this + ' (init\\'d) storage:', this.storage.get() );\n\n this.listenTo( this.storage, {\n 'change:show_deleted' : function( view, newVal ){\n this.showDeleted = newVal;\n },\n 'change:show_hidden' : function( view, newVal ){\n this.showHidden = newVal;\n }\n }, this );\n this.showDeleted = ( show_deleted !== undefined )? show_deleted : this.storage.get( 'show_deleted' );\n this.showHidden = ( show_hidden !== undefined )? show_hidden : this.storage.get( 'show_hidden' );\n\n return this;\n },\n\n // ------------------------------------------------------------------------ panel rendering\n /** In this override, add a btn to toggle the selectors */\n _buildNewRender : function(){\n var $newRender = _super.prototype._buildNewRender.call( this );\n this._renderSelectButton( $newRender );\n return $newRender;\n },\n\n /** button for starting select mode */\n _renderSelectButton : function( $where ){\n $where = $where || this.$el;\n // do not render selector option if no actions\n if( !this.multiselectActions().length ){\n return null;\n }\n // do not render (and remove even) if nothing to select\n if( !this.views.length ){\n this.hideSelectors();\n $where.find( '.controls .actions .show-selectors-btn' ).remove();\n return null;\n }\n // don't bother rendering if there's one already\n var $existing = $where.find( '.controls .actions .show-selectors-btn' );\n if( $existing.size() ){\n return $existing;\n }\n\n return faIconButton({\n title : _l( 'Operations on multiple datasets' ),\n classes : 'show-selectors-btn',\n faIcon : 'fa-check-square-o'\n }).prependTo( $where.find( '.controls .actions' ) );\n },\n\n // ------------------------------------------------------------------------ sub-views\n /** In this override, since history contents are mixed,\n * get the appropo view class based on history_content_type\n */\n _getItemViewClass : function( model ){\n var contentType = model.get( \"history_content_type\" );\n switch( contentType ){\n case 'dataset':\n return this.HDAViewClass;\n case 'dataset_collection':\n return this.HDCAViewClass;\n }\n throw new TypeError( 'Unknown history_content_type: ' + contentType );\n },\n\n /** in this override, check if the contents would also display based on show_deleted/hidden */\n _filterItem : function( model ){\n var panel = this;\n return ( _super.prototype._filterItem.call( panel, model )\n && ( !model.hidden() || panel.showHidden )\n && ( !model.isDeletedOrPurged() || panel.showDeleted ) );\n },\n\n /** in this override, add a linktarget, and expand if id is in web storage */\n _getItemViewOptions : function( model ){\n var options = _super.prototype._getItemViewOptions.call( this, model );\n return _.extend( options, {\n linkTarget : this.linkTarget,\n expanded : !!this.storage.get( 'expandedIds' )[ model.id ],\n hasUser : this.model.ownedByCurrUser()\n });\n },\n\n /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n _setUpItemViewListeners : function( view ){\n var panel = this;\n _super.prototype._setUpItemViewListeners.call( panel, view );\n\n //TODO:?? could use 'view:expanded' here?\n // maintain a list of items whose bodies are expanded\n view.on( 'expanded', function( v ){\n panel.storage.addExpanded( v.model );\n });\n view.on( 'collapsed', function( v ){\n panel.storage.removeExpanded( v.model );\n });\n return this;\n },\n\n // ------------------------------------------------------------------------ selection\n /** Override to correctly set the historyId of the new collection */\n getSelectedModels : function(){\n var collection = _super.prototype.getSelectedModels.call( this );\n collection.historyId = this.collection.historyId;\n return collection;\n },\n\n // ------------------------------------------------------------------------ panel events\n /** event map */\n events : _.extend( _.clone( _super.prototype.events ), {\n // toggle list item selectors\n 'click .show-selectors-btn' : 'toggleSelectors',\n // allow (error) messages to be clicked away\n 'click .messages [class$=message]' : 'clearMessages'\n }),\n\n /** Handle the user toggling the deleted visibility by:\n * (1) storing the new value in the persistent storage\n * (2) re-rendering the history\n * @returns {Boolean} new show_deleted setting\n */\n toggleShowDeleted : function( show, store ){\n show = ( show !== undefined )?( show ):( !this.showDeleted );\n store = ( store !== undefined )?( store ):( true );\n this.showDeleted = show;\n if( store ){\n this.storage.set( 'show_deleted', show );\n }\n //TODO:?? to events on storage('change:show_deleted')\n this.renderItems();\n this.trigger( 'show-deleted', show );\n return this.showDeleted;\n },\n\n /** Handle the user toggling the hidden visibility by:\n * (1) storing the new value in the persistent storage\n * (2) re-rendering the history\n * @returns {Boolean} new show_hidden setting\n */\n toggleShowHidden : function( show, store ){\n show = ( show !== undefined )?( show ):( !this.showHidden );\n store = ( store !== undefined )?( store ):( true );\n this.showHidden = show;\n if( store ){\n this.storage.set( 'show_hidden', show );\n }\n //TODO:?? to events on storage('change:show_deleted')\n this.renderItems();\n this.trigger( 'show-hidden', show );\n return this.showHidden;\n },\n\n /** On the first search, if there are no details - load them, then search */\n _firstSearch : function( searchFor ){\n var panel = this,\n inputSelector = '.history-search-input';\n this.log( 'onFirstSearch', searchFor );\n\n if( panel.model.contents.haveDetails() ){\n panel.searchItems( searchFor );\n return;\n }\n\n panel.$el.find( inputSelector ).searchInput( 'toggle-loading' );\n panel.model.contents.fetchAllDetails({ silent: true })\n .always( function(){\n panel.$el.find( inputSelector ).searchInput( 'toggle-loading' );\n })\n .done( function(){\n panel.searchItems( panel.searchFor );\n });\n },\n\n//TODO: break this out\n // ........................................................................ error handling\n /** Event handler for errors (from the panel, the history, or the history's contents)\n * @param {Model or View} model the (Backbone) source of the error\n * @param {XMLHTTPRequest} xhr any ajax obj. assoc. with the error\n * @param {Object} options the options map commonly used with bbone ajax\n * @param {String} msg optional message passed to ease error location\n * @param {Object} msg optional object containing error details\n */\n errorHandler : function( model, xhr, options, msg, details ){\n this.error( model, xhr, options, msg, details );\n\n // interrupted ajax\n if( xhr && xhr.status === 0 && xhr.readyState === 0 ){\n //TODO: gmail style 'retrying in Ns'\n\n // bad gateway\n } else if( xhr && xhr.status === 502 ){\n //TODO: gmail style 'retrying in Ns'\n\n // otherwise, show an error message inside the panel\n } else {\n // if sentry is available, attempt to get the event id\n var parsed = this._parseErrorMessage( model, xhr, options, msg, details );\n // it's possible to have a triggered error before the message container is rendered - wait for it to show\n if( !this.$messages().is( ':visible' ) ){\n this.once( 'rendered', function(){\n this.displayMessage( 'error', parsed.message, parsed.details );\n });\n } else {\n this.displayMessage( 'error', parsed.message, parsed.details );\n }\n }\n },\n\n /** Parse an error event into an Object usable by displayMessage based on the parameters\n * note: see errorHandler for more info on params\n */\n _parseErrorMessage : function( model, xhr, options, msg, details, sentryId ){\n //if( xhr.responseText ){\n // xhr.responseText = _.escape( xhr.responseText );\n //}\n var user = Galaxy.user,\n // add the args (w/ some extra info) into an obj\n parsed = {\n message : this._bePolite( msg ),\n details : {\n message : msg,\n raven : ( window.Raven && _.isFunction( Raven.lastEventId) )?\n ( Raven.lastEventId() ):( undefined ),\n agent : navigator.userAgent,\n // add ajax data from Galaxy object cache\n url : ( window.Galaxy )?( Galaxy.lastAjax.url ):( undefined ),\n data : ( window.Galaxy )?( Galaxy.lastAjax.data ):( undefined ),\n options : ( xhr )?( _.omit( options, 'xhr' ) ):( options ),\n xhr : xhr,\n source : ( _.isFunction( model.toJSON ) )?( model.toJSON() ):( model + '' ),\n user : ( user instanceof USER.User )?( user.toJSON() ):( user + '' )\n }\n };\n\n // add any extra details passed in\n _.extend( parsed.details, details || {} );\n // fancy xhr.header parsing (--> obj)\n if( xhr && _.isFunction( xhr.getAllResponseHeaders ) ){\n var responseHeaders = xhr.getAllResponseHeaders();\n responseHeaders = _.compact( responseHeaders.split( '\\n' ) );\n responseHeaders = _.map( responseHeaders, function( header ){\n return header.split( ': ' );\n });\n parsed.details.xhr.responseHeaders = _.object( responseHeaders );\n }\n return parsed;\n },\n\n /** Modify an error message to be fancy and wear a monocle. */\n _bePolite : function( msg ){\n msg = msg || _l( 'An error occurred while getting updates from the server' );\n return msg + '. ' + _l( 'Please contact a Galaxy administrator if the problem persists' ) + '.';\n },\n\n // ........................................................................ (error) messages\n /** Display a message in the top of the panel.\n * @param {String} type type of message ('done', 'error', 'warning')\n * @param {String} msg the message to display\n * @param {Object or HTML} modal contents displayed when the user clicks 'details' in the message\n */\n displayMessage : function( type, msg, details ){\n //precondition: msgContainer must have been rendered even if there's no model\n var panel = this;\n //this.log( 'displayMessage', type, msg, details );\n\n this.scrollToTop();\n var $msgContainer = this.$messages(),\n $msg = $( '
                    ' ).addClass( type + 'message' ).html( msg );\n //this.log( ' ', $msgContainer );\n\n if( !_.isEmpty( details ) ){\n var $detailsLink = $( 'Details' )\n .click( function(){\n Galaxy.modal.show( panel._messageToModalOptions( type, msg, details ) );\n return false;\n });\n $msg.append( ' ', $detailsLink );\n }\n return $msgContainer.append( $msg );\n },\n\n /** convert msg and details into modal options usable by Galaxy.modal */\n _messageToModalOptions : function( type, msg, details ){\n // only error is fleshed out here\n var panel = this,\n options = { title: 'Details' };\n if( _.isObject( details ) ){\n\n details = _.omit( details, _.functions( details ) );\n var text = JSON.stringify( details, null, ' ' ),\n pre = $( '
                    ' ).text( text );\n            options.body = $( '
                    ' ).append( pre );\n\n } else {\n options.body = $( '
                    ' ).html( details );\n }\n\n options.buttons = {\n 'Ok': function(){\n Galaxy.modal.hide();\n panel.clearMessages();\n }\n //TODO: if( type === 'error' ){ options.buttons[ 'Report this error' ] = function(){} }\n };\n return options;\n },\n\n /** Remove all messages from the panel. */\n clearMessages : function( ev ){\n var $target = !_.isUndefined( ev )?\n $( ev.currentTarget )\n :this.$messages().children( '[class$=\"message\"]' );\n $target.fadeOut( this.fxSpeed, function(){\n $( this ).remove();\n });\n return this;\n },\n\n // ........................................................................ scrolling\n /** Scrolls the panel to show the content sub-view with the given hid.\n * @param {Integer} hid the hid of item to scroll into view\n * @returns {HistoryView} the panel\n */\n scrollToHid : function( hid ){\n return this.scrollToItem( _.first( this.viewsWhereModel({ hid: hid }) ) );\n },\n\n // ........................................................................ misc\n /** Return a string rep of the history */\n toString : function(){\n return 'HistoryView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//------------------------------------------------------------------------------ TEMPLATES\nHistoryView.prototype.templates = (function(){\n\n var controlsTemplate = BASE_MVC.wrapTemplate([\n '
                    ',\n '
                    ',\n '
                    <%- history.name %>
                    ',\n '
                    ',\n '
                    ',\n '
                    <%- history.nice_size %>
                    ',\n\n '
                    ',\n\n '
                    ',\n '<% if( history.deleted && history.purged ){ %>',\n '
                    ',\n _l( 'This history has been purged and deleted' ),\n '
                    ',\n '<% } else if( history.deleted ){ %>',\n '
                    ',\n _l( 'This history has been deleted' ),\n '
                    ',\n '<% } else if( history.purged ){ %>',\n '
                    ',\n _l( 'This history has been purged' ),\n '
                    ',\n '<% } %>',\n\n '<% if( history.message ){ %>',\n // should already be localized\n '
                    messagesmall\">',\n '<%= history.message.text %>',\n '
                    ',\n '<% } %>',\n '
                    ',\n\n // add tags and annotations\n '
                    ',\n '
                    ',\n\n '
                    ',\n '
                    ',\n '
                    ',\n\n '
                    ',\n '
                    ',\n '',\n '',\n '
                    ',\n '
                    ',\n '
                    ',\n '
                    ',\n '
                    '\n ], 'history' );\n\n return _.extend( _.clone( _super.prototype.templates ), {\n controls : controlsTemplate\n });\n}());\n\n\n//==============================================================================\n return {\n HistoryView: HistoryView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-view.js\n ** module id = 132\n ** module chunks = 3\n **/","define([\n \"mvc/ui/popup-menu\",\n \"mvc/history/copy-dialog\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( PopupMenu, historyCopyDialog, BASE_MVC, _l ){\n\n\"use strict\";\n// ============================================================================\nvar menu = [\n {\n html : _l( 'History Lists' ),\n header : true\n },\n {\n html : _l( 'Saved Histories' ),\n href : 'history/list',\n },\n {\n html : _l( 'Histories Shared with Me' ),\n href : 'history/list_shared'\n },\n\n {\n html : _l( 'History Actions' ),\n header : true,\n anon : true\n },\n {\n html : _l( 'Create New' ),\n func : function() {\n if( Galaxy && Galaxy.currHistoryPanel ){\n Galaxy.currHistoryPanel.createNewHistory();\n }\n },\n },\n {\n html : _l( 'Copy History' ),\n func : function() {\n historyCopyDialog( Galaxy.currHistoryPanel.model )\n .done( function(){\n Galaxy.currHistoryPanel.loadCurrentHistory();\n });\n },\n },\n {\n html : _l( 'Share or Publish' ),\n href : 'history/sharing',\n },\n {\n html : _l( 'Show Structure' ),\n href : 'history/display_structured',\n anon : true,\n },\n {\n html : _l( 'Extract Workflow' ),\n href : 'workflow/build_from_current_history',\n },\n {\n html : _l( 'Delete' ),\n confirm : _l( 'Really delete the current history?' ),\n href : 'history/delete_current',\n },\n {\n html : _l( 'Delete Permanently' ),\n confirm : _l( 'Really delete the current history permanently? This cannot be undone.' ),\n href : 'history/delete_current?purge=True',\n purge : true,\n anon : true,\n },\n\n\n {\n html : _l( 'Dataset Actions' ),\n header : true,\n anon : true\n },\n {\n html : _l( 'Copy Datasets' ),\n href : 'dataset/copy_datasets',\n },\n {\n html : _l( 'Dataset Security' ),\n href : 'root/history_set_default_permissions',\n },\n {\n html : _l( 'Resume Paused Jobs' ),\n href : 'history/resume_paused_jobs?current=True',\n anon : true,\n },\n {\n html : _l( 'Collapse Expanded Datasets' ),\n func : function() {\n if( Galaxy && Galaxy.currHistoryPanel ){\n Galaxy.currHistoryPanel.collapseAll();\n }\n },\n },\n {\n html : _l( 'Unhide Hidden Datasets' ),\n anon : true,\n func : function() {\n if( Galaxy && Galaxy.currHistoryPanel && confirm( _l( 'Really unhide all hidden datasets?' ) ) ){\n var filtered = Galaxy.currHistoryPanel.model.contents.hidden();\n //TODO: batch\n filtered.ajaxQueue( Backbone.Model.prototype.save, { visible : true })\n .done( function(){\n Galaxy.currHistoryPanel.renderItems();\n })\n .fail( function(){\n alert( 'There was an error unhiding the datasets' );\n console.error( arguments );\n });\n }\n },\n },\n {\n html : _l( 'Delete Hidden Datasets' ),\n anon : true,\n func : function() {\n if( Galaxy && Galaxy.currHistoryPanel && confirm( _l( 'Really delete all hidden datasets?' ) ) ){\n var filtered = Galaxy.currHistoryPanel.model.contents.hidden();\n //TODO: batch\n // both delete *and* unhide them\n filtered.ajaxQueue( Backbone.Model.prototype.save, { deleted : true, visible: true })\n .done( function(){\n Galaxy.currHistoryPanel.renderItems();\n })\n .fail( function(){\n alert( 'There was an error deleting the datasets' );\n console.error( arguments );\n });\n }\n },\n },\n {\n html : _l( 'Purge Deleted Datasets' ),\n confirm : _l( 'Really delete all deleted datasets permanently? This cannot be undone.' ),\n href : 'history/purge_deleted_datasets',\n purge : true,\n anon : true,\n },\n\n\n {\n html : _l( 'Downloads' ),\n header : true\n },\n {\n html : _l( 'Export Tool Citations' ),\n href : 'history/citations',\n anon : true,\n },\n {\n html : _l( 'Export History to File' ),\n href : 'history/export_archive?preview=True',\n anon : true,\n },\n\n {\n html : _l( 'Other Actions' ),\n header : true\n },\n {\n html : _l( 'Import from File' ),\n href : 'history/import_archive',\n }\n];\n\nfunction buildMenu( isAnon, purgeAllowed, urlRoot ){\n return _.clone( menu ).filter( function( menuOption ){\n if( isAnon && !menuOption.anon ){\n return false;\n }\n if( !purgeAllowed && menuOption.purge ){\n return false;\n }\n\n //TODO:?? hard-coded galaxy_main\n if( menuOption.href ){\n menuOption.href = urlRoot + menuOption.href;\n menuOption.target = 'galaxy_main';\n }\n\n if( menuOption.confirm ){\n menuOption.func = function(){\n if( confirm( menuOption.confirm ) ){\n galaxy_main.location = menuOption.href;\n }\n };\n }\n return true;\n });\n}\n\nvar create = function( $button, options ){\n options = options || {};\n var isAnon = options.anonymous === undefined? true : options.anonymous,\n purgeAllowed = options.purgeAllowed || false,\n menu = buildMenu( isAnon, purgeAllowed, Galaxy.root );\n //console.debug( 'menu:', menu );\n return new PopupMenu( $button, menu );\n};\n\n\n// ============================================================================\n return create;\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/options-menu.js\n ** module id = 133\n ** module chunks = 3\n **/","// dependencies\ndefine(['utils/utils',\n 'mvc/upload/upload-settings',\n 'mvc/upload/upload-ftp',\n 'mvc/ui/ui-popover',\n 'mvc/ui/ui-misc',\n 'mvc/ui/ui-select',\n 'utils/uploadbox'],\n\n function( Utils,\n UploadSettings,\n UploadFtp,\n Popover,\n Ui,\n Select\n ) {\n\n// renders the composite upload row view\nreturn Backbone.View.extend({\n // states\n status_classes : {\n init : 'upload-mode fa fa-exclamation text-primary',\n ready : 'upload-mode fa fa-check text-success',\n running : 'upload-mode fa fa-spinner fa-spin',\n success : 'upload-mode fa fa-check',\n error : 'upload-mode fa fa-exclamation-triangle'\n },\n\n // initialize\n initialize: function(app, options) {\n // link app\n this.app = app;\n\n // link this\n var self = this;\n\n // create model\n this.model = options.model;\n\n // add upload row\n this.setElement(this._template(options.model));\n\n // build upload functions\n this.uploadinput = this.$el.uploadinput({\n ondragover: function() {\n if (self.model.get('enabled')) {\n self.$el.addClass('warning');\n }\n },\n ondragleave: function() {\n self.$el.removeClass('warning');\n },\n onchange: function(files) {\n if (self.model.get('status') != 'running' && files && files.length > 0) {\n self.model.reset({\n 'file_data': files[0],\n 'file_name': files[0].name,\n 'file_size': files[0].size,\n 'file_mode': files[0].mode || 'local'\n });\n self._refreshReady();\n }\n }\n });\n\n // source selection popup\n this.button_menu = new Ui.ButtonMenu({\n icon : 'fa-caret-down',\n title : 'Select',\n pull : 'left'\n });\n this.$('#source').append(this.button_menu.$el);\n this.button_menu.addMenu({\n icon : 'fa-laptop',\n title : 'Choose local file',\n onclick : function() {\n self.uploadinput.dialog();\n }\n });\n if (this.app.ftp_upload_site) {\n this.button_menu.addMenu({\n icon : 'fa-folder-open-o',\n title : 'Choose FTP file',\n onclick : function() {\n self._showFtp();\n }\n });\n }\n this.button_menu.addMenu({\n icon : 'fa-edit',\n title : 'Paste/Fetch data',\n onclick : function() {\n self.model.reset({\n 'file_mode': 'new',\n 'file_name': 'New File'\n });\n }\n });\n\n // add ftp file viewer\n this.ftp = new Popover.View({\n title : 'Choose FTP file:',\n container : this.$('#source').find('.ui-button-menu'),\n placement : 'right'\n });\n\n // append popup to settings icon\n this.settings = new Popover.View({\n title : 'Upload configuration',\n container : this.$('#settings'),\n placement : 'bottom'\n });\n\n //\n // ui events\n //\n\n // handle text editing event\n this.$('#text-content').on('change input', function(e) {\n self.model.set('url_paste', $(e.target).val());\n self.model.set('file_size', $(e.target).val().length);\n self._refreshReady();\n });\n\n // handle settings popover\n this.$('#settings').on('click' , function(e) { self._showSettings(); })\n .on('mousedown', function(e) { e.preventDefault(); });\n\n //\n // model events\n //\n this.model.on('change:percentage', function() {\n self._refreshPercentage();\n });\n this.model.on('change:status', function() {\n self._refreshStatus();\n });\n this.model.on('change:info', function() {\n self._refreshInfo();\n });\n this.model.on('change:file_name', function() {\n self._refreshFileName();\n });\n this.model.on('change:file_mode', function() {\n self._refreshMode();\n });\n this.model.on('change:file_size', function() {\n self._refreshFileSize();\n });\n this.model.on('remove', function() {\n self.remove();\n });\n this.app.collection.on('reset', function() {\n self.remove();\n });\n },\n\n // render\n render: function() {\n this.$('#file_name').html(this.model.get('file_name') || '-');\n this.$('#file_desc').html(this.model.get('file_desc') || 'Unavailable');\n this.$('#file_size').html(Utils.bytesToString (this.model.get('file_size')));\n this.$('#status').removeClass().addClass(this.status_classes.init);\n },\n\n // remove\n remove: function() {\n // call the base class remove method\n Backbone.View.prototype.remove.apply(this);\n },\n\n //\n // handle model events\n //\n\n // refresh ready or not states\n _refreshReady: function() {\n this.app.collection.each(function(model) {\n model.set('status', (model.get('file_size') > 0) && 'ready' || 'init');\n });\n },\n\n // refresh mode and e.g. show/hide textarea field\n _refreshMode: function() {\n var file_mode = this.model.get('file_mode');\n if (file_mode == 'new') {\n this.height = this.$el.height();\n this.$('#text').css({\n 'width' : this.$el.width() - 16 + 'px',\n 'top' : this.$el.height() - 8 + 'px'\n }).show();\n this.$el.height(this.$el.height() - 8 + this.$('#text').height() + 16);\n this.$('#text-content').val('').trigger('keyup');\n } else {\n this.$el.height(this.height);\n this.$('#text').hide();\n }\n },\n\n // information\n _refreshInfo: function() {\n var info = this.model.get('info');\n if (info) {\n this.$('#info-text').html('Failed: ' + info).show();\n } else {\n this.$('#info-text').hide();\n }\n },\n\n // percentage\n _refreshPercentage : function() {\n var percentage = parseInt(this.model.get('percentage'));\n if (percentage != 0) {\n this.$('.progress-bar').css({ width : percentage + '%' });\n } else {\n this.$('.progress-bar').addClass('no-transition');\n this.$('.progress-bar').css({ width : '0%' });\n this.$('.progress-bar')[0].offsetHeight;\n this.$('.progress-bar').removeClass('no-transition');\n }\n if (percentage != 100) {\n this.$('#percentage').html(percentage + '%');\n } else {\n this.$('#percentage').html('Adding to history...');\n }\n },\n\n // status\n _refreshStatus : function() {\n // identify new status\n var status = this.model.get('status');\n\n // identify symbol and reset classes\n this.$('#status').removeClass().addClass(this.status_classes[status]);\n\n // enable/disable model flag\n this.model.set('enabled', status != 'running');\n\n // enable/disable row fields\n this.$('#text-content').attr('disabled', !this.model.get('enabled'));\n\n // remove status classes\n this.$el.removeClass('success danger warning');\n\n // set status classes\n if (status == 'running' || status == 'ready') {\n this.model.set('percentage', 0);\n }\n if (status == 'running') {\n this.$('#source').find('.button').addClass('disabled');\n } else {\n this.$('#source').find('.button').removeClass('disabled');\n }\n if (status == 'success') {\n this.$el.addClass('success');\n this.model.set('percentage', 100);\n this.$('#percentage').html('100%');\n }\n if (status == 'error') {\n this.$el.addClass('danger');\n this.model.set('percentage', 0);\n this.$('#info-progress').hide();\n this.$('#info-text').show();\n } else {\n this.$('#info-progress').show();\n this.$('#info-text').hide();\n }\n },\n\n // file name\n _refreshFileName: function() {\n this.$('#file_name').html(this.model.get('file_name') || '-');\n },\n\n // file size\n _refreshFileSize: function() {\n this.$('#file_size').html(Utils.bytesToString (this.model.get('file_size')));\n },\n\n // show/hide ftp popup\n _showFtp: function() {\n if (!this.ftp.visible) {\n this.ftp.empty();\n var self = this;\n this.ftp.append((new UploadFtp({\n ftp_upload_site: this.app.ftp_upload_site,\n onchange: function(ftp_file) {\n self.ftp.hide();\n if (self.model.get('status') != 'running' && ftp_file) {\n self.model.reset({\n 'file_mode': 'ftp',\n 'file_name': ftp_file.path,\n 'file_size': ftp_file.size,\n 'file_path': ftp_file.path\n });\n self._refreshReady();\n }\n }\n })).$el);\n this.ftp.show();\n } else {\n this.ftp.hide();\n }\n },\n\n // show/hide settings popup\n _showSettings : function() {\n if (!this.settings.visible) {\n this.settings.empty();\n this.settings.append((new UploadSettings(this)).$el);\n this.settings.show();\n } else {\n this.settings.hide();\n }\n },\n\n // template\n _template: function(options) {\n return '' +\n '' +\n '
                    ' +\n '
                    ' +\n '
                    ' +\n '
                    You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.
                    ' +\n '';\n\t } else {\n\t return '';\n\t }\n\t }\n\t });\n\t\n\t /** Creates a hidden element input field used e.g. in the tool form */\n\t var Hidden = Backbone.View.extend({\n\t initialize : function(options) {\n\t this.options = options;\n\t this.setElement(this._template(this.options));\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t },\n\t value : function (new_val) {\n\t if (new_val !== undefined) {\n\t this.$('hidden').val(new_val);\n\t }\n\t return this.$('hidden').val();\n\t },\n\t _template: function(options) {\n\t var tmpl = '
                    ';\n\t if (options.info) {\n\t tmpl += '
                    ' + options.info + '
                    ';\n\t }\n\t tmpl += '' +\n\t '
                    ';\n\t return tmpl;\n\t }\n\t });\n\t\n\t return {\n\t Anchor : Anchor,\n\t Button : Buttons.ButtonDefault,\n\t ButtonIcon : Buttons.ButtonIcon,\n\t ButtonCheck : Buttons.ButtonCheck,\n\t ButtonMenu : Buttons.ButtonMenu,\n\t ButtonLink : Buttons.ButtonLink,\n\t Icon : Icon,\n\t Image : Image,\n\t Input : Input,\n\t Label : Label,\n\t Message : Message,\n\t Modal : Modal,\n\t RadioButton : Options.RadioButton,\n\t Checkbox : Options.Checkbox,\n\t Radio : Options.Radio,\n\t Searchbox : Searchbox,\n\t Select : Select,\n\t Hidden : Hidden,\n\t Slider : Slider,\n\t Drilldown : Drilldown\n\t }\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.extend = extend;\n\texports.indexOf = indexOf;\n\texports.escapeExpression = escapeExpression;\n\texports.isEmpty = isEmpty;\n\texports.createFrame = createFrame;\n\texports.blockParams = blockParams;\n\texports.appendContextPath = appendContextPath;\n\tvar escape = {\n\t '&': '&',\n\t '<': '<',\n\t '>': '>',\n\t '\"': '"',\n\t \"'\": ''',\n\t '`': '`',\n\t '=': '='\n\t};\n\t\n\tvar badChars = /[&<>\"'`=]/g,\n\t possible = /[&<>\"'`=]/;\n\t\n\tfunction escapeChar(chr) {\n\t return escape[chr];\n\t}\n\t\n\tfunction extend(obj /* , ...source */) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t for (var key in arguments[i]) {\n\t if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n\t obj[key] = arguments[i][key];\n\t }\n\t }\n\t }\n\t\n\t return obj;\n\t}\n\t\n\tvar toString = Object.prototype.toString;\n\t\n\texports.toString = toString;\n\t// Sourced from lodash\n\t// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n\t/* eslint-disable func-style */\n\tvar isFunction = function isFunction(value) {\n\t return typeof value === 'function';\n\t};\n\t// fallback for older versions of Chrome and Safari\n\t/* istanbul ignore next */\n\tif (isFunction(/x/)) {\n\t exports.isFunction = isFunction = function (value) {\n\t return typeof value === 'function' && toString.call(value) === '[object Function]';\n\t };\n\t}\n\texports.isFunction = isFunction;\n\t\n\t/* eslint-enable func-style */\n\t\n\t/* istanbul ignore next */\n\tvar isArray = Array.isArray || function (value) {\n\t return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n\t};\n\t\n\texports.isArray = isArray;\n\t// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\t\n\tfunction indexOf(array, value) {\n\t for (var i = 0, len = array.length; i < len; i++) {\n\t if (array[i] === value) {\n\t return i;\n\t }\n\t }\n\t return -1;\n\t}\n\t\n\tfunction escapeExpression(string) {\n\t if (typeof string !== 'string') {\n\t // don't escape SafeStrings, since they're already safe\n\t if (string && string.toHTML) {\n\t return string.toHTML();\n\t } else if (string == null) {\n\t return '';\n\t } else if (!string) {\n\t return string + '';\n\t }\n\t\n\t // Force a string conversion as this will be done by the append regardless and\n\t // the regex test will do this transparently behind the scenes, causing issues if\n\t // an object's to string has escaped characters in it.\n\t string = '' + string;\n\t }\n\t\n\t if (!possible.test(string)) {\n\t return string;\n\t }\n\t return string.replace(badChars, escapeChar);\n\t}\n\t\n\tfunction isEmpty(value) {\n\t if (!value && value !== 0) {\n\t return true;\n\t } else if (isArray(value) && value.length === 0) {\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t}\n\t\n\tfunction createFrame(object) {\n\t var frame = extend({}, object);\n\t frame._parent = object;\n\t return frame;\n\t}\n\t\n\tfunction blockParams(params, ids) {\n\t params.path = ids;\n\t return params;\n\t}\n\t\n\tfunction appendContextPath(contextPath, id) {\n\t return (contextPath ? contextPath + '.' : '') + id;\n\t}\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxJQUFNLE1BQU0sR0FBRztBQUNiLEtBQUcsRUFBRSxPQUFPO0FBQ1osS0FBRyxFQUFFLE1BQU07QUFDWCxLQUFHLEVBQUUsTUFBTTtBQUNYLEtBQUcsRUFBRSxRQUFRO0FBQ2IsS0FBRyxFQUFFLFFBQVE7QUFDYixLQUFHLEVBQUUsUUFBUTtBQUNiLEtBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQzs7QUFFRixJQUFNLFFBQVEsR0FBRyxZQUFZO0lBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUM7O0FBRTdCLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN2QixTQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQjs7QUFFTSxTQUFTLE1BQU0sQ0FBQyxHQUFHLG9CQUFtQjtBQUMzQyxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxTQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1QixVQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDM0QsV0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUM5QjtLQUNGO0dBQ0Y7O0FBRUQsU0FBTyxHQUFHLENBQUM7Q0FDWjs7QUFFTSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0FBS2hELElBQUksVUFBVSxHQUFHLG9CQUFTLEtBQUssRUFBRTtBQUMvQixTQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDOzs7QUFHRixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNuQixVQUlNLFVBQVUsR0FKaEIsVUFBVSxHQUFHLFVBQVMsS0FBSyxFQUFFO0FBQzNCLFdBQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssbUJBQW1CLENBQUM7R0FDcEYsQ0FBQztDQUNIO1FBQ08sVUFBVSxHQUFWLFVBQVU7Ozs7O0FBSVgsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxVQUFTLEtBQUssRUFBRTtBQUN0RCxTQUFPLEFBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUNqRyxDQUFDOzs7OztBQUdLLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDcEMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxRQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDdEIsYUFBTyxDQUFDLENBQUM7S0FDVjtHQUNGO0FBQ0QsU0FBTyxDQUFDLENBQUMsQ0FBQztDQUNYOztBQUdNLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLE1BQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFOztBQUU5QixRQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQzNCLGFBQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ3hCLE1BQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3pCLGFBQU8sRUFBRSxDQUFDO0tBQ1gsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2xCLGFBQU8sTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUNwQjs7Ozs7QUFLRCxVQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUN0Qjs7QUFFRCxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUFFLFdBQU8sTUFBTSxDQUFDO0dBQUU7QUFDOUMsU0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztDQUM3Qzs7QUFFTSxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDN0IsTUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLFdBQU8sSUFBSSxDQUFDO0dBQ2IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxXQUFPLElBQUksQ0FBQztHQUNiLE1BQU07QUFDTCxXQUFPLEtBQUssQ0FBQztHQUNkO0NBQ0Y7O0FBRU0sU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0FBQ2xDLE1BQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0IsT0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDdkIsU0FBTyxLQUFLLENBQUM7Q0FDZDs7QUFFTSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLFFBQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLFNBQU8sTUFBTSxDQUFDO0NBQ2Y7O0FBRU0sU0FBUyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO0FBQ2pELFNBQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUEsR0FBSSxFQUFFLENBQUM7Q0FDcEQiLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIl19\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\t\n\tfunction Exception(message, node) {\n\t var loc = node && node.loc,\n\t line = undefined,\n\t column = undefined;\n\t if (loc) {\n\t line = loc.start.line;\n\t column = loc.start.column;\n\t\n\t message += ' - ' + line + ':' + column;\n\t }\n\t\n\t var tmp = Error.prototype.constructor.call(this, message);\n\t\n\t // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n\t for (var idx = 0; idx < errorProps.length; idx++) {\n\t this[errorProps[idx]] = tmp[errorProps[idx]];\n\t }\n\t\n\t /* istanbul ignore else */\n\t if (Error.captureStackTrace) {\n\t Error.captureStackTrace(this, Exception);\n\t }\n\t\n\t if (loc) {\n\t this.lineNumber = line;\n\t this.column = column;\n\t }\n\t}\n\t\n\tException.prototype = new Error();\n\t\n\texports['default'] = Exception;\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsSUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbkcsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUNoQyxNQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7TUFDdEIsSUFBSSxZQUFBO01BQ0osTUFBTSxZQUFBLENBQUM7QUFDWCxNQUFJLEdBQUcsRUFBRTtBQUNQLFFBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN0QixVQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBRTFCLFdBQU8sSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDeEM7O0FBRUQsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7O0FBRzFELE9BQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ2hELFFBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDOUM7OztBQUdELE1BQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO0FBQzNCLFNBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDMUM7O0FBRUQsTUFBSSxHQUFHLEVBQUU7QUFDUCxRQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUN2QixRQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztHQUN0QjtDQUNGOztBQUVELFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQzs7cUJBRW5CLFNBQVMiLCJmaWxlIjoiZXhjZXB0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2snXTtcblxuZnVuY3Rpb24gRXhjZXB0aW9uKG1lc3NhZ2UsIG5vZGUpIHtcbiAgbGV0IGxvYyA9IG5vZGUgJiYgbm9kZS5sb2MsXG4gICAgICBsaW5lLFxuICAgICAgY29sdW1uO1xuICBpZiAobG9jKSB7XG4gICAgbGluZSA9IGxvYy5zdGFydC5saW5lO1xuICAgIGNvbHVtbiA9IGxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjtcbiAgfVxuXG4gIGxldCB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay5cbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1wW2Vycm9yUHJvcHNbaWR4XV07XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG5cbiAgaWYgKGxvYykge1xuICAgIHRoaXMubGluZU51bWJlciA9IGxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gIH1cbn1cblxuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnQgZGVmYXVsdCBFeGNlcHRpb247XG4iXX0=\n\n\n/***/ },\n/* 10 */,\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\tvar View = Backbone.View.extend({\n\t visible : false,\n\t initialize : function( options ) {\n\t var self = this;\n\t this.options = Utils.merge( options, {\n\t id : Utils.uid(),\n\t title : '',\n\t icon : '',\n\t buttons : null,\n\t body : null,\n\t scrollable : true,\n\t nopadding : false,\n\t operations : null,\n\t placement : 'bottom',\n\t cls : 'ui-portlet',\n\t operations_flt : 'right',\n\t collapsible : false,\n\t collapsed : false\n\t });\n\t this.setElement( this._template( this.options ) );\n\t\n\t // link content\n\t this.$body = this.$( '.portlet-body' );\n\t this.$title = this.$( '.portlet-title-text' );\n\t this.$header = this.$( '.portlet-header' );\n\t this.$content = this.$( '.portlet-content' );\n\t this.$footer = this.$( '.portlet-footer' );\n\t\n\t // set content padding\n\t if ( this.options.nopadding ) {\n\t this.$content.css( 'padding', '0px' );\n\t this.$body.css( 'padding', '0px' );\n\t }\n\t\n\t // append buttons\n\t this.$buttons = this.$( '.portlet-buttons' );\n\t if ( this.options.buttons ) {\n\t $.each( this.options.buttons, function( name, item ) {\n\t item.$el.prop( 'id', name );\n\t self.$buttons.append( item.$el );\n\t });\n\t } else {\n\t this.$buttons.remove();\n\t }\n\t\n\t // append operations\n\t this.$operations = this.$( '.portlet-operations' );\n\t if ( this.options.operations ) {\n\t $.each( this.options.operations, function( name, item ) {\n\t item.$el.prop( 'id', name );\n\t self.$operations.append( item.$el );\n\t });\n\t }\n\t\n\t // add body\n\t this.options.body && this.append( this.options.body );\n\t\n\t // make portlet collapsible\n\t this.collapsed = false;\n\t if ( this.options.collapsible ) {\n\t this.$title.addClass( 'no-highlight' ).css({\n\t 'cursor' : 'pointer',\n\t 'text-decoration' : 'underline'\n\t });\n\t this.$title.on( 'click', function() {\n\t if ( self.collapsed ) { self.expand(); } else { self.collapse(); }\n\t });\n\t this.options.collapsed && this.collapse();\n\t }\n\t },\n\t\n\t // append\n\t append: function( $el ) {\n\t this.$body.append( $el );\n\t },\n\t\n\t // remove all content\n\t empty: function() {\n\t this.$body.empty();\n\t },\n\t\n\t // header\n\t header: function() {\n\t return this.$header;\n\t },\n\t\n\t // body\n\t body: function() {\n\t return this.$body;\n\t },\n\t\n\t // footer\n\t footer: function() {\n\t return this.$footer;\n\t },\n\t\n\t // show\n\t show: function(){\n\t this.visible = true;\n\t this.$el.fadeIn( 'fast' );\n\t },\n\t\n\t // hide\n\t hide: function(){\n\t this.visible = false;\n\t this.$el.fadeOut( 'fast' );\n\t },\n\t\n\t // enable buttons\n\t enableButton: function( id ) {\n\t this.$buttons.find( '#' + id ).prop( 'disabled', false );\n\t },\n\t\n\t // disable buttons\n\t disableButton: function( id ) {\n\t this.$buttons.find( '#' + id ).prop( 'disabled', true );\n\t },\n\t\n\t // hide operation\n\t hideOperation: function( id ) {\n\t this.$operations.find( '#' + id ).hide();\n\t },\n\t\n\t // show operation\n\t showOperation: function( id ) {\n\t this.$operations.find( '#' + id ).show();\n\t },\n\t\n\t // set operation\n\t setOperation: function( id, callback ) {\n\t var $el = this.$operations.find( '#' + id );\n\t $el.off( 'click' );\n\t $el.on( 'click', callback );\n\t },\n\t\n\t // title\n\t title: function( new_title ) {\n\t var $el = this.$title;\n\t if ( new_title ) {\n\t $el.html( new_title );\n\t }\n\t return $el.html();\n\t },\n\t\n\t // collapse portlet\n\t collapse: function() {\n\t this.collapsed = true;\n\t this.$content.height( '0%' );\n\t this.$body.hide();\n\t this.$footer.hide();\n\t this.trigger( 'collapsed' );\n\t },\n\t\n\t // expand portlet\n\t expand: function() {\n\t this.collapsed = false;\n\t this.$content.height( '100%' );\n\t this.$body.fadeIn( 'fast' );\n\t this.$footer.fadeIn( 'fast' );\n\t this.trigger( 'expanded' );\n\t },\n\t\n\t // disable content access\n\t disable: function() {\n\t this.$( '.portlet-backdrop' ).show();\n\t },\n\t\n\t // enable content access\n\t enable: function() {\n\t this.$( '.portlet-backdrop' ).hide();\n\t },\n\t\n\t // fill regular modal template\n\t _template: function( options ) {\n\t var tmpl = '
                    ';\n\t if ( options.title ) {\n\t tmpl += '
                    ' +\n\t '
                    ' +\n\t '
                    ';\n\t if ( options.icon ) {\n\t tmpl += ' ';\n\t }\n\t tmpl += '' + options.title + '' +\n\t '
                    ' +\n\t '
                    ';\n\t }\n\t tmpl += '
                    ';\n\t if ( options.placement == 'top' ) {\n\t tmpl += '
                    ';\n\t }\n\t tmpl += '
                    ';\n\t if ( options.placement == 'bottom' ) {\n\t tmpl += '
                    ';\n\t }\n\t tmpl += '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ';\n\t return tmpl;\n\t }\n\t});\n\treturn {\n\t View : View\n\t}\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Create a simple path alias to allow browserify to resolve\n\t// the runtime on a supported path.\n\tmodule.exports = __webpack_require__(67)['default'];\n\n\n/***/ },\n/* 13 */,\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {// Additional dependencies: jQuery, underscore.\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(10), __webpack_require__(28), __webpack_require__(18)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Modal, Frames, mod_icon_btn) {\n\t\n\t/**\n\t * Dataset metedata.\n\t */\n\tvar DatasetMetadata = Backbone.Model.extend({});\n\t\n\t/**\n\t * A dataset. In Galaxy, datasets are associated with a history, so\n\t * this object is also known as a HistoryDatasetAssociation.\n\t */\n\tvar Dataset = Backbone.Model.extend({\n\t defaults: {\n\t id: '',\n\t type: '',\n\t name: '',\n\t hda_ldda: 'hda',\n\t metadata: null\n\t },\n\t\n\t initialize: function() {\n\t // Metadata can be passed in as a model or a set of attributes; if it's\n\t // already a model, there's no need to set metadata.\n\t if (!this.get('metadata')) {\n\t this._set_metadata();\n\t }\n\t\n\t // Update metadata on change.\n\t this.on('change', this._set_metadata, this);\n\t },\n\t\n\t _set_metadata: function() {\n\t var metadata = new DatasetMetadata();\n\t\n\t // Move metadata from dataset attributes to metadata object.\n\t _.each(_.keys(this.attributes), function(k) {\n\t if (k.indexOf('metadata_') === 0) {\n\t // Found metadata.\n\t var new_key = k.split('metadata_')[1];\n\t metadata.set(new_key, this.attributes[k]);\n\t delete this.attributes[k];\n\t }\n\t }, this);\n\t\n\t // Because this is an internal change, silence it.\n\t this.set('metadata', metadata, { 'silent': true });\n\t },\n\t\n\t /**\n\t * Returns dataset metadata for a given attribute.\n\t */\n\t get_metadata: function(attribute) {\n\t return this.attributes.metadata.get(attribute);\n\t },\n\t\n\t urlRoot: Galaxy.root + \"api/datasets\"\n\t});\n\t\n\t/**\n\t * A tabular dataset. This object extends dataset to provide incremental chunked data.\n\t */\n\tvar TabularDataset = Dataset.extend({\n\t defaults: _.extend({}, Dataset.prototype.defaults, {\n\t chunk_url: null,\n\t first_data_chunk: null,\n\t chunk_index: -1,\n\t at_eof: false\n\t }),\n\t\n\t initialize: function(options) {\n\t Dataset.prototype.initialize.call(this);\n\t\n\t // If first data chunk is available, next chunk is 1.\n\t this.attributes.chunk_index = (this.attributes.first_data_chunk ? 1 : 0);\n\t this.attributes.chunk_url = Galaxy.root + 'dataset/display?dataset_id=' + this.id;\n\t this.attributes.url_viz = Galaxy.root + 'visualization';\n\t },\n\t\n\t /**\n\t * Returns a jQuery Deferred object that resolves to the next data chunk or null if at EOF.\n\t */\n\t get_next_chunk: function() {\n\t // If already at end of file, do nothing.\n\t if (this.attributes.at_eof) {\n\t return null;\n\t }\n\t\n\t // Get next chunk.\n\t var self = this,\n\t next_chunk = $.Deferred();\n\t $.getJSON(this.attributes.chunk_url, {\n\t chunk: self.attributes.chunk_index++\n\t }).success(function(chunk) {\n\t var rval;\n\t if (chunk.ck_data !== '') {\n\t // Found chunk.\n\t rval = chunk;\n\t }\n\t else {\n\t // At EOF.\n\t self.attributes.at_eof = true;\n\t rval = null;\n\t }\n\t next_chunk.resolve(rval);\n\t });\n\t\n\t return next_chunk;\n\t }\n\t});\n\t\n\tvar DatasetCollection = Backbone.Collection.extend({\n\t model: Dataset\n\t});\n\t\n\t/**\n\t * Provides a base for table-based, dynamic view of a tabular dataset.\n\t * Do not instantiate directly; use either TopLevelTabularDatasetChunkedView\n\t * or EmbeddedTabularDatasetChunkedView.\n\t */\n\tvar TabularDatasetChunkedView = Backbone.View.extend({\n\t\n\t /**\n\t * Initialize view and, importantly, set a scroll element.\n\t */\n\t initialize: function(options) {\n\t // Row count for rendering.\n\t this.row_count = 0;\n\t this.loading_chunk = false;\n\t\n\t // load trackster button\n\t new TabularButtonTracksterView({\n\t model : options.model,\n\t $el : this.$el\n\t });\n\t },\n\t\n\t expand_to_container: function(){\n\t if (this.$el.height() < this.scroll_elt.height()){\n\t this.attempt_to_fetch();\n\t }\n\t },\n\t\n\t attempt_to_fetch: function( func ){\n\t var self = this;\n\t if ( !this.loading_chunk && this.scrolled_to_bottom() ) {\n\t this.loading_chunk = true;\n\t this.loading_indicator.show();\n\t $.when(self.model.get_next_chunk()).then(function(result) {\n\t if (result) {\n\t self._renderChunk(result);\n\t self.loading_chunk = false;\n\t }\n\t self.loading_indicator.hide();\n\t self.expand_to_container();\n\t });\n\t }\n\t },\n\t\n\t render: function() {\n\t // Add loading indicator.\n\t this.loading_indicator = $('
                    ').attr('id', 'loading_indicator');\n\t this.$el.append(this.loading_indicator);\n\t\n\t // Add data table and header.\n\t var data_table = $('').attr({\n\t id: 'content_table',\n\t cellpadding: 0\n\t });\n\t this.$el.append(data_table);\n\t var column_names = this.model.get_metadata('column_names'),\n\t header_container = $('').appendTo(data_table),\n\t header_row = $('').appendTo(header_container);\n\t if (column_names) {\n\t header_row.append('');\n\t } else {\n\t for (var j = 1; j <= this.model.get_metadata('columns'); j++) {\n\t header_row.append('');\n\t }\n\t }\n\t\n\t // Render first chunk.\n\t var self = this,\n\t first_chunk = this.model.get('first_data_chunk');\n\t if (first_chunk) {\n\t // First chunk is bootstrapped, so render now.\n\t this._renderChunk(first_chunk);\n\t }\n\t else {\n\t // No bootstrapping, so get first chunk and then render.\n\t $.when(self.model.get_next_chunk()).then(function(result) {\n\t self._renderChunk(result);\n\t });\n\t }\n\t\n\t // -- Show new chunks during scrolling. --\n\t\n\t // Set up chunk loading when scrolling using the scrolling element.\n\t this.scroll_elt.scroll(function(){\n\t self.attempt_to_fetch();\n\t });\n\t },\n\t\n\t /**\n\t * Returns true if user has scrolled to the bottom of the view.\n\t */\n\t scrolled_to_bottom: function() {\n\t return false;\n\t },\n\t\n\t // -- Helper functions. --\n\t\n\t _renderCell: function(cell_contents, index, colspan) {\n\t var $cell = $(''),\n\t num_columns = this.model.get_metadata('columns');\n\t\n\t if (this.row_count % 2 !== 0) {\n\t row.addClass('dark_row');\n\t }\n\t\n\t if (cells.length === num_columns) {\n\t _.each(cells, function(cell_contents, index) {\n\t row.append(this._renderCell(cell_contents, index));\n\t }, this);\n\t }\n\t else if (cells.length > num_columns) {\n\t // SAM file or like format with optional metadata included.\n\t _.each(cells.slice(0, num_columns - 1), function(cell_contents, index) {\n\t row.append(this._renderCell(cell_contents, index));\n\t }, this);\n\t row.append(this._renderCell(cells.slice(num_columns - 1).join('\\t'), num_columns - 1));\n\t }\n\t else if (num_columns > 5 && cells.length === num_columns - 1 ) {\n\t // SAM file or like format with optional metadata missing.\n\t _.each(cells, function(cell_contents, index) {\n\t row.append(this._renderCell(cell_contents, index));\n\t }, this);\n\t row.append($('');\n\t wrapper.append($el);\n\t this.row.append(wrapper);\n\t },\n\t \n\t // header\n\t appendHeader: function() {\n\t // append header row\n\t this.$thead.append(this.row);\n\t\n\t // row\n\t this.row = $('');\n\t },\n\t \n\t // add row cell\n\t add: function($el, width, align) {\n\t var wrapper = $('');\n\t if (width) {\n\t wrapper.css('width', width);\n\t }\n\t if (align) {\n\t wrapper.css('text-align', align);\n\t }\n\t wrapper.append($el);\n\t this.row.append(wrapper);\n\t },\n\t \n\t // append\n\t append: function(id, fade) {\n\t this._commit(id, fade, false);\n\t },\n\t \n\t // prepend\n\t prepend: function(id, fade) {\n\t this._commit(id, fade, true);\n\t },\n\t \n\t // get element\n\t get: function(id) {\n\t return this.$el.find('#' + id);\n\t },\n\t \n\t // delete\n\t del: function(id) {\n\t var item = this.$tbody.find('#' + id);\n\t if (item.length > 0) {\n\t item.remove();\n\t this.row_count--;\n\t this._refresh();\n\t }\n\t },\n\t\n\t // delete all\n\t delAll: function() {\n\t this.$tbody.empty();\n\t this.row_count = 0;\n\t this._refresh();\n\t },\n\t \n\t // value\n\t value: function(new_value) {\n\t // get current id/value\n\t this.before = this.$tbody.find('.current').attr('id');\n\t \n\t // check if new_value is defined\n\t if (new_value !== undefined) {\n\t this.$tbody.find('tr').removeClass('current');\n\t if (new_value) {\n\t this.$tbody.find('#' + new_value).addClass('current');\n\t }\n\t }\n\t \n\t // get current id/value\n\t var after = this.$tbody.find('.current').attr('id');\n\t if(after === undefined) {\n\t return null;\n\t } else {\n\t // fire onchange\n\t if (after != this.before && this.options.onchange) {\n\t this.options.onchange(new_value);\n\t }\n\t \n\t // return current value\n\t return after;\n\t }\n\t },\n\t \n\t // size\n\t size: function() {\n\t return this.$tbody.find('tr').length;\n\t },\n\t \n\t // commit\n\t _commit: function(id, fade, prepend) {\n\t // remove previous item with same id\n\t this.del(id);\n\t \n\t // add\n\t this.row.attr('id', id);\n\t \n\t // add row\n\t if (prepend) {\n\t this.$tbody.prepend(this.row);\n\t } else {\n\t this.$tbody.append(this.row);\n\t }\n\t \n\t // fade mode\n\t if (fade) {\n\t this.row.hide();\n\t this.row.fadeIn();\n\t }\n\t \n\t // row\n\t this.row = this._row();\n\t \n\t // row count\n\t this.row_count++;\n\t this._refresh();\n\t },\n\t \n\t // create new row\n\t _row: function() {\n\t return $('');\n\t },\n\t \n\t // onclick\n\t _onclick: function(e) {\n\t // get values\n\t var old_value = this.value();\n\t var new_value = $(e.target).closest('tr').attr('id');\n\t if (new_value != ''){\n\t // check equality\n\t if (new_value && old_value != new_value) {\n\t if (this.options.onconfirm) {\n\t this.options.onconfirm(new_value);\n\t } else {\n\t this.value(new_value);\n\t }\n\t }\n\t }\n\t },\n\t\n\t // ondblclick\n\t _ondblclick: function(e) {\n\t var value = this.value();\n\t if (value && this.options.ondblclick) {\n\t this.options.ondblclick(value);\n\t }\n\t },\n\t \n\t // refresh\n\t _refresh: function() {\n\t if (this.row_count == 0) {\n\t this.$tmessage.show();\n\t } else {\n\t this.$tmessage.hide();\n\t }\n\t },\n\t \n\t // load html template\n\t _template: function(options) {\n\t return '
                    ' +\n\t '
                    ' + column_names.join('') + '' + j + '').text(cell_contents);\n\t var column_types = this.model.get_metadata('column_types');\n\t if (colspan !== undefined) {\n\t $cell.attr('colspan', colspan).addClass('stringalign');\n\t } else if (column_types) {\n\t if (index < column_types.length) {\n\t if (column_types[index] === 'str' || column_types[index] === 'list') {\n\t /* Left align all str columns, right align the rest */\n\t $cell.addClass('stringalign');\n\t }\n\t }\n\t }\n\t return $cell;\n\t },\n\t\n\t _renderRow: function(line) {\n\t // Check length of cells to ensure this is a complete row.\n\t var cells = line.split('\\t'),\n\t row = $('
                    '));\n\t }\n\t else {\n\t // Comment line, just return the one cell.\n\t row.append(this._renderCell(line, 0, num_columns));\n\t }\n\t\n\t this.row_count++;\n\t return row;\n\t },\n\t\n\t _renderChunk: function(chunk) {\n\t var data_table = this.$el.find('table');\n\t _.each(chunk.ck_data.split('\\n'), function(line, index) {\n\t if (line !== ''){\n\t data_table.append(this._renderRow(line));\n\t }\n\t }, this);\n\t }\n\t});\n\t\n\t/**\n\t * Tabular view that is placed at the top level of page. Scrolling occurs\n\t * view top-level elements outside of view.\n\t */\n\tvar TopLevelTabularDatasetChunkedView = TabularDatasetChunkedView.extend({\n\t\n\t initialize: function(options) {\n\t TabularDatasetChunkedView.prototype.initialize.call(this, options);\n\t\n\t // Scrolling happens in top-level elements.\n\t scroll_elt = _.find(this.$el.parents(), function(p) {\n\t return $(p).css('overflow') === 'auto';\n\t });\n\t\n\t // If no scrolling element found, use window.\n\t if (!scroll_elt) { scroll_elt = window; }\n\t\n\t // Wrap scrolling element for easy access.\n\t this.scroll_elt = $(scroll_elt);\n\t },\n\t\n\t /**\n\t * Returns true if user has scrolled to the bottom of the view.\n\t */\n\t scrolled_to_bottom: function() {\n\t return (this.$el.height() - this.scroll_elt.scrollTop() - this.scroll_elt.height() <= 0);\n\t }\n\t\n\t});\n\t\n\t/**\n\t * Tabular view tnat is embedded in a page. Scrolling occurs in view's el.\n\t */\n\tvar EmbeddedTabularDatasetChunkedView = TabularDatasetChunkedView.extend({\n\t\n\t initialize: function(options) {\n\t TabularDatasetChunkedView.prototype.initialize.call(this, options);\n\t\n\t // Because view is embedded, set up div to do scrolling.\n\t this.scroll_elt = this.$el.css({\n\t position: 'relative',\n\t overflow: 'scroll',\n\t height: options.height || '500px'\n\t });\n\t },\n\t\n\t /**\n\t * Returns true if user has scrolled to the bottom of the view.\n\t */\n\t scrolled_to_bottom: function() {\n\t return this.$el.scrollTop() + this.$el.innerHeight() >= this.el.scrollHeight;\n\t }\n\t\n\t});\n\t\n\t// button for trackster visualization\n\tvar TabularButtonTracksterView = Backbone.View.extend({\n\t\n\t // gene region columns\n\t col: {\n\t chrom : null,\n\t start : null,\n\t end : null\n\t },\n\t\n\t // url for trackster\n\t url_viz : null,\n\t\n\t // dataset id\n\t dataset_id : null,\n\t\n\t // database key\n\t genome_build: null,\n\t\n\t // data type\n\t file_ext : null,\n\t\n\t // backbone initialize\n\t initialize: function (options) {\n\t // check if environment is available\n\t var Galaxy = parent.Galaxy;\n\t\n\t // link galaxy modal or create one\n\t if (Galaxy && Galaxy.modal) {\n\t this.modal = Galaxy.modal;\n\t }\n\t\n\t // link galaxy frames\n\t if (Galaxy && Galaxy.frame) {\n\t this.frame = Galaxy.frame;\n\t }\n\t\n\t // check\n\t if (!this.modal || !this.frame) {\n\t return;\n\t }\n\t\n\t // model/metadata\n\t var model = options.model;\n\t var metadata = model.get('metadata');\n\t\n\t // check for datatype\n\t if (!model.get('file_ext')) {\n\t return;\n\t }\n\t\n\t // get data type\n\t this.file_ext = model.get('file_ext');\n\t\n\t // check for bed-file format\n\t if (this.file_ext == 'bed')\n\t {\n\t // verify that metadata exists\n\t if (metadata.get('chromCol') && metadata.get('startCol') && metadata.get('endCol'))\n\t {\n\t // read in columns\n\t this.col.chrom = metadata.get('chromCol') - 1;\n\t this.col.start = metadata.get('startCol') - 1;\n\t this.col.end = metadata.get('endCol') - 1;\n\t } else {\n\t console.log('TabularButtonTrackster : Bed-file metadata incomplete.');\n\t return;\n\t }\n\t }\n\t\n\t // check for vcf-file format\n\t if (this.file_ext == 'vcf')\n\t {\n\t // search array\n\t function search (str, array) {\n\t for (var j = 0; j < array.length; j++)\n\t if (array[j].match(str)) return j;\n\t return -1;\n\t };\n\t\n\t // load\n\t this.col.chrom = search('Chrom', metadata.get('column_names'));\n\t this.col.start = search('Pos', metadata.get('column_names'));\n\t this.col.end = null;\n\t\n\t // verify that metadata exists\n\t if (this.col.chrom == -1 || this.col.start == -1) {\n\t console.log('TabularButtonTrackster : VCF-file metadata incomplete.');\n\t return;\n\t }\n\t }\n\t\n\t // check\n\t if(this.col.chrom === undefined) {\n\t return;\n\t }\n\t\n\t // get dataset id\n\t if (model.id) {\n\t this.dataset_id = model.id;\n\t } else {\n\t console.log('TabularButtonTrackster : Dataset identification is missing.');\n\t return;\n\t }\n\t\n\t // get url\n\t if (model.get('url_viz')) {\n\t this.url_viz = model.get('url_viz');\n\t } else {\n\t console.log('TabularButtonTrackster : Url for visualization controller is missing.');\n\t return;\n\t }\n\t\n\t // get genome_build / database key\n\t if (model.get('genome_build')) {\n\t this.genome_build = model.get('genome_build');\n\t }\n\t\n\t // create the icon\n\t var btn_viz = new mod_icon_btn.IconButtonView({\n\t model : new mod_icon_btn.IconButton({\n\t title : 'Visualize',\n\t icon_class : 'chart_curve',\n\t id : 'btn_viz'\n\t })\n\t });\n\t\n\t // set element\n\t this.setElement(options.$el);\n\t\n\t // add to element\n\t this.$el.append(btn_viz.render().$el);\n\t\n\t // hide the button\n\t this.hide();\n\t },\n\t\n\t // backbone events\n\t events:\n\t {\n\t 'mouseover tr' : 'show',\n\t 'mouseleave' : 'hide'\n\t },\n\t\n\t // show button\n\t show: function (e) {\n\t // is numeric\n\t function is_numeric(n) {\n\t return !isNaN(parseFloat(n)) && isFinite(n);\n\t };\n\t\n\t // check\n\t if(this.col.chrom === null)\n\t return;\n\t\n\t // get selected data line\n\t var row = $(e.target).parent();\n\t\n\t // verify that location has been found\n\t var chrom = row.children().eq(this.col.chrom).html();\n\t var start = row.children().eq(this.col.start).html();\n\t\n\t // end is optional\n\t var end = this.col.end ? row.children().eq(this.col.end).html() : start;\n\t\n\t // double check location\n\t if (!chrom.match(\"^#\") && chrom !== \"\" && is_numeric(start)) {\n\t\n\t // get target gene region\n\t var btn_viz_pars = {\n\t dataset_id : this.dataset_id,\n\t gene_region : chrom + \":\" + start + \"-\" + end\n\t };\n\t\n\t // get button position\n\t var offset = row.offset();\n\t var left = offset.left - 10;\n\t var top = offset.top - $(window).scrollTop() + 3;\n\t\n\t // update css\n\t $('#btn_viz').css({'position': 'fixed', 'top': top + 'px', 'left': left + 'px'});\n\t $('#btn_viz').off('click');\n\t $('#btn_viz').click(this.create_trackster_action(this.url_viz, btn_viz_pars, this.genome_build));\n\t\n\t // show the button\n\t $('#btn_viz').show();\n\t } else {\n\t // hide the button\n\t $('#btn_viz').hide();\n\t }\n\t },\n\t\n\t // hide button\n\t hide: function () {\n\t this.$el.find('#btn_viz').hide();\n\t },\n\t\n\t // create action\n\t create_trackster_action : function (vis_url, dataset_params, dbkey) {\n\t // link this\n\t var self = this;\n\t\n\t // create function\n\t return function() {\n\t var listTracksParams = {};\n\t if (dbkey) {\n\t listTracksParams[ 'f-dbkey' ] = dbkey;\n\t }\n\t $.ajax({\n\t url: vis_url + '/list_tracks?' + $.param( listTracksParams ),\n\t dataType: 'html',\n\t error: function() {\n\t // show error message\n\t self.modal.show({\n\t title : 'Something went wrong!',\n\t body : 'Unfortunately we could not add this dataset to the track browser. Please try again or contact us.',\n\t buttons : {\n\t 'Cancel': function(){\n\t self.modal.hide();\n\t }\n\t }\n\t });\n\t },\n\t success: function(table_html) {\n\t self.modal.show({\n\t title : 'View Data in a New or Saved Visualization',\n\t buttons :{\n\t 'Cancel': function(){\n\t self.modal.hide();\n\t },\n\t 'View in saved visualization': function(){\n\t // show modal with saved visualizations\n\t self.modal.show(\n\t {\n\t title : 'Add Data to Saved Visualization',\n\t body : table_html,\n\t buttons : {\n\t 'Cancel': function(){\n\t self.modal.hide();\n\t },\n\t 'Add to visualization': function(){\n\t // hide\n\t self.modal.hide();\n\t\n\t // search selected fields\n\t self.modal.$el.find('input[name=id]:checked').each(function(){\n\t // get visualization id\n\t var vis_id = $(this).val();\n\t dataset_params.id = vis_id;\n\t\n\t // add widget\n\t self.frame.add({\n\t title : 'Trackster',\n\t type : 'url',\n\t content : vis_url + '/trackster?' + $.param(dataset_params)\n\t });\n\t });\n\t }\n\t }\n\t });\n\t },\n\t 'View in new visualization': function(){\n\t // hide\n\t self.modal.hide();\n\t\n\t // add widget\n\t self.frame.add({\n\t title : 'Trackster',\n\t type : 'url',\n\t content : vis_url + '/trackster?' + $.param(dataset_params)\n\t });\n\t }\n\t }\n\t });\n\t }\n\t });\n\t return false;\n\t };\n\t }\n\t});\n\t\n\t// -- Utility functions. --\n\t\n\t/**\n\t * Create a model, attach it to a view, render view, and attach it to a parent element.\n\t */\n\tvar createModelAndView = function(model, view, model_config, parent_elt) {\n\t // Create model, view.\n\t var a_view = new view({\n\t model: new model(model_config)\n\t });\n\t\n\t // Render view and add to parent element.\n\t a_view.render();\n\t if (parent_elt) {\n\t parent_elt.append(a_view.$el);\n\t }\n\t\n\t return a_view;\n\t};\n\t\n\t/**\n\t * Create a tabular dataset chunked view (and requisite tabular dataset model)\n\t * and appends to parent_elt.\n\t */\n\tvar createTabularDatasetChunkedView = function(options) {\n\t // If no model, create and set model from dataset config.\n\t if (!options.model) {\n\t options.model = new TabularDataset(options.dataset_config);\n\t }\n\t\n\t var parent_elt = options.parent_elt;\n\t var embedded = options.embedded;\n\t\n\t // Clean up options so that only needed options are passed to view.\n\t delete options.embedded;\n\t delete options.parent_elt;\n\t delete options.dataset_config;\n\t\n\t // Create and set up view.\n\t var view = (embedded ? new EmbeddedTabularDatasetChunkedView(options) :\n\t new TopLevelTabularDatasetChunkedView(options));\n\t view.render();\n\t\n\t if (parent_elt) {\n\t parent_elt.append(view.$el);\n\t // If we're sticking this in another element, once it's appended check\n\t // to make sure we've filled enough space.\n\t // Without this, the scroll elements don't work.\n\t view.expand_to_container();\n\t }\n\t\n\t return view;\n\t};\n\t\n\treturn {\n\t Dataset: Dataset,\n\t TabularDataset: TabularDataset,\n\t DatasetCollection: DatasetCollection,\n\t TabularDatasetChunkedView: TabularDatasetChunkedView,\n\t createTabularDatasetChunkedView: createTabularDatasetChunkedView\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t//==============================================================================\n\t/** Map of possible HDA/collection/job states to their string equivalents.\n\t * A port of galaxy.model.Dataset.states.\n\t */\n\tvar STATES = {\n\t // NOT ready states\n\t /** is uploading and not ready */\n\t UPLOAD : 'upload',\n\t /** the job that will produce the dataset queued in the runner */\n\t QUEUED : 'queued',\n\t /** the job that will produce the dataset is running */\n\t RUNNING : 'running',\n\t /** metadata for the dataset is being discovered/set */\n\t SETTING_METADATA : 'setting_metadata',\n\t\n\t // ready states\n\t /** was created without a tool */\n\t NEW : 'new',\n\t /** has no data */\n\t EMPTY : 'empty',\n\t /** has successfully completed running */\n\t OK : 'ok',\n\t\n\t /** the job that will produce the dataset paused */\n\t PAUSED : 'paused',\n\t /** metadata discovery/setting failed or errored (but otherwise ok) */\n\t FAILED_METADATA : 'failed_metadata',\n\t//TODO: not in trans.app.model.Dataset.states - is in database\n\t /** not accessible to the current user (i.e. due to permissions) */\n\t NOT_VIEWABLE : 'noPermission',\n\t /** deleted while uploading */\n\t DISCARDED : 'discarded',\n\t /** the tool producing this dataset failed */\n\t ERROR : 'error'\n\t};\n\t\n\tSTATES.READY_STATES = [\n\t STATES.OK,\n\t STATES.EMPTY,\n\t STATES.PAUSED,\n\t STATES.FAILED_METADATA,\n\t STATES.NOT_VIEWABLE,\n\t STATES.DISCARDED,\n\t STATES.ERROR\n\t];\n\t\n\tSTATES.NOT_READY_STATES = [\n\t STATES.UPLOAD,\n\t STATES.QUEUED,\n\t STATES.RUNNING,\n\t STATES.SETTING_METADATA,\n\t STATES.NEW\n\t];\n\t\n\t\n\t//==============================================================================\n\t return STATES;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/** This class contains all button views.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\t /** This renders the default button which is used e.g. at the bottom of the upload modal.\n\t */\n\t var ButtonBase = Backbone.View.extend({\n\t initialize: function( options ) {\n\t this.options = Utils.merge( options, {\n\t id : Utils.uid(),\n\t title : '',\n\t floating : 'right',\n\t icon : '',\n\t cls : 'ui-button btn btn-default',\n\t cls_wait : 'btn btn-info'\n\t } );\n\t this.setElement( this._template( this.options ) );\n\t var self = this;\n\t $( this.el ).on( 'click' , function() {\n\t $( '.tooltip' ).hide();\n\t if ( options.onclick && !self.disabled ) {\n\t options.onclick();\n\t }\n\t } );\n\t $( this.el ).tooltip( { title: options.tooltip, placement: 'bottom' } );\n\t },\n\t\n\t // disable\n\t disable: function() {\n\t this.$el.addClass( 'disabled' );\n\t this.disabled = true;\n\t },\n\t\n\t // enable\n\t enable: function() {\n\t this.$el.removeClass( 'disabled' );\n\t this.disabled = false;\n\t },\n\t\n\t // show spinner\n\t wait: function() {\n\t this.$el.removeClass( this.options.cls ).addClass( this.options.cls_wait ).prop( 'disabled', true );\n\t this.$( '.icon' ).removeClass( this.options.icon ).addClass( 'fa-spinner fa-spin' );\n\t this.$( '.title' ).html( 'Sending...' );\n\t },\n\t\n\t // hide spinner\n\t unwait: function() {\n\t this.$el.removeClass( this.options.cls_wait ).addClass( this.options.cls ).prop( 'disabled', false );\n\t this.$( '.icon' ).removeClass( 'fa-spinner fa-spin' ).addClass( this.options.icon );\n\t this.$( '.title' ).html( this.options.title );\n\t },\n\t\n\t // template\n\t _template: function( options ) {\n\t var str = '';\n\t return str;\n\t }\n\t });\n\t\n\t /** This button allows the right-click/open-in-new-tab feature, its used e.g. for panel buttons.\n\t */\n\t var ButtonLink = ButtonBase.extend({\n\t initialize: function( options ) {\n\t ButtonBase.prototype.initialize.call( this, options );\n\t },\n\t _template: function( options ) {\n\t return '' + '' +\n\t '';\n\t }\n\t });\n\t\n\t /** The check button is used in the tool form and allows to distinguish between multiple states e.g. all, partially and nothing selected.\n\t */\n\t var ButtonCheck = Backbone.View.extend({\n\t initialize: function( options ) {\n\t // configure options\n\t this.options = Utils.merge(options, {\n\t title : 'Select/Unselect all',\n\t icons : ['fa fa-square-o', 'fa fa-minus-square-o', 'fa fa-check-square-o'],\n\t value : 0\n\t });\n\t\n\t // create new element\n\t this.setElement( this._template() );\n\t this.$title = this.$( '.title' );\n\t this.$icon = this.$( '.icon' );\n\t\n\t // set initial value\n\t this.value( this.options.value );\n\t\n\t // set title\n\t this.$title.html( this.options.title );\n\t\n\t // add event handler\n\t var self = this;\n\t this.$el.on('click', function() {\n\t self.current = ( self.current === 0 && 2 ) || 0;\n\t self.value( self.current );\n\t self.options.onclick && self.options.onclick();\n\t });\n\t },\n\t\n\t /* Sets a new value and/or returns the current value.\n\t * @param{Integer} new_val - Set a new value 0=unchecked, 1=partial and 2=checked.\n\t * OR:\n\t * @param{Integer} new_val - Number of selected options.\n\t * @param{Integer} total - Total number of available options.\n\t */\n\t value: function ( new_val, total ) {\n\t if ( new_val !== undefined ) {\n\t if ( total ) {\n\t if ( new_val !== 0 ) {\n\t new_val = ( new_val !== total ) && 1 || 2;\n\t }\n\t }\n\t this.current = new_val;\n\t this.$icon.removeClass()\n\t .addClass( 'icon' )\n\t .addClass( this.options.icons[ new_val ] );\n\t this.options.onchange && this.options.onchange( new_val );\n\t }\n\t return this.current;\n\t },\n\t\n\t /** Template containing the check button and the title\n\t */\n\t _template: function() {\n\t return '
                    ' +\n\t '' +\n\t '' +\n\t '
                    ';\n\t }\n\t });\n\t\n\t /** This renders a differently styled, more compact button version.\n\t TODO: Consolidate with icon-button.js and/or button-default.js.\n\t */\n\t var ButtonIcon = Backbone.View.extend({\n\t initialize : function( options ) {\n\t // get options\n\t this.options = Utils.merge( options, {\n\t id : Utils.uid(),\n\t title : '',\n\t floating : 'right',\n\t cls : 'ui-button-icon',\n\t icon : '',\n\t tooltip : '',\n\t onclick : null\n\t });\n\t\n\t // create new element\n\t this.setElement( this._template( this.options ) );\n\t\n\t // link button element\n\t this.$button = this.$el.find( '.button' );\n\t\n\t // add event\n\t var self = this;\n\t $(this.el).on('click', function() {\n\t // hide all tooltips\n\t $( '.tooltip' ).hide();\n\t\n\t // execute onclick callback\n\t if ( options.onclick && !self.disabled ) {\n\t options.onclick();\n\t }\n\t });\n\t\n\t // add tooltip\n\t this.$button.tooltip( { title: options.tooltip, placement: 'bottom' } );\n\t },\n\t\n\t // disable\n\t disable: function() {\n\t this.$button.addClass( 'disabled' );\n\t this.disabled = true;\n\t },\n\t\n\t // enable\n\t enable: function() {\n\t this.$button.removeClass( 'disabled' );\n\t this.disabled = false;\n\t },\n\t\n\t // change icon\n\t setIcon: function(icon_cls) {\n\t this.$('i').removeClass( this.options.icon ).addClass( icon_cls );\n\t this.options.icon = icon_cls;\n\t },\n\t\n\t // template\n\t _template: function( options ) {\n\t // width\n\t var width = '';\n\t if ( options.title ) {\n\t width = 'width: auto;';\n\t }\n\t\n\t // string\n\t var str = '
                    ' +\n\t '
                    ';\n\t if (options.title) {\n\t str += ' ' +\n\t '' + options.title + '';\n\t } else {\n\t str += '';\n\t }\n\t str += '
                    ' +\n\t '
                    ';\n\t return str;\n\t }\n\t });\n\t\n\t /** This class creates a button with dropdown menu. It extends the functionality of the Ui.ButtonIcon class.\n\t TODO: Consolidate class, use common base class\n\t */\n\t var ButtonMenu = Backbone.View.extend({\n\t // optional sub menu\n\t $menu: null,\n\t\n\t // initialize\n\t initialize: function ( options ) {\n\t // get options\n\t this.options = Utils.merge( options, {\n\t // same as Ui.ButtonIcon\n\t id : '',\n\t title : '',\n\t floating : 'right',\n\t pull : 'right',\n\t icon : null,\n\t onclick : null,\n\t cls : 'ui-button-icon ui-button-menu',\n\t tooltip : '',\n\t \n\t // additional options\n\t target : '',\n\t href : '',\n\t onunload : null,\n\t visible : true,\n\t tag : ''\n\t } );\n\t\n\t // add template for tab\n\t this.setElement( $( this._template( this.options ) ) );\n\t\n\t // find root\n\t var $root = $( this.el ).find( '.root' );\n\t\n\t // link head\n\t var self = this;\n\t $root.on( 'click', function( e ) {\n\t // hide all tooltips\n\t $( '.tooltip' ).hide();\n\t\n\t // prevent default\n\t e.preventDefault();\n\t\n\t // add click event\n\t if( self.options.onclick ) {\n\t self.options.onclick();\n\t }\n\t });\n\t\n\t // visiblity\n\t if ( !this.options.visible )\n\t this.hide();\n\t\n\t // add tooltip\n\t $root.tooltip( { title: options.tooltip, placement: 'bottom' } );\n\t },\n\t\n\t // show\n\t show: function() {\n\t $( this.el ).show();\n\t },\n\t\n\t // hide\n\t hide: function() {\n\t $( this.el ).hide();\n\t },\n\t\n\t // add menu item\n\t addMenu: function ( options ) {\n\t // menu option defaults\n\t var menuOptions = {\n\t title : '',\n\t target : '',\n\t href : '',\n\t onclick : null,\n\t divider : false,\n\t icon : null,\n\t cls : 'button-menu btn-group'\n\t }\n\t\n\t // get options\n\t menuOptions = Utils.merge( options, menuOptions );\n\t\n\t // check if submenu element is available\n\t if ( !this.$menu ) {\n\t // insert submenu element into root\n\t $( this.el ).append( this._templateMenu() );\n\t\n\t // update element link\n\t this.$menu = $( this.el ).find( '.menu' );\n\t }\n\t\n\t // create\n\t var $item = $( this._templateMenuItem( menuOptions ) );\n\t\n\t // add events\n\t $item.on( 'click', function( e ) {\n\t if( menuOptions.onclick ) {\n\t e.preventDefault();\n\t menuOptions.onclick();\n\t }\n\t });\n\t\n\t // append menu\n\t this.$menu.append( $item );\n\t\n\t // append divider\n\t if ( menuOptions.divider ) {\n\t this.$menu.append( $( this._templateDivider() ) );\n\t }\n\t },\n\t\n\t // fill template header\n\t _templateMenuItem: function ( options ) {\n\t var tmpl = '
                  1. ' +\n\t '';\n\t }\n\t tmpl += ' ' + options.title +\n\t '' +\n\t '
                  2. ';\n\t return tmpl;\n\t },\n\t\n\t // fill template header\n\t _templateMenu: function () {\n\t return '
                      ';\n\t },\n\t\n\t _templateDivider: function() {\n\t return '
                    • ';\n\t },\n\t\n\t // element\n\t _template: function(options) {\n\t // TODO: width/margin should be set in css\n\t var width = '';\n\t var margin = '';\n\t if ( options.title ) {\n\t width = 'width: auto;';\n\t } else {\n\t margin = 'margin: 0px;';\n\t }\n\t var str = '
                      ' +\n\t '
                      ' +\n\t '';\n\t if ( options.title ) {\n\t str += ' ' + options.title + '';\n\t }\n\t str += '
                      ' +\n\t '
                      ';\n\t return str;\n\t }\n\t });\n\t\n\t return {\n\t ButtonDefault : ButtonBase,\n\t ButtonLink : ButtonLink,\n\t ButtonIcon : ButtonIcon,\n\t ButtonCheck : ButtonCheck,\n\t ButtonMenu : ButtonMenu\n\t }\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\t\n\t/**\n\t * This class creates a ui table element.\n\t */\n\tvar View = Backbone.View.extend({\n\t // current row\n\t row: null,\n\t \n\t // count rows\n\t row_count: 0,\n\t \n\t // defaults options\n\t optionsDefault: {\n\t content : 'No content available.',\n\t onchange : null,\n\t ondblclick : null,\n\t onconfirm : null,\n\t cls : 'ui-table',\n\t cls_tr : ''\n\t },\n\t \n\t // events\n\t events : {\n\t 'click' : '_onclick',\n\t 'dblclick' : '_ondblclick'\n\t },\n\t \n\t // initialize\n\t initialize : function(options) {\n\t // configure options\n\t this.options = Utils.merge(options, this.optionsDefault);\n\t \n\t // create new element\n\t var $el = $(this._template(this.options));\n\t \n\t // link sub-elements\n\t this.$thead = $el.find('thead');\n\t this.$tbody = $el.find('tbody');\n\t this.$tmessage = $el.find('tmessage');\n\t \n\t // set element\n\t this.setElement($el);\n\t \n\t // initialize row\n\t this.row = this._row();\n\t },\n\t \n\t // add header cell\n\t addHeader: function($el) {\n\t var wrapper = $('
                    ' +\n\t '' +\n\t '' +\n\t '
                    ' +\n\t '' + options.content + '' +\n\t '
                    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t //jquery\n\t //backbone\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t//=============================================================================\n\t/**\n\t * backbone model for icon buttons\n\t */\n\tvar IconButton = Backbone.Model.extend({\n\t defaults: {\n\t title : \"\",\n\t icon_class : \"\",\n\t on_click : null,\n\t menu_options : null,\n\t is_menu_button : true,\n\t id : null,\n\t href : null,\n\t target : null,\n\t enabled : true,\n\t visible : true,\n\t tooltip_config : {}\n\t }\n\t});\n\t\n\t/**\n\t * backbone view for icon buttons\n\t */\n\tvar IconButtonView = Backbone.View.extend({\n\t\n\t initialize : function(){\n\t // better rendering this way\n\t this.model.attributes.tooltip_config = { placement : 'bottom' };\n\t this.model.bind( 'change', this.render, this );\n\t },\n\t\n\t render : function( ){\n\t // hide tooltip\n\t this.$el.tooltip( 'hide' );\n\t\n\t var new_elem = this.template( this.model.toJSON() );\n\t // configure tooltip\n\t new_elem.tooltip( this.model.get( 'tooltip_config' ));\n\t this.$el.replaceWith( new_elem );\n\t this.setElement( new_elem );\n\t return this;\n\t },\n\t\n\t events : {\n\t 'click' : 'click'\n\t },\n\t\n\t click : function( event ){\n\t // if on_click pass to that function\n\t if( _.isFunction( this.model.get( 'on_click' ) ) ){\n\t this.model.get( 'on_click' )( event );\n\t return false;\n\t }\n\t // otherwise, bubble up ( to href or whatever )\n\t return true;\n\t },\n\t\n\t // generate html element\n\t template: function( options ){\n\t var buffer = 'title=\"' + options.title + '\" class=\"icon-button';\n\t\n\t if( options.is_menu_button ){\n\t buffer += ' menu-button';\n\t }\n\t\n\t buffer += ' ' + options.icon_class;\n\t\n\t if( !options.enabled ){\n\t buffer += '_disabled';\n\t }\n\t\n\t // close class tag\n\t buffer += '\"';\n\t\n\t if( options.id ){\n\t buffer += ' id=\"' + options.id + '\"';\n\t }\n\t\n\t buffer += ' href=\"' + options.href + '\"';\n\t // add target for href\n\t if( options.target ){\n\t buffer += ' target=\"' + options.target + '\"';\n\t }\n\t // set visibility\n\t if( !options.visible ){\n\t buffer += ' style=\"display: none;\"';\n\t }\n\t\n\t // enabled/disabled\n\t if ( options.enabled ){\n\t buffer = '';\n\t } else {\n\t buffer = '';\n\t }\n\t\n\t // return element\n\t return $( buffer );\n\t }\n\t} );\n\t\n\t// define collection\n\tvar IconButtonCollection = Backbone.Collection.extend({\n\t model: IconButton\n\t});\n\t\n\t/**\n\t * menu with multiple icon buttons\n\t * views are not needed nor used for individual buttons\n\t */\n\tvar IconButtonMenuView = Backbone.View.extend({\n\t\n\t tagName: 'div',\n\t\n\t initialize: function(){\n\t this.render();\n\t },\n\t\n\t render: function(){\n\t // initialize icon buttons\n\t var self = this;\n\t this.collection.each(function(button){\n\t // create and add icon button to menu\n\t var elt = $('')\n\t .attr('href', 'javascript:void(0)')\n\t .attr('title', button.attributes.title)\n\t .addClass('icon-button menu-button')\n\t .addClass(button.attributes.icon_class)\n\t .appendTo(self.$el)\n\t .click(button.attributes.on_click);\n\t\n\t // configure tooltip\n\t if (button.attributes.tooltip_config){\n\t elt.tooltip(button.attributes.tooltip_config);\n\t }\n\t\n\t // add popup menu to icon\n\t var menu_options = button.get('options');\n\t if (menu_options){\n\t make_popupmenu(elt, menu_options);\n\t }\n\t });\n\t\n\t // return\n\t return this;\n\t }\n\t});\n\t\n\t/**\n\t * Returns an IconButtonMenuView for the provided configuration.\n\t * Configuration is a list of dictionaries where each dictionary\n\t * defines an icon button. Each dictionary must have the following\n\t * elements: icon_class, title, and on_click.\n\t */\n\tvar create_icon_buttons_menu = function(config, global_config)\n\t{\n\t // initialize global configuration\n\t if (!global_config) global_config = {};\n\t\n\t // create and initialize menu\n\t var buttons = new IconButtonCollection(\n\t _.map(config, function(button_config){\n\t return new IconButton(_.extend(button_config, global_config));\n\t })\n\t );\n\t\n\t // return menu\n\t return new IconButtonMenuView( {collection: buttons} );\n\t};\n\t\n\t\n\t//=============================================================================\n\t return {\n\t IconButton : IconButton,\n\t IconButtonView : IconButtonView,\n\t IconButtonCollection : IconButtonCollection,\n\t IconButtonMenuView : IconButtonMenuView,\n\t create_icon_buttons_menu: create_icon_buttons_menu\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// from: https://raw.githubusercontent.com/umdjs/umd/master/jqueryPlugin.js\n\t// Uses AMD or browser globals to create a jQuery plugin.\n\t(function (factory) {\n\t if (true) {\n\t //TODO: So...this turns out to be an all or nothing thing. If I load jQuery in the define below, it will\n\t // (of course) wipe the old jquery *and all the plugins loaded into it*. So the define below *is still\n\t // relying on jquery being loaded globally* in order to preserve plugins.\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(1) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else {\n\t // Browser globals\n\t factory(jQuery);\n\t }\n\t\n\t}(function ( jQuery ) {\n\t'use_strict';\n\t\n\tvar $ = jQuery;\n\t\n\t// ============================================================================\n\t/**\n\t * Make an element with text editable: (a) when user clicks on text, a textbox/area\n\t * is provided for editing; (b) when enter key pressed, element's text is set and on_finish\n\t * is called.\n\t */\n\t$.fn.make_text_editable = function(config_dict) {\n\t // Get config options.\n\t var num_cols = (\"num_cols\" in config_dict ? config_dict.num_cols : 30),\n\t num_rows = (\"num_rows\" in config_dict ? config_dict.num_rows : 4),\n\t use_textarea = (\"use_textarea\" in config_dict ? config_dict.use_textarea : false),\n\t on_finish = (\"on_finish\" in config_dict ? config_dict.on_finish : null),\n\t help_text = (\"help_text\" in config_dict ? config_dict.help_text : null);\n\t\n\t // Add element behavior.\n\t var container = $(this);\n\t container.addClass(\"editable-text\").click(function(e) {\n\t // If there's already an input element, editing is active, so do nothing.\n\t if ($(this).children(\":input\").length > 0) {\n\t return;\n\t }\n\t\n\t container.removeClass(\"editable-text\");\n\t\n\t // Handler for setting element text.\n\t var set_text = function(new_text) {\n\t container.find(\":input\").remove();\n\t\n\t if (new_text !== \"\") {\n\t container.text(new_text);\n\t } else {\n\t // No text; need a line so that there is a click target.\n\t container.html(\"
                    \");\n\t }\n\t container.addClass(\"editable-text\");\n\t\n\t if (on_finish) {\n\t on_finish(new_text);\n\t }\n\t };\n\t\n\t // Create input element(s) for editing.\n\t var cur_text = (\"cur_text\" in config_dict ? config_dict.cur_text : container.text() ),\n\t input_elt, button_elt;\n\t\n\t if (use_textarea) {\n\t input_elt = $(\"' +\n\t '
                    ';\n\t },\n\t\n\t requirements: function(options) {\n\t var requirements_message = 'This tool requires ';\n\t for (var i in options.requirements) {\n\t var req = options.requirements[i];\n\t requirements_message += req.name;\n\t if (req.version) {\n\t requirements_message += ' (Version ' + req.version + ')';\n\t }\n\t if (i < options.requirements.length - 2) {\n\t requirements_message += ', ';\n\t }\n\t if (i == options.requirements.length - 2) {\n\t requirements_message += ' and ';\n\t }\n\t }\n\t return requirements_message + '. Click here for more information.';\n\t }\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(11), __webpack_require__(7)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Portlet, Ui) {\n\t\n\t// ui list element\n\tvar View = Backbone.View.extend({\n\t // create portlet to keep track of selected list elements\n\t initialize : function(options) {\n\t // link this\n\t var self = this;\n\t\n\t // initialize options\n\t this.options = options;\n\t this.name = options.name || 'element';\n\t this.multiple = options.multiple || false;\n\t\n\t // create message handler\n\t this.message = new Ui.Message({ cls: 'ui-margin-top' });\n\t\n\t // create portlet\n\t this.portlet = new Portlet.View({ cls: 'ui-portlet-section' });\n\t\n\t // create select field containing the options which can be inserted into the list\n\t this.select = new Ui.Select.View({ optional : options.optional });\n\t\n\t // create insert new list element button\n\t this.button = new Ui.ButtonIcon({\n\t icon : 'fa fa-sign-in',\n\t floating : 'left',\n\t tooltip : 'Insert new ' + this.name,\n\t onclick : function() {\n\t self.add({\n\t id : self.select.value(),\n\t name : self.select.text()\n\t });\n\t }\n\t });\n\t\n\t // build main element\n\t this.setElement(this._template(options));\n\t this.$('.ui-list-message').append(this.message.$el);\n\t this.$('.ui-list-portlet').append(this.portlet.$el);\n\t this.$('.ui-list-button').append(this.button.$el);\n\t this.$('.ui-list-select').append(this.select.$el);\n\t },\n\t\n\t /** Return/Set currently selected list elements */\n\t value: function(val) {\n\t // set new value\n\t if (val !== undefined) {\n\t this.portlet.empty();\n\t if ($.isArray(val)) {\n\t for (var i in val) {\n\t var v = val[i];\n\t var v_id = null;\n\t var v_name = null;\n\t if ($.type(v) != 'string') {\n\t v_id = v.id;\n\t v_name = v.name;\n\t } else {\n\t v_id = v_name = v;\n\t }\n\t if (v_id != null) {\n\t this.add({\n\t id : v_id,\n\t name : v_name\n\t });\n\t }\n\t }\n\t }\n\t this._refresh();\n\t }\n\t // get current value\n\t var lst = [];\n\t this.$('.ui-list-id').each(function() {\n\t lst.push({\n\t id : $(this).prop('id'),\n\t name : $(this).find('.ui-list-name').html()\n\t });\n\t });\n\t if (lst.length == 0) {\n\t return null;\n\t }\n\t return lst;\n\t },\n\t\n\t /** Add row */\n\t add: function(options) {\n\t var self = this;\n\t if (this.$('[id=\"' + options.id + '\"]').length === 0) {\n\t if (Utils.validate(options.id)) {\n\t var $el = $(this._templateRow({\n\t id : options.id,\n\t name : options.name\n\t }));\n\t $el.on('click', function() {\n\t $el.remove();\n\t self._refresh();\n\t });\n\t $el.on('mouseover', function() {\n\t $el.addClass('portlet-highlight');\n\t });\n\t $el.on('mouseout', function() {\n\t $el.removeClass('portlet-highlight');\n\t });\n\t this.portlet.append($el);\n\t this._refresh();\n\t } else {\n\t this.message.update({ message: 'Please select a valid ' + this.name + '.', status: 'danger' });\n\t }\n\t } else {\n\t this.message.update({ message: 'This ' + this.name + ' is already in the list.' });\n\t }\n\t },\n\t\n\t /** Update available options */\n\t update: function(options) {\n\t this.select.update(options);\n\t },\n\t\n\t /** Refresh view */\n\t _refresh: function() {\n\t if (this.$('.ui-list-id').length > 0) {\n\t !this.multiple && this.button.disable();\n\t this.$('.ui-list-portlet').show();\n\t } else {\n\t this.button.enable();\n\t this.$('.ui-list-portlet').hide();\n\t }\n\t this.options.onchange && this.options.onchange();\n\t },\n\t\n\t /** Main Template */\n\t _template: function(options) {\n\t return '
                    ' +\n\t '
                    ' +\n\t '' +\n\t '' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ';\n\t },\n\t\n\t /** Row Template */\n\t _templateRow: function(options) {\n\t return '
                    ' +\n\t '' +\n\t '' + options.name + '' +\n\t '
                    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(16)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Buttons) {\n\t\n\t/** Base class for options based ui elements **/\n\tvar Base = Backbone.View.extend({\n\t // initialize\n\t initialize: function(options) {\n\t // link this\n\t var self = this;\n\t\n\t // configure options\n\t this.options = Utils.merge(options, {\n\t visible : true,\n\t data : [],\n\t id : Utils.uid(),\n\t error_text : 'No options available.',\n\t wait_text : 'Please wait...',\n\t multiple : false\n\t });\n\t\n\t // create new element\n\t this.setElement('
                    ');\n\t\n\t // create elements\n\t this.$message = $('
                    ');\n\t this.$options = $(this._template(options));\n\t this.$menu = $('
                    ');\n\t\n\t // append\n\t this.$el.append(this.$message);\n\t this.$el.append(this.$menu);\n\t this.$el.append(this.$options);\n\t\n\t // add select/unselect all button\n\t if (this.options.multiple) {\n\t this.all_button = new Buttons.ButtonCheck({\n\t onclick: function() {\n\t self.$('input').prop('checked', self.all_button.value() !== 0);\n\t self.trigger('change');\n\t }\n\t });\n\t this.$menu.append(this.all_button.$el);\n\t }\n\t\n\t // hide input field\n\t if (!this.options.visible) {\n\t this.$el.hide();\n\t }\n\t\n\t // initialize data\n\t this.update(this.options.data);\n\t\n\t // set initial value\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t\n\t // add change event. fires on trigger\n\t this.on('change', function() {\n\t this.options.onchange && this.options.onchange(this.value());\n\t });\n\t },\n\t\n\t /** Update options\n\t */\n\t update: function(options) {\n\t // backup current value\n\t var current = this._getValue();\n\t\n\t // remove all options\n\t this.$options.empty();\n\t\n\t // add new options using single option templates or full template\n\t if (this._templateOptions) {\n\t // rebuild options using full template\n\t this.$options.append(this._templateOptions(options));\n\t } else {\n\t // rebuild options using single option templates\n\t for (var key in options) {\n\t var $option = $(this._templateOption(options[key]));\n\t $option.addClass('ui-option');\n\t $option.tooltip({title: options[key].tooltip, placement: 'bottom'});\n\t this.$options.append($option);\n\t }\n\t }\n\t\n\t // add change events\n\t var self = this;\n\t this.$('input').on('change', function() {\n\t self.value(self._getValue());\n\t self.trigger('change');\n\t });\n\t\n\t // set previous value\n\t this.value(current);\n\t\n\t // data initialization has been completed\n\t this.unwait();\n\t },\n\t\n\t /** Return/Set current value\n\t */\n\t value: function (new_value) {\n\t // set new value if available\n\t if (new_value !== undefined) {\n\t // reset selection\n\t this.$('input').prop('checked', false);\n\t // set value\n\t if (new_value !== null) {\n\t // check if its an array\n\t if (!(new_value instanceof Array)) {\n\t new_value = [new_value];\n\t }\n\t // update to new selection\n\t for (var i in new_value) {\n\t this.$('input[value=\"' + new_value[i] + '\"]').first().prop('checked', true);\n\t }\n\t };\n\t }\n\t // get current value\n\t var current = this._getValue();\n\t if (this.all_button) {\n\t var value = current;\n\t if (!(value instanceof Array)) {\n\t value = 0;\n\t } else {\n\t value = value.length;\n\t }\n\t this.all_button.value(value, this._size());\n\t }\n\t return current;\n\t },\n\t\n\t /** Check if selected value exists (or any if multiple)\n\t */\n\t exists: function(value) {\n\t if (value !== undefined) {\n\t if (!(value instanceof Array)) {\n\t value = [value];\n\t }\n\t for (var i in value) {\n\t if (this.$('input[value=\"' + value[i] + '\"]').length > 0) {\n\t return true;\n\t }\n\t }\n\t }\n\t return false;\n\t },\n\t\n\t /** Return first available option\n\t */\n\t first: function() {\n\t var options = this.$('input').first();\n\t if (options.length > 0) {\n\t return options.val();\n\t } else {\n\t return null;\n\t }\n\t },\n\t\n\t /** Wait message during request processing\n\t */\n\t wait: function() {\n\t if (this._size() == 0) {\n\t this._messageShow(this.options.wait_text, 'info');\n\t this.$options.hide();\n\t this.$menu.hide();\n\t }\n\t },\n\t\n\t /** Hide wait message\n\t */\n\t unwait: function() {\n\t var total = this._size();\n\t if (total == 0) {\n\t this._messageShow(this.options.error_text, 'danger');\n\t this.$options.hide();\n\t this.$menu.hide();\n\t } else {\n\t this._messageHide();\n\t this.$options.css('display', 'inline-block');\n\t this.$menu.show();\n\t }\n\t },\n\t\n\t /** Return current selection\n\t */\n\t _getValue: function() {\n\t // track values in array\n\t var selected = [];\n\t this.$(':checked').each(function() {\n\t selected.push($(this).val());\n\t });\n\t\n\t // get selected elements\n\t if (!Utils.validate(selected)) {\n\t return null;\n\t }\n\t\n\t // return multiple or single value\n\t if (this.options.multiple) {\n\t return selected;\n\t } else {\n\t return selected[0];\n\t }\n\t },\n\t\n\t /** Returns the number of options\n\t */\n\t _size: function() {\n\t return this.$('.ui-option').length;\n\t },\n\t\n\t /** Show message instead if options\n\t */\n\t _messageShow: function(text, status) {\n\t this.$message.show();\n\t this.$message.removeClass();\n\t this.$message.addClass('ui-message alert alert-' + status);\n\t this.$message.html(text);\n\t },\n\t\n\t /** Hide message\n\t */\n\t _messageHide: function() {\n\t this.$message.hide();\n\t },\n\t\n\t /** Main template function\n\t */\n\t _template: function() {\n\t return '
                    ';\n\t }\n\t});\n\t\n\t/** Iconized **/\n\tvar BaseIcons = Base.extend({\n\t _templateOption: function(pair) {\n\t var id = Utils.uid();\n\t return '
                    ' +\n\t '' +\n\t '' +\n\t '
                    ';\n\t }\n\t});\n\t\n\t/** Radio button field **/\n\tvar Radio = {};\n\tRadio.View = BaseIcons.extend({\n\t initialize: function(options) {\n\t options.type = 'radio';\n\t BaseIcons.prototype.initialize.call(this, options);\n\t }\n\t});\n\t\n\t/** Checkbox options field **/\n\tvar Checkbox = {};\n\tCheckbox.View = BaseIcons.extend({\n\t initialize: function(options) {\n\t options.multiple = true;\n\t options.type = 'checkbox';\n\t BaseIcons.prototype.initialize.call(this, options);\n\t }\n\t});\n\t\n\t/** Radio button options field styled as classic buttons **/\n\tvar RadioButton = {};\n\tRadioButton.View = Base.extend({\n\t // initialize\n\t initialize: function(options) {\n\t Base.prototype.initialize.call(this, options);\n\t },\n\t\n\t /** Return/Set current value\n\t */\n\t value: function (new_value) {\n\t // set new value\n\t if (new_value !== undefined) {\n\t this.$('input').prop('checked', false);\n\t this.$('label').removeClass('active');\n\t this.$('[value=\"' + new_value + '\"]').prop('checked', true).closest('label').addClass('active');\n\t }\n\t\n\t // get and return value\n\t return this._getValue();\n\t },\n\t\n\t /** Template for a single option\n\t */\n\t _templateOption: function(pair) {\n\t var cls = 'fa ' + pair.icon;\n\t if (!pair.label) {\n\t cls += ' no-padding';\n\t }\n\t var tmpl = '';\n\t return tmpl;\n\t },\n\t\n\t /** Main template function\n\t */\n\t _template: function() {\n\t return '
                    ';\n\t }\n\t});\n\t\n\treturn {\n\t Base : Base,\n\t BaseIcons : BaseIcons,\n\t Radio : Radio,\n\t RadioButton : RadioButton,\n\t Checkbox : Checkbox\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function($, _) {(function (root, factory) {\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else {\n\t root.faIconButton = factory();\n\t }\n\t\n\t}(this, function () {\n\t//============================================================================\n\t /** Returns a jQuery object containing a clickable font-awesome button.\n\t * options:\n\t * tooltipConfig : option map for bootstrap tool tip\n\t * classes : array of class names (will always be classed as icon-btn)\n\t * disabled : T/F - add the 'disabled' class?\n\t * title : tooltip/title string\n\t * target : optional href target\n\t * href : optional href\n\t * faIcon : which font awesome icon to use\n\t * onclick : function to call when the button is clicked\n\t */\n\t var faIconButton = function( options ){\n\t options = options || {};\n\t options.tooltipConfig = options.tooltipConfig || { placement: 'bottom' };\n\t\n\t options.classes = [ 'icon-btn' ].concat( options.classes || [] );\n\t if( options.disabled ){\n\t options.classes.push( 'disabled' );\n\t }\n\t\n\t var html = [\n\t '',\n\t // could go with something less specific here - like 'html'\n\t '',\n\t ''\n\t ].join( '' );\n\t var $button = $( html ).tooltip( options.tooltipConfig );\n\t if( _.isFunction( options.onclick ) ){\n\t $button.click( options.onclick );\n\t }\n\t return $button;\n\t };\n\t\n\t//============================================================================\n\t return faIconButton;\n\t}));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.HandlebarsEnvironment = HandlebarsEnvironment;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\tvar _exception = __webpack_require__(9);\n\t\n\tvar _exception2 = _interopRequireDefault(_exception);\n\t\n\tvar _helpers = __webpack_require__(70);\n\t\n\tvar _decorators = __webpack_require__(68);\n\t\n\tvar _logger = __webpack_require__(78);\n\t\n\tvar _logger2 = _interopRequireDefault(_logger);\n\t\n\tvar VERSION = '4.0.5';\n\texports.VERSION = VERSION;\n\tvar COMPILER_REVISION = 7;\n\t\n\texports.COMPILER_REVISION = COMPILER_REVISION;\n\tvar REVISION_CHANGES = {\n\t 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n\t 2: '== 1.0.0-rc.3',\n\t 3: '== 1.0.0-rc.4',\n\t 4: '== 1.x.x',\n\t 5: '== 2.0.0-alpha.x',\n\t 6: '>= 2.0.0-beta.1',\n\t 7: '>= 4.0.0'\n\t};\n\t\n\texports.REVISION_CHANGES = REVISION_CHANGES;\n\tvar objectType = '[object Object]';\n\t\n\tfunction HandlebarsEnvironment(helpers, partials, decorators) {\n\t this.helpers = helpers || {};\n\t this.partials = partials || {};\n\t this.decorators = decorators || {};\n\t\n\t _helpers.registerDefaultHelpers(this);\n\t _decorators.registerDefaultDecorators(this);\n\t}\n\t\n\tHandlebarsEnvironment.prototype = {\n\t constructor: HandlebarsEnvironment,\n\t\n\t logger: _logger2['default'],\n\t log: _logger2['default'].log,\n\t\n\t registerHelper: function registerHelper(name, fn) {\n\t if (_utils.toString.call(name) === objectType) {\n\t if (fn) {\n\t throw new _exception2['default']('Arg not supported with multiple helpers');\n\t }\n\t _utils.extend(this.helpers, name);\n\t } else {\n\t this.helpers[name] = fn;\n\t }\n\t },\n\t unregisterHelper: function unregisterHelper(name) {\n\t delete this.helpers[name];\n\t },\n\t\n\t registerPartial: function registerPartial(name, partial) {\n\t if (_utils.toString.call(name) === objectType) {\n\t _utils.extend(this.partials, name);\n\t } else {\n\t if (typeof partial === 'undefined') {\n\t throw new _exception2['default']('Attempting to register a partial called \"' + name + '\" as undefined');\n\t }\n\t this.partials[name] = partial;\n\t }\n\t },\n\t unregisterPartial: function unregisterPartial(name) {\n\t delete this.partials[name];\n\t },\n\t\n\t registerDecorator: function registerDecorator(name, fn) {\n\t if (_utils.toString.call(name) === objectType) {\n\t if (fn) {\n\t throw new _exception2['default']('Arg not supported with multiple decorators');\n\t }\n\t _utils.extend(this.decorators, name);\n\t } else {\n\t this.decorators[name] = fn;\n\t }\n\t },\n\t unregisterDecorator: function unregisterDecorator(name) {\n\t delete this.decorators[name];\n\t }\n\t};\n\t\n\tvar log = _logger2['default'].log;\n\t\n\texports.log = log;\n\texports.createFrame = _utils.createFrame;\n\texports.logger = _logger2['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7cUJBQTRDLFNBQVM7O3lCQUMvQixhQUFhOzs7O3VCQUNFLFdBQVc7OzBCQUNSLGNBQWM7O3NCQUNuQyxVQUFVOzs7O0FBRXRCLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQzs7QUFDeEIsSUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7OztBQUU1QixJQUFNLGdCQUFnQixHQUFHO0FBQzlCLEdBQUMsRUFBRSxhQUFhO0FBQ2hCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxVQUFVO0FBQ2IsR0FBQyxFQUFFLGtCQUFrQjtBQUNyQixHQUFDLEVBQUUsaUJBQWlCO0FBQ3BCLEdBQUMsRUFBRSxVQUFVO0NBQ2QsQ0FBQzs7O0FBRUYsSUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7O0FBRTlCLFNBQVMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDbkUsTUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQzdCLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUMvQixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0FBRW5DLGtDQUF1QixJQUFJLENBQUMsQ0FBQztBQUM3Qix3Q0FBMEIsSUFBSSxDQUFDLENBQUM7Q0FDakM7O0FBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ2hDLGFBQVcsRUFBRSxxQkFBcUI7O0FBRWxDLFFBQU0scUJBQVE7QUFDZCxLQUFHLEVBQUUsb0JBQU8sR0FBRzs7QUFFZixnQkFBYyxFQUFFLHdCQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDakMsUUFBSSxnQkFBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3RDLFVBQUksRUFBRSxFQUFFO0FBQUUsY0FBTSwyQkFBYyx5Q0FBeUMsQ0FBQyxDQUFDO09BQUU7QUFDM0Usb0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QixNQUFNO0FBQ0wsVUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekI7R0FDRjtBQUNELGtCQUFnQixFQUFFLDBCQUFTLElBQUksRUFBRTtBQUMvQixXQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDM0I7O0FBRUQsaUJBQWUsRUFBRSx5QkFBUyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ3ZDLFFBQUksZ0JBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtBQUN0QyxvQkFBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdCLE1BQU07QUFDTCxVQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTtBQUNsQyxjQUFNLHlFQUEwRCxJQUFJLG9CQUFpQixDQUFDO09BQ3ZGO0FBQ0QsVUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7S0FDL0I7R0FDRjtBQUNELG1CQUFpQixFQUFFLDJCQUFTLElBQUksRUFBRTtBQUNoQyxXQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDNUI7O0FBRUQsbUJBQWlCLEVBQUUsMkJBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxRQUFJLGdCQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDdEMsVUFBSSxFQUFFLEVBQUU7QUFBRSxjQUFNLDJCQUFjLDRDQUE0QyxDQUFDLENBQUM7T0FBRTtBQUM5RSxvQkFBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQy9CLE1BQU07QUFDTCxVQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUM1QjtHQUNGO0FBQ0QscUJBQW1CLEVBQUUsNkJBQVMsSUFBSSxFQUFFO0FBQ2xDLFdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM5QjtDQUNGLENBQUM7O0FBRUssSUFBSSxHQUFHLEdBQUcsb0JBQU8sR0FBRyxDQUFDOzs7UUFFcEIsV0FBVztRQUFFLE1BQU0iLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4wLjUnO1xuZXhwb3J0IGNvbnN0IENPTVBJTEVSX1JFVklTSU9OID0gNztcblxuZXhwb3J0IGNvbnN0IFJFVklTSU9OX0NIQU5HRVMgPSB7XG4gIDE6ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFjdHVhbGx5IHJldjIgYnV0IGRvZXNuJ3QgcmVwb3J0IGl0XG4gIDI6ICc9PSAxLjAuMC1yYy4zJyxcbiAgMzogJz09IDEuMC4wLXJjLjQnLFxuICA0OiAnPT0gMS54LngnLFxuICA1OiAnPT0gMi4wLjAtYWxwaGEueCcsXG4gIDY6ICc+PSAyLjAuMC1iZXRhLjEnLFxuICA3OiAnPj0gNC4wLjAnXG59O1xuXG5jb25zdCBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMsIGRlY29yYXRvcnMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuICB0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzIHx8IHt9O1xuXG4gIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG4gIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBsb2dnZXIsXG4gIGxvZzogbG9nZ2VyLmxvZyxcblxuICByZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaGVscGVyc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgZXh0ZW5kKHRoaXMucGFydGlhbHMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHBhcnRpYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oYEF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIiR7bmFtZX1cIiBhcyB1bmRlZmluZWRgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSBwYXJ0aWFsO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJ0aWFsc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5kZWNvcmF0b3JzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvcmF0b3JzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuZGVjb3JhdG9yc1tuYW1lXTtcbiAgfVxufTtcblxuZXhwb3J0IGxldCBsb2cgPSBsb2dnZXIubG9nO1xuXG5leHBvcnQge2NyZWF0ZUZyYW1lLCBsb2dnZXJ9O1xuIl19\n\n\n/***/ },\n/* 28 */,\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {/**\n\t * Popover wrapper\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(4) ], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\tvar View = Backbone.View.extend({\n\t optionsDefault: {\n\t with_close : true,\n\t title : null,\n\t placement : 'top',\n\t container : 'body',\n\t body : null\n\t },\n\t\n\t initialize: function ( options ) {\n\t this.setElement( this._template() );\n\t this.uid = Utils.uid();\n\t this.options = _.defaults( options || {}, this.optionsDefault );\n\t this.options.container.parent().append( this.el );\n\t this.$title = this.$( '.popover-title-label' );\n\t this.$close = this.$( '.popover-close' );\n\t this.$body = this.$( '.popover-content' );\n\t\n\t // add initial content\n\t this.options.body && this.append( this.options.body );\n\t\n\t // add event to hide if click is outside of popup and not on container\n\t var self = this;\n\t $( 'body' ).on( 'mousedown.' + this.uid, function( e ) {\n\t // the 'is' for buttons that trigger popups\n\t // the 'has' for icons within a button that triggers a popup\n\t self.visible && !$( self.options.container ).is( e.target ) && !$( self.el ).is( e.target ) &&\n\t $( self.el ).has( e.target ).length === 0 && self.hide();\n\t });\n\t },\n\t\n\t /**\n\t * Render popover\n\t */\n\t render: function() {\n\t this.$title.html( this.options.title );\n\t this.$el.removeClass().addClass( 'ui-popover popover fade in' ).addClass( this.options.placement );\n\t this.$el.css( this._get_placement( this.options.placement ) );\n\t\n\t // configure close option\n\t var self = this;\n\t if ( this.options.with_close ) {\n\t this.$close.on( 'click', function() { self.hide() } ).show();\n\t } else {\n\t this.$close.off().hide();\n\t }\n\t },\n\t\n\t /**\n\t * Set the popover title\n\t * @params{ String } newTitle - New popover title\n\t */\n\t title: function( newTitle ) {\n\t if ( newTitle !== undefined ) {\n\t this.options.title = newTitle;\n\t this.$title.html( newTitle );\n\t }\n\t },\n\t\n\t /**\n\t * Show popover\n\t */\n\t show: function() {\n\t this.render();\n\t this.$el.show();\n\t this.visible = true;\n\t },\n\t\n\t /**\n\t * Hide popover\n\t */\n\t hide: function() {\n\t this.$el.hide();\n\t this.visible = false;\n\t },\n\t\n\t /**\n\t * Append new content to the popover\n\t * @params{ Object } $el - Dom element\n\t */\n\t append: function( $el ) {\n\t this.$body.append( $el );\n\t },\n\t\n\t /**\n\t * Remove all content\n\t */\n\t empty: function() {\n\t this.$body.empty();\n\t },\n\t\n\t /**\n\t * Remove popover\n\t */\n\t remove: function() {\n\t $( 'body' ).off( 'mousedown.' + this.uid );\n\t this.$el.remove();\n\t },\n\t\n\t /**\n\t * Improve popover location/placement\n\t */\n\t _get_placement: function( placement ) {\n\t // get popover dimensions\n\t var width = this._get_width( this.$el );\n\t var height = this.$el.height();\n\t\n\t // get container details\n\t var $container = this.options.container;\n\t var container_width = this._get_width( $container );\n\t var container_height = this._get_height( $container );\n\t var container_position = $container.position();\n\t\n\t // get position\n\t var top = left = 0;\n\t if ([ 'top', 'bottom' ].indexOf( placement ) != -1) {\n\t left = container_position.left - width + ( container_width + width ) / 2;\n\t switch ( placement ) {\n\t case 'top':\n\t top = container_position.top - height - 5;\n\t break;\n\t case 'bottom':\n\t top = container_position.top + container_height + 5;\n\t break;\n\t }\n\t } else {\n\t top = container_position.top - height + ( container_height + height ) / 2;\n\t switch ( placement ) {\n\t case 'right':\n\t left = container_position.left + container_width;\n\t break;\n\t }\n\t }\n\t return { top: top, left: left };\n\t },\n\t\n\t /**\n\t * Returns padding/margin corrected width\n\t */\n\t _get_width: function( $el ) {\n\t return $el.width() + parseInt( $el.css( 'padding-left' ) ) + parseInt( $el.css( 'margin-left' ) ) +\n\t parseInt( $el.css( 'padding-right' ) ) + parseInt( $el.css( 'margin-right' ) );\n\t },\n\t\n\t /**\n\t * Returns padding corrected height\n\t */\n\t _get_height: function( $el ) {\n\t return $el.height() + parseInt( $el.css( 'padding-top' ) ) + parseInt( $el.css( 'padding-bottom' ) );\n\t },\n\t\n\t /**\n\t * Return the popover template\n\t */\n\t _template: function( options ) {\n\t return '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\t\n\t/**\n\t * A plugin for initializing select2 input items.\n\t * Make sure the select2 library itself is loaded beforehand.\n\t * Also the element to which select2 will be appended has to \n\t * be created before select2 initialization (and passed as option).\n\t */\n\tvar View = Backbone.View.extend(\n\t{\n\t // options\n\t optionsDefault: {\n\t css : '',\n\t placeholder : 'No data available',\n\t data : [],\n\t value : null,\n\t multiple : false,\n\t minimumInputLength : 0,\n\t // example format of initial data: \"id:name,55:anotherrole@role.com,27:role@role.com\"\n\t initialData : ''\n\t },\n\t \n\t // initialize\n\t initialize : function(options) {\n\t // configure options\n\t this.options = Utils.merge(options, this.optionsDefault);\n\t \n\t // create new element\n\t this.setElement(this._template(this.options));\n\t \n\t // check if container exists\n\t if (!this.options.container) {\n\t console.log('ui-select::initialize() : container not specified.');\n\t return;\n\t }\n\t \n\t // add to dom\n\t this.options.container.append(this.$el);\n\t \n\t // link selection dictionary\n\t this.select_data = this.options.data;\n\t \n\t // refresh\n\t this._refresh();\n\t \n\t if (!this.options.multiple){\n\t // initial value\n\t if (this.options.value) {\n\t this._setValue(this.options.value);\n\t }\n\t \n\t // add change event\n\t var self = this;\n\t if (this.options.onchange) {\n\t this.$el.on('change', function() {\n\t self.options.onchange(self.value());\n\t });\n\t }\n\t }\n\t },\n\t \n\t // value\n\t value : function (new_value) {\n\t // get current id/value\n\t var before = this._getValue();\n\t \n\t // check if new_value is defined\n\t if (new_value !== undefined) {\n\t this._setValue(new_value);\n\t }\n\t \n\t // get current id/value\n\t var after = this._getValue();\n\t \n\t // fire onchange\n\t if ((after != before && this.options.onchange)) {\n\t this.options.onchange(after);\n\t }\n\t \n\t // return current value\n\t return after;\n\t },\n\t \n\t // label\n\t text : function () {\n\t return this.$el.select2('data').text;\n\t },\n\t \n\t // disabled\n\t disabled: function() {\n\t return !this.$el.select2('enable');\n\t },\n\t\n\t // enable\n\t enable: function() {\n\t this.$el.select2('enable', true);\n\t },\n\t \n\t // disable\n\t disable: function() {\n\t this.$el.select2('enable', false);\n\t },\n\t \n\t // add\n\t add: function(options) {\n\t // add options\n\t this.select_data.push({\n\t id : options.id,\n\t text : options.text\n\t });\n\t \n\t // refresh\n\t this._refresh();\n\t },\n\t \n\t // remove\n\t del: function(id) {\n\t // search option\n\t var index = this._getIndex(id);\n\t \n\t // check if found\n\t if (index != -1) {\n\t // remove options\n\t this.select_data.splice(index, 1);\n\t \n\t // refresh\n\t this._refresh();\n\t }\n\t },\n\t \n\t // remove\n\t remove: function() {\n\t this.$el.select2('destroy');\n\t },\n\t \n\t // update\n\t update: function(options) {\n\t // copy options\n\t this.select_data = [];\n\t for (var key in options.data) {\n\t this.select_data.push(options.data[key]);\n\t }\n\t \n\t // refresh\n\t this._refresh();\n\t },\n\t \n\t // refresh\n\t _refresh: function() {\n\t // add select2 data based on type of input\n\t if (!this.options.multiple){\n\t var selected = this._getValue();\n\t var select_opt = {\n\t data : this.select_data,\n\t containerCssClass : this.options.css,\n\t placeholder : this.options.placeholder,\n\t dropdownAutoWidth : true\n\t };\n\t this.$el.select2(select_opt);\n\t // select previous value (if exists)\n\t this._setValue(selected);\n\t } else {\n\t var select_opt = {\n\t multiple : this.options.multiple,\n\t containerCssClass : this.options.css,\n\t placeholder : this.options.placeholder,\n\t minimumInputLength : this.options.minimumInputLength,\n\t ajax : this.options.ajax,\n\t dropdownCssClass : this.options.dropdownCssClass,\n\t escapeMarkup : this.options.escapeMarkup,\n\t formatResult : this.options.formatResult,\n\t formatSelection : this.options.formatSelection,\n\t initSelection : this.options.initSelection,\n\t initialData : this.options.initialData\n\t };\n\t this.$el.select2(select_opt);\n\t }\n\t },\n\t \n\t // get index\n\t _getIndex: function(value) {\n\t // search index\n\t for (var key in this.select_data) {\n\t if (this.select_data[key].id == value) {\n\t return key;\n\t }\n\t }\n\t \n\t // not found\n\t return -1;\n\t },\n\t \n\t // get value\n\t _getValue: function() {\n\t return this.$el.select2('val');\n\t },\n\t \n\t // set value\n\t _setValue: function(new_value) {\n\t var index = this._getIndex(new_value);\n\t if (index == -1) {\n\t if (this.select_data.length > 0) {\n\t new_value = this.select_data[0].id;\n\t }\n\t }\n\t this.$el.select2('val', new_value);\n\t },\n\t \n\t // element\n\t _template: function(options) {\n\t return '';\n\t }\n\t});\n\t\n\treturn {\n\t View : View\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\t\n\t// return\n\tvar View = Backbone.View.extend({\n\t // defaults options\n\t optionsDefault: {\n\t title_new : '',\n\t operations : null,\n\t onnew : null,\n\t max : null,\n\t onchange : null\n\t },\n\t \n\t // initialize\n\t initialize : function(options) {\n\t // configure\n\t this.visible = false;\n\t this.$nav = null;\n\t this.$content = null;\n\t this.first_tab = null;\n\t this.current_id = null;\n\t \n\t // configure options\n\t this.options = Utils.merge(options, this.optionsDefault);\n\t \n\t // create tabs\n\t var $tabs = $(this._template(this.options));\n\t \n\t // link elements\n\t this.$nav = $tabs.find('.tab-navigation');\n\t this.$content = $tabs.find('.tab-content');\n\t \n\t // create new element\n\t this.setElement($tabs);\n\t \n\t // clear list\n\t this.list = {};\n\t \n\t // link this\n\t var self = this;\n\t \n\t // append operations\n\t if (this.options.operations) {\n\t $.each(this.options.operations, function(name, item) {\n\t item.$el.prop('id', name);\n\t self.$nav.find('.operations').append(item.$el);\n\t });\n\t }\n\t \n\t // add built-in add-new-tab tab\n\t if (this.options.onnew) {\n\t // create tab object\n\t var $tab_new = $(this._template_tab_new(this.options));\n\t \n\t // append to navbar\n\t this.$nav.append($tab_new);\n\t \n\t // add tooltip\n\t $tab_new.tooltip({title: 'Add a new tab', placement: 'bottom', container: self.$el});\n\t \n\t // link click event\n\t $tab_new.on('click', function(e) {\n\t $tab_new.tooltip('hide');\n\t self.options.onnew();\n\t });\n\t }\n\t },\n\t \n\t // size\n\t size: function() {\n\t return _.size(this.list);\n\t },\n\t \n\t // front\n\t current: function() {\n\t return this.$el.find('.tab-pane.active').attr('id');\n\t },\n\t \n\t // append\n\t add: function(options) {\n\t // self\n\t var self = this;\n\t \n\t // get tab id\n\t var id = options.id;\n\t\n\t // create tab object\n\t var $tab_title = $(this._template_tab(options));\n\t var $tab_content = $(this._template_tab_content(options));\n\t \n\t // add to list\n\t this.list[id] = options.ondel ? true : false;\n\t \n\t // add a new tab either before the add-new-tab tab or behind the last tab\n\t if (this.options.onnew) {\n\t this.$nav.find('#new-tab').before($tab_title);\n\t } else {\n\t this.$nav.append($tab_title);\n\t }\n\t \n\t // add content\n\t $tab_content.append(options.$el);\n\t this.$content.append($tab_content);\n\t \n\t // activate this tab if this is the first tab\n\t if (this.size() == 1) {\n\t $tab_title.addClass('active');\n\t $tab_content.addClass('active');\n\t this.first_tab = id;\n\t }\n\t \n\t // hide add tab\n\t if (this.options.max && this.size() >= this.options.max) {\n\t this.$el.find('#new-tab').hide();\n\t }\n\t \n\t // add click event to remove tab\n\t if (options.ondel) {\n\t var $del_icon = $tab_title.find('#delete');\n\t $del_icon.tooltip({title: 'Delete this tab', placement: 'bottom', container: self.$el});\n\t $del_icon.on('click', function() {\n\t $del_icon.tooltip('destroy');\n\t self.$el.find('.tooltip').remove();\n\t options.ondel();\n\t return false;\n\t });\n\t }\n\t \n\t // add custom click event handler\n\t $tab_title.on('click', function(e) {\n\t // prevent default\n\t e.preventDefault();\n\t \n\t // click\n\t if (options.onclick) {\n\t options.onclick();\n\t } else {\n\t self.show(id);\n\t }\n\t });\n\t \n\t // initialize current id\n\t if (!this.current_id) {\n\t this.current_id = id;\n\t }\n\t },\n\t \n\t // delete tab\n\t del: function(id) {\n\t // delete tab from dom\n\t this.$el.find('#tab-' + id).remove();\n\t this.$el.find('#' + id).remove();\n\t \n\t // check if first tab has been deleted\n\t if (this.first_tab == id) {\n\t this.first_tab = null;\n\t }\n\t \n\t // show first tab\n\t if (this.first_tab != null) {\n\t this.show(this.first_tab);\n\t }\n\t \n\t // delete from list\n\t if (this.list[id]) {\n\t delete this.list[id];\n\t }\n\t \n\t // show add tab\n\t if (this.size() < this.options.max) {\n\t this.$el.find('#new-tab').show();\n\t }\n\t },\n\t \n\t // delete tab\n\t delRemovable: function() {\n\t for (var id in this.list) {\n\t this.del(id);\n\t }\n\t },\n\t \n\t // show\n\t show: function(id){\n\t // show tab view\n\t this.$el.fadeIn('fast');\n\t this.visible = true;\n\t \n\t // show selected tab\n\t if (id) {\n\t // reassign active class\n\t this.$el.find('#tab-' + this.current_id).removeClass('active');\n\t this.$el.find('#' + this.current_id).removeClass('active');\n\t this.$el.find('#tab-' + id).addClass('active');\n\t this.$el.find('#' + id).addClass('active');\n\t \n\t // update current id\n\t this.current_id = id;\n\t }\n\t \n\t // change\n\t if (this.options.onchange) {\n\t this.options.onchange(id);\n\t }\n\t },\n\t \n\t // hide\n\t hide: function(){\n\t this.$el.fadeOut('fast');\n\t this.visible = false;\n\t },\n\t\n\t // hide operation\n\t hideOperation: function(id) {\n\t this.$nav.find('#' + id).hide();\n\t },\n\t\n\t // show operation\n\t showOperation: function(id) {\n\t this.$nav.find('#' + id).show();\n\t },\n\t \n\t // set operation\n\t setOperation: function(id, callback) {\n\t var $el = this.$nav.find('#' + id);\n\t $el.off('click');\n\t $el.on('click', callback);\n\t },\n\t \n\t // title\n\t title: function(id, new_title) {\n\t var $el = this.$el.find('#tab-title-text-' + id);\n\t if (new_title) {\n\t $el.html(new_title);\n\t }\n\t return $el.html();\n\t },\n\t \n\t // retitle\n\t retitle: function(new_title) {\n\t var index = 0;\n\t for (var id in this.list) {\n\t this.title(id, ++index + ': ' + new_title);\n\t }\n\t },\n\t \n\t // fill template\n\t _template: function(options) {\n\t return '
                    ' +\n\t '
                      ' +\n\t '
                      ' +\n\t '
                    '+\n\t '
                    ' +\n\t '
                    ';\n\t },\n\t \n\t // fill template tab\n\t _template_tab_new: function(options) {\n\t return '
                  3. ' +\n\t '' +\n\t '' +\n\t options.title_new +\n\t '' +\n\t '
                  4. ';\n\t },\n\t \n\t // fill template tab\n\t _template_tab: function(options) {\n\t var tmpl = '
                  5. ' +\n\t '' +\n\t '' + options.title + '';\n\t \n\t if (options.ondel) {\n\t tmpl += '';\n\t }\n\t \n\t tmpl += '' +\n\t '
                  6. ';\n\t \n\t return tmpl;\n\t },\n\t \n\t // fill template tab content\n\t _template_tab_content: function(options) {\n\t return '
                    ';\n\t }\n\t});\n\t\n\treturn {\n\t View : View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 32 */\n/***/ function(module, exports) {\n\n\t/**\n\t * Parser.js\n\t * Copyright 2012-13 Mayank Lahiri\n\t * mlahiri@gmail.com\n\t * Released under the BSD License.\n\t *\n\t * A forgiving Bibtex parser that can:\n\t * \n\t * (1) operate in streaming or block mode, extracting entries as dictionaries. \n\t * (2) convert Latex special characters to UTF-8.\n\t * (3) best-effort parse malformed entries.\n\t * (4) run in a CommonJS environment or a browser, without any dependencies.\n\t * (5) be advanced-compiled by Google Closure Compiler.\n\t * \n\t * Handwritten as a labor of love, not auto-generated from a grammar. \n\t *\n\t * Modes of usage:\n\t *\n\t * (1) Synchronous, string\n\t *\n\t * var entries = BibtexParser(text);\n\t * console.log(entries);\n\t *\n\t * (2) Asynchronous, stream\n\t *\n\t * var entryCallback = function(entry) { console.log(entry); }\n\t * var parser = new BibtexParser(entryCallback);\n\t * parser.parse(chunk1);\n\t * parser.parse(chunk2);\n\t * ...\n\t * \n\t * @param {text|function(Object)} arg Either a Bibtex string or callback \n\t * function for processing parsed entries.\n\t * @constructor\n\t */\n\tfunction BibtexParser(arg0) {\n\t // Determine how this function is to be used\n\t if (typeof arg0 == 'string') {\n\t // Passed a string, synchronous call without 'new'\n\t var tempStorage = {};\n\t var entries = [];\n\t function accumulator(entry) {\n\t entries.push(entry);\n\t }\n\t var parser = BibtexParser.call(tempStorage, accumulator);\n\t parser.parse(arg0);\n\t return {\n\t 'entries': entries,\n\t 'errors': parser.getErrors()\n\t }\n\t }\n\t if (typeof arg0 != 'function') {\n\t throw 'Invalid parser construction.';\n\t }\n\t\n\t /** @enum {number} */\n\t this.STATES_ = {\n\t ENTRY_OR_JUNK: 0,\n\t OBJECT_TYPE: 1,\n\t ENTRY_KEY: 2, \n\t KV_KEY: 3, \n\t EQUALS: 4,\n\t KV_VALUE: 5 \n\t }\n\t /** @private */ this.DATA_ = {};\n\t /** @private */ this.CALLBACK_ = arg0;\n\t /** @private */ this.CHAR_ = 0;\n\t /** @private */ this.LINE_ = 1;\n\t /** @private */ this.CHAR_IN_LINE_ = 0;\n\t /** @private */ this.SKIPWS_ = true;\n\t /** @private */ this.SKIPCOMMENT_ = true;\n\t /** @private */ this.PARSETMP_ = {};\n\t /** @private */ this.SKIPTILLEOL_ = false;\n\t /** @private */ this.VALBRACES_ = null;\n\t /** @private */ this.BRACETYPE_ = null;\n\t /** @private */ this.BRACECOUNT_ = 0;\n\t /** @private */ this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t /** @private */ this.ERRORS_ = [];\n\t /** @private */ this.ENTRY_TYPES_ = {\n\t 'inproceedings' : 1,\n\t 'proceedings' : 2,\n\t 'article' : 3,\n\t 'techreport' : 4,\n\t 'misc' : 5,\n\t 'mastersthesis' : 6,\n\t 'book' : 7,\n\t 'phdthesis' : 8,\n\t 'incollection' : 9,\n\t 'unpublished' : 10,\n\t 'inbook' : 11,\n\t 'manual' : 12,\n\t 'periodical' : 13,\n\t 'booklet' : 14,\n\t 'masterthesis' : 15,\n\t 'conference' : 16\n\t ,'online' : 998 // Galaxy MOD: Handle @online entries for preprints.\n\t ,'data' : 999 // Galaxy MOD: Handle @data citations coming from figshare.\n\t }\n\t /** @private */ this.MACROS_ = {\n\t 'jan' : 'January',\n\t 'feb' : 'February',\n\t 'mar' : 'March',\n\t 'apr' : 'April',\n\t 'may' : 'May',\n\t 'jun' : 'June',\n\t 'jul' : 'July',\n\t 'aug' : 'August',\n\t 'sep' : 'September',\n\t 'oct' : 'October',\n\t 'nov' : 'November',\n\t 'dec' : 'December',\n\t 'Jan' : 'January',\n\t 'Feb' : 'February',\n\t 'Mar' : 'March',\n\t 'Apr' : 'April',\n\t 'May' : 'May',\n\t 'Jun' : 'June',\n\t 'Jul' : 'July',\n\t 'Aug' : 'August',\n\t 'Sep' : 'September',\n\t 'Oct' : 'October',\n\t 'Nov' : 'November',\n\t 'Dec' : 'December'\n\t }\n\t\n\t /**\n\t * Gets an array of all errors encountered during parsing.\n\t * Array entries are of the format:\n\t * [ line number, character in line, character in stream, error text ]\n\t *\n\t * @returns Array\n\t * @public\n\t */\n\t this.getErrors = function() {\n\t return this.ERRORS_;\n\t }\n\t\n\t /**\n\t * Processes a chunk of data\n\t * @public\n\t */\n\t this.parse = function(chunk) {\n\t for (var i = 0; i < chunk.length; i++)\n\t this.processCharacter_(chunk[i]);\n\t }\n\t\n\t /**\n\t * Logs error at current stream position.\n\t *\n\t * @private\n\t */\n\t this.error_ = function(text) {\n\t this.ERRORS_.push([ this.LINE_, \n\t this.CHAR_IN_LINE_,\n\t this.CHAR_,\n\t text ])\n\t }\n\t\n\t /**\n\t * Called after an entire entry has been parsed from the stream.\n\t * Performs post-processing and invokes the entry callback pointed to by\n\t * this.CALLBACK_. Parsed (but unprocessed) entry data is in this.DATA_.\n\t */\n\t this.processEntry_ = function() {\n\t var data = this.DATA_;\n\t if (data.Fields) \n\t for (var f in data.Fields) {\n\t var raw = data.Fields[f];\n\t\n\t // Convert Latex/Bibtex special characters to UTF-8 equivalents\n\t for (var i = 0; i < this.CHARCONV_.length; i++) {\n\t var re = this.CHARCONV_[i][0];\n\t var rep = this.CHARCONV_[i][1];\n\t raw = raw.replace(re, rep);\n\t }\n\t\n\t // Basic substitutions\n\t raw = raw.replace(/[\\n\\r\\t]/g, ' ')\n\t .replace(/\\s\\s+/g, ' ')\n\t .replace(/^\\s+|\\s+$/g, '')\n\t\n\t // Remove braces and backslashes\n\t var len = raw.length;\n\t var processed = '';\n\t for (var i = 0; i < len; i++) {\n\t var c = raw[i];\n\t var skip = false;\n\t if (c == '\\\\' && i < len-1) \n\t c = raw[++i];\n\t else {\n\t if (c == '{' || c == '}')\n\t skip = true;\n\t }\n\t if (!skip)\n\t processed += c;\n\t }\n\t data.Fields[f] = processed\n\t }\n\t\n\t if (data.ObjectType == 'string') {\n\t for (var f in data.Fields) { \n\t this.MACROS_[f] = data.Fields[f];\n\t }\n\t } else {\n\t // Parsed a new Bibtex entry\n\t this.CALLBACK_(data);\n\t }\n\t }\n\t\n\t\n\t /**\n\t * Processes next character in the stream, invoking the callback after \n\t * each entry has been found and processed.\n\t * \n\t * @private\n\t * @param {string} c Next character in input stream\n\t */\n\t this.processCharacter_ = function(c) {\n\t // Housekeeping\n\t this.CHAR_++;\n\t this.CHAR_IN_LINE_++;\n\t if (c == '\\n') {\n\t this.LINE_++;\n\t this.CHAR_IN_LINE_ = 1;\n\t }\n\t\n\t // Convenience states for skipping whitespace when needed\n\t if (this.SKIPTILLEOL_) {\n\t if (c == '\\n')\n\t this.SKIPTILLEOL_ = false;\n\t return;\n\t }\n\t if (this.SKIPCOMMENT_ && c == '%') {\n\t this.SKIPTILLEOL_ = true;\n\t return;\n\t }\n\t if (this.SKIPWS_ && /\\s/.test(c))\n\t return;\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t this.SKIPTILLEOL_ = false;\n\t\n\t // Main state machine\n\t var AnotherIteration = true;\n\t while (AnotherIteration) {\n\t //console.log(this.LINE_, this.CHAR_IN_LINE_, this.STATE_, c)\n\t AnotherIteration = false;\n\t switch(this.STATE_) {\n\t // -- Scan for an object marker ('@')\n\t // -- Reset temporary data structure in case previous entry was garbled\n\t case this.STATES_.ENTRY_OR_JUNK:\n\t if (c == '@') {\n\t // SUCCESS: Parsed a valid start-of-object marker.\n\t // NEXT_STATE: OBJECT_TYPE\n\t this.STATE_ = this.STATES_.OBJECT_TYPE;\n\t this.DATA_ = {\n\t ObjectType : ''\n\t };\n\t }\n\t this.BRACETYPE_ = null;\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t break;\n\t\n\t // Start at first non-whitespace character after start-of-object '@'\n\t // -- Accept [A-Za-z], break on non-matching character\n\t // -- Populate this.DATA_.EntryType and this.DATA_.ObjectType\n\t case this.STATES_.OBJECT_TYPE:\n\t if (/[A-Za-z]/.test(c)) {\n\t this.DATA_.ObjectType += c.toLowerCase();\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t } else {\n\t // Break from state and validate object type\n\t var ot = this.DATA_.ObjectType;\n\t if (ot == 'comment') {\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t } else {\n\t if (ot == 'string') {\n\t this.DATA_.ObjectType = ot;\n\t this.DATA_.Fields = {};\n\t this.BRACETYPE_ = c;\n\t this.BRACECOUNT_ = 1;\n\t this.STATE_ = this.STATES_.KV_KEY;\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.PARSETMP_ = {\n\t Key: ''\n\t }\n\t } else {\n\t if (ot == 'preamble') {\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t } else {\n\t if (ot in this.ENTRY_TYPES_) {\n\t // SUCCESS: Parsed a valid object type.\n\t // NEXT_STATE: ENTRY_KEY\n\t this.DATA_.ObjectType = 'entry';\n\t this.DATA_.EntryType = ot;\n\t this.DATA_.EntryKey = '';\n\t this.STATE_ = this.STATES_.ENTRY_KEY;\n\t AnotherIteration = true;\n\t } else {\n\t // ERROR: Unrecognized object type.\n\t // NEXT_STATE: ENTRY_OR_JUNK\n\t this.error_('Unrecognized object type: \"' +\n\t this.DATA_.ObjectType + '\"')\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t }\n\t }\n\t }\n\t }\n\t }\n\t break;\n\t\n\t // Start at first non-alphabetic character after an entry type\n\t // -- Populate this.DATA_.EntryKey\n\t case this.STATES_.ENTRY_KEY:\n\t if ((c === '{' || c === '(') && this.BRACETYPE_ == null) {\n\t this.BRACETYPE_ = c;\n\t this.BRACECOUNT_ = 1;\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t break;\n\t }\n\t if (/[,%\\s]/.test(c)) {\n\t if (this.DATA_.EntryKey.length < 1) { \n\t // Skip comments and whitespace before entry key\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t } else {\n\t if (this.BRACETYPE_ == null) {\n\t // ERROR: No opening brace for object\n\t // NEXT_STATE: ENTRY_OR_JUNK\n\t this.error_('No opening brace for object.');\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t } else {\n\t // SUCCESS: Parsed an entry key\n\t // NEXT_STATE: KV_KEY\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t AnotherIteration = true;\n\t this.STATE_ = this.STATES_.KV_KEY;\n\t this.PARSETMP_.Key= '';\n\t this.DATA_.Fields = {};\n\t }\n\t }\n\t } else {\n\t this.DATA_.EntryKey += c;\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t }\n\t break;\n\t\n\t // Start at first non-whitespace/comment character after entry key.\n\t // -- Populate this.PARSETMP_.Key\n\t case this.STATES_.KV_KEY:\n\t // Test for end of entry\n\t if ((c == '}' && this.BRACETYPE_ == '{') ||\n\t (c == ')' && this.BRACETYPE_ == '(')) {\n\t // SUCCESS: Parsed an entry, possible incomplete\n\t // NEXT_STATE: ENTRY_OR_JUNK\n\t this.processEntry_();\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t break;\n\t }\n\t if (/[\\-A-Za-z:]/.test(c)) {\n\t // Add to key\n\t this.PARSETMP_.Key += c;\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t } else {\n\t // Either end of key or we haven't encountered start of key\n\t if (this.PARSETMP_.Key.length < 1) {\n\t // Keep going till we see a key\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t } else {\n\t // SUCCESS: Found full key in K/V pair\n\t // NEXT_STATE: EQUALS\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.EQUALS;\n\t AnotherIteration = true;\n\t }\n\t }\n\t break;\n\t\n\t // Start at first non-alphabetic character after K/V pair key.\n\t case this.STATES_.EQUALS:\n\t if ((c == '}' && this.BRACETYPE_ == '{') ||\n\t (c == ')' && this.BRACETYPE_ == '(')) {\n\t // ERROR: K/V pair with key but no value\n\t // NEXT_STATE: ENTRY_OR_JUNK\n\t this.error_('Key-value pair has key \"' +\n\t this.PARSETMP_.Key + '\", but no value.');\n\t this.processEntry_();\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n\t break;\n\t }\n\t if (c == '=') {\n\t // SUCCESS: found an equal signs separating key and value\n\t // NEXT_STATE: KV_VALUE\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.KV_VALUE;\n\t this.PARSETMP_.Value = '';\n\t this.VALBRACES_ = { '\"' : [], '{' : [] };\n\t }\n\t break;\n\t\n\t // Start at first non-whitespace/comment character after '=' \n\t // -- Populate this.PARSETMP_.Value\n\t case this.STATES_.KV_VALUE:\n\t var delim = this.VALBRACES_;\n\t var val = this.PARSETMP_.Value;\n\t var doneParsingValue = false;\n\t\n\t // Test for special characters\n\t if (c == '\"' || c == '{' || c == '}' || c == ',') {\n\t if (c == ',') {\n\t // This comma can mean:\n\t // (1) just another comma literal\n\t // (2) end of a macro reference\n\t if (0 === delim['\"'].length + delim['{'].length) {\n\t // end of a macro reference\n\t var macro = this.PARSETMP_.Value.trim();\n\t if (macro in this.MACROS_) {\n\t // Successful macro reference\n\t this.PARSETMP_.Value = this.MACROS_[macro];\n\t } else {\n\t // Reference to an undefined macro\n\t this.error_('Reference to an undefined macro: '+macro);\n\t }\n\t doneParsingValue = true;\n\t }\n\t }\n\t if (c == '\"') {\n\t // This quote can mean:\n\t // (1) opening delimiter\n\t // (2) closing delimiter\n\t // (3) literal, if we have a '{' on the stack\n\t if (0 === delim['\"'].length + delim['{'].length) {\n\t // opening delimiter\n\t delim['\"'].push(this.CHAR_)\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t break;\n\t }\n\t if (delim['\"'].length == 1 && delim['{'].length == 0 &&\n\t (val.length==0 || val[val.length-1] != '\\\\')) {\n\t // closing delimiter\n\t doneParsingValue = true;\n\t } else {\n\t // literal, add to value\n\t }\n\t }\n\t if (c == '{') {\n\t // This brace can mean:\n\t // (1) opening delimiter\n\t // (2) stacked verbatim delimiter\n\t if (val.length == 0 || val[val.length-1] != '\\\\') {\n\t delim['{'].push(this.CHAR_)\n\t this.SKIPWS_ = false;\n\t this.SKIPCOMMENT_ = false;\n\t } else {\n\t // literal, add to value\n\t }\n\t }\n\t if (c == '}') {\n\t // This brace can mean:\n\t // (1) closing delimiter\n\t // (2) closing stacked verbatim delimiter\n\t // (3) end of object definition if value was a macro\n\t if (0 === delim['\"'].length + delim['{'].length) {\n\t // end of object definition, after macro\n\t var macro = this.PARSETMP_.Value.trim();\n\t if (macro in this.MACROS_) {\n\t // Successful macro reference\n\t this.PARSETMP_.Value = this.MACROS_[macro];\n\t } else {\n\t // Reference to an undefined macro\n\t this.error_('Reference to an undefined macro: '+macro);\n\t }\n\t AnotherIteration = true;\n\t doneParsingValue = true;\n\t } else {\n\t if (val.length == 0 || val[val.length-1] != '\\\\') {\n\t if (delim['{'].length > 0) {\n\t // pop stack for stacked verbatim delimiter\n\t delim['{'].splice(delim['{'].length-1, 1)\n\t if (0 == delim['{'].length + delim['\"'].length) {\n\t // closing delimiter\n\t doneParsingValue = true;\n\t } else {\n\t // end verbatim block\n\t }\n\t }\n\t } else {\n\t // literal, add to value\n\t }\n\t }\n\t }\n\t }\n\t\n\t // If here, then we are either done parsing the value or \n\t // have a literal that should be added to the value.\n\t if (doneParsingValue) {\n\t // SUCCESS: value parsed\n\t // NEXT_STATE: KV_KEY\n\t this.SKIPWS_ = true;\n\t this.SKIPCOMMENT_ = true;\n\t this.STATE_ = this.STATES_.KV_KEY;\n\t this.DATA_.Fields[this.PARSETMP_.Key] = this.PARSETMP_.Value;\n\t this.PARSETMP_ = { Key: '' };\n\t this.VALBRACES_ = null;\n\t } else {\n\t this.PARSETMP_.Value += c;\n\t }\n\t break;\n\t } // end switch (this.STATE_)\n\t } // end while(AnotherIteration)\n\t } // end function processCharacter \n\t\n\t /** @private */ this.CHARCONV_ = [\n\t [ /\\\\space /g, '\\u0020' ],\n\t [ /\\\\textdollar /g, '\\u0024' ],\n\t [ /\\\\textquotesingle /g, '\\u0027' ],\n\t [ /\\\\ast /g, '\\u002A' ],\n\t [ /\\\\textbackslash /g, '\\u005C' ],\n\t [ /\\\\\\^\\{\\}/g, '\\u005E' ],\n\t [ /\\\\textasciigrave /g, '\\u0060' ],\n\t [ /\\\\lbrace /g, '\\u007B' ],\n\t [ /\\\\vert /g, '\\u007C' ],\n\t [ /\\\\rbrace /g, '\\u007D' ],\n\t [ /\\\\textasciitilde /g, '\\u007E' ],\n\t [ /\\\\textexclamdown /g, '\\u00A1' ],\n\t [ /\\\\textcent /g, '\\u00A2' ],\n\t [ /\\\\textsterling /g, '\\u00A3' ],\n\t [ /\\\\textcurrency /g, '\\u00A4' ],\n\t [ /\\\\textyen /g, '\\u00A5' ],\n\t [ /\\\\textbrokenbar /g, '\\u00A6' ],\n\t [ /\\\\textsection /g, '\\u00A7' ],\n\t [ /\\\\textasciidieresis /g, '\\u00A8' ],\n\t [ /\\\\textcopyright /g, '\\u00A9' ],\n\t [ /\\\\textordfeminine /g, '\\u00AA' ],\n\t [ /\\\\guillemotleft /g, '\\u00AB' ],\n\t [ /\\\\lnot /g, '\\u00AC' ],\n\t [ /\\\\textregistered /g, '\\u00AE' ],\n\t [ /\\\\textasciimacron /g, '\\u00AF' ],\n\t [ /\\\\textdegree /g, '\\u00B0' ],\n\t [ /\\\\pm /g, '\\u00B1' ],\n\t [ /\\\\textasciiacute /g, '\\u00B4' ],\n\t [ /\\\\mathrm\\{\\\\mu\\}/g, '\\u00B5' ],\n\t [ /\\\\textparagraph /g, '\\u00B6' ],\n\t [ /\\\\cdot /g, '\\u00B7' ],\n\t [ /\\\\c\\{\\}/g, '\\u00B8' ],\n\t [ /\\\\textordmasculine /g, '\\u00BA' ],\n\t [ /\\\\guillemotright /g, '\\u00BB' ],\n\t [ /\\\\textonequarter /g, '\\u00BC' ],\n\t [ /\\\\textonehalf /g, '\\u00BD' ],\n\t [ /\\\\textthreequarters /g, '\\u00BE' ],\n\t [ /\\\\textquestiondown /g, '\\u00BF' ],\n\t [ /\\\\`\\{A\\}/g, '\\u00C0' ],\n\t [ /\\\\'\\{A\\}/g, '\\u00C1' ],\n\t [ /\\\\\\^\\{A\\}/g, '\\u00C2' ],\n\t [ /\\\\~\\{A\\}/g, '\\u00C3' ],\n\t [ /\\\\\"\\{A\\}/g, '\\u00C4' ],\n\t [ /\\\\AA /g, '\\u00C5' ],\n\t [ /\\\\AE /g, '\\u00C6' ],\n\t [ /\\\\c\\{C\\}/g, '\\u00C7' ],\n\t [ /\\\\`\\{E\\}/g, '\\u00C8' ],\n\t [ /\\\\'\\{E\\}/g, '\\u00C9' ],\n\t [ /\\\\\\^\\{E\\}/g, '\\u00CA' ],\n\t [ /\\\\\"\\{E\\}/g, '\\u00CB' ],\n\t [ /\\\\`\\{I\\}/g, '\\u00CC' ],\n\t [ /\\\\'\\{I\\}/g, '\\u00CD' ],\n\t [ /\\\\\\^\\{I\\}/g, '\\u00CE' ],\n\t [ /\\\\\"\\{I\\}/g, '\\u00CF' ],\n\t [ /\\\\DH /g, '\\u00D0' ],\n\t [ /\\\\~\\{N\\}/g, '\\u00D1' ],\n\t [ /\\\\`\\{O\\}/g, '\\u00D2' ],\n\t [ /\\\\'\\{O\\}/g, '\\u00D3' ],\n\t [ /\\\\\\^\\{O\\}/g, '\\u00D4' ],\n\t [ /\\\\~\\{O\\}/g, '\\u00D5' ],\n\t [ /\\\\\"\\{O\\}/g, '\\u00D6' ],\n\t [ /\\\\texttimes /g, '\\u00D7' ],\n\t [ /\\\\O /g, '\\u00D8' ],\n\t [ /\\\\`\\{U\\}/g, '\\u00D9' ],\n\t [ /\\\\'\\{U\\}/g, '\\u00DA' ],\n\t [ /\\\\\\^\\{U\\}/g, '\\u00DB' ],\n\t [ /\\\\\"\\{U\\}/g, '\\u00DC' ],\n\t [ /\\\\'\\{Y\\}/g, '\\u00DD' ],\n\t [ /\\\\TH /g, '\\u00DE' ],\n\t [ /\\\\ss /g, '\\u00DF' ],\n\t [ /\\\\`\\{a\\}/g, '\\u00E0' ],\n\t [ /\\\\'\\{a\\}/g, '\\u00E1' ],\n\t [ /\\\\\\^\\{a\\}/g, '\\u00E2' ],\n\t [ /\\\\~\\{a\\}/g, '\\u00E3' ],\n\t [ /\\\\\"\\{a\\}/g, '\\u00E4' ],\n\t [ /\\\\aa /g, '\\u00E5' ],\n\t [ /\\\\ae /g, '\\u00E6' ],\n\t [ /\\\\c\\{c\\}/g, '\\u00E7' ],\n\t [ /\\\\`\\{e\\}/g, '\\u00E8' ],\n\t [ /\\\\'\\{e\\}/g, '\\u00E9' ],\n\t [ /\\\\\\^\\{e\\}/g, '\\u00EA' ],\n\t [ /\\\\\"\\{e\\}/g, '\\u00EB' ],\n\t [ /\\\\`\\{\\\\i\\}/g, '\\u00EC' ],\n\t [ /\\\\'\\{\\\\i\\}/g, '\\u00ED' ],\n\t [ /\\\\\\^\\{\\\\i\\}/g, '\\u00EE' ],\n\t [ /\\\\\"\\{\\\\i\\}/g, '\\u00EF' ],\n\t [ /\\\\dh /g, '\\u00F0' ],\n\t [ /\\\\~\\{n\\}/g, '\\u00F1' ],\n\t [ /\\\\`\\{o\\}/g, '\\u00F2' ],\n\t [ /\\\\'\\{o\\}/g, '\\u00F3' ],\n\t [ /\\\\\\^\\{o\\}/g, '\\u00F4' ],\n\t [ /\\\\~\\{o\\}/g, '\\u00F5' ],\n\t [ /\\\\\"\\{o\\}/g, '\\u00F6' ],\n\t [ /\\\\div /g, '\\u00F7' ],\n\t [ /\\\\o /g, '\\u00F8' ],\n\t [ /\\\\`\\{u\\}/g, '\\u00F9' ],\n\t [ /\\\\'\\{u\\}/g, '\\u00FA' ],\n\t [ /\\\\\\^\\{u\\}/g, '\\u00FB' ],\n\t [ /\\\\\"\\{u\\}/g, '\\u00FC' ],\n\t [ /\\\\'\\{y\\}/g, '\\u00FD' ],\n\t [ /\\\\th /g, '\\u00FE' ],\n\t [ /\\\\\"\\{y\\}/g, '\\u00FF' ],\n\t [ /\\\\=\\{A\\}/g, '\\u0100' ],\n\t [ /\\\\=\\{a\\}/g, '\\u0101' ],\n\t [ /\\\\u\\{A\\}/g, '\\u0102' ],\n\t [ /\\\\u\\{a\\}/g, '\\u0103' ],\n\t [ /\\\\k\\{A\\}/g, '\\u0104' ],\n\t [ /\\\\k\\{a\\}/g, '\\u0105' ],\n\t [ /\\\\'\\{C\\}/g, '\\u0106' ],\n\t [ /\\\\'\\{c\\}/g, '\\u0107' ],\n\t [ /\\\\\\^\\{C\\}/g, '\\u0108' ],\n\t [ /\\\\\\^\\{c\\}/g, '\\u0109' ],\n\t [ /\\\\.\\{C\\}/g, '\\u010A' ],\n\t [ /\\\\.\\{c\\}/g, '\\u010B' ],\n\t [ /\\\\v\\{C\\}/g, '\\u010C' ],\n\t [ /\\\\v\\{c\\}/g, '\\u010D' ],\n\t [ /\\\\v\\{D\\}/g, '\\u010E' ],\n\t [ /\\\\v\\{d\\}/g, '\\u010F' ],\n\t [ /\\\\DJ /g, '\\u0110' ],\n\t [ /\\\\dj /g, '\\u0111' ],\n\t [ /\\\\=\\{E\\}/g, '\\u0112' ],\n\t [ /\\\\=\\{e\\}/g, '\\u0113' ],\n\t [ /\\\\u\\{E\\}/g, '\\u0114' ],\n\t [ /\\\\u\\{e\\}/g, '\\u0115' ],\n\t [ /\\\\.\\{E\\}/g, '\\u0116' ],\n\t [ /\\\\.\\{e\\}/g, '\\u0117' ],\n\t [ /\\\\k\\{E\\}/g, '\\u0118' ],\n\t [ /\\\\k\\{e\\}/g, '\\u0119' ],\n\t [ /\\\\v\\{E\\}/g, '\\u011A' ],\n\t [ /\\\\v\\{e\\}/g, '\\u011B' ],\n\t [ /\\\\\\^\\{G\\}/g, '\\u011C' ],\n\t [ /\\\\\\^\\{g\\}/g, '\\u011D' ],\n\t [ /\\\\u\\{G\\}/g, '\\u011E' ],\n\t [ /\\\\u\\{g\\}/g, '\\u011F' ],\n\t [ /\\\\.\\{G\\}/g, '\\u0120' ],\n\t [ /\\\\.\\{g\\}/g, '\\u0121' ],\n\t [ /\\\\c\\{G\\}/g, '\\u0122' ],\n\t [ /\\\\c\\{g\\}/g, '\\u0123' ],\n\t [ /\\\\\\^\\{H\\}/g, '\\u0124' ],\n\t [ /\\\\\\^\\{h\\}/g, '\\u0125' ],\n\t [ /\\\\Elzxh /g, '\\u0127' ],\n\t [ /\\\\~\\{I\\}/g, '\\u0128' ],\n\t [ /\\\\~\\{\\\\i\\}/g, '\\u0129' ],\n\t [ /\\\\=\\{I\\}/g, '\\u012A' ],\n\t [ /\\\\=\\{\\\\i\\}/g, '\\u012B' ],\n\t [ /\\\\u\\{I\\}/g, '\\u012C' ],\n\t [ /\\\\u\\{\\\\i\\}/g, '\\u012D' ],\n\t [ /\\\\k\\{I\\}/g, '\\u012E' ],\n\t [ /\\\\k\\{i\\}/g, '\\u012F' ],\n\t [ /\\\\.\\{I\\}/g, '\\u0130' ],\n\t [ /\\\\i /g, '\\u0131' ],\n\t [ /\\\\\\^\\{J\\}/g, '\\u0134' ],\n\t [ /\\\\\\^\\{\\\\j\\}/g, '\\u0135' ],\n\t [ /\\\\c\\{K\\}/g, '\\u0136' ],\n\t [ /\\\\c\\{k\\}/g, '\\u0137' ],\n\t [ /\\\\'\\{L\\}/g, '\\u0139' ],\n\t [ /\\\\'\\{l\\}/g, '\\u013A' ],\n\t [ /\\\\c\\{L\\}/g, '\\u013B' ],\n\t [ /\\\\c\\{l\\}/g, '\\u013C' ],\n\t [ /\\\\v\\{L\\}/g, '\\u013D' ],\n\t [ /\\\\v\\{l\\}/g, '\\u013E' ],\n\t [ /\\\\L /g, '\\u0141' ],\n\t [ /\\\\l /g, '\\u0142' ],\n\t [ /\\\\'\\{N\\}/g, '\\u0143' ],\n\t [ /\\\\'\\{n\\}/g, '\\u0144' ],\n\t [ /\\\\c\\{N\\}/g, '\\u0145' ],\n\t [ /\\\\c\\{n\\}/g, '\\u0146' ],\n\t [ /\\\\v\\{N\\}/g, '\\u0147' ],\n\t [ /\\\\v\\{n\\}/g, '\\u0148' ],\n\t [ /\\\\NG /g, '\\u014A' ],\n\t [ /\\\\ng /g, '\\u014B' ],\n\t [ /\\\\=\\{O\\}/g, '\\u014C' ],\n\t [ /\\\\=\\{o\\}/g, '\\u014D' ],\n\t [ /\\\\u\\{O\\}/g, '\\u014E' ],\n\t [ /\\\\u\\{o\\}/g, '\\u014F' ],\n\t [ /\\\\H\\{O\\}/g, '\\u0150' ],\n\t [ /\\\\H\\{o\\}/g, '\\u0151' ],\n\t [ /\\\\OE /g, '\\u0152' ],\n\t [ /\\\\oe /g, '\\u0153' ],\n\t [ /\\\\'\\{R\\}/g, '\\u0154' ],\n\t [ /\\\\'\\{r\\}/g, '\\u0155' ],\n\t [ /\\\\c\\{R\\}/g, '\\u0156' ],\n\t [ /\\\\c\\{r\\}/g, '\\u0157' ],\n\t [ /\\\\v\\{R\\}/g, '\\u0158' ],\n\t [ /\\\\v\\{r\\}/g, '\\u0159' ],\n\t [ /\\\\'\\{S\\}/g, '\\u015A' ],\n\t [ /\\\\'\\{s\\}/g, '\\u015B' ],\n\t [ /\\\\\\^\\{S\\}/g, '\\u015C' ],\n\t [ /\\\\\\^\\{s\\}/g, '\\u015D' ],\n\t [ /\\\\c\\{S\\}/g, '\\u015E' ],\n\t [ /\\\\c\\{s\\}/g, '\\u015F' ],\n\t [ /\\\\v\\{S\\}/g, '\\u0160' ],\n\t [ /\\\\v\\{s\\}/g, '\\u0161' ],\n\t [ /\\\\c\\{T\\}/g, '\\u0162' ],\n\t [ /\\\\c\\{t\\}/g, '\\u0163' ],\n\t [ /\\\\v\\{T\\}/g, '\\u0164' ],\n\t [ /\\\\v\\{t\\}/g, '\\u0165' ],\n\t [ /\\\\~\\{U\\}/g, '\\u0168' ],\n\t [ /\\\\~\\{u\\}/g, '\\u0169' ],\n\t [ /\\\\=\\{U\\}/g, '\\u016A' ],\n\t [ /\\\\=\\{u\\}/g, '\\u016B' ],\n\t [ /\\\\u\\{U\\}/g, '\\u016C' ],\n\t [ /\\\\u\\{u\\}/g, '\\u016D' ],\n\t [ /\\\\r\\{U\\}/g, '\\u016E' ],\n\t [ /\\\\r\\{u\\}/g, '\\u016F' ],\n\t [ /\\\\H\\{U\\}/g, '\\u0170' ],\n\t [ /\\\\H\\{u\\}/g, '\\u0171' ],\n\t [ /\\\\k\\{U\\}/g, '\\u0172' ],\n\t [ /\\\\k\\{u\\}/g, '\\u0173' ],\n\t [ /\\\\\\^\\{W\\}/g, '\\u0174' ],\n\t [ /\\\\\\^\\{w\\}/g, '\\u0175' ],\n\t [ /\\\\\\^\\{Y\\}/g, '\\u0176' ],\n\t [ /\\\\\\^\\{y\\}/g, '\\u0177' ],\n\t [ /\\\\\"\\{Y\\}/g, '\\u0178' ],\n\t [ /\\\\'\\{Z\\}/g, '\\u0179' ],\n\t [ /\\\\'\\{z\\}/g, '\\u017A' ],\n\t [ /\\\\.\\{Z\\}/g, '\\u017B' ],\n\t [ /\\\\.\\{z\\}/g, '\\u017C' ],\n\t [ /\\\\v\\{Z\\}/g, '\\u017D' ],\n\t [ /\\\\v\\{z\\}/g, '\\u017E' ],\n\t [ /\\\\texthvlig /g, '\\u0195' ],\n\t [ /\\\\textnrleg /g, '\\u019E' ],\n\t [ /\\\\eth /g, '\\u01AA' ],\n\t [ /\\\\textdoublepipe /g, '\\u01C2' ],\n\t [ /\\\\'\\{g\\}/g, '\\u01F5' ],\n\t [ /\\\\Elztrna /g, '\\u0250' ],\n\t [ /\\\\Elztrnsa /g, '\\u0252' ],\n\t [ /\\\\Elzopeno /g, '\\u0254' ],\n\t [ /\\\\Elzrtld /g, '\\u0256' ],\n\t [ /\\\\Elzschwa /g, '\\u0259' ],\n\t [ /\\\\varepsilon /g, '\\u025B' ],\n\t [ /\\\\Elzpgamma /g, '\\u0263' ],\n\t [ /\\\\Elzpbgam /g, '\\u0264' ],\n\t [ /\\\\Elztrnh /g, '\\u0265' ],\n\t [ /\\\\Elzbtdl /g, '\\u026C' ],\n\t [ /\\\\Elzrtll /g, '\\u026D' ],\n\t [ /\\\\Elztrnm /g, '\\u026F' ],\n\t [ /\\\\Elztrnmlr /g, '\\u0270' ],\n\t [ /\\\\Elzltlmr /g, '\\u0271' ],\n\t [ /\\\\Elzltln /g, '\\u0272' ],\n\t [ /\\\\Elzrtln /g, '\\u0273' ],\n\t [ /\\\\Elzclomeg /g, '\\u0277' ],\n\t [ /\\\\textphi /g, '\\u0278' ],\n\t [ /\\\\Elztrnr /g, '\\u0279' ],\n\t [ /\\\\Elztrnrl /g, '\\u027A' ],\n\t [ /\\\\Elzrttrnr /g, '\\u027B' ],\n\t [ /\\\\Elzrl /g, '\\u027C' ],\n\t [ /\\\\Elzrtlr /g, '\\u027D' ],\n\t [ /\\\\Elzfhr /g, '\\u027E' ],\n\t [ /\\\\Elzrtls /g, '\\u0282' ],\n\t [ /\\\\Elzesh /g, '\\u0283' ],\n\t [ /\\\\Elztrnt /g, '\\u0287' ],\n\t [ /\\\\Elzrtlt /g, '\\u0288' ],\n\t [ /\\\\Elzpupsil /g, '\\u028A' ],\n\t [ /\\\\Elzpscrv /g, '\\u028B' ],\n\t [ /\\\\Elzinvv /g, '\\u028C' ],\n\t [ /\\\\Elzinvw /g, '\\u028D' ],\n\t [ /\\\\Elztrny /g, '\\u028E' ],\n\t [ /\\\\Elzrtlz /g, '\\u0290' ],\n\t [ /\\\\Elzyogh /g, '\\u0292' ],\n\t [ /\\\\Elzglst /g, '\\u0294' ],\n\t [ /\\\\Elzreglst /g, '\\u0295' ],\n\t [ /\\\\Elzinglst /g, '\\u0296' ],\n\t [ /\\\\textturnk /g, '\\u029E' ],\n\t [ /\\\\Elzdyogh /g, '\\u02A4' ],\n\t [ /\\\\Elztesh /g, '\\u02A7' ],\n\t [ /\\\\textasciicaron /g, '\\u02C7' ],\n\t [ /\\\\Elzverts /g, '\\u02C8' ],\n\t [ /\\\\Elzverti /g, '\\u02CC' ],\n\t [ /\\\\Elzlmrk /g, '\\u02D0' ],\n\t [ /\\\\Elzhlmrk /g, '\\u02D1' ],\n\t [ /\\\\Elzsbrhr /g, '\\u02D2' ],\n\t [ /\\\\Elzsblhr /g, '\\u02D3' ],\n\t [ /\\\\Elzrais /g, '\\u02D4' ],\n\t [ /\\\\Elzlow /g, '\\u02D5' ],\n\t [ /\\\\textasciibreve /g, '\\u02D8' ],\n\t [ /\\\\textperiodcentered /g, '\\u02D9' ],\n\t [ /\\\\r\\{\\}/g, '\\u02DA' ],\n\t [ /\\\\k\\{\\}/g, '\\u02DB' ],\n\t [ /\\\\texttildelow /g, '\\u02DC' ],\n\t [ /\\\\H\\{\\}/g, '\\u02DD' ],\n\t [ /\\\\tone\\{55\\}/g, '\\u02E5' ],\n\t [ /\\\\tone\\{44\\}/g, '\\u02E6' ],\n\t [ /\\\\tone\\{33\\}/g, '\\u02E7' ],\n\t [ /\\\\tone\\{22\\}/g, '\\u02E8' ],\n\t [ /\\\\tone\\{11\\}/g, '\\u02E9' ],\n\t [ /\\\\cyrchar\\\\C/g, '\\u030F' ],\n\t [ /\\\\Elzpalh /g, '\\u0321' ],\n\t [ /\\\\Elzrh /g, '\\u0322' ],\n\t [ /\\\\Elzsbbrg /g, '\\u032A' ],\n\t [ /\\\\Elzxl /g, '\\u0335' ],\n\t [ /\\\\Elzbar /g, '\\u0336' ],\n\t [ /\\\\'\\{A\\}/g, '\\u0386' ],\n\t [ /\\\\'\\{E\\}/g, '\\u0388' ],\n\t [ /\\\\'\\{H\\}/g, '\\u0389' ],\n\t [ /\\\\'\\{\\}\\{I\\}/g, '\\u038A' ],\n\t [ /\\\\'\\{\\}O/g, '\\u038C' ],\n\t [ /\\\\mathrm\\{'Y\\}/g, '\\u038E' ],\n\t [ /\\\\mathrm\\{'\\\\Omega\\}/g, '\\u038F' ],\n\t [ /\\\\acute\\{\\\\ddot\\{\\\\iota\\}\\}/g, '\\u0390' ],\n\t [ /\\\\Alpha /g, '\\u0391' ],\n\t [ /\\\\Beta /g, '\\u0392' ],\n\t [ /\\\\Gamma /g, '\\u0393' ],\n\t [ /\\\\Delta /g, '\\u0394' ],\n\t [ /\\\\Epsilon /g, '\\u0395' ],\n\t [ /\\\\Zeta /g, '\\u0396' ],\n\t [ /\\\\Eta /g, '\\u0397' ],\n\t [ /\\\\Theta /g, '\\u0398' ],\n\t [ /\\\\Iota /g, '\\u0399' ],\n\t [ /\\\\Kappa /g, '\\u039A' ],\n\t [ /\\\\Lambda /g, '\\u039B' ],\n\t [ /\\\\Xi /g, '\\u039E' ],\n\t [ /\\\\Pi /g, '\\u03A0' ],\n\t [ /\\\\Rho /g, '\\u03A1' ],\n\t [ /\\\\Sigma /g, '\\u03A3' ],\n\t [ /\\\\Tau /g, '\\u03A4' ],\n\t [ /\\\\Upsilon /g, '\\u03A5' ],\n\t [ /\\\\Phi /g, '\\u03A6' ],\n\t [ /\\\\Chi /g, '\\u03A7' ],\n\t [ /\\\\Psi /g, '\\u03A8' ],\n\t [ /\\\\Omega /g, '\\u03A9' ],\n\t [ /\\\\mathrm\\{\\\\ddot\\{I\\}\\}/g, '\\u03AA' ],\n\t [ /\\\\mathrm\\{\\\\ddot\\{Y\\}\\}/g, '\\u03AB' ],\n\t [ /\\\\'\\{\\$\\\\alpha\\$\\}/g, '\\u03AC' ],\n\t [ /\\\\acute\\{\\\\epsilon\\}/g, '\\u03AD' ],\n\t [ /\\\\acute\\{\\\\eta\\}/g, '\\u03AE' ],\n\t [ /\\\\acute\\{\\\\iota\\}/g, '\\u03AF' ],\n\t [ /\\\\acute\\{\\\\ddot\\{\\\\upsilon\\}\\}/g, '\\u03B0' ],\n\t [ /\\\\alpha /g, '\\u03B1' ],\n\t [ /\\\\beta /g, '\\u03B2' ],\n\t [ /\\\\gamma /g, '\\u03B3' ],\n\t [ /\\\\delta /g, '\\u03B4' ],\n\t [ /\\\\epsilon /g, '\\u03B5' ],\n\t [ /\\\\zeta /g, '\\u03B6' ],\n\t [ /\\\\eta /g, '\\u03B7' ],\n\t [ /\\\\texttheta /g, '\\u03B8' ],\n\t [ /\\\\iota /g, '\\u03B9' ],\n\t [ /\\\\kappa /g, '\\u03BA' ],\n\t [ /\\\\lambda /g, '\\u03BB' ],\n\t [ /\\\\mu /g, '\\u03BC' ],\n\t [ /\\\\nu /g, '\\u03BD' ],\n\t [ /\\\\xi /g, '\\u03BE' ],\n\t [ /\\\\pi /g, '\\u03C0' ],\n\t [ /\\\\rho /g, '\\u03C1' ],\n\t [ /\\\\varsigma /g, '\\u03C2' ],\n\t [ /\\\\sigma /g, '\\u03C3' ],\n\t [ /\\\\tau /g, '\\u03C4' ],\n\t [ /\\\\upsilon /g, '\\u03C5' ],\n\t [ /\\\\varphi /g, '\\u03C6' ],\n\t [ /\\\\chi /g, '\\u03C7' ],\n\t [ /\\\\psi /g, '\\u03C8' ],\n\t [ /\\\\omega /g, '\\u03C9' ],\n\t [ /\\\\ddot\\{\\\\iota\\}/g, '\\u03CA' ],\n\t [ /\\\\ddot\\{\\\\upsilon\\}/g, '\\u03CB' ],\n\t [ /\\\\'\\{o\\}/g, '\\u03CC' ],\n\t [ /\\\\acute\\{\\\\upsilon\\}/g, '\\u03CD' ],\n\t [ /\\\\acute\\{\\\\omega\\}/g, '\\u03CE' ],\n\t [ /\\\\Pisymbol\\{ppi022\\}\\{87\\}/g, '\\u03D0' ],\n\t [ /\\\\textvartheta /g, '\\u03D1' ],\n\t [ /\\\\Upsilon /g, '\\u03D2' ],\n\t [ /\\\\phi /g, '\\u03D5' ],\n\t [ /\\\\varpi /g, '\\u03D6' ],\n\t [ /\\\\Stigma /g, '\\u03DA' ],\n\t [ /\\\\Digamma /g, '\\u03DC' ],\n\t [ /\\\\digamma /g, '\\u03DD' ],\n\t [ /\\\\Koppa /g, '\\u03DE' ],\n\t [ /\\\\Sampi /g, '\\u03E0' ],\n\t [ /\\\\varkappa /g, '\\u03F0' ],\n\t [ /\\\\varrho /g, '\\u03F1' ],\n\t [ /\\\\textTheta /g, '\\u03F4' ],\n\t [ /\\\\backepsilon /g, '\\u03F6' ],\n\t [ /\\\\cyrchar\\\\CYRYO /g, '\\u0401' ],\n\t [ /\\\\cyrchar\\\\CYRDJE /g, '\\u0402' ],\n\t [ /\\\\cyrchar\\{\\\\'\\\\CYRG\\}/g, '\\u0403' ],\n\t [ /\\\\cyrchar\\\\CYRIE /g, '\\u0404' ],\n\t [ /\\\\cyrchar\\\\CYRDZE /g, '\\u0405' ],\n\t [ /\\\\cyrchar\\\\CYRII /g, '\\u0406' ],\n\t [ /\\\\cyrchar\\\\CYRYI /g, '\\u0407' ],\n\t [ /\\\\cyrchar\\\\CYRJE /g, '\\u0408' ],\n\t [ /\\\\cyrchar\\\\CYRLJE /g, '\\u0409' ],\n\t [ /\\\\cyrchar\\\\CYRNJE /g, '\\u040A' ],\n\t [ /\\\\cyrchar\\\\CYRTSHE /g, '\\u040B' ],\n\t [ /\\\\cyrchar\\{\\\\'\\\\CYRK\\}/g, '\\u040C' ],\n\t [ /\\\\cyrchar\\\\CYRUSHRT /g, '\\u040E' ],\n\t [ /\\\\cyrchar\\\\CYRDZHE /g, '\\u040F' ],\n\t [ /\\\\cyrchar\\\\CYRA /g, '\\u0410' ],\n\t [ /\\\\cyrchar\\\\CYRB /g, '\\u0411' ],\n\t [ /\\\\cyrchar\\\\CYRV /g, '\\u0412' ],\n\t [ /\\\\cyrchar\\\\CYRG /g, '\\u0413' ],\n\t [ /\\\\cyrchar\\\\CYRD /g, '\\u0414' ],\n\t [ /\\\\cyrchar\\\\CYRE /g, '\\u0415' ],\n\t [ /\\\\cyrchar\\\\CYRZH /g, '\\u0416' ],\n\t [ /\\\\cyrchar\\\\CYRZ /g, '\\u0417' ],\n\t [ /\\\\cyrchar\\\\CYRI /g, '\\u0418' ],\n\t [ /\\\\cyrchar\\\\CYRISHRT /g, '\\u0419' ],\n\t [ /\\\\cyrchar\\\\CYRK /g, '\\u041A' ],\n\t [ /\\\\cyrchar\\\\CYRL /g, '\\u041B' ],\n\t [ /\\\\cyrchar\\\\CYRM /g, '\\u041C' ],\n\t [ /\\\\cyrchar\\\\CYRN /g, '\\u041D' ],\n\t [ /\\\\cyrchar\\\\CYRO /g, '\\u041E' ],\n\t [ /\\\\cyrchar\\\\CYRP /g, '\\u041F' ],\n\t [ /\\\\cyrchar\\\\CYRR /g, '\\u0420' ],\n\t [ /\\\\cyrchar\\\\CYRS /g, '\\u0421' ],\n\t [ /\\\\cyrchar\\\\CYRT /g, '\\u0422' ],\n\t [ /\\\\cyrchar\\\\CYRU /g, '\\u0423' ],\n\t [ /\\\\cyrchar\\\\CYRF /g, '\\u0424' ],\n\t [ /\\\\cyrchar\\\\CYRH /g, '\\u0425' ],\n\t [ /\\\\cyrchar\\\\CYRC /g, '\\u0426' ],\n\t [ /\\\\cyrchar\\\\CYRCH /g, '\\u0427' ],\n\t [ /\\\\cyrchar\\\\CYRSH /g, '\\u0428' ],\n\t [ /\\\\cyrchar\\\\CYRSHCH /g, '\\u0429' ],\n\t [ /\\\\cyrchar\\\\CYRHRDSN /g, '\\u042A' ],\n\t [ /\\\\cyrchar\\\\CYRERY /g, '\\u042B' ],\n\t [ /\\\\cyrchar\\\\CYRSFTSN /g, '\\u042C' ],\n\t [ /\\\\cyrchar\\\\CYREREV /g, '\\u042D' ],\n\t [ /\\\\cyrchar\\\\CYRYU /g, '\\u042E' ],\n\t [ /\\\\cyrchar\\\\CYRYA /g, '\\u042F' ],\n\t [ /\\\\cyrchar\\\\cyra /g, '\\u0430' ],\n\t [ /\\\\cyrchar\\\\cyrb /g, '\\u0431' ],\n\t [ /\\\\cyrchar\\\\cyrv /g, '\\u0432' ],\n\t [ /\\\\cyrchar\\\\cyrg /g, '\\u0433' ],\n\t [ /\\\\cyrchar\\\\cyrd /g, '\\u0434' ],\n\t [ /\\\\cyrchar\\\\cyre /g, '\\u0435' ],\n\t [ /\\\\cyrchar\\\\cyrzh /g, '\\u0436' ],\n\t [ /\\\\cyrchar\\\\cyrz /g, '\\u0437' ],\n\t [ /\\\\cyrchar\\\\cyri /g, '\\u0438' ],\n\t [ /\\\\cyrchar\\\\cyrishrt /g, '\\u0439' ],\n\t [ /\\\\cyrchar\\\\cyrk /g, '\\u043A' ],\n\t [ /\\\\cyrchar\\\\cyrl /g, '\\u043B' ],\n\t [ /\\\\cyrchar\\\\cyrm /g, '\\u043C' ],\n\t [ /\\\\cyrchar\\\\cyrn /g, '\\u043D' ],\n\t [ /\\\\cyrchar\\\\cyro /g, '\\u043E' ],\n\t [ /\\\\cyrchar\\\\cyrp /g, '\\u043F' ],\n\t [ /\\\\cyrchar\\\\cyrr /g, '\\u0440' ],\n\t [ /\\\\cyrchar\\\\cyrs /g, '\\u0441' ],\n\t [ /\\\\cyrchar\\\\cyrt /g, '\\u0442' ],\n\t [ /\\\\cyrchar\\\\cyru /g, '\\u0443' ],\n\t [ /\\\\cyrchar\\\\cyrf /g, '\\u0444' ],\n\t [ /\\\\cyrchar\\\\cyrh /g, '\\u0445' ],\n\t [ /\\\\cyrchar\\\\cyrc /g, '\\u0446' ],\n\t [ /\\\\cyrchar\\\\cyrch /g, '\\u0447' ],\n\t [ /\\\\cyrchar\\\\cyrsh /g, '\\u0448' ],\n\t [ /\\\\cyrchar\\\\cyrshch /g, '\\u0449' ],\n\t [ /\\\\cyrchar\\\\cyrhrdsn /g, '\\u044A' ],\n\t [ /\\\\cyrchar\\\\cyrery /g, '\\u044B' ],\n\t [ /\\\\cyrchar\\\\cyrsftsn /g, '\\u044C' ],\n\t [ /\\\\cyrchar\\\\cyrerev /g, '\\u044D' ],\n\t [ /\\\\cyrchar\\\\cyryu /g, '\\u044E' ],\n\t [ /\\\\cyrchar\\\\cyrya /g, '\\u044F' ],\n\t [ /\\\\cyrchar\\\\cyryo /g, '\\u0451' ],\n\t [ /\\\\cyrchar\\\\cyrdje /g, '\\u0452' ],\n\t [ /\\\\cyrchar\\{\\\\'\\\\cyrg\\}/g, '\\u0453' ],\n\t [ /\\\\cyrchar\\\\cyrie /g, '\\u0454' ],\n\t [ /\\\\cyrchar\\\\cyrdze /g, '\\u0455' ],\n\t [ /\\\\cyrchar\\\\cyrii /g, '\\u0456' ],\n\t [ /\\\\cyrchar\\\\cyryi /g, '\\u0457' ],\n\t [ /\\\\cyrchar\\\\cyrje /g, '\\u0458' ],\n\t [ /\\\\cyrchar\\\\cyrlje /g, '\\u0459' ],\n\t [ /\\\\cyrchar\\\\cyrnje /g, '\\u045A' ],\n\t [ /\\\\cyrchar\\\\cyrtshe /g, '\\u045B' ],\n\t [ /\\\\cyrchar\\{\\\\'\\\\cyrk\\}/g, '\\u045C' ],\n\t [ /\\\\cyrchar\\\\cyrushrt /g, '\\u045E' ],\n\t [ /\\\\cyrchar\\\\cyrdzhe /g, '\\u045F' ],\n\t [ /\\\\cyrchar\\\\CYROMEGA /g, '\\u0460' ],\n\t [ /\\\\cyrchar\\\\cyromega /g, '\\u0461' ],\n\t [ /\\\\cyrchar\\\\CYRYAT /g, '\\u0462' ],\n\t [ /\\\\cyrchar\\\\CYRIOTE /g, '\\u0464' ],\n\t [ /\\\\cyrchar\\\\cyriote /g, '\\u0465' ],\n\t [ /\\\\cyrchar\\\\CYRLYUS /g, '\\u0466' ],\n\t [ /\\\\cyrchar\\\\cyrlyus /g, '\\u0467' ],\n\t [ /\\\\cyrchar\\\\CYRIOTLYUS /g, '\\u0468' ],\n\t [ /\\\\cyrchar\\\\cyriotlyus /g, '\\u0469' ],\n\t [ /\\\\cyrchar\\\\CYRBYUS /g, '\\u046A' ],\n\t [ /\\\\cyrchar\\\\CYRIOTBYUS /g, '\\u046C' ],\n\t [ /\\\\cyrchar\\\\cyriotbyus /g, '\\u046D' ],\n\t [ /\\\\cyrchar\\\\CYRKSI /g, '\\u046E' ],\n\t [ /\\\\cyrchar\\\\cyrksi /g, '\\u046F' ],\n\t [ /\\\\cyrchar\\\\CYRPSI /g, '\\u0470' ],\n\t [ /\\\\cyrchar\\\\cyrpsi /g, '\\u0471' ],\n\t [ /\\\\cyrchar\\\\CYRFITA /g, '\\u0472' ],\n\t [ /\\\\cyrchar\\\\CYRIZH /g, '\\u0474' ],\n\t [ /\\\\cyrchar\\\\CYRUK /g, '\\u0478' ],\n\t [ /\\\\cyrchar\\\\cyruk /g, '\\u0479' ],\n\t [ /\\\\cyrchar\\\\CYROMEGARND /g, '\\u047A' ],\n\t [ /\\\\cyrchar\\\\cyromegarnd /g, '\\u047B' ],\n\t [ /\\\\cyrchar\\\\CYROMEGATITLO /g, '\\u047C' ],\n\t [ /\\\\cyrchar\\\\cyromegatitlo /g, '\\u047D' ],\n\t [ /\\\\cyrchar\\\\CYROT /g, '\\u047E' ],\n\t [ /\\\\cyrchar\\\\cyrot /g, '\\u047F' ],\n\t [ /\\\\cyrchar\\\\CYRKOPPA /g, '\\u0480' ],\n\t [ /\\\\cyrchar\\\\cyrkoppa /g, '\\u0481' ],\n\t [ /\\\\cyrchar\\\\cyrthousands /g, '\\u0482' ],\n\t [ /\\\\cyrchar\\\\cyrhundredthousands /g, '\\u0488' ],\n\t [ /\\\\cyrchar\\\\cyrmillions /g, '\\u0489' ],\n\t [ /\\\\cyrchar\\\\CYRSEMISFTSN /g, '\\u048C' ],\n\t [ /\\\\cyrchar\\\\cyrsemisftsn /g, '\\u048D' ],\n\t [ /\\\\cyrchar\\\\CYRRTICK /g, '\\u048E' ],\n\t [ /\\\\cyrchar\\\\cyrrtick /g, '\\u048F' ],\n\t [ /\\\\cyrchar\\\\CYRGUP /g, '\\u0490' ],\n\t [ /\\\\cyrchar\\\\cyrgup /g, '\\u0491' ],\n\t [ /\\\\cyrchar\\\\CYRGHCRS /g, '\\u0492' ],\n\t [ /\\\\cyrchar\\\\cyrghcrs /g, '\\u0493' ],\n\t [ /\\\\cyrchar\\\\CYRGHK /g, '\\u0494' ],\n\t [ /\\\\cyrchar\\\\cyrghk /g, '\\u0495' ],\n\t [ /\\\\cyrchar\\\\CYRZHDSC /g, '\\u0496' ],\n\t [ /\\\\cyrchar\\\\cyrzhdsc /g, '\\u0497' ],\n\t [ /\\\\cyrchar\\\\CYRZDSC /g, '\\u0498' ],\n\t [ /\\\\cyrchar\\\\cyrzdsc /g, '\\u0499' ],\n\t [ /\\\\cyrchar\\\\CYRKDSC /g, '\\u049A' ],\n\t [ /\\\\cyrchar\\\\cyrkdsc /g, '\\u049B' ],\n\t [ /\\\\cyrchar\\\\CYRKVCRS /g, '\\u049C' ],\n\t [ /\\\\cyrchar\\\\cyrkvcrs /g, '\\u049D' ],\n\t [ /\\\\cyrchar\\\\CYRKHCRS /g, '\\u049E' ],\n\t [ /\\\\cyrchar\\\\cyrkhcrs /g, '\\u049F' ],\n\t [ /\\\\cyrchar\\\\CYRKBEAK /g, '\\u04A0' ],\n\t [ /\\\\cyrchar\\\\cyrkbeak /g, '\\u04A1' ],\n\t [ /\\\\cyrchar\\\\CYRNDSC /g, '\\u04A2' ],\n\t [ /\\\\cyrchar\\\\cyrndsc /g, '\\u04A3' ],\n\t [ /\\\\cyrchar\\\\CYRNG /g, '\\u04A4' ],\n\t [ /\\\\cyrchar\\\\cyrng /g, '\\u04A5' ],\n\t [ /\\\\cyrchar\\\\CYRPHK /g, '\\u04A6' ],\n\t [ /\\\\cyrchar\\\\cyrphk /g, '\\u04A7' ],\n\t [ /\\\\cyrchar\\\\CYRABHHA /g, '\\u04A8' ],\n\t [ /\\\\cyrchar\\\\cyrabhha /g, '\\u04A9' ],\n\t [ /\\\\cyrchar\\\\CYRSDSC /g, '\\u04AA' ],\n\t [ /\\\\cyrchar\\\\cyrsdsc /g, '\\u04AB' ],\n\t [ /\\\\cyrchar\\\\CYRTDSC /g, '\\u04AC' ],\n\t [ /\\\\cyrchar\\\\cyrtdsc /g, '\\u04AD' ],\n\t [ /\\\\cyrchar\\\\CYRY /g, '\\u04AE' ],\n\t [ /\\\\cyrchar\\\\cyry /g, '\\u04AF' ],\n\t [ /\\\\cyrchar\\\\CYRYHCRS /g, '\\u04B0' ],\n\t [ /\\\\cyrchar\\\\cyryhcrs /g, '\\u04B1' ],\n\t [ /\\\\cyrchar\\\\CYRHDSC /g, '\\u04B2' ],\n\t [ /\\\\cyrchar\\\\cyrhdsc /g, '\\u04B3' ],\n\t [ /\\\\cyrchar\\\\CYRTETSE /g, '\\u04B4' ],\n\t [ /\\\\cyrchar\\\\cyrtetse /g, '\\u04B5' ],\n\t [ /\\\\cyrchar\\\\CYRCHRDSC /g, '\\u04B6' ],\n\t [ /\\\\cyrchar\\\\cyrchrdsc /g, '\\u04B7' ],\n\t [ /\\\\cyrchar\\\\CYRCHVCRS /g, '\\u04B8' ],\n\t [ /\\\\cyrchar\\\\cyrchvcrs /g, '\\u04B9' ],\n\t [ /\\\\cyrchar\\\\CYRSHHA /g, '\\u04BA' ],\n\t [ /\\\\cyrchar\\\\cyrshha /g, '\\u04BB' ],\n\t [ /\\\\cyrchar\\\\CYRABHCH /g, '\\u04BC' ],\n\t [ /\\\\cyrchar\\\\cyrabhch /g, '\\u04BD' ],\n\t [ /\\\\cyrchar\\\\CYRABHCHDSC /g, '\\u04BE' ],\n\t [ /\\\\cyrchar\\\\cyrabhchdsc /g, '\\u04BF' ],\n\t [ /\\\\cyrchar\\\\CYRpalochka /g, '\\u04C0' ],\n\t [ /\\\\cyrchar\\\\CYRKHK /g, '\\u04C3' ],\n\t [ /\\\\cyrchar\\\\cyrkhk /g, '\\u04C4' ],\n\t [ /\\\\cyrchar\\\\CYRNHK /g, '\\u04C7' ],\n\t [ /\\\\cyrchar\\\\cyrnhk /g, '\\u04C8' ],\n\t [ /\\\\cyrchar\\\\CYRCHLDSC /g, '\\u04CB' ],\n\t [ /\\\\cyrchar\\\\cyrchldsc /g, '\\u04CC' ],\n\t [ /\\\\cyrchar\\\\CYRAE /g, '\\u04D4' ],\n\t [ /\\\\cyrchar\\\\cyrae /g, '\\u04D5' ],\n\t [ /\\\\cyrchar\\\\CYRSCHWA /g, '\\u04D8' ],\n\t [ /\\\\cyrchar\\\\cyrschwa /g, '\\u04D9' ],\n\t [ /\\\\cyrchar\\\\CYRABHDZE /g, '\\u04E0' ],\n\t [ /\\\\cyrchar\\\\cyrabhdze /g, '\\u04E1' ],\n\t [ /\\\\cyrchar\\\\CYROTLD /g, '\\u04E8' ],\n\t [ /\\\\cyrchar\\\\cyrotld /g, '\\u04E9' ],\n\t [ /\\\\hspace\\{0.6em\\}/g, '\\u2002' ],\n\t [ /\\\\hspace\\{1em\\}/g, '\\u2003' ],\n\t [ /\\\\hspace\\{0.33em\\}/g, '\\u2004' ],\n\t [ /\\\\hspace\\{0.25em\\}/g, '\\u2005' ],\n\t [ /\\\\hspace\\{0.166em\\}/g, '\\u2006' ],\n\t [ /\\\\hphantom\\{0\\}/g, '\\u2007' ],\n\t [ /\\\\hphantom\\{,\\}/g, '\\u2008' ],\n\t [ /\\\\hspace\\{0.167em\\}/g, '\\u2009' ],\n\t [ /\\\\mkern1mu /g, '\\u200A' ],\n\t [ /\\\\textendash /g, '\\u2013' ],\n\t [ /\\\\textemdash /g, '\\u2014' ],\n\t [ /\\\\rule\\{1em\\}\\{1pt\\}/g, '\\u2015' ],\n\t [ /\\\\Vert /g, '\\u2016' ],\n\t [ /\\\\Elzreapos /g, '\\u201B' ],\n\t [ /\\\\textquotedblleft /g, '\\u201C' ],\n\t [ /\\\\textquotedblright /g, '\\u201D' ],\n\t [ /\\\\textdagger /g, '\\u2020' ],\n\t [ /\\\\textdaggerdbl /g, '\\u2021' ],\n\t [ /\\\\textbullet /g, '\\u2022' ],\n\t [ /\\\\ldots /g, '\\u2026' ],\n\t [ /\\\\textperthousand /g, '\\u2030' ],\n\t [ /\\\\textpertenthousand /g, '\\u2031' ],\n\t [ /\\\\backprime /g, '\\u2035' ],\n\t [ /\\\\guilsinglleft /g, '\\u2039' ],\n\t [ /\\\\guilsinglright /g, '\\u203A' ],\n\t [ /\\\\mkern4mu /g, '\\u205F' ],\n\t [ /\\\\nolinebreak /g, '\\u2060' ],\n\t [ /\\\\ensuremath\\{\\\\Elzpes\\}/g, '\\u20A7' ],\n\t [ /\\\\mbox\\{\\\\texteuro\\} /g, '\\u20AC' ],\n\t [ /\\\\dddot /g, '\\u20DB' ],\n\t [ /\\\\ddddot /g, '\\u20DC' ],\n\t [ /\\\\mathbb\\{C\\}/g, '\\u2102' ],\n\t [ /\\\\mathscr\\{g\\}/g, '\\u210A' ],\n\t [ /\\\\mathscr\\{H\\}/g, '\\u210B' ],\n\t [ /\\\\mathfrak\\{H\\}/g, '\\u210C' ],\n\t [ /\\\\mathbb\\{H\\}/g, '\\u210D' ],\n\t [ /\\\\hslash /g, '\\u210F' ],\n\t [ /\\\\mathscr\\{I\\}/g, '\\u2110' ],\n\t [ /\\\\mathfrak\\{I\\}/g, '\\u2111' ],\n\t [ /\\\\mathscr\\{L\\}/g, '\\u2112' ],\n\t [ /\\\\mathscr\\{l\\}/g, '\\u2113' ],\n\t [ /\\\\mathbb\\{N\\}/g, '\\u2115' ],\n\t [ /\\\\cyrchar\\\\textnumero /g, '\\u2116' ],\n\t [ /\\\\wp /g, '\\u2118' ],\n\t [ /\\\\mathbb\\{P\\}/g, '\\u2119' ],\n\t [ /\\\\mathbb\\{Q\\}/g, '\\u211A' ],\n\t [ /\\\\mathscr\\{R\\}/g, '\\u211B' ],\n\t [ /\\\\mathfrak\\{R\\}/g, '\\u211C' ],\n\t [ /\\\\mathbb\\{R\\}/g, '\\u211D' ],\n\t [ /\\\\Elzxrat /g, '\\u211E' ],\n\t [ /\\\\texttrademark /g, '\\u2122' ],\n\t [ /\\\\mathbb\\{Z\\}/g, '\\u2124' ],\n\t [ /\\\\Omega /g, '\\u2126' ],\n\t [ /\\\\mho /g, '\\u2127' ],\n\t [ /\\\\mathfrak\\{Z\\}/g, '\\u2128' ],\n\t [ /\\\\ElsevierGlyph\\{2129\\}/g, '\\u2129' ],\n\t [ /\\\\AA /g, '\\u212B' ],\n\t [ /\\\\mathscr\\{B\\}/g, '\\u212C' ],\n\t [ /\\\\mathfrak\\{C\\}/g, '\\u212D' ],\n\t [ /\\\\mathscr\\{e\\}/g, '\\u212F' ],\n\t [ /\\\\mathscr\\{E\\}/g, '\\u2130' ],\n\t [ /\\\\mathscr\\{F\\}/g, '\\u2131' ],\n\t [ /\\\\mathscr\\{M\\}/g, '\\u2133' ],\n\t [ /\\\\mathscr\\{o\\}/g, '\\u2134' ],\n\t [ /\\\\aleph /g, '\\u2135' ],\n\t [ /\\\\beth /g, '\\u2136' ],\n\t [ /\\\\gimel /g, '\\u2137' ],\n\t [ /\\\\daleth /g, '\\u2138' ],\n\t [ /\\\\textfrac\\{1\\}\\{3\\}/g, '\\u2153' ],\n\t [ /\\\\textfrac\\{2\\}\\{3\\}/g, '\\u2154' ],\n\t [ /\\\\textfrac\\{1\\}\\{5\\}/g, '\\u2155' ],\n\t [ /\\\\textfrac\\{2\\}\\{5\\}/g, '\\u2156' ],\n\t [ /\\\\textfrac\\{3\\}\\{5\\}/g, '\\u2157' ],\n\t [ /\\\\textfrac\\{4\\}\\{5\\}/g, '\\u2158' ],\n\t [ /\\\\textfrac\\{1\\}\\{6\\}/g, '\\u2159' ],\n\t [ /\\\\textfrac\\{5\\}\\{6\\}/g, '\\u215A' ],\n\t [ /\\\\textfrac\\{1\\}\\{8\\}/g, '\\u215B' ],\n\t [ /\\\\textfrac\\{3\\}\\{8\\}/g, '\\u215C' ],\n\t [ /\\\\textfrac\\{5\\}\\{8\\}/g, '\\u215D' ],\n\t [ /\\\\textfrac\\{7\\}\\{8\\}/g, '\\u215E' ],\n\t [ /\\\\leftarrow /g, '\\u2190' ],\n\t [ /\\\\uparrow /g, '\\u2191' ],\n\t [ /\\\\rightarrow /g, '\\u2192' ],\n\t [ /\\\\downarrow /g, '\\u2193' ],\n\t [ /\\\\leftrightarrow /g, '\\u2194' ],\n\t [ /\\\\updownarrow /g, '\\u2195' ],\n\t [ /\\\\nwarrow /g, '\\u2196' ],\n\t [ /\\\\nearrow /g, '\\u2197' ],\n\t [ /\\\\searrow /g, '\\u2198' ],\n\t [ /\\\\swarrow /g, '\\u2199' ],\n\t [ /\\\\nleftarrow /g, '\\u219A' ],\n\t [ /\\\\nrightarrow /g, '\\u219B' ],\n\t [ /\\\\arrowwaveright /g, '\\u219C' ],\n\t [ /\\\\arrowwaveright /g, '\\u219D' ],\n\t [ /\\\\twoheadleftarrow /g, '\\u219E' ],\n\t [ /\\\\twoheadrightarrow /g, '\\u21A0' ],\n\t [ /\\\\leftarrowtail /g, '\\u21A2' ],\n\t [ /\\\\rightarrowtail /g, '\\u21A3' ],\n\t [ /\\\\mapsto /g, '\\u21A6' ],\n\t [ /\\\\hookleftarrow /g, '\\u21A9' ],\n\t [ /\\\\hookrightarrow /g, '\\u21AA' ],\n\t [ /\\\\looparrowleft /g, '\\u21AB' ],\n\t [ /\\\\looparrowright /g, '\\u21AC' ],\n\t [ /\\\\leftrightsquigarrow /g, '\\u21AD' ],\n\t [ /\\\\nleftrightarrow /g, '\\u21AE' ],\n\t [ /\\\\Lsh /g, '\\u21B0' ],\n\t [ /\\\\Rsh /g, '\\u21B1' ],\n\t [ /\\\\ElsevierGlyph\\{21B3\\}/g, '\\u21B3' ],\n\t [ /\\\\curvearrowleft /g, '\\u21B6' ],\n\t [ /\\\\curvearrowright /g, '\\u21B7' ],\n\t [ /\\\\circlearrowleft /g, '\\u21BA' ],\n\t [ /\\\\circlearrowright /g, '\\u21BB' ],\n\t [ /\\\\leftharpoonup /g, '\\u21BC' ],\n\t [ /\\\\leftharpoondown /g, '\\u21BD' ],\n\t [ /\\\\upharpoonright /g, '\\u21BE' ],\n\t [ /\\\\upharpoonleft /g, '\\u21BF' ],\n\t [ /\\\\rightharpoonup /g, '\\u21C0' ],\n\t [ /\\\\rightharpoondown /g, '\\u21C1' ],\n\t [ /\\\\downharpoonright /g, '\\u21C2' ],\n\t [ /\\\\downharpoonleft /g, '\\u21C3' ],\n\t [ /\\\\rightleftarrows /g, '\\u21C4' ],\n\t [ /\\\\dblarrowupdown /g, '\\u21C5' ],\n\t [ /\\\\leftrightarrows /g, '\\u21C6' ],\n\t [ /\\\\leftleftarrows /g, '\\u21C7' ],\n\t [ /\\\\upuparrows /g, '\\u21C8' ],\n\t [ /\\\\rightrightarrows /g, '\\u21C9' ],\n\t [ /\\\\downdownarrows /g, '\\u21CA' ],\n\t [ /\\\\leftrightharpoons /g, '\\u21CB' ],\n\t [ /\\\\rightleftharpoons /g, '\\u21CC' ],\n\t [ /\\\\nLeftarrow /g, '\\u21CD' ],\n\t [ /\\\\nLeftrightarrow /g, '\\u21CE' ],\n\t [ /\\\\nRightarrow /g, '\\u21CF' ],\n\t [ /\\\\Leftarrow /g, '\\u21D0' ],\n\t [ /\\\\Uparrow /g, '\\u21D1' ],\n\t [ /\\\\Rightarrow /g, '\\u21D2' ],\n\t [ /\\\\Downarrow /g, '\\u21D3' ],\n\t [ /\\\\Leftrightarrow /g, '\\u21D4' ],\n\t [ /\\\\Updownarrow /g, '\\u21D5' ],\n\t [ /\\\\Lleftarrow /g, '\\u21DA' ],\n\t [ /\\\\Rrightarrow /g, '\\u21DB' ],\n\t [ /\\\\rightsquigarrow /g, '\\u21DD' ],\n\t [ /\\\\DownArrowUpArrow /g, '\\u21F5' ],\n\t [ /\\\\forall /g, '\\u2200' ],\n\t [ /\\\\complement /g, '\\u2201' ],\n\t [ /\\\\partial /g, '\\u2202' ],\n\t [ /\\\\exists /g, '\\u2203' ],\n\t [ /\\\\nexists /g, '\\u2204' ],\n\t [ /\\\\varnothing /g, '\\u2205' ],\n\t [ /\\\\nabla /g, '\\u2207' ],\n\t [ /\\\\in /g, '\\u2208' ],\n\t [ /\\\\not\\\\in /g, '\\u2209' ],\n\t [ /\\\\ni /g, '\\u220B' ],\n\t [ /\\\\not\\\\ni /g, '\\u220C' ],\n\t [ /\\\\prod /g, '\\u220F' ],\n\t [ /\\\\coprod /g, '\\u2210' ],\n\t [ /\\\\sum /g, '\\u2211' ],\n\t [ /\\\\mp /g, '\\u2213' ],\n\t [ /\\\\dotplus /g, '\\u2214' ],\n\t [ /\\\\setminus /g, '\\u2216' ],\n\t [ /\\\\circ /g, '\\u2218' ],\n\t [ /\\\\bullet /g, '\\u2219' ],\n\t [ /\\\\surd /g, '\\u221A' ],\n\t [ /\\\\propto /g, '\\u221D' ],\n\t [ /\\\\infty /g, '\\u221E' ],\n\t [ /\\\\rightangle /g, '\\u221F' ],\n\t [ /\\\\angle /g, '\\u2220' ],\n\t [ /\\\\measuredangle /g, '\\u2221' ],\n\t [ /\\\\sphericalangle /g, '\\u2222' ],\n\t [ /\\\\mid /g, '\\u2223' ],\n\t [ /\\\\nmid /g, '\\u2224' ],\n\t [ /\\\\parallel /g, '\\u2225' ],\n\t [ /\\\\nparallel /g, '\\u2226' ],\n\t [ /\\\\wedge /g, '\\u2227' ],\n\t [ /\\\\vee /g, '\\u2228' ],\n\t [ /\\\\cap /g, '\\u2229' ],\n\t [ /\\\\cup /g, '\\u222A' ],\n\t [ /\\\\int /g, '\\u222B' ],\n\t [ /\\\\int\\\\!\\\\int /g, '\\u222C' ],\n\t [ /\\\\int\\\\!\\\\int\\\\!\\\\int /g, '\\u222D' ],\n\t [ /\\\\oint /g, '\\u222E' ],\n\t [ /\\\\surfintegral /g, '\\u222F' ],\n\t [ /\\\\volintegral /g, '\\u2230' ],\n\t [ /\\\\clwintegral /g, '\\u2231' ],\n\t [ /\\\\ElsevierGlyph\\{2232\\}/g, '\\u2232' ],\n\t [ /\\\\ElsevierGlyph\\{2233\\}/g, '\\u2233' ],\n\t [ /\\\\therefore /g, '\\u2234' ],\n\t [ /\\\\because /g, '\\u2235' ],\n\t [ /\\\\Colon /g, '\\u2237' ],\n\t [ /\\\\ElsevierGlyph\\{2238\\}/g, '\\u2238' ],\n\t [ /\\\\mathbin\\{\\{:\\}\\\\!\\\\!\\{\\-\\}\\\\!\\\\!\\{:\\}\\}/g, '\\u223A' ],\n\t [ /\\\\homothetic /g, '\\u223B' ],\n\t [ /\\\\sim /g, '\\u223C' ],\n\t [ /\\\\backsim /g, '\\u223D' ],\n\t [ /\\\\lazysinv /g, '\\u223E' ],\n\t [ /\\\\wr /g, '\\u2240' ],\n\t [ /\\\\not\\\\sim /g, '\\u2241' ],\n\t [ /\\\\ElsevierGlyph\\{2242\\}/g, '\\u2242' ],\n\t [ /\\\\NotEqualTilde /g, '\\u2242-00338' ],\n\t [ /\\\\simeq /g, '\\u2243' ],\n\t [ /\\\\not\\\\simeq /g, '\\u2244' ],\n\t [ /\\\\cong /g, '\\u2245' ],\n\t [ /\\\\approxnotequal /g, '\\u2246' ],\n\t [ /\\\\not\\\\cong /g, '\\u2247' ],\n\t [ /\\\\approx /g, '\\u2248' ],\n\t [ /\\\\not\\\\approx /g, '\\u2249' ],\n\t [ /\\\\approxeq /g, '\\u224A' ],\n\t [ /\\\\tildetrpl /g, '\\u224B' ],\n\t [ /\\\\not\\\\apid /g, '\\u224B-00338' ],\n\t [ /\\\\allequal /g, '\\u224C' ],\n\t [ /\\\\asymp /g, '\\u224D' ],\n\t [ /\\\\Bumpeq /g, '\\u224E' ],\n\t [ /\\\\NotHumpDownHump /g, '\\u224E-00338' ],\n\t [ /\\\\bumpeq /g, '\\u224F' ],\n\t [ /\\\\NotHumpEqual /g, '\\u224F-00338' ],\n\t [ /\\\\doteq /g, '\\u2250' ],\n\t [ /\\\\not\\\\doteq/g, '\\u2250-00338' ],\n\t [ /\\\\doteqdot /g, '\\u2251' ],\n\t [ /\\\\fallingdotseq /g, '\\u2252' ],\n\t [ /\\\\risingdotseq /g, '\\u2253' ],\n\t [ /\\\\eqcirc /g, '\\u2256' ],\n\t [ /\\\\circeq /g, '\\u2257' ],\n\t [ /\\\\estimates /g, '\\u2259' ],\n\t [ /\\\\ElsevierGlyph\\{225A\\}/g, '\\u225A' ],\n\t [ /\\\\starequal /g, '\\u225B' ],\n\t [ /\\\\triangleq /g, '\\u225C' ],\n\t [ /\\\\ElsevierGlyph\\{225F\\}/g, '\\u225F' ],\n\t [ /\\\\not =/g, '\\u2260' ],\n\t [ /\\\\equiv /g, '\\u2261' ],\n\t [ /\\\\not\\\\equiv /g, '\\u2262' ],\n\t [ /\\\\leq /g, '\\u2264' ],\n\t [ /\\\\geq /g, '\\u2265' ],\n\t [ /\\\\leqq /g, '\\u2266' ],\n\t [ /\\\\geqq /g, '\\u2267' ],\n\t [ /\\\\lneqq /g, '\\u2268' ],\n\t [ /\\\\lvertneqq /g, '\\u2268-0FE00' ],\n\t [ /\\\\gneqq /g, '\\u2269' ],\n\t [ /\\\\gvertneqq /g, '\\u2269-0FE00' ],\n\t [ /\\\\ll /g, '\\u226A' ],\n\t [ /\\\\NotLessLess /g, '\\u226A-00338' ],\n\t [ /\\\\gg /g, '\\u226B' ],\n\t [ /\\\\NotGreaterGreater /g, '\\u226B-00338' ],\n\t [ /\\\\between /g, '\\u226C' ],\n\t [ /\\\\not\\\\kern\\-0.3em\\\\times /g, '\\u226D' ],\n\t [ /\\\\not/g, '\\u226F' ],\n\t [ /\\\\not\\\\leq /g, '\\u2270' ],\n\t [ /\\\\not\\\\geq /g, '\\u2271' ],\n\t [ /\\\\lessequivlnt /g, '\\u2272' ],\n\t [ /\\\\greaterequivlnt /g, '\\u2273' ],\n\t [ /\\\\ElsevierGlyph\\{2274\\}/g, '\\u2274' ],\n\t [ /\\\\ElsevierGlyph\\{2275\\}/g, '\\u2275' ],\n\t [ /\\\\lessgtr /g, '\\u2276' ],\n\t [ /\\\\gtrless /g, '\\u2277' ],\n\t [ /\\\\notlessgreater /g, '\\u2278' ],\n\t [ /\\\\notgreaterless /g, '\\u2279' ],\n\t [ /\\\\prec /g, '\\u227A' ],\n\t [ /\\\\succ /g, '\\u227B' ],\n\t [ /\\\\preccurlyeq /g, '\\u227C' ],\n\t [ /\\\\succcurlyeq /g, '\\u227D' ],\n\t [ /\\\\precapprox /g, '\\u227E' ],\n\t [ /\\\\NotPrecedesTilde /g, '\\u227E-00338' ],\n\t [ /\\\\succapprox /g, '\\u227F' ],\n\t [ /\\\\NotSucceedsTilde /g, '\\u227F-00338' ],\n\t [ /\\\\not\\\\prec /g, '\\u2280' ],\n\t [ /\\\\not\\\\succ /g, '\\u2281' ],\n\t [ /\\\\subset /g, '\\u2282' ],\n\t [ /\\\\supset /g, '\\u2283' ],\n\t [ /\\\\not\\\\subset /g, '\\u2284' ],\n\t [ /\\\\not\\\\supset /g, '\\u2285' ],\n\t [ /\\\\subseteq /g, '\\u2286' ],\n\t [ /\\\\supseteq /g, '\\u2287' ],\n\t [ /\\\\not\\\\subseteq /g, '\\u2288' ],\n\t [ /\\\\not\\\\supseteq /g, '\\u2289' ],\n\t [ /\\\\subsetneq /g, '\\u228A' ],\n\t [ /\\\\varsubsetneqq /g, '\\u228A-0FE00' ],\n\t [ /\\\\supsetneq /g, '\\u228B' ],\n\t [ /\\\\varsupsetneq /g, '\\u228B-0FE00' ],\n\t [ /\\\\uplus /g, '\\u228E' ],\n\t [ /\\\\sqsubset /g, '\\u228F' ],\n\t [ /\\\\NotSquareSubset /g, '\\u228F-00338' ],\n\t [ /\\\\sqsupset /g, '\\u2290' ],\n\t [ /\\\\NotSquareSuperset /g, '\\u2290-00338' ],\n\t [ /\\\\sqsubseteq /g, '\\u2291' ],\n\t [ /\\\\sqsupseteq /g, '\\u2292' ],\n\t [ /\\\\sqcap /g, '\\u2293' ],\n\t [ /\\\\sqcup /g, '\\u2294' ],\n\t [ /\\\\oplus /g, '\\u2295' ],\n\t [ /\\\\ominus /g, '\\u2296' ],\n\t [ /\\\\otimes /g, '\\u2297' ],\n\t [ /\\\\oslash /g, '\\u2298' ],\n\t [ /\\\\odot /g, '\\u2299' ],\n\t [ /\\\\circledcirc /g, '\\u229A' ],\n\t [ /\\\\circledast /g, '\\u229B' ],\n\t [ /\\\\circleddash /g, '\\u229D' ],\n\t [ /\\\\boxplus /g, '\\u229E' ],\n\t [ /\\\\boxminus /g, '\\u229F' ],\n\t [ /\\\\boxtimes /g, '\\u22A0' ],\n\t [ /\\\\boxdot /g, '\\u22A1' ],\n\t [ /\\\\vdash /g, '\\u22A2' ],\n\t [ /\\\\dashv /g, '\\u22A3' ],\n\t [ /\\\\top /g, '\\u22A4' ],\n\t [ /\\\\perp /g, '\\u22A5' ],\n\t [ /\\\\truestate /g, '\\u22A7' ],\n\t [ /\\\\forcesextra /g, '\\u22A8' ],\n\t [ /\\\\Vdash /g, '\\u22A9' ],\n\t [ /\\\\Vvdash /g, '\\u22AA' ],\n\t [ /\\\\VDash /g, '\\u22AB' ],\n\t [ /\\\\nvdash /g, '\\u22AC' ],\n\t [ /\\\\nvDash /g, '\\u22AD' ],\n\t [ /\\\\nVdash /g, '\\u22AE' ],\n\t [ /\\\\nVDash /g, '\\u22AF' ],\n\t [ /\\\\vartriangleleft /g, '\\u22B2' ],\n\t [ /\\\\vartriangleright /g, '\\u22B3' ],\n\t [ /\\\\trianglelefteq /g, '\\u22B4' ],\n\t [ /\\\\trianglerighteq /g, '\\u22B5' ],\n\t [ /\\\\original /g, '\\u22B6' ],\n\t [ /\\\\image /g, '\\u22B7' ],\n\t [ /\\\\multimap /g, '\\u22B8' ],\n\t [ /\\\\hermitconjmatrix /g, '\\u22B9' ],\n\t [ /\\\\intercal /g, '\\u22BA' ],\n\t [ /\\\\veebar /g, '\\u22BB' ],\n\t [ /\\\\rightanglearc /g, '\\u22BE' ],\n\t [ /\\\\ElsevierGlyph\\{22C0\\}/g, '\\u22C0' ],\n\t [ /\\\\ElsevierGlyph\\{22C1\\}/g, '\\u22C1' ],\n\t [ /\\\\bigcap /g, '\\u22C2' ],\n\t [ /\\\\bigcup /g, '\\u22C3' ],\n\t [ /\\\\diamond /g, '\\u22C4' ],\n\t [ /\\\\cdot /g, '\\u22C5' ],\n\t [ /\\\\star /g, '\\u22C6' ],\n\t [ /\\\\divideontimes /g, '\\u22C7' ],\n\t [ /\\\\bowtie /g, '\\u22C8' ],\n\t [ /\\\\ltimes /g, '\\u22C9' ],\n\t [ /\\\\rtimes /g, '\\u22CA' ],\n\t [ /\\\\leftthreetimes /g, '\\u22CB' ],\n\t [ /\\\\rightthreetimes /g, '\\u22CC' ],\n\t [ /\\\\backsimeq /g, '\\u22CD' ],\n\t [ /\\\\curlyvee /g, '\\u22CE' ],\n\t [ /\\\\curlywedge /g, '\\u22CF' ],\n\t [ /\\\\Subset /g, '\\u22D0' ],\n\t [ /\\\\Supset /g, '\\u22D1' ],\n\t [ /\\\\Cap /g, '\\u22D2' ],\n\t [ /\\\\Cup /g, '\\u22D3' ],\n\t [ /\\\\pitchfork /g, '\\u22D4' ],\n\t [ /\\\\lessdot /g, '\\u22D6' ],\n\t [ /\\\\gtrdot /g, '\\u22D7' ],\n\t [ /\\\\verymuchless /g, '\\u22D8' ],\n\t [ /\\\\verymuchgreater /g, '\\u22D9' ],\n\t [ /\\\\lesseqgtr /g, '\\u22DA' ],\n\t [ /\\\\gtreqless /g, '\\u22DB' ],\n\t [ /\\\\curlyeqprec /g, '\\u22DE' ],\n\t [ /\\\\curlyeqsucc /g, '\\u22DF' ],\n\t [ /\\\\not\\\\sqsubseteq /g, '\\u22E2' ],\n\t [ /\\\\not\\\\sqsupseteq /g, '\\u22E3' ],\n\t [ /\\\\Elzsqspne /g, '\\u22E5' ],\n\t [ /\\\\lnsim /g, '\\u22E6' ],\n\t [ /\\\\gnsim /g, '\\u22E7' ],\n\t [ /\\\\precedesnotsimilar /g, '\\u22E8' ],\n\t [ /\\\\succnsim /g, '\\u22E9' ],\n\t [ /\\\\ntriangleleft /g, '\\u22EA' ],\n\t [ /\\\\ntriangleright /g, '\\u22EB' ],\n\t [ /\\\\ntrianglelefteq /g, '\\u22EC' ],\n\t [ /\\\\ntrianglerighteq /g, '\\u22ED' ],\n\t [ /\\\\vdots /g, '\\u22EE' ],\n\t [ /\\\\cdots /g, '\\u22EF' ],\n\t [ /\\\\upslopeellipsis /g, '\\u22F0' ],\n\t [ /\\\\downslopeellipsis /g, '\\u22F1' ],\n\t [ /\\\\barwedge /g, '\\u2305' ],\n\t [ /\\\\perspcorrespond /g, '\\u2306' ],\n\t [ /\\\\lceil /g, '\\u2308' ],\n\t [ /\\\\rceil /g, '\\u2309' ],\n\t [ /\\\\lfloor /g, '\\u230A' ],\n\t [ /\\\\rfloor /g, '\\u230B' ],\n\t [ /\\\\recorder /g, '\\u2315' ],\n\t [ /\\\\mathchar\"2208/g, '\\u2316' ],\n\t [ /\\\\ulcorner /g, '\\u231C' ],\n\t [ /\\\\urcorner /g, '\\u231D' ],\n\t [ /\\\\llcorner /g, '\\u231E' ],\n\t [ /\\\\lrcorner /g, '\\u231F' ],\n\t [ /\\\\frown /g, '\\u2322' ],\n\t [ /\\\\smile /g, '\\u2323' ],\n\t [ /\\\\langle /g, '\\u2329' ],\n\t [ /\\\\rangle /g, '\\u232A' ],\n\t [ /\\\\ElsevierGlyph\\{E838\\}/g, '\\u233D' ],\n\t [ /\\\\Elzdlcorn /g, '\\u23A3' ],\n\t [ /\\\\lmoustache /g, '\\u23B0' ],\n\t [ /\\\\rmoustache /g, '\\u23B1' ],\n\t [ /\\\\textvisiblespace /g, '\\u2423' ],\n\t [ /\\\\ding\\{172\\}/g, '\\u2460' ],\n\t [ /\\\\ding\\{173\\}/g, '\\u2461' ],\n\t [ /\\\\ding\\{174\\}/g, '\\u2462' ],\n\t [ /\\\\ding\\{175\\}/g, '\\u2463' ],\n\t [ /\\\\ding\\{176\\}/g, '\\u2464' ],\n\t [ /\\\\ding\\{177\\}/g, '\\u2465' ],\n\t [ /\\\\ding\\{178\\}/g, '\\u2466' ],\n\t [ /\\\\ding\\{179\\}/g, '\\u2467' ],\n\t [ /\\\\ding\\{180\\}/g, '\\u2468' ],\n\t [ /\\\\ding\\{181\\}/g, '\\u2469' ],\n\t [ /\\\\circledS /g, '\\u24C8' ],\n\t [ /\\\\Elzdshfnc /g, '\\u2506' ],\n\t [ /\\\\Elzsqfnw /g, '\\u2519' ],\n\t [ /\\\\diagup /g, '\\u2571' ],\n\t [ /\\\\ding\\{110\\}/g, '\\u25A0' ],\n\t [ /\\\\square /g, '\\u25A1' ],\n\t [ /\\\\blacksquare /g, '\\u25AA' ],\n\t [ /\\\\fbox\\{~~\\}/g, '\\u25AD' ],\n\t [ /\\\\Elzvrecto /g, '\\u25AF' ],\n\t [ /\\\\ElsevierGlyph\\{E381\\}/g, '\\u25B1' ],\n\t [ /\\\\ding\\{115\\}/g, '\\u25B2' ],\n\t [ /\\\\bigtriangleup /g, '\\u25B3' ],\n\t [ /\\\\blacktriangle /g, '\\u25B4' ],\n\t [ /\\\\vartriangle /g, '\\u25B5' ],\n\t [ /\\\\blacktriangleright /g, '\\u25B8' ],\n\t [ /\\\\triangleright /g, '\\u25B9' ],\n\t [ /\\\\ding\\{116\\}/g, '\\u25BC' ],\n\t [ /\\\\bigtriangledown /g, '\\u25BD' ],\n\t [ /\\\\blacktriangledown /g, '\\u25BE' ],\n\t [ /\\\\triangledown /g, '\\u25BF' ],\n\t [ /\\\\blacktriangleleft /g, '\\u25C2' ],\n\t [ /\\\\triangleleft /g, '\\u25C3' ],\n\t [ /\\\\ding\\{117\\}/g, '\\u25C6' ],\n\t [ /\\\\lozenge /g, '\\u25CA' ],\n\t [ /\\\\bigcirc /g, '\\u25CB' ],\n\t [ /\\\\ding\\{108\\}/g, '\\u25CF' ],\n\t [ /\\\\Elzcirfl /g, '\\u25D0' ],\n\t [ /\\\\Elzcirfr /g, '\\u25D1' ],\n\t [ /\\\\Elzcirfb /g, '\\u25D2' ],\n\t [ /\\\\ding\\{119\\}/g, '\\u25D7' ],\n\t [ /\\\\Elzrvbull /g, '\\u25D8' ],\n\t [ /\\\\Elzsqfl /g, '\\u25E7' ],\n\t [ /\\\\Elzsqfr /g, '\\u25E8' ],\n\t [ /\\\\Elzsqfse /g, '\\u25EA' ],\n\t [ /\\\\bigcirc /g, '\\u25EF' ],\n\t [ /\\\\ding\\{72\\}/g, '\\u2605' ],\n\t [ /\\\\ding\\{73\\}/g, '\\u2606' ],\n\t [ /\\\\ding\\{37\\}/g, '\\u260E' ],\n\t [ /\\\\ding\\{42\\}/g, '\\u261B' ],\n\t [ /\\\\ding\\{43\\}/g, '\\u261E' ],\n\t [ /\\\\rightmoon /g, '\\u263E' ],\n\t [ /\\\\mercury /g, '\\u263F' ],\n\t [ /\\\\venus /g, '\\u2640' ],\n\t [ /\\\\male /g, '\\u2642' ],\n\t [ /\\\\jupiter /g, '\\u2643' ],\n\t [ /\\\\saturn /g, '\\u2644' ],\n\t [ /\\\\uranus /g, '\\u2645' ],\n\t [ /\\\\neptune /g, '\\u2646' ],\n\t [ /\\\\pluto /g, '\\u2647' ],\n\t [ /\\\\aries /g, '\\u2648' ],\n\t [ /\\\\taurus /g, '\\u2649' ],\n\t [ /\\\\gemini /g, '\\u264A' ],\n\t [ /\\\\cancer /g, '\\u264B' ],\n\t [ /\\\\leo /g, '\\u264C' ],\n\t [ /\\\\virgo /g, '\\u264D' ],\n\t [ /\\\\libra /g, '\\u264E' ],\n\t [ /\\\\scorpio /g, '\\u264F' ],\n\t [ /\\\\sagittarius /g, '\\u2650' ],\n\t [ /\\\\capricornus /g, '\\u2651' ],\n\t [ /\\\\aquarius /g, '\\u2652' ],\n\t [ /\\\\pisces /g, '\\u2653' ],\n\t [ /\\\\ding\\{171\\}/g, '\\u2660' ],\n\t [ /\\\\diamond /g, '\\u2662' ],\n\t [ /\\\\ding\\{168\\}/g, '\\u2663' ],\n\t [ /\\\\ding\\{170\\}/g, '\\u2665' ],\n\t [ /\\\\ding\\{169\\}/g, '\\u2666' ],\n\t [ /\\\\quarternote /g, '\\u2669' ],\n\t [ /\\\\eighthnote /g, '\\u266A' ],\n\t [ /\\\\flat /g, '\\u266D' ],\n\t [ /\\\\natural /g, '\\u266E' ],\n\t [ /\\\\sharp /g, '\\u266F' ],\n\t [ /\\\\ding\\{33\\}/g, '\\u2701' ],\n\t [ /\\\\ding\\{34\\}/g, '\\u2702' ],\n\t [ /\\\\ding\\{35\\}/g, '\\u2703' ],\n\t [ /\\\\ding\\{36\\}/g, '\\u2704' ],\n\t [ /\\\\ding\\{38\\}/g, '\\u2706' ],\n\t [ /\\\\ding\\{39\\}/g, '\\u2707' ],\n\t [ /\\\\ding\\{40\\}/g, '\\u2708' ],\n\t [ /\\\\ding\\{41\\}/g, '\\u2709' ],\n\t [ /\\\\ding\\{44\\}/g, '\\u270C' ],\n\t [ /\\\\ding\\{45\\}/g, '\\u270D' ],\n\t [ /\\\\ding\\{46\\}/g, '\\u270E' ],\n\t [ /\\\\ding\\{47\\}/g, '\\u270F' ],\n\t [ /\\\\ding\\{48\\}/g, '\\u2710' ],\n\t [ /\\\\ding\\{49\\}/g, '\\u2711' ],\n\t [ /\\\\ding\\{50\\}/g, '\\u2712' ],\n\t [ /\\\\ding\\{51\\}/g, '\\u2713' ],\n\t [ /\\\\ding\\{52\\}/g, '\\u2714' ],\n\t [ /\\\\ding\\{53\\}/g, '\\u2715' ],\n\t [ /\\\\ding\\{54\\}/g, '\\u2716' ],\n\t [ /\\\\ding\\{55\\}/g, '\\u2717' ],\n\t [ /\\\\ding\\{56\\}/g, '\\u2718' ],\n\t [ /\\\\ding\\{57\\}/g, '\\u2719' ],\n\t [ /\\\\ding\\{58\\}/g, '\\u271A' ],\n\t [ /\\\\ding\\{59\\}/g, '\\u271B' ],\n\t [ /\\\\ding\\{60\\}/g, '\\u271C' ],\n\t [ /\\\\ding\\{61\\}/g, '\\u271D' ],\n\t [ /\\\\ding\\{62\\}/g, '\\u271E' ],\n\t [ /\\\\ding\\{63\\}/g, '\\u271F' ],\n\t [ /\\\\ding\\{64\\}/g, '\\u2720' ],\n\t [ /\\\\ding\\{65\\}/g, '\\u2721' ],\n\t [ /\\\\ding\\{66\\}/g, '\\u2722' ],\n\t [ /\\\\ding\\{67\\}/g, '\\u2723' ],\n\t [ /\\\\ding\\{68\\}/g, '\\u2724' ],\n\t [ /\\\\ding\\{69\\}/g, '\\u2725' ],\n\t [ /\\\\ding\\{70\\}/g, '\\u2726' ],\n\t [ /\\\\ding\\{71\\}/g, '\\u2727' ],\n\t [ /\\\\ding\\{73\\}/g, '\\u2729' ],\n\t [ /\\\\ding\\{74\\}/g, '\\u272A' ],\n\t [ /\\\\ding\\{75\\}/g, '\\u272B' ],\n\t [ /\\\\ding\\{76\\}/g, '\\u272C' ],\n\t [ /\\\\ding\\{77\\}/g, '\\u272D' ],\n\t [ /\\\\ding\\{78\\}/g, '\\u272E' ],\n\t [ /\\\\ding\\{79\\}/g, '\\u272F' ],\n\t [ /\\\\ding\\{80\\}/g, '\\u2730' ],\n\t [ /\\\\ding\\{81\\}/g, '\\u2731' ],\n\t [ /\\\\ding\\{82\\}/g, '\\u2732' ],\n\t [ /\\\\ding\\{83\\}/g, '\\u2733' ],\n\t [ /\\\\ding\\{84\\}/g, '\\u2734' ],\n\t [ /\\\\ding\\{85\\}/g, '\\u2735' ],\n\t [ /\\\\ding\\{86\\}/g, '\\u2736' ],\n\t [ /\\\\ding\\{87\\}/g, '\\u2737' ],\n\t [ /\\\\ding\\{88\\}/g, '\\u2738' ],\n\t [ /\\\\ding\\{89\\}/g, '\\u2739' ],\n\t [ /\\\\ding\\{90\\}/g, '\\u273A' ],\n\t [ /\\\\ding\\{91\\}/g, '\\u273B' ],\n\t [ /\\\\ding\\{92\\}/g, '\\u273C' ],\n\t [ /\\\\ding\\{93\\}/g, '\\u273D' ],\n\t [ /\\\\ding\\{94\\}/g, '\\u273E' ],\n\t [ /\\\\ding\\{95\\}/g, '\\u273F' ],\n\t [ /\\\\ding\\{96\\}/g, '\\u2740' ],\n\t [ /\\\\ding\\{97\\}/g, '\\u2741' ],\n\t [ /\\\\ding\\{98\\}/g, '\\u2742' ],\n\t [ /\\\\ding\\{99\\}/g, '\\u2743' ],\n\t [ /\\\\ding\\{100\\}/g, '\\u2744' ],\n\t [ /\\\\ding\\{101\\}/g, '\\u2745' ],\n\t [ /\\\\ding\\{102\\}/g, '\\u2746' ],\n\t [ /\\\\ding\\{103\\}/g, '\\u2747' ],\n\t [ /\\\\ding\\{104\\}/g, '\\u2748' ],\n\t [ /\\\\ding\\{105\\}/g, '\\u2749' ],\n\t [ /\\\\ding\\{106\\}/g, '\\u274A' ],\n\t [ /\\\\ding\\{107\\}/g, '\\u274B' ],\n\t [ /\\\\ding\\{109\\}/g, '\\u274D' ],\n\t [ /\\\\ding\\{111\\}/g, '\\u274F' ],\n\t [ /\\\\ding\\{112\\}/g, '\\u2750' ],\n\t [ /\\\\ding\\{113\\}/g, '\\u2751' ],\n\t [ /\\\\ding\\{114\\}/g, '\\u2752' ],\n\t [ /\\\\ding\\{118\\}/g, '\\u2756' ],\n\t [ /\\\\ding\\{120\\}/g, '\\u2758' ],\n\t [ /\\\\ding\\{121\\}/g, '\\u2759' ],\n\t [ /\\\\ding\\{122\\}/g, '\\u275A' ],\n\t [ /\\\\ding\\{123\\}/g, '\\u275B' ],\n\t [ /\\\\ding\\{124\\}/g, '\\u275C' ],\n\t [ /\\\\ding\\{125\\}/g, '\\u275D' ],\n\t [ /\\\\ding\\{126\\}/g, '\\u275E' ],\n\t [ /\\\\ding\\{161\\}/g, '\\u2761' ],\n\t [ /\\\\ding\\{162\\}/g, '\\u2762' ],\n\t [ /\\\\ding\\{163\\}/g, '\\u2763' ],\n\t [ /\\\\ding\\{164\\}/g, '\\u2764' ],\n\t [ /\\\\ding\\{165\\}/g, '\\u2765' ],\n\t [ /\\\\ding\\{166\\}/g, '\\u2766' ],\n\t [ /\\\\ding\\{167\\}/g, '\\u2767' ],\n\t [ /\\\\ding\\{182\\}/g, '\\u2776' ],\n\t [ /\\\\ding\\{183\\}/g, '\\u2777' ],\n\t [ /\\\\ding\\{184\\}/g, '\\u2778' ],\n\t [ /\\\\ding\\{185\\}/g, '\\u2779' ],\n\t [ /\\\\ding\\{186\\}/g, '\\u277A' ],\n\t [ /\\\\ding\\{187\\}/g, '\\u277B' ],\n\t [ /\\\\ding\\{188\\}/g, '\\u277C' ],\n\t [ /\\\\ding\\{189\\}/g, '\\u277D' ],\n\t [ /\\\\ding\\{190\\}/g, '\\u277E' ],\n\t [ /\\\\ding\\{191\\}/g, '\\u277F' ],\n\t [ /\\\\ding\\{192\\}/g, '\\u2780' ],\n\t [ /\\\\ding\\{193\\}/g, '\\u2781' ],\n\t [ /\\\\ding\\{194\\}/g, '\\u2782' ],\n\t [ /\\\\ding\\{195\\}/g, '\\u2783' ],\n\t [ /\\\\ding\\{196\\}/g, '\\u2784' ],\n\t [ /\\\\ding\\{197\\}/g, '\\u2785' ],\n\t [ /\\\\ding\\{198\\}/g, '\\u2786' ],\n\t [ /\\\\ding\\{199\\}/g, '\\u2787' ],\n\t [ /\\\\ding\\{200\\}/g, '\\u2788' ],\n\t [ /\\\\ding\\{201\\}/g, '\\u2789' ],\n\t [ /\\\\ding\\{202\\}/g, '\\u278A' ],\n\t [ /\\\\ding\\{203\\}/g, '\\u278B' ],\n\t [ /\\\\ding\\{204\\}/g, '\\u278C' ],\n\t [ /\\\\ding\\{205\\}/g, '\\u278D' ],\n\t [ /\\\\ding\\{206\\}/g, '\\u278E' ],\n\t [ /\\\\ding\\{207\\}/g, '\\u278F' ],\n\t [ /\\\\ding\\{208\\}/g, '\\u2790' ],\n\t [ /\\\\ding\\{209\\}/g, '\\u2791' ],\n\t [ /\\\\ding\\{210\\}/g, '\\u2792' ],\n\t [ /\\\\ding\\{211\\}/g, '\\u2793' ],\n\t [ /\\\\ding\\{212\\}/g, '\\u2794' ],\n\t [ /\\\\ding\\{216\\}/g, '\\u2798' ],\n\t [ /\\\\ding\\{217\\}/g, '\\u2799' ],\n\t [ /\\\\ding\\{218\\}/g, '\\u279A' ],\n\t [ /\\\\ding\\{219\\}/g, '\\u279B' ],\n\t [ /\\\\ding\\{220\\}/g, '\\u279C' ],\n\t [ /\\\\ding\\{221\\}/g, '\\u279D' ],\n\t [ /\\\\ding\\{222\\}/g, '\\u279E' ],\n\t [ /\\\\ding\\{223\\}/g, '\\u279F' ],\n\t [ /\\\\ding\\{224\\}/g, '\\u27A0' ],\n\t [ /\\\\ding\\{225\\}/g, '\\u27A1' ],\n\t [ /\\\\ding\\{226\\}/g, '\\u27A2' ],\n\t [ /\\\\ding\\{227\\}/g, '\\u27A3' ],\n\t [ /\\\\ding\\{228\\}/g, '\\u27A4' ],\n\t [ /\\\\ding\\{229\\}/g, '\\u27A5' ],\n\t [ /\\\\ding\\{230\\}/g, '\\u27A6' ],\n\t [ /\\\\ding\\{231\\}/g, '\\u27A7' ],\n\t [ /\\\\ding\\{232\\}/g, '\\u27A8' ],\n\t [ /\\\\ding\\{233\\}/g, '\\u27A9' ],\n\t [ /\\\\ding\\{234\\}/g, '\\u27AA' ],\n\t [ /\\\\ding\\{235\\}/g, '\\u27AB' ],\n\t [ /\\\\ding\\{236\\}/g, '\\u27AC' ],\n\t [ /\\\\ding\\{237\\}/g, '\\u27AD' ],\n\t [ /\\\\ding\\{238\\}/g, '\\u27AE' ],\n\t [ /\\\\ding\\{239\\}/g, '\\u27AF' ],\n\t [ /\\\\ding\\{241\\}/g, '\\u27B1' ],\n\t [ /\\\\ding\\{242\\}/g, '\\u27B2' ],\n\t [ /\\\\ding\\{243\\}/g, '\\u27B3' ],\n\t [ /\\\\ding\\{244\\}/g, '\\u27B4' ],\n\t [ /\\\\ding\\{245\\}/g, '\\u27B5' ],\n\t [ /\\\\ding\\{246\\}/g, '\\u27B6' ],\n\t [ /\\\\ding\\{247\\}/g, '\\u27B7' ],\n\t [ /\\\\ding\\{248\\}/g, '\\u27B8' ],\n\t [ /\\\\ding\\{249\\}/g, '\\u27B9' ],\n\t [ /\\\\ding\\{250\\}/g, '\\u27BA' ],\n\t [ /\\\\ding\\{251\\}/g, '\\u27BB' ],\n\t [ /\\\\ding\\{252\\}/g, '\\u27BC' ],\n\t [ /\\\\ding\\{253\\}/g, '\\u27BD' ],\n\t [ /\\\\ding\\{254\\}/g, '\\u27BE' ],\n\t [ /\\\\longleftarrow /g, '\\u27F5' ],\n\t [ /\\\\longrightarrow /g, '\\u27F6' ],\n\t [ /\\\\longleftrightarrow /g, '\\u27F7' ],\n\t [ /\\\\Longleftarrow /g, '\\u27F8' ],\n\t [ /\\\\Longrightarrow /g, '\\u27F9' ],\n\t [ /\\\\Longleftrightarrow /g, '\\u27FA' ],\n\t [ /\\\\longmapsto /g, '\\u27FC' ],\n\t [ /\\\\sim\\\\joinrel\\\\leadsto/g, '\\u27FF' ],\n\t [ /\\\\ElsevierGlyph\\{E212\\}/g, '\\u2905' ],\n\t [ /\\\\UpArrowBar /g, '\\u2912' ],\n\t [ /\\\\DownArrowBar /g, '\\u2913' ],\n\t [ /\\\\ElsevierGlyph\\{E20C\\}/g, '\\u2923' ],\n\t [ /\\\\ElsevierGlyph\\{E20D\\}/g, '\\u2924' ],\n\t [ /\\\\ElsevierGlyph\\{E20B\\}/g, '\\u2925' ],\n\t [ /\\\\ElsevierGlyph\\{E20A\\}/g, '\\u2926' ],\n\t [ /\\\\ElsevierGlyph\\{E211\\}/g, '\\u2927' ],\n\t [ /\\\\ElsevierGlyph\\{E20E\\}/g, '\\u2928' ],\n\t [ /\\\\ElsevierGlyph\\{E20F\\}/g, '\\u2929' ],\n\t [ /\\\\ElsevierGlyph\\{E210\\}/g, '\\u292A' ],\n\t [ /\\\\ElsevierGlyph\\{E21C\\}/g, '\\u2933' ],\n\t [ /\\\\ElsevierGlyph\\{E21D\\}/g, '\\u2933-00338' ],\n\t [ /\\\\ElsevierGlyph\\{E21A\\}/g, '\\u2936' ],\n\t [ /\\\\ElsevierGlyph\\{E219\\}/g, '\\u2937' ],\n\t [ /\\\\Elolarr /g, '\\u2940' ],\n\t [ /\\\\Elorarr /g, '\\u2941' ],\n\t [ /\\\\ElzRlarr /g, '\\u2942' ],\n\t [ /\\\\ElzrLarr /g, '\\u2944' ],\n\t [ /\\\\Elzrarrx /g, '\\u2947' ],\n\t [ /\\\\LeftRightVector /g, '\\u294E' ],\n\t [ /\\\\RightUpDownVector /g, '\\u294F' ],\n\t [ /\\\\DownLeftRightVector /g, '\\u2950' ],\n\t [ /\\\\LeftUpDownVector /g, '\\u2951' ],\n\t [ /\\\\LeftVectorBar /g, '\\u2952' ],\n\t [ /\\\\RightVectorBar /g, '\\u2953' ],\n\t [ /\\\\RightUpVectorBar /g, '\\u2954' ],\n\t [ /\\\\RightDownVectorBar /g, '\\u2955' ],\n\t [ /\\\\DownLeftVectorBar /g, '\\u2956' ],\n\t [ /\\\\DownRightVectorBar /g, '\\u2957' ],\n\t [ /\\\\LeftUpVectorBar /g, '\\u2958' ],\n\t [ /\\\\LeftDownVectorBar /g, '\\u2959' ],\n\t [ /\\\\LeftTeeVector /g, '\\u295A' ],\n\t [ /\\\\RightTeeVector /g, '\\u295B' ],\n\t [ /\\\\RightUpTeeVector /g, '\\u295C' ],\n\t [ /\\\\RightDownTeeVector /g, '\\u295D' ],\n\t [ /\\\\DownLeftTeeVector /g, '\\u295E' ],\n\t [ /\\\\DownRightTeeVector /g, '\\u295F' ],\n\t [ /\\\\LeftUpTeeVector /g, '\\u2960' ],\n\t [ /\\\\LeftDownTeeVector /g, '\\u2961' ],\n\t [ /\\\\UpEquilibrium /g, '\\u296E' ],\n\t [ /\\\\ReverseUpEquilibrium /g, '\\u296F' ],\n\t [ /\\\\RoundImplies /g, '\\u2970' ],\n\t [ /\\\\ElsevierGlyph\\{E214\\}/g, '\\u297C' ],\n\t [ /\\\\ElsevierGlyph\\{E215\\}/g, '\\u297D' ],\n\t [ /\\\\Elztfnc /g, '\\u2980' ],\n\t [ /\\\\ElsevierGlyph\\{3018\\}/g, '\\u2985' ],\n\t [ /\\\\Elroang /g, '\\u2986' ],\n\t [ /\\\\ElsevierGlyph\\{E291\\}/g, '\\u2994' ],\n\t [ /\\\\Elzddfnc /g, '\\u2999' ],\n\t [ /\\\\Angle /g, '\\u299C' ],\n\t [ /\\\\Elzlpargt /g, '\\u29A0' ],\n\t [ /\\\\ElsevierGlyph\\{E260\\}/g, '\\u29B5' ],\n\t [ /\\\\ElsevierGlyph\\{E61B\\}/g, '\\u29B6' ],\n\t [ /\\\\ElzLap /g, '\\u29CA' ],\n\t [ /\\\\Elzdefas /g, '\\u29CB' ],\n\t [ /\\\\LeftTriangleBar /g, '\\u29CF' ],\n\t [ /\\\\NotLeftTriangleBar /g, '\\u29CF-00338' ],\n\t [ /\\\\RightTriangleBar /g, '\\u29D0' ],\n\t [ /\\\\NotRightTriangleBar /g, '\\u29D0-00338' ],\n\t [ /\\\\ElsevierGlyph\\{E372\\}/g, '\\u29DC' ],\n\t [ /\\\\blacklozenge /g, '\\u29EB' ],\n\t [ /\\\\RuleDelayed /g, '\\u29F4' ],\n\t [ /\\\\Elxuplus /g, '\\u2A04' ],\n\t [ /\\\\ElzThr /g, '\\u2A05' ],\n\t [ /\\\\Elxsqcup /g, '\\u2A06' ],\n\t [ /\\\\ElzInf /g, '\\u2A07' ],\n\t [ /\\\\ElzSup /g, '\\u2A08' ],\n\t [ /\\\\ElzCint /g, '\\u2A0D' ],\n\t [ /\\\\clockoint /g, '\\u2A0F' ],\n\t [ /\\\\ElsevierGlyph\\{E395\\}/g, '\\u2A10' ],\n\t [ /\\\\sqrint /g, '\\u2A16' ],\n\t [ /\\\\ElsevierGlyph\\{E25A\\}/g, '\\u2A25' ],\n\t [ /\\\\ElsevierGlyph\\{E25B\\}/g, '\\u2A2A' ],\n\t [ /\\\\ElsevierGlyph\\{E25C\\}/g, '\\u2A2D' ],\n\t [ /\\\\ElsevierGlyph\\{E25D\\}/g, '\\u2A2E' ],\n\t [ /\\\\ElzTimes /g, '\\u2A2F' ],\n\t [ /\\\\ElsevierGlyph\\{E25E\\}/g, '\\u2A34' ],\n\t [ /\\\\ElsevierGlyph\\{E25E\\}/g, '\\u2A35' ],\n\t [ /\\\\ElsevierGlyph\\{E259\\}/g, '\\u2A3C' ],\n\t [ /\\\\amalg /g, '\\u2A3F' ],\n\t [ /\\\\ElzAnd /g, '\\u2A53' ],\n\t [ /\\\\ElzOr /g, '\\u2A54' ],\n\t [ /\\\\ElsevierGlyph\\{E36E\\}/g, '\\u2A55' ],\n\t [ /\\\\ElOr /g, '\\u2A56' ],\n\t [ /\\\\perspcorrespond /g, '\\u2A5E' ],\n\t [ /\\\\Elzminhat /g, '\\u2A5F' ],\n\t [ /\\\\ElsevierGlyph\\{225A\\}/g, '\\u2A63' ],\n\t [ /\\\\stackrel\\{*\\}\\{=\\}/g, '\\u2A6E' ],\n\t [ /\\\\Equal /g, '\\u2A75' ],\n\t [ /\\\\leqslant /g, '\\u2A7D' ],\n\t [ /\\\\nleqslant /g, '\\u2A7D-00338' ],\n\t [ /\\\\geqslant /g, '\\u2A7E' ],\n\t [ /\\\\ngeqslant /g, '\\u2A7E-00338' ],\n\t [ /\\\\lessapprox /g, '\\u2A85' ],\n\t [ /\\\\gtrapprox /g, '\\u2A86' ],\n\t [ /\\\\lneq /g, '\\u2A87' ],\n\t [ /\\\\gneq /g, '\\u2A88' ],\n\t [ /\\\\lnapprox /g, '\\u2A89' ],\n\t [ /\\\\gnapprox /g, '\\u2A8A' ],\n\t [ /\\\\lesseqqgtr /g, '\\u2A8B' ],\n\t [ /\\\\gtreqqless /g, '\\u2A8C' ],\n\t [ /\\\\eqslantless /g, '\\u2A95' ],\n\t [ /\\\\eqslantgtr /g, '\\u2A96' ],\n\t [ /\\\\Pisymbol\\{ppi020\\}\\{117\\}/g, '\\u2A9D' ],\n\t [ /\\\\Pisymbol\\{ppi020\\}\\{105\\}/g, '\\u2A9E' ],\n\t [ /\\\\NestedLessLess /g, '\\u2AA1' ],\n\t [ /\\\\NotNestedLessLess /g, '\\u2AA1-00338' ],\n\t [ /\\\\NestedGreaterGreater /g, '\\u2AA2' ],\n\t [ /\\\\NotNestedGreaterGreater /g, '\\u2AA2-00338' ],\n\t [ /\\\\preceq /g, '\\u2AAF' ],\n\t [ /\\\\not\\\\preceq /g, '\\u2AAF-00338' ],\n\t [ /\\\\succeq /g, '\\u2AB0' ],\n\t [ /\\\\not\\\\succeq /g, '\\u2AB0-00338' ],\n\t [ /\\\\precneqq /g, '\\u2AB5' ],\n\t [ /\\\\succneqq /g, '\\u2AB6' ],\n\t [ /\\\\precapprox /g, '\\u2AB7' ],\n\t [ /\\\\succapprox /g, '\\u2AB8' ],\n\t [ /\\\\precnapprox /g, '\\u2AB9' ],\n\t [ /\\\\succnapprox /g, '\\u2ABA' ],\n\t [ /\\\\subseteqq /g, '\\u2AC5' ],\n\t [ /\\\\nsubseteqq /g, '\\u2AC5-00338' ],\n\t [ /\\\\supseteqq /g, '\\u2AC6' ],\n\t [ /\\\\nsupseteqq/g, '\\u2AC6-00338' ],\n\t [ /\\\\subsetneqq /g, '\\u2ACB' ],\n\t [ /\\\\supsetneqq /g, '\\u2ACC' ],\n\t [ /\\\\ElsevierGlyph\\{E30D\\}/g, '\\u2AEB' ],\n\t [ /\\\\Elztdcol /g, '\\u2AF6' ],\n\t [ /\\\\ElsevierGlyph\\{300A\\}/g, '\\u300A' ],\n\t [ /\\\\ElsevierGlyph\\{300B\\}/g, '\\u300B' ],\n\t [ /\\\\ElsevierGlyph\\{3018\\}/g, '\\u3018' ],\n\t [ /\\\\ElsevierGlyph\\{3019\\}/g, '\\u3019' ],\n\t [ /\\\\openbracketleft /g, '\\u301A' ],\n\t [ /\\\\openbracketright /g, '\\u301B' ]\n\t ]\n\t\n\t return this;\n\t} // end function BibtexParser\n\t\n\tif (typeof module !== 'undefined' && module.exports) {\n\t module.exports = BibtexParser;\n\t}\n\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(6),\n\t __webpack_require__(21),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( baseMVC, citationModel, _l ){\n\t\n\tvar CitationView = Backbone.View.extend({\n\t tagName: 'div',\n\t className: 'citations',\n\t render: function() {\n\t this.$el.append( \"

                    \" + this.formattedReference() + \"

                    \" );\n\t return this;\n\t },\n\t formattedReference: function() {\n\t var model = this.model;\n\t var entryType = model.entryType();\n\t var fields = model.fields();\n\t\n\t var ref = \"\";\n\t // Code inspired by...\n\t // https://github.com/vkaravir/bib-publication-list/blob/master/src/bib-publication-list.js\n\t var authorsAndYear = this._asSentence( (fields.author ? fields.author : \"\") + (fields.year ? (\" (\" + fields.year + \")\") : \"\") ) + \" \";\n\t var title = fields.title || \"\";\n\t var pages = fields.pages ? (\"pp. \" + fields.pages) : \"\";\n\t var address = fields.address;\n\t if( entryType == \"article\" ) {\n\t var volume = (fields.volume ? fields.volume : \"\") +\n\t (fields.number ? ( \" (\" + fields.number + \")\" ) : \"\") +\n\t (pages ? \", \" + pages : \"\");\n\t ref = authorsAndYear + this._asSentence(title) +\n\t (fields.journal ? (\"In \" + fields.journal + \", \") : \"\") +\n\t this._asSentence(volume) + \n\t this._asSentence(fields.address) +\n\t \"<\\/em>\";\n\t } else if( entryType == \"inproceedings\" || entryType == \"proceedings\" ) {\n\t ref = authorsAndYear + \n\t this._asSentence(title) + \n\t (fields.booktitle ? (\"In \" + fields.booktitle + \", \") : \"\") +\n\t (pages ? pages : \"\") +\n\t (address ? \", \" + address : \"\") + \n\t \".<\\/em>\";\n\t } else if( entryType == \"mastersthesis\" || entryType == \"phdthesis\" ) {\n\t ref = authorsAndYear + this._asSentence(title) +\n\t (fields.howpublished ? fields.howpublished + \". \" : \"\") +\n\t (fields.note ? fields.note + \".\" : \"\");\n\t } else if( entryType == \"techreport\" ) {\n\t ref = authorsAndYear + this._asSentence(title) +\n\t this._asSentence(fields.institution) +\n\t this._asSentence(fields.number) +\n\t this._asSentence(fields.type);\n\t } else if( entryType == \"book\" || entryType == \"inbook\" || entryType == \"incollection\" ) {\n\t ref = authorsAndYear + \" \" + this._formatBookInfo(fields);\n\t } else {\n\t ref = authorsAndYear + \" \" + this._asSentence(title) +\n\t this._asSentence(fields.howpublished) +\n\t this._asSentence(fields.note);\n\t }\n\t var doiUrl = \"\";\n\t if( fields.doi ) {\n\t doiUrl = 'http://dx.doi.org/' + fields.doi;\n\t ref += '[doi:' + fields.doi + \"]\";\n\t }\n\t var url = fields.url || doiUrl;\n\t if( url ) {\n\t ref += '[Link]';\n\t }\n\t return ref;\n\t },\n\t _formatBookInfo: function(fields) {\n\t var info = \"\";\n\t if( fields.chapter ) {\n\t info += fields.chapter + \" in \";\n\t }\n\t if( fields.title ) {\n\t info += \"\" + fields.title + \"<\\/em>\";\n\t }\n\t if( fields.editor ) {\n\t info += \", Edited by \" + fields.editor + \", \";\n\t }\n\t if( fields.publisher) {\n\t info += \", \" + fields.publisher;\n\t }\n\t if( fields.pages ) {\n\t info += \", pp. \" + fields.pages + \"\";\n\t }\n\t if( fields.series ) {\n\t info += \", \" + fields.series + \"<\\/em>\";\n\t }\n\t if( fields.volume ) {\n\t info += \", Vol.\" + fields.volume;\n\t }\n\t if( fields.issn ) {\n\t info += \", ISBN: \" + fields.issn;\n\t }\n\t return info + \".\";\n\t },\n\t _asSentence: function(str) {\n\t return (str && str.trim()) ? str + \". \" : \"\";\n\t }\n\t});\n\t\n\tvar CitationListView = Backbone.View.extend({\n\t el: '#citations',\n\t /**\n\t * Set up view.\n\t */\n\t initialize: function() {\n\t this.listenTo( this.collection, 'add', this.renderCitation );\n\t },\n\t\n\t events: {\n\t 'click .citations-to-bibtex': 'showBibtex',\n\t 'click .citations-to-formatted': 'showFormatted'\n\t },\n\t\n\t renderCitation: function( citation ) {\n\t var citationView = new CitationView( { model: citation } );\n\t this.$(\".citations-formatted\").append( citationView.render().el );\n\t var rawTextarea = this.$(\".citations-bibtex-text\");\n\t rawTextarea.val( rawTextarea.val() + \"\\n\\r\" + citation.attributes.content );\n\t },\n\t\n\t render: function() {\n\t this.$el.html(this.citationsElement());\n\t this.collection.each(function( item ){\n\t this.renderCitation( item );\n\t }, this);\n\t this.showFormatted();\n\t },\n\t\n\t showBibtex: function() {\n\t this.$(\".citations-to-formatted\").show();\n\t this.$(\".citations-to-bibtex\").hide();\n\t this.$(\".citations-bibtex\").show();\n\t this.$(\".citations-formatted\").hide();\n\t this.$(\".citations-bibtex-text\").select();\n\t },\n\t\n\t showFormatted: function() {\n\t this.$(\".citations-to-formatted\").hide();\n\t this.$(\".citations-to-bibtex\").show();\n\t this.$(\".citations-bibtex\").hide();\n\t this.$(\".citations-formatted\").show();\n\t },\n\t\n\t partialWarningElement: function() {\n\t if( this.collection.partial ) {\n\t return [\n\t '
                    ',\n\t 'Warning: This is a experimental feature. Most Galaxy tools will not annotate',\n\t ' citations explicitly at this time. When writing up your analysis, please manually',\n\t ' review your histories and find all references',\n\t ' that should be cited in order to completely describe your work. Also, please remember to',\n\t ' cite Galaxy.',\n\t '
                    ',\n\t ].join('');\n\t } else {\n\t return '';\n\t }\n\t },\n\t\n\t citationsElement: function() {\n\t return [\n\t '
                    ',\n\t '
                    ',\n\t _l(\"Citations\"),\n\t ' ',\n\t ' ',\n\t '
                    ',\n\t '
                    ',\n\t this.partialWarningElement(),\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t '
                    '\n\t ].join( '' );\n\t }\n\t});\n\t\n\t//==============================================================================\n\treturn {\n\t CitationView : CitationView,\n\t CitationListView : CitationListView\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, $, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(48),\n\t __webpack_require__(37),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_ITEM, DATASET_LI, BASE_MVC, _l ){\n\t/* global Backbone */\n\t//==============================================================================\n\tvar FoldoutListItemView = LIST_ITEM.FoldoutListItemView,\n\t ListItemView = LIST_ITEM.ListItemView;\n\t/** @class Read only view for DatasetCollection.\n\t */\n\tvar DCListItemView = FoldoutListItemView.extend(\n\t/** @lends DCListItemView.prototype */{\n\t//TODO: may not be needed\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : FoldoutListItemView.prototype.className + \" dataset-collection\",\n\t id : function(){\n\t return [ 'dataset_collection', this.model.get( 'id' ) ].join( '-' );\n\t },\n\t\n\t /** override to add linkTarget */\n\t initialize : function( attributes ){\n\t this.linkTarget = attributes.linkTarget || '_blank';\n\t this.hasUser = attributes.hasUser;\n\t FoldoutListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t /** event listeners */\n\t _setUpListeners : function(){\n\t FoldoutListItemView.prototype._setUpListeners.call( this );\n\t // re-rendering on deletion\n\t this.model.on( 'change', function( model, options ){\n\t if( _.isEqual( _.keys( model.changed ), [ 'deleted' ] ) ){\n\t this.render();\n\t }\n\t }, this );\n\t },\n\t\n\t // ......................................................................... rendering\n\t //TODO:?? possibly move to listItem\n\t /** render a subtitle to show the user what sort of collection this is */\n\t _renderSubtitle : function(){\n\t var $subtitle = $( '
                    ' );\n\t //TODO: would be good to get this in the subtitle\n\t //var len = this.model.elements.length;\n\t switch( this.model.get( 'collection_type' ) ){\n\t case 'list':\n\t return $subtitle.text( _l( 'a list of datasets' ) );\n\t case 'paired':\n\t return $subtitle.text( _l( 'a pair of datasets' ) );\n\t case 'list:paired':\n\t return $subtitle.text( _l( 'a list of paired datasets' ) );\n\t }\n\t return $subtitle;\n\t },\n\t\n\t // ......................................................................... foldout\n\t /** override to add linktarget to sub-panel */\n\t _getFoldoutPanelOptions : function(){\n\t var options = FoldoutListItemView.prototype._getFoldoutPanelOptions.call( this );\n\t return _.extend( options, {\n\t linkTarget : this.linkTarget,\n\t hasUser : this.hasUser\n\t });\n\t },\n\t\n\t /** override to not catch sub-panel selectors */\n\t $selector : function(){\n\t return this.$( '> .selector' );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DCListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDCListItemView.prototype.templates = (function(){\n\t\n\t var warnings = _.extend( {}, FoldoutListItemView.prototype.templates.warnings, {\n\t error : BASE_MVC.wrapTemplate([\n\t // error during index fetch - show error on dataset\n\t '<% if( model.error ){ %>',\n\t '
                    ',\n\t _l( 'There was an error getting the data for this collection' ), ': <%- model.error %>',\n\t '
                    ',\n\t '<% } %>'\n\t ]),\n\t purged : BASE_MVC.wrapTemplate([\n\t '<% if( model.purged ){ %>',\n\t '
                    ',\n\t _l( 'This collection has been deleted and removed from disk' ),\n\t '
                    ',\n\t '<% } %>'\n\t ]),\n\t deleted : BASE_MVC.wrapTemplate([\n\t // deleted not purged\n\t '<% if( model.deleted && !model.purged ){ %>',\n\t '
                    ',\n\t _l( 'This collection has been deleted' ),\n\t '
                    ',\n\t '<% } %>'\n\t ])\n\t });\n\t\n\t // use element identifier\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t '
                    ',\n\t '<%- collection.element_identifier || collection.name %>',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ], 'collection' );\n\t\n\t return _.extend( {}, FoldoutListItemView.prototype.templates, {\n\t warnings : warnings,\n\t titleBar : titleBarTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** @class Read only view for DatasetCollectionElement.\n\t */\n\tvar DCEListItemView = ListItemView.extend(\n\t/** @lends DCEListItemView.prototype */{\n\t//TODO: this might be expendable - compacted with HDAListItemView\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** add the DCE class to the list item */\n\t className : ListItemView.prototype.className + \" dataset-collection-element\",\n\t\n\t /** set up */\n\t initialize : function( attributes ){\n\t if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n\t this.log( 'DCEListItemView.initialize:', attributes );\n\t ListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DCEListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDCEListItemView.prototype.templates = (function(){\n\t\n\t // use the element identifier here - since that will persist and the user will need it\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t '
                    ',\n\t '<%- element.element_identifier %>',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ], 'element' );\n\t\n\t return _.extend( {}, ListItemView.prototype.templates, {\n\t titleBar : titleBarTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** @class Read only view for a DatasetCollectionElement that is also an DatasetAssociation\n\t * (a dataset contained in a dataset collection).\n\t */\n\tvar DatasetDCEListItemView = DATASET_LI.DatasetListItemView.extend(\n\t/** @lends DatasetDCEListItemView.prototype */{\n\t\n\t className : DATASET_LI.DatasetListItemView.prototype.className + \" dataset-collection-element\",\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** set up */\n\t initialize : function( attributes ){\n\t if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n\t this.log( 'DatasetDCEListItemView.initialize:', attributes );\n\t DATASET_LI.DatasetListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t /** In this override, only get details if in the ready state.\n\t * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n\t */\n\t _fetchModelDetails : function(){\n\t var view = this;\n\t if( view.model.inReadyState() && !view.model.hasDetails() ){\n\t return view.model.fetch({ silent: true });\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DatasetDCEListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDatasetDCEListItemView.prototype.templates = (function(){\n\t\n\t // use the element identifier here and not the dataset name\n\t //TODO:?? can we steal the DCE titlebar?\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t '<%- element.element_identifier %>',\n\t '
                    ',\n\t '
                    '\n\t ], 'element' );\n\t\n\t return _.extend( {}, DATASET_LI.DatasetListItemView.prototype.templates, {\n\t titleBar : titleBarTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** @class Read only view for a DatasetCollectionElement that is also a DatasetCollection\n\t * (a nested DC).\n\t */\n\tvar NestedDCDCEListItemView = DCListItemView.extend(\n\t/** @lends NestedDCDCEListItemView.prototype */{\n\t\n\t className : DCListItemView.prototype.className + \" dataset-collection-element\",\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t // comment this out to suppress log output\n\t //logger : console,\n\t\n\t /** In this override, add the state as a class for use with state-based CSS */\n\t _swapNewRender : function( $newRender ){\n\t DCListItemView.prototype._swapNewRender.call( this, $newRender );\n\t//TODO: model currently has no state\n\t var state = this.model.get( 'state' ) || 'ok';\n\t //if( this.model.has( 'state' ) ){\n\t this.$el.addClass( 'state-' + state );\n\t //}\n\t return this.$el;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'NestedDCDCEListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t DCListItemView : DCListItemView,\n\t DCEListItemView : DCEListItemView,\n\t DatasetDCEListItemView : DatasetDCEListItemView,\n\t NestedDCDCEListItemView : NestedDCDCEListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, Backbone, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(95),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DATASET_MODEL, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t//==============================================================================\n\t/*\n\tNotes:\n\t\n\tTerminology:\n\t DatasetCollection/DC : a container of datasets or nested DatasetCollections\n\t Element/DatasetCollectionElement/DCE : an item contained in a DatasetCollection\n\t HistoryDatasetCollectionAssociation/HDCA: a DatasetCollection contained in a history\n\t\n\t\n\tThis all seems too complex unfortunately:\n\t\n\t- Terminology collision between DatasetCollections (DCs) and Backbone Collections.\n\t- In the DatasetCollections API JSON, DC Elements use a 'Has A' stucture to *contain*\n\t either a dataset or a nested DC. This would make the hierarchy much taller. I've\n\t decided to merge the contained JSON with the DC element json - making the 'has a'\n\t relation into an 'is a' relation. This seems simpler to me and allowed a lot of\n\t DRY in both models and views, but may make tracking or tracing within these models\n\t more difficult (since DatasetCollectionElements are now *also* DatasetAssociations\n\t or DatasetCollections (nested)). This also violates the rule of thumb about\n\t favoring aggregation over inheritance.\n\t- Currently, there are three DatasetCollection subclasses: List, Pair, and ListPaired.\n\t These each should a) be usable on their own, b) be usable in the context of\n\t nesting within a collection model (at least in the case of ListPaired), and\n\t c) be usable within the context of other container models (like History or\n\t LibraryFolder, etc.). I've tried to separate/extract classes in order to\n\t handle those three situations, but it's proven difficult to do in a simple,\n\t readable manner.\n\t- Ideally, histories and libraries would inherit from the same server models as\n\t dataset collections do since they are (in essence) dataset collections themselves -\n\t making the whole nested structure simpler. This would be a large, error-prone\n\t refactoring and migration.\n\t\n\tMany of the classes and heirarchy are meant as extension points so, while the\n\trelations and flow may be difficult to understand initially, they'll allow us to\n\thandle the growth or flux dataset collection in the future (w/o actually implementing\n\tany YAGNI).\n\t\n\t*/\n\t//_________________________________________________________________________________________________ ELEMENTS\n\t/** @class mixin for Dataset collection elements.\n\t * When collection elements are passed from the API, the underlying element is\n\t * in a sub-object 'object' (IOW, a DCE representing an HDA will have HDA json in element.object).\n\t * This mixin uses the constructor and parse methods to merge that JSON with the DCE attribtues\n\t * effectively changing a DCE from a container to a subclass (has a --> is a).\n\t */\n\tvar DatasetCollectionElementMixin = {\n\t\n\t /** default attributes used by elements in a dataset collection */\n\t defaults : {\n\t model_class : 'DatasetCollectionElement',\n\t element_identifier : null,\n\t element_index : null,\n\t element_type : null\n\t },\n\t\n\t /** merge the attributes of the sub-object 'object' into this model */\n\t _mergeObject : function( attributes ){\n\t // if we don't preserve and correct ids here, the element id becomes the object id\n\t // and collision in backbone's _byId will occur and only\n\t _.extend( attributes, attributes.object, { element_id: attributes.id });\n\t delete attributes.object;\n\t return attributes;\n\t },\n\t\n\t /** override to merge this.object into this */\n\t constructor : function( attributes, options ){\n\t // console.debug( '\\t DatasetCollectionElement.constructor:', attributes, options );\n\t attributes = this._mergeObject( attributes );\n\t this.idAttribute = 'element_id';\n\t Backbone.Model.apply( this, arguments );\n\t },\n\t\n\t /** when the model is fetched, merge this.object into this */\n\t parse : function( response, options ){\n\t var attributes = response;\n\t attributes = this._mergeObject( attributes );\n\t return attributes;\n\t }\n\t};\n\t\n\t//TODO: unused?\n\t/** @class Concrete class of Generic DatasetCollectionElement */\n\tvar DatasetCollectionElement = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( DatasetCollectionElementMixin )\n\t .extend({ _logNamespace : logNamespace });\n\t\n\t\n\t//==============================================================================\n\t/** @class Base/Abstract Backbone collection for Generic DCEs. */\n\tvar DCECollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(\n\t/** @lends DCECollection.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t model: DatasetCollectionElement,\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t//TODO: unused?\n\t /** Set up.\n\t * @see Backbone.Collection#initialize\n\t */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(DCECollection).initialize:', attributes, options );\n\t options = options || {};\n\t //this._setUpListeners();\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'DatasetCollectionElementCollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for a dataset collection element that is a dataset (HDA).\n\t */\n\tvar DatasetDCE = DATASET_MODEL.DatasetAssociation.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n\t/** @lends DatasetDCE.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** url fn */\n\t url : function(){\n\t // won't always be an hda\n\t if( !this.has( 'history_id' ) ){\n\t console.warn( 'no endpoint for non-hdas within a collection yet' );\n\t // (a little silly since this api endpoint *also* points at hdas)\n\t return Galaxy.root + 'api/datasets';\n\t }\n\t return Galaxy.root + 'api/histories/' + this.get( 'history_id' ) + '/contents/' + this.get( 'id' );\n\t },\n\t\n\t defaults : _.extend( {},\n\t DATASET_MODEL.DatasetAssociation.prototype.defaults,\n\t DatasetCollectionElementMixin.defaults\n\t ),\n\t\n\t // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n\t // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n\t // - re-apply manually for now\n\t /** call the mixin constructor */\n\t constructor : function( attributes, options ){\n\t this.debug( '\\t DatasetDCE.constructor:', attributes, options );\n\t //DATASET_MODEL.DatasetAssociation.prototype.constructor.call( this, attributes, options );\n\t DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n\t },\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(DatasetDCE).initialize:', attributes, options );\n\t DATASET_MODEL.DatasetAssociation.prototype.initialize.call( this, attributes, options );\n\t },\n\t\n\t /** Does this model already contain detailed data (as opposed to just summary level data)? */\n\t hasDetails : function(){\n\t // dataset collection api does return genome_build but doesn't return annotation\n\t return _.has( this.attributes, 'annotation' );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t var objStr = this.get( 'element_identifier' );\n\t return ([ 'DatasetDCE(', objStr, ')' ].join( '' ));\n\t }\n\t}));\n\t\n\t\n\t//==============================================================================\n\t/** @class DCECollection of DatasetDCE's (a list of datasets, a pair of datasets).\n\t */\n\tvar DatasetDCECollection = DCECollection.extend(\n\t/** @lends DatasetDCECollection.prototype */{\n\t model: DatasetDCE,\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(DatasetDCECollection).initialize:', attributes, options );\n\t DCECollection.prototype.initialize.call( this, attributes, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'DatasetDCECollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//_________________________________________________________________________________________________ COLLECTIONS\n\t/** @class Backbone model for Dataset Collections.\n\t * The DC API returns an array of JSON objects under the attribute elements.\n\t * This model:\n\t * - removes that array/attribute ('elements') from the model,\n\t * - creates a bbone collection (of the class defined in the 'collectionClass' attribute),\n\t * - passes that json onto the bbone collection\n\t * - caches the bbone collection in this.elements\n\t */\n\tvar DatasetCollection = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( BASE_MVC.SearchableModelMixin )\n\t .extend(/** @lends DatasetCollection.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** default attributes for a model */\n\t defaults : {\n\t /* 'list', 'paired', or 'list:paired' */\n\t collection_type : null,\n\t //??\n\t deleted : false\n\t },\n\t\n\t /** Which class to use for elements */\n\t collectionClass : DCECollection,\n\t\n\t /** set up: create elements instance var and (on changes to elements) update them */\n\t initialize : function( model, options ){\n\t this.debug( this + '(DatasetCollection).initialize:', model, options, this );\n\t //historyContent.HistoryContent.prototype.initialize.call( this, attrs, options );\n\t this.elements = this._createElementsModel();\n\t this.on( 'change:elements', function(){\n\t this.log( 'change:elements' );\n\t//TODO: prob. better to update the collection instead of re-creating it\n\t this.elements = this._createElementsModel();\n\t });\n\t },\n\t\n\t /** move elements model attribute to full collection */\n\t _createElementsModel : function(){\n\t this.debug( this + '._createElementsModel', this.collectionClass, this.get( 'elements' ), this.elements );\n\t//TODO: same patterns as DatasetCollectionElement _createObjectModel - refactor to BASE_MVC.hasSubModel?\n\t var elements = this.get( 'elements' ) || [];\n\t this.unset( 'elements', { silent: true });\n\t this.elements = new this.collectionClass( elements );\n\t //this.debug( 'collectionClass:', this.collectionClass + '', this.elements );\n\t return this.elements;\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** pass the elements back within the model json when this is serialized */\n\t toJSON : function(){\n\t var json = Backbone.Model.prototype.toJSON.call( this );\n\t if( this.elements ){\n\t json.elements = this.elements.toJSON();\n\t }\n\t return json;\n\t },\n\t\n\t /** Is this collection in a 'ready' state no processing (for the collection) is left\n\t * to do on the server.\n\t */\n\t inReadyState : function(){\n\t var populated = this.get( 'populated' );\n\t return ( this.isDeletedOrPurged() || populated );\n\t },\n\t\n\t //TODO:?? the following are the same interface as DatasetAssociation - can we combine?\n\t /** Does the DC contain any elements yet? Is a fetch() required? */\n\t hasDetails : function(){\n\t//TODO: this is incorrect for (accidentally) empty collections\n\t this.debug( 'hasDetails:', this.elements.length );\n\t return this.elements.length !== 0;\n\t },\n\t\n\t /** Given the filters, what models in this.elements would be returned? */\n\t getVisibleContents : function( filters ){\n\t // filters unused for now\n\t return this.elements;\n\t },\n\t\n\t // ........................................................................ ajax\n\t /** save this dataset, _Mark_ing it as deleted (just a flag) */\n\t 'delete' : function( options ){\n\t if( this.get( 'deleted' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: true }, options );\n\t },\n\t /** save this dataset, _Mark_ing it as undeleted */\n\t undelete : function( options ){\n\t if( !this.get( 'deleted' ) || this.get( 'purged' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: false }, options );\n\t },\n\t\n\t /** Is this collection deleted or purged? */\n\t isDeletedOrPurged : function(){\n\t return ( this.get( 'deleted' ) || this.get( 'purged' ) );\n\t },\n\t\n\t // ........................................................................ searchable\n\t /** searchable attributes for collections */\n\t searchAttributes : [\n\t 'name'\n\t ],\n\t\n\t // ........................................................................ misc\n\t /** String representation */\n\t toString : function(){\n\t var idAndName = [ this.get( 'id' ), this.get( 'name' ) || this.get( 'element_identifier' ) ];\n\t return 'DatasetCollection(' + ( idAndName.join(',') ) + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** Model for a DatasetCollection containing datasets (non-nested).\n\t */\n\tvar ListDatasetCollection = DatasetCollection.extend(\n\t/** @lends ListDatasetCollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** override since we know the collection will only contain datasets */\n\t collectionClass : DatasetDCECollection,\n\t\n\t//TODO: unused?\n\t initialize : function( attrs, options ){\n\t this.debug( this + '(ListDatasetCollection).initialize:', attrs, options );\n\t DatasetCollection.prototype.initialize.call( this, attrs, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'ListDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** Model for a DatasetCollection containing fwd/rev datasets (a list of 2).\n\t */\n\tvar PairDatasetCollection = ListDatasetCollection.extend(\n\t/** @lends PairDatasetCollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t//TODO: unused?\n\t /** */\n\t initialize : function( attrs, options ){\n\t this.debug( this + '(PairDatasetCollection).initialize:', attrs, options );\n\t ListDatasetCollection.prototype.initialize.call( this, attrs, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'PairDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//_________________________________________________________________________________________________ NESTED COLLECTIONS\n\t// this is where things get weird, man. Weird.\n\t//TODO: it might be possible to compact all the following...I think.\n\t//==============================================================================\n\t/** @class Backbone model for a Generic DatasetCollectionElement that is also a DatasetCollection\n\t * (a nested collection). Currently only list:paired.\n\t */\n\tvar NestedDCDCE = DatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n\t/** @lends NestedDCDCE.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n\t // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n\t // - re-apply manually it now\n\t /** call the mixin constructor */\n\t constructor : function( attributes, options ){\n\t this.debug( '\\t NestedDCDCE.constructor:', attributes, options );\n\t DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );\n\t return ([ 'NestedDCDCE(', objStr, ')' ].join( '' ));\n\t }\n\t}));\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone collection containing Generic NestedDCDCE's (nested dataset collections).\n\t */\n\tvar NestedDCDCECollection = DCECollection.extend(\n\t/** @lends NestedDCDCECollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** This is a collection of nested collections */\n\t model: NestedDCDCE,\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attrs, options ){\n\t this.debug( this + '(NestedDCDCECollection).initialize:', attrs, options );\n\t DCECollection.prototype.initialize.call( this, attrs, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'NestedDCDCECollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for a paired dataset collection within a list:paired dataset collection.\n\t */\n\tvar NestedPairDCDCE = PairDatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n\t/** @lends NestedPairDCDCE.prototype */{\n\t//TODO:?? possibly rename to NestedDatasetCollection?\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n\t // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n\t // - re-apply manually it now\n\t /** This is both a collection and a collection element - call the constructor */\n\t constructor : function( attributes, options ){\n\t this.debug( '\\t NestedPairDCDCE.constructor:', attributes, options );\n\t //DatasetCollection.constructor.call( this, attributes, options );\n\t DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );\n\t return ([ 'NestedPairDCDCE(', objStr, ')' ].join( '' ));\n\t }\n\t}));\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone collection for a backbone collection containing paired dataset collections.\n\t */\n\tvar NestedPairDCDCECollection = NestedDCDCECollection.extend(\n\t/** @lends PairDCDCECollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** We know this collection is composed of only nested pair collections */\n\t model: NestedPairDCDCE,\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attrs, options ){\n\t this.debug( this + '(NestedPairDCDCECollection).initialize:', attrs, options );\n\t NestedDCDCECollection.prototype.initialize.call( this, attrs, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'NestedPairDCDCECollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone Model for a DatasetCollection (list) that contains DatasetCollections (pairs).\n\t */\n\tvar ListPairedDatasetCollection = DatasetCollection.extend(\n\t/** @lends ListPairedDatasetCollection.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** list:paired is the only collection that itself contains collections */\n\t collectionClass : NestedPairDCDCECollection,\n\t\n\t//TODO: unused?\n\t /** set up */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(ListPairedDatasetCollection).initialize:', attributes, options );\n\t DatasetCollection.prototype.initialize.call( this, attributes, options );\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'ListPairedDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t ListDatasetCollection : ListDatasetCollection,\n\t PairDatasetCollection : PairDatasetCollection,\n\t ListPairedDatasetCollection : ListPairedDatasetCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $, jQuery) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(45),\n\t __webpack_require__(15),\n\t __webpack_require__(6),\n\t __webpack_require__(10),\n\t __webpack_require__(110),\n\t __webpack_require__(5),\n\t __webpack_require__(107)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HDCA, STATES, BASE_MVC, UI_MODAL, naturalSort, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t/*==============================================================================\n\tTODO:\n\t use proper Element model and not just json\n\t straighten out createFn, collection.createHDCA\n\t possibly stop using modals for this\n\t It would be neat to do a drag and drop\n\t\n\t==============================================================================*/\n\t/** A view for both DatasetDCEs and NestedDCDCEs\n\t * (things that implement collection-model:DatasetCollectionElementMixin)\n\t */\n\tvar DatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t//TODO: use proper class (DatasetDCE or NestedDCDCE (or the union of both))\n\t tagName : 'li',\n\t className : 'collection-element',\n\t\n\t initialize : function( attributes ){\n\t this.element = attributes.element || {};\n\t this.selected = attributes.selected || false;\n\t },\n\t\n\t render : function(){\n\t this.$el\n\t .attr( 'data-element-id', this.element.id )\n\t .attr( 'draggable', true )\n\t .html( this.template({ element: this.element }) );\n\t if( this.selected ){\n\t this.$el.addClass( 'selected' );\n\t }\n\t return this;\n\t },\n\t\n\t //TODO: lots of unused space in the element - possibly load details and display them horiz.\n\t template : _.template([\n\t '',\n\t '<%- element.name %>',\n\t '',\n\t '',\n\t ].join('')),\n\t\n\t /** select this element and pub */\n\t select : function( toggle ){\n\t this.$el.toggleClass( 'selected', toggle );\n\t this.trigger( 'select', {\n\t source : this,\n\t selected : this.$el.hasClass( 'selected' )\n\t });\n\t },\n\t\n\t /** animate the removal of this element and pub */\n\t discard : function(){\n\t var view = this,\n\t parentWidth = this.$el.parent().width();\n\t this.$el.animate({ 'margin-right' : parentWidth }, 'fast', function(){\n\t view.trigger( 'discard', {\n\t source : view\n\t });\n\t view.destroy();\n\t });\n\t },\n\t\n\t /** remove the DOM and any listeners */\n\t destroy : function(){\n\t this.off();\n\t this.$el.remove();\n\t },\n\t\n\t events : {\n\t 'click' : '_click',\n\t 'click .name' : '_clickName',\n\t 'click .discard': '_clickDiscard',\n\t\n\t 'dragstart' : '_dragstart',\n\t 'dragend' : '_dragend',\n\t 'dragover' : '_sendToParent',\n\t 'drop' : '_sendToParent'\n\t },\n\t\n\t /** select when the li is clicked */\n\t _click : function( ev ){\n\t ev.stopPropagation();\n\t this.select( ev );\n\t },\n\t\n\t /** rename a pair when the name is clicked */\n\t _clickName : function( ev ){\n\t ev.stopPropagation();\n\t ev.preventDefault();\n\t var promptString = [ _l( 'Enter a new name for the element' ), ':\\n(',\n\t _l( 'Note that changing the name here will not rename the dataset' ), ')' ].join( '' ),\n\t response = prompt( _l( 'Enter a new name for the element' ) + ':', this.element.name );\n\t if( response ){\n\t this.element.name = response;\n\t this.render();\n\t }\n\t //TODO: cancelling with ESC leads to closure of the creator...\n\t },\n\t\n\t /** discard when the discard button is clicked */\n\t _clickDiscard : function( ev ){\n\t ev.stopPropagation();\n\t this.discard();\n\t },\n\t\n\t /** dragging pairs for re-ordering */\n\t _dragstart : function( ev ){\n\t if( ev.originalEvent ){ ev = ev.originalEvent; }\n\t ev.dataTransfer.effectAllowed = 'move';\n\t ev.dataTransfer.setData( 'text/plain', JSON.stringify( this.element ) );\n\t\n\t this.$el.addClass( 'dragging' );\n\t this.$el.parent().trigger( 'collection-element.dragstart', [ this ] );\n\t },\n\t\n\t /** dragging for re-ordering */\n\t _dragend : function( ev ){\n\t this.$el.removeClass( 'dragging' );\n\t this.$el.parent().trigger( 'collection-element.dragend', [ this ] );\n\t },\n\t\n\t /** manually bubble up an event to the parent/container */\n\t _sendToParent : function( ev ){\n\t this.$el.parent().trigger( ev );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){\n\t return 'DatasetCollectionElementView()';\n\t }\n\t});\n\t\n\t\n\t// ============================================================================\n\t/** An interface for building collections.\n\t */\n\tvar ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t /** the class used to display individual elements */\n\t elementViewClass : DatasetCollectionElementView,\n\t /** the class this creator will create and save */\n\t collectionClass : HDCA.HistoryListDatasetCollection,\n\t className : 'list-collection-creator collection-creator flex-row-container',\n\t\n\t /** minimum number of valid elements to start with in order to build a collection of this type */\n\t minElements : 1,\n\t\n\t defaultAttributes : {\n\t//TODO: remove - use new collectionClass().save()\n\t /** takes elements and creates the proper collection - returns a promise */\n\t creationFn : function(){ throw new TypeError( 'no creation fn for creator' ); },\n\t /** fn to call when the collection is created (scoped to this) */\n\t oncreate : function(){},\n\t /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n\t oncancel : function(){},\n\t /** distance from list edge to begin autoscrolling list */\n\t autoscrollDist : 24,\n\t /** Color passed to hoverhighlight */\n\t highlightClr : 'rgba( 64, 255, 255, 1.0 )'\n\t },\n\t\n\t /** set up initial options, instance vars, behaviors */\n\t initialize : function( attributes ){\n\t this.metric( 'ListCollectionCreator.initialize', attributes );\n\t var creator = this;\n\t _.each( this.defaultAttributes, function( value, key ){\n\t value = attributes[ key ] || value;\n\t creator[ key ] = value;\n\t });\n\t\n\t /** unordered, original list - cache to allow reversal */\n\t creator.initialElements = attributes.elements || [];\n\t\n\t this._instanceSetUp();\n\t this._elementsSetUp();\n\t this._setUpBehaviors();\n\t },\n\t\n\t /** set up instance vars */\n\t _instanceSetUp : function(){\n\t /** Ids of elements that have been selected by the user - to preserve over renders */\n\t this.selectedIds = {};\n\t /** DOM elements currently being dragged */\n\t this.$dragging = null;\n\t /** Used for blocking UI events during ajax/operations (don't post twice) */\n\t this.blocking = false;\n\t },\n\t\n\t // ------------------------------------------------------------------------ process raw list\n\t /** set up main data */\n\t _elementsSetUp : function(){\n\t //this.debug( '-- _dataSetUp' );\n\t /** a list of invalid elements and the reasons they aren't valid */\n\t this.invalidElements = [];\n\t//TODO: handle fundamental problem of syncing DOM, views, and list here\n\t /** data for list in progress */\n\t this.workingElements = [];\n\t /** views for workingElements */\n\t this.elementViews = [];\n\t\n\t // copy initial list, sort, add ids if needed\n\t this.workingElements = this.initialElements.slice( 0 );\n\t this._ensureElementIds();\n\t this._validateElements();\n\t this._mangleDuplicateNames();\n\t this._sortElements();\n\t },\n\t\n\t /** add ids to dataset objs in initial list if none */\n\t _ensureElementIds : function(){\n\t this.workingElements.forEach( function( element ){\n\t if( !element.hasOwnProperty( 'id' ) ){\n\t element.id = _.uniqueId();\n\t }\n\t });\n\t return this.workingElements;\n\t },\n\t\n\t /** separate working list into valid and invalid elements for this collection */\n\t _validateElements : function(){\n\t var creator = this,\n\t existingNames = {};\n\t creator.invalidElements = [];\n\t\n\t this.workingElements = this.workingElements.filter( function( element ){\n\t var problem = creator._isElementInvalid( element );\n\t if( problem ){\n\t creator.invalidElements.push({\n\t element : element,\n\t text : problem\n\t });\n\t }\n\t return !problem;\n\t });\n\t return this.workingElements;\n\t },\n\t\n\t /** describe what is wrong with a particular element if anything */\n\t _isElementInvalid : function( element ){\n\t if( element.history_content_type !== 'dataset' ){\n\t return _l( \"is not a dataset\" );\n\t }\n\t if( element.state !== STATES.OK ){\n\t if( _.contains( STATES.NOT_READY_STATES, element.state ) ){\n\t return _l( \"hasn't finished running yet\" );\n\t }\n\t return _l( \"has errored, is paused, or is not accessible\" );\n\t }\n\t if( element.deleted || element.purged ){\n\t return _l( \"has been deleted or purged\" );\n\t }\n\t return null;\n\t },\n\t\n\t /** mangle duplicate names using a mac-like '(counter)' addition to any duplicates */\n\t _mangleDuplicateNames : function(){\n\t var SAFETY = 900,\n\t counter = 1,\n\t existingNames = {};\n\t this.workingElements.forEach( function( element ){\n\t var currName = element.name;\n\t while( existingNames.hasOwnProperty( currName ) ){\n\t currName = element.name + ' (' + counter + ')';\n\t counter += 1;\n\t if( counter >= SAFETY ){\n\t throw new Error( 'Safety hit in while loop - thats impressive' );\n\t }\n\t }\n\t element.name = currName;\n\t existingNames[ element.name ] = true;\n\t });\n\t },\n\t\n\t /** sort a list of elements */\n\t _sortElements : function( list ){\n\t // // currently only natural sort by name\n\t // this.workingElements.sort( function( a, b ){ return naturalSort( a.name, b.name ); });\n\t // return this.workingElements;\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering\n\t // templates : ListCollectionCreator.templates,\n\t /** render the entire interface */\n\t render : function( speed, callback ){\n\t //this.debug( '-- _render' );\n\t if( this.workingElements.length < this.minElements ){\n\t return this._renderInvalid( speed, callback );\n\t }\n\t\n\t this.$el.empty().html( this.templates.main() );\n\t this._renderHeader( speed );\n\t this._renderMiddle( speed );\n\t this._renderFooter( speed );\n\t this._addPluginComponents();\n\t this.$( '.collection-name' ).focus();\n\t this.trigger( 'rendered', this );\n\t return this;\n\t },\n\t\n\t\n\t /** render a simplified interface aimed at telling the user why they can't move forward */\n\t _renderInvalid : function( speed, callback ){\n\t //this.debug( '-- _render' );\n\t this.$el.empty().html( this.templates.invalidInitial({\n\t problems: this.invalidElements,\n\t elements: this.workingElements,\n\t }));\n\t if( typeof this.oncancel === 'function' ){\n\t this.$( '.cancel-create.btn' ).show();\n\t }\n\t this.trigger( 'rendered', this );\n\t return this;\n\t },\n\t\n\t /** render the header section */\n\t _renderHeader : function( speed, callback ){\n\t var $header = this.$( '.header' ).empty().html( this.templates.header() )\n\t .find( '.help-content' ).prepend( $( this.templates.helpContent() ) );\n\t //TODO: should only show once despite calling _renderHeader again\n\t if( this.invalidElements.length ){\n\t this._invalidElementsAlert();\n\t }\n\t return $header;\n\t },\n\t\n\t /** render the middle including the elements */\n\t _renderMiddle : function( speed, callback ){\n\t var $middle = this.$( '.middle' ).empty().html( this.templates.middle() );\n\t this._renderList( speed );\n\t return $middle;\n\t },\n\t\n\t /** render the footer, completion controls, and cancel controls */\n\t _renderFooter : function( speed, callback ){\n\t var $footer = this.$( '.footer' ).empty().html( this.templates.footer() );\n\t if( typeof this.oncancel === 'function' ){\n\t this.$( '.cancel-create.btn' ).show();\n\t }\n\t return $footer;\n\t },\n\t\n\t /** add any jQuery/bootstrap/custom plugins to elements rendered */\n\t _addPluginComponents : function(){\n\t this.$( '.help-content i' ).hoverhighlight( '.collection-creator', this.highlightClr );\n\t },\n\t\n\t /** build and show an alert describing any elements that could not be included due to problems */\n\t _invalidElementsAlert : function(){\n\t this._showAlert( this.templates.invalidElements({ problems: this.invalidElements }), 'alert-warning' );\n\t },\n\t\n\t /** add (or clear if clear is truthy) a validation warning to the DOM element described in what */\n\t _validationWarning : function( what, clear ){\n\t var VALIDATION_CLASS = 'validation-warning';\n\t if( what === 'name' ){\n\t what = this.$( '.collection-name' ).add( this.$( '.collection-name-prompt' ) );\n\t this.$( '.collection-name' ).focus().select();\n\t }\n\t if( clear ){\n\t what = what || this.$( '.' + VALIDATION_CLASS );\n\t what.removeClass( VALIDATION_CLASS );\n\t } else {\n\t what.addClass( VALIDATION_CLASS );\n\t }\n\t },\n\t\n\t _disableNameAndCreate : function( disable ){\n\t disable = !_.isUndefined( disable )? disable : true;\n\t if( disable ){\n\t this.$( '.collection-name' ).prop( 'disabled', true );\n\t this.$( '.create-collection' ).toggleClass( 'disabled', true );\n\t // } else {\n\t // this.$( '.collection-name' ).prop( 'disabled', false );\n\t // this.$( '.create-collection' ).removeClass( 'disable' );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering elements\n\t /** conv. to the main list display DOM */\n\t $list : function(){\n\t return this.$( '.collection-elements' );\n\t },\n\t\n\t /** show or hide the clear selected control based on the num of selected elements */\n\t _renderClearSelected : function(){\n\t if( _.size( this.selectedIds ) ){\n\t this.$( '.collection-elements-controls > .clear-selected' ).show();\n\t } else {\n\t this.$( '.collection-elements-controls > .clear-selected' ).hide();\n\t }\n\t },\n\t\n\t /** render the elements in order (or a warning if no elements found) */\n\t _renderList : function( speed, callback ){\n\t //this.debug( '-- _renderList' );\n\t var creator = this,\n\t $tmp = jQuery( '
                    ' ),\n\t $list = creator.$list();\n\t\n\t _.each( this.elementViews, function( view ){\n\t view.destroy();\n\t creator.removeElementView( view );\n\t });\n\t\n\t // if( !this.workingElements.length ){\n\t // this._renderNoValidElements();\n\t // return;\n\t // }\n\t\n\t creator.workingElements.forEach( function( element ){\n\t var elementView = creator._createElementView( element );\n\t $tmp.append( elementView.$el );\n\t });\n\t\n\t creator._renderClearSelected();\n\t $list.empty().append( $tmp.children() );\n\t _.invoke( creator.elementViews, 'render' );\n\t\n\t if( $list.height() > $list.css( 'max-height' ) ){\n\t $list.css( 'border-width', '1px 0px 1px 0px' );\n\t } else {\n\t $list.css( 'border-width', '0px' );\n\t }\n\t },\n\t\n\t /** create an element view, cache in elementViews, set up listeners, and return */\n\t _createElementView : function( element ){\n\t var elementView = new this.elementViewClass({\n\t//TODO: use non-generic class or not all\n\t // model : COLLECTION.DatasetDCE( element )\n\t element : element,\n\t selected: _.has( this.selectedIds, element.id )\n\t });\n\t this.elementViews.push( elementView );\n\t this._listenToElementView( elementView );\n\t return elementView;\n\t },\n\t\n\t /** listen to any element events */\n\t _listenToElementView : function( view ){\n\t var creator = this;\n\t creator.listenTo( view, {\n\t select : function( data ){\n\t var element = data.source.element;\n\t if( data.selected ){\n\t creator.selectedIds[ element.id ] = true;\n\t } else {\n\t delete creator.selectedIds[ element.id ];\n\t }\n\t creator.trigger( 'elements:select', data );\n\t },\n\t discard : function( data ){\n\t creator.trigger( 'elements:discard', data );\n\t }\n\t });\n\t },\n\t\n\t /** add a new element view based on the json in element */\n\t addElementView : function( element ){\n\t//TODO: workingElements is sorted, add element in appropo index\n\t // add element, sort elements, find element index\n\t // var view = this._createElementView( element );\n\t // return view;\n\t },\n\t\n\t /** stop listening to view and remove from caches */\n\t removeElementView : function( view ){\n\t delete this.selectedIds[ view.element.id ];\n\t this._renderClearSelected();\n\t\n\t this.elementViews = _.without( this.elementViews, view );\n\t this.stopListening( view );\n\t },\n\t\n\t /** render a message in the list that no elements remain to create a collection */\n\t _renderNoElementsLeft : function(){\n\t this._disableNameAndCreate( true );\n\t this.$( '.collection-elements' ).append( this.templates.noElementsLeft() );\n\t },\n\t\n\t // /** render a message in the list that no valid elements were found to create a collection */\n\t // _renderNoValidElements : function(){\n\t // this._disableNameAndCreate( true );\n\t // this.$( '.collection-elements' ).append( this.templates.noValidElements() );\n\t // },\n\t\n\t // ------------------------------------------------------------------------ API\n\t /** convert element into JSON compatible with the collections API */\n\t _elementToJSON : function( element ){\n\t // return element.toJSON();\n\t return element;\n\t },\n\t\n\t /** create the collection via the API\n\t * @returns {jQuery.xhr Object} the jquery ajax request\n\t */\n\t createList : function( name ){\n\t if( !this.workingElements.length ){\n\t var message = _l( 'No valid elements for final list' ) + '. ';\n\t message += '' + _l( 'Cancel' ) + ' ';\n\t message += _l( 'or' );\n\t message += ' ' + _l( 'start over' ) + '.';\n\t this._showAlert( message );\n\t return;\n\t }\n\t\n\t var creator = this,\n\t elements = this.workingElements.map( function( element ){\n\t return creator._elementToJSON( element );\n\t });\n\t\n\t creator.blocking = true;\n\t return creator.creationFn( elements, name )\n\t .always( function(){\n\t creator.blocking = false;\n\t })\n\t .fail( function( xhr, status, message ){\n\t creator.trigger( 'error', {\n\t xhr : xhr,\n\t status : status,\n\t message : _l( 'An error occurred while creating this collection' )\n\t });\n\t })\n\t .done( function( response, message, xhr ){\n\t creator.trigger( 'collection:created', response, message, xhr );\n\t creator.metric( 'collection:created', response );\n\t if( typeof creator.oncreate === 'function' ){\n\t creator.oncreate.call( this, response, message, xhr );\n\t }\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ events\n\t /** set up event handlers on self */\n\t _setUpBehaviors : function(){\n\t this.on( 'error', this._errorHandler );\n\t\n\t this.once( 'rendered', function(){\n\t this.trigger( 'rendered:initial', this );\n\t });\n\t\n\t this.on( 'elements:select', function( data ){\n\t this._renderClearSelected();\n\t });\n\t\n\t this.on( 'elements:discard', function( data ){\n\t var element = data.source.element;\n\t this.removeElementView( data.source );\n\t\n\t this.workingElements = _.without( this.workingElements, element );\n\t if( !this.workingElements.length ){\n\t this._renderNoElementsLeft();\n\t }\n\t });\n\t\n\t //this.on( 'all', function(){\n\t // this.info( arguments );\n\t //});\n\t return this;\n\t },\n\t\n\t /** handle errors with feedback and details to the user (if available) */\n\t _errorHandler : function( data ){\n\t this.error( data );\n\t\n\t var creator = this;\n\t content = data.message || _l( 'An error occurred' );\n\t if( data.xhr ){\n\t var xhr = data.xhr,\n\t message = data.message;\n\t if( xhr.readyState === 0 && xhr.status === 0 ){\n\t content += ': ' + _l( 'Galaxy could not be reached and may be updating.' ) +\n\t _l( ' Try again in a few minutes.' );\n\t } else if( xhr.responseJSON ){\n\t content += ':
                    ' + JSON.stringify( xhr.responseJSON ) + '
                    ';\n\t } else {\n\t content += ': ' + message;\n\t }\n\t }\n\t creator._showAlert( content, 'alert-danger' );\n\t },\n\t\n\t events : {\n\t // header\n\t 'click .more-help' : '_clickMoreHelp',\n\t 'click .less-help' : '_clickLessHelp',\n\t 'click .main-help' : '_toggleHelp',\n\t 'click .header .alert button' : '_hideAlert',\n\t\n\t 'click .reset' : 'reset',\n\t 'click .clear-selected' : 'clearSelectedElements',\n\t\n\t // elements - selection\n\t 'click .collection-elements' : 'clearSelectedElements',\n\t\n\t // elements - drop target\n\t // 'dragenter .collection-elements': '_dragenterElements',\n\t // 'dragleave .collection-elements': '_dragleaveElements',\n\t 'dragover .collection-elements' : '_dragoverElements',\n\t 'drop .collection-elements' : '_dropElements',\n\t\n\t // these bubble up from the elements as custom events\n\t 'collection-element.dragstart .collection-elements' : '_elementDragstart',\n\t 'collection-element.dragend .collection-elements' : '_elementDragend',\n\t\n\t // footer\n\t 'change .collection-name' : '_changeName',\n\t 'keydown .collection-name' : '_nameCheckForEnter',\n\t 'click .cancel-create' : function( ev ){\n\t if( typeof this.oncancel === 'function' ){\n\t this.oncancel.call( this );\n\t }\n\t },\n\t 'click .create-collection' : '_clickCreate'//,\n\t },\n\t\n\t // ........................................................................ header\n\t /** expand help */\n\t _clickMoreHelp : function( ev ){\n\t ev.stopPropagation();\n\t this.$( '.main-help' ).addClass( 'expanded' );\n\t this.$( '.more-help' ).hide();\n\t },\n\t /** collapse help */\n\t _clickLessHelp : function( ev ){\n\t ev.stopPropagation();\n\t this.$( '.main-help' ).removeClass( 'expanded' );\n\t this.$( '.more-help' ).show();\n\t },\n\t /** toggle help */\n\t _toggleHelp : function( ev ){\n\t ev.stopPropagation();\n\t this.$( '.main-help' ).toggleClass( 'expanded' );\n\t this.$( '.more-help' ).toggle();\n\t },\n\t\n\t /** show an alert on the top of the interface containing message (alertClass is bootstrap's alert-*) */\n\t _showAlert : function( message, alertClass ){\n\t alertClass = alertClass || 'alert-danger';\n\t this.$( '.main-help' ).hide();\n\t this.$( '.header .alert' )\n\t .attr( 'class', 'alert alert-dismissable' ).addClass( alertClass ).show()\n\t .find( '.alert-message' ).html( message );\n\t },\n\t /** hide the alerts at the top */\n\t _hideAlert : function( message ){\n\t this.$( '.main-help' ).show();\n\t this.$( '.header .alert' ).hide();\n\t },\n\t\n\t // ........................................................................ elements\n\t /** reset all data to the initial state */\n\t reset : function(){\n\t this._instanceSetUp();\n\t this._elementsSetUp();\n\t this.render();\n\t },\n\t\n\t /** deselect all elements */\n\t clearSelectedElements : function( ev ){\n\t this.$( '.collection-elements .collection-element' ).removeClass( 'selected' );\n\t this.$( '.collection-elements-controls > .clear-selected' ).hide();\n\t },\n\t\n\t //_dragenterElements : function( ev ){\n\t // //this.debug( '_dragenterElements:', ev );\n\t //},\n\t//TODO: if selected are dragged out of the list area - remove the placeholder - cuz it won't work anyway\n\t // _dragleaveElements : function( ev ){\n\t // //this.debug( '_dragleaveElements:', ev );\n\t // },\n\t\n\t /** track the mouse drag over the list adding a placeholder to show where the drop would occur */\n\t _dragoverElements : function( ev ){\n\t //this.debug( '_dragoverElements:', ev );\n\t ev.preventDefault();\n\t\n\t var $list = this.$list();\n\t this._checkForAutoscroll( $list, ev.originalEvent.clientY );\n\t var $nearest = this._getNearestElement( ev.originalEvent.clientY );\n\t\n\t //TODO: no need to re-create - move instead\n\t this.$( '.element-drop-placeholder' ).remove();\n\t var $placeholder = $( '
                    ' );\n\t if( !$nearest.size() ){\n\t $list.append( $placeholder );\n\t } else {\n\t $nearest.before( $placeholder );\n\t }\n\t },\n\t\n\t /** If the mouse is near enough to the list's top or bottom, scroll the list */\n\t _checkForAutoscroll : function( $element, y ){\n\t var AUTOSCROLL_SPEED = 2,\n\t offset = $element.offset(),\n\t scrollTop = $element.scrollTop(),\n\t upperDist = y - offset.top,\n\t lowerDist = ( offset.top + $element.outerHeight() ) - y;\n\t if( upperDist >= 0 && upperDist < this.autoscrollDist ){\n\t $element.scrollTop( scrollTop - AUTOSCROLL_SPEED );\n\t } else if( lowerDist >= 0 && lowerDist < this.autoscrollDist ){\n\t $element.scrollTop( scrollTop + AUTOSCROLL_SPEED );\n\t }\n\t },\n\t\n\t /** get the nearest element based on the mouse's Y coordinate.\n\t * If the y is at the end of the list, return an empty jQuery object.\n\t */\n\t _getNearestElement : function( y ){\n\t var WIGGLE = 4,\n\t lis = this.$( '.collection-elements li.collection-element' ).toArray();\n\t for( var i=0; i y && top - halfHeight < y ){\n\t return $li;\n\t }\n\t }\n\t return $();\n\t },\n\t\n\t /** drop (dragged/selected elements) onto the list, re-ordering the internal list */\n\t _dropElements : function( ev ){\n\t if( ev.originalEvent ){ ev = ev.originalEvent; }\n\t // both required for firefox\n\t ev.preventDefault();\n\t ev.dataTransfer.dropEffect = 'move';\n\t\n\t // insert before the nearest element or after the last.\n\t var $nearest = this._getNearestElement( ev.clientY );\n\t if( $nearest.size() ){\n\t this.$dragging.insertBefore( $nearest );\n\t } else {\n\t // no nearest before - insert after last element\n\t this.$dragging.insertAfter( this.$( '.collection-elements .collection-element' ).last() );\n\t }\n\t // resync the creator's list based on the new DOM order\n\t this._syncOrderToDom();\n\t return false;\n\t },\n\t\n\t /** resync the creator's list of elements based on the DOM order */\n\t _syncOrderToDom : function(){\n\t var creator = this,\n\t newElements = [];\n\t //TODO: doesn't seem wise to use the dom to store these - can't we sync another way?\n\t this.$( '.collection-elements .collection-element' ).each( function(){\n\t var id = $( this ).attr( 'data-element-id' ),\n\t element = _.findWhere( creator.workingElements, { id: id });\n\t if( element ){\n\t newElements.push( element );\n\t } else {\n\t console.error( 'missing element: ', id );\n\t }\n\t });\n\t this.workingElements = newElements;\n\t this._renderList();\n\t },\n\t\n\t /** drag communication with element sub-views: dragstart */\n\t _elementDragstart : function( ev, element ){\n\t // auto select the element causing the event and move all selected\n\t element.select( true );\n\t this.$dragging = this.$( '.collection-elements .collection-element.selected' );\n\t },\n\t\n\t /** drag communication with element sub-views: dragend - remove the placeholder */\n\t _elementDragend : function( ev, element ){\n\t $( '.element-drop-placeholder' ).remove();\n\t this.$dragging = null;\n\t },\n\t\n\t // ........................................................................ footer\n\t /** handle a collection name change */\n\t _changeName : function( ev ){\n\t this._validationWarning( 'name', !!this._getName() );\n\t },\n\t\n\t /** check for enter key press when in the collection name and submit */\n\t _nameCheckForEnter : function( ev ){\n\t if( ev.keyCode === 13 && !this.blocking ){\n\t this._clickCreate();\n\t }\n\t },\n\t\n\t /** get the current collection name */\n\t _getName : function(){\n\t return _.escape( this.$( '.collection-name' ).val() );\n\t },\n\t\n\t /** attempt to create the current collection */\n\t _clickCreate : function( ev ){\n\t var name = this._getName();\n\t if( !name ){\n\t this._validationWarning( 'name' );\n\t } else if( !this.blocking ){\n\t this.createList( name );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ templates\n\t //TODO: move to require text plugin and load these as text\n\t //TODO: underscore currently unnecc. bc no vars are used\n\t //TODO: better way of localizing text-nodes in long strings\n\t /** underscore template fns attached to class */\n\t templates : {\n\t /** the skeleton */\n\t main : _.template([\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ].join('')),\n\t\n\t /** the header (not including help text) */\n\t header : _.template([\n\t '
                    ',\n\t '', _l( 'More help' ), '',\n\t '
                    ',\n\t '', _l( 'Less' ), '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '',\n\t '
                    ',\n\t ].join('')),\n\t\n\t /** the middle: element list */\n\t middle : _.template([\n\t '',\n\t '
                    ',\n\t '
                    '\n\t ].join('')),\n\t\n\t /** creation and cancel controls */\n\t footer : _.template([\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '
                    ', _l( 'Name' ), ':
                    ',\n\t '
                    ',\n\t '
                    ',\n\t\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t '',\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t '
                    '\n\t ].join('')),\n\t\n\t /** help content */\n\t helpContent : _.template([\n\t '

                    ', _l([\n\t 'Collections of datasets are permanent, ordered lists of datasets that can be passed to tools and ',\n\t 'workflows in order to have analyses done on each member of the entire group. This interface allows ',\n\t 'you to create a collection and re-order the final collection.'\n\t ].join( '' )), '

                    ',\n\t '
                      ',\n\t '
                    • ', _l([\n\t 'Rename elements in the list by clicking on ',\n\t 'the existing name.'\n\t ].join( '' )), '
                    • ',\n\t '
                    • ', _l([\n\t 'Discard elements from the final created list by clicking on the ',\n\t '\"Discard\" button.'\n\t ].join( '' )), '
                    • ',\n\t '
                    • ', _l([\n\t 'Reorder the list by clicking and dragging elements. Select multiple elements by clicking on ',\n\t 'them and you can then move those selected by dragging the ',\n\t 'entire group. Deselect them by clicking them again or by clicking the ',\n\t 'the \"Clear selected\" link.'\n\t ].join( '' )), '
                    • ',\n\t '
                    • ', _l([\n\t 'Click the \"Start over\" link to begin again as if you had just opened ',\n\t 'the interface.'\n\t ].join( '' )), '
                    • ',\n\t '
                    • ', _l([\n\t 'Click the \"Cancel\" button to exit the interface.'\n\t ].join( '' )), '
                    • ',\n\t '

                    ',\n\t '

                    ', _l([\n\t 'Once your collection is complete, enter a name and ',\n\t 'click \"Create list\".'\n\t ].join( '' )), '

                    '\n\t ].join('')),\n\t\n\t /** shown in list when all elements are discarded */\n\t invalidElements : _.template([\n\t _l( 'The following selections could not be included due to problems:' ),\n\t '
                      <% _.each( problems, function( problem ){ %>',\n\t '
                    • <%- problem.element.name %>: <%- problem.text %>
                    • ',\n\t '<% }); %>
                    '\n\t ].join('')),\n\t\n\t /** shown in list when all elements are discarded */\n\t noElementsLeft : _.template([\n\t '
                  7. ',\n\t _l( 'No elements left! ' ),\n\t _l( 'Would you like to ' ), '', _l( 'start over' ), '?',\n\t '
                  8. '\n\t ].join('')),\n\t\n\t /** a simplified page communicating what went wrong and why the user needs to reselect something else */\n\t invalidInitial : _.template([\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '<% if( _.size( problems ) ){ %>',\n\t _l( 'The following selections could not be included due to problems' ), ':',\n\t '
                      <% _.each( problems, function( problem ){ %>',\n\t '
                    • <%- problem.element.name %>: <%- problem.text %>
                    • ',\n\t '<% }); %>
                    ',\n\t '<% } else if( _.size( elements ) < 1 ){ %>',\n\t _l( 'No datasets were selected' ), '.',\n\t '<% } %>',\n\t '
                    ',\n\t _l( 'At least one element is needed for the collection' ), '. ',\n\t _l( 'You may need to ' ),\n\t '', _l( 'cancel' ), ' ',\n\t _l( 'and reselect new elements' ), '.',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t // _l( 'Create a different kind of collection' ),\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ].join('')),\n\t },\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** string rep */\n\t toString : function(){ return 'ListCollectionCreator'; }\n\t});\n\t\n\t\n\t\n\t//=============================================================================\n\t/** Create a modal and load its body with the given CreatorClass creator type\n\t * @returns {Deferred} resolved when creator has built a collection.\n\t */\n\tvar collectionCreatorModal = function _collectionCreatorModal( elements, options, CreatorClass ){\n\t\n\t var deferred = jQuery.Deferred(),\n\t modal = Galaxy.modal || ( new UI_MODAL.View() ),\n\t creator;\n\t\n\t options = _.defaults( options || {}, {\n\t elements : elements,\n\t oncancel : function(){\n\t modal.hide();\n\t deferred.reject( 'cancelled' );\n\t },\n\t oncreate : function( creator, response ){\n\t modal.hide();\n\t deferred.resolve( response );\n\t }\n\t });\n\t\n\t creator = new CreatorClass( options );\n\t modal.show({\n\t title : options.title || _l( 'Create a collection' ),\n\t body : creator.$el,\n\t width : '80%',\n\t height : '100%',\n\t closing_events: true\n\t });\n\t creator.render();\n\t window._collectionCreator = creator;\n\t\n\t //TODO: remove modal header\n\t return deferred;\n\t};\n\t\n\t/** List collection flavor of collectionCreatorModal. */\n\tvar listCollectionCreatorModal = function _listCollectionCreatorModal( elements, options ){\n\t options = options || {};\n\t options.title = _l( 'Create a collection from a list of datasets' );\n\t return collectionCreatorModal( elements, options, ListCollectionCreator );\n\t};\n\t\n\t\n\t//==============================================================================\n\t/** Use a modal to create a list collection, then add it to the given history contents.\n\t * @returns {Deferred} resolved when the collection is added to the history.\n\t */\n\tfunction createListCollection( contents ){\n\t var elements = contents.toJSON(),\n\t promise = listCollectionCreatorModal( elements, {\n\t creationFn : function( elements, name ){\n\t elements = elements.map( function( element ){\n\t return {\n\t id : element.id,\n\t name : element.name,\n\t //TODO: this allows for list:list even if the filter above does not - reconcile\n\t src : ( element.history_content_type === 'dataset'? 'hda' : 'hdca' )\n\t };\n\t });\n\t return contents.createHDCA( elements, 'list', name );\n\t }\n\t });\n\t return promise;\n\t}\n\t\n\t//==============================================================================\n\t return {\n\t DatasetCollectionElementView: DatasetCollectionElementView,\n\t ListCollectionCreator : ListCollectionCreator,\n\t\n\t collectionCreatorModal : collectionCreatorModal,\n\t listCollectionCreatorModal : listCollectionCreatorModal,\n\t createListCollection : createListCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery, Backbone, $, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(48),\n\t __webpack_require__(15),\n\t __webpack_require__(26),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_ITEM, STATES, faIconButton, BASE_MVC, _l ){\n\t/* global Backbone */\n\t\n\tvar logNamespace = 'dataset';\n\t/*==============================================================================\n\tTODO:\n\t straighten out state rendering and templates used\n\t inaccessible/STATES.NOT_VIEWABLE is a special case\n\t simplify button rendering\n\t\n\t==============================================================================*/\n\tvar _super = LIST_ITEM.ListItemView;\n\t/** @class Read only list view for either LDDAs, HDAs, or HDADCEs.\n\t * Roughly, any DatasetInstance (and not a raw Dataset).\n\t */\n\tvar DatasetListItemView = _super.extend(\n\t/** @lends DatasetListItemView.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t className : _super.prototype.className + \" dataset\",\n\t //TODO:?? doesn't exactly match an hda's type_id\n\t id : function(){\n\t return [ 'dataset', this.model.get( 'id' ) ].join( '-' );\n\t },\n\t\n\t /** Set up: instance vars, options, and event handlers */\n\t initialize : function( attributes ){\n\t if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n\t this.log( this + '.initialize:', attributes );\n\t _super.prototype.initialize.call( this, attributes );\n\t\n\t /** where should pages from links be displayed? (default to new tab/window) */\n\t this.linkTarget = attributes.linkTarget || '_blank';\n\t },\n\t\n\t /** event listeners */\n\t _setUpListeners : function(){\n\t _super.prototype._setUpListeners.call( this );\n\t\n\t // re-rendering on any model changes\n\t this.model.on( 'change', function( model, options ){\n\t // if the model moved into the ready state and is expanded without details, fetch those details now\n\t if( this.model.changedAttributes().state && this.model.inReadyState()\n\t && this.expanded && !this.model.hasDetails() ){\n\t // will render automatically (due to fetch -> change)\n\t this.model.fetch();\n\t\n\t } else {\n\t this.render();\n\t }\n\t }, this );\n\t },\n\t\n\t // ......................................................................... expandable\n\t /** In this override, only get details if in the ready state, get rerunnable if in other states.\n\t * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n\t */\n\t _fetchModelDetails : function(){\n\t var view = this;\n\t if( view.model.inReadyState() && !view.model.hasDetails() ){\n\t return view.model.fetch({ silent: true });\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t // ......................................................................... removal\n\t /** Remove this view's html from the DOM and remove all event listeners.\n\t * @param {Number or String} speed jq effect speed\n\t * @param {Function} callback an optional function called when removal is done (scoped to this view)\n\t */\n\t remove : function( speed, callback ){\n\t var view = this;\n\t speed = speed || this.fxSpeed;\n\t this.$el.fadeOut( speed, function(){\n\t Backbone.View.prototype.remove.call( view );\n\t if( callback ){ callback.call( view ); }\n\t });\n\t },\n\t\n\t // ......................................................................... rendering\n\t /* TODO:\n\t dataset states are the issue primarily making dataset rendering complex\n\t each state should have it's own way of displaying/set of details\n\t often with different actions that can be applied\n\t throw in deleted/purged/visible and things get complicated easily\n\t I've considered (a couple of times) - creating a view for each state\n\t - but recreating the view during an update...seems wrong\n\t */\n\t /** Render this HDA, set up ui.\n\t * @param {Number or String} speed jq fx speed\n\t * @returns {Object} this\n\t */\n\t render : function( speed ){\n\t //HACK: hover exit doesn't seem to be called on prev. tooltips when RE-rendering - so: no tooltip hide\n\t // handle that here by removing previous view's tooltips\n\t //this.$el.find(\"[title]\").tooltip( \"destroy\" );\n\t return _super.prototype.render.call( this, speed );\n\t },\n\t\n\t /** In this override, add the dataset state as a class for use with state-based CSS */\n\t _swapNewRender : function( $newRender ){\n\t _super.prototype._swapNewRender.call( this, $newRender );\n\t if( this.model.has( 'state' ) ){\n\t this.$el.addClass( 'state-' + this.model.get( 'state' ) );\n\t }\n\t return this.$el;\n\t },\n\t\n\t // ................................................................................ titlebar\n\t /** In this override, add the dataset display button. */\n\t _renderPrimaryActions : function(){\n\t // render just the display for read-only\n\t return [ this._renderDisplayButton() ];\n\t },\n\t\n\t /** Render icon-button to display dataset data */\n\t _renderDisplayButton : function(){\n\t//TODO:?? too complex - possibly move into template\n\t // don't show display if not viewable or not accessible\n\t var state = this.model.get( 'state' );\n\t if( ( state === STATES.NOT_VIEWABLE )\n\t || ( state === STATES.DISCARDED )\n\t || ( !this.model.get( 'accessible' ) ) ){\n\t return null;\n\t }\n\t\n\t var displayBtnData = {\n\t target : this.linkTarget,\n\t classes : 'display-btn'\n\t };\n\t\n\t // show a disabled display if the data's been purged\n\t if( this.model.get( 'purged' ) ){\n\t displayBtnData.disabled = true;\n\t displayBtnData.title = _l( 'Cannot display datasets removed from disk' );\n\t\n\t // disable if still uploading\n\t } else if( state === STATES.UPLOAD ){\n\t displayBtnData.disabled = true;\n\t displayBtnData.title = _l( 'This dataset must finish uploading before it can be viewed' );\n\t\n\t // disable if still new\n\t } else if( state === STATES.NEW ){\n\t displayBtnData.disabled = true;\n\t displayBtnData.title = _l( 'This dataset is not yet viewable' );\n\t\n\t } else {\n\t displayBtnData.title = _l( 'View data' );\n\t\n\t // default link for dataset\n\t displayBtnData.href = this.model.urls.display;\n\t\n\t // add frame manager option onclick event\n\t var self = this;\n\t displayBtnData.onclick = function( ev ){\n\t if (Galaxy.frame && Galaxy.frame.active) {\n\t // Add dataset to frames.\n\t Galaxy.frame.addDataset(self.model.get('id'));\n\t ev.preventDefault();\n\t }\n\t };\n\t }\n\t displayBtnData.faIcon = 'fa-eye';\n\t return faIconButton( displayBtnData );\n\t },\n\t\n\t // ......................................................................... rendering details\n\t /** Render the enclosing div of the hda body and, if expanded, the html in the body\n\t * @returns {jQuery} rendered DOM\n\t */\n\t _renderDetails : function(){\n\t //TODO: generalize to be allow different details for each state\n\t\n\t // no access - render nothing but a message\n\t if( this.model.get( 'state' ) === STATES.NOT_VIEWABLE ){\n\t return $( this.templates.noAccess( this.model.toJSON(), this ) );\n\t }\n\t\n\t var $details = _super.prototype._renderDetails.call( this );\n\t $details.find( '.actions .left' ).empty().append( this._renderSecondaryActions() );\n\t $details.find( '.summary' ).html( this._renderSummary() )\n\t .prepend( this._renderDetailMessages() );\n\t $details.find( '.display-applications' ).html( this._renderDisplayApplications() );\n\t\n\t//TODO: double tap\n\t this._setUpBehaviors( $details );\n\t return $details;\n\t },\n\t\n\t /** Defer to the appropo summary rendering fn based on state */\n\t _renderSummary : function(){\n\t var json = this.model.toJSON(),\n\t summaryRenderFn = this.templates.summaries[ json.state ];\n\t summaryRenderFn = summaryRenderFn || this.templates.summaries.unknown;\n\t return summaryRenderFn( json, this );\n\t },\n\t\n\t /** Render messages to be displayed only when the details are shown */\n\t _renderDetailMessages : function(){\n\t var view = this,\n\t $warnings = $( '
                    ' ),\n\t json = view.model.toJSON();\n\t//TODO:! unordered (map)\n\t _.each( view.templates.detailMessages, function( templateFn ){\n\t $warnings.append( $( templateFn( json, view ) ) );\n\t });\n\t return $warnings;\n\t },\n\t\n\t /** Render the external display application links */\n\t _renderDisplayApplications : function(){\n\t if( this.model.isDeletedOrPurged() ){ return ''; }\n\t // render both old and new display apps using the same template\n\t return [\n\t this.templates.displayApplications( this.model.get( 'display_apps' ), this ),\n\t this.templates.displayApplications( this.model.get( 'display_types' ), this )\n\t ].join( '' );\n\t },\n\t\n\t // ......................................................................... secondary/details actions\n\t /** A series of links/buttons for less commonly used actions: re-run, info, etc. */\n\t _renderSecondaryActions : function(){\n\t this.debug( '_renderSecondaryActions' );\n\t switch( this.model.get( 'state' ) ){\n\t case STATES.NOT_VIEWABLE:\n\t return [];\n\t case STATES.OK:\n\t case STATES.FAILED_METADATA:\n\t case STATES.ERROR:\n\t return [ this._renderDownloadButton(), this._renderShowParamsButton() ];\n\t }\n\t return [ this._renderShowParamsButton() ];\n\t },\n\t\n\t /** Render icon-button to show the input and output (stdout/err) for the job that created this.\n\t * @returns {jQuery} rendered DOM\n\t */\n\t _renderShowParamsButton : function(){\n\t // gen. safe to show in all cases\n\t return faIconButton({\n\t title : _l( 'View details' ),\n\t classes : 'params-btn',\n\t href : this.model.urls.show_params,\n\t target : this.linkTarget,\n\t faIcon : 'fa-info-circle'\n\t });\n\t },\n\t\n\t /** Render icon-button/popupmenu to download the data (and/or the associated meta files (bai, etc.)) for this.\n\t * @returns {jQuery} rendered DOM\n\t */\n\t _renderDownloadButton : function(){\n\t//TODO: to (its own) template fn\n\t // don't show anything if the data's been purged\n\t if( this.model.get( 'purged' ) || !this.model.hasData() ){ return null; }\n\t\n\t // return either: a popupmenu with links to download assoc. meta files (if there are meta files)\n\t // or a single download icon-button (if there are no meta files)\n\t if( !_.isEmpty( this.model.get( 'meta_files' ) ) ){\n\t return this._renderMetaFileDownloadButton();\n\t }\n\t\n\t return $([\n\t '',\n\t '',\n\t ''\n\t ].join( '' ));\n\t },\n\t\n\t /** Render the download button which opens a dropdown with links to download assoc. meta files (indeces, etc.) */\n\t _renderMetaFileDownloadButton : function(){\n\t var urls = this.model.urls;\n\t return $([\n\t '
                    ',\n\t '',\n\t '',\n\t '',\n\t '',\n\t '
                    '\n\t ].join( '\\n' ));\n\t },\n\t\n\t // ......................................................................... misc\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .display-btn' : function( ev ){ this.trigger( 'display', this, ev ); },\n\t 'click .params-btn' : function( ev ){ this.trigger( 'params', this, ev ); },\n\t 'click .download-btn' : function( ev ){ this.trigger( 'download', this, ev ); }\n\t }),\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DatasetListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDatasetListItemView.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t failed_metadata : BASE_MVC.wrapTemplate([\n\t // failed metadata is rendered as a warning on an otherwise ok dataset view\n\t '<% if( model.state === \"failed_metadata\" ){ %>',\n\t '
                    ',\n\t _l( 'An error occurred setting the metadata for this dataset' ),\n\t '
                    ',\n\t '<% } %>'\n\t ]),\n\t error : BASE_MVC.wrapTemplate([\n\t // error during index fetch - show error on dataset\n\t '<% if( model.error ){ %>',\n\t '
                    ',\n\t _l( 'There was an error getting the data for this dataset' ), ': <%- model.error %>',\n\t '
                    ',\n\t '<% } %>'\n\t ]),\n\t purged : BASE_MVC.wrapTemplate([\n\t '<% if( model.purged ){ %>',\n\t '
                    ',\n\t _l( 'This dataset has been deleted and removed from disk' ),\n\t '
                    ',\n\t '<% } %>'\n\t ]),\n\t deleted : BASE_MVC.wrapTemplate([\n\t // deleted not purged\n\t '<% if( model.deleted && !model.purged ){ %>',\n\t '
                    ',\n\t _l( 'This dataset has been deleted' ),\n\t '
                    ',\n\t '<% } %>'\n\t ])\n\t\n\t //NOTE: hidden warning is only needed for HDAs\n\t });\n\t\n\t var detailsTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t '
                    ',\n\t\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t\n\t // do not display tags, annotation, display apps, or peek when deleted\n\t '<% if( !dataset.deleted && !dataset.purged ){ %>',\n\t '
                    ',\n\t '
                    ',\n\t\n\t '
                    ',\n\t\n\t '<% if( dataset.peek ){ %>',\n\t '
                    <%= dataset.peek %>
                    ',\n\t '<% } %>',\n\t '<% } %>',\n\t '
                    '\n\t ], 'dataset' );\n\t\n\t var noAccessTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t '
                    ',\n\t _l( 'You do not have permission to view this dataset' ),\n\t '
                    ',\n\t '
                    '\n\t ], 'dataset' );\n\t\n\t//TODO: still toooooooooooooo complex - rework\n\t var summaryTemplates = {};\n\t summaryTemplates[ STATES.OK ] = summaryTemplates[ STATES.FAILED_METADATA ] = BASE_MVC.wrapTemplate([\n\t '<% if( dataset.misc_blurb ){ %>',\n\t '
                    ',\n\t '<%- dataset.misc_blurb %>',\n\t '
                    ',\n\t '<% } %>',\n\t\n\t '<% if( dataset.file_ext ){ %>',\n\t '
                    ',\n\t '',\n\t '<%- dataset.file_ext %>',\n\t '
                    ',\n\t '<% } %>',\n\t\n\t '<% if( dataset.metadata_dbkey ){ %>',\n\t '
                    ',\n\t '',\n\t '',\n\t '<%- dataset.metadata_dbkey %>',\n\t '',\n\t '
                    ',\n\t '<% } %>',\n\t\n\t '<% if( dataset.misc_info ){ %>',\n\t '
                    ',\n\t '<%- dataset.misc_info %>',\n\t '
                    ',\n\t '<% } %>'\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.NEW ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'This is a new dataset and not all of its data are available yet' ), '
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.NOT_VIEWABLE ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'You do not have permission to view this dataset' ), '
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.DISCARDED ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'The job creating this dataset was cancelled before completion' ), '
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.QUEUED ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'This job is waiting to run' ), '
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.RUNNING ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'This job is currently running' ), '
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.UPLOAD ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'This dataset is currently uploading' ), '
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.SETTING_METADATA ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'Metadata is being auto-detected' ), '
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.PAUSED ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume' ), '
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.ERROR ] = BASE_MVC.wrapTemplate([\n\t '<% if( !dataset.purged ){ %>',\n\t '
                    <%- dataset.misc_blurb %>
                    ',\n\t '<% } %>',\n\t '', _l( 'An error occurred with this dataset' ), ':',\n\t '
                    <%- dataset.misc_info %>
                    '\n\t ], 'dataset' );\n\t summaryTemplates[ STATES.EMPTY ] = BASE_MVC.wrapTemplate([\n\t '
                    ', _l( 'No data' ), ': <%- dataset.misc_blurb %>
                    '\n\t ], 'dataset' );\n\t summaryTemplates.unknown = BASE_MVC.wrapTemplate([\n\t '
                    Error: unknown dataset state: \"<%- dataset.state %>\"
                    '\n\t ], 'dataset' );\n\t\n\t // messages to be displayed only within the details section ('below the fold')\n\t var detailMessageTemplates = {\n\t resubmitted : BASE_MVC.wrapTemplate([\n\t // deleted not purged\n\t '<% if( model.resubmitted ){ %>',\n\t '
                    ',\n\t _l( 'The job creating this dataset has been resubmitted' ),\n\t '
                    ',\n\t '<% } %>'\n\t ])\n\t };\n\t\n\t // this is applied to both old and new style display apps\n\t var displayApplicationsTemplate = BASE_MVC.wrapTemplate([\n\t '<% _.each( apps, function( app ){ %>',\n\t '
                    ',\n\t '<%- app.label %> ',\n\t '',\n\t '<% _.each( app.links, function( link ){ %>',\n\t '\" href=\"<%- link.href %>\">',\n\t '<% print( _l( link.text ) ); %>',\n\t ' ',\n\t '<% }); %>',\n\t '',\n\t '
                    ',\n\t '<% }); %>'\n\t ], 'apps' );\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t warnings : warnings,\n\t details : detailsTemplate,\n\t noAccess : noAccessTemplate,\n\t summaries : summaryTemplates,\n\t detailMessages : detailMessageTemplates,\n\t displayApplications : displayApplicationsTemplate\n\t });\n\t}());\n\t\n\t\n\t// ============================================================================\n\t return {\n\t DatasetListItemView : DatasetListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {/*\n\t This class maps the form dom to an api compatible javascript dictionary.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(4) ], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\t var Manager = Backbone.Model.extend({\n\t initialize: function( app ) {\n\t this.app = app;\n\t },\n\t\n\t /** Creates a checksum.\n\t */\n\t checksum: function() {\n\t var sum = '';\n\t var self = this;\n\t this.app.section.$el.find( '.section-row' ).each( function() {\n\t var id = $(this).attr( 'id' );\n\t var field = self.app.field_list[ id ];\n\t if ( field ) {\n\t sum += id + ':' + JSON.stringify( field.value && field.value() ) + ':' + field.collapsed + ';';\n\t }\n\t });\n\t return sum;\n\t },\n\t\n\t /** Convert dom into a dictionary of flat id/value pairs used e.g. on job submission.\n\t */\n\t create: function() {\n\t var self = this;\n\t\n\t // get raw dictionary from dom\n\t var dict = {};\n\t this._iterate( this.app.section.$el, dict );\n\t\n\t // add to result dictionary\n\t var result_dict = {};\n\t this.flat_dict = {};\n\t function add( flat_id, input_id, input_value ) {\n\t self.flat_dict[ flat_id ] = input_id;\n\t result_dict[ flat_id ] = input_value;\n\t };\n\t\n\t // converter between raw dictionary and job dictionary\n\t function convert( identifier, head ) {\n\t for ( var index in head ) {\n\t var node = head[ index ];\n\t if ( node.input ) {\n\t var input = node.input;\n\t var flat_id = identifier;\n\t if ( identifier != '' ) {\n\t flat_id += '|';\n\t }\n\t flat_id += input.name;\n\t switch ( input.type ) {\n\t case 'repeat':\n\t var section_label = 'section-';\n\t var block_indices = [];\n\t var block_prefix = null;\n\t for ( var block_label in node ) {\n\t var pos = block_label.indexOf( section_label );\n\t if ( pos != -1 ) {\n\t pos += section_label.length;\n\t block_indices.push( parseInt( block_label.substr( pos ) ));\n\t if ( !block_prefix ) {\n\t block_prefix = block_label.substr( 0, pos );\n\t }\n\t }\n\t }\n\t block_indices.sort( function( a, b ) { return a - b; });\n\t var index = 0;\n\t for ( var i in block_indices ) {\n\t convert( flat_id + '_' + index++, node[ block_prefix + block_indices[ i ] ]);\n\t }\n\t break;\n\t case 'conditional':\n\t var value = self.app.field_list[ input.id ].value();\n\t add ( flat_id + '|' + input.test_param.name, input.id, value );\n\t var selectedCase = matchCase( input, value );\n\t if ( selectedCase != -1 ) {\n\t convert( flat_id, head[ input.id + '-section-' + selectedCase ] );\n\t }\n\t break;\n\t case 'section':\n\t convert( !input.flat && flat_id || '', node );\n\t break;\n\t default:\n\t var field = self.app.field_list[ input.id ];\n\t if ( field && field.value ) {\n\t var value = field.value();\n\t if ( input.ignore === undefined || input.ignore != value ) {\n\t if ( field.collapsed && input.collapsible_value ) {\n\t value = input.collapsible_value;\n\t }\n\t add ( flat_id, input.id, value );\n\t if ( input.payload ) {\n\t for ( var p_id in input.payload ) {\n\t add ( p_id, input.id, input.payload[ p_id ] );\n\t }\n\t }\n\t }\n\t }\n\t }\n\t }\n\t }\n\t }\n\t convert( '', dict );\n\t return result_dict;\n\t },\n\t\n\t /** Matches flat ids to corresponding input element\n\t * @param{string} flat_id - Flat input id to be looked up.\n\t */\n\t match: function ( flat_id ) {\n\t return this.flat_dict && this.flat_dict[ flat_id ];\n\t },\n\t\n\t /** Match conditional values to selected cases\n\t */\n\t matchCase: function( input, value ) {\n\t return matchCase( input, value );\n\t },\n\t\n\t /** Matches a new tool model to the current input elements e.g. used to update dynamic options\n\t */\n\t matchModel: function( model, callback ) {\n\t return matchIds( model.inputs, this.flat_dict, callback );\n\t },\n\t\n\t /** Matches identifier from api response to input elements e.g. used to display validation errors\n\t */\n\t matchResponse: function( response ) {\n\t var result = {};\n\t var self = this;\n\t function search ( id, head ) {\n\t if ( typeof head === 'string' ) {\n\t var input_id = self.flat_dict[ id ];\n\t input_id && ( result[ input_id ] = head );\n\t } else {\n\t for ( var i in head ) {\n\t var new_id = i;\n\t if ( id !== '' ) {\n\t var separator = '|';\n\t if ( head instanceof Array ) {\n\t separator = '_';\n\t }\n\t new_id = id + separator + new_id;\n\t }\n\t search ( new_id, head[ i ] );\n\t }\n\t }\n\t }\n\t search( '', response );\n\t return result;\n\t },\n\t\n\t /** Map dom tree to dictionary tree with input elements.\n\t */\n\t _iterate: function( parent, dict ) {\n\t var self = this;\n\t var children = $( parent ).children();\n\t children.each( function() {\n\t var child = this;\n\t var id = $( child ).attr( 'id' );\n\t if ( $( child ).hasClass( 'section-row' ) ) {\n\t var input = self.app.input_list[ id ];\n\t dict[ id ] = ( input && { input : input } ) || {};\n\t self._iterate( child, dict[ id ] );\n\t } else {\n\t self._iterate( child, dict );\n\t }\n\t });\n\t }\n\t });\n\t\n\t /** Match conditional values to selected cases\n\t * @param{dict} input - Definition of conditional input parameter\n\t * @param{dict} value - Current value\n\t */\n\t var matchCase = function( input, value ) {\n\t if ( input.test_param.type == 'boolean' ) {\n\t if ( value == 'true' ) {\n\t value = input.test_param.truevalue || 'true';\n\t } else {\n\t value = input.test_param.falsevalue || 'false';\n\t }\n\t }\n\t for ( var i in input.cases ) {\n\t if ( input.cases[ i ].value == value ) {\n\t return i;\n\t }\n\t }\n\t return -1;\n\t };\n\t\n\t /** Match context\n\t * @param{dict} inputs - Dictionary of input elements\n\t * @param{dict} key - Reference key which is matched to an input name e.g. data_ref\n\t * @param{dict} callback - Called with matched context i.e. callback( input, referenced_input )\n\t */\n\t var matchContext = function( inputs, key, callback, context ) {\n\t context = $.extend( true, {}, context );\n\t _.each( inputs, function ( input ) {\n\t input && input.type && ( context[ input.name ] = input );\n\t });\n\t _.each( inputs, function ( input ) {\n\t if ( _.isObject( input ) ) {\n\t if ( input.type && context[ input[ key ] ] ) {\n\t callback ( input, context[ input[ key ] ] );\n\t } else {\n\t matchContext( input, key, callback, context );\n\t }\n\t }\n\t });\n\t };\n\t\n\t /** Matches a tool model to a dictionary, indexed with flat ids\n\t * @param{dict} inputs - Dictionary of input elements\n\t * @param{dict} mapping - Dictionary containing flat ids\n\t * @param{dict} callback - Called with the mapped dictionary object and corresponding model node\n\t */\n\t var matchIds = function( inputs, mapping, callback ) {\n\t var result = {};\n\t var self = this;\n\t function search ( id, head ) {\n\t for ( var i in head ) {\n\t var node = head[ i ];\n\t var index = node.name;\n\t id != '' && ( index = id + '|' + index );\n\t switch ( node.type ) {\n\t case 'repeat':\n\t for ( var j in node.cache ) {\n\t search ( index + '_' + j, node.cache[ j ] );\n\t }\n\t break;\n\t case 'conditional':\n\t var selectedCase = matchCase( node, node.test_param && node.test_param.value );\n\t selectedCase != -1 && search ( index, node.cases[ selectedCase ].inputs );\n\t break;\n\t case 'section':\n\t search ( index, node.inputs );\n\t break;\n\t default:\n\t var mapped = mapping[ index ];\n\t mapped && callback( mapped, node );\n\t }\n\t }\n\t }\n\t search( '', inputs );\n\t return result;\n\t };\n\t\n\t return {\n\t Manager : Manager,\n\t matchIds : matchIds,\n\t matchContext : matchContext\n\t }\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {/**\n\t This class creates a form input element wrapper\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t return Backbone.View.extend({\n\t initialize: function(app, options) {\n\t this.app = app;\n\t this.field = options.field;\n\t\n\t // set text labels and icons for collapsible button\n\t this.text_enable = app.options.text_enable || 'Enable';\n\t this.text_disable = app.options.text_disable || 'Disable';\n\t this.cls_enable = app.options.cls_enable || 'fa fa-caret-square-o-down';\n\t this.cls_disable = app.options.cls_disable || 'fa fa-caret-square-o-up';\n\t\n\t // set element\n\t this.setElement(this._template(options));\n\t\n\t // link elements\n\t this.$field = this.$('.ui-form-field');\n\t this.$preview = this.$('.ui-form-preview');\n\t this.$collapsible = this.$('.ui-form-collapsible');\n\t this.$collapsible_icon = this.$('.ui-form-collapsible').find('.icon');\n\t this.$error_text = this.$('.ui-form-error-text');\n\t this.$error = this.$('.ui-form-error');\n\t this.$backdrop = this.$('.ui-form-backdrop');\n\t\n\t // add field element\n\t this.$field.prepend(this.field.$el);\n\t\n\t // decide wether to expand or collapse fields\n\t this.field.collapsed = options.collapsible_value !== undefined && JSON.stringify( options.value ) == JSON.stringify( options.collapsible_value );\n\t\n\t // refresh view\n\t this._refresh();\n\t\n\t // add collapsible hide/show\n\t var self = this;\n\t this.$collapsible.on('click', function() {\n\t self.field.collapsed = !self.field.collapsed;\n\t self._refresh();\n\t });\n\t },\n\t\n\t /** Disable input element\n\t */\n\t disable: function( silent ) {\n\t this.$backdrop.show();\n\t silent && this.$backdrop.css({ 'opacity': 0, 'cursor': 'default' } );\n\t },\n\t\n\t /** Set error text\n\t */\n\t error: function(text) {\n\t this.$error_text.html(text);\n\t this.$error.show();\n\t this.$el.addClass('ui-error');\n\t },\n\t\n\t /** Reset this view\n\t */\n\t reset: function() {\n\t this.$error.hide();\n\t this.$el.removeClass('ui-error');\n\t },\n\t\n\t /** Refresh element\n\t */\n\t _refresh: function() {\n\t this.$collapsible_icon.removeClass().addClass('icon');\n\t if (!this.field.collapsed) {\n\t this.$field.fadeIn('fast');\n\t this.$preview.hide();\n\t this._tooltip(this.text_disable, this.cls_disable);\n\t } else {\n\t this.$field.hide();\n\t this.$preview.show();\n\t this._tooltip(this.text_enable, this.cls_enable);\n\t }\n\t this.app.trigger('change');\n\t },\n\t\n\t /** Set tooltip text\n\t */\n\t _tooltip: function(title, cls) {\n\t this.$collapsible_icon.addClass(cls)\n\t .tooltip({ placement: 'bottom' })\n\t .attr('data-original-title', title)\n\t .tooltip('fixTitle').tooltip('hide');\n\t },\n\t\n\t /** Main Template\n\t */\n\t _template: function(options) {\n\t var tmp = '
                    ' +\n\t '
                    ' +\n\t '' +\n\t '
                    ' +\n\t '
                    ';\n\t if ( !options.disabled && options.collapsible_value !== undefined ) {\n\t tmp += '
                    ' +\n\t '' + options.label +\n\t '
                    ';\n\t } else {\n\t tmp += options.label;\n\t }\n\t tmp += '
                    ' +\n\t '
                    ';\n\t tmp += '
                    ';\n\t if (options.help) {\n\t tmp += options.help;\n\t if (options.argument && options.help.indexOf('(' + options.argument + ')') == -1) {\n\t tmp += ' (' + options.argument + ')';\n\t }\n\t }\n\t tmp += '
                    ' +\n\t '
                    ' +\n\t '
                    ';\n\t if ( options.collapsible_preview ) {\n\t tmp += '
                    ' + options.text_value + '
                    ';\n\t }\n\t tmp += '
                    ';\n\t return tmp;\n\t }\n\t });\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/**\n\t This class creates input elements. New input parameter types should be added to the types dictionary.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4),\n\t __webpack_require__(7),\n\t __webpack_require__(43),\n\t __webpack_require__(56),\n\t __webpack_require__(55),\n\t __webpack_require__(52)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Ui, SelectContent, SelectLibrary, SelectFtp, ColorPicker) {\n\t\n\t // create form view\n\t return Backbone.Model.extend({\n\t /** Available parameter types */\n\t types: {\n\t 'text' : '_fieldText',\n\t 'select' : '_fieldSelect',\n\t 'data_column' : '_fieldSelect',\n\t 'genomebuild' : '_fieldSelect',\n\t 'data' : '_fieldData',\n\t 'data_collection' : '_fieldData',\n\t 'integer' : '_fieldSlider',\n\t 'float' : '_fieldSlider',\n\t 'boolean' : '_fieldBoolean',\n\t 'drill_down' : '_fieldDrilldown',\n\t 'color' : '_fieldColor',\n\t 'hidden' : '_fieldHidden',\n\t 'hidden_data' : '_fieldHidden',\n\t 'baseurl' : '_fieldHidden',\n\t 'library_data' : '_fieldLibrary',\n\t 'ftpfile' : '_fieldFtp'\n\t },\n\t\n\t // initialize\n\t initialize: function(app, options) {\n\t this.app = app;\n\t },\n\t\n\t /** Returns an input field for a given field type\n\t */\n\t create: function(input_def) {\n\t // add regular/default value if missing\n\t if (input_def.value === undefined) {\n\t input_def.value = null;\n\t }\n\t if (input_def.default_value === undefined) {\n\t input_def.default_value = input_def.value;\n\t }\n\t\n\t // create field wrapper\n\t var field = null;\n\t var fieldClass = this.types[input_def.type];\n\t if (fieldClass && typeof(this[fieldClass]) === 'function') {\n\t field = this[fieldClass].call(this, input_def);\n\t }\n\t\n\t // match unavailable field types\n\t if (!field) {\n\t this.app.incompatible = true;\n\t if (input_def.options) {\n\t field = this._fieldSelect(input_def);\n\t } else {\n\t field = this._fieldText(input_def);\n\t }\n\t Galaxy.emit.debug('form-parameters::_addRow()', 'Auto matched field type (' + input_def.type + ').');\n\t }\n\t\n\t // set initial field value\n\t input_def.value !== undefined && ( field.value( input_def.value ) );\n\t return field;\n\t },\n\t\n\t /** Data input field\n\t */\n\t _fieldData: function(input_def) {\n\t var self = this;\n\t return new SelectContent.View(this.app, {\n\t id : 'field-' + input_def.id,\n\t extensions : input_def.extensions,\n\t optional : input_def.optional,\n\t multiple : input_def.multiple,\n\t type : input_def.type,\n\t data : input_def.options,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Select/Checkbox/Radio options field\n\t */\n\t _fieldSelect: function (input_def) {\n\t // show text field e.g. in workflow editor\n\t if( input_def.is_workflow ) {\n\t return this._fieldText( input_def );\n\t }\n\t\n\t // customize properties\n\t if (input_def.type == 'data_column') {\n\t input_def.error_text = 'Missing columns in referenced dataset.'\n\t }\n\t\n\t // configure options fields\n\t var options = [];\n\t for (var i in input_def.options) {\n\t var option = input_def.options[i];\n\t options.push({\n\t label: option[0],\n\t value: option[1]\n\t });\n\t }\n\t\n\t // identify display type\n\t var SelectClass = Ui.Select;\n\t switch (input_def.display) {\n\t case 'checkboxes':\n\t SelectClass = Ui.Checkbox;\n\t break;\n\t case 'radio':\n\t SelectClass = Ui.Radio;\n\t break;\n\t }\n\t\n\t // create select field\n\t var self = this;\n\t return new SelectClass.View({\n\t id : 'field-' + input_def.id,\n\t data : options,\n\t error_text : input_def.error_text || 'No options available',\n\t optional : input_def.optional && input_def.default_value === null,\n\t multiple : input_def.multiple,\n\t optional : input_def.optional,\n\t searchable : input_def.searchable,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Drill down options field\n\t */\n\t _fieldDrilldown: function (input_def) {\n\t // show text field e.g. in workflow editor\n\t if( input_def.is_workflow ) {\n\t return this._fieldText( input_def );\n\t }\n\t\n\t // create drill down field\n\t var self = this;\n\t return new Ui.Drilldown.View({\n\t id : 'field-' + input_def.id,\n\t data : input_def.options,\n\t display : input_def.display,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Text input field\n\t */\n\t _fieldText: function(input_def) {\n\t // field replaces e.g. a select field\n\t if (input_def.options) {\n\t input_def.area = input_def.multiple;\n\t if (!Utils.validate(input_def.value)) {\n\t input_def.value = null;\n\t } else {\n\t if ($.isArray(input_def.value)) {\n\t var str_value = '';\n\t for (var i in input_def.value) {\n\t str_value += String(input_def.value[i]);\n\t if (!input_def.multiple) {\n\t break;\n\t }\n\t str_value += '\\n';\n\t }\n\t input_def.value = str_value;\n\t }\n\t }\n\t }\n\t\n\t // create input element\n\t var self = this;\n\t return new Ui.Input({\n\t id : 'field-' + input_def.id,\n\t area : input_def.area,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Slider field\n\t */\n\t _fieldSlider: function(input_def) {\n\t var self = this;\n\t return new Ui.Slider.View({\n\t id : 'field-' + input_def.id,\n\t precise : input_def.type == 'float',\n\t is_workflow : input_def.is_workflow,\n\t min : input_def.min,\n\t max : input_def.max,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Hidden field\n\t */\n\t _fieldHidden: function(input_def) {\n\t return new Ui.Hidden({\n\t id : 'field-' + input_def.id,\n\t info : input_def.info\n\t });\n\t },\n\t\n\t /** Boolean field\n\t */\n\t _fieldBoolean: function(input_def) {\n\t var self = this;\n\t return new Ui.RadioButton.View({\n\t id : 'field-' + input_def.id,\n\t data : [ { label : 'Yes', value : 'true' },\n\t { label : 'No', value : 'false' }],\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Color picker field\n\t */\n\t _fieldColor: function(input_def) {\n\t var self = this;\n\t return new ColorPicker({\n\t id : 'field-' + input_def.id,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** Library dataset field\n\t */\n\t _fieldLibrary: function(input_def) {\n\t var self = this;\n\t return new SelectLibrary.View({\n\t id : 'field-' + input_def.id,\n\t optional : input_def.optional,\n\t multiple : input_def.multiple,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t },\n\t\n\t /** FTP file field\n\t */\n\t _fieldFtp: function(input_def) {\n\t var self = this;\n\t return new SelectFtp.View({\n\t id : 'field-' + input_def.id,\n\t optional : input_def.optional,\n\t multiple : input_def.multiple,\n\t onchange : function() {\n\t self.app.trigger('change');\n\t }\n\t });\n\t }\n\t });\n\t\n\t return {\n\t View: View\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(17), __webpack_require__(11), __webpack_require__(7)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Table, Portlet, Ui) {\n\t\n\t/** This class creates a ui component which enables the dynamic creation of portlets\n\t*/\n\tvar View = Backbone.View.extend({\n\t /** Initialize\n\t */\n\t initialize : function(options) {\n\t this.options = Utils.merge(options, {\n\t title : 'Section',\n\t empty_text : 'Not available.',\n\t max : null,\n\t min : null\n\t });\n\t this.setElement('
                    ');\n\t var self = this;\n\t\n\t // create button\n\t this.button_new = new Ui.ButtonIcon({\n\t icon : 'fa-plus',\n\t title : 'Insert ' + options.title_new,\n\t tooltip : 'Add new ' + options.title_new + ' block',\n\t floating: 'clear',\n\t onclick : function() {\n\t if (options.onnew) {\n\t options.onnew();\n\t }\n\t }\n\t });\n\t\n\t // create table\n\t this.table = new Table.View({\n\t cls : 'ui-table-plain',\n\t content : ''\n\t });\n\t this.$el.append(this.table.$el);\n\t this.$el.append($('
                    ').append(this.button_new.$el));\n\t\n\t // reset list\n\t this.list = {};\n\t this.n = 0;\n\t },\n\t\n\t /** Number of repeat blocks\n\t */\n\t size: function() {\n\t return this.n;\n\t },\n\t\n\t /** Add new repeat block\n\t */\n\t add: function(options) {\n\t if (!options.id || this.list[options.id]) {\n\t Galaxy.emit.debug('form-repeat::add()', 'Duplicate repeat block id.');\n\t return;\n\t }\n\t this.n++;\n\t var button_delete = new Ui.ButtonIcon({\n\t icon : 'fa-trash-o',\n\t tooltip : 'Delete this repeat block',\n\t cls : 'ui-button-icon-plain',\n\t onclick : function() {\n\t if (options.ondel) {\n\t options.ondel();\n\t }\n\t }\n\t });\n\t var portlet = new Portlet.View({\n\t id : options.id,\n\t title : 'placeholder',\n\t cls : 'ui-portlet-repeat',\n\t operations : {\n\t button_delete : button_delete\n\t }\n\t });\n\t portlet.append(options.$el);\n\t portlet.$el.addClass('section-row');\n\t this.list[options.id] = portlet;\n\t this.table.add(portlet.$el);\n\t this.table.append('row_' + options.id, true);\n\t if (this.options.max > 0 && this.n >= this.options.max) {\n\t this.button_new.disable();\n\t }\n\t this._refresh();\n\t },\n\t\n\t /** Delete repeat block\n\t */\n\t del: function(id) {\n\t if (!this.list[id]) {\n\t Galaxy.emit.debug('form-repeat::del()', 'Invalid repeat block id.');\n\t return;\n\t }\n\t this.n--;\n\t var table_row = this.table.get('row_' + id);\n\t table_row.remove();\n\t delete this.list[id];\n\t this.button_new.enable();\n\t this._refresh();\n\t },\n\t\n\t /** Hides add/del options\n\t */\n\t hideOptions: function() {\n\t this.button_new.$el.hide();\n\t _.each( this.list, function( portlet ) {\n\t portlet.hideOperation('button_delete');\n\t });\n\t if( _.isEmpty( this.list ) ) {\n\t this.$el.append( $('
                    ').addClass( 'ui-form-info' ).html( this.options.empty_text ) );\n\t }\n\t },\n\t\n\t /** Refresh view\n\t */\n\t _refresh: function() {\n\t var index = 0;\n\t for (var id in this.list) {\n\t var portlet = this.list[id];\n\t portlet.title(++index + ': ' + this.options.title);\n\t if (this.n > this.options.min) {\n\t portlet.showOperation('button_delete');\n\t } else {\n\t portlet.hideOperation('button_delete');\n\t }\n\t }\n\t }\n\t});\n\t\n\treturn {\n\t View : View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 42 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, jQuery, _, $) {/**\n\t This class creates a form section and populates it with input elements. It also handles repeat blocks and conditionals by recursively creating new sub sections.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4),\n\t __webpack_require__(17),\n\t __webpack_require__(7),\n\t __webpack_require__(11),\n\t __webpack_require__(41),\n\t __webpack_require__(39),\n\t __webpack_require__(40)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Table, Ui, Portlet, Repeat, InputElement, Parameters) {\n\t var View = Backbone.View.extend({\n\t initialize: function(app, options) {\n\t this.app = app;\n\t this.inputs = options.inputs;\n\t\n\t // fix table style\n\t options.cls = 'ui-table-plain';\n\t\n\t // add table class for tr tag\n\t // this assist in transforming the form into a json structure\n\t options.cls_tr = 'section-row';\n\t\n\t // create/render views\n\t this.table = new Table.View(options);\n\t this.parameters = new Parameters(app, options);\n\t this.setElement(this.table.$el);\n\t this.render();\n\t },\n\t\n\t /** Render section view\n\t */\n\t render: function() {\n\t this.table.delAll();\n\t for (var i in this.inputs) {\n\t this.add(this.inputs[i]);\n\t }\n\t },\n\t\n\t /** Add a new input element\n\t */\n\t add: function(input) {\n\t var self = this;\n\t var input_def = jQuery.extend(true, {}, input);\n\t input_def.id = input.id = Utils.uid();\n\t\n\t // add to sequential list of inputs\n\t this.app.input_list[input_def.id] = input_def;\n\t\n\t // identify field type\n\t var type = input_def.type;\n\t switch(type) {\n\t case 'conditional':\n\t this._addConditional(input_def);\n\t break;\n\t case 'repeat':\n\t this._addRepeat(input_def);\n\t break;\n\t case 'section':\n\t this._addSection(input_def);\n\t break;\n\t default:\n\t this._addRow(input_def);\n\t }\n\t },\n\t\n\t /** Add a conditional block\n\t */\n\t _addConditional: function(input_def) {\n\t var self = this;\n\t input_def.test_param.id = input_def.id;\n\t this.app.options.sustain_conditionals && ( input_def.test_param.disabled = true );\n\t var field = this._addRow( input_def.test_param );\n\t\n\t // set onchange event for test parameter\n\t field.options.onchange = function(value) {\n\t var selectedCase = self.app.data.matchCase(input_def, value);\n\t for (var i in input_def.cases) {\n\t var case_def = input_def.cases[i];\n\t var section_id = input_def.id + '-section-' + i;\n\t var section_row = self.table.get(section_id);\n\t var nonhidden = false;\n\t for (var j in case_def.inputs) {\n\t if (!case_def.inputs[j].hidden) {\n\t nonhidden = true;\n\t break;\n\t }\n\t }\n\t if (i == selectedCase && nonhidden) {\n\t section_row.fadeIn('fast');\n\t } else {\n\t section_row.hide();\n\t }\n\t }\n\t self.app.trigger('change');\n\t };\n\t\n\t // add conditional sub sections\n\t for (var i in input_def.cases) {\n\t var sub_section_id = input_def.id + '-section-' + i;\n\t var sub_section = new View(this.app, {\n\t inputs : input_def.cases[i].inputs\n\t });\n\t sub_section.$el.addClass('ui-table-section');\n\t this.table.add(sub_section.$el);\n\t this.table.append(sub_section_id);\n\t }\n\t\n\t // trigger refresh on conditional input field after all input elements have been created\n\t field.trigger('change');\n\t },\n\t\n\t /** Add a repeat block\n\t */\n\t _addRepeat: function(input_def) {\n\t var self = this;\n\t var block_index = 0;\n\t\n\t // create repeat block element\n\t var repeat = new Repeat.View({\n\t title : input_def.title || 'Repeat',\n\t title_new : input_def.title || '',\n\t min : input_def.min,\n\t max : input_def.max,\n\t onnew : function() {\n\t create(input_def.inputs);\n\t self.app.trigger('change');\n\t }\n\t });\n\t\n\t // helper function to create new repeat blocks\n\t function create (inputs) {\n\t var sub_section_id = input_def.id + '-section-' + (block_index++);\n\t var sub_section = new View(self.app, {\n\t inputs : inputs\n\t });\n\t repeat.add({\n\t id : sub_section_id,\n\t $el : sub_section.$el,\n\t ondel : function() {\n\t repeat.del(sub_section_id);\n\t self.app.trigger('change');\n\t }\n\t });\n\t }\n\t\n\t //\n\t // add parsed/minimum number of repeat blocks\n\t //\n\t var n_cache = _.size( input_def.cache );\n\t for ( var i = 0; i < Math.max( Math.max( n_cache, input_def.min ), input_def.default ); i++ ) {\n\t create( i < n_cache ? input_def.cache[ i ] : input_def.inputs );\n\t }\n\t\n\t // hide options\n\t this.app.options.sustain_repeats && repeat.hideOptions();\n\t\n\t // create input field wrapper\n\t var input_element = new InputElement(this.app, {\n\t label : input_def.title || input_def.name,\n\t help : input_def.help,\n\t field : repeat\n\t });\n\t this.table.add(input_element.$el);\n\t this.table.append(input_def.id);\n\t },\n\t\n\t /** Add a customized section\n\t */\n\t _addSection: function(input_def) {\n\t var self = this;\n\t\n\t // create sub section\n\t var sub_section = new View(self.app, {\n\t inputs : input_def.inputs\n\t });\n\t\n\t // delete button\n\t var button_visible = new Ui.ButtonIcon({\n\t icon : 'fa-eye-slash',\n\t tooltip : 'Show/hide section',\n\t cls : 'ui-button-icon-plain'\n\t });\n\t\n\t // create portlet for sub section\n\t var portlet = new Portlet.View({\n\t title : input_def.title || input_def.name,\n\t cls : 'ui-portlet-section',\n\t collapsible : true,\n\t collapsed : true,\n\t operations : {\n\t button_visible: button_visible\n\t }\n\t });\n\t portlet.append( sub_section.$el );\n\t portlet.append( $( '
                    ' ).addClass( 'ui-form-info' ).html( input_def.help ) );\n\t portlet.setOperation( 'button_visible', function() {\n\t if( portlet.collapsed ) {\n\t portlet.expand();\n\t } else {\n\t portlet.collapse();\n\t }\n\t });\n\t\n\t // add expansion event handler\n\t portlet.on( 'expanded', function() {\n\t button_visible.setIcon( 'fa-eye' );\n\t });\n\t portlet.on( 'collapsed', function() {\n\t button_visible.setIcon( 'fa-eye-slash' );\n\t });\n\t this.app.on( 'expand', function( input_id ) {\n\t ( portlet.$( '#' + input_id ).length > 0 ) && portlet.expand();\n\t });\n\t\n\t // show sub section if requested\n\t input_def.expanded && portlet.expand();\n\t\n\t // create table row\n\t this.table.add(portlet.$el);\n\t this.table.append(input_def.id);\n\t },\n\t\n\t /** Add a single input field element\n\t */\n\t _addRow: function(input_def) {\n\t var id = input_def.id;\n\t var field = this.parameters.create(input_def);\n\t this.app.field_list[id] = field;\n\t var input_element = new InputElement(this.app, {\n\t name : input_def.name,\n\t label : input_def.label || input_def.name,\n\t value : input_def.value,\n\t default_value : input_def.default_value,\n\t text_value : input_def.text_value || input_def.value,\n\t collapsible_value : input_def.collapsible_value,\n\t collapsible_preview : input_def.collapsible_preview,\n\t help : input_def.help,\n\t argument : input_def.argument,\n\t disabled : input_def.disabled,\n\t field : field\n\t });\n\t this.app.element_list[id] = input_element;\n\t this.table.add(input_element.$el);\n\t this.table.append(id);\n\t input_def.hidden && this.table.get(id).hide();\n\t return field;\n\t }\n\t });\n\t\n\t return {\n\t View: View\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 43 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(7), __webpack_require__(31)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Ui, Tabs) {\n\t// hda/hdca content selector ui element\n\tvar View = Backbone.View.extend({\n\t // initialize\n\t initialize : function(app, options) {\n\t // link app and options\n\t this.app = app;\n\t this.options = options;\n\t\n\t // track current history elements\n\t this.history = {};\n\t\n\t\n\t // link this\n\t var self = this;\n\t\n\t // add element\n\t this.setElement('
                    ');\n\t\n\t // list of select fieldsFormSection\n\t this.list = {};\n\t\n\t // radio button options\n\t var radio_buttons = [];\n\t\n\t // identify selector type\n\t if (options.type == 'data_collection') {\n\t this.mode = 'collection';\n\t } else {\n\t if (options.multiple) {\n\t this.mode = 'multiple';\n\t } else {\n\t this.mode = 'single';\n\t }\n\t }\n\t\n\t // set initial state\n\t this.current = this.mode;\n\t this.list = {};\n\t\n\t // error messages\n\t var extensions = Utils.textify(options.extensions);\n\t var hda_error = 'No dataset available.';\n\t if (extensions) {\n\t hda_error = 'No ' + extensions + ' dataset available.';\n\t }\n\t var hdca_error = 'No dataset list available.';\n\t if (extensions) {\n\t hdca_error = 'No ' + extensions + ' dataset collection available.';\n\t }\n\t\n\t // add single dataset selector\n\t if (this.mode == 'single') {\n\t radio_buttons.push({\n\t icon : 'fa-file-o',\n\t value : 'single',\n\t tooltip : 'Single dataset'\n\t });\n\t this.select_single = new Ui.Select.View({\n\t optional : options.optional,\n\t error_text : hda_error,\n\t onchange : function() {\n\t self.trigger('change');\n\t }\n\t });\n\t this.list['single'] = {\n\t field: this.select_single,\n\t type : 'hda'\n\t };\n\t }\n\t\n\t // add multiple dataset selector\n\t if (this.mode == 'single' || this.mode == 'multiple') {\n\t radio_buttons.push({\n\t icon : 'fa-files-o',\n\t value : 'multiple',\n\t tooltip : 'Multiple datasets'\n\t });\n\t this.select_multiple = new Ui.Select.View({\n\t multiple : true,\n\t searchable : false,\n\t optional : options.optional,\n\t error_text : hda_error,\n\t onchange : function() {\n\t self.trigger('change');\n\t }\n\t });\n\t this.list['multiple'] = {\n\t field: this.select_multiple,\n\t type : 'hda'\n\t };\n\t }\n\t\n\t // add collection selector\n\t if (this.mode == 'single' || this.mode == 'multiple' || this.mode == 'collection') {\n\t radio_buttons.push({\n\t icon : 'fa-folder-o',\n\t value : 'collection',\n\t tooltip : 'Dataset collection'\n\t });\n\t var multiple = this.mode == 'multiple';\n\t this.select_collection = new Ui.Select.View({\n\t error_text : hdca_error,\n\t multiple : multiple,\n\t searchable : false,\n\t optional : options.optional,\n\t onchange : function() {\n\t self.trigger('change');\n\t }\n\t });\n\t this.list['collection'] = {\n\t field: this.select_collection,\n\t type : 'hdca'\n\t };\n\t }\n\t\n\t // create button\n\t this.button_type = new Ui.RadioButton.View({\n\t value : this.current,\n\t data : radio_buttons,\n\t onchange: function(value) {\n\t self.current = value;\n\t self.refresh();\n\t self.trigger('change');\n\t }\n\t });\n\t\n\t // add batch mode information\n\t this.$batch = $(this.template_batch());\n\t\n\t // number of radio buttons\n\t var n_buttons = _.size(this.list);\n\t\n\t // add button to dom\n\t var button_width = 0;\n\t if (n_buttons > 1) {\n\t this.$el.append(this.button_type.$el);\n\t button_width = Math.max(0, _.size(this.list) * 35) + 'px';\n\t }\n\t\n\t // append field elements\n\t for (var i in this.list) {\n\t this.$el.append(this.list[i].field.$el.css({\n\t 'margin-left': button_width\n\t }));\n\t }\n\t\n\t // append batch message\n\t this.$el.append(this.$batch.css({\n\t 'margin-left': button_width\n\t }));\n\t\n\t // update options\n\t this.update(options.data);\n\t\n\t // set initial value\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t\n\t // refresh view\n\t this.refresh();\n\t\n\t // add change event. fires on trigger\n\t this.on('change', function() {\n\t if (options.onchange) {\n\t options.onchange(self.value());\n\t }\n\t });\n\t },\n\t\n\t /** Indicate that select fields are being updated */\n\t wait: function() {\n\t for (var i in this.list) {\n\t this.list[i].field.wait();\n\t }\n\t },\n\t\n\t /** Indicate that the options update has been completed */\n\t unwait: function() {\n\t for (var i in this.list) {\n\t this.list[i].field.unwait();\n\t }\n\t },\n\t\n\t /** Update content selector */\n\t update: function(options) {\n\t // update a particular select field\n\t var self = this;\n\t function _update(field, options) {\n\t if (field) {\n\t // identify available options\n\t var select_options = [];\n\t for (var i in options) {\n\t var item = options[i];\n\t select_options.push({\n\t hid : item.hid,\n\t label: item.hid + ': ' + item.name,\n\t value: item.id\n\t });\n\t // backup to local history\n\t self.history[item.id + '_' + item.src] = item;\n\t }\n\t // update field\n\t field.add( select_options, function( a, b ) { return b.hid - a.hid } );\n\t }\n\t }\n\t\n\t // update available options\n\t _update(this.select_single, options.hda);\n\t _update(this.select_multiple, options.hda);\n\t _update(this.select_collection, options.hdca);\n\t },\n\t\n\t /** Return the currently selected dataset values */\n\t value : function (new_value) {\n\t // update current value\n\t if (new_value !== undefined) {\n\t if (new_value && new_value.values) {\n\t try {\n\t // create list with values\n\t var list = [];\n\t for (var i in new_value.values) {\n\t list.push(new_value.values[i].id);\n\t }\n\t\n\t // identify suitable select field\n\t if (new_value && new_value.values.length > 0 && new_value.values[0].src == 'hdca') {\n\t this.current = 'collection';\n\t this.select_collection.value(list);\n\t } else {\n\t if (this.mode == 'multiple') {\n\t this.current = 'multiple';\n\t this.select_multiple.value(list);\n\t } else {\n\t this.current = 'single';\n\t this.select_single.value(list[0]);\n\t }\n\t }\n\t } catch (err) {\n\t Galaxy.emit.debug('tools-select-content::value()', 'Skipped.');\n\t }\n\t } else {\n\t for (var i in this.list) {\n\t this.list[i].field.value(null);\n\t }\n\t }\n\t }\n\t\n\t // refresh view\n\t this.refresh();\n\t\n\t // validate value\n\t var id_list = this._select().value();\n\t if (id_list === null) {\n\t return null;\n\t }\n\t\n\t // transform into an array\n\t if (!(id_list instanceof Array)) {\n\t id_list = [id_list];\n\t }\n\t\n\t // check if value exists\n\t if (id_list.length === 0) {\n\t return null;\n\t }\n\t\n\t // prepare result dict\n\t var result = {\n\t batch : this._batch(),\n\t values : []\n\t }\n\t\n\t // append to dataset ids\n\t for (var i in id_list) {\n\t var details = this.history[id_list[i] + '_' + this.list[this.current].type];\n\t if (details) {\n\t result.values.push(details);\n\t } else {\n\t return null;\n\t }\n\t }\n\t\n\t // sort by history ids\n\t result.values.sort(function(a, b){\n\t return a.hid - b.hid;\n\t });\n\t\n\t // return\n\t return result;\n\t },\n\t\n\t /** Refreshes data selection view */\n\t refresh: function() {\n\t this.button_type.value(this.current);\n\t for (var i in this.list) {\n\t var $el = this.list[i].field.$el;\n\t if (this.current == i) {\n\t $el.show();\n\t } else {\n\t $el.hide();\n\t }\n\t }\n\t if (this._batch()) {\n\t this.$batch.show();\n\t } else {\n\t this.$batch.hide();\n\t }\n\t },\n\t\n\t /** Assists in selecting the current field */\n\t _select: function() {\n\t return this.list[this.current].field;\n\t },\n\t\n\t /** Assists in identifying the batch mode */\n\t _batch: function() {\n\t if (this.current == 'collection') {\n\t var hdca = this.history[this._select().value() + '_hdca'];\n\t if (hdca && hdca.map_over_type) {\n\t return true;\n\t }\n\t }\n\t if (this.current != 'single') {\n\t if (this.mode == 'single') {\n\t return true;\n\t }\n\t }\n\t return false;\n\t },\n\t\n\t /** Batch message template */\n\t template_batch: function() {\n\t return '
                    ' +\n\t '' +\n\t 'This is a batch mode input field. A separate job will be triggered for each dataset.' +\n\t '
                    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 44 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {/**\n\t This is the main class of the form plugin. It is referenced as 'app' in all lower level modules.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(11), __webpack_require__(7), __webpack_require__(42), __webpack_require__(38)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Portlet, Ui, FormSection, FormData) {\n\t return Backbone.View.extend({\n\t initialize: function(options) {\n\t this.options = Utils.merge(options, {\n\t initial_errors : false,\n\t cls : 'ui-portlet-limited',\n\t icon : ''\n\t });\n\t this.modal = ( parent.Galaxy && parent.Galaxy.modal ) || new Ui.Modal.View();\n\t this.setElement('
                    ');\n\t this.render();\n\t },\n\t\n\t /** Update available options */\n\t update: function(new_model){\n\t var self = this;\n\t this.data.matchModel(new_model, function(input_id, node) {\n\t var input = self.input_list[input_id];\n\t if (input && input.options) {\n\t if (!_.isEqual(input.options, node.options)) {\n\t // backup new options\n\t input.options = node.options;\n\t\n\t // get/update field\n\t var field = self.field_list[input_id];\n\t if (field.update) {\n\t var new_options = [];\n\t if ((['data', 'data_collection', 'drill_down']).indexOf(input.type) != -1) {\n\t new_options = input.options;\n\t } else {\n\t for (var i in node.options) {\n\t var opt = node.options[i];\n\t if (opt.length > 2) {\n\t new_options.push({\n\t 'label': opt[0],\n\t 'value': opt[1]\n\t });\n\t }\n\t }\n\t }\n\t field.update(new_options);\n\t field.trigger('change');\n\t Galaxy.emit.debug('form-view::update()', 'Updating options for ' + input_id);\n\t }\n\t }\n\t }\n\t });\n\t },\n\t\n\t /** Set form into wait mode */\n\t wait: function(active) {\n\t for (var i in this.input_list) {\n\t var field = this.field_list[i];\n\t var input = this.input_list[i];\n\t if (input.is_dynamic && field.wait && field.unwait) {\n\t if (active) {\n\t field.wait();\n\t } else {\n\t field.unwait();\n\t }\n\t }\n\t }\n\t },\n\t\n\t /** Highlight and scroll to input element (currently only used for error notifications)\n\t */\n\t highlight: function (input_id, message, silent) {\n\t // get input field\n\t var input_element = this.element_list[input_id];\n\t\n\t // check input element\n\t if (input_element) {\n\t // mark error\n\t input_element.error(message || 'Please verify this parameter.');\n\t\n\t // trigger expand event for parent containers\n\t this.trigger('expand', input_id);\n\t\n\t // scroll to first input element\n\t if (!silent) {\n\t if (self==top) {\n\t var $panel = this.$el.parents().filter(function() {\n\t return $(this).css('overflow') == 'auto';\n\t }).first();\n\t $panel.animate({ scrollTop : $panel.scrollTop() + input_element.$el.offset().top - 50 }, 500);\n\t } else {\n\t $('html, body').animate({ scrollTop : input_element.$el.offset().top - 20 }, 500);\n\t }\n\t }\n\t }\n\t },\n\t\n\t /** Highlights errors\n\t */\n\t errors: function(options) {\n\t // hide previous error statements\n\t this.trigger('reset');\n\t\n\t // highlight all errors\n\t if (options && options.errors) {\n\t var error_messages = this.data.matchResponse(options.errors);\n\t for (var input_id in this.element_list) {\n\t var input = this.element_list[input_id];\n\t if (error_messages[input_id]) {\n\t this.highlight(input_id, error_messages[input_id], true);\n\t }\n\t }\n\t }\n\t },\n\t\n\t /** Render tool form\n\t */\n\t render: function() {\n\t // link this\n\t var self = this;\n\t\n\t // reset events\n\t this.off('change');\n\t this.off('reset');\n\t\n\t // reset field list, which contains the input field elements\n\t this.field_list = {};\n\t\n\t // reset sequential input definition list, which contains the input definitions as provided from the api\n\t this.input_list = {};\n\t\n\t // reset input element list, which contains the dom elements of each input element (includes also the input field)\n\t this.element_list = {};\n\t\n\t // creates a json data structure from the input form\n\t this.data = new FormData.Manager(this);\n\t\n\t // create ui elements\n\t this._renderForm();\n\t\n\t // refresh data\n\t this.data.create();\n\t\n\t // show errors on startup\n\t if (this.options.initial_errors) {\n\t this.errors(this.options);\n\t }\n\t\n\t // add listener which triggers on checksum change\n\t var current_check = this.data.checksum();\n\t this.on('change', function() {\n\t var new_check = self.data.checksum();\n\t if (new_check != current_check) {\n\t current_check = new_check;\n\t self.options.onchange && self.options.onchange();\n\t }\n\t });\n\t\n\t // add reset listener\n\t this.on('reset', function() {\n\t for (var i in this.element_list) {\n\t this.element_list[i].reset();\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t /** Renders the UI elements required for the form\n\t */\n\t _renderForm: function() {\n\t // create message view\n\t this.message = new Ui.Message();\n\t\n\t // create tool form section\n\t this.section = new FormSection.View(this, {\n\t inputs : this.options.inputs\n\t });\n\t\n\t // remove tooltips\n\t $( '.tooltip' ).remove();\n\t\n\t // create portlet\n\t this.portlet = new Portlet.View({\n\t icon : this.options.icon,\n\t title : this.options.title,\n\t cls : this.options.cls,\n\t operations : this.options.operations,\n\t buttons : this.options.buttons,\n\t collapsible : this.options.collapsible,\n\t collapsed : this.options.collapsed\n\t });\n\t\n\t // append message\n\t this.portlet.append(this.message.$el.addClass('ui-margin-top'));\n\t\n\t // append tool section\n\t this.portlet.append(this.section.$el);\n\t\n\t // start form\n\t this.$el.empty();\n\t this.$el.append(this.portlet.$el);\n\t\n\t // show message if available in model\n\t if (this.options.message) {\n\t this.message.update({\n\t persistent : true,\n\t status : 'warning',\n\t message : this.options.message\n\t });\n\t }\n\t\n\t // log\n\t Galaxy.emit.debug('form-view::initialize()', 'Completed');\n\t }\n\t });\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(35),\n\t __webpack_require__(46),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DC_MODEL, HISTORY_CONTENT, _l ){\n\t/*==============================================================================\n\t\n\tModels for DatasetCollections contained within a history.\n\t\n\tTODO:\n\t these might be compactable to one class if some duplication with\n\t collection-model is used.\n\t\n\t==============================================================================*/\n\tvar hcontentMixin = HISTORY_CONTENT.HistoryContentMixin,\n\t ListDC = DC_MODEL.ListDatasetCollection,\n\t PairDC = DC_MODEL.PairDatasetCollection,\n\t ListPairedDC = DC_MODEL.ListPairedDatasetCollection;\n\t\n\t//==============================================================================\n\t/** Override to post to contents route w/o id. */\n\tfunction buildHDCASave( _super ){\n\t return function _save( attributes, options ){\n\t if( this.isNew() ){\n\t options = options || {};\n\t options.url = this.urlRoot + this.get( 'history_id' ) + '/contents';\n\t attributes = attributes || {};\n\t attributes.type = 'dataset_collection';\n\t }\n\t return _super.call( this, attributes, options );\n\t };\n\t}\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for List Dataset Collection within a History.\n\t */\n\tvar HistoryListDatasetCollection = ListDC.extend( hcontentMixin ).extend(\n\t/** @lends HistoryListDatasetCollection.prototype */{\n\t\n\t defaults : _.extend( _.clone( ListDC.prototype.defaults ), {\n\t history_content_type: 'dataset_collection',\n\t collection_type : 'list',\n\t model_class : 'HistoryDatasetCollectionAssociation'\n\t }),\n\t\n\t initialize : function( model, options ){\n\t ListDC.prototype.initialize.call( this, model, options );\n\t hcontentMixin.initialize.call( this, model, options );\n\t },\n\t\n\t /** Override to post to contents route w/o id. */\n\t save : buildHDCASave( ListDC.prototype.save ),\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'HistoryListDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for Pair Dataset Collection within a History.\n\t * @constructs\n\t */\n\tvar HistoryPairDatasetCollection = PairDC.extend( hcontentMixin ).extend(\n\t/** @lends HistoryPairDatasetCollection.prototype */{\n\t\n\t defaults : _.extend( _.clone( PairDC.prototype.defaults ), {\n\t history_content_type: 'dataset_collection',\n\t collection_type : 'paired',\n\t model_class : 'HistoryDatasetCollectionAssociation'\n\t }),\n\t\n\t initialize : function( model, options ){\n\t PairDC.prototype.initialize.call( this, model, options );\n\t hcontentMixin.initialize.call( this, model, options );\n\t },\n\t\n\t /** Override to post to contents route w/o id. */\n\t save : buildHDCASave( PairDC.prototype.save ),\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'HistoryPairDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone model for List of Pairs Dataset Collection within a History.\n\t * @constructs\n\t */\n\tvar HistoryListPairedDatasetCollection = ListPairedDC.extend( hcontentMixin ).extend(\n\t/** @lends HistoryListPairedDatasetCollection.prototype */{\n\t\n\t defaults : _.extend( _.clone( ListPairedDC.prototype.defaults ), {\n\t history_content_type: 'dataset_collection',\n\t collection_type : 'list:paired',\n\t model_class : 'HistoryDatasetCollectionAssociation'\n\t }),\n\t\n\t initialize : function( model, options ){\n\t ListPairedDC.prototype.initialize.call( this, model, options );\n\t hcontentMixin.initialize.call( this, model, options );\n\t },\n\t\n\t /** Override to post to contents route w/o id. */\n\t save : buildHDCASave( ListPairedDC.prototype.save ),\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'HistoryListPairedDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HistoryListDatasetCollection : HistoryListDatasetCollection,\n\t HistoryPairDatasetCollection : HistoryPairDatasetCollection,\n\t HistoryListPairedDatasetCollection : HistoryListPairedDatasetCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(15),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( STATES, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'history';\n\t//==============================================================================\n\t/** How the type_id attribute is built for the history's mixed contents collection */\n\tvar typeIdStr = function _typeIdStr( type, id ){\n\t return [ type, id ].join( '-' );\n\t};\n\t\n\t//==============================================================================\n\t/** @class Mixin for HistoryContents content (HDAs, HDCAs).\n\t */\n\tvar HistoryContentMixin = {\n\t//TODO:?? into true Backbone.Model?\n\t\n\t /** default attributes for a model */\n\t defaults : {\n\t /** parent (containing) history */\n\t history_id : null,\n\t /** some content_type (HistoryContents can contain mixed model classes) */\n\t history_content_type: null,\n\t /** indicating when/what order the content was generated in the context of the history */\n\t hid : null,\n\t /** whether the user wants the content shown (visible) */\n\t visible : true\n\t },\n\t\n\t // ........................................................................ mixed content element\n\t//TODO: there's got to be a way to move this into HistoryContents - if we can do that, this class might not be needed\n\t // In order to be part of a MIXED bbone collection, we can't rely on the id\n\t // (which may collide btwn models of different classes)\n\t // Build a new id (type_id) that prefixes the history_content_type so the bbone collection can differentiate\n\t idAttribute : 'type_id',\n\t\n\t /** override constructor to build type_id and insert into original attributes */\n\t constructor : function( attrs, options ){\n\t attrs.type_id = typeIdStr( attrs.history_content_type, attrs.id );\n\t this.debug( 'HistoryContentMixin.constructor:', attrs.type_id );\n\t Backbone.Model.apply( this, arguments );\n\t },\n\t\n\t /** object level fn for building the type_id string */\n\t _typeIdStr : function(){\n\t return typeIdStr( this.get( 'history_content_type' ), this.get( 'id' ) );\n\t },\n\t\n\t /** add listener to re-create type_id when the id changes */\n\t initialize : function( attrs, options ){\n\t this.on( 'change:id', this._createTypeId );\n\t },\n\t\n\t /** set the type_id in the model attributes */\n\t _createTypeId : function(){\n\t this.set( 'type_id', this._typeIdStr() );\n\t },\n\t\n\t /** override because backbone tests boolean( idAttribute ), but it's not an empty string even for new models\n\t * due to our use of type_id.\n\t */\n\t isNew : function(){\n\t return !this.get( 'id' );\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** the more common alias of visible */\n\t hidden : function(){\n\t return !this.get( 'visible' );\n\t },\n\t\n\t /** based on show_deleted, show_hidden (gen. from the container control),\n\t * would this ds show in the list of ds's?\n\t * @param {Boolean} show_deleted are we showing deleted hdas?\n\t * @param {Boolean} show_hidden are we showing hidden hdas?\n\t */\n\t isVisible : function( show_deleted, show_hidden ){\n\t//TODO:?? Another unfortunate name collision\n\t var isVisible = true;\n\t if( ( !show_deleted )\n\t && ( this.get( 'deleted' ) || this.get( 'purged' ) ) ){\n\t isVisible = false;\n\t }\n\t if( ( !show_hidden )\n\t && ( !this.get( 'visible' ) ) ){\n\t isVisible = false;\n\t }\n\t return isVisible;\n\t },\n\t\n\t // ........................................................................ ajax\n\t//TODO: global\n\t//TODO: these are probably better done on the leaf classes\n\t /** history content goes through the 'api/histories' API */\n\t urlRoot: Galaxy.root + 'api/histories/',\n\t\n\t /** full url spec. for this content */\n\t url : function(){\n\t var url = this.urlRoot + this.get( 'history_id' ) + '/contents/'\n\t + this.get('history_content_type') + 's/' + this.get( 'id' );\n\t return url;\n\t },\n\t\n\t /** save this content as not visible */\n\t hide : function( options ){\n\t if( !this.get( 'visible' ) ){ return jQuery.when(); }\n\t return this.save( { visible: false }, options );\n\t },\n\t /** save this content as visible */\n\t unhide : function( options ){\n\t if( this.get( 'visible' ) ){ return jQuery.when(); }\n\t return this.save( { visible: true }, options );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** String representation */\n\t toString : function(){\n\t var nameAndId = this.get( 'id' ) || '';\n\t if( this.get( 'name' ) ){\n\t nameAndId = this.get( 'hid' ) + ' :\"' + this.get( 'name' ) + '\",' + nameAndId;\n\t }\n\t return 'HistoryContent(' + nameAndId + ')';\n\t }\n\t};\n\t\n\t\n\t//==============================================================================\n\t//TODO: needed?\n\t/** @class (Concrete/non-mixin) base model for content items.\n\t */\n\tvar HistoryContent = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( HistoryContentMixin )\n\t .extend({ _logNamespace : logNamespace });\n\t\n\t\n\t//==============================================================================\n\t return {\n\t typeIdStr : typeIdStr,\n\t HistoryContentMixin : HistoryContentMixin,\n\t HistoryContent : HistoryContent\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(46),\n\t __webpack_require__(97),\n\t __webpack_require__(45),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HISTORY_CONTENT, HDA_MODEL, HDCA_MODEL, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'history';\n\t//==============================================================================\n\t/** @class Backbone collection for history content.\n\t * NOTE: history content seems like a dataset collection, but differs in that it is mixed:\n\t * each element can be either an HDA (dataset) or a DatasetCollection and co-exist on\n\t * the same level.\n\t * Dataset collections on the other hand are not mixed and (so far) can only contain either\n\t * HDAs or child dataset collections on one level.\n\t * This is why this does not inherit from any of the DatasetCollections (currently).\n\t */\n\tvar HistoryContents = Backbone.Collection\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend(/** @lends HistoryContents.prototype */{\n\t//TODO:?? may want to inherit from some MixedModelCollection\n\t//TODO:?? also consider inheriting from a 'DatasetList'\n\t//TODO: can we decorate the mixed models using the model fn below (instead of having them build their own type_id)?\n\t\n\t _logNamespace : logNamespace,\n\t\n\t /** since history content is a mix, override model fn into a factory, creating based on history_content_type */\n\t model : function( attrs, options ) {\n\t//TODO: can we move the type_id stuff here?\n\t //attrs.type_id = typeIdStr( attrs );\n\t\n\t if( attrs.history_content_type === \"dataset\" ) {\n\t return new HDA_MODEL.HistoryDatasetAssociation( attrs, options );\n\t\n\t } else if( attrs.history_content_type === \"dataset_collection\" ) {\n\t switch( attrs.collection_type ){\n\t case 'list':\n\t return new HDCA_MODEL.HistoryListDatasetCollection( attrs, options );\n\t case 'paired':\n\t return new HDCA_MODEL.HistoryPairDatasetCollection( attrs, options );\n\t case 'list:paired':\n\t return new HDCA_MODEL.HistoryListPairedDatasetCollection( attrs, options );\n\t }\n\t // This is a hack inside a hack:\n\t // Raise a plain object with validationError to fake a model.validationError\n\t // (since we don't have a model to use validate with)\n\t // (the outer hack being the mixed content/model function in this collection)\n\t return { validationError : 'Unknown collection_type: ' + attrs.history_content_type };\n\t }\n\t return { validationError : 'Unknown history_content_type: ' + attrs.history_content_type };\n\t },\n\t\n\t /** Set up.\n\t * @see Backbone.Collection#initialize\n\t */\n\t initialize : function( models, options ){\n\t options = options || {};\n\t//TODO: could probably use the contents.history_id instead\n\t this.historyId = options.historyId;\n\t //this._setUpListeners();\n\t\n\t // backbonejs uses collection.model.prototype.idAttribute to determine if a model is *already* in a collection\n\t // and either merged or replaced. In this case, our 'model' is a function so we need to add idAttribute\n\t // manually here - if we don't, contents will not merge but be replaced/swapped.\n\t this.model.prototype.idAttribute = 'type_id';\n\t\n\t this.on( 'all', function(){\n\t this.debug( this + '.event:', arguments );\n\t });\n\t },\n\t\n\t /** root api url */\n\t urlRoot : Galaxy.root + 'api/histories',\n\t /** complete api url */\n\t url : function(){\n\t return this.urlRoot + '/' + this.historyId + '/contents';\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** Get the ids of every item in this collection\n\t * @returns array of encoded ids\n\t */\n\t ids : function(){\n\t//TODO: is this still useful since type_id\n\t return this.map( function( item ){ return item.get('id'); });\n\t },\n\t\n\t /** Get contents that are not ready\n\t * @returns array of content models\n\t */\n\t notReady : function(){\n\t return this.filter( function( content ){\n\t return !content.inReadyState();\n\t });\n\t },\n\t\n\t /** Get the id of every model in this collection not in a 'ready' state (running).\n\t * @returns an array of model ids\n\t * @see HistoryDatasetAssociation#inReadyState\n\t */\n\t running : function(){\n\t var idList = [];\n\t this.each( function( item ){\n\t var isRunning = !item.inReadyState();\n\t if( isRunning ){\n\t//TODO: is this still correct since type_id\n\t idList.push( item.get( 'id' ) );\n\t }\n\t });\n\t return idList;\n\t },\n\t\n\t /** Get the model with the given hid\n\t * @param {Int} hid the hid to search for\n\t * @returns {HistoryDatasetAssociation} the model with the given hid or undefined if not found\n\t */\n\t getByHid : function( hid ){\n\t return _.first( this.filter( function( content ){ return content.get( 'hid' ) === hid; }) );\n\t },\n\t\n\t //TODO:?? this may belong in the containing view\n\t /** Get every 'shown' model in this collection based on show_deleted/hidden\n\t * @param {Boolean} show_deleted are we showing deleted content?\n\t * @param {Boolean} show_hidden are we showing hidden content?\n\t * @returns array of content models\n\t * @see HistoryDatasetAssociation#isVisible\n\t */\n\t getVisible : function( show_deleted, show_hidden, filters ){\n\t filters = filters || [];\n\t //this.debug( 'filters:', filters );\n\t // always filter by show deleted/hidden first\n\t this.debug( 'checking isVisible' );\n\t var filteredHdas = new HistoryContents( this.filter( function( item ){\n\t return item.isVisible( show_deleted, show_hidden );\n\t }));\n\t\n\t _.each( filters, function( filterFn ){\n\t if( !_.isFunction( filterFn ) ){ return; }\n\t filteredHdas = new HistoryContents( filteredHdas.filter( filterFn ) );\n\t });\n\t return filteredHdas;\n\t },\n\t\n\t /** return a new contents collection of only hidden items */\n\t hidden : function(){\n\t function filterFn( c ){ return c.hidden(); }\n\t return new HistoryContents( this.filter( filterFn ) );\n\t },\n\t\n\t /** return a new contents collection of only hidden items */\n\t deleted : function(){\n\t function filterFn( c ){ return c.get( 'deleted' ); }\n\t return new HistoryContents( this.filter( filterFn ) );\n\t },\n\t\n\t /** return true if any contents don't have details */\n\t haveDetails : function(){\n\t return this.all( function( content ){ return content.hasDetails(); });\n\t },\n\t\n\t // ........................................................................ ajax\n\t /** fetch detailed model data for all contents in this collection */\n\t fetchAllDetails : function( options ){\n\t options = options || {};\n\t var detailsFlag = { details: 'all' };\n\t options.data = ( options.data )?( _.extend( options.data, detailsFlag ) ):( detailsFlag );\n\t return this.fetch( options );\n\t },\n\t\n\t /** using a queue, perform ajaxFn on each of the models in this collection */\n\t ajaxQueue : function( ajaxFn, options ){\n\t var deferred = jQuery.Deferred(),\n\t startingLength = this.length,\n\t responses = [];\n\t\n\t if( !startingLength ){\n\t deferred.resolve([]);\n\t return deferred;\n\t }\n\t\n\t // use reverse order (stylistic choice)\n\t var ajaxFns = this.chain().reverse().map( function( content, i ){\n\t return function(){\n\t var xhr = ajaxFn.call( content, options );\n\t // if successful, notify using the deferred to allow tracking progress\n\t xhr.done( function( response ){\n\t deferred.notify({ curr: i, total: startingLength, response: response, model: content });\n\t });\n\t // (regardless of previous error or success) if not last ajax call, shift and call the next\n\t // if last fn, resolve deferred\n\t xhr.always( function( response ){\n\t responses.push( response );\n\t if( ajaxFns.length ){\n\t ajaxFns.shift()();\n\t } else {\n\t deferred.resolve( responses );\n\t }\n\t });\n\t };\n\t }).value();\n\t // start the queue\n\t ajaxFns.shift()();\n\t\n\t return deferred;\n\t },\n\t\n\t isCopyable : function( contentsJSON ){\n\t var copyableModelClasses = [\n\t 'HistoryDatasetAssociation',\n\t 'HistoryDatasetCollectionAssociation'\n\t ];\n\t return ( ( _.isObject( contentsJSON ) && contentsJSON.id )\n\t && ( _.contains( copyableModelClasses, contentsJSON.model_class ) ) );\n\t },\n\t\n\t /** copy an existing, accessible hda into this collection */\n\t copy : function( json ){\n\t var id, type, contentType;\n\t if( _.isString( json ) ){\n\t id = json;\n\t contentType = 'hda';\n\t type = 'dataset';\n\t } else {\n\t id = json.id;\n\t contentType = ({\n\t 'HistoryDatasetAssociation' : 'hda',\n\t 'LibraryDatasetDatasetAssociation' : 'ldda',\n\t 'HistoryDatasetCollectionAssociation' : 'hdca'\n\t })[ json.model_class ] || 'hda';\n\t type = ( contentType === 'hdca'? 'dataset_collection' : 'dataset' );\n\t }\n\t var collection = this,\n\t xhr = jQuery.post( this.url(), {\n\t content : id,\n\t source : contentType,\n\t type : type\n\t })\n\t .done( function( response ){\n\t collection.add([ response ]);\n\t })\n\t .fail( function( error, status, message ){\n\t collection.trigger( 'error', collection, xhr, {},\n\t 'Error copying contents', { type: type, id: id, source: contentType });\n\t });\n\t return xhr;\n\t },\n\t\n\t // ........................................................................ sorting/filtering\n\t /** return a new collection of contents whose attributes contain the substring matchesWhat */\n\t matches : function( matchesWhat ){\n\t return this.filter( function( content ){\n\t return content.matches( matchesWhat );\n\t });\n\t },\n\t\n\t // ........................................................................ misc\n\t /** override to ensure type id is set */\n\t set : function( models, options ){\n\t models = _.isArray( models )? models : [ models ];\n\t _.each( models, function( model ){\n\t if( !model.type_id || !model.get || !model.get( 'type_id' ) ){\n\t model.type_id = HISTORY_CONTENT.typeIdStr( model.history_content_type, model.id );\n\t }\n\t });\n\t Backbone.Collection.prototype.set.call( this, models, options );\n\t },\n\t\n\t /** */\n\t createHDCA : function( elementIdentifiers, collectionType, name, options ){\n\t //precondition: elementIdentifiers is an array of plain js objects\n\t // in the proper form to create the collectionType\n\t var contents = this,\n\t typeToModel = {\n\t list : HDCA_MODEL.HistoryListDatasetCollection,\n\t paired : HDCA_MODEL.HistoryPairDatasetCollection\n\t },\n\t hdca = new (typeToModel[ collectionType ])({\n\t history_id : this.historyId,\n\t name : name,\n\t // should probably be able to just send in a bunch of json here and restruct per class\n\t element_identifiers : elementIdentifiers\n\t });\n\t // do I even need to use new above, can I just pass the attrs here\n\t return hdca.save()\n\t .done( function( response ){\n\t contents.add( hdca );\n\t })\n\t .fail( function( xhr, status, message ){\n\t contents.trigger( 'error', xhr, status, message );\n\t });\n\t },\n\t\n\t\n\t /** In this override, copy the historyId to the clone */\n\t clone : function(){\n\t var clone = Backbone.Collection.prototype.clone.call( this );\n\t clone.historyId = this.historyId;\n\t return clone;\n\t },\n\t\n\t /** debugging */\n\t print : function(){\n\t var contents = this;\n\t contents.each( function( c ){\n\t contents.debug( c );\n\t if( c.elements ){\n\t contents.debug( '\\t elements:', c.elements );\n\t }\n\t });\n\t },\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'HistoryContents(', [ this.historyId, this.length ].join(), ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HistoryContents : HistoryContents\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'list';\n\t//==============================================================================\n\t/** A view which, when first rendered, shows only summary data/attributes, but\n\t * can be expanded to show further details (and optionally fetch those\n\t * details from the server).\n\t */\n\tvar ExpandableView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t//TODO: Although the reasoning behind them is different, this shares a lot with HiddenUntilActivated above: combine them\n\t //PRECONDITION: model must have method hasDetails\n\t //PRECONDITION: subclasses must have templates.el and templates.details\n\t\n\t initialize : function( attributes ){\n\t /** are the details of this view expanded/shown or not? */\n\t this.expanded = attributes.expanded || false;\n\t this.log( '\\t expanded:', this.expanded );\n\t this.fxSpeed = attributes.fxSpeed !== undefined? attributes.fxSpeed : this.fxSpeed;\n\t },\n\t\n\t // ........................................................................ render main\n\t /** jq fx speed */\n\t fxSpeed : 'fast',\n\t\n\t /** Render this content, set up ui.\n\t * @param {Number or String} speed the speed of the render\n\t */\n\t render : function( speed ){\n\t var $newRender = this._buildNewRender();\n\t this._setUpBehaviors( $newRender );\n\t this._queueNewRender( $newRender, speed );\n\t return this;\n\t },\n\t\n\t /** Build a temp div containing the new children for the view's $el.\n\t * If the view is already expanded, build the details as well.\n\t */\n\t _buildNewRender : function(){\n\t // create a new render using a skeleton template, render title buttons, render body, and set up events, etc.\n\t var $newRender = $( this.templates.el( this.model.toJSON(), this ) );\n\t if( this.expanded ){\n\t this.$details( $newRender ).replaceWith( this._renderDetails().show() );\n\t }\n\t return $newRender;\n\t },\n\t\n\t /** Fade out the old el, swap in the new contents, then fade in.\n\t * @param {Number or String} speed jq speed to use for rendering effects\n\t * @fires rendered when rendered\n\t */\n\t _queueNewRender : function( $newRender, speed ) {\n\t speed = ( speed === undefined )?( this.fxSpeed ):( speed );\n\t var view = this;\n\t\n\t $( view ).queue( 'fx', [\n\t function( next ){ this.$el.fadeOut( speed, next ); },\n\t function( next ){\n\t view._swapNewRender( $newRender );\n\t next();\n\t },\n\t function( next ){ this.$el.fadeIn( speed, next ); },\n\t function( next ){\n\t this.trigger( 'rendered', view );\n\t next();\n\t }\n\t ]);\n\t },\n\t\n\t /** empty out the current el, move the $newRender's children in */\n\t _swapNewRender : function( $newRender ){\n\t return this.$el.empty()\n\t .attr( 'class', _.isFunction( this.className )? this.className(): this.className )\n\t .append( $newRender.children() );\n\t },\n\t\n\t /** set up js behaviors, event handlers for elements within the given container\n\t * @param {jQuery} $container jq object that contains the elements to process (defaults to this.$el)\n\t */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t // set up canned behavior on children (bootstrap, popupmenus, editable_text, etc.)\n\t //make_popup_menus( $where );\n\t $where.find( '[title]' ).tooltip({ placement : 'bottom' });\n\t },\n\t\n\t // ......................................................................... details\n\t /** shortcut to details DOM (as jQ) */\n\t $details : function( $where ){\n\t $where = $where || this.$el;\n\t return $where.find( '> .details' );\n\t },\n\t\n\t /** build the DOM for the details and set up behaviors on it */\n\t _renderDetails : function(){\n\t var $newDetails = $( this.templates.details( this.model.toJSON(), this ) );\n\t this._setUpBehaviors( $newDetails );\n\t return $newDetails;\n\t },\n\t\n\t // ......................................................................... expansion/details\n\t /** Show or hide the details\n\t * @param {Boolean} expand if true, expand; if false, collapse\n\t */\n\t toggleExpanded : function( expand ){\n\t expand = ( expand === undefined )?( !this.expanded ):( expand );\n\t if( expand ){\n\t this.expand();\n\t } else {\n\t this.collapse();\n\t }\n\t return this;\n\t },\n\t\n\t /** Render and show the full, detailed body of this view including extra data and controls.\n\t * note: if the model does not have detailed data, fetch that data before showing the body\n\t * @fires expanded when a body has been expanded\n\t */\n\t expand : function(){\n\t var view = this;\n\t return view._fetchModelDetails().always( function(){\n\t view._expand();\n\t });\n\t },\n\t\n\t /** Check for model details and, if none, fetch them.\n\t * @returns {jQuery.promise} the model.fetch.xhr if details are being fetched, an empty promise if not\n\t */\n\t _fetchModelDetails : function(){\n\t if( !this.model.hasDetails() ){\n\t return this.model.fetch();\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t /** Inner fn called when expand (public) has fetched the details */\n\t _expand : function(){\n\t var view = this,\n\t $newDetails = view._renderDetails();\n\t view.$details().replaceWith( $newDetails );\n\t // needs to be set after the above or the slide will not show\n\t view.expanded = true;\n\t view.$details().slideDown({\n\t duration : view.fxSpeed,\n\t step: function(){\n\t view.trigger( 'expanding', view );\n\t },\n\t complete: function(){\n\t view.trigger( 'expanded', view );\n\t }\n\t });\n\t },\n\t\n\t /** Hide the body/details of an HDA.\n\t * @fires collapsed when a body has been collapsed\n\t */\n\t collapse : function(){\n\t this.debug( this + '(ExpandableView).collapse' );\n\t var view = this;\n\t view.expanded = false;\n\t this.$details().slideUp({\n\t duration : view.fxSpeed,\n\t step: function(){\n\t view.trigger( 'collapsing', view );\n\t },\n\t complete: function(){\n\t view.trigger( 'collapsed', view );\n\t }\n\t });\n\t }\n\t\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** A view that is displayed in some larger list/grid/collection.\n\t * Inherits from Expandable, Selectable, Draggable.\n\t * The DOM contains warnings, a title bar, and a series of primary action controls.\n\t * Primary actions are meant to be easily accessible item functions (such as delete)\n\t * that are rendered in the title bar.\n\t *\n\t * Details are rendered when the user clicks the title bar or presses enter/space when\n\t * the title bar is in focus.\n\t *\n\t * Designed as a base class for history panel contents - but usable elsewhere (I hope).\n\t */\n\tvar ListItemView = ExpandableView.extend(\n\t BASE_MVC.mixin( BASE_MVC.SelectableViewMixin, BASE_MVC.DraggableViewMixin, {\n\t\n\t//TODO: that's a little contradictory\n\t tagName : 'div',\n\t className : 'list-item',\n\t\n\t /** Set up the base class and all mixins */\n\t initialize : function( attributes ){\n\t ExpandableView.prototype.initialize.call( this, attributes );\n\t BASE_MVC.SelectableViewMixin.initialize.call( this, attributes );\n\t BASE_MVC.DraggableViewMixin.initialize.call( this, attributes );\n\t this._setUpListeners();\n\t },\n\t\n\t /** event listeners */\n\t _setUpListeners : function(){\n\t // hide the primary actions in the title bar when selectable and narrow\n\t this.on( 'selectable', function( isSelectable ){\n\t if( isSelectable ){\n\t this.$( '.primary-actions' ).hide();\n\t } else {\n\t this.$( '.primary-actions' ).show();\n\t }\n\t }, this );\n\t //this.on( 'all', function( event ){\n\t // this.log( event );\n\t //}, this );\n\t return this;\n\t },\n\t\n\t // ........................................................................ rendering\n\t /** In this override, call methods to build warnings, titlebar and primary actions */\n\t _buildNewRender : function(){\n\t var $newRender = ExpandableView.prototype._buildNewRender.call( this );\n\t $newRender.children( '.warnings' ).replaceWith( this._renderWarnings() );\n\t $newRender.children( '.title-bar' ).replaceWith( this._renderTitleBar() );\n\t $newRender.children( '.primary-actions' ).append( this._renderPrimaryActions() );\n\t $newRender.find( '> .title-bar .subtitle' ).replaceWith( this._renderSubtitle() );\n\t return $newRender;\n\t },\n\t\n\t /** In this override, render the selector controls and set up dragging before the swap */\n\t _swapNewRender : function( $newRender ){\n\t ExpandableView.prototype._swapNewRender.call( this, $newRender );\n\t if( this.selectable ){ this.showSelector( 0 ); }\n\t if( this.draggable ){ this.draggableOn(); }\n\t return this.$el;\n\t },\n\t\n\t /** Render any warnings the item may need to show (e.g. \"I'm deleted\") */\n\t _renderWarnings : function(){\n\t var view = this,\n\t $warnings = $( '
                    ' ),\n\t json = view.model.toJSON();\n\t//TODO:! unordered (map)\n\t _.each( view.templates.warnings, function( templateFn ){\n\t $warnings.append( $( templateFn( json, view ) ) );\n\t });\n\t return $warnings;\n\t },\n\t\n\t /** Render the title bar (the main/exposed SUMMARY dom element) */\n\t _renderTitleBar : function(){\n\t return $( this.templates.titleBar( this.model.toJSON(), this ) );\n\t },\n\t\n\t /** Return an array of jQ objects containing common/easily-accessible item controls */\n\t _renderPrimaryActions : function(){\n\t // override this\n\t return [];\n\t },\n\t\n\t /** Render the title bar (the main/exposed SUMMARY dom element) */\n\t _renderSubtitle : function(){\n\t return $( this.templates.subtitle( this.model.toJSON(), this ) );\n\t },\n\t\n\t // ......................................................................... events\n\t /** event map */\n\t events : {\n\t // expand the body when the title is clicked or when in focus and space or enter is pressed\n\t 'click .title-bar' : '_clickTitleBar',\n\t 'keydown .title-bar' : '_keyDownTitleBar',\n\t\n\t // dragging - don't work, originalEvent === null\n\t //'dragstart .dataset-title-bar' : 'dragStartHandler',\n\t //'dragend .dataset-title-bar' : 'dragEndHandler'\n\t\n\t 'click .selector' : 'toggleSelect'\n\t },\n\t\n\t /** expand when the title bar is clicked */\n\t _clickTitleBar : function( event ){\n\t event.stopPropagation();\n\t if( event.altKey ){\n\t this.toggleSelect( event );\n\t if( !this.selectable ){\n\t this.showSelector();\n\t }\n\t } else {\n\t this.toggleExpanded();\n\t }\n\t },\n\t\n\t /** expand when the title bar is in focus and enter or space is pressed */\n\t _keyDownTitleBar : function( event ){\n\t // bail (with propagation) if keydown and not space or enter\n\t var KEYCODE_SPACE = 32, KEYCODE_RETURN = 13;\n\t if( event && ( event.type === 'keydown' )\n\t &&( event.keyCode === KEYCODE_SPACE || event.keyCode === KEYCODE_RETURN ) ){\n\t this.toggleExpanded();\n\t event.stopPropagation();\n\t return false;\n\t }\n\t return true;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'ListItemView(' + modelString + ')';\n\t }\n\t}));\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tListItemView.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var elTemplato = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t // errors, messages, etc.\n\t '
                    ',\n\t\n\t // multi-select checkbox\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t // space for title bar buttons - gen. floated to the right\n\t '
                    ',\n\t '
                    ',\n\t\n\t // expandable area for more details\n\t '
                    ',\n\t '
                    '\n\t ]);\n\t\n\t var warnings = {};\n\t\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t // adding a tabindex here allows focusing the title bar and the use of keydown to expand the dataset display\n\t '
                    ',\n\t//TODO: prob. belongs in dataset-list-item\n\t '',\n\t '
                    ',\n\t '<%- element.name %>',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ], 'element' );\n\t\n\t var subtitleTemplate = BASE_MVC.wrapTemplate([\n\t // override this\n\t '
                    '\n\t ]);\n\t\n\t var detailsTemplate = BASE_MVC.wrapTemplate([\n\t // override this\n\t '
                    '\n\t ]);\n\t\n\t return {\n\t el : elTemplato,\n\t warnings : warnings,\n\t titleBar : titleBarTemplate,\n\t subtitle : subtitleTemplate,\n\t details : detailsTemplate\n\t };\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** A view that is displayed in some larger list/grid/collection.\n\t * *AND* can display some sub-list of it's own when expanded (e.g. dataset collections).\n\t * This list will 'foldout' when the item is expanded depending on this.foldoutStyle:\n\t * If 'foldout': will expand vertically to show the nested list\n\t * If 'drilldown': will overlay the parent list\n\t *\n\t * Inherits from ListItemView.\n\t *\n\t * _renderDetails does the work of creating this.details: a sub-view that shows the nested list\n\t */\n\tvar FoldoutListItemView = ListItemView.extend({\n\t\n\t /** If 'foldout': show the sub-panel inside the expanded item\n\t * If 'drilldown': only fire events and handle by pub-sub\n\t * (allow the panel containing this item to attach it, hide itself, etc.)\n\t */\n\t foldoutStyle : 'foldout',\n\t /** Panel view class to instantiate for the sub-panel */\n\t foldoutPanelClass : null,\n\t\n\t /** override to:\n\t * add attributes foldoutStyle and foldoutPanelClass for config poly\n\t * disrespect attributes.expanded if drilldown\n\t */\n\t initialize : function( attributes ){\n\t//TODO: hackish\n\t if( this.foldoutStyle === 'drilldown' ){ this.expanded = false; }\n\t this.foldoutStyle = attributes.foldoutStyle || this.foldoutStyle;\n\t this.foldoutPanelClass = attributes.foldoutPanelClass || this.foldoutPanelClass;\n\t\n\t ListItemView.prototype.initialize.call( this, attributes );\n\t this.foldout = this._createFoldoutPanel();\n\t },\n\t\n\t//TODO:?? override to exclude foldout scope?\n\t //$ : function( selector ){\n\t // var $found = ListItemView.prototype.$.call( this, selector );\n\t // return $found;\n\t //},\n\t\n\t /** in this override, attach the foldout panel when rendering details */\n\t _renderDetails : function(){\n\t//TODO: hackish\n\t if( this.foldoutStyle === 'drilldown' ){ return $(); }\n\t var $newDetails = ListItemView.prototype._renderDetails.call( this );\n\t return this._attachFoldout( this.foldout, $newDetails );\n\t },\n\t\n\t /** In this override, handle collection expansion. */\n\t _createFoldoutPanel : function(){\n\t var model = this.model;\n\t var FoldoutClass = this._getFoldoutPanelClass( model ),\n\t options = this._getFoldoutPanelOptions( model ),\n\t foldout = new FoldoutClass( _.extend( options, {\n\t model : model\n\t }));\n\t return foldout;\n\t },\n\t\n\t /** Stub to return proper foldout panel class */\n\t _getFoldoutPanelClass : function(){\n\t // override\n\t return this.foldoutPanelClass;\n\t },\n\t\n\t /** Stub to return proper foldout panel options */\n\t _getFoldoutPanelOptions : function(){\n\t return {\n\t // propagate foldout style down\n\t foldoutStyle : this.foldoutStyle,\n\t fxSpeed : this.fxSpeed\n\t };\n\t },\n\t\n\t /** Render the foldout panel inside the view, hiding controls */\n\t _attachFoldout : function( foldout, $whereTo ){\n\t $whereTo = $whereTo || this.$( '> .details' );\n\t this.foldout = foldout.render( 0 );\n\t//TODO: hack\n\t foldout.$( '> .controls' ).hide();\n\t return $whereTo.append( foldout.$el );\n\t },\n\t\n\t /** In this override, branch on foldoutStyle to show expanded */\n\t expand : function(){\n\t var view = this;\n\t return view._fetchModelDetails()\n\t .always(function(){\n\t if( view.foldoutStyle === 'foldout' ){\n\t view._expand();\n\t } else if( view.foldoutStyle === 'drilldown' ){\n\t view._expandByDrilldown();\n\t }\n\t });\n\t },\n\t\n\t /** For drilldown, set up close handler and fire expanded:drilldown\n\t * containing views can listen to this and handle other things\n\t * (like hiding themselves) by listening for expanded/collapsed:drilldown\n\t */\n\t _expandByDrilldown : function(){\n\t var view = this;\n\t // attachment and rendering done by listener\n\t view.foldout.on( 'close', function(){\n\t view.trigger( 'collapsed:drilldown', view, view.foldout );\n\t });\n\t view.trigger( 'expanded:drilldown', view, view.foldout );\n\t }\n\t\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tFoldoutListItemView.prototype.templates = (function(){\n\t\n\t//TODO:?? unnecessary?\n\t // use element identifier\n\t var detailsTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t // override with more info (that goes above the panel)\n\t '
                    '\n\t ], 'collection' );\n\t\n\t return _.extend( {}, ListItemView.prototype.templates, {\n\t details : detailsTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t ExpandableView : ExpandableView,\n\t ListItemView : ListItemView,\n\t FoldoutListItemView : FoldoutListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function($) {/**\n\t This is the base class of the tool form plugin. This class is e.g. inherited by the regular and the workflow tool form.\n\t*/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(60), __webpack_require__(7), __webpack_require__(44),\n\t __webpack_require__(23), __webpack_require__(21), __webpack_require__(33)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Deferred, Ui, FormBase, ToolTemplate, CitationModel, CitationView) {\n\t return FormBase.extend({\n\t initialize: function(options) {\n\t var self = this;\n\t FormBase.prototype.initialize.call(this, options);\n\t this.deferred = new Deferred();\n\t if (options.inputs) {\n\t this._buildForm(options);\n\t options.needs_update && this.deferred.execute( function( process ) {\n\t self._updateModel( process );\n\t });\n\t } else {\n\t this.deferred.execute(function(process) {\n\t self._buildModel(process, options, true);\n\t });\n\t }\n\t },\n\t\n\t /** Wait for deferred build processes before removal */\n\t remove: function() {\n\t var self = this;\n\t this.$el.hide();\n\t this.deferred.execute(function(){\n\t FormBase.prototype.remove.call(self);\n\t Galaxy.emit.debug('tool-form-base::remove()', 'Destroy view.');\n\t });\n\t },\n\t\n\t /** Build form */\n\t _buildForm: function(options) {\n\t var self = this;\n\t this.options = Utils.merge(options, this.options);\n\t this.options = Utils.merge({\n\t icon : ( (options.icon === undefined) && 'fa-wrench' ) || '',\n\t title : '' + options.name + ' ' + options.description + ' (Galaxy Version ' + options.version + ')',\n\t operations : this._operations(),\n\t onchange : function() {\n\t self.deferred.reset();\n\t self.deferred.execute(function(process) {\n\t self._updateModel(process);\n\t });\n\t }\n\t }, this.options);\n\t this.options.customize && this.options.customize( this.options );\n\t this.render();\n\t if ( !this.options.collapsible ) {\n\t this.$el.append( $( '
                    ' ).addClass( 'ui-margin-top-large' ).append( this._footer() ) );\n\t }\n\t },\n\t\n\t /** Builds a new model through api call and recreates the entire form\n\t */\n\t _buildModel: function(process, options, hide_message) {\n\t var self = this;\n\t this.options.id = options.id;\n\t this.options.version = options.version;\n\t\n\t // build request url\n\t var build_url = '';\n\t var build_data = {};\n\t if ( options.job_id ) {\n\t build_url = Galaxy.root + 'api/jobs/' + options.job_id + '/build_for_rerun';\n\t } else {\n\t build_url = Galaxy.root + 'api/tools/' + options.id + '/build';\n\t if ( Galaxy.params && Galaxy.params.tool_id == options.id ) {\n\t build_data = $.extend( {}, Galaxy.params );\n\t options.version && ( build_data[ 'tool_version' ] = options.version );\n\t }\n\t }\n\t\n\t // get initial model\n\t Utils.request({\n\t type : 'GET',\n\t url : build_url,\n\t data : build_data,\n\t success : function(new_model) {\n\t new_model = new_model.tool_model || new_model;\n\t if( !new_model.display ) {\n\t window.location = Galaxy.root;\n\t return;\n\t }\n\t self._buildForm(new_model);\n\t !hide_message && self.message.update({\n\t status : 'success',\n\t message : 'Now you are using \\'' + self.options.name + '\\' version ' + self.options.version + ', id \\'' + self.options.id + '\\'.',\n\t persistent : false\n\t });\n\t Galaxy.emit.debug('tool-form-base::initialize()', 'Initial tool model ready.', new_model);\n\t process.resolve();\n\t },\n\t error : function(response, xhr) {\n\t var error_message = ( response && response.err_msg ) || 'Uncaught error.';\n\t if ( xhr.status == 401 ) {\n\t window.location = Galaxy.root + 'user/login?' + $.param({ redirect : Galaxy.root + '?tool_id=' + self.options.id });\n\t } else if ( self.$el.is(':empty') ) {\n\t self.$el.prepend((new Ui.Message({\n\t message : error_message,\n\t status : 'danger',\n\t persistent : true,\n\t large : true\n\t })).$el);\n\t } else {\n\t Galaxy.modal.show({\n\t title : 'Tool request failed',\n\t body : error_message,\n\t buttons : {\n\t 'Close' : function() {\n\t Galaxy.modal.hide();\n\t }\n\t }\n\t });\n\t }\n\t Galaxy.emit.debug('tool-form::initialize()', 'Initial tool model request failed.', response);\n\t process.reject();\n\t }\n\t });\n\t },\n\t\n\t /** Request a new model for an already created tool form and updates the form inputs\n\t */\n\t _updateModel: function(process) {\n\t // link this\n\t var self = this;\n\t var model_url = this.options.update_url || Galaxy.root + 'api/tools/' + this.options.id + '/build';\n\t var current_state = {\n\t tool_id : this.options.id,\n\t tool_version : this.options.version,\n\t inputs : $.extend(true, {}, self.data.create())\n\t }\n\t this.wait(true);\n\t\n\t // log tool state\n\t Galaxy.emit.debug('tool-form-base::_updateModel()', 'Sending current state.', current_state);\n\t\n\t // post job\n\t Utils.request({\n\t type : 'POST',\n\t url : model_url,\n\t data : current_state,\n\t success : function(new_model) {\n\t self.update(new_model['tool_model'] || new_model);\n\t self.options.update && self.options.update(new_model);\n\t self.wait(false);\n\t Galaxy.emit.debug('tool-form-base::_updateModel()', 'Received new model.', new_model);\n\t process.resolve();\n\t },\n\t error : function(response) {\n\t Galaxy.emit.debug('tool-form-base::_updateModel()', 'Refresh request failed.', response);\n\t process.reject();\n\t }\n\t });\n\t },\n\t\n\t /** Create tool operation menu\n\t */\n\t _operations: function() {\n\t var self = this;\n\t var options = this.options;\n\t\n\t // button for version selection\n\t var versions_button = new Ui.ButtonMenu({\n\t icon : 'fa-cubes',\n\t title : (!options.narrow && 'Versions') || null,\n\t tooltip : 'Select another tool version'\n\t });\n\t if (!options.sustain_version && options.versions && options.versions.length > 1) {\n\t for (var i in options.versions) {\n\t var version = options.versions[i];\n\t if (version != options.version) {\n\t versions_button.addMenu({\n\t title : 'Switch to ' + version,\n\t version : version,\n\t icon : 'fa-cube',\n\t onclick : function() {\n\t // here we update the tool version (some tools encode the version also in the id)\n\t var id = options.id.replace(options.version, this.version);\n\t var version = this.version;\n\t // queue model request\n\t self.deferred.reset();\n\t self.deferred.execute(function(process) {\n\t self._buildModel(process, {id: id, version: version})\n\t });\n\t }\n\t });\n\t }\n\t }\n\t } else {\n\t versions_button.$el.hide();\n\t }\n\t\n\t // button for options e.g. search, help\n\t var menu_button = new Ui.ButtonMenu({\n\t icon : 'fa-caret-down',\n\t title : (!options.narrow && 'Options') || null,\n\t tooltip : 'View available options'\n\t });\n\t if(options.biostar_url) {\n\t menu_button.addMenu({\n\t icon : 'fa-question-circle',\n\t title : 'Question?',\n\t tooltip : 'Ask a question about this tool (Biostar)',\n\t onclick : function() {\n\t window.open(options.biostar_url + '/p/new/post/');\n\t }\n\t });\n\t menu_button.addMenu({\n\t icon : 'fa-search',\n\t title : 'Search',\n\t tooltip : 'Search help for this tool (Biostar)',\n\t onclick : function() {\n\t window.open(options.biostar_url + '/local/search/page/?q=' + options.name);\n\t }\n\t });\n\t };\n\t menu_button.addMenu({\n\t icon : 'fa-share',\n\t title : 'Share',\n\t tooltip : 'Share this tool',\n\t onclick : function() {\n\t prompt('Copy to clipboard: Ctrl+C, Enter', window.location.origin + Galaxy.root + 'root?tool_id=' + options.id);\n\t }\n\t });\n\t\n\t // add admin operations\n\t if (Galaxy.user && Galaxy.user.get('is_admin')) {\n\t menu_button.addMenu({\n\t icon : 'fa-download',\n\t title : 'Download',\n\t tooltip : 'Download this tool',\n\t onclick : function() {\n\t window.location.href = Galaxy.root + 'api/tools/' + options.id + '/download';\n\t }\n\t });\n\t }\n\t\n\t // button for version selection\n\t if (options.requirements && options.requirements.length > 0) {\n\t menu_button.addMenu({\n\t icon : 'fa-info-circle',\n\t title : 'Requirements',\n\t tooltip : 'Display tool requirements',\n\t onclick : function() {\n\t if (!this.visible) {\n\t this.visible = true;\n\t self.message.update({\n\t persistent : true,\n\t message : ToolTemplate.requirements(options),\n\t status : 'info'\n\t });\n\t } else {\n\t this.visible = false;\n\t self.message.update({\n\t message : ''\n\t });\n\t }\n\t }\n\t });\n\t }\n\t\n\t // add toolshed url\n\t if (options.sharable_url) {\n\t menu_button.addMenu({\n\t icon : 'fa-external-link',\n\t title : 'See in Tool Shed',\n\t tooltip : 'Access the repository',\n\t onclick : function() {\n\t window.open(options.sharable_url);\n\t }\n\t });\n\t }\n\t\n\t return {\n\t menu : menu_button,\n\t versions : versions_button\n\t }\n\t },\n\t\n\t /** Create footer\n\t */\n\t _footer: function() {\n\t var options = this.options;\n\t var $el = $( '
                    ' ).append( ToolTemplate.help( options ) );\n\t if ( options.citations ) {\n\t var $citations = $( '
                    ' );\n\t var citations = new CitationModel.ToolCitationCollection();\n\t citations.tool_id = options.id;\n\t var citation_list_view = new CitationView.CitationListView({ el: $citations, collection: citations });\n\t citation_list_view.render();\n\t citations.fetch();\n\t $el.append( $citations );\n\t }\n\t return $el;\n\t }\n\t });\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/**\n\t * Model, view, and controller objects for Galaxy tools and tool panel.\n\t */\n\t\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(3),\n\t __webpack_require__(20),\n\t __webpack_require__(14),\n\t __webpack_require__(22),\n\t __webpack_require__(64),\n\t __webpack_require__(65),\n\t __webpack_require__(63),\n\t __webpack_require__(66),\n\t\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(_, util, data, ToolForm, tool_form_template, tool_link_template, panel_section_template, tool_search_template) {\n\t\n\t/**\n\t * Mixin for tracking model visibility.\n\t */\n\tvar VisibilityMixin = {\n\t hidden: false,\n\t\n\t show: function() {\n\t this.set(\"hidden\", false);\n\t },\n\t\n\t hide: function() {\n\t this.set(\"hidden\", true);\n\t },\n\t\n\t toggle: function() {\n\t this.set(\"hidden\", !this.get(\"hidden\"));\n\t },\n\t\n\t is_visible: function() {\n\t return !this.attributes.hidden;\n\t }\n\t\n\t};\n\t\n\t/**\n\t * A tool parameter.\n\t */\n\tvar ToolParameter = Backbone.Model.extend({\n\t defaults: {\n\t name: null,\n\t label: null,\n\t type: null,\n\t value: null,\n\t html: null,\n\t num_samples: 5\n\t },\n\t\n\t initialize: function(options) {\n\t this.attributes.html = unescape(this.attributes.html);\n\t },\n\t\n\t copy: function() {\n\t return new ToolParameter(this.toJSON());\n\t },\n\t\n\t set_value: function(value) {\n\t this.set('value', value || '');\n\t }\n\t});\n\t\n\tvar ToolParameterCollection = Backbone.Collection.extend({\n\t model: ToolParameter\n\t});\n\t\n\t/**\n\t * A data tool parameter.\n\t */\n\tvar DataToolParameter = ToolParameter.extend({});\n\t\n\t/**\n\t * An integer tool parameter.\n\t */\n\tvar IntegerToolParameter = ToolParameter.extend({\n\t set_value: function(value) {\n\t this.set('value', parseInt(value, 10));\n\t },\n\t\n\t /**\n\t * Returns samples from a tool input.\n\t */\n\t get_samples: function() {\n\t return d3.scale.linear()\n\t .domain([this.get('min'), this.get('max')])\n\t .ticks(this.get('num_samples'));\n\t }\n\t});\n\t\n\tvar FloatToolParameter = IntegerToolParameter.extend({\n\t set_value: function(value) {\n\t this.set('value', parseFloat(value));\n\t }\n\t});\n\t\n\t/**\n\t * A select tool parameter.\n\t */\n\tvar SelectToolParameter = ToolParameter.extend({\n\t /**\n\t * Returns tool options.\n\t */\n\t get_samples: function() {\n\t return _.map(this.get('options'), function(option) {\n\t return option[0];\n\t });\n\t }\n\t});\n\t\n\t// Set up dictionary of parameter types.\n\tToolParameter.subModelTypes = {\n\t 'integer': IntegerToolParameter,\n\t 'float': FloatToolParameter,\n\t 'data': DataToolParameter,\n\t 'select': SelectToolParameter\n\t};\n\t\n\t/**\n\t * A Galaxy tool.\n\t */\n\tvar Tool = Backbone.Model.extend({\n\t // Default attributes.\n\t defaults: {\n\t id: null,\n\t name: null,\n\t description: null,\n\t target: null,\n\t inputs: [],\n\t outputs: []\n\t },\n\t\n\t urlRoot: Galaxy.root + 'api/tools',\n\t\n\t initialize: function(options) {\n\t\n\t // Set parameters.\n\t this.set('inputs', new ToolParameterCollection(_.map(options.inputs, function(p) {\n\t var p_class = ToolParameter.subModelTypes[p.type] || ToolParameter;\n\t return new p_class(p);\n\t })));\n\t },\n\t\n\t /**\n\t *\n\t */\n\t toJSON: function() {\n\t var rval = Backbone.Model.prototype.toJSON.call(this);\n\t\n\t // Convert inputs to JSON manually.\n\t rval.inputs = this.get('inputs').map(function(i) { return i.toJSON(); });\n\t return rval;\n\t },\n\t\n\t /**\n\t * Removes inputs of a particular type; this is useful because not all inputs can be handled by\n\t * client and server yet.\n\t */\n\t remove_inputs: function(types) {\n\t var tool = this,\n\t incompatible_inputs = tool.get('inputs').filter( function(input) {\n\t return ( types.indexOf( input.get('type') ) !== -1);\n\t });\n\t tool.get('inputs').remove(incompatible_inputs);\n\t },\n\t\n\t /**\n\t * Returns object copy, optionally including only inputs that can be sampled.\n\t */\n\t copy: function(only_samplable_inputs) {\n\t var copy = new Tool(this.toJSON());\n\t\n\t // Return only samplable inputs if flag is set.\n\t if (only_samplable_inputs) {\n\t var valid_inputs = new Backbone.Collection();\n\t copy.get('inputs').each(function(input) {\n\t if (input.get_samples()) {\n\t valid_inputs.push(input);\n\t }\n\t });\n\t copy.set('inputs', valid_inputs);\n\t }\n\t\n\t return copy;\n\t },\n\t\n\t apply_search_results: function(results) {\n\t ( _.indexOf(results, this.attributes.id) !== -1 ? this.show() : this.hide() );\n\t return this.is_visible();\n\t },\n\t\n\t /**\n\t * Set a tool input's value.\n\t */\n\t set_input_value: function(name, value) {\n\t this.get('inputs').find(function(input) {\n\t return input.get('name') === name;\n\t }).set('value', value);\n\t },\n\t\n\t /**\n\t * Set many input values at once.\n\t */\n\t set_input_values: function(inputs_dict) {\n\t var self = this;\n\t _.each(_.keys(inputs_dict), function(input_name) {\n\t self.set_input_value(input_name, inputs_dict[input_name]);\n\t });\n\t },\n\t\n\t /**\n\t * Run tool; returns a Deferred that resolves to the tool's output(s).\n\t */\n\t run: function() {\n\t return this._run();\n\t },\n\t\n\t /**\n\t * Rerun tool using regions and a target dataset.\n\t */\n\t rerun: function(target_dataset, regions) {\n\t return this._run({\n\t action: 'rerun',\n\t target_dataset_id: target_dataset.id,\n\t regions: regions\n\t });\n\t },\n\t\n\t /**\n\t * Returns input dict for tool's inputs.\n\t */\n\t get_inputs_dict: function() {\n\t var input_dict = {};\n\t this.get('inputs').each(function(input) {\n\t input_dict[input.get('name')] = input.get('value');\n\t });\n\t return input_dict;\n\t },\n\t\n\t /**\n\t * Run tool; returns a Deferred that resolves to the tool's output(s).\n\t * NOTE: this method is a helper method and should not be called directly.\n\t */\n\t _run: function(additional_params) {\n\t // Create payload.\n\t var payload = _.extend({\n\t tool_id: this.id,\n\t inputs: this.get_inputs_dict()\n\t }, additional_params);\n\t\n\t // Because job may require indexing datasets, use server-side\n\t // deferred to ensure that job is run. Also use deferred that\n\t // resolves to outputs from tool.\n\t var run_deferred = $.Deferred(),\n\t ss_deferred = new util.ServerStateDeferred({\n\t ajax_settings: {\n\t url: this.urlRoot,\n\t data: JSON.stringify(payload),\n\t dataType: \"json\",\n\t contentType: 'application/json',\n\t type: \"POST\"\n\t },\n\t interval: 2000,\n\t success_fn: function(response) {\n\t return response !== \"pending\";\n\t }\n\t });\n\t\n\t // Run job and resolve run_deferred to tool outputs.\n\t $.when(ss_deferred.go()).then(function(result) {\n\t run_deferred.resolve(new data.DatasetCollection(result));\n\t });\n\t return run_deferred;\n\t }\n\t});\n\t_.extend(Tool.prototype, VisibilityMixin);\n\t\n\t/**\n\t * Tool view.\n\t */\n\tvar ToolView = Backbone.View.extend({\n\t\n\t});\n\t\n\t/**\n\t * Wrap collection of tools for fast access/manipulation.\n\t */\n\tvar ToolCollection = Backbone.Collection.extend({\n\t model: Tool\n\t});\n\t\n\t/**\n\t * Label or section header in tool panel.\n\t */\n\tvar ToolSectionLabel = Backbone.Model.extend(VisibilityMixin);\n\t\n\t/**\n\t * Section of tool panel with elements (labels and tools).\n\t */\n\tvar ToolSection = Backbone.Model.extend({\n\t defaults: {\n\t elems: [],\n\t open: false\n\t },\n\t\n\t clear_search_results: function() {\n\t _.each(this.attributes.elems, function(elt) {\n\t elt.show();\n\t });\n\t\n\t this.show();\n\t this.set(\"open\", false);\n\t },\n\t\n\t apply_search_results: function(results) {\n\t var all_hidden = true,\n\t cur_label;\n\t _.each(this.attributes.elems, function(elt) {\n\t if (elt instanceof ToolSectionLabel) {\n\t cur_label = elt;\n\t cur_label.hide();\n\t }\n\t else if (elt instanceof Tool) {\n\t if (elt.apply_search_results(results)) {\n\t all_hidden = false;\n\t if (cur_label) {\n\t cur_label.show();\n\t }\n\t }\n\t }\n\t });\n\t\n\t if (all_hidden) {\n\t this.hide();\n\t }\n\t else {\n\t this.show();\n\t this.set(\"open\", true);\n\t }\n\t }\n\t});\n\t_.extend(ToolSection.prototype, VisibilityMixin);\n\t\n\t/**\n\t * Tool search that updates results when query is changed. Result value of null\n\t * indicates that query was not run; if not null, results are from search using\n\t * query.\n\t */\n\tvar ToolSearch = Backbone.Model.extend({\n\t defaults: {\n\t search_hint_string: \"search tools\",\n\t min_chars_for_search: 3,\n\t spinner_url: \"\",\n\t clear_btn_url: \"\",\n\t search_url: \"\",\n\t visible: true,\n\t query: \"\",\n\t results: null,\n\t // ESC (27) will clear the input field and tool search filters\n\t clear_key: 27\n\t },\n\t\n\t urlRoot: Galaxy.root + 'api/tools',\n\t\n\t initialize: function() {\n\t this.on(\"change:query\", this.do_search);\n\t },\n\t\n\t /**\n\t * Do the search and update the results.\n\t */\n\t do_search: function() {\n\t var query = this.attributes.query;\n\t\n\t // If query is too short, do not search.\n\t if (query.length < this.attributes.min_chars_for_search) {\n\t this.set(\"results\", null);\n\t return;\n\t }\n\t\n\t // Do search via AJAX.\n\t var q = query;\n\t // Stop previous ajax-request\n\t if (this.timer) {\n\t clearTimeout(this.timer);\n\t }\n\t // Start a new ajax-request in X ms\n\t $(\"#search-clear-btn\").hide();\n\t $(\"#search-spinner\").show();\n\t var self = this;\n\t this.timer = setTimeout(function () {\n\t // log the search to analytics if present\n\t if ( typeof ga !== 'undefined' ) {\n\t ga( 'send', 'pageview', Galaxy.root + '?q=' + q );\n\t }\n\t $.get( self.urlRoot, { q: q }, function (data) {\n\t self.set(\"results\", data);\n\t $(\"#search-spinner\").hide();\n\t $(\"#search-clear-btn\").show();\n\t }, \"json\" );\n\t }, 400 );\n\t },\n\t\n\t clear_search: function() {\n\t this.set(\"query\", \"\");\n\t this.set(\"results\", null);\n\t }\n\t\n\t});\n\t_.extend(ToolSearch.prototype, VisibilityMixin);\n\t\n\t/**\n\t * Tool Panel.\n\t */\n\tvar ToolPanel = Backbone.Model.extend({\n\t\n\t initialize: function(options) {\n\t this.attributes.tool_search = options.tool_search;\n\t this.attributes.tool_search.on(\"change:results\", this.apply_search_results, this);\n\t this.attributes.tools = options.tools;\n\t this.attributes.layout = new Backbone.Collection( this.parse(options.layout) );\n\t },\n\t\n\t /**\n\t * Parse tool panel dictionary and return collection of tool panel elements.\n\t */\n\t parse: function(response) {\n\t // Recursive function to parse tool panel elements.\n\t var self = this,\n\t // Helper to recursively parse tool panel.\n\t parse_elt = function(elt_dict) {\n\t var type = elt_dict.model_class;\n\t // There are many types of tools; for now, anything that ends in 'Tool'\n\t // is treated as a generic tool.\n\t if ( type.indexOf('Tool') === type.length - 4 ) {\n\t return self.attributes.tools.get(elt_dict.id);\n\t }\n\t else if (type === 'ToolSection') {\n\t // Parse elements.\n\t var elems = _.map(elt_dict.elems, parse_elt);\n\t elt_dict.elems = elems;\n\t return new ToolSection(elt_dict);\n\t }\n\t else if (type === 'ToolSectionLabel') {\n\t return new ToolSectionLabel(elt_dict);\n\t }\n\t };\n\t\n\t return _.map(response, parse_elt);\n\t },\n\t\n\t clear_search_results: function() {\n\t this.get('layout').each(function(panel_elt) {\n\t if (panel_elt instanceof ToolSection) {\n\t panel_elt.clear_search_results();\n\t }\n\t else {\n\t // Label or tool, so just show.\n\t panel_elt.show();\n\t }\n\t });\n\t },\n\t\n\t apply_search_results: function() {\n\t var results = this.get('tool_search').get('results');\n\t if (results === null) {\n\t this.clear_search_results();\n\t return;\n\t }\n\t\n\t var cur_label = null;\n\t this.get('layout').each(function(panel_elt) {\n\t if (panel_elt instanceof ToolSectionLabel) {\n\t cur_label = panel_elt;\n\t cur_label.hide();\n\t }\n\t else if (panel_elt instanceof Tool) {\n\t if (panel_elt.apply_search_results(results)) {\n\t if (cur_label) {\n\t cur_label.show();\n\t }\n\t }\n\t }\n\t else {\n\t // Starting new section, so clear current label.\n\t cur_label = null;\n\t panel_elt.apply_search_results(results);\n\t }\n\t });\n\t }\n\t});\n\t\n\t/**\n\t * View classes for Galaxy tools and tool panel.\n\t *\n\t * Views use precompiled Handlebars templates for rendering. Views update as needed\n\t * based on (a) model/collection events and (b) user interactions; in this sense,\n\t * they are controllers are well and the HTML is the real view in the MVC architecture.\n\t */\n\t\n\t/**\n\t * Base view that handles visibility based on model's hidden attribute.\n\t */\n\tvar BaseView = Backbone.View.extend({\n\t initialize: function() {\n\t this.model.on(\"change:hidden\", this.update_visible, this);\n\t this.update_visible();\n\t },\n\t update_visible: function() {\n\t ( this.model.attributes.hidden ? this.$el.hide() : this.$el.show() );\n\t }\n\t});\n\t\n\t/**\n\t * Link to a tool.\n\t */\n\tvar ToolLinkView = BaseView.extend({\n\t tagName: 'div',\n\t\n\t render: function() {\n\t // create element\n\t var $link = $('
                    ');\n\t $link.append(tool_link_template(this.model.toJSON()));\n\t\n\t // open upload dialog for upload tool\n\t if (this.model.id === 'upload1') {\n\t $link.find('a').on('click', function(e) {\n\t e.preventDefault();\n\t Galaxy.upload.show();\n\t });\n\t }\n\t else if ( this.model.get( 'model_class' ) === 'Tool' ) { // regular tools\n\t var self = this;\n\t $link.find('a').on('click', function(e) {\n\t e.preventDefault();\n\t var form = new ToolForm.View( { id : self.model.id, version : self.model.get('version') } );\n\t form.deferred.execute(function() {\n\t Galaxy.app.display( form );\n\t });\n\t });\n\t }\n\t\n\t // add element\n\t this.$el.append($link);\n\t return this;\n\t }\n\t});\n\t\n\t/**\n\t * Panel label/section header.\n\t */\n\tvar ToolSectionLabelView = BaseView.extend({\n\t tagName: 'div',\n\t className: 'toolPanelLabel',\n\t\n\t render: function() {\n\t this.$el.append( $(\"\").text(this.model.attributes.text) );\n\t return this;\n\t }\n\t});\n\t\n\t/**\n\t * Panel section.\n\t */\n\tvar ToolSectionView = BaseView.extend({\n\t tagName: 'div',\n\t className: 'toolSectionWrapper',\n\t\n\t initialize: function() {\n\t BaseView.prototype.initialize.call(this);\n\t this.model.on(\"change:open\", this.update_open, this);\n\t },\n\t\n\t render: function() {\n\t // Build using template.\n\t this.$el.append( panel_section_template(this.model.toJSON()) );\n\t\n\t // Add tools to section.\n\t var section_body = this.$el.find(\".toolSectionBody\");\n\t _.each(this.model.attributes.elems, function(elt) {\n\t if (elt instanceof Tool) {\n\t var tool_view = new ToolLinkView({model: elt, className: \"toolTitle\"});\n\t tool_view.render();\n\t section_body.append(tool_view.$el);\n\t }\n\t else if (elt instanceof ToolSectionLabel) {\n\t var label_view = new ToolSectionLabelView({model: elt});\n\t label_view.render();\n\t section_body.append(label_view.$el);\n\t }\n\t else {\n\t // TODO: handle nested section bodies?\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t events: {\n\t 'click .toolSectionTitle > a': 'toggle'\n\t },\n\t\n\t /**\n\t * Toggle visibility of tool section.\n\t */\n\t toggle: function() {\n\t this.model.set(\"open\", !this.model.attributes.open);\n\t },\n\t\n\t /**\n\t * Update whether section is open or close.\n\t */\n\t update_open: function() {\n\t (this.model.attributes.open ?\n\t this.$el.children(\".toolSectionBody\").slideDown(\"fast\") :\n\t this.$el.children(\".toolSectionBody\").slideUp(\"fast\")\n\t );\n\t }\n\t});\n\t\n\tvar ToolSearchView = Backbone.View.extend({\n\t tagName: 'div',\n\t id: 'tool-search',\n\t className: 'bar',\n\t\n\t events: {\n\t 'click': 'focus_and_select',\n\t 'keyup :input': 'query_changed',\n\t 'click #search-clear-btn': 'clear'\n\t },\n\t\n\t render: function() {\n\t this.$el.append( tool_search_template(this.model.toJSON()) );\n\t if (!this.model.is_visible()) {\n\t this.$el.hide();\n\t }\n\t this.$el.find('[title]').tooltip();\n\t return this;\n\t },\n\t\n\t focus_and_select: function() {\n\t this.$el.find(\":input\").focus().select();\n\t },\n\t\n\t clear: function() {\n\t this.model.clear_search();\n\t this.$el.find(\":input\").val('');\n\t this.focus_and_select();\n\t return false;\n\t },\n\t\n\t query_changed: function( evData ) {\n\t // check for the 'clear key' (ESC) first\n\t if( ( this.model.attributes.clear_key ) &&\n\t ( this.model.attributes.clear_key === evData.which ) ){\n\t this.clear();\n\t return false;\n\t }\n\t this.model.set(\"query\", this.$el.find(\":input\").val());\n\t }\n\t});\n\t\n\t/**\n\t * Tool panel view. Events triggered include:\n\t * tool_link_click(click event, tool_model)\n\t */\n\tvar ToolPanelView = Backbone.View.extend({\n\t tagName: 'div',\n\t className: 'toolMenu',\n\t\n\t /**\n\t * Set up view.\n\t */\n\t initialize: function() {\n\t this.model.get('tool_search').on(\"change:results\", this.handle_search_results, this);\n\t },\n\t\n\t render: function() {\n\t var self = this;\n\t\n\t // Render search.\n\t var search_view = new ToolSearchView( { model: this.model.get('tool_search') } );\n\t search_view.render();\n\t self.$el.append(search_view.$el);\n\t\n\t // Render panel.\n\t this.model.get('layout').each(function(panel_elt) {\n\t if (panel_elt instanceof ToolSection) {\n\t var section_title_view = new ToolSectionView({model: panel_elt});\n\t section_title_view.render();\n\t self.$el.append(section_title_view.$el);\n\t }\n\t else if (panel_elt instanceof Tool) {\n\t var tool_view = new ToolLinkView({model: panel_elt, className: \"toolTitleNoSection\"});\n\t tool_view.render();\n\t self.$el.append(tool_view.$el);\n\t }\n\t else if (panel_elt instanceof ToolSectionLabel) {\n\t var label_view = new ToolSectionLabelView({model: panel_elt});\n\t label_view.render();\n\t self.$el.append(label_view.$el);\n\t }\n\t });\n\t\n\t // Setup tool link click eventing.\n\t self.$el.find(\"a.tool-link\").click(function(e) {\n\t // Tool id is always the first class.\n\t var\n\t tool_id = $(this).attr('class').split(/\\s+/)[0],\n\t tool = self.model.get('tools').get(tool_id);\n\t\n\t self.trigger(\"tool_link_click\", e, tool);\n\t });\n\t\n\t return this;\n\t },\n\t\n\t handle_search_results: function() {\n\t var results = this.model.get('tool_search').get('results');\n\t if (results && results.length === 0) {\n\t $(\"#search-no-results\").show();\n\t }\n\t else {\n\t $(\"#search-no-results\").hide();\n\t }\n\t }\n\t});\n\t\n\t/**\n\t * View for working with a tool: setting parameters and inputs and executing the tool.\n\t */\n\tvar ToolFormView = Backbone.View.extend({\n\t className: 'toolForm',\n\t\n\t render: function() {\n\t this.$el.children().remove();\n\t this.$el.append( tool_form_template(this.model.toJSON()) );\n\t }\n\t});\n\t\n\t/**\n\t * Integrated tool menu + tool execution.\n\t */\n\tvar IntegratedToolMenuAndView = Backbone.View.extend({\n\t className: 'toolMenuAndView',\n\t\n\t initialize: function() {\n\t this.tool_panel_view = new ToolPanelView({collection: this.collection});\n\t this.tool_form_view = new ToolFormView();\n\t },\n\t\n\t render: function() {\n\t // Render and append tool panel.\n\t this.tool_panel_view.render();\n\t this.tool_panel_view.$el.css(\"float\", \"left\");\n\t this.$el.append(this.tool_panel_view.$el);\n\t\n\t // Append tool form view.\n\t this.tool_form_view.$el.hide();\n\t this.$el.append(this.tool_form_view.$el);\n\t\n\t // On tool link click, show tool.\n\t var self = this;\n\t this.tool_panel_view.on(\"tool_link_click\", function(e, tool) {\n\t // Prevents click from activating link:\n\t e.preventDefault();\n\t // Show tool that was clicked on:\n\t self.show_tool(tool);\n\t });\n\t },\n\t\n\t /**\n\t * Fetch and display tool.\n\t */\n\t show_tool: function(tool) {\n\t var self = this;\n\t tool.fetch().done( function() {\n\t self.tool_form_view.model = tool;\n\t self.tool_form_view.render();\n\t self.tool_form_view.$el.show();\n\t $('#left').width(\"650px\");\n\t });\n\t }\n\t});\n\t\n\t// Exports\n\treturn {\n\t ToolParameter: ToolParameter,\n\t IntegerToolParameter: IntegerToolParameter,\n\t SelectToolParameter: SelectToolParameter,\n\t Tool: Tool,\n\t ToolCollection: ToolCollection,\n\t ToolSearch: ToolSearch,\n\t ToolPanel: ToolPanel,\n\t ToolPanelView: ToolPanelView,\n\t ToolFormView: ToolFormView\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t //jquery\n\t //backbone\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t// =============================================================================\n\t/**\n\t * view for a popup menu\n\t */\n\tvar PopupMenu = Backbone.View.extend({\n\t//TODO: maybe better as singleton off the Galaxy obj\n\t /** Cache the desired button element and options, set up the button click handler\n\t * NOTE: attaches this view as HTML/jQ data on the button for later use.\n\t */\n\t initialize: function( $button, options ){\n\t // default settings\n\t this.$button = $button;\n\t if( !this.$button.size() ){\n\t this.$button = $( '
                    ' );\n\t }\n\t this.options = options || [];\n\t this.$button.data( 'popupmenu', this );\n\t\n\t // set up button click -> open menu behavior\n\t var menu = this;\n\t this.$button.click( function( event ){\n\t // if there's already a menu open, remove it\n\t $( '.popmenu-wrapper' ).remove();\n\t menu._renderAndShow( event );\n\t return false;\n\t });\n\t },\n\t\n\t // render the menu, append to the page body at the click position, and set up the 'click-away' handlers, show\n\t _renderAndShow: function( clickEvent ){\n\t this.render();\n\t this.$el.appendTo( 'body' ).css( this._getShownPosition( clickEvent )).show();\n\t this._setUpCloseBehavior();\n\t },\n\t\n\t // render the menu\n\t // this menu doesn't attach itself to the DOM ( see _renderAndShow )\n\t render: function(){\n\t // render the menu body absolute and hidden, fill with template\n\t this.$el.addClass( 'popmenu-wrapper' ).hide()\n\t .css({ position : 'absolute' })\n\t .html( this.template( this.$button.attr( 'id' ), this.options ));\n\t\n\t // set up behavior on each link/anchor elem\n\t if( this.options.length ){\n\t var menu = this;\n\t //precondition: there should be one option per li\n\t this.$el.find( 'li' ).each( function( i, li ){\n\t var option = menu.options[i];\n\t\n\t // if the option has 'func', call that function when the anchor is clicked\n\t if( option.func ){\n\t $( this ).children( 'a.popupmenu-option' ).click( function( event ){\n\t option.func.call( menu, event, option );\n\t // We must preventDefault otherwise clicking \"cancel\"\n\t // on a purge or something still navigates and causes\n\t // the action.\n\t event.preventDefault();\n\t // bubble up so that an option click will call the close behavior\n\t });\n\t }\n\t });\n\t }\n\t return this;\n\t },\n\t\n\t template : function( id, options ){\n\t return [\n\t '
                      ', this._templateOptions( options ), '
                    '\n\t ].join( '' );\n\t },\n\t\n\t _templateOptions : function( options ){\n\t if( !options.length ){\n\t return '
                  9. (no options)
                  10. ';\n\t }\n\t return _.map( options, function( option ){\n\t if( option.divider ){\n\t return '
                  11. ';\n\t } else if( option.header ){\n\t return [ '
                  12. ', option.html, '
                  13. ' ].join( '' );\n\t }\n\t var href = option.href || 'javascript:void(0);',\n\t target = ( option.target )?( ' target=\"' + option.target + '\"' ):( '' ),\n\t check = ( option.checked )?( '' ):( '' );\n\t return [\n\t '
                  14. ',\n\t check, option.html,\n\t '
                  15. '\n\t ].join( '' );\n\t }).join( '' );\n\t },\n\t\n\t // get the absolute position/offset for the menu\n\t _getShownPosition : function( clickEvent ){\n\t\n\t // display menu horiz. centered on click...\n\t var menuWidth = this.$el.width();\n\t var x = clickEvent.pageX - menuWidth / 2 ;\n\t\n\t // adjust to handle horiz. scroll and window dimensions ( draw entirely on visible screen area )\n\t x = Math.min( x, $( document ).scrollLeft() + $( window ).width() - menuWidth - 5 );\n\t x = Math.max( x, $( document ).scrollLeft() + 5 );\n\t return {\n\t top: clickEvent.pageY,\n\t left: x\n\t };\n\t },\n\t\n\t // bind an event handler to all available frames so that when anything is clicked\n\t // the menu is removed from the DOM and the event handler unbinds itself\n\t _setUpCloseBehavior: function(){\n\t var menu = this;\n\t//TODO: alternately: focus hack, blocking overlay, jquery.blockui\n\t\n\t // function to close popup and unbind itself\n\t function closePopup( event ){\n\t $( document ).off( 'click.close_popup' );\n\t if( window && window.parent !== window ){\n\t try {\n\t $( window.parent.document ).off( \"click.close_popup\" );\n\t } catch( err ){}\n\t } else {\n\t try {\n\t $( 'iframe#galaxy_main' ).contents().off( \"click.close_popup\" );\n\t } catch( err ){}\n\t }\n\t menu.remove();\n\t }\n\t\n\t $( 'html' ).one( \"click.close_popup\", closePopup );\n\t if( window && window.parent !== window ){\n\t try {\n\t $( window.parent.document ).find( 'html' ).one( \"click.close_popup\", closePopup );\n\t } catch( err ){}\n\t } else {\n\t try {\n\t $( 'iframe#galaxy_main' ).contents().one( \"click.close_popup\", closePopup );\n\t } catch( err ){}\n\t }\n\t },\n\t\n\t // add a menu option/item at the given index\n\t addItem: function( item, index ){\n\t // append to end if no index\n\t index = ( index >= 0 ) ? index : this.options.length;\n\t this.options.splice( index, 0, item );\n\t return this;\n\t },\n\t\n\t // remove a menu option/item at the given index\n\t removeItem: function( index ){\n\t if( index >=0 ){\n\t this.options.splice( index, 1 );\n\t }\n\t return this;\n\t },\n\t\n\t // search for a menu option by its html\n\t findIndexByHtml: function( html ){\n\t for( var i = 0; i < this.options.length; i++ ){\n\t if( _.has( this.options[i], 'html' ) && ( this.options[i].html === html )){\n\t return i;\n\t }\n\t }\n\t return null;\n\t },\n\t\n\t // search for a menu option by its html\n\t findItemByHtml: function( html ){\n\t return this.options[( this.findIndexByHtml( html ))];\n\t },\n\t\n\t // string representation\n\t toString: function(){\n\t return 'PopupMenu';\n\t }\n\t});\n\t/** shortcut to new for when you don't need to preserve the ref */\n\tPopupMenu.create = function _create( $button, options ){\n\t return new PopupMenu( $button, options );\n\t};\n\t\n\t// -----------------------------------------------------------------------------\n\t// the following class functions are bridges from the original make_popupmenu and make_popup_menus\n\t// to the newer backbone.js PopupMenu\n\t\n\t/** Create a PopupMenu from simple map initial_options activated by clicking button_element.\n\t * Converts initial_options to object array used by PopupMenu.\n\t * @param {jQuery|DOMElement} button_element element which, when clicked, activates menu\n\t * @param {Object} initial_options map of key -> values, where\n\t * key is option text, value is fn to call when option is clicked\n\t * @returns {PopupMenu} the PopupMenu created\n\t */\n\tPopupMenu.make_popupmenu = function( button_element, initial_options ){\n\t var convertedOptions = [];\n\t _.each( initial_options, function( optionVal, optionKey ){\n\t var newOption = { html: optionKey };\n\t\n\t // keys with null values indicate: header\n\t if( optionVal === null ){ // !optionVal? (null only?)\n\t newOption.header = true;\n\t\n\t // keys with function values indicate: a menu option\n\t } else if( jQuery.type( optionVal ) === 'function' ){\n\t newOption.func = optionVal;\n\t }\n\t //TODO:?? any other special optionVals?\n\t // there was no divider option originally\n\t convertedOptions.push( newOption );\n\t });\n\t return new PopupMenu( $( button_element ), convertedOptions );\n\t};\n\t\n\t/** Find all anchors in $parent (using selector) and covert anchors into a PopupMenu options map.\n\t * @param {jQuery} $parent the element that contains the links to convert to options\n\t * @param {String} selector jq selector string to find links\n\t * @returns {Object[]} the options array to initialize a PopupMenu\n\t */\n\t//TODO: lose parent and selector, pass in array of links, use map to return options\n\tPopupMenu.convertLinksToOptions = function( $parent, selector ){\n\t $parent = $( $parent );\n\t selector = selector || 'a';\n\t var options = [];\n\t $parent.find( selector ).each( function( elem, i ){\n\t var option = {}, $link = $( elem );\n\t\n\t // convert link text to the option text (html) and the href into the option func\n\t option.html = $link.text();\n\t if( $link.attr( 'href' ) ){\n\t var linkHref = $link.attr( 'href' ),\n\t linkTarget = $link.attr( 'target' ),\n\t confirmText = $link.attr( 'confirm' );\n\t\n\t option.func = function(){\n\t // if there's a \"confirm\" attribute, throw up a confirmation dialog, and\n\t // if the user cancels - do nothing\n\t if( ( confirmText ) && ( !confirm( confirmText ) ) ){ return; }\n\t\n\t // if there's no confirm attribute, or the user accepted the confirm dialog:\n\t switch( linkTarget ){\n\t // relocate the center panel\n\t case '_parent':\n\t window.parent.location = linkHref;\n\t break;\n\t\n\t // relocate the entire window\n\t case '_top':\n\t window.top.location = linkHref;\n\t break;\n\t\n\t // relocate this panel\n\t default:\n\t window.location = linkHref;\n\t }\n\t };\n\t }\n\t options.push( option );\n\t });\n\t return options;\n\t};\n\t\n\t/** Create a single popupmenu from existing DOM button and anchor elements\n\t * @param {jQuery} $buttonElement the element that when clicked will open the menu\n\t * @param {jQuery} $menuElement the element that contains the anchors to convert into a menu\n\t * @param {String} menuElementLinkSelector jq selector string used to find anchors to be made into menu options\n\t * @returns {PopupMenu} the PopupMenu (Backbone View) that can render, control the menu\n\t */\n\tPopupMenu.fromExistingDom = function( $buttonElement, $menuElement, menuElementLinkSelector ){\n\t $buttonElement = $( $buttonElement );\n\t $menuElement = $( $menuElement );\n\t var options = PopupMenu.convertLinksToOptions( $menuElement, menuElementLinkSelector );\n\t // we're done with the menu (having converted it to an options map)\n\t $menuElement.remove();\n\t return new PopupMenu( $buttonElement, options );\n\t};\n\t\n\t/** Create all popupmenus within a document or a more specific element\n\t * @param {DOMElement} parent the DOM element in which to search for popupmenus to build (defaults to document)\n\t * @param {String} menuSelector jq selector string to find popupmenu menu elements (defaults to \"div[popupmenu]\")\n\t * @param {Function} buttonSelectorBuildFn the function to build the jq button selector.\n\t * Will be passed $menuElement, parent.\n\t * (Defaults to return '#' + $menuElement.attr( 'popupmenu' ); )\n\t * @returns {PopupMenu[]} array of popupmenus created\n\t */\n\tPopupMenu.make_popup_menus = function( parent, menuSelector, buttonSelectorBuildFn ){\n\t parent = parent || document;\n\t // orig. Glx popupmenu menus have a (non-std) attribute 'popupmenu'\n\t // which contains the id of the button that activates the menu\n\t menuSelector = menuSelector || 'div[popupmenu]';\n\t // default to (orig. Glx) matching button to menu by using the popupmenu attr of the menu as the id of the button\n\t buttonSelectorBuildFn = buttonSelectorBuildFn || function( $menuElement, parent ){\n\t return '#' + $menuElement.attr( 'popupmenu' );\n\t };\n\t\n\t // aggregate and return all PopupMenus\n\t var popupMenusCreated = [];\n\t $( parent ).find( menuSelector ).each( function(){\n\t var $menuElement = $( this ),\n\t $buttonElement = $( parent ).find( buttonSelectorBuildFn( $menuElement, parent ) );\n\t popupMenusCreated.push( PopupMenu.fromDom( $buttonElement, $menuElement ) );\n\t $buttonElement.addClass( 'popup' );\n\t });\n\t return popupMenusCreated;\n\t};\n\t\n\t\n\t// =============================================================================\n\t return PopupMenu;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/** Renders the color picker used e.g. in the tool form **/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\t return Backbone.View.extend({\n\t colors: {\n\t standard: ['c00000','ff0000','ffc000','ffff00','92d050','00b050','00b0f0','0070c0','002060','7030a0'],\n\t base : ['ffffff','000000','eeece1','1f497d','4f81bd','c0504d','9bbb59','8064a2','4bacc6','f79646'],\n\t theme :[['f2f2f2','7f7f7f','ddd9c3','c6d9f0','dbe5f1','f2dcdb','ebf1dd','e5e0ec','dbeef3','fdeada'],\n\t ['d8d8d8','595959','c4bd97','8db3e2','b8cce4','e5b9b7','d7e3bc','ccc1d9','b7dde8','fbd5b5'],\n\t ['bfbfbf','3f3f3f','938953','548dd4','95b3d7','d99694','c3d69b','b2a2c7','92cddc','fac08f'],\n\t ['a5a5a5','262626','494429','17365d','366092','953734','76923c','5f497a','31859b','e36c09'],\n\t ['7f7f7e','0c0c0c','1d1b10','0f243e','244061','632423','4f6128','3f3151','205867','974806']]\n\t },\n\t initialize : function( options ) {\n\t this.options = Utils.merge( options, {} );\n\t this.setElement( this._template() );\n\t\n\t // link components\n\t this.$panel = this.$( '.ui-color-picker-panel' );\n\t this.$view = this.$( '.ui-color-picker-view' );\n\t this.$value = this.$( '.ui-color-picker-value' );\n\t this.$header = this.$( '.ui-color-picker-header' );\n\t\n\t // build panel\n\t this._build();\n\t\n\t // hide panel on start up\n\t this.visible = false;\n\t\n\t // set initial value\n\t this.value( this.options.value );\n\t\n\t // link boxes\n\t this.$boxes = this.$( '.ui-color-picker-box' );\n\t\n\t // add event handler\n\t var self = this;\n\t this.$boxes.on( 'click', function() {\n\t self.value( $( this ).css( 'background-color' ) );\n\t self.$header.trigger( 'click' );\n\t } );\n\t this.$header.on( 'click', function() {\n\t self.visible = !self.visible;\n\t if ( self.visible ) {\n\t self.$view.fadeIn( 'fast' );\n\t } else {\n\t self.$view.fadeOut( 'fast' );\n\t }\n\t } );\n\t },\n\t\n\t // value\n\t value : function ( new_val ) {\n\t if ( new_val !== undefined && new_val !== null ) {\n\t // update color value\n\t this.$value.css( 'background-color', new_val );\n\t \n\t // check selected color in panel\n\t this.$( '.ui-color-picker-box' ).empty();\n\t this.$( this._getValue() ).html( this._templateCheck() );\n\t\n\t // trigger custom event\n\t this.options.onchange && this.options.onchange( new_val );\n\t }\n\t\n\t // return current value\n\t return this._getValue();\n\t },\n\t\n\t // get value from dom\n\t _getValue: function() {\n\t var rgb = this.$value.css( 'background-color' );\n\t rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n\t if ( rgb ) {\n\t function hex( x ) {\n\t return ( '0' + parseInt( x ).toString( 16 ) ).slice( -2 );\n\t }\n\t return '#' + hex( rgb[ 1] ) + hex( rgb[ 2 ] ) + hex( rgb[ 3 ] );\n\t } else {\n\t return null;\n\t }\n\t },\n\t\n\t // build panel\n\t _build: function() {\n\t var $content = this._content({\n\t label : 'Theme Colors',\n\t colors : this.colors.base,\n\t padding : 10\n\t });\n\t for ( var i in this.colors.theme ) {\n\t var line_def = {};\n\t if ( i == 0 ) {\n\t line_def[ 'bottom' ] = true;\n\t } else {\n\t if ( i != this.colors.theme.length - 1 ) {\n\t line_def[ 'top' ] = true;\n\t line_def[ 'bottom' ] = true;\n\t } else {\n\t line_def[ 'top' ] = true;\n\t line_def[ 'padding' ] = 5;\n\t }\n\t }\n\t line_def[ 'colors' ] = this.colors.theme[ i ];\n\t this._content( line_def );\n\t }\n\t this._content({\n\t label : 'Standard Colors',\n\t colors : this.colors.standard,\n\t padding : 5\n\t });\n\t },\n\t\n\t // create content\n\t _content: function( options ) {\n\t // get parameters\n\t var label = options.label;\n\t var colors = options.colors;\n\t var padding = options.padding;\n\t var top = options.top;\n\t var bottom = options.bottom;\n\t\n\t // create lines\n\t var $content = $( this._templateContent() );\n\t\n\t // set label\n\t var $label = $content.find( '.label' );\n\t if ( options.label ) {\n\t $label.html( options.label );\n\t } else {\n\t $label.hide();\n\t }\n\t\n\t // build line\n\t var $line = $content.find( '.line' );\n\t this.$panel.append( $content );\n\t for ( var i in colors ) {\n\t var $box = $( this._templateBox( colors[ i ] ) );\n\t if ( top ) {\n\t $box.css( 'border-top', 'none' );\n\t $box.css( 'border-top-left-radius', '0px' );\n\t $box.css( 'border-top-right-radius', '0px' );\n\t }\n\t if ( bottom ) {\n\t $box.css( 'border-bottom', 'none' );\n\t $box.css( 'border-bottom-left-radius', '0px' );\n\t $box.css( 'border-bottom-right-radius', '0px' );\n\t }\n\t $line.append( $box );\n\t }\n\t if (padding) {\n\t $line.css( 'padding-bottom', padding );\n\t }\n\t return $content;\n\t },\n\t\n\t // check icon\n\t _templateCheck: function() {\n\t return '
                    ';\n\t },\n\t\n\t // content template\n\t _templateContent: function() {\n\t return '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ';\n\t },\n\t\n\t // box template\n\t _templateBox: function( color ) {\n\t return '
                    ';\n\t },\n\t\n\t // template\n\t _template: function() {\n\t return '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    Select a color
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    ' +\n\t '
                    '\n\t '
                    ';\n\t }\n\t });\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function($) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(25)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Options) {\n\t\n\t/**\n\t * This class creates/wraps a drill down element.\n\t */\n\tvar View = Options.BaseIcons.extend({\n\t // initialize\n\t initialize: function(options) {\n\t options.type = options.display || 'checkbox';\n\t options.multiple = (options.display == 'checkbox');\n\t Options.BaseIcons.prototype.initialize.call(this, options);\n\t this.initial = true;\n\t },\n\t\n\t // set expand states for initial value\n\t value: function (new_val) {\n\t var val = Options.BaseIcons.prototype.value.call(this, new_val);\n\t if (this.initial && val !== null && this.header_index) {\n\t this.initial = false;\n\t var values = val;\n\t if (!$.isArray(values)) {\n\t values = [values];\n\t }\n\t for (var i in values) {\n\t var list = this.header_index[values[i]];\n\t for (var j in list) {\n\t this._setState(list[j], true);\n\t }\n\t }\n\t }\n\t return val;\n\t },\n\t\n\t /** Expand/collapse a sub group\n\t */\n\t _setState: function (header_id, is_expanded) {\n\t var $button = this.$('.button-' + header_id);\n\t var $subgroup = this.$('.subgroup-' + header_id);\n\t $button.data('is_expanded', is_expanded);\n\t if (is_expanded) {\n\t $subgroup.fadeIn('fast')\n\t $button.removeClass('fa-plus-square');\n\t $button.addClass('fa-minus-square');\n\t } else {\n\t $subgroup.hide();\n\t $button.removeClass('fa-minus-square');\n\t $button.addClass('fa-plus-square');\n\t }\n\t },\n\t\n\t /** Template to create options tree\n\t */\n\t _templateOptions: function(options) {\n\t // link this\n\t var self = this;\n\t\n\t // link data\n\t this.header_index = {};\n\t \n\t // attach event handler\n\t function attach($el, header_id) {\n\t var $button = $el.find('.button-' + header_id);\n\t $button.on('click', function() {\n\t self._setState(header_id, !$button.data('is_expanded'));\n\t });\n\t }\n\t\n\t // recursive function which iterates through options\n\t function iterate ($tmpl, options, header) {\n\t header = header || [];\n\t for (i in options) {\n\t // current option level in hierarchy\n\t var level = options[i];\n\t\n\t // check for options\n\t var has_options = level.options.length > 0;\n\t\n\t // copy current header list\n\t var new_header = header.slice(0);\n\t\n\t // keep track of header list\n\t self.header_index[level.value] = new_header.slice(0);\n\t\n\t // build template\n\t var $group = $('
                    ');\n\t if (has_options) {\n\t // create button and subgroup\n\t var header_id = Utils.uid();\n\t var $button = $('');\n\t var $subgroup = $('
                    ');\n\t\n\t // keep track of button and subgroup\n\t new_header.push(header_id);\n\t\n\t // create expandable header section\n\t var $buttongroup = $('
                    ');\n\t $buttongroup.append($button);\n\t $buttongroup.append(self._templateOption({\n\t label: level.name,\n\t value: level.value\n\t }));\n\t $group.append($buttongroup);\n\t iterate($subgroup, level.options, new_header);\n\t $group.append($subgroup);\n\t\n\t // attach expand/collapse events\n\t attach($group, header_id);\n\t } else {\n\t // append child options\n\t $group.append(self._templateOption({\n\t label: level.name,\n\t value: level.value\n\t }));\n\t }\n\t $tmpl.append($group);\n\t }\n\t }\n\t\n\t // iterate through options and create dom\n\t var $tmpl = $('
                    ');\n\t iterate($tmpl, options);\n\t\n\t // return template\n\t return $tmpl;\n\t },\n\t\n\t /** Template for drill down view\n\t */\n\t _template: function(options) {\n\t return '
                    ';\n\t }\n\t});\n\t\n\treturn {\n\t View: View\n\t}\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $, _) {/**\n\t * This class creates/wraps a default html select field as backbone class.\n\t */\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4), __webpack_require__(16)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils, Buttons) {\n\tvar View = Backbone.View.extend({\n\t // options\n\t optionsDefault: {\n\t id : Utils.uid(),\n\t cls : 'ui-select',\n\t error_text : 'No options available',\n\t empty_text : 'Nothing selected',\n\t visible : true,\n\t wait : false,\n\t multiple : false,\n\t searchable : true,\n\t optional : false\n\t },\n\t\n\t // initialize\n\t initialize: function(options) {\n\t // link this\n\t var self = this;\n\t this.model = new Backbone.Model();\n\t\n\t // configure options\n\t this.options = Utils.merge(options, this.optionsDefault);\n\t\n\t // create new element\n\t this.setElement(this._template(this.options));\n\t\n\t // link elements\n\t this.$select = this.$el.find('.select');\n\t this.$icon_dropdown = this.$el.find('.icon-dropdown');\n\t this.$icon_dropdown.on( 'click', function() { self.$select.select2 && self.$select.select2( 'open' ) });\n\t\n\t // allow regular multi-select field to be resized\n\t var minHeight = null;\n\t this.$('.icon-resize').on('mousedown', function(event) {\n\t var currentY = event.pageY;\n\t var currentHeight = self.$select.height();\n\t minHeight = minHeight || currentHeight;\n\t $('#dd-helper').show().on('mousemove', function(event) {\n\t self.$select.height(Math.max(currentHeight + (event.pageY - currentY), minHeight));\n\t }).on('mouseup mouseleave', function() {\n\t $('#dd-helper').hide().off();\n\t });\n\t });\n\t\n\t // multiple select fields have an additional button and other custom properties\n\t if (this.options.multiple) {\n\t // create select all button\n\t if (this.options.searchable) {\n\t this.all_button = new Buttons.ButtonCheck({\n\t onclick: function() {\n\t var new_value = [];\n\t if (self.all_button.value() !== 0) {\n\t new_value = self._availableOptions();\n\t }\n\t self.value(new_value);\n\t self.trigger('change');\n\t }\n\t });\n\t this.$el.prepend(this.all_button.$el);\n\t } else {\n\t this.$el.addClass('ui-select-multiple');\n\t }\n\t this.$select.prop('multiple', true);\n\t this.$icon_dropdown.remove();\n\t }\n\t\n\t // update initial options\n\t this.update(this.options.data);\n\t\n\t // set initial value\n\t if (this.options.value !== undefined) {\n\t this.value(this.options.value);\n\t }\n\t\n\t // show/hide\n\t if (!this.options.visible) {\n\t this.hide();\n\t }\n\t\n\t // wait\n\t if (this.options.wait) {\n\t this.wait();\n\t } else {\n\t this.show();\n\t }\n\t\n\t // add change event. fires only on user activity\n\t this.$select.on('change', function() {\n\t self.trigger('change');\n\t });\n\t\n\t // add change event. fires on trigger\n\t this.on('change', function() {\n\t self.options.onchange && self.options.onchange(this.value());\n\t });\n\t },\n\t\n\t /** Return/Set current selection\n\t */\n\t value: function (new_value) {\n\t // set new value\n\t if (new_value !== undefined) {\n\t if (new_value === null) {\n\t new_value = '__null__';\n\t }\n\t if (this.exists(new_value) || this.options.multiple) {\n\t this.$select.val(new_value);\n\t if (this.$select.select2) {\n\t this.$select.select2('val', new_value);\n\t }\n\t }\n\t }\n\t // get current value\n\t var current = this._getValue();\n\t if (this.all_button) {\n\t this.all_button.value($.isArray(current) && current.length || 0, this._size());\n\t }\n\t return current;\n\t },\n\t\n\t /** Return the first select option\n\t */\n\t first: function() {\n\t var options = this.$select.find('option').first();\n\t if (options.length > 0) {\n\t return options.val();\n\t } else {\n\t return null;\n\t }\n\t },\n\t\n\t /** Return the label/text of the current selection\n\t */\n\t text: function () {\n\t return this.$select.find('option:selected').text();\n\t },\n\t\n\t /** Show the select field\n\t */\n\t show: function() {\n\t this.unwait();\n\t this.$select.show();\n\t this.$el.show();\n\t },\n\t\n\t /** Hide the select field\n\t */\n\t hide: function() {\n\t this.$el.hide();\n\t },\n\t\n\t /** Show a spinner indicating that the select options are currently loaded\n\t */\n\t wait: function() {\n\t this.$icon_dropdown.removeClass();\n\t this.$icon_dropdown.addClass('icon-dropdown fa fa-spinner fa-spin');\n\t },\n\t\n\t /** Hide spinner indicating that the request has been completed\n\t */\n\t unwait: function() {\n\t this.$icon_dropdown.removeClass();\n\t this.$icon_dropdown.addClass('icon-dropdown fa fa-caret-down');\n\t },\n\t\n\t /** Returns true if the field is disabled\n\t */\n\t disabled: function() {\n\t return this.$select.is(':disabled');\n\t },\n\t\n\t /** Enable the select field\n\t */\n\t enable: function() {\n\t this.$select.prop('disabled', false);\n\t },\n\t\n\t /** Disable the select field\n\t */\n\t disable: function() {\n\t this.$select.prop('disabled', true);\n\t },\n\t\n\t /** Update all available options at once\n\t */\n\t add: function( options, sorter ) {\n\t _.each( this.model.get( 'options' ), function( v ) {\n\t !_.findWhere( options, v ) && options.push( v );\n\t });\n\t sorter && options.sort( sorter );\n\t this.update( options );\n\t },\n\t update: function(options) {\n\t // backup current value\n\t var current = this._getValue();\n\t\n\t // remove all options\n\t this.$select.find('option').remove();\n\t\n\t // add optional field\n\t if (!this.options.multiple && this.options.optional) {\n\t this.$select.append(this._templateOption({value : '__null__', label : this.options.empty_text}));\n\t }\n\t\n\t // add new options\n\t this.model.set( 'options', options );\n\t for (var key in options) {\n\t this.$select.append(this._templateOption(options[key]));\n\t }\n\t\n\t // count remaining entries\n\t if (this._size() == 0) {\n\t // disable select field\n\t this.disable();\n\t\n\t // create placeholder\n\t this.$select.append(this._templateOption({value : '__null__', label : this.options.error_text}));\n\t } else {\n\t // enable select field\n\t this.enable();\n\t }\n\t\n\t // update to searchable field (in this case select2)\n\t if (this.options.searchable) {\n\t this.$select.select2('destroy');\n\t this.$select.select2({ closeOnSelect: !this.options.multiple });\n\t this.$( '.select2-container .select2-search input' ).off( 'blur' );\n\t }\n\t\n\t // set previous value\n\t this.value(current);\n\t\n\t // check if any value was set\n\t if (this._getValue() === null && !(this.options.multiple && this.options.optional)) {\n\t this.value(this.first());\n\t }\n\t },\n\t\n\t /** Set the custom onchange callback function\n\t */\n\t setOnChange: function(callback) {\n\t this.options.onchange = callback;\n\t },\n\t\n\t /** Check if a value is an existing option\n\t */\n\t exists: function(value) {\n\t return this.$select.find('option[value=\"' + value + '\"]').length > 0;\n\t },\n\t\n\t /** Get current value from dom\n\t */\n\t _getValue: function() {\n\t var val = this.$select.val();\n\t if (!Utils.validate(val)) {\n\t return null;\n\t }\n\t return val;\n\t },\n\t\n\t /** Returns all currently available options\n\t */\n\t _availableOptions: function() {\n\t var available = [];\n\t this.$select.find('option').each(function(i, e){\n\t available.push($(e).attr('value'));\n\t });\n\t return available;\n\t },\n\t\n\t /** Number of available options\n\t */\n\t _size: function() {\n\t return this.$select.find('option').length;\n\t },\n\t\n\t /** Template for select options\n\t */\n\t _templateOption: function(options) {\n\t return '';\n\t },\n\t\n\t /** Template for select view\n\t */\n\t _template: function(options) {\n\t return '
                    ' +\n\t '' +\n\t '
                    ' +\n\t '
                    ';\n\t }\n\t});\n\t\n\treturn {\n\t View : View\n\t};\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t\n\t// model\n\tvar Model = Backbone.Model.extend({\n\t defaults: {\n\t extension : 'auto',\n\t genome : '?',\n\t url_paste : '',\n\t status : 'init',\n\t info : null,\n\t file_name : '',\n\t file_mode : '',\n\t file_size : 0,\n\t file_type : null,\n\t file_path : '',\n\t file_data : null,\n\t percentage : 0,\n\t space_to_tab : false,\n\t to_posix_lines : true,\n\t enabled : true\n\t },\n\t reset: function(attr) {\n\t this.clear().set(this.defaults).set(attr);\n\t }\n\t});\n\t\n\t// collection\n\tvar Collection = Backbone.Collection.extend({\n\t model: Model\n\t});\n\t\n\t// return\n\treturn {\n\t Model: Model,\n\t Collection : Collection\n\t};\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 59 */,\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/**\n\t * This class defines a queue to ensure that multiple deferred callbacks are executed sequentially.\n\t */\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils ) {\n\treturn Backbone.Model.extend({\n\t initialize: function(){\n\t this.active = {};\n\t this.last = null;\n\t },\n\t\n\t /** Adds a callback to the queue. Upon execution a deferred object is parsed to the callback i.e. callback( deferred ).\n\t * If the callback does not take any arguments, the deferred is resolved instantly.\n\t */\n\t execute: function( callback ) {\n\t var self = this;\n\t var id = Utils.uid();\n\t var has_deferred = callback.length > 0;\n\t\n\t // register process\n\t this.active[ id ] = true;\n\t\n\t // deferred process\n\t var process = $.Deferred();\n\t process.promise().always(function() {\n\t delete self.active[ id ];\n\t has_deferred && Galaxy.emit.debug( 'deferred::execute()', this.state().charAt(0).toUpperCase() + this.state().slice(1) + ' ' + id );\n\t });\n\t\n\t // deferred queue\n\t $.when( this.last ).always(function() {\n\t if ( self.active[ id ] ) {\n\t has_deferred && Galaxy.emit.debug( 'deferred::execute()', 'Running ' + id );\n\t callback( process );\n\t !has_deferred && process.resolve();\n\t } else {\n\t process.reject();\n\t }\n\t });\n\t this.last = process.promise();\n\t },\n\t\n\t /** Resets the promise queue. All currently queued but unexecuted callbacks/promises will be rejected.\n\t */\n\t reset: function() {\n\t Galaxy.emit.debug('deferred::execute()', 'Reset');\n\t for ( var i in this.active ) {\n\t this.active[ i ] = false;\n\t }\n\t },\n\t\n\t /** Returns true if all processes are done.\n\t */\n\t ready: function() {\n\t return $.isEmptyObject( this.active );\n\t }\n\t});\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t// ============================================================================\n\tfunction get( key, queryString ){\n\t queryString = queryString || window.location.search.substr( 1 );\n\t var keyRegex = new RegExp( key + '=([^&#$]+)' ),\n\t matches = queryString.match( keyRegex );\n\t if( !matches || !matches.length ){\n\t return undefined;\n\t }\n\t matches = matches.splice( 1 );\n\t if( matches.length === 1 ){\n\t return matches[0];\n\t }\n\t return matches;\n\t}\n\t\n\tfunction parse( queryString ){\n\t if( !queryString ){ return {}; }\n\t var parsed = {},\n\t split = queryString.split( '&' );\n\t split.forEach( function( pairString ){\n\t var pair = pairString.split( '=' );\n\t parsed[ pair[0] ] = decodeURI( pair[1] );\n\t });\n\t return parsed;\n\t}\n\t\n\t// ============================================================================\n\t return {\n\t get : get,\n\t parse : parse,\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 62 */,\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Handlebars = __webpack_require__(12);\n\tfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\n\tmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n\t var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"\\n
                    \\n
                    \\n
                    \";\n\t},\"useData\":true});\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Handlebars = __webpack_require__(12);\n\tfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\n\tmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n\t var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"
                    \\n \\n
                    \\n \"\n\t + ((stack1 = ((helper = (helper = helpers.html || (depth0 != null ? depth0.html : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"html\",\"hash\":{},\"data\":data}) : helper))) != null ? stack1 : \"\")\n\t + \"\\n
                    \\n
                    \\n \"\n\t + alias4(((helper = (helper = helpers.help || (depth0 != null ? depth0.help : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"help\",\"hash\":{},\"data\":data}) : helper)))\n\t + \"\\n
                    \\n
                    \\n
                    \\n\";\n\t},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n\t var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"
                    \"\n\t + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n\t + \" (version \"\n\t + alias4(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n\t + \")
                    \\n
                    \\n\"\n\t + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.inputs : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n\t + \"
                    \\n
                    \\n \\n
                    \\n
                    \\n
                    \"\n\t + alias4(((helper = (helper = helpers.help || (depth0 != null ? depth0.help : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"help\",\"hash\":{},\"data\":data}) : helper)))\n\t + \"
                    \\n
                    \";\n\t},\"useData\":true});\n\n/***/ },\n/* 65 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Handlebars = __webpack_require__(12);\n\tfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\n\tmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n\t var alias1=container.lambda, alias2=container.escapeExpression;\n\t\n\t return \"\"\n\t + alias2(alias1(depth0, depth0))\n\t + \" \";\n\t},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n\t var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"\"\n\t + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.labels : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n\t + \"\\n\"\n\t + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n\t + \"\\n\"\n\t + alias4(((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"description\",\"hash\":{},\"data\":data}) : helper)))\n\t + \"\\n\";\n\t},\"useData\":true});\n\n/***/ },\n/* 66 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Handlebars = __webpack_require__(12);\n\tfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\n\tmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n\t var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\t\n\t return \"\\n \\n\\n\";\n\t},\"useData\":true});\n\n/***/ },\n/* 67 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\t\n\tvar _handlebarsBase = __webpack_require__(27);\n\t\n\tvar base = _interopRequireWildcard(_handlebarsBase);\n\t\n\t// Each of these augment the Handlebars object. No need to setup here.\n\t// (This is done to easily share code between commonjs and browse envs)\n\t\n\tvar _handlebarsSafeString = __webpack_require__(81);\n\t\n\tvar _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);\n\t\n\tvar _handlebarsException = __webpack_require__(9);\n\t\n\tvar _handlebarsException2 = _interopRequireDefault(_handlebarsException);\n\t\n\tvar _handlebarsUtils = __webpack_require__(8);\n\t\n\tvar Utils = _interopRequireWildcard(_handlebarsUtils);\n\t\n\tvar _handlebarsRuntime = __webpack_require__(80);\n\t\n\tvar runtime = _interopRequireWildcard(_handlebarsRuntime);\n\t\n\tvar _handlebarsNoConflict = __webpack_require__(79);\n\t\n\tvar _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);\n\t\n\t// For compatibility and usage outside of module systems, make the Handlebars object a namespace\n\tfunction create() {\n\t var hb = new base.HandlebarsEnvironment();\n\t\n\t Utils.extend(hb, base);\n\t hb.SafeString = _handlebarsSafeString2['default'];\n\t hb.Exception = _handlebarsException2['default'];\n\t hb.Utils = Utils;\n\t hb.escapeExpression = Utils.escapeExpression;\n\t\n\t hb.VM = runtime;\n\t hb.template = function (spec) {\n\t return runtime.template(spec, hb);\n\t };\n\t\n\t return hb;\n\t}\n\t\n\tvar inst = create();\n\tinst.create = create;\n\t\n\t_handlebarsNoConflict2['default'](inst);\n\t\n\tinst['default'] = inst;\n\t\n\texports['default'] = inst;\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oYW5kbGViYXJzLnJ1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OEJBQXNCLG1CQUFtQjs7SUFBN0IsSUFBSTs7Ozs7b0NBSU8sMEJBQTBCOzs7O21DQUMzQix3QkFBd0I7Ozs7K0JBQ3ZCLG9CQUFvQjs7SUFBL0IsS0FBSzs7aUNBQ1Esc0JBQXNCOztJQUFuQyxPQUFPOztvQ0FFSSwwQkFBMEI7Ozs7O0FBR2pELFNBQVMsTUFBTSxHQUFHO0FBQ2hCLE1BQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0FBRTFDLE9BQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLElBQUUsQ0FBQyxVQUFVLG9DQUFhLENBQUM7QUFDM0IsSUFBRSxDQUFDLFNBQVMsbUNBQVksQ0FBQztBQUN6QixJQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNqQixJQUFFLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDOztBQUU3QyxJQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNoQixJQUFFLENBQUMsUUFBUSxHQUFHLFVBQVMsSUFBSSxFQUFFO0FBQzNCLFdBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDbkMsQ0FBQzs7QUFFRixTQUFPLEVBQUUsQ0FBQztDQUNYOztBQUVELElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztBQUVyQixrQ0FBVyxJQUFJLENBQUMsQ0FBQzs7QUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzs7cUJBRVIsSUFBSSIsImZpbGUiOiJoYW5kbGViYXJzLnJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iXX0=\n\n\n/***/ },\n/* 68 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.registerDefaultDecorators = registerDefaultDecorators;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _decoratorsInline = __webpack_require__(69);\n\t\n\tvar _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);\n\t\n\tfunction registerDefaultDecorators(instance) {\n\t _decoratorsInline2['default'](instance);\n\t}\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Z0NBQTJCLHFCQUFxQjs7OztBQUV6QyxTQUFTLHlCQUF5QixDQUFDLFFBQVEsRUFBRTtBQUNsRCxnQ0FBZSxRQUFRLENBQUMsQ0FBQztDQUMxQiIsImZpbGUiOiJkZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlZ2lzdGVySW5saW5lIGZyb20gJy4vZGVjb3JhdG9ycy9pbmxpbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICByZWdpc3RlcklubGluZShpbnN0YW5jZSk7XG59XG5cbiJdfQ==\n\n\n/***/ },\n/* 69 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerDecorator('inline', function (fn, props, container, options) {\n\t var ret = fn;\n\t if (!props.partials) {\n\t props.partials = {};\n\t ret = function (context, options) {\n\t // Create a new partials stack frame prior to exec.\n\t var original = container.partials;\n\t container.partials = _utils.extend({}, original, props.partials);\n\t var ret = fn(context, options);\n\t container.partials = original;\n\t return ret;\n\t };\n\t }\n\t\n\t props.partials[options.args[0]] = options.fn;\n\t\n\t return ret;\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMvaW5saW5lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQXFCLFVBQVU7O3FCQUVoQixVQUFTLFFBQVEsRUFBRTtBQUNoQyxVQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNiLFFBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ25CLFdBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQUcsR0FBRyxVQUFTLE9BQU8sRUFBRSxPQUFPLEVBQUU7O0FBRS9CLFlBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDbEMsaUJBQVMsQ0FBQyxRQUFRLEdBQUcsY0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRCxZQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLGlCQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixlQUFPLEdBQUcsQ0FBQztPQUNaLENBQUM7S0FDSDs7QUFFRCxTQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUU3QyxXQUFPLEdBQUcsQ0FBQztHQUNaLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6ImlubGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIGxldCByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFydGlhbHMgc3RhY2sgZnJhbWUgcHJpb3IgdG8gZXhlYy5cbiAgICAgICAgbGV0IG9yaWdpbmFsID0gY29udGFpbmVyLnBhcnRpYWxzO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBleHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7XG4gICAgICAgIGxldCByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHByb3BzLnBhcnRpYWxzW29wdGlvbnMuYXJnc1swXV0gPSBvcHRpb25zLmZuO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG4iXX0=\n\n\n/***/ },\n/* 70 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.registerDefaultHelpers = registerDefaultHelpers;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _helpersBlockHelperMissing = __webpack_require__(71);\n\t\n\tvar _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);\n\t\n\tvar _helpersEach = __webpack_require__(72);\n\t\n\tvar _helpersEach2 = _interopRequireDefault(_helpersEach);\n\t\n\tvar _helpersHelperMissing = __webpack_require__(73);\n\t\n\tvar _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);\n\t\n\tvar _helpersIf = __webpack_require__(74);\n\t\n\tvar _helpersIf2 = _interopRequireDefault(_helpersIf);\n\t\n\tvar _helpersLog = __webpack_require__(75);\n\t\n\tvar _helpersLog2 = _interopRequireDefault(_helpersLog);\n\t\n\tvar _helpersLookup = __webpack_require__(76);\n\t\n\tvar _helpersLookup2 = _interopRequireDefault(_helpersLookup);\n\t\n\tvar _helpersWith = __webpack_require__(77);\n\t\n\tvar _helpersWith2 = _interopRequireDefault(_helpersWith);\n\t\n\tfunction registerDefaultHelpers(instance) {\n\t _helpersBlockHelperMissing2['default'](instance);\n\t _helpersEach2['default'](instance);\n\t _helpersHelperMissing2['default'](instance);\n\t _helpersIf2['default'](instance);\n\t _helpersLog2['default'](instance);\n\t _helpersLookup2['default'](instance);\n\t _helpersWith2['default'](instance);\n\t}\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7eUNBQXVDLGdDQUFnQzs7OzsyQkFDOUMsZ0JBQWdCOzs7O29DQUNQLDBCQUEwQjs7Ozt5QkFDckMsY0FBYzs7OzswQkFDYixlQUFlOzs7OzZCQUNaLGtCQUFrQjs7OzsyQkFDcEIsZ0JBQWdCOzs7O0FBRWxDLFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO0FBQy9DLHlDQUEyQixRQUFRLENBQUMsQ0FBQztBQUNyQywyQkFBYSxRQUFRLENBQUMsQ0FBQztBQUN2QixvQ0FBc0IsUUFBUSxDQUFDLENBQUM7QUFDaEMseUJBQVcsUUFBUSxDQUFDLENBQUM7QUFDckIsMEJBQVksUUFBUSxDQUFDLENBQUM7QUFDdEIsNkJBQWUsUUFBUSxDQUFDLENBQUM7QUFDekIsMkJBQWEsUUFBUSxDQUFDLENBQUM7Q0FDeEIiLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIl19\n\n\n/***/ },\n/* 71 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('blockHelperMissing', function (context, options) {\n\t var inverse = options.inverse,\n\t fn = options.fn;\n\t\n\t if (context === true) {\n\t return fn(this);\n\t } else if (context === false || context == null) {\n\t return inverse(this);\n\t } else if (_utils.isArray(context)) {\n\t if (context.length > 0) {\n\t if (options.ids) {\n\t options.ids = [options.name];\n\t }\n\t\n\t return instance.helpers.each(context, options);\n\t } else {\n\t return inverse(this);\n\t }\n\t } else {\n\t if (options.data && options.ids) {\n\t var data = _utils.createFrame(options.data);\n\t data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);\n\t options = { data: data };\n\t }\n\t\n\t return fn(context, options);\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBc0QsVUFBVTs7cUJBRWpELFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3ZFLFFBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPO1FBQ3pCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDcEIsYUFBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakIsTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUMvQyxhQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QixNQUFNLElBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUMzQixVQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3RCLFlBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUNmLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCOztBQUVELGVBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQ2hELE1BQU07QUFDTCxlQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN0QjtLQUNGLE1BQU07QUFDTCxVQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixZQUFJLElBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLGVBQU8sR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztPQUN4Qjs7QUFFRCxhQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0I7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJibG9jay1oZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGNyZWF0ZUZyYW1lLCBpc0FycmF5fSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgbGV0IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgaWYgKGNvbnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgICBvcHRpb25zLmlkcyA9IFtvcHRpb25zLm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGxldCBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHtkYXRhOiBkYXRhfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=\n\n\n/***/ },\n/* 72 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\tvar _exception = __webpack_require__(9);\n\t\n\tvar _exception2 = _interopRequireDefault(_exception);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('each', function (context, options) {\n\t if (!options) {\n\t throw new _exception2['default']('Must pass iterator to #each');\n\t }\n\t\n\t var fn = options.fn,\n\t inverse = options.inverse,\n\t i = 0,\n\t ret = '',\n\t data = undefined,\n\t contextPath = undefined;\n\t\n\t if (options.data && options.ids) {\n\t contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n\t }\n\t\n\t if (_utils.isFunction(context)) {\n\t context = context.call(this);\n\t }\n\t\n\t if (options.data) {\n\t data = _utils.createFrame(options.data);\n\t }\n\t\n\t function execIteration(field, index, last) {\n\t if (data) {\n\t data.key = field;\n\t data.index = index;\n\t data.first = index === 0;\n\t data.last = !!last;\n\t\n\t if (contextPath) {\n\t data.contextPath = contextPath + field;\n\t }\n\t }\n\t\n\t ret = ret + fn(context[field], {\n\t data: data,\n\t blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])\n\t });\n\t }\n\t\n\t if (context && typeof context === 'object') {\n\t if (_utils.isArray(context)) {\n\t for (var j = context.length; i < j; i++) {\n\t if (i in context) {\n\t execIteration(i, i, i === context.length - 1);\n\t }\n\t }\n\t } else {\n\t var priorKey = undefined;\n\t\n\t for (var key in context) {\n\t if (context.hasOwnProperty(key)) {\n\t // We're running the iterations one step out of sync so we can detect\n\t // the last iteration without have to scan the object twice and create\n\t // an itermediate keys array.\n\t if (priorKey !== undefined) {\n\t execIteration(priorKey, i - 1);\n\t }\n\t priorKey = key;\n\t i++;\n\t }\n\t }\n\t if (priorKey !== undefined) {\n\t execIteration(priorKey, i - 1, true);\n\t }\n\t }\n\t }\n\t\n\t if (i === 0) {\n\t ret = inverse(this);\n\t }\n\t\n\t return ret;\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvZWFjaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUErRSxVQUFVOzt5QkFDbkUsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksQ0FBQyxPQUFPLEVBQUU7QUFDWixZQUFNLDJCQUFjLDZCQUE2QixDQUFDLENBQUM7S0FDcEQ7O0FBRUQsUUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUU7UUFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU87UUFDekIsQ0FBQyxHQUFHLENBQUM7UUFDTCxHQUFHLEdBQUcsRUFBRTtRQUNSLElBQUksWUFBQTtRQUNKLFdBQVcsWUFBQSxDQUFDOztBQUVoQixRQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixpQkFBVyxHQUFHLHlCQUFrQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pGOztBQUVELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDaEIsVUFBSSxHQUFHLG1CQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQzs7QUFFRCxhQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN6QyxVQUFJLElBQUksRUFBRTtBQUNSLFlBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUN6QixZQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0FBRW5CLFlBQUksV0FBVyxFQUFFO0FBQ2YsY0FBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3hDO09BQ0Y7O0FBRUQsU0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQUksRUFBRSxJQUFJO0FBQ1YsbUJBQVcsRUFBRSxtQkFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDL0UsQ0FBQyxDQUFDO0tBQ0o7O0FBRUQsUUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQzFDLFVBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNwQixhQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxjQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDaEIseUJBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1dBQy9DO1NBQ0Y7T0FDRixNQUFNO0FBQ0wsWUFBSSxRQUFRLFlBQUEsQ0FBQzs7QUFFYixhQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRTtBQUN2QixjQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Ozs7QUFJL0IsZ0JBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQiwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDaEM7QUFDRCxvQkFBUSxHQUFHLEdBQUcsQ0FBQztBQUNmLGFBQUMsRUFBRSxDQUFDO1dBQ0w7U0FDRjtBQUNELFlBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQix1QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDWCxTQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCOztBQUVELFdBQU8sR0FBRyxDQUFDO0dBQ1osQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoiZWFjaC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ },\n/* 73 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _exception = __webpack_require__(9);\n\t\n\tvar _exception2 = _interopRequireDefault(_exception);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('helperMissing', function () /* [args, ]options */{\n\t if (arguments.length === 1) {\n\t // A missing field in a {{foo}} construct.\n\t return undefined;\n\t } else {\n\t // Someone is actually trying to call something, blow up.\n\t throw new _exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozt5QkFBc0IsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsaUNBQWdDO0FBQ3ZFLFFBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O0FBRTFCLGFBQU8sU0FBUyxDQUFDO0tBQ2xCLE1BQU07O0FBRUwsWUFBTSwyQkFBYyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDdkY7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJoZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIl19\n\n\n/***/ },\n/* 74 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('if', function (conditional, options) {\n\t if (_utils.isFunction(conditional)) {\n\t conditional = conditional.call(this);\n\t }\n\t\n\t // Default behavior is to render the positive path if the value is truthy and not empty.\n\t // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n\t // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n\t if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {\n\t return options.inverse(this);\n\t } else {\n\t return options.fn(this);\n\t }\n\t });\n\t\n\t instance.registerHelper('unless', function (conditional, options) {\n\t return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBa0MsVUFBVTs7cUJBRTdCLFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVMsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMzRCxRQUFJLGtCQUFXLFdBQVcsQ0FBQyxFQUFFO0FBQUUsaUJBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQUU7Ozs7O0FBS3RFLFFBQUksQUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxJQUFLLGVBQVEsV0FBVyxDQUFDLEVBQUU7QUFDdkUsYUFBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCLE1BQU07QUFDTCxhQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7R0FDRixDQUFDLENBQUM7O0FBRUgsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxXQUFXLEVBQUUsT0FBTyxFQUFFO0FBQy9ELFdBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztHQUN2SCxDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJpZi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNFbXB0eSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkgeyBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7IH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCkgfHwgaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pO1xuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ },\n/* 75 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('log', function () /* message, options */{\n\t var args = [undefined],\n\t options = arguments[arguments.length - 1];\n\t for (var i = 0; i < arguments.length - 1; i++) {\n\t args.push(arguments[i]);\n\t }\n\t\n\t var level = 1;\n\t if (options.hash.level != null) {\n\t level = options.hash.level;\n\t } else if (options.data && options.data.level != null) {\n\t level = options.data.level;\n\t }\n\t args[0] = level;\n\t\n\t instance.log.apply(instance, args);\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0NBQWlDO0FBQzlELFFBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2xCLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsVUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6Qjs7QUFFRCxRQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxRQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtBQUM5QixXQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ3JELFdBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM1QjtBQUNELFFBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0FBRWhCLFlBQVEsQ0FBQyxHQUFHLE1BQUEsQ0FBWixRQUFRLEVBQVMsSUFBSSxDQUFDLENBQUM7R0FDeEIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIl19\n\n\n/***/ },\n/* 76 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('lookup', function (obj, field) {\n\t return obj && obj[field];\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3JELFdBQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUMxQixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJsb29rdXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9va3VwJywgZnVuY3Rpb24ob2JqLCBmaWVsZCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iXX0=\n\n\n/***/ },\n/* 77 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\texports['default'] = function (instance) {\n\t instance.registerHelper('with', function (context, options) {\n\t if (_utils.isFunction(context)) {\n\t context = context.call(this);\n\t }\n\t\n\t var fn = options.fn;\n\t\n\t if (!_utils.isEmpty(context)) {\n\t var data = options.data;\n\t if (options.data && options.ids) {\n\t data = _utils.createFrame(options.data);\n\t data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);\n\t }\n\t\n\t return fn(context, {\n\t data: data,\n\t blockParams: _utils.blockParams([context], [data && data.contextPath])\n\t });\n\t } else {\n\t return options.inverse(this);\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvd2l0aC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUErRSxVQUFVOztxQkFFMUUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLENBQUMsZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNyQixVQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLFVBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQy9CLFlBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ2hGOztBQUVELGFBQU8sRUFBRSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLEVBQUUsSUFBSTtBQUNWLG1CQUFXLEVBQUUsbUJBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7T0FDaEUsQ0FBQyxDQUFDO0tBQ0osTUFBTTtBQUNMLGFBQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QjtHQUNGLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6IndpdGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==\n\n\n/***/ },\n/* 78 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\tvar logger = {\n\t methodMap: ['debug', 'info', 'warn', 'error'],\n\t level: 'info',\n\t\n\t // Maps a given level value to the `methodMap` indexes above.\n\t lookupLevel: function lookupLevel(level) {\n\t if (typeof level === 'string') {\n\t var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());\n\t if (levelMap >= 0) {\n\t level = levelMap;\n\t } else {\n\t level = parseInt(level, 10);\n\t }\n\t }\n\t\n\t return level;\n\t },\n\t\n\t // Can be overridden in the host environment\n\t log: function log(level) {\n\t level = logger.lookupLevel(level);\n\t\n\t if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n\t var method = logger.methodMap[level];\n\t if (!console[method]) {\n\t // eslint-disable-line no-console\n\t method = 'log';\n\t }\n\t\n\t for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t message[_key - 1] = arguments[_key];\n\t }\n\t\n\t console[method].apply(console, message); // eslint-disable-line no-console\n\t }\n\t }\n\t};\n\t\n\texports['default'] = logger;\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFzQixTQUFTOztBQUUvQixJQUFJLE1BQU0sR0FBRztBQUNYLFdBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUM3QyxPQUFLLEVBQUUsTUFBTTs7O0FBR2IsYUFBVyxFQUFFLHFCQUFTLEtBQUssRUFBRTtBQUMzQixRQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUM3QixVQUFJLFFBQVEsR0FBRyxlQUFRLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUQsVUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxRQUFRLENBQUM7T0FDbEIsTUFBTTtBQUNMLGFBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO09BQzdCO0tBQ0Y7O0FBRUQsV0FBTyxLQUFLLENBQUM7R0FDZDs7O0FBR0QsS0FBRyxFQUFFLGFBQVMsS0FBSyxFQUFjO0FBQy9CLFNBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVsQyxRQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDL0UsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxVQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFOztBQUNwQixjQUFNLEdBQUcsS0FBSyxDQUFDO09BQ2hCOzt3Q0FQbUIsT0FBTztBQUFQLGVBQU87OztBQVEzQixhQUFPLENBQUMsTUFBTSxPQUFDLENBQWYsT0FBTyxFQUFZLE9BQU8sQ0FBQyxDQUFDO0tBQzdCO0dBQ0Y7Q0FDRixDQUFDOztxQkFFYSxNQUFNIiwiZmlsZSI6ImxvZ2dlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIG1ldGhvZCA9ICdsb2cnO1xuICAgICAgfVxuICAgICAgY29uc29sZVttZXRob2RdKC4uLm1lc3NhZ2UpOyAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlcjtcbiJdfQ==\n\n\n/***/ },\n/* 79 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {/* global window */\n\t'use strict';\n\t\n\texports.__esModule = true;\n\t\n\texports['default'] = function (Handlebars) {\n\t /* istanbul ignore next */\n\t var root = typeof global !== 'undefined' ? global : window,\n\t $Handlebars = root.Handlebars;\n\t /* istanbul ignore next */\n\t Handlebars.noConflict = function () {\n\t if (root.Handlebars === Handlebars) {\n\t root.Handlebars = $Handlebars;\n\t }\n\t return Handlebars;\n\t };\n\t};\n\t\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O3FCQUNlLFVBQVMsVUFBVSxFQUFFOztBQUVsQyxNQUFJLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU07TUFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0FBRWxDLFlBQVUsQ0FBQyxVQUFVLEdBQUcsWUFBVztBQUNqQyxRQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO0FBQ2xDLFVBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0tBQy9CO0FBQ0QsV0FBTyxVQUFVLENBQUM7R0FDbkIsQ0FBQztDQUNIIiwiZmlsZSI6Im5vLWNvbmZsaWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBsZXQgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgICByZXR1cm4gSGFuZGxlYmFycztcbiAgfTtcbn1cbiJdfQ==\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 80 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\texports.__esModule = true;\n\texports.checkRevision = checkRevision;\n\texports.template = template;\n\texports.wrapProgram = wrapProgram;\n\texports.resolvePartial = resolvePartial;\n\texports.invokePartial = invokePartial;\n\texports.noop = noop;\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// istanbul ignore next\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\t\n\tvar _utils = __webpack_require__(8);\n\t\n\tvar Utils = _interopRequireWildcard(_utils);\n\t\n\tvar _exception = __webpack_require__(9);\n\t\n\tvar _exception2 = _interopRequireDefault(_exception);\n\t\n\tvar _base = __webpack_require__(27);\n\t\n\tfunction checkRevision(compilerInfo) {\n\t var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n\t currentRevision = _base.COMPILER_REVISION;\n\t\n\t if (compilerRevision !== currentRevision) {\n\t if (compilerRevision < currentRevision) {\n\t var runtimeVersions = _base.REVISION_CHANGES[currentRevision],\n\t compilerVersions = _base.REVISION_CHANGES[compilerRevision];\n\t throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n\t } else {\n\t // Use the embedded version info since the runtime doesn't know about this revision yet\n\t throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n\t }\n\t }\n\t}\n\t\n\tfunction template(templateSpec, env) {\n\t /* istanbul ignore next */\n\t if (!env) {\n\t throw new _exception2['default']('No environment passed to template');\n\t }\n\t if (!templateSpec || !templateSpec.main) {\n\t throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);\n\t }\n\t\n\t templateSpec.main.decorator = templateSpec.main_d;\n\t\n\t // Note: Using env.VM references rather than local var references throughout this section to allow\n\t // for external users to override these as psuedo-supported APIs.\n\t env.VM.checkRevision(templateSpec.compiler);\n\t\n\t function invokePartialWrapper(partial, context, options) {\n\t if (options.hash) {\n\t context = Utils.extend({}, context, options.hash);\n\t if (options.ids) {\n\t options.ids[0] = true;\n\t }\n\t }\n\t\n\t partial = env.VM.resolvePartial.call(this, partial, context, options);\n\t var result = env.VM.invokePartial.call(this, partial, context, options);\n\t\n\t if (result == null && env.compile) {\n\t options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n\t result = options.partials[options.name](context, options);\n\t }\n\t if (result != null) {\n\t if (options.indent) {\n\t var lines = result.split('\\n');\n\t for (var i = 0, l = lines.length; i < l; i++) {\n\t if (!lines[i] && i + 1 === l) {\n\t break;\n\t }\n\t\n\t lines[i] = options.indent + lines[i];\n\t }\n\t result = lines.join('\\n');\n\t }\n\t return result;\n\t } else {\n\t throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n\t }\n\t }\n\t\n\t // Just add water\n\t var container = {\n\t strict: function strict(obj, name) {\n\t if (!(name in obj)) {\n\t throw new _exception2['default']('\"' + name + '\" not defined in ' + obj);\n\t }\n\t return obj[name];\n\t },\n\t lookup: function lookup(depths, name) {\n\t var len = depths.length;\n\t for (var i = 0; i < len; i++) {\n\t if (depths[i] && depths[i][name] != null) {\n\t return depths[i][name];\n\t }\n\t }\n\t },\n\t lambda: function lambda(current, context) {\n\t return typeof current === 'function' ? current.call(context) : current;\n\t },\n\t\n\t escapeExpression: Utils.escapeExpression,\n\t invokePartial: invokePartialWrapper,\n\t\n\t fn: function fn(i) {\n\t var ret = templateSpec[i];\n\t ret.decorator = templateSpec[i + '_d'];\n\t return ret;\n\t },\n\t\n\t programs: [],\n\t program: function program(i, data, declaredBlockParams, blockParams, depths) {\n\t var programWrapper = this.programs[i],\n\t fn = this.fn(i);\n\t if (data || depths || blockParams || declaredBlockParams) {\n\t programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n\t } else if (!programWrapper) {\n\t programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n\t }\n\t return programWrapper;\n\t },\n\t\n\t data: function data(value, depth) {\n\t while (value && depth--) {\n\t value = value._parent;\n\t }\n\t return value;\n\t },\n\t merge: function merge(param, common) {\n\t var obj = param || common;\n\t\n\t if (param && common && param !== common) {\n\t obj = Utils.extend({}, common, param);\n\t }\n\t\n\t return obj;\n\t },\n\t\n\t noop: env.VM.noop,\n\t compilerInfo: templateSpec.compiler\n\t };\n\t\n\t function ret(context) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t var data = options.data;\n\t\n\t ret._setup(options);\n\t if (!options.partial && templateSpec.useData) {\n\t data = initData(context, data);\n\t }\n\t var depths = undefined,\n\t blockParams = templateSpec.useBlockParams ? [] : undefined;\n\t if (templateSpec.useDepths) {\n\t if (options.depths) {\n\t depths = context !== options.depths[0] ? [context].concat(options.depths) : options.depths;\n\t } else {\n\t depths = [context];\n\t }\n\t }\n\t\n\t function main(context /*, options*/) {\n\t return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n\t }\n\t main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n\t return main(context, options);\n\t }\n\t ret.isTop = true;\n\t\n\t ret._setup = function (options) {\n\t if (!options.partial) {\n\t container.helpers = container.merge(options.helpers, env.helpers);\n\t\n\t if (templateSpec.usePartial) {\n\t container.partials = container.merge(options.partials, env.partials);\n\t }\n\t if (templateSpec.usePartial || templateSpec.useDecorators) {\n\t container.decorators = container.merge(options.decorators, env.decorators);\n\t }\n\t } else {\n\t container.helpers = options.helpers;\n\t container.partials = options.partials;\n\t container.decorators = options.decorators;\n\t }\n\t };\n\t\n\t ret._child = function (i, data, blockParams, depths) {\n\t if (templateSpec.useBlockParams && !blockParams) {\n\t throw new _exception2['default']('must pass block params');\n\t }\n\t if (templateSpec.useDepths && !depths) {\n\t throw new _exception2['default']('must pass parent depths');\n\t }\n\t\n\t return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n\t };\n\t return ret;\n\t}\n\t\n\tfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n\t function prog(context) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t\n\t var currentDepths = depths;\n\t if (depths && context !== depths[0]) {\n\t currentDepths = [context].concat(depths);\n\t }\n\t\n\t return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);\n\t }\n\t\n\t prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\t\n\t prog.program = i;\n\t prog.depth = depths ? depths.length : 0;\n\t prog.blockParams = declaredBlockParams || 0;\n\t return prog;\n\t}\n\t\n\tfunction resolvePartial(partial, context, options) {\n\t if (!partial) {\n\t if (options.name === '@partial-block') {\n\t partial = options.data['partial-block'];\n\t } else {\n\t partial = options.partials[options.name];\n\t }\n\t } else if (!partial.call && !options.name) {\n\t // This is a dynamic partial that returned a string\n\t options.name = partial;\n\t partial = options.partials[partial];\n\t }\n\t return partial;\n\t}\n\t\n\tfunction invokePartial(partial, context, options) {\n\t options.partial = true;\n\t if (options.ids) {\n\t options.data.contextPath = options.ids[0] || options.data.contextPath;\n\t }\n\t\n\t var partialBlock = undefined;\n\t if (options.fn && options.fn !== noop) {\n\t options.data = _base.createFrame(options.data);\n\t partialBlock = options.data['partial-block'] = options.fn;\n\t\n\t if (partialBlock.partials) {\n\t options.partials = Utils.extend({}, options.partials, partialBlock.partials);\n\t }\n\t }\n\t\n\t if (partial === undefined && partialBlock) {\n\t partial = partialBlock;\n\t }\n\t\n\t if (partial === undefined) {\n\t throw new _exception2['default']('The partial ' + options.name + ' could not be found');\n\t } else if (partial instanceof Function) {\n\t return partial(context, options);\n\t }\n\t}\n\t\n\tfunction noop() {\n\t return '';\n\t}\n\t\n\tfunction initData(context, data) {\n\t if (!data || !('root' in data)) {\n\t data = data ? _base.createFrame(data) : {};\n\t data.root = context;\n\t }\n\t return data;\n\t}\n\t\n\tfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n\t if (fn.decorator) {\n\t var props = {};\n\t prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n\t Utils.extend(prog, props);\n\t }\n\t return prog;\n\t}\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQXVCLFNBQVM7O0lBQXBCLEtBQUs7O3lCQUNLLGFBQWE7Ozs7b0JBQzhCLFFBQVE7O0FBRWxFLFNBQVMsYUFBYSxDQUFDLFlBQVksRUFBRTtBQUMxQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztNQUN2RCxlQUFlLDBCQUFvQixDQUFDOztBQUUxQyxNQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRTtBQUN4QyxRQUFJLGdCQUFnQixHQUFHLGVBQWUsRUFBRTtBQUN0QyxVQUFNLGVBQWUsR0FBRyx1QkFBaUIsZUFBZSxDQUFDO1VBQ25ELGdCQUFnQixHQUFHLHVCQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVELFlBQU0sMkJBQWMseUZBQXlGLEdBQ3ZHLHFEQUFxRCxHQUFHLGVBQWUsR0FBRyxtREFBbUQsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNoSyxNQUFNOztBQUVMLFlBQU0sMkJBQWMsd0ZBQXdGLEdBQ3RHLGlEQUFpRCxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNuRjtHQUNGO0NBQ0Y7O0FBRU0sU0FBUyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTs7QUFFMUMsTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNSLFVBQU0sMkJBQWMsbUNBQW1DLENBQUMsQ0FBQztHQUMxRDtBQUNELE1BQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ3ZDLFVBQU0sMkJBQWMsMkJBQTJCLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQztHQUN4RTs7QUFFRCxjQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDOzs7O0FBSWxELEtBQUcs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U0FBUyxJQUFJLEdBQUc7QUFBRSxTQUFPLEVBQUUsQ0FBQztDQUFFOztBQUVyQyxTQUFTLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQy9CLE1BQUksQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFBLEFBQUMsRUFBRTtBQUM5QixRQUFJLEdBQUcsSUFBSSxHQUFHLGtCQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztHQUNyQjtBQUNELFNBQU8sSUFBSSxDQUFDO0NBQ2I7O0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtBQUN6RSxNQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUU7QUFDaEIsUUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ2YsUUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVGLFNBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0dBQzNCO0FBQ0QsU0FBTyxJQUFJLENBQUM7Q0FDYiIsImZpbGUiOiJydW50aW1lLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vZXhjZXB0aW9uJztcbmltcG9ydCB7IENPTVBJTEVSX1JFVklTSU9OLCBSRVZJU0lPTl9DSEFOR0VTLCBjcmVhdGVGcmFtZSB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICBjb25zdCBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLFxuICAgICAgICBjdXJyZW50UmV2aXNpb24gPSBDT01QSUxFUl9SRVZJU0lPTjtcblxuICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7XG4gICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlzaW9uXSxcbiAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dO1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIHJ1bnRpbWVWZXJzaW9ucyArICcpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVyVmVyc2lvbnMgKyAnKS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVySW5mb1sxXSArICcpLicpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGUnKTtcbiAgfVxuICBpZiAoIXRlbXBsYXRlU3BlYyB8fCAhdGVtcGxhdGVTcGVjLm1haW4pIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmtub3duIHRlbXBsYXRlIG9iamVjdDogJyArIHR5cGVvZiB0ZW1wbGF0ZVNwZWMpO1xuICB9XG5cbiAgdGVtcGxhdGVTcGVjLm1haW4uZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjLm1haW5fZDtcblxuICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvd1xuICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLlxuICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpO1xuXG4gIGZ1bmN0aW9uIGludm9rZVBhcnRpYWxXcmFwcGVyKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICBjb250ZXh0ID0gVXRpbHMuZXh0ZW5kKHt9LCBjb250ZXh0LCBvcHRpb25zLmhhc2gpO1xuICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIG9wdGlvbnMuaWRzWzBdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJ0aWFsID0gZW52LlZNLnJlc29sdmVQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG4gICAgbGV0IHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7XG4gICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaW5lc1tpXSAmJiBpICsgMSA9PT0gbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGluZXNbaV0gPSBvcHRpb25zLmluZGVudCArIGxpbmVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGNvbXBpbGVkIHdoZW4gcnVubmluZyBpbiBydW50aW1lLW9ubHkgbW9kZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEp1c3QgYWRkIHdhdGVyXG4gIGxldCBjb250YWluZXIgPSB7XG4gICAgc3RyaWN0OiBmdW5jdGlvbihvYmosIG5hbWUpIHtcbiAgICAgIGlmICghKG5hbWUgaW4gb2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdcIicgKyBuYW1lICsgJ1wiIG5vdCBkZWZpbmVkIGluICcgKyBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgICB9LFxuICAgIGxvb2t1cDogZnVuY3Rpb24oZGVwdGhzLCBuYW1lKSB7XG4gICAgICBjb25zdCBsZW4gPSBkZXB0aHMubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZGVwdGhzW2ldICYmIGRlcHRoc1tpXVtuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbihjdXJyZW50LCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50O1xuICAgIH0sXG5cbiAgICBlc2NhcGVFeHByZXNzaW9uOiBVdGlscy5lc2NhcGVFeHByZXNzaW9uLFxuICAgIGludm9rZVBhcnRpYWw6IGludm9rZVBhcnRpYWxXcmFwcGVyLFxuXG4gICAgZm46IGZ1bmN0aW9uKGkpIHtcbiAgICAgIGxldCByZXQgPSB0ZW1wbGF0ZVNwZWNbaV07XG4gICAgICByZXQuZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjW2kgKyAnX2QnXTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSxcblxuICAgIHByb2dyYW1zOiBbXSxcbiAgICBwcm9ncmFtOiBmdW5jdGlvbihpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICBsZXQgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZSwgZGVwdGgpIHtcbiAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbihwYXJhbSwgY29tbW9uKSB7XG4gICAgICBsZXQgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIChwYXJhbSAhPT0gY29tbW9uKSkge1xuICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICBub29wOiBlbnYuVk0ubm9vcCxcbiAgICBjb21waWxlckluZm86IHRlbXBsYXRlU3BlYy5jb21waWxlclxuICB9O1xuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuICAgIHJldC5fc2V0dXAob3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHtcbiAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTtcbiAgICB9XG4gICAgbGV0IGRlcHRocyxcbiAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykge1xuICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7XG4gICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRocztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWluKGNvbnRleHQvKiwgb3B0aW9ucyovKSB7XG4gICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIH1cbiAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTtcbiAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxuICByZXQuaXNUb3AgPSB0cnVlO1xuXG4gIHJldC5fc2V0dXAgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHtcbiAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpO1xuXG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwpIHtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMucGFydGlhbHMsIGVudi5wYXJ0aWFscyk7XG4gICAgICB9XG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwgfHwgdGVtcGxhdGVTcGVjLnVzZURlY29yYXRvcnMpIHtcbiAgICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5kZWNvcmF0b3JzLCBlbnYuZGVjb3JhdG9ycyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gb3B0aW9ucy5oZWxwZXJzO1xuICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3B0aW9ucy5wYXJ0aWFscztcbiAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gb3B0aW9ucy5kZWNvcmF0b3JzO1xuICAgIH1cbiAgfTtcblxuICByZXQuX2NoaWxkID0gZnVuY3Rpb24oaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgJiYgIWJsb2NrUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7XG4gICAgfVxuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ211c3QgcGFzcyBwYXJlbnQgZGVwdGhzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgZnVuY3Rpb24gcHJvZyhjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgY3VycmVudERlcHRocyA9IGRlcHRocztcbiAgICBpZiAoZGVwdGhzICYmIGNvbnRleHQgIT09IGRlcHRoc1swXSkge1xuICAgICAgY3VycmVudERlcHRocyA9IFtjb250ZXh0XS5jb25jYXQoZGVwdGhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oY29udGFpbmVyLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLFxuICAgICAgICBvcHRpb25zLmRhdGEgfHwgZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXMgJiYgW29wdGlvbnMuYmxvY2tQYXJhbXNdLmNvbmNhdChibG9ja1BhcmFtcyksXG4gICAgICAgIGN1cnJlbnREZXB0aHMpO1xuICB9XG5cbiAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpO1xuXG4gIHByb2cucHJvZ3JhbSA9IGk7XG4gIHByb2cuZGVwdGggPSBkZXB0aHMgPyBkZXB0aHMubGVuZ3RoIDogMDtcbiAgcHJvZy5ibG9ja1BhcmFtcyA9IGRlY2xhcmVkQmxvY2tQYXJhbXMgfHwgMDtcbiAgcmV0dXJuIHByb2c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghcGFydGlhbCkge1xuICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHtcbiAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nXG4gICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTtcbiAgfVxuICByZXR1cm4gcGFydGlhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVBhcnRpYWwocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICBvcHRpb25zLnBhcnRpYWwgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICBvcHRpb25zLmRhdGEuY29udGV4dFBhdGggPSBvcHRpb25zLmlkc1swXSB8fCBvcHRpb25zLmRhdGEuY29udGV4dFBhdGg7XG4gIH1cblxuICBsZXQgcGFydGlhbEJsb2NrO1xuICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7XG4gICAgb3B0aW9ucy5kYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAocGFydGlhbEJsb2NrLnBhcnRpYWxzKSB7XG4gICAgICBvcHRpb25zLnBhcnRpYWxzID0gVXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zLnBhcnRpYWxzLCBwYXJ0aWFsQmxvY2sucGFydGlhbHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQgJiYgcGFydGlhbEJsb2NrKSB7XG4gICAgcGFydGlhbCA9IHBhcnRpYWxCbG9jaztcbiAgfVxuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgfSBlbHNlIGlmIChwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpIHsgcmV0dXJuICcnOyB9XG5cbmZ1bmN0aW9uIGluaXREYXRhKGNvbnRleHQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICEoJ3Jvb3QnIGluIGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEgPyBjcmVhdGVGcmFtZShkYXRhKSA6IHt9O1xuICAgIGRhdGEucm9vdCA9IGNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpIHtcbiAgaWYgKGZuLmRlY29yYXRvcikge1xuICAgIGxldCBwcm9wcyA9IHt9O1xuICAgIHByb2cgPSBmbi5kZWNvcmF0b3IocHJvZywgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGhzICYmIGRlcHRoc1swXSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgVXRpbHMuZXh0ZW5kKHByb2csIHByb3BzKTtcbiAgfVxuICByZXR1cm4gcHJvZztcbn1cbiJdfQ==\n\n\n/***/ },\n/* 81 */\n/***/ function(module, exports) {\n\n\t// Build out our basic SafeString type\n\t'use strict';\n\t\n\texports.__esModule = true;\n\tfunction SafeString(string) {\n\t this.string = string;\n\t}\n\t\n\tSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n\t return '' + this.string;\n\t};\n\t\n\texports['default'] = SafeString;\n\tmodule.exports = exports['default'];\n\t//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDMUIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEI7O0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBVztBQUN2RSxTQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3pCLENBQUM7O3FCQUVhLFVBQVUiLCJmaWxlIjoic2FmZS1zdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiJdfQ==\n\n\n/***/ },\n/* 82 */,\n/* 83 */,\n/* 84 */,\n/* 85 */,\n/* 86 */,\n/* 87 */,\n/* 88 */,\n/* 89 */,\n/* 90 */,\n/* 91 */,\n/* 92 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(19),\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( baseMVC, _l ){\n\t// =============================================================================\n\t/** A view on any model that has a 'annotation' attribute\n\t */\n\tvar AnnotationEditor = Backbone.View\n\t .extend( baseMVC.LoggableMixin )\n\t .extend( baseMVC.HiddenUntilActivatedViewMixin ).extend({\n\t\n\t tagName : 'div',\n\t className : 'annotation-display',\n\t\n\t /** Set up listeners, parse options */\n\t initialize : function( options ){\n\t options = options || {};\n\t this.tooltipConfig = options.tooltipConfig || { placement: 'bottom' };\n\t //console.debug( this, options );\n\t // only listen to the model only for changes to annotations\n\t this.listenTo( this.model, 'change:annotation', function(){\n\t this.render();\n\t });\n\t this.hiddenUntilActivated( options.$activator, options );\n\t },\n\t\n\t /** Build the DOM elements, call select to on the created input, and set up behaviors */\n\t render : function(){\n\t var view = this;\n\t this.$el.html( this._template() );\n\t this.$el.find( \"[title]\" ).tooltip( this.tooltipConfig );\n\t\n\t //TODO: handle empties better\n\t this.$annotation().make_text_editable({\n\t use_textarea: true,\n\t on_finish: function( newAnnotation ){\n\t view.$annotation().text( newAnnotation );\n\t view.model.save({ annotation: newAnnotation }, { silent: true })\n\t .fail( function(){\n\t view.$annotation().text( view.model.previous( 'annotation' ) );\n\t });\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t /** @returns {String} the html text used to build the view's DOM */\n\t _template : function(){\n\t var annotation = this.model.get( 'annotation' );\n\t //if( !annotation ){\n\t // //annotation = [ '', _l( 'Click to add an annotation' ), '' ].join( '' );\n\t // annotation = [ '' ].join( '' );\n\t //}\n\t return [\n\t //TODO: make prompt optional\n\t '',\n\t // set up initial tags by adding as CSV to input vals (necc. to init select2)\n\t '
                    ',\n\t _.escape( annotation ),\n\t '
                    '\n\t ].join( '' );\n\t },\n\t\n\t /** @returns {jQuery} the main element for this view */\n\t $annotation : function(){\n\t return this.$el.find( '.annotation' );\n\t },\n\t\n\t /** shut down event listeners and remove this view's DOM */\n\t remove : function(){\n\t this.$annotation.off();\n\t this.stopListening( this.model );\n\t Backbone.View.prototype.remove.call( this );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){ return [ 'AnnotationEditor(', this.model + '', ')' ].join(''); }\n\t});\n\t// =============================================================================\n\treturn {\n\t AnnotationEditor : AnnotationEditor\n\t};\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3)))\n\n/***/ },\n/* 93 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(100),\n\t __webpack_require__(35),\n\t __webpack_require__(34),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_VIEW, DC_MODEL, DC_LI, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\t/** @class non-editable, read-only View/Controller for a dataset collection.\n\t */\n\tvar _super = LIST_VIEW.ModelListPanel;\n\tvar CollectionView = _super.extend(\n\t/** @lends CollectionView.prototype */{\n\t //MODEL is either a DatasetCollection (or subclass) or a DatasetCollectionElement (list of pairs)\n\t _logNamespace : logNamespace,\n\t\n\t className : _super.prototype.className + ' dataset-collection-panel',\n\t\n\t /** sub view class used for datasets */\n\t DatasetDCEViewClass : DC_LI.DatasetDCEListItemView,\n\t /** sub view class used for nested collections */\n\t NestedDCDCEViewClass: DC_LI.NestedDCDCEListItemView,\n\t /** key of attribute in model to assign to this.collection */\n\t modelCollectionKey : 'elements',\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events\n\t * @param {Object} attributes optional settings for the panel\n\t */\n\t initialize : function( attributes ){\n\t _super.prototype.initialize.call( this, attributes );\n\t this.linkTarget = attributes.linkTarget || '_blank';\n\t\n\t this.hasUser = attributes.hasUser;\n\t /** A stack of panels that currently cover or hide this panel */\n\t this.panelStack = [];\n\t /** The text of the link to go back to the panel containing this one */\n\t this.parentName = attributes.parentName;\n\t /** foldout or drilldown */\n\t this.foldoutStyle = attributes.foldoutStyle || 'foldout';\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-views\n\t /** In this override, use model.getVisibleContents */\n\t _filterCollection : function(){\n\t//TODO: should *not* be model.getVisibleContents - visibility is not model related\n\t return this.model.getVisibleContents();\n\t },\n\t\n\t /** override to return proper view class based on element_type */\n\t _getItemViewClass : function( model ){\n\t //this.debug( this + '._getItemViewClass:', model );\n\t//TODO: subclasses use DCEViewClass - but are currently unused - decide\n\t switch( model.get( 'element_type' ) ){\n\t case 'hda':\n\t return this.DatasetDCEViewClass;\n\t case 'dataset_collection':\n\t return this.NestedDCDCEViewClass;\n\t }\n\t throw new TypeError( 'Unknown element type:', model.get( 'element_type' ) );\n\t },\n\t\n\t /** override to add link target and anon */\n\t _getItemViewOptions : function( model ){\n\t var options = _super.prototype._getItemViewOptions.call( this, model );\n\t return _.extend( options, {\n\t linkTarget : this.linkTarget,\n\t hasUser : this.hasUser,\n\t//TODO: could move to only nested: list:paired\n\t foldoutStyle : this.foldoutStyle\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ collection sub-views\n\t /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n\t _setUpItemViewListeners : function( view ){\n\t var panel = this;\n\t _super.prototype._setUpItemViewListeners.call( panel, view );\n\t\n\t // use pub-sub to: handle drilldown expansion and collapse\n\t view.on( 'expanded:drilldown', function( v, drilldown ){\n\t this._expandDrilldownPanel( drilldown );\n\t }, this );\n\t view.on( 'collapsed:drilldown', function( v, drilldown ){\n\t this._collapseDrilldownPanel( drilldown );\n\t }, this );\n\t return this;\n\t },\n\t\n\t /** Handle drill down by hiding this panels list and controls and showing the sub-panel */\n\t _expandDrilldownPanel : function( drilldown ){\n\t this.panelStack.push( drilldown );\n\t // hide this panel's controls and list, set the name for back navigation, and attach to the $el\n\t this.$( '> .controls' ).add( this.$list() ).hide();\n\t drilldown.parentName = this.model.get( 'name' );\n\t this.$el.append( drilldown.render().$el );\n\t },\n\t\n\t /** Handle drilldown close by freeing the panel and re-rendering this panel */\n\t _collapseDrilldownPanel : function( drilldown ){\n\t this.panelStack.pop();\n\t this.render();\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel events\n\t /** event map */\n\t events : {\n\t 'click .navigation .back' : 'close'\n\t },\n\t\n\t /** close/remove this collection panel */\n\t close : function( event ){\n\t this.$el.remove();\n\t this.trigger( 'close' );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'CollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//------------------------------------------------------------------------------ TEMPLATES\n\tCollectionView.prototype.templates = (function(){\n\t\n\t var controlsTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t '',\n\t\n\t '
                    ',\n\t '
                    <%- collection.name || collection.element_identifier %>
                    ',\n\t '
                    ',\n\t//TODO: remove logic from template\n\t '<% if( collection.collection_type === \"list\" ){ %>',\n\t _l( 'a list of datasets' ),\n\t '<% } else if( collection.collection_type === \"paired\" ){ %>',\n\t _l( 'a pair of datasets' ),\n\t '<% } else if( collection.collection_type === \"list:paired\" ){ %>',\n\t _l( 'a list of paired datasets' ),\n\t '<% } %>',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ], 'collection' );\n\t\n\t return _.extend( _.clone( _super.prototype.templates ), {\n\t controls : controlsTemplate\n\t });\n\t}());\n\t\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar ListCollectionView = CollectionView.extend(\n\t/** @lends ListCollectionView.prototype */{\n\t\n\t //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n\t /** sub view class used for datasets */\n\t DatasetDCEViewClass : DC_LI.DatasetDCEListItemView,\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'ListCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar PairCollectionView = ListCollectionView.extend(\n\t/** @lends PairCollectionView.prototype */{\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'PairCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar ListOfPairsCollectionView = CollectionView.extend(\n\t/** @lends ListOfPairsCollectionView.prototype */{\n\t\n\t //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n\t /** sub view class used for nested collections */\n\t NestedDCDCEViewClass : DC_LI.NestedDCDCEListItemView.extend({\n\t foldoutPanelClass : PairCollectionView\n\t }),\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'ListOfPairsCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t CollectionView : CollectionView,\n\t ListCollectionView : ListCollectionView,\n\t PairCollectionView : PairCollectionView,\n\t ListOfPairsCollectionView : ListOfPairsCollectionView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 94 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(15),\n\t __webpack_require__(37),\n\t __webpack_require__(101),\n\t __webpack_require__(92),\n\t __webpack_require__(26),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( STATES, DATASET_LI, TAGS, ANNOTATIONS, faIconButton, BASE_MVC, _l ){\n\t//==============================================================================\n\tvar _super = DATASET_LI.DatasetListItemView;\n\t/** @class Editing view for DatasetAssociation.\n\t */\n\tvar DatasetListItemEdit = _super.extend(\n\t/** @lends DatasetListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** set up: options */\n\t initialize : function( attributes ){\n\t _super.prototype.initialize.call( this, attributes );\n\t//TODO: shouldn't this err if false?\n\t this.hasUser = attributes.hasUser;\n\t\n\t /** allow user purge of dataset files? */\n\t this.purgeAllowed = attributes.purgeAllowed || false;\n\t\n\t //TODO: move to HiddenUntilActivatedViewMixin\n\t /** should the tags editor be shown or hidden initially? */\n\t this.tagsEditorShown = attributes.tagsEditorShown || false;\n\t /** should the tags editor be shown or hidden initially? */\n\t this.annotationEditorShown = attributes.annotationEditorShown || false;\n\t },\n\t\n\t // ......................................................................... titlebar actions\n\t /** In this override, add the other two primary actions: edit and delete */\n\t _renderPrimaryActions : function(){\n\t var actions = _super.prototype._renderPrimaryActions.call( this );\n\t if( this.model.get( 'state' ) === STATES.NOT_VIEWABLE ){\n\t return actions;\n\t }\n\t // render the display, edit attr and delete icon-buttons\n\t return _super.prototype._renderPrimaryActions.call( this ).concat([\n\t this._renderEditButton(),\n\t this._renderDeleteButton()\n\t ]);\n\t },\n\t\n\t//TODO: move titleButtons into state renderers, remove state checks in the buttons\n\t\n\t /** Render icon-button to edit the attributes (format, permissions, etc.) this dataset. */\n\t _renderEditButton : function(){\n\t // don't show edit while uploading, in-accessible\n\t // DO show if in error (ala previous history panel)\n\t if( ( this.model.get( 'state' ) === STATES.DISCARDED )\n\t || ( !this.model.get( 'accessible' ) ) ){\n\t return null;\n\t }\n\t\n\t var purged = this.model.get( 'purged' ),\n\t deleted = this.model.get( 'deleted' ),\n\t editBtnData = {\n\t title : _l( 'Edit attributes' ),\n\t href : this.model.urls.edit,\n\t target : this.linkTarget,\n\t faIcon : 'fa-pencil',\n\t classes : 'edit-btn'\n\t };\n\t\n\t // disable if purged or deleted and explain why in the tooltip\n\t if( deleted || purged ){\n\t editBtnData.disabled = true;\n\t if( purged ){\n\t editBtnData.title = _l( 'Cannot edit attributes of datasets removed from disk' );\n\t } else if( deleted ){\n\t editBtnData.title = _l( 'Undelete dataset to edit attributes' );\n\t }\n\t\n\t // disable if still uploading or new\n\t } else if( _.contains( [ STATES.UPLOAD, STATES.NEW ], this.model.get( 'state' ) ) ){\n\t editBtnData.disabled = true;\n\t editBtnData.title = _l( 'This dataset is not yet editable' );\n\t }\n\t return faIconButton( editBtnData );\n\t },\n\t\n\t /** Render icon-button to delete this hda. */\n\t _renderDeleteButton : function(){\n\t // don't show delete if...\n\t if( ( !this.model.get( 'accessible' ) ) ){\n\t return null;\n\t }\n\t\n\t var self = this,\n\t deletedAlready = this.model.isDeletedOrPurged();\n\t return faIconButton({\n\t title : !deletedAlready? _l( 'Delete' ) : _l( 'Dataset is already deleted' ),\n\t disabled : deletedAlready,\n\t faIcon : 'fa-times',\n\t classes : 'delete-btn',\n\t onclick : function() {\n\t // ...bler... tooltips being left behind in DOM (hover out never called on deletion)\n\t self.$el.find( '.icon-btn.delete-btn' ).trigger( 'mouseout' );\n\t self.model[ 'delete' ]();\n\t }\n\t });\n\t },\n\t\n\t // ......................................................................... details\n\t /** In this override, add tags and annotations controls, make the ? dbkey a link to editing page */\n\t _renderDetails : function(){\n\t //TODO: generalize to be allow different details for each state\n\t var $details = _super.prototype._renderDetails.call( this ),\n\t state = this.model.get( 'state' );\n\t\n\t if( !this.model.isDeletedOrPurged() && _.contains([ STATES.OK, STATES.FAILED_METADATA ], state ) ){\n\t this._renderTags( $details );\n\t this._renderAnnotation( $details );\n\t this._makeDbkeyEditLink( $details );\n\t }\n\t\n\t//TODO: TRIPLE tap, ugh.\n\t this._setUpBehaviors( $details );\n\t return $details;\n\t },\n\t\n\t /** Add less commonly used actions in the details section based on state */\n\t _renderSecondaryActions : function(){\n\t var actions = _super.prototype._renderSecondaryActions.call( this );\n\t switch( this.model.get( 'state' ) ){\n\t case STATES.UPLOAD:\n\t case STATES.NOT_VIEWABLE:\n\t return actions;\n\t case STATES.ERROR:\n\t // error button comes first\n\t actions.unshift( this._renderErrButton() );\n\t return actions.concat([ this._renderRerunButton() ]);\n\t case STATES.OK:\n\t case STATES.FAILED_METADATA:\n\t return actions.concat([ this._renderRerunButton(), this._renderVisualizationsButton() ]);\n\t }\n\t return actions.concat([ this._renderRerunButton() ]);\n\t },\n\t\n\t /** Render icon-button to report an error on this dataset to the galaxy admin. */\n\t _renderErrButton : function(){\n\t return faIconButton({\n\t title : _l( 'View or report this error' ),\n\t href : this.model.urls.report_error,\n\t classes : 'report-error-btn',\n\t target : this.linkTarget,\n\t faIcon : 'fa-bug'\n\t });\n\t },\n\t\n\t /** Render icon-button to re-run the job that created this dataset. */\n\t _renderRerunButton : function(){\n\t var creating_job = this.model.get( 'creating_job' );\n\t if( this.model.get( 'rerunnable' ) ){\n\t return faIconButton({\n\t title : _l( 'Run this job again' ),\n\t href : this.model.urls.rerun,\n\t classes : 'rerun-btn',\n\t target : this.linkTarget,\n\t faIcon : 'fa-refresh',\n\t onclick : function( ev ) {\n\t ev.preventDefault();\n\t // create webpack split point in order to load the tool form async\n\t // TODO: split not working (tool loads fine)\n\t !/* require */(/* empty */function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [ __webpack_require__(22) ]; (function( ToolForm ){\n\t var form = new ToolForm.View({ 'job_id' : creating_job });\n\t form.deferred.execute( function(){\n\t Galaxy.app.display( form );\n\t });\n\t }.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));}());\n\t }\n\t });\n\t }\n\t },\n\t\n\t /** Render an icon-button or popupmenu of links based on the applicable visualizations */\n\t _renderVisualizationsButton : function(){\n\t //TODO: someday - lazyload visualizations\n\t var visualizations = this.model.get( 'visualizations' );\n\t if( ( this.model.isDeletedOrPurged() )\n\t || ( !this.hasUser )\n\t || ( !this.model.hasData() )\n\t || ( _.isEmpty( visualizations ) ) ){\n\t return null;\n\t }\n\t if( !_.isObject( visualizations[0] ) ){\n\t this.warn( 'Visualizations have been switched off' );\n\t return null;\n\t }\n\t\n\t var $visualizations = $( this.templates.visualizations( visualizations, this ) );\n\t //HACK: need to re-write those directed at galaxy_main with linkTarget\n\t $visualizations.find( '[target=\"galaxy_main\"]').attr( 'target', this.linkTarget );\n\t // use addBack here to include the root $visualizations elem (for the case of 1 visualization)\n\t this._addScratchBookFn( $visualizations.find( '.visualization-link' ).addBack( '.visualization-link' ) );\n\t return $visualizations;\n\t },\n\t\n\t /** add scratchbook functionality to visualization links */\n\t _addScratchBookFn : function( $links ){\n\t var li = this;\n\t $links.click( function( ev ){\n\t if( Galaxy.frame && Galaxy.frame.active ){\n\t Galaxy.frame.add({\n\t title : 'Visualization',\n\t url : $( this ).attr( 'href' )\n\t });\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t }\n\t });\n\t },\n\t\n\t//TODO: if possible move these to readonly view - but display the owner's tags/annotation (no edit)\n\t /** Render the tags list/control */\n\t _renderTags : function( $where ){\n\t if( !this.hasUser ){ return; }\n\t var view = this;\n\t this.tagsEditor = new TAGS.TagsEditor({\n\t model : this.model,\n\t el : $where.find( '.tags-display' ),\n\t onshowFirstTime : function(){ this.render(); },\n\t // persist state on the hda view (and not the editor) since these are currently re-created each time\n\t onshow : function(){ view.tagsEditorShown = true; },\n\t onhide : function(){ view.tagsEditorShown = false; },\n\t $activator : faIconButton({\n\t title : _l( 'Edit dataset tags' ),\n\t classes : 'tag-btn',\n\t faIcon : 'fa-tags'\n\t }).appendTo( $where.find( '.actions .right' ) )\n\t });\n\t if( this.tagsEditorShown ){ this.tagsEditor.toggle( true ); }\n\t },\n\t\n\t /** Render the annotation display/control */\n\t _renderAnnotation : function( $where ){\n\t if( !this.hasUser ){ return; }\n\t var view = this;\n\t this.annotationEditor = new ANNOTATIONS.AnnotationEditor({\n\t model : this.model,\n\t el : $where.find( '.annotation-display' ),\n\t onshowFirstTime : function(){ this.render(); },\n\t // persist state on the hda view (and not the editor) since these are currently re-created each time\n\t onshow : function(){ view.annotationEditorShown = true; },\n\t onhide : function(){ view.annotationEditorShown = false; },\n\t $activator : faIconButton({\n\t title : _l( 'Edit dataset annotation' ),\n\t classes : 'annotate-btn',\n\t faIcon : 'fa-comment'\n\t }).appendTo( $where.find( '.actions .right' ) )\n\t });\n\t if( this.annotationEditorShown ){ this.annotationEditor.toggle( true ); }\n\t },\n\t\n\t /** If the format/dbkey/genome_build isn't set, make the display a link to the edit page */\n\t _makeDbkeyEditLink : function( $details ){\n\t // make the dbkey a link to editing\n\t if( this.model.get( 'metadata_dbkey' ) === '?'\n\t && !this.model.isDeletedOrPurged() ){\n\t var editableDbkey = $( '?' )\n\t .attr( 'href', this.model.urls.edit )\n\t .attr( 'target', this.linkTarget );\n\t $details.find( '.dbkey .value' ).replaceWith( editableDbkey );\n\t }\n\t },\n\t\n\t // ......................................................................... events\n\t /** event map */\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .undelete-link' : '_clickUndeleteLink',\n\t 'click .purge-link' : '_clickPurgeLink',\n\t\n\t 'click .edit-btn' : function( ev ){ this.trigger( 'edit', this, ev ); },\n\t 'click .delete-btn' : function( ev ){ this.trigger( 'delete', this, ev ); },\n\t 'click .rerun-btn' : function( ev ){ this.trigger( 'rerun', this, ev ); },\n\t 'click .report-err-btn' : function( ev ){ this.trigger( 'report-err', this, ev ); },\n\t 'click .visualization-btn' : function( ev ){ this.trigger( 'visualize', this, ev ); },\n\t 'click .dbkey a' : function( ev ){ this.trigger( 'edit', this, ev ); }\n\t }),\n\t\n\t\n\t /** listener for item undelete (in the messages section) */\n\t _clickUndeleteLink : function( ev ){\n\t this.model.undelete();\n\t return false;\n\t },\n\t\n\t /** listener for item purge (in the messages section) */\n\t _clickPurgeLink : function( ev ){\n\t//TODO: confirm dialog\n\t this.model.purge();\n\t return false;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** string rep */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDAEditView(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDatasetListItemEdit.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t failed_metadata : BASE_MVC.wrapTemplate([\n\t // in this override, provide a link to the edit page\n\t '<% if( dataset.state === \"failed_metadata\" ){ %>',\n\t '',\n\t '<% } %>'\n\t ], 'dataset' ),\n\t\n\t deleted : BASE_MVC.wrapTemplate([\n\t // in this override, provide links to undelete or purge the dataset\n\t '<% if( dataset.deleted && !dataset.purged ){ %>',\n\t // deleted not purged\n\t '
                    ',\n\t _l( 'This dataset has been deleted' ),\n\t '
                    ', _l( 'Undelete it' ), '',\n\t '<% if( view.purgeAllowed ){ %>',\n\t '
                    ',\n\t _l( 'Permanently remove it from disk' ),\n\t '',\n\t '<% } %>',\n\t '
                    ',\n\t '<% } %>'\n\t ], 'dataset' )\n\t });\n\t\n\t var visualizationsTemplate = BASE_MVC.wrapTemplate([\n\t '<% if( visualizations.length === 1 ){ %>',\n\t '\"',\n\t ' target=\"<%- visualizations[0].target %>\" title=\"', _l( 'Visualize in' ),\n\t ' <%- visualizations[0].html %>\">',\n\t '',\n\t '',\n\t\n\t '<% } else { %>',\n\t '
                    ',\n\t '',\n\t '',\n\t '',\n\t '',\n\t '
                    ',\n\t '<% } %>'\n\t ], 'visualizations' );\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t warnings : warnings,\n\t visualizations : visualizationsTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t DatasetListItemEdit : DatasetListItemEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 95 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(15),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( STATES, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'dataset';\n\t//==============================================================================\n\tvar searchableMixin = BASE_MVC.SearchableModelMixin;\n\t/** @class base model for any DatasetAssociation (HDAs, LDDAs, DatasetCollectionDAs).\n\t * No knowledge of what type (HDA/LDDA/DCDA) should be needed here.\n\t * The DA's are made searchable (by attribute) by mixing in SearchableModelMixin.\n\t */\n\tvar DatasetAssociation = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( BASE_MVC.mixin( searchableMixin, /** @lends DatasetAssociation.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t /** default attributes for a model */\n\t defaults : {\n\t state : STATES.NEW,\n\t deleted : false,\n\t purged : false,\n\t\n\t // unreliable attribute\n\t name : '(unnamed dataset)',\n\t\n\t//TODO: update to false when this is correctly passed from the API (when we have a security model for this)\n\t accessible : true,\n\t\n\t // sniffed datatype (sam, tabular, bed, etc.)\n\t data_type : '',\n\t file_ext : '',\n\t\n\t // size in bytes\n\t file_size : 0,\n\t\n\t // array of associated file types (eg. [ 'bam_index', ... ])\n\t meta_files : [],\n\t\n\t misc_blurb : '',\n\t misc_info : '',\n\t\n\t tags : []\n\t // do NOT default on annotation, as this default is valid and will be passed on 'save'\n\t // which is incorrect behavior when the model is only partially fetched (annos are not passed in summary data)\n\t //annotation : ''\n\t },\n\t\n\t /** instance vars and listeners */\n\t initialize : function( attributes, options ){\n\t this.debug( this + '(Dataset).initialize', attributes, options );\n\t\n\t //!! this state is not in trans.app.model.Dataset.states - set it here -\n\t if( !this.get( 'accessible' ) ){\n\t this.set( 'state', STATES.NOT_VIEWABLE );\n\t }\n\t\n\t /** Datasets rely/use some web controllers - have the model generate those URLs on startup */\n\t this.urls = this._generateUrls();\n\t\n\t this._setUpListeners();\n\t },\n\t\n\t /** returns misc. web urls for rendering things like re-run, display, etc. */\n\t _generateUrls : function(){\n\t//TODO: would be nice if the API did this\n\t var id = this.get( 'id' );\n\t if( !id ){ return {}; }\n\t var urls = {\n\t 'purge' : 'datasets/' + id + '/purge_async',\n\t 'display' : 'datasets/' + id + '/display/?preview=True',\n\t 'edit' : 'datasets/' + id + '/edit',\n\t 'download' : 'datasets/' + id + '/display?to_ext=' + this.get( 'file_ext' ),\n\t 'report_error' : 'dataset/errors?id=' + id,\n\t 'rerun' : 'tool_runner/rerun?id=' + id,\n\t 'show_params' : 'datasets/' + id + '/show_params',\n\t 'visualization' : 'visualization',\n\t 'meta_download' : 'dataset/get_metadata_file?hda_id=' + id + '&metadata_name='\n\t };\n\t//TODO: global\n\t _.each( urls, function( value, key ){\n\t urls[ key ] = Galaxy.root + value;\n\t });\n\t this.urls = urls;\n\t return urls;\n\t },\n\t\n\t /** set up any event listeners\n\t * event: state:ready fired when this DA moves into/is already in a ready state\n\t */\n\t _setUpListeners : function(){\n\t // if the state has changed and the new state is a ready state, fire an event\n\t this.on( 'change:state', function( currModel, newState ){\n\t this.log( this + ' has changed state:', currModel, newState );\n\t if( this.inReadyState() ){\n\t this.trigger( 'state:ready', currModel, newState, this.previous( 'state' ) );\n\t }\n\t });\n\t // the download url (currently) relies on having a correct file extension\n\t this.on( 'change:id change:file_ext', function( currModel ){\n\t this._generateUrls();\n\t });\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** override to add urls */\n\t toJSON : function(){\n\t var json = Backbone.Model.prototype.toJSON.call( this );\n\t //console.warn( 'returning json?' );\n\t //return json;\n\t return _.extend( json, {\n\t urls : this.urls\n\t });\n\t },\n\t\n\t /** Is this dataset deleted or purged? */\n\t isDeletedOrPurged : function(){\n\t return ( this.get( 'deleted' ) || this.get( 'purged' ) );\n\t },\n\t\n\t /** Is this dataset in a 'ready' state; where 'Ready' states are states where no\n\t * processing (for the ds) is left to do on the server.\n\t */\n\t inReadyState : function(){\n\t var ready = _.contains( STATES.READY_STATES, this.get( 'state' ) );\n\t return ( this.isDeletedOrPurged() || ready );\n\t },\n\t\n\t /** Does this model already contain detailed data (as opposed to just summary level data)? */\n\t hasDetails : function(){\n\t //?? this may not be reliable\n\t return _.has( this.attributes, 'genome_build' );\n\t },\n\t\n\t /** Convenience function to match dataset.has_data. */\n\t hasData : function(){\n\t return ( this.get( 'file_size' ) > 0 );\n\t },\n\t\n\t // ........................................................................ ajax\n\t fetch : function( options ){\n\t var dataset = this;\n\t return Backbone.Model.prototype.fetch.call( this, options )\n\t .always( function(){\n\t dataset._generateUrls();\n\t });\n\t },\n\t\n\t //NOTE: subclasses of DA's will need to implement url and urlRoot in order to have these work properly\n\t /** save this dataset, _Mark_ing it as deleted (just a flag) */\n\t 'delete' : function( options ){\n\t if( this.get( 'deleted' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: true }, options );\n\t },\n\t /** save this dataset, _Mark_ing it as undeleted */\n\t undelete : function( options ){\n\t if( !this.get( 'deleted' ) || this.get( 'purged' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: false }, options );\n\t },\n\t\n\t /** remove the file behind this dataset from the filesystem (if permitted) */\n\t purge : function _purge( options ){\n\t//TODO: use, override model.destroy, HDA.delete({ purge: true })\n\t if( this.get( 'purged' ) ){ return jQuery.when(); }\n\t options = options || {};\n\t //var hda = this,\n\t // //xhr = jQuery.ajax( this.url() + '?' + jQuery.param({ purge: true }), _.extend({\n\t // xhr = jQuery.ajax( this.url(), _.extend({\n\t // type : 'DELETE',\n\t // data : {\n\t // purge : true\n\t // }\n\t // }, options ));\n\t //\n\t //xhr.done( function( response ){\n\t // hda.debug( 'response', response );\n\t // //hda.set({ deleted: true, purged: true });\n\t // hda.set( response );\n\t //});\n\t //return xhr;\n\t\n\t options.url = this.urls.purge;\n\t\n\t //TODO: ideally this would be a DELETE call to the api\n\t // using purge async for now\n\t var hda = this,\n\t xhr = jQuery.ajax( options );\n\t xhr.done( function( message, status, responseObj ){\n\t hda.set({ deleted: true, purged: true });\n\t });\n\t xhr.fail( function( xhr, status, message ){\n\t // Exception messages are hidden within error page including: '...not allowed in this Galaxy instance.'\n\t // unbury and re-add to xhr\n\t var error = _l( \"Unable to purge dataset\" );\n\t var messageBuriedInUnfortunatelyFormattedError = ( 'Removal of datasets by users '\n\t + 'is not allowed in this Galaxy instance' );\n\t if( xhr.responseJSON && xhr.responseJSON.error ){\n\t error = xhr.responseJSON.error;\n\t } else if( xhr.responseText.indexOf( messageBuriedInUnfortunatelyFormattedError ) !== -1 ){\n\t error = messageBuriedInUnfortunatelyFormattedError;\n\t }\n\t xhr.responseText = error;\n\t hda.trigger( 'error', hda, xhr, options, _l( error ), { error: error } );\n\t });\n\t return xhr;\n\t },\n\t\n\t // ........................................................................ searching\n\t // see base-mvc, SearchableModelMixin\n\t\n\t /** what attributes of an HDA will be used in a text search */\n\t searchAttributes : [\n\t 'name', 'file_ext', 'genome_build', 'misc_blurb', 'misc_info', 'annotation', 'tags'\n\t ],\n\t\n\t /** our attr keys don't often match the labels we display to the user - so, when using\n\t * attribute specifiers ('name=\"bler\"') in a term, allow passing in aliases for the\n\t * following attr keys.\n\t */\n\t searchAliases : {\n\t title : 'name',\n\t format : 'file_ext',\n\t database : 'genome_build',\n\t blurb : 'misc_blurb',\n\t description : 'misc_blurb',\n\t info : 'misc_info',\n\t tag : 'tags'\n\t },\n\t\n\t // ........................................................................ misc\n\t /** String representation */\n\t toString : function(){\n\t var nameAndId = this.get( 'id' ) || '';\n\t if( this.get( 'name' ) ){\n\t nameAndId = '\"' + this.get( 'name' ) + '\",' + nameAndId;\n\t }\n\t return 'Dataset(' + nameAndId + ')';\n\t }\n\t}));\n\t\n\t\n\t//==============================================================================\n\t/** @class Backbone collection for dataset associations.\n\t */\n\tvar DatasetAssociationCollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(\n\t/** @lends HistoryContents.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t model : DatasetAssociation,\n\t\n\t /** root api url */\n\t urlRoot : Galaxy.root + 'api/datasets',\n\t\n\t /** url fn */\n\t url : function(){\n\t return this.urlRoot;\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** Get the ids of every item in this collection\n\t * @returns array of encoded ids\n\t */\n\t ids : function(){\n\t return this.map( function( item ){ return item.get('id'); });\n\t },\n\t\n\t /** Get contents that are not ready\n\t * @returns array of content models\n\t */\n\t notReady : function(){\n\t return this.filter( function( content ){\n\t return !content.inReadyState();\n\t });\n\t },\n\t\n\t /** return true if any datasets don't have details */\n\t haveDetails : function(){\n\t return this.all( function( dataset ){ return dataset.hasDetails(); });\n\t },\n\t\n\t // ........................................................................ ajax\n\t /** using a queue, perform ajaxFn on each of the models in this collection */\n\t ajaxQueue : function( ajaxFn, options ){\n\t var deferred = jQuery.Deferred(),\n\t startingLength = this.length,\n\t responses = [];\n\t\n\t if( !startingLength ){\n\t deferred.resolve([]);\n\t return deferred;\n\t }\n\t\n\t // use reverse order (stylistic choice)\n\t var ajaxFns = this.chain().reverse().map( function( dataset, i ){\n\t return function(){\n\t var xhr = ajaxFn.call( dataset, options );\n\t // if successful, notify using the deferred to allow tracking progress\n\t xhr.done( function( response ){\n\t deferred.notify({ curr: i, total: startingLength, response: response, model: dataset });\n\t });\n\t // (regardless of previous error or success) if not last ajax call, shift and call the next\n\t // if last fn, resolve deferred\n\t xhr.always( function( response ){\n\t responses.push( response );\n\t if( ajaxFns.length ){\n\t ajaxFns.shift()();\n\t } else {\n\t deferred.resolve( responses );\n\t }\n\t });\n\t };\n\t }).value();\n\t // start the queue\n\t ajaxFns.shift()();\n\t\n\t return deferred;\n\t },\n\t\n\t // ........................................................................ sorting/filtering\n\t /** return a new collection of datasets whose attributes contain the substring matchesWhat */\n\t matches : function( matchesWhat ){\n\t return this.filter( function( dataset ){\n\t return dataset.matches( matchesWhat );\n\t });\n\t },\n\t\n\t // ........................................................................ misc\n\t ///** Convert this ad-hoc collection of hdas to a formal collection tracked\n\t // by the server.\n\t //**/\n\t //promoteToHistoryDatasetCollection : function _promote( history, collection_type, options ){\n\t //},\n\t\n\t /** String representation. */\n\t toString : function(){\n\t return ([ 'DatasetAssociationCollection(', this.length, ')' ].join( '' ));\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t DatasetAssociation : DatasetAssociation,\n\t DatasetAssociationCollection : DatasetAssociationCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 96 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(37),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DATASET_LI, BASE_MVC, _l ){\n\t/* global Backbone */\n\t//==============================================================================\n\tvar _super = DATASET_LI.DatasetListItemView;\n\t/** @class Read only view for HistoryDatasetAssociation.\n\t * Since there are no controls on the HDAView to hide the dataset,\n\t * the primary thing this class does (currently) is override templates\n\t * to render the HID.\n\t */\n\tvar HDAListItemView = _super.extend(\n\t/** @lends HDAListItemView.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : _super.prototype.className + \" history-content\",\n\t\n\t initialize : function( attributes, options ){\n\t _super.prototype.initialize.call( this, attributes, options );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDAListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tHDAListItemView.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t // adding the hid display to the title\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t //TODO: remove whitespace and use margin-right\n\t '<%- dataset.hid %> ',\n\t '<%- dataset.name %>',\n\t '
                    ',\n\t '
                    '\n\t ], 'dataset' );\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t hidden : BASE_MVC.wrapTemplate([\n\t // add a warning when hidden\n\t '<% if( !dataset.visible ){ %>',\n\t '
                    ',\n\t _l( 'This dataset has been hidden' ),\n\t '
                    ',\n\t '<% } %>'\n\t ], 'dataset' )\n\t });\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t titleBar : titleBarTemplate,\n\t warnings : warnings\n\t });\n\t}());\n\t\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HDAListItemView : HDAListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 97 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(95),\n\t __webpack_require__(46),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DATASET, HISTORY_CONTENT, BASE_MVC, _l ){\n\t//==============================================================================\n\tvar _super = DATASET.DatasetAssociation,\n\t hcontentMixin = HISTORY_CONTENT.HistoryContentMixin;\n\t/** @class (HDA) model for a Galaxy dataset contained in and related to a history.\n\t */\n\tvar HistoryDatasetAssociation = _super.extend( BASE_MVC.mixin( hcontentMixin,\n\t/** @lends HistoryDatasetAssociation.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n\t // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n\t // - re-apply manually it now\n\t /** call the mixin constructor */\n\t constructor : function( attrs, options ){\n\t hcontentMixin.constructor.call( this, attrs, options );\n\t },\n\t\n\t /** default attributes for a model */\n\t defaults : _.extend( {}, _super.prototype.defaults, hcontentMixin.defaults, {\n\t model_class : 'HistoryDatasetAssociation'\n\t }),\n\t\n\t /** Set up the model, determine if accessible, bind listeners\n\t */\n\t initialize : function( attributes, options ){\n\t _super.prototype.initialize.call( this, attributes, options );\n\t hcontentMixin.initialize.call( this, attributes, options );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** String representation */\n\t toString : function(){\n\t var nameAndId = this.get( 'id' ) || '';\n\t if( this.get( 'name' ) ){\n\t nameAndId = this.get( 'hid' ) + ' :\"' + this.get( 'name' ) + '\",' + nameAndId;\n\t }\n\t return 'HDA(' + nameAndId + ')';\n\t }\n\t}));\n\t\n\t//==============================================================================\n\t return {\n\t HistoryDatasetAssociation : HistoryDatasetAssociation\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 98 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(15),\n\t __webpack_require__(34),\n\t __webpack_require__(93),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( STATES, DC_LI, DC_VIEW, BASE_MVC, _l ){\n\t/* global Backbone */\n\t//==============================================================================\n\tvar _super = DC_LI.DCListItemView;\n\t/** @class Read only view for HistoryDatasetCollectionAssociation (a dataset collection inside a history).\n\t */\n\tvar HDCAListItemView = _super.extend(\n\t/** @lends HDCAListItemView.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : _super.prototype.className + \" history-content\",\n\t\n\t /** event listeners */\n\t _setUpListeners : function(){\n\t _super.prototype._setUpListeners.call( this );\n\t\n\t this.model.on({\n\t 'change:populated change:visible' : function( model, options ){ this.render(); },\n\t }, this );\n\t },\n\t\n\t /** Override to provide the proper collections panels as the foldout */\n\t _getFoldoutPanelClass : function(){\n\t switch( this.model.get( 'collection_type' ) ){\n\t case 'list':\n\t return DC_VIEW.ListCollectionView;\n\t case 'paired':\n\t return DC_VIEW.PairCollectionView;\n\t case 'list:paired':\n\t return DC_VIEW.ListOfPairsCollectionView;\n\t }\n\t throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );\n\t },\n\t\n\t /** In this override, add the state as a class for use with state-based CSS */\n\t _swapNewRender : function( $newRender ){\n\t _super.prototype._swapNewRender.call( this, $newRender );\n\t//TODO: model currently has no state\n\t var state = !this.model.get( 'populated' ) ? STATES.RUNNING : STATES.OK;\n\t //if( this.model.has( 'state' ) ){\n\t this.$el.addClass( 'state-' + state );\n\t //}\n\t return this.$el;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDCAListItemView(' + modelString + ')';\n\t }\n\t});\n\t\n\t/** underscore templates */\n\tHDCAListItemView.prototype.templates = (function(){\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t hidden : BASE_MVC.wrapTemplate([\n\t // add a warning when hidden\n\t '<% if( !collection.visible ){ %>',\n\t '
                    ',\n\t _l( 'This collection has been hidden' ),\n\t '
                    ',\n\t '<% } %>'\n\t ], 'collection' )\n\t });\n\t\n\t// could steal this from hda-base (or use mixed content)\n\t var titleBarTemplate = BASE_MVC.wrapTemplate([\n\t // adding the hid display to the title\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t //TODO: remove whitespace and use margin-right\n\t '<%- collection.hid %> ',\n\t '<%- collection.name %>',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ], 'collection' );\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t warnings : warnings,\n\t titleBar : titleBarTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HDCAListItemView : HDCAListItemView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ },\n/* 99 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, jQuery, _) {\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(47),\n\t __webpack_require__(4),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HISTORY_CONTENTS, UTILS, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'history';\n\t//==============================================================================\n\t/** @class Model for a Galaxy history resource - both a record of user\n\t * tool use and a collection of the datasets those tools produced.\n\t * @name History\n\t * @augments Backbone.Model\n\t */\n\tvar History = Backbone.Model\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( BASE_MVC.mixin( BASE_MVC.SearchableModelMixin, /** @lends History.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t // values from api (may need more)\n\t defaults : {\n\t model_class : 'History',\n\t id : null,\n\t name : 'Unnamed History',\n\t state : 'new',\n\t\n\t deleted : false\n\t },\n\t\n\t // ........................................................................ urls\n\t urlRoot: Galaxy.root + 'api/histories',\n\t\n\t // ........................................................................ set up/tear down\n\t /** Set up the model\n\t * @param {Object} historyJSON model data for this History\n\t * @param {Object[]} contentsJSON array of model data for this History's contents (hdas or collections)\n\t * @param {Object} options any extra settings including logger\n\t */\n\t initialize : function( historyJSON, contentsJSON, options ){\n\t options = options || {};\n\t this.logger = options.logger || null;\n\t this.log( this + \".initialize:\", historyJSON, contentsJSON, options );\n\t\n\t /** HistoryContents collection of the HDAs contained in this history. */\n\t this.log( 'creating history contents:', contentsJSON );\n\t this.contents = new HISTORY_CONTENTS.HistoryContents( contentsJSON || [], { historyId: this.get( 'id' )});\n\t //// if we've got hdas passed in the constructor, load them\n\t //if( contentsJSON && _.isArray( contentsJSON ) ){\n\t // this.log( 'resetting history contents:', contentsJSON );\n\t // this.contents.reset( contentsJSON );\n\t //}\n\t\n\t this._setUpListeners();\n\t\n\t /** cached timeout id for the dataset updater */\n\t this.updateTimeoutId = null;\n\t // set up update timeout if needed\n\t //this.checkForUpdates();\n\t },\n\t\n\t /** set up any event listeners for this history including those to the contained HDAs\n\t * events: error:contents if an error occurred with the contents collection\n\t */\n\t _setUpListeners : function(){\n\t this.on( 'error', function( model, xhr, options, msg, details ){\n\t this.errorHandler( model, xhr, options, msg, details );\n\t });\n\t\n\t // hda collection listening\n\t if( this.contents ){\n\t this.listenTo( this.contents, 'error', function(){\n\t this.trigger.apply( this, [ 'error:contents' ].concat( jQuery.makeArray( arguments ) ) );\n\t });\n\t }\n\t // if the model's id changes ('current' or null -> an actual id), update the contents history_id\n\t this.on( 'change:id', function( model, newId ){\n\t if( this.contents ){\n\t this.contents.historyId = newId;\n\t }\n\t }, this );\n\t },\n\t\n\t //TODO: see base-mvc\n\t //onFree : function(){\n\t // if( this.contents ){\n\t // this.contents.free();\n\t // }\n\t //},\n\t\n\t /** event listener for errors. Generally errors are handled outside this model */\n\t errorHandler : function( model, xhr, options, msg, details ){\n\t // clear update timeout on model err\n\t this.clearUpdateTimeout();\n\t },\n\t\n\t /** convert size in bytes to a more human readable version */\n\t nice_size : function(){\n\t return UTILS.bytesToString( this.get( 'size' ), true, 2 );\n\t },\n\t\n\t /** override to add nice_size */\n\t toJSON : function(){\n\t return _.extend( Backbone.Model.prototype.toJSON.call( this ), {\n\t nice_size : this.nice_size()\n\t });\n\t },\n\t\n\t /** override to allow getting nice_size */\n\t get : function( key ){\n\t if( key === 'nice_size' ){\n\t return this.nice_size();\n\t }\n\t return Backbone.Model.prototype.get.apply( this, arguments );\n\t },\n\t\n\t // ........................................................................ common queries\n\t /** T/F is this history owned by the current user (Galaxy.user)\n\t * Note: that this will return false for an anon user even if the history is theirs.\n\t */\n\t ownedByCurrUser : function(){\n\t // no currUser\n\t if( !Galaxy || !Galaxy.user ){\n\t return false;\n\t }\n\t // user is anon or history isn't owned\n\t if( Galaxy.user.isAnonymous() || Galaxy.user.id !== this.get( 'user_id' ) ){\n\t return false;\n\t }\n\t return true;\n\t },\n\t\n\t /** */\n\t contentsCount : function(){\n\t return _.reduce( _.values( this.get( 'state_details' ) ), function( memo, num ){ return memo + num; }, 0 );\n\t },\n\t\n\t // ........................................................................ search\n\t /** What model fields to search with */\n\t searchAttributes : [\n\t 'name', 'annotation', 'tags'\n\t ],\n\t\n\t /** Adding title and singular tag */\n\t searchAliases : {\n\t title : 'name',\n\t tag : 'tags'\n\t },\n\t\n\t // ........................................................................ updates\n\t /** does the contents collection indicate they're still running and need to be updated later?\n\t * delay + update if needed\n\t * @param {Function} onReadyCallback function to run when all contents are in the ready state\n\t * events: ready\n\t */\n\t checkForUpdates : function( onReadyCallback ){\n\t //this.info( 'checkForUpdates' )\n\t\n\t // get overall History state from collection, run updater if History has running/queued contents\n\t // boiling it down on the client to running/not\n\t if( this.contents.running().length ){\n\t this.setUpdateTimeout();\n\t\n\t } else {\n\t this.trigger( 'ready' );\n\t if( _.isFunction( onReadyCallback ) ){\n\t onReadyCallback.call( this );\n\t }\n\t }\n\t return this;\n\t },\n\t\n\t /** create a timeout (after UPDATE_DELAY or delay ms) to refetch the contents. Clear any prev. timeout */\n\t setUpdateTimeout : function( delay ){\n\t delay = delay || History.UPDATE_DELAY;\n\t var history = this;\n\t\n\t // prevent buildup of updater timeouts by clearing previous if any, then set new and cache id\n\t this.clearUpdateTimeout();\n\t this.updateTimeoutId = setTimeout( function(){\n\t history.refresh();\n\t }, delay );\n\t return this.updateTimeoutId;\n\t },\n\t\n\t /** clear the timeout and the cached timeout id */\n\t clearUpdateTimeout : function(){\n\t if( this.updateTimeoutId ){\n\t clearTimeout( this.updateTimeoutId );\n\t this.updateTimeoutId = null;\n\t }\n\t },\n\t\n\t /* update the contents, getting full detailed model data for any whose id is in detailIds\n\t * set up to run this again in some interval of time\n\t * @param {String[]} detailIds list of content ids to get detailed model data for\n\t * @param {Object} options std. backbone fetch options map\n\t */\n\t refresh : function( detailIds, options ){\n\t //this.info( 'refresh:', detailIds, this.contents );\n\t detailIds = detailIds || [];\n\t options = options || {};\n\t var history = this;\n\t\n\t // add detailIds to options as CSV string\n\t options.data = options.data || {};\n\t if( detailIds.length ){\n\t options.data.details = detailIds.join( ',' );\n\t }\n\t var xhr = this.contents.fetch( options );\n\t xhr.done( function( models ){\n\t history.checkForUpdates( function(){\n\t // fetch the history inside onReadyCallback in order to recalc history size\n\t this.fetch();\n\t });\n\t });\n\t return xhr;\n\t },\n\t\n\t // ........................................................................ ajax\n\t /** save this history, _Mark_ing it as deleted (just a flag) */\n\t _delete : function( options ){\n\t if( this.get( 'deleted' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: true }, options );\n\t },\n\t /** purge this history, _Mark_ing it as purged and removing all dataset data from the server */\n\t purge : function( options ){\n\t if( this.get( 'purged' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: true, purged: true }, options );\n\t },\n\t /** save this history, _Mark_ing it as undeleted */\n\t undelete : function( options ){\n\t if( !this.get( 'deleted' ) ){ return jQuery.when(); }\n\t return this.save( { deleted: false }, options );\n\t },\n\t\n\t /** Make a copy of this history on the server\n\t * @param {Boolean} current if true, set the copy as the new current history (default: true)\n\t * @param {String} name name of new history (default: none - server sets to: Copy of )\n\t * @fires copied passed this history and the response JSON from the copy\n\t * @returns {xhr}\n\t */\n\t copy : function( current, name, allDatasets ){\n\t current = ( current !== undefined )?( current ):( true );\n\t if( !this.id ){\n\t throw new Error( 'You must set the history ID before copying it.' );\n\t }\n\t\n\t var postData = { history_id : this.id };\n\t if( current ){\n\t postData.current = true;\n\t }\n\t if( name ){\n\t postData.name = name;\n\t }\n\t if( !allDatasets ){\n\t postData.all_datasets = false;\n\t }\n\t\n\t var history = this,\n\t copy = jQuery.post( this.urlRoot, postData );\n\t // if current - queue to setAsCurrent before firing 'copied'\n\t if( current ){\n\t return copy.then( function( response ){\n\t var newHistory = new History( response );\n\t return newHistory.setAsCurrent()\n\t .done( function(){\n\t history.trigger( 'copied', history, response );\n\t });\n\t });\n\t }\n\t return copy.done( function( response ){\n\t history.trigger( 'copied', history, response );\n\t });\n\t },\n\t\n\t setAsCurrent : function(){\n\t var history = this,\n\t xhr = jQuery.getJSON( Galaxy.root + 'history/set_as_current?id=' + this.id );\n\t\n\t xhr.done( function(){\n\t history.trigger( 'set-as-current', history );\n\t });\n\t return xhr;\n\t },\n\t\n\t // ........................................................................ misc\n\t toString : function(){\n\t return 'History(' + this.get( 'id' ) + ',' + this.get( 'name' ) + ')';\n\t }\n\t}));\n\t\n\t//------------------------------------------------------------------------------ CLASS VARS\n\t/** When the history has running hdas,\n\t * this is the amount of time between update checks from the server\n\t */\n\tHistory.UPDATE_DELAY = 4000;\n\t\n\t/** Get data for a history then its hdas using a sequential ajax call, return a deferred to receive both */\n\tHistory.getHistoryData = function getHistoryData( historyId, options ){\n\t options = options || {};\n\t var detailIdsFn = options.detailIdsFn || [];\n\t var hdcaDetailIds = options.hdcaDetailIds || [];\n\t //console.debug( 'getHistoryData:', historyId, options );\n\t\n\t var df = jQuery.Deferred(),\n\t historyJSON = null;\n\t\n\t function getHistory( id ){\n\t // get the history data\n\t if( historyId === 'current' ){\n\t return jQuery.getJSON( Galaxy.root + 'history/current_history_json' );\n\t }\n\t return jQuery.ajax( Galaxy.root + 'api/histories/' + historyId );\n\t }\n\t function isEmpty( historyData ){\n\t // get the number of hdas accrd. to the history\n\t return historyData && historyData.empty;\n\t }\n\t function getContents( historyData ){\n\t // get the hda data\n\t // if no hdas accrd. to history: return empty immed.\n\t if( isEmpty( historyData ) ){ return []; }\n\t // if there are hdas accrd. to history: get those as well\n\t if( _.isFunction( detailIdsFn ) ){\n\t detailIdsFn = detailIdsFn( historyData );\n\t }\n\t if( _.isFunction( hdcaDetailIds ) ){\n\t hdcaDetailIds = hdcaDetailIds( historyData );\n\t }\n\t var data = {};\n\t if( detailIdsFn.length ) {\n\t data.dataset_details = detailIdsFn.join( ',' );\n\t }\n\t if( hdcaDetailIds.length ) {\n\t // for symmetry, not actually used by backend of consumed\n\t // by frontend.\n\t data.dataset_collection_details = hdcaDetailIds.join( ',' );\n\t }\n\t return jQuery.ajax( Galaxy.root + 'api/histories/' + historyData.id + '/contents', { data: data });\n\t }\n\t\n\t // getting these concurrently is 400% slower (sqlite, local, vanilla) - so:\n\t // chain the api calls - getting history first then contents\n\t\n\t var historyFn = options.historyFn || getHistory,\n\t contentsFn = options.contentsFn || getContents;\n\t\n\t // chain ajax calls: get history first, then hdas\n\t var historyXHR = historyFn( historyId );\n\t historyXHR.done( function( json ){\n\t // set outer scope var here for use below\n\t historyJSON = json;\n\t df.notify({ status: 'history data retrieved', historyJSON: historyJSON });\n\t });\n\t historyXHR.fail( function( xhr, status, message ){\n\t // call reject on the outer deferred to allow its fail callback to run\n\t df.reject( xhr, 'loading the history' );\n\t });\n\t\n\t var contentsXHR = historyXHR.then( contentsFn );\n\t contentsXHR.then( function( contentsJSON ){\n\t df.notify({ status: 'contents data retrieved', historyJSON: historyJSON, contentsJSON: contentsJSON });\n\t // we've got both: resolve the outer scope deferred\n\t df.resolve( historyJSON, contentsJSON );\n\t });\n\t contentsXHR.fail( function( xhr, status, message ){\n\t // call reject on the outer deferred to allow its fail callback to run\n\t df.reject( xhr, 'loading the contents', { history: historyJSON } );\n\t });\n\t\n\t return df;\n\t};\n\t\n\t\n\t//==============================================================================\n\tvar ControlledFetchMixin = {\n\t\n\t /** Override to convert certain options keys into API index parameters */\n\t fetch : function( options ){\n\t options = options || {};\n\t options.data = options.data || this._buildFetchData( options );\n\t // use repeated params for arrays, e.g. q=1&qv=1&q=2&qv=2\n\t options.traditional = true;\n\t return Backbone.Collection.prototype.fetch.call( this, options );\n\t },\n\t\n\t /** These attribute keys are valid params to fetch/API-index */\n\t _fetchOptions : [\n\t /** model dependent string to control the order of models returned */\n\t 'order',\n\t /** limit the number of models returned from a fetch */\n\t 'limit',\n\t /** skip this number of models when fetching */\n\t 'offset',\n\t /** what series of attributes to return (model dependent) */\n\t 'view',\n\t /** individual keys to return for the models (see api/histories.index) */\n\t 'keys'\n\t ],\n\t\n\t /** Build the data dictionary to send to fetch's XHR as data */\n\t _buildFetchData : function( options ){\n\t var data = {},\n\t fetchDefaults = this._fetchDefaults();\n\t options = _.defaults( options || {}, fetchDefaults );\n\t data = _.pick( options, this._fetchOptions );\n\t\n\t var filters = _.has( options, 'filters' )? options.filters : ( fetchDefaults.filters || {} );\n\t if( !_.isEmpty( filters ) ){\n\t _.extend( data, this._buildFetchFilters( filters ) );\n\t }\n\t return data;\n\t },\n\t\n\t /** Override to have defaults for fetch options and filters */\n\t _fetchDefaults : function(){\n\t // to be overridden\n\t return {};\n\t },\n\t\n\t /** Convert dictionary filters to qqv style arrays */\n\t _buildFetchFilters : function( filters ){\n\t var filterMap = {\n\t q : [],\n\t qv : []\n\t };\n\t _.each( filters, function( v, k ){\n\t if( v === true ){ v = 'True'; }\n\t if( v === false ){ v = 'False'; }\n\t filterMap.q.push( k );\n\t filterMap.qv.push( v );\n\t });\n\t return filterMap;\n\t },\n\t};\n\t\n\t//==============================================================================\n\t/** @class A collection of histories (per user).\n\t * (stub) currently unused.\n\t */\n\tvar HistoryCollection = Backbone.Collection\n\t .extend( BASE_MVC.LoggableMixin )\n\t .extend( ControlledFetchMixin )\n\t .extend(/** @lends HistoryCollection.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t model : History,\n\t\n\t /** @type {String} the default sortOrders key for sorting */\n\t DEFAULT_ORDER : 'update_time',\n\t\n\t /** @type {Object} map of collection sorting orders generally containing a getter to return the attribute\n\t * sorted by and asc T/F if it is an ascending sort.\n\t */\n\t sortOrders : {\n\t 'update_time' : {\n\t getter : function( h ){ return new Date( h.get( 'update_time' ) ); },\n\t asc : false\n\t },\n\t 'update_time-asc' : {\n\t getter : function( h ){ return new Date( h.get( 'update_time' ) ); },\n\t asc : true\n\t },\n\t 'name' : {\n\t getter : function( h ){ return h.get( 'name' ); },\n\t asc : true\n\t },\n\t 'name-dsc' : {\n\t getter : function( h ){ return h.get( 'name' ); },\n\t asc : false\n\t },\n\t 'size' : {\n\t getter : function( h ){ return h.get( 'size' ); },\n\t asc : false\n\t },\n\t 'size-asc' : {\n\t getter : function( h ){ return h.get( 'size' ); },\n\t asc : true\n\t }\n\t },\n\t\n\t initialize : function( models, options ){\n\t options = options || {};\n\t this.log( 'HistoryCollection.initialize', arguments );\n\t\n\t // instance vars\n\t /** @type {boolean} should deleted histories be included */\n\t this.includeDeleted = options.includeDeleted || false;\n\t // set the sort order\n\t this.setOrder( options.order || this.DEFAULT_ORDER );\n\t /** @type {String} encoded id of the history that's current */\n\t this.currentHistoryId = options.currentHistoryId;\n\t /** @type {boolean} have all histories been fetched and in the collection? */\n\t this.allFetched = options.allFetched || false;\n\t\n\t // this.on( 'all', function(){\n\t // console.info( 'event:', arguments );\n\t // });\n\t this.setUpListeners();\n\t },\n\t\n\t urlRoot : Galaxy.root + 'api/histories',\n\t url : function(){ return this.urlRoot; },\n\t\n\t /** returns map of default filters and settings for fetching from the API */\n\t _fetchDefaults : function(){\n\t // to be overridden\n\t var defaults = {\n\t order : this.order,\n\t view : 'detailed'\n\t };\n\t if( !this.includeDeleted ){\n\t defaults.filters = {\n\t deleted : false,\n\t purged : false,\n\t };\n\t }\n\t return defaults;\n\t },\n\t\n\t /** set up reflexive event handlers */\n\t setUpListeners : function setUpListeners(){\n\t this.on({\n\t // when a history is deleted, remove it from the collection (if optionally set to do so)\n\t 'change:deleted' : function( history ){\n\t // TODO: this becomes complicated when more filters are used\n\t this.debug( 'change:deleted', this.includeDeleted, history.get( 'deleted' ) );\n\t if( !this.includeDeleted && history.get( 'deleted' ) ){\n\t this.remove( history );\n\t }\n\t },\n\t // listen for a history copy, setting it to current\n\t 'copied' : function( original, newData ){\n\t this.setCurrent( new History( newData, [] ) );\n\t },\n\t // when a history is made current, track the id in the collection\n\t 'set-as-current' : function( history ){\n\t var oldCurrentId = this.currentHistoryId;\n\t this.trigger( 'no-longer-current', oldCurrentId );\n\t this.currentHistoryId = history.id;\n\t }\n\t }, this );\n\t },\n\t\n\t /** override to allow passing options.order and setting the sort order to one of sortOrders */\n\t sort : function( options ){\n\t options = options || {};\n\t this.setOrder( options.order );\n\t return Backbone.Collection.prototype.sort.call( this, options );\n\t },\n\t\n\t /** build the comparator used to sort this collection using the sortOrder map and the given order key\n\t * @event 'changed-order' passed the new order and the collection\n\t */\n\t setOrder : function( order ){\n\t var collection = this,\n\t sortOrder = this.sortOrders[ order ];\n\t if( _.isUndefined( sortOrder ) ){ return; }\n\t\n\t collection.order = order;\n\t collection.comparator = function comparator( a, b ){\n\t var currentHistoryId = collection.currentHistoryId;\n\t // current always first\n\t if( a.id === currentHistoryId ){ return -1; }\n\t if( b.id === currentHistoryId ){ return 1; }\n\t // then compare by an attribute\n\t a = sortOrder.getter( a );\n\t b = sortOrder.getter( b );\n\t return sortOrder.asc?\n\t ( ( a === b )?( 0 ):( a > b ? 1 : -1 ) ):\n\t ( ( a === b )?( 0 ):( a > b ? -1 : 1 ) );\n\t };\n\t collection.trigger( 'changed-order', collection.order, collection );\n\t return collection;\n\t },\n\t\n\t /** override to provide order and offsets based on instance vars, set limit if passed,\n\t * and set allFetched/fire 'all-fetched' when xhr returns\n\t */\n\t fetch : function( options ){\n\t options = options || {};\n\t if( this.allFetched ){ return jQuery.when({}); }\n\t var collection = this,\n\t fetchOptions = _.defaults( options, {\n\t remove : false,\n\t offset : collection.length >= 1? ( collection.length - 1 ) : 0,\n\t order : collection.order\n\t }),\n\t limit = options.limit;\n\t if( !_.isUndefined( limit ) ){\n\t fetchOptions.limit = limit;\n\t }\n\t\n\t return ControlledFetchMixin.fetch.call( this, fetchOptions )\n\t .done( function _postFetchMore( fetchData ){\n\t var numFetched = _.isArray( fetchData )? fetchData.length : 0;\n\t // anything less than a full page means we got all there is to get\n\t if( !limit || numFetched < limit ){\n\t collection.allFetched = true;\n\t collection.trigger( 'all-fetched', collection );\n\t }\n\t }\n\t );\n\t },\n\t\n\t /** create a new history and by default set it to be the current history */\n\t create : function create( data, hdas, historyOptions, xhrOptions ){\n\t //TODO: .create is actually a collection function that's overridden here\n\t var collection = this,\n\t xhr = jQuery.getJSON( Galaxy.root + 'history/create_new_current' );\n\t return xhr.done( function( newData ){\n\t collection.setCurrent( new History( newData, [], historyOptions || {} ) );\n\t });\n\t },\n\t\n\t /** set the current history to the given history, placing it first in the collection.\n\t * Pass standard bbone options for use in unshift.\n\t * @triggers new-current passed history and this collection\n\t */\n\t setCurrent : function( history, options ){\n\t options = options || {};\n\t // new histories go in the front\n\t this.unshift( history, options );\n\t this.currentHistoryId = history.get( 'id' );\n\t if( !options.silent ){\n\t this.trigger( 'new-current', history, this );\n\t }\n\t return this;\n\t },\n\t\n\t /** override to reset allFetched flag to false */\n\t reset : function( models, options ){\n\t this.allFetched = false;\n\t return Backbone.Collection.prototype.reset.call( this, models, options );\n\t },\n\t\n\t toString: function toString(){\n\t return 'HistoryCollection(' + this.length + ')';\n\t }\n\t});\n\t\n\t//==============================================================================\n\treturn {\n\t History : History,\n\t HistoryCollection : HistoryCollection\n\t};}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 100 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(48),\n\t __webpack_require__(143),\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(108)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_ITEM, LoadingIndicator, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'list';\n\t/* ============================================================================\n\tTODO:\n\t\n\t============================================================================ */\n\t/** @class View for a list/collection of models and the sub-views of those models.\n\t * Sub-views must (at least have the interface if not) inherit from ListItemView.\n\t * (For a list panel that also includes some 'container' model (History->HistoryContents)\n\t * use ModelWithListPanel)\n\t *\n\t * Allows for:\n\t * searching collection/sub-views\n\t * selecting/multi-selecting sub-views\n\t *\n\t * Currently used:\n\t * for dataset/dataset-choice\n\t * as superclass of ModelListPanel\n\t */\n\tvar ListPanel = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend(/** @lends ListPanel.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t /** class to use for constructing the sub-views */\n\t viewClass : LIST_ITEM.ListItemView,\n\t /** class to used for constructing collection of sub-view models */\n\t collectionClass : Backbone.Collection,\n\t\n\t tagName : 'div',\n\t className : 'list-panel',\n\t\n\t /** (in ms) that jquery effects will use */\n\t fxSpeed : 'fast',\n\t\n\t /** string to display when the collection has no contents */\n\t emptyMsg : _l( 'This list is empty' ),\n\t /** displayed when no items match the search terms */\n\t noneFoundMsg : _l( 'No matching items found' ),\n\t /** string used for search placeholder */\n\t searchPlaceholder : _l( 'search' ),\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events\n\t * @param {Object} attributes optional settings for the list\n\t */\n\t initialize : function( attributes, options ){\n\t attributes = attributes || {};\n\t // set the logger if requested\n\t if( attributes.logger ){\n\t this.logger = attributes.logger;\n\t }\n\t this.log( this + '.initialize:', attributes );\n\t\n\t // ---- instance vars\n\t /** how quickly should jquery fx run? */\n\t this.fxSpeed = _.has( attributes, 'fxSpeed' )?( attributes.fxSpeed ):( this.fxSpeed );\n\t\n\t /** filters for displaying subviews */\n\t this.filters = [];\n\t /** current search terms */\n\t this.searchFor = attributes.searchFor || '';\n\t\n\t /** loading indicator */\n\t this.indicator = new LoadingIndicator( this.$el );\n\t\n\t /** currently showing selectors on items? */\n\t this.selecting = ( attributes.selecting !== undefined )? attributes.selecting : true;\n\t //this.selecting = false;\n\t\n\t /** cached selected item.model.ids to persist btwn renders */\n\t this.selected = attributes.selected || [];\n\t /** the last selected item.model.id */\n\t this.lastSelected = null;\n\t\n\t /** are sub-views draggable */\n\t this.dragItems = attributes.dragItems || false;\n\t\n\t /** list item view class (when passed models) */\n\t this.viewClass = attributes.viewClass || this.viewClass;\n\t\n\t /** list item views */\n\t this.views = [];\n\t /** list item models */\n\t this.collection = attributes.collection || ( new this.collectionClass([]) );\n\t\n\t /** filter fns run over collection items to see if they should show in the list */\n\t this.filters = attributes.filters || [];\n\t\n\t /** override $scrollContainer fn via attributes - fn should return jq for elem to call scrollTo on */\n\t this.$scrollContainer = attributes.$scrollContainer || this.$scrollContainer;\n\t\n\t//TODO: remove\n\t this.title = attributes.title || '';\n\t this.subtitle = attributes.subtitle || '';\n\t\n\t this._setUpListeners();\n\t },\n\t\n\t /** free any sub-views the list has */\n\t freeViews : function(){\n\t//TODO: stopListening? remove?\n\t _.each( this.views, function( view ){\n\t view.off();\n\t });\n\t this.views = [];\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ listeners\n\t /** create any event listeners for the list\n\t */\n\t _setUpListeners : function(){\n\t this.off();\n\t\n\t //TODO: move errorHandler down into list-view from history-view or\n\t // pass to global error handler (Galaxy)\n\t this.on( 'error', function( model, xhr, options, msg, details ){\n\t //this.errorHandler( model, xhr, options, msg, details );\n\t console.error( model, xhr, options, msg, details );\n\t }, this );\n\t\n\t // show hide the loading indicator\n\t this.on( 'loading', function(){\n\t this._showLoadingIndicator( 'loading...', 40 );\n\t }, this );\n\t this.on( 'loading-done', function(){\n\t this._hideLoadingIndicator( 40 );\n\t }, this );\n\t\n\t // throw the first render up as a diff namespace using once (for outside consumption)\n\t this.once( 'rendered', function(){\n\t this.trigger( 'rendered:initial', this );\n\t }, this );\n\t\n\t // debugging\n\t if( this.logger ){\n\t this.on( 'all', function( event ){\n\t this.log( this + '', arguments );\n\t }, this );\n\t }\n\t\n\t this._setUpCollectionListeners();\n\t this._setUpViewListeners();\n\t return this;\n\t },\n\t\n\t /** listening for collection events */\n\t _setUpCollectionListeners : function(){\n\t this.log( this + '._setUpCollectionListeners', this.collection );\n\t this.collection.off();\n\t\n\t // bubble up error events\n\t this.collection.on( 'error', function( model, xhr, options, msg, details ){\n\t this.trigger( 'error', model, xhr, options, msg, details );\n\t }, this );\n\t\n\t this.collection.on( 'reset', function(){\n\t this.renderItems();\n\t }, this );\n\t this.collection.on( 'add', this.addItemView, this );\n\t this.collection.on( 'remove', this.removeItemView, this );\n\t\n\t // debugging\n\t if( this.logger ){\n\t this.collection.on( 'all', function( event ){\n\t this.info( this + '(collection)', arguments );\n\t }, this );\n\t }\n\t return this;\n\t },\n\t\n\t /** listening for sub-view events that bubble up with the 'view:' prefix */\n\t _setUpViewListeners : function(){\n\t this.log( this + '._setUpViewListeners' );\n\t\n\t // shift to select a range\n\t this.on( 'view:selected', function( view, ev ){\n\t if( ev && ev.shiftKey && this.lastSelected ){\n\t var lastSelectedView = this.viewFromModelId( this.lastSelected );\n\t if( lastSelectedView ){\n\t this.selectRange( view, lastSelectedView );\n\t }\n\t } else if( ev && ev.altKey && !this.selecting ){\n\t this.showSelectors();\n\t }\n\t this.selected.push( view.model.id );\n\t this.lastSelected = view.model.id;\n\t }, this );\n\t\n\t this.on( 'view:de-selected', function( view, ev ){\n\t this.selected = _.without( this.selected, view.model.id );\n\t //this.lastSelected = view.model.id;\n\t }, this );\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering\n\t /** Render this content, set up ui.\n\t * @param {Number or String} speed the speed of the render\n\t */\n\t render : function( speed ){\n\t this.log( this + '.render', speed );\n\t var $newRender = this._buildNewRender();\n\t this._setUpBehaviors( $newRender );\n\t this._queueNewRender( $newRender, speed );\n\t return this;\n\t },\n\t\n\t /** Build a temp div containing the new children for the view's $el.\n\t */\n\t _buildNewRender : function(){\n\t this.debug( this + '(ListPanel)._buildNewRender' );\n\t var $newRender = $( this.templates.el( {}, this ) );\n\t this._renderControls( $newRender );\n\t this._renderTitle( $newRender );\n\t this._renderSubtitle( $newRender );\n\t this._renderSearch( $newRender );\n\t this.renderItems( $newRender );\n\t return $newRender;\n\t },\n\t\n\t /** Build a temp div containing the new children for the view's $el.\n\t */\n\t _renderControls : function( $newRender ){\n\t this.debug( this + '(ListPanel)._renderControls' );\n\t var $controls = $( this.templates.controls( {}, this ) );\n\t $newRender.find( '.controls' ).replaceWith( $controls );\n\t return $controls;\n\t },\n\t\n\t /**\n\t */\n\t _renderTitle : function( $where ){\n\t //$where = $where || this.$el;\n\t //$where.find( '.title' ).replaceWith( ... )\n\t },\n\t\n\t /**\n\t */\n\t _renderSubtitle : function( $where ){\n\t //$where = $where || this.$el;\n\t //$where.find( '.title' ).replaceWith( ... )\n\t },\n\t\n\t /** Fade out the old el, swap in the new contents, then fade in.\n\t * @param {Number or String} speed jq speed to use for rendering effects\n\t * @fires rendered when rendered\n\t */\n\t _queueNewRender : function( $newRender, speed ) {\n\t speed = ( speed === undefined )?( this.fxSpeed ):( speed );\n\t var panel = this;\n\t panel.log( '_queueNewRender:', $newRender, speed );\n\t\n\t $( panel ).queue( 'fx', [\n\t function( next ){ this.$el.fadeOut( speed, next ); },\n\t function( next ){\n\t panel._swapNewRender( $newRender );\n\t next();\n\t },\n\t function( next ){ this.$el.fadeIn( speed, next ); },\n\t function( next ){\n\t panel.trigger( 'rendered', panel );\n\t next();\n\t }\n\t ]);\n\t },\n\t\n\t /** empty out the current el, move the $newRender's children in */\n\t _swapNewRender : function( $newRender ){\n\t this.$el.empty().attr( 'class', this.className ).append( $newRender.children() );\n\t if( this.selecting ){ this.showSelectors( 0 ); }\n\t return this;\n\t },\n\t\n\t /** */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t $where.find( '.controls [title]' ).tooltip({ placement: 'bottom' });\n\t // set up the pupup for actions available when multi selecting\n\t this._renderMultiselectActionMenu( $where );\n\t return this;\n\t },\n\t\n\t /** render a menu containing the actions available to sets of selected items */\n\t _renderMultiselectActionMenu : function( $where ){\n\t $where = $where || this.$el;\n\t var $menu = $where.find( '.list-action-menu' ),\n\t actions = this.multiselectActions();\n\t if( !actions.length ){\n\t return $menu.empty();\n\t }\n\t\n\t var $newMenu = $([\n\t '
                    ',\n\t '',\n\t '
                      ', '
                    ',\n\t '
                    '\n\t ].join(''));\n\t var $actions = actions.map( function( action ){\n\t var html = [ '
                  16. ', action.html, '
                  17. ' ].join( '' );\n\t return $( html ).click( function( ev ){\n\t ev.preventDefault();\n\t return action.func( ev );\n\t });\n\t });\n\t $newMenu.find( 'ul' ).append( $actions );\n\t $menu.replaceWith( $newMenu );\n\t return $newMenu;\n\t },\n\t\n\t /** return a list of plain objects used to render multiselect actions menu. Each object should have:\n\t * html: an html string used as the anchor contents\n\t * func: a function called when the anchor is clicked (passed the click event)\n\t */\n\t multiselectActions : function(){\n\t return [];\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-$element shortcuts\n\t /** the scroll container for this panel - can be $el, $el.parent(), or grandparent depending on context */\n\t $scrollContainer : function(){\n\t // override or set via attributes.$scrollContainer\n\t return this.$el.parent().parent();\n\t },\n\t /** */\n\t $list : function( $where ){\n\t return ( $where || this.$el ).find( '> .list-items' );\n\t },\n\t /** container where list messages are attached */\n\t $messages : function( $where ){\n\t return ( $where || this.$el ).find( '> .controls .messages' );\n\t },\n\t /** the message displayed when no views can be shown (no views, none matching search) */\n\t $emptyMessage : function( $where ){\n\t return ( $where || this.$el ).find( '> .empty-message' );\n\t },\n\t\n\t // ------------------------------------------------------------------------ hda sub-views\n\t /**\n\t * @param {jQuery} $whereTo what dom element to prepend the sub-views to\n\t * @returns the visible item views\n\t */\n\t renderItems : function( $whereTo ){\n\t $whereTo = $whereTo || this.$el;\n\t var panel = this;\n\t panel.log( this + '.renderItems', $whereTo );\n\t\n\t var $list = panel.$list( $whereTo );\n\t//TODO: free prev. views?\n\t panel.views = panel._filterCollection().map( function( itemModel ){\n\t//TODO: creates views each time - not neccessarily good\n\t//TODO: pass speed here\n\t return panel._createItemView( itemModel ).render( 0 );\n\t });\n\t //panel.debug( item$els );\n\t //panel.debug( newViews );\n\t\n\t $list.empty();\n\t if( panel.views.length ){\n\t panel._attachItems( $whereTo );\n\t panel.$emptyMessage( $whereTo ).hide();\n\t\n\t } else {\n\t panel._renderEmptyMessage( $whereTo ).show();\n\t }\n\t panel.trigger( 'views:ready', panel.views );\n\t\n\t return panel.views;\n\t },\n\t\n\t /** Filter the collection to only those models that should be currently viewed */\n\t _filterCollection : function(){\n\t // override this\n\t var panel = this;\n\t return panel.collection.filter( _.bind( panel._filterItem, panel ) );\n\t },\n\t\n\t /** Should the model be viewable in the current state?\n\t * Checks against this.filters and this.searchFor\n\t */\n\t _filterItem : function( model ){\n\t // override this\n\t var panel = this;\n\t return ( _.every( panel.filters.map( function( fn ){ return fn.call( model ); }) ) )\n\t && ( !panel.searchFor || model.matchesAll( panel.searchFor ) );\n\t },\n\t\n\t /** Create a view for a model and set up it's listeners */\n\t _createItemView : function( model ){\n\t var ViewClass = this._getItemViewClass( model ),\n\t options = _.extend( this._getItemViewOptions( model ), {\n\t model : model\n\t }),\n\t view = new ViewClass( options );\n\t this._setUpItemViewListeners( view );\n\t return view;\n\t },\n\t\n\t /** Get the bbone view class based on the model */\n\t _getItemViewClass : function( model ){\n\t // override this\n\t return this.viewClass;\n\t },\n\t\n\t /** Get the options passed to the new view based on the model */\n\t _getItemViewOptions : function( model ){\n\t // override this\n\t return {\n\t //logger : this.logger,\n\t fxSpeed : this.fxSpeed,\n\t expanded : false,\n\t selectable : this.selecting,\n\t selected : _.contains( this.selected, model.id ),\n\t draggable : this.dragItems\n\t };\n\t },\n\t\n\t /** Set up listeners for new models */\n\t _setUpItemViewListeners : function( view ){\n\t var panel = this;\n\t // send all events to the panel, re-namspaceing them with the view prefix\n\t view.on( 'all', function(){\n\t var args = Array.prototype.slice.call( arguments, 0 );\n\t args[0] = 'view:' + args[0];\n\t panel.trigger.apply( panel, args );\n\t });\n\t\n\t // drag multiple - hijack ev.setData to add all selected items\n\t view.on( 'draggable:dragstart', function( ev, v ){\n\t //TODO: set multiple drag data here\n\t var json = {},\n\t selected = this.getSelectedModels();\n\t if( selected.length ){\n\t json = selected.toJSON();\n\t } else {\n\t json = [ v.model.toJSON() ];\n\t }\n\t ev.dataTransfer.setData( 'text', JSON.stringify( json ) );\n\t //ev.dataTransfer.setDragImage( v.el, 60, 60 );\n\t }, this );\n\t\n\t // debugging\n\t //if( this.logger ){\n\t // view.on( 'all', function( event ){\n\t // this.log( this + '(view)', arguments );\n\t // }, this );\n\t //}\n\t return panel;\n\t },\n\t\n\t /** Attach views in this.views to the model based on $whereTo */\n\t _attachItems : function( $whereTo ){\n\t //ASSUMES: $list has been emptied\n\t this.$list( $whereTo ).append( this.views.map( function( view ){\n\t return view.$el;\n\t }));\n\t return this;\n\t },\n\t\n\t /** render the empty/none-found message */\n\t _renderEmptyMessage : function( $whereTo ){\n\t this.debug( '_renderEmptyMessage', $whereTo, this.searchFor );\n\t var text = this.searchFor? this.noneFoundMsg : this.emptyMsg;\n\t return this.$emptyMessage( $whereTo ).text( text );\n\t },\n\t\n\t /** collapse all item views */\n\t expandAll : function(){\n\t _.each( this.views, function( view ){\n\t view.expand();\n\t });\n\t },\n\t\n\t /** collapse all item views */\n\t collapseAll : function(){\n\t _.each( this.views, function( view ){\n\t view.collapse();\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ collection/views syncing\n\t /** Add a view (if the model should be viewable) to the panel */\n\t addItemView : function( model, collection, options ){\n\t this.log( this + '.addItemView:', model );\n\t var panel = this;\n\t if( !panel._filterItem( model ) ){ return undefined; }\n\t\n\t var view = panel._createItemView( model );\n\t // hide the empty message if only view\n\t $( view ).queue( 'fx', [\n\t //TODO:? could poss. pubsub this\n\t function( next ){ panel.$emptyMessage().fadeOut( panel.fxSpeed, next ); },\n\t function( next ){\n\t panel._attachView( view );\n\t next();\n\t }\n\t ]);\n\t return view;\n\t },\n\t\n\t /** internal fn to add view (to both panel.views and panel.$list) */\n\t _attachView : function( view ){\n\t var panel = this;\n\t // override to control where the view is added, how/whether it's rendered\n\t panel.views.push( view );\n\t panel.$list().append( view.render( 0 ).$el.hide() );\n\t panel.trigger( 'view:attached', view );\n\t view.$el.slideDown( panel.fxSpeed, function(){\n\t panel.trigger( 'view:attached:rendered' );\n\t });\n\t },\n\t\n\t /** Remove a view from the panel (if found) */\n\t removeItemView : function( model, collection, options ){\n\t this.log( this + '.removeItemView:', model );\n\t var panel = this,\n\t view = panel.viewFromModel( model );\n\t if( !view ){ return undefined; }\n\t panel.views = _.without( panel.views, view );\n\t panel.trigger( 'view:removed', view );\n\t\n\t // potentially show the empty message if no views left\n\t // use anonymous queue here - since remove can happen multiple times\n\t $({}).queue( 'fx', [\n\t function( next ){ view.$el.fadeOut( panel.fxSpeed, next ); },\n\t function( next ){\n\t view.remove();\n\t panel.trigger( 'view:removed:rendered' );\n\t if( !panel.views.length ){\n\t panel._renderEmptyMessage().fadeIn( panel.fxSpeed, next );\n\t } else {\n\t next();\n\t }\n\t }\n\t ]);\n\t return view;\n\t },\n\t\n\t /** get views based on model.id */\n\t viewFromModelId : function( id ){\n\t for( var i = 0; i < this.views.length; i++ ){\n\t if( this.views[i].model.id === id ){\n\t return this.views[i];\n\t }\n\t }\n\t return undefined;\n\t },\n\t\n\t /** get views based on model */\n\t viewFromModel : function( model ){\n\t if( !model ){ return undefined; }\n\t return this.viewFromModelId( model.id );\n\t },\n\t\n\t /** get views based on model properties */\n\t viewsWhereModel : function( properties ){\n\t return this.views.filter( function( view ){\n\t //return view.model.matches( properties );\n\t//TODO: replace with _.matches (underscore 1.6.0)\n\t var json = view.model.toJSON();\n\t for( var key in properties ){\n\t if( properties.hasOwnProperty( key ) ){\n\t if( json[ key ] !== view.model.get( key ) ){\n\t return false;\n\t }\n\t }\n\t }\n\t return true;\n\t });\n\t },\n\t\n\t /** A range of views between (and including) viewA and viewB */\n\t viewRange : function( viewA, viewB ){\n\t if( viewA === viewB ){ return ( viewA )?( [ viewA ] ):( [] ); }\n\t\n\t var indexA = this.views.indexOf( viewA ),\n\t indexB = this.views.indexOf( viewB );\n\t\n\t // handle not found\n\t if( indexA === -1 || indexB === -1 ){\n\t if( indexA === indexB ){ return []; }\n\t return ( indexA === -1 )?( [ viewB ] ):( [ viewA ] );\n\t }\n\t // reverse if indeces are\n\t //note: end inclusive\n\t return ( indexA < indexB )?\n\t this.views.slice( indexA, indexB + 1 ) :\n\t this.views.slice( indexB, indexA + 1 );\n\t },\n\t\n\t // ------------------------------------------------------------------------ searching\n\t /** render a search input for filtering datasets shown\n\t * (see SearchableMixin in base-mvc for implementation of the actual searching)\n\t * return will start the search\n\t * esc will clear the search\n\t * clicking the clear button will clear the search\n\t * uses searchInput in ui.js\n\t */\n\t _renderSearch : function( $where ){\n\t $where.find( '.controls .search-input' ).searchInput({\n\t placeholder : this.searchPlaceholder,\n\t initialVal : this.searchFor,\n\t onfirstsearch : _.bind( this._firstSearch, this ),\n\t onsearch : _.bind( this.searchItems, this ),\n\t onclear : _.bind( this.clearSearch, this )\n\t });\n\t return $where;\n\t },\n\t\n\t /** What to do on the first search entered */\n\t _firstSearch : function( searchFor ){\n\t // override to load model details if necc.\n\t this.log( 'onFirstSearch', searchFor );\n\t return this.searchItems( searchFor );\n\t },\n\t\n\t /** filter view list to those that contain the searchFor terms */\n\t searchItems : function( searchFor ){\n\t this.searchFor = searchFor;\n\t this.trigger( 'search:searching', searchFor, this );\n\t this.renderItems();\n\t this.$( '> .controls .search-query' ).val( searchFor );\n\t return this;\n\t },\n\t\n\t /** clear the search filters and show all views that are normally shown */\n\t clearSearch : function( searchFor ){\n\t //this.log( 'onSearchClear', this );\n\t this.searchFor = '';\n\t this.trigger( 'search:clear', this );\n\t this.$( '> .controls .search-query' ).val( '' );\n\t this.renderItems();\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ selection\n\t /** @type Integer when the number of list item views is >= to this, don't animate selectors */\n\t THROTTLE_SELECTORS_AT : 20,\n\t\n\t /** show selectors on all visible itemViews and associated controls */\n\t showSelectors : function( speed ){\n\t speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n\t this.selecting = true;\n\t this.$( '.list-actions' ).slideDown( speed );\n\t speed = this.views.length >= this.THROTTLE_SELECTORS_AT? 0 : speed;\n\t _.each( this.views, function( view ){\n\t view.showSelector( speed );\n\t });\n\t //this.selected = [];\n\t //this.lastSelected = null;\n\t },\n\t\n\t /** hide selectors on all visible itemViews and associated controls */\n\t hideSelectors : function( speed ){\n\t speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n\t this.selecting = false;\n\t this.$( '.list-actions' ).slideUp( speed );\n\t speed = this.views.length >= this.THROTTLE_SELECTORS_AT? 0 : speed;\n\t _.each( this.views, function( view ){\n\t view.hideSelector( speed );\n\t });\n\t this.selected = [];\n\t this.lastSelected = null;\n\t },\n\t\n\t /** show or hide selectors on all visible itemViews and associated controls */\n\t toggleSelectors : function(){\n\t if( !this.selecting ){\n\t this.showSelectors();\n\t } else {\n\t this.hideSelectors();\n\t }\n\t },\n\t\n\t /** select all visible items */\n\t selectAll : function( event ){\n\t _.each( this.views, function( view ){\n\t view.select( event );\n\t });\n\t },\n\t\n\t /** deselect all visible items */\n\t deselectAll : function( event ){\n\t this.lastSelected = null;\n\t _.each( this.views, function( view ){\n\t view.deselect( event );\n\t });\n\t },\n\t\n\t /** select a range of datasets between A and B */\n\t selectRange : function( viewA, viewB ){\n\t var range = this.viewRange( viewA, viewB );\n\t _.each( range, function( view ){\n\t view.select();\n\t });\n\t return range;\n\t },\n\t\n\t /** return an array of all currently selected itemViews */\n\t getSelectedViews : function(){\n\t return _.filter( this.views, function( v ){\n\t return v.selected;\n\t });\n\t },\n\t\n\t /** return a collection of the models of all currenly selected items */\n\t getSelectedModels : function(){\n\t return new this.collection.constructor( _.map( this.getSelectedViews(), function( view ){\n\t return view.model;\n\t }));\n\t },\n\t\n\t // ------------------------------------------------------------------------ loading indicator\n\t//TODO: questionable\n\t /** hide the $el and display a loading indicator (in the $el's parent) when loading new data */\n\t _showLoadingIndicator : function( msg, speed, callback ){\n\t this.debug( '_showLoadingIndicator', this.indicator, msg, speed, callback );\n\t speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n\t if( !this.indicator ){\n\t this.indicator = new LoadingIndicator( this.$el, this.$el.parent() );\n\t this.debug( '\\t created', this.indicator );\n\t }\n\t if( !this.$el.is( ':visible' ) ){\n\t this.indicator.show( 0, callback );\n\t } else {\n\t this.$el.fadeOut( speed );\n\t this.indicator.show( msg, speed, callback );\n\t }\n\t },\n\t\n\t /** hide the loading indicator */\n\t _hideLoadingIndicator : function( speed, callback ){\n\t this.debug( '_hideLoadingIndicator', this.indicator, speed, callback );\n\t speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n\t if( this.indicator ){\n\t this.indicator.hide( speed, callback );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ scrolling\n\t /** get the current scroll position of the panel in its parent */\n\t scrollPosition : function(){\n\t return this.$scrollContainer().scrollTop();\n\t },\n\t\n\t /** set the current scroll position of the panel in its parent */\n\t scrollTo : function( pos, speed ){\n\t speed = speed || 0;\n\t this.$scrollContainer().animate({ scrollTop: pos }, speed );\n\t return this;\n\t },\n\t\n\t /** Scrolls the panel to the top. */\n\t scrollToTop : function( speed ){\n\t return this.scrollTo( 0, speed );\n\t },\n\t\n\t /** */\n\t scrollToItem : function( view, speed ){\n\t if( !view ){ return this; }\n\t //var itemTop = view.$el.offset().top;\n\t var itemTop = view.$el.position().top;\n\t return this.scrollTo( itemTop, speed );\n\t },\n\t\n\t /** Scrolls the panel to show the content with the given id. */\n\t scrollToId : function( id, speed ){\n\t return this.scrollToItem( this.viewFromModelId( id ), speed );\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel events\n\t /** event map */\n\t events : {\n\t 'click .select-all' : 'selectAll',\n\t 'click .deselect-all' : 'deselectAll'\n\t },\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** Return a string rep of the panel */\n\t toString : function(){\n\t return 'ListPanel(' + this.collection + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tListPanel.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var elTemplate = BASE_MVC.wrapTemplate([\n\t // temp container\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ]);\n\t\n\t var controlsTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t '
                    ',\n\t '
                    <%- view.title %>
                    ',\n\t '
                    ',\n\t '
                    <%- view.subtitle %>
                    ',\n\t // buttons, controls go here\n\t '
                    ',\n\t // deleted msg, etc.\n\t '
                    ',\n\t\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t\n\t // show when selectors are shown\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ]);\n\t\n\t return {\n\t el : elTemplate,\n\t controls : controlsTemplate\n\t };\n\t}());\n\t\n\t\n\t//=============================================================================\n\t/** View for a model that has a sub-collection (e.g. History, DatasetCollection)\n\t * Allows:\n\t * the model to be reset\n\t * auto assign panel.collection to panel.model[ panel.modelCollectionKey ]\n\t *\n\t */\n\tvar ModelListPanel = ListPanel.extend({\n\t\n\t /** key of attribute in model to assign to this.collection */\n\t modelCollectionKey : 'contents',\n\t\n\t initialize : function( attributes ){\n\t ListPanel.prototype.initialize.call( this, attributes );\n\t this.selecting = ( attributes.selecting !== undefined )? attributes.selecting : false;\n\t\n\t this.setModel( this.model, attributes );\n\t },\n\t\n\t /** release/free/shutdown old models and set up panel for new models\n\t * @fires new-model with the panel as parameter\n\t */\n\t setModel : function( model, attributes ){\n\t attributes = attributes || {};\n\t this.debug( this + '.setModel:', model, attributes );\n\t\n\t this.freeModel();\n\t this.freeViews();\n\t\n\t if( model ){\n\t var oldModelId = this.model? this.model.get( 'id' ): null;\n\t\n\t // set up the new model with user, logger, storage, events\n\t this.model = model;\n\t if( this.logger ){\n\t this.model.logger = this.logger;\n\t }\n\t this._setUpModelListeners();\n\t\n\t//TODO: relation btwn model, collection becoming tangled here\n\t // free the collection, and assign the new collection to either\n\t // the model[ modelCollectionKey ], attributes.collection, or an empty vanilla collection\n\t this.collection.off();\n\t this.collection = ( this.model[ this.modelCollectionKey ] )?\n\t this.model[ this.modelCollectionKey ]:\n\t ( attributes.collection || ( new this.collectionClass([]) ) );\n\t this._setUpCollectionListeners();\n\t\n\t if( oldModelId && model.get( 'id' ) !== oldModelId ){\n\t this.trigger( 'new-model', this );\n\t }\n\t }\n\t return this;\n\t },\n\t\n\t /** free the current model and all listeners for it, free any views for the model */\n\t freeModel : function(){\n\t // stop/release the previous model, and clear cache to sub-views\n\t if( this.model ){\n\t this.stopListening( this.model );\n\t //TODO: see base-mvc\n\t //this.model.free();\n\t //this.model = null;\n\t }\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ listening\n\t /** listening for model events */\n\t _setUpModelListeners : function(){\n\t // override\n\t this.log( this + '._setUpModelListeners', this.model );\n\t // bounce model errors up to the panel\n\t this.model.on( 'error', function(){\n\t var args = Array.prototype.slice.call( arguments, 0 );\n\t //args.unshift( 'model:error' );\n\t args.unshift( 'error' );\n\t this.trigger.apply( this, args );\n\t }, this );\n\t return this;\n\t },\n\t\n\t /** Build a temp div containing the new children for the view's $el.\n\t */\n\t _renderControls : function( $newRender ){\n\t this.debug( this + '(ListPanel)._renderControls' );\n\t var json = this.model? this.model.toJSON() : {},\n\t $controls = $( this.templates.controls( json, this ) );\n\t $newRender.find( '.controls' ).replaceWith( $controls );\n\t return $controls;\n\t },\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** Return a string rep of the panel */\n\t toString : function(){\n\t return 'ModelListPanel(' + this.model + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tModelListPanel.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var controlsTemplate = BASE_MVC.wrapTemplate([\n\t '
                    ',\n\t '
                    ',\n\t//TODO: this is really the only difference - consider factoring titlebar out\n\t '
                    <%- model.name %>
                    ',\n\t '
                    ',\n\t '
                    <%- view.subtitle %>
                    ',\n\t '
                    ',\n\t '
                    ',\n\t\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ]);\n\t\n\t return _.extend( _.clone( ListPanel.prototype.templates ), {\n\t controls : controlsTemplate\n\t });\n\t}());\n\t\n\t\n\t//=============================================================================\n\t return {\n\t ListPanel : ListPanel,\n\t ModelListPanel : ModelListPanel\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 101 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( baseMVC, _l ){\n\t// =============================================================================\n\t/** A view on any model that has a 'tags' attribute (a list of tag strings)\n\t * Incorporates the select2 jQuery plugin for tags display/editing:\n\t * http://ivaynberg.github.io/select2/\n\t */\n\tvar TagsEditor = Backbone.View\n\t .extend( baseMVC.LoggableMixin )\n\t .extend( baseMVC.HiddenUntilActivatedViewMixin ).extend({\n\t\n\t tagName : 'div',\n\t className : 'tags-display',\n\t\n\t /** Set up listeners, parse options */\n\t initialize : function( options ){\n\t //console.debug( this, options );\n\t // only listen to the model only for changes to tags - re-render\n\t this.listenTo( this.model, 'change:tags', function(){\n\t this.render();\n\t });\n\t this.hiddenUntilActivated( options.$activator, options );\n\t },\n\t\n\t /** Build the DOM elements, call select to on the created input, and set up behaviors */\n\t render : function(){\n\t var view = this;\n\t this.$el.html( this._template() );\n\t\n\t this.$input().select2({\n\t placeholder : 'Add tags',\n\t width : '100%',\n\t tags : function(){\n\t // initialize possible tags in the dropdown based on all the tags the user has used so far\n\t return view._getTagsUsed();\n\t }\n\t });\n\t\n\t this._setUpBehaviors();\n\t return this;\n\t },\n\t\n\t /** @returns {String} the html text used to build the view's DOM */\n\t _template : function(){\n\t return [\n\t //TODO: make prompt optional\n\t '',\n\t // set up initial tags by adding as CSV to input vals (necc. to init select2)\n\t ''\n\t ].join( '' );\n\t },\n\t\n\t /** @returns {String} the sorted, comma-separated tags from the model */\n\t tagsToCSV : function(){\n\t var tagsArray = this.model.get( 'tags' );\n\t if( !_.isArray( tagsArray ) || _.isEmpty( tagsArray ) ){\n\t return '';\n\t }\n\t return tagsArray.map( function( tag ){\n\t return _.escape( tag );\n\t }).sort().join( ',' );\n\t },\n\t\n\t /** @returns {jQuery} the input for this view */\n\t $input : function(){\n\t return this.$el.find( 'input.tags-input' );\n\t },\n\t\n\t /** @returns {String[]} all tags used by the current user */\n\t _getTagsUsed : function(){\n\t//TODO: global\n\t return Galaxy.user.get( 'tags_used' );\n\t },\n\t\n\t /** set up any event listeners on the view's DOM (mostly handled by select2) */\n\t _setUpBehaviors : function(){\n\t var view = this;\n\t this.$input().on( 'change', function( event ){\n\t // save the model's tags in either remove or added event\n\t view.model.save({ tags: event.val }, { silent: true });\n\t // if it's new, add the tag to the users tags\n\t if( event.added ){\n\t //??: solve weird behavior in FF on test.galaxyproject.org where\n\t // event.added.text is string object: 'String{ 0=\"o\", 1=\"n\", 2=\"e\" }'\n\t view._addNewTagToTagsUsed( event.added.text + '' );\n\t }\n\t });\n\t },\n\t\n\t /** add a new tag (if not already there) to the list of all tags used by the user\n\t * @param {String} newTag the tag to add to the list of used\n\t */\n\t _addNewTagToTagsUsed : function( newTag ){\n\t//TODO: global\n\t var tagsUsed = Galaxy.user.get( 'tags_used' );\n\t if( !_.contains( tagsUsed, newTag ) ){\n\t tagsUsed.push( newTag );\n\t tagsUsed.sort();\n\t Galaxy.user.set( 'tags_used', tagsUsed );\n\t }\n\t },\n\t\n\t /** shut down event listeners and remove this view's DOM */\n\t remove : function(){\n\t this.$input.off();\n\t this.stopListening( this.model );\n\t Backbone.View.prototype.remove.call( this );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){ return [ 'TagsEditor(', this.model + '', ')' ].join(''); }\n\t});\n\t\n\t// =============================================================================\n\treturn {\n\t TagsEditor : TagsEditor\n\t};\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3)))\n\n/***/ },\n/* 102 */,\n/* 103 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {/** This renders the content of the ftp popup **/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\treturn Backbone.View.extend({\n\t // render\n\t initialize: function(options) {\n\t // link options\n\t this.options = Utils.merge(options, {\n\t class_add : 'upload-icon-button fa fa-square-o',\n\t class_remove : 'upload-icon-button fa fa-check-square-o',\n\t class_partial : 'upload-icon-button fa fa-minus-square-o',\n\t collection : null,\n\t onchange : function() {},\n\t onadd : function() {},\n\t onremove : function() {}\n\t });\n\t\n\t // link this\n\t var self = this;\n\t\n\t // link app\n\t this.collection = this.options.collection;\n\t\n\t // set template\n\t this.setElement(this._template());\n\t\n\t // list of rows\n\t this.rows = [];\n\t\n\t // load extension\n\t Utils.get({\n\t url : Galaxy.root + 'api/remote_files',\n\t success : function(ftp_files) { self._fill(ftp_files); },\n\t error : function() { self._fill(); }\n\t });\n\t },\n\t\n\t // fill table\n\t _fill: function(ftp_files) {\n\t if (ftp_files && ftp_files.length > 0) {\n\t // add table\n\t this.$el.find('#upload-ftp-content').html($(this._templateTable()));\n\t\n\t // add files to table\n\t var size = 0;\n\t for (index in ftp_files) {\n\t this.rows.push(this._add(ftp_files[index]));\n\t size += ftp_files[index].size;\n\t }\n\t\n\t // update stats\n\t this.$el.find('#upload-ftp-number').html(ftp_files.length + ' files');\n\t this.$el.find('#upload-ftp-disk').html(Utils.bytesToString (size, true));\n\t\n\t // add event handler to select/unselect all\n\t if (this.collection) {\n\t var self = this;\n\t this.$('._has_collection').show();\n\t this.$select_all = $('#upload-selectall');\n\t this.$select_all.addClass(this.options.class_add);\n\t this.$select_all.on('click', function() {\n\t var add = self.$select_all.hasClass(self.options.class_add);\n\t for (index in ftp_files) {\n\t var ftp_file = ftp_files[index];\n\t var model_index = self._find(ftp_file);\n\t if(!model_index && add || model_index && !add) {\n\t self.rows[index].trigger('click');\n\t }\n\t }\n\t });\n\t this._refresh();\n\t }\n\t } else {\n\t this.$el.find('#upload-ftp-content').html($(this._templateInfo()));\n\t }\n\t this.$el.find('#upload-ftp-wait').hide();\n\t },\n\t\n\t // add\n\t _add: function(ftp_file) {\n\t // link this\n\t var self = this;\n\t\n\t // create new item\n\t var $it = $(this._templateRow(ftp_file));\n\t\n\t // identify icon\n\t var $icon = $it.find('.icon');\n\t\n\t // append to table\n\t $(this.el).find('tbody').append($it);\n\t\n\t // collection mode with add/remove triggers\n\t if (this.collection) {\n\t // find model and set initial 'add' icon class\n\t var icon_class = '';\n\t if (this._find(ftp_file)) {\n\t icon_class = this.options.class_remove;\n\t } else {\n\t icon_class = this.options.class_add;\n\t }\n\t $icon.addClass(icon_class);\n\t\n\t // click triggers add/remove events\n\t $it.on('click', function() {\n\t var model_index = self._find(ftp_file);\n\t $icon.removeClass();\n\t if (!model_index) {\n\t self.options.onadd(ftp_file);\n\t $icon.addClass(self.options.class_remove);\n\t } else {\n\t self.options.onremove(model_index);\n\t $icon.addClass(self.options.class_add);\n\t }\n\t self._refresh();\n\t });\n\t } else {\n\t // click triggers only change\n\t $it.on('click', function() {\n\t self.options.onchange(ftp_file);\n\t });\n\t }\n\t\n\t // return dom handler\n\t return $it;\n\t },\n\t\n\t // refresh\n\t _refresh: function() {\n\t var filtered = this.collection.where({file_mode: 'ftp', enabled: true});\n\t this.$select_all.removeClass();\n\t if (filtered.length == 0) {\n\t this.$select_all.addClass(this.options.class_add);\n\t } else {\n\t if (filtered.length == this.rows.length) {\n\t this.$select_all.addClass(this.options.class_remove);\n\t } else {\n\t this.$select_all.addClass(this.options.class_partial);\n\t }\n\t }\n\t },\n\t\n\t // get model index\n\t _find: function(ftp_file) {\n\t var item = this.collection.findWhere({\n\t file_path : ftp_file.path,\n\t file_mode : 'ftp',\n\t enabled : true\n\t });\n\t return item && item.get('id');\n\t },\n\t\n\t // template row\n\t _templateRow: function(options) {\n\t return '' +\n\t '
                    ' +\n\t '' + options.path + '' +\n\t '' + Utils.bytesToString(options.size) + '' +\n\t '' + options.ctime + '' +\n\t '';\n\t },\n\t\n\t // load table template\n\t _templateTable: function() {\n\t return 'Available files: ' +\n\t '' +\n\t '' +\n\t '  ' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '
                    NameSizeCreated
                    ';\n\t },\n\t\n\t // load table template\n\t _templateInfo: function() {\n\t return '
                    ' +\n\t 'Your FTP directory does not contain any files.' +\n\t '
                    ';\n\t },\n\t\n\t // load html template\n\t _template: function() {\n\t return '
                    ' +\n\t '
                    ' +\n\t '
                    This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at ' + this.options.ftp_upload_site + ' using your Galaxy credentials (email address and password).
                    ' +\n\t '
                    ' +\n\t '
                    ';\n\t }\n\t});\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1)))\n\n/***/ },\n/* 104 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone) {/** This renders the content of the settings popup, allowing users to specify flags i.e. for space-to-tab conversion **/\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4)], __WEBPACK_AMD_DEFINE_RESULT__ = function(Utils) {\n\treturn Backbone.View.extend({\n\t // options\n\t options: {\n\t class_check : 'upload-icon-button fa fa-check-square-o',\n\t class_uncheck : 'upload-icon-button fa fa-square-o'\n\t },\n\t\n\t // initialize\n\t initialize: function(app) {\n\t // link app\n\t this.app = app;\n\t\n\t // link this\n\t var self = this;\n\t\n\t // set template\n\t this.setElement(this._template());\n\t\n\t // link model\n\t this.model = this.app.model;\n\t\n\t // ui event: space-to-tab\n\t this.$('#upload-space-to-tab').on('click', function() {\n\t self._switchState('#upload-space-to-tab', 'space_to_tab');\n\t });\n\t\n\t // ui event: to-posix-lines\n\t this.$('#upload-to-posix-lines').on('click', function() {\n\t self._switchState('#upload-to-posix-lines', 'to_posix_lines');\n\t });\n\t\n\t // render\n\t this.render();\n\t },\n\t\n\t // render\n\t render: function() {\n\t // render states\n\t this._renderState('#upload-space-to-tab', this.model.get('space_to_tab'));\n\t this._renderState('#upload-to-posix-lines', this.model.get('to_posix_lines'));\n\t\n\t // disable options\n\t var $cover = this.$('#upload-settings-cover');\n\t if (!this.model.get('enabled')) {\n\t $cover.show();\n\t } else {\n\t $cover.hide();\n\t }\n\t },\n\t\n\t // switch state\n\t _switchState: function (element_id, parameter_id) {\n\t if (this.model.get('enabled')) {\n\t var checked = !this.model.get(parameter_id);\n\t this.model.set(parameter_id, checked);\n\t this._renderState(element_id, checked);\n\t }\n\t },\n\t\n\t // render state\n\t _renderState: function (element_id, checked) {\n\t var $it = this.$(element_id);\n\t $it.removeClass();\n\t if (checked) {\n\t $it.addClass(this.options.class_check);\n\t } else {\n\t $it.addClass(this.options.class_uncheck);\n\t }\n\t },\n\t\n\t // load template\n\t _template: function() {\n\t return '
                    ' +\n\t '
                    ' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '' +\n\t '
                    Convert spaces to tabs
                    Use POSIX standard
                    ' +\n\t '
                    ';\n\t }\n\t});\n\t\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))\n\n/***/ },\n/* 105 */,\n/* 106 */,\n/* 107 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery, $) {(function (factory) {\n\t if (true) {\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else {\n\t // Browser globals\n\t factory(jQuery);\n\t }\n\t\n\t}(function () {\n\t//=============================================================================\n\t\n\t jQuery.fn.extend({\n\t hoverhighlight : function $hoverhighlight( scope, color ){\n\t scope = scope || 'body';\n\t if( !this.size() ){ return this; }\n\t\n\t $( this ).each( function(){\n\t var $this = $( this ),\n\t targetSelector = $this.data( 'target' );\n\t\n\t if( targetSelector ){\n\t $this.mouseover( function( ev ){\n\t $( targetSelector, scope ).css({\n\t background: color\n\t });\n\t })\n\t .mouseout( function( ev ){\n\t $( targetSelector ).css({\n\t background: ''\n\t });\n\t });\n\t }\n\t });\n\t return this;\n\t }\n\t });\n\t}));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 108 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function($, jQuery) {// from: https://raw.githubusercontent.com/umdjs/umd/master/jqueryPlugin.js\n\t// Uses AMD or browser globals to create a jQuery plugin.\n\t(function (factory) {\n\t if (true) {\n\t //TODO: So...this turns out to be an all or nothing thing. If I load jQuery in the define below, it will\n\t // (of course) wipe the old jquery *and all the plugins loaded into it*. So the define below *is still\n\t // relying on jquery being loaded globally* in order to preserve plugins.\n\t !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t } else {\n\t // Browser globals\n\t factory(jQuery);\n\t }\n\t\n\t}(function () {\n\t var _l = window._l || function( s ){ return s; };\n\t\n\t /** searchInput: (jQuery plugin)\n\t * Creates a search input, a clear button, and loading indicator\n\t * within the selected node.\n\t *\n\t * When the user either presses return or enters some minimal number\n\t * of characters, a callback is called. Pressing ESC when the input\n\t * is focused will clear the input and call a separate callback.\n\t */\n\t function searchInput( parentNode, options ){\n\t//TODO: consolidate with tool menu functionality, use there\n\t var KEYCODE_ESC = 27,\n\t KEYCODE_RETURN = 13,\n\t $parentNode = $( parentNode ),\n\t firstSearch = true,\n\t defaults = {\n\t initialVal : '',\n\t name : 'search',\n\t placeholder : 'search',\n\t classes : '',\n\t onclear : function(){},\n\t onfirstsearch : null,\n\t onsearch : function( inputVal ){},\n\t minSearchLen : 0,\n\t escWillClear : true,\n\t oninit : function(){}\n\t };\n\t\n\t // .................................................................... input rendering and events\n\t // visually clear the search, trigger an event, and call the callback\n\t function clearSearchInput( event ){\n\t var $input = $( this ).parent().children( 'input' );\n\t //console.debug( this, 'clear', $input );\n\t $input.focus().val( '' ).trigger( 'clear:searchInput' );\n\t options.onclear();\n\t }\n\t\n\t // search for searchTerms, trigger an event, call the appropo callback (based on whether this is the first)\n\t function search( event, searchTerms ){\n\t //console.debug( this, 'searching', searchTerms );\n\t //TODO: I don't think this is classic jq custom event form? search.searchInput?\n\t $( this ).trigger( 'search:searchInput', searchTerms );\n\t if( typeof options.onfirstsearch === 'function' && firstSearch ){\n\t firstSearch = false;\n\t options.onfirstsearch( searchTerms );\n\t } else {\n\t options.onsearch( searchTerms );\n\t }\n\t }\n\t\n\t // .................................................................... input rendering and events\n\t function inputTemplate(){\n\t // class search-query is bootstrap 2.3 style that now lives in base.less\n\t return [ '' ].join( '' );\n\t }\n\t\n\t // the search input that responds to keyboard events and displays the search value\n\t function $input(){\n\t return $( inputTemplate() )\n\t // select all text on a focus\n\t .focus( function( event ){\n\t $( this ).select();\n\t })\n\t // attach behaviors to esc, return if desired, search on some min len string\n\t .keyup( function( event ){\n\t event.preventDefault();\n\t event.stopPropagation();\n\t//TODO: doesn't work\n\t if( !$( this ).val() ){ $( this ).blur(); }\n\t\n\t // esc key will clear if desired\n\t if( event.which === KEYCODE_ESC && options.escWillClear ){\n\t clearSearchInput.call( this, event );\n\t\n\t } else {\n\t var searchTerms = $( this ).val();\n\t // return key or the search string len > minSearchLen (if not 0) triggers search\n\t if( ( event.which === KEYCODE_RETURN )\n\t || ( options.minSearchLen && searchTerms.length >= options.minSearchLen ) ){\n\t search.call( this, event, searchTerms );\n\t } else if( !searchTerms.length ){\n\t clearSearchInput.call( this, event );\n\t }\n\t }\n\t })\n\t .on( 'change', function( event ){\n\t search.call( this, event, $( this ).val() );\n\t })\n\t .val( options.initialVal );\n\t }\n\t\n\t // .................................................................... clear button rendering and events\n\t // a button for clearing the search bar, placed on the right hand side\n\t function $clearBtn(){\n\t return $([ '' ].join('') )\n\t .tooltip({ placement: 'bottom' })\n\t .click( function( event ){\n\t clearSearchInput.call( this, event );\n\t });\n\t }\n\t\n\t // .................................................................... loadingIndicator rendering\n\t // a button for clearing the search bar, placed on the right hand side\n\t function $loadingIndicator(){\n\t return $([ '' ].join('') )\n\t .hide().tooltip({ placement: 'bottom' });\n\t }\n\t\n\t // .................................................................... commands\n\t // visually swap the load, clear buttons\n\t function toggleLoadingIndicator(){\n\t $parentNode.find( '.search-loading' ).toggle();\n\t $parentNode.find( '.search-clear' ).toggle();\n\t }\n\t\n\t // .................................................................... init\n\t // string command (not constructor)\n\t if( jQuery.type( options ) === 'string' ){\n\t if( options === 'toggle-loading' ){\n\t toggleLoadingIndicator();\n\t }\n\t return $parentNode;\n\t }\n\t\n\t // initial render\n\t if( jQuery.type( options ) === 'object' ){\n\t options = jQuery.extend( true, {}, defaults, options );\n\t }\n\t //NOTE: prepended\n\t return $parentNode.addClass( 'search-input' ).prepend([ $input(), $clearBtn(), $loadingIndicator() ]);\n\t }\n\t\n\t // as jq plugin\n\t jQuery.fn.extend({\n\t searchInput : function $searchInput( options ){\n\t return this.each( function(){\n\t return searchInput( this, options );\n\t });\n\t }\n\t });\n\t}));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 109 */,\n/* 110 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function(){\n\t// Alphanumeric/natural sort fn\n\tfunction naturalSort(a, b) {\n\t // setup temp-scope variables for comparison evauluation\n\t var re = /(-?[0-9\\.]+)/g,\n\t x = a.toString().toLowerCase() || '',\n\t y = b.toString().toLowerCase() || '',\n\t nC = String.fromCharCode(0),\n\t xN = x.replace( re, nC + '$1' + nC ).split(nC),\n\t yN = y.replace( re, nC + '$1' + nC ).split(nC),\n\t xD = (new Date(x)).getTime(),\n\t yD = xD ? (new Date(y)).getTime() : null;\n\t // natural sorting of dates\n\t if ( yD ) {\n\t if ( xD < yD ) { return -1; }\n\t else if ( xD > yD ) { return 1; }\n\t }\n\t // natural sorting through split numeric strings and default strings\n\t var oFxNcL, oFyNcL;\n\t for ( var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++ ) {\n\t oFxNcL = parseFloat(xN[cLoc]) || xN[cLoc];\n\t oFyNcL = parseFloat(yN[cLoc]) || yN[cLoc];\n\t if (oFxNcL < oFyNcL) { return -1; }\n\t else if (oFxNcL > oFyNcL) { return 1; }\n\t }\n\t return 0;\n\t}\n\t\n\treturn naturalSort;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n\n\n/***/ },\n/* 111 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery, _) {/*\n\t galaxy upload plugins - requires FormData and XMLHttpRequest\n\t*/\n\t;(function($){\n\t // add event properties\n\t jQuery.event.props.push(\"dataTransfer\");\n\t\n\t /**\n\t Posts file data to the API\n\t */\n\t $.uploadpost = function (config) {\n\t // parse options\n\t var cnf = $.extend({}, {\n\t data : {},\n\t success : function() {},\n\t error : function() {},\n\t progress : function() {},\n\t url : null,\n\t maxfilesize : 2048,\n\t error_filesize : 'File exceeds 2GB. Please use a FTP client.',\n\t error_default : 'Please make sure the file is available.',\n\t error_server : 'Upload request failed.',\n\t error_login : 'Uploads require you to log in.'\n\t }, config);\n\t\n\t // link data\n\t var data = cnf.data;\n\t\n\t // check errors\n\t if (data.error_message) {\n\t cnf.error(data.error_message);\n\t return;\n\t }\n\t\n\t // construct form data\n\t var form = new FormData();\n\t for (var key in data.payload) {\n\t form.append(key, data.payload[key]);\n\t }\n\t\n\t // add files to submission\n\t var sizes = 0;\n\t for (var key in data.files) {\n\t var d = data.files[key];\n\t form.append(d.name, d.file, d.file.name);\n\t sizes += d.file.size;\n\t }\n\t\n\t // check file size, unless it's an ftp file\n\t if (sizes > 1048576 * cnf.maxfilesize) {\n\t cnf.error(cnf.error_filesize);\n\t return;\n\t }\n\t\n\t // prepare request\n\t xhr = new XMLHttpRequest();\n\t xhr.open('POST', cnf.url, true);\n\t xhr.setRequestHeader('Accept', 'application/json');\n\t xhr.setRequestHeader('Cache-Control', 'no-cache');\n\t xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\n\t // captures state changes\n\t xhr.onreadystatechange = function() {\n\t // check for request completed, server connection closed\n\t if (xhr.readyState == xhr.DONE) {\n\t // parse response\n\t var response = null;\n\t if (xhr.responseText) {\n\t try {\n\t response = jQuery.parseJSON(xhr.responseText);\n\t } catch (e) {\n\t response = xhr.responseText;\n\t }\n\t }\n\t // pass any error to the error option\n\t if (xhr.status < 200 || xhr.status > 299) {\n\t var text = xhr.statusText;\n\t if (xhr.status == 403) {\n\t text = cnf.error_login;\n\t } else if (xhr.status == 0) {\n\t text = cnf.error_server;\n\t } else if (!text) {\n\t text = cnf.error_default;\n\t }\n\t cnf.error(text + ' (' + xhr.status + ')');\n\t } else {\n\t cnf.success(response);\n\t }\n\t }\n\t }\n\t\n\t // prepare upload progress\n\t xhr.upload.addEventListener('progress', function(e) {\n\t if (e.lengthComputable) {\n\t cnf.progress(Math.round((e.loaded * 100) / e.total));\n\t }\n\t }, false);\n\t\n\t // send request\n\t Galaxy.emit.debug('uploadbox::uploadpost()', 'Posting following data.', cnf);\n\t xhr.send(form);\n\t }\n\t\n\t /**\n\t Handles the upload events drag/drop etc.\n\t */\n\t $.fn.uploadinput = function(options) {\n\t // initialize\n\t var el = this;\n\t var opts = $.extend({}, {\n\t ondragover : function() {},\n\t ondragleave : function() {},\n\t onchange : function() {},\n\t multiple : false\n\t }, options);\n\t\n\t // append hidden upload field\n\t var $input = $('');\n\t el.append($input.change(function (e) {\n\t opts.onchange(e.target.files);\n\t $(this).val('');\n\t }));\n\t\n\t // drag/drop events\n\t el.on('drop', function (e) {\n\t opts.ondragleave(e);\n\t if(e.dataTransfer) {\n\t opts.onchange(e.dataTransfer.files);\n\t e.preventDefault();\n\t }\n\t });\n\t el.on('dragover', function (e) {\n\t e.preventDefault();\n\t opts.ondragover(e);\n\t });\n\t el.on('dragleave', function (e) {\n\t e.stopPropagation();\n\t opts.ondragleave(e);\n\t });\n\t\n\t // exports\n\t return {\n\t dialog: function () {\n\t $input.trigger('click');\n\t }\n\t }\n\t }\n\t\n\t /**\n\t Handles the upload queue and events such as drag/drop etc.\n\t */\n\t $.fn.uploadbox = function(options) {\n\t // parse options\n\t var opts = $.extend({}, {\n\t dragover : function() {},\n\t dragleave : function() {},\n\t announce : function(d) {},\n\t initialize : function(d) {},\n\t progress : function(d, m) {},\n\t success : function(d, m) {},\n\t error : function(d, m) { alert(m); },\n\t complete : function() {}\n\t }, options);\n\t\n\t // file queue\n\t var queue = {};\n\t\n\t // queue index/length counter\n\t var queue_index = 0;\n\t var queue_length = 0;\n\t\n\t // indicates if queue is currently running\n\t var queue_running = false;\n\t var queue_stop = false;\n\t\n\t // element\n\t var uploadinput = $(this).uploadinput({\n\t multiple : true,\n\t onchange : function(files) { add(files); },\n\t ondragover : options.ondragover,\n\t ondragleave : options.ondragleave\n\t });\n\t\n\t // add new files to upload queue\n\t function add(files) {\n\t if (files && files.length && !queue_running) {\n\t var current_index = queue_index;\n\t _.each(files, function(file, key) {\n\t if (file.mode !== 'new' && _.filter(queue, function(f) {\n\t return f.name === file.name && f.size === file.size;\n\t }).length) {\n\t file.duplicate = true;\n\t }\n\t });\n\t _.each(files, function(file) {\n\t if (!file.duplicate) {\n\t var index = String(queue_index++);\n\t queue[index] = file;\n\t opts.announce(index, queue[index]);\n\t queue_length++;\n\t }\n\t });\n\t return current_index;\n\t }\n\t }\n\t\n\t // remove file from queue\n\t function remove(index) {\n\t if (queue[index]) {\n\t delete queue[index];\n\t queue_length--;\n\t }\n\t }\n\t\n\t // process an upload, recursive\n\t function process() {\n\t // validate\n\t if (queue_length == 0 || queue_stop) {\n\t queue_stop = false;\n\t queue_running = false;\n\t opts.complete();\n\t return;\n\t } else {\n\t queue_running = true;\n\t }\n\t\n\t // get an identifier from the queue\n\t var index = -1;\n\t for (var key in queue) {\n\t index = key;\n\t break;\n\t }\n\t\n\t // get current file from queue\n\t var file = queue[index];\n\t\n\t // remove from queue\n\t remove(index)\n\t\n\t // create and submit data\n\t $.uploadpost({\n\t url : opts.url,\n\t data : opts.initialize(index),\n\t success : function(message) { opts.success(index, message); process();},\n\t error : function(message) { opts.error(index, message); process();},\n\t progress : function(percentage) { opts.progress(index, percentage); }\n\t });\n\t }\n\t\n\t /*\n\t public interface\n\t */\n\t\n\t // open file browser for selection\n\t function select() {\n\t uploadinput.dialog();\n\t }\n\t\n\t // remove all entries from queue\n\t function reset(index) {\n\t for (index in queue) {\n\t remove(index);\n\t }\n\t }\n\t\n\t // initiate upload process\n\t function start() {\n\t if (!queue_running) {\n\t queue_running = true;\n\t process();\n\t }\n\t }\n\t\n\t // stop upload process\n\t function stop() {\n\t queue_stop = true;\n\t }\n\t\n\t // set options\n\t function configure(options) {\n\t opts = $.extend({}, opts, options);\n\t return opts;\n\t }\n\t\n\t // verify browser compatibility\n\t function compatible() {\n\t return window.File && window.FormData && window.XMLHttpRequest && window.FileList;\n\t }\n\t\n\t // export functions\n\t return {\n\t 'select' : select,\n\t 'add' : add,\n\t 'remove' : remove,\n\t 'start' : start,\n\t 'stop' : stop,\n\t 'reset' : reset,\n\t 'configure' : configure,\n\t 'compatible' : compatible\n\t };\n\t }\n\t})(jQuery);\n\t\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 112 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar RightPanel = __webpack_require__( 13 ).RightPanel,\n\t Ui = __webpack_require__( 7 ),\n\t historyOptionsMenu = __webpack_require__( 133 );\n\t CurrentHistoryView = __webpack_require__( 130 ).CurrentHistoryView,\n\t _l = __webpack_require__( 5 );\n\t\n\t/** the right hand panel in the analysis page that shows the current history */\n\tvar HistoryPanel = RightPanel.extend({\n\t\n\t title : _l( 'History' ),\n\t\n\t initialize : function( options ){\n\t RightPanel.prototype.initialize.call( this, options );\n\t var self = this;\n\t\n\t // this button re-fetches the history and contents and re-renders the history panel\n\t this.refreshButton = new Ui.ButtonLink({\n\t id : 'history-refresh-button',\n\t title : _l( 'Refresh history' ),\n\t cls : 'panel-header-button',\n\t icon : 'fa fa-refresh',\n\t onclick : function() {\n\t self.historyView.loadCurrentHistory();\n\t }\n\t });\n\t // opens a drop down menu with history related functions (like view all, delete, share, etc.)\n\t this.optionsButton = new Ui.ButtonLink({\n\t id : 'history-options-button',\n\t title : _l( 'History options' ),\n\t cls : 'panel-header-button',\n\t icon : 'fa fa-cog',\n\t });\n\t // goes to a page showing all the users histories in panel form (for logged in users)\n\t this.viewMultiButton = null;\n\t if( !options.userIsAnonymous ){\n\t this.viewMultiButton = new Ui.ButtonLink({\n\t id : 'history-view-multi-button',\n\t title : _l( 'View all histories' ),\n\t cls : 'panel-header-button',\n\t icon : 'fa fa-columns',\n\t href : options.galaxyRoot + 'history/view_multiple'\n\t });\n\t }\n\t\n\t // build history options menu\n\t this.optionsMenu = historyOptionsMenu( this.optionsButton.$el, {\n\t anonymous : options.userIsAnonymous,\n\t purgeAllowed : options.allow_user_dataset_purge,\n\t root : options.galaxyRoot\n\t });\n\t\n\t // view of the current history\n\t this.historyView = new CurrentHistoryView({\n\t purgeAllowed : options.allow_user_dataset_purge,\n\t linkTarget : 'galaxy_main',\n\t $scrollContainer: function(){ return this.$el.parent(); }\n\t });\n\t },\n\t\n\t render : function(){\n\t RightPanel.prototype.render.call( this );\n\t this.$( '.unified-panel-header' ).addClass( 'history-panel-header' );\n\t this.$( '.panel-header-buttons' ).append([\n\t this.refreshButton.$el,\n\t this.optionsButton.$el,\n\t this.viewMultiButton? this.viewMultiButton.$el : null,\n\t ]);\n\t this.historyView\n\t .setElement( this.$( '.history-panel' ) );\n\t // causes blink/flash due to loadCurrentHistory rendering as well\n\t // .render();\n\t },\n\t\n\t _templateBody : function( data ){\n\t return [\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ].join('');\n\t },\n\t\n\t toString : function(){ return 'HistoryPanel'; }\n\t});\n\t\n\tmodule.exports = HistoryPanel;\n\n/***/ },\n/* 113 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function($, _) {var LeftPanel = __webpack_require__( 13 ).LeftPanel,\n\t Tools = __webpack_require__( 50 ),\n\t Upload = __webpack_require__( 139 ),\n\t _l = __webpack_require__( 5 );\n\t\n\t/* Builds the tool menu panel on the left of the analysis page */\n\tvar ToolPanel = LeftPanel.extend({\n\t\n\t title : _l( 'Tools' ),\n\t\n\t initialize: function( options ){\n\t LeftPanel.prototype.initialize.call( this, options );\n\t this.log( this + '.initialize:', options );\n\t\n\t /** @type {Object[]} descriptions of user's workflows to be shown in the tool menu */\n\t this.stored_workflow_menu_entries = options.stored_workflow_menu_entries || [];\n\t\n\t // create tool search, tool panel, and tool panel view.\n\t var tool_search = new Tools.ToolSearch({\n\t spinner_url : options.spinner_url,\n\t search_url : options.search_url,\n\t hidden : false\n\t });\n\t var tools = new Tools.ToolCollection( options.toolbox );\n\t this.tool_panel = new Tools.ToolPanel({\n\t tool_search : tool_search,\n\t tools : tools,\n\t layout : options.toolbox_in_panel\n\t });\n\t this.tool_panel_view = new Tools.ToolPanelView({ model: this.tool_panel });\n\t\n\t // add upload modal\n\t this.uploadButton = new Upload({\n\t nginx_upload_path : options.nginx_upload_path,\n\t ftp_upload_site : options.ftp_upload_site,\n\t default_genome : options.default_genome,\n\t default_extension : options.default_extension,\n\t });\n\t },\n\t\n\t render : function(){\n\t var self = this;\n\t LeftPanel.prototype.render.call( self );\n\t self.$( '.panel-header-buttons' ).append( self.uploadButton.$el );\n\t\n\t // if there are tools, render panel and display everything\n\t if (self.tool_panel.get( 'layout' ).size() > 0) {\n\t self.tool_panel_view.render();\n\t //TODO: why the hide/show?\n\t self.$( '.toolMenu' ).show();\n\t }\n\t self.$( '.toolMenuContainer' ).prepend( self.tool_panel_view.$el );\n\t\n\t self._renderWorkflowMenu();\n\t\n\t // if a tool link has the minsizehint attribute, handle it here (gen. by hiding the tool panel)\n\t self.$( 'a[minsizehint]' ).click( function() {\n\t if ( parent.handle_minwidth_hint ) {\n\t parent.handle_minwidth_hint( $( self ).attr( 'minsizehint' ) );\n\t }\n\t });\n\t },\n\t\n\t /** build the dom for the workflow portion of the tool menu */\n\t _renderWorkflowMenu : function(){\n\t var self = this;\n\t // add internal workflow list\n\t self.$( '#internal-workflows' ).append( self._templateTool({\n\t title : _l( 'All workflows' ),\n\t href : 'workflow/list_for_run'\n\t }));\n\t _.each( self.stored_workflow_menu_entries, function( menu_entry ){\n\t self.$( '#internal-workflows' ).append( self._templateTool({\n\t title : menu_entry.stored_workflow.name,\n\t href : 'workflow/run?id=' + menu_entry.encoded_stored_workflow_id\n\t }));\n\t });\n\t },\n\t\n\t /** build a link to one tool */\n\t _templateTool: function( tool ) {\n\t return [\n\t '
                    ',\n\t // global\n\t '', tool.title, '',\n\t '
                    '\n\t ].join('');\n\t },\n\t\n\t /** override to include inital menu dom and workflow section */\n\t _templateBody : function(){\n\t return [\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '', _l( 'Search did not match any tools.' ), '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '', _l( 'Workflows' ), '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ].join('');\n\t },\n\t\n\t toString : function(){ return 'ToolPanel'; }\n\t});\n\t\n\tmodule.exports = ToolPanel;\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 114 */,\n/* 115 */,\n/* 116 */,\n/* 117 */,\n/* 118 */,\n/* 119 */,\n/* 120 */,\n/* 121 */,\n/* 122 */,\n/* 123 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(34),\n\t __webpack_require__(94),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DC_LI, DATASET_LI_EDIT, BASE_MVC, _l ){\n\t/* global Backbone */\n\t//==============================================================================\n\tvar DCListItemView = DC_LI.DCListItemView;\n\t/** @class Edit view for DatasetCollection.\n\t */\n\tvar DCListItemEdit = DCListItemView.extend(\n\t/** @lends DCListItemEdit.prototype */{\n\t//TODO: may not be needed\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** override to add linkTarget */\n\t initialize : function( attributes ){\n\t DCListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DCListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\tvar DCEListItemView = DC_LI.DCEListItemView;\n\t/** @class Read only view for DatasetCollectionElement.\n\t */\n\tvar DCEListItemEdit = DCEListItemView.extend(\n\t/** @lends DCEListItemEdit.prototype */{\n\t//TODO: this might be expendable - compacted with HDAListItemView\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** set up */\n\t initialize : function( attributes ){\n\t DCEListItemView.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DCEListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t// NOTE: this does not inherit from DatasetDCEListItemView as you would expect\n\t//TODO: but should - if we can find something simpler than using diamond\n\t/** @class Editable view for a DatasetCollectionElement that is also an DatasetAssociation\n\t * (a dataset contained in a dataset collection).\n\t */\n\tvar DatasetDCEListItemEdit = DATASET_LI_EDIT.DatasetListItemEdit.extend(\n\t/** @lends DatasetDCEListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** set up */\n\t initialize : function( attributes ){\n\t DATASET_LI_EDIT.DatasetListItemEdit.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t // NOTE: this does not inherit from DatasetDCEListItemView - so we duplicate this here\n\t //TODO: fix\n\t /** In this override, only get details if in the ready state.\n\t * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n\t */\n\t _fetchModelDetails : function(){\n\t var view = this;\n\t if( view.model.inReadyState() && !view.model.hasDetails() ){\n\t return view.model.fetch({ silent: true });\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t /** Override to remove delete button */\n\t _renderDeleteButton : function(){\n\t return null;\n\t },\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'DatasetDCEListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tDatasetDCEListItemEdit.prototype.templates = (function(){\n\t\n\t return _.extend( {}, DATASET_LI_EDIT.DatasetListItemEdit.prototype.templates, {\n\t titleBar : DC_LI.DatasetDCEListItemView.prototype.templates.titleBar\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t/** @class Read only view for a DatasetCollectionElement that is also a DatasetCollection\n\t * (a nested DC).\n\t */\n\tvar NestedDCDCEListItemEdit = DC_LI.NestedDCDCEListItemView.extend(\n\t/** @lends NestedDCDCEListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t // comment this out to suppress log output\n\t //logger : console,\n\t\n\t // ......................................................................... misc\n\t /** String representation */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'NestedDCDCEListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t DCListItemEdit : DCListItemEdit,\n\t DCEListItemEdit : DCEListItemEdit,\n\t DatasetDCEListItemEdit : DatasetDCEListItemEdit,\n\t NestedDCDCEListItemEdit : NestedDCDCEListItemEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 124 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(93),\n\t __webpack_require__(35),\n\t __webpack_require__(123),\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(19),\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DC_VIEW, DC_MODEL, DC_EDIT, BASE_MVC, _l ){\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\t/** @class editable View/Controller for a dataset collection.\n\t */\n\tvar _super = DC_VIEW.CollectionView;\n\tvar CollectionViewEdit = _super.extend(\n\t/** @lends CollectionView.prototype */{\n\t //MODEL is either a DatasetCollection (or subclass) or a DatasetCollectionElement (list of pairs)\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** sub view class used for datasets */\n\t DatasetDCEViewClass : DC_EDIT.DatasetDCEListItemEdit,\n\t /** sub view class used for nested collections */\n\t NestedDCDCEViewClass: DC_EDIT.NestedDCDCEListItemEdit,\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events\n\t * @param {Object} attributes optional settings for the panel\n\t */\n\t initialize : function( attributes ){\n\t _super.prototype.initialize.call( this, attributes );\n\t },\n\t\n\t /** In this override, make the collection name editable\n\t */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t _super.prototype._setUpBehaviors.call( this, $where );\n\t if( !this.model ){ return; }\n\t\n\t // anon users shouldn't have access to any of the following\n\t if( !Galaxy.user || Galaxy.user.isAnonymous() ){\n\t return;\n\t }\n\t\n\t //TODO: extract\n\t var panel = this,\n\t nameSelector = '> .controls .name';\n\t $where.find( nameSelector )\n\t .attr( 'title', _l( 'Click to rename collection' ) )\n\t .tooltip({ placement: 'bottom' })\n\t .make_text_editable({\n\t on_finish: function( newName ){\n\t var previousName = panel.model.get( 'name' );\n\t if( newName && newName !== previousName ){\n\t panel.$el.find( nameSelector ).text( newName );\n\t panel.model.save({ name: newName })\n\t .fail( function(){\n\t panel.$el.find( nameSelector ).text( panel.model.previous( 'name' ) );\n\t });\n\t } else {\n\t panel.$el.find( nameSelector ).text( previousName );\n\t }\n\t }\n\t });\n\t },\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'CollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar ListCollectionViewEdit = CollectionViewEdit.extend(\n\t/** @lends ListCollectionView.prototype */{\n\t\n\t //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n\t /** sub view class used for datasets */\n\t DatasetDCEViewClass : DC_EDIT.DatasetDCEListItemEdit,\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'ListCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class Editable, read-only View/Controller for a dataset collection. */\n\tvar PairCollectionViewEdit = ListCollectionViewEdit.extend(\n\t/** @lends PairCollectionViewEdit.prototype */{\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'PairCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class Editable (roughly since these collections are immutable),\n\t * View/Controller for a dataset collection.\n\t */\n\tvar NestedPairCollectionViewEdit = PairCollectionViewEdit.extend(\n\t/** @lends NestedPairCollectionViewEdit.prototype */{\n\t\n\t /** Override to remove the editable text from the name/identifier - these collections are considered immutable */\n\t _setUpBehaviors : function( $where ){\n\t _super.prototype._setUpBehaviors.call( this, $where );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'NestedPairCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t// =============================================================================\n\t/** @class non-editable, read-only View/Controller for a dataset collection. */\n\tvar ListOfPairsCollectionViewEdit = CollectionViewEdit.extend(\n\t/** @lends ListOfPairsCollectionView.prototype */{\n\t\n\t //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n\t /** sub view class used for nested collections */\n\t NestedDCDCEViewClass : DC_EDIT.NestedDCDCEListItemEdit.extend({\n\t foldoutPanelClass : NestedPairCollectionViewEdit\n\t }),\n\t\n\t // ........................................................................ misc\n\t /** string rep */\n\t toString : function(){\n\t return 'ListOfPairsCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//==============================================================================\n\t return {\n\t CollectionViewEdit : CollectionViewEdit,\n\t ListCollectionViewEdit : ListCollectionViewEdit,\n\t PairCollectionViewEdit : PairCollectionViewEdit,\n\t ListOfPairsCollectionViewEdit : ListOfPairsCollectionViewEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 125 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, jQuery, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(146),\n\t __webpack_require__(110),\n\t __webpack_require__(36),\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(107)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( levenshteinDistance, naturalSort, LIST_COLLECTION_CREATOR, baseMVC, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t/* ============================================================================\n\tTODO:\n\t\n\t\n\tPROGRAMMATICALLY:\n\tcurrPanel.once( 'rendered', function(){\n\t currPanel.showSelectors();\n\t currPanel.selectAll();\n\t _.last( currPanel.actionsPopup.options ).func();\n\t});\n\t\n\t============================================================================ */\n\t/** A view for paired datasets in the collections creator.\n\t */\n\tvar PairView = Backbone.View.extend( baseMVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t tagName : 'li',\n\t className : 'dataset paired',\n\t\n\t initialize : function( attributes ){\n\t this.pair = attributes.pair || {};\n\t },\n\t\n\t template : _.template([\n\t '<%- pair.forward.name %>',\n\t '',\n\t '<%- pair.name %>',\n\t '',\n\t '<%- pair.reverse.name %>'\n\t ].join('')),\n\t\n\t render : function(){\n\t this.$el\n\t .attr( 'draggable', true )\n\t .data( 'pair', this.pair )\n\t .html( this.template({ pair: this.pair }) )\n\t .addClass( 'flex-column-container' );\n\t return this;\n\t },\n\t\n\t events : {\n\t 'dragstart' : '_dragstart',\n\t 'dragend' : '_dragend',\n\t 'dragover' : '_sendToParent',\n\t 'drop' : '_sendToParent'\n\t },\n\t\n\t /** dragging pairs for re-ordering */\n\t _dragstart : function( ev ){\n\t ev.currentTarget.style.opacity = '0.4';\n\t if( ev.originalEvent ){ ev = ev.originalEvent; }\n\t\n\t ev.dataTransfer.effectAllowed = 'move';\n\t ev.dataTransfer.setData( 'text/plain', JSON.stringify( this.pair ) );\n\t\n\t this.$el.parent().trigger( 'pair.dragstart', [ this ] );\n\t },\n\t\n\t /** dragging pairs for re-ordering */\n\t _dragend : function( ev ){\n\t ev.currentTarget.style.opacity = '1.0';\n\t this.$el.parent().trigger( 'pair.dragend', [ this ] );\n\t },\n\t\n\t /** manually bubble up an event to the parent/container */\n\t _sendToParent : function( ev ){\n\t this.$el.parent().trigger( ev );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){\n\t return 'PairView(' + this.pair.name + ')';\n\t }\n\t});\n\t\n\t\n\t// ============================================================================\n\t/** returns an autopair function that uses the provided options.match function */\n\tfunction autoPairFnBuilder( options ){\n\t options = options || {};\n\t options.createPair = options.createPair || function _defaultCreatePair( params ){\n\t params = params || {};\n\t var a = params.listA.splice( params.indexA, 1 )[0],\n\t b = params.listB.splice( params.indexB, 1 )[0],\n\t aInBIndex = params.listB.indexOf( a ),\n\t bInAIndex = params.listA.indexOf( b );\n\t if( aInBIndex !== -1 ){ params.listB.splice( aInBIndex, 1 ); }\n\t if( bInAIndex !== -1 ){ params.listA.splice( bInAIndex, 1 ); }\n\t return this._pair( a, b, { silent: true });\n\t };\n\t // compile these here outside of the loop\n\t var _regexps = [];\n\t function getRegExps(){\n\t if( !_regexps.length ){\n\t _regexps = [\n\t new RegExp( this.filters[0] ),\n\t new RegExp( this.filters[1] )\n\t ];\n\t }\n\t return _regexps;\n\t }\n\t // mangle params as needed\n\t options.preprocessMatch = options.preprocessMatch || function _defaultPreprocessMatch( params ){\n\t var regexps = getRegExps.call( this );\n\t return _.extend( params, {\n\t matchTo : params.matchTo.name.replace( regexps[0], '' ),\n\t possible : params.possible.name.replace( regexps[1], '' )\n\t });\n\t };\n\t\n\t return function _strategy( params ){\n\t this.debug( 'autopair _strategy ---------------------------' );\n\t params = params || {};\n\t var listA = params.listA,\n\t listB = params.listB,\n\t indexA = 0, indexB,\n\t bestMatch = {\n\t score : 0.0,\n\t index : null\n\t },\n\t paired = [];\n\t //console.debug( 'params:', JSON.stringify( params, null, ' ' ) );\n\t this.debug( 'starting list lens:', listA.length, listB.length );\n\t this.debug( 'bestMatch (starting):', JSON.stringify( bestMatch, null, ' ' ) );\n\t\n\t while( indexA < listA.length ){\n\t var matchTo = listA[ indexA ];\n\t bestMatch.score = 0.0;\n\t\n\t for( indexB=0; indexB= scoreThreshold ){\n\t //console.debug( 'autoPairFnBuilder.strategy', listA[ indexA ].name, listB[ bestMatch.index ].name );\n\t paired.push( options.createPair.call( this, {\n\t listA : listA,\n\t indexA : indexA,\n\t listB : listB,\n\t indexB : bestMatch.index\n\t }));\n\t //console.debug( 'list lens now:', listA.length, listB.length );\n\t } else {\n\t indexA += 1;\n\t }\n\t if( !listA.length || !listB.length ){\n\t return paired;\n\t }\n\t }\n\t this.debug( 'paired:', JSON.stringify( paired, null, ' ' ) );\n\t this.debug( 'autopair _strategy ---------------------------' );\n\t return paired;\n\t };\n\t}\n\t\n\t\n\t// ============================================================================\n\t/** An interface for building collections of paired datasets.\n\t */\n\tvar PairedCollectionCreator = Backbone.View.extend( baseMVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t className: 'list-of-pairs-collection-creator collection-creator flex-row-container',\n\t\n\t /** set up initial options, instance vars, behaviors, and autopair (if set to do so) */\n\t initialize : function( attributes ){\n\t this.metric( 'PairedCollectionCreator.initialize', attributes );\n\t //this.debug( '-- PairedCollectionCreator:', attributes );\n\t\n\t attributes = _.defaults( attributes, {\n\t datasets : [],\n\t filters : this.DEFAULT_FILTERS,\n\t automaticallyPair : true,\n\t strategy : 'lcs',\n\t matchPercentage : 0.9,\n\t twoPassAutopairing : true\n\t });\n\t\n\t /** unordered, original list */\n\t this.initialList = attributes.datasets;\n\t\n\t /** is this from a history? if so, what's its id? */\n\t this.historyId = attributes.historyId;\n\t\n\t /** which filters should be used initially? (String[2] or name in commonFilters) */\n\t this.filters = this.commonFilters[ attributes.filters ] || this.commonFilters[ this.DEFAULT_FILTERS ];\n\t if( _.isArray( attributes.filters ) ){\n\t this.filters = attributes.filters;\n\t }\n\t\n\t /** try to auto pair the unpaired datasets on load? */\n\t this.automaticallyPair = attributes.automaticallyPair;\n\t\n\t /** what method to use for auto pairing (will be passed aggression level) */\n\t this.strategy = this.strategies[ attributes.strategy ] || this.strategies[ this.DEFAULT_STRATEGY ];\n\t if( _.isFunction( attributes.strategy ) ){\n\t this.strategy = attributes.strategy;\n\t }\n\t\n\t /** distance/mismatch level allowed for autopairing */\n\t this.matchPercentage = attributes.matchPercentage;\n\t\n\t /** try to autopair using simple first, then this.strategy on the remainder */\n\t this.twoPassAutopairing = attributes.twoPassAutopairing;\n\t\n\t /** remove file extensions (\\.*) from created pair names? */\n\t this.removeExtensions = true;\n\t //this.removeExtensions = false;\n\t\n\t /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n\t this.oncancel = attributes.oncancel;\n\t /** fn to call when the collection is created (scoped to this) */\n\t this.oncreate = attributes.oncreate;\n\t\n\t /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n\t this.autoscrollDist = attributes.autoscrollDist || 24;\n\t\n\t /** is the unpaired panel shown? */\n\t this.unpairedPanelHidden = false;\n\t /** is the paired panel shown? */\n\t this.pairedPanelHidden = false;\n\t\n\t /** DOM elements currently being dragged */\n\t this.$dragging = null;\n\t\n\t /** Used for blocking UI events during ajax/operations (don't post twice) */\n\t this.blocking = false;\n\t\n\t this._setUpBehaviors();\n\t this._dataSetUp();\n\t },\n\t\n\t /** map of common filter pairs by name */\n\t commonFilters : {\n\t illumina : [ '_1', '_2' ],\n\t Rs : [ '_R1', '_R2' ]\n\t },\n\t /** which commonFilter to use by default */\n\t DEFAULT_FILTERS : 'illumina',\n\t\n\t /** map of name->fn for autopairing */\n\t strategies : {\n\t 'simple' : 'autopairSimple',\n\t 'lcs' : 'autopairLCS',\n\t 'levenshtein' : 'autopairLevenshtein'\n\t },\n\t /** default autopair strategy name */\n\t DEFAULT_STRATEGY : 'lcs',\n\t\n\t // ------------------------------------------------------------------------ process raw list\n\t /** set up main data: cache initialList, sort, and autopair */\n\t _dataSetUp : function(){\n\t //this.debug( '-- _dataSetUp' );\n\t\n\t this.paired = [];\n\t this.unpaired = [];\n\t\n\t this.selectedIds = [];\n\t\n\t // sort initial list, add ids if needed, and save new working copy to unpaired\n\t this._sortInitialList();\n\t this._ensureIds();\n\t this.unpaired = this.initialList.slice( 0 );\n\t\n\t if( this.automaticallyPair ){\n\t this.autoPair();\n\t this.once( 'rendered:initial', function(){\n\t this.trigger( 'autopair' );\n\t });\n\t }\n\t },\n\t\n\t /** sort initial list */\n\t _sortInitialList : function(){\n\t //this.debug( '-- _sortInitialList' );\n\t this._sortDatasetList( this.initialList );\n\t },\n\t\n\t /** sort a list of datasets */\n\t _sortDatasetList : function( list ){\n\t // currently only natural sort by name\n\t list.sort( function( a, b ){ return naturalSort( a.name, b.name ); });\n\t return list;\n\t },\n\t\n\t /** add ids to dataset objs in initial list if none */\n\t _ensureIds : function(){\n\t this.initialList.forEach( function( dataset ){\n\t if( !dataset.hasOwnProperty( 'id' ) ){\n\t dataset.id = _.uniqueId();\n\t }\n\t });\n\t return this.initialList;\n\t },\n\t\n\t /** split initial list into two lists, those that pass forward filters & those passing reverse */\n\t _splitByFilters : function(){\n\t var regexFilters = this.filters.map( function( stringFilter ){\n\t return new RegExp( stringFilter );\n\t }),\n\t split = [ [], [] ];\n\t\n\t function _filter( unpaired, filter ){\n\t return filter.test( unpaired.name );\n\t //return dataset.name.indexOf( filter ) >= 0;\n\t }\n\t this.unpaired.forEach( function _filterEach( unpaired ){\n\t // 90% of the time this seems to work, but:\n\t //TODO: this treats *all* strings as regex which may confuse people - possibly check for // surrounding?\n\t // would need explanation in help as well\n\t regexFilters.forEach( function( filter, i ){\n\t if( _filter( unpaired, filter ) ){\n\t split[i].push( unpaired );\n\t }\n\t });\n\t });\n\t return split;\n\t },\n\t\n\t /** add a dataset to the unpaired list in it's proper order */\n\t _addToUnpaired : function( dataset ){\n\t // currently, unpaired is natural sorted by name, use binary search to find insertion point\n\t var binSearchSortedIndex = function( low, hi ){\n\t if( low === hi ){ return low; }\n\t\n\t var mid = Math.floor( ( hi - low ) / 2 ) + low,\n\t compared = naturalSort( dataset.name, this.unpaired[ mid ].name );\n\t\n\t if( compared < 0 ){\n\t return binSearchSortedIndex( low, mid );\n\t } else if( compared > 0 ){\n\t return binSearchSortedIndex( mid + 1, hi );\n\t }\n\t // walk the equal to find the last\n\t while( this.unpaired[ mid ] && this.unpaired[ mid ].name === dataset.name ){ mid++; }\n\t return mid;\n\t\n\t }.bind( this );\n\t\n\t this.unpaired.splice( binSearchSortedIndex( 0, this.unpaired.length ), 0, dataset );\n\t },\n\t\n\t // ------------------------------------------------------------------------ auto pairing\n\t /** two passes to automatically create pairs:\n\t * use both simpleAutoPair, then the fn mentioned in strategy\n\t */\n\t autoPair : function( strategy ){\n\t // split first using exact matching\n\t var split = this._splitByFilters(),\n\t paired = [];\n\t if( this.twoPassAutopairing ){\n\t paired = this.autopairSimple({\n\t listA : split[0],\n\t listB : split[1]\n\t });\n\t split = this._splitByFilters();\n\t }\n\t\n\t // uncomment to see printlns while running tests\n\t //this.debug = function(){ console.log.apply( console, arguments ); };\n\t\n\t // then try the remainder with something less strict\n\t strategy = strategy || this.strategy;\n\t split = this._splitByFilters();\n\t paired = paired.concat( this[ strategy ].call( this, {\n\t listA : split[0],\n\t listB : split[1]\n\t }));\n\t return paired;\n\t },\n\t\n\t /** autopair by exact match */\n\t autopairSimple : autoPairFnBuilder({\n\t scoreThreshold: function(){ return 1.0; },\n\t match : function _match( params ){\n\t params = params || {};\n\t if( params.matchTo === params.possible ){\n\t return {\n\t index: params.index,\n\t score: 1.0\n\t };\n\t }\n\t return params.bestMatch;\n\t }\n\t }),\n\t\n\t /** autopair by levenshtein edit distance scoring */\n\t autopairLevenshtein : autoPairFnBuilder({\n\t scoreThreshold: function(){ return this.matchPercentage; },\n\t match : function _matches( params ){\n\t params = params || {};\n\t var distance = levenshteinDistance( params.matchTo, params.possible ),\n\t score = 1.0 - ( distance / ( Math.max( params.matchTo.length, params.possible.length ) ) );\n\t if( score > params.bestMatch.score ){\n\t return {\n\t index: params.index,\n\t score: score\n\t };\n\t }\n\t return params.bestMatch;\n\t }\n\t }),\n\t\n\t /** autopair by longest common substrings scoring */\n\t autopairLCS : autoPairFnBuilder({\n\t scoreThreshold: function(){ return this.matchPercentage; },\n\t match : function _matches( params ){\n\t params = params || {};\n\t var match = this._naiveStartingAndEndingLCS( params.matchTo, params.possible ).length,\n\t score = match / ( Math.max( params.matchTo.length, params.possible.length ) );\n\t if( score > params.bestMatch.score ){\n\t return {\n\t index: params.index,\n\t score: score\n\t };\n\t }\n\t return params.bestMatch;\n\t }\n\t }),\n\t\n\t /** return the concat'd longest common prefix and suffix from two strings */\n\t _naiveStartingAndEndingLCS : function( s1, s2 ){\n\t var fwdLCS = '',\n\t revLCS = '',\n\t i = 0, j = 0;\n\t while( i < s1.length && i < s2.length ){\n\t if( s1[ i ] !== s2[ i ] ){\n\t break;\n\t }\n\t fwdLCS += s1[ i ];\n\t i += 1;\n\t }\n\t if( i === s1.length ){ return s1; }\n\t if( i === s2.length ){ return s2; }\n\t\n\t i = ( s1.length - 1 );\n\t j = ( s2.length - 1 );\n\t while( i >= 0 && j >= 0 ){\n\t if( s1[ i ] !== s2[ j ] ){\n\t break;\n\t }\n\t revLCS = [ s1[ i ], revLCS ].join( '' );\n\t i -= 1;\n\t j -= 1;\n\t }\n\t return fwdLCS + revLCS;\n\t },\n\t\n\t // ------------------------------------------------------------------------ pairing / unpairing\n\t /** create a pair from fwd and rev, removing them from unpaired, and placing the new pair in paired */\n\t _pair : function( fwd, rev, options ){\n\t options = options || {};\n\t this.debug( '_pair:', fwd, rev );\n\t var pair = this._createPair( fwd, rev, options.name );\n\t this.paired.push( pair );\n\t this.unpaired = _.without( this.unpaired, fwd, rev );\n\t if( !options.silent ){\n\t this.trigger( 'pair:new', pair );\n\t }\n\t return pair;\n\t },\n\t\n\t /** create a pair Object from fwd and rev, adding the name attribute (will guess if not given) */\n\t _createPair : function( fwd, rev, name ){\n\t // ensure existance and don't pair something with itself\n\t if( !( fwd && rev ) || ( fwd === rev ) ){\n\t throw new Error( 'Bad pairing: ' + [ JSON.stringify( fwd ), JSON.stringify( rev ) ] );\n\t }\n\t name = name || this._guessNameForPair( fwd, rev );\n\t return { forward : fwd, name : name, reverse : rev };\n\t },\n\t\n\t /** try to find a good pair name for the given fwd and rev datasets */\n\t _guessNameForPair : function( fwd, rev, removeExtensions ){\n\t removeExtensions = ( removeExtensions !== undefined )?( removeExtensions ):( this.removeExtensions );\n\t var fwdName = fwd.name,\n\t revName = rev.name,\n\t lcs = this._naiveStartingAndEndingLCS(\n\t fwdName.replace( new RegExp( this.filters[0] ), '' ),\n\t revName.replace( new RegExp( this.filters[1] ), '' )\n\t );\n\t if( removeExtensions ){\n\t var lastDotIndex = lcs.lastIndexOf( '.' );\n\t if( lastDotIndex > 0 ){\n\t var extension = lcs.slice( lastDotIndex, lcs.length );\n\t lcs = lcs.replace( extension, '' );\n\t fwdName = fwdName.replace( extension, '' );\n\t revName = revName.replace( extension, '' );\n\t }\n\t }\n\t return lcs || ( fwdName + ' & ' + revName );\n\t },\n\t\n\t /** unpair a pair, removing it from paired, and adding the fwd,rev datasets back into unpaired */\n\t _unpair : function( pair, options ){\n\t options = options || {};\n\t if( !pair ){\n\t throw new Error( 'Bad pair: ' + JSON.stringify( pair ) );\n\t }\n\t this.paired = _.without( this.paired, pair );\n\t this._addToUnpaired( pair.forward );\n\t this._addToUnpaired( pair.reverse );\n\t\n\t if( !options.silent ){\n\t this.trigger( 'pair:unpair', [ pair ] );\n\t }\n\t return pair;\n\t },\n\t\n\t /** unpair all paired datasets */\n\t unpairAll : function(){\n\t var pairs = [];\n\t while( this.paired.length ){\n\t pairs.push( this._unpair( this.paired[ 0 ], { silent: true }) );\n\t }\n\t this.trigger( 'pair:unpair', pairs );\n\t },\n\t\n\t // ------------------------------------------------------------------------ API\n\t /** convert a pair into JSON compatible with the collections API */\n\t _pairToJSON : function( pair, src ){\n\t src = src || 'hda';\n\t //TODO: consider making this the pair structure when created instead\n\t return {\n\t collection_type : 'paired',\n\t src : 'new_collection',\n\t name : pair.name,\n\t element_identifiers : [{\n\t name : 'forward',\n\t id : pair.forward.id,\n\t src : src\n\t }, {\n\t name : 'reverse',\n\t id : pair.reverse.id,\n\t src : src\n\t }]\n\t };\n\t },\n\t\n\t /** create the collection via the API\n\t * @returns {jQuery.xhr Object} the jquery ajax request\n\t */\n\t createList : function( name ){\n\t var creator = this,\n\t url = Galaxy.root + 'api/histories/' + this.historyId + '/contents/dataset_collections';\n\t\n\t //TODO: use ListPairedCollection.create()\n\t var ajaxData = {\n\t type : 'dataset_collection',\n\t collection_type : 'list:paired',\n\t name : _.escape( name || creator.$( '.collection-name' ).val() ),\n\t element_identifiers : creator.paired.map( function( pair ){\n\t return creator._pairToJSON( pair );\n\t })\n\t\n\t };\n\t //this.debug( JSON.stringify( ajaxData ) );\n\t creator.blocking = true;\n\t return jQuery.ajax( url, {\n\t type : 'POST',\n\t contentType : 'application/json',\n\t dataType : 'json',\n\t data : JSON.stringify( ajaxData )\n\t })\n\t .always( function(){\n\t creator.blocking = false;\n\t })\n\t .fail( function( xhr, status, message ){\n\t creator._ajaxErrHandler( xhr, status, message );\n\t })\n\t .done( function( response, message, xhr ){\n\t //this.info( 'ok', response, message, xhr );\n\t creator.trigger( 'collection:created', response, message, xhr );\n\t creator.metric( 'collection:created', response );\n\t if( typeof creator.oncreate === 'function' ){\n\t creator.oncreate.call( this, response, message, xhr );\n\t }\n\t });\n\t },\n\t\n\t /** handle ajax errors with feedback and details to the user (if available) */\n\t _ajaxErrHandler : function( xhr, status, message ){\n\t this.error( xhr, status, message );\n\t var content = _l( 'An error occurred while creating this collection' );\n\t if( xhr ){\n\t if( xhr.readyState === 0 && xhr.status === 0 ){\n\t content += ': ' + _l( 'Galaxy could not be reached and may be updating.' )\n\t + _l( ' Try again in a few minutes.' );\n\t } else if( xhr.responseJSON ){\n\t content += '
                    ' + JSON.stringify( xhr.responseJSON ) + '
                    ';\n\t } else {\n\t content += ': ' + message;\n\t }\n\t }\n\t creator._showAlert( content, 'alert-danger' );\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering\n\t /** render the entire interface */\n\t render : function( speed, callback ){\n\t //this.debug( '-- _render' );\n\t //this.$el.empty().html( PairedCollectionCreator.templates.main() );\n\t this.$el.empty().html( PairedCollectionCreator.templates.main() );\n\t this._renderHeader( speed );\n\t this._renderMiddle( speed );\n\t this._renderFooter( speed );\n\t this._addPluginComponents();\n\t this.trigger( 'rendered', this );\n\t return this;\n\t },\n\t\n\t /** render the header section */\n\t _renderHeader : function( speed, callback ){\n\t //this.debug( '-- _renderHeader' );\n\t var $header = this.$( '.header' ).empty().html( PairedCollectionCreator.templates.header() )\n\t .find( '.help-content' ).prepend( $( PairedCollectionCreator.templates.helpContent() ) );\n\t\n\t this._renderFilters();\n\t return $header;\n\t },\n\t /** fill the filter inputs with the filter values */\n\t _renderFilters : function(){\n\t return this.$( '.forward-column .column-header input' ).val( this.filters[0] )\n\t .add( this.$( '.reverse-column .column-header input' ).val( this.filters[1] ) );\n\t },\n\t\n\t /** render the middle including unpaired and paired sections (which may be hidden) */\n\t _renderMiddle : function( speed, callback ){\n\t var $middle = this.$( '.middle' ).empty().html( PairedCollectionCreator.templates.middle() );\n\t\n\t // (re-) hide the un/paired panels based on instance vars\n\t if( this.unpairedPanelHidden ){\n\t this.$( '.unpaired-columns' ).hide();\n\t } else if( this.pairedPanelHidden ){\n\t this.$( '.paired-columns' ).hide();\n\t }\n\t\n\t this._renderUnpaired();\n\t this._renderPaired();\n\t return $middle;\n\t },\n\t /** render the unpaired section, showing datasets accrd. to filters, update the unpaired counts */\n\t _renderUnpaired : function( speed, callback ){\n\t //this.debug( '-- _renderUnpaired' );\n\t var creator = this,\n\t $fwd, $rev, $prd = [],\n\t split = this._splitByFilters();\n\t // update unpaired counts\n\t this.$( '.forward-column .title' )\n\t .text([ split[0].length, _l( 'unpaired forward' ) ].join( ' ' ));\n\t this.$( '.forward-column .unpaired-info' )\n\t .text( this._renderUnpairedDisplayStr( this.unpaired.length - split[0].length ) );\n\t this.$( '.reverse-column .title' )\n\t .text([ split[1].length, _l( 'unpaired reverse' ) ].join( ' ' ));\n\t this.$( '.reverse-column .unpaired-info' )\n\t .text( this._renderUnpairedDisplayStr( this.unpaired.length - split[1].length ) );\n\t\n\t this.$( '.unpaired-columns .column-datasets' ).empty();\n\t\n\t // show/hide the auto pair button if any unpaired are left\n\t this.$( '.autopair-link' ).toggle( this.unpaired.length !== 0 );\n\t if( this.unpaired.length === 0 ){\n\t this._renderUnpairedEmpty();\n\t return;\n\t }\n\t\n\t // create the dataset dom arrays\n\t $rev = split[1].map( function( dataset, i ){\n\t // if there'll be a fwd dataset across the way, add a button to pair the row\n\t if( ( split[0][ i ] !== undefined )\n\t && ( split[0][ i ] !== dataset ) ){\n\t $prd.push( creator._renderPairButton() );\n\t }\n\t return creator._renderUnpairedDataset( dataset );\n\t });\n\t $fwd = split[0].map( function( dataset ){\n\t return creator._renderUnpairedDataset( dataset );\n\t });\n\t\n\t if( !$fwd.length && !$rev.length ){\n\t this._renderUnpairedNotShown();\n\t return;\n\t }\n\t // add to appropo cols\n\t //TODO: not the best way to render - consider rendering the entire unpaired-columns section in a fragment\n\t // and swapping out that\n\t this.$( '.unpaired-columns .forward-column .column-datasets' ).append( $fwd )\n\t .add( this.$( '.unpaired-columns .paired-column .column-datasets' ).append( $prd ) )\n\t .add( this.$( '.unpaired-columns .reverse-column .column-datasets' ).append( $rev ) );\n\t this._adjUnpairedOnScrollbar();\n\t },\n\t /** return a string to display the count of filtered out datasets */\n\t _renderUnpairedDisplayStr : function( numFiltered ){\n\t return [ '(', numFiltered, ' ', _l( 'filtered out' ), ')' ].join('');\n\t },\n\t /** return an unattached jQuery DOM element to represent an unpaired dataset */\n\t _renderUnpairedDataset : function( dataset ){\n\t //TODO: to underscore template\n\t return $( '
                  18. ')\n\t .attr( 'id', 'dataset-' + dataset.id )\n\t .addClass( 'dataset unpaired' )\n\t .attr( 'draggable', true )\n\t .addClass( dataset.selected? 'selected': '' )\n\t .append( $( '' ).addClass( 'dataset-name' ).text( dataset.name ) )\n\t //??\n\t .data( 'dataset', dataset );\n\t },\n\t /** render the button that may go between unpaired datasets, allowing the user to pair a row */\n\t _renderPairButton : function(){\n\t //TODO: *not* a dataset - don't pretend like it is\n\t return $( '
                  19. ').addClass( 'dataset unpaired' )\n\t .append( $( '' ).addClass( 'dataset-name' ).text( _l( 'Pair these datasets' ) ) );\n\t },\n\t /** a message to display when no unpaired left */\n\t _renderUnpairedEmpty : function(){\n\t //this.debug( '-- renderUnpairedEmpty' );\n\t var $msg = $( '
                    ' )\n\t .text( '(' + _l( 'no remaining unpaired datasets' ) + ')' );\n\t this.$( '.unpaired-columns .paired-column .column-datasets' ).empty().prepend( $msg );\n\t return $msg;\n\t },\n\t /** a message to display when no unpaired can be shown with the current filters */\n\t _renderUnpairedNotShown : function(){\n\t //this.debug( '-- renderUnpairedEmpty' );\n\t var $msg = $( '
                    ' )\n\t .text( '(' + _l( 'no datasets were found matching the current filters' ) + ')' );\n\t this.$( '.unpaired-columns .paired-column .column-datasets' ).empty().prepend( $msg );\n\t return $msg;\n\t },\n\t /** try to detect if the unpaired section has a scrollbar and adjust left column for better centering of all */\n\t _adjUnpairedOnScrollbar : function(){\n\t var $unpairedColumns = this.$( '.unpaired-columns' ).last(),\n\t $firstDataset = this.$( '.unpaired-columns .reverse-column .dataset' ).first();\n\t if( !$firstDataset.size() ){ return; }\n\t var ucRight = $unpairedColumns.offset().left + $unpairedColumns.outerWidth(),\n\t dsRight = $firstDataset.offset().left + $firstDataset.outerWidth(),\n\t rightDiff = Math.floor( ucRight ) - Math.floor( dsRight );\n\t //this.debug( 'rightDiff:', ucRight, '-', dsRight, '=', rightDiff );\n\t this.$( '.unpaired-columns .forward-column' )\n\t .css( 'margin-left', ( rightDiff > 0 )? rightDiff: 0 );\n\t },\n\t\n\t /** render the paired section and update counts of paired datasets */\n\t _renderPaired : function( speed, callback ){\n\t //this.debug( '-- _renderPaired' );\n\t this.$( '.paired-column-title .title' ).text([ this.paired.length, _l( 'paired' ) ].join( ' ' ) );\n\t // show/hide the unpair all link\n\t this.$( '.unpair-all-link' ).toggle( this.paired.length !== 0 );\n\t if( this.paired.length === 0 ){\n\t this._renderPairedEmpty();\n\t return;\n\t //TODO: would be best to return here (the $columns)\n\t } else {\n\t // show/hide 'remove extensions link' when any paired and they seem to have extensions\n\t this.$( '.remove-extensions-link' ).show();\n\t }\n\t\n\t this.$( '.paired-columns .column-datasets' ).empty();\n\t var creator = this;\n\t this.paired.forEach( function( pair, i ){\n\t //TODO: cache these?\n\t var pairView = new PairView({ pair: pair });\n\t creator.$( '.paired-columns .column-datasets' )\n\t .append( pairView.render().$el )\n\t .append([\n\t ''\n\t ].join( '' ));\n\t });\n\t },\n\t /** a message to display when none paired */\n\t _renderPairedEmpty : function(){\n\t var $msg = $( '
                    ' )\n\t .text( '(' + _l( 'no paired datasets yet' ) + ')' );\n\t this.$( '.paired-columns .column-datasets' ).empty().prepend( $msg );\n\t return $msg;\n\t },\n\t\n\t /** render the footer, completion controls, and cancel controls */\n\t _renderFooter : function( speed, callback ){\n\t var $footer = this.$( '.footer' ).empty().html( PairedCollectionCreator.templates.footer() );\n\t this.$( '.remove-extensions' ).prop( 'checked', this.removeExtensions );\n\t if( typeof this.oncancel === 'function' ){\n\t this.$( '.cancel-create.btn' ).show();\n\t }\n\t return $footer;\n\t },\n\t\n\t /** add any jQuery/bootstrap/custom plugins to elements rendered */\n\t _addPluginComponents : function(){\n\t this._chooseFiltersPopover( '.choose-filters-link' );\n\t this.$( '.help-content i' ).hoverhighlight( '.collection-creator', 'rgba( 64, 255, 255, 1.0 )' );\n\t },\n\t\n\t /** build a filter selection popover allowing selection of common filter pairs */\n\t _chooseFiltersPopover : function( selector ){\n\t function filterChoice( val1, val2 ){\n\t return [\n\t ''\n\t ].join('');\n\t }\n\t var $popoverContent = $( _.template([\n\t '
                    ',\n\t '
                    ',\n\t _l( 'Choose from the following filters to change which unpaired reads are shown in the display' ),\n\t ':
                    ',\n\t _.values( this.commonFilters ).map( function( filterSet ){\n\t return filterChoice( filterSet[0], filterSet[1] );\n\t }).join( '' ),\n\t '
                    '\n\t ].join(''))({}));\n\t\n\t return this.$( selector ).popover({\n\t container : '.collection-creator',\n\t placement : 'bottom',\n\t html : true,\n\t //animation : false,\n\t content : $popoverContent\n\t });\n\t },\n\t\n\t /** add (or clear if clear is truthy) a validation warning to what */\n\t _validationWarning : function( what, clear ){\n\t var VALIDATION_CLASS = 'validation-warning';\n\t if( what === 'name' ){\n\t what = this.$( '.collection-name' ).add( this.$( '.collection-name-prompt' ) );\n\t this.$( '.collection-name' ).focus().select();\n\t }\n\t if( clear ){\n\t what = what || this.$( '.' + VALIDATION_CLASS );\n\t what.removeClass( VALIDATION_CLASS );\n\t } else {\n\t what.addClass( VALIDATION_CLASS );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ events\n\t /** set up event handlers on self */\n\t _setUpBehaviors : function(){\n\t this.once( 'rendered', function(){\n\t this.trigger( 'rendered:initial', this );\n\t });\n\t\n\t this.on( 'pair:new', function(){\n\t //TODO: ideally only re-render the columns (or even elements) involved\n\t this._renderUnpaired();\n\t this._renderPaired();\n\t\n\t // scroll to bottom where new pairs are added\n\t //TODO: this doesn't seem to work - innerHeight sticks at 133...\n\t // may have to do with improper flex columns\n\t //var $pairedView = this.$( '.paired-columns' );\n\t //$pairedView.scrollTop( $pairedView.innerHeight() );\n\t //this.debug( $pairedView.height() )\n\t this.$( '.paired-columns' ).scrollTop( 8000000 );\n\t });\n\t this.on( 'pair:unpair', function( pairs ){\n\t //TODO: ideally only re-render the columns (or even elements) involved\n\t this._renderUnpaired();\n\t this._renderPaired();\n\t this.splitView();\n\t });\n\t\n\t this.on( 'filter-change', function(){\n\t this.filters = [\n\t this.$( '.forward-unpaired-filter input' ).val(),\n\t this.$( '.reverse-unpaired-filter input' ).val()\n\t ];\n\t this.metric( 'filter-change', this.filters );\n\t this._renderFilters();\n\t this._renderUnpaired();\n\t });\n\t\n\t this.on( 'autopair', function(){\n\t this._renderUnpaired();\n\t this._renderPaired();\n\t\n\t var message, msgClass = null;\n\t if( this.paired.length ){\n\t msgClass = 'alert-success';\n\t message = this.paired.length + ' ' + _l( 'pairs created' );\n\t if( !this.unpaired.length ){\n\t message += ': ' + _l( 'all datasets have been successfully paired' );\n\t this.hideUnpaired();\n\t this.$( '.collection-name' ).focus();\n\t }\n\t } else {\n\t message = _l([\n\t 'Could not automatically create any pairs from the given dataset names.',\n\t 'You may want to choose or enter different filters and try auto-pairing again.',\n\t 'Close this message using the X on the right to view more help.'\n\t ].join( ' ' ));\n\t }\n\t this._showAlert( message, msgClass );\n\t });\n\t\n\t //this.on( 'all', function(){\n\t // this.info( arguments );\n\t //});\n\t return this;\n\t },\n\t\n\t events : {\n\t // header\n\t 'click .more-help' : '_clickMoreHelp',\n\t 'click .less-help' : '_clickLessHelp',\n\t 'click .header .alert button' : '_hideAlert',\n\t 'click .forward-column .column-title' : '_clickShowOnlyUnpaired',\n\t 'click .reverse-column .column-title' : '_clickShowOnlyUnpaired',\n\t 'click .unpair-all-link' : '_clickUnpairAll',\n\t //TODO: this seems kinda backasswards - re-sending jq event as a backbone event, can we listen directly?\n\t 'change .forward-unpaired-filter input' : function( ev ){ this.trigger( 'filter-change' ); },\n\t 'focus .forward-unpaired-filter input' : function( ev ){ $( ev.currentTarget ).select(); },\n\t 'click .autopair-link' : '_clickAutopair',\n\t 'click .choose-filters .filter-choice' : '_clickFilterChoice',\n\t 'click .clear-filters-link' : '_clearFilters',\n\t 'change .reverse-unpaired-filter input' : function( ev ){ this.trigger( 'filter-change' ); },\n\t 'focus .reverse-unpaired-filter input' : function( ev ){ $( ev.currentTarget ).select(); },\n\t // unpaired\n\t 'click .forward-column .dataset.unpaired' : '_clickUnpairedDataset',\n\t 'click .reverse-column .dataset.unpaired' : '_clickUnpairedDataset',\n\t 'click .paired-column .dataset.unpaired' : '_clickPairRow',\n\t 'click .unpaired-columns' : 'clearSelectedUnpaired',\n\t 'mousedown .unpaired-columns .dataset' : '_mousedownUnpaired',\n\t // divider\n\t 'click .paired-column-title' : '_clickShowOnlyPaired',\n\t 'mousedown .flexible-partition-drag' : '_startPartitionDrag',\n\t // paired\n\t 'click .paired-columns .dataset.paired' : 'selectPair',\n\t 'click .paired-columns' : 'clearSelectedPaired',\n\t 'click .paired-columns .pair-name' : '_clickPairName',\n\t 'click .unpair-btn' : '_clickUnpair',\n\t // paired - drop target\n\t //'dragenter .paired-columns' : '_dragenterPairedColumns',\n\t //'dragleave .paired-columns .column-datasets': '_dragleavePairedColumns',\n\t 'dragover .paired-columns .column-datasets' : '_dragoverPairedColumns',\n\t 'drop .paired-columns .column-datasets' : '_dropPairedColumns',\n\t\n\t 'pair.dragstart .paired-columns .column-datasets' : '_pairDragstart',\n\t 'pair.dragend .paired-columns .column-datasets' : '_pairDragend',\n\t\n\t // footer\n\t 'change .remove-extensions' : function( ev ){ this.toggleExtensions(); },\n\t 'change .collection-name' : '_changeName',\n\t 'keydown .collection-name' : '_nameCheckForEnter',\n\t 'click .cancel-create' : function( ev ){\n\t if( typeof this.oncancel === 'function' ){\n\t this.oncancel.call( this );\n\t }\n\t },\n\t 'click .create-collection' : '_clickCreate'//,\n\t },\n\t\n\t // ........................................................................ header\n\t /** expand help */\n\t _clickMoreHelp : function( ev ){\n\t this.$( '.main-help' ).addClass( 'expanded' );\n\t this.$( '.more-help' ).hide();\n\t },\n\t /** collapse help */\n\t _clickLessHelp : function( ev ){\n\t this.$( '.main-help' ).removeClass( 'expanded' );\n\t this.$( '.more-help' ).show();\n\t },\n\t\n\t /** show an alert on the top of the interface containing message (alertClass is bootstrap's alert-*)*/\n\t _showAlert : function( message, alertClass ){\n\t alertClass = alertClass || 'alert-danger';\n\t this.$( '.main-help' ).hide();\n\t this.$( '.header .alert' ).attr( 'class', 'alert alert-dismissable' ).addClass( alertClass ).show()\n\t .find( '.alert-message' ).html( message );\n\t },\n\t /** hide the alerts at the top */\n\t _hideAlert : function( message ){\n\t this.$( '.main-help' ).show();\n\t this.$( '.header .alert' ).hide();\n\t },\n\t\n\t /** toggle between showing only unpaired and split view */\n\t _clickShowOnlyUnpaired : function( ev ){\n\t //this.debug( 'click unpaired', ev.currentTarget );\n\t if( this.$( '.paired-columns' ).is( ':visible' ) ){\n\t this.hidePaired();\n\t } else {\n\t this.splitView();\n\t }\n\t },\n\t /** toggle between showing only paired and split view */\n\t _clickShowOnlyPaired : function( ev ){\n\t //this.debug( 'click paired' );\n\t if( this.$( '.unpaired-columns' ).is( ':visible' ) ){\n\t this.hideUnpaired();\n\t } else {\n\t this.splitView();\n\t }\n\t },\n\t\n\t /** hide unpaired, show paired */\n\t hideUnpaired : function( speed, callback ){\n\t this.unpairedPanelHidden = true;\n\t this.pairedPanelHidden = false;\n\t this._renderMiddle( speed, callback );\n\t },\n\t /** hide paired, show unpaired */\n\t hidePaired : function( speed, callback ){\n\t this.unpairedPanelHidden = false;\n\t this.pairedPanelHidden = true;\n\t this._renderMiddle( speed, callback );\n\t },\n\t /** show both paired and unpaired (splitting evenly) */\n\t splitView : function( speed, callback ){\n\t this.unpairedPanelHidden = this.pairedPanelHidden = false;\n\t this._renderMiddle( speed, callback );\n\t return this;\n\t },\n\t\n\t /** unpair all paired and do other super neat stuff which I'm not really sure about yet... */\n\t _clickUnpairAll : function( ev ){\n\t this.metric( 'unpairAll' );\n\t this.unpairAll();\n\t },\n\t\n\t /** attempt to autopair */\n\t _clickAutopair : function( ev ){\n\t var paired = this.autoPair();\n\t this.metric( 'autopair', paired.length, this.unpaired.length );\n\t this.trigger( 'autopair' );\n\t },\n\t\n\t /** set the filters based on the data attributes of the button click target */\n\t _clickFilterChoice : function( ev ){\n\t var $selected = $( ev.currentTarget );\n\t this.$( '.forward-unpaired-filter input' ).val( $selected.data( 'forward' ) );\n\t this.$( '.reverse-unpaired-filter input' ).val( $selected.data( 'reverse' ) );\n\t this._hideChooseFilters();\n\t this.trigger( 'filter-change' );\n\t },\n\t\n\t /** hide the choose filters popover */\n\t _hideChooseFilters : function(){\n\t //TODO: update bootstrap and remove the following hack\n\t // see also: https://github.com/twbs/bootstrap/issues/10260\n\t this.$( '.choose-filters-link' ).popover( 'hide' );\n\t this.$( '.popover' ).css( 'display', 'none' );\n\t },\n\t\n\t /** clear both filters */\n\t _clearFilters : function( ev ){\n\t this.$( '.forward-unpaired-filter input' ).val( '' );\n\t this.$( '.reverse-unpaired-filter input' ).val( '' );\n\t this.trigger( 'filter-change' );\n\t },\n\t\n\t // ........................................................................ unpaired\n\t /** select an unpaired dataset */\n\t _clickUnpairedDataset : function( ev ){\n\t ev.stopPropagation();\n\t return this.toggleSelectUnpaired( $( ev.currentTarget ) );\n\t },\n\t\n\t /** Toggle the selection of an unpaired dataset representation.\n\t * @param [jQuery] $dataset the unpaired dataset dom rep to select\n\t * @param [Boolean] options.force if defined, force selection based on T/F; otherwise, toggle\n\t */\n\t toggleSelectUnpaired : function( $dataset, options ){\n\t options = options || {};\n\t var dataset = $dataset.data( 'dataset' ),\n\t select = options.force !== undefined? options.force: !$dataset.hasClass( 'selected' );\n\t //this.debug( id, options.force, $dataset, dataset );\n\t if( !$dataset.size() || dataset === undefined ){ return $dataset; }\n\t\n\t if( select ){\n\t $dataset.addClass( 'selected' );\n\t if( !options.waitToPair ){\n\t this.pairAllSelected();\n\t }\n\t\n\t } else {\n\t $dataset.removeClass( 'selected' );\n\t //delete dataset.selected;\n\t }\n\t return $dataset;\n\t },\n\t\n\t /** pair all the currently selected unpaired datasets */\n\t pairAllSelected : function( options ){\n\t options = options || {};\n\t var creator = this,\n\t fwds = [],\n\t revs = [],\n\t pairs = [];\n\t creator.$( '.unpaired-columns .forward-column .dataset.selected' ).each( function(){\n\t fwds.push( $( this ).data( 'dataset' ) );\n\t });\n\t creator.$( '.unpaired-columns .reverse-column .dataset.selected' ).each( function(){\n\t revs.push( $( this ).data( 'dataset' ) );\n\t });\n\t fwds.length = revs.length = Math.min( fwds.length, revs.length );\n\t //this.debug( fwds );\n\t //this.debug( revs );\n\t fwds.forEach( function( fwd, i ){\n\t try {\n\t pairs.push( creator._pair( fwd, revs[i], { silent: true }) );\n\t\n\t } catch( err ){\n\t //TODO: preserve selected state of those that couldn't be paired\n\t //TODO: warn that some could not be paired\n\t creator.error( err );\n\t }\n\t });\n\t if( pairs.length && !options.silent ){\n\t this.trigger( 'pair:new', pairs );\n\t }\n\t return pairs;\n\t },\n\t\n\t /** clear the selection on all unpaired datasets */\n\t clearSelectedUnpaired : function(){\n\t this.$( '.unpaired-columns .dataset.selected' ).removeClass( 'selected' );\n\t },\n\t\n\t /** when holding down the shift key on a click, 'paint' the moused over datasets as selected */\n\t _mousedownUnpaired : function( ev ){\n\t if( ev.shiftKey ){\n\t var creator = this,\n\t $startTarget = $( ev.target ).addClass( 'selected' ),\n\t moveListener = function( ev ){\n\t creator.$( ev.target ).filter( '.dataset' ).addClass( 'selected' );\n\t };\n\t $startTarget.parent().on( 'mousemove', moveListener );\n\t\n\t // on any mouseup, stop listening to the move and try to pair any selected\n\t $( document ).one( 'mouseup', function( ev ){\n\t $startTarget.parent().off( 'mousemove', moveListener );\n\t creator.pairAllSelected();\n\t });\n\t }\n\t },\n\t\n\t /** attempt to pair two datasets directly across from one another */\n\t _clickPairRow : function( ev ){\n\t //if( !ev.currentTarget ){ return true; }\n\t var rowIndex = $( ev.currentTarget ).index(),\n\t fwd = $( '.unpaired-columns .forward-column .dataset' ).eq( rowIndex ).data( 'dataset' ),\n\t rev = $( '.unpaired-columns .reverse-column .dataset' ).eq( rowIndex ).data( 'dataset' );\n\t //this.debug( 'row:', rowIndex, fwd, rev );\n\t this._pair( fwd, rev );\n\t },\n\t\n\t // ........................................................................ divider/partition\n\t /** start dragging the visible divider/partition between unpaired and paired panes */\n\t _startPartitionDrag : function( ev ){\n\t var creator = this,\n\t startingY = ev.pageY;\n\t //this.debug( 'partition drag START:', ev );\n\t $( 'body' ).css( 'cursor', 'ns-resize' );\n\t creator.$( '.flexible-partition-drag' ).css( 'color', 'black' );\n\t\n\t function endDrag( ev ){\n\t //creator.debug( 'partition drag STOP:', ev );\n\t // doing this by an added class didn't really work well - kept flashing still\n\t creator.$( '.flexible-partition-drag' ).css( 'color', '' );\n\t $( 'body' ).css( 'cursor', '' ).unbind( 'mousemove', trackMouse );\n\t }\n\t function trackMouse( ev ){\n\t var offset = ev.pageY - startingY;\n\t //creator.debug( 'partition:', startingY, offset );\n\t if( !creator.adjPartition( offset ) ){\n\t //creator.debug( 'mouseup triggered' );\n\t $( 'body' ).trigger( 'mouseup' );\n\t }\n\t creator._adjUnpairedOnScrollbar();\n\t startingY += offset;\n\t }\n\t $( 'body' ).mousemove( trackMouse );\n\t $( 'body' ).one( 'mouseup', endDrag );\n\t },\n\t\n\t /** adjust the parition up/down +/-adj pixels */\n\t adjPartition : function( adj ){\n\t var $unpaired = this.$( '.unpaired-columns' ),\n\t $paired = this.$( '.paired-columns' ),\n\t unpairedHi = parseInt( $unpaired.css( 'height' ), 10 ),\n\t pairedHi = parseInt( $paired.css( 'height' ), 10 );\n\t //this.debug( adj, 'hi\\'s:', unpairedHi, pairedHi, unpairedHi + adj, pairedHi - adj );\n\t\n\t unpairedHi = Math.max( 10, unpairedHi + adj );\n\t pairedHi = pairedHi - adj;\n\t\n\t var movingUpwards = adj < 0;\n\t // when the divider gets close to the top - lock into hiding the unpaired section\n\t if( movingUpwards ){\n\t if( this.unpairedPanelHidden ){\n\t return false;\n\t } else if( unpairedHi <= 10 ){\n\t this.hideUnpaired();\n\t return false;\n\t }\n\t } else {\n\t if( this.unpairedPanelHidden ){\n\t $unpaired.show();\n\t this.unpairedPanelHidden = false;\n\t }\n\t }\n\t\n\t // when the divider gets close to the bottom - lock into hiding the paired section\n\t if( !movingUpwards ){\n\t if( this.pairedPanelHidden ){\n\t return false;\n\t } else if( pairedHi <= 15 ){\n\t this.hidePaired();\n\t return false;\n\t }\n\t\n\t } else {\n\t if( this.pairedPanelHidden ){\n\t $paired.show();\n\t this.pairedPanelHidden = false;\n\t }\n\t }\n\t\n\t $unpaired.css({\n\t height : unpairedHi + 'px',\n\t flex : '0 0 auto'\n\t });\n\t return true;\n\t },\n\t\n\t // ........................................................................ paired\n\t /** select a pair when clicked */\n\t selectPair : function( ev ){\n\t ev.stopPropagation();\n\t $( ev.currentTarget ).toggleClass( 'selected' );\n\t },\n\t\n\t /** deselect all pairs */\n\t clearSelectedPaired : function( ev ){\n\t this.$( '.paired-columns .dataset.selected' ).removeClass( 'selected' );\n\t },\n\t\n\t /** rename a pair when the pair name is clicked */\n\t _clickPairName : function( ev ){\n\t ev.stopPropagation();\n\t var $name = $( ev.currentTarget ),\n\t $pair = $name.parent().parent(),\n\t index = $pair.index( '.dataset.paired' ),\n\t pair = this.paired[ index ],\n\t response = prompt( 'Enter a new name for the pair:', pair.name );\n\t if( response ){\n\t pair.name = response;\n\t // set a flag (which won't be passed in json creation) for manual naming so we don't overwrite these\n\t // when adding/removing extensions\n\t //hackish\n\t pair.customizedName = true;\n\t $name.text( pair.name );\n\t }\n\t },\n\t\n\t /** unpair this pair */\n\t _clickUnpair : function( ev ){\n\t //if( !ev.currentTarget ){ return true; }\n\t var pairIndex = Math.floor( $( ev.currentTarget ).index( '.unpair-btn' ) );\n\t //this.debug( 'pair:', pairIndex );\n\t this._unpair( this.paired[ pairIndex ] );\n\t },\n\t\n\t // ........................................................................ paired - drag and drop re-ordering\n\t //_dragenterPairedColumns : function( ev ){\n\t // this.debug( '_dragenterPairedColumns:', ev );\n\t //},\n\t //_dragleavePairedColumns : function( ev ){\n\t // //this.debug( '_dragleavePairedColumns:', ev );\n\t //},\n\t /** track the mouse drag over the paired list adding a placeholder to show where the drop would occur */\n\t _dragoverPairedColumns : function( ev ){\n\t //this.debug( '_dragoverPairedColumns:', ev );\n\t ev.preventDefault();\n\t\n\t var $list = this.$( '.paired-columns .column-datasets' );\n\t this._checkForAutoscroll( $list, ev.originalEvent.clientY );\n\t //this.debug( ev.originalEvent.clientX, ev.originalEvent.clientY );\n\t var $nearest = this._getNearestPairedDatasetLi( ev.originalEvent.clientY );\n\t\n\t $( '.element-drop-placeholder' ).remove();\n\t var $placeholder = $( '
                    ' );\n\t if( !$nearest.size() ){\n\t $list.append( $placeholder );\n\t } else {\n\t $nearest.before( $placeholder );\n\t }\n\t },\n\t\n\t /** If the mouse is near enough to the list's top or bottom, scroll the list */\n\t _checkForAutoscroll : function( $element, y ){\n\t var AUTOSCROLL_SPEED = 2;\n\t var offset = $element.offset(),\n\t scrollTop = $element.scrollTop(),\n\t upperDist = y - offset.top,\n\t lowerDist = ( offset.top + $element.outerHeight() ) - y;\n\t //this.debug( '_checkForAutoscroll:', scrollTop, upperDist, lowerDist );\n\t if( upperDist >= 0 && upperDist < this.autoscrollDist ){\n\t $element.scrollTop( scrollTop - AUTOSCROLL_SPEED );\n\t } else if( lowerDist >= 0 && lowerDist < this.autoscrollDist ){\n\t $element.scrollTop( scrollTop + AUTOSCROLL_SPEED );\n\t }\n\t },\n\t\n\t /** get the nearest *previous* paired dataset PairView based on the mouse's Y coordinate.\n\t * If the y is at the end of the list, return an empty jQuery object.\n\t */\n\t _getNearestPairedDatasetLi : function( y ){\n\t var WIGGLE = 4,\n\t lis = this.$( '.paired-columns .column-datasets li' ).toArray();\n\t for( var i=0; i y && top - halfHeight < y ){\n\t //this.debug( y, top + halfHeight, top - halfHeight )\n\t return $li;\n\t }\n\t }\n\t return $();\n\t },\n\t /** drop (dragged/selected PairViews) onto the list, re-ordering both the DOM and the internal array of pairs */\n\t _dropPairedColumns : function( ev ){\n\t // both required for firefox\n\t ev.preventDefault();\n\t ev.dataTransfer.dropEffect = 'move';\n\t\n\t var $nearest = this._getNearestPairedDatasetLi( ev.originalEvent.clientY );\n\t if( $nearest.size() ){\n\t this.$dragging.insertBefore( $nearest );\n\t\n\t } else {\n\t // no nearest before - insert after last element (unpair button)\n\t this.$dragging.insertAfter( this.$( '.paired-columns .unpair-btn' ).last() );\n\t }\n\t // resync the creator's list of paired based on the new DOM order\n\t this._syncPairsToDom();\n\t return false;\n\t },\n\t /** resync the creator's list of paired based on the DOM order of pairs */\n\t _syncPairsToDom : function(){\n\t var newPaired = [];\n\t //TODO: doesn't seem wise to use the dom to store these - can't we sync another way?\n\t this.$( '.paired-columns .dataset.paired' ).each( function(){\n\t newPaired.push( $( this ).data( 'pair' ) );\n\t });\n\t //this.debug( newPaired );\n\t this.paired = newPaired;\n\t this._renderPaired();\n\t },\n\t /** drag communication with pair sub-views: dragstart */\n\t _pairDragstart : function( ev, pair ){\n\t //this.debug( '_pairDragstart', ev, pair )\n\t // auto select the pair causing the event and move all selected\n\t pair.$el.addClass( 'selected' );\n\t var $selected = this.$( '.paired-columns .dataset.selected' );\n\t this.$dragging = $selected;\n\t },\n\t /** drag communication with pair sub-views: dragend - remove the placeholder */\n\t _pairDragend : function( ev, pair ){\n\t //this.debug( '_pairDragend', ev, pair )\n\t $( '.element-drop-placeholder' ).remove();\n\t this.$dragging = null;\n\t },\n\t\n\t // ........................................................................ footer\n\t toggleExtensions : function( force ){\n\t var creator = this;\n\t creator.removeExtensions = ( force !== undefined )?( force ):( !creator.removeExtensions );\n\t\n\t _.each( creator.paired, function( pair ){\n\t // don't overwrite custom names\n\t if( pair.customizedName ){ return; }\n\t pair.name = creator._guessNameForPair( pair.forward, pair.reverse );\n\t });\n\t\n\t creator._renderPaired();\n\t creator._renderFooter();\n\t },\n\t\n\t /** handle a collection name change */\n\t _changeName : function( ev ){\n\t this._validationWarning( 'name', !!this._getName() );\n\t },\n\t\n\t /** check for enter key press when in the collection name and submit */\n\t _nameCheckForEnter : function( ev ){\n\t if( ev.keyCode === 13 && !this.blocking ){\n\t this._clickCreate();\n\t }\n\t },\n\t\n\t /** get the current collection name */\n\t _getName : function(){\n\t return _.escape( this.$( '.collection-name' ).val() );\n\t },\n\t\n\t /** attempt to create the current collection */\n\t _clickCreate : function( ev ){\n\t var name = this._getName();\n\t if( !name ){\n\t this._validationWarning( 'name' );\n\t } else if( !this.blocking ){\n\t this.createList();\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** debug a dataset list */\n\t _printList : function( list ){\n\t var creator = this;\n\t _.each( list, function( e ){\n\t if( list === creator.paired ){\n\t creator._printPair( e );\n\t } else {\n\t //creator.debug( e );\n\t }\n\t });\n\t },\n\t\n\t /** print a pair Object */\n\t _printPair : function( pair ){\n\t this.debug( pair.forward.name, pair.reverse.name, ': ->', pair.name );\n\t },\n\t\n\t /** string rep */\n\t toString : function(){ return 'PairedCollectionCreator'; }\n\t});\n\t\n\t\n\t//TODO: move to require text plugin and load these as text\n\t//TODO: underscore currently unnecc. bc no vars are used\n\t//TODO: better way of localizing text-nodes in long strings\n\t/** underscore template fns attached to class */\n\tPairedCollectionCreator.templates = PairedCollectionCreator.templates || {\n\t\n\t /** the skeleton */\n\t main : _.template([\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ].join('')),\n\t\n\t /** the header (not including help text) */\n\t header : _.template([\n\t '
                    ',\n\t '', _l( 'More help' ), '',\n\t '
                    ',\n\t '', _l( 'Less' ), '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '',\n\t '
                    ',\n\t\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '', _l( 'Unpaired forward' ), '',\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '', _l( 'Unpaired reverse' ), '',\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t '',\n\t '
                    ',\n\t '
                    ',\n\t '
                    ',\n\t '
                    '\n\t ].join('')),\n\t\n\t /** the middle: unpaired, divider, and paired */\n\t middle : _.template([\n\t // contains two flex rows (rows that fill available space) and a divider btwn\n\t '
                    ',\n\t '
                    ',\n\t '
                      ',\n\t '
                      ',\n\t '
                      ',\n\t '
                        ',\n\t '
                        ',\n\t '
                        ',\n\t '
                          ',\n\t '
                          ',\n\t '
                          ',\n\t '
                          ',\n\t '
                          ',\n\t '
                          ',\n\t '
                          ',\n\t '',\n\t '
                          ',\n\t '',\n\t _l( 'Unpair all' ),\n\t '',\n\t '
                          ',\n\t '
                          ',\n\t '
                          ',\n\t '
                            ',\n\t '
                            '\n\t ].join('')),\n\t\n\t /** creation and cancel controls */\n\t footer : _.template([\n\t '
                            ',\n\t '
                            ',\n\t '',\n\t '
                            ',\n\t '
                            ',\n\t '',\n\t '
                            ', _l( 'Name' ), ':
                            ',\n\t '
                            ',\n\t '
                            ',\n\t\n\t '
                            ',\n\t '
                            ',\n\t '',\n\t '
                            ',\n\t '',\n\t '',\n\t '
                            ',\n\t '
                            ',\n\t\n\t '
                            ',\n\t '',\n\t '
                            ',\n\t '
                            '\n\t ].join('')),\n\t\n\t /** help content */\n\t helpContent : _.template([\n\t '

                            ', _l([\n\t 'Collections of paired datasets are ordered lists of dataset pairs (often forward and reverse reads). ',\n\t 'These collections can be passed to tools and workflows in order to have analyses done on each member of ',\n\t 'the entire group. This interface allows you to create a collection, choose which datasets are paired, ',\n\t 'and re-order the final collection.'\n\t ].join( '' )), '

                            ',\n\t '

                            ', _l([\n\t 'Unpaired datasets are shown in the unpaired section ',\n\t '(hover over the underlined words to highlight below). ',\n\t 'Paired datasets are shown in the paired section.',\n\t '

                              To pair datasets, you can:',\n\t '
                            • Click a dataset in the ',\n\t 'forward column ',\n\t 'to select it then click a dataset in the ',\n\t 'reverse column.',\n\t '
                            • ',\n\t '
                            • Click one of the \"Pair these datasets\" buttons in the ',\n\t 'middle column ',\n\t 'to pair the datasets in a particular row.',\n\t '
                            • ',\n\t '
                            • Click \"Auto-pair\" ',\n\t 'to have your datasets automatically paired based on name.',\n\t '
                            • ',\n\t '
                            '\n\t ].join( '' )), '

                            ',\n\t '

                            ', _l([\n\t '

                              You can filter what is shown in the unpaired sections by:',\n\t '
                            • Entering partial dataset names in either the ',\n\t 'forward filter or ',\n\t 'reverse filter.',\n\t '
                            • ',\n\t '
                            • Choosing from a list of preset filters by clicking the ',\n\t '\"Choose filters\" link.',\n\t '
                            • ',\n\t '
                            • Entering regular expressions to match dataset names. See: ',\n\t 'MDN\\'s JavaScript Regular Expression Tutorial. ',\n\t 'Note: forward slashes (\\\\) are not needed.',\n\t '
                            • ',\n\t '
                            • Clearing the filters by clicking the ',\n\t '\"Clear filters\" link.',\n\t '
                            • ',\n\t '
                            '\n\t ].join( '' )), '

                            ',\n\t '

                            ', _l([\n\t 'To unpair individual dataset pairs, click the ',\n\t 'unpair buttons ( ). ',\n\t 'Click the \"Unpair all\" link to unpair all pairs.'\n\t ].join( '' )), '

                            ',\n\t '

                            ', _l([\n\t 'You can include or remove the file extensions (e.g. \".fastq\") from your pair names by toggling the ',\n\t '\"Remove file extensions from pair names?\" control.'\n\t ].join( '' )), '

                            ',\n\t '

                            ', _l([\n\t 'Once your collection is complete, enter a name and ',\n\t 'click \"Create list\". ',\n\t '(Note: you do not have to pair all unpaired datasets to finish.)'\n\t ].join( '' )), '

                            '\n\t ].join(''))\n\t};\n\t\n\t\n\t//=============================================================================\n\t/** a modal version of the paired collection creator */\n\tvar pairedCollectionCreatorModal = function _pairedCollectionCreatorModal( datasets, options ){\n\t\n\t var deferred = jQuery.Deferred(),\n\t creator;\n\t\n\t options = _.defaults( options || {}, {\n\t datasets : datasets,\n\t oncancel : function(){\n\t Galaxy.modal.hide();\n\t deferred.reject( 'cancelled' );\n\t },\n\t oncreate : function( creator, response ){\n\t Galaxy.modal.hide();\n\t deferred.resolve( response );\n\t }\n\t });\n\t\n\t if( !window.Galaxy || !Galaxy.modal ){\n\t throw new Error( 'Galaxy or Galaxy.modal not found' );\n\t }\n\t\n\t creator = new PairedCollectionCreator( options );\n\t Galaxy.modal.show({\n\t title : 'Create a collection of paired datasets',\n\t body : creator.$el,\n\t width : '80%',\n\t height : '800px',\n\t closing_events: true\n\t });\n\t creator.render();\n\t window.creator = creator;\n\t\n\t //TODO: remove modal header\n\t return deferred;\n\t};\n\t\n\t\n\t//=============================================================================\n\tfunction createListOfPairsCollection( collection ){\n\t var elements = collection.toJSON();\n\t//TODO: validate elements\n\t return pairedCollectionCreatorModal( elements, {\n\t historyId : collection.historyId\n\t });\n\t}\n\t\n\t\n\t//=============================================================================\n\t return {\n\t PairedCollectionCreator : PairedCollectionCreator,\n\t pairedCollectionCreatorModal : pairedCollectionCreatorModal,\n\t createListOfPairsCollection : createListOfPairsCollection\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 126 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(36),\n\t __webpack_require__(45),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( LIST_CREATOR, HDCA, BASE_MVC, _l ){\n\t\n\tvar logNamespace = 'collections';\n\t/*==============================================================================\n\tTODO:\n\t the paired creator doesn't really mesh with the list creator as parent\n\t it may be better to make an abstract super class for both\n\t composites may inherit from this (or vis-versa)\n\t PairedDatasetCollectionElementView doesn't make a lot of sense\n\t\n\t==============================================================================*/\n\t/** */\n\tvar PairedDatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n\t _logNamespace : logNamespace,\n\t\n\t//TODO: use proper class (DatasetDCE or NestedDCDCE (or the union of both))\n\t tagName : 'li',\n\t className : 'collection-element',\n\t\n\t initialize : function( attributes ){\n\t this.element = attributes.element || {};\n\t this.identifier = attributes.identifier;\n\t },\n\t\n\t render : function(){\n\t this.$el\n\t .attr( 'data-element-id', this.element.id )\n\t .html( this.template({ identifier: this.identifier, element: this.element }) );\n\t return this;\n\t },\n\t\n\t //TODO: lots of unused space in the element - possibly load details and display them horiz.\n\t template : _.template([\n\t '<%- identifier %>',\n\t '<%- element.name %>',\n\t ].join('')),\n\t\n\t /** remove the DOM and any listeners */\n\t destroy : function(){\n\t this.off();\n\t this.$el.remove();\n\t },\n\t\n\t /** string rep */\n\t toString : function(){\n\t return 'DatasetCollectionElementView()';\n\t }\n\t});\n\t\n\t\n\t// ============================================================================\n\tvar _super = LIST_CREATOR.ListCollectionCreator;\n\t\n\t/** An interface for building collections.\n\t */\n\tvar PairCollectionCreator = _super.extend({\n\t\n\t /** the class used to display individual elements */\n\t elementViewClass : PairedDatasetCollectionElementView,\n\t /** the class this creator will create and save */\n\t collectionClass : HDCA.HistoryPairDatasetCollection,\n\t className : 'pair-collection-creator collection-creator flex-row-container',\n\t\n\t /** override to no-op */\n\t _mangleDuplicateNames : function(){},\n\t\n\t // TODO: this whole pattern sucks. There needs to be two classes of problem area:\n\t // bad inital choices and\n\t // when the user has painted his/her self into a corner during creation/use-of-the-creator\n\t /** render the entire interface */\n\t render : function( speed, callback ){\n\t if( this.workingElements.length === 2 ){\n\t return _super.prototype.render.call( this, speed, callback );\n\t }\n\t return this._renderInvalid( speed, callback );\n\t },\n\t\n\t // ------------------------------------------------------------------------ rendering elements\n\t /** render forward/reverse */\n\t _renderList : function( speed, callback ){\n\t //this.debug( '-- _renderList' );\n\t //precondition: there are two valid elements in workingElements\n\t var creator = this,\n\t $tmp = jQuery( '
                            ' ),\n\t $list = creator.$list();\n\t\n\t // lose the original views, create the new, append all at once, then call their renders\n\t _.each( this.elementViews, function( view ){\n\t view.destroy();\n\t creator.removeElementView( view );\n\t });\n\t $tmp.append( creator._createForwardElementView().$el );\n\t $tmp.append( creator._createReverseElementView().$el );\n\t $list.empty().append( $tmp.children() );\n\t _.invoke( creator.elementViews, 'render' );\n\t },\n\t\n\t /** create the forward element view */\n\t _createForwardElementView : function(){\n\t return this._createElementView( this.workingElements[0], { identifier: 'forward' } );\n\t },\n\t\n\t /** create the forward element view */\n\t _createReverseElementView : function(){\n\t return this._createElementView( this.workingElements[1], { identifier: 'reverse' } );\n\t },\n\t\n\t /** create an element view, cache in elementViews, and return */\n\t _createElementView : function( element, options ){\n\t var elementView = new this.elementViewClass( _.extend( options, {\n\t element : element,\n\t }));\n\t this.elementViews.push( elementView );\n\t return elementView;\n\t },\n\t\n\t /** swap the forward, reverse elements and re-render */\n\t swap : function(){\n\t this.workingElements = [\n\t this.workingElements[1],\n\t this.workingElements[0],\n\t ];\n\t this._renderList();\n\t },\n\t\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .swap' : 'swap',\n\t }),\n\t\n\t // ------------------------------------------------------------------------ templates\n\t //TODO: move to require text plugin and load these as text\n\t //TODO: underscore currently unnecc. bc no vars are used\n\t //TODO: better way of localizing text-nodes in long strings\n\t /** underscore template fns attached to class */\n\t templates : _.extend( _.clone( _super.prototype.templates ), {\n\t /** the middle: element list */\n\t middle : _.template([\n\t '',\n\t '
                            ',\n\t '
                            '\n\t ].join('')),\n\t\n\t /** help content */\n\t helpContent : _.template([\n\t '

                            ', _l([\n\t 'Pair collections are permanent collections containing two datasets: one forward and one reverse. ',\n\t 'Often these are forward and reverse reads. The pair collections can be passed to tools and ',\n\t 'workflows in order to have analyses done on both datasets. This interface allows ',\n\t 'you to create a pair, name it, and swap which is forward and which reverse.'\n\t ].join( '' )), '

                            ',\n\t '
                              ',\n\t '
                            • ', _l([\n\t 'Click the \"Swap\" link to make your forward dataset the reverse ',\n\t 'and the reverse dataset forward.'\n\t ].join( '' )), '
                            • ',\n\t '
                            • ', _l([\n\t 'Click the \"Cancel\" button to exit the interface.'\n\t ].join( '' )), '
                            • ',\n\t '

                            ',\n\t '

                            ', _l([\n\t 'Once your collection is complete, enter a name and ',\n\t 'click \"Create list\".'\n\t ].join( '' )), '

                            '\n\t ].join('')),\n\t\n\t /** a simplified page communicating what went wrong and why the user needs to reselect something else */\n\t invalidInitial : _.template([\n\t '
                            ',\n\t '
                            ',\n\t '',\n\t '<% if( _.size( problems ) ){ %>',\n\t _l( 'The following selections could not be included due to problems' ),\n\t '
                              <% _.each( problems, function( problem ){ %>',\n\t '
                            • <%- problem.element.name %>: <%- problem.text %>
                            • ',\n\t '<% }); %>
                            ',\n\t '<% } else if( _.size( elements ) === 0 ){ %>',\n\t _l( 'No datasets were selected' ), '.',\n\t '<% } else if( _.size( elements ) === 1 ){ %>',\n\t _l( 'Only one dataset was selected' ), ': <%- elements[0].name %>',\n\t '<% } else if( _.size( elements ) > 2 ){ %>',\n\t _l( 'Too many datasets were selected' ),\n\t ': <%- _.pluck( elements, \"name\" ).join( \", \") %>',\n\t '<% } %>',\n\t '
                            ',\n\t _l( 'Two (and only two) elements are needed for the pair' ), '. ',\n\t _l( 'You may need to ' ),\n\t '', _l( 'cancel' ), ' ',\n\t _l( 'and reselect new elements' ), '.',\n\t '
                            ',\n\t '
                            ',\n\t '
                            ',\n\t '
                            ',\n\t '
                            ',\n\t '
                            ',\n\t '',\n\t // _l( 'Create a different kind of collection' ),\n\t '
                            ',\n\t '
                            ',\n\t '
                            '\n\t ].join('')),\n\t }),\n\t\n\t // ------------------------------------------------------------------------ misc\n\t /** string rep */\n\t toString : function(){ return 'PairCollectionCreator'; }\n\t});\n\t\n\t\n\t//==============================================================================\n\t/** List collection flavor of collectionCreatorModal. */\n\tvar pairCollectionCreatorModal = function _pairCollectionCreatorModal( elements, options ){\n\t options = options || {};\n\t options.title = _l( 'Create a collection from a pair of datasets' );\n\t return LIST_CREATOR.collectionCreatorModal( elements, options, PairCollectionCreator );\n\t};\n\t\n\t\n\t//==============================================================================\n\t/** Use a modal to create a pair collection, then add it to the given history contents.\n\t * @returns {Deferred} resolved when the collection is added to the history.\n\t */\n\tfunction createPairCollection( contents ){\n\t var elements = contents.toJSON(),\n\t promise = pairCollectionCreatorModal( elements, {\n\t creationFn : function( elements, name ){\n\t elements = [\n\t { name: \"forward\", src: \"hda\", id: elements[0].id },\n\t { name: \"reverse\", src: \"hda\", id: elements[1].id }\n\t ];\n\t return contents.createHDCA( elements, 'paired', name );\n\t }\n\t });\n\t return promise;\n\t}\n\t\n\t//==============================================================================\n\t return {\n\t PairCollectionCreator : PairCollectionCreator,\n\t pairCollectionCreatorModal : pairCollectionCreatorModal,\n\t createPairCollection : createPairCollection,\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 127 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, jQuery, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(10),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( MODAL, _l ){\n\t\n\t\"use strict\";\n\t//==============================================================================\n\t/**\n\t * A dialog/modal that allows copying a user history or 'importing' from user\n\t * another. Generally called via historyCopyDialog below.\n\t * @type {Object}\n\t */\n\tvar CopyDialog = {\n\t\n\t // language related strings/fns\n\t defaultName : _.template( \"Copy of '<%- name %>'\" ),\n\t title : _.template( _l( 'Copying history' ) + ' \"<%- name %>\"' ),\n\t submitLabel : _l( 'Copy' ),\n\t errorMessage : _l( 'History could not be copied' ),\n\t progressive : _l( 'Copying history' ),\n\t activeLabel : _l( 'Copy only the active, non-deleted datasets' ),\n\t allLabel : _l( 'Copy all datasets including deleted ones' ),\n\t anonWarning : _l( 'As an anonymous user, unless you login or register, you will lose your current history ' ) +\n\t _l( 'after copying this history. ' ),\n\t\n\t // template for modal body\n\t _template : _.template([\n\t //TODO: remove inline styles\n\t // show a warning message for losing current to anon users\n\t '<% if( isAnon ){ %>',\n\t '
                            ',\n\t '<%- anonWarning %>',\n\t _l( 'You can' ),\n\t ' ', _l( 'login here' ), ' ', _l( 'or' ), ' ',\n\t ' ', _l( 'register here' ), '.',\n\t '
                            ',\n\t '<% } %>',\n\t '
                            ',\n\t '
                            ',\n\t // TODO: could use required here and the form validators\n\t // NOTE: use unescaped here if escaped in the modal function below\n\t '\" />',\n\t '

                            ',\n\t _l( 'Please enter a valid history title' ),\n\t '

                            ',\n\t // if allowAll, add the option to copy deleted datasets, too\n\t '<% if( allowAll ){ %>',\n\t '
                            ',\n\t '

                            ', _l( 'Choose which datasets from the original history to include:' ), '

                            ',\n\t // copy non-deleted is the default\n\t '/>',\n\t '',\n\t '
                            ',\n\t '/>',\n\t '',\n\t '<% } %>',\n\t '
                            '\n\t ].join( '' )),\n\t\n\t // empty modal body and let the user know the copy is happening\n\t _showAjaxIndicator : function _showAjaxIndicator(){\n\t var indicator = '

                            ' + this.progressive + '...

                            ';\n\t this.modal.$( '.modal-body' ).empty().append( indicator ).css({ 'margin-top': '8px' });\n\t },\n\t\n\t // (sorta) public interface - display the modal, render the form, and potentially copy the history\n\t // returns a jQuery.Deferred done->history copied, fail->user cancelled\n\t dialog : function _dialog( modal, history, options ){\n\t options = options || {};\n\t\n\t var dialog = this,\n\t deferred = jQuery.Deferred(),\n\t // TODO: getting a little byzantine here\n\t defaultCopyNameFn = options.nameFn || this.defaultName,\n\t defaultCopyName = defaultCopyNameFn({ name: history.get( 'name' ) }),\n\t // TODO: these two might be simpler as one 3 state option (all,active,no-choice)\n\t defaultCopyWhat = options.allDatasets? 'copy-all' : 'copy-non-deleted',\n\t allowAll = !_.isUndefined( options.allowAll )? options.allowAll : true,\n\t autoClose = !_.isUndefined( options.autoClose )? options.autoClose : true;\n\t\n\t this.modal = modal;\n\t\n\t\n\t // validate the name and copy if good\n\t function checkNameAndCopy(){\n\t var name = modal.$( '#copy-modal-title' ).val();\n\t if( !name ){\n\t modal.$( '.invalid-title' ).show();\n\t return;\n\t }\n\t // get further settings, shut down and indicate the ajax call, then hide and resolve/reject\n\t var copyAllDatasets = modal.$( 'input[name=\"copy-what\"]:checked' ).val() === 'copy-all';\n\t modal.$( 'button' ).prop( 'disabled', true );\n\t dialog._showAjaxIndicator();\n\t history.copy( true, name, copyAllDatasets )\n\t .done( function( response ){\n\t deferred.resolve( response );\n\t })\n\t //TODO: make this unneccessary with pub-sub error or handling via Galaxy\n\t .fail( function(){\n\t alert([ dialog.errorMessage, _l( 'Please contact a Galaxy administrator' ) ].join( '. ' ));\n\t deferred.rejectWith( deferred, arguments );\n\t })\n\t .always( function(){\n\t if( autoClose ){ modal.hide(); }\n\t });\n\t }\n\t\n\t var originalClosingCallback = options.closing_callback;\n\t modal.show( _.extend( options, {\n\t title : this.title({ name: history.get( 'name' ) }),\n\t body : $( dialog._template({\n\t name : defaultCopyName,\n\t isAnon : Galaxy.user.isAnonymous(),\n\t allowAll : allowAll,\n\t copyWhat : defaultCopyWhat,\n\t activeLabel : this.activeLabel,\n\t allLabel : this.allLabel,\n\t anonWarning : this.anonWarning,\n\t })),\n\t buttons : _.object([\n\t [ _l( 'Cancel' ), function(){ modal.hide(); } ],\n\t [ this.submitLabel, checkNameAndCopy ]\n\t ]),\n\t height : 'auto',\n\t closing_events : true,\n\t closing_callback: function _historyCopyClose( cancelled ){\n\t if( cancelled ){\n\t deferred.reject({ cancelled : true });\n\t }\n\t if( originalClosingCallback ){\n\t originalClosingCallback( cancelled );\n\t }\n\t }\n\t }));\n\t\n\t // set the default dataset copy, autofocus the title, and set up for a simple return\n\t modal.$( '#copy-modal-title' ).focus().select();\n\t modal.$( '#copy-modal-title' ).on( 'keydown', function( ev ){\n\t if( ev.keyCode === 13 ){\n\t ev.preventDefault();\n\t checkNameAndCopy();\n\t }\n\t });\n\t\n\t return deferred;\n\t },\n\t};\n\t\n\t//==============================================================================\n\t// maintain the (slight) distinction between copy and import\n\t/**\n\t * Subclass CopyDialog to use the import language.\n\t */\n\tvar ImportDialog = _.extend( {}, CopyDialog, {\n\t defaultName : _.template( \"imported: <%- name %>\" ),\n\t title : _.template( _l( 'Importing history' ) + ' \"<%- name %>\"' ),\n\t submitLabel : _l( 'Import' ),\n\t errorMessage : _l( 'History could not be imported' ),\n\t progressive : _l( 'Importing history' ),\n\t activeLabel : _l( 'Import only the active, non-deleted datasets' ),\n\t allLabel : _l( 'Import all datasets including deleted ones' ),\n\t anonWarning : _l( 'As an anonymous user, unless you login or register, you will lose your current history ' ) +\n\t _l( 'after importing this history. ' ),\n\t\n\t});\n\t\n\t//==============================================================================\n\t/**\n\t * Main interface for both history import and history copy dialogs.\n\t * @param {Backbone.Model} history the history to copy\n\t * @param {Object} options a hash\n\t * @return {jQuery.Deferred} promise that fails on close and succeeds on copy\n\t *\n\t * options:\n\t * (this object is also passed to the modal used to display the dialog and accepts modal options)\n\t * {Function} nameFn if defined, use this to build the default name shown to the user\n\t * (the fn is passed: {name: })\n\t * {bool} useImport if true, use the 'import' language (instead of Copy)\n\t * {bool} allowAll if true, allow the user to choose between copying all datasets and\n\t * only non-deleted datasets\n\t * {String} allDatasets default initial checked radio button: 'copy-all' or 'copy-non-deleted',\n\t */\n\tvar historyCopyDialog = function( history, options ){\n\t options = options || {};\n\t // create our own modal if Galaxy doesn't have one (mako tab without use_panels)\n\t var modal = window.parent.Galaxy.modal || new MODAL.View({});\n\t return options.useImport?\n\t ImportDialog.dialog( modal, history, options ):\n\t CopyDialog.dialog( modal, history, options );\n\t};\n\t\n\t\n\t//==============================================================================\n\t return historyCopyDialog;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 128 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(jQuery, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(94),\n\t __webpack_require__(96),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( DATASET_LI_EDIT, HDA_LI, BASE_MVC, _l ){\n\t//==============================================================================\n\tvar _super = DATASET_LI_EDIT.DatasetListItemEdit;\n\t/** @class Editing view for HistoryDatasetAssociation.\n\t */\n\tvar HDAListItemEdit = _super.extend(\n\t/** @lends HDAListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : _super.prototype.className + \" history-content\",\n\t\n\t /** In this override, only get details if in the ready state, get rerunnable if in other states.\n\t * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n\t */\n\t _fetchModelDetails : function(){\n\t var view = this;\n\t if( view.model.inReadyState() && !view.model.hasDetails() ){\n\t return view.model.fetch({ silent: true });\n\t\n\t // special case the need for the rerunnable and creating_job attributes\n\t // needed for rendering re-run button on queued, running datasets\n\t } else if( !view.model.has( 'rerunnable' ) ){\n\t return view.model.fetch({ silent: true, data: {\n\t // only fetch rerunnable and creating_job to keep overhead down\n\t keys: [ 'rerunnable', 'creating_job' ].join(',')\n\t }});\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t /** event map */\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .unhide-link' : function( ev ){ this.model.unhide(); return false; }\n\t }),\n\t\n\t /** string rep */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDAListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t\n\t// ............................................................................ TEMPLATES\n\t/** underscore templates */\n\tHDAListItemEdit.prototype.templates = (function(){\n\t//TODO: move to require text! plugin\n\t\n\t var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n\t hidden : BASE_MVC.wrapTemplate([\n\t '<% if( !dataset.visible ){ %>',\n\t // add a link to unhide a dataset\n\t '
                            ',\n\t _l( 'This dataset has been hidden' ),\n\t '
                            ', _l( 'Unhide it' ), '',\n\t '
                            ',\n\t '<% } %>'\n\t ], 'dataset' )\n\t });\n\t\n\t return _.extend( {}, _super.prototype.templates, {\n\t //NOTE: *steal* the HDAListItemView titleBar\n\t titleBar : HDA_LI.HDAListItemView.prototype.templates.titleBar,\n\t warnings : warnings\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HDAListItemEdit : HDAListItemEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(3)))\n\n/***/ },\n/* 129 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(98),\n\t __webpack_require__(124),\n\t __webpack_require__(26),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HDCA_LI, DC_VIEW_EDIT, faIconButton, _l ){\n\t//==============================================================================\n\tvar _super = HDCA_LI.HDCAListItemView;\n\t/** @class Editing view for HistoryDatasetCollectionAssociation.\n\t */\n\tvar HDCAListItemEdit = _super.extend(\n\t/** @lends HDCAListItemEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** Override to return editable versions of the collection panels */\n\t _getFoldoutPanelClass : function(){\n\t switch( this.model.get( 'collection_type' ) ){\n\t case 'list':\n\t return DC_VIEW_EDIT.ListCollectionViewEdit;\n\t case 'paired':\n\t return DC_VIEW_EDIT.PairCollectionViewEdit;\n\t case 'list:paired':\n\t return DC_VIEW_EDIT.ListOfPairsCollectionViewEdit;\n\t }\n\t throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );\n\t },\n\t\n\t // ......................................................................... delete\n\t /** In this override, add the delete button. */\n\t _renderPrimaryActions : function(){\n\t this.log( this + '._renderPrimaryActions' );\n\t // render the display, edit attr and delete icon-buttons\n\t return _super.prototype._renderPrimaryActions.call( this )\n\t .concat([\n\t this._renderDeleteButton()\n\t ]);\n\t },\n\t\n\t /** Render icon-button to delete this collection. */\n\t _renderDeleteButton : function(){\n\t var self = this,\n\t deleted = this.model.get( 'deleted' );\n\t return faIconButton({\n\t title : deleted? _l( 'Dataset collection is already deleted' ): _l( 'Delete' ),\n\t classes : 'delete-btn',\n\t faIcon : 'fa-times',\n\t disabled : deleted,\n\t onclick : function() {\n\t // ...bler... tooltips being left behind in DOM (hover out never called on deletion)\n\t self.$el.find( '.icon-btn.delete-btn' ).trigger( 'mouseout' );\n\t self.model[ 'delete' ]();\n\t }\n\t });\n\t },\n\t\n\t // ......................................................................... misc\n\t /** string rep */\n\t toString : function(){\n\t var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n\t return 'HDCAListItemEdit(' + modelString + ')';\n\t }\n\t});\n\t\n\t//==============================================================================\n\t return {\n\t HDCAListItemEdit : HDCAListItemEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 130 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, jQuery, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(99),\n\t __webpack_require__(131),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( HISTORY_MODEL, HISTORY_VIEW_EDIT, BASE_MVC, _l ){\n\t// ============================================================================\n\t/** session storage for history panel preferences (and to maintain state)\n\t */\n\tvar HistoryViewPrefs = BASE_MVC.SessionStorageModel.extend(\n\t/** @lends HistoryViewPrefs.prototype */{\n\t defaults : {\n\t /** should the tags editor be shown or hidden initially? */\n\t tagsEditorShown : false,\n\t /** should the annotation editor be shown or hidden initially? */\n\t annotationEditorShown : false,\n\t ///** what is the currently focused content (dataset or collection) in the current history?\n\t // * (the history panel will highlight and scroll to the focused content view)\n\t // */\n\t //focusedContentId : null\n\t /** Current scroll position */\n\t scrollPosition : 0\n\t },\n\t toString : function(){\n\t return 'HistoryViewPrefs(' + JSON.stringify( this.toJSON() ) + ')';\n\t }\n\t});\n\t\n\t/** key string to store panel prefs (made accessible on class so you can access sessionStorage directly) */\n\tHistoryViewPrefs.storageKey = function storageKey(){\n\t return ( 'history-panel' );\n\t};\n\t\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\tvar _super = HISTORY_VIEW_EDIT.HistoryViewEdit;\n\t// used in root/index.mako\n\t/** @class View/Controller for the user's current history model as used in the history\n\t * panel (current right hand panel) of the analysis page.\n\t *\n\t * The only history panel that:\n\t * will poll for updates.\n\t * displays datasets in reverse hid order.\n\t */\n\tvar CurrentHistoryView = _super.extend(\n\t/** @lends CurrentHistoryView.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t className : _super.prototype.className + ' current-history-panel',\n\t\n\t emptyMsg : _l( \"This history is empty. Click 'Get Data' on the left tool menu to start\" ),\n\t noneFoundMsg : _l( \"No matching datasets found\" ),\n\t\n\t /** */\n\t HDCAViewClass : _super.prototype.HDCAViewClass.extend({\n\t foldoutStyle : 'drilldown'\n\t }),\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events */\n\t initialize : function( attributes ){\n\t attributes = attributes || {};\n\t\n\t // ---- persistent preferences\n\t /** maintain state / preferences over page loads */\n\t this.preferences = new HistoryViewPrefs( _.extend({\n\t id : HistoryViewPrefs.storageKey()\n\t }, _.pick( attributes, _.keys( HistoryViewPrefs.prototype.defaults ) )));\n\t\n\t _super.prototype.initialize.call( this, attributes );\n\t\n\t /** sub-views that will overlay this panel (collections) */\n\t this.panelStack = [];\n\t\n\t /** id of currently focused content */\n\t this.currentContentId = attributes.currentContentId || null;\n\t //NOTE: purposely not sent to localstorage since panel recreation roughly lines up with a reset of this value\n\t },\n\t\n\t /** Override to cache the current scroll position with a listener */\n\t _setUpListeners : function(){\n\t _super.prototype._setUpListeners.call( this );\n\t\n\t var panel = this;\n\t // reset scroll position when there's a new history\n\t this.on( 'new-model', function(){\n\t panel.preferences.set( 'scrollPosition', 0 );\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ loading history/item models\n\t /** (re-)loads the user's current history & contents w/ details */\n\t loadCurrentHistory : function( attributes ){\n\t this.debug( this + '.loadCurrentHistory' );\n\t // implemented as a 'fresh start' or for when there is no model (intial panel render)\n\t var panel = this;\n\t return this.loadHistoryWithDetails( 'current', attributes )\n\t .then(function( historyData, contentsData ){\n\t panel.trigger( 'current-history', panel );\n\t });\n\t },\n\t\n\t /** loads a history & contents w/ details and makes them the current history */\n\t switchToHistory : function( historyId, attributes ){\n\t //this.info( 'switchToHistory:', historyId, attributes );\n\t var panel = this,\n\t historyFn = function(){\n\t // make this current and get history data with one call\n\t return jQuery.getJSON( Galaxy.root + 'history/set_as_current?id=' + historyId );\n\t // method : 'PUT'\n\t //});\n\t };\n\t return this.loadHistoryWithDetails( historyId, attributes, historyFn )\n\t .then( function( historyData, contentsData ){\n\t panel.trigger( 'switched-history', panel );\n\t });\n\t },\n\t\n\t /** creates a new history on the server and sets it as the user's current history */\n\t createNewHistory : function( attributes ){\n\t if( !Galaxy || !Galaxy.user || Galaxy.user.isAnonymous() ){\n\t this.displayMessage( 'error', _l( 'You must be logged in to create histories' ) );\n\t return $.when();\n\t }\n\t var panel = this,\n\t historyFn = function(){\n\t // create a new history and save: the server will return the proper JSON\n\t return jQuery.getJSON( Galaxy.root + 'history/create_new_current' );\n\t };\n\t\n\t // id undefined bc there is no historyId yet - the server will provide\n\t // (no need for details - nothing expanded in new history)\n\t return this.loadHistory( undefined, attributes, historyFn )\n\t .then(function( historyData, contentsData ){\n\t panel.trigger( 'new-history', panel );\n\t });\n\t },\n\t\n\t /** release/free/shutdown old models and set up panel for new models */\n\t setModel : function( model, attributes, render ){\n\t _super.prototype.setModel.call( this, model, attributes, render );\n\t if( this.model ){\n\t this.log( 'checking for updates' );\n\t this.model.checkForUpdates();\n\t }\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ history/content event listening\n\t /** listening for collection events */\n\t _setUpCollectionListeners : function(){\n\t _super.prototype._setUpCollectionListeners.call( this );\n\t\n\t //TODO:?? may not be needed? see history-view-edit, 369\n\t // if a hidden item is created (gen. by a workflow), moves thru the updater to the ready state,\n\t // then: remove it from the collection if the panel is set to NOT show hidden datasets\n\t this.collection.on( 'state:ready', function( model, newState, oldState ){\n\t if( ( !model.get( 'visible' ) )\n\t && ( !this.storage.get( 'show_hidden' ) ) ){\n\t this.removeItemView( model );\n\t }\n\t }, this );\n\t },\n\t\n\t /** listening for history events */\n\t _setUpModelListeners : function(){\n\t _super.prototype._setUpModelListeners.call( this );\n\t // ---- history\n\t // re-broadcast any model change events so that listeners don't have to re-bind to each history\n\t this.listenTo( this.model, 'change:nice_size change:size', function(){\n\t this.trigger( 'history-size-change', this, this.model, arguments );\n\t }, this );\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel rendering\n\t /** override to add a handler to capture the scroll position when the parent scrolls */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t // we need to call this in _setUpBehaviors which is called after render since the $el\n\t // may not be attached to $el.parent and $scrollContainer() may not work\n\t var panel = this;\n\t _super.prototype._setUpBehaviors.call( panel, $where );\n\t\n\t // cache the handler to remove and re-add so we don't pile up the handlers\n\t if( !this._debouncedScrollCaptureHandler ){\n\t this._debouncedScrollCaptureHandler = _.debounce( function scrollCapture(){\n\t // cache the scroll position (only if visible)\n\t if( panel.$el.is( ':visible' ) ){\n\t panel.preferences.set( 'scrollPosition', $( this ).scrollTop() );\n\t }\n\t }, 40 );\n\t }\n\t\n\t panel.$scrollContainer()\n\t .off( 'scroll', this._debouncedScrollCaptureHandler )\n\t .on( 'scroll', this._debouncedScrollCaptureHandler );\n\t return panel;\n\t },\n\t\n\t /** In this override, handle null models and move the search input to the top */\n\t _buildNewRender : function(){\n\t if( !this.model ){ return $(); }\n\t var $newRender = _super.prototype._buildNewRender.call( this );\n\t //TODO: hacky\n\t $newRender.find( '.search' ).prependTo( $newRender.find( '.controls' ) );\n\t this._renderQuotaMessage( $newRender );\n\t return $newRender;\n\t },\n\t\n\t /** render the message displayed when a user is over quota and can't run jobs */\n\t _renderQuotaMessage : function( $whereTo ){\n\t $whereTo = $whereTo || this.$el;\n\t return $( this.templates.quotaMsg( {}, this ) ).prependTo( $whereTo.find( '.messages' ) );\n\t },\n\t\n\t /** In this override, add links to open data uploader or get data in the tools section */\n\t _renderEmptyMessage : function( $whereTo ){\n\t var panel = this,\n\t $emptyMsg = panel.$emptyMessage( $whereTo ),\n\t $toolMenu = $( '.toolMenuContainer' );\n\t\n\t if( ( _.isEmpty( panel.views ) && !panel.searchFor )\n\t && ( Galaxy && Galaxy.upload && $toolMenu.size() ) ){\n\t $emptyMsg.empty();\n\t\n\t $emptyMsg.html([\n\t _l( 'This history is empty' ), '. ', _l( 'You can ' ),\n\t '',\n\t _l( 'load your own data' ),\n\t '',\n\t _l( ' or ' ), '',\n\t _l( 'get data from an external source' ),\n\t ''\n\t ].join('') );\n\t $emptyMsg.find( '.uploader-link' ).click( function( ev ){\n\t Galaxy.upload.show( ev );\n\t });\n\t $emptyMsg.find( '.get-data-link' ).click( function( ev ){\n\t $toolMenu.parent().scrollTop( 0 );\n\t $toolMenu.find( 'span:contains(\"Get Data\")' )\n\t .click();\n\t //.fadeTo( 200, 0.1, function(){\n\t // this.debug( this )\n\t // $( this ).fadeTo( 200, 1.0 );\n\t //});\n\t });\n\t return $emptyMsg.show();\n\t }\n\t return _super.prototype._renderEmptyMessage.call( this, $whereTo );\n\t },\n\t\n\t /** In this override, get and set current panel preferences when editor is used */\n\t _renderTags : function( $where ){\n\t var panel = this;\n\t // render tags and show/hide based on preferences\n\t _super.prototype._renderTags.call( this, $where );\n\t if( this.preferences.get( 'tagsEditorShown' ) ){\n\t this.tagsEditor.toggle( true );\n\t }\n\t // store preference when shown or hidden\n\t this.tagsEditor.on( 'hiddenUntilActivated:shown hiddenUntilActivated:hidden',\n\t function( tagsEditor ){\n\t panel.preferences.set( 'tagsEditorShown', tagsEditor.hidden );\n\t });\n\t },\n\t\n\t /** In this override, get and set current panel preferences when editor is used */\n\t _renderAnnotation : function( $where ){\n\t var panel = this;\n\t // render annotation and show/hide based on preferences\n\t _super.prototype._renderAnnotation.call( this, $where );\n\t if( this.preferences.get( 'annotationEditorShown' ) ){\n\t this.annotationEditor.toggle( true );\n\t }\n\t // store preference when shown or hidden\n\t this.annotationEditor.on( 'hiddenUntilActivated:shown hiddenUntilActivated:hidden',\n\t function( annotationEditor ){\n\t panel.preferences.set( 'annotationEditorShown', annotationEditor.hidden );\n\t }\n\t );\n\t },\n\t\n\t /** Override to scroll to cached position (in prefs) after swapping */\n\t _swapNewRender : function( $newRender ){\n\t _super.prototype._swapNewRender.call( this, $newRender );\n\t var panel = this;\n\t _.delay( function(){\n\t var pos = panel.preferences.get( 'scrollPosition' );\n\t if( pos ){\n\t panel.scrollTo( pos, 0 );\n\t }\n\t }, 10 );\n\t //TODO: is this enough of a delay on larger histories?\n\t\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-views\n\t /** Override to add the current-content highlight class to currentContentId's view */\n\t _attachItems : function( $whereTo ){\n\t _super.prototype._attachItems.call( this, $whereTo );\n\t var panel = this;\n\t if( panel.currentContentId ){\n\t panel._setCurrentContentById( panel.currentContentId );\n\t }\n\t return this;\n\t },\n\t\n\t /** Override to remove any drill down panels */\n\t addItemView : function( model, collection, options ){\n\t var view = _super.prototype.addItemView.call( this, model, collection, options );\n\t if( !view ){ return view; }\n\t if( this.panelStack.length ){ return this._collapseDrilldownPanel(); }\n\t return view;\n\t },\n\t\n\t // ------------------------------------------------------------------------ collection sub-views\n\t /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n\t _setUpItemViewListeners : function( view ){\n\t var panel = this;\n\t _super.prototype._setUpItemViewListeners.call( panel, view );\n\t\n\t // use pub-sub to: handle drilldown expansion and collapse\n\t view.on( 'expanded:drilldown', function( v, drilldown ){\n\t this._expandDrilldownPanel( drilldown );\n\t }, this );\n\t view.on( 'collapsed:drilldown', function( v, drilldown ){\n\t this._collapseDrilldownPanel( drilldown );\n\t }, this );\n\t\n\t // when content is manipulated, make it the current-content\n\t // view.on( 'visualize', function( v, ev ){\n\t // this.setCurrentContent( v );\n\t // }, this );\n\t\n\t return this;\n\t },\n\t\n\t /** display 'current content': add a visible highlight and store the id of a content item */\n\t setCurrentContent : function( view ){\n\t this.$( '.history-content.current-content' ).removeClass( 'current-content' );\n\t if( view ){\n\t view.$el.addClass( 'current-content' );\n\t this.currentContentId = view.model.id;\n\t } else {\n\t this.currentContentId = null;\n\t }\n\t },\n\t\n\t /** find the view with the id and then call setCurrentContent on it */\n\t _setCurrentContentById : function( id ){\n\t var view = this.viewFromModelId( id ) || null;\n\t this.setCurrentContent( view );\n\t },\n\t\n\t /** Handle drill down by hiding this panels list and controls and showing the sub-panel */\n\t _expandDrilldownPanel : function( drilldown ){\n\t this.panelStack.push( drilldown );\n\t // hide this panel's controls and list, set the name for back navigation, and attach to the $el\n\t this.$( '> .controls' ).add( this.$list() ).hide();\n\t drilldown.parentName = this.model.get( 'name' );\n\t this.$el.append( drilldown.render().$el );\n\t },\n\t\n\t /** Handle drilldown close by freeing the panel and re-rendering this panel */\n\t _collapseDrilldownPanel : function( drilldown ){\n\t this.panelStack.pop();\n\t//TODO: MEM: free the panel\n\t this.render();\n\t },\n\t\n\t // ........................................................................ external objects/MVC\n\t listenToGalaxy : function( galaxy ){\n\t // TODO: MEM: questionable reference island / closure practice\n\t galaxy.on( 'galaxy_main:load', function( data ){\n\t var pathToMatch = data.fullpath,\n\t useToURLRegexMap = {\n\t 'display' : /datasets\\/([a-f0-9]+)\\/display/,\n\t 'edit' : /datasets\\/([a-f0-9]+)\\/edit/,\n\t 'report_error' : /dataset\\/errors\\?id=([a-f0-9]+)/,\n\t 'rerun' : /tool_runner\\/rerun\\?id=([a-f0-9]+)/,\n\t 'show_params' : /datasets\\/([a-f0-9]+)\\/show_params/,\n\t // no great way to do this here? (leave it in the dataset event handlers above?)\n\t // 'visualization' : 'visualization',\n\t },\n\t hdaId = null,\n\t hdaUse = null;\n\t _.find( useToURLRegexMap, function( regex, use ){\n\t var match = pathToMatch.match( regex );\n\t if( match && match.length == 2 ){\n\t hdaId = match[1];\n\t hdaUse = use;\n\t return true;\n\t }\n\t return false;\n\t });\n\t // need to type mangle to go from web route to history contents\n\t hdaId = 'dataset-' + hdaId;\n\t this._setCurrentContentById( hdaId );\n\t }, this );\n\t },\n\t\n\t//TODO: remove quota meter from panel and remove this\n\t /** add listeners to an external quota meter (mvc/user/user-quotameter.js) */\n\t connectToQuotaMeter : function( quotaMeter ){\n\t if( !quotaMeter ){\n\t return this;\n\t }\n\t // show/hide the 'over quota message' in the history when the meter tells it to\n\t this.listenTo( quotaMeter, 'quota:over', this.showQuotaMessage );\n\t this.listenTo( quotaMeter, 'quota:under', this.hideQuotaMessage );\n\t\n\t // having to add this to handle re-render of hview while overquota (the above do not fire)\n\t this.on( 'rendered rendered:initial', function(){\n\t if( quotaMeter && quotaMeter.isOverQuota() ){\n\t this.showQuotaMessage();\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t//TODO: this seems more like a per user message than a history message; IOW, this doesn't belong here\n\t /** Override to preserve the quota message */\n\t clearMessages : function( ev ){\n\t var $target = !_.isUndefined( ev )?\n\t $( ev.currentTarget )\n\t :this.$messages().children( '[class$=\"message\"]' );\n\t $target = $target.not( '.quota-message' );\n\t $target.fadeOut( this.fxSpeed, function(){\n\t $( this ).remove();\n\t });\n\t return this;\n\t },\n\t\n\t /** Show the over quota message (which happens to be in the history panel).\n\t */\n\t showQuotaMessage : function(){\n\t var $msg = this.$( '.quota-message' );\n\t if( $msg.is( ':hidden' ) ){ $msg.slideDown( this.fxSpeed ); }\n\t },\n\t\n\t//TODO: this seems more like a per user message than a history message\n\t /** Hide the over quota message (which happens to be in the history panel).\n\t */\n\t hideQuotaMessage : function(){\n\t var $msg = this.$( '.quota-message' );\n\t if( !$msg.is( ':hidden' ) ){ $msg.slideUp( this.fxSpeed ); }\n\t },\n\t\n\t /** Return a string rep of the history\n\t */\n\t toString : function(){\n\t return 'CurrentHistoryView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//------------------------------------------------------------------------------ TEMPLATES\n\tCurrentHistoryView.prototype.templates = (function(){\n\t\n\t var quotaMsgTemplate = BASE_MVC.wrapTemplate([\n\t '
                            ',\n\t _l( 'You are over your disk quota' ), '. ',\n\t _l( 'Tool execution is on hold until your disk usage drops below your allocated quota' ), '.',\n\t '
                            '\n\t ], 'history' );\n\t return _.extend( _.clone( _super.prototype.templates ), {\n\t quotaMsg : quotaMsgTemplate\n\t });\n\t\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t CurrentHistoryView : CurrentHistoryView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 131 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, $, jQuery) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(132),\n\t __webpack_require__(47),\n\t __webpack_require__(15),\n\t __webpack_require__(97),\n\t __webpack_require__(128),\n\t __webpack_require__(129),\n\t __webpack_require__(101),\n\t __webpack_require__(92),\n\t __webpack_require__(36),\n\t __webpack_require__(126),\n\t __webpack_require__(125),\n\t __webpack_require__(26),\n\t __webpack_require__(51),\n\t __webpack_require__(5),\n\t __webpack_require__(19),\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(\n\t HISTORY_VIEW,\n\t HISTORY_CONTENTS,\n\t STATES,\n\t HDA_MODEL,\n\t HDA_LI_EDIT,\n\t HDCA_LI_EDIT,\n\t TAGS,\n\t ANNOTATIONS,\n\t LIST_COLLECTION_CREATOR,\n\t PAIR_COLLECTION_CREATOR,\n\t LIST_OF_PAIRS_COLLECTION_CREATOR,\n\t faIconButton,\n\t PopupMenu,\n\t _l\n\t){\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\tvar _super = HISTORY_VIEW.HistoryView;\n\t// base class for history-view-edit-current and used as-is in history/view.mako\n\t/** @class Editable View/Controller for the history model.\n\t *\n\t * Allows:\n\t * (everything HistoryView allows)\n\t * changing the name\n\t * displaying and editing tags and annotations\n\t * multi-selection and operations on mulitple content items\n\t */\n\tvar HistoryViewEdit = _super.extend(\n\t/** @lends HistoryViewEdit.prototype */{\n\t\n\t /** logger used to record this.log messages, commonly set to console */\n\t //logger : console,\n\t\n\t /** class to use for constructing the HistoryDatasetAssociation views */\n\t HDAViewClass : HDA_LI_EDIT.HDAListItemEdit,\n\t /** class to use for constructing the HistoryDatasetCollectionAssociation views */\n\t HDCAViewClass : HDCA_LI_EDIT.HDCAListItemEdit,\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, set up storage, bind listeners to HistoryContents events\n\t * @param {Object} attributes\n\t */\n\t initialize : function( attributes ){\n\t attributes = attributes || {};\n\t _super.prototype.initialize.call( this, attributes );\n\t\n\t // ---- set up instance vars\n\t /** editor for tags - sub-view */\n\t this.tagsEditor = null;\n\t /** editor for annotations - sub-view */\n\t this.annotationEditor = null;\n\t\n\t /** allow user purge of dataset files? */\n\t this.purgeAllowed = attributes.purgeAllowed || false;\n\t\n\t // states/modes the panel can be in\n\t /** is the panel currently showing the dataset selection controls? */\n\t this.annotationEditorShown = attributes.annotationEditorShown || false;\n\t this.tagsEditorShown = attributes.tagsEditorShown || false;\n\t },\n\t\n\t /** Override to handle history as drag-drop target */\n\t _setUpListeners : function(){\n\t var panel = this;\n\t _super.prototype._setUpListeners.call( panel );\n\t\n\t panel.on( 'drop', function( ev, data ){\n\t panel.dataDropped( data );\n\t // remove the drop target\n\t panel.dropTargetOff();\n\t });\n\t panel.on( 'view:attached view:removed', function(){\n\t panel._renderCounts();\n\t }, panel );\n\t },\n\t\n\t // ------------------------------------------------------------------------ listeners\n\t /** listening for collection events */\n\t _setUpCollectionListeners : function(){\n\t _super.prototype._setUpCollectionListeners.call( this );\n\t\n\t this.collection.on( 'change:deleted', this._handleHdaDeletionChange, this );\n\t this.collection.on( 'change:visible', this._handleHdaVisibleChange, this );\n\t this.collection.on( 'change:purged', function( model ){\n\t // hafta get the new nice-size w/o the purged model\n\t this.model.fetch();\n\t }, this );\n\t return this;\n\t },\n\t\n\t /** listening for history and HDA events */\n\t _setUpModelListeners : function(){\n\t _super.prototype._setUpModelListeners.call( this );\n\t this.model.on( 'change:size', this.updateHistoryDiskSize, this );\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel rendering\n\t /** In this override, add tag and annotation editors and a btn to toggle the selectors */\n\t _buildNewRender : function(){\n\t // create a new render using a skeleton template, render title buttons, render body, and set up events, etc.\n\t var $newRender = _super.prototype._buildNewRender.call( this );\n\t if( !this.model ){ return $newRender; }\n\t\n\t if( Galaxy && Galaxy.user && Galaxy.user.id && Galaxy.user.id === this.model.get( 'user_id' ) ){\n\t this._renderTags( $newRender );\n\t this._renderAnnotation( $newRender );\n\t }\n\t return $newRender;\n\t },\n\t\n\t /** override to render counts when the items are rendered */\n\t renderItems : function( $whereTo ){\n\t var views = _super.prototype.renderItems.call( this, $whereTo );\n\t this._renderCounts( $whereTo );\n\t return views;\n\t },\n\t\n\t /** override to show counts, what's deleted/hidden, and links to toggle those */\n\t _renderCounts : function( $whereTo ){\n\t//TODO: too complicated\n\t function toggleLink( _class, text ){\n\t return [ '', text, '' ].join( '' );\n\t }\n\t $whereTo = $whereTo || this.$el;\n\t var deleted = this.collection.where({ deleted: true }),\n\t hidden = this.collection.where({ visible: false }),\n\t msgs = [];\n\t\n\t if( this.views.length ){\n\t msgs.push( [ this.views.length, _l( 'shown' ) ].join( ' ' ) );\n\t }\n\t if( deleted.length ){\n\t msgs.push( ( !this.showDeleted )?\n\t ([ deleted.length, toggleLink( 'toggle-deleted-link', _l( 'deleted' ) ) ].join( ' ' ))\n\t :( toggleLink( 'toggle-deleted-link', _l( 'hide deleted' ) ) )\n\t );\n\t }\n\t if( hidden.length ){\n\t msgs.push( ( !this.showHidden )?\n\t ([ hidden.length, toggleLink( 'toggle-hidden-link', _l( 'hidden' ) ) ].join( ' ' ))\n\t :( toggleLink( 'toggle-hidden-link', _l( 'hide hidden' ) ) )\n\t );\n\t }\n\t return $whereTo.find( '> .controls .subtitle' ).html( msgs.join( ', ' ) );\n\t },\n\t\n\t /** render the tags sub-view controller */\n\t _renderTags : function( $where ){\n\t var panel = this;\n\t this.tagsEditor = new TAGS.TagsEditor({\n\t model : this.model,\n\t el : $where.find( '.controls .tags-display' ),\n\t onshowFirstTime : function(){ this.render(); },\n\t // show hide sub-view tag editors when this is shown/hidden\n\t onshow : function(){\n\t panel.toggleHDATagEditors( true, panel.fxSpeed );\n\t },\n\t onhide : function(){\n\t panel.toggleHDATagEditors( false, panel.fxSpeed );\n\t },\n\t $activator : faIconButton({\n\t title : _l( 'Edit history tags' ),\n\t classes : 'history-tag-btn',\n\t faIcon : 'fa-tags'\n\t }).appendTo( $where.find( '.controls .actions' ) )\n\t });\n\t },\n\t /** render the annotation sub-view controller */\n\t _renderAnnotation : function( $where ){\n\t var panel = this;\n\t this.annotationEditor = new ANNOTATIONS.AnnotationEditor({\n\t model : this.model,\n\t el : $where.find( '.controls .annotation-display' ),\n\t onshowFirstTime : function(){ this.render(); },\n\t // show hide sub-view view annotation editors when this is shown/hidden\n\t onshow : function(){\n\t panel.toggleHDAAnnotationEditors( true, panel.fxSpeed );\n\t },\n\t onhide : function(){\n\t panel.toggleHDAAnnotationEditors( false, panel.fxSpeed );\n\t },\n\t $activator : faIconButton({\n\t title : _l( 'Edit history annotation' ),\n\t classes : 'history-annotate-btn',\n\t faIcon : 'fa-comment'\n\t }).appendTo( $where.find( '.controls .actions' ) )\n\t });\n\t },\n\t\n\t /** Set up HistoryViewEdit js/widget behaviours\n\t * In this override, make the name editable\n\t */\n\t _setUpBehaviors : function( $where ){\n\t $where = $where || this.$el;\n\t _super.prototype._setUpBehaviors.call( this, $where );\n\t if( !this.model ){ return; }\n\t\n\t // anon users shouldn't have access to any of the following\n\t if( ( !Galaxy.user || Galaxy.user.isAnonymous() )\n\t || ( Galaxy.user.id !== this.model.get( 'user_id' ) ) ){\n\t return;\n\t }\n\t\n\t var panel = this,\n\t nameSelector = '> .controls .name';\n\t $where.find( nameSelector )\n\t .attr( 'title', _l( 'Click to rename history' ) )\n\t .tooltip({ placement: 'bottom' })\n\t .make_text_editable({\n\t on_finish: function( newName ){\n\t var previousName = panel.model.get( 'name' );\n\t if( newName && newName !== previousName ){\n\t panel.$el.find( nameSelector ).text( newName );\n\t panel.model.save({ name: newName })\n\t .fail( function(){\n\t panel.$el.find( nameSelector ).text( panel.model.previous( 'name' ) );\n\t });\n\t } else {\n\t panel.$el.find( nameSelector ).text( previousName );\n\t }\n\t }\n\t });\n\t },\n\t\n\t /** return a new popup menu for choosing a multi selection action\n\t * ajax calls made for multiple datasets are queued\n\t */\n\t multiselectActions : function(){\n\t var panel = this,\n\t actions = [\n\t { html: _l( 'Hide datasets' ), func: function(){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype.hide;\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t },\n\t { html: _l( 'Unhide datasets' ), func: function(){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype.unhide;\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t },\n\t { html: _l( 'Delete datasets' ), func: function(){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype['delete'];\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t },\n\t { html: _l( 'Undelete datasets' ), func: function(){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype.undelete;\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t }\n\t ];\n\t if( panel.purgeAllowed ){\n\t actions.push({\n\t html: _l( 'Permanently delete datasets' ), func: function(){\n\t if( confirm( _l( 'This will permanently remove the data in your datasets. Are you sure?' ) ) ){\n\t var action = HDA_MODEL.HistoryDatasetAssociation.prototype.purge;\n\t panel.getSelectedModels().ajaxQueue( action );\n\t }\n\t }\n\t });\n\t }\n\t actions = actions.concat( panel._collectionActions() );\n\t return actions;\n\t },\n\t\n\t /** */\n\t _collectionActions : function(){\n\t var panel = this;\n\t return [\n\t { html: _l( 'Build Dataset List' ), func: function() {\n\t LIST_COLLECTION_CREATOR.createListCollection( panel.getSelectedModels() )\n\t .done( function(){ panel.model.refresh() });\n\t }\n\t },\n\t // TODO: Only show quick pair if two things selected.\n\t { html: _l( 'Build Dataset Pair' ), func: function() {\n\t PAIR_COLLECTION_CREATOR.createPairCollection( panel.getSelectedModels() )\n\t .done( function(){ panel.model.refresh() });\n\t }\n\t },\n\t { html: _l( 'Build List of Dataset Pairs' ), func: function() {\n\t LIST_OF_PAIRS_COLLECTION_CREATOR.createListOfPairsCollection( panel.getSelectedModels() )\n\t .done( function(){ panel.model.refresh() });\n\t }\n\t },\n\t ];\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-views\n\t // reverse HID order\n\t /** Override to reverse order of views - newest contents on top */\n\t _attachItems : function( $whereTo ){\n\t this.$list( $whereTo ).append( this.views.reverse().map( function( view ){\n\t return view.$el;\n\t }));\n\t return this;\n\t },\n\t\n\t /** Override to add new contents at the top */\n\t _attachView : function( view ){\n\t var panel = this;\n\t // override to control where the view is added, how/whether it's rendered\n\t panel.views.unshift( view );\n\t panel.$list().prepend( view.render( 0 ).$el.hide() );\n\t panel.trigger( 'view:attached', view );\n\t view.$el.slideDown( panel.fxSpeed, function(){\n\t panel.trigger( 'view:attached:rendered' );\n\t });\n\t },\n\t\n\t /** In this override, add purgeAllowed and whether tags/annotation editors should be shown */\n\t _getItemViewOptions : function( model ){\n\t var options = _super.prototype._getItemViewOptions.call( this, model );\n\t _.extend( options, {\n\t purgeAllowed : this.purgeAllowed,\n\t//TODO: not working\n\t tagsEditorShown : ( this.tagsEditor && !this.tagsEditor.hidden ),\n\t annotationEditorShown : ( this.annotationEditor && !this.annotationEditor.hidden )\n\t });\n\t return options;\n\t },\n\t\n\t ///** Override to alter data in drag based on multiselection */\n\t //_setUpItemViewListeners : function( view ){\n\t // var panel = this;\n\t // _super.prototype._setUpItemViewListeners.call( panel, view );\n\t //\n\t //},\n\t\n\t /** If this item is deleted and we're not showing deleted items, remove the view\n\t * @param {Model} the item model to check\n\t */\n\t _handleHdaDeletionChange : function( itemModel ){\n\t if( itemModel.get( 'deleted' ) && !this.showDeleted ){\n\t this.removeItemView( itemModel );\n\t }\n\t this._renderCounts();\n\t },\n\t\n\t /** If this item is hidden and we're not showing hidden items, remove the view\n\t * @param {Model} the item model to check\n\t */\n\t _handleHdaVisibleChange : function( itemModel ){\n\t if( itemModel.hidden() && !this.showHidden ){\n\t this.removeItemView( itemModel );\n\t }\n\t this._renderCounts();\n\t },\n\t\n\t /** toggle the visibility of each content's tagsEditor applying all the args sent to this function */\n\t toggleHDATagEditors : function( showOrHide ){\n\t var args = Array.prototype.slice.call( arguments, 1 );\n\t _.each( this.views, function( view ){\n\t if( view.tagsEditor ){\n\t view.tagsEditor.toggle.apply( view.tagsEditor, args );\n\t }\n\t });\n\t },\n\t\n\t /** toggle the visibility of each content's annotationEditor applying all the args sent to this function */\n\t toggleHDAAnnotationEditors : function( showOrHide ){\n\t var args = Array.prototype.slice.call( arguments, 1 );\n\t _.each( this.views, function( view ){\n\t if( view.annotationEditor ){\n\t view.annotationEditor.toggle.apply( view.annotationEditor, args );\n\t }\n\t });\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel events\n\t /** event map */\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t 'click .show-selectors-btn' : 'toggleSelectors',\n\t 'click .toggle-deleted-link' : function( ev ){ this.toggleShowDeleted(); },\n\t 'click .toggle-hidden-link' : function( ev ){ this.toggleShowHidden(); }\n\t }),\n\t\n\t /** Update the history size display (curr. upper right of panel).\n\t */\n\t updateHistoryDiskSize : function(){\n\t this.$el.find( '.history-size' ).text( this.model.get( 'nice_size' ) );\n\t },\n\t\n\t // ------------------------------------------------------------------------ as drop target\n\t /** */\n\t dropTargetOn : function(){\n\t if( this.dropTarget ){ return this; }\n\t this.dropTarget = true;\n\t\n\t //TODO: to init\n\t var dropHandlers = {\n\t 'dragenter' : _.bind( this.dragenter, this ),\n\t 'dragover' : _.bind( this.dragover, this ),\n\t 'dragleave' : _.bind( this.dragleave, this ),\n\t 'drop' : _.bind( this.drop, this )\n\t };\n\t//TODO: scroll to top\n\t var $dropTarget = this._renderDropTarget();\n\t this.$list().before([ this._renderDropTargetHelp(), $dropTarget ]);\n\t for( var evName in dropHandlers ){\n\t if( dropHandlers.hasOwnProperty( evName ) ){\n\t //console.debug( evName, dropHandlers[ evName ] );\n\t $dropTarget.on( evName, dropHandlers[ evName ] );\n\t }\n\t }\n\t return this;\n\t },\n\t\n\t /** */\n\t _renderDropTarget : function(){\n\t this.$( '.history-drop-target' ).remove();\n\t return $( '
                            ' ).addClass( 'history-drop-target' )\n\t .css({\n\t 'height': '64px',\n\t 'margin': '0px 10px 10px 10px',\n\t 'border': '1px dashed black',\n\t 'border-radius' : '3px'\n\t });\n\t },\n\t\n\t /** */\n\t _renderDropTargetHelp : function(){\n\t this.$( '.history-drop-target-help' ).remove();\n\t return $( '
                            ' ).addClass( 'history-drop-target-help' )\n\t .css({\n\t 'margin' : '10px 10px 4px 10px',\n\t 'color' : 'grey',\n\t 'font-size' : '80%',\n\t 'font-style' : 'italic'\n\t })\n\t .text( _l( 'Drag datasets here to copy them to the current history' ) );\n\t },\n\t\n\t /** */\n\t dropTargetOff : function(){\n\t if( !this.dropTarget ){ return this; }\n\t //this.log( 'dropTargetOff' );\n\t this.dropTarget = false;\n\t var dropTarget = this.$( '.history-drop-target' ).get(0);\n\t for( var evName in this._dropHandlers ){\n\t if( this._dropHandlers.hasOwnProperty( evName ) ){\n\t dropTarget.off( evName, this._dropHandlers[ evName ] );\n\t }\n\t }\n\t this.$( '.history-drop-target' ).remove();\n\t this.$( '.history-drop-target-help' ).remove();\n\t return this;\n\t },\n\t /** */\n\t dropTargetToggle : function(){\n\t if( this.dropTarget ){\n\t this.dropTargetOff();\n\t } else {\n\t this.dropTargetOn();\n\t }\n\t return this;\n\t },\n\t\n\t /** */\n\t dragenter : function( ev ){\n\t //console.debug( 'dragenter:', this, ev );\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t this.$( '.history-drop-target' ).css( 'border', '2px solid black' );\n\t },\n\t /** */\n\t dragover : function( ev ){\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t },\n\t /** */\n\t dragleave : function( ev ){\n\t //console.debug( 'dragleave:', this, ev );\n\t ev.preventDefault();\n\t ev.stopPropagation();\n\t this.$( '.history-drop-target' ).css( 'border', '1px dashed black' );\n\t },\n\t /** */\n\t drop : function( ev ){\n\t ev.preventDefault();\n\t //ev.stopPropagation();\n\t\n\t var dataTransfer = ev.originalEvent.dataTransfer;\n\t dataTransfer.dropEffect = 'move';\n\t\n\t var panel = this,\n\t data = dataTransfer.getData( \"text\" );\n\t try {\n\t data = JSON.parse( data );\n\t\n\t } catch( err ){\n\t this.warn( 'error parsing JSON from drop:', data );\n\t }\n\t this.trigger( 'droptarget:drop', ev, data, panel );\n\t return false;\n\t },\n\t\n\t /** */\n\t dataDropped : function( data ){\n\t var panel = this;\n\t // HDA: dropping will copy it to the history\n\t if( _.isObject( data ) && data.model_class === 'HistoryDatasetAssociation' && data.id ){\n\t return panel.model.contents.copy( data.id );\n\t }\n\t return jQuery.when();\n\t },\n\t\n\t // ........................................................................ misc\n\t /** Return a string rep of the history */\n\t toString : function(){\n\t return 'HistoryViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t//==============================================================================\n\t return {\n\t HistoryViewEdit : HistoryViewEdit\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1), __webpack_require__(1)))\n\n/***/ },\n/* 132 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(_, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(100),\n\t __webpack_require__(99),\n\t __webpack_require__(47),\n\t __webpack_require__(96),\n\t __webpack_require__(98),\n\t __webpack_require__(105),\n\t __webpack_require__(26),\n\t __webpack_require__(51),\n\t __webpack_require__(6),\n\t __webpack_require__(5),\n\t __webpack_require__(108)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function(\n\t LIST_VIEW,\n\t HISTORY_MODEL,\n\t HISTORY_CONTENTS,\n\t HDA_LI,\n\t HDCA_LI,\n\t USER,\n\t faIconButton,\n\t PopupMenu,\n\t BASE_MVC,\n\t _l\n\t){\n\t\n\tvar logNamespace = 'history';\n\t\n\t// ============================================================================\n\t/** session storage for individual history preferences */\n\tvar HistoryPrefs = BASE_MVC.SessionStorageModel.extend(\n\t/** @lends HistoryPrefs.prototype */{\n\t//TODO:?? possibly mark as current T/F - have History.currId() (a class method) return that value\n\t defaults : {\n\t//TODO:?? expandedIds to array?\n\t expandedIds : {},\n\t //TODO:?? move to user?\n\t show_deleted : false,\n\t show_hidden : false\n\t //TODO: add scroll position?\n\t },\n\t /** add an hda id to the hash of expanded hdas */\n\t addExpanded : function( model ){\n\t var key = 'expandedIds';\n\t//TODO:?? is this right anymore?\n\t this.save( key, _.extend( this.get( key ), _.object([ model.id ], [ model.get( 'id' ) ]) ) );\n\t },\n\t /** remove an hda id from the hash of expanded hdas */\n\t removeExpanded : function( model ){\n\t var key = 'expandedIds';\n\t this.save( key, _.omit( this.get( key ), model.id ) );\n\t },\n\t toString : function(){\n\t return 'HistoryPrefs(' + this.id + ')';\n\t }\n\t});\n\t// class lvl for access w/o instantiation\n\tHistoryPrefs.storageKeyPrefix = 'history:';\n\t\n\t/** key string to store each histories settings under */\n\tHistoryPrefs.historyStorageKey = function historyStorageKey( historyId ){\n\t if( !historyId ){\n\t throw new Error( 'HistoryPrefs.historyStorageKey needs valid id: ' + historyId );\n\t }\n\t // single point of change\n\t return ( HistoryPrefs.storageKeyPrefix + historyId );\n\t};\n\t/** return the existing storage for the history with the given id (or create one if it doesn't exist) */\n\tHistoryPrefs.get = function get( historyId ){\n\t return new HistoryPrefs({ id: HistoryPrefs.historyStorageKey( historyId ) });\n\t};\n\t/** clear all history related items in sessionStorage */\n\tHistoryPrefs.clearAll = function clearAll( historyId ){\n\t for( var key in sessionStorage ){\n\t if( key.indexOf( HistoryPrefs.storageKeyPrefix ) === 0 ){\n\t sessionStorage.removeItem( key );\n\t }\n\t }\n\t};\n\t\n\t\n\t/* =============================================================================\n\tTODO:\n\t\n\t============================================================================= */\n\t/** @class non-editable, read-only View/Controller for a history model.\n\t * Allows:\n\t * changing the loaded history\n\t * displaying data, info, and download\n\t * tracking history attrs: size, tags, annotations, name, etc.\n\t * Does not allow:\n\t * changing the name\n\t */\n\tvar _super = LIST_VIEW.ModelListPanel;\n\tvar HistoryView = _super.extend(\n\t/** @lends HistoryView.prototype */{\n\t _logNamespace : logNamespace,\n\t\n\t /** class to use for constructing the HDA views */\n\t HDAViewClass : HDA_LI.HDAListItemView,\n\t /** class to use for constructing the HDCA views */\n\t HDCAViewClass : HDCA_LI.HDCAListItemView,\n\t /** class to used for constructing collection of sub-view models */\n\t collectionClass : HISTORY_CONTENTS.HistoryContents,\n\t /** key of attribute in model to assign to this.collection */\n\t modelCollectionKey : 'contents',\n\t\n\t tagName : 'div',\n\t className : _super.prototype.className + ' history-panel',\n\t\n\t /** string to display when the collection is empty */\n\t emptyMsg : _l( 'This history is empty' ),\n\t /** displayed when no items match the search terms */\n\t noneFoundMsg : _l( 'No matching datasets found' ),\n\t /** string used for search placeholder */\n\t searchPlaceholder : _l( 'search datasets' ),\n\t\n\t // ......................................................................... SET UP\n\t /** Set up the view, bind listeners.\n\t * @param {Object} attributes optional settings for the panel\n\t */\n\t initialize : function( attributes ){\n\t _super.prototype.initialize.call( this, attributes );\n\t // ---- instance vars\n\t // control contents/behavior based on where (and in what context) the panel is being used\n\t /** where should pages from links be displayed? (default to new tab/window) */\n\t this.linkTarget = attributes.linkTarget || '_blank';\n\t },\n\t\n\t /** In this override, clear the update timer on the model */\n\t freeModel : function(){\n\t _super.prototype.freeModel.call( this );\n\t//TODO: move to History.free()\n\t if( this.model ){\n\t this.model.clearUpdateTimeout();\n\t }\n\t return this;\n\t },\n\t\n\t /** create any event listeners for the panel\n\t * @fires: rendered:initial on the first render\n\t * @fires: empty-history when switching to a history with no contents or creating a new history\n\t */\n\t _setUpListeners : function(){\n\t _super.prototype._setUpListeners.call( this );\n\t this.on({\n\t error : function( model, xhr, options, msg, details ){\n\t this.errorHandler( model, xhr, options, msg, details );\n\t },\n\t 'loading-done' : function(){\n\t //TODO:?? if( this.collection.length ){\n\t if( !this.views.length ){\n\t this.trigger( 'empty-history', this );\n\t }\n\t },\n\t 'views:ready view:attached view:removed' : function( view ){\n\t this._renderSelectButton();\n\t }\n\t });\n\t // this.on( 'all', function(){ console.debug( arguments ); });\n\t },\n\t\n\t // ------------------------------------------------------------------------ loading history/hda models\n\t //NOTE: all the following fns replace the existing history model with a new model\n\t // (in the following 'details' refers to the full set of contents api data (urls, display_apps, misc_info, etc.)\n\t // - contents w/o details will have summary data only (name, hid, deleted, visible, state, etc.))\n\t//TODO: too tangled...\n\t\n\t /** loads a history & contents, getting details of any contents whose ids are stored in sessionStorage\n\t * (but does not make them the current history)\n\t */\n\t loadHistoryWithDetails : function( historyId, attributes, historyFn, contentsFn ){\n\t this.info( 'loadHistoryWithDetails:', historyId, attributes, historyFn, contentsFn );\n\t var detailIdsFn = function( historyData ){\n\t // will be called to get content ids that need details from the api\n\t//TODO:! non-visible contents are getting details loaded... either stop loading them at all or filter ids thru isVisible\n\t return _.values( HistoryPrefs.get( historyData.id ).get( 'expandedIds' ) );\n\t };\n\t return this.loadHistory( historyId, attributes, historyFn, contentsFn, detailIdsFn );\n\t },\n\t\n\t /** loads a history & contents (but does not make them the current history) */\n\t loadHistory : function( historyId, attributes, historyFn, contentsFn, detailIdsFn ){\n\t this.info( 'loadHistory:', historyId, attributes, historyFn, contentsFn, detailIdsFn );\n\t var panel = this;\n\t attributes = attributes || {};\n\t\n\t panel.trigger( 'loading', panel );\n\t //this.info( 'loadHistory:', historyId, attributes, historyFn, contentsFn, detailIdsFn );\n\t var xhr = HISTORY_MODEL.History.getHistoryData( historyId, {\n\t historyFn : historyFn,\n\t contentsFn : contentsFn,\n\t detailIdsFn : attributes.initiallyExpanded || detailIdsFn\n\t });\n\t\n\t return panel._loadHistoryFromXHR( xhr, attributes )\n\t .fail( function( xhr, where, history ){\n\t // throw an error up for the error handler\n\t panel.trigger( 'error', panel, xhr, attributes, _l( 'An error was encountered while ' + where ),\n\t { historyId: historyId, history: history || {} });\n\t })\n\t .always( function(){\n\t // bc _hideLoadingIndicator relies on this firing\n\t panel.trigger( 'loading-done', panel );\n\t });\n\t },\n\t\n\t /** given an xhr that will provide both history and contents data, pass data to set model or handle xhr errors */\n\t _loadHistoryFromXHR : function( xhr, attributes ){\n\t var panel = this;\n\t xhr.then( function( historyJSON, contentsJSON ){\n\t panel.JSONToModel( historyJSON, contentsJSON, attributes );\n\t panel.render();\n\t });\n\t xhr.fail( function( xhr, where ){\n\t // render anyways - whether we get a model or not\n\t panel.render();\n\t });\n\t return xhr;\n\t },\n\t\n\t /** convenience alias to the model. Updates the item list only (not the history) */\n\t refreshContents : function( detailIds, options ){\n\t if( this.model ){\n\t return this.model.refresh( detailIds, options );\n\t }\n\t // may have callbacks - so return an empty promise\n\t return $.when();\n\t },\n\t\n\t//TODO:?? seems unneccesary\n\t//TODO: Maybe better in History?\n\t /** create a new history model from JSON and call setModel on it */\n\t JSONToModel : function( newHistoryJSON, newHdaJSON, attributes ){\n\t this.log( 'JSONToModel:', newHistoryJSON, newHdaJSON, attributes );\n\t attributes = attributes || {};\n\t //this.log( 'JSONToModel:', newHistoryJSON, newHdaJSON.length, attributes );\n\t\n\t var model = new HISTORY_MODEL.History( newHistoryJSON, newHdaJSON, attributes );\n\t//TODO:?? here?\n\t this.setModel( model );\n\t return model;\n\t },\n\t\n\t /** release/free/shutdown old models and set up panel for new models\n\t * @fires new-model with the panel as parameter\n\t */\n\t setModel : function( model, attributes ){\n\t attributes = attributes || {};\n\t _super.prototype.setModel.call( this, model, attributes );\n\t if( this.model ){\n\t this._setUpWebStorage( attributes.initiallyExpanded, attributes.show_deleted, attributes.show_hidden );\n\t }\n\t },\n\t\n\t // ------------------------------------------------------------------------ browser stored prefs\n\t /** Set up client side storage. Currently PersistanStorage keyed under 'history:'\n\t * @param {Object} initiallyExpanded\n\t * @param {Boolean} show_deleted whether to show deleted contents (overrides stored)\n\t * @param {Boolean} show_hidden\n\t * @see PersistentStorage\n\t */\n\t _setUpWebStorage : function( initiallyExpanded, show_deleted, show_hidden ){\n\t //if( !this.model ){ return this; }\n\t //this.log( '_setUpWebStorage', initiallyExpanded, show_deleted, show_hidden );\n\t if( this.storage ){\n\t this.stopListening( this.storage );\n\t }\n\t\n\t this.storage = new HistoryPrefs({\n\t id: HistoryPrefs.historyStorageKey( this.model.get( 'id' ) )\n\t });\n\t\n\t // expandedIds is a map of content.ids -> a boolean repr'ing whether that item's body is already expanded\n\t // store any pre-expanded ids passed in\n\t if( _.isObject( initiallyExpanded ) ){\n\t this.storage.set( 'expandedIds', initiallyExpanded );\n\t }\n\t\n\t // get the show_deleted/hidden settings giving priority to values passed in, using web storage otherwise\n\t // if the page has specifically requested show_deleted/hidden, these will be either true or false\n\t // (as opposed to undefined, null) - and we give priority to that setting\n\t if( _.isBoolean( show_deleted ) ){\n\t this.storage.set( 'show_deleted', show_deleted );\n\t }\n\t if( _.isBoolean( show_hidden ) ){\n\t this.storage.set( 'show_hidden', show_hidden );\n\t }\n\t\n\t this.trigger( 'new-storage', this.storage, this );\n\t this.log( this + ' (init\\'d) storage:', this.storage.get() );\n\t\n\t this.listenTo( this.storage, {\n\t 'change:show_deleted' : function( view, newVal ){\n\t this.showDeleted = newVal;\n\t },\n\t 'change:show_hidden' : function( view, newVal ){\n\t this.showHidden = newVal;\n\t }\n\t }, this );\n\t this.showDeleted = ( show_deleted !== undefined )? show_deleted : this.storage.get( 'show_deleted' );\n\t this.showHidden = ( show_hidden !== undefined )? show_hidden : this.storage.get( 'show_hidden' );\n\t\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel rendering\n\t /** In this override, add a btn to toggle the selectors */\n\t _buildNewRender : function(){\n\t var $newRender = _super.prototype._buildNewRender.call( this );\n\t this._renderSelectButton( $newRender );\n\t return $newRender;\n\t },\n\t\n\t /** button for starting select mode */\n\t _renderSelectButton : function( $where ){\n\t $where = $where || this.$el;\n\t // do not render selector option if no actions\n\t if( !this.multiselectActions().length ){\n\t return null;\n\t }\n\t // do not render (and remove even) if nothing to select\n\t if( !this.views.length ){\n\t this.hideSelectors();\n\t $where.find( '.controls .actions .show-selectors-btn' ).remove();\n\t return null;\n\t }\n\t // don't bother rendering if there's one already\n\t var $existing = $where.find( '.controls .actions .show-selectors-btn' );\n\t if( $existing.size() ){\n\t return $existing;\n\t }\n\t\n\t return faIconButton({\n\t title : _l( 'Operations on multiple datasets' ),\n\t classes : 'show-selectors-btn',\n\t faIcon : 'fa-check-square-o'\n\t }).prependTo( $where.find( '.controls .actions' ) );\n\t },\n\t\n\t // ------------------------------------------------------------------------ sub-views\n\t /** In this override, since history contents are mixed,\n\t * get the appropo view class based on history_content_type\n\t */\n\t _getItemViewClass : function( model ){\n\t var contentType = model.get( \"history_content_type\" );\n\t switch( contentType ){\n\t case 'dataset':\n\t return this.HDAViewClass;\n\t case 'dataset_collection':\n\t return this.HDCAViewClass;\n\t }\n\t throw new TypeError( 'Unknown history_content_type: ' + contentType );\n\t },\n\t\n\t /** in this override, check if the contents would also display based on show_deleted/hidden */\n\t _filterItem : function( model ){\n\t var panel = this;\n\t return ( _super.prototype._filterItem.call( panel, model )\n\t && ( !model.hidden() || panel.showHidden )\n\t && ( !model.isDeletedOrPurged() || panel.showDeleted ) );\n\t },\n\t\n\t /** in this override, add a linktarget, and expand if id is in web storage */\n\t _getItemViewOptions : function( model ){\n\t var options = _super.prototype._getItemViewOptions.call( this, model );\n\t return _.extend( options, {\n\t linkTarget : this.linkTarget,\n\t expanded : !!this.storage.get( 'expandedIds' )[ model.id ],\n\t hasUser : this.model.ownedByCurrUser()\n\t });\n\t },\n\t\n\t /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n\t _setUpItemViewListeners : function( view ){\n\t var panel = this;\n\t _super.prototype._setUpItemViewListeners.call( panel, view );\n\t\n\t //TODO:?? could use 'view:expanded' here?\n\t // maintain a list of items whose bodies are expanded\n\t view.on( 'expanded', function( v ){\n\t panel.storage.addExpanded( v.model );\n\t });\n\t view.on( 'collapsed', function( v ){\n\t panel.storage.removeExpanded( v.model );\n\t });\n\t return this;\n\t },\n\t\n\t // ------------------------------------------------------------------------ selection\n\t /** Override to correctly set the historyId of the new collection */\n\t getSelectedModels : function(){\n\t var collection = _super.prototype.getSelectedModels.call( this );\n\t collection.historyId = this.collection.historyId;\n\t return collection;\n\t },\n\t\n\t // ------------------------------------------------------------------------ panel events\n\t /** event map */\n\t events : _.extend( _.clone( _super.prototype.events ), {\n\t // toggle list item selectors\n\t 'click .show-selectors-btn' : 'toggleSelectors',\n\t // allow (error) messages to be clicked away\n\t 'click .messages [class$=message]' : 'clearMessages'\n\t }),\n\t\n\t /** Handle the user toggling the deleted visibility by:\n\t * (1) storing the new value in the persistent storage\n\t * (2) re-rendering the history\n\t * @returns {Boolean} new show_deleted setting\n\t */\n\t toggleShowDeleted : function( show, store ){\n\t show = ( show !== undefined )?( show ):( !this.showDeleted );\n\t store = ( store !== undefined )?( store ):( true );\n\t this.showDeleted = show;\n\t if( store ){\n\t this.storage.set( 'show_deleted', show );\n\t }\n\t //TODO:?? to events on storage('change:show_deleted')\n\t this.renderItems();\n\t this.trigger( 'show-deleted', show );\n\t return this.showDeleted;\n\t },\n\t\n\t /** Handle the user toggling the hidden visibility by:\n\t * (1) storing the new value in the persistent storage\n\t * (2) re-rendering the history\n\t * @returns {Boolean} new show_hidden setting\n\t */\n\t toggleShowHidden : function( show, store ){\n\t show = ( show !== undefined )?( show ):( !this.showHidden );\n\t store = ( store !== undefined )?( store ):( true );\n\t this.showHidden = show;\n\t if( store ){\n\t this.storage.set( 'show_hidden', show );\n\t }\n\t //TODO:?? to events on storage('change:show_deleted')\n\t this.renderItems();\n\t this.trigger( 'show-hidden', show );\n\t return this.showHidden;\n\t },\n\t\n\t /** On the first search, if there are no details - load them, then search */\n\t _firstSearch : function( searchFor ){\n\t var panel = this,\n\t inputSelector = '.history-search-input';\n\t this.log( 'onFirstSearch', searchFor );\n\t\n\t if( panel.model.contents.haveDetails() ){\n\t panel.searchItems( searchFor );\n\t return;\n\t }\n\t\n\t panel.$el.find( inputSelector ).searchInput( 'toggle-loading' );\n\t panel.model.contents.fetchAllDetails({ silent: true })\n\t .always( function(){\n\t panel.$el.find( inputSelector ).searchInput( 'toggle-loading' );\n\t })\n\t .done( function(){\n\t panel.searchItems( panel.searchFor );\n\t });\n\t },\n\t\n\t//TODO: break this out\n\t // ........................................................................ error handling\n\t /** Event handler for errors (from the panel, the history, or the history's contents)\n\t * @param {Model or View} model the (Backbone) source of the error\n\t * @param {XMLHTTPRequest} xhr any ajax obj. assoc. with the error\n\t * @param {Object} options the options map commonly used with bbone ajax\n\t * @param {String} msg optional message passed to ease error location\n\t * @param {Object} msg optional object containing error details\n\t */\n\t errorHandler : function( model, xhr, options, msg, details ){\n\t this.error( model, xhr, options, msg, details );\n\t\n\t // interrupted ajax\n\t if( xhr && xhr.status === 0 && xhr.readyState === 0 ){\n\t //TODO: gmail style 'retrying in Ns'\n\t\n\t // bad gateway\n\t } else if( xhr && xhr.status === 502 ){\n\t //TODO: gmail style 'retrying in Ns'\n\t\n\t // otherwise, show an error message inside the panel\n\t } else {\n\t // if sentry is available, attempt to get the event id\n\t var parsed = this._parseErrorMessage( model, xhr, options, msg, details );\n\t // it's possible to have a triggered error before the message container is rendered - wait for it to show\n\t if( !this.$messages().is( ':visible' ) ){\n\t this.once( 'rendered', function(){\n\t this.displayMessage( 'error', parsed.message, parsed.details );\n\t });\n\t } else {\n\t this.displayMessage( 'error', parsed.message, parsed.details );\n\t }\n\t }\n\t },\n\t\n\t /** Parse an error event into an Object usable by displayMessage based on the parameters\n\t * note: see errorHandler for more info on params\n\t */\n\t _parseErrorMessage : function( model, xhr, options, msg, details, sentryId ){\n\t //if( xhr.responseText ){\n\t // xhr.responseText = _.escape( xhr.responseText );\n\t //}\n\t var user = Galaxy.user,\n\t // add the args (w/ some extra info) into an obj\n\t parsed = {\n\t message : this._bePolite( msg ),\n\t details : {\n\t message : msg,\n\t raven : ( window.Raven && _.isFunction( Raven.lastEventId) )?\n\t ( Raven.lastEventId() ):( undefined ),\n\t agent : navigator.userAgent,\n\t // add ajax data from Galaxy object cache\n\t url : ( window.Galaxy )?( Galaxy.lastAjax.url ):( undefined ),\n\t data : ( window.Galaxy )?( Galaxy.lastAjax.data ):( undefined ),\n\t options : ( xhr )?( _.omit( options, 'xhr' ) ):( options ),\n\t xhr : xhr,\n\t source : ( _.isFunction( model.toJSON ) )?( model.toJSON() ):( model + '' ),\n\t user : ( user instanceof USER.User )?( user.toJSON() ):( user + '' )\n\t }\n\t };\n\t\n\t // add any extra details passed in\n\t _.extend( parsed.details, details || {} );\n\t // fancy xhr.header parsing (--> obj)\n\t if( xhr && _.isFunction( xhr.getAllResponseHeaders ) ){\n\t var responseHeaders = xhr.getAllResponseHeaders();\n\t responseHeaders = _.compact( responseHeaders.split( '\\n' ) );\n\t responseHeaders = _.map( responseHeaders, function( header ){\n\t return header.split( ': ' );\n\t });\n\t parsed.details.xhr.responseHeaders = _.object( responseHeaders );\n\t }\n\t return parsed;\n\t },\n\t\n\t /** Modify an error message to be fancy and wear a monocle. */\n\t _bePolite : function( msg ){\n\t msg = msg || _l( 'An error occurred while getting updates from the server' );\n\t return msg + '. ' + _l( 'Please contact a Galaxy administrator if the problem persists' ) + '.';\n\t },\n\t\n\t // ........................................................................ (error) messages\n\t /** Display a message in the top of the panel.\n\t * @param {String} type type of message ('done', 'error', 'warning')\n\t * @param {String} msg the message to display\n\t * @param {Object or HTML} modal contents displayed when the user clicks 'details' in the message\n\t */\n\t displayMessage : function( type, msg, details ){\n\t //precondition: msgContainer must have been rendered even if there's no model\n\t var panel = this;\n\t //this.log( 'displayMessage', type, msg, details );\n\t\n\t this.scrollToTop();\n\t var $msgContainer = this.$messages(),\n\t $msg = $( '
                            ' ).addClass( type + 'message' ).html( msg );\n\t //this.log( ' ', $msgContainer );\n\t\n\t if( !_.isEmpty( details ) ){\n\t var $detailsLink = $( 'Details' )\n\t .click( function(){\n\t Galaxy.modal.show( panel._messageToModalOptions( type, msg, details ) );\n\t return false;\n\t });\n\t $msg.append( ' ', $detailsLink );\n\t }\n\t return $msgContainer.append( $msg );\n\t },\n\t\n\t /** convert msg and details into modal options usable by Galaxy.modal */\n\t _messageToModalOptions : function( type, msg, details ){\n\t // only error is fleshed out here\n\t var panel = this,\n\t options = { title: 'Details' };\n\t if( _.isObject( details ) ){\n\t\n\t details = _.omit( details, _.functions( details ) );\n\t var text = JSON.stringify( details, null, ' ' ),\n\t pre = $( '
                            ' ).text( text );\n\t            options.body = $( '
                            ' ).append( pre );\n\t\n\t } else {\n\t options.body = $( '
                            ' ).html( details );\n\t }\n\t\n\t options.buttons = {\n\t 'Ok': function(){\n\t Galaxy.modal.hide();\n\t panel.clearMessages();\n\t }\n\t //TODO: if( type === 'error' ){ options.buttons[ 'Report this error' ] = function(){} }\n\t };\n\t return options;\n\t },\n\t\n\t /** Remove all messages from the panel. */\n\t clearMessages : function( ev ){\n\t var $target = !_.isUndefined( ev )?\n\t $( ev.currentTarget )\n\t :this.$messages().children( '[class$=\"message\"]' );\n\t $target.fadeOut( this.fxSpeed, function(){\n\t $( this ).remove();\n\t });\n\t return this;\n\t },\n\t\n\t // ........................................................................ scrolling\n\t /** Scrolls the panel to show the content sub-view with the given hid.\n\t * @param {Integer} hid the hid of item to scroll into view\n\t * @returns {HistoryView} the panel\n\t */\n\t scrollToHid : function( hid ){\n\t return this.scrollToItem( _.first( this.viewsWhereModel({ hid: hid }) ) );\n\t },\n\t\n\t // ........................................................................ misc\n\t /** Return a string rep of the history */\n\t toString : function(){\n\t return 'HistoryView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n\t }\n\t});\n\t\n\t\n\t//------------------------------------------------------------------------------ TEMPLATES\n\tHistoryView.prototype.templates = (function(){\n\t\n\t var controlsTemplate = BASE_MVC.wrapTemplate([\n\t '
                            ',\n\t '
                            ',\n\t '
                            <%- history.name %>
                            ',\n\t '
                            ',\n\t '
                            ',\n\t '
                            <%- history.nice_size %>
                            ',\n\t\n\t '
                            ',\n\t\n\t '
                            ',\n\t '<% if( history.deleted && history.purged ){ %>',\n\t '
                            ',\n\t _l( 'This history has been purged and deleted' ),\n\t '
                            ',\n\t '<% } else if( history.deleted ){ %>',\n\t '
                            ',\n\t _l( 'This history has been deleted' ),\n\t '
                            ',\n\t '<% } else if( history.purged ){ %>',\n\t '
                            ',\n\t _l( 'This history has been purged' ),\n\t '
                            ',\n\t '<% } %>',\n\t\n\t '<% if( history.message ){ %>',\n\t // should already be localized\n\t '
                            messagesmall\">',\n\t '<%= history.message.text %>',\n\t '
                            ',\n\t '<% } %>',\n\t '
                            ',\n\t\n\t // add tags and annotations\n\t '
                            ',\n\t '
                            ',\n\t\n\t '
                            ',\n\t '
                            ',\n\t '
                            ',\n\t\n\t '
                            ',\n\t '
                            ',\n\t '',\n\t '',\n\t '
                            ',\n\t '
                            ',\n\t '
                            ',\n\t '
                            ',\n\t '
                            '\n\t ], 'history' );\n\t\n\t return _.extend( _.clone( _super.prototype.templates ), {\n\t controls : controlsTemplate\n\t });\n\t}());\n\t\n\t\n\t//==============================================================================\n\t return {\n\t HistoryView: HistoryView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 133 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(51),\n\t __webpack_require__(127),\n\t __webpack_require__(6),\n\t __webpack_require__(5)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( PopupMenu, historyCopyDialog, BASE_MVC, _l ){\n\t\n\t\"use strict\";\n\t// ============================================================================\n\tvar menu = [\n\t {\n\t html : _l( 'History Lists' ),\n\t header : true\n\t },\n\t {\n\t html : _l( 'Saved Histories' ),\n\t href : 'history/list',\n\t },\n\t {\n\t html : _l( 'Histories Shared with Me' ),\n\t href : 'history/list_shared'\n\t },\n\t\n\t {\n\t html : _l( 'History Actions' ),\n\t header : true,\n\t anon : true\n\t },\n\t {\n\t html : _l( 'Create New' ),\n\t func : function() {\n\t if( Galaxy && Galaxy.currHistoryPanel ){\n\t Galaxy.currHistoryPanel.createNewHistory();\n\t }\n\t },\n\t },\n\t {\n\t html : _l( 'Copy History' ),\n\t func : function() {\n\t historyCopyDialog( Galaxy.currHistoryPanel.model )\n\t .done( function(){\n\t Galaxy.currHistoryPanel.loadCurrentHistory();\n\t });\n\t },\n\t },\n\t {\n\t html : _l( 'Share or Publish' ),\n\t href : 'history/sharing',\n\t },\n\t {\n\t html : _l( 'Show Structure' ),\n\t href : 'history/display_structured',\n\t anon : true,\n\t },\n\t {\n\t html : _l( 'Extract Workflow' ),\n\t href : 'workflow/build_from_current_history',\n\t },\n\t {\n\t html : _l( 'Delete' ),\n\t confirm : _l( 'Really delete the current history?' ),\n\t href : 'history/delete_current',\n\t },\n\t {\n\t html : _l( 'Delete Permanently' ),\n\t confirm : _l( 'Really delete the current history permanently? This cannot be undone.' ),\n\t href : 'history/delete_current?purge=True',\n\t purge : true,\n\t anon : true,\n\t },\n\t\n\t\n\t {\n\t html : _l( 'Dataset Actions' ),\n\t header : true,\n\t anon : true\n\t },\n\t {\n\t html : _l( 'Copy Datasets' ),\n\t href : 'dataset/copy_datasets',\n\t },\n\t {\n\t html : _l( 'Dataset Security' ),\n\t href : 'root/history_set_default_permissions',\n\t },\n\t {\n\t html : _l( 'Resume Paused Jobs' ),\n\t href : 'history/resume_paused_jobs?current=True',\n\t anon : true,\n\t },\n\t {\n\t html : _l( 'Collapse Expanded Datasets' ),\n\t func : function() {\n\t if( Galaxy && Galaxy.currHistoryPanel ){\n\t Galaxy.currHistoryPanel.collapseAll();\n\t }\n\t },\n\t },\n\t {\n\t html : _l( 'Unhide Hidden Datasets' ),\n\t anon : true,\n\t func : function() {\n\t if( Galaxy && Galaxy.currHistoryPanel && confirm( _l( 'Really unhide all hidden datasets?' ) ) ){\n\t var filtered = Galaxy.currHistoryPanel.model.contents.hidden();\n\t //TODO: batch\n\t filtered.ajaxQueue( Backbone.Model.prototype.save, { visible : true })\n\t .done( function(){\n\t Galaxy.currHistoryPanel.renderItems();\n\t })\n\t .fail( function(){\n\t alert( 'There was an error unhiding the datasets' );\n\t console.error( arguments );\n\t });\n\t }\n\t },\n\t },\n\t {\n\t html : _l( 'Delete Hidden Datasets' ),\n\t anon : true,\n\t func : function() {\n\t if( Galaxy && Galaxy.currHistoryPanel && confirm( _l( 'Really delete all hidden datasets?' ) ) ){\n\t var filtered = Galaxy.currHistoryPanel.model.contents.hidden();\n\t //TODO: batch\n\t // both delete *and* unhide them\n\t filtered.ajaxQueue( Backbone.Model.prototype.save, { deleted : true, visible: true })\n\t .done( function(){\n\t Galaxy.currHistoryPanel.renderItems();\n\t })\n\t .fail( function(){\n\t alert( 'There was an error deleting the datasets' );\n\t console.error( arguments );\n\t });\n\t }\n\t },\n\t },\n\t {\n\t html : _l( 'Purge Deleted Datasets' ),\n\t confirm : _l( 'Really delete all deleted datasets permanently? This cannot be undone.' ),\n\t href : 'history/purge_deleted_datasets',\n\t purge : true,\n\t anon : true,\n\t },\n\t\n\t\n\t {\n\t html : _l( 'Downloads' ),\n\t header : true\n\t },\n\t {\n\t html : _l( 'Export Tool Citations' ),\n\t href : 'history/citations',\n\t anon : true,\n\t },\n\t {\n\t html : _l( 'Export History to File' ),\n\t href : 'history/export_archive?preview=True',\n\t anon : true,\n\t },\n\t\n\t {\n\t html : _l( 'Other Actions' ),\n\t header : true\n\t },\n\t {\n\t html : _l( 'Import from File' ),\n\t href : 'history/import_archive',\n\t }\n\t];\n\t\n\tfunction buildMenu( isAnon, purgeAllowed, urlRoot ){\n\t return _.clone( menu ).filter( function( menuOption ){\n\t if( isAnon && !menuOption.anon ){\n\t return false;\n\t }\n\t if( !purgeAllowed && menuOption.purge ){\n\t return false;\n\t }\n\t\n\t //TODO:?? hard-coded galaxy_main\n\t if( menuOption.href ){\n\t menuOption.href = urlRoot + menuOption.href;\n\t menuOption.target = 'galaxy_main';\n\t }\n\t\n\t if( menuOption.confirm ){\n\t menuOption.func = function(){\n\t if( confirm( menuOption.confirm ) ){\n\t galaxy_main.location = menuOption.href;\n\t }\n\t };\n\t }\n\t return true;\n\t });\n\t}\n\t\n\tvar create = function( $button, options ){\n\t options = options || {};\n\t var isAnon = options.anonymous === undefined? true : options.anonymous,\n\t purgeAllowed = options.purgeAllowed || false,\n\t menu = buildMenu( isAnon, purgeAllowed, Galaxy.root );\n\t //console.debug( 'menu:', menu );\n\t return new PopupMenu( $button, menu );\n\t};\n\t\n\t\n\t// ============================================================================\n\t return create;\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3)))\n\n/***/ },\n/* 134 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, $) {// dependencies\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(4),\n\t __webpack_require__(104),\n\t __webpack_require__(103),\n\t __webpack_require__(29),\n\t __webpack_require__(7),\n\t __webpack_require__(30),\n\t __webpack_require__(111)], __WEBPACK_AMD_DEFINE_RESULT__ = function( Utils,\n\t UploadSettings,\n\t UploadFtp,\n\t Popover,\n\t Ui,\n\t Select\n\t ) {\n\t\n\t// renders the composite upload row view\n\treturn Backbone.View.extend({\n\t // states\n\t status_classes : {\n\t init : 'upload-mode fa fa-exclamation text-primary',\n\t ready : 'upload-mode fa fa-check text-success',\n\t running : 'upload-mode fa fa-spinner fa-spin',\n\t success : 'upload-mode fa fa-check',\n\t error : 'upload-mode fa fa-exclamation-triangle'\n\t },\n\t\n\t // initialize\n\t initialize: function(app, options) {\n\t // link app\n\t this.app = app;\n\t\n\t // link this\n\t var self = this;\n\t\n\t // create model\n\t this.model = options.model;\n\t\n\t // add upload row\n\t this.setElement(this._template(options.model));\n\t\n\t // build upload functions\n\t this.uploadinput = this.$el.uploadinput({\n\t ondragover: function() {\n\t if (self.model.get('enabled')) {\n\t self.$el.addClass('warning');\n\t }\n\t },\n\t ondragleave: function() {\n\t self.$el.removeClass('warning');\n\t },\n\t onchange: function(files) {\n\t if (self.model.get('status') != 'running' && files && files.length > 0) {\n\t self.model.reset({\n\t 'file_data': files[0],\n\t 'file_name': files[0].name,\n\t 'file_size': files[0].size,\n\t 'file_mode': files[0].mode || 'local'\n\t });\n\t self._refreshReady();\n\t }\n\t }\n\t });\n\t\n\t // source selection popup\n\t this.button_menu = new Ui.ButtonMenu({\n\t icon : 'fa-caret-down',\n\t title : 'Select',\n\t pull : 'left'\n\t });\n\t this.$('#source').append(this.button_menu.$el);\n\t this.button_menu.addMenu({\n\t icon : 'fa-laptop',\n\t title : 'Choose local file',\n\t onclick : function() {\n\t self.uploadinput.dialog();\n\t }\n\t });\n\t if (this.app.ftp_upload_site) {\n\t this.button_menu.addMenu({\n\t icon : 'fa-folder-open-o',\n\t title : 'Choose FTP file',\n\t onclick : function() {\n\t self._showFtp();\n\t }\n\t });\n\t }\n\t this.button_menu.addMenu({\n\t icon : 'fa-edit',\n\t title : 'Paste/Fetch data',\n\t onclick : function() {\n\t self.model.reset({\n\t 'file_mode': 'new',\n\t 'file_name': 'New File'\n\t });\n\t }\n\t });\n\t\n\t // add ftp file viewer\n\t this.ftp = new Popover.View({\n\t title : 'Choose FTP file:',\n\t container : this.$('#source').find('.ui-button-menu'),\n\t placement : 'right'\n\t });\n\t\n\t // append popup to settings icon\n\t this.settings = new Popover.View({\n\t title : 'Upload configuration',\n\t container : this.$('#settings'),\n\t placement : 'bottom'\n\t });\n\t\n\t //\n\t // ui events\n\t //\n\t\n\t // handle text editing event\n\t this.$('#text-content').on('change input', function(e) {\n\t self.model.set('url_paste', $(e.target).val());\n\t self.model.set('file_size', $(e.target).val().length);\n\t self._refreshReady();\n\t });\n\t\n\t // handle settings popover\n\t this.$('#settings').on('click' , function(e) { self._showSettings(); })\n\t .on('mousedown', function(e) { e.preventDefault(); });\n\t\n\t //\n\t // model events\n\t //\n\t this.model.on('change:percentage', function() {\n\t self._refreshPercentage();\n\t });\n\t this.model.on('change:status', function() {\n\t self._refreshStatus();\n\t });\n\t this.model.on('change:info', function() {\n\t self._refreshInfo();\n\t });\n\t this.model.on('change:file_name', function() {\n\t self._refreshFileName();\n\t });\n\t this.model.on('change:file_mode', function() {\n\t self._refreshMode();\n\t });\n\t this.model.on('change:file_size', function() {\n\t self._refreshFileSize();\n\t });\n\t this.model.on('remove', function() {\n\t self.remove();\n\t });\n\t this.app.collection.on('reset', function() {\n\t self.remove();\n\t });\n\t },\n\t\n\t // render\n\t render: function() {\n\t this.$('#file_name').html(this.model.get('file_name') || '-');\n\t this.$('#file_desc').html(this.model.get('file_desc') || 'Unavailable');\n\t this.$('#file_size').html(Utils.bytesToString (this.model.get('file_size')));\n\t this.$('#status').removeClass().addClass(this.status_classes.init);\n\t },\n\t\n\t // remove\n\t remove: function() {\n\t // call the base class remove method\n\t Backbone.View.prototype.remove.apply(this);\n\t },\n\t\n\t //\n\t // handle model events\n\t //\n\t\n\t // refresh ready or not states\n\t _refreshReady: function() {\n\t this.app.collection.each(function(model) {\n\t model.set('status', (model.get('file_size') > 0) && 'ready' || 'init');\n\t });\n\t },\n\t\n\t // refresh mode and e.g. show/hide textarea field\n\t _refreshMode: function() {\n\t var file_mode = this.model.get('file_mode');\n\t if (file_mode == 'new') {\n\t this.height = this.$el.height();\n\t this.$('#text').css({\n\t 'width' : this.$el.width() - 16 + 'px',\n\t 'top' : this.$el.height() - 8 + 'px'\n\t }).show();\n\t this.$el.height(this.$el.height() - 8 + this.$('#text').height() + 16);\n\t this.$('#text-content').val('').trigger('keyup');\n\t } else {\n\t this.$el.height(this.height);\n\t this.$('#text').hide();\n\t }\n\t },\n\t\n\t // information\n\t _refreshInfo: function() {\n\t var info = this.model.get('info');\n\t if (info) {\n\t this.$('#info-text').html('Failed: ' + info).show();\n\t } else {\n\t this.$('#info-text').hide();\n\t }\n\t },\n\t\n\t // percentage\n\t _refreshPercentage : function() {\n\t var percentage = parseInt(this.model.get('percentage'));\n\t if (percentage != 0) {\n\t this.$('.progress-bar').css({ width : percentage + '%' });\n\t } else {\n\t this.$('.progress-bar').addClass('no-transition');\n\t this.$('.progress-bar').css({ width : '0%' });\n\t this.$('.progress-bar')[0].offsetHeight;\n\t this.$('.progress-bar').removeClass('no-transition');\n\t }\n\t if (percentage != 100) {\n\t this.$('#percentage').html(percentage + '%');\n\t } else {\n\t this.$('#percentage').html('Adding to history...');\n\t }\n\t },\n\t\n\t // status\n\t _refreshStatus : function() {\n\t // identify new status\n\t var status = this.model.get('status');\n\t\n\t // identify symbol and reset classes\n\t this.$('#status').removeClass().addClass(this.status_classes[status]);\n\t\n\t // enable/disable model flag\n\t this.model.set('enabled', status != 'running');\n\t\n\t // enable/disable row fields\n\t this.$('#text-content').attr('disabled', !this.model.get('enabled'));\n\t\n\t // remove status classes\n\t this.$el.removeClass('success danger warning');\n\t\n\t // set status classes\n\t if (status == 'running' || status == 'ready') {\n\t this.model.set('percentage', 0);\n\t }\n\t if (status == 'running') {\n\t this.$('#source').find('.button').addClass('disabled');\n\t } else {\n\t this.$('#source').find('.button').removeClass('disabled');\n\t }\n\t if (status == 'success') {\n\t this.$el.addClass('success');\n\t this.model.set('percentage', 100);\n\t this.$('#percentage').html('100%');\n\t }\n\t if (status == 'error') {\n\t this.$el.addClass('danger');\n\t this.model.set('percentage', 0);\n\t this.$('#info-progress').hide();\n\t this.$('#info-text').show();\n\t } else {\n\t this.$('#info-progress').show();\n\t this.$('#info-text').hide();\n\t }\n\t },\n\t\n\t // file name\n\t _refreshFileName: function() {\n\t this.$('#file_name').html(this.model.get('file_name') || '-');\n\t },\n\t\n\t // file size\n\t _refreshFileSize: function() {\n\t this.$('#file_size').html(Utils.bytesToString (this.model.get('file_size')));\n\t },\n\t\n\t // show/hide ftp popup\n\t _showFtp: function() {\n\t if (!this.ftp.visible) {\n\t this.ftp.empty();\n\t var self = this;\n\t this.ftp.append((new UploadFtp({\n\t ftp_upload_site: this.app.ftp_upload_site,\n\t onchange: function(ftp_file) {\n\t self.ftp.hide();\n\t if (self.model.get('status') != 'running' && ftp_file) {\n\t self.model.reset({\n\t 'file_mode': 'ftp',\n\t 'file_name': ftp_file.path,\n\t 'file_size': ftp_file.size,\n\t 'file_path': ftp_file.path\n\t });\n\t self._refreshReady();\n\t }\n\t }\n\t })).$el);\n\t this.ftp.show();\n\t } else {\n\t this.ftp.hide();\n\t }\n\t },\n\t\n\t // show/hide settings popup\n\t _showSettings : function() {\n\t if (!this.settings.visible) {\n\t this.settings.empty();\n\t this.settings.append((new UploadSettings(this)).$el);\n\t this.settings.show();\n\t } else {\n\t this.settings.hide();\n\t }\n\t },\n\t\n\t // template\n\t _template: function(options) {\n\t return '' +\n\t '' +\n\t '
                            ' +\n\t '
                            ' +\n\t '
                            ' +\n\t '
                            You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.
                            ' +\n\t '';\n } else {\n return '';\n }\n }\n });\n\n /** Creates a hidden element input field used e.g. in the tool form */\n var Hidden = Backbone.View.extend({\n initialize : function(options) {\n this.options = options;\n this.setElement(this._template(this.options));\n if (this.options.value !== undefined) {\n this.value(this.options.value);\n }\n },\n value : function (new_val) {\n if (new_val !== undefined) {\n this.$('hidden').val(new_val);\n }\n return this.$('hidden').val();\n },\n _template: function(options) {\n var tmpl = '
                            ';\n if (options.info) {\n tmpl += '
                            ' + options.info + '
                            ';\n }\n tmpl += '' +\n '
                            ';\n return tmpl;\n }\n });\n\n return {\n Anchor : Anchor,\n Button : Buttons.ButtonDefault,\n ButtonIcon : Buttons.ButtonIcon,\n ButtonCheck : Buttons.ButtonCheck,\n ButtonMenu : Buttons.ButtonMenu,\n ButtonLink : Buttons.ButtonLink,\n Icon : Icon,\n Image : Image,\n Input : Input,\n Label : Label,\n Message : Message,\n Modal : Modal,\n RadioButton : Options.RadioButton,\n Checkbox : Options.Checkbox,\n Radio : Options.Radio,\n Searchbox : Searchbox,\n Select : Select,\n Hidden : Hidden,\n Slider : Slider,\n Drilldown : Drilldown\n }\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-misc.js\n ** module id = 7\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.extend = extend;\nexports.indexOf = indexOf;\nexports.escapeExpression = escapeExpression;\nexports.isEmpty = isEmpty;\nexports.createFrame = createFrame;\nexports.blockParams = blockParams;\nexports.appendContextPath = appendContextPath;\nvar escape = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`',\n '=': '='\n};\n\nvar badChars = /[&<>\"'`=]/g,\n possible = /[&<>\"'`=]/;\n\nfunction escapeChar(chr) {\n return escape[chr];\n}\n\nfunction extend(obj /* , ...source */) {\n for (var i = 1; i < arguments.length; i++) {\n for (var key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n}\n\nvar toString = Object.prototype.toString;\n\nexports.toString = toString;\n// Sourced from lodash\n// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n/* eslint-disable func-style */\nvar isFunction = function isFunction(value) {\n return typeof value === 'function';\n};\n// fallback for older versions of Chrome and Safari\n/* istanbul ignore next */\nif (isFunction(/x/)) {\n exports.isFunction = isFunction = function (value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n}\nexports.isFunction = isFunction;\n\n/* eslint-enable func-style */\n\n/* istanbul ignore next */\nvar isArray = Array.isArray || function (value) {\n return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n};\n\nexports.isArray = isArray;\n// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\nfunction indexOf(array, value) {\n for (var i = 0, len = array.length; i < len; i++) {\n if (array[i] === value) {\n return i;\n }\n }\n return -1;\n}\n\nfunction escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string == null) {\n return '';\n } else if (!string) {\n return string + '';\n }\n\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n\n if (!possible.test(string)) {\n return string;\n }\n return string.replace(badChars, escapeChar);\n}\n\nfunction isEmpty(value) {\n if (!value && value !== 0) {\n return true;\n } else if (isArray(value) && value.length === 0) {\n return true;\n } else {\n return false;\n }\n}\n\nfunction createFrame(object) {\n var frame = extend({}, object);\n frame._parent = object;\n return frame;\n}\n\nfunction blockParams(params, ids) {\n params.path = ids;\n return params;\n}\n\nfunction appendContextPath(contextPath, id) {\n return (contextPath ? contextPath + '.' : '') + id;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxJQUFNLE1BQU0sR0FBRztBQUNiLEtBQUcsRUFBRSxPQUFPO0FBQ1osS0FBRyxFQUFFLE1BQU07QUFDWCxLQUFHLEVBQUUsTUFBTTtBQUNYLEtBQUcsRUFBRSxRQUFRO0FBQ2IsS0FBRyxFQUFFLFFBQVE7QUFDYixLQUFHLEVBQUUsUUFBUTtBQUNiLEtBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQzs7QUFFRixJQUFNLFFBQVEsR0FBRyxZQUFZO0lBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUM7O0FBRTdCLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN2QixTQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQjs7QUFFTSxTQUFTLE1BQU0sQ0FBQyxHQUFHLG9CQUFtQjtBQUMzQyxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxTQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1QixVQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDM0QsV0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUM5QjtLQUNGO0dBQ0Y7O0FBRUQsU0FBTyxHQUFHLENBQUM7Q0FDWjs7QUFFTSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0FBS2hELElBQUksVUFBVSxHQUFHLG9CQUFTLEtBQUssRUFBRTtBQUMvQixTQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDOzs7QUFHRixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNuQixVQUlNLFVBQVUsR0FKaEIsVUFBVSxHQUFHLFVBQVMsS0FBSyxFQUFFO0FBQzNCLFdBQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssbUJBQW1CLENBQUM7R0FDcEYsQ0FBQztDQUNIO1FBQ08sVUFBVSxHQUFWLFVBQVU7Ozs7O0FBSVgsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxVQUFTLEtBQUssRUFBRTtBQUN0RCxTQUFPLEFBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUNqRyxDQUFDOzs7OztBQUdLLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDcEMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxRQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDdEIsYUFBTyxDQUFDLENBQUM7S0FDVjtHQUNGO0FBQ0QsU0FBTyxDQUFDLENBQUMsQ0FBQztDQUNYOztBQUdNLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLE1BQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFOztBQUU5QixRQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQzNCLGFBQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ3hCLE1BQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3pCLGFBQU8sRUFBRSxDQUFDO0tBQ1gsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2xCLGFBQU8sTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUNwQjs7Ozs7QUFLRCxVQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUN0Qjs7QUFFRCxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUFFLFdBQU8sTUFBTSxDQUFDO0dBQUU7QUFDOUMsU0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztDQUM3Qzs7QUFFTSxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDN0IsTUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLFdBQU8sSUFBSSxDQUFDO0dBQ2IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxXQUFPLElBQUksQ0FBQztHQUNiLE1BQU07QUFDTCxXQUFPLEtBQUssQ0FBQztHQUNkO0NBQ0Y7O0FBRU0sU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0FBQ2xDLE1BQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0IsT0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDdkIsU0FBTyxLQUFLLENBQUM7Q0FDZDs7QUFFTSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLFFBQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLFNBQU8sTUFBTSxDQUFDO0NBQ2Y7O0FBRU0sU0FBUyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO0FBQ2pELFNBQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUEsR0FBSSxFQUFFLENBQUM7Q0FDcEQiLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/utils.js\n ** module id = 8\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\nfunction Exception(message, node) {\n var loc = node && node.loc,\n line = undefined,\n column = undefined;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n var tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (var idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n /* istanbul ignore else */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n if (loc) {\n this.lineNumber = line;\n this.column = column;\n }\n}\n\nException.prototype = new Error();\n\nexports['default'] = Exception;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsSUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbkcsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUNoQyxNQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7TUFDdEIsSUFBSSxZQUFBO01BQ0osTUFBTSxZQUFBLENBQUM7QUFDWCxNQUFJLEdBQUcsRUFBRTtBQUNQLFFBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN0QixVQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBRTFCLFdBQU8sSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDeEM7O0FBRUQsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7O0FBRzFELE9BQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ2hELFFBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDOUM7OztBQUdELE1BQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO0FBQzNCLFNBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDMUM7O0FBRUQsTUFBSSxHQUFHLEVBQUU7QUFDUCxRQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUN2QixRQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztHQUN0QjtDQUNGOztBQUVELFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQzs7cUJBRW5CLFNBQVMiLCJmaWxlIjoiZXhjZXB0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBlcnJvclByb3BzID0gWydkZXNjcmlwdGlvbicsICdmaWxlTmFtZScsICdsaW5lTnVtYmVyJywgJ21lc3NhZ2UnLCAnbmFtZScsICdudW1iZXInLCAnc3RhY2snXTtcblxuZnVuY3Rpb24gRXhjZXB0aW9uKG1lc3NhZ2UsIG5vZGUpIHtcbiAgbGV0IGxvYyA9IG5vZGUgJiYgbm9kZS5sb2MsXG4gICAgICBsaW5lLFxuICAgICAgY29sdW1uO1xuICBpZiAobG9jKSB7XG4gICAgbGluZSA9IGxvYy5zdGFydC5saW5lO1xuICAgIGNvbHVtbiA9IGxvYy5zdGFydC5jb2x1bW47XG5cbiAgICBtZXNzYWdlICs9ICcgLSAnICsgbGluZSArICc6JyArIGNvbHVtbjtcbiAgfVxuXG4gIGxldCB0bXAgPSBFcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLCBtZXNzYWdlKTtcblxuICAvLyBVbmZvcnR1bmF0ZWx5IGVycm9ycyBhcmUgbm90IGVudW1lcmFibGUgaW4gQ2hyb21lIChhdCBsZWFzdCksIHNvIGBmb3IgcHJvcCBpbiB0bXBgIGRvZXNuJ3Qgd29yay5cbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgZXJyb3JQcm9wcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdGhpc1tlcnJvclByb3BzW2lkeF1dID0gdG1wW2Vycm9yUHJvcHNbaWR4XV07XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFeGNlcHRpb24pO1xuICB9XG5cbiAgaWYgKGxvYykge1xuICAgIHRoaXMubGluZU51bWJlciA9IGxpbmU7XG4gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47XG4gIH1cbn1cblxuRXhjZXB0aW9uLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpO1xuXG5leHBvcnQgZGVmYXVsdCBFeGNlcHRpb247XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/exception.js\n ** module id = 9\n ** module chunks = 0 3\n **/","define(['utils/utils'], function( Utils ) {\nvar View = Backbone.View.extend({\n visible : false,\n initialize : function( options ) {\n var self = this;\n this.options = Utils.merge( options, {\n id : Utils.uid(),\n title : '',\n icon : '',\n buttons : null,\n body : null,\n scrollable : true,\n nopadding : false,\n operations : null,\n placement : 'bottom',\n cls : 'ui-portlet',\n operations_flt : 'right',\n collapsible : false,\n collapsed : false\n });\n this.setElement( this._template( this.options ) );\n\n // link content\n this.$body = this.$( '.portlet-body' );\n this.$title = this.$( '.portlet-title-text' );\n this.$header = this.$( '.portlet-header' );\n this.$content = this.$( '.portlet-content' );\n this.$footer = this.$( '.portlet-footer' );\n\n // set content padding\n if ( this.options.nopadding ) {\n this.$content.css( 'padding', '0px' );\n this.$body.css( 'padding', '0px' );\n }\n\n // append buttons\n this.$buttons = this.$( '.portlet-buttons' );\n if ( this.options.buttons ) {\n $.each( this.options.buttons, function( name, item ) {\n item.$el.prop( 'id', name );\n self.$buttons.append( item.$el );\n });\n } else {\n this.$buttons.remove();\n }\n\n // append operations\n this.$operations = this.$( '.portlet-operations' );\n if ( this.options.operations ) {\n $.each( this.options.operations, function( name, item ) {\n item.$el.prop( 'id', name );\n self.$operations.append( item.$el );\n });\n }\n\n // add body\n this.options.body && this.append( this.options.body );\n\n // make portlet collapsible\n this.collapsed = false;\n if ( this.options.collapsible ) {\n this.$title.addClass( 'no-highlight' ).css({\n 'cursor' : 'pointer',\n 'text-decoration' : 'underline'\n });\n this.$title.on( 'click', function() {\n if ( self.collapsed ) { self.expand(); } else { self.collapse(); }\n });\n this.options.collapsed && this.collapse();\n }\n },\n\n // append\n append: function( $el ) {\n this.$body.append( $el );\n },\n\n // remove all content\n empty: function() {\n this.$body.empty();\n },\n\n // header\n header: function() {\n return this.$header;\n },\n\n // body\n body: function() {\n return this.$body;\n },\n\n // footer\n footer: function() {\n return this.$footer;\n },\n\n // show\n show: function(){\n this.visible = true;\n this.$el.fadeIn( 'fast' );\n },\n\n // hide\n hide: function(){\n this.visible = false;\n this.$el.fadeOut( 'fast' );\n },\n\n // enable buttons\n enableButton: function( id ) {\n this.$buttons.find( '#' + id ).prop( 'disabled', false );\n },\n\n // disable buttons\n disableButton: function( id ) {\n this.$buttons.find( '#' + id ).prop( 'disabled', true );\n },\n\n // hide operation\n hideOperation: function( id ) {\n this.$operations.find( '#' + id ).hide();\n },\n\n // show operation\n showOperation: function( id ) {\n this.$operations.find( '#' + id ).show();\n },\n\n // set operation\n setOperation: function( id, callback ) {\n var $el = this.$operations.find( '#' + id );\n $el.off( 'click' );\n $el.on( 'click', callback );\n },\n\n // title\n title: function( new_title ) {\n var $el = this.$title;\n if ( new_title ) {\n $el.html( new_title );\n }\n return $el.html();\n },\n\n // collapse portlet\n collapse: function() {\n this.collapsed = true;\n this.$content.height( '0%' );\n this.$body.hide();\n this.$footer.hide();\n this.trigger( 'collapsed' );\n },\n\n // expand portlet\n expand: function() {\n this.collapsed = false;\n this.$content.height( '100%' );\n this.$body.fadeIn( 'fast' );\n this.$footer.fadeIn( 'fast' );\n this.trigger( 'expanded' );\n },\n\n // disable content access\n disable: function() {\n this.$( '.portlet-backdrop' ).show();\n },\n\n // enable content access\n enable: function() {\n this.$( '.portlet-backdrop' ).hide();\n },\n\n // fill regular modal template\n _template: function( options ) {\n var tmpl = '
                            ';\n if ( options.title ) {\n tmpl += '
                            ' +\n '
                            ' +\n '
                            ';\n if ( options.icon ) {\n tmpl += ' ';\n }\n tmpl += '' + options.title + '' +\n '
                            ' +\n '
                            ';\n }\n tmpl += '
                            ';\n if ( options.placement == 'top' ) {\n tmpl += '
                            ';\n }\n tmpl += '
                            ';\n if ( options.placement == 'bottom' ) {\n tmpl += '
                            ';\n }\n tmpl += '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ';\n return tmpl;\n }\n});\nreturn {\n View : View\n}\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-portlet.js\n ** module id = 11\n ** module chunks = 0 3\n **/","// Create a simple path alias to allow browserify to resolve\n// the runtime on a supported path.\nmodule.exports = require('./dist/cjs/handlebars.runtime')['default'];\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/runtime.js\n ** module id = 12\n ** module chunks = 0 3\n **/","// Additional dependencies: jQuery, underscore.\ndefine(['mvc/ui/ui-modal', 'mvc/ui/ui-frames', 'mvc/ui/icon-button'], function(Modal, Frames, mod_icon_btn) {\n\n/**\n * Dataset metedata.\n */\nvar DatasetMetadata = Backbone.Model.extend({});\n\n/**\n * A dataset. In Galaxy, datasets are associated with a history, so\n * this object is also known as a HistoryDatasetAssociation.\n */\nvar Dataset = Backbone.Model.extend({\n defaults: {\n id: '',\n type: '',\n name: '',\n hda_ldda: 'hda',\n metadata: null\n },\n\n initialize: function() {\n // Metadata can be passed in as a model or a set of attributes; if it's\n // already a model, there's no need to set metadata.\n if (!this.get('metadata')) {\n this._set_metadata();\n }\n\n // Update metadata on change.\n this.on('change', this._set_metadata, this);\n },\n\n _set_metadata: function() {\n var metadata = new DatasetMetadata();\n\n // Move metadata from dataset attributes to metadata object.\n _.each(_.keys(this.attributes), function(k) {\n if (k.indexOf('metadata_') === 0) {\n // Found metadata.\n var new_key = k.split('metadata_')[1];\n metadata.set(new_key, this.attributes[k]);\n delete this.attributes[k];\n }\n }, this);\n\n // Because this is an internal change, silence it.\n this.set('metadata', metadata, { 'silent': true });\n },\n\n /**\n * Returns dataset metadata for a given attribute.\n */\n get_metadata: function(attribute) {\n return this.attributes.metadata.get(attribute);\n },\n\n urlRoot: Galaxy.root + \"api/datasets\"\n});\n\n/**\n * A tabular dataset. This object extends dataset to provide incremental chunked data.\n */\nvar TabularDataset = Dataset.extend({\n defaults: _.extend({}, Dataset.prototype.defaults, {\n chunk_url: null,\n first_data_chunk: null,\n chunk_index: -1,\n at_eof: false\n }),\n\n initialize: function(options) {\n Dataset.prototype.initialize.call(this);\n\n // If first data chunk is available, next chunk is 1.\n this.attributes.chunk_index = (this.attributes.first_data_chunk ? 1 : 0);\n this.attributes.chunk_url = Galaxy.root + 'dataset/display?dataset_id=' + this.id;\n this.attributes.url_viz = Galaxy.root + 'visualization';\n },\n\n /**\n * Returns a jQuery Deferred object that resolves to the next data chunk or null if at EOF.\n */\n get_next_chunk: function() {\n // If already at end of file, do nothing.\n if (this.attributes.at_eof) {\n return null;\n }\n\n // Get next chunk.\n var self = this,\n next_chunk = $.Deferred();\n $.getJSON(this.attributes.chunk_url, {\n chunk: self.attributes.chunk_index++\n }).success(function(chunk) {\n var rval;\n if (chunk.ck_data !== '') {\n // Found chunk.\n rval = chunk;\n }\n else {\n // At EOF.\n self.attributes.at_eof = true;\n rval = null;\n }\n next_chunk.resolve(rval);\n });\n\n return next_chunk;\n }\n});\n\nvar DatasetCollection = Backbone.Collection.extend({\n model: Dataset\n});\n\n/**\n * Provides a base for table-based, dynamic view of a tabular dataset.\n * Do not instantiate directly; use either TopLevelTabularDatasetChunkedView\n * or EmbeddedTabularDatasetChunkedView.\n */\nvar TabularDatasetChunkedView = Backbone.View.extend({\n\n /**\n * Initialize view and, importantly, set a scroll element.\n */\n initialize: function(options) {\n // Row count for rendering.\n this.row_count = 0;\n this.loading_chunk = false;\n\n // load trackster button\n new TabularButtonTracksterView({\n model : options.model,\n $el : this.$el\n });\n },\n\n expand_to_container: function(){\n if (this.$el.height() < this.scroll_elt.height()){\n this.attempt_to_fetch();\n }\n },\n\n attempt_to_fetch: function( func ){\n var self = this;\n if ( !this.loading_chunk && this.scrolled_to_bottom() ) {\n this.loading_chunk = true;\n this.loading_indicator.show();\n $.when(self.model.get_next_chunk()).then(function(result) {\n if (result) {\n self._renderChunk(result);\n self.loading_chunk = false;\n }\n self.loading_indicator.hide();\n self.expand_to_container();\n });\n }\n },\n\n render: function() {\n // Add loading indicator.\n this.loading_indicator = $('
                            ').attr('id', 'loading_indicator');\n this.$el.append(this.loading_indicator);\n\n // Add data table and header.\n var data_table = $('').attr({\n id: 'content_table',\n cellpadding: 0\n });\n this.$el.append(data_table);\n var column_names = this.model.get_metadata('column_names'),\n header_container = $('').appendTo(data_table),\n header_row = $('').appendTo(header_container);\n if (column_names) {\n header_row.append('');\n } else {\n for (var j = 1; j <= this.model.get_metadata('columns'); j++) {\n header_row.append('');\n }\n }\n\n // Render first chunk.\n var self = this,\n first_chunk = this.model.get('first_data_chunk');\n if (first_chunk) {\n // First chunk is bootstrapped, so render now.\n this._renderChunk(first_chunk);\n }\n else {\n // No bootstrapping, so get first chunk and then render.\n $.when(self.model.get_next_chunk()).then(function(result) {\n self._renderChunk(result);\n });\n }\n\n // -- Show new chunks during scrolling. --\n\n // Set up chunk loading when scrolling using the scrolling element.\n this.scroll_elt.scroll(function(){\n self.attempt_to_fetch();\n });\n },\n\n /**\n * Returns true if user has scrolled to the bottom of the view.\n */\n scrolled_to_bottom: function() {\n return false;\n },\n\n // -- Helper functions. --\n\n _renderCell: function(cell_contents, index, colspan) {\n var $cell = $(''),\n num_columns = this.model.get_metadata('columns');\n\n if (this.row_count % 2 !== 0) {\n row.addClass('dark_row');\n }\n\n if (cells.length === num_columns) {\n _.each(cells, function(cell_contents, index) {\n row.append(this._renderCell(cell_contents, index));\n }, this);\n }\n else if (cells.length > num_columns) {\n // SAM file or like format with optional metadata included.\n _.each(cells.slice(0, num_columns - 1), function(cell_contents, index) {\n row.append(this._renderCell(cell_contents, index));\n }, this);\n row.append(this._renderCell(cells.slice(num_columns - 1).join('\\t'), num_columns - 1));\n }\n else if (num_columns > 5 && cells.length === num_columns - 1 ) {\n // SAM file or like format with optional metadata missing.\n _.each(cells, function(cell_contents, index) {\n row.append(this._renderCell(cell_contents, index));\n }, this);\n row.append($('');\n wrapper.append($el);\n this.row.append(wrapper);\n },\n \n // header\n appendHeader: function() {\n // append header row\n this.$thead.append(this.row);\n\n // row\n this.row = $('');\n },\n \n // add row cell\n add: function($el, width, align) {\n var wrapper = $('');\n if (width) {\n wrapper.css('width', width);\n }\n if (align) {\n wrapper.css('text-align', align);\n }\n wrapper.append($el);\n this.row.append(wrapper);\n },\n \n // append\n append: function(id, fade) {\n this._commit(id, fade, false);\n },\n \n // prepend\n prepend: function(id, fade) {\n this._commit(id, fade, true);\n },\n \n // get element\n get: function(id) {\n return this.$el.find('#' + id);\n },\n \n // delete\n del: function(id) {\n var item = this.$tbody.find('#' + id);\n if (item.length > 0) {\n item.remove();\n this.row_count--;\n this._refresh();\n }\n },\n\n // delete all\n delAll: function() {\n this.$tbody.empty();\n this.row_count = 0;\n this._refresh();\n },\n \n // value\n value: function(new_value) {\n // get current id/value\n this.before = this.$tbody.find('.current').attr('id');\n \n // check if new_value is defined\n if (new_value !== undefined) {\n this.$tbody.find('tr').removeClass('current');\n if (new_value) {\n this.$tbody.find('#' + new_value).addClass('current');\n }\n }\n \n // get current id/value\n var after = this.$tbody.find('.current').attr('id');\n if(after === undefined) {\n return null;\n } else {\n // fire onchange\n if (after != this.before && this.options.onchange) {\n this.options.onchange(new_value);\n }\n \n // return current value\n return after;\n }\n },\n \n // size\n size: function() {\n return this.$tbody.find('tr').length;\n },\n \n // commit\n _commit: function(id, fade, prepend) {\n // remove previous item with same id\n this.del(id);\n \n // add\n this.row.attr('id', id);\n \n // add row\n if (prepend) {\n this.$tbody.prepend(this.row);\n } else {\n this.$tbody.append(this.row);\n }\n \n // fade mode\n if (fade) {\n this.row.hide();\n this.row.fadeIn();\n }\n \n // row\n this.row = this._row();\n \n // row count\n this.row_count++;\n this._refresh();\n },\n \n // create new row\n _row: function() {\n return $('');\n },\n \n // onclick\n _onclick: function(e) {\n // get values\n var old_value = this.value();\n var new_value = $(e.target).closest('tr').attr('id');\n if (new_value != ''){\n // check equality\n if (new_value && old_value != new_value) {\n if (this.options.onconfirm) {\n this.options.onconfirm(new_value);\n } else {\n this.value(new_value);\n }\n }\n }\n },\n\n // ondblclick\n _ondblclick: function(e) {\n var value = this.value();\n if (value && this.options.ondblclick) {\n this.options.ondblclick(value);\n }\n },\n \n // refresh\n _refresh: function() {\n if (this.row_count == 0) {\n this.$tmessage.show();\n } else {\n this.$tmessage.hide();\n }\n },\n \n // load html template\n _template: function(options) {\n return '
                            ' +\n '
                            ' + column_names.join('') + '' + j + '').text(cell_contents);\n var column_types = this.model.get_metadata('column_types');\n if (colspan !== undefined) {\n $cell.attr('colspan', colspan).addClass('stringalign');\n } else if (column_types) {\n if (index < column_types.length) {\n if (column_types[index] === 'str' || column_types[index] === 'list') {\n /* Left align all str columns, right align the rest */\n $cell.addClass('stringalign');\n }\n }\n }\n return $cell;\n },\n\n _renderRow: function(line) {\n // Check length of cells to ensure this is a complete row.\n var cells = line.split('\\t'),\n row = $('
                            '));\n }\n else {\n // Comment line, just return the one cell.\n row.append(this._renderCell(line, 0, num_columns));\n }\n\n this.row_count++;\n return row;\n },\n\n _renderChunk: function(chunk) {\n var data_table = this.$el.find('table');\n _.each(chunk.ck_data.split('\\n'), function(line, index) {\n if (line !== ''){\n data_table.append(this._renderRow(line));\n }\n }, this);\n }\n});\n\n/**\n * Tabular view that is placed at the top level of page. Scrolling occurs\n * view top-level elements outside of view.\n */\nvar TopLevelTabularDatasetChunkedView = TabularDatasetChunkedView.extend({\n\n initialize: function(options) {\n TabularDatasetChunkedView.prototype.initialize.call(this, options);\n\n // Scrolling happens in top-level elements.\n scroll_elt = _.find(this.$el.parents(), function(p) {\n return $(p).css('overflow') === 'auto';\n });\n\n // If no scrolling element found, use window.\n if (!scroll_elt) { scroll_elt = window; }\n\n // Wrap scrolling element for easy access.\n this.scroll_elt = $(scroll_elt);\n },\n\n /**\n * Returns true if user has scrolled to the bottom of the view.\n */\n scrolled_to_bottom: function() {\n return (this.$el.height() - this.scroll_elt.scrollTop() - this.scroll_elt.height() <= 0);\n }\n\n});\n\n/**\n * Tabular view tnat is embedded in a page. Scrolling occurs in view's el.\n */\nvar EmbeddedTabularDatasetChunkedView = TabularDatasetChunkedView.extend({\n\n initialize: function(options) {\n TabularDatasetChunkedView.prototype.initialize.call(this, options);\n\n // Because view is embedded, set up div to do scrolling.\n this.scroll_elt = this.$el.css({\n position: 'relative',\n overflow: 'scroll',\n height: options.height || '500px'\n });\n },\n\n /**\n * Returns true if user has scrolled to the bottom of the view.\n */\n scrolled_to_bottom: function() {\n return this.$el.scrollTop() + this.$el.innerHeight() >= this.el.scrollHeight;\n }\n\n});\n\n// button for trackster visualization\nvar TabularButtonTracksterView = Backbone.View.extend({\n\n // gene region columns\n col: {\n chrom : null,\n start : null,\n end : null\n },\n\n // url for trackster\n url_viz : null,\n\n // dataset id\n dataset_id : null,\n\n // database key\n genome_build: null,\n\n // data type\n file_ext : null,\n\n // backbone initialize\n initialize: function (options) {\n // check if environment is available\n var Galaxy = parent.Galaxy;\n\n // link galaxy modal or create one\n if (Galaxy && Galaxy.modal) {\n this.modal = Galaxy.modal;\n }\n\n // link galaxy frames\n if (Galaxy && Galaxy.frame) {\n this.frame = Galaxy.frame;\n }\n\n // check\n if (!this.modal || !this.frame) {\n return;\n }\n\n // model/metadata\n var model = options.model;\n var metadata = model.get('metadata');\n\n // check for datatype\n if (!model.get('file_ext')) {\n return;\n }\n\n // get data type\n this.file_ext = model.get('file_ext');\n\n // check for bed-file format\n if (this.file_ext == 'bed')\n {\n // verify that metadata exists\n if (metadata.get('chromCol') && metadata.get('startCol') && metadata.get('endCol'))\n {\n // read in columns\n this.col.chrom = metadata.get('chromCol') - 1;\n this.col.start = metadata.get('startCol') - 1;\n this.col.end = metadata.get('endCol') - 1;\n } else {\n console.log('TabularButtonTrackster : Bed-file metadata incomplete.');\n return;\n }\n }\n\n // check for vcf-file format\n if (this.file_ext == 'vcf')\n {\n // search array\n function search (str, array) {\n for (var j = 0; j < array.length; j++)\n if (array[j].match(str)) return j;\n return -1;\n };\n\n // load\n this.col.chrom = search('Chrom', metadata.get('column_names'));\n this.col.start = search('Pos', metadata.get('column_names'));\n this.col.end = null;\n\n // verify that metadata exists\n if (this.col.chrom == -1 || this.col.start == -1) {\n console.log('TabularButtonTrackster : VCF-file metadata incomplete.');\n return;\n }\n }\n\n // check\n if(this.col.chrom === undefined) {\n return;\n }\n\n // get dataset id\n if (model.id) {\n this.dataset_id = model.id;\n } else {\n console.log('TabularButtonTrackster : Dataset identification is missing.');\n return;\n }\n\n // get url\n if (model.get('url_viz')) {\n this.url_viz = model.get('url_viz');\n } else {\n console.log('TabularButtonTrackster : Url for visualization controller is missing.');\n return;\n }\n\n // get genome_build / database key\n if (model.get('genome_build')) {\n this.genome_build = model.get('genome_build');\n }\n\n // create the icon\n var btn_viz = new mod_icon_btn.IconButtonView({\n model : new mod_icon_btn.IconButton({\n title : 'Visualize',\n icon_class : 'chart_curve',\n id : 'btn_viz'\n })\n });\n\n // set element\n this.setElement(options.$el);\n\n // add to element\n this.$el.append(btn_viz.render().$el);\n\n // hide the button\n this.hide();\n },\n\n // backbone events\n events:\n {\n 'mouseover tr' : 'show',\n 'mouseleave' : 'hide'\n },\n\n // show button\n show: function (e) {\n // is numeric\n function is_numeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n };\n\n // check\n if(this.col.chrom === null)\n return;\n\n // get selected data line\n var row = $(e.target).parent();\n\n // verify that location has been found\n var chrom = row.children().eq(this.col.chrom).html();\n var start = row.children().eq(this.col.start).html();\n\n // end is optional\n var end = this.col.end ? row.children().eq(this.col.end).html() : start;\n\n // double check location\n if (!chrom.match(\"^#\") && chrom !== \"\" && is_numeric(start)) {\n\n // get target gene region\n var btn_viz_pars = {\n dataset_id : this.dataset_id,\n gene_region : chrom + \":\" + start + \"-\" + end\n };\n\n // get button position\n var offset = row.offset();\n var left = offset.left - 10;\n var top = offset.top - $(window).scrollTop() + 3;\n\n // update css\n $('#btn_viz').css({'position': 'fixed', 'top': top + 'px', 'left': left + 'px'});\n $('#btn_viz').off('click');\n $('#btn_viz').click(this.create_trackster_action(this.url_viz, btn_viz_pars, this.genome_build));\n\n // show the button\n $('#btn_viz').show();\n } else {\n // hide the button\n $('#btn_viz').hide();\n }\n },\n\n // hide button\n hide: function () {\n this.$el.find('#btn_viz').hide();\n },\n\n // create action\n create_trackster_action : function (vis_url, dataset_params, dbkey) {\n // link this\n var self = this;\n\n // create function\n return function() {\n var listTracksParams = {};\n if (dbkey) {\n listTracksParams[ 'f-dbkey' ] = dbkey;\n }\n $.ajax({\n url: vis_url + '/list_tracks?' + $.param( listTracksParams ),\n dataType: 'html',\n error: function() {\n // show error message\n self.modal.show({\n title : 'Something went wrong!',\n body : 'Unfortunately we could not add this dataset to the track browser. Please try again or contact us.',\n buttons : {\n 'Cancel': function(){\n self.modal.hide();\n }\n }\n });\n },\n success: function(table_html) {\n self.modal.show({\n title : 'View Data in a New or Saved Visualization',\n buttons :{\n 'Cancel': function(){\n self.modal.hide();\n },\n 'View in saved visualization': function(){\n // show modal with saved visualizations\n self.modal.show(\n {\n title : 'Add Data to Saved Visualization',\n body : table_html,\n buttons : {\n 'Cancel': function(){\n self.modal.hide();\n },\n 'Add to visualization': function(){\n // hide\n self.modal.hide();\n\n // search selected fields\n self.modal.$el.find('input[name=id]:checked').each(function(){\n // get visualization id\n var vis_id = $(this).val();\n dataset_params.id = vis_id;\n\n // add widget\n self.frame.add({\n title : 'Trackster',\n type : 'url',\n content : vis_url + '/trackster?' + $.param(dataset_params)\n });\n });\n }\n }\n });\n },\n 'View in new visualization': function(){\n // hide\n self.modal.hide();\n\n // add widget\n self.frame.add({\n title : 'Trackster',\n type : 'url',\n content : vis_url + '/trackster?' + $.param(dataset_params)\n });\n }\n }\n });\n }\n });\n return false;\n };\n }\n});\n\n// -- Utility functions. --\n\n/**\n * Create a model, attach it to a view, render view, and attach it to a parent element.\n */\nvar createModelAndView = function(model, view, model_config, parent_elt) {\n // Create model, view.\n var a_view = new view({\n model: new model(model_config)\n });\n\n // Render view and add to parent element.\n a_view.render();\n if (parent_elt) {\n parent_elt.append(a_view.$el);\n }\n\n return a_view;\n};\n\n/**\n * Create a tabular dataset chunked view (and requisite tabular dataset model)\n * and appends to parent_elt.\n */\nvar createTabularDatasetChunkedView = function(options) {\n // If no model, create and set model from dataset config.\n if (!options.model) {\n options.model = new TabularDataset(options.dataset_config);\n }\n\n var parent_elt = options.parent_elt;\n var embedded = options.embedded;\n\n // Clean up options so that only needed options are passed to view.\n delete options.embedded;\n delete options.parent_elt;\n delete options.dataset_config;\n\n // Create and set up view.\n var view = (embedded ? new EmbeddedTabularDatasetChunkedView(options) :\n new TopLevelTabularDatasetChunkedView(options));\n view.render();\n\n if (parent_elt) {\n parent_elt.append(view.$el);\n // If we're sticking this in another element, once it's appended check\n // to make sure we've filled enough space.\n // Without this, the scroll elements don't work.\n view.expand_to_container();\n }\n\n return view;\n};\n\nreturn {\n Dataset: Dataset,\n TabularDataset: TabularDataset,\n DatasetCollection: DatasetCollection,\n TabularDatasetChunkedView: TabularDatasetChunkedView,\n createTabularDatasetChunkedView: createTabularDatasetChunkedView\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/data.js\n ** module id = 14\n ** module chunks = 0 1 3\n **/","define([\n], function(){\n//==============================================================================\n/** Map of possible HDA/collection/job states to their string equivalents.\n * A port of galaxy.model.Dataset.states.\n */\nvar STATES = {\n // NOT ready states\n /** is uploading and not ready */\n UPLOAD : 'upload',\n /** the job that will produce the dataset queued in the runner */\n QUEUED : 'queued',\n /** the job that will produce the dataset is running */\n RUNNING : 'running',\n /** metadata for the dataset is being discovered/set */\n SETTING_METADATA : 'setting_metadata',\n\n // ready states\n /** was created without a tool */\n NEW : 'new',\n /** has no data */\n EMPTY : 'empty',\n /** has successfully completed running */\n OK : 'ok',\n\n /** the job that will produce the dataset paused */\n PAUSED : 'paused',\n /** metadata discovery/setting failed or errored (but otherwise ok) */\n FAILED_METADATA : 'failed_metadata',\n//TODO: not in trans.app.model.Dataset.states - is in database\n /** not accessible to the current user (i.e. due to permissions) */\n NOT_VIEWABLE : 'noPermission',\n /** deleted while uploading */\n DISCARDED : 'discarded',\n /** the tool producing this dataset failed */\n ERROR : 'error'\n};\n\nSTATES.READY_STATES = [\n STATES.OK,\n STATES.EMPTY,\n STATES.PAUSED,\n STATES.FAILED_METADATA,\n STATES.NOT_VIEWABLE,\n STATES.DISCARDED,\n STATES.ERROR\n];\n\nSTATES.NOT_READY_STATES = [\n STATES.UPLOAD,\n STATES.QUEUED,\n STATES.RUNNING,\n STATES.SETTING_METADATA,\n STATES.NEW\n];\n\n\n//==============================================================================\n return STATES;\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/states.js\n ** module id = 15\n ** module chunks = 3\n **/","/** This class contains all button views.\n*/\ndefine(['utils/utils'], function( Utils ) {\n /** This renders the default button which is used e.g. at the bottom of the upload modal.\n */\n var ButtonBase = Backbone.View.extend({\n initialize: function( options ) {\n this.options = Utils.merge( options, {\n id : Utils.uid(),\n title : '',\n floating : 'right',\n icon : '',\n cls : 'ui-button btn btn-default',\n cls_wait : 'btn btn-info'\n } );\n this.setElement( this._template( this.options ) );\n var self = this;\n $( this.el ).on( 'click' , function() {\n $( '.tooltip' ).hide();\n if ( options.onclick && !self.disabled ) {\n options.onclick();\n }\n } );\n $( this.el ).tooltip( { title: options.tooltip, placement: 'bottom' } );\n },\n\n // disable\n disable: function() {\n this.$el.addClass( 'disabled' );\n this.disabled = true;\n },\n\n // enable\n enable: function() {\n this.$el.removeClass( 'disabled' );\n this.disabled = false;\n },\n\n // show spinner\n wait: function() {\n this.$el.removeClass( this.options.cls ).addClass( this.options.cls_wait ).prop( 'disabled', true );\n this.$( '.icon' ).removeClass( this.options.icon ).addClass( 'fa-spinner fa-spin' );\n this.$( '.title' ).html( 'Sending...' );\n },\n\n // hide spinner\n unwait: function() {\n this.$el.removeClass( this.options.cls_wait ).addClass( this.options.cls ).prop( 'disabled', false );\n this.$( '.icon' ).removeClass( 'fa-spinner fa-spin' ).addClass( this.options.icon );\n this.$( '.title' ).html( this.options.title );\n },\n\n // template\n _template: function( options ) {\n var str = '';\n return str;\n }\n });\n\n /** This button allows the right-click/open-in-new-tab feature, its used e.g. for panel buttons.\n */\n var ButtonLink = ButtonBase.extend({\n initialize: function( options ) {\n ButtonBase.prototype.initialize.call( this, options );\n },\n _template: function( options ) {\n return '' + '' +\n '';\n }\n });\n\n /** The check button is used in the tool form and allows to distinguish between multiple states e.g. all, partially and nothing selected.\n */\n var ButtonCheck = Backbone.View.extend({\n initialize: function( options ) {\n // configure options\n this.options = Utils.merge(options, {\n title : 'Select/Unselect all',\n icons : ['fa fa-square-o', 'fa fa-minus-square-o', 'fa fa-check-square-o'],\n value : 0\n });\n\n // create new element\n this.setElement( this._template() );\n this.$title = this.$( '.title' );\n this.$icon = this.$( '.icon' );\n\n // set initial value\n this.value( this.options.value );\n\n // set title\n this.$title.html( this.options.title );\n\n // add event handler\n var self = this;\n this.$el.on('click', function() {\n self.current = ( self.current === 0 && 2 ) || 0;\n self.value( self.current );\n self.options.onclick && self.options.onclick();\n });\n },\n\n /* Sets a new value and/or returns the current value.\n * @param{Integer} new_val - Set a new value 0=unchecked, 1=partial and 2=checked.\n * OR:\n * @param{Integer} new_val - Number of selected options.\n * @param{Integer} total - Total number of available options.\n */\n value: function ( new_val, total ) {\n if ( new_val !== undefined ) {\n if ( total ) {\n if ( new_val !== 0 ) {\n new_val = ( new_val !== total ) && 1 || 2;\n }\n }\n this.current = new_val;\n this.$icon.removeClass()\n .addClass( 'icon' )\n .addClass( this.options.icons[ new_val ] );\n this.options.onchange && this.options.onchange( new_val );\n }\n return this.current;\n },\n\n /** Template containing the check button and the title\n */\n _template: function() {\n return '
                            ' +\n '' +\n '' +\n '
                            ';\n }\n });\n\n /** This renders a differently styled, more compact button version.\n TODO: Consolidate with icon-button.js and/or button-default.js.\n */\n var ButtonIcon = Backbone.View.extend({\n initialize : function( options ) {\n // get options\n this.options = Utils.merge( options, {\n id : Utils.uid(),\n title : '',\n floating : 'right',\n cls : 'ui-button-icon',\n icon : '',\n tooltip : '',\n onclick : null\n });\n\n // create new element\n this.setElement( this._template( this.options ) );\n\n // link button element\n this.$button = this.$el.find( '.button' );\n\n // add event\n var self = this;\n $(this.el).on('click', function() {\n // hide all tooltips\n $( '.tooltip' ).hide();\n\n // execute onclick callback\n if ( options.onclick && !self.disabled ) {\n options.onclick();\n }\n });\n\n // add tooltip\n this.$button.tooltip( { title: options.tooltip, placement: 'bottom' } );\n },\n\n // disable\n disable: function() {\n this.$button.addClass( 'disabled' );\n this.disabled = true;\n },\n\n // enable\n enable: function() {\n this.$button.removeClass( 'disabled' );\n this.disabled = false;\n },\n\n // change icon\n setIcon: function(icon_cls) {\n this.$('i').removeClass( this.options.icon ).addClass( icon_cls );\n this.options.icon = icon_cls;\n },\n\n // template\n _template: function( options ) {\n // width\n var width = '';\n if ( options.title ) {\n width = 'width: auto;';\n }\n\n // string\n var str = '
                            ' +\n '
                            ';\n if (options.title) {\n str += ' ' +\n '' + options.title + '';\n } else {\n str += '';\n }\n str += '
                            ' +\n '
                            ';\n return str;\n }\n });\n\n /** This class creates a button with dropdown menu. It extends the functionality of the Ui.ButtonIcon class.\n TODO: Consolidate class, use common base class\n */\n var ButtonMenu = Backbone.View.extend({\n // optional sub menu\n $menu: null,\n\n // initialize\n initialize: function ( options ) {\n // get options\n this.options = Utils.merge( options, {\n // same as Ui.ButtonIcon\n id : '',\n title : '',\n floating : 'right',\n pull : 'right',\n icon : null,\n onclick : null,\n cls : 'ui-button-icon ui-button-menu',\n tooltip : '',\n \n // additional options\n target : '',\n href : '',\n onunload : null,\n visible : true,\n tag : ''\n } );\n\n // add template for tab\n this.setElement( $( this._template( this.options ) ) );\n\n // find root\n var $root = $( this.el ).find( '.root' );\n\n // link head\n var self = this;\n $root.on( 'click', function( e ) {\n // hide all tooltips\n $( '.tooltip' ).hide();\n\n // prevent default\n e.preventDefault();\n\n // add click event\n if( self.options.onclick ) {\n self.options.onclick();\n }\n });\n\n // visiblity\n if ( !this.options.visible )\n this.hide();\n\n // add tooltip\n $root.tooltip( { title: options.tooltip, placement: 'bottom' } );\n },\n\n // show\n show: function() {\n $( this.el ).show();\n },\n\n // hide\n hide: function() {\n $( this.el ).hide();\n },\n\n // add menu item\n addMenu: function ( options ) {\n // menu option defaults\n var menuOptions = {\n title : '',\n target : '',\n href : '',\n onclick : null,\n divider : false,\n icon : null,\n cls : 'button-menu btn-group'\n }\n\n // get options\n menuOptions = Utils.merge( options, menuOptions );\n\n // check if submenu element is available\n if ( !this.$menu ) {\n // insert submenu element into root\n $( this.el ).append( this._templateMenu() );\n\n // update element link\n this.$menu = $( this.el ).find( '.menu' );\n }\n\n // create\n var $item = $( this._templateMenuItem( menuOptions ) );\n\n // add events\n $item.on( 'click', function( e ) {\n if( menuOptions.onclick ) {\n e.preventDefault();\n menuOptions.onclick();\n }\n });\n\n // append menu\n this.$menu.append( $item );\n\n // append divider\n if ( menuOptions.divider ) {\n this.$menu.append( $( this._templateDivider() ) );\n }\n },\n\n // fill template header\n _templateMenuItem: function ( options ) {\n var tmpl = '
                          1. ' +\n '';\n }\n tmpl += ' ' + options.title +\n '' +\n '
                          2. ';\n return tmpl;\n },\n\n // fill template header\n _templateMenu: function () {\n return '
                              ';\n },\n\n _templateDivider: function() {\n return '
                            • ';\n },\n\n // element\n _template: function(options) {\n // TODO: width/margin should be set in css\n var width = '';\n var margin = '';\n if ( options.title ) {\n width = 'width: auto;';\n } else {\n margin = 'margin: 0px;';\n }\n var str = '
                              ' +\n '
                              ' +\n '';\n if ( options.title ) {\n str += ' ' + options.title + '';\n }\n str += '
                              ' +\n '
                              ';\n return str;\n }\n });\n\n return {\n ButtonDefault : ButtonBase,\n ButtonLink : ButtonLink,\n ButtonIcon : ButtonIcon,\n ButtonCheck : ButtonCheck,\n ButtonMenu : ButtonMenu\n }\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-buttons.js\n ** module id = 16\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils'], function(Utils) {\n\n/**\n * This class creates a ui table element.\n */\nvar View = Backbone.View.extend({\n // current row\n row: null,\n \n // count rows\n row_count: 0,\n \n // defaults options\n optionsDefault: {\n content : 'No content available.',\n onchange : null,\n ondblclick : null,\n onconfirm : null,\n cls : 'ui-table',\n cls_tr : ''\n },\n \n // events\n events : {\n 'click' : '_onclick',\n 'dblclick' : '_ondblclick'\n },\n \n // initialize\n initialize : function(options) {\n // configure options\n this.options = Utils.merge(options, this.optionsDefault);\n \n // create new element\n var $el = $(this._template(this.options));\n \n // link sub-elements\n this.$thead = $el.find('thead');\n this.$tbody = $el.find('tbody');\n this.$tmessage = $el.find('tmessage');\n \n // set element\n this.setElement($el);\n \n // initialize row\n this.row = this._row();\n },\n \n // add header cell\n addHeader: function($el) {\n var wrapper = $('
                            ' +\n '' +\n '' +\n '
                            ' +\n '' + options.content + '' +\n '
                            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-table.js\n ** module id = 17\n ** module chunks = 0 3\n **/","define([\n //jquery\n //backbone\n], function(){\n//=============================================================================\n/**\n * backbone model for icon buttons\n */\nvar IconButton = Backbone.Model.extend({\n defaults: {\n title : \"\",\n icon_class : \"\",\n on_click : null,\n menu_options : null,\n is_menu_button : true,\n id : null,\n href : null,\n target : null,\n enabled : true,\n visible : true,\n tooltip_config : {}\n }\n});\n\n/**\n * backbone view for icon buttons\n */\nvar IconButtonView = Backbone.View.extend({\n\n initialize : function(){\n // better rendering this way\n this.model.attributes.tooltip_config = { placement : 'bottom' };\n this.model.bind( 'change', this.render, this );\n },\n\n render : function( ){\n // hide tooltip\n this.$el.tooltip( 'hide' );\n\n var new_elem = this.template( this.model.toJSON() );\n // configure tooltip\n new_elem.tooltip( this.model.get( 'tooltip_config' ));\n this.$el.replaceWith( new_elem );\n this.setElement( new_elem );\n return this;\n },\n\n events : {\n 'click' : 'click'\n },\n\n click : function( event ){\n // if on_click pass to that function\n if( _.isFunction( this.model.get( 'on_click' ) ) ){\n this.model.get( 'on_click' )( event );\n return false;\n }\n // otherwise, bubble up ( to href or whatever )\n return true;\n },\n\n // generate html element\n template: function( options ){\n var buffer = 'title=\"' + options.title + '\" class=\"icon-button';\n\n if( options.is_menu_button ){\n buffer += ' menu-button';\n }\n\n buffer += ' ' + options.icon_class;\n\n if( !options.enabled ){\n buffer += '_disabled';\n }\n\n // close class tag\n buffer += '\"';\n\n if( options.id ){\n buffer += ' id=\"' + options.id + '\"';\n }\n\n buffer += ' href=\"' + options.href + '\"';\n // add target for href\n if( options.target ){\n buffer += ' target=\"' + options.target + '\"';\n }\n // set visibility\n if( !options.visible ){\n buffer += ' style=\"display: none;\"';\n }\n\n // enabled/disabled\n if ( options.enabled ){\n buffer = '';\n } else {\n buffer = '';\n }\n\n // return element\n return $( buffer );\n }\n} );\n\n// define collection\nvar IconButtonCollection = Backbone.Collection.extend({\n model: IconButton\n});\n\n/**\n * menu with multiple icon buttons\n * views are not needed nor used for individual buttons\n */\nvar IconButtonMenuView = Backbone.View.extend({\n\n tagName: 'div',\n\n initialize: function(){\n this.render();\n },\n\n render: function(){\n // initialize icon buttons\n var self = this;\n this.collection.each(function(button){\n // create and add icon button to menu\n var elt = $('')\n .attr('href', 'javascript:void(0)')\n .attr('title', button.attributes.title)\n .addClass('icon-button menu-button')\n .addClass(button.attributes.icon_class)\n .appendTo(self.$el)\n .click(button.attributes.on_click);\n\n // configure tooltip\n if (button.attributes.tooltip_config){\n elt.tooltip(button.attributes.tooltip_config);\n }\n\n // add popup menu to icon\n var menu_options = button.get('options');\n if (menu_options){\n make_popupmenu(elt, menu_options);\n }\n });\n\n // return\n return this;\n }\n});\n\n/**\n * Returns an IconButtonMenuView for the provided configuration.\n * Configuration is a list of dictionaries where each dictionary\n * defines an icon button. Each dictionary must have the following\n * elements: icon_class, title, and on_click.\n */\nvar create_icon_buttons_menu = function(config, global_config)\n{\n // initialize global configuration\n if (!global_config) global_config = {};\n\n // create and initialize menu\n var buttons = new IconButtonCollection(\n _.map(config, function(button_config){\n return new IconButton(_.extend(button_config, global_config));\n })\n );\n\n // return menu\n return new IconButtonMenuView( {collection: buttons} );\n};\n\n\n//=============================================================================\n return {\n IconButton : IconButton,\n IconButtonView : IconButtonView,\n IconButtonCollection : IconButtonCollection,\n IconButtonMenuView : IconButtonMenuView,\n create_icon_buttons_menu: create_icon_buttons_menu\n };\n})\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/icon-button.js\n ** module id = 18\n ** module chunks = 0 1 3\n **/","// from: https://raw.githubusercontent.com/umdjs/umd/master/jqueryPlugin.js\n// Uses AMD or browser globals to create a jQuery plugin.\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n //TODO: So...this turns out to be an all or nothing thing. If I load jQuery in the define below, it will\n // (of course) wipe the old jquery *and all the plugins loaded into it*. So the define below *is still\n // relying on jquery being loaded globally* in order to preserve plugins.\n define([ 'jquery' ], factory);\n } else {\n // Browser globals\n factory(jQuery);\n }\n\n}(function ( jQuery ) {\n'use_strict';\n\nvar $ = jQuery;\n\n// ============================================================================\n/**\n * Make an element with text editable: (a) when user clicks on text, a textbox/area\n * is provided for editing; (b) when enter key pressed, element's text is set and on_finish\n * is called.\n */\n$.fn.make_text_editable = function(config_dict) {\n // Get config options.\n var num_cols = (\"num_cols\" in config_dict ? config_dict.num_cols : 30),\n num_rows = (\"num_rows\" in config_dict ? config_dict.num_rows : 4),\n use_textarea = (\"use_textarea\" in config_dict ? config_dict.use_textarea : false),\n on_finish = (\"on_finish\" in config_dict ? config_dict.on_finish : null),\n help_text = (\"help_text\" in config_dict ? config_dict.help_text : null);\n\n // Add element behavior.\n var container = $(this);\n container.addClass(\"editable-text\").click(function(e) {\n // If there's already an input element, editing is active, so do nothing.\n if ($(this).children(\":input\").length > 0) {\n return;\n }\n\n container.removeClass(\"editable-text\");\n\n // Handler for setting element text.\n var set_text = function(new_text) {\n container.find(\":input\").remove();\n\n if (new_text !== \"\") {\n container.text(new_text);\n } else {\n // No text; need a line so that there is a click target.\n container.html(\"
                            \");\n }\n container.addClass(\"editable-text\");\n\n if (on_finish) {\n on_finish(new_text);\n }\n };\n\n // Create input element(s) for editing.\n var cur_text = (\"cur_text\" in config_dict ? config_dict.cur_text : container.text() ),\n input_elt, button_elt;\n\n if (use_textarea) {\n input_elt = $(\"' +\n '
                            ';\n },\n\n requirements: function(options) {\n var requirements_message = 'This tool requires ';\n for (var i in options.requirements) {\n var req = options.requirements[i];\n requirements_message += req.name;\n if (req.version) {\n requirements_message += ' (Version ' + req.version + ')';\n }\n if (i < options.requirements.length - 2) {\n requirements_message += ', ';\n }\n if (i == options.requirements.length - 2) {\n requirements_message += ' and ';\n }\n }\n return requirements_message + '. Click here for more information.';\n }\n};\n\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/tool/tool-template.js\n ** module id = 23\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-portlet', 'mvc/ui/ui-misc'], function(Utils, Portlet, Ui) {\n\n// ui list element\nvar View = Backbone.View.extend({\n // create portlet to keep track of selected list elements\n initialize : function(options) {\n // link this\n var self = this;\n\n // initialize options\n this.options = options;\n this.name = options.name || 'element';\n this.multiple = options.multiple || false;\n\n // create message handler\n this.message = new Ui.Message({ cls: 'ui-margin-top' });\n\n // create portlet\n this.portlet = new Portlet.View({ cls: 'ui-portlet-section' });\n\n // create select field containing the options which can be inserted into the list\n this.select = new Ui.Select.View({ optional : options.optional });\n\n // create insert new list element button\n this.button = new Ui.ButtonIcon({\n icon : 'fa fa-sign-in',\n floating : 'left',\n tooltip : 'Insert new ' + this.name,\n onclick : function() {\n self.add({\n id : self.select.value(),\n name : self.select.text()\n });\n }\n });\n\n // build main element\n this.setElement(this._template(options));\n this.$('.ui-list-message').append(this.message.$el);\n this.$('.ui-list-portlet').append(this.portlet.$el);\n this.$('.ui-list-button').append(this.button.$el);\n this.$('.ui-list-select').append(this.select.$el);\n },\n\n /** Return/Set currently selected list elements */\n value: function(val) {\n // set new value\n if (val !== undefined) {\n this.portlet.empty();\n if ($.isArray(val)) {\n for (var i in val) {\n var v = val[i];\n var v_id = null;\n var v_name = null;\n if ($.type(v) != 'string') {\n v_id = v.id;\n v_name = v.name;\n } else {\n v_id = v_name = v;\n }\n if (v_id != null) {\n this.add({\n id : v_id,\n name : v_name\n });\n }\n }\n }\n this._refresh();\n }\n // get current value\n var lst = [];\n this.$('.ui-list-id').each(function() {\n lst.push({\n id : $(this).prop('id'),\n name : $(this).find('.ui-list-name').html()\n });\n });\n if (lst.length == 0) {\n return null;\n }\n return lst;\n },\n\n /** Add row */\n add: function(options) {\n var self = this;\n if (this.$('[id=\"' + options.id + '\"]').length === 0) {\n if (Utils.validate(options.id)) {\n var $el = $(this._templateRow({\n id : options.id,\n name : options.name\n }));\n $el.on('click', function() {\n $el.remove();\n self._refresh();\n });\n $el.on('mouseover', function() {\n $el.addClass('portlet-highlight');\n });\n $el.on('mouseout', function() {\n $el.removeClass('portlet-highlight');\n });\n this.portlet.append($el);\n this._refresh();\n } else {\n this.message.update({ message: 'Please select a valid ' + this.name + '.', status: 'danger' });\n }\n } else {\n this.message.update({ message: 'This ' + this.name + ' is already in the list.' });\n }\n },\n\n /** Update available options */\n update: function(options) {\n this.select.update(options);\n },\n\n /** Refresh view */\n _refresh: function() {\n if (this.$('.ui-list-id').length > 0) {\n !this.multiple && this.button.disable();\n this.$('.ui-list-portlet').show();\n } else {\n this.button.enable();\n this.$('.ui-list-portlet').hide();\n }\n this.options.onchange && this.options.onchange();\n },\n\n /** Main Template */\n _template: function(options) {\n return '
                            ' +\n '
                            ' +\n '' +\n '' +\n '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ';\n },\n\n /** Row Template */\n _templateRow: function(options) {\n return '
                            ' +\n '' +\n '' + options.name + '' +\n '
                            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-list.js\n ** module id = 24\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-buttons'], function(Utils, Buttons) {\n\n/** Base class for options based ui elements **/\nvar Base = Backbone.View.extend({\n // initialize\n initialize: function(options) {\n // link this\n var self = this;\n\n // configure options\n this.options = Utils.merge(options, {\n visible : true,\n data : [],\n id : Utils.uid(),\n error_text : 'No options available.',\n wait_text : 'Please wait...',\n multiple : false\n });\n\n // create new element\n this.setElement('
                            ');\n\n // create elements\n this.$message = $('
                            ');\n this.$options = $(this._template(options));\n this.$menu = $('
                            ');\n\n // append\n this.$el.append(this.$message);\n this.$el.append(this.$menu);\n this.$el.append(this.$options);\n\n // add select/unselect all button\n if (this.options.multiple) {\n this.all_button = new Buttons.ButtonCheck({\n onclick: function() {\n self.$('input').prop('checked', self.all_button.value() !== 0);\n self.trigger('change');\n }\n });\n this.$menu.append(this.all_button.$el);\n }\n\n // hide input field\n if (!this.options.visible) {\n this.$el.hide();\n }\n\n // initialize data\n this.update(this.options.data);\n\n // set initial value\n if (this.options.value !== undefined) {\n this.value(this.options.value);\n }\n\n // add change event. fires on trigger\n this.on('change', function() {\n this.options.onchange && this.options.onchange(this.value());\n });\n },\n\n /** Update options\n */\n update: function(options) {\n // backup current value\n var current = this._getValue();\n\n // remove all options\n this.$options.empty();\n\n // add new options using single option templates or full template\n if (this._templateOptions) {\n // rebuild options using full template\n this.$options.append(this._templateOptions(options));\n } else {\n // rebuild options using single option templates\n for (var key in options) {\n var $option = $(this._templateOption(options[key]));\n $option.addClass('ui-option');\n $option.tooltip({title: options[key].tooltip, placement: 'bottom'});\n this.$options.append($option);\n }\n }\n\n // add change events\n var self = this;\n this.$('input').on('change', function() {\n self.value(self._getValue());\n self.trigger('change');\n });\n\n // set previous value\n this.value(current);\n\n // data initialization has been completed\n this.unwait();\n },\n\n /** Return/Set current value\n */\n value: function (new_value) {\n // set new value if available\n if (new_value !== undefined) {\n // reset selection\n this.$('input').prop('checked', false);\n // set value\n if (new_value !== null) {\n // check if its an array\n if (!(new_value instanceof Array)) {\n new_value = [new_value];\n }\n // update to new selection\n for (var i in new_value) {\n this.$('input[value=\"' + new_value[i] + '\"]').first().prop('checked', true);\n }\n };\n }\n // get current value\n var current = this._getValue();\n if (this.all_button) {\n var value = current;\n if (!(value instanceof Array)) {\n value = 0;\n } else {\n value = value.length;\n }\n this.all_button.value(value, this._size());\n }\n return current;\n },\n\n /** Check if selected value exists (or any if multiple)\n */\n exists: function(value) {\n if (value !== undefined) {\n if (!(value instanceof Array)) {\n value = [value];\n }\n for (var i in value) {\n if (this.$('input[value=\"' + value[i] + '\"]').length > 0) {\n return true;\n }\n }\n }\n return false;\n },\n\n /** Return first available option\n */\n first: function() {\n var options = this.$('input').first();\n if (options.length > 0) {\n return options.val();\n } else {\n return null;\n }\n },\n\n /** Wait message during request processing\n */\n wait: function() {\n if (this._size() == 0) {\n this._messageShow(this.options.wait_text, 'info');\n this.$options.hide();\n this.$menu.hide();\n }\n },\n\n /** Hide wait message\n */\n unwait: function() {\n var total = this._size();\n if (total == 0) {\n this._messageShow(this.options.error_text, 'danger');\n this.$options.hide();\n this.$menu.hide();\n } else {\n this._messageHide();\n this.$options.css('display', 'inline-block');\n this.$menu.show();\n }\n },\n\n /** Return current selection\n */\n _getValue: function() {\n // track values in array\n var selected = [];\n this.$(':checked').each(function() {\n selected.push($(this).val());\n });\n\n // get selected elements\n if (!Utils.validate(selected)) {\n return null;\n }\n\n // return multiple or single value\n if (this.options.multiple) {\n return selected;\n } else {\n return selected[0];\n }\n },\n\n /** Returns the number of options\n */\n _size: function() {\n return this.$('.ui-option').length;\n },\n\n /** Show message instead if options\n */\n _messageShow: function(text, status) {\n this.$message.show();\n this.$message.removeClass();\n this.$message.addClass('ui-message alert alert-' + status);\n this.$message.html(text);\n },\n\n /** Hide message\n */\n _messageHide: function() {\n this.$message.hide();\n },\n\n /** Main template function\n */\n _template: function() {\n return '
                            ';\n }\n});\n\n/** Iconized **/\nvar BaseIcons = Base.extend({\n _templateOption: function(pair) {\n var id = Utils.uid();\n return '
                            ' +\n '' +\n '' +\n '
                            ';\n }\n});\n\n/** Radio button field **/\nvar Radio = {};\nRadio.View = BaseIcons.extend({\n initialize: function(options) {\n options.type = 'radio';\n BaseIcons.prototype.initialize.call(this, options);\n }\n});\n\n/** Checkbox options field **/\nvar Checkbox = {};\nCheckbox.View = BaseIcons.extend({\n initialize: function(options) {\n options.multiple = true;\n options.type = 'checkbox';\n BaseIcons.prototype.initialize.call(this, options);\n }\n});\n\n/** Radio button options field styled as classic buttons **/\nvar RadioButton = {};\nRadioButton.View = Base.extend({\n // initialize\n initialize: function(options) {\n Base.prototype.initialize.call(this, options);\n },\n\n /** Return/Set current value\n */\n value: function (new_value) {\n // set new value\n if (new_value !== undefined) {\n this.$('input').prop('checked', false);\n this.$('label').removeClass('active');\n this.$('[value=\"' + new_value + '\"]').prop('checked', true).closest('label').addClass('active');\n }\n\n // get and return value\n return this._getValue();\n },\n\n /** Template for a single option\n */\n _templateOption: function(pair) {\n var cls = 'fa ' + pair.icon;\n if (!pair.label) {\n cls += ' no-padding';\n }\n var tmpl = '';\n return tmpl;\n },\n\n /** Main template function\n */\n _template: function() {\n return '
                            ';\n }\n});\n\nreturn {\n Base : Base,\n BaseIcons : BaseIcons,\n Radio : Radio,\n RadioButton : RadioButton,\n Checkbox : Checkbox\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-options.js\n ** module id = 25\n ** module chunks = 0 3\n **/","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else {\n root.faIconButton = factory();\n }\n\n}(this, function () {\n//============================================================================\n /** Returns a jQuery object containing a clickable font-awesome button.\n * options:\n * tooltipConfig : option map for bootstrap tool tip\n * classes : array of class names (will always be classed as icon-btn)\n * disabled : T/F - add the 'disabled' class?\n * title : tooltip/title string\n * target : optional href target\n * href : optional href\n * faIcon : which font awesome icon to use\n * onclick : function to call when the button is clicked\n */\n var faIconButton = function( options ){\n options = options || {};\n options.tooltipConfig = options.tooltipConfig || { placement: 'bottom' };\n\n options.classes = [ 'icon-btn' ].concat( options.classes || [] );\n if( options.disabled ){\n options.classes.push( 'disabled' );\n }\n\n var html = [\n '',\n // could go with something less specific here - like 'html'\n '',\n ''\n ].join( '' );\n var $button = $( html ).tooltip( options.tooltipConfig );\n if( _.isFunction( options.onclick ) ){\n $button.click( options.onclick );\n }\n return $button;\n };\n\n//============================================================================\n return faIconButton;\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/ui/fa-icon-button.js\n ** module id = 26\n ** module chunks = 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.HandlebarsEnvironment = HandlebarsEnvironment;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _utils = require('./utils');\n\nvar _exception = require('./exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _helpers = require('./helpers');\n\nvar _decorators = require('./decorators');\n\nvar _logger = require('./logger');\n\nvar _logger2 = _interopRequireDefault(_logger);\n\nvar VERSION = '4.0.5';\nexports.VERSION = VERSION;\nvar COMPILER_REVISION = 7;\n\nexports.COMPILER_REVISION = COMPILER_REVISION;\nvar REVISION_CHANGES = {\n 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n 2: '== 1.0.0-rc.3',\n 3: '== 1.0.0-rc.4',\n 4: '== 1.x.x',\n 5: '== 2.0.0-alpha.x',\n 6: '>= 2.0.0-beta.1',\n 7: '>= 4.0.0'\n};\n\nexports.REVISION_CHANGES = REVISION_CHANGES;\nvar objectType = '[object Object]';\n\nfunction HandlebarsEnvironment(helpers, partials, decorators) {\n this.helpers = helpers || {};\n this.partials = partials || {};\n this.decorators = decorators || {};\n\n _helpers.registerDefaultHelpers(this);\n _decorators.registerDefaultDecorators(this);\n}\n\nHandlebarsEnvironment.prototype = {\n constructor: HandlebarsEnvironment,\n\n logger: _logger2['default'],\n log: _logger2['default'].log,\n\n registerHelper: function registerHelper(name, fn) {\n if (_utils.toString.call(name) === objectType) {\n if (fn) {\n throw new _exception2['default']('Arg not supported with multiple helpers');\n }\n _utils.extend(this.helpers, name);\n } else {\n this.helpers[name] = fn;\n }\n },\n unregisterHelper: function unregisterHelper(name) {\n delete this.helpers[name];\n },\n\n registerPartial: function registerPartial(name, partial) {\n if (_utils.toString.call(name) === objectType) {\n _utils.extend(this.partials, name);\n } else {\n if (typeof partial === 'undefined') {\n throw new _exception2['default']('Attempting to register a partial called \"' + name + '\" as undefined');\n }\n this.partials[name] = partial;\n }\n },\n unregisterPartial: function unregisterPartial(name) {\n delete this.partials[name];\n },\n\n registerDecorator: function registerDecorator(name, fn) {\n if (_utils.toString.call(name) === objectType) {\n if (fn) {\n throw new _exception2['default']('Arg not supported with multiple decorators');\n }\n _utils.extend(this.decorators, name);\n } else {\n this.decorators[name] = fn;\n }\n },\n unregisterDecorator: function unregisterDecorator(name) {\n delete this.decorators[name];\n }\n};\n\nvar log = _logger2['default'].log;\n\nexports.log = log;\nexports.createFrame = _utils.createFrame;\nexports.logger = _logger2['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7cUJBQTRDLFNBQVM7O3lCQUMvQixhQUFhOzs7O3VCQUNFLFdBQVc7OzBCQUNSLGNBQWM7O3NCQUNuQyxVQUFVOzs7O0FBRXRCLElBQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQzs7QUFDeEIsSUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7OztBQUU1QixJQUFNLGdCQUFnQixHQUFHO0FBQzlCLEdBQUMsRUFBRSxhQUFhO0FBQ2hCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxVQUFVO0FBQ2IsR0FBQyxFQUFFLGtCQUFrQjtBQUNyQixHQUFDLEVBQUUsaUJBQWlCO0FBQ3BCLEdBQUMsRUFBRSxVQUFVO0NBQ2QsQ0FBQzs7O0FBRUYsSUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7O0FBRTlCLFNBQVMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDbkUsTUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQzdCLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUMvQixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0FBRW5DLGtDQUF1QixJQUFJLENBQUMsQ0FBQztBQUM3Qix3Q0FBMEIsSUFBSSxDQUFDLENBQUM7Q0FDakM7O0FBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ2hDLGFBQVcsRUFBRSxxQkFBcUI7O0FBRWxDLFFBQU0scUJBQVE7QUFDZCxLQUFHLEVBQUUsb0JBQU8sR0FBRzs7QUFFZixnQkFBYyxFQUFFLHdCQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDakMsUUFBSSxnQkFBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3RDLFVBQUksRUFBRSxFQUFFO0FBQUUsY0FBTSwyQkFBYyx5Q0FBeUMsQ0FBQyxDQUFDO09BQUU7QUFDM0Usb0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QixNQUFNO0FBQ0wsVUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekI7R0FDRjtBQUNELGtCQUFnQixFQUFFLDBCQUFTLElBQUksRUFBRTtBQUMvQixXQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDM0I7O0FBRUQsaUJBQWUsRUFBRSx5QkFBUyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ3ZDLFFBQUksZ0JBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtBQUN0QyxvQkFBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdCLE1BQU07QUFDTCxVQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTtBQUNsQyxjQUFNLHlFQUEwRCxJQUFJLG9CQUFpQixDQUFDO09BQ3ZGO0FBQ0QsVUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7S0FDL0I7R0FDRjtBQUNELG1CQUFpQixFQUFFLDJCQUFTLElBQUksRUFBRTtBQUNoQyxXQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDNUI7O0FBRUQsbUJBQWlCLEVBQUUsMkJBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxRQUFJLGdCQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDdEMsVUFBSSxFQUFFLEVBQUU7QUFBRSxjQUFNLDJCQUFjLDRDQUE0QyxDQUFDLENBQUM7T0FBRTtBQUM5RSxvQkFBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQy9CLE1BQU07QUFDTCxVQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUM1QjtHQUNGO0FBQ0QscUJBQW1CLEVBQUUsNkJBQVMsSUFBSSxFQUFFO0FBQ2xDLFdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM5QjtDQUNGLENBQUM7O0FBRUssSUFBSSxHQUFHLEdBQUcsb0JBQU8sR0FBRyxDQUFDOzs7UUFFcEIsV0FBVztRQUFFLE1BQU0iLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4wLjUnO1xuZXhwb3J0IGNvbnN0IENPTVBJTEVSX1JFVklTSU9OID0gNztcblxuZXhwb3J0IGNvbnN0IFJFVklTSU9OX0NIQU5HRVMgPSB7XG4gIDE6ICc8PSAxLjAucmMuMicsIC8vIDEuMC5yYy4yIGlzIGFjdHVhbGx5IHJldjIgYnV0IGRvZXNuJ3QgcmVwb3J0IGl0XG4gIDI6ICc9PSAxLjAuMC1yYy4zJyxcbiAgMzogJz09IDEuMC4wLXJjLjQnLFxuICA0OiAnPT0gMS54LngnLFxuICA1OiAnPT0gMi4wLjAtYWxwaGEueCcsXG4gIDY6ICc+PSAyLjAuMC1iZXRhLjEnLFxuICA3OiAnPj0gNC4wLjAnXG59O1xuXG5jb25zdCBvYmplY3RUeXBlID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBIYW5kbGViYXJzRW52aXJvbm1lbnQoaGVscGVycywgcGFydGlhbHMsIGRlY29yYXRvcnMpIHtcbiAgdGhpcy5oZWxwZXJzID0gaGVscGVycyB8fCB7fTtcbiAgdGhpcy5wYXJ0aWFscyA9IHBhcnRpYWxzIHx8IHt9O1xuICB0aGlzLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzIHx8IHt9O1xuXG4gIHJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyk7XG4gIHJlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnModGhpcyk7XG59XG5cbkhhbmRsZWJhcnNFbnZpcm9ubWVudC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBIYW5kbGViYXJzRW52aXJvbm1lbnQsXG5cbiAgbG9nZ2VyOiBsb2dnZXIsXG4gIGxvZzogbG9nZ2VyLmxvZyxcblxuICByZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5oZWxwZXJzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxwZXJzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVySGVscGVyOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuaGVscGVyc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUsIHBhcnRpYWwpIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgZXh0ZW5kKHRoaXMucGFydGlhbHMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHBhcnRpYWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oYEF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIiR7bmFtZX1cIiBhcyB1bmRlZmluZWRgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFydGlhbHNbbmFtZV0gPSBwYXJ0aWFsO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlclBhcnRpYWw6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5wYXJ0aWFsc1tuYW1lXTtcbiAgfSxcblxuICByZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSwgZm4pIHtcbiAgICBpZiAodG9TdHJpbmcuY2FsbChuYW1lKSA9PT0gb2JqZWN0VHlwZSkge1xuICAgICAgaWYgKGZuKSB7IHRocm93IG5ldyBFeGNlcHRpb24oJ0FyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgZGVjb3JhdG9ycycpOyB9XG4gICAgICBleHRlbmQodGhpcy5kZWNvcmF0b3JzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWNvcmF0b3JzW25hbWVdID0gZm47XG4gICAgfVxuICB9LFxuICB1bnJlZ2lzdGVyRGVjb3JhdG9yOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuZGVjb3JhdG9yc1tuYW1lXTtcbiAgfVxufTtcblxuZXhwb3J0IGxldCBsb2cgPSBsb2dnZXIubG9nO1xuXG5leHBvcnQge2NyZWF0ZUZyYW1lLCBsb2dnZXJ9O1xuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/base.js\n ** module id = 27\n ** module chunks = 0 3\n **/","/**\n * Popover wrapper\n*/\ndefine([ 'utils/utils' ], function( Utils ) {\nvar View = Backbone.View.extend({\n optionsDefault: {\n with_close : true,\n title : null,\n placement : 'top',\n container : 'body',\n body : null\n },\n\n initialize: function ( options ) {\n this.setElement( this._template() );\n this.uid = Utils.uid();\n this.options = _.defaults( options || {}, this.optionsDefault );\n this.options.container.parent().append( this.el );\n this.$title = this.$( '.popover-title-label' );\n this.$close = this.$( '.popover-close' );\n this.$body = this.$( '.popover-content' );\n\n // add initial content\n this.options.body && this.append( this.options.body );\n\n // add event to hide if click is outside of popup and not on container\n var self = this;\n $( 'body' ).on( 'mousedown.' + this.uid, function( e ) {\n // the 'is' for buttons that trigger popups\n // the 'has' for icons within a button that triggers a popup\n self.visible && !$( self.options.container ).is( e.target ) && !$( self.el ).is( e.target ) &&\n $( self.el ).has( e.target ).length === 0 && self.hide();\n });\n },\n\n /**\n * Render popover\n */\n render: function() {\n this.$title.html( this.options.title );\n this.$el.removeClass().addClass( 'ui-popover popover fade in' ).addClass( this.options.placement );\n this.$el.css( this._get_placement( this.options.placement ) );\n\n // configure close option\n var self = this;\n if ( this.options.with_close ) {\n this.$close.on( 'click', function() { self.hide() } ).show();\n } else {\n this.$close.off().hide();\n }\n },\n\n /**\n * Set the popover title\n * @params{ String } newTitle - New popover title\n */\n title: function( newTitle ) {\n if ( newTitle !== undefined ) {\n this.options.title = newTitle;\n this.$title.html( newTitle );\n }\n },\n\n /**\n * Show popover\n */\n show: function() {\n this.render();\n this.$el.show();\n this.visible = true;\n },\n\n /**\n * Hide popover\n */\n hide: function() {\n this.$el.hide();\n this.visible = false;\n },\n\n /**\n * Append new content to the popover\n * @params{ Object } $el - Dom element\n */\n append: function( $el ) {\n this.$body.append( $el );\n },\n\n /**\n * Remove all content\n */\n empty: function() {\n this.$body.empty();\n },\n\n /**\n * Remove popover\n */\n remove: function() {\n $( 'body' ).off( 'mousedown.' + this.uid );\n this.$el.remove();\n },\n\n /**\n * Improve popover location/placement\n */\n _get_placement: function( placement ) {\n // get popover dimensions\n var width = this._get_width( this.$el );\n var height = this.$el.height();\n\n // get container details\n var $container = this.options.container;\n var container_width = this._get_width( $container );\n var container_height = this._get_height( $container );\n var container_position = $container.position();\n\n // get position\n var top = left = 0;\n if ([ 'top', 'bottom' ].indexOf( placement ) != -1) {\n left = container_position.left - width + ( container_width + width ) / 2;\n switch ( placement ) {\n case 'top':\n top = container_position.top - height - 5;\n break;\n case 'bottom':\n top = container_position.top + container_height + 5;\n break;\n }\n } else {\n top = container_position.top - height + ( container_height + height ) / 2;\n switch ( placement ) {\n case 'right':\n left = container_position.left + container_width;\n break;\n }\n }\n return { top: top, left: left };\n },\n\n /**\n * Returns padding/margin corrected width\n */\n _get_width: function( $el ) {\n return $el.width() + parseInt( $el.css( 'padding-left' ) ) + parseInt( $el.css( 'margin-left' ) ) +\n parseInt( $el.css( 'padding-right' ) ) + parseInt( $el.css( 'margin-right' ) );\n },\n\n /**\n * Returns padding corrected height\n */\n _get_height: function( $el ) {\n return $el.height() + parseInt( $el.css( 'padding-top' ) ) + parseInt( $el.css( 'padding-bottom' ) );\n },\n\n /**\n * Return the popover template\n */\n _template: function( options ) {\n return '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-popover.js\n ** module id = 29\n ** module chunks = 3\n **/","// dependencies\ndefine(['utils/utils'], function(Utils) {\n\n/**\n * A plugin for initializing select2 input items.\n * Make sure the select2 library itself is loaded beforehand.\n * Also the element to which select2 will be appended has to \n * be created before select2 initialization (and passed as option).\n */\nvar View = Backbone.View.extend(\n{\n // options\n optionsDefault: {\n css : '',\n placeholder : 'No data available',\n data : [],\n value : null,\n multiple : false,\n minimumInputLength : 0,\n // example format of initial data: \"id:name,55:anotherrole@role.com,27:role@role.com\"\n initialData : ''\n },\n \n // initialize\n initialize : function(options) {\n // configure options\n this.options = Utils.merge(options, this.optionsDefault);\n \n // create new element\n this.setElement(this._template(this.options));\n \n // check if container exists\n if (!this.options.container) {\n console.log('ui-select::initialize() : container not specified.');\n return;\n }\n \n // add to dom\n this.options.container.append(this.$el);\n \n // link selection dictionary\n this.select_data = this.options.data;\n \n // refresh\n this._refresh();\n \n if (!this.options.multiple){\n // initial value\n if (this.options.value) {\n this._setValue(this.options.value);\n }\n \n // add change event\n var self = this;\n if (this.options.onchange) {\n this.$el.on('change', function() {\n self.options.onchange(self.value());\n });\n }\n }\n },\n \n // value\n value : function (new_value) {\n // get current id/value\n var before = this._getValue();\n \n // check if new_value is defined\n if (new_value !== undefined) {\n this._setValue(new_value);\n }\n \n // get current id/value\n var after = this._getValue();\n \n // fire onchange\n if ((after != before && this.options.onchange)) {\n this.options.onchange(after);\n }\n \n // return current value\n return after;\n },\n \n // label\n text : function () {\n return this.$el.select2('data').text;\n },\n \n // disabled\n disabled: function() {\n return !this.$el.select2('enable');\n },\n\n // enable\n enable: function() {\n this.$el.select2('enable', true);\n },\n \n // disable\n disable: function() {\n this.$el.select2('enable', false);\n },\n \n // add\n add: function(options) {\n // add options\n this.select_data.push({\n id : options.id,\n text : options.text\n });\n \n // refresh\n this._refresh();\n },\n \n // remove\n del: function(id) {\n // search option\n var index = this._getIndex(id);\n \n // check if found\n if (index != -1) {\n // remove options\n this.select_data.splice(index, 1);\n \n // refresh\n this._refresh();\n }\n },\n \n // remove\n remove: function() {\n this.$el.select2('destroy');\n },\n \n // update\n update: function(options) {\n // copy options\n this.select_data = [];\n for (var key in options.data) {\n this.select_data.push(options.data[key]);\n }\n \n // refresh\n this._refresh();\n },\n \n // refresh\n _refresh: function() {\n // add select2 data based on type of input\n if (!this.options.multiple){\n var selected = this._getValue();\n var select_opt = {\n data : this.select_data,\n containerCssClass : this.options.css,\n placeholder : this.options.placeholder,\n dropdownAutoWidth : true\n };\n this.$el.select2(select_opt);\n // select previous value (if exists)\n this._setValue(selected);\n } else {\n var select_opt = {\n multiple : this.options.multiple,\n containerCssClass : this.options.css,\n placeholder : this.options.placeholder,\n minimumInputLength : this.options.minimumInputLength,\n ajax : this.options.ajax,\n dropdownCssClass : this.options.dropdownCssClass,\n escapeMarkup : this.options.escapeMarkup,\n formatResult : this.options.formatResult,\n formatSelection : this.options.formatSelection,\n initSelection : this.options.initSelection,\n initialData : this.options.initialData\n };\n this.$el.select2(select_opt);\n }\n },\n \n // get index\n _getIndex: function(value) {\n // search index\n for (var key in this.select_data) {\n if (this.select_data[key].id == value) {\n return key;\n }\n }\n \n // not found\n return -1;\n },\n \n // get value\n _getValue: function() {\n return this.$el.select2('val');\n },\n \n // set value\n _setValue: function(new_value) {\n var index = this._getIndex(new_value);\n if (index == -1) {\n if (this.select_data.length > 0) {\n new_value = this.select_data[0].id;\n }\n }\n this.$el.select2('val', new_value);\n },\n \n // element\n _template: function(options) {\n return '';\n }\n});\n\nreturn {\n View : View\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-select.js\n ** module id = 30\n ** module chunks = 3\n **/","// dependencies\ndefine(['utils/utils'], function(Utils) {\n\n// return\nvar View = Backbone.View.extend({\n // defaults options\n optionsDefault: {\n title_new : '',\n operations : null,\n onnew : null,\n max : null,\n onchange : null\n },\n \n // initialize\n initialize : function(options) {\n // configure\n this.visible = false;\n this.$nav = null;\n this.$content = null;\n this.first_tab = null;\n this.current_id = null;\n \n // configure options\n this.options = Utils.merge(options, this.optionsDefault);\n \n // create tabs\n var $tabs = $(this._template(this.options));\n \n // link elements\n this.$nav = $tabs.find('.tab-navigation');\n this.$content = $tabs.find('.tab-content');\n \n // create new element\n this.setElement($tabs);\n \n // clear list\n this.list = {};\n \n // link this\n var self = this;\n \n // append operations\n if (this.options.operations) {\n $.each(this.options.operations, function(name, item) {\n item.$el.prop('id', name);\n self.$nav.find('.operations').append(item.$el);\n });\n }\n \n // add built-in add-new-tab tab\n if (this.options.onnew) {\n // create tab object\n var $tab_new = $(this._template_tab_new(this.options));\n \n // append to navbar\n this.$nav.append($tab_new);\n \n // add tooltip\n $tab_new.tooltip({title: 'Add a new tab', placement: 'bottom', container: self.$el});\n \n // link click event\n $tab_new.on('click', function(e) {\n $tab_new.tooltip('hide');\n self.options.onnew();\n });\n }\n },\n \n // size\n size: function() {\n return _.size(this.list);\n },\n \n // front\n current: function() {\n return this.$el.find('.tab-pane.active').attr('id');\n },\n \n // append\n add: function(options) {\n // self\n var self = this;\n \n // get tab id\n var id = options.id;\n\n // create tab object\n var $tab_title = $(this._template_tab(options));\n var $tab_content = $(this._template_tab_content(options));\n \n // add to list\n this.list[id] = options.ondel ? true : false;\n \n // add a new tab either before the add-new-tab tab or behind the last tab\n if (this.options.onnew) {\n this.$nav.find('#new-tab').before($tab_title);\n } else {\n this.$nav.append($tab_title);\n }\n \n // add content\n $tab_content.append(options.$el);\n this.$content.append($tab_content);\n \n // activate this tab if this is the first tab\n if (this.size() == 1) {\n $tab_title.addClass('active');\n $tab_content.addClass('active');\n this.first_tab = id;\n }\n \n // hide add tab\n if (this.options.max && this.size() >= this.options.max) {\n this.$el.find('#new-tab').hide();\n }\n \n // add click event to remove tab\n if (options.ondel) {\n var $del_icon = $tab_title.find('#delete');\n $del_icon.tooltip({title: 'Delete this tab', placement: 'bottom', container: self.$el});\n $del_icon.on('click', function() {\n $del_icon.tooltip('destroy');\n self.$el.find('.tooltip').remove();\n options.ondel();\n return false;\n });\n }\n \n // add custom click event handler\n $tab_title.on('click', function(e) {\n // prevent default\n e.preventDefault();\n \n // click\n if (options.onclick) {\n options.onclick();\n } else {\n self.show(id);\n }\n });\n \n // initialize current id\n if (!this.current_id) {\n this.current_id = id;\n }\n },\n \n // delete tab\n del: function(id) {\n // delete tab from dom\n this.$el.find('#tab-' + id).remove();\n this.$el.find('#' + id).remove();\n \n // check if first tab has been deleted\n if (this.first_tab == id) {\n this.first_tab = null;\n }\n \n // show first tab\n if (this.first_tab != null) {\n this.show(this.first_tab);\n }\n \n // delete from list\n if (this.list[id]) {\n delete this.list[id];\n }\n \n // show add tab\n if (this.size() < this.options.max) {\n this.$el.find('#new-tab').show();\n }\n },\n \n // delete tab\n delRemovable: function() {\n for (var id in this.list) {\n this.del(id);\n }\n },\n \n // show\n show: function(id){\n // show tab view\n this.$el.fadeIn('fast');\n this.visible = true;\n \n // show selected tab\n if (id) {\n // reassign active class\n this.$el.find('#tab-' + this.current_id).removeClass('active');\n this.$el.find('#' + this.current_id).removeClass('active');\n this.$el.find('#tab-' + id).addClass('active');\n this.$el.find('#' + id).addClass('active');\n \n // update current id\n this.current_id = id;\n }\n \n // change\n if (this.options.onchange) {\n this.options.onchange(id);\n }\n },\n \n // hide\n hide: function(){\n this.$el.fadeOut('fast');\n this.visible = false;\n },\n\n // hide operation\n hideOperation: function(id) {\n this.$nav.find('#' + id).hide();\n },\n\n // show operation\n showOperation: function(id) {\n this.$nav.find('#' + id).show();\n },\n \n // set operation\n setOperation: function(id, callback) {\n var $el = this.$nav.find('#' + id);\n $el.off('click');\n $el.on('click', callback);\n },\n \n // title\n title: function(id, new_title) {\n var $el = this.$el.find('#tab-title-text-' + id);\n if (new_title) {\n $el.html(new_title);\n }\n return $el.html();\n },\n \n // retitle\n retitle: function(new_title) {\n var index = 0;\n for (var id in this.list) {\n this.title(id, ++index + ': ' + new_title);\n }\n },\n \n // fill template\n _template: function(options) {\n return '
                            ' +\n '
                              ' +\n '
                              ' +\n '
                            '+\n '
                            ' +\n '
                            ';\n },\n \n // fill template tab\n _template_tab_new: function(options) {\n return '
                          3. ' +\n '' +\n '' +\n options.title_new +\n '' +\n '
                          4. ';\n },\n \n // fill template tab\n _template_tab: function(options) {\n var tmpl = '
                          5. ' +\n '' +\n '' + options.title + '';\n \n if (options.ondel) {\n tmpl += '';\n }\n \n tmpl += '' +\n '
                          6. ';\n \n return tmpl;\n },\n \n // fill template tab content\n _template_tab_content: function(options) {\n return '
                            ';\n }\n});\n\nreturn {\n View : View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-tabs.js\n ** module id = 31\n ** module chunks = 0 3\n **/","/**\n * Parser.js\n * Copyright 2012-13 Mayank Lahiri\n * mlahiri@gmail.com\n * Released under the BSD License.\n *\n * A forgiving Bibtex parser that can:\n * \n * (1) operate in streaming or block mode, extracting entries as dictionaries. \n * (2) convert Latex special characters to UTF-8.\n * (3) best-effort parse malformed entries.\n * (4) run in a CommonJS environment or a browser, without any dependencies.\n * (5) be advanced-compiled by Google Closure Compiler.\n * \n * Handwritten as a labor of love, not auto-generated from a grammar. \n *\n * Modes of usage:\n *\n * (1) Synchronous, string\n *\n * var entries = BibtexParser(text);\n * console.log(entries);\n *\n * (2) Asynchronous, stream\n *\n * var entryCallback = function(entry) { console.log(entry); }\n * var parser = new BibtexParser(entryCallback);\n * parser.parse(chunk1);\n * parser.parse(chunk2);\n * ...\n * \n * @param {text|function(Object)} arg Either a Bibtex string or callback \n * function for processing parsed entries.\n * @constructor\n */\nfunction BibtexParser(arg0) {\n // Determine how this function is to be used\n if (typeof arg0 == 'string') {\n // Passed a string, synchronous call without 'new'\n var tempStorage = {};\n var entries = [];\n function accumulator(entry) {\n entries.push(entry);\n }\n var parser = BibtexParser.call(tempStorage, accumulator);\n parser.parse(arg0);\n return {\n 'entries': entries,\n 'errors': parser.getErrors()\n }\n }\n if (typeof arg0 != 'function') {\n throw 'Invalid parser construction.';\n }\n\n /** @enum {number} */\n this.STATES_ = {\n ENTRY_OR_JUNK: 0,\n OBJECT_TYPE: 1,\n ENTRY_KEY: 2, \n KV_KEY: 3, \n EQUALS: 4,\n KV_VALUE: 5 \n }\n /** @private */ this.DATA_ = {};\n /** @private */ this.CALLBACK_ = arg0;\n /** @private */ this.CHAR_ = 0;\n /** @private */ this.LINE_ = 1;\n /** @private */ this.CHAR_IN_LINE_ = 0;\n /** @private */ this.SKIPWS_ = true;\n /** @private */ this.SKIPCOMMENT_ = true;\n /** @private */ this.PARSETMP_ = {};\n /** @private */ this.SKIPTILLEOL_ = false;\n /** @private */ this.VALBRACES_ = null;\n /** @private */ this.BRACETYPE_ = null;\n /** @private */ this.BRACECOUNT_ = 0;\n /** @private */ this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n /** @private */ this.ERRORS_ = [];\n /** @private */ this.ENTRY_TYPES_ = {\n 'inproceedings' : 1,\n 'proceedings' : 2,\n 'article' : 3,\n 'techreport' : 4,\n 'misc' : 5,\n 'mastersthesis' : 6,\n 'book' : 7,\n 'phdthesis' : 8,\n 'incollection' : 9,\n 'unpublished' : 10,\n 'inbook' : 11,\n 'manual' : 12,\n 'periodical' : 13,\n 'booklet' : 14,\n 'masterthesis' : 15,\n 'conference' : 16\n ,'online' : 998 // Galaxy MOD: Handle @online entries for preprints.\n ,'data' : 999 // Galaxy MOD: Handle @data citations coming from figshare.\n }\n /** @private */ this.MACROS_ = {\n 'jan' : 'January',\n 'feb' : 'February',\n 'mar' : 'March',\n 'apr' : 'April',\n 'may' : 'May',\n 'jun' : 'June',\n 'jul' : 'July',\n 'aug' : 'August',\n 'sep' : 'September',\n 'oct' : 'October',\n 'nov' : 'November',\n 'dec' : 'December',\n 'Jan' : 'January',\n 'Feb' : 'February',\n 'Mar' : 'March',\n 'Apr' : 'April',\n 'May' : 'May',\n 'Jun' : 'June',\n 'Jul' : 'July',\n 'Aug' : 'August',\n 'Sep' : 'September',\n 'Oct' : 'October',\n 'Nov' : 'November',\n 'Dec' : 'December'\n }\n\n /**\n * Gets an array of all errors encountered during parsing.\n * Array entries are of the format:\n * [ line number, character in line, character in stream, error text ]\n *\n * @returns Array\n * @public\n */\n this.getErrors = function() {\n return this.ERRORS_;\n }\n\n /**\n * Processes a chunk of data\n * @public\n */\n this.parse = function(chunk) {\n for (var i = 0; i < chunk.length; i++)\n this.processCharacter_(chunk[i]);\n }\n\n /**\n * Logs error at current stream position.\n *\n * @private\n */\n this.error_ = function(text) {\n this.ERRORS_.push([ this.LINE_, \n this.CHAR_IN_LINE_,\n this.CHAR_,\n text ])\n }\n\n /**\n * Called after an entire entry has been parsed from the stream.\n * Performs post-processing and invokes the entry callback pointed to by\n * this.CALLBACK_. Parsed (but unprocessed) entry data is in this.DATA_.\n */\n this.processEntry_ = function() {\n var data = this.DATA_;\n if (data.Fields) \n for (var f in data.Fields) {\n var raw = data.Fields[f];\n\n // Convert Latex/Bibtex special characters to UTF-8 equivalents\n for (var i = 0; i < this.CHARCONV_.length; i++) {\n var re = this.CHARCONV_[i][0];\n var rep = this.CHARCONV_[i][1];\n raw = raw.replace(re, rep);\n }\n\n // Basic substitutions\n raw = raw.replace(/[\\n\\r\\t]/g, ' ')\n .replace(/\\s\\s+/g, ' ')\n .replace(/^\\s+|\\s+$/g, '')\n\n // Remove braces and backslashes\n var len = raw.length;\n var processed = '';\n for (var i = 0; i < len; i++) {\n var c = raw[i];\n var skip = false;\n if (c == '\\\\' && i < len-1) \n c = raw[++i];\n else {\n if (c == '{' || c == '}')\n skip = true;\n }\n if (!skip)\n processed += c;\n }\n data.Fields[f] = processed\n }\n\n if (data.ObjectType == 'string') {\n for (var f in data.Fields) { \n this.MACROS_[f] = data.Fields[f];\n }\n } else {\n // Parsed a new Bibtex entry\n this.CALLBACK_(data);\n }\n }\n\n\n /**\n * Processes next character in the stream, invoking the callback after \n * each entry has been found and processed.\n * \n * @private\n * @param {string} c Next character in input stream\n */\n this.processCharacter_ = function(c) {\n // Housekeeping\n this.CHAR_++;\n this.CHAR_IN_LINE_++;\n if (c == '\\n') {\n this.LINE_++;\n this.CHAR_IN_LINE_ = 1;\n }\n\n // Convenience states for skipping whitespace when needed\n if (this.SKIPTILLEOL_) {\n if (c == '\\n')\n this.SKIPTILLEOL_ = false;\n return;\n }\n if (this.SKIPCOMMENT_ && c == '%') {\n this.SKIPTILLEOL_ = true;\n return;\n }\n if (this.SKIPWS_ && /\\s/.test(c))\n return;\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n this.SKIPTILLEOL_ = false;\n\n // Main state machine\n var AnotherIteration = true;\n while (AnotherIteration) {\n //console.log(this.LINE_, this.CHAR_IN_LINE_, this.STATE_, c)\n AnotherIteration = false;\n switch(this.STATE_) {\n // -- Scan for an object marker ('@')\n // -- Reset temporary data structure in case previous entry was garbled\n case this.STATES_.ENTRY_OR_JUNK:\n if (c == '@') {\n // SUCCESS: Parsed a valid start-of-object marker.\n // NEXT_STATE: OBJECT_TYPE\n this.STATE_ = this.STATES_.OBJECT_TYPE;\n this.DATA_ = {\n ObjectType : ''\n };\n }\n this.BRACETYPE_ = null;\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n break;\n\n // Start at first non-whitespace character after start-of-object '@'\n // -- Accept [A-Za-z], break on non-matching character\n // -- Populate this.DATA_.EntryType and this.DATA_.ObjectType\n case this.STATES_.OBJECT_TYPE:\n if (/[A-Za-z]/.test(c)) {\n this.DATA_.ObjectType += c.toLowerCase();\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n } else {\n // Break from state and validate object type\n var ot = this.DATA_.ObjectType;\n if (ot == 'comment') {\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n } else {\n if (ot == 'string') {\n this.DATA_.ObjectType = ot;\n this.DATA_.Fields = {};\n this.BRACETYPE_ = c;\n this.BRACECOUNT_ = 1;\n this.STATE_ = this.STATES_.KV_KEY;\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.PARSETMP_ = {\n Key: ''\n }\n } else {\n if (ot == 'preamble') {\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n } else {\n if (ot in this.ENTRY_TYPES_) {\n // SUCCESS: Parsed a valid object type.\n // NEXT_STATE: ENTRY_KEY\n this.DATA_.ObjectType = 'entry';\n this.DATA_.EntryType = ot;\n this.DATA_.EntryKey = '';\n this.STATE_ = this.STATES_.ENTRY_KEY;\n AnotherIteration = true;\n } else {\n // ERROR: Unrecognized object type.\n // NEXT_STATE: ENTRY_OR_JUNK\n this.error_('Unrecognized object type: \"' +\n this.DATA_.ObjectType + '\"')\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n }\n }\n }\n }\n }\n break;\n\n // Start at first non-alphabetic character after an entry type\n // -- Populate this.DATA_.EntryKey\n case this.STATES_.ENTRY_KEY:\n if ((c === '{' || c === '(') && this.BRACETYPE_ == null) {\n this.BRACETYPE_ = c;\n this.BRACECOUNT_ = 1;\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n break;\n }\n if (/[,%\\s]/.test(c)) {\n if (this.DATA_.EntryKey.length < 1) { \n // Skip comments and whitespace before entry key\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n } else {\n if (this.BRACETYPE_ == null) {\n // ERROR: No opening brace for object\n // NEXT_STATE: ENTRY_OR_JUNK\n this.error_('No opening brace for object.');\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n } else {\n // SUCCESS: Parsed an entry key\n // NEXT_STATE: KV_KEY\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n AnotherIteration = true;\n this.STATE_ = this.STATES_.KV_KEY;\n this.PARSETMP_.Key= '';\n this.DATA_.Fields = {};\n }\n }\n } else {\n this.DATA_.EntryKey += c;\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n }\n break;\n\n // Start at first non-whitespace/comment character after entry key.\n // -- Populate this.PARSETMP_.Key\n case this.STATES_.KV_KEY:\n // Test for end of entry\n if ((c == '}' && this.BRACETYPE_ == '{') ||\n (c == ')' && this.BRACETYPE_ == '(')) {\n // SUCCESS: Parsed an entry, possible incomplete\n // NEXT_STATE: ENTRY_OR_JUNK\n this.processEntry_();\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n break;\n }\n if (/[\\-A-Za-z:]/.test(c)) {\n // Add to key\n this.PARSETMP_.Key += c;\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n } else {\n // Either end of key or we haven't encountered start of key\n if (this.PARSETMP_.Key.length < 1) {\n // Keep going till we see a key\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n } else {\n // SUCCESS: Found full key in K/V pair\n // NEXT_STATE: EQUALS\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.EQUALS;\n AnotherIteration = true;\n }\n }\n break;\n\n // Start at first non-alphabetic character after K/V pair key.\n case this.STATES_.EQUALS:\n if ((c == '}' && this.BRACETYPE_ == '{') ||\n (c == ')' && this.BRACETYPE_ == '(')) {\n // ERROR: K/V pair with key but no value\n // NEXT_STATE: ENTRY_OR_JUNK\n this.error_('Key-value pair has key \"' +\n this.PARSETMP_.Key + '\", but no value.');\n this.processEntry_();\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.ENTRY_OR_JUNK;\n break;\n }\n if (c == '=') {\n // SUCCESS: found an equal signs separating key and value\n // NEXT_STATE: KV_VALUE\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.KV_VALUE;\n this.PARSETMP_.Value = '';\n this.VALBRACES_ = { '\"' : [], '{' : [] };\n }\n break;\n\n // Start at first non-whitespace/comment character after '=' \n // -- Populate this.PARSETMP_.Value\n case this.STATES_.KV_VALUE:\n var delim = this.VALBRACES_;\n var val = this.PARSETMP_.Value;\n var doneParsingValue = false;\n\n // Test for special characters\n if (c == '\"' || c == '{' || c == '}' || c == ',') {\n if (c == ',') {\n // This comma can mean:\n // (1) just another comma literal\n // (2) end of a macro reference\n if (0 === delim['\"'].length + delim['{'].length) {\n // end of a macro reference\n var macro = this.PARSETMP_.Value.trim();\n if (macro in this.MACROS_) {\n // Successful macro reference\n this.PARSETMP_.Value = this.MACROS_[macro];\n } else {\n // Reference to an undefined macro\n this.error_('Reference to an undefined macro: '+macro);\n }\n doneParsingValue = true;\n }\n }\n if (c == '\"') {\n // This quote can mean:\n // (1) opening delimiter\n // (2) closing delimiter\n // (3) literal, if we have a '{' on the stack\n if (0 === delim['\"'].length + delim['{'].length) {\n // opening delimiter\n delim['\"'].push(this.CHAR_)\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n break;\n }\n if (delim['\"'].length == 1 && delim['{'].length == 0 &&\n (val.length==0 || val[val.length-1] != '\\\\')) {\n // closing delimiter\n doneParsingValue = true;\n } else {\n // literal, add to value\n }\n }\n if (c == '{') {\n // This brace can mean:\n // (1) opening delimiter\n // (2) stacked verbatim delimiter\n if (val.length == 0 || val[val.length-1] != '\\\\') {\n delim['{'].push(this.CHAR_)\n this.SKIPWS_ = false;\n this.SKIPCOMMENT_ = false;\n } else {\n // literal, add to value\n }\n }\n if (c == '}') {\n // This brace can mean:\n // (1) closing delimiter\n // (2) closing stacked verbatim delimiter\n // (3) end of object definition if value was a macro\n if (0 === delim['\"'].length + delim['{'].length) {\n // end of object definition, after macro\n var macro = this.PARSETMP_.Value.trim();\n if (macro in this.MACROS_) {\n // Successful macro reference\n this.PARSETMP_.Value = this.MACROS_[macro];\n } else {\n // Reference to an undefined macro\n this.error_('Reference to an undefined macro: '+macro);\n }\n AnotherIteration = true;\n doneParsingValue = true;\n } else {\n if (val.length == 0 || val[val.length-1] != '\\\\') {\n if (delim['{'].length > 0) {\n // pop stack for stacked verbatim delimiter\n delim['{'].splice(delim['{'].length-1, 1)\n if (0 == delim['{'].length + delim['\"'].length) {\n // closing delimiter\n doneParsingValue = true;\n } else {\n // end verbatim block\n }\n }\n } else {\n // literal, add to value\n }\n }\n }\n }\n\n // If here, then we are either done parsing the value or \n // have a literal that should be added to the value.\n if (doneParsingValue) {\n // SUCCESS: value parsed\n // NEXT_STATE: KV_KEY\n this.SKIPWS_ = true;\n this.SKIPCOMMENT_ = true;\n this.STATE_ = this.STATES_.KV_KEY;\n this.DATA_.Fields[this.PARSETMP_.Key] = this.PARSETMP_.Value;\n this.PARSETMP_ = { Key: '' };\n this.VALBRACES_ = null;\n } else {\n this.PARSETMP_.Value += c;\n }\n break;\n } // end switch (this.STATE_)\n } // end while(AnotherIteration)\n } // end function processCharacter \n\n /** @private */ this.CHARCONV_ = [\n [ /\\\\space /g, '\\u0020' ],\n [ /\\\\textdollar /g, '\\u0024' ],\n [ /\\\\textquotesingle /g, '\\u0027' ],\n [ /\\\\ast /g, '\\u002A' ],\n [ /\\\\textbackslash /g, '\\u005C' ],\n [ /\\\\\\^\\{\\}/g, '\\u005E' ],\n [ /\\\\textasciigrave /g, '\\u0060' ],\n [ /\\\\lbrace /g, '\\u007B' ],\n [ /\\\\vert /g, '\\u007C' ],\n [ /\\\\rbrace /g, '\\u007D' ],\n [ /\\\\textasciitilde /g, '\\u007E' ],\n [ /\\\\textexclamdown /g, '\\u00A1' ],\n [ /\\\\textcent /g, '\\u00A2' ],\n [ /\\\\textsterling /g, '\\u00A3' ],\n [ /\\\\textcurrency /g, '\\u00A4' ],\n [ /\\\\textyen /g, '\\u00A5' ],\n [ /\\\\textbrokenbar /g, '\\u00A6' ],\n [ /\\\\textsection /g, '\\u00A7' ],\n [ /\\\\textasciidieresis /g, '\\u00A8' ],\n [ /\\\\textcopyright /g, '\\u00A9' ],\n [ /\\\\textordfeminine /g, '\\u00AA' ],\n [ /\\\\guillemotleft /g, '\\u00AB' ],\n [ /\\\\lnot /g, '\\u00AC' ],\n [ /\\\\textregistered /g, '\\u00AE' ],\n [ /\\\\textasciimacron /g, '\\u00AF' ],\n [ /\\\\textdegree /g, '\\u00B0' ],\n [ /\\\\pm /g, '\\u00B1' ],\n [ /\\\\textasciiacute /g, '\\u00B4' ],\n [ /\\\\mathrm\\{\\\\mu\\}/g, '\\u00B5' ],\n [ /\\\\textparagraph /g, '\\u00B6' ],\n [ /\\\\cdot /g, '\\u00B7' ],\n [ /\\\\c\\{\\}/g, '\\u00B8' ],\n [ /\\\\textordmasculine /g, '\\u00BA' ],\n [ /\\\\guillemotright /g, '\\u00BB' ],\n [ /\\\\textonequarter /g, '\\u00BC' ],\n [ /\\\\textonehalf /g, '\\u00BD' ],\n [ /\\\\textthreequarters /g, '\\u00BE' ],\n [ /\\\\textquestiondown /g, '\\u00BF' ],\n [ /\\\\`\\{A\\}/g, '\\u00C0' ],\n [ /\\\\'\\{A\\}/g, '\\u00C1' ],\n [ /\\\\\\^\\{A\\}/g, '\\u00C2' ],\n [ /\\\\~\\{A\\}/g, '\\u00C3' ],\n [ /\\\\\"\\{A\\}/g, '\\u00C4' ],\n [ /\\\\AA /g, '\\u00C5' ],\n [ /\\\\AE /g, '\\u00C6' ],\n [ /\\\\c\\{C\\}/g, '\\u00C7' ],\n [ /\\\\`\\{E\\}/g, '\\u00C8' ],\n [ /\\\\'\\{E\\}/g, '\\u00C9' ],\n [ /\\\\\\^\\{E\\}/g, '\\u00CA' ],\n [ /\\\\\"\\{E\\}/g, '\\u00CB' ],\n [ /\\\\`\\{I\\}/g, '\\u00CC' ],\n [ /\\\\'\\{I\\}/g, '\\u00CD' ],\n [ /\\\\\\^\\{I\\}/g, '\\u00CE' ],\n [ /\\\\\"\\{I\\}/g, '\\u00CF' ],\n [ /\\\\DH /g, '\\u00D0' ],\n [ /\\\\~\\{N\\}/g, '\\u00D1' ],\n [ /\\\\`\\{O\\}/g, '\\u00D2' ],\n [ /\\\\'\\{O\\}/g, '\\u00D3' ],\n [ /\\\\\\^\\{O\\}/g, '\\u00D4' ],\n [ /\\\\~\\{O\\}/g, '\\u00D5' ],\n [ /\\\\\"\\{O\\}/g, '\\u00D6' ],\n [ /\\\\texttimes /g, '\\u00D7' ],\n [ /\\\\O /g, '\\u00D8' ],\n [ /\\\\`\\{U\\}/g, '\\u00D9' ],\n [ /\\\\'\\{U\\}/g, '\\u00DA' ],\n [ /\\\\\\^\\{U\\}/g, '\\u00DB' ],\n [ /\\\\\"\\{U\\}/g, '\\u00DC' ],\n [ /\\\\'\\{Y\\}/g, '\\u00DD' ],\n [ /\\\\TH /g, '\\u00DE' ],\n [ /\\\\ss /g, '\\u00DF' ],\n [ /\\\\`\\{a\\}/g, '\\u00E0' ],\n [ /\\\\'\\{a\\}/g, '\\u00E1' ],\n [ /\\\\\\^\\{a\\}/g, '\\u00E2' ],\n [ /\\\\~\\{a\\}/g, '\\u00E3' ],\n [ /\\\\\"\\{a\\}/g, '\\u00E4' ],\n [ /\\\\aa /g, '\\u00E5' ],\n [ /\\\\ae /g, '\\u00E6' ],\n [ /\\\\c\\{c\\}/g, '\\u00E7' ],\n [ /\\\\`\\{e\\}/g, '\\u00E8' ],\n [ /\\\\'\\{e\\}/g, '\\u00E9' ],\n [ /\\\\\\^\\{e\\}/g, '\\u00EA' ],\n [ /\\\\\"\\{e\\}/g, '\\u00EB' ],\n [ /\\\\`\\{\\\\i\\}/g, '\\u00EC' ],\n [ /\\\\'\\{\\\\i\\}/g, '\\u00ED' ],\n [ /\\\\\\^\\{\\\\i\\}/g, '\\u00EE' ],\n [ /\\\\\"\\{\\\\i\\}/g, '\\u00EF' ],\n [ /\\\\dh /g, '\\u00F0' ],\n [ /\\\\~\\{n\\}/g, '\\u00F1' ],\n [ /\\\\`\\{o\\}/g, '\\u00F2' ],\n [ /\\\\'\\{o\\}/g, '\\u00F3' ],\n [ /\\\\\\^\\{o\\}/g, '\\u00F4' ],\n [ /\\\\~\\{o\\}/g, '\\u00F5' ],\n [ /\\\\\"\\{o\\}/g, '\\u00F6' ],\n [ /\\\\div /g, '\\u00F7' ],\n [ /\\\\o /g, '\\u00F8' ],\n [ /\\\\`\\{u\\}/g, '\\u00F9' ],\n [ /\\\\'\\{u\\}/g, '\\u00FA' ],\n [ /\\\\\\^\\{u\\}/g, '\\u00FB' ],\n [ /\\\\\"\\{u\\}/g, '\\u00FC' ],\n [ /\\\\'\\{y\\}/g, '\\u00FD' ],\n [ /\\\\th /g, '\\u00FE' ],\n [ /\\\\\"\\{y\\}/g, '\\u00FF' ],\n [ /\\\\=\\{A\\}/g, '\\u0100' ],\n [ /\\\\=\\{a\\}/g, '\\u0101' ],\n [ /\\\\u\\{A\\}/g, '\\u0102' ],\n [ /\\\\u\\{a\\}/g, '\\u0103' ],\n [ /\\\\k\\{A\\}/g, '\\u0104' ],\n [ /\\\\k\\{a\\}/g, '\\u0105' ],\n [ /\\\\'\\{C\\}/g, '\\u0106' ],\n [ /\\\\'\\{c\\}/g, '\\u0107' ],\n [ /\\\\\\^\\{C\\}/g, '\\u0108' ],\n [ /\\\\\\^\\{c\\}/g, '\\u0109' ],\n [ /\\\\.\\{C\\}/g, '\\u010A' ],\n [ /\\\\.\\{c\\}/g, '\\u010B' ],\n [ /\\\\v\\{C\\}/g, '\\u010C' ],\n [ /\\\\v\\{c\\}/g, '\\u010D' ],\n [ /\\\\v\\{D\\}/g, '\\u010E' ],\n [ /\\\\v\\{d\\}/g, '\\u010F' ],\n [ /\\\\DJ /g, '\\u0110' ],\n [ /\\\\dj /g, '\\u0111' ],\n [ /\\\\=\\{E\\}/g, '\\u0112' ],\n [ /\\\\=\\{e\\}/g, '\\u0113' ],\n [ /\\\\u\\{E\\}/g, '\\u0114' ],\n [ /\\\\u\\{e\\}/g, '\\u0115' ],\n [ /\\\\.\\{E\\}/g, '\\u0116' ],\n [ /\\\\.\\{e\\}/g, '\\u0117' ],\n [ /\\\\k\\{E\\}/g, '\\u0118' ],\n [ /\\\\k\\{e\\}/g, '\\u0119' ],\n [ /\\\\v\\{E\\}/g, '\\u011A' ],\n [ /\\\\v\\{e\\}/g, '\\u011B' ],\n [ /\\\\\\^\\{G\\}/g, '\\u011C' ],\n [ /\\\\\\^\\{g\\}/g, '\\u011D' ],\n [ /\\\\u\\{G\\}/g, '\\u011E' ],\n [ /\\\\u\\{g\\}/g, '\\u011F' ],\n [ /\\\\.\\{G\\}/g, '\\u0120' ],\n [ /\\\\.\\{g\\}/g, '\\u0121' ],\n [ /\\\\c\\{G\\}/g, '\\u0122' ],\n [ /\\\\c\\{g\\}/g, '\\u0123' ],\n [ /\\\\\\^\\{H\\}/g, '\\u0124' ],\n [ /\\\\\\^\\{h\\}/g, '\\u0125' ],\n [ /\\\\Elzxh /g, '\\u0127' ],\n [ /\\\\~\\{I\\}/g, '\\u0128' ],\n [ /\\\\~\\{\\\\i\\}/g, '\\u0129' ],\n [ /\\\\=\\{I\\}/g, '\\u012A' ],\n [ /\\\\=\\{\\\\i\\}/g, '\\u012B' ],\n [ /\\\\u\\{I\\}/g, '\\u012C' ],\n [ /\\\\u\\{\\\\i\\}/g, '\\u012D' ],\n [ /\\\\k\\{I\\}/g, '\\u012E' ],\n [ /\\\\k\\{i\\}/g, '\\u012F' ],\n [ /\\\\.\\{I\\}/g, '\\u0130' ],\n [ /\\\\i /g, '\\u0131' ],\n [ /\\\\\\^\\{J\\}/g, '\\u0134' ],\n [ /\\\\\\^\\{\\\\j\\}/g, '\\u0135' ],\n [ /\\\\c\\{K\\}/g, '\\u0136' ],\n [ /\\\\c\\{k\\}/g, '\\u0137' ],\n [ /\\\\'\\{L\\}/g, '\\u0139' ],\n [ /\\\\'\\{l\\}/g, '\\u013A' ],\n [ /\\\\c\\{L\\}/g, '\\u013B' ],\n [ /\\\\c\\{l\\}/g, '\\u013C' ],\n [ /\\\\v\\{L\\}/g, '\\u013D' ],\n [ /\\\\v\\{l\\}/g, '\\u013E' ],\n [ /\\\\L /g, '\\u0141' ],\n [ /\\\\l /g, '\\u0142' ],\n [ /\\\\'\\{N\\}/g, '\\u0143' ],\n [ /\\\\'\\{n\\}/g, '\\u0144' ],\n [ /\\\\c\\{N\\}/g, '\\u0145' ],\n [ /\\\\c\\{n\\}/g, '\\u0146' ],\n [ /\\\\v\\{N\\}/g, '\\u0147' ],\n [ /\\\\v\\{n\\}/g, '\\u0148' ],\n [ /\\\\NG /g, '\\u014A' ],\n [ /\\\\ng /g, '\\u014B' ],\n [ /\\\\=\\{O\\}/g, '\\u014C' ],\n [ /\\\\=\\{o\\}/g, '\\u014D' ],\n [ /\\\\u\\{O\\}/g, '\\u014E' ],\n [ /\\\\u\\{o\\}/g, '\\u014F' ],\n [ /\\\\H\\{O\\}/g, '\\u0150' ],\n [ /\\\\H\\{o\\}/g, '\\u0151' ],\n [ /\\\\OE /g, '\\u0152' ],\n [ /\\\\oe /g, '\\u0153' ],\n [ /\\\\'\\{R\\}/g, '\\u0154' ],\n [ /\\\\'\\{r\\}/g, '\\u0155' ],\n [ /\\\\c\\{R\\}/g, '\\u0156' ],\n [ /\\\\c\\{r\\}/g, '\\u0157' ],\n [ /\\\\v\\{R\\}/g, '\\u0158' ],\n [ /\\\\v\\{r\\}/g, '\\u0159' ],\n [ /\\\\'\\{S\\}/g, '\\u015A' ],\n [ /\\\\'\\{s\\}/g, '\\u015B' ],\n [ /\\\\\\^\\{S\\}/g, '\\u015C' ],\n [ /\\\\\\^\\{s\\}/g, '\\u015D' ],\n [ /\\\\c\\{S\\}/g, '\\u015E' ],\n [ /\\\\c\\{s\\}/g, '\\u015F' ],\n [ /\\\\v\\{S\\}/g, '\\u0160' ],\n [ /\\\\v\\{s\\}/g, '\\u0161' ],\n [ /\\\\c\\{T\\}/g, '\\u0162' ],\n [ /\\\\c\\{t\\}/g, '\\u0163' ],\n [ /\\\\v\\{T\\}/g, '\\u0164' ],\n [ /\\\\v\\{t\\}/g, '\\u0165' ],\n [ /\\\\~\\{U\\}/g, '\\u0168' ],\n [ /\\\\~\\{u\\}/g, '\\u0169' ],\n [ /\\\\=\\{U\\}/g, '\\u016A' ],\n [ /\\\\=\\{u\\}/g, '\\u016B' ],\n [ /\\\\u\\{U\\}/g, '\\u016C' ],\n [ /\\\\u\\{u\\}/g, '\\u016D' ],\n [ /\\\\r\\{U\\}/g, '\\u016E' ],\n [ /\\\\r\\{u\\}/g, '\\u016F' ],\n [ /\\\\H\\{U\\}/g, '\\u0170' ],\n [ /\\\\H\\{u\\}/g, '\\u0171' ],\n [ /\\\\k\\{U\\}/g, '\\u0172' ],\n [ /\\\\k\\{u\\}/g, '\\u0173' ],\n [ /\\\\\\^\\{W\\}/g, '\\u0174' ],\n [ /\\\\\\^\\{w\\}/g, '\\u0175' ],\n [ /\\\\\\^\\{Y\\}/g, '\\u0176' ],\n [ /\\\\\\^\\{y\\}/g, '\\u0177' ],\n [ /\\\\\"\\{Y\\}/g, '\\u0178' ],\n [ /\\\\'\\{Z\\}/g, '\\u0179' ],\n [ /\\\\'\\{z\\}/g, '\\u017A' ],\n [ /\\\\.\\{Z\\}/g, '\\u017B' ],\n [ /\\\\.\\{z\\}/g, '\\u017C' ],\n [ /\\\\v\\{Z\\}/g, '\\u017D' ],\n [ /\\\\v\\{z\\}/g, '\\u017E' ],\n [ /\\\\texthvlig /g, '\\u0195' ],\n [ /\\\\textnrleg /g, '\\u019E' ],\n [ /\\\\eth /g, '\\u01AA' ],\n [ /\\\\textdoublepipe /g, '\\u01C2' ],\n [ /\\\\'\\{g\\}/g, '\\u01F5' ],\n [ /\\\\Elztrna /g, '\\u0250' ],\n [ /\\\\Elztrnsa /g, '\\u0252' ],\n [ /\\\\Elzopeno /g, '\\u0254' ],\n [ /\\\\Elzrtld /g, '\\u0256' ],\n [ /\\\\Elzschwa /g, '\\u0259' ],\n [ /\\\\varepsilon /g, '\\u025B' ],\n [ /\\\\Elzpgamma /g, '\\u0263' ],\n [ /\\\\Elzpbgam /g, '\\u0264' ],\n [ /\\\\Elztrnh /g, '\\u0265' ],\n [ /\\\\Elzbtdl /g, '\\u026C' ],\n [ /\\\\Elzrtll /g, '\\u026D' ],\n [ /\\\\Elztrnm /g, '\\u026F' ],\n [ /\\\\Elztrnmlr /g, '\\u0270' ],\n [ /\\\\Elzltlmr /g, '\\u0271' ],\n [ /\\\\Elzltln /g, '\\u0272' ],\n [ /\\\\Elzrtln /g, '\\u0273' ],\n [ /\\\\Elzclomeg /g, '\\u0277' ],\n [ /\\\\textphi /g, '\\u0278' ],\n [ /\\\\Elztrnr /g, '\\u0279' ],\n [ /\\\\Elztrnrl /g, '\\u027A' ],\n [ /\\\\Elzrttrnr /g, '\\u027B' ],\n [ /\\\\Elzrl /g, '\\u027C' ],\n [ /\\\\Elzrtlr /g, '\\u027D' ],\n [ /\\\\Elzfhr /g, '\\u027E' ],\n [ /\\\\Elzrtls /g, '\\u0282' ],\n [ /\\\\Elzesh /g, '\\u0283' ],\n [ /\\\\Elztrnt /g, '\\u0287' ],\n [ /\\\\Elzrtlt /g, '\\u0288' ],\n [ /\\\\Elzpupsil /g, '\\u028A' ],\n [ /\\\\Elzpscrv /g, '\\u028B' ],\n [ /\\\\Elzinvv /g, '\\u028C' ],\n [ /\\\\Elzinvw /g, '\\u028D' ],\n [ /\\\\Elztrny /g, '\\u028E' ],\n [ /\\\\Elzrtlz /g, '\\u0290' ],\n [ /\\\\Elzyogh /g, '\\u0292' ],\n [ /\\\\Elzglst /g, '\\u0294' ],\n [ /\\\\Elzreglst /g, '\\u0295' ],\n [ /\\\\Elzinglst /g, '\\u0296' ],\n [ /\\\\textturnk /g, '\\u029E' ],\n [ /\\\\Elzdyogh /g, '\\u02A4' ],\n [ /\\\\Elztesh /g, '\\u02A7' ],\n [ /\\\\textasciicaron /g, '\\u02C7' ],\n [ /\\\\Elzverts /g, '\\u02C8' ],\n [ /\\\\Elzverti /g, '\\u02CC' ],\n [ /\\\\Elzlmrk /g, '\\u02D0' ],\n [ /\\\\Elzhlmrk /g, '\\u02D1' ],\n [ /\\\\Elzsbrhr /g, '\\u02D2' ],\n [ /\\\\Elzsblhr /g, '\\u02D3' ],\n [ /\\\\Elzrais /g, '\\u02D4' ],\n [ /\\\\Elzlow /g, '\\u02D5' ],\n [ /\\\\textasciibreve /g, '\\u02D8' ],\n [ /\\\\textperiodcentered /g, '\\u02D9' ],\n [ /\\\\r\\{\\}/g, '\\u02DA' ],\n [ /\\\\k\\{\\}/g, '\\u02DB' ],\n [ /\\\\texttildelow /g, '\\u02DC' ],\n [ /\\\\H\\{\\}/g, '\\u02DD' ],\n [ /\\\\tone\\{55\\}/g, '\\u02E5' ],\n [ /\\\\tone\\{44\\}/g, '\\u02E6' ],\n [ /\\\\tone\\{33\\}/g, '\\u02E7' ],\n [ /\\\\tone\\{22\\}/g, '\\u02E8' ],\n [ /\\\\tone\\{11\\}/g, '\\u02E9' ],\n [ /\\\\cyrchar\\\\C/g, '\\u030F' ],\n [ /\\\\Elzpalh /g, '\\u0321' ],\n [ /\\\\Elzrh /g, '\\u0322' ],\n [ /\\\\Elzsbbrg /g, '\\u032A' ],\n [ /\\\\Elzxl /g, '\\u0335' ],\n [ /\\\\Elzbar /g, '\\u0336' ],\n [ /\\\\'\\{A\\}/g, '\\u0386' ],\n [ /\\\\'\\{E\\}/g, '\\u0388' ],\n [ /\\\\'\\{H\\}/g, '\\u0389' ],\n [ /\\\\'\\{\\}\\{I\\}/g, '\\u038A' ],\n [ /\\\\'\\{\\}O/g, '\\u038C' ],\n [ /\\\\mathrm\\{'Y\\}/g, '\\u038E' ],\n [ /\\\\mathrm\\{'\\\\Omega\\}/g, '\\u038F' ],\n [ /\\\\acute\\{\\\\ddot\\{\\\\iota\\}\\}/g, '\\u0390' ],\n [ /\\\\Alpha /g, '\\u0391' ],\n [ /\\\\Beta /g, '\\u0392' ],\n [ /\\\\Gamma /g, '\\u0393' ],\n [ /\\\\Delta /g, '\\u0394' ],\n [ /\\\\Epsilon /g, '\\u0395' ],\n [ /\\\\Zeta /g, '\\u0396' ],\n [ /\\\\Eta /g, '\\u0397' ],\n [ /\\\\Theta /g, '\\u0398' ],\n [ /\\\\Iota /g, '\\u0399' ],\n [ /\\\\Kappa /g, '\\u039A' ],\n [ /\\\\Lambda /g, '\\u039B' ],\n [ /\\\\Xi /g, '\\u039E' ],\n [ /\\\\Pi /g, '\\u03A0' ],\n [ /\\\\Rho /g, '\\u03A1' ],\n [ /\\\\Sigma /g, '\\u03A3' ],\n [ /\\\\Tau /g, '\\u03A4' ],\n [ /\\\\Upsilon /g, '\\u03A5' ],\n [ /\\\\Phi /g, '\\u03A6' ],\n [ /\\\\Chi /g, '\\u03A7' ],\n [ /\\\\Psi /g, '\\u03A8' ],\n [ /\\\\Omega /g, '\\u03A9' ],\n [ /\\\\mathrm\\{\\\\ddot\\{I\\}\\}/g, '\\u03AA' ],\n [ /\\\\mathrm\\{\\\\ddot\\{Y\\}\\}/g, '\\u03AB' ],\n [ /\\\\'\\{\\$\\\\alpha\\$\\}/g, '\\u03AC' ],\n [ /\\\\acute\\{\\\\epsilon\\}/g, '\\u03AD' ],\n [ /\\\\acute\\{\\\\eta\\}/g, '\\u03AE' ],\n [ /\\\\acute\\{\\\\iota\\}/g, '\\u03AF' ],\n [ /\\\\acute\\{\\\\ddot\\{\\\\upsilon\\}\\}/g, '\\u03B0' ],\n [ /\\\\alpha /g, '\\u03B1' ],\n [ /\\\\beta /g, '\\u03B2' ],\n [ /\\\\gamma /g, '\\u03B3' ],\n [ /\\\\delta /g, '\\u03B4' ],\n [ /\\\\epsilon /g, '\\u03B5' ],\n [ /\\\\zeta /g, '\\u03B6' ],\n [ /\\\\eta /g, '\\u03B7' ],\n [ /\\\\texttheta /g, '\\u03B8' ],\n [ /\\\\iota /g, '\\u03B9' ],\n [ /\\\\kappa /g, '\\u03BA' ],\n [ /\\\\lambda /g, '\\u03BB' ],\n [ /\\\\mu /g, '\\u03BC' ],\n [ /\\\\nu /g, '\\u03BD' ],\n [ /\\\\xi /g, '\\u03BE' ],\n [ /\\\\pi /g, '\\u03C0' ],\n [ /\\\\rho /g, '\\u03C1' ],\n [ /\\\\varsigma /g, '\\u03C2' ],\n [ /\\\\sigma /g, '\\u03C3' ],\n [ /\\\\tau /g, '\\u03C4' ],\n [ /\\\\upsilon /g, '\\u03C5' ],\n [ /\\\\varphi /g, '\\u03C6' ],\n [ /\\\\chi /g, '\\u03C7' ],\n [ /\\\\psi /g, '\\u03C8' ],\n [ /\\\\omega /g, '\\u03C9' ],\n [ /\\\\ddot\\{\\\\iota\\}/g, '\\u03CA' ],\n [ /\\\\ddot\\{\\\\upsilon\\}/g, '\\u03CB' ],\n [ /\\\\'\\{o\\}/g, '\\u03CC' ],\n [ /\\\\acute\\{\\\\upsilon\\}/g, '\\u03CD' ],\n [ /\\\\acute\\{\\\\omega\\}/g, '\\u03CE' ],\n [ /\\\\Pisymbol\\{ppi022\\}\\{87\\}/g, '\\u03D0' ],\n [ /\\\\textvartheta /g, '\\u03D1' ],\n [ /\\\\Upsilon /g, '\\u03D2' ],\n [ /\\\\phi /g, '\\u03D5' ],\n [ /\\\\varpi /g, '\\u03D6' ],\n [ /\\\\Stigma /g, '\\u03DA' ],\n [ /\\\\Digamma /g, '\\u03DC' ],\n [ /\\\\digamma /g, '\\u03DD' ],\n [ /\\\\Koppa /g, '\\u03DE' ],\n [ /\\\\Sampi /g, '\\u03E0' ],\n [ /\\\\varkappa /g, '\\u03F0' ],\n [ /\\\\varrho /g, '\\u03F1' ],\n [ /\\\\textTheta /g, '\\u03F4' ],\n [ /\\\\backepsilon /g, '\\u03F6' ],\n [ /\\\\cyrchar\\\\CYRYO /g, '\\u0401' ],\n [ /\\\\cyrchar\\\\CYRDJE /g, '\\u0402' ],\n [ /\\\\cyrchar\\{\\\\'\\\\CYRG\\}/g, '\\u0403' ],\n [ /\\\\cyrchar\\\\CYRIE /g, '\\u0404' ],\n [ /\\\\cyrchar\\\\CYRDZE /g, '\\u0405' ],\n [ /\\\\cyrchar\\\\CYRII /g, '\\u0406' ],\n [ /\\\\cyrchar\\\\CYRYI /g, '\\u0407' ],\n [ /\\\\cyrchar\\\\CYRJE /g, '\\u0408' ],\n [ /\\\\cyrchar\\\\CYRLJE /g, '\\u0409' ],\n [ /\\\\cyrchar\\\\CYRNJE /g, '\\u040A' ],\n [ /\\\\cyrchar\\\\CYRTSHE /g, '\\u040B' ],\n [ /\\\\cyrchar\\{\\\\'\\\\CYRK\\}/g, '\\u040C' ],\n [ /\\\\cyrchar\\\\CYRUSHRT /g, '\\u040E' ],\n [ /\\\\cyrchar\\\\CYRDZHE /g, '\\u040F' ],\n [ /\\\\cyrchar\\\\CYRA /g, '\\u0410' ],\n [ /\\\\cyrchar\\\\CYRB /g, '\\u0411' ],\n [ /\\\\cyrchar\\\\CYRV /g, '\\u0412' ],\n [ /\\\\cyrchar\\\\CYRG /g, '\\u0413' ],\n [ /\\\\cyrchar\\\\CYRD /g, '\\u0414' ],\n [ /\\\\cyrchar\\\\CYRE /g, '\\u0415' ],\n [ /\\\\cyrchar\\\\CYRZH /g, '\\u0416' ],\n [ /\\\\cyrchar\\\\CYRZ /g, '\\u0417' ],\n [ /\\\\cyrchar\\\\CYRI /g, '\\u0418' ],\n [ /\\\\cyrchar\\\\CYRISHRT /g, '\\u0419' ],\n [ /\\\\cyrchar\\\\CYRK /g, '\\u041A' ],\n [ /\\\\cyrchar\\\\CYRL /g, '\\u041B' ],\n [ /\\\\cyrchar\\\\CYRM /g, '\\u041C' ],\n [ /\\\\cyrchar\\\\CYRN /g, '\\u041D' ],\n [ /\\\\cyrchar\\\\CYRO /g, '\\u041E' ],\n [ /\\\\cyrchar\\\\CYRP /g, '\\u041F' ],\n [ /\\\\cyrchar\\\\CYRR /g, '\\u0420' ],\n [ /\\\\cyrchar\\\\CYRS /g, '\\u0421' ],\n [ /\\\\cyrchar\\\\CYRT /g, '\\u0422' ],\n [ /\\\\cyrchar\\\\CYRU /g, '\\u0423' ],\n [ /\\\\cyrchar\\\\CYRF /g, '\\u0424' ],\n [ /\\\\cyrchar\\\\CYRH /g, '\\u0425' ],\n [ /\\\\cyrchar\\\\CYRC /g, '\\u0426' ],\n [ /\\\\cyrchar\\\\CYRCH /g, '\\u0427' ],\n [ /\\\\cyrchar\\\\CYRSH /g, '\\u0428' ],\n [ /\\\\cyrchar\\\\CYRSHCH /g, '\\u0429' ],\n [ /\\\\cyrchar\\\\CYRHRDSN /g, '\\u042A' ],\n [ /\\\\cyrchar\\\\CYRERY /g, '\\u042B' ],\n [ /\\\\cyrchar\\\\CYRSFTSN /g, '\\u042C' ],\n [ /\\\\cyrchar\\\\CYREREV /g, '\\u042D' ],\n [ /\\\\cyrchar\\\\CYRYU /g, '\\u042E' ],\n [ /\\\\cyrchar\\\\CYRYA /g, '\\u042F' ],\n [ /\\\\cyrchar\\\\cyra /g, '\\u0430' ],\n [ /\\\\cyrchar\\\\cyrb /g, '\\u0431' ],\n [ /\\\\cyrchar\\\\cyrv /g, '\\u0432' ],\n [ /\\\\cyrchar\\\\cyrg /g, '\\u0433' ],\n [ /\\\\cyrchar\\\\cyrd /g, '\\u0434' ],\n [ /\\\\cyrchar\\\\cyre /g, '\\u0435' ],\n [ /\\\\cyrchar\\\\cyrzh /g, '\\u0436' ],\n [ /\\\\cyrchar\\\\cyrz /g, '\\u0437' ],\n [ /\\\\cyrchar\\\\cyri /g, '\\u0438' ],\n [ /\\\\cyrchar\\\\cyrishrt /g, '\\u0439' ],\n [ /\\\\cyrchar\\\\cyrk /g, '\\u043A' ],\n [ /\\\\cyrchar\\\\cyrl /g, '\\u043B' ],\n [ /\\\\cyrchar\\\\cyrm /g, '\\u043C' ],\n [ /\\\\cyrchar\\\\cyrn /g, '\\u043D' ],\n [ /\\\\cyrchar\\\\cyro /g, '\\u043E' ],\n [ /\\\\cyrchar\\\\cyrp /g, '\\u043F' ],\n [ /\\\\cyrchar\\\\cyrr /g, '\\u0440' ],\n [ /\\\\cyrchar\\\\cyrs /g, '\\u0441' ],\n [ /\\\\cyrchar\\\\cyrt /g, '\\u0442' ],\n [ /\\\\cyrchar\\\\cyru /g, '\\u0443' ],\n [ /\\\\cyrchar\\\\cyrf /g, '\\u0444' ],\n [ /\\\\cyrchar\\\\cyrh /g, '\\u0445' ],\n [ /\\\\cyrchar\\\\cyrc /g, '\\u0446' ],\n [ /\\\\cyrchar\\\\cyrch /g, '\\u0447' ],\n [ /\\\\cyrchar\\\\cyrsh /g, '\\u0448' ],\n [ /\\\\cyrchar\\\\cyrshch /g, '\\u0449' ],\n [ /\\\\cyrchar\\\\cyrhrdsn /g, '\\u044A' ],\n [ /\\\\cyrchar\\\\cyrery /g, '\\u044B' ],\n [ /\\\\cyrchar\\\\cyrsftsn /g, '\\u044C' ],\n [ /\\\\cyrchar\\\\cyrerev /g, '\\u044D' ],\n [ /\\\\cyrchar\\\\cyryu /g, '\\u044E' ],\n [ /\\\\cyrchar\\\\cyrya /g, '\\u044F' ],\n [ /\\\\cyrchar\\\\cyryo /g, '\\u0451' ],\n [ /\\\\cyrchar\\\\cyrdje /g, '\\u0452' ],\n [ /\\\\cyrchar\\{\\\\'\\\\cyrg\\}/g, '\\u0453' ],\n [ /\\\\cyrchar\\\\cyrie /g, '\\u0454' ],\n [ /\\\\cyrchar\\\\cyrdze /g, '\\u0455' ],\n [ /\\\\cyrchar\\\\cyrii /g, '\\u0456' ],\n [ /\\\\cyrchar\\\\cyryi /g, '\\u0457' ],\n [ /\\\\cyrchar\\\\cyrje /g, '\\u0458' ],\n [ /\\\\cyrchar\\\\cyrlje /g, '\\u0459' ],\n [ /\\\\cyrchar\\\\cyrnje /g, '\\u045A' ],\n [ /\\\\cyrchar\\\\cyrtshe /g, '\\u045B' ],\n [ /\\\\cyrchar\\{\\\\'\\\\cyrk\\}/g, '\\u045C' ],\n [ /\\\\cyrchar\\\\cyrushrt /g, '\\u045E' ],\n [ /\\\\cyrchar\\\\cyrdzhe /g, '\\u045F' ],\n [ /\\\\cyrchar\\\\CYROMEGA /g, '\\u0460' ],\n [ /\\\\cyrchar\\\\cyromega /g, '\\u0461' ],\n [ /\\\\cyrchar\\\\CYRYAT /g, '\\u0462' ],\n [ /\\\\cyrchar\\\\CYRIOTE /g, '\\u0464' ],\n [ /\\\\cyrchar\\\\cyriote /g, '\\u0465' ],\n [ /\\\\cyrchar\\\\CYRLYUS /g, '\\u0466' ],\n [ /\\\\cyrchar\\\\cyrlyus /g, '\\u0467' ],\n [ /\\\\cyrchar\\\\CYRIOTLYUS /g, '\\u0468' ],\n [ /\\\\cyrchar\\\\cyriotlyus /g, '\\u0469' ],\n [ /\\\\cyrchar\\\\CYRBYUS /g, '\\u046A' ],\n [ /\\\\cyrchar\\\\CYRIOTBYUS /g, '\\u046C' ],\n [ /\\\\cyrchar\\\\cyriotbyus /g, '\\u046D' ],\n [ /\\\\cyrchar\\\\CYRKSI /g, '\\u046E' ],\n [ /\\\\cyrchar\\\\cyrksi /g, '\\u046F' ],\n [ /\\\\cyrchar\\\\CYRPSI /g, '\\u0470' ],\n [ /\\\\cyrchar\\\\cyrpsi /g, '\\u0471' ],\n [ /\\\\cyrchar\\\\CYRFITA /g, '\\u0472' ],\n [ /\\\\cyrchar\\\\CYRIZH /g, '\\u0474' ],\n [ /\\\\cyrchar\\\\CYRUK /g, '\\u0478' ],\n [ /\\\\cyrchar\\\\cyruk /g, '\\u0479' ],\n [ /\\\\cyrchar\\\\CYROMEGARND /g, '\\u047A' ],\n [ /\\\\cyrchar\\\\cyromegarnd /g, '\\u047B' ],\n [ /\\\\cyrchar\\\\CYROMEGATITLO /g, '\\u047C' ],\n [ /\\\\cyrchar\\\\cyromegatitlo /g, '\\u047D' ],\n [ /\\\\cyrchar\\\\CYROT /g, '\\u047E' ],\n [ /\\\\cyrchar\\\\cyrot /g, '\\u047F' ],\n [ /\\\\cyrchar\\\\CYRKOPPA /g, '\\u0480' ],\n [ /\\\\cyrchar\\\\cyrkoppa /g, '\\u0481' ],\n [ /\\\\cyrchar\\\\cyrthousands /g, '\\u0482' ],\n [ /\\\\cyrchar\\\\cyrhundredthousands /g, '\\u0488' ],\n [ /\\\\cyrchar\\\\cyrmillions /g, '\\u0489' ],\n [ /\\\\cyrchar\\\\CYRSEMISFTSN /g, '\\u048C' ],\n [ /\\\\cyrchar\\\\cyrsemisftsn /g, '\\u048D' ],\n [ /\\\\cyrchar\\\\CYRRTICK /g, '\\u048E' ],\n [ /\\\\cyrchar\\\\cyrrtick /g, '\\u048F' ],\n [ /\\\\cyrchar\\\\CYRGUP /g, '\\u0490' ],\n [ /\\\\cyrchar\\\\cyrgup /g, '\\u0491' ],\n [ /\\\\cyrchar\\\\CYRGHCRS /g, '\\u0492' ],\n [ /\\\\cyrchar\\\\cyrghcrs /g, '\\u0493' ],\n [ /\\\\cyrchar\\\\CYRGHK /g, '\\u0494' ],\n [ /\\\\cyrchar\\\\cyrghk /g, '\\u0495' ],\n [ /\\\\cyrchar\\\\CYRZHDSC /g, '\\u0496' ],\n [ /\\\\cyrchar\\\\cyrzhdsc /g, '\\u0497' ],\n [ /\\\\cyrchar\\\\CYRZDSC /g, '\\u0498' ],\n [ /\\\\cyrchar\\\\cyrzdsc /g, '\\u0499' ],\n [ /\\\\cyrchar\\\\CYRKDSC /g, '\\u049A' ],\n [ /\\\\cyrchar\\\\cyrkdsc /g, '\\u049B' ],\n [ /\\\\cyrchar\\\\CYRKVCRS /g, '\\u049C' ],\n [ /\\\\cyrchar\\\\cyrkvcrs /g, '\\u049D' ],\n [ /\\\\cyrchar\\\\CYRKHCRS /g, '\\u049E' ],\n [ /\\\\cyrchar\\\\cyrkhcrs /g, '\\u049F' ],\n [ /\\\\cyrchar\\\\CYRKBEAK /g, '\\u04A0' ],\n [ /\\\\cyrchar\\\\cyrkbeak /g, '\\u04A1' ],\n [ /\\\\cyrchar\\\\CYRNDSC /g, '\\u04A2' ],\n [ /\\\\cyrchar\\\\cyrndsc /g, '\\u04A3' ],\n [ /\\\\cyrchar\\\\CYRNG /g, '\\u04A4' ],\n [ /\\\\cyrchar\\\\cyrng /g, '\\u04A5' ],\n [ /\\\\cyrchar\\\\CYRPHK /g, '\\u04A6' ],\n [ /\\\\cyrchar\\\\cyrphk /g, '\\u04A7' ],\n [ /\\\\cyrchar\\\\CYRABHHA /g, '\\u04A8' ],\n [ /\\\\cyrchar\\\\cyrabhha /g, '\\u04A9' ],\n [ /\\\\cyrchar\\\\CYRSDSC /g, '\\u04AA' ],\n [ /\\\\cyrchar\\\\cyrsdsc /g, '\\u04AB' ],\n [ /\\\\cyrchar\\\\CYRTDSC /g, '\\u04AC' ],\n [ /\\\\cyrchar\\\\cyrtdsc /g, '\\u04AD' ],\n [ /\\\\cyrchar\\\\CYRY /g, '\\u04AE' ],\n [ /\\\\cyrchar\\\\cyry /g, '\\u04AF' ],\n [ /\\\\cyrchar\\\\CYRYHCRS /g, '\\u04B0' ],\n [ /\\\\cyrchar\\\\cyryhcrs /g, '\\u04B1' ],\n [ /\\\\cyrchar\\\\CYRHDSC /g, '\\u04B2' ],\n [ /\\\\cyrchar\\\\cyrhdsc /g, '\\u04B3' ],\n [ /\\\\cyrchar\\\\CYRTETSE /g, '\\u04B4' ],\n [ /\\\\cyrchar\\\\cyrtetse /g, '\\u04B5' ],\n [ /\\\\cyrchar\\\\CYRCHRDSC /g, '\\u04B6' ],\n [ /\\\\cyrchar\\\\cyrchrdsc /g, '\\u04B7' ],\n [ /\\\\cyrchar\\\\CYRCHVCRS /g, '\\u04B8' ],\n [ /\\\\cyrchar\\\\cyrchvcrs /g, '\\u04B9' ],\n [ /\\\\cyrchar\\\\CYRSHHA /g, '\\u04BA' ],\n [ /\\\\cyrchar\\\\cyrshha /g, '\\u04BB' ],\n [ /\\\\cyrchar\\\\CYRABHCH /g, '\\u04BC' ],\n [ /\\\\cyrchar\\\\cyrabhch /g, '\\u04BD' ],\n [ /\\\\cyrchar\\\\CYRABHCHDSC /g, '\\u04BE' ],\n [ /\\\\cyrchar\\\\cyrabhchdsc /g, '\\u04BF' ],\n [ /\\\\cyrchar\\\\CYRpalochka /g, '\\u04C0' ],\n [ /\\\\cyrchar\\\\CYRKHK /g, '\\u04C3' ],\n [ /\\\\cyrchar\\\\cyrkhk /g, '\\u04C4' ],\n [ /\\\\cyrchar\\\\CYRNHK /g, '\\u04C7' ],\n [ /\\\\cyrchar\\\\cyrnhk /g, '\\u04C8' ],\n [ /\\\\cyrchar\\\\CYRCHLDSC /g, '\\u04CB' ],\n [ /\\\\cyrchar\\\\cyrchldsc /g, '\\u04CC' ],\n [ /\\\\cyrchar\\\\CYRAE /g, '\\u04D4' ],\n [ /\\\\cyrchar\\\\cyrae /g, '\\u04D5' ],\n [ /\\\\cyrchar\\\\CYRSCHWA /g, '\\u04D8' ],\n [ /\\\\cyrchar\\\\cyrschwa /g, '\\u04D9' ],\n [ /\\\\cyrchar\\\\CYRABHDZE /g, '\\u04E0' ],\n [ /\\\\cyrchar\\\\cyrabhdze /g, '\\u04E1' ],\n [ /\\\\cyrchar\\\\CYROTLD /g, '\\u04E8' ],\n [ /\\\\cyrchar\\\\cyrotld /g, '\\u04E9' ],\n [ /\\\\hspace\\{0.6em\\}/g, '\\u2002' ],\n [ /\\\\hspace\\{1em\\}/g, '\\u2003' ],\n [ /\\\\hspace\\{0.33em\\}/g, '\\u2004' ],\n [ /\\\\hspace\\{0.25em\\}/g, '\\u2005' ],\n [ /\\\\hspace\\{0.166em\\}/g, '\\u2006' ],\n [ /\\\\hphantom\\{0\\}/g, '\\u2007' ],\n [ /\\\\hphantom\\{,\\}/g, '\\u2008' ],\n [ /\\\\hspace\\{0.167em\\}/g, '\\u2009' ],\n [ /\\\\mkern1mu /g, '\\u200A' ],\n [ /\\\\textendash /g, '\\u2013' ],\n [ /\\\\textemdash /g, '\\u2014' ],\n [ /\\\\rule\\{1em\\}\\{1pt\\}/g, '\\u2015' ],\n [ /\\\\Vert /g, '\\u2016' ],\n [ /\\\\Elzreapos /g, '\\u201B' ],\n [ /\\\\textquotedblleft /g, '\\u201C' ],\n [ /\\\\textquotedblright /g, '\\u201D' ],\n [ /\\\\textdagger /g, '\\u2020' ],\n [ /\\\\textdaggerdbl /g, '\\u2021' ],\n [ /\\\\textbullet /g, '\\u2022' ],\n [ /\\\\ldots /g, '\\u2026' ],\n [ /\\\\textperthousand /g, '\\u2030' ],\n [ /\\\\textpertenthousand /g, '\\u2031' ],\n [ /\\\\backprime /g, '\\u2035' ],\n [ /\\\\guilsinglleft /g, '\\u2039' ],\n [ /\\\\guilsinglright /g, '\\u203A' ],\n [ /\\\\mkern4mu /g, '\\u205F' ],\n [ /\\\\nolinebreak /g, '\\u2060' ],\n [ /\\\\ensuremath\\{\\\\Elzpes\\}/g, '\\u20A7' ],\n [ /\\\\mbox\\{\\\\texteuro\\} /g, '\\u20AC' ],\n [ /\\\\dddot /g, '\\u20DB' ],\n [ /\\\\ddddot /g, '\\u20DC' ],\n [ /\\\\mathbb\\{C\\}/g, '\\u2102' ],\n [ /\\\\mathscr\\{g\\}/g, '\\u210A' ],\n [ /\\\\mathscr\\{H\\}/g, '\\u210B' ],\n [ /\\\\mathfrak\\{H\\}/g, '\\u210C' ],\n [ /\\\\mathbb\\{H\\}/g, '\\u210D' ],\n [ /\\\\hslash /g, '\\u210F' ],\n [ /\\\\mathscr\\{I\\}/g, '\\u2110' ],\n [ /\\\\mathfrak\\{I\\}/g, '\\u2111' ],\n [ /\\\\mathscr\\{L\\}/g, '\\u2112' ],\n [ /\\\\mathscr\\{l\\}/g, '\\u2113' ],\n [ /\\\\mathbb\\{N\\}/g, '\\u2115' ],\n [ /\\\\cyrchar\\\\textnumero /g, '\\u2116' ],\n [ /\\\\wp /g, '\\u2118' ],\n [ /\\\\mathbb\\{P\\}/g, '\\u2119' ],\n [ /\\\\mathbb\\{Q\\}/g, '\\u211A' ],\n [ /\\\\mathscr\\{R\\}/g, '\\u211B' ],\n [ /\\\\mathfrak\\{R\\}/g, '\\u211C' ],\n [ /\\\\mathbb\\{R\\}/g, '\\u211D' ],\n [ /\\\\Elzxrat /g, '\\u211E' ],\n [ /\\\\texttrademark /g, '\\u2122' ],\n [ /\\\\mathbb\\{Z\\}/g, '\\u2124' ],\n [ /\\\\Omega /g, '\\u2126' ],\n [ /\\\\mho /g, '\\u2127' ],\n [ /\\\\mathfrak\\{Z\\}/g, '\\u2128' ],\n [ /\\\\ElsevierGlyph\\{2129\\}/g, '\\u2129' ],\n [ /\\\\AA /g, '\\u212B' ],\n [ /\\\\mathscr\\{B\\}/g, '\\u212C' ],\n [ /\\\\mathfrak\\{C\\}/g, '\\u212D' ],\n [ /\\\\mathscr\\{e\\}/g, '\\u212F' ],\n [ /\\\\mathscr\\{E\\}/g, '\\u2130' ],\n [ /\\\\mathscr\\{F\\}/g, '\\u2131' ],\n [ /\\\\mathscr\\{M\\}/g, '\\u2133' ],\n [ /\\\\mathscr\\{o\\}/g, '\\u2134' ],\n [ /\\\\aleph /g, '\\u2135' ],\n [ /\\\\beth /g, '\\u2136' ],\n [ /\\\\gimel /g, '\\u2137' ],\n [ /\\\\daleth /g, '\\u2138' ],\n [ /\\\\textfrac\\{1\\}\\{3\\}/g, '\\u2153' ],\n [ /\\\\textfrac\\{2\\}\\{3\\}/g, '\\u2154' ],\n [ /\\\\textfrac\\{1\\}\\{5\\}/g, '\\u2155' ],\n [ /\\\\textfrac\\{2\\}\\{5\\}/g, '\\u2156' ],\n [ /\\\\textfrac\\{3\\}\\{5\\}/g, '\\u2157' ],\n [ /\\\\textfrac\\{4\\}\\{5\\}/g, '\\u2158' ],\n [ /\\\\textfrac\\{1\\}\\{6\\}/g, '\\u2159' ],\n [ /\\\\textfrac\\{5\\}\\{6\\}/g, '\\u215A' ],\n [ /\\\\textfrac\\{1\\}\\{8\\}/g, '\\u215B' ],\n [ /\\\\textfrac\\{3\\}\\{8\\}/g, '\\u215C' ],\n [ /\\\\textfrac\\{5\\}\\{8\\}/g, '\\u215D' ],\n [ /\\\\textfrac\\{7\\}\\{8\\}/g, '\\u215E' ],\n [ /\\\\leftarrow /g, '\\u2190' ],\n [ /\\\\uparrow /g, '\\u2191' ],\n [ /\\\\rightarrow /g, '\\u2192' ],\n [ /\\\\downarrow /g, '\\u2193' ],\n [ /\\\\leftrightarrow /g, '\\u2194' ],\n [ /\\\\updownarrow /g, '\\u2195' ],\n [ /\\\\nwarrow /g, '\\u2196' ],\n [ /\\\\nearrow /g, '\\u2197' ],\n [ /\\\\searrow /g, '\\u2198' ],\n [ /\\\\swarrow /g, '\\u2199' ],\n [ /\\\\nleftarrow /g, '\\u219A' ],\n [ /\\\\nrightarrow /g, '\\u219B' ],\n [ /\\\\arrowwaveright /g, '\\u219C' ],\n [ /\\\\arrowwaveright /g, '\\u219D' ],\n [ /\\\\twoheadleftarrow /g, '\\u219E' ],\n [ /\\\\twoheadrightarrow /g, '\\u21A0' ],\n [ /\\\\leftarrowtail /g, '\\u21A2' ],\n [ /\\\\rightarrowtail /g, '\\u21A3' ],\n [ /\\\\mapsto /g, '\\u21A6' ],\n [ /\\\\hookleftarrow /g, '\\u21A9' ],\n [ /\\\\hookrightarrow /g, '\\u21AA' ],\n [ /\\\\looparrowleft /g, '\\u21AB' ],\n [ /\\\\looparrowright /g, '\\u21AC' ],\n [ /\\\\leftrightsquigarrow /g, '\\u21AD' ],\n [ /\\\\nleftrightarrow /g, '\\u21AE' ],\n [ /\\\\Lsh /g, '\\u21B0' ],\n [ /\\\\Rsh /g, '\\u21B1' ],\n [ /\\\\ElsevierGlyph\\{21B3\\}/g, '\\u21B3' ],\n [ /\\\\curvearrowleft /g, '\\u21B6' ],\n [ /\\\\curvearrowright /g, '\\u21B7' ],\n [ /\\\\circlearrowleft /g, '\\u21BA' ],\n [ /\\\\circlearrowright /g, '\\u21BB' ],\n [ /\\\\leftharpoonup /g, '\\u21BC' ],\n [ /\\\\leftharpoondown /g, '\\u21BD' ],\n [ /\\\\upharpoonright /g, '\\u21BE' ],\n [ /\\\\upharpoonleft /g, '\\u21BF' ],\n [ /\\\\rightharpoonup /g, '\\u21C0' ],\n [ /\\\\rightharpoondown /g, '\\u21C1' ],\n [ /\\\\downharpoonright /g, '\\u21C2' ],\n [ /\\\\downharpoonleft /g, '\\u21C3' ],\n [ /\\\\rightleftarrows /g, '\\u21C4' ],\n [ /\\\\dblarrowupdown /g, '\\u21C5' ],\n [ /\\\\leftrightarrows /g, '\\u21C6' ],\n [ /\\\\leftleftarrows /g, '\\u21C7' ],\n [ /\\\\upuparrows /g, '\\u21C8' ],\n [ /\\\\rightrightarrows /g, '\\u21C9' ],\n [ /\\\\downdownarrows /g, '\\u21CA' ],\n [ /\\\\leftrightharpoons /g, '\\u21CB' ],\n [ /\\\\rightleftharpoons /g, '\\u21CC' ],\n [ /\\\\nLeftarrow /g, '\\u21CD' ],\n [ /\\\\nLeftrightarrow /g, '\\u21CE' ],\n [ /\\\\nRightarrow /g, '\\u21CF' ],\n [ /\\\\Leftarrow /g, '\\u21D0' ],\n [ /\\\\Uparrow /g, '\\u21D1' ],\n [ /\\\\Rightarrow /g, '\\u21D2' ],\n [ /\\\\Downarrow /g, '\\u21D3' ],\n [ /\\\\Leftrightarrow /g, '\\u21D4' ],\n [ /\\\\Updownarrow /g, '\\u21D5' ],\n [ /\\\\Lleftarrow /g, '\\u21DA' ],\n [ /\\\\Rrightarrow /g, '\\u21DB' ],\n [ /\\\\rightsquigarrow /g, '\\u21DD' ],\n [ /\\\\DownArrowUpArrow /g, '\\u21F5' ],\n [ /\\\\forall /g, '\\u2200' ],\n [ /\\\\complement /g, '\\u2201' ],\n [ /\\\\partial /g, '\\u2202' ],\n [ /\\\\exists /g, '\\u2203' ],\n [ /\\\\nexists /g, '\\u2204' ],\n [ /\\\\varnothing /g, '\\u2205' ],\n [ /\\\\nabla /g, '\\u2207' ],\n [ /\\\\in /g, '\\u2208' ],\n [ /\\\\not\\\\in /g, '\\u2209' ],\n [ /\\\\ni /g, '\\u220B' ],\n [ /\\\\not\\\\ni /g, '\\u220C' ],\n [ /\\\\prod /g, '\\u220F' ],\n [ /\\\\coprod /g, '\\u2210' ],\n [ /\\\\sum /g, '\\u2211' ],\n [ /\\\\mp /g, '\\u2213' ],\n [ /\\\\dotplus /g, '\\u2214' ],\n [ /\\\\setminus /g, '\\u2216' ],\n [ /\\\\circ /g, '\\u2218' ],\n [ /\\\\bullet /g, '\\u2219' ],\n [ /\\\\surd /g, '\\u221A' ],\n [ /\\\\propto /g, '\\u221D' ],\n [ /\\\\infty /g, '\\u221E' ],\n [ /\\\\rightangle /g, '\\u221F' ],\n [ /\\\\angle /g, '\\u2220' ],\n [ /\\\\measuredangle /g, '\\u2221' ],\n [ /\\\\sphericalangle /g, '\\u2222' ],\n [ /\\\\mid /g, '\\u2223' ],\n [ /\\\\nmid /g, '\\u2224' ],\n [ /\\\\parallel /g, '\\u2225' ],\n [ /\\\\nparallel /g, '\\u2226' ],\n [ /\\\\wedge /g, '\\u2227' ],\n [ /\\\\vee /g, '\\u2228' ],\n [ /\\\\cap /g, '\\u2229' ],\n [ /\\\\cup /g, '\\u222A' ],\n [ /\\\\int /g, '\\u222B' ],\n [ /\\\\int\\\\!\\\\int /g, '\\u222C' ],\n [ /\\\\int\\\\!\\\\int\\\\!\\\\int /g, '\\u222D' ],\n [ /\\\\oint /g, '\\u222E' ],\n [ /\\\\surfintegral /g, '\\u222F' ],\n [ /\\\\volintegral /g, '\\u2230' ],\n [ /\\\\clwintegral /g, '\\u2231' ],\n [ /\\\\ElsevierGlyph\\{2232\\}/g, '\\u2232' ],\n [ /\\\\ElsevierGlyph\\{2233\\}/g, '\\u2233' ],\n [ /\\\\therefore /g, '\\u2234' ],\n [ /\\\\because /g, '\\u2235' ],\n [ /\\\\Colon /g, '\\u2237' ],\n [ /\\\\ElsevierGlyph\\{2238\\}/g, '\\u2238' ],\n [ /\\\\mathbin\\{\\{:\\}\\\\!\\\\!\\{\\-\\}\\\\!\\\\!\\{:\\}\\}/g, '\\u223A' ],\n [ /\\\\homothetic /g, '\\u223B' ],\n [ /\\\\sim /g, '\\u223C' ],\n [ /\\\\backsim /g, '\\u223D' ],\n [ /\\\\lazysinv /g, '\\u223E' ],\n [ /\\\\wr /g, '\\u2240' ],\n [ /\\\\not\\\\sim /g, '\\u2241' ],\n [ /\\\\ElsevierGlyph\\{2242\\}/g, '\\u2242' ],\n [ /\\\\NotEqualTilde /g, '\\u2242-00338' ],\n [ /\\\\simeq /g, '\\u2243' ],\n [ /\\\\not\\\\simeq /g, '\\u2244' ],\n [ /\\\\cong /g, '\\u2245' ],\n [ /\\\\approxnotequal /g, '\\u2246' ],\n [ /\\\\not\\\\cong /g, '\\u2247' ],\n [ /\\\\approx /g, '\\u2248' ],\n [ /\\\\not\\\\approx /g, '\\u2249' ],\n [ /\\\\approxeq /g, '\\u224A' ],\n [ /\\\\tildetrpl /g, '\\u224B' ],\n [ /\\\\not\\\\apid /g, '\\u224B-00338' ],\n [ /\\\\allequal /g, '\\u224C' ],\n [ /\\\\asymp /g, '\\u224D' ],\n [ /\\\\Bumpeq /g, '\\u224E' ],\n [ /\\\\NotHumpDownHump /g, '\\u224E-00338' ],\n [ /\\\\bumpeq /g, '\\u224F' ],\n [ /\\\\NotHumpEqual /g, '\\u224F-00338' ],\n [ /\\\\doteq /g, '\\u2250' ],\n [ /\\\\not\\\\doteq/g, '\\u2250-00338' ],\n [ /\\\\doteqdot /g, '\\u2251' ],\n [ /\\\\fallingdotseq /g, '\\u2252' ],\n [ /\\\\risingdotseq /g, '\\u2253' ],\n [ /\\\\eqcirc /g, '\\u2256' ],\n [ /\\\\circeq /g, '\\u2257' ],\n [ /\\\\estimates /g, '\\u2259' ],\n [ /\\\\ElsevierGlyph\\{225A\\}/g, '\\u225A' ],\n [ /\\\\starequal /g, '\\u225B' ],\n [ /\\\\triangleq /g, '\\u225C' ],\n [ /\\\\ElsevierGlyph\\{225F\\}/g, '\\u225F' ],\n [ /\\\\not =/g, '\\u2260' ],\n [ /\\\\equiv /g, '\\u2261' ],\n [ /\\\\not\\\\equiv /g, '\\u2262' ],\n [ /\\\\leq /g, '\\u2264' ],\n [ /\\\\geq /g, '\\u2265' ],\n [ /\\\\leqq /g, '\\u2266' ],\n [ /\\\\geqq /g, '\\u2267' ],\n [ /\\\\lneqq /g, '\\u2268' ],\n [ /\\\\lvertneqq /g, '\\u2268-0FE00' ],\n [ /\\\\gneqq /g, '\\u2269' ],\n [ /\\\\gvertneqq /g, '\\u2269-0FE00' ],\n [ /\\\\ll /g, '\\u226A' ],\n [ /\\\\NotLessLess /g, '\\u226A-00338' ],\n [ /\\\\gg /g, '\\u226B' ],\n [ /\\\\NotGreaterGreater /g, '\\u226B-00338' ],\n [ /\\\\between /g, '\\u226C' ],\n [ /\\\\not\\\\kern\\-0.3em\\\\times /g, '\\u226D' ],\n [ /\\\\not/g, '\\u226F' ],\n [ /\\\\not\\\\leq /g, '\\u2270' ],\n [ /\\\\not\\\\geq /g, '\\u2271' ],\n [ /\\\\lessequivlnt /g, '\\u2272' ],\n [ /\\\\greaterequivlnt /g, '\\u2273' ],\n [ /\\\\ElsevierGlyph\\{2274\\}/g, '\\u2274' ],\n [ /\\\\ElsevierGlyph\\{2275\\}/g, '\\u2275' ],\n [ /\\\\lessgtr /g, '\\u2276' ],\n [ /\\\\gtrless /g, '\\u2277' ],\n [ /\\\\notlessgreater /g, '\\u2278' ],\n [ /\\\\notgreaterless /g, '\\u2279' ],\n [ /\\\\prec /g, '\\u227A' ],\n [ /\\\\succ /g, '\\u227B' ],\n [ /\\\\preccurlyeq /g, '\\u227C' ],\n [ /\\\\succcurlyeq /g, '\\u227D' ],\n [ /\\\\precapprox /g, '\\u227E' ],\n [ /\\\\NotPrecedesTilde /g, '\\u227E-00338' ],\n [ /\\\\succapprox /g, '\\u227F' ],\n [ /\\\\NotSucceedsTilde /g, '\\u227F-00338' ],\n [ /\\\\not\\\\prec /g, '\\u2280' ],\n [ /\\\\not\\\\succ /g, '\\u2281' ],\n [ /\\\\subset /g, '\\u2282' ],\n [ /\\\\supset /g, '\\u2283' ],\n [ /\\\\not\\\\subset /g, '\\u2284' ],\n [ /\\\\not\\\\supset /g, '\\u2285' ],\n [ /\\\\subseteq /g, '\\u2286' ],\n [ /\\\\supseteq /g, '\\u2287' ],\n [ /\\\\not\\\\subseteq /g, '\\u2288' ],\n [ /\\\\not\\\\supseteq /g, '\\u2289' ],\n [ /\\\\subsetneq /g, '\\u228A' ],\n [ /\\\\varsubsetneqq /g, '\\u228A-0FE00' ],\n [ /\\\\supsetneq /g, '\\u228B' ],\n [ /\\\\varsupsetneq /g, '\\u228B-0FE00' ],\n [ /\\\\uplus /g, '\\u228E' ],\n [ /\\\\sqsubset /g, '\\u228F' ],\n [ /\\\\NotSquareSubset /g, '\\u228F-00338' ],\n [ /\\\\sqsupset /g, '\\u2290' ],\n [ /\\\\NotSquareSuperset /g, '\\u2290-00338' ],\n [ /\\\\sqsubseteq /g, '\\u2291' ],\n [ /\\\\sqsupseteq /g, '\\u2292' ],\n [ /\\\\sqcap /g, '\\u2293' ],\n [ /\\\\sqcup /g, '\\u2294' ],\n [ /\\\\oplus /g, '\\u2295' ],\n [ /\\\\ominus /g, '\\u2296' ],\n [ /\\\\otimes /g, '\\u2297' ],\n [ /\\\\oslash /g, '\\u2298' ],\n [ /\\\\odot /g, '\\u2299' ],\n [ /\\\\circledcirc /g, '\\u229A' ],\n [ /\\\\circledast /g, '\\u229B' ],\n [ /\\\\circleddash /g, '\\u229D' ],\n [ /\\\\boxplus /g, '\\u229E' ],\n [ /\\\\boxminus /g, '\\u229F' ],\n [ /\\\\boxtimes /g, '\\u22A0' ],\n [ /\\\\boxdot /g, '\\u22A1' ],\n [ /\\\\vdash /g, '\\u22A2' ],\n [ /\\\\dashv /g, '\\u22A3' ],\n [ /\\\\top /g, '\\u22A4' ],\n [ /\\\\perp /g, '\\u22A5' ],\n [ /\\\\truestate /g, '\\u22A7' ],\n [ /\\\\forcesextra /g, '\\u22A8' ],\n [ /\\\\Vdash /g, '\\u22A9' ],\n [ /\\\\Vvdash /g, '\\u22AA' ],\n [ /\\\\VDash /g, '\\u22AB' ],\n [ /\\\\nvdash /g, '\\u22AC' ],\n [ /\\\\nvDash /g, '\\u22AD' ],\n [ /\\\\nVdash /g, '\\u22AE' ],\n [ /\\\\nVDash /g, '\\u22AF' ],\n [ /\\\\vartriangleleft /g, '\\u22B2' ],\n [ /\\\\vartriangleright /g, '\\u22B3' ],\n [ /\\\\trianglelefteq /g, '\\u22B4' ],\n [ /\\\\trianglerighteq /g, '\\u22B5' ],\n [ /\\\\original /g, '\\u22B6' ],\n [ /\\\\image /g, '\\u22B7' ],\n [ /\\\\multimap /g, '\\u22B8' ],\n [ /\\\\hermitconjmatrix /g, '\\u22B9' ],\n [ /\\\\intercal /g, '\\u22BA' ],\n [ /\\\\veebar /g, '\\u22BB' ],\n [ /\\\\rightanglearc /g, '\\u22BE' ],\n [ /\\\\ElsevierGlyph\\{22C0\\}/g, '\\u22C0' ],\n [ /\\\\ElsevierGlyph\\{22C1\\}/g, '\\u22C1' ],\n [ /\\\\bigcap /g, '\\u22C2' ],\n [ /\\\\bigcup /g, '\\u22C3' ],\n [ /\\\\diamond /g, '\\u22C4' ],\n [ /\\\\cdot /g, '\\u22C5' ],\n [ /\\\\star /g, '\\u22C6' ],\n [ /\\\\divideontimes /g, '\\u22C7' ],\n [ /\\\\bowtie /g, '\\u22C8' ],\n [ /\\\\ltimes /g, '\\u22C9' ],\n [ /\\\\rtimes /g, '\\u22CA' ],\n [ /\\\\leftthreetimes /g, '\\u22CB' ],\n [ /\\\\rightthreetimes /g, '\\u22CC' ],\n [ /\\\\backsimeq /g, '\\u22CD' ],\n [ /\\\\curlyvee /g, '\\u22CE' ],\n [ /\\\\curlywedge /g, '\\u22CF' ],\n [ /\\\\Subset /g, '\\u22D0' ],\n [ /\\\\Supset /g, '\\u22D1' ],\n [ /\\\\Cap /g, '\\u22D2' ],\n [ /\\\\Cup /g, '\\u22D3' ],\n [ /\\\\pitchfork /g, '\\u22D4' ],\n [ /\\\\lessdot /g, '\\u22D6' ],\n [ /\\\\gtrdot /g, '\\u22D7' ],\n [ /\\\\verymuchless /g, '\\u22D8' ],\n [ /\\\\verymuchgreater /g, '\\u22D9' ],\n [ /\\\\lesseqgtr /g, '\\u22DA' ],\n [ /\\\\gtreqless /g, '\\u22DB' ],\n [ /\\\\curlyeqprec /g, '\\u22DE' ],\n [ /\\\\curlyeqsucc /g, '\\u22DF' ],\n [ /\\\\not\\\\sqsubseteq /g, '\\u22E2' ],\n [ /\\\\not\\\\sqsupseteq /g, '\\u22E3' ],\n [ /\\\\Elzsqspne /g, '\\u22E5' ],\n [ /\\\\lnsim /g, '\\u22E6' ],\n [ /\\\\gnsim /g, '\\u22E7' ],\n [ /\\\\precedesnotsimilar /g, '\\u22E8' ],\n [ /\\\\succnsim /g, '\\u22E9' ],\n [ /\\\\ntriangleleft /g, '\\u22EA' ],\n [ /\\\\ntriangleright /g, '\\u22EB' ],\n [ /\\\\ntrianglelefteq /g, '\\u22EC' ],\n [ /\\\\ntrianglerighteq /g, '\\u22ED' ],\n [ /\\\\vdots /g, '\\u22EE' ],\n [ /\\\\cdots /g, '\\u22EF' ],\n [ /\\\\upslopeellipsis /g, '\\u22F0' ],\n [ /\\\\downslopeellipsis /g, '\\u22F1' ],\n [ /\\\\barwedge /g, '\\u2305' ],\n [ /\\\\perspcorrespond /g, '\\u2306' ],\n [ /\\\\lceil /g, '\\u2308' ],\n [ /\\\\rceil /g, '\\u2309' ],\n [ /\\\\lfloor /g, '\\u230A' ],\n [ /\\\\rfloor /g, '\\u230B' ],\n [ /\\\\recorder /g, '\\u2315' ],\n [ /\\\\mathchar\"2208/g, '\\u2316' ],\n [ /\\\\ulcorner /g, '\\u231C' ],\n [ /\\\\urcorner /g, '\\u231D' ],\n [ /\\\\llcorner /g, '\\u231E' ],\n [ /\\\\lrcorner /g, '\\u231F' ],\n [ /\\\\frown /g, '\\u2322' ],\n [ /\\\\smile /g, '\\u2323' ],\n [ /\\\\langle /g, '\\u2329' ],\n [ /\\\\rangle /g, '\\u232A' ],\n [ /\\\\ElsevierGlyph\\{E838\\}/g, '\\u233D' ],\n [ /\\\\Elzdlcorn /g, '\\u23A3' ],\n [ /\\\\lmoustache /g, '\\u23B0' ],\n [ /\\\\rmoustache /g, '\\u23B1' ],\n [ /\\\\textvisiblespace /g, '\\u2423' ],\n [ /\\\\ding\\{172\\}/g, '\\u2460' ],\n [ /\\\\ding\\{173\\}/g, '\\u2461' ],\n [ /\\\\ding\\{174\\}/g, '\\u2462' ],\n [ /\\\\ding\\{175\\}/g, '\\u2463' ],\n [ /\\\\ding\\{176\\}/g, '\\u2464' ],\n [ /\\\\ding\\{177\\}/g, '\\u2465' ],\n [ /\\\\ding\\{178\\}/g, '\\u2466' ],\n [ /\\\\ding\\{179\\}/g, '\\u2467' ],\n [ /\\\\ding\\{180\\}/g, '\\u2468' ],\n [ /\\\\ding\\{181\\}/g, '\\u2469' ],\n [ /\\\\circledS /g, '\\u24C8' ],\n [ /\\\\Elzdshfnc /g, '\\u2506' ],\n [ /\\\\Elzsqfnw /g, '\\u2519' ],\n [ /\\\\diagup /g, '\\u2571' ],\n [ /\\\\ding\\{110\\}/g, '\\u25A0' ],\n [ /\\\\square /g, '\\u25A1' ],\n [ /\\\\blacksquare /g, '\\u25AA' ],\n [ /\\\\fbox\\{~~\\}/g, '\\u25AD' ],\n [ /\\\\Elzvrecto /g, '\\u25AF' ],\n [ /\\\\ElsevierGlyph\\{E381\\}/g, '\\u25B1' ],\n [ /\\\\ding\\{115\\}/g, '\\u25B2' ],\n [ /\\\\bigtriangleup /g, '\\u25B3' ],\n [ /\\\\blacktriangle /g, '\\u25B4' ],\n [ /\\\\vartriangle /g, '\\u25B5' ],\n [ /\\\\blacktriangleright /g, '\\u25B8' ],\n [ /\\\\triangleright /g, '\\u25B9' ],\n [ /\\\\ding\\{116\\}/g, '\\u25BC' ],\n [ /\\\\bigtriangledown /g, '\\u25BD' ],\n [ /\\\\blacktriangledown /g, '\\u25BE' ],\n [ /\\\\triangledown /g, '\\u25BF' ],\n [ /\\\\blacktriangleleft /g, '\\u25C2' ],\n [ /\\\\triangleleft /g, '\\u25C3' ],\n [ /\\\\ding\\{117\\}/g, '\\u25C6' ],\n [ /\\\\lozenge /g, '\\u25CA' ],\n [ /\\\\bigcirc /g, '\\u25CB' ],\n [ /\\\\ding\\{108\\}/g, '\\u25CF' ],\n [ /\\\\Elzcirfl /g, '\\u25D0' ],\n [ /\\\\Elzcirfr /g, '\\u25D1' ],\n [ /\\\\Elzcirfb /g, '\\u25D2' ],\n [ /\\\\ding\\{119\\}/g, '\\u25D7' ],\n [ /\\\\Elzrvbull /g, '\\u25D8' ],\n [ /\\\\Elzsqfl /g, '\\u25E7' ],\n [ /\\\\Elzsqfr /g, '\\u25E8' ],\n [ /\\\\Elzsqfse /g, '\\u25EA' ],\n [ /\\\\bigcirc /g, '\\u25EF' ],\n [ /\\\\ding\\{72\\}/g, '\\u2605' ],\n [ /\\\\ding\\{73\\}/g, '\\u2606' ],\n [ /\\\\ding\\{37\\}/g, '\\u260E' ],\n [ /\\\\ding\\{42\\}/g, '\\u261B' ],\n [ /\\\\ding\\{43\\}/g, '\\u261E' ],\n [ /\\\\rightmoon /g, '\\u263E' ],\n [ /\\\\mercury /g, '\\u263F' ],\n [ /\\\\venus /g, '\\u2640' ],\n [ /\\\\male /g, '\\u2642' ],\n [ /\\\\jupiter /g, '\\u2643' ],\n [ /\\\\saturn /g, '\\u2644' ],\n [ /\\\\uranus /g, '\\u2645' ],\n [ /\\\\neptune /g, '\\u2646' ],\n [ /\\\\pluto /g, '\\u2647' ],\n [ /\\\\aries /g, '\\u2648' ],\n [ /\\\\taurus /g, '\\u2649' ],\n [ /\\\\gemini /g, '\\u264A' ],\n [ /\\\\cancer /g, '\\u264B' ],\n [ /\\\\leo /g, '\\u264C' ],\n [ /\\\\virgo /g, '\\u264D' ],\n [ /\\\\libra /g, '\\u264E' ],\n [ /\\\\scorpio /g, '\\u264F' ],\n [ /\\\\sagittarius /g, '\\u2650' ],\n [ /\\\\capricornus /g, '\\u2651' ],\n [ /\\\\aquarius /g, '\\u2652' ],\n [ /\\\\pisces /g, '\\u2653' ],\n [ /\\\\ding\\{171\\}/g, '\\u2660' ],\n [ /\\\\diamond /g, '\\u2662' ],\n [ /\\\\ding\\{168\\}/g, '\\u2663' ],\n [ /\\\\ding\\{170\\}/g, '\\u2665' ],\n [ /\\\\ding\\{169\\}/g, '\\u2666' ],\n [ /\\\\quarternote /g, '\\u2669' ],\n [ /\\\\eighthnote /g, '\\u266A' ],\n [ /\\\\flat /g, '\\u266D' ],\n [ /\\\\natural /g, '\\u266E' ],\n [ /\\\\sharp /g, '\\u266F' ],\n [ /\\\\ding\\{33\\}/g, '\\u2701' ],\n [ /\\\\ding\\{34\\}/g, '\\u2702' ],\n [ /\\\\ding\\{35\\}/g, '\\u2703' ],\n [ /\\\\ding\\{36\\}/g, '\\u2704' ],\n [ /\\\\ding\\{38\\}/g, '\\u2706' ],\n [ /\\\\ding\\{39\\}/g, '\\u2707' ],\n [ /\\\\ding\\{40\\}/g, '\\u2708' ],\n [ /\\\\ding\\{41\\}/g, '\\u2709' ],\n [ /\\\\ding\\{44\\}/g, '\\u270C' ],\n [ /\\\\ding\\{45\\}/g, '\\u270D' ],\n [ /\\\\ding\\{46\\}/g, '\\u270E' ],\n [ /\\\\ding\\{47\\}/g, '\\u270F' ],\n [ /\\\\ding\\{48\\}/g, '\\u2710' ],\n [ /\\\\ding\\{49\\}/g, '\\u2711' ],\n [ /\\\\ding\\{50\\}/g, '\\u2712' ],\n [ /\\\\ding\\{51\\}/g, '\\u2713' ],\n [ /\\\\ding\\{52\\}/g, '\\u2714' ],\n [ /\\\\ding\\{53\\}/g, '\\u2715' ],\n [ /\\\\ding\\{54\\}/g, '\\u2716' ],\n [ /\\\\ding\\{55\\}/g, '\\u2717' ],\n [ /\\\\ding\\{56\\}/g, '\\u2718' ],\n [ /\\\\ding\\{57\\}/g, '\\u2719' ],\n [ /\\\\ding\\{58\\}/g, '\\u271A' ],\n [ /\\\\ding\\{59\\}/g, '\\u271B' ],\n [ /\\\\ding\\{60\\}/g, '\\u271C' ],\n [ /\\\\ding\\{61\\}/g, '\\u271D' ],\n [ /\\\\ding\\{62\\}/g, '\\u271E' ],\n [ /\\\\ding\\{63\\}/g, '\\u271F' ],\n [ /\\\\ding\\{64\\}/g, '\\u2720' ],\n [ /\\\\ding\\{65\\}/g, '\\u2721' ],\n [ /\\\\ding\\{66\\}/g, '\\u2722' ],\n [ /\\\\ding\\{67\\}/g, '\\u2723' ],\n [ /\\\\ding\\{68\\}/g, '\\u2724' ],\n [ /\\\\ding\\{69\\}/g, '\\u2725' ],\n [ /\\\\ding\\{70\\}/g, '\\u2726' ],\n [ /\\\\ding\\{71\\}/g, '\\u2727' ],\n [ /\\\\ding\\{73\\}/g, '\\u2729' ],\n [ /\\\\ding\\{74\\}/g, '\\u272A' ],\n [ /\\\\ding\\{75\\}/g, '\\u272B' ],\n [ /\\\\ding\\{76\\}/g, '\\u272C' ],\n [ /\\\\ding\\{77\\}/g, '\\u272D' ],\n [ /\\\\ding\\{78\\}/g, '\\u272E' ],\n [ /\\\\ding\\{79\\}/g, '\\u272F' ],\n [ /\\\\ding\\{80\\}/g, '\\u2730' ],\n [ /\\\\ding\\{81\\}/g, '\\u2731' ],\n [ /\\\\ding\\{82\\}/g, '\\u2732' ],\n [ /\\\\ding\\{83\\}/g, '\\u2733' ],\n [ /\\\\ding\\{84\\}/g, '\\u2734' ],\n [ /\\\\ding\\{85\\}/g, '\\u2735' ],\n [ /\\\\ding\\{86\\}/g, '\\u2736' ],\n [ /\\\\ding\\{87\\}/g, '\\u2737' ],\n [ /\\\\ding\\{88\\}/g, '\\u2738' ],\n [ /\\\\ding\\{89\\}/g, '\\u2739' ],\n [ /\\\\ding\\{90\\}/g, '\\u273A' ],\n [ /\\\\ding\\{91\\}/g, '\\u273B' ],\n [ /\\\\ding\\{92\\}/g, '\\u273C' ],\n [ /\\\\ding\\{93\\}/g, '\\u273D' ],\n [ /\\\\ding\\{94\\}/g, '\\u273E' ],\n [ /\\\\ding\\{95\\}/g, '\\u273F' ],\n [ /\\\\ding\\{96\\}/g, '\\u2740' ],\n [ /\\\\ding\\{97\\}/g, '\\u2741' ],\n [ /\\\\ding\\{98\\}/g, '\\u2742' ],\n [ /\\\\ding\\{99\\}/g, '\\u2743' ],\n [ /\\\\ding\\{100\\}/g, '\\u2744' ],\n [ /\\\\ding\\{101\\}/g, '\\u2745' ],\n [ /\\\\ding\\{102\\}/g, '\\u2746' ],\n [ /\\\\ding\\{103\\}/g, '\\u2747' ],\n [ /\\\\ding\\{104\\}/g, '\\u2748' ],\n [ /\\\\ding\\{105\\}/g, '\\u2749' ],\n [ /\\\\ding\\{106\\}/g, '\\u274A' ],\n [ /\\\\ding\\{107\\}/g, '\\u274B' ],\n [ /\\\\ding\\{109\\}/g, '\\u274D' ],\n [ /\\\\ding\\{111\\}/g, '\\u274F' ],\n [ /\\\\ding\\{112\\}/g, '\\u2750' ],\n [ /\\\\ding\\{113\\}/g, '\\u2751' ],\n [ /\\\\ding\\{114\\}/g, '\\u2752' ],\n [ /\\\\ding\\{118\\}/g, '\\u2756' ],\n [ /\\\\ding\\{120\\}/g, '\\u2758' ],\n [ /\\\\ding\\{121\\}/g, '\\u2759' ],\n [ /\\\\ding\\{122\\}/g, '\\u275A' ],\n [ /\\\\ding\\{123\\}/g, '\\u275B' ],\n [ /\\\\ding\\{124\\}/g, '\\u275C' ],\n [ /\\\\ding\\{125\\}/g, '\\u275D' ],\n [ /\\\\ding\\{126\\}/g, '\\u275E' ],\n [ /\\\\ding\\{161\\}/g, '\\u2761' ],\n [ /\\\\ding\\{162\\}/g, '\\u2762' ],\n [ /\\\\ding\\{163\\}/g, '\\u2763' ],\n [ /\\\\ding\\{164\\}/g, '\\u2764' ],\n [ /\\\\ding\\{165\\}/g, '\\u2765' ],\n [ /\\\\ding\\{166\\}/g, '\\u2766' ],\n [ /\\\\ding\\{167\\}/g, '\\u2767' ],\n [ /\\\\ding\\{182\\}/g, '\\u2776' ],\n [ /\\\\ding\\{183\\}/g, '\\u2777' ],\n [ /\\\\ding\\{184\\}/g, '\\u2778' ],\n [ /\\\\ding\\{185\\}/g, '\\u2779' ],\n [ /\\\\ding\\{186\\}/g, '\\u277A' ],\n [ /\\\\ding\\{187\\}/g, '\\u277B' ],\n [ /\\\\ding\\{188\\}/g, '\\u277C' ],\n [ /\\\\ding\\{189\\}/g, '\\u277D' ],\n [ /\\\\ding\\{190\\}/g, '\\u277E' ],\n [ /\\\\ding\\{191\\}/g, '\\u277F' ],\n [ /\\\\ding\\{192\\}/g, '\\u2780' ],\n [ /\\\\ding\\{193\\}/g, '\\u2781' ],\n [ /\\\\ding\\{194\\}/g, '\\u2782' ],\n [ /\\\\ding\\{195\\}/g, '\\u2783' ],\n [ /\\\\ding\\{196\\}/g, '\\u2784' ],\n [ /\\\\ding\\{197\\}/g, '\\u2785' ],\n [ /\\\\ding\\{198\\}/g, '\\u2786' ],\n [ /\\\\ding\\{199\\}/g, '\\u2787' ],\n [ /\\\\ding\\{200\\}/g, '\\u2788' ],\n [ /\\\\ding\\{201\\}/g, '\\u2789' ],\n [ /\\\\ding\\{202\\}/g, '\\u278A' ],\n [ /\\\\ding\\{203\\}/g, '\\u278B' ],\n [ /\\\\ding\\{204\\}/g, '\\u278C' ],\n [ /\\\\ding\\{205\\}/g, '\\u278D' ],\n [ /\\\\ding\\{206\\}/g, '\\u278E' ],\n [ /\\\\ding\\{207\\}/g, '\\u278F' ],\n [ /\\\\ding\\{208\\}/g, '\\u2790' ],\n [ /\\\\ding\\{209\\}/g, '\\u2791' ],\n [ /\\\\ding\\{210\\}/g, '\\u2792' ],\n [ /\\\\ding\\{211\\}/g, '\\u2793' ],\n [ /\\\\ding\\{212\\}/g, '\\u2794' ],\n [ /\\\\ding\\{216\\}/g, '\\u2798' ],\n [ /\\\\ding\\{217\\}/g, '\\u2799' ],\n [ /\\\\ding\\{218\\}/g, '\\u279A' ],\n [ /\\\\ding\\{219\\}/g, '\\u279B' ],\n [ /\\\\ding\\{220\\}/g, '\\u279C' ],\n [ /\\\\ding\\{221\\}/g, '\\u279D' ],\n [ /\\\\ding\\{222\\}/g, '\\u279E' ],\n [ /\\\\ding\\{223\\}/g, '\\u279F' ],\n [ /\\\\ding\\{224\\}/g, '\\u27A0' ],\n [ /\\\\ding\\{225\\}/g, '\\u27A1' ],\n [ /\\\\ding\\{226\\}/g, '\\u27A2' ],\n [ /\\\\ding\\{227\\}/g, '\\u27A3' ],\n [ /\\\\ding\\{228\\}/g, '\\u27A4' ],\n [ /\\\\ding\\{229\\}/g, '\\u27A5' ],\n [ /\\\\ding\\{230\\}/g, '\\u27A6' ],\n [ /\\\\ding\\{231\\}/g, '\\u27A7' ],\n [ /\\\\ding\\{232\\}/g, '\\u27A8' ],\n [ /\\\\ding\\{233\\}/g, '\\u27A9' ],\n [ /\\\\ding\\{234\\}/g, '\\u27AA' ],\n [ /\\\\ding\\{235\\}/g, '\\u27AB' ],\n [ /\\\\ding\\{236\\}/g, '\\u27AC' ],\n [ /\\\\ding\\{237\\}/g, '\\u27AD' ],\n [ /\\\\ding\\{238\\}/g, '\\u27AE' ],\n [ /\\\\ding\\{239\\}/g, '\\u27AF' ],\n [ /\\\\ding\\{241\\}/g, '\\u27B1' ],\n [ /\\\\ding\\{242\\}/g, '\\u27B2' ],\n [ /\\\\ding\\{243\\}/g, '\\u27B3' ],\n [ /\\\\ding\\{244\\}/g, '\\u27B4' ],\n [ /\\\\ding\\{245\\}/g, '\\u27B5' ],\n [ /\\\\ding\\{246\\}/g, '\\u27B6' ],\n [ /\\\\ding\\{247\\}/g, '\\u27B7' ],\n [ /\\\\ding\\{248\\}/g, '\\u27B8' ],\n [ /\\\\ding\\{249\\}/g, '\\u27B9' ],\n [ /\\\\ding\\{250\\}/g, '\\u27BA' ],\n [ /\\\\ding\\{251\\}/g, '\\u27BB' ],\n [ /\\\\ding\\{252\\}/g, '\\u27BC' ],\n [ /\\\\ding\\{253\\}/g, '\\u27BD' ],\n [ /\\\\ding\\{254\\}/g, '\\u27BE' ],\n [ /\\\\longleftarrow /g, '\\u27F5' ],\n [ /\\\\longrightarrow /g, '\\u27F6' ],\n [ /\\\\longleftrightarrow /g, '\\u27F7' ],\n [ /\\\\Longleftarrow /g, '\\u27F8' ],\n [ /\\\\Longrightarrow /g, '\\u27F9' ],\n [ /\\\\Longleftrightarrow /g, '\\u27FA' ],\n [ /\\\\longmapsto /g, '\\u27FC' ],\n [ /\\\\sim\\\\joinrel\\\\leadsto/g, '\\u27FF' ],\n [ /\\\\ElsevierGlyph\\{E212\\}/g, '\\u2905' ],\n [ /\\\\UpArrowBar /g, '\\u2912' ],\n [ /\\\\DownArrowBar /g, '\\u2913' ],\n [ /\\\\ElsevierGlyph\\{E20C\\}/g, '\\u2923' ],\n [ /\\\\ElsevierGlyph\\{E20D\\}/g, '\\u2924' ],\n [ /\\\\ElsevierGlyph\\{E20B\\}/g, '\\u2925' ],\n [ /\\\\ElsevierGlyph\\{E20A\\}/g, '\\u2926' ],\n [ /\\\\ElsevierGlyph\\{E211\\}/g, '\\u2927' ],\n [ /\\\\ElsevierGlyph\\{E20E\\}/g, '\\u2928' ],\n [ /\\\\ElsevierGlyph\\{E20F\\}/g, '\\u2929' ],\n [ /\\\\ElsevierGlyph\\{E210\\}/g, '\\u292A' ],\n [ /\\\\ElsevierGlyph\\{E21C\\}/g, '\\u2933' ],\n [ /\\\\ElsevierGlyph\\{E21D\\}/g, '\\u2933-00338' ],\n [ /\\\\ElsevierGlyph\\{E21A\\}/g, '\\u2936' ],\n [ /\\\\ElsevierGlyph\\{E219\\}/g, '\\u2937' ],\n [ /\\\\Elolarr /g, '\\u2940' ],\n [ /\\\\Elorarr /g, '\\u2941' ],\n [ /\\\\ElzRlarr /g, '\\u2942' ],\n [ /\\\\ElzrLarr /g, '\\u2944' ],\n [ /\\\\Elzrarrx /g, '\\u2947' ],\n [ /\\\\LeftRightVector /g, '\\u294E' ],\n [ /\\\\RightUpDownVector /g, '\\u294F' ],\n [ /\\\\DownLeftRightVector /g, '\\u2950' ],\n [ /\\\\LeftUpDownVector /g, '\\u2951' ],\n [ /\\\\LeftVectorBar /g, '\\u2952' ],\n [ /\\\\RightVectorBar /g, '\\u2953' ],\n [ /\\\\RightUpVectorBar /g, '\\u2954' ],\n [ /\\\\RightDownVectorBar /g, '\\u2955' ],\n [ /\\\\DownLeftVectorBar /g, '\\u2956' ],\n [ /\\\\DownRightVectorBar /g, '\\u2957' ],\n [ /\\\\LeftUpVectorBar /g, '\\u2958' ],\n [ /\\\\LeftDownVectorBar /g, '\\u2959' ],\n [ /\\\\LeftTeeVector /g, '\\u295A' ],\n [ /\\\\RightTeeVector /g, '\\u295B' ],\n [ /\\\\RightUpTeeVector /g, '\\u295C' ],\n [ /\\\\RightDownTeeVector /g, '\\u295D' ],\n [ /\\\\DownLeftTeeVector /g, '\\u295E' ],\n [ /\\\\DownRightTeeVector /g, '\\u295F' ],\n [ /\\\\LeftUpTeeVector /g, '\\u2960' ],\n [ /\\\\LeftDownTeeVector /g, '\\u2961' ],\n [ /\\\\UpEquilibrium /g, '\\u296E' ],\n [ /\\\\ReverseUpEquilibrium /g, '\\u296F' ],\n [ /\\\\RoundImplies /g, '\\u2970' ],\n [ /\\\\ElsevierGlyph\\{E214\\}/g, '\\u297C' ],\n [ /\\\\ElsevierGlyph\\{E215\\}/g, '\\u297D' ],\n [ /\\\\Elztfnc /g, '\\u2980' ],\n [ /\\\\ElsevierGlyph\\{3018\\}/g, '\\u2985' ],\n [ /\\\\Elroang /g, '\\u2986' ],\n [ /\\\\ElsevierGlyph\\{E291\\}/g, '\\u2994' ],\n [ /\\\\Elzddfnc /g, '\\u2999' ],\n [ /\\\\Angle /g, '\\u299C' ],\n [ /\\\\Elzlpargt /g, '\\u29A0' ],\n [ /\\\\ElsevierGlyph\\{E260\\}/g, '\\u29B5' ],\n [ /\\\\ElsevierGlyph\\{E61B\\}/g, '\\u29B6' ],\n [ /\\\\ElzLap /g, '\\u29CA' ],\n [ /\\\\Elzdefas /g, '\\u29CB' ],\n [ /\\\\LeftTriangleBar /g, '\\u29CF' ],\n [ /\\\\NotLeftTriangleBar /g, '\\u29CF-00338' ],\n [ /\\\\RightTriangleBar /g, '\\u29D0' ],\n [ /\\\\NotRightTriangleBar /g, '\\u29D0-00338' ],\n [ /\\\\ElsevierGlyph\\{E372\\}/g, '\\u29DC' ],\n [ /\\\\blacklozenge /g, '\\u29EB' ],\n [ /\\\\RuleDelayed /g, '\\u29F4' ],\n [ /\\\\Elxuplus /g, '\\u2A04' ],\n [ /\\\\ElzThr /g, '\\u2A05' ],\n [ /\\\\Elxsqcup /g, '\\u2A06' ],\n [ /\\\\ElzInf /g, '\\u2A07' ],\n [ /\\\\ElzSup /g, '\\u2A08' ],\n [ /\\\\ElzCint /g, '\\u2A0D' ],\n [ /\\\\clockoint /g, '\\u2A0F' ],\n [ /\\\\ElsevierGlyph\\{E395\\}/g, '\\u2A10' ],\n [ /\\\\sqrint /g, '\\u2A16' ],\n [ /\\\\ElsevierGlyph\\{E25A\\}/g, '\\u2A25' ],\n [ /\\\\ElsevierGlyph\\{E25B\\}/g, '\\u2A2A' ],\n [ /\\\\ElsevierGlyph\\{E25C\\}/g, '\\u2A2D' ],\n [ /\\\\ElsevierGlyph\\{E25D\\}/g, '\\u2A2E' ],\n [ /\\\\ElzTimes /g, '\\u2A2F' ],\n [ /\\\\ElsevierGlyph\\{E25E\\}/g, '\\u2A34' ],\n [ /\\\\ElsevierGlyph\\{E25E\\}/g, '\\u2A35' ],\n [ /\\\\ElsevierGlyph\\{E259\\}/g, '\\u2A3C' ],\n [ /\\\\amalg /g, '\\u2A3F' ],\n [ /\\\\ElzAnd /g, '\\u2A53' ],\n [ /\\\\ElzOr /g, '\\u2A54' ],\n [ /\\\\ElsevierGlyph\\{E36E\\}/g, '\\u2A55' ],\n [ /\\\\ElOr /g, '\\u2A56' ],\n [ /\\\\perspcorrespond /g, '\\u2A5E' ],\n [ /\\\\Elzminhat /g, '\\u2A5F' ],\n [ /\\\\ElsevierGlyph\\{225A\\}/g, '\\u2A63' ],\n [ /\\\\stackrel\\{*\\}\\{=\\}/g, '\\u2A6E' ],\n [ /\\\\Equal /g, '\\u2A75' ],\n [ /\\\\leqslant /g, '\\u2A7D' ],\n [ /\\\\nleqslant /g, '\\u2A7D-00338' ],\n [ /\\\\geqslant /g, '\\u2A7E' ],\n [ /\\\\ngeqslant /g, '\\u2A7E-00338' ],\n [ /\\\\lessapprox /g, '\\u2A85' ],\n [ /\\\\gtrapprox /g, '\\u2A86' ],\n [ /\\\\lneq /g, '\\u2A87' ],\n [ /\\\\gneq /g, '\\u2A88' ],\n [ /\\\\lnapprox /g, '\\u2A89' ],\n [ /\\\\gnapprox /g, '\\u2A8A' ],\n [ /\\\\lesseqqgtr /g, '\\u2A8B' ],\n [ /\\\\gtreqqless /g, '\\u2A8C' ],\n [ /\\\\eqslantless /g, '\\u2A95' ],\n [ /\\\\eqslantgtr /g, '\\u2A96' ],\n [ /\\\\Pisymbol\\{ppi020\\}\\{117\\}/g, '\\u2A9D' ],\n [ /\\\\Pisymbol\\{ppi020\\}\\{105\\}/g, '\\u2A9E' ],\n [ /\\\\NestedLessLess /g, '\\u2AA1' ],\n [ /\\\\NotNestedLessLess /g, '\\u2AA1-00338' ],\n [ /\\\\NestedGreaterGreater /g, '\\u2AA2' ],\n [ /\\\\NotNestedGreaterGreater /g, '\\u2AA2-00338' ],\n [ /\\\\preceq /g, '\\u2AAF' ],\n [ /\\\\not\\\\preceq /g, '\\u2AAF-00338' ],\n [ /\\\\succeq /g, '\\u2AB0' ],\n [ /\\\\not\\\\succeq /g, '\\u2AB0-00338' ],\n [ /\\\\precneqq /g, '\\u2AB5' ],\n [ /\\\\succneqq /g, '\\u2AB6' ],\n [ /\\\\precapprox /g, '\\u2AB7' ],\n [ /\\\\succapprox /g, '\\u2AB8' ],\n [ /\\\\precnapprox /g, '\\u2AB9' ],\n [ /\\\\succnapprox /g, '\\u2ABA' ],\n [ /\\\\subseteqq /g, '\\u2AC5' ],\n [ /\\\\nsubseteqq /g, '\\u2AC5-00338' ],\n [ /\\\\supseteqq /g, '\\u2AC6' ],\n [ /\\\\nsupseteqq/g, '\\u2AC6-00338' ],\n [ /\\\\subsetneqq /g, '\\u2ACB' ],\n [ /\\\\supsetneqq /g, '\\u2ACC' ],\n [ /\\\\ElsevierGlyph\\{E30D\\}/g, '\\u2AEB' ],\n [ /\\\\Elztdcol /g, '\\u2AF6' ],\n [ /\\\\ElsevierGlyph\\{300A\\}/g, '\\u300A' ],\n [ /\\\\ElsevierGlyph\\{300B\\}/g, '\\u300B' ],\n [ /\\\\ElsevierGlyph\\{3018\\}/g, '\\u3018' ],\n [ /\\\\ElsevierGlyph\\{3019\\}/g, '\\u3019' ],\n [ /\\\\openbracketleft /g, '\\u301A' ],\n [ /\\\\openbracketright /g, '\\u301B' ]\n ]\n\n return this;\n} // end function BibtexParser\n\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = BibtexParser;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/libs/bibtex.js\n ** module id = 32\n ** module chunks = 0 3\n **/","define([\n \"mvc/base-mvc\",\n \"mvc/citation/citation-model\",\n \"utils/localization\"\n], function( baseMVC, citationModel, _l ){\n\nvar CitationView = Backbone.View.extend({\n tagName: 'div',\n className: 'citations',\n render: function() {\n this.$el.append( \"

                            \" + this.formattedReference() + \"

                            \" );\n return this;\n },\n formattedReference: function() {\n var model = this.model;\n var entryType = model.entryType();\n var fields = model.fields();\n\n var ref = \"\";\n // Code inspired by...\n // https://github.com/vkaravir/bib-publication-list/blob/master/src/bib-publication-list.js\n var authorsAndYear = this._asSentence( (fields.author ? fields.author : \"\") + (fields.year ? (\" (\" + fields.year + \")\") : \"\") ) + \" \";\n var title = fields.title || \"\";\n var pages = fields.pages ? (\"pp. \" + fields.pages) : \"\";\n var address = fields.address;\n if( entryType == \"article\" ) {\n var volume = (fields.volume ? fields.volume : \"\") +\n (fields.number ? ( \" (\" + fields.number + \")\" ) : \"\") +\n (pages ? \", \" + pages : \"\");\n ref = authorsAndYear + this._asSentence(title) +\n (fields.journal ? (\"In \" + fields.journal + \", \") : \"\") +\n this._asSentence(volume) + \n this._asSentence(fields.address) +\n \"<\\/em>\";\n } else if( entryType == \"inproceedings\" || entryType == \"proceedings\" ) {\n ref = authorsAndYear + \n this._asSentence(title) + \n (fields.booktitle ? (\"In \" + fields.booktitle + \", \") : \"\") +\n (pages ? pages : \"\") +\n (address ? \", \" + address : \"\") + \n \".<\\/em>\";\n } else if( entryType == \"mastersthesis\" || entryType == \"phdthesis\" ) {\n ref = authorsAndYear + this._asSentence(title) +\n (fields.howpublished ? fields.howpublished + \". \" : \"\") +\n (fields.note ? fields.note + \".\" : \"\");\n } else if( entryType == \"techreport\" ) {\n ref = authorsAndYear + this._asSentence(title) +\n this._asSentence(fields.institution) +\n this._asSentence(fields.number) +\n this._asSentence(fields.type);\n } else if( entryType == \"book\" || entryType == \"inbook\" || entryType == \"incollection\" ) {\n ref = authorsAndYear + \" \" + this._formatBookInfo(fields);\n } else {\n ref = authorsAndYear + \" \" + this._asSentence(title) +\n this._asSentence(fields.howpublished) +\n this._asSentence(fields.note);\n }\n var doiUrl = \"\";\n if( fields.doi ) {\n doiUrl = 'http://dx.doi.org/' + fields.doi;\n ref += '[doi:' + fields.doi + \"]\";\n }\n var url = fields.url || doiUrl;\n if( url ) {\n ref += '[Link]';\n }\n return ref;\n },\n _formatBookInfo: function(fields) {\n var info = \"\";\n if( fields.chapter ) {\n info += fields.chapter + \" in \";\n }\n if( fields.title ) {\n info += \"\" + fields.title + \"<\\/em>\";\n }\n if( fields.editor ) {\n info += \", Edited by \" + fields.editor + \", \";\n }\n if( fields.publisher) {\n info += \", \" + fields.publisher;\n }\n if( fields.pages ) {\n info += \", pp. \" + fields.pages + \"\";\n }\n if( fields.series ) {\n info += \", \" + fields.series + \"<\\/em>\";\n }\n if( fields.volume ) {\n info += \", Vol.\" + fields.volume;\n }\n if( fields.issn ) {\n info += \", ISBN: \" + fields.issn;\n }\n return info + \".\";\n },\n _asSentence: function(str) {\n return (str && str.trim()) ? str + \". \" : \"\";\n }\n});\n\nvar CitationListView = Backbone.View.extend({\n el: '#citations',\n /**\n * Set up view.\n */\n initialize: function() {\n this.listenTo( this.collection, 'add', this.renderCitation );\n },\n\n events: {\n 'click .citations-to-bibtex': 'showBibtex',\n 'click .citations-to-formatted': 'showFormatted'\n },\n\n renderCitation: function( citation ) {\n var citationView = new CitationView( { model: citation } );\n this.$(\".citations-formatted\").append( citationView.render().el );\n var rawTextarea = this.$(\".citations-bibtex-text\");\n rawTextarea.val( rawTextarea.val() + \"\\n\\r\" + citation.attributes.content );\n },\n\n render: function() {\n this.$el.html(this.citationsElement());\n this.collection.each(function( item ){\n this.renderCitation( item );\n }, this);\n this.showFormatted();\n },\n\n showBibtex: function() {\n this.$(\".citations-to-formatted\").show();\n this.$(\".citations-to-bibtex\").hide();\n this.$(\".citations-bibtex\").show();\n this.$(\".citations-formatted\").hide();\n this.$(\".citations-bibtex-text\").select();\n },\n\n showFormatted: function() {\n this.$(\".citations-to-formatted\").hide();\n this.$(\".citations-to-bibtex\").show();\n this.$(\".citations-bibtex\").hide();\n this.$(\".citations-formatted\").show();\n },\n\n partialWarningElement: function() {\n if( this.collection.partial ) {\n return [\n '
                            ',\n 'Warning: This is a experimental feature. Most Galaxy tools will not annotate',\n ' citations explicitly at this time. When writing up your analysis, please manually',\n ' review your histories and find all references',\n ' that should be cited in order to completely describe your work. Also, please remember to',\n ' cite Galaxy.',\n '
                            ',\n ].join('');\n } else {\n return '';\n }\n },\n\n citationsElement: function() {\n return [\n '
                            ',\n '
                            ',\n _l(\"Citations\"),\n ' ',\n ' ',\n '
                            ',\n '
                            ',\n this.partialWarningElement(),\n '',\n '
                            ',\n '
                            ',\n '',\n '
                            ',\n '
                            '\n ].join( '' );\n }\n});\n\n//==============================================================================\nreturn {\n CitationView : CitationView,\n CitationListView : CitationListView\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/citation/citation-view.js\n ** module id = 33\n ** module chunks = 0 3\n **/","define([\n \"mvc/list/list-item\",\n \"mvc/dataset/dataset-li\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( LIST_ITEM, DATASET_LI, BASE_MVC, _l ){\n/* global Backbone */\n//==============================================================================\nvar FoldoutListItemView = LIST_ITEM.FoldoutListItemView,\n ListItemView = LIST_ITEM.ListItemView;\n/** @class Read only view for DatasetCollection.\n */\nvar DCListItemView = FoldoutListItemView.extend(\n/** @lends DCListItemView.prototype */{\n//TODO: may not be needed\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : FoldoutListItemView.prototype.className + \" dataset-collection\",\n id : function(){\n return [ 'dataset_collection', this.model.get( 'id' ) ].join( '-' );\n },\n\n /** override to add linkTarget */\n initialize : function( attributes ){\n this.linkTarget = attributes.linkTarget || '_blank';\n this.hasUser = attributes.hasUser;\n FoldoutListItemView.prototype.initialize.call( this, attributes );\n },\n\n /** event listeners */\n _setUpListeners : function(){\n FoldoutListItemView.prototype._setUpListeners.call( this );\n // re-rendering on deletion\n this.model.on( 'change', function( model, options ){\n if( _.isEqual( _.keys( model.changed ), [ 'deleted' ] ) ){\n this.render();\n }\n }, this );\n },\n\n // ......................................................................... rendering\n //TODO:?? possibly move to listItem\n /** render a subtitle to show the user what sort of collection this is */\n _renderSubtitle : function(){\n var $subtitle = $( '
                            ' );\n //TODO: would be good to get this in the subtitle\n //var len = this.model.elements.length;\n switch( this.model.get( 'collection_type' ) ){\n case 'list':\n return $subtitle.text( _l( 'a list of datasets' ) );\n case 'paired':\n return $subtitle.text( _l( 'a pair of datasets' ) );\n case 'list:paired':\n return $subtitle.text( _l( 'a list of paired datasets' ) );\n }\n return $subtitle;\n },\n\n // ......................................................................... foldout\n /** override to add linktarget to sub-panel */\n _getFoldoutPanelOptions : function(){\n var options = FoldoutListItemView.prototype._getFoldoutPanelOptions.call( this );\n return _.extend( options, {\n linkTarget : this.linkTarget,\n hasUser : this.hasUser\n });\n },\n\n /** override to not catch sub-panel selectors */\n $selector : function(){\n return this.$( '> .selector' );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DCListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDCListItemView.prototype.templates = (function(){\n\n var warnings = _.extend( {}, FoldoutListItemView.prototype.templates.warnings, {\n error : BASE_MVC.wrapTemplate([\n // error during index fetch - show error on dataset\n '<% if( model.error ){ %>',\n '
                            ',\n _l( 'There was an error getting the data for this collection' ), ': <%- model.error %>',\n '
                            ',\n '<% } %>'\n ]),\n purged : BASE_MVC.wrapTemplate([\n '<% if( model.purged ){ %>',\n '
                            ',\n _l( 'This collection has been deleted and removed from disk' ),\n '
                            ',\n '<% } %>'\n ]),\n deleted : BASE_MVC.wrapTemplate([\n // deleted not purged\n '<% if( model.deleted && !model.purged ){ %>',\n '
                            ',\n _l( 'This collection has been deleted' ),\n '
                            ',\n '<% } %>'\n ])\n });\n\n // use element identifier\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n '
                            ',\n '<%- collection.element_identifier || collection.name %>',\n '
                            ',\n '
                            ',\n '
                            '\n ], 'collection' );\n\n return _.extend( {}, FoldoutListItemView.prototype.templates, {\n warnings : warnings,\n titleBar : titleBarTemplate\n });\n}());\n\n\n//==============================================================================\n/** @class Read only view for DatasetCollectionElement.\n */\nvar DCEListItemView = ListItemView.extend(\n/** @lends DCEListItemView.prototype */{\n//TODO: this might be expendable - compacted with HDAListItemView\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** add the DCE class to the list item */\n className : ListItemView.prototype.className + \" dataset-collection-element\",\n\n /** set up */\n initialize : function( attributes ){\n if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n this.log( 'DCEListItemView.initialize:', attributes );\n ListItemView.prototype.initialize.call( this, attributes );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DCEListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDCEListItemView.prototype.templates = (function(){\n\n // use the element identifier here - since that will persist and the user will need it\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n '
                            ',\n '<%- element.element_identifier %>',\n '
                            ',\n '
                            ',\n '
                            '\n ], 'element' );\n\n return _.extend( {}, ListItemView.prototype.templates, {\n titleBar : titleBarTemplate\n });\n}());\n\n\n//==============================================================================\n/** @class Read only view for a DatasetCollectionElement that is also an DatasetAssociation\n * (a dataset contained in a dataset collection).\n */\nvar DatasetDCEListItemView = DATASET_LI.DatasetListItemView.extend(\n/** @lends DatasetDCEListItemView.prototype */{\n\n className : DATASET_LI.DatasetListItemView.prototype.className + \" dataset-collection-element\",\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** set up */\n initialize : function( attributes ){\n if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n this.log( 'DatasetDCEListItemView.initialize:', attributes );\n DATASET_LI.DatasetListItemView.prototype.initialize.call( this, attributes );\n },\n\n /** In this override, only get details if in the ready state.\n * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n */\n _fetchModelDetails : function(){\n var view = this;\n if( view.model.inReadyState() && !view.model.hasDetails() ){\n return view.model.fetch({ silent: true });\n }\n return jQuery.when();\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DatasetDCEListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDatasetDCEListItemView.prototype.templates = (function(){\n\n // use the element identifier here and not the dataset name\n //TODO:?? can we steal the DCE titlebar?\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n '',\n '
                            ',\n '<%- element.element_identifier %>',\n '
                            ',\n '
                            '\n ], 'element' );\n\n return _.extend( {}, DATASET_LI.DatasetListItemView.prototype.templates, {\n titleBar : titleBarTemplate\n });\n}());\n\n\n//==============================================================================\n/** @class Read only view for a DatasetCollectionElement that is also a DatasetCollection\n * (a nested DC).\n */\nvar NestedDCDCEListItemView = DCListItemView.extend(\n/** @lends NestedDCDCEListItemView.prototype */{\n\n className : DCListItemView.prototype.className + \" dataset-collection-element\",\n\n /** logger used to record this.log messages, commonly set to console */\n // comment this out to suppress log output\n //logger : console,\n\n /** In this override, add the state as a class for use with state-based CSS */\n _swapNewRender : function( $newRender ){\n DCListItemView.prototype._swapNewRender.call( this, $newRender );\n//TODO: model currently has no state\n var state = this.model.get( 'state' ) || 'ok';\n //if( this.model.has( 'state' ) ){\n this.$el.addClass( 'state-' + state );\n //}\n return this.$el;\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'NestedDCDCEListItemView(' + modelString + ')';\n }\n});\n\n\n//==============================================================================\n return {\n DCListItemView : DCListItemView,\n DCEListItemView : DCEListItemView,\n DatasetDCEListItemView : DatasetDCEListItemView,\n NestedDCDCEListItemView : NestedDCDCEListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-li.js\n ** module id = 34\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/dataset-model\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DATASET_MODEL, BASE_MVC, _l ){\n\nvar logNamespace = 'collections';\n//==============================================================================\n/*\nNotes:\n\nTerminology:\n DatasetCollection/DC : a container of datasets or nested DatasetCollections\n Element/DatasetCollectionElement/DCE : an item contained in a DatasetCollection\n HistoryDatasetCollectionAssociation/HDCA: a DatasetCollection contained in a history\n\n\nThis all seems too complex unfortunately:\n\n- Terminology collision between DatasetCollections (DCs) and Backbone Collections.\n- In the DatasetCollections API JSON, DC Elements use a 'Has A' stucture to *contain*\n either a dataset or a nested DC. This would make the hierarchy much taller. I've\n decided to merge the contained JSON with the DC element json - making the 'has a'\n relation into an 'is a' relation. This seems simpler to me and allowed a lot of\n DRY in both models and views, but may make tracking or tracing within these models\n more difficult (since DatasetCollectionElements are now *also* DatasetAssociations\n or DatasetCollections (nested)). This also violates the rule of thumb about\n favoring aggregation over inheritance.\n- Currently, there are three DatasetCollection subclasses: List, Pair, and ListPaired.\n These each should a) be usable on their own, b) be usable in the context of\n nesting within a collection model (at least in the case of ListPaired), and\n c) be usable within the context of other container models (like History or\n LibraryFolder, etc.). I've tried to separate/extract classes in order to\n handle those three situations, but it's proven difficult to do in a simple,\n readable manner.\n- Ideally, histories and libraries would inherit from the same server models as\n dataset collections do since they are (in essence) dataset collections themselves -\n making the whole nested structure simpler. This would be a large, error-prone\n refactoring and migration.\n\nMany of the classes and heirarchy are meant as extension points so, while the\nrelations and flow may be difficult to understand initially, they'll allow us to\nhandle the growth or flux dataset collection in the future (w/o actually implementing\nany YAGNI).\n\n*/\n//_________________________________________________________________________________________________ ELEMENTS\n/** @class mixin for Dataset collection elements.\n * When collection elements are passed from the API, the underlying element is\n * in a sub-object 'object' (IOW, a DCE representing an HDA will have HDA json in element.object).\n * This mixin uses the constructor and parse methods to merge that JSON with the DCE attribtues\n * effectively changing a DCE from a container to a subclass (has a --> is a).\n */\nvar DatasetCollectionElementMixin = {\n\n /** default attributes used by elements in a dataset collection */\n defaults : {\n model_class : 'DatasetCollectionElement',\n element_identifier : null,\n element_index : null,\n element_type : null\n },\n\n /** merge the attributes of the sub-object 'object' into this model */\n _mergeObject : function( attributes ){\n // if we don't preserve and correct ids here, the element id becomes the object id\n // and collision in backbone's _byId will occur and only\n _.extend( attributes, attributes.object, { element_id: attributes.id });\n delete attributes.object;\n return attributes;\n },\n\n /** override to merge this.object into this */\n constructor : function( attributes, options ){\n // console.debug( '\\t DatasetCollectionElement.constructor:', attributes, options );\n attributes = this._mergeObject( attributes );\n this.idAttribute = 'element_id';\n Backbone.Model.apply( this, arguments );\n },\n\n /** when the model is fetched, merge this.object into this */\n parse : function( response, options ){\n var attributes = response;\n attributes = this._mergeObject( attributes );\n return attributes;\n }\n};\n\n//TODO: unused?\n/** @class Concrete class of Generic DatasetCollectionElement */\nvar DatasetCollectionElement = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( DatasetCollectionElementMixin )\n .extend({ _logNamespace : logNamespace });\n\n\n//==============================================================================\n/** @class Base/Abstract Backbone collection for Generic DCEs. */\nvar DCECollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(\n/** @lends DCECollection.prototype */{\n _logNamespace : logNamespace,\n\n model: DatasetCollectionElement,\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n//TODO: unused?\n /** Set up.\n * @see Backbone.Collection#initialize\n */\n initialize : function( attributes, options ){\n this.debug( this + '(DCECollection).initialize:', attributes, options );\n options = options || {};\n //this._setUpListeners();\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'DatasetCollectionElementCollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone model for a dataset collection element that is a dataset (HDA).\n */\nvar DatasetDCE = DATASET_MODEL.DatasetAssociation.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n/** @lends DatasetDCE.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** url fn */\n url : function(){\n // won't always be an hda\n if( !this.has( 'history_id' ) ){\n console.warn( 'no endpoint for non-hdas within a collection yet' );\n // (a little silly since this api endpoint *also* points at hdas)\n return Galaxy.root + 'api/datasets';\n }\n return Galaxy.root + 'api/histories/' + this.get( 'history_id' ) + '/contents/' + this.get( 'id' );\n },\n\n defaults : _.extend( {},\n DATASET_MODEL.DatasetAssociation.prototype.defaults,\n DatasetCollectionElementMixin.defaults\n ),\n\n // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n // - re-apply manually for now\n /** call the mixin constructor */\n constructor : function( attributes, options ){\n this.debug( '\\t DatasetDCE.constructor:', attributes, options );\n //DATASET_MODEL.DatasetAssociation.prototype.constructor.call( this, attributes, options );\n DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n },\n\n//TODO: unused?\n /** set up */\n initialize : function( attributes, options ){\n this.debug( this + '(DatasetDCE).initialize:', attributes, options );\n DATASET_MODEL.DatasetAssociation.prototype.initialize.call( this, attributes, options );\n },\n\n /** Does this model already contain detailed data (as opposed to just summary level data)? */\n hasDetails : function(){\n // dataset collection api does return genome_build but doesn't return annotation\n return _.has( this.attributes, 'annotation' );\n },\n\n /** String representation. */\n toString : function(){\n var objStr = this.get( 'element_identifier' );\n return ([ 'DatasetDCE(', objStr, ')' ].join( '' ));\n }\n}));\n\n\n//==============================================================================\n/** @class DCECollection of DatasetDCE's (a list of datasets, a pair of datasets).\n */\nvar DatasetDCECollection = DCECollection.extend(\n/** @lends DatasetDCECollection.prototype */{\n model: DatasetDCE,\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n//TODO: unused?\n /** set up */\n initialize : function( attributes, options ){\n this.debug( this + '(DatasetDCECollection).initialize:', attributes, options );\n DCECollection.prototype.initialize.call( this, attributes, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'DatasetDCECollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//_________________________________________________________________________________________________ COLLECTIONS\n/** @class Backbone model for Dataset Collections.\n * The DC API returns an array of JSON objects under the attribute elements.\n * This model:\n * - removes that array/attribute ('elements') from the model,\n * - creates a bbone collection (of the class defined in the 'collectionClass' attribute),\n * - passes that json onto the bbone collection\n * - caches the bbone collection in this.elements\n */\nvar DatasetCollection = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( BASE_MVC.SearchableModelMixin )\n .extend(/** @lends DatasetCollection.prototype */{\n _logNamespace : logNamespace,\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** default attributes for a model */\n defaults : {\n /* 'list', 'paired', or 'list:paired' */\n collection_type : null,\n //??\n deleted : false\n },\n\n /** Which class to use for elements */\n collectionClass : DCECollection,\n\n /** set up: create elements instance var and (on changes to elements) update them */\n initialize : function( model, options ){\n this.debug( this + '(DatasetCollection).initialize:', model, options, this );\n //historyContent.HistoryContent.prototype.initialize.call( this, attrs, options );\n this.elements = this._createElementsModel();\n this.on( 'change:elements', function(){\n this.log( 'change:elements' );\n//TODO: prob. better to update the collection instead of re-creating it\n this.elements = this._createElementsModel();\n });\n },\n\n /** move elements model attribute to full collection */\n _createElementsModel : function(){\n this.debug( this + '._createElementsModel', this.collectionClass, this.get( 'elements' ), this.elements );\n//TODO: same patterns as DatasetCollectionElement _createObjectModel - refactor to BASE_MVC.hasSubModel?\n var elements = this.get( 'elements' ) || [];\n this.unset( 'elements', { silent: true });\n this.elements = new this.collectionClass( elements );\n //this.debug( 'collectionClass:', this.collectionClass + '', this.elements );\n return this.elements;\n },\n\n // ........................................................................ common queries\n /** pass the elements back within the model json when this is serialized */\n toJSON : function(){\n var json = Backbone.Model.prototype.toJSON.call( this );\n if( this.elements ){\n json.elements = this.elements.toJSON();\n }\n return json;\n },\n\n /** Is this collection in a 'ready' state no processing (for the collection) is left\n * to do on the server.\n */\n inReadyState : function(){\n var populated = this.get( 'populated' );\n return ( this.isDeletedOrPurged() || populated );\n },\n\n //TODO:?? the following are the same interface as DatasetAssociation - can we combine?\n /** Does the DC contain any elements yet? Is a fetch() required? */\n hasDetails : function(){\n//TODO: this is incorrect for (accidentally) empty collections\n this.debug( 'hasDetails:', this.elements.length );\n return this.elements.length !== 0;\n },\n\n /** Given the filters, what models in this.elements would be returned? */\n getVisibleContents : function( filters ){\n // filters unused for now\n return this.elements;\n },\n\n // ........................................................................ ajax\n /** save this dataset, _Mark_ing it as deleted (just a flag) */\n 'delete' : function( options ){\n if( this.get( 'deleted' ) ){ return jQuery.when(); }\n return this.save( { deleted: true }, options );\n },\n /** save this dataset, _Mark_ing it as undeleted */\n undelete : function( options ){\n if( !this.get( 'deleted' ) || this.get( 'purged' ) ){ return jQuery.when(); }\n return this.save( { deleted: false }, options );\n },\n\n /** Is this collection deleted or purged? */\n isDeletedOrPurged : function(){\n return ( this.get( 'deleted' ) || this.get( 'purged' ) );\n },\n\n // ........................................................................ searchable\n /** searchable attributes for collections */\n searchAttributes : [\n 'name'\n ],\n\n // ........................................................................ misc\n /** String representation */\n toString : function(){\n var idAndName = [ this.get( 'id' ), this.get( 'name' ) || this.get( 'element_identifier' ) ];\n return 'DatasetCollection(' + ( idAndName.join(',') ) + ')';\n }\n});\n\n\n//==============================================================================\n/** Model for a DatasetCollection containing datasets (non-nested).\n */\nvar ListDatasetCollection = DatasetCollection.extend(\n/** @lends ListDatasetCollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** override since we know the collection will only contain datasets */\n collectionClass : DatasetDCECollection,\n\n//TODO: unused?\n initialize : function( attrs, options ){\n this.debug( this + '(ListDatasetCollection).initialize:', attrs, options );\n DatasetCollection.prototype.initialize.call( this, attrs, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'ListDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** Model for a DatasetCollection containing fwd/rev datasets (a list of 2).\n */\nvar PairDatasetCollection = ListDatasetCollection.extend(\n/** @lends PairDatasetCollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n//TODO: unused?\n /** */\n initialize : function( attrs, options ){\n this.debug( this + '(PairDatasetCollection).initialize:', attrs, options );\n ListDatasetCollection.prototype.initialize.call( this, attrs, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'PairDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//_________________________________________________________________________________________________ NESTED COLLECTIONS\n// this is where things get weird, man. Weird.\n//TODO: it might be possible to compact all the following...I think.\n//==============================================================================\n/** @class Backbone model for a Generic DatasetCollectionElement that is also a DatasetCollection\n * (a nested collection). Currently only list:paired.\n */\nvar NestedDCDCE = DatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n/** @lends NestedDCDCE.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n // - re-apply manually it now\n /** call the mixin constructor */\n constructor : function( attributes, options ){\n this.debug( '\\t NestedDCDCE.constructor:', attributes, options );\n DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n },\n\n /** String representation. */\n toString : function(){\n var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );\n return ([ 'NestedDCDCE(', objStr, ')' ].join( '' ));\n }\n}));\n\n\n//==============================================================================\n/** @class Backbone collection containing Generic NestedDCDCE's (nested dataset collections).\n */\nvar NestedDCDCECollection = DCECollection.extend(\n/** @lends NestedDCDCECollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** This is a collection of nested collections */\n model: NestedDCDCE,\n\n//TODO: unused?\n /** set up */\n initialize : function( attrs, options ){\n this.debug( this + '(NestedDCDCECollection).initialize:', attrs, options );\n DCECollection.prototype.initialize.call( this, attrs, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'NestedDCDCECollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone model for a paired dataset collection within a list:paired dataset collection.\n */\nvar NestedPairDCDCE = PairDatasetCollection.extend( BASE_MVC.mixin( DatasetCollectionElementMixin,\n/** @lends NestedPairDCDCE.prototype */{\n//TODO:?? possibly rename to NestedDatasetCollection?\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n // - re-apply manually it now\n /** This is both a collection and a collection element - call the constructor */\n constructor : function( attributes, options ){\n this.debug( '\\t NestedPairDCDCE.constructor:', attributes, options );\n //DatasetCollection.constructor.call( this, attributes, options );\n DatasetCollectionElementMixin.constructor.call( this, attributes, options );\n },\n\n /** String representation. */\n toString : function(){\n var objStr = ( this.object )?( '' + this.object ):( this.get( 'element_identifier' ) );\n return ([ 'NestedPairDCDCE(', objStr, ')' ].join( '' ));\n }\n}));\n\n\n//==============================================================================\n/** @class Backbone collection for a backbone collection containing paired dataset collections.\n */\nvar NestedPairDCDCECollection = NestedDCDCECollection.extend(\n/** @lends PairDCDCECollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** We know this collection is composed of only nested pair collections */\n model: NestedPairDCDCE,\n\n//TODO: unused?\n /** set up */\n initialize : function( attrs, options ){\n this.debug( this + '(NestedPairDCDCECollection).initialize:', attrs, options );\n NestedDCDCECollection.prototype.initialize.call( this, attrs, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'NestedPairDCDCECollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone Model for a DatasetCollection (list) that contains DatasetCollections (pairs).\n */\nvar ListPairedDatasetCollection = DatasetCollection.extend(\n/** @lends ListPairedDatasetCollection.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** list:paired is the only collection that itself contains collections */\n collectionClass : NestedPairDCDCECollection,\n\n//TODO: unused?\n /** set up */\n initialize : function( attributes, options ){\n this.debug( this + '(ListPairedDatasetCollection).initialize:', attributes, options );\n DatasetCollection.prototype.initialize.call( this, attributes, options );\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'ListPairedDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n return {\n ListDatasetCollection : ListDatasetCollection,\n PairDatasetCollection : PairDatasetCollection,\n ListPairedDatasetCollection : ListPairedDatasetCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-model.js\n ** module id = 35\n ** module chunks = 3\n **/","\ndefine([\n \"mvc/history/hdca-model\",\n \"mvc/dataset/states\",\n \"mvc/base-mvc\",\n \"mvc/ui/ui-modal\",\n \"utils/natural-sort\",\n \"utils/localization\",\n \"ui/hoverhighlight\"\n], function( HDCA, STATES, BASE_MVC, UI_MODAL, naturalSort, _l ){\n\nvar logNamespace = 'collections';\n/*==============================================================================\nTODO:\n use proper Element model and not just json\n straighten out createFn, collection.createHDCA\n possibly stop using modals for this\n It would be neat to do a drag and drop\n\n==============================================================================*/\n/** A view for both DatasetDCEs and NestedDCDCEs\n * (things that implement collection-model:DatasetCollectionElementMixin)\n */\nvar DatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n//TODO: use proper class (DatasetDCE or NestedDCDCE (or the union of both))\n tagName : 'li',\n className : 'collection-element',\n\n initialize : function( attributes ){\n this.element = attributes.element || {};\n this.selected = attributes.selected || false;\n },\n\n render : function(){\n this.$el\n .attr( 'data-element-id', this.element.id )\n .attr( 'draggable', true )\n .html( this.template({ element: this.element }) );\n if( this.selected ){\n this.$el.addClass( 'selected' );\n }\n return this;\n },\n\n //TODO: lots of unused space in the element - possibly load details and display them horiz.\n template : _.template([\n '',\n '<%- element.name %>',\n '',\n '',\n ].join('')),\n\n /** select this element and pub */\n select : function( toggle ){\n this.$el.toggleClass( 'selected', toggle );\n this.trigger( 'select', {\n source : this,\n selected : this.$el.hasClass( 'selected' )\n });\n },\n\n /** animate the removal of this element and pub */\n discard : function(){\n var view = this,\n parentWidth = this.$el.parent().width();\n this.$el.animate({ 'margin-right' : parentWidth }, 'fast', function(){\n view.trigger( 'discard', {\n source : view\n });\n view.destroy();\n });\n },\n\n /** remove the DOM and any listeners */\n destroy : function(){\n this.off();\n this.$el.remove();\n },\n\n events : {\n 'click' : '_click',\n 'click .name' : '_clickName',\n 'click .discard': '_clickDiscard',\n\n 'dragstart' : '_dragstart',\n 'dragend' : '_dragend',\n 'dragover' : '_sendToParent',\n 'drop' : '_sendToParent'\n },\n\n /** select when the li is clicked */\n _click : function( ev ){\n ev.stopPropagation();\n this.select( ev );\n },\n\n /** rename a pair when the name is clicked */\n _clickName : function( ev ){\n ev.stopPropagation();\n ev.preventDefault();\n var promptString = [ _l( 'Enter a new name for the element' ), ':\\n(',\n _l( 'Note that changing the name here will not rename the dataset' ), ')' ].join( '' ),\n response = prompt( _l( 'Enter a new name for the element' ) + ':', this.element.name );\n if( response ){\n this.element.name = response;\n this.render();\n }\n //TODO: cancelling with ESC leads to closure of the creator...\n },\n\n /** discard when the discard button is clicked */\n _clickDiscard : function( ev ){\n ev.stopPropagation();\n this.discard();\n },\n\n /** dragging pairs for re-ordering */\n _dragstart : function( ev ){\n if( ev.originalEvent ){ ev = ev.originalEvent; }\n ev.dataTransfer.effectAllowed = 'move';\n ev.dataTransfer.setData( 'text/plain', JSON.stringify( this.element ) );\n\n this.$el.addClass( 'dragging' );\n this.$el.parent().trigger( 'collection-element.dragstart', [ this ] );\n },\n\n /** dragging for re-ordering */\n _dragend : function( ev ){\n this.$el.removeClass( 'dragging' );\n this.$el.parent().trigger( 'collection-element.dragend', [ this ] );\n },\n\n /** manually bubble up an event to the parent/container */\n _sendToParent : function( ev ){\n this.$el.parent().trigger( ev );\n },\n\n /** string rep */\n toString : function(){\n return 'DatasetCollectionElementView()';\n }\n});\n\n\n// ============================================================================\n/** An interface for building collections.\n */\nvar ListCollectionCreator = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n /** the class used to display individual elements */\n elementViewClass : DatasetCollectionElementView,\n /** the class this creator will create and save */\n collectionClass : HDCA.HistoryListDatasetCollection,\n className : 'list-collection-creator collection-creator flex-row-container',\n\n /** minimum number of valid elements to start with in order to build a collection of this type */\n minElements : 1,\n\n defaultAttributes : {\n//TODO: remove - use new collectionClass().save()\n /** takes elements and creates the proper collection - returns a promise */\n creationFn : function(){ throw new TypeError( 'no creation fn for creator' ); },\n /** fn to call when the collection is created (scoped to this) */\n oncreate : function(){},\n /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n oncancel : function(){},\n /** distance from list edge to begin autoscrolling list */\n autoscrollDist : 24,\n /** Color passed to hoverhighlight */\n highlightClr : 'rgba( 64, 255, 255, 1.0 )'\n },\n\n /** set up initial options, instance vars, behaviors */\n initialize : function( attributes ){\n this.metric( 'ListCollectionCreator.initialize', attributes );\n var creator = this;\n _.each( this.defaultAttributes, function( value, key ){\n value = attributes[ key ] || value;\n creator[ key ] = value;\n });\n\n /** unordered, original list - cache to allow reversal */\n creator.initialElements = attributes.elements || [];\n\n this._instanceSetUp();\n this._elementsSetUp();\n this._setUpBehaviors();\n },\n\n /** set up instance vars */\n _instanceSetUp : function(){\n /** Ids of elements that have been selected by the user - to preserve over renders */\n this.selectedIds = {};\n /** DOM elements currently being dragged */\n this.$dragging = null;\n /** Used for blocking UI events during ajax/operations (don't post twice) */\n this.blocking = false;\n },\n\n // ------------------------------------------------------------------------ process raw list\n /** set up main data */\n _elementsSetUp : function(){\n //this.debug( '-- _dataSetUp' );\n /** a list of invalid elements and the reasons they aren't valid */\n this.invalidElements = [];\n//TODO: handle fundamental problem of syncing DOM, views, and list here\n /** data for list in progress */\n this.workingElements = [];\n /** views for workingElements */\n this.elementViews = [];\n\n // copy initial list, sort, add ids if needed\n this.workingElements = this.initialElements.slice( 0 );\n this._ensureElementIds();\n this._validateElements();\n this._mangleDuplicateNames();\n this._sortElements();\n },\n\n /** add ids to dataset objs in initial list if none */\n _ensureElementIds : function(){\n this.workingElements.forEach( function( element ){\n if( !element.hasOwnProperty( 'id' ) ){\n element.id = _.uniqueId();\n }\n });\n return this.workingElements;\n },\n\n /** separate working list into valid and invalid elements for this collection */\n _validateElements : function(){\n var creator = this,\n existingNames = {};\n creator.invalidElements = [];\n\n this.workingElements = this.workingElements.filter( function( element ){\n var problem = creator._isElementInvalid( element );\n if( problem ){\n creator.invalidElements.push({\n element : element,\n text : problem\n });\n }\n return !problem;\n });\n return this.workingElements;\n },\n\n /** describe what is wrong with a particular element if anything */\n _isElementInvalid : function( element ){\n if( element.history_content_type !== 'dataset' ){\n return _l( \"is not a dataset\" );\n }\n if( element.state !== STATES.OK ){\n if( _.contains( STATES.NOT_READY_STATES, element.state ) ){\n return _l( \"hasn't finished running yet\" );\n }\n return _l( \"has errored, is paused, or is not accessible\" );\n }\n if( element.deleted || element.purged ){\n return _l( \"has been deleted or purged\" );\n }\n return null;\n },\n\n /** mangle duplicate names using a mac-like '(counter)' addition to any duplicates */\n _mangleDuplicateNames : function(){\n var SAFETY = 900,\n counter = 1,\n existingNames = {};\n this.workingElements.forEach( function( element ){\n var currName = element.name;\n while( existingNames.hasOwnProperty( currName ) ){\n currName = element.name + ' (' + counter + ')';\n counter += 1;\n if( counter >= SAFETY ){\n throw new Error( 'Safety hit in while loop - thats impressive' );\n }\n }\n element.name = currName;\n existingNames[ element.name ] = true;\n });\n },\n\n /** sort a list of elements */\n _sortElements : function( list ){\n // // currently only natural sort by name\n // this.workingElements.sort( function( a, b ){ return naturalSort( a.name, b.name ); });\n // return this.workingElements;\n },\n\n // ------------------------------------------------------------------------ rendering\n // templates : ListCollectionCreator.templates,\n /** render the entire interface */\n render : function( speed, callback ){\n //this.debug( '-- _render' );\n if( this.workingElements.length < this.minElements ){\n return this._renderInvalid( speed, callback );\n }\n\n this.$el.empty().html( this.templates.main() );\n this._renderHeader( speed );\n this._renderMiddle( speed );\n this._renderFooter( speed );\n this._addPluginComponents();\n this.$( '.collection-name' ).focus();\n this.trigger( 'rendered', this );\n return this;\n },\n\n\n /** render a simplified interface aimed at telling the user why they can't move forward */\n _renderInvalid : function( speed, callback ){\n //this.debug( '-- _render' );\n this.$el.empty().html( this.templates.invalidInitial({\n problems: this.invalidElements,\n elements: this.workingElements,\n }));\n if( typeof this.oncancel === 'function' ){\n this.$( '.cancel-create.btn' ).show();\n }\n this.trigger( 'rendered', this );\n return this;\n },\n\n /** render the header section */\n _renderHeader : function( speed, callback ){\n var $header = this.$( '.header' ).empty().html( this.templates.header() )\n .find( '.help-content' ).prepend( $( this.templates.helpContent() ) );\n //TODO: should only show once despite calling _renderHeader again\n if( this.invalidElements.length ){\n this._invalidElementsAlert();\n }\n return $header;\n },\n\n /** render the middle including the elements */\n _renderMiddle : function( speed, callback ){\n var $middle = this.$( '.middle' ).empty().html( this.templates.middle() );\n this._renderList( speed );\n return $middle;\n },\n\n /** render the footer, completion controls, and cancel controls */\n _renderFooter : function( speed, callback ){\n var $footer = this.$( '.footer' ).empty().html( this.templates.footer() );\n if( typeof this.oncancel === 'function' ){\n this.$( '.cancel-create.btn' ).show();\n }\n return $footer;\n },\n\n /** add any jQuery/bootstrap/custom plugins to elements rendered */\n _addPluginComponents : function(){\n this.$( '.help-content i' ).hoverhighlight( '.collection-creator', this.highlightClr );\n },\n\n /** build and show an alert describing any elements that could not be included due to problems */\n _invalidElementsAlert : function(){\n this._showAlert( this.templates.invalidElements({ problems: this.invalidElements }), 'alert-warning' );\n },\n\n /** add (or clear if clear is truthy) a validation warning to the DOM element described in what */\n _validationWarning : function( what, clear ){\n var VALIDATION_CLASS = 'validation-warning';\n if( what === 'name' ){\n what = this.$( '.collection-name' ).add( this.$( '.collection-name-prompt' ) );\n this.$( '.collection-name' ).focus().select();\n }\n if( clear ){\n what = what || this.$( '.' + VALIDATION_CLASS );\n what.removeClass( VALIDATION_CLASS );\n } else {\n what.addClass( VALIDATION_CLASS );\n }\n },\n\n _disableNameAndCreate : function( disable ){\n disable = !_.isUndefined( disable )? disable : true;\n if( disable ){\n this.$( '.collection-name' ).prop( 'disabled', true );\n this.$( '.create-collection' ).toggleClass( 'disabled', true );\n // } else {\n // this.$( '.collection-name' ).prop( 'disabled', false );\n // this.$( '.create-collection' ).removeClass( 'disable' );\n }\n },\n\n // ------------------------------------------------------------------------ rendering elements\n /** conv. to the main list display DOM */\n $list : function(){\n return this.$( '.collection-elements' );\n },\n\n /** show or hide the clear selected control based on the num of selected elements */\n _renderClearSelected : function(){\n if( _.size( this.selectedIds ) ){\n this.$( '.collection-elements-controls > .clear-selected' ).show();\n } else {\n this.$( '.collection-elements-controls > .clear-selected' ).hide();\n }\n },\n\n /** render the elements in order (or a warning if no elements found) */\n _renderList : function( speed, callback ){\n //this.debug( '-- _renderList' );\n var creator = this,\n $tmp = jQuery( '
                            ' ),\n $list = creator.$list();\n\n _.each( this.elementViews, function( view ){\n view.destroy();\n creator.removeElementView( view );\n });\n\n // if( !this.workingElements.length ){\n // this._renderNoValidElements();\n // return;\n // }\n\n creator.workingElements.forEach( function( element ){\n var elementView = creator._createElementView( element );\n $tmp.append( elementView.$el );\n });\n\n creator._renderClearSelected();\n $list.empty().append( $tmp.children() );\n _.invoke( creator.elementViews, 'render' );\n\n if( $list.height() > $list.css( 'max-height' ) ){\n $list.css( 'border-width', '1px 0px 1px 0px' );\n } else {\n $list.css( 'border-width', '0px' );\n }\n },\n\n /** create an element view, cache in elementViews, set up listeners, and return */\n _createElementView : function( element ){\n var elementView = new this.elementViewClass({\n//TODO: use non-generic class or not all\n // model : COLLECTION.DatasetDCE( element )\n element : element,\n selected: _.has( this.selectedIds, element.id )\n });\n this.elementViews.push( elementView );\n this._listenToElementView( elementView );\n return elementView;\n },\n\n /** listen to any element events */\n _listenToElementView : function( view ){\n var creator = this;\n creator.listenTo( view, {\n select : function( data ){\n var element = data.source.element;\n if( data.selected ){\n creator.selectedIds[ element.id ] = true;\n } else {\n delete creator.selectedIds[ element.id ];\n }\n creator.trigger( 'elements:select', data );\n },\n discard : function( data ){\n creator.trigger( 'elements:discard', data );\n }\n });\n },\n\n /** add a new element view based on the json in element */\n addElementView : function( element ){\n//TODO: workingElements is sorted, add element in appropo index\n // add element, sort elements, find element index\n // var view = this._createElementView( element );\n // return view;\n },\n\n /** stop listening to view and remove from caches */\n removeElementView : function( view ){\n delete this.selectedIds[ view.element.id ];\n this._renderClearSelected();\n\n this.elementViews = _.without( this.elementViews, view );\n this.stopListening( view );\n },\n\n /** render a message in the list that no elements remain to create a collection */\n _renderNoElementsLeft : function(){\n this._disableNameAndCreate( true );\n this.$( '.collection-elements' ).append( this.templates.noElementsLeft() );\n },\n\n // /** render a message in the list that no valid elements were found to create a collection */\n // _renderNoValidElements : function(){\n // this._disableNameAndCreate( true );\n // this.$( '.collection-elements' ).append( this.templates.noValidElements() );\n // },\n\n // ------------------------------------------------------------------------ API\n /** convert element into JSON compatible with the collections API */\n _elementToJSON : function( element ){\n // return element.toJSON();\n return element;\n },\n\n /** create the collection via the API\n * @returns {jQuery.xhr Object} the jquery ajax request\n */\n createList : function( name ){\n if( !this.workingElements.length ){\n var message = _l( 'No valid elements for final list' ) + '. ';\n message += '' + _l( 'Cancel' ) + ' ';\n message += _l( 'or' );\n message += ' ' + _l( 'start over' ) + '.';\n this._showAlert( message );\n return;\n }\n\n var creator = this,\n elements = this.workingElements.map( function( element ){\n return creator._elementToJSON( element );\n });\n\n creator.blocking = true;\n return creator.creationFn( elements, name )\n .always( function(){\n creator.blocking = false;\n })\n .fail( function( xhr, status, message ){\n creator.trigger( 'error', {\n xhr : xhr,\n status : status,\n message : _l( 'An error occurred while creating this collection' )\n });\n })\n .done( function( response, message, xhr ){\n creator.trigger( 'collection:created', response, message, xhr );\n creator.metric( 'collection:created', response );\n if( typeof creator.oncreate === 'function' ){\n creator.oncreate.call( this, response, message, xhr );\n }\n });\n },\n\n // ------------------------------------------------------------------------ events\n /** set up event handlers on self */\n _setUpBehaviors : function(){\n this.on( 'error', this._errorHandler );\n\n this.once( 'rendered', function(){\n this.trigger( 'rendered:initial', this );\n });\n\n this.on( 'elements:select', function( data ){\n this._renderClearSelected();\n });\n\n this.on( 'elements:discard', function( data ){\n var element = data.source.element;\n this.removeElementView( data.source );\n\n this.workingElements = _.without( this.workingElements, element );\n if( !this.workingElements.length ){\n this._renderNoElementsLeft();\n }\n });\n\n //this.on( 'all', function(){\n // this.info( arguments );\n //});\n return this;\n },\n\n /** handle errors with feedback and details to the user (if available) */\n _errorHandler : function( data ){\n this.error( data );\n\n var creator = this;\n content = data.message || _l( 'An error occurred' );\n if( data.xhr ){\n var xhr = data.xhr,\n message = data.message;\n if( xhr.readyState === 0 && xhr.status === 0 ){\n content += ': ' + _l( 'Galaxy could not be reached and may be updating.' ) +\n _l( ' Try again in a few minutes.' );\n } else if( xhr.responseJSON ){\n content += ':
                            ' + JSON.stringify( xhr.responseJSON ) + '
                            ';\n } else {\n content += ': ' + message;\n }\n }\n creator._showAlert( content, 'alert-danger' );\n },\n\n events : {\n // header\n 'click .more-help' : '_clickMoreHelp',\n 'click .less-help' : '_clickLessHelp',\n 'click .main-help' : '_toggleHelp',\n 'click .header .alert button' : '_hideAlert',\n\n 'click .reset' : 'reset',\n 'click .clear-selected' : 'clearSelectedElements',\n\n // elements - selection\n 'click .collection-elements' : 'clearSelectedElements',\n\n // elements - drop target\n // 'dragenter .collection-elements': '_dragenterElements',\n // 'dragleave .collection-elements': '_dragleaveElements',\n 'dragover .collection-elements' : '_dragoverElements',\n 'drop .collection-elements' : '_dropElements',\n\n // these bubble up from the elements as custom events\n 'collection-element.dragstart .collection-elements' : '_elementDragstart',\n 'collection-element.dragend .collection-elements' : '_elementDragend',\n\n // footer\n 'change .collection-name' : '_changeName',\n 'keydown .collection-name' : '_nameCheckForEnter',\n 'click .cancel-create' : function( ev ){\n if( typeof this.oncancel === 'function' ){\n this.oncancel.call( this );\n }\n },\n 'click .create-collection' : '_clickCreate'//,\n },\n\n // ........................................................................ header\n /** expand help */\n _clickMoreHelp : function( ev ){\n ev.stopPropagation();\n this.$( '.main-help' ).addClass( 'expanded' );\n this.$( '.more-help' ).hide();\n },\n /** collapse help */\n _clickLessHelp : function( ev ){\n ev.stopPropagation();\n this.$( '.main-help' ).removeClass( 'expanded' );\n this.$( '.more-help' ).show();\n },\n /** toggle help */\n _toggleHelp : function( ev ){\n ev.stopPropagation();\n this.$( '.main-help' ).toggleClass( 'expanded' );\n this.$( '.more-help' ).toggle();\n },\n\n /** show an alert on the top of the interface containing message (alertClass is bootstrap's alert-*) */\n _showAlert : function( message, alertClass ){\n alertClass = alertClass || 'alert-danger';\n this.$( '.main-help' ).hide();\n this.$( '.header .alert' )\n .attr( 'class', 'alert alert-dismissable' ).addClass( alertClass ).show()\n .find( '.alert-message' ).html( message );\n },\n /** hide the alerts at the top */\n _hideAlert : function( message ){\n this.$( '.main-help' ).show();\n this.$( '.header .alert' ).hide();\n },\n\n // ........................................................................ elements\n /** reset all data to the initial state */\n reset : function(){\n this._instanceSetUp();\n this._elementsSetUp();\n this.render();\n },\n\n /** deselect all elements */\n clearSelectedElements : function( ev ){\n this.$( '.collection-elements .collection-element' ).removeClass( 'selected' );\n this.$( '.collection-elements-controls > .clear-selected' ).hide();\n },\n\n //_dragenterElements : function( ev ){\n // //this.debug( '_dragenterElements:', ev );\n //},\n//TODO: if selected are dragged out of the list area - remove the placeholder - cuz it won't work anyway\n // _dragleaveElements : function( ev ){\n // //this.debug( '_dragleaveElements:', ev );\n // },\n\n /** track the mouse drag over the list adding a placeholder to show where the drop would occur */\n _dragoverElements : function( ev ){\n //this.debug( '_dragoverElements:', ev );\n ev.preventDefault();\n\n var $list = this.$list();\n this._checkForAutoscroll( $list, ev.originalEvent.clientY );\n var $nearest = this._getNearestElement( ev.originalEvent.clientY );\n\n //TODO: no need to re-create - move instead\n this.$( '.element-drop-placeholder' ).remove();\n var $placeholder = $( '
                            ' );\n if( !$nearest.size() ){\n $list.append( $placeholder );\n } else {\n $nearest.before( $placeholder );\n }\n },\n\n /** If the mouse is near enough to the list's top or bottom, scroll the list */\n _checkForAutoscroll : function( $element, y ){\n var AUTOSCROLL_SPEED = 2,\n offset = $element.offset(),\n scrollTop = $element.scrollTop(),\n upperDist = y - offset.top,\n lowerDist = ( offset.top + $element.outerHeight() ) - y;\n if( upperDist >= 0 && upperDist < this.autoscrollDist ){\n $element.scrollTop( scrollTop - AUTOSCROLL_SPEED );\n } else if( lowerDist >= 0 && lowerDist < this.autoscrollDist ){\n $element.scrollTop( scrollTop + AUTOSCROLL_SPEED );\n }\n },\n\n /** get the nearest element based on the mouse's Y coordinate.\n * If the y is at the end of the list, return an empty jQuery object.\n */\n _getNearestElement : function( y ){\n var WIGGLE = 4,\n lis = this.$( '.collection-elements li.collection-element' ).toArray();\n for( var i=0; i y && top - halfHeight < y ){\n return $li;\n }\n }\n return $();\n },\n\n /** drop (dragged/selected elements) onto the list, re-ordering the internal list */\n _dropElements : function( ev ){\n if( ev.originalEvent ){ ev = ev.originalEvent; }\n // both required for firefox\n ev.preventDefault();\n ev.dataTransfer.dropEffect = 'move';\n\n // insert before the nearest element or after the last.\n var $nearest = this._getNearestElement( ev.clientY );\n if( $nearest.size() ){\n this.$dragging.insertBefore( $nearest );\n } else {\n // no nearest before - insert after last element\n this.$dragging.insertAfter( this.$( '.collection-elements .collection-element' ).last() );\n }\n // resync the creator's list based on the new DOM order\n this._syncOrderToDom();\n return false;\n },\n\n /** resync the creator's list of elements based on the DOM order */\n _syncOrderToDom : function(){\n var creator = this,\n newElements = [];\n //TODO: doesn't seem wise to use the dom to store these - can't we sync another way?\n this.$( '.collection-elements .collection-element' ).each( function(){\n var id = $( this ).attr( 'data-element-id' ),\n element = _.findWhere( creator.workingElements, { id: id });\n if( element ){\n newElements.push( element );\n } else {\n console.error( 'missing element: ', id );\n }\n });\n this.workingElements = newElements;\n this._renderList();\n },\n\n /** drag communication with element sub-views: dragstart */\n _elementDragstart : function( ev, element ){\n // auto select the element causing the event and move all selected\n element.select( true );\n this.$dragging = this.$( '.collection-elements .collection-element.selected' );\n },\n\n /** drag communication with element sub-views: dragend - remove the placeholder */\n _elementDragend : function( ev, element ){\n $( '.element-drop-placeholder' ).remove();\n this.$dragging = null;\n },\n\n // ........................................................................ footer\n /** handle a collection name change */\n _changeName : function( ev ){\n this._validationWarning( 'name', !!this._getName() );\n },\n\n /** check for enter key press when in the collection name and submit */\n _nameCheckForEnter : function( ev ){\n if( ev.keyCode === 13 && !this.blocking ){\n this._clickCreate();\n }\n },\n\n /** get the current collection name */\n _getName : function(){\n return _.escape( this.$( '.collection-name' ).val() );\n },\n\n /** attempt to create the current collection */\n _clickCreate : function( ev ){\n var name = this._getName();\n if( !name ){\n this._validationWarning( 'name' );\n } else if( !this.blocking ){\n this.createList( name );\n }\n },\n\n // ------------------------------------------------------------------------ templates\n //TODO: move to require text plugin and load these as text\n //TODO: underscore currently unnecc. bc no vars are used\n //TODO: better way of localizing text-nodes in long strings\n /** underscore template fns attached to class */\n templates : {\n /** the skeleton */\n main : _.template([\n '
                            ',\n '
                            ',\n '
                            '\n ].join('')),\n\n /** the header (not including help text) */\n header : _.template([\n '
                            ',\n '', _l( 'More help' ), '',\n '
                            ',\n '', _l( 'Less' ), '',\n '
                            ',\n '
                            ',\n '
                            ',\n '',\n '',\n '
                            ',\n ].join('')),\n\n /** the middle: element list */\n middle : _.template([\n '',\n '
                            ',\n '
                            '\n ].join('')),\n\n /** creation and cancel controls */\n footer : _.template([\n '
                            ',\n '
                            ',\n '',\n '
                            ', _l( 'Name' ), ':
                            ',\n '
                            ',\n '
                            ',\n\n '
                            ',\n '
                            ',\n '',\n '
                            ',\n '',\n '',\n '
                            ',\n '
                            ',\n\n '
                            ',\n '',\n '
                            ',\n '
                            '\n ].join('')),\n\n /** help content */\n helpContent : _.template([\n '

                            ', _l([\n 'Collections of datasets are permanent, ordered lists of datasets that can be passed to tools and ',\n 'workflows in order to have analyses done on each member of the entire group. This interface allows ',\n 'you to create a collection and re-order the final collection.'\n ].join( '' )), '

                            ',\n '
                              ',\n '
                            • ', _l([\n 'Rename elements in the list by clicking on ',\n 'the existing name.'\n ].join( '' )), '
                            • ',\n '
                            • ', _l([\n 'Discard elements from the final created list by clicking on the ',\n '\"Discard\" button.'\n ].join( '' )), '
                            • ',\n '
                            • ', _l([\n 'Reorder the list by clicking and dragging elements. Select multiple elements by clicking on ',\n 'them and you can then move those selected by dragging the ',\n 'entire group. Deselect them by clicking them again or by clicking the ',\n 'the \"Clear selected\" link.'\n ].join( '' )), '
                            • ',\n '
                            • ', _l([\n 'Click the \"Start over\" link to begin again as if you had just opened ',\n 'the interface.'\n ].join( '' )), '
                            • ',\n '
                            • ', _l([\n 'Click the \"Cancel\" button to exit the interface.'\n ].join( '' )), '
                            • ',\n '

                            ',\n '

                            ', _l([\n 'Once your collection is complete, enter a name and ',\n 'click \"Create list\".'\n ].join( '' )), '

                            '\n ].join('')),\n\n /** shown in list when all elements are discarded */\n invalidElements : _.template([\n _l( 'The following selections could not be included due to problems:' ),\n '
                              <% _.each( problems, function( problem ){ %>',\n '
                            • <%- problem.element.name %>: <%- problem.text %>
                            • ',\n '<% }); %>
                            '\n ].join('')),\n\n /** shown in list when all elements are discarded */\n noElementsLeft : _.template([\n '
                          7. ',\n _l( 'No elements left! ' ),\n _l( 'Would you like to ' ), '', _l( 'start over' ), '?',\n '
                          8. '\n ].join('')),\n\n /** a simplified page communicating what went wrong and why the user needs to reselect something else */\n invalidInitial : _.template([\n '
                            ',\n '
                            ',\n '',\n '<% if( _.size( problems ) ){ %>',\n _l( 'The following selections could not be included due to problems' ), ':',\n '
                              <% _.each( problems, function( problem ){ %>',\n '
                            • <%- problem.element.name %>: <%- problem.text %>
                            • ',\n '<% }); %>
                            ',\n '<% } else if( _.size( elements ) < 1 ){ %>',\n _l( 'No datasets were selected' ), '.',\n '<% } %>',\n '
                            ',\n _l( 'At least one element is needed for the collection' ), '. ',\n _l( 'You may need to ' ),\n '', _l( 'cancel' ), ' ',\n _l( 'and reselect new elements' ), '.',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '',\n // _l( 'Create a different kind of collection' ),\n '
                            ',\n '
                            ',\n '
                            '\n ].join('')),\n },\n\n // ------------------------------------------------------------------------ misc\n /** string rep */\n toString : function(){ return 'ListCollectionCreator'; }\n});\n\n\n\n//=============================================================================\n/** Create a modal and load its body with the given CreatorClass creator type\n * @returns {Deferred} resolved when creator has built a collection.\n */\nvar collectionCreatorModal = function _collectionCreatorModal( elements, options, CreatorClass ){\n\n var deferred = jQuery.Deferred(),\n modal = Galaxy.modal || ( new UI_MODAL.View() ),\n creator;\n\n options = _.defaults( options || {}, {\n elements : elements,\n oncancel : function(){\n modal.hide();\n deferred.reject( 'cancelled' );\n },\n oncreate : function( creator, response ){\n modal.hide();\n deferred.resolve( response );\n }\n });\n\n creator = new CreatorClass( options );\n modal.show({\n title : options.title || _l( 'Create a collection' ),\n body : creator.$el,\n width : '80%',\n height : '100%',\n closing_events: true\n });\n creator.render();\n window._collectionCreator = creator;\n\n //TODO: remove modal header\n return deferred;\n};\n\n/** List collection flavor of collectionCreatorModal. */\nvar listCollectionCreatorModal = function _listCollectionCreatorModal( elements, options ){\n options = options || {};\n options.title = _l( 'Create a collection from a list of datasets' );\n return collectionCreatorModal( elements, options, ListCollectionCreator );\n};\n\n\n//==============================================================================\n/** Use a modal to create a list collection, then add it to the given history contents.\n * @returns {Deferred} resolved when the collection is added to the history.\n */\nfunction createListCollection( contents ){\n var elements = contents.toJSON(),\n promise = listCollectionCreatorModal( elements, {\n creationFn : function( elements, name ){\n elements = elements.map( function( element ){\n return {\n id : element.id,\n name : element.name,\n //TODO: this allows for list:list even if the filter above does not - reconcile\n src : ( element.history_content_type === 'dataset'? 'hda' : 'hdca' )\n };\n });\n return contents.createHDCA( elements, 'list', name );\n }\n });\n return promise;\n}\n\n//==============================================================================\n return {\n DatasetCollectionElementView: DatasetCollectionElementView,\n ListCollectionCreator : ListCollectionCreator,\n\n collectionCreatorModal : collectionCreatorModal,\n listCollectionCreatorModal : listCollectionCreatorModal,\n createListCollection : createListCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/list-collection-creator.js\n ** module id = 36\n ** module chunks = 3\n **/","define([\n \"mvc/list/list-item\",\n \"mvc/dataset/states\",\n \"ui/fa-icon-button\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( LIST_ITEM, STATES, faIconButton, BASE_MVC, _l ){\n/* global Backbone */\n\nvar logNamespace = 'dataset';\n/*==============================================================================\nTODO:\n straighten out state rendering and templates used\n inaccessible/STATES.NOT_VIEWABLE is a special case\n simplify button rendering\n\n==============================================================================*/\nvar _super = LIST_ITEM.ListItemView;\n/** @class Read only list view for either LDDAs, HDAs, or HDADCEs.\n * Roughly, any DatasetInstance (and not a raw Dataset).\n */\nvar DatasetListItemView = _super.extend(\n/** @lends DatasetListItemView.prototype */{\n _logNamespace : logNamespace,\n\n className : _super.prototype.className + \" dataset\",\n //TODO:?? doesn't exactly match an hda's type_id\n id : function(){\n return [ 'dataset', this.model.get( 'id' ) ].join( '-' );\n },\n\n /** Set up: instance vars, options, and event handlers */\n initialize : function( attributes ){\n if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }\n this.log( this + '.initialize:', attributes );\n _super.prototype.initialize.call( this, attributes );\n\n /** where should pages from links be displayed? (default to new tab/window) */\n this.linkTarget = attributes.linkTarget || '_blank';\n },\n\n /** event listeners */\n _setUpListeners : function(){\n _super.prototype._setUpListeners.call( this );\n\n // re-rendering on any model changes\n this.model.on( 'change', function( model, options ){\n // if the model moved into the ready state and is expanded without details, fetch those details now\n if( this.model.changedAttributes().state && this.model.inReadyState()\n && this.expanded && !this.model.hasDetails() ){\n // will render automatically (due to fetch -> change)\n this.model.fetch();\n\n } else {\n this.render();\n }\n }, this );\n },\n\n // ......................................................................... expandable\n /** In this override, only get details if in the ready state, get rerunnable if in other states.\n * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n */\n _fetchModelDetails : function(){\n var view = this;\n if( view.model.inReadyState() && !view.model.hasDetails() ){\n return view.model.fetch({ silent: true });\n }\n return jQuery.when();\n },\n\n // ......................................................................... removal\n /** Remove this view's html from the DOM and remove all event listeners.\n * @param {Number or String} speed jq effect speed\n * @param {Function} callback an optional function called when removal is done (scoped to this view)\n */\n remove : function( speed, callback ){\n var view = this;\n speed = speed || this.fxSpeed;\n this.$el.fadeOut( speed, function(){\n Backbone.View.prototype.remove.call( view );\n if( callback ){ callback.call( view ); }\n });\n },\n\n // ......................................................................... rendering\n /* TODO:\n dataset states are the issue primarily making dataset rendering complex\n each state should have it's own way of displaying/set of details\n often with different actions that can be applied\n throw in deleted/purged/visible and things get complicated easily\n I've considered (a couple of times) - creating a view for each state\n - but recreating the view during an update...seems wrong\n */\n /** Render this HDA, set up ui.\n * @param {Number or String} speed jq fx speed\n * @returns {Object} this\n */\n render : function( speed ){\n //HACK: hover exit doesn't seem to be called on prev. tooltips when RE-rendering - so: no tooltip hide\n // handle that here by removing previous view's tooltips\n //this.$el.find(\"[title]\").tooltip( \"destroy\" );\n return _super.prototype.render.call( this, speed );\n },\n\n /** In this override, add the dataset state as a class for use with state-based CSS */\n _swapNewRender : function( $newRender ){\n _super.prototype._swapNewRender.call( this, $newRender );\n if( this.model.has( 'state' ) ){\n this.$el.addClass( 'state-' + this.model.get( 'state' ) );\n }\n return this.$el;\n },\n\n // ................................................................................ titlebar\n /** In this override, add the dataset display button. */\n _renderPrimaryActions : function(){\n // render just the display for read-only\n return [ this._renderDisplayButton() ];\n },\n\n /** Render icon-button to display dataset data */\n _renderDisplayButton : function(){\n//TODO:?? too complex - possibly move into template\n // don't show display if not viewable or not accessible\n var state = this.model.get( 'state' );\n if( ( state === STATES.NOT_VIEWABLE )\n || ( state === STATES.DISCARDED )\n || ( !this.model.get( 'accessible' ) ) ){\n return null;\n }\n\n var displayBtnData = {\n target : this.linkTarget,\n classes : 'display-btn'\n };\n\n // show a disabled display if the data's been purged\n if( this.model.get( 'purged' ) ){\n displayBtnData.disabled = true;\n displayBtnData.title = _l( 'Cannot display datasets removed from disk' );\n\n // disable if still uploading\n } else if( state === STATES.UPLOAD ){\n displayBtnData.disabled = true;\n displayBtnData.title = _l( 'This dataset must finish uploading before it can be viewed' );\n\n // disable if still new\n } else if( state === STATES.NEW ){\n displayBtnData.disabled = true;\n displayBtnData.title = _l( 'This dataset is not yet viewable' );\n\n } else {\n displayBtnData.title = _l( 'View data' );\n\n // default link for dataset\n displayBtnData.href = this.model.urls.display;\n\n // add frame manager option onclick event\n var self = this;\n displayBtnData.onclick = function( ev ){\n if (Galaxy.frame && Galaxy.frame.active) {\n // Add dataset to frames.\n Galaxy.frame.addDataset(self.model.get('id'));\n ev.preventDefault();\n }\n };\n }\n displayBtnData.faIcon = 'fa-eye';\n return faIconButton( displayBtnData );\n },\n\n // ......................................................................... rendering details\n /** Render the enclosing div of the hda body and, if expanded, the html in the body\n * @returns {jQuery} rendered DOM\n */\n _renderDetails : function(){\n //TODO: generalize to be allow different details for each state\n\n // no access - render nothing but a message\n if( this.model.get( 'state' ) === STATES.NOT_VIEWABLE ){\n return $( this.templates.noAccess( this.model.toJSON(), this ) );\n }\n\n var $details = _super.prototype._renderDetails.call( this );\n $details.find( '.actions .left' ).empty().append( this._renderSecondaryActions() );\n $details.find( '.summary' ).html( this._renderSummary() )\n .prepend( this._renderDetailMessages() );\n $details.find( '.display-applications' ).html( this._renderDisplayApplications() );\n\n//TODO: double tap\n this._setUpBehaviors( $details );\n return $details;\n },\n\n /** Defer to the appropo summary rendering fn based on state */\n _renderSummary : function(){\n var json = this.model.toJSON(),\n summaryRenderFn = this.templates.summaries[ json.state ];\n summaryRenderFn = summaryRenderFn || this.templates.summaries.unknown;\n return summaryRenderFn( json, this );\n },\n\n /** Render messages to be displayed only when the details are shown */\n _renderDetailMessages : function(){\n var view = this,\n $warnings = $( '
                            ' ),\n json = view.model.toJSON();\n//TODO:! unordered (map)\n _.each( view.templates.detailMessages, function( templateFn ){\n $warnings.append( $( templateFn( json, view ) ) );\n });\n return $warnings;\n },\n\n /** Render the external display application links */\n _renderDisplayApplications : function(){\n if( this.model.isDeletedOrPurged() ){ return ''; }\n // render both old and new display apps using the same template\n return [\n this.templates.displayApplications( this.model.get( 'display_apps' ), this ),\n this.templates.displayApplications( this.model.get( 'display_types' ), this )\n ].join( '' );\n },\n\n // ......................................................................... secondary/details actions\n /** A series of links/buttons for less commonly used actions: re-run, info, etc. */\n _renderSecondaryActions : function(){\n this.debug( '_renderSecondaryActions' );\n switch( this.model.get( 'state' ) ){\n case STATES.NOT_VIEWABLE:\n return [];\n case STATES.OK:\n case STATES.FAILED_METADATA:\n case STATES.ERROR:\n return [ this._renderDownloadButton(), this._renderShowParamsButton() ];\n }\n return [ this._renderShowParamsButton() ];\n },\n\n /** Render icon-button to show the input and output (stdout/err) for the job that created this.\n * @returns {jQuery} rendered DOM\n */\n _renderShowParamsButton : function(){\n // gen. safe to show in all cases\n return faIconButton({\n title : _l( 'View details' ),\n classes : 'params-btn',\n href : this.model.urls.show_params,\n target : this.linkTarget,\n faIcon : 'fa-info-circle'\n });\n },\n\n /** Render icon-button/popupmenu to download the data (and/or the associated meta files (bai, etc.)) for this.\n * @returns {jQuery} rendered DOM\n */\n _renderDownloadButton : function(){\n//TODO: to (its own) template fn\n // don't show anything if the data's been purged\n if( this.model.get( 'purged' ) || !this.model.hasData() ){ return null; }\n\n // return either: a popupmenu with links to download assoc. meta files (if there are meta files)\n // or a single download icon-button (if there are no meta files)\n if( !_.isEmpty( this.model.get( 'meta_files' ) ) ){\n return this._renderMetaFileDownloadButton();\n }\n\n return $([\n '',\n '',\n ''\n ].join( '' ));\n },\n\n /** Render the download button which opens a dropdown with links to download assoc. meta files (indeces, etc.) */\n _renderMetaFileDownloadButton : function(){\n var urls = this.model.urls;\n return $([\n '
                            ',\n '',\n '',\n '',\n '',\n '
                            '\n ].join( '\\n' ));\n },\n\n // ......................................................................... misc\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .display-btn' : function( ev ){ this.trigger( 'display', this, ev ); },\n 'click .params-btn' : function( ev ){ this.trigger( 'params', this, ev ); },\n 'click .download-btn' : function( ev ){ this.trigger( 'download', this, ev ); }\n }),\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DatasetListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDatasetListItemView.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n failed_metadata : BASE_MVC.wrapTemplate([\n // failed metadata is rendered as a warning on an otherwise ok dataset view\n '<% if( model.state === \"failed_metadata\" ){ %>',\n '
                            ',\n _l( 'An error occurred setting the metadata for this dataset' ),\n '
                            ',\n '<% } %>'\n ]),\n error : BASE_MVC.wrapTemplate([\n // error during index fetch - show error on dataset\n '<% if( model.error ){ %>',\n '
                            ',\n _l( 'There was an error getting the data for this dataset' ), ': <%- model.error %>',\n '
                            ',\n '<% } %>'\n ]),\n purged : BASE_MVC.wrapTemplate([\n '<% if( model.purged ){ %>',\n '
                            ',\n _l( 'This dataset has been deleted and removed from disk' ),\n '
                            ',\n '<% } %>'\n ]),\n deleted : BASE_MVC.wrapTemplate([\n // deleted not purged\n '<% if( model.deleted && !model.purged ){ %>',\n '
                            ',\n _l( 'This dataset has been deleted' ),\n '
                            ',\n '<% } %>'\n ])\n\n //NOTE: hidden warning is only needed for HDAs\n });\n\n var detailsTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n '
                            ',\n\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n\n // do not display tags, annotation, display apps, or peek when deleted\n '<% if( !dataset.deleted && !dataset.purged ){ %>',\n '
                            ',\n '
                            ',\n\n '
                            ',\n\n '<% if( dataset.peek ){ %>',\n '
                            <%= dataset.peek %>
                            ',\n '<% } %>',\n '<% } %>',\n '
                            '\n ], 'dataset' );\n\n var noAccessTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n '
                            ',\n _l( 'You do not have permission to view this dataset' ),\n '
                            ',\n '
                            '\n ], 'dataset' );\n\n//TODO: still toooooooooooooo complex - rework\n var summaryTemplates = {};\n summaryTemplates[ STATES.OK ] = summaryTemplates[ STATES.FAILED_METADATA ] = BASE_MVC.wrapTemplate([\n '<% if( dataset.misc_blurb ){ %>',\n '
                            ',\n '<%- dataset.misc_blurb %>',\n '
                            ',\n '<% } %>',\n\n '<% if( dataset.file_ext ){ %>',\n '
                            ',\n '',\n '<%- dataset.file_ext %>',\n '
                            ',\n '<% } %>',\n\n '<% if( dataset.metadata_dbkey ){ %>',\n '
                            ',\n '',\n '',\n '<%- dataset.metadata_dbkey %>',\n '',\n '
                            ',\n '<% } %>',\n\n '<% if( dataset.misc_info ){ %>',\n '
                            ',\n '<%- dataset.misc_info %>',\n '
                            ',\n '<% } %>'\n ], 'dataset' );\n summaryTemplates[ STATES.NEW ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'This is a new dataset and not all of its data are available yet' ), '
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.NOT_VIEWABLE ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'You do not have permission to view this dataset' ), '
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.DISCARDED ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'The job creating this dataset was cancelled before completion' ), '
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.QUEUED ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'This job is waiting to run' ), '
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.RUNNING ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'This job is currently running' ), '
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.UPLOAD ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'This dataset is currently uploading' ), '
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.SETTING_METADATA ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'Metadata is being auto-detected' ), '
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.PAUSED ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume' ), '
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.ERROR ] = BASE_MVC.wrapTemplate([\n '<% if( !dataset.purged ){ %>',\n '
                            <%- dataset.misc_blurb %>
                            ',\n '<% } %>',\n '', _l( 'An error occurred with this dataset' ), ':',\n '
                            <%- dataset.misc_info %>
                            '\n ], 'dataset' );\n summaryTemplates[ STATES.EMPTY ] = BASE_MVC.wrapTemplate([\n '
                            ', _l( 'No data' ), ': <%- dataset.misc_blurb %>
                            '\n ], 'dataset' );\n summaryTemplates.unknown = BASE_MVC.wrapTemplate([\n '
                            Error: unknown dataset state: \"<%- dataset.state %>\"
                            '\n ], 'dataset' );\n\n // messages to be displayed only within the details section ('below the fold')\n var detailMessageTemplates = {\n resubmitted : BASE_MVC.wrapTemplate([\n // deleted not purged\n '<% if( model.resubmitted ){ %>',\n '
                            ',\n _l( 'The job creating this dataset has been resubmitted' ),\n '
                            ',\n '<% } %>'\n ])\n };\n\n // this is applied to both old and new style display apps\n var displayApplicationsTemplate = BASE_MVC.wrapTemplate([\n '<% _.each( apps, function( app ){ %>',\n '
                            ',\n '<%- app.label %> ',\n '',\n '<% _.each( app.links, function( link ){ %>',\n '\" href=\"<%- link.href %>\">',\n '<% print( _l( link.text ) ); %>',\n ' ',\n '<% }); %>',\n '',\n '
                            ',\n '<% }); %>'\n ], 'apps' );\n\n return _.extend( {}, _super.prototype.templates, {\n warnings : warnings,\n details : detailsTemplate,\n noAccess : noAccessTemplate,\n summaries : summaryTemplates,\n detailMessages : detailMessageTemplates,\n displayApplications : displayApplicationsTemplate\n });\n}());\n\n\n// ============================================================================\n return {\n DatasetListItemView : DatasetListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/dataset-li.js\n ** module id = 37\n ** module chunks = 3\n **/","/*\n This class maps the form dom to an api compatible javascript dictionary.\n*/\ndefine([ 'utils/utils' ], function( Utils ) {\n var Manager = Backbone.Model.extend({\n initialize: function( app ) {\n this.app = app;\n },\n\n /** Creates a checksum.\n */\n checksum: function() {\n var sum = '';\n var self = this;\n this.app.section.$el.find( '.section-row' ).each( function() {\n var id = $(this).attr( 'id' );\n var field = self.app.field_list[ id ];\n if ( field ) {\n sum += id + ':' + JSON.stringify( field.value && field.value() ) + ':' + field.collapsed + ';';\n }\n });\n return sum;\n },\n\n /** Convert dom into a dictionary of flat id/value pairs used e.g. on job submission.\n */\n create: function() {\n var self = this;\n\n // get raw dictionary from dom\n var dict = {};\n this._iterate( this.app.section.$el, dict );\n\n // add to result dictionary\n var result_dict = {};\n this.flat_dict = {};\n function add( flat_id, input_id, input_value ) {\n self.flat_dict[ flat_id ] = input_id;\n result_dict[ flat_id ] = input_value;\n };\n\n // converter between raw dictionary and job dictionary\n function convert( identifier, head ) {\n for ( var index in head ) {\n var node = head[ index ];\n if ( node.input ) {\n var input = node.input;\n var flat_id = identifier;\n if ( identifier != '' ) {\n flat_id += '|';\n }\n flat_id += input.name;\n switch ( input.type ) {\n case 'repeat':\n var section_label = 'section-';\n var block_indices = [];\n var block_prefix = null;\n for ( var block_label in node ) {\n var pos = block_label.indexOf( section_label );\n if ( pos != -1 ) {\n pos += section_label.length;\n block_indices.push( parseInt( block_label.substr( pos ) ));\n if ( !block_prefix ) {\n block_prefix = block_label.substr( 0, pos );\n }\n }\n }\n block_indices.sort( function( a, b ) { return a - b; });\n var index = 0;\n for ( var i in block_indices ) {\n convert( flat_id + '_' + index++, node[ block_prefix + block_indices[ i ] ]);\n }\n break;\n case 'conditional':\n var value = self.app.field_list[ input.id ].value();\n add ( flat_id + '|' + input.test_param.name, input.id, value );\n var selectedCase = matchCase( input, value );\n if ( selectedCase != -1 ) {\n convert( flat_id, head[ input.id + '-section-' + selectedCase ] );\n }\n break;\n case 'section':\n convert( !input.flat && flat_id || '', node );\n break;\n default:\n var field = self.app.field_list[ input.id ];\n if ( field && field.value ) {\n var value = field.value();\n if ( input.ignore === undefined || input.ignore != value ) {\n if ( field.collapsed && input.collapsible_value ) {\n value = input.collapsible_value;\n }\n add ( flat_id, input.id, value );\n if ( input.payload ) {\n for ( var p_id in input.payload ) {\n add ( p_id, input.id, input.payload[ p_id ] );\n }\n }\n }\n }\n }\n }\n }\n }\n convert( '', dict );\n return result_dict;\n },\n\n /** Matches flat ids to corresponding input element\n * @param{string} flat_id - Flat input id to be looked up.\n */\n match: function ( flat_id ) {\n return this.flat_dict && this.flat_dict[ flat_id ];\n },\n\n /** Match conditional values to selected cases\n */\n matchCase: function( input, value ) {\n return matchCase( input, value );\n },\n\n /** Matches a new tool model to the current input elements e.g. used to update dynamic options\n */\n matchModel: function( model, callback ) {\n return matchIds( model.inputs, this.flat_dict, callback );\n },\n\n /** Matches identifier from api response to input elements e.g. used to display validation errors\n */\n matchResponse: function( response ) {\n var result = {};\n var self = this;\n function search ( id, head ) {\n if ( typeof head === 'string' ) {\n var input_id = self.flat_dict[ id ];\n input_id && ( result[ input_id ] = head );\n } else {\n for ( var i in head ) {\n var new_id = i;\n if ( id !== '' ) {\n var separator = '|';\n if ( head instanceof Array ) {\n separator = '_';\n }\n new_id = id + separator + new_id;\n }\n search ( new_id, head[ i ] );\n }\n }\n }\n search( '', response );\n return result;\n },\n\n /** Map dom tree to dictionary tree with input elements.\n */\n _iterate: function( parent, dict ) {\n var self = this;\n var children = $( parent ).children();\n children.each( function() {\n var child = this;\n var id = $( child ).attr( 'id' );\n if ( $( child ).hasClass( 'section-row' ) ) {\n var input = self.app.input_list[ id ];\n dict[ id ] = ( input && { input : input } ) || {};\n self._iterate( child, dict[ id ] );\n } else {\n self._iterate( child, dict );\n }\n });\n }\n });\n\n /** Match conditional values to selected cases\n * @param{dict} input - Definition of conditional input parameter\n * @param{dict} value - Current value\n */\n var matchCase = function( input, value ) {\n if ( input.test_param.type == 'boolean' ) {\n if ( value == 'true' ) {\n value = input.test_param.truevalue || 'true';\n } else {\n value = input.test_param.falsevalue || 'false';\n }\n }\n for ( var i in input.cases ) {\n if ( input.cases[ i ].value == value ) {\n return i;\n }\n }\n return -1;\n };\n\n /** Match context\n * @param{dict} inputs - Dictionary of input elements\n * @param{dict} key - Reference key which is matched to an input name e.g. data_ref\n * @param{dict} callback - Called with matched context i.e. callback( input, referenced_input )\n */\n var matchContext = function( inputs, key, callback, context ) {\n context = $.extend( true, {}, context );\n _.each( inputs, function ( input ) {\n input && input.type && ( context[ input.name ] = input );\n });\n _.each( inputs, function ( input ) {\n if ( _.isObject( input ) ) {\n if ( input.type && context[ input[ key ] ] ) {\n callback ( input, context[ input[ key ] ] );\n } else {\n matchContext( input, key, callback, context );\n }\n }\n });\n };\n\n /** Matches a tool model to a dictionary, indexed with flat ids\n * @param{dict} inputs - Dictionary of input elements\n * @param{dict} mapping - Dictionary containing flat ids\n * @param{dict} callback - Called with the mapped dictionary object and corresponding model node\n */\n var matchIds = function( inputs, mapping, callback ) {\n var result = {};\n var self = this;\n function search ( id, head ) {\n for ( var i in head ) {\n var node = head[ i ];\n var index = node.name;\n id != '' && ( index = id + '|' + index );\n switch ( node.type ) {\n case 'repeat':\n for ( var j in node.cache ) {\n search ( index + '_' + j, node.cache[ j ] );\n }\n break;\n case 'conditional':\n var selectedCase = matchCase( node, node.test_param && node.test_param.value );\n selectedCase != -1 && search ( index, node.cases[ selectedCase ].inputs );\n break;\n case 'section':\n search ( index, node.inputs );\n break;\n default:\n var mapped = mapping[ index ];\n mapped && callback( mapped, node );\n }\n }\n }\n search( '', inputs );\n return result;\n };\n\n return {\n Manager : Manager,\n matchIds : matchIds,\n matchContext : matchContext\n }\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-data.js\n ** module id = 38\n ** module chunks = 0 3\n **/","/**\n This class creates a form input element wrapper\n*/\ndefine([], function() {\n return Backbone.View.extend({\n initialize: function(app, options) {\n this.app = app;\n this.field = options.field;\n\n // set text labels and icons for collapsible button\n this.text_enable = app.options.text_enable || 'Enable';\n this.text_disable = app.options.text_disable || 'Disable';\n this.cls_enable = app.options.cls_enable || 'fa fa-caret-square-o-down';\n this.cls_disable = app.options.cls_disable || 'fa fa-caret-square-o-up';\n\n // set element\n this.setElement(this._template(options));\n\n // link elements\n this.$field = this.$('.ui-form-field');\n this.$preview = this.$('.ui-form-preview');\n this.$collapsible = this.$('.ui-form-collapsible');\n this.$collapsible_icon = this.$('.ui-form-collapsible').find('.icon');\n this.$error_text = this.$('.ui-form-error-text');\n this.$error = this.$('.ui-form-error');\n this.$backdrop = this.$('.ui-form-backdrop');\n\n // add field element\n this.$field.prepend(this.field.$el);\n\n // decide wether to expand or collapse fields\n this.field.collapsed = options.collapsible_value !== undefined && JSON.stringify( options.value ) == JSON.stringify( options.collapsible_value );\n\n // refresh view\n this._refresh();\n\n // add collapsible hide/show\n var self = this;\n this.$collapsible.on('click', function() {\n self.field.collapsed = !self.field.collapsed;\n self._refresh();\n });\n },\n\n /** Disable input element\n */\n disable: function( silent ) {\n this.$backdrop.show();\n silent && this.$backdrop.css({ 'opacity': 0, 'cursor': 'default' } );\n },\n\n /** Set error text\n */\n error: function(text) {\n this.$error_text.html(text);\n this.$error.show();\n this.$el.addClass('ui-error');\n },\n\n /** Reset this view\n */\n reset: function() {\n this.$error.hide();\n this.$el.removeClass('ui-error');\n },\n\n /** Refresh element\n */\n _refresh: function() {\n this.$collapsible_icon.removeClass().addClass('icon');\n if (!this.field.collapsed) {\n this.$field.fadeIn('fast');\n this.$preview.hide();\n this._tooltip(this.text_disable, this.cls_disable);\n } else {\n this.$field.hide();\n this.$preview.show();\n this._tooltip(this.text_enable, this.cls_enable);\n }\n this.app.trigger('change');\n },\n\n /** Set tooltip text\n */\n _tooltip: function(title, cls) {\n this.$collapsible_icon.addClass(cls)\n .tooltip({ placement: 'bottom' })\n .attr('data-original-title', title)\n .tooltip('fixTitle').tooltip('hide');\n },\n\n /** Main Template\n */\n _template: function(options) {\n var tmp = '
                            ' +\n '
                            ' +\n '' +\n '
                            ' +\n '
                            ';\n if ( !options.disabled && options.collapsible_value !== undefined ) {\n tmp += '
                            ' +\n '' + options.label +\n '
                            ';\n } else {\n tmp += options.label;\n }\n tmp += '
                            ' +\n '
                            ';\n tmp += '
                            ';\n if (options.help) {\n tmp += options.help;\n if (options.argument && options.help.indexOf('(' + options.argument + ')') == -1) {\n tmp += ' (' + options.argument + ')';\n }\n }\n tmp += '
                            ' +\n '
                            ' +\n '
                            ';\n if ( options.collapsible_preview ) {\n tmp += '
                            ' + options.text_value + '
                            ';\n }\n tmp += '
                            ';\n return tmp;\n }\n });\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-input.js\n ** module id = 39\n ** module chunks = 0 3\n **/","/**\n This class creates input elements. New input parameter types should be added to the types dictionary.\n*/\ndefine(['utils/utils',\n 'mvc/ui/ui-misc',\n 'mvc/form/form-select-content',\n 'mvc/ui/ui-select-library',\n 'mvc/ui/ui-select-ftp',\n 'mvc/ui/ui-color-picker'],\n function(Utils, Ui, SelectContent, SelectLibrary, SelectFtp, ColorPicker) {\n\n // create form view\n return Backbone.Model.extend({\n /** Available parameter types */\n types: {\n 'text' : '_fieldText',\n 'select' : '_fieldSelect',\n 'data_column' : '_fieldSelect',\n 'genomebuild' : '_fieldSelect',\n 'data' : '_fieldData',\n 'data_collection' : '_fieldData',\n 'integer' : '_fieldSlider',\n 'float' : '_fieldSlider',\n 'boolean' : '_fieldBoolean',\n 'drill_down' : '_fieldDrilldown',\n 'color' : '_fieldColor',\n 'hidden' : '_fieldHidden',\n 'hidden_data' : '_fieldHidden',\n 'baseurl' : '_fieldHidden',\n 'library_data' : '_fieldLibrary',\n 'ftpfile' : '_fieldFtp'\n },\n\n // initialize\n initialize: function(app, options) {\n this.app = app;\n },\n\n /** Returns an input field for a given field type\n */\n create: function(input_def) {\n // add regular/default value if missing\n if (input_def.value === undefined) {\n input_def.value = null;\n }\n if (input_def.default_value === undefined) {\n input_def.default_value = input_def.value;\n }\n\n // create field wrapper\n var field = null;\n var fieldClass = this.types[input_def.type];\n if (fieldClass && typeof(this[fieldClass]) === 'function') {\n field = this[fieldClass].call(this, input_def);\n }\n\n // match unavailable field types\n if (!field) {\n this.app.incompatible = true;\n if (input_def.options) {\n field = this._fieldSelect(input_def);\n } else {\n field = this._fieldText(input_def);\n }\n Galaxy.emit.debug('form-parameters::_addRow()', 'Auto matched field type (' + input_def.type + ').');\n }\n\n // set initial field value\n input_def.value !== undefined && ( field.value( input_def.value ) );\n return field;\n },\n\n /** Data input field\n */\n _fieldData: function(input_def) {\n var self = this;\n return new SelectContent.View(this.app, {\n id : 'field-' + input_def.id,\n extensions : input_def.extensions,\n optional : input_def.optional,\n multiple : input_def.multiple,\n type : input_def.type,\n data : input_def.options,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Select/Checkbox/Radio options field\n */\n _fieldSelect: function (input_def) {\n // show text field e.g. in workflow editor\n if( input_def.is_workflow ) {\n return this._fieldText( input_def );\n }\n\n // customize properties\n if (input_def.type == 'data_column') {\n input_def.error_text = 'Missing columns in referenced dataset.'\n }\n\n // configure options fields\n var options = [];\n for (var i in input_def.options) {\n var option = input_def.options[i];\n options.push({\n label: option[0],\n value: option[1]\n });\n }\n\n // identify display type\n var SelectClass = Ui.Select;\n switch (input_def.display) {\n case 'checkboxes':\n SelectClass = Ui.Checkbox;\n break;\n case 'radio':\n SelectClass = Ui.Radio;\n break;\n }\n\n // create select field\n var self = this;\n return new SelectClass.View({\n id : 'field-' + input_def.id,\n data : options,\n error_text : input_def.error_text || 'No options available',\n optional : input_def.optional && input_def.default_value === null,\n multiple : input_def.multiple,\n optional : input_def.optional,\n searchable : input_def.searchable,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Drill down options field\n */\n _fieldDrilldown: function (input_def) {\n // show text field e.g. in workflow editor\n if( input_def.is_workflow ) {\n return this._fieldText( input_def );\n }\n\n // create drill down field\n var self = this;\n return new Ui.Drilldown.View({\n id : 'field-' + input_def.id,\n data : input_def.options,\n display : input_def.display,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Text input field\n */\n _fieldText: function(input_def) {\n // field replaces e.g. a select field\n if (input_def.options) {\n input_def.area = input_def.multiple;\n if (!Utils.validate(input_def.value)) {\n input_def.value = null;\n } else {\n if ($.isArray(input_def.value)) {\n var str_value = '';\n for (var i in input_def.value) {\n str_value += String(input_def.value[i]);\n if (!input_def.multiple) {\n break;\n }\n str_value += '\\n';\n }\n input_def.value = str_value;\n }\n }\n }\n\n // create input element\n var self = this;\n return new Ui.Input({\n id : 'field-' + input_def.id,\n area : input_def.area,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Slider field\n */\n _fieldSlider: function(input_def) {\n var self = this;\n return new Ui.Slider.View({\n id : 'field-' + input_def.id,\n precise : input_def.type == 'float',\n is_workflow : input_def.is_workflow,\n min : input_def.min,\n max : input_def.max,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Hidden field\n */\n _fieldHidden: function(input_def) {\n return new Ui.Hidden({\n id : 'field-' + input_def.id,\n info : input_def.info\n });\n },\n\n /** Boolean field\n */\n _fieldBoolean: function(input_def) {\n var self = this;\n return new Ui.RadioButton.View({\n id : 'field-' + input_def.id,\n data : [ { label : 'Yes', value : 'true' },\n { label : 'No', value : 'false' }],\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Color picker field\n */\n _fieldColor: function(input_def) {\n var self = this;\n return new ColorPicker({\n id : 'field-' + input_def.id,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** Library dataset field\n */\n _fieldLibrary: function(input_def) {\n var self = this;\n return new SelectLibrary.View({\n id : 'field-' + input_def.id,\n optional : input_def.optional,\n multiple : input_def.multiple,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n },\n\n /** FTP file field\n */\n _fieldFtp: function(input_def) {\n var self = this;\n return new SelectFtp.View({\n id : 'field-' + input_def.id,\n optional : input_def.optional,\n multiple : input_def.multiple,\n onchange : function() {\n self.app.trigger('change');\n }\n });\n }\n });\n\n return {\n View: View\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-parameters.js\n ** module id = 40\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-table', 'mvc/ui/ui-portlet', 'mvc/ui/ui-misc'],\n function(Utils, Table, Portlet, Ui) {\n\n/** This class creates a ui component which enables the dynamic creation of portlets\n*/\nvar View = Backbone.View.extend({\n /** Initialize\n */\n initialize : function(options) {\n this.options = Utils.merge(options, {\n title : 'Section',\n empty_text : 'Not available.',\n max : null,\n min : null\n });\n this.setElement('
                            ');\n var self = this;\n\n // create button\n this.button_new = new Ui.ButtonIcon({\n icon : 'fa-plus',\n title : 'Insert ' + options.title_new,\n tooltip : 'Add new ' + options.title_new + ' block',\n floating: 'clear',\n onclick : function() {\n if (options.onnew) {\n options.onnew();\n }\n }\n });\n\n // create table\n this.table = new Table.View({\n cls : 'ui-table-plain',\n content : ''\n });\n this.$el.append(this.table.$el);\n this.$el.append($('
                            ').append(this.button_new.$el));\n\n // reset list\n this.list = {};\n this.n = 0;\n },\n\n /** Number of repeat blocks\n */\n size: function() {\n return this.n;\n },\n\n /** Add new repeat block\n */\n add: function(options) {\n if (!options.id || this.list[options.id]) {\n Galaxy.emit.debug('form-repeat::add()', 'Duplicate repeat block id.');\n return;\n }\n this.n++;\n var button_delete = new Ui.ButtonIcon({\n icon : 'fa-trash-o',\n tooltip : 'Delete this repeat block',\n cls : 'ui-button-icon-plain',\n onclick : function() {\n if (options.ondel) {\n options.ondel();\n }\n }\n });\n var portlet = new Portlet.View({\n id : options.id,\n title : 'placeholder',\n cls : 'ui-portlet-repeat',\n operations : {\n button_delete : button_delete\n }\n });\n portlet.append(options.$el);\n portlet.$el.addClass('section-row');\n this.list[options.id] = portlet;\n this.table.add(portlet.$el);\n this.table.append('row_' + options.id, true);\n if (this.options.max > 0 && this.n >= this.options.max) {\n this.button_new.disable();\n }\n this._refresh();\n },\n\n /** Delete repeat block\n */\n del: function(id) {\n if (!this.list[id]) {\n Galaxy.emit.debug('form-repeat::del()', 'Invalid repeat block id.');\n return;\n }\n this.n--;\n var table_row = this.table.get('row_' + id);\n table_row.remove();\n delete this.list[id];\n this.button_new.enable();\n this._refresh();\n },\n\n /** Hides add/del options\n */\n hideOptions: function() {\n this.button_new.$el.hide();\n _.each( this.list, function( portlet ) {\n portlet.hideOperation('button_delete');\n });\n if( _.isEmpty( this.list ) ) {\n this.$el.append( $('
                            ').addClass( 'ui-form-info' ).html( this.options.empty_text ) );\n }\n },\n\n /** Refresh view\n */\n _refresh: function() {\n var index = 0;\n for (var id in this.list) {\n var portlet = this.list[id];\n portlet.title(++index + ': ' + this.options.title);\n if (this.n > this.options.min) {\n portlet.showOperation('button_delete');\n } else {\n portlet.hideOperation('button_delete');\n }\n }\n }\n});\n\nreturn {\n View : View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-repeat.js\n ** module id = 41\n ** module chunks = 0 3\n **/","/**\n This class creates a form section and populates it with input elements. It also handles repeat blocks and conditionals by recursively creating new sub sections.\n*/\ndefine(['utils/utils',\n 'mvc/ui/ui-table',\n 'mvc/ui/ui-misc',\n 'mvc/ui/ui-portlet',\n 'mvc/form/form-repeat',\n 'mvc/form/form-input',\n 'mvc/form/form-parameters'],\n function(Utils, Table, Ui, Portlet, Repeat, InputElement, Parameters) {\n var View = Backbone.View.extend({\n initialize: function(app, options) {\n this.app = app;\n this.inputs = options.inputs;\n\n // fix table style\n options.cls = 'ui-table-plain';\n\n // add table class for tr tag\n // this assist in transforming the form into a json structure\n options.cls_tr = 'section-row';\n\n // create/render views\n this.table = new Table.View(options);\n this.parameters = new Parameters(app, options);\n this.setElement(this.table.$el);\n this.render();\n },\n\n /** Render section view\n */\n render: function() {\n this.table.delAll();\n for (var i in this.inputs) {\n this.add(this.inputs[i]);\n }\n },\n\n /** Add a new input element\n */\n add: function(input) {\n var self = this;\n var input_def = jQuery.extend(true, {}, input);\n input_def.id = input.id = Utils.uid();\n\n // add to sequential list of inputs\n this.app.input_list[input_def.id] = input_def;\n\n // identify field type\n var type = input_def.type;\n switch(type) {\n case 'conditional':\n this._addConditional(input_def);\n break;\n case 'repeat':\n this._addRepeat(input_def);\n break;\n case 'section':\n this._addSection(input_def);\n break;\n default:\n this._addRow(input_def);\n }\n },\n\n /** Add a conditional block\n */\n _addConditional: function(input_def) {\n var self = this;\n input_def.test_param.id = input_def.id;\n this.app.options.sustain_conditionals && ( input_def.test_param.disabled = true );\n var field = this._addRow( input_def.test_param );\n\n // set onchange event for test parameter\n field.options.onchange = function(value) {\n var selectedCase = self.app.data.matchCase(input_def, value);\n for (var i in input_def.cases) {\n var case_def = input_def.cases[i];\n var section_id = input_def.id + '-section-' + i;\n var section_row = self.table.get(section_id);\n var nonhidden = false;\n for (var j in case_def.inputs) {\n if (!case_def.inputs[j].hidden) {\n nonhidden = true;\n break;\n }\n }\n if (i == selectedCase && nonhidden) {\n section_row.fadeIn('fast');\n } else {\n section_row.hide();\n }\n }\n self.app.trigger('change');\n };\n\n // add conditional sub sections\n for (var i in input_def.cases) {\n var sub_section_id = input_def.id + '-section-' + i;\n var sub_section = new View(this.app, {\n inputs : input_def.cases[i].inputs\n });\n sub_section.$el.addClass('ui-table-section');\n this.table.add(sub_section.$el);\n this.table.append(sub_section_id);\n }\n\n // trigger refresh on conditional input field after all input elements have been created\n field.trigger('change');\n },\n\n /** Add a repeat block\n */\n _addRepeat: function(input_def) {\n var self = this;\n var block_index = 0;\n\n // create repeat block element\n var repeat = new Repeat.View({\n title : input_def.title || 'Repeat',\n title_new : input_def.title || '',\n min : input_def.min,\n max : input_def.max,\n onnew : function() {\n create(input_def.inputs);\n self.app.trigger('change');\n }\n });\n\n // helper function to create new repeat blocks\n function create (inputs) {\n var sub_section_id = input_def.id + '-section-' + (block_index++);\n var sub_section = new View(self.app, {\n inputs : inputs\n });\n repeat.add({\n id : sub_section_id,\n $el : sub_section.$el,\n ondel : function() {\n repeat.del(sub_section_id);\n self.app.trigger('change');\n }\n });\n }\n\n //\n // add parsed/minimum number of repeat blocks\n //\n var n_cache = _.size( input_def.cache );\n for ( var i = 0; i < Math.max( Math.max( n_cache, input_def.min ), input_def.default ); i++ ) {\n create( i < n_cache ? input_def.cache[ i ] : input_def.inputs );\n }\n\n // hide options\n this.app.options.sustain_repeats && repeat.hideOptions();\n\n // create input field wrapper\n var input_element = new InputElement(this.app, {\n label : input_def.title || input_def.name,\n help : input_def.help,\n field : repeat\n });\n this.table.add(input_element.$el);\n this.table.append(input_def.id);\n },\n\n /** Add a customized section\n */\n _addSection: function(input_def) {\n var self = this;\n\n // create sub section\n var sub_section = new View(self.app, {\n inputs : input_def.inputs\n });\n\n // delete button\n var button_visible = new Ui.ButtonIcon({\n icon : 'fa-eye-slash',\n tooltip : 'Show/hide section',\n cls : 'ui-button-icon-plain'\n });\n\n // create portlet for sub section\n var portlet = new Portlet.View({\n title : input_def.title || input_def.name,\n cls : 'ui-portlet-section',\n collapsible : true,\n collapsed : true,\n operations : {\n button_visible: button_visible\n }\n });\n portlet.append( sub_section.$el );\n portlet.append( $( '
                            ' ).addClass( 'ui-form-info' ).html( input_def.help ) );\n portlet.setOperation( 'button_visible', function() {\n if( portlet.collapsed ) {\n portlet.expand();\n } else {\n portlet.collapse();\n }\n });\n\n // add expansion event handler\n portlet.on( 'expanded', function() {\n button_visible.setIcon( 'fa-eye' );\n });\n portlet.on( 'collapsed', function() {\n button_visible.setIcon( 'fa-eye-slash' );\n });\n this.app.on( 'expand', function( input_id ) {\n ( portlet.$( '#' + input_id ).length > 0 ) && portlet.expand();\n });\n\n // show sub section if requested\n input_def.expanded && portlet.expand();\n\n // create table row\n this.table.add(portlet.$el);\n this.table.append(input_def.id);\n },\n\n /** Add a single input field element\n */\n _addRow: function(input_def) {\n var id = input_def.id;\n var field = this.parameters.create(input_def);\n this.app.field_list[id] = field;\n var input_element = new InputElement(this.app, {\n name : input_def.name,\n label : input_def.label || input_def.name,\n value : input_def.value,\n default_value : input_def.default_value,\n text_value : input_def.text_value || input_def.value,\n collapsible_value : input_def.collapsible_value,\n collapsible_preview : input_def.collapsible_preview,\n help : input_def.help,\n argument : input_def.argument,\n disabled : input_def.disabled,\n field : field\n });\n this.app.element_list[id] = input_element;\n this.table.add(input_element.$el);\n this.table.append(id);\n input_def.hidden && this.table.get(id).hide();\n return field;\n }\n });\n\n return {\n View: View\n };\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-section.js\n ** module id = 42\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-misc', 'mvc/ui/ui-tabs'], function(Utils, Ui, Tabs) {\n// hda/hdca content selector ui element\nvar View = Backbone.View.extend({\n // initialize\n initialize : function(app, options) {\n // link app and options\n this.app = app;\n this.options = options;\n\n // track current history elements\n this.history = {};\n\n\n // link this\n var self = this;\n\n // add element\n this.setElement('
                            ');\n\n // list of select fieldsFormSection\n this.list = {};\n\n // radio button options\n var radio_buttons = [];\n\n // identify selector type\n if (options.type == 'data_collection') {\n this.mode = 'collection';\n } else {\n if (options.multiple) {\n this.mode = 'multiple';\n } else {\n this.mode = 'single';\n }\n }\n\n // set initial state\n this.current = this.mode;\n this.list = {};\n\n // error messages\n var extensions = Utils.textify(options.extensions);\n var hda_error = 'No dataset available.';\n if (extensions) {\n hda_error = 'No ' + extensions + ' dataset available.';\n }\n var hdca_error = 'No dataset list available.';\n if (extensions) {\n hdca_error = 'No ' + extensions + ' dataset collection available.';\n }\n\n // add single dataset selector\n if (this.mode == 'single') {\n radio_buttons.push({\n icon : 'fa-file-o',\n value : 'single',\n tooltip : 'Single dataset'\n });\n this.select_single = new Ui.Select.View({\n optional : options.optional,\n error_text : hda_error,\n onchange : function() {\n self.trigger('change');\n }\n });\n this.list['single'] = {\n field: this.select_single,\n type : 'hda'\n };\n }\n\n // add multiple dataset selector\n if (this.mode == 'single' || this.mode == 'multiple') {\n radio_buttons.push({\n icon : 'fa-files-o',\n value : 'multiple',\n tooltip : 'Multiple datasets'\n });\n this.select_multiple = new Ui.Select.View({\n multiple : true,\n searchable : false,\n optional : options.optional,\n error_text : hda_error,\n onchange : function() {\n self.trigger('change');\n }\n });\n this.list['multiple'] = {\n field: this.select_multiple,\n type : 'hda'\n };\n }\n\n // add collection selector\n if (this.mode == 'single' || this.mode == 'multiple' || this.mode == 'collection') {\n radio_buttons.push({\n icon : 'fa-folder-o',\n value : 'collection',\n tooltip : 'Dataset collection'\n });\n var multiple = this.mode == 'multiple';\n this.select_collection = new Ui.Select.View({\n error_text : hdca_error,\n multiple : multiple,\n searchable : false,\n optional : options.optional,\n onchange : function() {\n self.trigger('change');\n }\n });\n this.list['collection'] = {\n field: this.select_collection,\n type : 'hdca'\n };\n }\n\n // create button\n this.button_type = new Ui.RadioButton.View({\n value : this.current,\n data : radio_buttons,\n onchange: function(value) {\n self.current = value;\n self.refresh();\n self.trigger('change');\n }\n });\n\n // add batch mode information\n this.$batch = $(this.template_batch());\n\n // number of radio buttons\n var n_buttons = _.size(this.list);\n\n // add button to dom\n var button_width = 0;\n if (n_buttons > 1) {\n this.$el.append(this.button_type.$el);\n button_width = Math.max(0, _.size(this.list) * 35) + 'px';\n }\n\n // append field elements\n for (var i in this.list) {\n this.$el.append(this.list[i].field.$el.css({\n 'margin-left': button_width\n }));\n }\n\n // append batch message\n this.$el.append(this.$batch.css({\n 'margin-left': button_width\n }));\n\n // update options\n this.update(options.data);\n\n // set initial value\n if (this.options.value !== undefined) {\n this.value(this.options.value);\n }\n\n // refresh view\n this.refresh();\n\n // add change event. fires on trigger\n this.on('change', function() {\n if (options.onchange) {\n options.onchange(self.value());\n }\n });\n },\n\n /** Indicate that select fields are being updated */\n wait: function() {\n for (var i in this.list) {\n this.list[i].field.wait();\n }\n },\n\n /** Indicate that the options update has been completed */\n unwait: function() {\n for (var i in this.list) {\n this.list[i].field.unwait();\n }\n },\n\n /** Update content selector */\n update: function(options) {\n // update a particular select field\n var self = this;\n function _update(field, options) {\n if (field) {\n // identify available options\n var select_options = [];\n for (var i in options) {\n var item = options[i];\n select_options.push({\n hid : item.hid,\n label: item.hid + ': ' + item.name,\n value: item.id\n });\n // backup to local history\n self.history[item.id + '_' + item.src] = item;\n }\n // update field\n field.add( select_options, function( a, b ) { return b.hid - a.hid } );\n }\n }\n\n // update available options\n _update(this.select_single, options.hda);\n _update(this.select_multiple, options.hda);\n _update(this.select_collection, options.hdca);\n },\n\n /** Return the currently selected dataset values */\n value : function (new_value) {\n // update current value\n if (new_value !== undefined) {\n if (new_value && new_value.values) {\n try {\n // create list with values\n var list = [];\n for (var i in new_value.values) {\n list.push(new_value.values[i].id);\n }\n\n // identify suitable select field\n if (new_value && new_value.values.length > 0 && new_value.values[0].src == 'hdca') {\n this.current = 'collection';\n this.select_collection.value(list);\n } else {\n if (this.mode == 'multiple') {\n this.current = 'multiple';\n this.select_multiple.value(list);\n } else {\n this.current = 'single';\n this.select_single.value(list[0]);\n }\n }\n } catch (err) {\n Galaxy.emit.debug('tools-select-content::value()', 'Skipped.');\n }\n } else {\n for (var i in this.list) {\n this.list[i].field.value(null);\n }\n }\n }\n\n // refresh view\n this.refresh();\n\n // validate value\n var id_list = this._select().value();\n if (id_list === null) {\n return null;\n }\n\n // transform into an array\n if (!(id_list instanceof Array)) {\n id_list = [id_list];\n }\n\n // check if value exists\n if (id_list.length === 0) {\n return null;\n }\n\n // prepare result dict\n var result = {\n batch : this._batch(),\n values : []\n }\n\n // append to dataset ids\n for (var i in id_list) {\n var details = this.history[id_list[i] + '_' + this.list[this.current].type];\n if (details) {\n result.values.push(details);\n } else {\n return null;\n }\n }\n\n // sort by history ids\n result.values.sort(function(a, b){\n return a.hid - b.hid;\n });\n\n // return\n return result;\n },\n\n /** Refreshes data selection view */\n refresh: function() {\n this.button_type.value(this.current);\n for (var i in this.list) {\n var $el = this.list[i].field.$el;\n if (this.current == i) {\n $el.show();\n } else {\n $el.hide();\n }\n }\n if (this._batch()) {\n this.$batch.show();\n } else {\n this.$batch.hide();\n }\n },\n\n /** Assists in selecting the current field */\n _select: function() {\n return this.list[this.current].field;\n },\n\n /** Assists in identifying the batch mode */\n _batch: function() {\n if (this.current == 'collection') {\n var hdca = this.history[this._select().value() + '_hdca'];\n if (hdca && hdca.map_over_type) {\n return true;\n }\n }\n if (this.current != 'single') {\n if (this.mode == 'single') {\n return true;\n }\n }\n return false;\n },\n\n /** Batch message template */\n template_batch: function() {\n return '
                            ' +\n '' +\n 'This is a batch mode input field. A separate job will be triggered for each dataset.' +\n '
                            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-select-content.js\n ** module id = 43\n ** module chunks = 0 3\n **/","/**\n This is the main class of the form plugin. It is referenced as 'app' in all lower level modules.\n*/\ndefine(['utils/utils', 'mvc/ui/ui-portlet', 'mvc/ui/ui-misc', 'mvc/form/form-section', 'mvc/form/form-data'],\n function(Utils, Portlet, Ui, FormSection, FormData) {\n return Backbone.View.extend({\n initialize: function(options) {\n this.options = Utils.merge(options, {\n initial_errors : false,\n cls : 'ui-portlet-limited',\n icon : ''\n });\n this.modal = ( parent.Galaxy && parent.Galaxy.modal ) || new Ui.Modal.View();\n this.setElement('
                            ');\n this.render();\n },\n\n /** Update available options */\n update: function(new_model){\n var self = this;\n this.data.matchModel(new_model, function(input_id, node) {\n var input = self.input_list[input_id];\n if (input && input.options) {\n if (!_.isEqual(input.options, node.options)) {\n // backup new options\n input.options = node.options;\n\n // get/update field\n var field = self.field_list[input_id];\n if (field.update) {\n var new_options = [];\n if ((['data', 'data_collection', 'drill_down']).indexOf(input.type) != -1) {\n new_options = input.options;\n } else {\n for (var i in node.options) {\n var opt = node.options[i];\n if (opt.length > 2) {\n new_options.push({\n 'label': opt[0],\n 'value': opt[1]\n });\n }\n }\n }\n field.update(new_options);\n field.trigger('change');\n Galaxy.emit.debug('form-view::update()', 'Updating options for ' + input_id);\n }\n }\n }\n });\n },\n\n /** Set form into wait mode */\n wait: function(active) {\n for (var i in this.input_list) {\n var field = this.field_list[i];\n var input = this.input_list[i];\n if (input.is_dynamic && field.wait && field.unwait) {\n if (active) {\n field.wait();\n } else {\n field.unwait();\n }\n }\n }\n },\n\n /** Highlight and scroll to input element (currently only used for error notifications)\n */\n highlight: function (input_id, message, silent) {\n // get input field\n var input_element = this.element_list[input_id];\n\n // check input element\n if (input_element) {\n // mark error\n input_element.error(message || 'Please verify this parameter.');\n\n // trigger expand event for parent containers\n this.trigger('expand', input_id);\n\n // scroll to first input element\n if (!silent) {\n if (self==top) {\n var $panel = this.$el.parents().filter(function() {\n return $(this).css('overflow') == 'auto';\n }).first();\n $panel.animate({ scrollTop : $panel.scrollTop() + input_element.$el.offset().top - 50 }, 500);\n } else {\n $('html, body').animate({ scrollTop : input_element.$el.offset().top - 20 }, 500);\n }\n }\n }\n },\n\n /** Highlights errors\n */\n errors: function(options) {\n // hide previous error statements\n this.trigger('reset');\n\n // highlight all errors\n if (options && options.errors) {\n var error_messages = this.data.matchResponse(options.errors);\n for (var input_id in this.element_list) {\n var input = this.element_list[input_id];\n if (error_messages[input_id]) {\n this.highlight(input_id, error_messages[input_id], true);\n }\n }\n }\n },\n\n /** Render tool form\n */\n render: function() {\n // link this\n var self = this;\n\n // reset events\n this.off('change');\n this.off('reset');\n\n // reset field list, which contains the input field elements\n this.field_list = {};\n\n // reset sequential input definition list, which contains the input definitions as provided from the api\n this.input_list = {};\n\n // reset input element list, which contains the dom elements of each input element (includes also the input field)\n this.element_list = {};\n\n // creates a json data structure from the input form\n this.data = new FormData.Manager(this);\n\n // create ui elements\n this._renderForm();\n\n // refresh data\n this.data.create();\n\n // show errors on startup\n if (this.options.initial_errors) {\n this.errors(this.options);\n }\n\n // add listener which triggers on checksum change\n var current_check = this.data.checksum();\n this.on('change', function() {\n var new_check = self.data.checksum();\n if (new_check != current_check) {\n current_check = new_check;\n self.options.onchange && self.options.onchange();\n }\n });\n\n // add reset listener\n this.on('reset', function() {\n for (var i in this.element_list) {\n this.element_list[i].reset();\n }\n });\n return this;\n },\n\n /** Renders the UI elements required for the form\n */\n _renderForm: function() {\n // create message view\n this.message = new Ui.Message();\n\n // create tool form section\n this.section = new FormSection.View(this, {\n inputs : this.options.inputs\n });\n\n // remove tooltips\n $( '.tooltip' ).remove();\n\n // create portlet\n this.portlet = new Portlet.View({\n icon : this.options.icon,\n title : this.options.title,\n cls : this.options.cls,\n operations : this.options.operations,\n buttons : this.options.buttons,\n collapsible : this.options.collapsible,\n collapsed : this.options.collapsed\n });\n\n // append message\n this.portlet.append(this.message.$el.addClass('ui-margin-top'));\n\n // append tool section\n this.portlet.append(this.section.$el);\n\n // start form\n this.$el.empty();\n this.$el.append(this.portlet.$el);\n\n // show message if available in model\n if (this.options.message) {\n this.message.update({\n persistent : true,\n status : 'warning',\n message : this.options.message\n });\n }\n\n // log\n Galaxy.emit.debug('form-view::initialize()', 'Completed');\n }\n });\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/form/form-view.js\n ** module id = 44\n ** module chunks = 0 3\n **/","define([\n \"mvc/collection/collection-model\",\n \"mvc/history/history-content-model\",\n \"utils/localization\"\n], function( DC_MODEL, HISTORY_CONTENT, _l ){\n/*==============================================================================\n\nModels for DatasetCollections contained within a history.\n\nTODO:\n these might be compactable to one class if some duplication with\n collection-model is used.\n\n==============================================================================*/\nvar hcontentMixin = HISTORY_CONTENT.HistoryContentMixin,\n ListDC = DC_MODEL.ListDatasetCollection,\n PairDC = DC_MODEL.PairDatasetCollection,\n ListPairedDC = DC_MODEL.ListPairedDatasetCollection;\n\n//==============================================================================\n/** Override to post to contents route w/o id. */\nfunction buildHDCASave( _super ){\n return function _save( attributes, options ){\n if( this.isNew() ){\n options = options || {};\n options.url = this.urlRoot + this.get( 'history_id' ) + '/contents';\n attributes = attributes || {};\n attributes.type = 'dataset_collection';\n }\n return _super.call( this, attributes, options );\n };\n}\n\n\n//==============================================================================\n/** @class Backbone model for List Dataset Collection within a History.\n */\nvar HistoryListDatasetCollection = ListDC.extend( hcontentMixin ).extend(\n/** @lends HistoryListDatasetCollection.prototype */{\n\n defaults : _.extend( _.clone( ListDC.prototype.defaults ), {\n history_content_type: 'dataset_collection',\n collection_type : 'list',\n model_class : 'HistoryDatasetCollectionAssociation'\n }),\n\n initialize : function( model, options ){\n ListDC.prototype.initialize.call( this, model, options );\n hcontentMixin.initialize.call( this, model, options );\n },\n\n /** Override to post to contents route w/o id. */\n save : buildHDCASave( ListDC.prototype.save ),\n\n /** String representation. */\n toString : function(){\n return ([ 'HistoryListDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone model for Pair Dataset Collection within a History.\n * @constructs\n */\nvar HistoryPairDatasetCollection = PairDC.extend( hcontentMixin ).extend(\n/** @lends HistoryPairDatasetCollection.prototype */{\n\n defaults : _.extend( _.clone( PairDC.prototype.defaults ), {\n history_content_type: 'dataset_collection',\n collection_type : 'paired',\n model_class : 'HistoryDatasetCollectionAssociation'\n }),\n\n initialize : function( model, options ){\n PairDC.prototype.initialize.call( this, model, options );\n hcontentMixin.initialize.call( this, model, options );\n },\n\n /** Override to post to contents route w/o id. */\n save : buildHDCASave( PairDC.prototype.save ),\n\n /** String representation. */\n toString : function(){\n return ([ 'HistoryPairDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n/** @class Backbone model for List of Pairs Dataset Collection within a History.\n * @constructs\n */\nvar HistoryListPairedDatasetCollection = ListPairedDC.extend( hcontentMixin ).extend(\n/** @lends HistoryListPairedDatasetCollection.prototype */{\n\n defaults : _.extend( _.clone( ListPairedDC.prototype.defaults ), {\n history_content_type: 'dataset_collection',\n collection_type : 'list:paired',\n model_class : 'HistoryDatasetCollectionAssociation'\n }),\n\n initialize : function( model, options ){\n ListPairedDC.prototype.initialize.call( this, model, options );\n hcontentMixin.initialize.call( this, model, options );\n },\n\n /** Override to post to contents route w/o id. */\n save : buildHDCASave( ListPairedDC.prototype.save ),\n\n /** String representation. */\n toString : function(){\n return ([ 'HistoryListPairedDatasetCollection(', this.get( 'name' ), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n return {\n HistoryListDatasetCollection : HistoryListDatasetCollection,\n HistoryPairDatasetCollection : HistoryPairDatasetCollection,\n HistoryListPairedDatasetCollection : HistoryListPairedDatasetCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hdca-model.js\n ** module id = 45\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/states\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( STATES, BASE_MVC, _l ){\n\nvar logNamespace = 'history';\n//==============================================================================\n/** How the type_id attribute is built for the history's mixed contents collection */\nvar typeIdStr = function _typeIdStr( type, id ){\n return [ type, id ].join( '-' );\n};\n\n//==============================================================================\n/** @class Mixin for HistoryContents content (HDAs, HDCAs).\n */\nvar HistoryContentMixin = {\n//TODO:?? into true Backbone.Model?\n\n /** default attributes for a model */\n defaults : {\n /** parent (containing) history */\n history_id : null,\n /** some content_type (HistoryContents can contain mixed model classes) */\n history_content_type: null,\n /** indicating when/what order the content was generated in the context of the history */\n hid : null,\n /** whether the user wants the content shown (visible) */\n visible : true\n },\n\n // ........................................................................ mixed content element\n//TODO: there's got to be a way to move this into HistoryContents - if we can do that, this class might not be needed\n // In order to be part of a MIXED bbone collection, we can't rely on the id\n // (which may collide btwn models of different classes)\n // Build a new id (type_id) that prefixes the history_content_type so the bbone collection can differentiate\n idAttribute : 'type_id',\n\n /** override constructor to build type_id and insert into original attributes */\n constructor : function( attrs, options ){\n attrs.type_id = typeIdStr( attrs.history_content_type, attrs.id );\n this.debug( 'HistoryContentMixin.constructor:', attrs.type_id );\n Backbone.Model.apply( this, arguments );\n },\n\n /** object level fn for building the type_id string */\n _typeIdStr : function(){\n return typeIdStr( this.get( 'history_content_type' ), this.get( 'id' ) );\n },\n\n /** add listener to re-create type_id when the id changes */\n initialize : function( attrs, options ){\n this.on( 'change:id', this._createTypeId );\n },\n\n /** set the type_id in the model attributes */\n _createTypeId : function(){\n this.set( 'type_id', this._typeIdStr() );\n },\n\n /** override because backbone tests boolean( idAttribute ), but it's not an empty string even for new models\n * due to our use of type_id.\n */\n isNew : function(){\n return !this.get( 'id' );\n },\n\n // ........................................................................ common queries\n /** the more common alias of visible */\n hidden : function(){\n return !this.get( 'visible' );\n },\n\n /** based on show_deleted, show_hidden (gen. from the container control),\n * would this ds show in the list of ds's?\n * @param {Boolean} show_deleted are we showing deleted hdas?\n * @param {Boolean} show_hidden are we showing hidden hdas?\n */\n isVisible : function( show_deleted, show_hidden ){\n//TODO:?? Another unfortunate name collision\n var isVisible = true;\n if( ( !show_deleted )\n && ( this.get( 'deleted' ) || this.get( 'purged' ) ) ){\n isVisible = false;\n }\n if( ( !show_hidden )\n && ( !this.get( 'visible' ) ) ){\n isVisible = false;\n }\n return isVisible;\n },\n\n // ........................................................................ ajax\n//TODO: global\n//TODO: these are probably better done on the leaf classes\n /** history content goes through the 'api/histories' API */\n urlRoot: Galaxy.root + 'api/histories/',\n\n /** full url spec. for this content */\n url : function(){\n var url = this.urlRoot + this.get( 'history_id' ) + '/contents/'\n + this.get('history_content_type') + 's/' + this.get( 'id' );\n return url;\n },\n\n /** save this content as not visible */\n hide : function( options ){\n if( !this.get( 'visible' ) ){ return jQuery.when(); }\n return this.save( { visible: false }, options );\n },\n /** save this content as visible */\n unhide : function( options ){\n if( this.get( 'visible' ) ){ return jQuery.when(); }\n return this.save( { visible: true }, options );\n },\n\n // ........................................................................ misc\n /** String representation */\n toString : function(){\n var nameAndId = this.get( 'id' ) || '';\n if( this.get( 'name' ) ){\n nameAndId = this.get( 'hid' ) + ' :\"' + this.get( 'name' ) + '\",' + nameAndId;\n }\n return 'HistoryContent(' + nameAndId + ')';\n }\n};\n\n\n//==============================================================================\n//TODO: needed?\n/** @class (Concrete/non-mixin) base model for content items.\n */\nvar HistoryContent = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( HistoryContentMixin )\n .extend({ _logNamespace : logNamespace });\n\n\n//==============================================================================\n return {\n typeIdStr : typeIdStr,\n HistoryContentMixin : HistoryContentMixin,\n HistoryContent : HistoryContent\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-content-model.js\n ** module id = 46\n ** module chunks = 3\n **/","define([\n \"mvc/history/history-content-model\",\n \"mvc/history/hda-model\",\n \"mvc/history/hdca-model\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( HISTORY_CONTENT, HDA_MODEL, HDCA_MODEL, BASE_MVC, _l ){\n\nvar logNamespace = 'history';\n//==============================================================================\n/** @class Backbone collection for history content.\n * NOTE: history content seems like a dataset collection, but differs in that it is mixed:\n * each element can be either an HDA (dataset) or a DatasetCollection and co-exist on\n * the same level.\n * Dataset collections on the other hand are not mixed and (so far) can only contain either\n * HDAs or child dataset collections on one level.\n * This is why this does not inherit from any of the DatasetCollections (currently).\n */\nvar HistoryContents = Backbone.Collection\n .extend( BASE_MVC.LoggableMixin )\n .extend(/** @lends HistoryContents.prototype */{\n//TODO:?? may want to inherit from some MixedModelCollection\n//TODO:?? also consider inheriting from a 'DatasetList'\n//TODO: can we decorate the mixed models using the model fn below (instead of having them build their own type_id)?\n\n _logNamespace : logNamespace,\n\n /** since history content is a mix, override model fn into a factory, creating based on history_content_type */\n model : function( attrs, options ) {\n//TODO: can we move the type_id stuff here?\n //attrs.type_id = typeIdStr( attrs );\n\n if( attrs.history_content_type === \"dataset\" ) {\n return new HDA_MODEL.HistoryDatasetAssociation( attrs, options );\n\n } else if( attrs.history_content_type === \"dataset_collection\" ) {\n switch( attrs.collection_type ){\n case 'list':\n return new HDCA_MODEL.HistoryListDatasetCollection( attrs, options );\n case 'paired':\n return new HDCA_MODEL.HistoryPairDatasetCollection( attrs, options );\n case 'list:paired':\n return new HDCA_MODEL.HistoryListPairedDatasetCollection( attrs, options );\n }\n // This is a hack inside a hack:\n // Raise a plain object with validationError to fake a model.validationError\n // (since we don't have a model to use validate with)\n // (the outer hack being the mixed content/model function in this collection)\n return { validationError : 'Unknown collection_type: ' + attrs.history_content_type };\n }\n return { validationError : 'Unknown history_content_type: ' + attrs.history_content_type };\n },\n\n /** Set up.\n * @see Backbone.Collection#initialize\n */\n initialize : function( models, options ){\n options = options || {};\n//TODO: could probably use the contents.history_id instead\n this.historyId = options.historyId;\n //this._setUpListeners();\n\n // backbonejs uses collection.model.prototype.idAttribute to determine if a model is *already* in a collection\n // and either merged or replaced. In this case, our 'model' is a function so we need to add idAttribute\n // manually here - if we don't, contents will not merge but be replaced/swapped.\n this.model.prototype.idAttribute = 'type_id';\n\n this.on( 'all', function(){\n this.debug( this + '.event:', arguments );\n });\n },\n\n /** root api url */\n urlRoot : Galaxy.root + 'api/histories',\n /** complete api url */\n url : function(){\n return this.urlRoot + '/' + this.historyId + '/contents';\n },\n\n // ........................................................................ common queries\n /** Get the ids of every item in this collection\n * @returns array of encoded ids\n */\n ids : function(){\n//TODO: is this still useful since type_id\n return this.map( function( item ){ return item.get('id'); });\n },\n\n /** Get contents that are not ready\n * @returns array of content models\n */\n notReady : function(){\n return this.filter( function( content ){\n return !content.inReadyState();\n });\n },\n\n /** Get the id of every model in this collection not in a 'ready' state (running).\n * @returns an array of model ids\n * @see HistoryDatasetAssociation#inReadyState\n */\n running : function(){\n var idList = [];\n this.each( function( item ){\n var isRunning = !item.inReadyState();\n if( isRunning ){\n//TODO: is this still correct since type_id\n idList.push( item.get( 'id' ) );\n }\n });\n return idList;\n },\n\n /** Get the model with the given hid\n * @param {Int} hid the hid to search for\n * @returns {HistoryDatasetAssociation} the model with the given hid or undefined if not found\n */\n getByHid : function( hid ){\n return _.first( this.filter( function( content ){ return content.get( 'hid' ) === hid; }) );\n },\n\n //TODO:?? this may belong in the containing view\n /** Get every 'shown' model in this collection based on show_deleted/hidden\n * @param {Boolean} show_deleted are we showing deleted content?\n * @param {Boolean} show_hidden are we showing hidden content?\n * @returns array of content models\n * @see HistoryDatasetAssociation#isVisible\n */\n getVisible : function( show_deleted, show_hidden, filters ){\n filters = filters || [];\n //this.debug( 'filters:', filters );\n // always filter by show deleted/hidden first\n this.debug( 'checking isVisible' );\n var filteredHdas = new HistoryContents( this.filter( function( item ){\n return item.isVisible( show_deleted, show_hidden );\n }));\n\n _.each( filters, function( filterFn ){\n if( !_.isFunction( filterFn ) ){ return; }\n filteredHdas = new HistoryContents( filteredHdas.filter( filterFn ) );\n });\n return filteredHdas;\n },\n\n /** return a new contents collection of only hidden items */\n hidden : function(){\n function filterFn( c ){ return c.hidden(); }\n return new HistoryContents( this.filter( filterFn ) );\n },\n\n /** return a new contents collection of only hidden items */\n deleted : function(){\n function filterFn( c ){ return c.get( 'deleted' ); }\n return new HistoryContents( this.filter( filterFn ) );\n },\n\n /** return true if any contents don't have details */\n haveDetails : function(){\n return this.all( function( content ){ return content.hasDetails(); });\n },\n\n // ........................................................................ ajax\n /** fetch detailed model data for all contents in this collection */\n fetchAllDetails : function( options ){\n options = options || {};\n var detailsFlag = { details: 'all' };\n options.data = ( options.data )?( _.extend( options.data, detailsFlag ) ):( detailsFlag );\n return this.fetch( options );\n },\n\n /** using a queue, perform ajaxFn on each of the models in this collection */\n ajaxQueue : function( ajaxFn, options ){\n var deferred = jQuery.Deferred(),\n startingLength = this.length,\n responses = [];\n\n if( !startingLength ){\n deferred.resolve([]);\n return deferred;\n }\n\n // use reverse order (stylistic choice)\n var ajaxFns = this.chain().reverse().map( function( content, i ){\n return function(){\n var xhr = ajaxFn.call( content, options );\n // if successful, notify using the deferred to allow tracking progress\n xhr.done( function( response ){\n deferred.notify({ curr: i, total: startingLength, response: response, model: content });\n });\n // (regardless of previous error or success) if not last ajax call, shift and call the next\n // if last fn, resolve deferred\n xhr.always( function( response ){\n responses.push( response );\n if( ajaxFns.length ){\n ajaxFns.shift()();\n } else {\n deferred.resolve( responses );\n }\n });\n };\n }).value();\n // start the queue\n ajaxFns.shift()();\n\n return deferred;\n },\n\n isCopyable : function( contentsJSON ){\n var copyableModelClasses = [\n 'HistoryDatasetAssociation',\n 'HistoryDatasetCollectionAssociation'\n ];\n return ( ( _.isObject( contentsJSON ) && contentsJSON.id )\n && ( _.contains( copyableModelClasses, contentsJSON.model_class ) ) );\n },\n\n /** copy an existing, accessible hda into this collection */\n copy : function( json ){\n var id, type, contentType;\n if( _.isString( json ) ){\n id = json;\n contentType = 'hda';\n type = 'dataset';\n } else {\n id = json.id;\n contentType = ({\n 'HistoryDatasetAssociation' : 'hda',\n 'LibraryDatasetDatasetAssociation' : 'ldda',\n 'HistoryDatasetCollectionAssociation' : 'hdca'\n })[ json.model_class ] || 'hda';\n type = ( contentType === 'hdca'? 'dataset_collection' : 'dataset' );\n }\n var collection = this,\n xhr = jQuery.post( this.url(), {\n content : id,\n source : contentType,\n type : type\n })\n .done( function( response ){\n collection.add([ response ]);\n })\n .fail( function( error, status, message ){\n collection.trigger( 'error', collection, xhr, {},\n 'Error copying contents', { type: type, id: id, source: contentType });\n });\n return xhr;\n },\n\n // ........................................................................ sorting/filtering\n /** return a new collection of contents whose attributes contain the substring matchesWhat */\n matches : function( matchesWhat ){\n return this.filter( function( content ){\n return content.matches( matchesWhat );\n });\n },\n\n // ........................................................................ misc\n /** override to ensure type id is set */\n set : function( models, options ){\n models = _.isArray( models )? models : [ models ];\n _.each( models, function( model ){\n if( !model.type_id || !model.get || !model.get( 'type_id' ) ){\n model.type_id = HISTORY_CONTENT.typeIdStr( model.history_content_type, model.id );\n }\n });\n Backbone.Collection.prototype.set.call( this, models, options );\n },\n\n /** */\n createHDCA : function( elementIdentifiers, collectionType, name, options ){\n //precondition: elementIdentifiers is an array of plain js objects\n // in the proper form to create the collectionType\n var contents = this,\n typeToModel = {\n list : HDCA_MODEL.HistoryListDatasetCollection,\n paired : HDCA_MODEL.HistoryPairDatasetCollection\n },\n hdca = new (typeToModel[ collectionType ])({\n history_id : this.historyId,\n name : name,\n // should probably be able to just send in a bunch of json here and restruct per class\n element_identifiers : elementIdentifiers\n });\n // do I even need to use new above, can I just pass the attrs here\n return hdca.save()\n .done( function( response ){\n contents.add( hdca );\n })\n .fail( function( xhr, status, message ){\n contents.trigger( 'error', xhr, status, message );\n });\n },\n\n\n /** In this override, copy the historyId to the clone */\n clone : function(){\n var clone = Backbone.Collection.prototype.clone.call( this );\n clone.historyId = this.historyId;\n return clone;\n },\n\n /** debugging */\n print : function(){\n var contents = this;\n contents.each( function( c ){\n contents.debug( c );\n if( c.elements ){\n contents.debug( '\\t elements:', c.elements );\n }\n });\n },\n\n /** String representation. */\n toString : function(){\n return ([ 'HistoryContents(', [ this.historyId, this.length ].join(), ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n return {\n HistoryContents : HistoryContents\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-contents.js\n ** module id = 47\n ** module chunks = 3\n **/","define([\n 'mvc/base-mvc',\n 'utils/localization'\n], function( BASE_MVC, _l ){\n\nvar logNamespace = 'list';\n//==============================================================================\n/** A view which, when first rendered, shows only summary data/attributes, but\n * can be expanded to show further details (and optionally fetch those\n * details from the server).\n */\nvar ExpandableView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n//TODO: Although the reasoning behind them is different, this shares a lot with HiddenUntilActivated above: combine them\n //PRECONDITION: model must have method hasDetails\n //PRECONDITION: subclasses must have templates.el and templates.details\n\n initialize : function( attributes ){\n /** are the details of this view expanded/shown or not? */\n this.expanded = attributes.expanded || false;\n this.log( '\\t expanded:', this.expanded );\n this.fxSpeed = attributes.fxSpeed !== undefined? attributes.fxSpeed : this.fxSpeed;\n },\n\n // ........................................................................ render main\n /** jq fx speed */\n fxSpeed : 'fast',\n\n /** Render this content, set up ui.\n * @param {Number or String} speed the speed of the render\n */\n render : function( speed ){\n var $newRender = this._buildNewRender();\n this._setUpBehaviors( $newRender );\n this._queueNewRender( $newRender, speed );\n return this;\n },\n\n /** Build a temp div containing the new children for the view's $el.\n * If the view is already expanded, build the details as well.\n */\n _buildNewRender : function(){\n // create a new render using a skeleton template, render title buttons, render body, and set up events, etc.\n var $newRender = $( this.templates.el( this.model.toJSON(), this ) );\n if( this.expanded ){\n this.$details( $newRender ).replaceWith( this._renderDetails().show() );\n }\n return $newRender;\n },\n\n /** Fade out the old el, swap in the new contents, then fade in.\n * @param {Number or String} speed jq speed to use for rendering effects\n * @fires rendered when rendered\n */\n _queueNewRender : function( $newRender, speed ) {\n speed = ( speed === undefined )?( this.fxSpeed ):( speed );\n var view = this;\n\n $( view ).queue( 'fx', [\n function( next ){ this.$el.fadeOut( speed, next ); },\n function( next ){\n view._swapNewRender( $newRender );\n next();\n },\n function( next ){ this.$el.fadeIn( speed, next ); },\n function( next ){\n this.trigger( 'rendered', view );\n next();\n }\n ]);\n },\n\n /** empty out the current el, move the $newRender's children in */\n _swapNewRender : function( $newRender ){\n return this.$el.empty()\n .attr( 'class', _.isFunction( this.className )? this.className(): this.className )\n .append( $newRender.children() );\n },\n\n /** set up js behaviors, event handlers for elements within the given container\n * @param {jQuery} $container jq object that contains the elements to process (defaults to this.$el)\n */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n // set up canned behavior on children (bootstrap, popupmenus, editable_text, etc.)\n //make_popup_menus( $where );\n $where.find( '[title]' ).tooltip({ placement : 'bottom' });\n },\n\n // ......................................................................... details\n /** shortcut to details DOM (as jQ) */\n $details : function( $where ){\n $where = $where || this.$el;\n return $where.find( '> .details' );\n },\n\n /** build the DOM for the details and set up behaviors on it */\n _renderDetails : function(){\n var $newDetails = $( this.templates.details( this.model.toJSON(), this ) );\n this._setUpBehaviors( $newDetails );\n return $newDetails;\n },\n\n // ......................................................................... expansion/details\n /** Show or hide the details\n * @param {Boolean} expand if true, expand; if false, collapse\n */\n toggleExpanded : function( expand ){\n expand = ( expand === undefined )?( !this.expanded ):( expand );\n if( expand ){\n this.expand();\n } else {\n this.collapse();\n }\n return this;\n },\n\n /** Render and show the full, detailed body of this view including extra data and controls.\n * note: if the model does not have detailed data, fetch that data before showing the body\n * @fires expanded when a body has been expanded\n */\n expand : function(){\n var view = this;\n return view._fetchModelDetails().always( function(){\n view._expand();\n });\n },\n\n /** Check for model details and, if none, fetch them.\n * @returns {jQuery.promise} the model.fetch.xhr if details are being fetched, an empty promise if not\n */\n _fetchModelDetails : function(){\n if( !this.model.hasDetails() ){\n return this.model.fetch();\n }\n return jQuery.when();\n },\n\n /** Inner fn called when expand (public) has fetched the details */\n _expand : function(){\n var view = this,\n $newDetails = view._renderDetails();\n view.$details().replaceWith( $newDetails );\n // needs to be set after the above or the slide will not show\n view.expanded = true;\n view.$details().slideDown({\n duration : view.fxSpeed,\n step: function(){\n view.trigger( 'expanding', view );\n },\n complete: function(){\n view.trigger( 'expanded', view );\n }\n });\n },\n\n /** Hide the body/details of an HDA.\n * @fires collapsed when a body has been collapsed\n */\n collapse : function(){\n this.debug( this + '(ExpandableView).collapse' );\n var view = this;\n view.expanded = false;\n this.$details().slideUp({\n duration : view.fxSpeed,\n step: function(){\n view.trigger( 'collapsing', view );\n },\n complete: function(){\n view.trigger( 'collapsed', view );\n }\n });\n }\n\n});\n\n\n//==============================================================================\n/** A view that is displayed in some larger list/grid/collection.\n * Inherits from Expandable, Selectable, Draggable.\n * The DOM contains warnings, a title bar, and a series of primary action controls.\n * Primary actions are meant to be easily accessible item functions (such as delete)\n * that are rendered in the title bar.\n *\n * Details are rendered when the user clicks the title bar or presses enter/space when\n * the title bar is in focus.\n *\n * Designed as a base class for history panel contents - but usable elsewhere (I hope).\n */\nvar ListItemView = ExpandableView.extend(\n BASE_MVC.mixin( BASE_MVC.SelectableViewMixin, BASE_MVC.DraggableViewMixin, {\n\n//TODO: that's a little contradictory\n tagName : 'div',\n className : 'list-item',\n\n /** Set up the base class and all mixins */\n initialize : function( attributes ){\n ExpandableView.prototype.initialize.call( this, attributes );\n BASE_MVC.SelectableViewMixin.initialize.call( this, attributes );\n BASE_MVC.DraggableViewMixin.initialize.call( this, attributes );\n this._setUpListeners();\n },\n\n /** event listeners */\n _setUpListeners : function(){\n // hide the primary actions in the title bar when selectable and narrow\n this.on( 'selectable', function( isSelectable ){\n if( isSelectable ){\n this.$( '.primary-actions' ).hide();\n } else {\n this.$( '.primary-actions' ).show();\n }\n }, this );\n //this.on( 'all', function( event ){\n // this.log( event );\n //}, this );\n return this;\n },\n\n // ........................................................................ rendering\n /** In this override, call methods to build warnings, titlebar and primary actions */\n _buildNewRender : function(){\n var $newRender = ExpandableView.prototype._buildNewRender.call( this );\n $newRender.children( '.warnings' ).replaceWith( this._renderWarnings() );\n $newRender.children( '.title-bar' ).replaceWith( this._renderTitleBar() );\n $newRender.children( '.primary-actions' ).append( this._renderPrimaryActions() );\n $newRender.find( '> .title-bar .subtitle' ).replaceWith( this._renderSubtitle() );\n return $newRender;\n },\n\n /** In this override, render the selector controls and set up dragging before the swap */\n _swapNewRender : function( $newRender ){\n ExpandableView.prototype._swapNewRender.call( this, $newRender );\n if( this.selectable ){ this.showSelector( 0 ); }\n if( this.draggable ){ this.draggableOn(); }\n return this.$el;\n },\n\n /** Render any warnings the item may need to show (e.g. \"I'm deleted\") */\n _renderWarnings : function(){\n var view = this,\n $warnings = $( '
                            ' ),\n json = view.model.toJSON();\n//TODO:! unordered (map)\n _.each( view.templates.warnings, function( templateFn ){\n $warnings.append( $( templateFn( json, view ) ) );\n });\n return $warnings;\n },\n\n /** Render the title bar (the main/exposed SUMMARY dom element) */\n _renderTitleBar : function(){\n return $( this.templates.titleBar( this.model.toJSON(), this ) );\n },\n\n /** Return an array of jQ objects containing common/easily-accessible item controls */\n _renderPrimaryActions : function(){\n // override this\n return [];\n },\n\n /** Render the title bar (the main/exposed SUMMARY dom element) */\n _renderSubtitle : function(){\n return $( this.templates.subtitle( this.model.toJSON(), this ) );\n },\n\n // ......................................................................... events\n /** event map */\n events : {\n // expand the body when the title is clicked or when in focus and space or enter is pressed\n 'click .title-bar' : '_clickTitleBar',\n 'keydown .title-bar' : '_keyDownTitleBar',\n\n // dragging - don't work, originalEvent === null\n //'dragstart .dataset-title-bar' : 'dragStartHandler',\n //'dragend .dataset-title-bar' : 'dragEndHandler'\n\n 'click .selector' : 'toggleSelect'\n },\n\n /** expand when the title bar is clicked */\n _clickTitleBar : function( event ){\n event.stopPropagation();\n if( event.altKey ){\n this.toggleSelect( event );\n if( !this.selectable ){\n this.showSelector();\n }\n } else {\n this.toggleExpanded();\n }\n },\n\n /** expand when the title bar is in focus and enter or space is pressed */\n _keyDownTitleBar : function( event ){\n // bail (with propagation) if keydown and not space or enter\n var KEYCODE_SPACE = 32, KEYCODE_RETURN = 13;\n if( event && ( event.type === 'keydown' )\n &&( event.keyCode === KEYCODE_SPACE || event.keyCode === KEYCODE_RETURN ) ){\n this.toggleExpanded();\n event.stopPropagation();\n return false;\n }\n return true;\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'ListItemView(' + modelString + ')';\n }\n}));\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nListItemView.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var elTemplato = BASE_MVC.wrapTemplate([\n '
                            ',\n // errors, messages, etc.\n '
                            ',\n\n // multi-select checkbox\n '
                            ',\n '',\n '
                            ',\n // space for title bar buttons - gen. floated to the right\n '
                            ',\n '
                            ',\n\n // expandable area for more details\n '
                            ',\n '
                            '\n ]);\n\n var warnings = {};\n\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n // adding a tabindex here allows focusing the title bar and the use of keydown to expand the dataset display\n '
                            ',\n//TODO: prob. belongs in dataset-list-item\n '',\n '
                            ',\n '<%- element.name %>',\n '
                            ',\n '
                            ',\n '
                            '\n ], 'element' );\n\n var subtitleTemplate = BASE_MVC.wrapTemplate([\n // override this\n '
                            '\n ]);\n\n var detailsTemplate = BASE_MVC.wrapTemplate([\n // override this\n '
                            '\n ]);\n\n return {\n el : elTemplato,\n warnings : warnings,\n titleBar : titleBarTemplate,\n subtitle : subtitleTemplate,\n details : detailsTemplate\n };\n}());\n\n\n//==============================================================================\n/** A view that is displayed in some larger list/grid/collection.\n * *AND* can display some sub-list of it's own when expanded (e.g. dataset collections).\n * This list will 'foldout' when the item is expanded depending on this.foldoutStyle:\n * If 'foldout': will expand vertically to show the nested list\n * If 'drilldown': will overlay the parent list\n *\n * Inherits from ListItemView.\n *\n * _renderDetails does the work of creating this.details: a sub-view that shows the nested list\n */\nvar FoldoutListItemView = ListItemView.extend({\n\n /** If 'foldout': show the sub-panel inside the expanded item\n * If 'drilldown': only fire events and handle by pub-sub\n * (allow the panel containing this item to attach it, hide itself, etc.)\n */\n foldoutStyle : 'foldout',\n /** Panel view class to instantiate for the sub-panel */\n foldoutPanelClass : null,\n\n /** override to:\n * add attributes foldoutStyle and foldoutPanelClass for config poly\n * disrespect attributes.expanded if drilldown\n */\n initialize : function( attributes ){\n//TODO: hackish\n if( this.foldoutStyle === 'drilldown' ){ this.expanded = false; }\n this.foldoutStyle = attributes.foldoutStyle || this.foldoutStyle;\n this.foldoutPanelClass = attributes.foldoutPanelClass || this.foldoutPanelClass;\n\n ListItemView.prototype.initialize.call( this, attributes );\n this.foldout = this._createFoldoutPanel();\n },\n\n//TODO:?? override to exclude foldout scope?\n //$ : function( selector ){\n // var $found = ListItemView.prototype.$.call( this, selector );\n // return $found;\n //},\n\n /** in this override, attach the foldout panel when rendering details */\n _renderDetails : function(){\n//TODO: hackish\n if( this.foldoutStyle === 'drilldown' ){ return $(); }\n var $newDetails = ListItemView.prototype._renderDetails.call( this );\n return this._attachFoldout( this.foldout, $newDetails );\n },\n\n /** In this override, handle collection expansion. */\n _createFoldoutPanel : function(){\n var model = this.model;\n var FoldoutClass = this._getFoldoutPanelClass( model ),\n options = this._getFoldoutPanelOptions( model ),\n foldout = new FoldoutClass( _.extend( options, {\n model : model\n }));\n return foldout;\n },\n\n /** Stub to return proper foldout panel class */\n _getFoldoutPanelClass : function(){\n // override\n return this.foldoutPanelClass;\n },\n\n /** Stub to return proper foldout panel options */\n _getFoldoutPanelOptions : function(){\n return {\n // propagate foldout style down\n foldoutStyle : this.foldoutStyle,\n fxSpeed : this.fxSpeed\n };\n },\n\n /** Render the foldout panel inside the view, hiding controls */\n _attachFoldout : function( foldout, $whereTo ){\n $whereTo = $whereTo || this.$( '> .details' );\n this.foldout = foldout.render( 0 );\n//TODO: hack\n foldout.$( '> .controls' ).hide();\n return $whereTo.append( foldout.$el );\n },\n\n /** In this override, branch on foldoutStyle to show expanded */\n expand : function(){\n var view = this;\n return view._fetchModelDetails()\n .always(function(){\n if( view.foldoutStyle === 'foldout' ){\n view._expand();\n } else if( view.foldoutStyle === 'drilldown' ){\n view._expandByDrilldown();\n }\n });\n },\n\n /** For drilldown, set up close handler and fire expanded:drilldown\n * containing views can listen to this and handle other things\n * (like hiding themselves) by listening for expanded/collapsed:drilldown\n */\n _expandByDrilldown : function(){\n var view = this;\n // attachment and rendering done by listener\n view.foldout.on( 'close', function(){\n view.trigger( 'collapsed:drilldown', view, view.foldout );\n });\n view.trigger( 'expanded:drilldown', view, view.foldout );\n }\n\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nFoldoutListItemView.prototype.templates = (function(){\n\n//TODO:?? unnecessary?\n // use element identifier\n var detailsTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n // override with more info (that goes above the panel)\n '
                            '\n ], 'collection' );\n\n return _.extend( {}, ListItemView.prototype.templates, {\n details : detailsTemplate\n });\n}());\n\n\n//==============================================================================\n return {\n ExpandableView : ExpandableView,\n ListItemView : ListItemView,\n FoldoutListItemView : FoldoutListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/list/list-item.js\n ** module id = 48\n ** module chunks = 3\n **/","/**\n This is the base class of the tool form plugin. This class is e.g. inherited by the regular and the workflow tool form.\n*/\ndefine(['utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view',\n 'mvc/tool/tool-template', 'mvc/citation/citation-model', 'mvc/citation/citation-view'],\n function(Utils, Deferred, Ui, FormBase, ToolTemplate, CitationModel, CitationView) {\n return FormBase.extend({\n initialize: function(options) {\n var self = this;\n FormBase.prototype.initialize.call(this, options);\n this.deferred = new Deferred();\n if (options.inputs) {\n this._buildForm(options);\n options.needs_update && this.deferred.execute( function( process ) {\n self._updateModel( process );\n });\n } else {\n this.deferred.execute(function(process) {\n self._buildModel(process, options, true);\n });\n }\n },\n\n /** Wait for deferred build processes before removal */\n remove: function() {\n var self = this;\n this.$el.hide();\n this.deferred.execute(function(){\n FormBase.prototype.remove.call(self);\n Galaxy.emit.debug('tool-form-base::remove()', 'Destroy view.');\n });\n },\n\n /** Build form */\n _buildForm: function(options) {\n var self = this;\n this.options = Utils.merge(options, this.options);\n this.options = Utils.merge({\n icon : ( (options.icon === undefined) && 'fa-wrench' ) || '',\n title : '' + options.name + ' ' + options.description + ' (Galaxy Version ' + options.version + ')',\n operations : this._operations(),\n onchange : function() {\n self.deferred.reset();\n self.deferred.execute(function(process) {\n self._updateModel(process);\n });\n }\n }, this.options);\n this.options.customize && this.options.customize( this.options );\n this.render();\n if ( !this.options.collapsible ) {\n this.$el.append( $( '
                            ' ).addClass( 'ui-margin-top-large' ).append( this._footer() ) );\n }\n },\n\n /** Builds a new model through api call and recreates the entire form\n */\n _buildModel: function(process, options, hide_message) {\n var self = this;\n this.options.id = options.id;\n this.options.version = options.version;\n\n // build request url\n var build_url = '';\n var build_data = {};\n if ( options.job_id ) {\n build_url = Galaxy.root + 'api/jobs/' + options.job_id + '/build_for_rerun';\n } else {\n build_url = Galaxy.root + 'api/tools/' + options.id + '/build';\n if ( Galaxy.params && Galaxy.params.tool_id == options.id ) {\n build_data = $.extend( {}, Galaxy.params );\n options.version && ( build_data[ 'tool_version' ] = options.version );\n }\n }\n\n // get initial model\n Utils.request({\n type : 'GET',\n url : build_url,\n data : build_data,\n success : function(new_model) {\n new_model = new_model.tool_model || new_model;\n if( !new_model.display ) {\n window.location = Galaxy.root;\n return;\n }\n self._buildForm(new_model);\n !hide_message && self.message.update({\n status : 'success',\n message : 'Now you are using \\'' + self.options.name + '\\' version ' + self.options.version + ', id \\'' + self.options.id + '\\'.',\n persistent : false\n });\n Galaxy.emit.debug('tool-form-base::initialize()', 'Initial tool model ready.', new_model);\n process.resolve();\n },\n error : function(response, xhr) {\n var error_message = ( response && response.err_msg ) || 'Uncaught error.';\n if ( xhr.status == 401 ) {\n window.location = Galaxy.root + 'user/login?' + $.param({ redirect : Galaxy.root + '?tool_id=' + self.options.id });\n } else if ( self.$el.is(':empty') ) {\n self.$el.prepend((new Ui.Message({\n message : error_message,\n status : 'danger',\n persistent : true,\n large : true\n })).$el);\n } else {\n Galaxy.modal.show({\n title : 'Tool request failed',\n body : error_message,\n buttons : {\n 'Close' : function() {\n Galaxy.modal.hide();\n }\n }\n });\n }\n Galaxy.emit.debug('tool-form::initialize()', 'Initial tool model request failed.', response);\n process.reject();\n }\n });\n },\n\n /** Request a new model for an already created tool form and updates the form inputs\n */\n _updateModel: function(process) {\n // link this\n var self = this;\n var model_url = this.options.update_url || Galaxy.root + 'api/tools/' + this.options.id + '/build';\n var current_state = {\n tool_id : this.options.id,\n tool_version : this.options.version,\n inputs : $.extend(true, {}, self.data.create())\n }\n this.wait(true);\n\n // log tool state\n Galaxy.emit.debug('tool-form-base::_updateModel()', 'Sending current state.', current_state);\n\n // post job\n Utils.request({\n type : 'POST',\n url : model_url,\n data : current_state,\n success : function(new_model) {\n self.update(new_model['tool_model'] || new_model);\n self.options.update && self.options.update(new_model);\n self.wait(false);\n Galaxy.emit.debug('tool-form-base::_updateModel()', 'Received new model.', new_model);\n process.resolve();\n },\n error : function(response) {\n Galaxy.emit.debug('tool-form-base::_updateModel()', 'Refresh request failed.', response);\n process.reject();\n }\n });\n },\n\n /** Create tool operation menu\n */\n _operations: function() {\n var self = this;\n var options = this.options;\n\n // button for version selection\n var versions_button = new Ui.ButtonMenu({\n icon : 'fa-cubes',\n title : (!options.narrow && 'Versions') || null,\n tooltip : 'Select another tool version'\n });\n if (!options.sustain_version && options.versions && options.versions.length > 1) {\n for (var i in options.versions) {\n var version = options.versions[i];\n if (version != options.version) {\n versions_button.addMenu({\n title : 'Switch to ' + version,\n version : version,\n icon : 'fa-cube',\n onclick : function() {\n // here we update the tool version (some tools encode the version also in the id)\n var id = options.id.replace(options.version, this.version);\n var version = this.version;\n // queue model request\n self.deferred.reset();\n self.deferred.execute(function(process) {\n self._buildModel(process, {id: id, version: version})\n });\n }\n });\n }\n }\n } else {\n versions_button.$el.hide();\n }\n\n // button for options e.g. search, help\n var menu_button = new Ui.ButtonMenu({\n icon : 'fa-caret-down',\n title : (!options.narrow && 'Options') || null,\n tooltip : 'View available options'\n });\n if(options.biostar_url) {\n menu_button.addMenu({\n icon : 'fa-question-circle',\n title : 'Question?',\n tooltip : 'Ask a question about this tool (Biostar)',\n onclick : function() {\n window.open(options.biostar_url + '/p/new/post/');\n }\n });\n menu_button.addMenu({\n icon : 'fa-search',\n title : 'Search',\n tooltip : 'Search help for this tool (Biostar)',\n onclick : function() {\n window.open(options.biostar_url + '/local/search/page/?q=' + options.name);\n }\n });\n };\n menu_button.addMenu({\n icon : 'fa-share',\n title : 'Share',\n tooltip : 'Share this tool',\n onclick : function() {\n prompt('Copy to clipboard: Ctrl+C, Enter', window.location.origin + Galaxy.root + 'root?tool_id=' + options.id);\n }\n });\n\n // add admin operations\n if (Galaxy.user && Galaxy.user.get('is_admin')) {\n menu_button.addMenu({\n icon : 'fa-download',\n title : 'Download',\n tooltip : 'Download this tool',\n onclick : function() {\n window.location.href = Galaxy.root + 'api/tools/' + options.id + '/download';\n }\n });\n }\n\n // button for version selection\n if (options.requirements && options.requirements.length > 0) {\n menu_button.addMenu({\n icon : 'fa-info-circle',\n title : 'Requirements',\n tooltip : 'Display tool requirements',\n onclick : function() {\n if (!this.visible) {\n this.visible = true;\n self.message.update({\n persistent : true,\n message : ToolTemplate.requirements(options),\n status : 'info'\n });\n } else {\n this.visible = false;\n self.message.update({\n message : ''\n });\n }\n }\n });\n }\n\n // add toolshed url\n if (options.sharable_url) {\n menu_button.addMenu({\n icon : 'fa-external-link',\n title : 'See in Tool Shed',\n tooltip : 'Access the repository',\n onclick : function() {\n window.open(options.sharable_url);\n }\n });\n }\n\n return {\n menu : menu_button,\n versions : versions_button\n }\n },\n\n /** Create footer\n */\n _footer: function() {\n var options = this.options;\n var $el = $( '
                            ' ).append( ToolTemplate.help( options ) );\n if ( options.citations ) {\n var $citations = $( '
                            ' );\n var citations = new CitationModel.ToolCitationCollection();\n citations.tool_id = options.id;\n var citation_list_view = new CitationView.CitationListView({ el: $citations, collection: citations });\n citation_list_view.render();\n citations.fetch();\n $el.append( $citations );\n }\n return $el;\n }\n });\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/tool/tool-form-base.js\n ** module id = 49\n ** module chunks = 0 3\n **/","/**\n * Model, view, and controller objects for Galaxy tools and tool panel.\n */\n\n define([\n \"libs/underscore\",\n \"viz/trackster/util\",\n \"mvc/dataset/data\",\n \"mvc/tool/tool-form\",\n \"templates/tool_form.handlebars\",\n \"templates/tool_link.handlebars\",\n \"templates/panel_section.handlebars\",\n \"templates/tool_search.handlebars\",\n\n], function(_, util, data, ToolForm, tool_form_template, tool_link_template, panel_section_template, tool_search_template) {\n\n/**\n * Mixin for tracking model visibility.\n */\nvar VisibilityMixin = {\n hidden: false,\n\n show: function() {\n this.set(\"hidden\", false);\n },\n\n hide: function() {\n this.set(\"hidden\", true);\n },\n\n toggle: function() {\n this.set(\"hidden\", !this.get(\"hidden\"));\n },\n\n is_visible: function() {\n return !this.attributes.hidden;\n }\n\n};\n\n/**\n * A tool parameter.\n */\nvar ToolParameter = Backbone.Model.extend({\n defaults: {\n name: null,\n label: null,\n type: null,\n value: null,\n html: null,\n num_samples: 5\n },\n\n initialize: function(options) {\n this.attributes.html = unescape(this.attributes.html);\n },\n\n copy: function() {\n return new ToolParameter(this.toJSON());\n },\n\n set_value: function(value) {\n this.set('value', value || '');\n }\n});\n\nvar ToolParameterCollection = Backbone.Collection.extend({\n model: ToolParameter\n});\n\n/**\n * A data tool parameter.\n */\nvar DataToolParameter = ToolParameter.extend({});\n\n/**\n * An integer tool parameter.\n */\nvar IntegerToolParameter = ToolParameter.extend({\n set_value: function(value) {\n this.set('value', parseInt(value, 10));\n },\n\n /**\n * Returns samples from a tool input.\n */\n get_samples: function() {\n return d3.scale.linear()\n .domain([this.get('min'), this.get('max')])\n .ticks(this.get('num_samples'));\n }\n});\n\nvar FloatToolParameter = IntegerToolParameter.extend({\n set_value: function(value) {\n this.set('value', parseFloat(value));\n }\n});\n\n/**\n * A select tool parameter.\n */\nvar SelectToolParameter = ToolParameter.extend({\n /**\n * Returns tool options.\n */\n get_samples: function() {\n return _.map(this.get('options'), function(option) {\n return option[0];\n });\n }\n});\n\n// Set up dictionary of parameter types.\nToolParameter.subModelTypes = {\n 'integer': IntegerToolParameter,\n 'float': FloatToolParameter,\n 'data': DataToolParameter,\n 'select': SelectToolParameter\n};\n\n/**\n * A Galaxy tool.\n */\nvar Tool = Backbone.Model.extend({\n // Default attributes.\n defaults: {\n id: null,\n name: null,\n description: null,\n target: null,\n inputs: [],\n outputs: []\n },\n\n urlRoot: Galaxy.root + 'api/tools',\n\n initialize: function(options) {\n\n // Set parameters.\n this.set('inputs', new ToolParameterCollection(_.map(options.inputs, function(p) {\n var p_class = ToolParameter.subModelTypes[p.type] || ToolParameter;\n return new p_class(p);\n })));\n },\n\n /**\n *\n */\n toJSON: function() {\n var rval = Backbone.Model.prototype.toJSON.call(this);\n\n // Convert inputs to JSON manually.\n rval.inputs = this.get('inputs').map(function(i) { return i.toJSON(); });\n return rval;\n },\n\n /**\n * Removes inputs of a particular type; this is useful because not all inputs can be handled by\n * client and server yet.\n */\n remove_inputs: function(types) {\n var tool = this,\n incompatible_inputs = tool.get('inputs').filter( function(input) {\n return ( types.indexOf( input.get('type') ) !== -1);\n });\n tool.get('inputs').remove(incompatible_inputs);\n },\n\n /**\n * Returns object copy, optionally including only inputs that can be sampled.\n */\n copy: function(only_samplable_inputs) {\n var copy = new Tool(this.toJSON());\n\n // Return only samplable inputs if flag is set.\n if (only_samplable_inputs) {\n var valid_inputs = new Backbone.Collection();\n copy.get('inputs').each(function(input) {\n if (input.get_samples()) {\n valid_inputs.push(input);\n }\n });\n copy.set('inputs', valid_inputs);\n }\n\n return copy;\n },\n\n apply_search_results: function(results) {\n ( _.indexOf(results, this.attributes.id) !== -1 ? this.show() : this.hide() );\n return this.is_visible();\n },\n\n /**\n * Set a tool input's value.\n */\n set_input_value: function(name, value) {\n this.get('inputs').find(function(input) {\n return input.get('name') === name;\n }).set('value', value);\n },\n\n /**\n * Set many input values at once.\n */\n set_input_values: function(inputs_dict) {\n var self = this;\n _.each(_.keys(inputs_dict), function(input_name) {\n self.set_input_value(input_name, inputs_dict[input_name]);\n });\n },\n\n /**\n * Run tool; returns a Deferred that resolves to the tool's output(s).\n */\n run: function() {\n return this._run();\n },\n\n /**\n * Rerun tool using regions and a target dataset.\n */\n rerun: function(target_dataset, regions) {\n return this._run({\n action: 'rerun',\n target_dataset_id: target_dataset.id,\n regions: regions\n });\n },\n\n /**\n * Returns input dict for tool's inputs.\n */\n get_inputs_dict: function() {\n var input_dict = {};\n this.get('inputs').each(function(input) {\n input_dict[input.get('name')] = input.get('value');\n });\n return input_dict;\n },\n\n /**\n * Run tool; returns a Deferred that resolves to the tool's output(s).\n * NOTE: this method is a helper method and should not be called directly.\n */\n _run: function(additional_params) {\n // Create payload.\n var payload = _.extend({\n tool_id: this.id,\n inputs: this.get_inputs_dict()\n }, additional_params);\n\n // Because job may require indexing datasets, use server-side\n // deferred to ensure that job is run. Also use deferred that\n // resolves to outputs from tool.\n var run_deferred = $.Deferred(),\n ss_deferred = new util.ServerStateDeferred({\n ajax_settings: {\n url: this.urlRoot,\n data: JSON.stringify(payload),\n dataType: \"json\",\n contentType: 'application/json',\n type: \"POST\"\n },\n interval: 2000,\n success_fn: function(response) {\n return response !== \"pending\";\n }\n });\n\n // Run job and resolve run_deferred to tool outputs.\n $.when(ss_deferred.go()).then(function(result) {\n run_deferred.resolve(new data.DatasetCollection(result));\n });\n return run_deferred;\n }\n});\n_.extend(Tool.prototype, VisibilityMixin);\n\n/**\n * Tool view.\n */\nvar ToolView = Backbone.View.extend({\n\n});\n\n/**\n * Wrap collection of tools for fast access/manipulation.\n */\nvar ToolCollection = Backbone.Collection.extend({\n model: Tool\n});\n\n/**\n * Label or section header in tool panel.\n */\nvar ToolSectionLabel = Backbone.Model.extend(VisibilityMixin);\n\n/**\n * Section of tool panel with elements (labels and tools).\n */\nvar ToolSection = Backbone.Model.extend({\n defaults: {\n elems: [],\n open: false\n },\n\n clear_search_results: function() {\n _.each(this.attributes.elems, function(elt) {\n elt.show();\n });\n\n this.show();\n this.set(\"open\", false);\n },\n\n apply_search_results: function(results) {\n var all_hidden = true,\n cur_label;\n _.each(this.attributes.elems, function(elt) {\n if (elt instanceof ToolSectionLabel) {\n cur_label = elt;\n cur_label.hide();\n }\n else if (elt instanceof Tool) {\n if (elt.apply_search_results(results)) {\n all_hidden = false;\n if (cur_label) {\n cur_label.show();\n }\n }\n }\n });\n\n if (all_hidden) {\n this.hide();\n }\n else {\n this.show();\n this.set(\"open\", true);\n }\n }\n});\n_.extend(ToolSection.prototype, VisibilityMixin);\n\n/**\n * Tool search that updates results when query is changed. Result value of null\n * indicates that query was not run; if not null, results are from search using\n * query.\n */\nvar ToolSearch = Backbone.Model.extend({\n defaults: {\n search_hint_string: \"search tools\",\n min_chars_for_search: 3,\n spinner_url: \"\",\n clear_btn_url: \"\",\n search_url: \"\",\n visible: true,\n query: \"\",\n results: null,\n // ESC (27) will clear the input field and tool search filters\n clear_key: 27\n },\n\n urlRoot: Galaxy.root + 'api/tools',\n\n initialize: function() {\n this.on(\"change:query\", this.do_search);\n },\n\n /**\n * Do the search and update the results.\n */\n do_search: function() {\n var query = this.attributes.query;\n\n // If query is too short, do not search.\n if (query.length < this.attributes.min_chars_for_search) {\n this.set(\"results\", null);\n return;\n }\n\n // Do search via AJAX.\n var q = query;\n // Stop previous ajax-request\n if (this.timer) {\n clearTimeout(this.timer);\n }\n // Start a new ajax-request in X ms\n $(\"#search-clear-btn\").hide();\n $(\"#search-spinner\").show();\n var self = this;\n this.timer = setTimeout(function () {\n // log the search to analytics if present\n if ( typeof ga !== 'undefined' ) {\n ga( 'send', 'pageview', Galaxy.root + '?q=' + q );\n }\n $.get( self.urlRoot, { q: q }, function (data) {\n self.set(\"results\", data);\n $(\"#search-spinner\").hide();\n $(\"#search-clear-btn\").show();\n }, \"json\" );\n }, 400 );\n },\n\n clear_search: function() {\n this.set(\"query\", \"\");\n this.set(\"results\", null);\n }\n\n});\n_.extend(ToolSearch.prototype, VisibilityMixin);\n\n/**\n * Tool Panel.\n */\nvar ToolPanel = Backbone.Model.extend({\n\n initialize: function(options) {\n this.attributes.tool_search = options.tool_search;\n this.attributes.tool_search.on(\"change:results\", this.apply_search_results, this);\n this.attributes.tools = options.tools;\n this.attributes.layout = new Backbone.Collection( this.parse(options.layout) );\n },\n\n /**\n * Parse tool panel dictionary and return collection of tool panel elements.\n */\n parse: function(response) {\n // Recursive function to parse tool panel elements.\n var self = this,\n // Helper to recursively parse tool panel.\n parse_elt = function(elt_dict) {\n var type = elt_dict.model_class;\n // There are many types of tools; for now, anything that ends in 'Tool'\n // is treated as a generic tool.\n if ( type.indexOf('Tool') === type.length - 4 ) {\n return self.attributes.tools.get(elt_dict.id);\n }\n else if (type === 'ToolSection') {\n // Parse elements.\n var elems = _.map(elt_dict.elems, parse_elt);\n elt_dict.elems = elems;\n return new ToolSection(elt_dict);\n }\n else if (type === 'ToolSectionLabel') {\n return new ToolSectionLabel(elt_dict);\n }\n };\n\n return _.map(response, parse_elt);\n },\n\n clear_search_results: function() {\n this.get('layout').each(function(panel_elt) {\n if (panel_elt instanceof ToolSection) {\n panel_elt.clear_search_results();\n }\n else {\n // Label or tool, so just show.\n panel_elt.show();\n }\n });\n },\n\n apply_search_results: function() {\n var results = this.get('tool_search').get('results');\n if (results === null) {\n this.clear_search_results();\n return;\n }\n\n var cur_label = null;\n this.get('layout').each(function(panel_elt) {\n if (panel_elt instanceof ToolSectionLabel) {\n cur_label = panel_elt;\n cur_label.hide();\n }\n else if (panel_elt instanceof Tool) {\n if (panel_elt.apply_search_results(results)) {\n if (cur_label) {\n cur_label.show();\n }\n }\n }\n else {\n // Starting new section, so clear current label.\n cur_label = null;\n panel_elt.apply_search_results(results);\n }\n });\n }\n});\n\n/**\n * View classes for Galaxy tools and tool panel.\n *\n * Views use precompiled Handlebars templates for rendering. Views update as needed\n * based on (a) model/collection events and (b) user interactions; in this sense,\n * they are controllers are well and the HTML is the real view in the MVC architecture.\n */\n\n/**\n * Base view that handles visibility based on model's hidden attribute.\n */\nvar BaseView = Backbone.View.extend({\n initialize: function() {\n this.model.on(\"change:hidden\", this.update_visible, this);\n this.update_visible();\n },\n update_visible: function() {\n ( this.model.attributes.hidden ? this.$el.hide() : this.$el.show() );\n }\n});\n\n/**\n * Link to a tool.\n */\nvar ToolLinkView = BaseView.extend({\n tagName: 'div',\n\n render: function() {\n // create element\n var $link = $('
                            ');\n $link.append(tool_link_template(this.model.toJSON()));\n\n // open upload dialog for upload tool\n if (this.model.id === 'upload1') {\n $link.find('a').on('click', function(e) {\n e.preventDefault();\n Galaxy.upload.show();\n });\n }\n else if ( this.model.get( 'model_class' ) === 'Tool' ) { // regular tools\n var self = this;\n $link.find('a').on('click', function(e) {\n e.preventDefault();\n var form = new ToolForm.View( { id : self.model.id, version : self.model.get('version') } );\n form.deferred.execute(function() {\n Galaxy.app.display( form );\n });\n });\n }\n\n // add element\n this.$el.append($link);\n return this;\n }\n});\n\n/**\n * Panel label/section header.\n */\nvar ToolSectionLabelView = BaseView.extend({\n tagName: 'div',\n className: 'toolPanelLabel',\n\n render: function() {\n this.$el.append( $(\"\").text(this.model.attributes.text) );\n return this;\n }\n});\n\n/**\n * Panel section.\n */\nvar ToolSectionView = BaseView.extend({\n tagName: 'div',\n className: 'toolSectionWrapper',\n\n initialize: function() {\n BaseView.prototype.initialize.call(this);\n this.model.on(\"change:open\", this.update_open, this);\n },\n\n render: function() {\n // Build using template.\n this.$el.append( panel_section_template(this.model.toJSON()) );\n\n // Add tools to section.\n var section_body = this.$el.find(\".toolSectionBody\");\n _.each(this.model.attributes.elems, function(elt) {\n if (elt instanceof Tool) {\n var tool_view = new ToolLinkView({model: elt, className: \"toolTitle\"});\n tool_view.render();\n section_body.append(tool_view.$el);\n }\n else if (elt instanceof ToolSectionLabel) {\n var label_view = new ToolSectionLabelView({model: elt});\n label_view.render();\n section_body.append(label_view.$el);\n }\n else {\n // TODO: handle nested section bodies?\n }\n });\n return this;\n },\n\n events: {\n 'click .toolSectionTitle > a': 'toggle'\n },\n\n /**\n * Toggle visibility of tool section.\n */\n toggle: function() {\n this.model.set(\"open\", !this.model.attributes.open);\n },\n\n /**\n * Update whether section is open or close.\n */\n update_open: function() {\n (this.model.attributes.open ?\n this.$el.children(\".toolSectionBody\").slideDown(\"fast\") :\n this.$el.children(\".toolSectionBody\").slideUp(\"fast\")\n );\n }\n});\n\nvar ToolSearchView = Backbone.View.extend({\n tagName: 'div',\n id: 'tool-search',\n className: 'bar',\n\n events: {\n 'click': 'focus_and_select',\n 'keyup :input': 'query_changed',\n 'click #search-clear-btn': 'clear'\n },\n\n render: function() {\n this.$el.append( tool_search_template(this.model.toJSON()) );\n if (!this.model.is_visible()) {\n this.$el.hide();\n }\n this.$el.find('[title]').tooltip();\n return this;\n },\n\n focus_and_select: function() {\n this.$el.find(\":input\").focus().select();\n },\n\n clear: function() {\n this.model.clear_search();\n this.$el.find(\":input\").val('');\n this.focus_and_select();\n return false;\n },\n\n query_changed: function( evData ) {\n // check for the 'clear key' (ESC) first\n if( ( this.model.attributes.clear_key ) &&\n ( this.model.attributes.clear_key === evData.which ) ){\n this.clear();\n return false;\n }\n this.model.set(\"query\", this.$el.find(\":input\").val());\n }\n});\n\n/**\n * Tool panel view. Events triggered include:\n * tool_link_click(click event, tool_model)\n */\nvar ToolPanelView = Backbone.View.extend({\n tagName: 'div',\n className: 'toolMenu',\n\n /**\n * Set up view.\n */\n initialize: function() {\n this.model.get('tool_search').on(\"change:results\", this.handle_search_results, this);\n },\n\n render: function() {\n var self = this;\n\n // Render search.\n var search_view = new ToolSearchView( { model: this.model.get('tool_search') } );\n search_view.render();\n self.$el.append(search_view.$el);\n\n // Render panel.\n this.model.get('layout').each(function(panel_elt) {\n if (panel_elt instanceof ToolSection) {\n var section_title_view = new ToolSectionView({model: panel_elt});\n section_title_view.render();\n self.$el.append(section_title_view.$el);\n }\n else if (panel_elt instanceof Tool) {\n var tool_view = new ToolLinkView({model: panel_elt, className: \"toolTitleNoSection\"});\n tool_view.render();\n self.$el.append(tool_view.$el);\n }\n else if (panel_elt instanceof ToolSectionLabel) {\n var label_view = new ToolSectionLabelView({model: panel_elt});\n label_view.render();\n self.$el.append(label_view.$el);\n }\n });\n\n // Setup tool link click eventing.\n self.$el.find(\"a.tool-link\").click(function(e) {\n // Tool id is always the first class.\n var\n tool_id = $(this).attr('class').split(/\\s+/)[0],\n tool = self.model.get('tools').get(tool_id);\n\n self.trigger(\"tool_link_click\", e, tool);\n });\n\n return this;\n },\n\n handle_search_results: function() {\n var results = this.model.get('tool_search').get('results');\n if (results && results.length === 0) {\n $(\"#search-no-results\").show();\n }\n else {\n $(\"#search-no-results\").hide();\n }\n }\n});\n\n/**\n * View for working with a tool: setting parameters and inputs and executing the tool.\n */\nvar ToolFormView = Backbone.View.extend({\n className: 'toolForm',\n\n render: function() {\n this.$el.children().remove();\n this.$el.append( tool_form_template(this.model.toJSON()) );\n }\n});\n\n/**\n * Integrated tool menu + tool execution.\n */\nvar IntegratedToolMenuAndView = Backbone.View.extend({\n className: 'toolMenuAndView',\n\n initialize: function() {\n this.tool_panel_view = new ToolPanelView({collection: this.collection});\n this.tool_form_view = new ToolFormView();\n },\n\n render: function() {\n // Render and append tool panel.\n this.tool_panel_view.render();\n this.tool_panel_view.$el.css(\"float\", \"left\");\n this.$el.append(this.tool_panel_view.$el);\n\n // Append tool form view.\n this.tool_form_view.$el.hide();\n this.$el.append(this.tool_form_view.$el);\n\n // On tool link click, show tool.\n var self = this;\n this.tool_panel_view.on(\"tool_link_click\", function(e, tool) {\n // Prevents click from activating link:\n e.preventDefault();\n // Show tool that was clicked on:\n self.show_tool(tool);\n });\n },\n\n /**\n * Fetch and display tool.\n */\n show_tool: function(tool) {\n var self = this;\n tool.fetch().done( function() {\n self.tool_form_view.model = tool;\n self.tool_form_view.render();\n self.tool_form_view.$el.show();\n $('#left').width(\"650px\");\n });\n }\n});\n\n// Exports\nreturn {\n ToolParameter: ToolParameter,\n IntegerToolParameter: IntegerToolParameter,\n SelectToolParameter: SelectToolParameter,\n Tool: Tool,\n ToolCollection: ToolCollection,\n ToolSearch: ToolSearch,\n ToolPanel: ToolPanel,\n ToolPanelView: ToolPanelView,\n ToolFormView: ToolFormView\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/tool/tools.js\n ** module id = 50\n ** module chunks = 0 3\n **/","define([\n //jquery\n //backbone\n], function(){\n// =============================================================================\n/**\n * view for a popup menu\n */\nvar PopupMenu = Backbone.View.extend({\n//TODO: maybe better as singleton off the Galaxy obj\n /** Cache the desired button element and options, set up the button click handler\n * NOTE: attaches this view as HTML/jQ data on the button for later use.\n */\n initialize: function( $button, options ){\n // default settings\n this.$button = $button;\n if( !this.$button.size() ){\n this.$button = $( '
                            ' );\n }\n this.options = options || [];\n this.$button.data( 'popupmenu', this );\n\n // set up button click -> open menu behavior\n var menu = this;\n this.$button.click( function( event ){\n // if there's already a menu open, remove it\n $( '.popmenu-wrapper' ).remove();\n menu._renderAndShow( event );\n return false;\n });\n },\n\n // render the menu, append to the page body at the click position, and set up the 'click-away' handlers, show\n _renderAndShow: function( clickEvent ){\n this.render();\n this.$el.appendTo( 'body' ).css( this._getShownPosition( clickEvent )).show();\n this._setUpCloseBehavior();\n },\n\n // render the menu\n // this menu doesn't attach itself to the DOM ( see _renderAndShow )\n render: function(){\n // render the menu body absolute and hidden, fill with template\n this.$el.addClass( 'popmenu-wrapper' ).hide()\n .css({ position : 'absolute' })\n .html( this.template( this.$button.attr( 'id' ), this.options ));\n\n // set up behavior on each link/anchor elem\n if( this.options.length ){\n var menu = this;\n //precondition: there should be one option per li\n this.$el.find( 'li' ).each( function( i, li ){\n var option = menu.options[i];\n\n // if the option has 'func', call that function when the anchor is clicked\n if( option.func ){\n $( this ).children( 'a.popupmenu-option' ).click( function( event ){\n option.func.call( menu, event, option );\n // We must preventDefault otherwise clicking \"cancel\"\n // on a purge or something still navigates and causes\n // the action.\n event.preventDefault();\n // bubble up so that an option click will call the close behavior\n });\n }\n });\n }\n return this;\n },\n\n template : function( id, options ){\n return [\n '
                              ', this._templateOptions( options ), '
                            '\n ].join( '' );\n },\n\n _templateOptions : function( options ){\n if( !options.length ){\n return '
                          9. (no options)
                          10. ';\n }\n return _.map( options, function( option ){\n if( option.divider ){\n return '
                          11. ';\n } else if( option.header ){\n return [ '
                          12. ', option.html, '
                          13. ' ].join( '' );\n }\n var href = option.href || 'javascript:void(0);',\n target = ( option.target )?( ' target=\"' + option.target + '\"' ):( '' ),\n check = ( option.checked )?( '' ):( '' );\n return [\n '
                          14. ',\n check, option.html,\n '
                          15. '\n ].join( '' );\n }).join( '' );\n },\n\n // get the absolute position/offset for the menu\n _getShownPosition : function( clickEvent ){\n\n // display menu horiz. centered on click...\n var menuWidth = this.$el.width();\n var x = clickEvent.pageX - menuWidth / 2 ;\n\n // adjust to handle horiz. scroll and window dimensions ( draw entirely on visible screen area )\n x = Math.min( x, $( document ).scrollLeft() + $( window ).width() - menuWidth - 5 );\n x = Math.max( x, $( document ).scrollLeft() + 5 );\n return {\n top: clickEvent.pageY,\n left: x\n };\n },\n\n // bind an event handler to all available frames so that when anything is clicked\n // the menu is removed from the DOM and the event handler unbinds itself\n _setUpCloseBehavior: function(){\n var menu = this;\n//TODO: alternately: focus hack, blocking overlay, jquery.blockui\n\n // function to close popup and unbind itself\n function closePopup( event ){\n $( document ).off( 'click.close_popup' );\n if( window && window.parent !== window ){\n try {\n $( window.parent.document ).off( \"click.close_popup\" );\n } catch( err ){}\n } else {\n try {\n $( 'iframe#galaxy_main' ).contents().off( \"click.close_popup\" );\n } catch( err ){}\n }\n menu.remove();\n }\n\n $( 'html' ).one( \"click.close_popup\", closePopup );\n if( window && window.parent !== window ){\n try {\n $( window.parent.document ).find( 'html' ).one( \"click.close_popup\", closePopup );\n } catch( err ){}\n } else {\n try {\n $( 'iframe#galaxy_main' ).contents().one( \"click.close_popup\", closePopup );\n } catch( err ){}\n }\n },\n\n // add a menu option/item at the given index\n addItem: function( item, index ){\n // append to end if no index\n index = ( index >= 0 ) ? index : this.options.length;\n this.options.splice( index, 0, item );\n return this;\n },\n\n // remove a menu option/item at the given index\n removeItem: function( index ){\n if( index >=0 ){\n this.options.splice( index, 1 );\n }\n return this;\n },\n\n // search for a menu option by its html\n findIndexByHtml: function( html ){\n for( var i = 0; i < this.options.length; i++ ){\n if( _.has( this.options[i], 'html' ) && ( this.options[i].html === html )){\n return i;\n }\n }\n return null;\n },\n\n // search for a menu option by its html\n findItemByHtml: function( html ){\n return this.options[( this.findIndexByHtml( html ))];\n },\n\n // string representation\n toString: function(){\n return 'PopupMenu';\n }\n});\n/** shortcut to new for when you don't need to preserve the ref */\nPopupMenu.create = function _create( $button, options ){\n return new PopupMenu( $button, options );\n};\n\n// -----------------------------------------------------------------------------\n// the following class functions are bridges from the original make_popupmenu and make_popup_menus\n// to the newer backbone.js PopupMenu\n\n/** Create a PopupMenu from simple map initial_options activated by clicking button_element.\n * Converts initial_options to object array used by PopupMenu.\n * @param {jQuery|DOMElement} button_element element which, when clicked, activates menu\n * @param {Object} initial_options map of key -> values, where\n * key is option text, value is fn to call when option is clicked\n * @returns {PopupMenu} the PopupMenu created\n */\nPopupMenu.make_popupmenu = function( button_element, initial_options ){\n var convertedOptions = [];\n _.each( initial_options, function( optionVal, optionKey ){\n var newOption = { html: optionKey };\n\n // keys with null values indicate: header\n if( optionVal === null ){ // !optionVal? (null only?)\n newOption.header = true;\n\n // keys with function values indicate: a menu option\n } else if( jQuery.type( optionVal ) === 'function' ){\n newOption.func = optionVal;\n }\n //TODO:?? any other special optionVals?\n // there was no divider option originally\n convertedOptions.push( newOption );\n });\n return new PopupMenu( $( button_element ), convertedOptions );\n};\n\n/** Find all anchors in $parent (using selector) and covert anchors into a PopupMenu options map.\n * @param {jQuery} $parent the element that contains the links to convert to options\n * @param {String} selector jq selector string to find links\n * @returns {Object[]} the options array to initialize a PopupMenu\n */\n//TODO: lose parent and selector, pass in array of links, use map to return options\nPopupMenu.convertLinksToOptions = function( $parent, selector ){\n $parent = $( $parent );\n selector = selector || 'a';\n var options = [];\n $parent.find( selector ).each( function( elem, i ){\n var option = {}, $link = $( elem );\n\n // convert link text to the option text (html) and the href into the option func\n option.html = $link.text();\n if( $link.attr( 'href' ) ){\n var linkHref = $link.attr( 'href' ),\n linkTarget = $link.attr( 'target' ),\n confirmText = $link.attr( 'confirm' );\n\n option.func = function(){\n // if there's a \"confirm\" attribute, throw up a confirmation dialog, and\n // if the user cancels - do nothing\n if( ( confirmText ) && ( !confirm( confirmText ) ) ){ return; }\n\n // if there's no confirm attribute, or the user accepted the confirm dialog:\n switch( linkTarget ){\n // relocate the center panel\n case '_parent':\n window.parent.location = linkHref;\n break;\n\n // relocate the entire window\n case '_top':\n window.top.location = linkHref;\n break;\n\n // relocate this panel\n default:\n window.location = linkHref;\n }\n };\n }\n options.push( option );\n });\n return options;\n};\n\n/** Create a single popupmenu from existing DOM button and anchor elements\n * @param {jQuery} $buttonElement the element that when clicked will open the menu\n * @param {jQuery} $menuElement the element that contains the anchors to convert into a menu\n * @param {String} menuElementLinkSelector jq selector string used to find anchors to be made into menu options\n * @returns {PopupMenu} the PopupMenu (Backbone View) that can render, control the menu\n */\nPopupMenu.fromExistingDom = function( $buttonElement, $menuElement, menuElementLinkSelector ){\n $buttonElement = $( $buttonElement );\n $menuElement = $( $menuElement );\n var options = PopupMenu.convertLinksToOptions( $menuElement, menuElementLinkSelector );\n // we're done with the menu (having converted it to an options map)\n $menuElement.remove();\n return new PopupMenu( $buttonElement, options );\n};\n\n/** Create all popupmenus within a document or a more specific element\n * @param {DOMElement} parent the DOM element in which to search for popupmenus to build (defaults to document)\n * @param {String} menuSelector jq selector string to find popupmenu menu elements (defaults to \"div[popupmenu]\")\n * @param {Function} buttonSelectorBuildFn the function to build the jq button selector.\n * Will be passed $menuElement, parent.\n * (Defaults to return '#' + $menuElement.attr( 'popupmenu' ); )\n * @returns {PopupMenu[]} array of popupmenus created\n */\nPopupMenu.make_popup_menus = function( parent, menuSelector, buttonSelectorBuildFn ){\n parent = parent || document;\n // orig. Glx popupmenu menus have a (non-std) attribute 'popupmenu'\n // which contains the id of the button that activates the menu\n menuSelector = menuSelector || 'div[popupmenu]';\n // default to (orig. Glx) matching button to menu by using the popupmenu attr of the menu as the id of the button\n buttonSelectorBuildFn = buttonSelectorBuildFn || function( $menuElement, parent ){\n return '#' + $menuElement.attr( 'popupmenu' );\n };\n\n // aggregate and return all PopupMenus\n var popupMenusCreated = [];\n $( parent ).find( menuSelector ).each( function(){\n var $menuElement = $( this ),\n $buttonElement = $( parent ).find( buttonSelectorBuildFn( $menuElement, parent ) );\n popupMenusCreated.push( PopupMenu.fromDom( $buttonElement, $menuElement ) );\n $buttonElement.addClass( 'popup' );\n });\n return popupMenusCreated;\n};\n\n\n// =============================================================================\n return PopupMenu;\n});\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/popup-menu.js\n ** module id = 51\n ** module chunks = 3\n **/","/** Renders the color picker used e.g. in the tool form **/\ndefine(['utils/utils'], function( Utils ) {\n return Backbone.View.extend({\n colors: {\n standard: ['c00000','ff0000','ffc000','ffff00','92d050','00b050','00b0f0','0070c0','002060','7030a0'],\n base : ['ffffff','000000','eeece1','1f497d','4f81bd','c0504d','9bbb59','8064a2','4bacc6','f79646'],\n theme :[['f2f2f2','7f7f7f','ddd9c3','c6d9f0','dbe5f1','f2dcdb','ebf1dd','e5e0ec','dbeef3','fdeada'],\n ['d8d8d8','595959','c4bd97','8db3e2','b8cce4','e5b9b7','d7e3bc','ccc1d9','b7dde8','fbd5b5'],\n ['bfbfbf','3f3f3f','938953','548dd4','95b3d7','d99694','c3d69b','b2a2c7','92cddc','fac08f'],\n ['a5a5a5','262626','494429','17365d','366092','953734','76923c','5f497a','31859b','e36c09'],\n ['7f7f7e','0c0c0c','1d1b10','0f243e','244061','632423','4f6128','3f3151','205867','974806']]\n },\n initialize : function( options ) {\n this.options = Utils.merge( options, {} );\n this.setElement( this._template() );\n\n // link components\n this.$panel = this.$( '.ui-color-picker-panel' );\n this.$view = this.$( '.ui-color-picker-view' );\n this.$value = this.$( '.ui-color-picker-value' );\n this.$header = this.$( '.ui-color-picker-header' );\n\n // build panel\n this._build();\n\n // hide panel on start up\n this.visible = false;\n\n // set initial value\n this.value( this.options.value );\n\n // link boxes\n this.$boxes = this.$( '.ui-color-picker-box' );\n\n // add event handler\n var self = this;\n this.$boxes.on( 'click', function() {\n self.value( $( this ).css( 'background-color' ) );\n self.$header.trigger( 'click' );\n } );\n this.$header.on( 'click', function() {\n self.visible = !self.visible;\n if ( self.visible ) {\n self.$view.fadeIn( 'fast' );\n } else {\n self.$view.fadeOut( 'fast' );\n }\n } );\n },\n\n // value\n value : function ( new_val ) {\n if ( new_val !== undefined && new_val !== null ) {\n // update color value\n this.$value.css( 'background-color', new_val );\n \n // check selected color in panel\n this.$( '.ui-color-picker-box' ).empty();\n this.$( this._getValue() ).html( this._templateCheck() );\n\n // trigger custom event\n this.options.onchange && this.options.onchange( new_val );\n }\n\n // return current value\n return this._getValue();\n },\n\n // get value from dom\n _getValue: function() {\n var rgb = this.$value.css( 'background-color' );\n rgb = rgb.match(/^rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)$/);\n if ( rgb ) {\n function hex( x ) {\n return ( '0' + parseInt( x ).toString( 16 ) ).slice( -2 );\n }\n return '#' + hex( rgb[ 1] ) + hex( rgb[ 2 ] ) + hex( rgb[ 3 ] );\n } else {\n return null;\n }\n },\n\n // build panel\n _build: function() {\n var $content = this._content({\n label : 'Theme Colors',\n colors : this.colors.base,\n padding : 10\n });\n for ( var i in this.colors.theme ) {\n var line_def = {};\n if ( i == 0 ) {\n line_def[ 'bottom' ] = true;\n } else {\n if ( i != this.colors.theme.length - 1 ) {\n line_def[ 'top' ] = true;\n line_def[ 'bottom' ] = true;\n } else {\n line_def[ 'top' ] = true;\n line_def[ 'padding' ] = 5;\n }\n }\n line_def[ 'colors' ] = this.colors.theme[ i ];\n this._content( line_def );\n }\n this._content({\n label : 'Standard Colors',\n colors : this.colors.standard,\n padding : 5\n });\n },\n\n // create content\n _content: function( options ) {\n // get parameters\n var label = options.label;\n var colors = options.colors;\n var padding = options.padding;\n var top = options.top;\n var bottom = options.bottom;\n\n // create lines\n var $content = $( this._templateContent() );\n\n // set label\n var $label = $content.find( '.label' );\n if ( options.label ) {\n $label.html( options.label );\n } else {\n $label.hide();\n }\n\n // build line\n var $line = $content.find( '.line' );\n this.$panel.append( $content );\n for ( var i in colors ) {\n var $box = $( this._templateBox( colors[ i ] ) );\n if ( top ) {\n $box.css( 'border-top', 'none' );\n $box.css( 'border-top-left-radius', '0px' );\n $box.css( 'border-top-right-radius', '0px' );\n }\n if ( bottom ) {\n $box.css( 'border-bottom', 'none' );\n $box.css( 'border-bottom-left-radius', '0px' );\n $box.css( 'border-bottom-right-radius', '0px' );\n }\n $line.append( $box );\n }\n if (padding) {\n $line.css( 'padding-bottom', padding );\n }\n return $content;\n },\n\n // check icon\n _templateCheck: function() {\n return '
                            ';\n },\n\n // content template\n _templateContent: function() {\n return '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ';\n },\n\n // box template\n _templateBox: function( color ) {\n return '
                            ';\n },\n\n // template\n _template: function() {\n return '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            Select a color
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            ' +\n '
                            '\n '
                            ';\n }\n });\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-color-picker.js\n ** module id = 52\n ** module chunks = 0 3\n **/","// dependencies\ndefine(['utils/utils', 'mvc/ui/ui-options'], function(Utils, Options) {\n\n/**\n * This class creates/wraps a drill down element.\n */\nvar View = Options.BaseIcons.extend({\n // initialize\n initialize: function(options) {\n options.type = options.display || 'checkbox';\n options.multiple = (options.display == 'checkbox');\n Options.BaseIcons.prototype.initialize.call(this, options);\n this.initial = true;\n },\n\n // set expand states for initial value\n value: function (new_val) {\n var val = Options.BaseIcons.prototype.value.call(this, new_val);\n if (this.initial && val !== null && this.header_index) {\n this.initial = false;\n var values = val;\n if (!$.isArray(values)) {\n values = [values];\n }\n for (var i in values) {\n var list = this.header_index[values[i]];\n for (var j in list) {\n this._setState(list[j], true);\n }\n }\n }\n return val;\n },\n\n /** Expand/collapse a sub group\n */\n _setState: function (header_id, is_expanded) {\n var $button = this.$('.button-' + header_id);\n var $subgroup = this.$('.subgroup-' + header_id);\n $button.data('is_expanded', is_expanded);\n if (is_expanded) {\n $subgroup.fadeIn('fast')\n $button.removeClass('fa-plus-square');\n $button.addClass('fa-minus-square');\n } else {\n $subgroup.hide();\n $button.removeClass('fa-minus-square');\n $button.addClass('fa-plus-square');\n }\n },\n\n /** Template to create options tree\n */\n _templateOptions: function(options) {\n // link this\n var self = this;\n\n // link data\n this.header_index = {};\n \n // attach event handler\n function attach($el, header_id) {\n var $button = $el.find('.button-' + header_id);\n $button.on('click', function() {\n self._setState(header_id, !$button.data('is_expanded'));\n });\n }\n\n // recursive function which iterates through options\n function iterate ($tmpl, options, header) {\n header = header || [];\n for (i in options) {\n // current option level in hierarchy\n var level = options[i];\n\n // check for options\n var has_options = level.options.length > 0;\n\n // copy current header list\n var new_header = header.slice(0);\n\n // keep track of header list\n self.header_index[level.value] = new_header.slice(0);\n\n // build template\n var $group = $('
                            ');\n if (has_options) {\n // create button and subgroup\n var header_id = Utils.uid();\n var $button = $('');\n var $subgroup = $('
                            ');\n\n // keep track of button and subgroup\n new_header.push(header_id);\n\n // create expandable header section\n var $buttongroup = $('
                            ');\n $buttongroup.append($button);\n $buttongroup.append(self._templateOption({\n label: level.name,\n value: level.value\n }));\n $group.append($buttongroup);\n iterate($subgroup, level.options, new_header);\n $group.append($subgroup);\n\n // attach expand/collapse events\n attach($group, header_id);\n } else {\n // append child options\n $group.append(self._templateOption({\n label: level.name,\n value: level.value\n }));\n }\n $tmpl.append($group);\n }\n }\n\n // iterate through options and create dom\n var $tmpl = $('
                            ');\n iterate($tmpl, options);\n\n // return template\n return $tmpl;\n },\n\n /** Template for drill down view\n */\n _template: function(options) {\n return '
                            ';\n }\n});\n\nreturn {\n View: View\n}\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-drilldown.js\n ** module id = 53\n ** module chunks = 0 3\n **/","/**\n * This class creates/wraps a default html select field as backbone class.\n */\ndefine(['utils/utils', 'mvc/ui/ui-buttons'], function(Utils, Buttons) {\nvar View = Backbone.View.extend({\n // options\n optionsDefault: {\n id : Utils.uid(),\n cls : 'ui-select',\n error_text : 'No options available',\n empty_text : 'Nothing selected',\n visible : true,\n wait : false,\n multiple : false,\n searchable : true,\n optional : false\n },\n\n // initialize\n initialize: function(options) {\n // link this\n var self = this;\n this.model = new Backbone.Model();\n\n // configure options\n this.options = Utils.merge(options, this.optionsDefault);\n\n // create new element\n this.setElement(this._template(this.options));\n\n // link elements\n this.$select = this.$el.find('.select');\n this.$icon_dropdown = this.$el.find('.icon-dropdown');\n this.$icon_dropdown.on( 'click', function() { self.$select.select2 && self.$select.select2( 'open' ) });\n\n // allow regular multi-select field to be resized\n var minHeight = null;\n this.$('.icon-resize').on('mousedown', function(event) {\n var currentY = event.pageY;\n var currentHeight = self.$select.height();\n minHeight = minHeight || currentHeight;\n $('#dd-helper').show().on('mousemove', function(event) {\n self.$select.height(Math.max(currentHeight + (event.pageY - currentY), minHeight));\n }).on('mouseup mouseleave', function() {\n $('#dd-helper').hide().off();\n });\n });\n\n // multiple select fields have an additional button and other custom properties\n if (this.options.multiple) {\n // create select all button\n if (this.options.searchable) {\n this.all_button = new Buttons.ButtonCheck({\n onclick: function() {\n var new_value = [];\n if (self.all_button.value() !== 0) {\n new_value = self._availableOptions();\n }\n self.value(new_value);\n self.trigger('change');\n }\n });\n this.$el.prepend(this.all_button.$el);\n } else {\n this.$el.addClass('ui-select-multiple');\n }\n this.$select.prop('multiple', true);\n this.$icon_dropdown.remove();\n }\n\n // update initial options\n this.update(this.options.data);\n\n // set initial value\n if (this.options.value !== undefined) {\n this.value(this.options.value);\n }\n\n // show/hide\n if (!this.options.visible) {\n this.hide();\n }\n\n // wait\n if (this.options.wait) {\n this.wait();\n } else {\n this.show();\n }\n\n // add change event. fires only on user activity\n this.$select.on('change', function() {\n self.trigger('change');\n });\n\n // add change event. fires on trigger\n this.on('change', function() {\n self.options.onchange && self.options.onchange(this.value());\n });\n },\n\n /** Return/Set current selection\n */\n value: function (new_value) {\n // set new value\n if (new_value !== undefined) {\n if (new_value === null) {\n new_value = '__null__';\n }\n if (this.exists(new_value) || this.options.multiple) {\n this.$select.val(new_value);\n if (this.$select.select2) {\n this.$select.select2('val', new_value);\n }\n }\n }\n // get current value\n var current = this._getValue();\n if (this.all_button) {\n this.all_button.value($.isArray(current) && current.length || 0, this._size());\n }\n return current;\n },\n\n /** Return the first select option\n */\n first: function() {\n var options = this.$select.find('option').first();\n if (options.length > 0) {\n return options.val();\n } else {\n return null;\n }\n },\n\n /** Return the label/text of the current selection\n */\n text: function () {\n return this.$select.find('option:selected').text();\n },\n\n /** Show the select field\n */\n show: function() {\n this.unwait();\n this.$select.show();\n this.$el.show();\n },\n\n /** Hide the select field\n */\n hide: function() {\n this.$el.hide();\n },\n\n /** Show a spinner indicating that the select options are currently loaded\n */\n wait: function() {\n this.$icon_dropdown.removeClass();\n this.$icon_dropdown.addClass('icon-dropdown fa fa-spinner fa-spin');\n },\n\n /** Hide spinner indicating that the request has been completed\n */\n unwait: function() {\n this.$icon_dropdown.removeClass();\n this.$icon_dropdown.addClass('icon-dropdown fa fa-caret-down');\n },\n\n /** Returns true if the field is disabled\n */\n disabled: function() {\n return this.$select.is(':disabled');\n },\n\n /** Enable the select field\n */\n enable: function() {\n this.$select.prop('disabled', false);\n },\n\n /** Disable the select field\n */\n disable: function() {\n this.$select.prop('disabled', true);\n },\n\n /** Update all available options at once\n */\n add: function( options, sorter ) {\n _.each( this.model.get( 'options' ), function( v ) {\n !_.findWhere( options, v ) && options.push( v );\n });\n sorter && options.sort( sorter );\n this.update( options );\n },\n update: function(options) {\n // backup current value\n var current = this._getValue();\n\n // remove all options\n this.$select.find('option').remove();\n\n // add optional field\n if (!this.options.multiple && this.options.optional) {\n this.$select.append(this._templateOption({value : '__null__', label : this.options.empty_text}));\n }\n\n // add new options\n this.model.set( 'options', options );\n for (var key in options) {\n this.$select.append(this._templateOption(options[key]));\n }\n\n // count remaining entries\n if (this._size() == 0) {\n // disable select field\n this.disable();\n\n // create placeholder\n this.$select.append(this._templateOption({value : '__null__', label : this.options.error_text}));\n } else {\n // enable select field\n this.enable();\n }\n\n // update to searchable field (in this case select2)\n if (this.options.searchable) {\n this.$select.select2('destroy');\n this.$select.select2({ closeOnSelect: !this.options.multiple });\n this.$( '.select2-container .select2-search input' ).off( 'blur' );\n }\n\n // set previous value\n this.value(current);\n\n // check if any value was set\n if (this._getValue() === null && !(this.options.multiple && this.options.optional)) {\n this.value(this.first());\n }\n },\n\n /** Set the custom onchange callback function\n */\n setOnChange: function(callback) {\n this.options.onchange = callback;\n },\n\n /** Check if a value is an existing option\n */\n exists: function(value) {\n return this.$select.find('option[value=\"' + value + '\"]').length > 0;\n },\n\n /** Get current value from dom\n */\n _getValue: function() {\n var val = this.$select.val();\n if (!Utils.validate(val)) {\n return null;\n }\n return val;\n },\n\n /** Returns all currently available options\n */\n _availableOptions: function() {\n var available = [];\n this.$select.find('option').each(function(i, e){\n available.push($(e).attr('value'));\n });\n return available;\n },\n\n /** Number of available options\n */\n _size: function() {\n return this.$select.find('option').length;\n },\n\n /** Template for select options\n */\n _templateOption: function(options) {\n return '';\n },\n\n /** Template for select view\n */\n _template: function(options) {\n return '
                            ' +\n '' +\n '
                            ' +\n '
                            ';\n }\n});\n\nreturn {\n View : View\n};\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/ui/ui-slider.js\n ** module id = 57\n ** module chunks = 0 3\n **/","// dependencies\ndefine([], function() {\n\n// model\nvar Model = Backbone.Model.extend({\n defaults: {\n extension : 'auto',\n genome : '?',\n url_paste : '',\n status : 'init',\n info : null,\n file_name : '',\n file_mode : '',\n file_size : 0,\n file_type : null,\n file_path : '',\n file_data : null,\n percentage : 0,\n space_to_tab : false,\n to_posix_lines : true,\n enabled : true\n },\n reset: function(attr) {\n this.clear().set(this.defaults).set(attr);\n }\n});\n\n// collection\nvar Collection = Backbone.Collection.extend({\n model: Model\n});\n\n// return\nreturn {\n Model: Model,\n Collection : Collection\n};\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/upload/upload-model.js\n ** module id = 58\n ** module chunks = 3\n **/","/**\n * This class defines a queue to ensure that multiple deferred callbacks are executed sequentially.\n */\ndefine(['utils/utils'], function( Utils ) {\nreturn Backbone.Model.extend({\n initialize: function(){\n this.active = {};\n this.last = null;\n },\n\n /** Adds a callback to the queue. Upon execution a deferred object is parsed to the callback i.e. callback( deferred ).\n * If the callback does not take any arguments, the deferred is resolved instantly.\n */\n execute: function( callback ) {\n var self = this;\n var id = Utils.uid();\n var has_deferred = callback.length > 0;\n\n // register process\n this.active[ id ] = true;\n\n // deferred process\n var process = $.Deferred();\n process.promise().always(function() {\n delete self.active[ id ];\n has_deferred && Galaxy.emit.debug( 'deferred::execute()', this.state().charAt(0).toUpperCase() + this.state().slice(1) + ' ' + id );\n });\n\n // deferred queue\n $.when( this.last ).always(function() {\n if ( self.active[ id ] ) {\n has_deferred && Galaxy.emit.debug( 'deferred::execute()', 'Running ' + id );\n callback( process );\n !has_deferred && process.resolve();\n } else {\n process.reject();\n }\n });\n this.last = process.promise();\n },\n\n /** Resets the promise queue. All currently queued but unexecuted callbacks/promises will be rejected.\n */\n reset: function() {\n Galaxy.emit.debug('deferred::execute()', 'Reset');\n for ( var i in this.active ) {\n this.active[ i ] = false;\n }\n },\n\n /** Returns true if all processes are done.\n */\n ready: function() {\n return $.isEmptyObject( this.active );\n }\n});\n\n});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/utils/deferred.js\n ** module id = 60\n ** module chunks = 0 3\n **/","define([], function(){\n// ============================================================================\nfunction get( key, queryString ){\n queryString = queryString || window.location.search.substr( 1 );\n var keyRegex = new RegExp( key + '=([^&#$]+)' ),\n matches = queryString.match( keyRegex );\n if( !matches || !matches.length ){\n return undefined;\n }\n matches = matches.splice( 1 );\n if( matches.length === 1 ){\n return matches[0];\n }\n return matches;\n}\n\nfunction parse( queryString ){\n if( !queryString ){ return {}; }\n var parsed = {},\n split = queryString.split( '&' );\n split.forEach( function( pairString ){\n var pair = pairString.split( '=' );\n parsed[ pair[0] ] = decodeURI( pair[1] );\n });\n return parsed;\n}\n\n// ============================================================================\n return {\n get : get,\n parse : parse,\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/utils/query-string-parsing.js\n ** module id = 61\n ** module chunks = 0 3\n **/","var Handlebars = require(\"/Users/yoplait/work/galaxy/client/node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"\\n
                            \\n
                            \\n
                            \";\n},\"useData\":true});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/templates/panel_section.handlebars\n ** module id = 63\n ** module chunks = 0 3\n **/","var Handlebars = require(\"/Users/yoplait/work/galaxy/client/node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
                            \\n \\n
                            \\n \"\n + ((stack1 = ((helper = (helper = helpers.html || (depth0 != null ? depth0.html : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"html\",\"hash\":{},\"data\":data}) : helper))) != null ? stack1 : \"\")\n + \"\\n
                            \\n
                            \\n \"\n + alias4(((helper = (helper = helpers.help || (depth0 != null ? depth0.help : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"help\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n
                            \\n
                            \\n
                            \\n\";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"
                            \"\n + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n + \" (version \"\n + alias4(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n + \")
                            \\n
                            \\n\"\n + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.inputs : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"
                            \\n
                            \\n \\n
                            \\n
                            \\n
                            \"\n + alias4(((helper = (helper = helpers.help || (depth0 != null ? depth0.help : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"help\",\"hash\":{},\"data\":data}) : helper)))\n + \"
                            \\n
                            \";\n},\"useData\":true});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/templates/tool_form.handlebars\n ** module id = 64\n ** module chunks = 0 3\n **/","var Handlebars = require(\"/Users/yoplait/work/galaxy/client/node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n var alias1=container.lambda, alias2=container.escapeExpression;\n\n return \"\"\n + alias2(alias1(depth0, depth0))\n + \" \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"\"\n + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.labels : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"\\n\"\n + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"name\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n\"\n + alias4(((helper = (helper = helpers.description || (depth0 != null ? depth0.description : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"description\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\n\";\n},\"useData\":true});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/templates/tool_link.handlebars\n ** module id = 65\n ** module chunks = 0 3\n **/","var Handlebars = require(\"/Users/yoplait/work/galaxy/client/node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : {}, alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"\\n \\n\\n\";\n},\"useData\":true});\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/templates/tool_search.handlebars\n ** module id = 66\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// istanbul ignore next\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _handlebarsBase = require('./handlebars/base');\n\nvar base = _interopRequireWildcard(_handlebarsBase);\n\n// Each of these augment the Handlebars object. No need to setup here.\n// (This is done to easily share code between commonjs and browse envs)\n\nvar _handlebarsSafeString = require('./handlebars/safe-string');\n\nvar _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString);\n\nvar _handlebarsException = require('./handlebars/exception');\n\nvar _handlebarsException2 = _interopRequireDefault(_handlebarsException);\n\nvar _handlebarsUtils = require('./handlebars/utils');\n\nvar Utils = _interopRequireWildcard(_handlebarsUtils);\n\nvar _handlebarsRuntime = require('./handlebars/runtime');\n\nvar runtime = _interopRequireWildcard(_handlebarsRuntime);\n\nvar _handlebarsNoConflict = require('./handlebars/no-conflict');\n\nvar _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict);\n\n// For compatibility and usage outside of module systems, make the Handlebars object a namespace\nfunction create() {\n var hb = new base.HandlebarsEnvironment();\n\n Utils.extend(hb, base);\n hb.SafeString = _handlebarsSafeString2['default'];\n hb.Exception = _handlebarsException2['default'];\n hb.Utils = Utils;\n hb.escapeExpression = Utils.escapeExpression;\n\n hb.VM = runtime;\n hb.template = function (spec) {\n return runtime.template(spec, hb);\n };\n\n return hb;\n}\n\nvar inst = create();\ninst.create = create;\n\n_handlebarsNoConflict2['default'](inst);\n\ninst['default'] = inst;\n\nexports['default'] = inst;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oYW5kbGViYXJzLnJ1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OEJBQXNCLG1CQUFtQjs7SUFBN0IsSUFBSTs7Ozs7b0NBSU8sMEJBQTBCOzs7O21DQUMzQix3QkFBd0I7Ozs7K0JBQ3ZCLG9CQUFvQjs7SUFBL0IsS0FBSzs7aUNBQ1Esc0JBQXNCOztJQUFuQyxPQUFPOztvQ0FFSSwwQkFBMEI7Ozs7O0FBR2pELFNBQVMsTUFBTSxHQUFHO0FBQ2hCLE1BQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0FBRTFDLE9BQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLElBQUUsQ0FBQyxVQUFVLG9DQUFhLENBQUM7QUFDM0IsSUFBRSxDQUFDLFNBQVMsbUNBQVksQ0FBQztBQUN6QixJQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNqQixJQUFFLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDOztBQUU3QyxJQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNoQixJQUFFLENBQUMsUUFBUSxHQUFHLFVBQVMsSUFBSSxFQUFFO0FBQzNCLFdBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDbkMsQ0FBQzs7QUFFRixTQUFPLEVBQUUsQ0FBQztDQUNYOztBQUVELElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztBQUVyQixrQ0FBVyxJQUFJLENBQUMsQ0FBQzs7QUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzs7cUJBRVIsSUFBSSIsImZpbGUiOiJoYW5kbGViYXJzLnJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars.runtime.js\n ** module id = 67\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.registerDefaultDecorators = registerDefaultDecorators;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _decoratorsInline = require('./decorators/inline');\n\nvar _decoratorsInline2 = _interopRequireDefault(_decoratorsInline);\n\nfunction registerDefaultDecorators(instance) {\n _decoratorsInline2['default'](instance);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Z0NBQTJCLHFCQUFxQjs7OztBQUV6QyxTQUFTLHlCQUF5QixDQUFDLFFBQVEsRUFBRTtBQUNsRCxnQ0FBZSxRQUFRLENBQUMsQ0FBQztDQUMxQiIsImZpbGUiOiJkZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlZ2lzdGVySW5saW5lIGZyb20gJy4vZGVjb3JhdG9ycy9pbmxpbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICByZWdpc3RlcklubGluZShpbnN0YW5jZSk7XG59XG5cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/decorators.js\n ** module id = 68\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n instance.registerDecorator('inline', function (fn, props, container, options) {\n var ret = fn;\n if (!props.partials) {\n props.partials = {};\n ret = function (context, options) {\n // Create a new partials stack frame prior to exec.\n var original = container.partials;\n container.partials = _utils.extend({}, original, props.partials);\n var ret = fn(context, options);\n container.partials = original;\n return ret;\n };\n }\n\n props.partials[options.args[0]] = options.fn;\n\n return ret;\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMvaW5saW5lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQXFCLFVBQVU7O3FCQUVoQixVQUFTLFFBQVEsRUFBRTtBQUNoQyxVQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNiLFFBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ25CLFdBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQUcsR0FBRyxVQUFTLE9BQU8sRUFBRSxPQUFPLEVBQUU7O0FBRS9CLFlBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDbEMsaUJBQVMsQ0FBQyxRQUFRLEdBQUcsY0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRCxZQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLGlCQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixlQUFPLEdBQUcsQ0FBQztPQUNaLENBQUM7S0FDSDs7QUFFRCxTQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUU3QyxXQUFPLEdBQUcsQ0FBQztHQUNaLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6ImlubGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIGxldCByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFydGlhbHMgc3RhY2sgZnJhbWUgcHJpb3IgdG8gZXhlYy5cbiAgICAgICAgbGV0IG9yaWdpbmFsID0gY29udGFpbmVyLnBhcnRpYWxzO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBleHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7XG4gICAgICAgIGxldCByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHByb3BzLnBhcnRpYWxzW29wdGlvbnMuYXJnc1swXV0gPSBvcHRpb25zLmZuO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/decorators/inline.js\n ** module id = 69\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.registerDefaultHelpers = registerDefaultHelpers;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _helpersBlockHelperMissing = require('./helpers/block-helper-missing');\n\nvar _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing);\n\nvar _helpersEach = require('./helpers/each');\n\nvar _helpersEach2 = _interopRequireDefault(_helpersEach);\n\nvar _helpersHelperMissing = require('./helpers/helper-missing');\n\nvar _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing);\n\nvar _helpersIf = require('./helpers/if');\n\nvar _helpersIf2 = _interopRequireDefault(_helpersIf);\n\nvar _helpersLog = require('./helpers/log');\n\nvar _helpersLog2 = _interopRequireDefault(_helpersLog);\n\nvar _helpersLookup = require('./helpers/lookup');\n\nvar _helpersLookup2 = _interopRequireDefault(_helpersLookup);\n\nvar _helpersWith = require('./helpers/with');\n\nvar _helpersWith2 = _interopRequireDefault(_helpersWith);\n\nfunction registerDefaultHelpers(instance) {\n _helpersBlockHelperMissing2['default'](instance);\n _helpersEach2['default'](instance);\n _helpersHelperMissing2['default'](instance);\n _helpersIf2['default'](instance);\n _helpersLog2['default'](instance);\n _helpersLookup2['default'](instance);\n _helpersWith2['default'](instance);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7eUNBQXVDLGdDQUFnQzs7OzsyQkFDOUMsZ0JBQWdCOzs7O29DQUNQLDBCQUEwQjs7Ozt5QkFDckMsY0FBYzs7OzswQkFDYixlQUFlOzs7OzZCQUNaLGtCQUFrQjs7OzsyQkFDcEIsZ0JBQWdCOzs7O0FBRWxDLFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO0FBQy9DLHlDQUEyQixRQUFRLENBQUMsQ0FBQztBQUNyQywyQkFBYSxRQUFRLENBQUMsQ0FBQztBQUN2QixvQ0FBc0IsUUFBUSxDQUFDLENBQUM7QUFDaEMseUJBQVcsUUFBUSxDQUFDLENBQUM7QUFDckIsMEJBQVksUUFBUSxDQUFDLENBQUM7QUFDdEIsNkJBQWUsUUFBUSxDQUFDLENBQUM7QUFDekIsMkJBQWEsUUFBUSxDQUFDLENBQUM7Q0FDeEIiLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers.js\n ** module id = 70\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n instance.registerHelper('blockHelperMissing', function (context, options) {\n var inverse = options.inverse,\n fn = options.fn;\n\n if (context === true) {\n return fn(this);\n } else if (context === false || context == null) {\n return inverse(this);\n } else if (_utils.isArray(context)) {\n if (context.length > 0) {\n if (options.ids) {\n options.ids = [options.name];\n }\n\n return instance.helpers.each(context, options);\n } else {\n return inverse(this);\n }\n } else {\n if (options.data && options.ids) {\n var data = _utils.createFrame(options.data);\n data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name);\n options = { data: data };\n }\n\n return fn(context, options);\n }\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBc0QsVUFBVTs7cUJBRWpELFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3ZFLFFBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPO1FBQ3pCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDcEIsYUFBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakIsTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUMvQyxhQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QixNQUFNLElBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUMzQixVQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3RCLFlBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUNmLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCOztBQUVELGVBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQ2hELE1BQU07QUFDTCxlQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN0QjtLQUNGLE1BQU07QUFDTCxVQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixZQUFJLElBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLGVBQU8sR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztPQUN4Qjs7QUFFRCxhQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0I7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJibG9jay1oZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGNyZWF0ZUZyYW1lLCBpc0FycmF5fSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgbGV0IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgaWYgKGNvbnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgICBvcHRpb25zLmlkcyA9IFtvcHRpb25zLm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGxldCBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHtkYXRhOiBkYXRhfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js\n ** module id = 71\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _utils = require('../utils');\n\nvar _exception = require('../exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n instance.registerHelper('each', function (context, options) {\n if (!options) {\n throw new _exception2['default']('Must pass iterator to #each');\n }\n\n var fn = options.fn,\n inverse = options.inverse,\n i = 0,\n ret = '',\n data = undefined,\n contextPath = undefined;\n\n if (options.data && options.ids) {\n contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n }\n\n if (_utils.isFunction(context)) {\n context = context.call(this);\n }\n\n if (options.data) {\n data = _utils.createFrame(options.data);\n }\n\n function execIteration(field, index, last) {\n if (data) {\n data.key = field;\n data.index = index;\n data.first = index === 0;\n data.last = !!last;\n\n if (contextPath) {\n data.contextPath = contextPath + field;\n }\n }\n\n ret = ret + fn(context[field], {\n data: data,\n blockParams: _utils.blockParams([context[field], field], [contextPath + field, null])\n });\n }\n\n if (context && typeof context === 'object') {\n if (_utils.isArray(context)) {\n for (var j = context.length; i < j; i++) {\n if (i in context) {\n execIteration(i, i, i === context.length - 1);\n }\n }\n } else {\n var priorKey = undefined;\n\n for (var key in context) {\n if (context.hasOwnProperty(key)) {\n // We're running the iterations one step out of sync so we can detect\n // the last iteration without have to scan the object twice and create\n // an itermediate keys array.\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1);\n }\n priorKey = key;\n i++;\n }\n }\n if (priorKey !== undefined) {\n execIteration(priorKey, i - 1, true);\n }\n }\n }\n\n if (i === 0) {\n ret = inverse(this);\n }\n\n return ret;\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvZWFjaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUErRSxVQUFVOzt5QkFDbkUsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksQ0FBQyxPQUFPLEVBQUU7QUFDWixZQUFNLDJCQUFjLDZCQUE2QixDQUFDLENBQUM7S0FDcEQ7O0FBRUQsUUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUU7UUFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU87UUFDekIsQ0FBQyxHQUFHLENBQUM7UUFDTCxHQUFHLEdBQUcsRUFBRTtRQUNSLElBQUksWUFBQTtRQUNKLFdBQVcsWUFBQSxDQUFDOztBQUVoQixRQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixpQkFBVyxHQUFHLHlCQUFrQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pGOztBQUVELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDaEIsVUFBSSxHQUFHLG1CQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQzs7QUFFRCxhQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN6QyxVQUFJLElBQUksRUFBRTtBQUNSLFlBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUN6QixZQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0FBRW5CLFlBQUksV0FBVyxFQUFFO0FBQ2YsY0FBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3hDO09BQ0Y7O0FBRUQsU0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQUksRUFBRSxJQUFJO0FBQ1YsbUJBQVcsRUFBRSxtQkFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDL0UsQ0FBQyxDQUFDO0tBQ0o7O0FBRUQsUUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQzFDLFVBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNwQixhQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxjQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDaEIseUJBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1dBQy9DO1NBQ0Y7T0FDRixNQUFNO0FBQ0wsWUFBSSxRQUFRLFlBQUEsQ0FBQzs7QUFFYixhQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRTtBQUN2QixjQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Ozs7QUFJL0IsZ0JBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQiwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDaEM7QUFDRCxvQkFBUSxHQUFHLEdBQUcsQ0FBQztBQUNmLGFBQUMsRUFBRSxDQUFDO1dBQ0w7U0FDRjtBQUNELFlBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQix1QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDWCxTQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCOztBQUVELFdBQU8sR0FBRyxDQUFDO0dBQ1osQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoiZWFjaC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/each.js\n ** module id = 72\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _exception = require('../exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nexports['default'] = function (instance) {\n instance.registerHelper('helperMissing', function () /* [args, ]options */{\n if (arguments.length === 1) {\n // A missing field in a {{foo}} construct.\n return undefined;\n } else {\n // Someone is actually trying to call something, blow up.\n throw new _exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n }\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozt5QkFBc0IsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsaUNBQWdDO0FBQ3ZFLFFBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O0FBRTFCLGFBQU8sU0FBUyxDQUFDO0tBQ2xCLE1BQU07O0FBRUwsWUFBTSwyQkFBYyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDdkY7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJoZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/helper-missing.js\n ** module id = 73\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n instance.registerHelper('if', function (conditional, options) {\n if (_utils.isFunction(conditional)) {\n conditional = conditional.call(this);\n }\n\n // Default behavior is to render the positive path if the value is truthy and not empty.\n // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) {\n return options.inverse(this);\n } else {\n return options.fn(this);\n }\n });\n\n instance.registerHelper('unless', function (conditional, options) {\n return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBa0MsVUFBVTs7cUJBRTdCLFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVMsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMzRCxRQUFJLGtCQUFXLFdBQVcsQ0FBQyxFQUFFO0FBQUUsaUJBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQUU7Ozs7O0FBS3RFLFFBQUksQUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxJQUFLLGVBQVEsV0FBVyxDQUFDLEVBQUU7QUFDdkUsYUFBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCLE1BQU07QUFDTCxhQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7R0FDRixDQUFDLENBQUM7O0FBRUgsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxXQUFXLEVBQUUsT0FBTyxFQUFFO0FBQy9ELFdBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztHQUN2SCxDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJpZi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNFbXB0eSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkgeyBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7IH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCkgfHwgaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pO1xuICB9KTtcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/if.js\n ** module id = 74\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n instance.registerHelper('log', function () /* message, options */{\n var args = [undefined],\n options = arguments[arguments.length - 1];\n for (var i = 0; i < arguments.length - 1; i++) {\n args.push(arguments[i]);\n }\n\n var level = 1;\n if (options.hash.level != null) {\n level = options.hash.level;\n } else if (options.data && options.data.level != null) {\n level = options.data.level;\n }\n args[0] = level;\n\n instance.log.apply(instance, args);\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0NBQWlDO0FBQzlELFFBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2xCLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsVUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6Qjs7QUFFRCxRQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxRQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtBQUM5QixXQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ3JELFdBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM1QjtBQUNELFFBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0FBRWhCLFlBQVEsQ0FBQyxHQUFHLE1BQUEsQ0FBWixRQUFRLEVBQVMsSUFBSSxDQUFDLENBQUM7R0FDeEIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIl19\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/log.js\n ** module id = 75\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (instance) {\n instance.registerHelper('lookup', function (obj, field) {\n return obj && obj[field];\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3JELFdBQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUMxQixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJsb29rdXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9va3VwJywgZnVuY3Rpb24ob2JqLCBmaWVsZCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iXX0=\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/lookup.js\n ** module id = 76\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('../utils');\n\nexports['default'] = function (instance) {\n instance.registerHelper('with', function (context, options) {\n if (_utils.isFunction(context)) {\n context = context.call(this);\n }\n\n var fn = options.fn;\n\n if (!_utils.isEmpty(context)) {\n var data = options.data;\n if (options.data && options.ids) {\n data = _utils.createFrame(options.data);\n data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]);\n }\n\n return fn(context, {\n data: data,\n blockParams: _utils.blockParams([context], [data && data.contextPath])\n });\n } else {\n return options.inverse(this);\n }\n });\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvd2l0aC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUErRSxVQUFVOztxQkFFMUUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLENBQUMsZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNyQixVQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLFVBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQy9CLFlBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ2hGOztBQUVELGFBQU8sRUFBRSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLEVBQUUsSUFBSTtBQUNWLG1CQUFXLEVBQUUsbUJBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7T0FDaEUsQ0FBQyxDQUFDO0tBQ0osTUFBTTtBQUNMLGFBQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QjtHQUNGLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6IndpdGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/helpers/with.js\n ** module id = 77\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\n\nvar _utils = require('./utils');\n\nvar logger = {\n methodMap: ['debug', 'info', 'warn', 'error'],\n level: 'info',\n\n // Maps a given level value to the `methodMap` indexes above.\n lookupLevel: function lookupLevel(level) {\n if (typeof level === 'string') {\n var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase());\n if (levelMap >= 0) {\n level = levelMap;\n } else {\n level = parseInt(level, 10);\n }\n }\n\n return level;\n },\n\n // Can be overridden in the host environment\n log: function log(level) {\n level = logger.lookupLevel(level);\n\n if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) {\n var method = logger.methodMap[level];\n if (!console[method]) {\n // eslint-disable-line no-console\n method = 'log';\n }\n\n for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n message[_key - 1] = arguments[_key];\n }\n\n console[method].apply(console, message); // eslint-disable-line no-console\n }\n }\n};\n\nexports['default'] = logger;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFzQixTQUFTOztBQUUvQixJQUFJLE1BQU0sR0FBRztBQUNYLFdBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUM3QyxPQUFLLEVBQUUsTUFBTTs7O0FBR2IsYUFBVyxFQUFFLHFCQUFTLEtBQUssRUFBRTtBQUMzQixRQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUM3QixVQUFJLFFBQVEsR0FBRyxlQUFRLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUQsVUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxRQUFRLENBQUM7T0FDbEIsTUFBTTtBQUNMLGFBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO09BQzdCO0tBQ0Y7O0FBRUQsV0FBTyxLQUFLLENBQUM7R0FDZDs7O0FBR0QsS0FBRyxFQUFFLGFBQVMsS0FBSyxFQUFjO0FBQy9CLFNBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVsQyxRQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDL0UsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxVQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFOztBQUNwQixjQUFNLEdBQUcsS0FBSyxDQUFDO09BQ2hCOzt3Q0FQbUIsT0FBTztBQUFQLGVBQU87OztBQVEzQixhQUFPLENBQUMsTUFBTSxPQUFDLENBQWYsT0FBTyxFQUFZLE9BQU8sQ0FBQyxDQUFDO0tBQzdCO0dBQ0Y7Q0FDRixDQUFDOztxQkFFYSxNQUFNIiwiZmlsZSI6ImxvZ2dlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIG1ldGhvZCA9ICdsb2cnO1xuICAgICAgfVxuICAgICAgY29uc29sZVttZXRob2RdKC4uLm1lc3NhZ2UpOyAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlcjtcbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/logger.js\n ** module id = 78\n ** module chunks = 0 3\n **/","/* global window */\n'use strict';\n\nexports.__esModule = true;\n\nexports['default'] = function (Handlebars) {\n /* istanbul ignore next */\n var root = typeof global !== 'undefined' ? global : window,\n $Handlebars = root.Handlebars;\n /* istanbul ignore next */\n Handlebars.noConflict = function () {\n if (root.Handlebars === Handlebars) {\n root.Handlebars = $Handlebars;\n }\n return Handlebars;\n };\n};\n\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O3FCQUNlLFVBQVMsVUFBVSxFQUFFOztBQUVsQyxNQUFJLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU07TUFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0FBRWxDLFlBQVUsQ0FBQyxVQUFVLEdBQUcsWUFBVztBQUNqQyxRQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO0FBQ2xDLFVBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0tBQy9CO0FBQ0QsV0FBTyxVQUFVLENBQUM7R0FDbkIsQ0FBQztDQUNIIiwiZmlsZSI6Im5vLWNvbmZsaWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBsZXQgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgICByZXR1cm4gSGFuZGxlYmFycztcbiAgfTtcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/no-conflict.js\n ** module id = 79\n ** module chunks = 0 3\n **/","'use strict';\n\nexports.__esModule = true;\nexports.checkRevision = checkRevision;\nexports.template = template;\nexports.wrapProgram = wrapProgram;\nexports.resolvePartial = resolvePartial;\nexports.invokePartial = invokePartial;\nexports.noop = noop;\n// istanbul ignore next\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\n// istanbul ignore next\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\nvar _utils = require('./utils');\n\nvar Utils = _interopRequireWildcard(_utils);\n\nvar _exception = require('./exception');\n\nvar _exception2 = _interopRequireDefault(_exception);\n\nvar _base = require('./base');\n\nfunction checkRevision(compilerInfo) {\n var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n currentRevision = _base.COMPILER_REVISION;\n\n if (compilerRevision !== currentRevision) {\n if (compilerRevision < currentRevision) {\n var runtimeVersions = _base.REVISION_CHANGES[currentRevision],\n compilerVersions = _base.REVISION_CHANGES[compilerRevision];\n throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n } else {\n // Use the embedded version info since the runtime doesn't know about this revision yet\n throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n }\n }\n}\n\nfunction template(templateSpec, env) {\n /* istanbul ignore next */\n if (!env) {\n throw new _exception2['default']('No environment passed to template');\n }\n if (!templateSpec || !templateSpec.main) {\n throw new _exception2['default']('Unknown template object: ' + typeof templateSpec);\n }\n\n templateSpec.main.decorator = templateSpec.main_d;\n\n // Note: Using env.VM references rather than local var references throughout this section to allow\n // for external users to override these as psuedo-supported APIs.\n env.VM.checkRevision(templateSpec.compiler);\n\n function invokePartialWrapper(partial, context, options) {\n if (options.hash) {\n context = Utils.extend({}, context, options.hash);\n if (options.ids) {\n options.ids[0] = true;\n }\n }\n\n partial = env.VM.resolvePartial.call(this, partial, context, options);\n var result = env.VM.invokePartial.call(this, partial, context, options);\n\n if (result == null && env.compile) {\n options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n result = options.partials[options.name](context, options);\n }\n if (result != null) {\n if (options.indent) {\n var lines = result.split('\\n');\n for (var i = 0, l = lines.length; i < l; i++) {\n if (!lines[i] && i + 1 === l) {\n break;\n }\n\n lines[i] = options.indent + lines[i];\n }\n result = lines.join('\\n');\n }\n return result;\n } else {\n throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n }\n }\n\n // Just add water\n var container = {\n strict: function strict(obj, name) {\n if (!(name in obj)) {\n throw new _exception2['default']('\"' + name + '\" not defined in ' + obj);\n }\n return obj[name];\n },\n lookup: function lookup(depths, name) {\n var len = depths.length;\n for (var i = 0; i < len; i++) {\n if (depths[i] && depths[i][name] != null) {\n return depths[i][name];\n }\n }\n },\n lambda: function lambda(current, context) {\n return typeof current === 'function' ? current.call(context) : current;\n },\n\n escapeExpression: Utils.escapeExpression,\n invokePartial: invokePartialWrapper,\n\n fn: function fn(i) {\n var ret = templateSpec[i];\n ret.decorator = templateSpec[i + '_d'];\n return ret;\n },\n\n programs: [],\n program: function program(i, data, declaredBlockParams, blockParams, depths) {\n var programWrapper = this.programs[i],\n fn = this.fn(i);\n if (data || depths || blockParams || declaredBlockParams) {\n programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n } else if (!programWrapper) {\n programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n }\n return programWrapper;\n },\n\n data: function data(value, depth) {\n while (value && depth--) {\n value = value._parent;\n }\n return value;\n },\n merge: function merge(param, common) {\n var obj = param || common;\n\n if (param && common && param !== common) {\n obj = Utils.extend({}, common, param);\n }\n\n return obj;\n },\n\n noop: env.VM.noop,\n compilerInfo: templateSpec.compiler\n };\n\n function ret(context) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var data = options.data;\n\n ret._setup(options);\n if (!options.partial && templateSpec.useData) {\n data = initData(context, data);\n }\n var depths = undefined,\n blockParams = templateSpec.useBlockParams ? [] : undefined;\n if (templateSpec.useDepths) {\n if (options.depths) {\n depths = context !== options.depths[0] ? [context].concat(options.depths) : options.depths;\n } else {\n depths = [context];\n }\n }\n\n function main(context /*, options*/) {\n return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths);\n }\n main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams);\n return main(context, options);\n }\n ret.isTop = true;\n\n ret._setup = function (options) {\n if (!options.partial) {\n container.helpers = container.merge(options.helpers, env.helpers);\n\n if (templateSpec.usePartial) {\n container.partials = container.merge(options.partials, env.partials);\n }\n if (templateSpec.usePartial || templateSpec.useDecorators) {\n container.decorators = container.merge(options.decorators, env.decorators);\n }\n } else {\n container.helpers = options.helpers;\n container.partials = options.partials;\n container.decorators = options.decorators;\n }\n };\n\n ret._child = function (i, data, blockParams, depths) {\n if (templateSpec.useBlockParams && !blockParams) {\n throw new _exception2['default']('must pass block params');\n }\n if (templateSpec.useDepths && !depths) {\n throw new _exception2['default']('must pass parent depths');\n }\n\n return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n };\n return ret;\n}\n\nfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n function prog(context) {\n var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\n var currentDepths = depths;\n if (depths && context !== depths[0]) {\n currentDepths = [context].concat(depths);\n }\n\n return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths);\n }\n\n prog = executeDecorators(fn, prog, container, depths, data, blockParams);\n\n prog.program = i;\n prog.depth = depths ? depths.length : 0;\n prog.blockParams = declaredBlockParams || 0;\n return prog;\n}\n\nfunction resolvePartial(partial, context, options) {\n if (!partial) {\n if (options.name === '@partial-block') {\n partial = options.data['partial-block'];\n } else {\n partial = options.partials[options.name];\n }\n } else if (!partial.call && !options.name) {\n // This is a dynamic partial that returned a string\n options.name = partial;\n partial = options.partials[partial];\n }\n return partial;\n}\n\nfunction invokePartial(partial, context, options) {\n options.partial = true;\n if (options.ids) {\n options.data.contextPath = options.ids[0] || options.data.contextPath;\n }\n\n var partialBlock = undefined;\n if (options.fn && options.fn !== noop) {\n options.data = _base.createFrame(options.data);\n partialBlock = options.data['partial-block'] = options.fn;\n\n if (partialBlock.partials) {\n options.partials = Utils.extend({}, options.partials, partialBlock.partials);\n }\n }\n\n if (partial === undefined && partialBlock) {\n partial = partialBlock;\n }\n\n if (partial === undefined) {\n throw new _exception2['default']('The partial ' + options.name + ' could not be found');\n } else if (partial instanceof Function) {\n return partial(context, options);\n }\n}\n\nfunction noop() {\n return '';\n}\n\nfunction initData(context, data) {\n if (!data || !('root' in data)) {\n data = data ? _base.createFrame(data) : {};\n data.root = context;\n }\n return data;\n}\n\nfunction executeDecorators(fn, prog, container, depths, data, blockParams) {\n if (fn.decorator) {\n var props = {};\n prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths);\n Utils.extend(prog, props);\n }\n return prog;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQXVCLFNBQVM7O0lBQXBCLEtBQUs7O3lCQUNLLGFBQWE7Ozs7b0JBQzhCLFFBQVE7O0FBRWxFLFNBQVMsYUFBYSxDQUFDLFlBQVksRUFBRTtBQUMxQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztNQUN2RCxlQUFlLDBCQUFvQixDQUFDOztBQUUxQyxNQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRTtBQUN4QyxRQUFJLGdCQUFnQixHQUFHLGVBQWUsRUFBRTtBQUN0QyxVQUFNLGVBQWUsR0FBRyx1QkFBaUIsZUFBZSxDQUFDO1VBQ25ELGdCQUFnQixHQUFHLHVCQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVELFlBQU0sMkJBQWMseUZBQXlGLEdBQ3ZHLHFEQUFxRCxHQUFHLGVBQWUsR0FBRyxtREFBbUQsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNoSyxNQUFNOztBQUVMLFlBQU0sMkJBQWMsd0ZBQXdGLEdBQ3RHLGlEQUFpRCxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNuRjtHQUNGO0NBQ0Y7O0FBRU0sU0FBUyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTs7QUFFMUMsTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNSLFVBQU0sMkJBQWMsbUNBQW1DLENBQUMsQ0FBQztHQUMxRDtBQUNELE1BQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ3ZDLFVBQU0sMkJBQWMsMkJBQTJCLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQztHQUN4RTs7QUFFRCxjQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDOzs7O0FBSWxELEtBQUcs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U0FBUyxJQUFJLEdBQUc7QUFBRSxTQUFPLEVBQUUsQ0FBQztDQUFFOztBQUVyQyxTQUFTLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO0FBQy9CLE1BQUksQ0FBQyxJQUFJLElBQUksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFBLEFBQUMsRUFBRTtBQUM5QixRQUFJLEdBQUcsSUFBSSxHQUFHLGtCQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNyQyxRQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztHQUNyQjtBQUNELFNBQU8sSUFBSSxDQUFDO0NBQ2I7O0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtBQUN6RSxNQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUU7QUFDaEIsUUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ2YsUUFBSSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzVGLFNBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0dBQzNCO0FBQ0QsU0FBTyxJQUFJLENBQUM7Q0FDYiIsImZpbGUiOiJydW50aW1lLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vZXhjZXB0aW9uJztcbmltcG9ydCB7IENPTVBJTEVSX1JFVklTSU9OLCBSRVZJU0lPTl9DSEFOR0VTLCBjcmVhdGVGcmFtZSB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1JldmlzaW9uKGNvbXBpbGVySW5mbykge1xuICBjb25zdCBjb21waWxlclJldmlzaW9uID0gY29tcGlsZXJJbmZvICYmIGNvbXBpbGVySW5mb1swXSB8fCAxLFxuICAgICAgICBjdXJyZW50UmV2aXNpb24gPSBDT01QSUxFUl9SRVZJU0lPTjtcblxuICBpZiAoY29tcGlsZXJSZXZpc2lvbiAhPT0gY3VycmVudFJldmlzaW9uKSB7XG4gICAgaWYgKGNvbXBpbGVyUmV2aXNpb24gPCBjdXJyZW50UmV2aXNpb24pIHtcbiAgICAgIGNvbnN0IHJ1bnRpbWVWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY3VycmVudFJldmlzaW9uXSxcbiAgICAgICAgICAgIGNvbXBpbGVyVmVyc2lvbnMgPSBSRVZJU0lPTl9DSEFOR0VTW2NvbXBpbGVyUmV2aXNpb25dO1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIHJ1bnRpbWVWZXJzaW9ucyArICcpIG9yIGRvd25ncmFkZSB5b3VyIHJ1bnRpbWUgdG8gYW4gb2xkZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVyVmVyc2lvbnMgKyAnKS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIHRoZSBlbWJlZGRlZCB2ZXJzaW9uIGluZm8gc2luY2UgdGhlIHJ1bnRpbWUgZG9lc24ndCBrbm93IGFib3V0IHRoaXMgcmV2aXNpb24geWV0XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgSGFuZGxlYmFycyB0aGFuIHRoZSBjdXJyZW50IHJ1bnRpbWUuICcgK1xuICAgICAgICAgICAgJ1BsZWFzZSB1cGRhdGUgeW91ciBydW50aW1lIHRvIGEgbmV3ZXIgdmVyc2lvbiAoJyArIGNvbXBpbGVySW5mb1sxXSArICcpLicpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGVtcGxhdGUodGVtcGxhdGVTcGVjLCBlbnYpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKCFlbnYpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGUnKTtcbiAgfVxuICBpZiAoIXRlbXBsYXRlU3BlYyB8fCAhdGVtcGxhdGVTcGVjLm1haW4pIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmtub3duIHRlbXBsYXRlIG9iamVjdDogJyArIHR5cGVvZiB0ZW1wbGF0ZVNwZWMpO1xuICB9XG5cbiAgdGVtcGxhdGVTcGVjLm1haW4uZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjLm1haW5fZDtcblxuICAvLyBOb3RlOiBVc2luZyBlbnYuVk0gcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBsb2NhbCB2YXIgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoaXMgc2VjdGlvbiB0byBhbGxvd1xuICAvLyBmb3IgZXh0ZXJuYWwgdXNlcnMgdG8gb3ZlcnJpZGUgdGhlc2UgYXMgcHN1ZWRvLXN1cHBvcnRlZCBBUElzLlxuICBlbnYuVk0uY2hlY2tSZXZpc2lvbih0ZW1wbGF0ZVNwZWMuY29tcGlsZXIpO1xuXG4gIGZ1bmN0aW9uIGludm9rZVBhcnRpYWxXcmFwcGVyKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5oYXNoKSB7XG4gICAgICBjb250ZXh0ID0gVXRpbHMuZXh0ZW5kKHt9LCBjb250ZXh0LCBvcHRpb25zLmhhc2gpO1xuICAgICAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIG9wdGlvbnMuaWRzWzBdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJ0aWFsID0gZW52LlZNLnJlc29sdmVQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG4gICAgbGV0IHJlc3VsdCA9IGVudi5WTS5pbnZva2VQYXJ0aWFsLmNhbGwodGhpcywgcGFydGlhbCwgY29udGV4dCwgb3B0aW9ucyk7XG5cbiAgICBpZiAocmVzdWx0ID09IG51bGwgJiYgZW52LmNvbXBpbGUpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXSA9IGVudi5jb21waWxlKHBhcnRpYWwsIHRlbXBsYXRlU3BlYy5jb21waWxlck9wdGlvbnMsIGVudik7XG4gICAgICByZXN1bHQgPSBvcHRpb25zLnBhcnRpYWxzW29wdGlvbnMubmFtZV0oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgaWYgKG9wdGlvbnMuaW5kZW50KSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHJlc3VsdC5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFsaW5lc1tpXSAmJiBpICsgMSA9PT0gbCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGluZXNbaV0gPSBvcHRpb25zLmluZGVudCArIGxpbmVzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGNvbXBpbGVkIHdoZW4gcnVubmluZyBpbiBydW50aW1lLW9ubHkgbW9kZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEp1c3QgYWRkIHdhdGVyXG4gIGxldCBjb250YWluZXIgPSB7XG4gICAgc3RyaWN0OiBmdW5jdGlvbihvYmosIG5hbWUpIHtcbiAgICAgIGlmICghKG5hbWUgaW4gb2JqKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdcIicgKyBuYW1lICsgJ1wiIG5vdCBkZWZpbmVkIGluICcgKyBvYmopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialtuYW1lXTtcbiAgICB9LFxuICAgIGxvb2t1cDogZnVuY3Rpb24oZGVwdGhzLCBuYW1lKSB7XG4gICAgICBjb25zdCBsZW4gPSBkZXB0aHMubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZGVwdGhzW2ldICYmIGRlcHRoc1tpXVtuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGRlcHRoc1tpXVtuYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbGFtYmRhOiBmdW5jdGlvbihjdXJyZW50LCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdHlwZW9mIGN1cnJlbnQgPT09ICdmdW5jdGlvbicgPyBjdXJyZW50LmNhbGwoY29udGV4dCkgOiBjdXJyZW50O1xuICAgIH0sXG5cbiAgICBlc2NhcGVFeHByZXNzaW9uOiBVdGlscy5lc2NhcGVFeHByZXNzaW9uLFxuICAgIGludm9rZVBhcnRpYWw6IGludm9rZVBhcnRpYWxXcmFwcGVyLFxuXG4gICAgZm46IGZ1bmN0aW9uKGkpIHtcbiAgICAgIGxldCByZXQgPSB0ZW1wbGF0ZVNwZWNbaV07XG4gICAgICByZXQuZGVjb3JhdG9yID0gdGVtcGxhdGVTcGVjW2kgKyAnX2QnXTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfSxcblxuICAgIHByb2dyYW1zOiBbXSxcbiAgICBwcm9ncmFtOiBmdW5jdGlvbihpLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gICAgICBsZXQgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldLFxuICAgICAgICAgIGZuID0gdGhpcy5mbihpKTtcbiAgICAgIGlmIChkYXRhIHx8IGRlcHRocyB8fCBibG9ja1BhcmFtcyB8fCBkZWNsYXJlZEJsb2NrUGFyYW1zKSB7XG4gICAgICAgIHByb2dyYW1XcmFwcGVyID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgICAgfSBlbHNlIGlmICghcHJvZ3JhbVdyYXBwZXIpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB0aGlzLnByb2dyYW1zW2ldID0gd3JhcFByb2dyYW0odGhpcywgaSwgZm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb2dyYW1XcmFwcGVyO1xuICAgIH0sXG5cbiAgICBkYXRhOiBmdW5jdGlvbih2YWx1ZSwgZGVwdGgpIHtcbiAgICAgIHdoaWxlICh2YWx1ZSAmJiBkZXB0aC0tKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuX3BhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICAgIG1lcmdlOiBmdW5jdGlvbihwYXJhbSwgY29tbW9uKSB7XG4gICAgICBsZXQgb2JqID0gcGFyYW0gfHwgY29tbW9uO1xuXG4gICAgICBpZiAocGFyYW0gJiYgY29tbW9uICYmIChwYXJhbSAhPT0gY29tbW9uKSkge1xuICAgICAgICBvYmogPSBVdGlscy5leHRlbmQoe30sIGNvbW1vbiwgcGFyYW0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqO1xuICAgIH0sXG5cbiAgICBub29wOiBlbnYuVk0ubm9vcCxcbiAgICBjb21waWxlckluZm86IHRlbXBsYXRlU3BlYy5jb21waWxlclxuICB9O1xuXG4gIGZ1bmN0aW9uIHJldChjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuICAgIHJldC5fc2V0dXAob3B0aW9ucyk7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwgJiYgdGVtcGxhdGVTcGVjLnVzZURhdGEpIHtcbiAgICAgIGRhdGEgPSBpbml0RGF0YShjb250ZXh0LCBkYXRhKTtcbiAgICB9XG4gICAgbGV0IGRlcHRocyxcbiAgICAgICAgYmxvY2tQYXJhbXMgPSB0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocykge1xuICAgICAgaWYgKG9wdGlvbnMuZGVwdGhzKSB7XG4gICAgICAgIGRlcHRocyA9IGNvbnRleHQgIT09IG9wdGlvbnMuZGVwdGhzWzBdID8gW2NvbnRleHRdLmNvbmNhdChvcHRpb25zLmRlcHRocykgOiBvcHRpb25zLmRlcHRocztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlcHRocyA9IFtjb250ZXh0XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWluKGNvbnRleHQvKiwgb3B0aW9ucyovKSB7XG4gICAgICByZXR1cm4gJycgKyB0ZW1wbGF0ZVNwZWMubWFpbihjb250YWluZXIsIGNvbnRleHQsIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIH1cbiAgICBtYWluID0gZXhlY3V0ZURlY29yYXRvcnModGVtcGxhdGVTcGVjLm1haW4sIG1haW4sIGNvbnRhaW5lciwgb3B0aW9ucy5kZXB0aHMgfHwgW10sIGRhdGEsIGJsb2NrUGFyYW1zKTtcbiAgICByZXR1cm4gbWFpbihjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxuICByZXQuaXNUb3AgPSB0cnVlO1xuXG4gIHJldC5fc2V0dXAgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgaWYgKCFvcHRpb25zLnBhcnRpYWwpIHtcbiAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuaGVscGVycywgZW52LmhlbHBlcnMpO1xuXG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwpIHtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMucGFydGlhbHMsIGVudi5wYXJ0aWFscyk7XG4gICAgICB9XG4gICAgICBpZiAodGVtcGxhdGVTcGVjLnVzZVBhcnRpYWwgfHwgdGVtcGxhdGVTcGVjLnVzZURlY29yYXRvcnMpIHtcbiAgICAgICAgY29udGFpbmVyLmRlY29yYXRvcnMgPSBjb250YWluZXIubWVyZ2Uob3B0aW9ucy5kZWNvcmF0b3JzLCBlbnYuZGVjb3JhdG9ycyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5oZWxwZXJzID0gb3B0aW9ucy5oZWxwZXJzO1xuICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3B0aW9ucy5wYXJ0aWFscztcbiAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gb3B0aW9ucy5kZWNvcmF0b3JzO1xuICAgIH1cbiAgfTtcblxuICByZXQuX2NoaWxkID0gZnVuY3Rpb24oaSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocykge1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlQmxvY2tQYXJhbXMgJiYgIWJsb2NrUGFyYW1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgYmxvY2sgcGFyYW1zJyk7XG4gICAgfVxuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzICYmICFkZXB0aHMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ211c3QgcGFzcyBwYXJlbnQgZGVwdGhzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgdGVtcGxhdGVTcGVjW2ldLCBkYXRhLCAwLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBQcm9ncmFtKGNvbnRhaW5lciwgaSwgZm4sIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgZnVuY3Rpb24gcHJvZyhjb250ZXh0LCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgY3VycmVudERlcHRocyA9IGRlcHRocztcbiAgICBpZiAoZGVwdGhzICYmIGNvbnRleHQgIT09IGRlcHRoc1swXSkge1xuICAgICAgY3VycmVudERlcHRocyA9IFtjb250ZXh0XS5jb25jYXQoZGVwdGhzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oY29udGFpbmVyLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLFxuICAgICAgICBvcHRpb25zLmRhdGEgfHwgZGF0YSxcbiAgICAgICAgYmxvY2tQYXJhbXMgJiYgW29wdGlvbnMuYmxvY2tQYXJhbXNdLmNvbmNhdChibG9ja1BhcmFtcyksXG4gICAgICAgIGN1cnJlbnREZXB0aHMpO1xuICB9XG5cbiAgcHJvZyA9IGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpO1xuXG4gIHByb2cucHJvZ3JhbSA9IGk7XG4gIHByb2cuZGVwdGggPSBkZXB0aHMgPyBkZXB0aHMubGVuZ3RoIDogMDtcbiAgcHJvZy5ibG9ja1BhcmFtcyA9IGRlY2xhcmVkQmxvY2tQYXJhbXMgfHwgMDtcbiAgcmV0dXJuIHByb2c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIGlmICghcGFydGlhbCkge1xuICAgIGlmIChvcHRpb25zLm5hbWUgPT09ICdAcGFydGlhbC1ibG9jaycpIHtcbiAgICAgIHBhcnRpYWwgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXBhcnRpYWwuY2FsbCAmJiAhb3B0aW9ucy5uYW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGR5bmFtaWMgcGFydGlhbCB0aGF0IHJldHVybmVkIGEgc3RyaW5nXG4gICAgb3B0aW9ucy5uYW1lID0gcGFydGlhbDtcbiAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1twYXJ0aWFsXTtcbiAgfVxuICByZXR1cm4gcGFydGlhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZVBhcnRpYWwocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICBvcHRpb25zLnBhcnRpYWwgPSB0cnVlO1xuICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICBvcHRpb25zLmRhdGEuY29udGV4dFBhdGggPSBvcHRpb25zLmlkc1swXSB8fCBvcHRpb25zLmRhdGEuY29udGV4dFBhdGg7XG4gIH1cblxuICBsZXQgcGFydGlhbEJsb2NrO1xuICBpZiAob3B0aW9ucy5mbiAmJiBvcHRpb25zLmZuICE9PSBub29wKSB7XG4gICAgb3B0aW9ucy5kYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICBwYXJ0aWFsQmxvY2sgPSBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IG9wdGlvbnMuZm47XG5cbiAgICBpZiAocGFydGlhbEJsb2NrLnBhcnRpYWxzKSB7XG4gICAgICBvcHRpb25zLnBhcnRpYWxzID0gVXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zLnBhcnRpYWxzLCBwYXJ0aWFsQmxvY2sucGFydGlhbHMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQgJiYgcGFydGlhbEJsb2NrKSB7XG4gICAgcGFydGlhbCA9IHBhcnRpYWxCbG9jaztcbiAgfVxuXG4gIGlmIChwYXJ0aWFsID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgZm91bmQnKTtcbiAgfSBlbHNlIGlmIChwYXJ0aWFsIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gcGFydGlhbChjb250ZXh0LCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCgpIHsgcmV0dXJuICcnOyB9XG5cbmZ1bmN0aW9uIGluaXREYXRhKGNvbnRleHQsIGRhdGEpIHtcbiAgaWYgKCFkYXRhIHx8ICEoJ3Jvb3QnIGluIGRhdGEpKSB7XG4gICAgZGF0YSA9IGRhdGEgPyBjcmVhdGVGcmFtZShkYXRhKSA6IHt9O1xuICAgIGRhdGEucm9vdCA9IGNvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVEZWNvcmF0b3JzKGZuLCBwcm9nLCBjb250YWluZXIsIGRlcHRocywgZGF0YSwgYmxvY2tQYXJhbXMpIHtcbiAgaWYgKGZuLmRlY29yYXRvcikge1xuICAgIGxldCBwcm9wcyA9IHt9O1xuICAgIHByb2cgPSBmbi5kZWNvcmF0b3IocHJvZywgcHJvcHMsIGNvbnRhaW5lciwgZGVwdGhzICYmIGRlcHRoc1swXSwgZGF0YSwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgVXRpbHMuZXh0ZW5kKHByb2csIHByb3BzKTtcbiAgfVxuICByZXR1cm4gcHJvZztcbn1cbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/runtime.js\n ** module id = 80\n ** module chunks = 0 3\n **/","// Build out our basic SafeString type\n'use strict';\n\nexports.__esModule = true;\nfunction SafeString(string) {\n this.string = string;\n}\n\nSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n return '' + this.string;\n};\n\nexports['default'] = SafeString;\nmodule.exports = exports['default'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDMUIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEI7O0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBVztBQUN2RSxTQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3pCLENBQUM7O3FCQUVhLFVBQVUiLCJmaWxlIjoic2FmZS1zdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiJdfQ==\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/handlebars/dist/cjs/handlebars/safe-string.js\n ** module id = 81\n ** module chunks = 0 3\n **/","define([\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/editable-text\",\n], function( baseMVC, _l ){\n// =============================================================================\n/** A view on any model that has a 'annotation' attribute\n */\nvar AnnotationEditor = Backbone.View\n .extend( baseMVC.LoggableMixin )\n .extend( baseMVC.HiddenUntilActivatedViewMixin ).extend({\n\n tagName : 'div',\n className : 'annotation-display',\n\n /** Set up listeners, parse options */\n initialize : function( options ){\n options = options || {};\n this.tooltipConfig = options.tooltipConfig || { placement: 'bottom' };\n //console.debug( this, options );\n // only listen to the model only for changes to annotations\n this.listenTo( this.model, 'change:annotation', function(){\n this.render();\n });\n this.hiddenUntilActivated( options.$activator, options );\n },\n\n /** Build the DOM elements, call select to on the created input, and set up behaviors */\n render : function(){\n var view = this;\n this.$el.html( this._template() );\n this.$el.find( \"[title]\" ).tooltip( this.tooltipConfig );\n\n //TODO: handle empties better\n this.$annotation().make_text_editable({\n use_textarea: true,\n on_finish: function( newAnnotation ){\n view.$annotation().text( newAnnotation );\n view.model.save({ annotation: newAnnotation }, { silent: true })\n .fail( function(){\n view.$annotation().text( view.model.previous( 'annotation' ) );\n });\n }\n });\n return this;\n },\n\n /** @returns {String} the html text used to build the view's DOM */\n _template : function(){\n var annotation = this.model.get( 'annotation' );\n //if( !annotation ){\n // //annotation = [ '', _l( 'Click to add an annotation' ), '' ].join( '' );\n // annotation = [ '' ].join( '' );\n //}\n return [\n //TODO: make prompt optional\n '',\n // set up initial tags by adding as CSV to input vals (necc. to init select2)\n '
                            ',\n _.escape( annotation ),\n '
                            '\n ].join( '' );\n },\n\n /** @returns {jQuery} the main element for this view */\n $annotation : function(){\n return this.$el.find( '.annotation' );\n },\n\n /** shut down event listeners and remove this view's DOM */\n remove : function(){\n this.$annotation.off();\n this.stopListening( this.model );\n Backbone.View.prototype.remove.call( this );\n },\n\n /** string rep */\n toString : function(){ return [ 'AnnotationEditor(', this.model + '', ')' ].join(''); }\n});\n// =============================================================================\nreturn {\n AnnotationEditor : AnnotationEditor\n};\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/annotation.js\n ** module id = 92\n ** module chunks = 3\n **/","define([\n \"mvc/list/list-view\",\n \"mvc/collection/collection-model\",\n \"mvc/collection/collection-li\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( LIST_VIEW, DC_MODEL, DC_LI, BASE_MVC, _l ){\n\nvar logNamespace = 'collections';\n/* =============================================================================\nTODO:\n\n============================================================================= */\n/** @class non-editable, read-only View/Controller for a dataset collection.\n */\nvar _super = LIST_VIEW.ModelListPanel;\nvar CollectionView = _super.extend(\n/** @lends CollectionView.prototype */{\n //MODEL is either a DatasetCollection (or subclass) or a DatasetCollectionElement (list of pairs)\n _logNamespace : logNamespace,\n\n className : _super.prototype.className + ' dataset-collection-panel',\n\n /** sub view class used for datasets */\n DatasetDCEViewClass : DC_LI.DatasetDCEListItemView,\n /** sub view class used for nested collections */\n NestedDCDCEViewClass: DC_LI.NestedDCDCEListItemView,\n /** key of attribute in model to assign to this.collection */\n modelCollectionKey : 'elements',\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events\n * @param {Object} attributes optional settings for the panel\n */\n initialize : function( attributes ){\n _super.prototype.initialize.call( this, attributes );\n this.linkTarget = attributes.linkTarget || '_blank';\n\n this.hasUser = attributes.hasUser;\n /** A stack of panels that currently cover or hide this panel */\n this.panelStack = [];\n /** The text of the link to go back to the panel containing this one */\n this.parentName = attributes.parentName;\n /** foldout or drilldown */\n this.foldoutStyle = attributes.foldoutStyle || 'foldout';\n },\n\n // ------------------------------------------------------------------------ sub-views\n /** In this override, use model.getVisibleContents */\n _filterCollection : function(){\n//TODO: should *not* be model.getVisibleContents - visibility is not model related\n return this.model.getVisibleContents();\n },\n\n /** override to return proper view class based on element_type */\n _getItemViewClass : function( model ){\n //this.debug( this + '._getItemViewClass:', model );\n//TODO: subclasses use DCEViewClass - but are currently unused - decide\n switch( model.get( 'element_type' ) ){\n case 'hda':\n return this.DatasetDCEViewClass;\n case 'dataset_collection':\n return this.NestedDCDCEViewClass;\n }\n throw new TypeError( 'Unknown element type:', model.get( 'element_type' ) );\n },\n\n /** override to add link target and anon */\n _getItemViewOptions : function( model ){\n var options = _super.prototype._getItemViewOptions.call( this, model );\n return _.extend( options, {\n linkTarget : this.linkTarget,\n hasUser : this.hasUser,\n//TODO: could move to only nested: list:paired\n foldoutStyle : this.foldoutStyle\n });\n },\n\n // ------------------------------------------------------------------------ collection sub-views\n /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n _setUpItemViewListeners : function( view ){\n var panel = this;\n _super.prototype._setUpItemViewListeners.call( panel, view );\n\n // use pub-sub to: handle drilldown expansion and collapse\n view.on( 'expanded:drilldown', function( v, drilldown ){\n this._expandDrilldownPanel( drilldown );\n }, this );\n view.on( 'collapsed:drilldown', function( v, drilldown ){\n this._collapseDrilldownPanel( drilldown );\n }, this );\n return this;\n },\n\n /** Handle drill down by hiding this panels list and controls and showing the sub-panel */\n _expandDrilldownPanel : function( drilldown ){\n this.panelStack.push( drilldown );\n // hide this panel's controls and list, set the name for back navigation, and attach to the $el\n this.$( '> .controls' ).add( this.$list() ).hide();\n drilldown.parentName = this.model.get( 'name' );\n this.$el.append( drilldown.render().$el );\n },\n\n /** Handle drilldown close by freeing the panel and re-rendering this panel */\n _collapseDrilldownPanel : function( drilldown ){\n this.panelStack.pop();\n this.render();\n },\n\n // ------------------------------------------------------------------------ panel events\n /** event map */\n events : {\n 'click .navigation .back' : 'close'\n },\n\n /** close/remove this collection panel */\n close : function( event ){\n this.$el.remove();\n this.trigger( 'close' );\n },\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'CollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//------------------------------------------------------------------------------ TEMPLATES\nCollectionView.prototype.templates = (function(){\n\n var controlsTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n '',\n\n '
                            ',\n '
                            <%- collection.name || collection.element_identifier %>
                            ',\n '
                            ',\n//TODO: remove logic from template\n '<% if( collection.collection_type === \"list\" ){ %>',\n _l( 'a list of datasets' ),\n '<% } else if( collection.collection_type === \"paired\" ){ %>',\n _l( 'a pair of datasets' ),\n '<% } else if( collection.collection_type === \"list:paired\" ){ %>',\n _l( 'a list of paired datasets' ),\n '<% } %>',\n '
                            ',\n '
                            ',\n '
                            '\n ], 'collection' );\n\n return _.extend( _.clone( _super.prototype.templates ), {\n controls : controlsTemplate\n });\n}());\n\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar ListCollectionView = CollectionView.extend(\n/** @lends ListCollectionView.prototype */{\n\n //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n /** sub view class used for datasets */\n DatasetDCEViewClass : DC_LI.DatasetDCEListItemView,\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'ListCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar PairCollectionView = ListCollectionView.extend(\n/** @lends PairCollectionView.prototype */{\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'PairCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar ListOfPairsCollectionView = CollectionView.extend(\n/** @lends ListOfPairsCollectionView.prototype */{\n\n //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n /** sub view class used for nested collections */\n NestedDCDCEViewClass : DC_LI.NestedDCDCEListItemView.extend({\n foldoutPanelClass : PairCollectionView\n }),\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'ListOfPairsCollectionView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//==============================================================================\n return {\n CollectionView : CollectionView,\n ListCollectionView : ListCollectionView,\n PairCollectionView : PairCollectionView,\n ListOfPairsCollectionView : ListOfPairsCollectionView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-view.js\n ** module id = 93\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/states\",\n \"mvc/dataset/dataset-li\",\n \"mvc/tag\",\n \"mvc/annotation\",\n \"ui/fa-icon-button\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( STATES, DATASET_LI, TAGS, ANNOTATIONS, faIconButton, BASE_MVC, _l ){\n//==============================================================================\nvar _super = DATASET_LI.DatasetListItemView;\n/** @class Editing view for DatasetAssociation.\n */\nvar DatasetListItemEdit = _super.extend(\n/** @lends DatasetListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** set up: options */\n initialize : function( attributes ){\n _super.prototype.initialize.call( this, attributes );\n//TODO: shouldn't this err if false?\n this.hasUser = attributes.hasUser;\n\n /** allow user purge of dataset files? */\n this.purgeAllowed = attributes.purgeAllowed || false;\n\n //TODO: move to HiddenUntilActivatedViewMixin\n /** should the tags editor be shown or hidden initially? */\n this.tagsEditorShown = attributes.tagsEditorShown || false;\n /** should the tags editor be shown or hidden initially? */\n this.annotationEditorShown = attributes.annotationEditorShown || false;\n },\n\n // ......................................................................... titlebar actions\n /** In this override, add the other two primary actions: edit and delete */\n _renderPrimaryActions : function(){\n var actions = _super.prototype._renderPrimaryActions.call( this );\n if( this.model.get( 'state' ) === STATES.NOT_VIEWABLE ){\n return actions;\n }\n // render the display, edit attr and delete icon-buttons\n return _super.prototype._renderPrimaryActions.call( this ).concat([\n this._renderEditButton(),\n this._renderDeleteButton()\n ]);\n },\n\n//TODO: move titleButtons into state renderers, remove state checks in the buttons\n\n /** Render icon-button to edit the attributes (format, permissions, etc.) this dataset. */\n _renderEditButton : function(){\n // don't show edit while uploading, in-accessible\n // DO show if in error (ala previous history panel)\n if( ( this.model.get( 'state' ) === STATES.DISCARDED )\n || ( !this.model.get( 'accessible' ) ) ){\n return null;\n }\n\n var purged = this.model.get( 'purged' ),\n deleted = this.model.get( 'deleted' ),\n editBtnData = {\n title : _l( 'Edit attributes' ),\n href : this.model.urls.edit,\n target : this.linkTarget,\n faIcon : 'fa-pencil',\n classes : 'edit-btn'\n };\n\n // disable if purged or deleted and explain why in the tooltip\n if( deleted || purged ){\n editBtnData.disabled = true;\n if( purged ){\n editBtnData.title = _l( 'Cannot edit attributes of datasets removed from disk' );\n } else if( deleted ){\n editBtnData.title = _l( 'Undelete dataset to edit attributes' );\n }\n\n // disable if still uploading or new\n } else if( _.contains( [ STATES.UPLOAD, STATES.NEW ], this.model.get( 'state' ) ) ){\n editBtnData.disabled = true;\n editBtnData.title = _l( 'This dataset is not yet editable' );\n }\n return faIconButton( editBtnData );\n },\n\n /** Render icon-button to delete this hda. */\n _renderDeleteButton : function(){\n // don't show delete if...\n if( ( !this.model.get( 'accessible' ) ) ){\n return null;\n }\n\n var self = this,\n deletedAlready = this.model.isDeletedOrPurged();\n return faIconButton({\n title : !deletedAlready? _l( 'Delete' ) : _l( 'Dataset is already deleted' ),\n disabled : deletedAlready,\n faIcon : 'fa-times',\n classes : 'delete-btn',\n onclick : function() {\n // ...bler... tooltips being left behind in DOM (hover out never called on deletion)\n self.$el.find( '.icon-btn.delete-btn' ).trigger( 'mouseout' );\n self.model[ 'delete' ]();\n }\n });\n },\n\n // ......................................................................... details\n /** In this override, add tags and annotations controls, make the ? dbkey a link to editing page */\n _renderDetails : function(){\n //TODO: generalize to be allow different details for each state\n var $details = _super.prototype._renderDetails.call( this ),\n state = this.model.get( 'state' );\n\n if( !this.model.isDeletedOrPurged() && _.contains([ STATES.OK, STATES.FAILED_METADATA ], state ) ){\n this._renderTags( $details );\n this._renderAnnotation( $details );\n this._makeDbkeyEditLink( $details );\n }\n\n//TODO: TRIPLE tap, ugh.\n this._setUpBehaviors( $details );\n return $details;\n },\n\n /** Add less commonly used actions in the details section based on state */\n _renderSecondaryActions : function(){\n var actions = _super.prototype._renderSecondaryActions.call( this );\n switch( this.model.get( 'state' ) ){\n case STATES.UPLOAD:\n case STATES.NOT_VIEWABLE:\n return actions;\n case STATES.ERROR:\n // error button comes first\n actions.unshift( this._renderErrButton() );\n return actions.concat([ this._renderRerunButton() ]);\n case STATES.OK:\n case STATES.FAILED_METADATA:\n return actions.concat([ this._renderRerunButton(), this._renderVisualizationsButton() ]);\n }\n return actions.concat([ this._renderRerunButton() ]);\n },\n\n /** Render icon-button to report an error on this dataset to the galaxy admin. */\n _renderErrButton : function(){\n return faIconButton({\n title : _l( 'View or report this error' ),\n href : this.model.urls.report_error,\n classes : 'report-error-btn',\n target : this.linkTarget,\n faIcon : 'fa-bug'\n });\n },\n\n /** Render icon-button to re-run the job that created this dataset. */\n _renderRerunButton : function(){\n var creating_job = this.model.get( 'creating_job' );\n if( this.model.get( 'rerunnable' ) ){\n return faIconButton({\n title : _l( 'Run this job again' ),\n href : this.model.urls.rerun,\n classes : 'rerun-btn',\n target : this.linkTarget,\n faIcon : 'fa-refresh',\n onclick : function( ev ) {\n ev.preventDefault();\n // create webpack split point in order to load the tool form async\n // TODO: split not working (tool loads fine)\n require([ 'mvc/tool/tool-form' ], function( ToolForm ){\n var form = new ToolForm.View({ 'job_id' : creating_job });\n form.deferred.execute( function(){\n Galaxy.app.display( form );\n });\n });\n }\n });\n }\n },\n\n /** Render an icon-button or popupmenu of links based on the applicable visualizations */\n _renderVisualizationsButton : function(){\n //TODO: someday - lazyload visualizations\n var visualizations = this.model.get( 'visualizations' );\n if( ( this.model.isDeletedOrPurged() )\n || ( !this.hasUser )\n || ( !this.model.hasData() )\n || ( _.isEmpty( visualizations ) ) ){\n return null;\n }\n if( !_.isObject( visualizations[0] ) ){\n this.warn( 'Visualizations have been switched off' );\n return null;\n }\n\n var $visualizations = $( this.templates.visualizations( visualizations, this ) );\n //HACK: need to re-write those directed at galaxy_main with linkTarget\n $visualizations.find( '[target=\"galaxy_main\"]').attr( 'target', this.linkTarget );\n // use addBack here to include the root $visualizations elem (for the case of 1 visualization)\n this._addScratchBookFn( $visualizations.find( '.visualization-link' ).addBack( '.visualization-link' ) );\n return $visualizations;\n },\n\n /** add scratchbook functionality to visualization links */\n _addScratchBookFn : function( $links ){\n var li = this;\n $links.click( function( ev ){\n if( Galaxy.frame && Galaxy.frame.active ){\n Galaxy.frame.add({\n title : 'Visualization',\n url : $( this ).attr( 'href' )\n });\n ev.preventDefault();\n ev.stopPropagation();\n }\n });\n },\n\n//TODO: if possible move these to readonly view - but display the owner's tags/annotation (no edit)\n /** Render the tags list/control */\n _renderTags : function( $where ){\n if( !this.hasUser ){ return; }\n var view = this;\n this.tagsEditor = new TAGS.TagsEditor({\n model : this.model,\n el : $where.find( '.tags-display' ),\n onshowFirstTime : function(){ this.render(); },\n // persist state on the hda view (and not the editor) since these are currently re-created each time\n onshow : function(){ view.tagsEditorShown = true; },\n onhide : function(){ view.tagsEditorShown = false; },\n $activator : faIconButton({\n title : _l( 'Edit dataset tags' ),\n classes : 'tag-btn',\n faIcon : 'fa-tags'\n }).appendTo( $where.find( '.actions .right' ) )\n });\n if( this.tagsEditorShown ){ this.tagsEditor.toggle( true ); }\n },\n\n /** Render the annotation display/control */\n _renderAnnotation : function( $where ){\n if( !this.hasUser ){ return; }\n var view = this;\n this.annotationEditor = new ANNOTATIONS.AnnotationEditor({\n model : this.model,\n el : $where.find( '.annotation-display' ),\n onshowFirstTime : function(){ this.render(); },\n // persist state on the hda view (and not the editor) since these are currently re-created each time\n onshow : function(){ view.annotationEditorShown = true; },\n onhide : function(){ view.annotationEditorShown = false; },\n $activator : faIconButton({\n title : _l( 'Edit dataset annotation' ),\n classes : 'annotate-btn',\n faIcon : 'fa-comment'\n }).appendTo( $where.find( '.actions .right' ) )\n });\n if( this.annotationEditorShown ){ this.annotationEditor.toggle( true ); }\n },\n\n /** If the format/dbkey/genome_build isn't set, make the display a link to the edit page */\n _makeDbkeyEditLink : function( $details ){\n // make the dbkey a link to editing\n if( this.model.get( 'metadata_dbkey' ) === '?'\n && !this.model.isDeletedOrPurged() ){\n var editableDbkey = $( '?' )\n .attr( 'href', this.model.urls.edit )\n .attr( 'target', this.linkTarget );\n $details.find( '.dbkey .value' ).replaceWith( editableDbkey );\n }\n },\n\n // ......................................................................... events\n /** event map */\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .undelete-link' : '_clickUndeleteLink',\n 'click .purge-link' : '_clickPurgeLink',\n\n 'click .edit-btn' : function( ev ){ this.trigger( 'edit', this, ev ); },\n 'click .delete-btn' : function( ev ){ this.trigger( 'delete', this, ev ); },\n 'click .rerun-btn' : function( ev ){ this.trigger( 'rerun', this, ev ); },\n 'click .report-err-btn' : function( ev ){ this.trigger( 'report-err', this, ev ); },\n 'click .visualization-btn' : function( ev ){ this.trigger( 'visualize', this, ev ); },\n 'click .dbkey a' : function( ev ){ this.trigger( 'edit', this, ev ); }\n }),\n\n\n /** listener for item undelete (in the messages section) */\n _clickUndeleteLink : function( ev ){\n this.model.undelete();\n return false;\n },\n\n /** listener for item purge (in the messages section) */\n _clickPurgeLink : function( ev ){\n//TODO: confirm dialog\n this.model.purge();\n return false;\n },\n\n // ......................................................................... misc\n /** string rep */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDAEditView(' + modelString + ')';\n }\n});\n\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDatasetListItemEdit.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n failed_metadata : BASE_MVC.wrapTemplate([\n // in this override, provide a link to the edit page\n '<% if( dataset.state === \"failed_metadata\" ){ %>',\n '',\n '<% } %>'\n ], 'dataset' ),\n\n deleted : BASE_MVC.wrapTemplate([\n // in this override, provide links to undelete or purge the dataset\n '<% if( dataset.deleted && !dataset.purged ){ %>',\n // deleted not purged\n '
                            ',\n _l( 'This dataset has been deleted' ),\n '
                            ', _l( 'Undelete it' ), '',\n '<% if( view.purgeAllowed ){ %>',\n '
                            ',\n _l( 'Permanently remove it from disk' ),\n '',\n '<% } %>',\n '
                            ',\n '<% } %>'\n ], 'dataset' )\n });\n\n var visualizationsTemplate = BASE_MVC.wrapTemplate([\n '<% if( visualizations.length === 1 ){ %>',\n '\"',\n ' target=\"<%- visualizations[0].target %>\" title=\"', _l( 'Visualize in' ),\n ' <%- visualizations[0].html %>\">',\n '',\n '',\n\n '<% } else { %>',\n '
                            ',\n '',\n '',\n '',\n '',\n '
                            ',\n '<% } %>'\n ], 'visualizations' );\n\n return _.extend( {}, _super.prototype.templates, {\n warnings : warnings,\n visualizations : visualizationsTemplate\n });\n}());\n\n\n//==============================================================================\n return {\n DatasetListItemEdit : DatasetListItemEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/dataset-li-edit.js\n ** module id = 94\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/states\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( STATES, BASE_MVC, _l ){\n\nvar logNamespace = 'dataset';\n//==============================================================================\nvar searchableMixin = BASE_MVC.SearchableModelMixin;\n/** @class base model for any DatasetAssociation (HDAs, LDDAs, DatasetCollectionDAs).\n * No knowledge of what type (HDA/LDDA/DCDA) should be needed here.\n * The DA's are made searchable (by attribute) by mixing in SearchableModelMixin.\n */\nvar DatasetAssociation = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( BASE_MVC.mixin( searchableMixin, /** @lends DatasetAssociation.prototype */{\n _logNamespace : logNamespace,\n\n /** default attributes for a model */\n defaults : {\n state : STATES.NEW,\n deleted : false,\n purged : false,\n\n // unreliable attribute\n name : '(unnamed dataset)',\n\n//TODO: update to false when this is correctly passed from the API (when we have a security model for this)\n accessible : true,\n\n // sniffed datatype (sam, tabular, bed, etc.)\n data_type : '',\n file_ext : '',\n\n // size in bytes\n file_size : 0,\n\n // array of associated file types (eg. [ 'bam_index', ... ])\n meta_files : [],\n\n misc_blurb : '',\n misc_info : '',\n\n tags : []\n // do NOT default on annotation, as this default is valid and will be passed on 'save'\n // which is incorrect behavior when the model is only partially fetched (annos are not passed in summary data)\n //annotation : ''\n },\n\n /** instance vars and listeners */\n initialize : function( attributes, options ){\n this.debug( this + '(Dataset).initialize', attributes, options );\n\n //!! this state is not in trans.app.model.Dataset.states - set it here -\n if( !this.get( 'accessible' ) ){\n this.set( 'state', STATES.NOT_VIEWABLE );\n }\n\n /** Datasets rely/use some web controllers - have the model generate those URLs on startup */\n this.urls = this._generateUrls();\n\n this._setUpListeners();\n },\n\n /** returns misc. web urls for rendering things like re-run, display, etc. */\n _generateUrls : function(){\n//TODO: would be nice if the API did this\n var id = this.get( 'id' );\n if( !id ){ return {}; }\n var urls = {\n 'purge' : 'datasets/' + id + '/purge_async',\n 'display' : 'datasets/' + id + '/display/?preview=True',\n 'edit' : 'datasets/' + id + '/edit',\n 'download' : 'datasets/' + id + '/display?to_ext=' + this.get( 'file_ext' ),\n 'report_error' : 'dataset/errors?id=' + id,\n 'rerun' : 'tool_runner/rerun?id=' + id,\n 'show_params' : 'datasets/' + id + '/show_params',\n 'visualization' : 'visualization',\n 'meta_download' : 'dataset/get_metadata_file?hda_id=' + id + '&metadata_name='\n };\n//TODO: global\n _.each( urls, function( value, key ){\n urls[ key ] = Galaxy.root + value;\n });\n this.urls = urls;\n return urls;\n },\n\n /** set up any event listeners\n * event: state:ready fired when this DA moves into/is already in a ready state\n */\n _setUpListeners : function(){\n // if the state has changed and the new state is a ready state, fire an event\n this.on( 'change:state', function( currModel, newState ){\n this.log( this + ' has changed state:', currModel, newState );\n if( this.inReadyState() ){\n this.trigger( 'state:ready', currModel, newState, this.previous( 'state' ) );\n }\n });\n // the download url (currently) relies on having a correct file extension\n this.on( 'change:id change:file_ext', function( currModel ){\n this._generateUrls();\n });\n },\n\n // ........................................................................ common queries\n /** override to add urls */\n toJSON : function(){\n var json = Backbone.Model.prototype.toJSON.call( this );\n //console.warn( 'returning json?' );\n //return json;\n return _.extend( json, {\n urls : this.urls\n });\n },\n\n /** Is this dataset deleted or purged? */\n isDeletedOrPurged : function(){\n return ( this.get( 'deleted' ) || this.get( 'purged' ) );\n },\n\n /** Is this dataset in a 'ready' state; where 'Ready' states are states where no\n * processing (for the ds) is left to do on the server.\n */\n inReadyState : function(){\n var ready = _.contains( STATES.READY_STATES, this.get( 'state' ) );\n return ( this.isDeletedOrPurged() || ready );\n },\n\n /** Does this model already contain detailed data (as opposed to just summary level data)? */\n hasDetails : function(){\n //?? this may not be reliable\n return _.has( this.attributes, 'genome_build' );\n },\n\n /** Convenience function to match dataset.has_data. */\n hasData : function(){\n return ( this.get( 'file_size' ) > 0 );\n },\n\n // ........................................................................ ajax\n fetch : function( options ){\n var dataset = this;\n return Backbone.Model.prototype.fetch.call( this, options )\n .always( function(){\n dataset._generateUrls();\n });\n },\n\n //NOTE: subclasses of DA's will need to implement url and urlRoot in order to have these work properly\n /** save this dataset, _Mark_ing it as deleted (just a flag) */\n 'delete' : function( options ){\n if( this.get( 'deleted' ) ){ return jQuery.when(); }\n return this.save( { deleted: true }, options );\n },\n /** save this dataset, _Mark_ing it as undeleted */\n undelete : function( options ){\n if( !this.get( 'deleted' ) || this.get( 'purged' ) ){ return jQuery.when(); }\n return this.save( { deleted: false }, options );\n },\n\n /** remove the file behind this dataset from the filesystem (if permitted) */\n purge : function _purge( options ){\n//TODO: use, override model.destroy, HDA.delete({ purge: true })\n if( this.get( 'purged' ) ){ return jQuery.when(); }\n options = options || {};\n //var hda = this,\n // //xhr = jQuery.ajax( this.url() + '?' + jQuery.param({ purge: true }), _.extend({\n // xhr = jQuery.ajax( this.url(), _.extend({\n // type : 'DELETE',\n // data : {\n // purge : true\n // }\n // }, options ));\n //\n //xhr.done( function( response ){\n // hda.debug( 'response', response );\n // //hda.set({ deleted: true, purged: true });\n // hda.set( response );\n //});\n //return xhr;\n\n options.url = this.urls.purge;\n\n //TODO: ideally this would be a DELETE call to the api\n // using purge async for now\n var hda = this,\n xhr = jQuery.ajax( options );\n xhr.done( function( message, status, responseObj ){\n hda.set({ deleted: true, purged: true });\n });\n xhr.fail( function( xhr, status, message ){\n // Exception messages are hidden within error page including: '...not allowed in this Galaxy instance.'\n // unbury and re-add to xhr\n var error = _l( \"Unable to purge dataset\" );\n var messageBuriedInUnfortunatelyFormattedError = ( 'Removal of datasets by users '\n + 'is not allowed in this Galaxy instance' );\n if( xhr.responseJSON && xhr.responseJSON.error ){\n error = xhr.responseJSON.error;\n } else if( xhr.responseText.indexOf( messageBuriedInUnfortunatelyFormattedError ) !== -1 ){\n error = messageBuriedInUnfortunatelyFormattedError;\n }\n xhr.responseText = error;\n hda.trigger( 'error', hda, xhr, options, _l( error ), { error: error } );\n });\n return xhr;\n },\n\n // ........................................................................ searching\n // see base-mvc, SearchableModelMixin\n\n /** what attributes of an HDA will be used in a text search */\n searchAttributes : [\n 'name', 'file_ext', 'genome_build', 'misc_blurb', 'misc_info', 'annotation', 'tags'\n ],\n\n /** our attr keys don't often match the labels we display to the user - so, when using\n * attribute specifiers ('name=\"bler\"') in a term, allow passing in aliases for the\n * following attr keys.\n */\n searchAliases : {\n title : 'name',\n format : 'file_ext',\n database : 'genome_build',\n blurb : 'misc_blurb',\n description : 'misc_blurb',\n info : 'misc_info',\n tag : 'tags'\n },\n\n // ........................................................................ misc\n /** String representation */\n toString : function(){\n var nameAndId = this.get( 'id' ) || '';\n if( this.get( 'name' ) ){\n nameAndId = '\"' + this.get( 'name' ) + '\",' + nameAndId;\n }\n return 'Dataset(' + nameAndId + ')';\n }\n}));\n\n\n//==============================================================================\n/** @class Backbone collection for dataset associations.\n */\nvar DatasetAssociationCollection = Backbone.Collection.extend( BASE_MVC.LoggableMixin ).extend(\n/** @lends HistoryContents.prototype */{\n _logNamespace : logNamespace,\n\n model : DatasetAssociation,\n\n /** root api url */\n urlRoot : Galaxy.root + 'api/datasets',\n\n /** url fn */\n url : function(){\n return this.urlRoot;\n },\n\n // ........................................................................ common queries\n /** Get the ids of every item in this collection\n * @returns array of encoded ids\n */\n ids : function(){\n return this.map( function( item ){ return item.get('id'); });\n },\n\n /** Get contents that are not ready\n * @returns array of content models\n */\n notReady : function(){\n return this.filter( function( content ){\n return !content.inReadyState();\n });\n },\n\n /** return true if any datasets don't have details */\n haveDetails : function(){\n return this.all( function( dataset ){ return dataset.hasDetails(); });\n },\n\n // ........................................................................ ajax\n /** using a queue, perform ajaxFn on each of the models in this collection */\n ajaxQueue : function( ajaxFn, options ){\n var deferred = jQuery.Deferred(),\n startingLength = this.length,\n responses = [];\n\n if( !startingLength ){\n deferred.resolve([]);\n return deferred;\n }\n\n // use reverse order (stylistic choice)\n var ajaxFns = this.chain().reverse().map( function( dataset, i ){\n return function(){\n var xhr = ajaxFn.call( dataset, options );\n // if successful, notify using the deferred to allow tracking progress\n xhr.done( function( response ){\n deferred.notify({ curr: i, total: startingLength, response: response, model: dataset });\n });\n // (regardless of previous error or success) if not last ajax call, shift and call the next\n // if last fn, resolve deferred\n xhr.always( function( response ){\n responses.push( response );\n if( ajaxFns.length ){\n ajaxFns.shift()();\n } else {\n deferred.resolve( responses );\n }\n });\n };\n }).value();\n // start the queue\n ajaxFns.shift()();\n\n return deferred;\n },\n\n // ........................................................................ sorting/filtering\n /** return a new collection of datasets whose attributes contain the substring matchesWhat */\n matches : function( matchesWhat ){\n return this.filter( function( dataset ){\n return dataset.matches( matchesWhat );\n });\n },\n\n // ........................................................................ misc\n ///** Convert this ad-hoc collection of hdas to a formal collection tracked\n // by the server.\n //**/\n //promoteToHistoryDatasetCollection : function _promote( history, collection_type, options ){\n //},\n\n /** String representation. */\n toString : function(){\n return ([ 'DatasetAssociationCollection(', this.length, ')' ].join( '' ));\n }\n});\n\n\n//==============================================================================\n return {\n DatasetAssociation : DatasetAssociation,\n DatasetAssociationCollection : DatasetAssociationCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/dataset/dataset-model.js\n ** module id = 95\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/dataset-li\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DATASET_LI, BASE_MVC, _l ){\n/* global Backbone */\n//==============================================================================\nvar _super = DATASET_LI.DatasetListItemView;\n/** @class Read only view for HistoryDatasetAssociation.\n * Since there are no controls on the HDAView to hide the dataset,\n * the primary thing this class does (currently) is override templates\n * to render the HID.\n */\nvar HDAListItemView = _super.extend(\n/** @lends HDAListItemView.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : _super.prototype.className + \" history-content\",\n\n initialize : function( attributes, options ){\n _super.prototype.initialize.call( this, attributes, options );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDAListItemView(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nHDAListItemView.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n // adding the hid display to the title\n '
                            ',\n '',\n '
                            ',\n //TODO: remove whitespace and use margin-right\n '<%- dataset.hid %> ',\n '<%- dataset.name %>',\n '
                            ',\n '
                            '\n ], 'dataset' );\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n hidden : BASE_MVC.wrapTemplate([\n // add a warning when hidden\n '<% if( !dataset.visible ){ %>',\n '
                            ',\n _l( 'This dataset has been hidden' ),\n '
                            ',\n '<% } %>'\n ], 'dataset' )\n });\n\n return _.extend( {}, _super.prototype.templates, {\n titleBar : titleBarTemplate,\n warnings : warnings\n });\n}());\n\n\n\n//==============================================================================\n return {\n HDAListItemView : HDAListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hda-li.js\n ** module id = 96\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/dataset-model\",\n \"mvc/history/history-content-model\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DATASET, HISTORY_CONTENT, BASE_MVC, _l ){\n//==============================================================================\nvar _super = DATASET.DatasetAssociation,\n hcontentMixin = HISTORY_CONTENT.HistoryContentMixin;\n/** @class (HDA) model for a Galaxy dataset contained in and related to a history.\n */\nvar HistoryDatasetAssociation = _super.extend( BASE_MVC.mixin( hcontentMixin,\n/** @lends HistoryDatasetAssociation.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n // because all objects have constructors (as this hashmap would even if this next line wasn't present)\n // the constructor in hcontentMixin won't be attached by BASE_MVC.mixin to this model\n // - re-apply manually it now\n /** call the mixin constructor */\n constructor : function( attrs, options ){\n hcontentMixin.constructor.call( this, attrs, options );\n },\n\n /** default attributes for a model */\n defaults : _.extend( {}, _super.prototype.defaults, hcontentMixin.defaults, {\n model_class : 'HistoryDatasetAssociation'\n }),\n\n /** Set up the model, determine if accessible, bind listeners\n */\n initialize : function( attributes, options ){\n _super.prototype.initialize.call( this, attributes, options );\n hcontentMixin.initialize.call( this, attributes, options );\n },\n\n // ........................................................................ misc\n /** String representation */\n toString : function(){\n var nameAndId = this.get( 'id' ) || '';\n if( this.get( 'name' ) ){\n nameAndId = this.get( 'hid' ) + ' :\"' + this.get( 'name' ) + '\",' + nameAndId;\n }\n return 'HDA(' + nameAndId + ')';\n }\n}));\n\n//==============================================================================\n return {\n HistoryDatasetAssociation : HistoryDatasetAssociation\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hda-model.js\n ** module id = 97\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/states\",\n \"mvc/collection/collection-li\",\n \"mvc/collection/collection-view\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( STATES, DC_LI, DC_VIEW, BASE_MVC, _l ){\n/* global Backbone */\n//==============================================================================\nvar _super = DC_LI.DCListItemView;\n/** @class Read only view for HistoryDatasetCollectionAssociation (a dataset collection inside a history).\n */\nvar HDCAListItemView = _super.extend(\n/** @lends HDCAListItemView.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : _super.prototype.className + \" history-content\",\n\n /** event listeners */\n _setUpListeners : function(){\n _super.prototype._setUpListeners.call( this );\n\n this.model.on({\n 'change:populated change:visible' : function( model, options ){ this.render(); },\n }, this );\n },\n\n /** Override to provide the proper collections panels as the foldout */\n _getFoldoutPanelClass : function(){\n switch( this.model.get( 'collection_type' ) ){\n case 'list':\n return DC_VIEW.ListCollectionView;\n case 'paired':\n return DC_VIEW.PairCollectionView;\n case 'list:paired':\n return DC_VIEW.ListOfPairsCollectionView;\n }\n throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );\n },\n\n /** In this override, add the state as a class for use with state-based CSS */\n _swapNewRender : function( $newRender ){\n _super.prototype._swapNewRender.call( this, $newRender );\n//TODO: model currently has no state\n var state = !this.model.get( 'populated' ) ? STATES.RUNNING : STATES.OK;\n //if( this.model.has( 'state' ) ){\n this.$el.addClass( 'state-' + state );\n //}\n return this.$el;\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDCAListItemView(' + modelString + ')';\n }\n});\n\n/** underscore templates */\nHDCAListItemView.prototype.templates = (function(){\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n hidden : BASE_MVC.wrapTemplate([\n // add a warning when hidden\n '<% if( !collection.visible ){ %>',\n '
                            ',\n _l( 'This collection has been hidden' ),\n '
                            ',\n '<% } %>'\n ], 'collection' )\n });\n\n// could steal this from hda-base (or use mixed content)\n var titleBarTemplate = BASE_MVC.wrapTemplate([\n // adding the hid display to the title\n '
                            ',\n '',\n '
                            ',\n //TODO: remove whitespace and use margin-right\n '<%- collection.hid %> ',\n '<%- collection.name %>',\n '
                            ',\n '
                            ',\n '
                            '\n ], 'collection' );\n\n return _.extend( {}, _super.prototype.templates, {\n warnings : warnings,\n titleBar : titleBarTemplate\n });\n}());\n\n\n//==============================================================================\n return {\n HDCAListItemView : HDCAListItemView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hdca-li.js\n ** module id = 98\n ** module chunks = 3\n **/","\ndefine([\n \"mvc/history/history-contents\",\n \"utils/utils\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( HISTORY_CONTENTS, UTILS, BASE_MVC, _l ){\n\nvar logNamespace = 'history';\n//==============================================================================\n/** @class Model for a Galaxy history resource - both a record of user\n * tool use and a collection of the datasets those tools produced.\n * @name History\n * @augments Backbone.Model\n */\nvar History = Backbone.Model\n .extend( BASE_MVC.LoggableMixin )\n .extend( BASE_MVC.mixin( BASE_MVC.SearchableModelMixin, /** @lends History.prototype */{\n _logNamespace : logNamespace,\n\n // values from api (may need more)\n defaults : {\n model_class : 'History',\n id : null,\n name : 'Unnamed History',\n state : 'new',\n\n deleted : false\n },\n\n // ........................................................................ urls\n urlRoot: Galaxy.root + 'api/histories',\n\n // ........................................................................ set up/tear down\n /** Set up the model\n * @param {Object} historyJSON model data for this History\n * @param {Object[]} contentsJSON array of model data for this History's contents (hdas or collections)\n * @param {Object} options any extra settings including logger\n */\n initialize : function( historyJSON, contentsJSON, options ){\n options = options || {};\n this.logger = options.logger || null;\n this.log( this + \".initialize:\", historyJSON, contentsJSON, options );\n\n /** HistoryContents collection of the HDAs contained in this history. */\n this.log( 'creating history contents:', contentsJSON );\n this.contents = new HISTORY_CONTENTS.HistoryContents( contentsJSON || [], { historyId: this.get( 'id' )});\n //// if we've got hdas passed in the constructor, load them\n //if( contentsJSON && _.isArray( contentsJSON ) ){\n // this.log( 'resetting history contents:', contentsJSON );\n // this.contents.reset( contentsJSON );\n //}\n\n this._setUpListeners();\n\n /** cached timeout id for the dataset updater */\n this.updateTimeoutId = null;\n // set up update timeout if needed\n //this.checkForUpdates();\n },\n\n /** set up any event listeners for this history including those to the contained HDAs\n * events: error:contents if an error occurred with the contents collection\n */\n _setUpListeners : function(){\n this.on( 'error', function( model, xhr, options, msg, details ){\n this.errorHandler( model, xhr, options, msg, details );\n });\n\n // hda collection listening\n if( this.contents ){\n this.listenTo( this.contents, 'error', function(){\n this.trigger.apply( this, [ 'error:contents' ].concat( jQuery.makeArray( arguments ) ) );\n });\n }\n // if the model's id changes ('current' or null -> an actual id), update the contents history_id\n this.on( 'change:id', function( model, newId ){\n if( this.contents ){\n this.contents.historyId = newId;\n }\n }, this );\n },\n\n //TODO: see base-mvc\n //onFree : function(){\n // if( this.contents ){\n // this.contents.free();\n // }\n //},\n\n /** event listener for errors. Generally errors are handled outside this model */\n errorHandler : function( model, xhr, options, msg, details ){\n // clear update timeout on model err\n this.clearUpdateTimeout();\n },\n\n /** convert size in bytes to a more human readable version */\n nice_size : function(){\n return UTILS.bytesToString( this.get( 'size' ), true, 2 );\n },\n\n /** override to add nice_size */\n toJSON : function(){\n return _.extend( Backbone.Model.prototype.toJSON.call( this ), {\n nice_size : this.nice_size()\n });\n },\n\n /** override to allow getting nice_size */\n get : function( key ){\n if( key === 'nice_size' ){\n return this.nice_size();\n }\n return Backbone.Model.prototype.get.apply( this, arguments );\n },\n\n // ........................................................................ common queries\n /** T/F is this history owned by the current user (Galaxy.user)\n * Note: that this will return false for an anon user even if the history is theirs.\n */\n ownedByCurrUser : function(){\n // no currUser\n if( !Galaxy || !Galaxy.user ){\n return false;\n }\n // user is anon or history isn't owned\n if( Galaxy.user.isAnonymous() || Galaxy.user.id !== this.get( 'user_id' ) ){\n return false;\n }\n return true;\n },\n\n /** */\n contentsCount : function(){\n return _.reduce( _.values( this.get( 'state_details' ) ), function( memo, num ){ return memo + num; }, 0 );\n },\n\n // ........................................................................ search\n /** What model fields to search with */\n searchAttributes : [\n 'name', 'annotation', 'tags'\n ],\n\n /** Adding title and singular tag */\n searchAliases : {\n title : 'name',\n tag : 'tags'\n },\n\n // ........................................................................ updates\n /** does the contents collection indicate they're still running and need to be updated later?\n * delay + update if needed\n * @param {Function} onReadyCallback function to run when all contents are in the ready state\n * events: ready\n */\n checkForUpdates : function( onReadyCallback ){\n //this.info( 'checkForUpdates' )\n\n // get overall History state from collection, run updater if History has running/queued contents\n // boiling it down on the client to running/not\n if( this.contents.running().length ){\n this.setUpdateTimeout();\n\n } else {\n this.trigger( 'ready' );\n if( _.isFunction( onReadyCallback ) ){\n onReadyCallback.call( this );\n }\n }\n return this;\n },\n\n /** create a timeout (after UPDATE_DELAY or delay ms) to refetch the contents. Clear any prev. timeout */\n setUpdateTimeout : function( delay ){\n delay = delay || History.UPDATE_DELAY;\n var history = this;\n\n // prevent buildup of updater timeouts by clearing previous if any, then set new and cache id\n this.clearUpdateTimeout();\n this.updateTimeoutId = setTimeout( function(){\n history.refresh();\n }, delay );\n return this.updateTimeoutId;\n },\n\n /** clear the timeout and the cached timeout id */\n clearUpdateTimeout : function(){\n if( this.updateTimeoutId ){\n clearTimeout( this.updateTimeoutId );\n this.updateTimeoutId = null;\n }\n },\n\n /* update the contents, getting full detailed model data for any whose id is in detailIds\n * set up to run this again in some interval of time\n * @param {String[]} detailIds list of content ids to get detailed model data for\n * @param {Object} options std. backbone fetch options map\n */\n refresh : function( detailIds, options ){\n //this.info( 'refresh:', detailIds, this.contents );\n detailIds = detailIds || [];\n options = options || {};\n var history = this;\n\n // add detailIds to options as CSV string\n options.data = options.data || {};\n if( detailIds.length ){\n options.data.details = detailIds.join( ',' );\n }\n var xhr = this.contents.fetch( options );\n xhr.done( function( models ){\n history.checkForUpdates( function(){\n // fetch the history inside onReadyCallback in order to recalc history size\n this.fetch();\n });\n });\n return xhr;\n },\n\n // ........................................................................ ajax\n /** save this history, _Mark_ing it as deleted (just a flag) */\n _delete : function( options ){\n if( this.get( 'deleted' ) ){ return jQuery.when(); }\n return this.save( { deleted: true }, options );\n },\n /** purge this history, _Mark_ing it as purged and removing all dataset data from the server */\n purge : function( options ){\n if( this.get( 'purged' ) ){ return jQuery.when(); }\n return this.save( { deleted: true, purged: true }, options );\n },\n /** save this history, _Mark_ing it as undeleted */\n undelete : function( options ){\n if( !this.get( 'deleted' ) ){ return jQuery.when(); }\n return this.save( { deleted: false }, options );\n },\n\n /** Make a copy of this history on the server\n * @param {Boolean} current if true, set the copy as the new current history (default: true)\n * @param {String} name name of new history (default: none - server sets to: Copy of )\n * @fires copied passed this history and the response JSON from the copy\n * @returns {xhr}\n */\n copy : function( current, name, allDatasets ){\n current = ( current !== undefined )?( current ):( true );\n if( !this.id ){\n throw new Error( 'You must set the history ID before copying it.' );\n }\n\n var postData = { history_id : this.id };\n if( current ){\n postData.current = true;\n }\n if( name ){\n postData.name = name;\n }\n if( !allDatasets ){\n postData.all_datasets = false;\n }\n\n var history = this,\n copy = jQuery.post( this.urlRoot, postData );\n // if current - queue to setAsCurrent before firing 'copied'\n if( current ){\n return copy.then( function( response ){\n var newHistory = new History( response );\n return newHistory.setAsCurrent()\n .done( function(){\n history.trigger( 'copied', history, response );\n });\n });\n }\n return copy.done( function( response ){\n history.trigger( 'copied', history, response );\n });\n },\n\n setAsCurrent : function(){\n var history = this,\n xhr = jQuery.getJSON( Galaxy.root + 'history/set_as_current?id=' + this.id );\n\n xhr.done( function(){\n history.trigger( 'set-as-current', history );\n });\n return xhr;\n },\n\n // ........................................................................ misc\n toString : function(){\n return 'History(' + this.get( 'id' ) + ',' + this.get( 'name' ) + ')';\n }\n}));\n\n//------------------------------------------------------------------------------ CLASS VARS\n/** When the history has running hdas,\n * this is the amount of time between update checks from the server\n */\nHistory.UPDATE_DELAY = 4000;\n\n/** Get data for a history then its hdas using a sequential ajax call, return a deferred to receive both */\nHistory.getHistoryData = function getHistoryData( historyId, options ){\n options = options || {};\n var detailIdsFn = options.detailIdsFn || [];\n var hdcaDetailIds = options.hdcaDetailIds || [];\n //console.debug( 'getHistoryData:', historyId, options );\n\n var df = jQuery.Deferred(),\n historyJSON = null;\n\n function getHistory( id ){\n // get the history data\n if( historyId === 'current' ){\n return jQuery.getJSON( Galaxy.root + 'history/current_history_json' );\n }\n return jQuery.ajax( Galaxy.root + 'api/histories/' + historyId );\n }\n function isEmpty( historyData ){\n // get the number of hdas accrd. to the history\n return historyData && historyData.empty;\n }\n function getContents( historyData ){\n // get the hda data\n // if no hdas accrd. to history: return empty immed.\n if( isEmpty( historyData ) ){ return []; }\n // if there are hdas accrd. to history: get those as well\n if( _.isFunction( detailIdsFn ) ){\n detailIdsFn = detailIdsFn( historyData );\n }\n if( _.isFunction( hdcaDetailIds ) ){\n hdcaDetailIds = hdcaDetailIds( historyData );\n }\n var data = {};\n if( detailIdsFn.length ) {\n data.dataset_details = detailIdsFn.join( ',' );\n }\n if( hdcaDetailIds.length ) {\n // for symmetry, not actually used by backend of consumed\n // by frontend.\n data.dataset_collection_details = hdcaDetailIds.join( ',' );\n }\n return jQuery.ajax( Galaxy.root + 'api/histories/' + historyData.id + '/contents', { data: data });\n }\n\n // getting these concurrently is 400% slower (sqlite, local, vanilla) - so:\n // chain the api calls - getting history first then contents\n\n var historyFn = options.historyFn || getHistory,\n contentsFn = options.contentsFn || getContents;\n\n // chain ajax calls: get history first, then hdas\n var historyXHR = historyFn( historyId );\n historyXHR.done( function( json ){\n // set outer scope var here for use below\n historyJSON = json;\n df.notify({ status: 'history data retrieved', historyJSON: historyJSON });\n });\n historyXHR.fail( function( xhr, status, message ){\n // call reject on the outer deferred to allow its fail callback to run\n df.reject( xhr, 'loading the history' );\n });\n\n var contentsXHR = historyXHR.then( contentsFn );\n contentsXHR.then( function( contentsJSON ){\n df.notify({ status: 'contents data retrieved', historyJSON: historyJSON, contentsJSON: contentsJSON });\n // we've got both: resolve the outer scope deferred\n df.resolve( historyJSON, contentsJSON );\n });\n contentsXHR.fail( function( xhr, status, message ){\n // call reject on the outer deferred to allow its fail callback to run\n df.reject( xhr, 'loading the contents', { history: historyJSON } );\n });\n\n return df;\n};\n\n\n//==============================================================================\nvar ControlledFetchMixin = {\n\n /** Override to convert certain options keys into API index parameters */\n fetch : function( options ){\n options = options || {};\n options.data = options.data || this._buildFetchData( options );\n // use repeated params for arrays, e.g. q=1&qv=1&q=2&qv=2\n options.traditional = true;\n return Backbone.Collection.prototype.fetch.call( this, options );\n },\n\n /** These attribute keys are valid params to fetch/API-index */\n _fetchOptions : [\n /** model dependent string to control the order of models returned */\n 'order',\n /** limit the number of models returned from a fetch */\n 'limit',\n /** skip this number of models when fetching */\n 'offset',\n /** what series of attributes to return (model dependent) */\n 'view',\n /** individual keys to return for the models (see api/histories.index) */\n 'keys'\n ],\n\n /** Build the data dictionary to send to fetch's XHR as data */\n _buildFetchData : function( options ){\n var data = {},\n fetchDefaults = this._fetchDefaults();\n options = _.defaults( options || {}, fetchDefaults );\n data = _.pick( options, this._fetchOptions );\n\n var filters = _.has( options, 'filters' )? options.filters : ( fetchDefaults.filters || {} );\n if( !_.isEmpty( filters ) ){\n _.extend( data, this._buildFetchFilters( filters ) );\n }\n return data;\n },\n\n /** Override to have defaults for fetch options and filters */\n _fetchDefaults : function(){\n // to be overridden\n return {};\n },\n\n /** Convert dictionary filters to qqv style arrays */\n _buildFetchFilters : function( filters ){\n var filterMap = {\n q : [],\n qv : []\n };\n _.each( filters, function( v, k ){\n if( v === true ){ v = 'True'; }\n if( v === false ){ v = 'False'; }\n filterMap.q.push( k );\n filterMap.qv.push( v );\n });\n return filterMap;\n },\n};\n\n//==============================================================================\n/** @class A collection of histories (per user).\n * (stub) currently unused.\n */\nvar HistoryCollection = Backbone.Collection\n .extend( BASE_MVC.LoggableMixin )\n .extend( ControlledFetchMixin )\n .extend(/** @lends HistoryCollection.prototype */{\n _logNamespace : logNamespace,\n\n model : History,\n\n /** @type {String} the default sortOrders key for sorting */\n DEFAULT_ORDER : 'update_time',\n\n /** @type {Object} map of collection sorting orders generally containing a getter to return the attribute\n * sorted by and asc T/F if it is an ascending sort.\n */\n sortOrders : {\n 'update_time' : {\n getter : function( h ){ return new Date( h.get( 'update_time' ) ); },\n asc : false\n },\n 'update_time-asc' : {\n getter : function( h ){ return new Date( h.get( 'update_time' ) ); },\n asc : true\n },\n 'name' : {\n getter : function( h ){ return h.get( 'name' ); },\n asc : true\n },\n 'name-dsc' : {\n getter : function( h ){ return h.get( 'name' ); },\n asc : false\n },\n 'size' : {\n getter : function( h ){ return h.get( 'size' ); },\n asc : false\n },\n 'size-asc' : {\n getter : function( h ){ return h.get( 'size' ); },\n asc : true\n }\n },\n\n initialize : function( models, options ){\n options = options || {};\n this.log( 'HistoryCollection.initialize', arguments );\n\n // instance vars\n /** @type {boolean} should deleted histories be included */\n this.includeDeleted = options.includeDeleted || false;\n // set the sort order\n this.setOrder( options.order || this.DEFAULT_ORDER );\n /** @type {String} encoded id of the history that's current */\n this.currentHistoryId = options.currentHistoryId;\n /** @type {boolean} have all histories been fetched and in the collection? */\n this.allFetched = options.allFetched || false;\n\n // this.on( 'all', function(){\n // console.info( 'event:', arguments );\n // });\n this.setUpListeners();\n },\n\n urlRoot : Galaxy.root + 'api/histories',\n url : function(){ return this.urlRoot; },\n\n /** returns map of default filters and settings for fetching from the API */\n _fetchDefaults : function(){\n // to be overridden\n var defaults = {\n order : this.order,\n view : 'detailed'\n };\n if( !this.includeDeleted ){\n defaults.filters = {\n deleted : false,\n purged : false,\n };\n }\n return defaults;\n },\n\n /** set up reflexive event handlers */\n setUpListeners : function setUpListeners(){\n this.on({\n // when a history is deleted, remove it from the collection (if optionally set to do so)\n 'change:deleted' : function( history ){\n // TODO: this becomes complicated when more filters are used\n this.debug( 'change:deleted', this.includeDeleted, history.get( 'deleted' ) );\n if( !this.includeDeleted && history.get( 'deleted' ) ){\n this.remove( history );\n }\n },\n // listen for a history copy, setting it to current\n 'copied' : function( original, newData ){\n this.setCurrent( new History( newData, [] ) );\n },\n // when a history is made current, track the id in the collection\n 'set-as-current' : function( history ){\n var oldCurrentId = this.currentHistoryId;\n this.trigger( 'no-longer-current', oldCurrentId );\n this.currentHistoryId = history.id;\n }\n }, this );\n },\n\n /** override to allow passing options.order and setting the sort order to one of sortOrders */\n sort : function( options ){\n options = options || {};\n this.setOrder( options.order );\n return Backbone.Collection.prototype.sort.call( this, options );\n },\n\n /** build the comparator used to sort this collection using the sortOrder map and the given order key\n * @event 'changed-order' passed the new order and the collection\n */\n setOrder : function( order ){\n var collection = this,\n sortOrder = this.sortOrders[ order ];\n if( _.isUndefined( sortOrder ) ){ return; }\n\n collection.order = order;\n collection.comparator = function comparator( a, b ){\n var currentHistoryId = collection.currentHistoryId;\n // current always first\n if( a.id === currentHistoryId ){ return -1; }\n if( b.id === currentHistoryId ){ return 1; }\n // then compare by an attribute\n a = sortOrder.getter( a );\n b = sortOrder.getter( b );\n return sortOrder.asc?\n ( ( a === b )?( 0 ):( a > b ? 1 : -1 ) ):\n ( ( a === b )?( 0 ):( a > b ? -1 : 1 ) );\n };\n collection.trigger( 'changed-order', collection.order, collection );\n return collection;\n },\n\n /** override to provide order and offsets based on instance vars, set limit if passed,\n * and set allFetched/fire 'all-fetched' when xhr returns\n */\n fetch : function( options ){\n options = options || {};\n if( this.allFetched ){ return jQuery.when({}); }\n var collection = this,\n fetchOptions = _.defaults( options, {\n remove : false,\n offset : collection.length >= 1? ( collection.length - 1 ) : 0,\n order : collection.order\n }),\n limit = options.limit;\n if( !_.isUndefined( limit ) ){\n fetchOptions.limit = limit;\n }\n\n return ControlledFetchMixin.fetch.call( this, fetchOptions )\n .done( function _postFetchMore( fetchData ){\n var numFetched = _.isArray( fetchData )? fetchData.length : 0;\n // anything less than a full page means we got all there is to get\n if( !limit || numFetched < limit ){\n collection.allFetched = true;\n collection.trigger( 'all-fetched', collection );\n }\n }\n );\n },\n\n /** create a new history and by default set it to be the current history */\n create : function create( data, hdas, historyOptions, xhrOptions ){\n //TODO: .create is actually a collection function that's overridden here\n var collection = this,\n xhr = jQuery.getJSON( Galaxy.root + 'history/create_new_current' );\n return xhr.done( function( newData ){\n collection.setCurrent( new History( newData, [], historyOptions || {} ) );\n });\n },\n\n /** set the current history to the given history, placing it first in the collection.\n * Pass standard bbone options for use in unshift.\n * @triggers new-current passed history and this collection\n */\n setCurrent : function( history, options ){\n options = options || {};\n // new histories go in the front\n this.unshift( history, options );\n this.currentHistoryId = history.get( 'id' );\n if( !options.silent ){\n this.trigger( 'new-current', history, this );\n }\n return this;\n },\n\n /** override to reset allFetched flag to false */\n reset : function( models, options ){\n this.allFetched = false;\n return Backbone.Collection.prototype.reset.call( this, models, options );\n },\n\n toString: function toString(){\n return 'HistoryCollection(' + this.length + ')';\n }\n});\n\n//==============================================================================\nreturn {\n History : History,\n HistoryCollection : HistoryCollection\n};});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-model.js\n ** module id = 99\n ** module chunks = 3\n **/","define([\n \"mvc/list/list-item\",\n \"ui/loading-indicator\",\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/search-input\"\n], function( LIST_ITEM, LoadingIndicator, BASE_MVC, _l ){\n\nvar logNamespace = 'list';\n/* ============================================================================\nTODO:\n\n============================================================================ */\n/** @class View for a list/collection of models and the sub-views of those models.\n * Sub-views must (at least have the interface if not) inherit from ListItemView.\n * (For a list panel that also includes some 'container' model (History->HistoryContents)\n * use ModelWithListPanel)\n *\n * Allows for:\n * searching collection/sub-views\n * selecting/multi-selecting sub-views\n *\n * Currently used:\n * for dataset/dataset-choice\n * as superclass of ModelListPanel\n */\nvar ListPanel = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend(/** @lends ListPanel.prototype */{\n _logNamespace : logNamespace,\n\n /** class to use for constructing the sub-views */\n viewClass : LIST_ITEM.ListItemView,\n /** class to used for constructing collection of sub-view models */\n collectionClass : Backbone.Collection,\n\n tagName : 'div',\n className : 'list-panel',\n\n /** (in ms) that jquery effects will use */\n fxSpeed : 'fast',\n\n /** string to display when the collection has no contents */\n emptyMsg : _l( 'This list is empty' ),\n /** displayed when no items match the search terms */\n noneFoundMsg : _l( 'No matching items found' ),\n /** string used for search placeholder */\n searchPlaceholder : _l( 'search' ),\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events\n * @param {Object} attributes optional settings for the list\n */\n initialize : function( attributes, options ){\n attributes = attributes || {};\n // set the logger if requested\n if( attributes.logger ){\n this.logger = attributes.logger;\n }\n this.log( this + '.initialize:', attributes );\n\n // ---- instance vars\n /** how quickly should jquery fx run? */\n this.fxSpeed = _.has( attributes, 'fxSpeed' )?( attributes.fxSpeed ):( this.fxSpeed );\n\n /** filters for displaying subviews */\n this.filters = [];\n /** current search terms */\n this.searchFor = attributes.searchFor || '';\n\n /** loading indicator */\n this.indicator = new LoadingIndicator( this.$el );\n\n /** currently showing selectors on items? */\n this.selecting = ( attributes.selecting !== undefined )? attributes.selecting : true;\n //this.selecting = false;\n\n /** cached selected item.model.ids to persist btwn renders */\n this.selected = attributes.selected || [];\n /** the last selected item.model.id */\n this.lastSelected = null;\n\n /** are sub-views draggable */\n this.dragItems = attributes.dragItems || false;\n\n /** list item view class (when passed models) */\n this.viewClass = attributes.viewClass || this.viewClass;\n\n /** list item views */\n this.views = [];\n /** list item models */\n this.collection = attributes.collection || ( new this.collectionClass([]) );\n\n /** filter fns run over collection items to see if they should show in the list */\n this.filters = attributes.filters || [];\n\n /** override $scrollContainer fn via attributes - fn should return jq for elem to call scrollTo on */\n this.$scrollContainer = attributes.$scrollContainer || this.$scrollContainer;\n\n//TODO: remove\n this.title = attributes.title || '';\n this.subtitle = attributes.subtitle || '';\n\n this._setUpListeners();\n },\n\n /** free any sub-views the list has */\n freeViews : function(){\n//TODO: stopListening? remove?\n _.each( this.views, function( view ){\n view.off();\n });\n this.views = [];\n return this;\n },\n\n // ------------------------------------------------------------------------ listeners\n /** create any event listeners for the list\n */\n _setUpListeners : function(){\n this.off();\n\n //TODO: move errorHandler down into list-view from history-view or\n // pass to global error handler (Galaxy)\n this.on( 'error', function( model, xhr, options, msg, details ){\n //this.errorHandler( model, xhr, options, msg, details );\n console.error( model, xhr, options, msg, details );\n }, this );\n\n // show hide the loading indicator\n this.on( 'loading', function(){\n this._showLoadingIndicator( 'loading...', 40 );\n }, this );\n this.on( 'loading-done', function(){\n this._hideLoadingIndicator( 40 );\n }, this );\n\n // throw the first render up as a diff namespace using once (for outside consumption)\n this.once( 'rendered', function(){\n this.trigger( 'rendered:initial', this );\n }, this );\n\n // debugging\n if( this.logger ){\n this.on( 'all', function( event ){\n this.log( this + '', arguments );\n }, this );\n }\n\n this._setUpCollectionListeners();\n this._setUpViewListeners();\n return this;\n },\n\n /** listening for collection events */\n _setUpCollectionListeners : function(){\n this.log( this + '._setUpCollectionListeners', this.collection );\n this.collection.off();\n\n // bubble up error events\n this.collection.on( 'error', function( model, xhr, options, msg, details ){\n this.trigger( 'error', model, xhr, options, msg, details );\n }, this );\n\n this.collection.on( 'reset', function(){\n this.renderItems();\n }, this );\n this.collection.on( 'add', this.addItemView, this );\n this.collection.on( 'remove', this.removeItemView, this );\n\n // debugging\n if( this.logger ){\n this.collection.on( 'all', function( event ){\n this.info( this + '(collection)', arguments );\n }, this );\n }\n return this;\n },\n\n /** listening for sub-view events that bubble up with the 'view:' prefix */\n _setUpViewListeners : function(){\n this.log( this + '._setUpViewListeners' );\n\n // shift to select a range\n this.on( 'view:selected', function( view, ev ){\n if( ev && ev.shiftKey && this.lastSelected ){\n var lastSelectedView = this.viewFromModelId( this.lastSelected );\n if( lastSelectedView ){\n this.selectRange( view, lastSelectedView );\n }\n } else if( ev && ev.altKey && !this.selecting ){\n this.showSelectors();\n }\n this.selected.push( view.model.id );\n this.lastSelected = view.model.id;\n }, this );\n\n this.on( 'view:de-selected', function( view, ev ){\n this.selected = _.without( this.selected, view.model.id );\n //this.lastSelected = view.model.id;\n }, this );\n },\n\n // ------------------------------------------------------------------------ rendering\n /** Render this content, set up ui.\n * @param {Number or String} speed the speed of the render\n */\n render : function( speed ){\n this.log( this + '.render', speed );\n var $newRender = this._buildNewRender();\n this._setUpBehaviors( $newRender );\n this._queueNewRender( $newRender, speed );\n return this;\n },\n\n /** Build a temp div containing the new children for the view's $el.\n */\n _buildNewRender : function(){\n this.debug( this + '(ListPanel)._buildNewRender' );\n var $newRender = $( this.templates.el( {}, this ) );\n this._renderControls( $newRender );\n this._renderTitle( $newRender );\n this._renderSubtitle( $newRender );\n this._renderSearch( $newRender );\n this.renderItems( $newRender );\n return $newRender;\n },\n\n /** Build a temp div containing the new children for the view's $el.\n */\n _renderControls : function( $newRender ){\n this.debug( this + '(ListPanel)._renderControls' );\n var $controls = $( this.templates.controls( {}, this ) );\n $newRender.find( '.controls' ).replaceWith( $controls );\n return $controls;\n },\n\n /**\n */\n _renderTitle : function( $where ){\n //$where = $where || this.$el;\n //$where.find( '.title' ).replaceWith( ... )\n },\n\n /**\n */\n _renderSubtitle : function( $where ){\n //$where = $where || this.$el;\n //$where.find( '.title' ).replaceWith( ... )\n },\n\n /** Fade out the old el, swap in the new contents, then fade in.\n * @param {Number or String} speed jq speed to use for rendering effects\n * @fires rendered when rendered\n */\n _queueNewRender : function( $newRender, speed ) {\n speed = ( speed === undefined )?( this.fxSpeed ):( speed );\n var panel = this;\n panel.log( '_queueNewRender:', $newRender, speed );\n\n $( panel ).queue( 'fx', [\n function( next ){ this.$el.fadeOut( speed, next ); },\n function( next ){\n panel._swapNewRender( $newRender );\n next();\n },\n function( next ){ this.$el.fadeIn( speed, next ); },\n function( next ){\n panel.trigger( 'rendered', panel );\n next();\n }\n ]);\n },\n\n /** empty out the current el, move the $newRender's children in */\n _swapNewRender : function( $newRender ){\n this.$el.empty().attr( 'class', this.className ).append( $newRender.children() );\n if( this.selecting ){ this.showSelectors( 0 ); }\n return this;\n },\n\n /** */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n $where.find( '.controls [title]' ).tooltip({ placement: 'bottom' });\n // set up the pupup for actions available when multi selecting\n this._renderMultiselectActionMenu( $where );\n return this;\n },\n\n /** render a menu containing the actions available to sets of selected items */\n _renderMultiselectActionMenu : function( $where ){\n $where = $where || this.$el;\n var $menu = $where.find( '.list-action-menu' ),\n actions = this.multiselectActions();\n if( !actions.length ){\n return $menu.empty();\n }\n\n var $newMenu = $([\n '
                            ',\n '',\n '
                              ', '
                            ',\n '
                            '\n ].join(''));\n var $actions = actions.map( function( action ){\n var html = [ '
                          16. ', action.html, '
                          17. ' ].join( '' );\n return $( html ).click( function( ev ){\n ev.preventDefault();\n return action.func( ev );\n });\n });\n $newMenu.find( 'ul' ).append( $actions );\n $menu.replaceWith( $newMenu );\n return $newMenu;\n },\n\n /** return a list of plain objects used to render multiselect actions menu. Each object should have:\n * html: an html string used as the anchor contents\n * func: a function called when the anchor is clicked (passed the click event)\n */\n multiselectActions : function(){\n return [];\n },\n\n // ------------------------------------------------------------------------ sub-$element shortcuts\n /** the scroll container for this panel - can be $el, $el.parent(), or grandparent depending on context */\n $scrollContainer : function(){\n // override or set via attributes.$scrollContainer\n return this.$el.parent().parent();\n },\n /** */\n $list : function( $where ){\n return ( $where || this.$el ).find( '> .list-items' );\n },\n /** container where list messages are attached */\n $messages : function( $where ){\n return ( $where || this.$el ).find( '> .controls .messages' );\n },\n /** the message displayed when no views can be shown (no views, none matching search) */\n $emptyMessage : function( $where ){\n return ( $where || this.$el ).find( '> .empty-message' );\n },\n\n // ------------------------------------------------------------------------ hda sub-views\n /**\n * @param {jQuery} $whereTo what dom element to prepend the sub-views to\n * @returns the visible item views\n */\n renderItems : function( $whereTo ){\n $whereTo = $whereTo || this.$el;\n var panel = this;\n panel.log( this + '.renderItems', $whereTo );\n\n var $list = panel.$list( $whereTo );\n//TODO: free prev. views?\n panel.views = panel._filterCollection().map( function( itemModel ){\n//TODO: creates views each time - not neccessarily good\n//TODO: pass speed here\n return panel._createItemView( itemModel ).render( 0 );\n });\n //panel.debug( item$els );\n //panel.debug( newViews );\n\n $list.empty();\n if( panel.views.length ){\n panel._attachItems( $whereTo );\n panel.$emptyMessage( $whereTo ).hide();\n\n } else {\n panel._renderEmptyMessage( $whereTo ).show();\n }\n panel.trigger( 'views:ready', panel.views );\n\n return panel.views;\n },\n\n /** Filter the collection to only those models that should be currently viewed */\n _filterCollection : function(){\n // override this\n var panel = this;\n return panel.collection.filter( _.bind( panel._filterItem, panel ) );\n },\n\n /** Should the model be viewable in the current state?\n * Checks against this.filters and this.searchFor\n */\n _filterItem : function( model ){\n // override this\n var panel = this;\n return ( _.every( panel.filters.map( function( fn ){ return fn.call( model ); }) ) )\n && ( !panel.searchFor || model.matchesAll( panel.searchFor ) );\n },\n\n /** Create a view for a model and set up it's listeners */\n _createItemView : function( model ){\n var ViewClass = this._getItemViewClass( model ),\n options = _.extend( this._getItemViewOptions( model ), {\n model : model\n }),\n view = new ViewClass( options );\n this._setUpItemViewListeners( view );\n return view;\n },\n\n /** Get the bbone view class based on the model */\n _getItemViewClass : function( model ){\n // override this\n return this.viewClass;\n },\n\n /** Get the options passed to the new view based on the model */\n _getItemViewOptions : function( model ){\n // override this\n return {\n //logger : this.logger,\n fxSpeed : this.fxSpeed,\n expanded : false,\n selectable : this.selecting,\n selected : _.contains( this.selected, model.id ),\n draggable : this.dragItems\n };\n },\n\n /** Set up listeners for new models */\n _setUpItemViewListeners : function( view ){\n var panel = this;\n // send all events to the panel, re-namspaceing them with the view prefix\n view.on( 'all', function(){\n var args = Array.prototype.slice.call( arguments, 0 );\n args[0] = 'view:' + args[0];\n panel.trigger.apply( panel, args );\n });\n\n // drag multiple - hijack ev.setData to add all selected items\n view.on( 'draggable:dragstart', function( ev, v ){\n //TODO: set multiple drag data here\n var json = {},\n selected = this.getSelectedModels();\n if( selected.length ){\n json = selected.toJSON();\n } else {\n json = [ v.model.toJSON() ];\n }\n ev.dataTransfer.setData( 'text', JSON.stringify( json ) );\n //ev.dataTransfer.setDragImage( v.el, 60, 60 );\n }, this );\n\n // debugging\n //if( this.logger ){\n // view.on( 'all', function( event ){\n // this.log( this + '(view)', arguments );\n // }, this );\n //}\n return panel;\n },\n\n /** Attach views in this.views to the model based on $whereTo */\n _attachItems : function( $whereTo ){\n //ASSUMES: $list has been emptied\n this.$list( $whereTo ).append( this.views.map( function( view ){\n return view.$el;\n }));\n return this;\n },\n\n /** render the empty/none-found message */\n _renderEmptyMessage : function( $whereTo ){\n this.debug( '_renderEmptyMessage', $whereTo, this.searchFor );\n var text = this.searchFor? this.noneFoundMsg : this.emptyMsg;\n return this.$emptyMessage( $whereTo ).text( text );\n },\n\n /** collapse all item views */\n expandAll : function(){\n _.each( this.views, function( view ){\n view.expand();\n });\n },\n\n /** collapse all item views */\n collapseAll : function(){\n _.each( this.views, function( view ){\n view.collapse();\n });\n },\n\n // ------------------------------------------------------------------------ collection/views syncing\n /** Add a view (if the model should be viewable) to the panel */\n addItemView : function( model, collection, options ){\n this.log( this + '.addItemView:', model );\n var panel = this;\n if( !panel._filterItem( model ) ){ return undefined; }\n\n var view = panel._createItemView( model );\n // hide the empty message if only view\n $( view ).queue( 'fx', [\n //TODO:? could poss. pubsub this\n function( next ){ panel.$emptyMessage().fadeOut( panel.fxSpeed, next ); },\n function( next ){\n panel._attachView( view );\n next();\n }\n ]);\n return view;\n },\n\n /** internal fn to add view (to both panel.views and panel.$list) */\n _attachView : function( view ){\n var panel = this;\n // override to control where the view is added, how/whether it's rendered\n panel.views.push( view );\n panel.$list().append( view.render( 0 ).$el.hide() );\n panel.trigger( 'view:attached', view );\n view.$el.slideDown( panel.fxSpeed, function(){\n panel.trigger( 'view:attached:rendered' );\n });\n },\n\n /** Remove a view from the panel (if found) */\n removeItemView : function( model, collection, options ){\n this.log( this + '.removeItemView:', model );\n var panel = this,\n view = panel.viewFromModel( model );\n if( !view ){ return undefined; }\n panel.views = _.without( panel.views, view );\n panel.trigger( 'view:removed', view );\n\n // potentially show the empty message if no views left\n // use anonymous queue here - since remove can happen multiple times\n $({}).queue( 'fx', [\n function( next ){ view.$el.fadeOut( panel.fxSpeed, next ); },\n function( next ){\n view.remove();\n panel.trigger( 'view:removed:rendered' );\n if( !panel.views.length ){\n panel._renderEmptyMessage().fadeIn( panel.fxSpeed, next );\n } else {\n next();\n }\n }\n ]);\n return view;\n },\n\n /** get views based on model.id */\n viewFromModelId : function( id ){\n for( var i = 0; i < this.views.length; i++ ){\n if( this.views[i].model.id === id ){\n return this.views[i];\n }\n }\n return undefined;\n },\n\n /** get views based on model */\n viewFromModel : function( model ){\n if( !model ){ return undefined; }\n return this.viewFromModelId( model.id );\n },\n\n /** get views based on model properties */\n viewsWhereModel : function( properties ){\n return this.views.filter( function( view ){\n //return view.model.matches( properties );\n//TODO: replace with _.matches (underscore 1.6.0)\n var json = view.model.toJSON();\n for( var key in properties ){\n if( properties.hasOwnProperty( key ) ){\n if( json[ key ] !== view.model.get( key ) ){\n return false;\n }\n }\n }\n return true;\n });\n },\n\n /** A range of views between (and including) viewA and viewB */\n viewRange : function( viewA, viewB ){\n if( viewA === viewB ){ return ( viewA )?( [ viewA ] ):( [] ); }\n\n var indexA = this.views.indexOf( viewA ),\n indexB = this.views.indexOf( viewB );\n\n // handle not found\n if( indexA === -1 || indexB === -1 ){\n if( indexA === indexB ){ return []; }\n return ( indexA === -1 )?( [ viewB ] ):( [ viewA ] );\n }\n // reverse if indeces are\n //note: end inclusive\n return ( indexA < indexB )?\n this.views.slice( indexA, indexB + 1 ) :\n this.views.slice( indexB, indexA + 1 );\n },\n\n // ------------------------------------------------------------------------ searching\n /** render a search input for filtering datasets shown\n * (see SearchableMixin in base-mvc for implementation of the actual searching)\n * return will start the search\n * esc will clear the search\n * clicking the clear button will clear the search\n * uses searchInput in ui.js\n */\n _renderSearch : function( $where ){\n $where.find( '.controls .search-input' ).searchInput({\n placeholder : this.searchPlaceholder,\n initialVal : this.searchFor,\n onfirstsearch : _.bind( this._firstSearch, this ),\n onsearch : _.bind( this.searchItems, this ),\n onclear : _.bind( this.clearSearch, this )\n });\n return $where;\n },\n\n /** What to do on the first search entered */\n _firstSearch : function( searchFor ){\n // override to load model details if necc.\n this.log( 'onFirstSearch', searchFor );\n return this.searchItems( searchFor );\n },\n\n /** filter view list to those that contain the searchFor terms */\n searchItems : function( searchFor ){\n this.searchFor = searchFor;\n this.trigger( 'search:searching', searchFor, this );\n this.renderItems();\n this.$( '> .controls .search-query' ).val( searchFor );\n return this;\n },\n\n /** clear the search filters and show all views that are normally shown */\n clearSearch : function( searchFor ){\n //this.log( 'onSearchClear', this );\n this.searchFor = '';\n this.trigger( 'search:clear', this );\n this.$( '> .controls .search-query' ).val( '' );\n this.renderItems();\n return this;\n },\n\n // ------------------------------------------------------------------------ selection\n /** @type Integer when the number of list item views is >= to this, don't animate selectors */\n THROTTLE_SELECTORS_AT : 20,\n\n /** show selectors on all visible itemViews and associated controls */\n showSelectors : function( speed ){\n speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n this.selecting = true;\n this.$( '.list-actions' ).slideDown( speed );\n speed = this.views.length >= this.THROTTLE_SELECTORS_AT? 0 : speed;\n _.each( this.views, function( view ){\n view.showSelector( speed );\n });\n //this.selected = [];\n //this.lastSelected = null;\n },\n\n /** hide selectors on all visible itemViews and associated controls */\n hideSelectors : function( speed ){\n speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n this.selecting = false;\n this.$( '.list-actions' ).slideUp( speed );\n speed = this.views.length >= this.THROTTLE_SELECTORS_AT? 0 : speed;\n _.each( this.views, function( view ){\n view.hideSelector( speed );\n });\n this.selected = [];\n this.lastSelected = null;\n },\n\n /** show or hide selectors on all visible itemViews and associated controls */\n toggleSelectors : function(){\n if( !this.selecting ){\n this.showSelectors();\n } else {\n this.hideSelectors();\n }\n },\n\n /** select all visible items */\n selectAll : function( event ){\n _.each( this.views, function( view ){\n view.select( event );\n });\n },\n\n /** deselect all visible items */\n deselectAll : function( event ){\n this.lastSelected = null;\n _.each( this.views, function( view ){\n view.deselect( event );\n });\n },\n\n /** select a range of datasets between A and B */\n selectRange : function( viewA, viewB ){\n var range = this.viewRange( viewA, viewB );\n _.each( range, function( view ){\n view.select();\n });\n return range;\n },\n\n /** return an array of all currently selected itemViews */\n getSelectedViews : function(){\n return _.filter( this.views, function( v ){\n return v.selected;\n });\n },\n\n /** return a collection of the models of all currenly selected items */\n getSelectedModels : function(){\n return new this.collection.constructor( _.map( this.getSelectedViews(), function( view ){\n return view.model;\n }));\n },\n\n // ------------------------------------------------------------------------ loading indicator\n//TODO: questionable\n /** hide the $el and display a loading indicator (in the $el's parent) when loading new data */\n _showLoadingIndicator : function( msg, speed, callback ){\n this.debug( '_showLoadingIndicator', this.indicator, msg, speed, callback );\n speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n if( !this.indicator ){\n this.indicator = new LoadingIndicator( this.$el, this.$el.parent() );\n this.debug( '\\t created', this.indicator );\n }\n if( !this.$el.is( ':visible' ) ){\n this.indicator.show( 0, callback );\n } else {\n this.$el.fadeOut( speed );\n this.indicator.show( msg, speed, callback );\n }\n },\n\n /** hide the loading indicator */\n _hideLoadingIndicator : function( speed, callback ){\n this.debug( '_hideLoadingIndicator', this.indicator, speed, callback );\n speed = ( speed !== undefined )?( speed ):( this.fxSpeed );\n if( this.indicator ){\n this.indicator.hide( speed, callback );\n }\n },\n\n // ------------------------------------------------------------------------ scrolling\n /** get the current scroll position of the panel in its parent */\n scrollPosition : function(){\n return this.$scrollContainer().scrollTop();\n },\n\n /** set the current scroll position of the panel in its parent */\n scrollTo : function( pos, speed ){\n speed = speed || 0;\n this.$scrollContainer().animate({ scrollTop: pos }, speed );\n return this;\n },\n\n /** Scrolls the panel to the top. */\n scrollToTop : function( speed ){\n return this.scrollTo( 0, speed );\n },\n\n /** */\n scrollToItem : function( view, speed ){\n if( !view ){ return this; }\n //var itemTop = view.$el.offset().top;\n var itemTop = view.$el.position().top;\n return this.scrollTo( itemTop, speed );\n },\n\n /** Scrolls the panel to show the content with the given id. */\n scrollToId : function( id, speed ){\n return this.scrollToItem( this.viewFromModelId( id ), speed );\n },\n\n // ------------------------------------------------------------------------ panel events\n /** event map */\n events : {\n 'click .select-all' : 'selectAll',\n 'click .deselect-all' : 'deselectAll'\n },\n\n // ------------------------------------------------------------------------ misc\n /** Return a string rep of the panel */\n toString : function(){\n return 'ListPanel(' + this.collection + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nListPanel.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var elTemplate = BASE_MVC.wrapTemplate([\n // temp container\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            '\n ]);\n\n var controlsTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n '
                            ',\n '
                            <%- view.title %>
                            ',\n '
                            ',\n '
                            <%- view.subtitle %>
                            ',\n // buttons, controls go here\n '
                            ',\n // deleted msg, etc.\n '
                            ',\n\n '
                            ',\n '
                            ',\n '
                            ',\n\n // show when selectors are shown\n '
                            ',\n '
                            ',\n '',\n '',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            '\n ]);\n\n return {\n el : elTemplate,\n controls : controlsTemplate\n };\n}());\n\n\n//=============================================================================\n/** View for a model that has a sub-collection (e.g. History, DatasetCollection)\n * Allows:\n * the model to be reset\n * auto assign panel.collection to panel.model[ panel.modelCollectionKey ]\n *\n */\nvar ModelListPanel = ListPanel.extend({\n\n /** key of attribute in model to assign to this.collection */\n modelCollectionKey : 'contents',\n\n initialize : function( attributes ){\n ListPanel.prototype.initialize.call( this, attributes );\n this.selecting = ( attributes.selecting !== undefined )? attributes.selecting : false;\n\n this.setModel( this.model, attributes );\n },\n\n /** release/free/shutdown old models and set up panel for new models\n * @fires new-model with the panel as parameter\n */\n setModel : function( model, attributes ){\n attributes = attributes || {};\n this.debug( this + '.setModel:', model, attributes );\n\n this.freeModel();\n this.freeViews();\n\n if( model ){\n var oldModelId = this.model? this.model.get( 'id' ): null;\n\n // set up the new model with user, logger, storage, events\n this.model = model;\n if( this.logger ){\n this.model.logger = this.logger;\n }\n this._setUpModelListeners();\n\n//TODO: relation btwn model, collection becoming tangled here\n // free the collection, and assign the new collection to either\n // the model[ modelCollectionKey ], attributes.collection, or an empty vanilla collection\n this.collection.off();\n this.collection = ( this.model[ this.modelCollectionKey ] )?\n this.model[ this.modelCollectionKey ]:\n ( attributes.collection || ( new this.collectionClass([]) ) );\n this._setUpCollectionListeners();\n\n if( oldModelId && model.get( 'id' ) !== oldModelId ){\n this.trigger( 'new-model', this );\n }\n }\n return this;\n },\n\n /** free the current model and all listeners for it, free any views for the model */\n freeModel : function(){\n // stop/release the previous model, and clear cache to sub-views\n if( this.model ){\n this.stopListening( this.model );\n //TODO: see base-mvc\n //this.model.free();\n //this.model = null;\n }\n return this;\n },\n\n // ------------------------------------------------------------------------ listening\n /** listening for model events */\n _setUpModelListeners : function(){\n // override\n this.log( this + '._setUpModelListeners', this.model );\n // bounce model errors up to the panel\n this.model.on( 'error', function(){\n var args = Array.prototype.slice.call( arguments, 0 );\n //args.unshift( 'model:error' );\n args.unshift( 'error' );\n this.trigger.apply( this, args );\n }, this );\n return this;\n },\n\n /** Build a temp div containing the new children for the view's $el.\n */\n _renderControls : function( $newRender ){\n this.debug( this + '(ListPanel)._renderControls' );\n var json = this.model? this.model.toJSON() : {},\n $controls = $( this.templates.controls( json, this ) );\n $newRender.find( '.controls' ).replaceWith( $controls );\n return $controls;\n },\n\n // ------------------------------------------------------------------------ misc\n /** Return a string rep of the panel */\n toString : function(){\n return 'ModelListPanel(' + this.model + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nModelListPanel.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var controlsTemplate = BASE_MVC.wrapTemplate([\n '
                            ',\n '
                            ',\n//TODO: this is really the only difference - consider factoring titlebar out\n '
                            <%- model.name %>
                            ',\n '
                            ',\n '
                            <%- view.subtitle %>
                            ',\n '
                            ',\n '
                            ',\n\n '
                            ',\n '
                            ',\n '
                            ',\n\n '
                            ',\n '
                            ',\n '',\n '',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            '\n ]);\n\n return _.extend( _.clone( ListPanel.prototype.templates ), {\n controls : controlsTemplate\n });\n}());\n\n\n//=============================================================================\n return {\n ListPanel : ListPanel,\n ModelListPanel : ModelListPanel\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/list/list-view.js\n ** module id = 100\n ** module chunks = 3\n **/","define([\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( baseMVC, _l ){\n// =============================================================================\n/** A view on any model that has a 'tags' attribute (a list of tag strings)\n * Incorporates the select2 jQuery plugin for tags display/editing:\n * http://ivaynberg.github.io/select2/\n */\nvar TagsEditor = Backbone.View\n .extend( baseMVC.LoggableMixin )\n .extend( baseMVC.HiddenUntilActivatedViewMixin ).extend({\n\n tagName : 'div',\n className : 'tags-display',\n\n /** Set up listeners, parse options */\n initialize : function( options ){\n //console.debug( this, options );\n // only listen to the model only for changes to tags - re-render\n this.listenTo( this.model, 'change:tags', function(){\n this.render();\n });\n this.hiddenUntilActivated( options.$activator, options );\n },\n\n /** Build the DOM elements, call select to on the created input, and set up behaviors */\n render : function(){\n var view = this;\n this.$el.html( this._template() );\n\n this.$input().select2({\n placeholder : 'Add tags',\n width : '100%',\n tags : function(){\n // initialize possible tags in the dropdown based on all the tags the user has used so far\n return view._getTagsUsed();\n }\n });\n\n this._setUpBehaviors();\n return this;\n },\n\n /** @returns {String} the html text used to build the view's DOM */\n _template : function(){\n return [\n //TODO: make prompt optional\n '',\n // set up initial tags by adding as CSV to input vals (necc. to init select2)\n ''\n ].join( '' );\n },\n\n /** @returns {String} the sorted, comma-separated tags from the model */\n tagsToCSV : function(){\n var tagsArray = this.model.get( 'tags' );\n if( !_.isArray( tagsArray ) || _.isEmpty( tagsArray ) ){\n return '';\n }\n return tagsArray.map( function( tag ){\n return _.escape( tag );\n }).sort().join( ',' );\n },\n\n /** @returns {jQuery} the input for this view */\n $input : function(){\n return this.$el.find( 'input.tags-input' );\n },\n\n /** @returns {String[]} all tags used by the current user */\n _getTagsUsed : function(){\n//TODO: global\n return Galaxy.user.get( 'tags_used' );\n },\n\n /** set up any event listeners on the view's DOM (mostly handled by select2) */\n _setUpBehaviors : function(){\n var view = this;\n this.$input().on( 'change', function( event ){\n // save the model's tags in either remove or added event\n view.model.save({ tags: event.val }, { silent: true });\n // if it's new, add the tag to the users tags\n if( event.added ){\n //??: solve weird behavior in FF on test.galaxyproject.org where\n // event.added.text is string object: 'String{ 0=\"o\", 1=\"n\", 2=\"e\" }'\n view._addNewTagToTagsUsed( event.added.text + '' );\n }\n });\n },\n\n /** add a new tag (if not already there) to the list of all tags used by the user\n * @param {String} newTag the tag to add to the list of used\n */\n _addNewTagToTagsUsed : function( newTag ){\n//TODO: global\n var tagsUsed = Galaxy.user.get( 'tags_used' );\n if( !_.contains( tagsUsed, newTag ) ){\n tagsUsed.push( newTag );\n tagsUsed.sort();\n Galaxy.user.set( 'tags_used', tagsUsed );\n }\n },\n\n /** shut down event listeners and remove this view's DOM */\n remove : function(){\n this.$input.off();\n this.stopListening( this.model );\n Backbone.View.prototype.remove.call( this );\n },\n\n /** string rep */\n toString : function(){ return [ 'TagsEditor(', this.model + '', ')' ].join(''); }\n});\n\n// =============================================================================\nreturn {\n TagsEditor : TagsEditor\n};\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/tag.js\n ** module id = 101\n ** module chunks = 3\n **/","/** This renders the content of the ftp popup **/\ndefine(['utils/utils'], function(Utils) {\nreturn Backbone.View.extend({\n // render\n initialize: function(options) {\n // link options\n this.options = Utils.merge(options, {\n class_add : 'upload-icon-button fa fa-square-o',\n class_remove : 'upload-icon-button fa fa-check-square-o',\n class_partial : 'upload-icon-button fa fa-minus-square-o',\n collection : null,\n onchange : function() {},\n onadd : function() {},\n onremove : function() {}\n });\n\n // link this\n var self = this;\n\n // link app\n this.collection = this.options.collection;\n\n // set template\n this.setElement(this._template());\n\n // list of rows\n this.rows = [];\n\n // load extension\n Utils.get({\n url : Galaxy.root + 'api/remote_files',\n success : function(ftp_files) { self._fill(ftp_files); },\n error : function() { self._fill(); }\n });\n },\n\n // fill table\n _fill: function(ftp_files) {\n if (ftp_files && ftp_files.length > 0) {\n // add table\n this.$el.find('#upload-ftp-content').html($(this._templateTable()));\n\n // add files to table\n var size = 0;\n for (index in ftp_files) {\n this.rows.push(this._add(ftp_files[index]));\n size += ftp_files[index].size;\n }\n\n // update stats\n this.$el.find('#upload-ftp-number').html(ftp_files.length + ' files');\n this.$el.find('#upload-ftp-disk').html(Utils.bytesToString (size, true));\n\n // add event handler to select/unselect all\n if (this.collection) {\n var self = this;\n this.$('._has_collection').show();\n this.$select_all = $('#upload-selectall');\n this.$select_all.addClass(this.options.class_add);\n this.$select_all.on('click', function() {\n var add = self.$select_all.hasClass(self.options.class_add);\n for (index in ftp_files) {\n var ftp_file = ftp_files[index];\n var model_index = self._find(ftp_file);\n if(!model_index && add || model_index && !add) {\n self.rows[index].trigger('click');\n }\n }\n });\n this._refresh();\n }\n } else {\n this.$el.find('#upload-ftp-content').html($(this._templateInfo()));\n }\n this.$el.find('#upload-ftp-wait').hide();\n },\n\n // add\n _add: function(ftp_file) {\n // link this\n var self = this;\n\n // create new item\n var $it = $(this._templateRow(ftp_file));\n\n // identify icon\n var $icon = $it.find('.icon');\n\n // append to table\n $(this.el).find('tbody').append($it);\n\n // collection mode with add/remove triggers\n if (this.collection) {\n // find model and set initial 'add' icon class\n var icon_class = '';\n if (this._find(ftp_file)) {\n icon_class = this.options.class_remove;\n } else {\n icon_class = this.options.class_add;\n }\n $icon.addClass(icon_class);\n\n // click triggers add/remove events\n $it.on('click', function() {\n var model_index = self._find(ftp_file);\n $icon.removeClass();\n if (!model_index) {\n self.options.onadd(ftp_file);\n $icon.addClass(self.options.class_remove);\n } else {\n self.options.onremove(model_index);\n $icon.addClass(self.options.class_add);\n }\n self._refresh();\n });\n } else {\n // click triggers only change\n $it.on('click', function() {\n self.options.onchange(ftp_file);\n });\n }\n\n // return dom handler\n return $it;\n },\n\n // refresh\n _refresh: function() {\n var filtered = this.collection.where({file_mode: 'ftp', enabled: true});\n this.$select_all.removeClass();\n if (filtered.length == 0) {\n this.$select_all.addClass(this.options.class_add);\n } else {\n if (filtered.length == this.rows.length) {\n this.$select_all.addClass(this.options.class_remove);\n } else {\n this.$select_all.addClass(this.options.class_partial);\n }\n }\n },\n\n // get model index\n _find: function(ftp_file) {\n var item = this.collection.findWhere({\n file_path : ftp_file.path,\n file_mode : 'ftp',\n enabled : true\n });\n return item && item.get('id');\n },\n\n // template row\n _templateRow: function(options) {\n return '' +\n '
                            ' +\n '' + options.path + '' +\n '' + Utils.bytesToString(options.size) + '' +\n '' + options.ctime + '' +\n '';\n },\n\n // load table template\n _templateTable: function() {\n return 'Available files: ' +\n '' +\n '' +\n '  ' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
                            NameSizeCreated
                            ';\n },\n\n // load table template\n _templateInfo: function() {\n return '
                            ' +\n 'Your FTP directory does not contain any files.' +\n '
                            ';\n },\n\n // load html template\n _template: function() {\n return '
                            ' +\n '
                            ' +\n '
                            This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at ' + this.options.ftp_upload_site + ' using your Galaxy credentials (email address and password).
                            ' +\n '
                            ' +\n '
                            ';\n }\n});\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/upload/upload-ftp.js\n ** module id = 103\n ** module chunks = 3\n **/","/** This renders the content of the settings popup, allowing users to specify flags i.e. for space-to-tab conversion **/\ndefine(['utils/utils'], function(Utils) {\nreturn Backbone.View.extend({\n // options\n options: {\n class_check : 'upload-icon-button fa fa-check-square-o',\n class_uncheck : 'upload-icon-button fa fa-square-o'\n },\n\n // initialize\n initialize: function(app) {\n // link app\n this.app = app;\n\n // link this\n var self = this;\n\n // set template\n this.setElement(this._template());\n\n // link model\n this.model = this.app.model;\n\n // ui event: space-to-tab\n this.$('#upload-space-to-tab').on('click', function() {\n self._switchState('#upload-space-to-tab', 'space_to_tab');\n });\n\n // ui event: to-posix-lines\n this.$('#upload-to-posix-lines').on('click', function() {\n self._switchState('#upload-to-posix-lines', 'to_posix_lines');\n });\n\n // render\n this.render();\n },\n\n // render\n render: function() {\n // render states\n this._renderState('#upload-space-to-tab', this.model.get('space_to_tab'));\n this._renderState('#upload-to-posix-lines', this.model.get('to_posix_lines'));\n\n // disable options\n var $cover = this.$('#upload-settings-cover');\n if (!this.model.get('enabled')) {\n $cover.show();\n } else {\n $cover.hide();\n }\n },\n\n // switch state\n _switchState: function (element_id, parameter_id) {\n if (this.model.get('enabled')) {\n var checked = !this.model.get(parameter_id);\n this.model.set(parameter_id, checked);\n this._renderState(element_id, checked);\n }\n },\n\n // render state\n _renderState: function (element_id, checked) {\n var $it = this.$(element_id);\n $it.removeClass();\n if (checked) {\n $it.addClass(this.options.class_check);\n } else {\n $it.addClass(this.options.class_uncheck);\n }\n },\n\n // load template\n _template: function() {\n return '
                            ' +\n '
                            ' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
                            Convert spaces to tabs
                            Use POSIX standard
                            ' +\n '
                            ';\n }\n});\n\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/upload/upload-settings.js\n ** module id = 104\n ** module chunks = 3\n **/","(function (factory) {\n if (typeof define === 'function' && define.amd) {\n define([], factory);\n } else {\n // Browser globals\n factory(jQuery);\n }\n\n}(function () {\n//=============================================================================\n\n jQuery.fn.extend({\n hoverhighlight : function $hoverhighlight( scope, color ){\n scope = scope || 'body';\n if( !this.size() ){ return this; }\n\n $( this ).each( function(){\n var $this = $( this ),\n targetSelector = $this.data( 'target' );\n\n if( targetSelector ){\n $this.mouseover( function( ev ){\n $( targetSelector, scope ).css({\n background: color\n });\n })\n .mouseout( function( ev ){\n $( targetSelector ).css({\n background: ''\n });\n });\n }\n });\n return this;\n }\n });\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/ui/hoverhighlight.js\n ** module id = 107\n ** module chunks = 3\n **/","// from: https://raw.githubusercontent.com/umdjs/umd/master/jqueryPlugin.js\n// Uses AMD or browser globals to create a jQuery plugin.\n(function (factory) {\n if (typeof define === 'function' && define.amd) {\n //TODO: So...this turns out to be an all or nothing thing. If I load jQuery in the define below, it will\n // (of course) wipe the old jquery *and all the plugins loaded into it*. So the define below *is still\n // relying on jquery being loaded globally* in order to preserve plugins.\n define([], factory);\n } else {\n // Browser globals\n factory(jQuery);\n }\n\n}(function () {\n var _l = window._l || function( s ){ return s; };\n\n /** searchInput: (jQuery plugin)\n * Creates a search input, a clear button, and loading indicator\n * within the selected node.\n *\n * When the user either presses return or enters some minimal number\n * of characters, a callback is called. Pressing ESC when the input\n * is focused will clear the input and call a separate callback.\n */\n function searchInput( parentNode, options ){\n//TODO: consolidate with tool menu functionality, use there\n var KEYCODE_ESC = 27,\n KEYCODE_RETURN = 13,\n $parentNode = $( parentNode ),\n firstSearch = true,\n defaults = {\n initialVal : '',\n name : 'search',\n placeholder : 'search',\n classes : '',\n onclear : function(){},\n onfirstsearch : null,\n onsearch : function( inputVal ){},\n minSearchLen : 0,\n escWillClear : true,\n oninit : function(){}\n };\n\n // .................................................................... input rendering and events\n // visually clear the search, trigger an event, and call the callback\n function clearSearchInput( event ){\n var $input = $( this ).parent().children( 'input' );\n //console.debug( this, 'clear', $input );\n $input.focus().val( '' ).trigger( 'clear:searchInput' );\n options.onclear();\n }\n\n // search for searchTerms, trigger an event, call the appropo callback (based on whether this is the first)\n function search( event, searchTerms ){\n //console.debug( this, 'searching', searchTerms );\n //TODO: I don't think this is classic jq custom event form? search.searchInput?\n $( this ).trigger( 'search:searchInput', searchTerms );\n if( typeof options.onfirstsearch === 'function' && firstSearch ){\n firstSearch = false;\n options.onfirstsearch( searchTerms );\n } else {\n options.onsearch( searchTerms );\n }\n }\n\n // .................................................................... input rendering and events\n function inputTemplate(){\n // class search-query is bootstrap 2.3 style that now lives in base.less\n return [ '' ].join( '' );\n }\n\n // the search input that responds to keyboard events and displays the search value\n function $input(){\n return $( inputTemplate() )\n // select all text on a focus\n .focus( function( event ){\n $( this ).select();\n })\n // attach behaviors to esc, return if desired, search on some min len string\n .keyup( function( event ){\n event.preventDefault();\n event.stopPropagation();\n//TODO: doesn't work\n if( !$( this ).val() ){ $( this ).blur(); }\n\n // esc key will clear if desired\n if( event.which === KEYCODE_ESC && options.escWillClear ){\n clearSearchInput.call( this, event );\n\n } else {\n var searchTerms = $( this ).val();\n // return key or the search string len > minSearchLen (if not 0) triggers search\n if( ( event.which === KEYCODE_RETURN )\n || ( options.minSearchLen && searchTerms.length >= options.minSearchLen ) ){\n search.call( this, event, searchTerms );\n } else if( !searchTerms.length ){\n clearSearchInput.call( this, event );\n }\n }\n })\n .on( 'change', function( event ){\n search.call( this, event, $( this ).val() );\n })\n .val( options.initialVal );\n }\n\n // .................................................................... clear button rendering and events\n // a button for clearing the search bar, placed on the right hand side\n function $clearBtn(){\n return $([ '' ].join('') )\n .tooltip({ placement: 'bottom' })\n .click( function( event ){\n clearSearchInput.call( this, event );\n });\n }\n\n // .................................................................... loadingIndicator rendering\n // a button for clearing the search bar, placed on the right hand side\n function $loadingIndicator(){\n return $([ '' ].join('') )\n .hide().tooltip({ placement: 'bottom' });\n }\n\n // .................................................................... commands\n // visually swap the load, clear buttons\n function toggleLoadingIndicator(){\n $parentNode.find( '.search-loading' ).toggle();\n $parentNode.find( '.search-clear' ).toggle();\n }\n\n // .................................................................... init\n // string command (not constructor)\n if( jQuery.type( options ) === 'string' ){\n if( options === 'toggle-loading' ){\n toggleLoadingIndicator();\n }\n return $parentNode;\n }\n\n // initial render\n if( jQuery.type( options ) === 'object' ){\n options = jQuery.extend( true, {}, defaults, options );\n }\n //NOTE: prepended\n return $parentNode.addClass( 'search-input' ).prepend([ $input(), $clearBtn(), $loadingIndicator() ]);\n }\n\n // as jq plugin\n jQuery.fn.extend({\n searchInput : function $searchInput( options ){\n return this.each( function(){\n return searchInput( this, options );\n });\n }\n });\n}));\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/ui/search-input.js\n ** module id = 108\n ** module chunks = 3\n **/","define([], function(){\n// Alphanumeric/natural sort fn\nfunction naturalSort(a, b) {\n // setup temp-scope variables for comparison evauluation\n var re = /(-?[0-9\\.]+)/g,\n x = a.toString().toLowerCase() || '',\n y = b.toString().toLowerCase() || '',\n nC = String.fromCharCode(0),\n xN = x.replace( re, nC + '$1' + nC ).split(nC),\n yN = y.replace( re, nC + '$1' + nC ).split(nC),\n xD = (new Date(x)).getTime(),\n yD = xD ? (new Date(y)).getTime() : null;\n // natural sorting of dates\n if ( yD ) {\n if ( xD < yD ) { return -1; }\n else if ( xD > yD ) { return 1; }\n }\n // natural sorting through split numeric strings and default strings\n var oFxNcL, oFyNcL;\n for ( var cLoc = 0, numS = Math.max(xN.length, yN.length); cLoc < numS; cLoc++ ) {\n oFxNcL = parseFloat(xN[cLoc]) || xN[cLoc];\n oFyNcL = parseFloat(yN[cLoc]) || yN[cLoc];\n if (oFxNcL < oFyNcL) { return -1; }\n else if (oFxNcL > oFyNcL) { return 1; }\n }\n return 0;\n}\n\nreturn naturalSort;\n})\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/utils/natural-sort.js\n ** module id = 110\n ** module chunks = 3\n **/","/*\n galaxy upload plugins - requires FormData and XMLHttpRequest\n*/\n;(function($){\n // add event properties\n jQuery.event.props.push(\"dataTransfer\");\n\n /**\n Posts file data to the API\n */\n $.uploadpost = function (config) {\n // parse options\n var cnf = $.extend({}, {\n data : {},\n success : function() {},\n error : function() {},\n progress : function() {},\n url : null,\n maxfilesize : 2048,\n error_filesize : 'File exceeds 2GB. Please use a FTP client.',\n error_default : 'Please make sure the file is available.',\n error_server : 'Upload request failed.',\n error_login : 'Uploads require you to log in.'\n }, config);\n\n // link data\n var data = cnf.data;\n\n // check errors\n if (data.error_message) {\n cnf.error(data.error_message);\n return;\n }\n\n // construct form data\n var form = new FormData();\n for (var key in data.payload) {\n form.append(key, data.payload[key]);\n }\n\n // add files to submission\n var sizes = 0;\n for (var key in data.files) {\n var d = data.files[key];\n form.append(d.name, d.file, d.file.name);\n sizes += d.file.size;\n }\n\n // check file size, unless it's an ftp file\n if (sizes > 1048576 * cnf.maxfilesize) {\n cnf.error(cnf.error_filesize);\n return;\n }\n\n // prepare request\n xhr = new XMLHttpRequest();\n xhr.open('POST', cnf.url, true);\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.setRequestHeader('Cache-Control', 'no-cache');\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n // captures state changes\n xhr.onreadystatechange = function() {\n // check for request completed, server connection closed\n if (xhr.readyState == xhr.DONE) {\n // parse response\n var response = null;\n if (xhr.responseText) {\n try {\n response = jQuery.parseJSON(xhr.responseText);\n } catch (e) {\n response = xhr.responseText;\n }\n }\n // pass any error to the error option\n if (xhr.status < 200 || xhr.status > 299) {\n var text = xhr.statusText;\n if (xhr.status == 403) {\n text = cnf.error_login;\n } else if (xhr.status == 0) {\n text = cnf.error_server;\n } else if (!text) {\n text = cnf.error_default;\n }\n cnf.error(text + ' (' + xhr.status + ')');\n } else {\n cnf.success(response);\n }\n }\n }\n\n // prepare upload progress\n xhr.upload.addEventListener('progress', function(e) {\n if (e.lengthComputable) {\n cnf.progress(Math.round((e.loaded * 100) / e.total));\n }\n }, false);\n\n // send request\n Galaxy.emit.debug('uploadbox::uploadpost()', 'Posting following data.', cnf);\n xhr.send(form);\n }\n\n /**\n Handles the upload events drag/drop etc.\n */\n $.fn.uploadinput = function(options) {\n // initialize\n var el = this;\n var opts = $.extend({}, {\n ondragover : function() {},\n ondragleave : function() {},\n onchange : function() {},\n multiple : false\n }, options);\n\n // append hidden upload field\n var $input = $('');\n el.append($input.change(function (e) {\n opts.onchange(e.target.files);\n $(this).val('');\n }));\n\n // drag/drop events\n el.on('drop', function (e) {\n opts.ondragleave(e);\n if(e.dataTransfer) {\n opts.onchange(e.dataTransfer.files);\n e.preventDefault();\n }\n });\n el.on('dragover', function (e) {\n e.preventDefault();\n opts.ondragover(e);\n });\n el.on('dragleave', function (e) {\n e.stopPropagation();\n opts.ondragleave(e);\n });\n\n // exports\n return {\n dialog: function () {\n $input.trigger('click');\n }\n }\n }\n\n /**\n Handles the upload queue and events such as drag/drop etc.\n */\n $.fn.uploadbox = function(options) {\n // parse options\n var opts = $.extend({}, {\n dragover : function() {},\n dragleave : function() {},\n announce : function(d) {},\n initialize : function(d) {},\n progress : function(d, m) {},\n success : function(d, m) {},\n error : function(d, m) { alert(m); },\n complete : function() {}\n }, options);\n\n // file queue\n var queue = {};\n\n // queue index/length counter\n var queue_index = 0;\n var queue_length = 0;\n\n // indicates if queue is currently running\n var queue_running = false;\n var queue_stop = false;\n\n // element\n var uploadinput = $(this).uploadinput({\n multiple : true,\n onchange : function(files) { add(files); },\n ondragover : options.ondragover,\n ondragleave : options.ondragleave\n });\n\n // add new files to upload queue\n function add(files) {\n if (files && files.length && !queue_running) {\n var current_index = queue_index;\n _.each(files, function(file, key) {\n if (file.mode !== 'new' && _.filter(queue, function(f) {\n return f.name === file.name && f.size === file.size;\n }).length) {\n file.duplicate = true;\n }\n });\n _.each(files, function(file) {\n if (!file.duplicate) {\n var index = String(queue_index++);\n queue[index] = file;\n opts.announce(index, queue[index]);\n queue_length++;\n }\n });\n return current_index;\n }\n }\n\n // remove file from queue\n function remove(index) {\n if (queue[index]) {\n delete queue[index];\n queue_length--;\n }\n }\n\n // process an upload, recursive\n function process() {\n // validate\n if (queue_length == 0 || queue_stop) {\n queue_stop = false;\n queue_running = false;\n opts.complete();\n return;\n } else {\n queue_running = true;\n }\n\n // get an identifier from the queue\n var index = -1;\n for (var key in queue) {\n index = key;\n break;\n }\n\n // get current file from queue\n var file = queue[index];\n\n // remove from queue\n remove(index)\n\n // create and submit data\n $.uploadpost({\n url : opts.url,\n data : opts.initialize(index),\n success : function(message) { opts.success(index, message); process();},\n error : function(message) { opts.error(index, message); process();},\n progress : function(percentage) { opts.progress(index, percentage); }\n });\n }\n\n /*\n public interface\n */\n\n // open file browser for selection\n function select() {\n uploadinput.dialog();\n }\n\n // remove all entries from queue\n function reset(index) {\n for (index in queue) {\n remove(index);\n }\n }\n\n // initiate upload process\n function start() {\n if (!queue_running) {\n queue_running = true;\n process();\n }\n }\n\n // stop upload process\n function stop() {\n queue_stop = true;\n }\n\n // set options\n function configure(options) {\n opts = $.extend({}, opts, options);\n return opts;\n }\n\n // verify browser compatibility\n function compatible() {\n return window.File && window.FormData && window.XMLHttpRequest && window.FileList;\n }\n\n // export functions\n return {\n 'select' : select,\n 'add' : add,\n 'remove' : remove,\n 'start' : start,\n 'stop' : stop,\n 'reset' : reset,\n 'configure' : configure,\n 'compatible' : compatible\n };\n }\n})(jQuery);\n\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/utils/uploadbox.js\n ** module id = 111\n ** module chunks = 3\n **/","var RightPanel = require( 'layout/panel' ).RightPanel,\n Ui = require( 'mvc/ui/ui-misc' ),\n historyOptionsMenu = require( 'mvc/history/options-menu' );\n CurrentHistoryView = require( 'mvc/history/history-view-edit-current' ).CurrentHistoryView,\n _l = require( 'utils/localization' );\n\n/** the right hand panel in the analysis page that shows the current history */\nvar HistoryPanel = RightPanel.extend({\n\n title : _l( 'History' ),\n\n initialize : function( options ){\n RightPanel.prototype.initialize.call( this, options );\n var self = this;\n\n // this button re-fetches the history and contents and re-renders the history panel\n this.refreshButton = new Ui.ButtonLink({\n id : 'history-refresh-button',\n title : _l( 'Refresh history' ),\n cls : 'panel-header-button',\n icon : 'fa fa-refresh',\n onclick : function() {\n self.historyView.loadCurrentHistory();\n }\n });\n // opens a drop down menu with history related functions (like view all, delete, share, etc.)\n this.optionsButton = new Ui.ButtonLink({\n id : 'history-options-button',\n title : _l( 'History options' ),\n cls : 'panel-header-button',\n icon : 'fa fa-cog',\n });\n // goes to a page showing all the users histories in panel form (for logged in users)\n this.viewMultiButton = null;\n if( !options.userIsAnonymous ){\n this.viewMultiButton = new Ui.ButtonLink({\n id : 'history-view-multi-button',\n title : _l( 'View all histories' ),\n cls : 'panel-header-button',\n icon : 'fa fa-columns',\n href : options.galaxyRoot + 'history/view_multiple'\n });\n }\n\n // build history options menu\n this.optionsMenu = historyOptionsMenu( this.optionsButton.$el, {\n anonymous : options.userIsAnonymous,\n purgeAllowed : options.allow_user_dataset_purge,\n root : options.galaxyRoot\n });\n\n // view of the current history\n this.historyView = new CurrentHistoryView({\n purgeAllowed : options.allow_user_dataset_purge,\n linkTarget : 'galaxy_main',\n $scrollContainer: function(){ return this.$el.parent(); }\n });\n },\n\n render : function(){\n RightPanel.prototype.render.call( this );\n this.$( '.unified-panel-header' ).addClass( 'history-panel-header' );\n this.$( '.panel-header-buttons' ).append([\n this.refreshButton.$el,\n this.optionsButton.$el,\n this.viewMultiButton? this.viewMultiButton.$el : null,\n ]);\n this.historyView\n .setElement( this.$( '.history-panel' ) );\n // causes blink/flash due to loadCurrentHistory rendering as well\n // .render();\n },\n\n _templateBody : function( data ){\n return [\n '
                            ',\n '
                            ',\n '
                            '\n ].join('');\n },\n\n toString : function(){ return 'HistoryPanel'; }\n});\n\nmodule.exports = HistoryPanel;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/apps/history-panel.js\n ** module id = 112\n ** module chunks = 3\n **/","var LeftPanel = require( 'layout/panel' ).LeftPanel,\n Tools = require( 'mvc/tool/tools' ),\n Upload = require( 'mvc/upload/upload-view' ),\n _l = require( 'utils/localization' );\n\n/* Builds the tool menu panel on the left of the analysis page */\nvar ToolPanel = LeftPanel.extend({\n\n title : _l( 'Tools' ),\n\n initialize: function( options ){\n LeftPanel.prototype.initialize.call( this, options );\n this.log( this + '.initialize:', options );\n\n /** @type {Object[]} descriptions of user's workflows to be shown in the tool menu */\n this.stored_workflow_menu_entries = options.stored_workflow_menu_entries || [];\n\n // create tool search, tool panel, and tool panel view.\n var tool_search = new Tools.ToolSearch({\n spinner_url : options.spinner_url,\n search_url : options.search_url,\n hidden : false\n });\n var tools = new Tools.ToolCollection( options.toolbox );\n this.tool_panel = new Tools.ToolPanel({\n tool_search : tool_search,\n tools : tools,\n layout : options.toolbox_in_panel\n });\n this.tool_panel_view = new Tools.ToolPanelView({ model: this.tool_panel });\n\n // add upload modal\n this.uploadButton = new Upload({\n nginx_upload_path : options.nginx_upload_path,\n ftp_upload_site : options.ftp_upload_site,\n default_genome : options.default_genome,\n default_extension : options.default_extension,\n });\n },\n\n render : function(){\n var self = this;\n LeftPanel.prototype.render.call( self );\n self.$( '.panel-header-buttons' ).append( self.uploadButton.$el );\n\n // if there are tools, render panel and display everything\n if (self.tool_panel.get( 'layout' ).size() > 0) {\n self.tool_panel_view.render();\n //TODO: why the hide/show?\n self.$( '.toolMenu' ).show();\n }\n self.$( '.toolMenuContainer' ).prepend( self.tool_panel_view.$el );\n\n self._renderWorkflowMenu();\n\n // if a tool link has the minsizehint attribute, handle it here (gen. by hiding the tool panel)\n self.$( 'a[minsizehint]' ).click( function() {\n if ( parent.handle_minwidth_hint ) {\n parent.handle_minwidth_hint( $( self ).attr( 'minsizehint' ) );\n }\n });\n },\n\n /** build the dom for the workflow portion of the tool menu */\n _renderWorkflowMenu : function(){\n var self = this;\n // add internal workflow list\n self.$( '#internal-workflows' ).append( self._templateTool({\n title : _l( 'All workflows' ),\n href : 'workflow/list_for_run'\n }));\n _.each( self.stored_workflow_menu_entries, function( menu_entry ){\n self.$( '#internal-workflows' ).append( self._templateTool({\n title : menu_entry.stored_workflow.name,\n href : 'workflow/run?id=' + menu_entry.encoded_stored_workflow_id\n }));\n });\n },\n\n /** build a link to one tool */\n _templateTool: function( tool ) {\n return [\n '
                            ',\n // global\n '', tool.title, '',\n '
                            '\n ].join('');\n },\n\n /** override to include inital menu dom and workflow section */\n _templateBody : function(){\n return [\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '', _l( 'Search did not match any tools.' ), '',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '', _l( 'Workflows' ), '',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            '\n ].join('');\n },\n\n toString : function(){ return 'ToolPanel'; }\n});\n\nmodule.exports = ToolPanel;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/apps/tool-panel.js\n ** module id = 113\n ** module chunks = 3\n **/","define([\n \"mvc/collection/collection-li\",\n \"mvc/dataset/dataset-li-edit\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DC_LI, DATASET_LI_EDIT, BASE_MVC, _l ){\n/* global Backbone */\n//==============================================================================\nvar DCListItemView = DC_LI.DCListItemView;\n/** @class Edit view for DatasetCollection.\n */\nvar DCListItemEdit = DCListItemView.extend(\n/** @lends DCListItemEdit.prototype */{\n//TODO: may not be needed\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** override to add linkTarget */\n initialize : function( attributes ){\n DCListItemView.prototype.initialize.call( this, attributes );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DCListItemEdit(' + modelString + ')';\n }\n});\n\n\n//==============================================================================\nvar DCEListItemView = DC_LI.DCEListItemView;\n/** @class Read only view for DatasetCollectionElement.\n */\nvar DCEListItemEdit = DCEListItemView.extend(\n/** @lends DCEListItemEdit.prototype */{\n//TODO: this might be expendable - compacted with HDAListItemView\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** set up */\n initialize : function( attributes ){\n DCEListItemView.prototype.initialize.call( this, attributes );\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DCEListItemEdit(' + modelString + ')';\n }\n});\n\n\n//==============================================================================\n// NOTE: this does not inherit from DatasetDCEListItemView as you would expect\n//TODO: but should - if we can find something simpler than using diamond\n/** @class Editable view for a DatasetCollectionElement that is also an DatasetAssociation\n * (a dataset contained in a dataset collection).\n */\nvar DatasetDCEListItemEdit = DATASET_LI_EDIT.DatasetListItemEdit.extend(\n/** @lends DatasetDCEListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** set up */\n initialize : function( attributes ){\n DATASET_LI_EDIT.DatasetListItemEdit.prototype.initialize.call( this, attributes );\n },\n\n // NOTE: this does not inherit from DatasetDCEListItemView - so we duplicate this here\n //TODO: fix\n /** In this override, only get details if in the ready state.\n * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n */\n _fetchModelDetails : function(){\n var view = this;\n if( view.model.inReadyState() && !view.model.hasDetails() ){\n return view.model.fetch({ silent: true });\n }\n return jQuery.when();\n },\n\n /** Override to remove delete button */\n _renderDeleteButton : function(){\n return null;\n },\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'DatasetDCEListItemEdit(' + modelString + ')';\n }\n});\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nDatasetDCEListItemEdit.prototype.templates = (function(){\n\n return _.extend( {}, DATASET_LI_EDIT.DatasetListItemEdit.prototype.templates, {\n titleBar : DC_LI.DatasetDCEListItemView.prototype.templates.titleBar\n });\n}());\n\n\n//==============================================================================\n/** @class Read only view for a DatasetCollectionElement that is also a DatasetCollection\n * (a nested DC).\n */\nvar NestedDCDCEListItemEdit = DC_LI.NestedDCDCEListItemView.extend(\n/** @lends NestedDCDCEListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n // comment this out to suppress log output\n //logger : console,\n\n // ......................................................................... misc\n /** String representation */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'NestedDCDCEListItemEdit(' + modelString + ')';\n }\n});\n\n\n//==============================================================================\n return {\n DCListItemEdit : DCListItemEdit,\n DCEListItemEdit : DCEListItemEdit,\n DatasetDCEListItemEdit : DatasetDCEListItemEdit,\n NestedDCDCEListItemEdit : NestedDCDCEListItemEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-li-edit.js\n ** module id = 123\n ** module chunks = 3\n **/","define([\n \"mvc/collection/collection-view\",\n \"mvc/collection/collection-model\",\n \"mvc/collection/collection-li-edit\",\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/editable-text\",\n], function( DC_VIEW, DC_MODEL, DC_EDIT, BASE_MVC, _l ){\n/* =============================================================================\nTODO:\n\n============================================================================= */\n/** @class editable View/Controller for a dataset collection.\n */\nvar _super = DC_VIEW.CollectionView;\nvar CollectionViewEdit = _super.extend(\n/** @lends CollectionView.prototype */{\n //MODEL is either a DatasetCollection (or subclass) or a DatasetCollectionElement (list of pairs)\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** sub view class used for datasets */\n DatasetDCEViewClass : DC_EDIT.DatasetDCEListItemEdit,\n /** sub view class used for nested collections */\n NestedDCDCEViewClass: DC_EDIT.NestedDCDCEListItemEdit,\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events\n * @param {Object} attributes optional settings for the panel\n */\n initialize : function( attributes ){\n _super.prototype.initialize.call( this, attributes );\n },\n\n /** In this override, make the collection name editable\n */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n _super.prototype._setUpBehaviors.call( this, $where );\n if( !this.model ){ return; }\n\n // anon users shouldn't have access to any of the following\n if( !Galaxy.user || Galaxy.user.isAnonymous() ){\n return;\n }\n\n //TODO: extract\n var panel = this,\n nameSelector = '> .controls .name';\n $where.find( nameSelector )\n .attr( 'title', _l( 'Click to rename collection' ) )\n .tooltip({ placement: 'bottom' })\n .make_text_editable({\n on_finish: function( newName ){\n var previousName = panel.model.get( 'name' );\n if( newName && newName !== previousName ){\n panel.$el.find( nameSelector ).text( newName );\n panel.model.save({ name: newName })\n .fail( function(){\n panel.$el.find( nameSelector ).text( panel.model.previous( 'name' ) );\n });\n } else {\n panel.$el.find( nameSelector ).text( previousName );\n }\n }\n });\n },\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'CollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar ListCollectionViewEdit = CollectionViewEdit.extend(\n/** @lends ListCollectionView.prototype */{\n\n //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n /** sub view class used for datasets */\n DatasetDCEViewClass : DC_EDIT.DatasetDCEListItemEdit,\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'ListCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class Editable, read-only View/Controller for a dataset collection. */\nvar PairCollectionViewEdit = ListCollectionViewEdit.extend(\n/** @lends PairCollectionViewEdit.prototype */{\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'PairCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class Editable (roughly since these collections are immutable),\n * View/Controller for a dataset collection.\n */\nvar NestedPairCollectionViewEdit = PairCollectionViewEdit.extend(\n/** @lends NestedPairCollectionViewEdit.prototype */{\n\n /** Override to remove the editable text from the name/identifier - these collections are considered immutable */\n _setUpBehaviors : function( $where ){\n _super.prototype._setUpBehaviors.call( this, $where );\n },\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'NestedPairCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n// =============================================================================\n/** @class non-editable, read-only View/Controller for a dataset collection. */\nvar ListOfPairsCollectionViewEdit = CollectionViewEdit.extend(\n/** @lends ListOfPairsCollectionView.prototype */{\n\n //TODO: not strictly needed - due to switch in CollectionView._getContentClass\n /** sub view class used for nested collections */\n NestedDCDCEViewClass : DC_EDIT.NestedDCDCEListItemEdit.extend({\n foldoutPanelClass : NestedPairCollectionViewEdit\n }),\n\n // ........................................................................ misc\n /** string rep */\n toString : function(){\n return 'ListOfPairsCollectionViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//==============================================================================\n return {\n CollectionViewEdit : CollectionViewEdit,\n ListCollectionViewEdit : ListCollectionViewEdit,\n PairCollectionViewEdit : PairCollectionViewEdit,\n ListOfPairsCollectionViewEdit : ListOfPairsCollectionViewEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/collection-view-edit.js\n ** module id = 124\n ** module chunks = 3\n **/","define([\n \"utils/levenshtein\",\n \"utils/natural-sort\",\n \"mvc/collection/list-collection-creator\",\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/hoverhighlight\"\n], function( levenshteinDistance, naturalSort, LIST_COLLECTION_CREATOR, baseMVC, _l ){\n\nvar logNamespace = 'collections';\n/* ============================================================================\nTODO:\n\n\nPROGRAMMATICALLY:\ncurrPanel.once( 'rendered', function(){\n currPanel.showSelectors();\n currPanel.selectAll();\n _.last( currPanel.actionsPopup.options ).func();\n});\n\n============================================================================ */\n/** A view for paired datasets in the collections creator.\n */\nvar PairView = Backbone.View.extend( baseMVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n tagName : 'li',\n className : 'dataset paired',\n\n initialize : function( attributes ){\n this.pair = attributes.pair || {};\n },\n\n template : _.template([\n '<%- pair.forward.name %>',\n '',\n '<%- pair.name %>',\n '',\n '<%- pair.reverse.name %>'\n ].join('')),\n\n render : function(){\n this.$el\n .attr( 'draggable', true )\n .data( 'pair', this.pair )\n .html( this.template({ pair: this.pair }) )\n .addClass( 'flex-column-container' );\n return this;\n },\n\n events : {\n 'dragstart' : '_dragstart',\n 'dragend' : '_dragend',\n 'dragover' : '_sendToParent',\n 'drop' : '_sendToParent'\n },\n\n /** dragging pairs for re-ordering */\n _dragstart : function( ev ){\n ev.currentTarget.style.opacity = '0.4';\n if( ev.originalEvent ){ ev = ev.originalEvent; }\n\n ev.dataTransfer.effectAllowed = 'move';\n ev.dataTransfer.setData( 'text/plain', JSON.stringify( this.pair ) );\n\n this.$el.parent().trigger( 'pair.dragstart', [ this ] );\n },\n\n /** dragging pairs for re-ordering */\n _dragend : function( ev ){\n ev.currentTarget.style.opacity = '1.0';\n this.$el.parent().trigger( 'pair.dragend', [ this ] );\n },\n\n /** manually bubble up an event to the parent/container */\n _sendToParent : function( ev ){\n this.$el.parent().trigger( ev );\n },\n\n /** string rep */\n toString : function(){\n return 'PairView(' + this.pair.name + ')';\n }\n});\n\n\n// ============================================================================\n/** returns an autopair function that uses the provided options.match function */\nfunction autoPairFnBuilder( options ){\n options = options || {};\n options.createPair = options.createPair || function _defaultCreatePair( params ){\n params = params || {};\n var a = params.listA.splice( params.indexA, 1 )[0],\n b = params.listB.splice( params.indexB, 1 )[0],\n aInBIndex = params.listB.indexOf( a ),\n bInAIndex = params.listA.indexOf( b );\n if( aInBIndex !== -1 ){ params.listB.splice( aInBIndex, 1 ); }\n if( bInAIndex !== -1 ){ params.listA.splice( bInAIndex, 1 ); }\n return this._pair( a, b, { silent: true });\n };\n // compile these here outside of the loop\n var _regexps = [];\n function getRegExps(){\n if( !_regexps.length ){\n _regexps = [\n new RegExp( this.filters[0] ),\n new RegExp( this.filters[1] )\n ];\n }\n return _regexps;\n }\n // mangle params as needed\n options.preprocessMatch = options.preprocessMatch || function _defaultPreprocessMatch( params ){\n var regexps = getRegExps.call( this );\n return _.extend( params, {\n matchTo : params.matchTo.name.replace( regexps[0], '' ),\n possible : params.possible.name.replace( regexps[1], '' )\n });\n };\n\n return function _strategy( params ){\n this.debug( 'autopair _strategy ---------------------------' );\n params = params || {};\n var listA = params.listA,\n listB = params.listB,\n indexA = 0, indexB,\n bestMatch = {\n score : 0.0,\n index : null\n },\n paired = [];\n //console.debug( 'params:', JSON.stringify( params, null, ' ' ) );\n this.debug( 'starting list lens:', listA.length, listB.length );\n this.debug( 'bestMatch (starting):', JSON.stringify( bestMatch, null, ' ' ) );\n\n while( indexA < listA.length ){\n var matchTo = listA[ indexA ];\n bestMatch.score = 0.0;\n\n for( indexB=0; indexB= scoreThreshold ){\n //console.debug( 'autoPairFnBuilder.strategy', listA[ indexA ].name, listB[ bestMatch.index ].name );\n paired.push( options.createPair.call( this, {\n listA : listA,\n indexA : indexA,\n listB : listB,\n indexB : bestMatch.index\n }));\n //console.debug( 'list lens now:', listA.length, listB.length );\n } else {\n indexA += 1;\n }\n if( !listA.length || !listB.length ){\n return paired;\n }\n }\n this.debug( 'paired:', JSON.stringify( paired, null, ' ' ) );\n this.debug( 'autopair _strategy ---------------------------' );\n return paired;\n };\n}\n\n\n// ============================================================================\n/** An interface for building collections of paired datasets.\n */\nvar PairedCollectionCreator = Backbone.View.extend( baseMVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n className: 'list-of-pairs-collection-creator collection-creator flex-row-container',\n\n /** set up initial options, instance vars, behaviors, and autopair (if set to do so) */\n initialize : function( attributes ){\n this.metric( 'PairedCollectionCreator.initialize', attributes );\n //this.debug( '-- PairedCollectionCreator:', attributes );\n\n attributes = _.defaults( attributes, {\n datasets : [],\n filters : this.DEFAULT_FILTERS,\n automaticallyPair : true,\n strategy : 'lcs',\n matchPercentage : 0.9,\n twoPassAutopairing : true\n });\n\n /** unordered, original list */\n this.initialList = attributes.datasets;\n\n /** is this from a history? if so, what's its id? */\n this.historyId = attributes.historyId;\n\n /** which filters should be used initially? (String[2] or name in commonFilters) */\n this.filters = this.commonFilters[ attributes.filters ] || this.commonFilters[ this.DEFAULT_FILTERS ];\n if( _.isArray( attributes.filters ) ){\n this.filters = attributes.filters;\n }\n\n /** try to auto pair the unpaired datasets on load? */\n this.automaticallyPair = attributes.automaticallyPair;\n\n /** what method to use for auto pairing (will be passed aggression level) */\n this.strategy = this.strategies[ attributes.strategy ] || this.strategies[ this.DEFAULT_STRATEGY ];\n if( _.isFunction( attributes.strategy ) ){\n this.strategy = attributes.strategy;\n }\n\n /** distance/mismatch level allowed for autopairing */\n this.matchPercentage = attributes.matchPercentage;\n\n /** try to autopair using simple first, then this.strategy on the remainder */\n this.twoPassAutopairing = attributes.twoPassAutopairing;\n\n /** remove file extensions (\\.*) from created pair names? */\n this.removeExtensions = true;\n //this.removeExtensions = false;\n\n /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n this.oncancel = attributes.oncancel;\n /** fn to call when the collection is created (scoped to this) */\n this.oncreate = attributes.oncreate;\n\n /** fn to call when the cancel button is clicked (scoped to this) - if falsy, no btn is displayed */\n this.autoscrollDist = attributes.autoscrollDist || 24;\n\n /** is the unpaired panel shown? */\n this.unpairedPanelHidden = false;\n /** is the paired panel shown? */\n this.pairedPanelHidden = false;\n\n /** DOM elements currently being dragged */\n this.$dragging = null;\n\n /** Used for blocking UI events during ajax/operations (don't post twice) */\n this.blocking = false;\n\n this._setUpBehaviors();\n this._dataSetUp();\n },\n\n /** map of common filter pairs by name */\n commonFilters : {\n illumina : [ '_1', '_2' ],\n Rs : [ '_R1', '_R2' ]\n },\n /** which commonFilter to use by default */\n DEFAULT_FILTERS : 'illumina',\n\n /** map of name->fn for autopairing */\n strategies : {\n 'simple' : 'autopairSimple',\n 'lcs' : 'autopairLCS',\n 'levenshtein' : 'autopairLevenshtein'\n },\n /** default autopair strategy name */\n DEFAULT_STRATEGY : 'lcs',\n\n // ------------------------------------------------------------------------ process raw list\n /** set up main data: cache initialList, sort, and autopair */\n _dataSetUp : function(){\n //this.debug( '-- _dataSetUp' );\n\n this.paired = [];\n this.unpaired = [];\n\n this.selectedIds = [];\n\n // sort initial list, add ids if needed, and save new working copy to unpaired\n this._sortInitialList();\n this._ensureIds();\n this.unpaired = this.initialList.slice( 0 );\n\n if( this.automaticallyPair ){\n this.autoPair();\n this.once( 'rendered:initial', function(){\n this.trigger( 'autopair' );\n });\n }\n },\n\n /** sort initial list */\n _sortInitialList : function(){\n //this.debug( '-- _sortInitialList' );\n this._sortDatasetList( this.initialList );\n },\n\n /** sort a list of datasets */\n _sortDatasetList : function( list ){\n // currently only natural sort by name\n list.sort( function( a, b ){ return naturalSort( a.name, b.name ); });\n return list;\n },\n\n /** add ids to dataset objs in initial list if none */\n _ensureIds : function(){\n this.initialList.forEach( function( dataset ){\n if( !dataset.hasOwnProperty( 'id' ) ){\n dataset.id = _.uniqueId();\n }\n });\n return this.initialList;\n },\n\n /** split initial list into two lists, those that pass forward filters & those passing reverse */\n _splitByFilters : function(){\n var regexFilters = this.filters.map( function( stringFilter ){\n return new RegExp( stringFilter );\n }),\n split = [ [], [] ];\n\n function _filter( unpaired, filter ){\n return filter.test( unpaired.name );\n //return dataset.name.indexOf( filter ) >= 0;\n }\n this.unpaired.forEach( function _filterEach( unpaired ){\n // 90% of the time this seems to work, but:\n //TODO: this treats *all* strings as regex which may confuse people - possibly check for // surrounding?\n // would need explanation in help as well\n regexFilters.forEach( function( filter, i ){\n if( _filter( unpaired, filter ) ){\n split[i].push( unpaired );\n }\n });\n });\n return split;\n },\n\n /** add a dataset to the unpaired list in it's proper order */\n _addToUnpaired : function( dataset ){\n // currently, unpaired is natural sorted by name, use binary search to find insertion point\n var binSearchSortedIndex = function( low, hi ){\n if( low === hi ){ return low; }\n\n var mid = Math.floor( ( hi - low ) / 2 ) + low,\n compared = naturalSort( dataset.name, this.unpaired[ mid ].name );\n\n if( compared < 0 ){\n return binSearchSortedIndex( low, mid );\n } else if( compared > 0 ){\n return binSearchSortedIndex( mid + 1, hi );\n }\n // walk the equal to find the last\n while( this.unpaired[ mid ] && this.unpaired[ mid ].name === dataset.name ){ mid++; }\n return mid;\n\n }.bind( this );\n\n this.unpaired.splice( binSearchSortedIndex( 0, this.unpaired.length ), 0, dataset );\n },\n\n // ------------------------------------------------------------------------ auto pairing\n /** two passes to automatically create pairs:\n * use both simpleAutoPair, then the fn mentioned in strategy\n */\n autoPair : function( strategy ){\n // split first using exact matching\n var split = this._splitByFilters(),\n paired = [];\n if( this.twoPassAutopairing ){\n paired = this.autopairSimple({\n listA : split[0],\n listB : split[1]\n });\n split = this._splitByFilters();\n }\n\n // uncomment to see printlns while running tests\n //this.debug = function(){ console.log.apply( console, arguments ); };\n\n // then try the remainder with something less strict\n strategy = strategy || this.strategy;\n split = this._splitByFilters();\n paired = paired.concat( this[ strategy ].call( this, {\n listA : split[0],\n listB : split[1]\n }));\n return paired;\n },\n\n /** autopair by exact match */\n autopairSimple : autoPairFnBuilder({\n scoreThreshold: function(){ return 1.0; },\n match : function _match( params ){\n params = params || {};\n if( params.matchTo === params.possible ){\n return {\n index: params.index,\n score: 1.0\n };\n }\n return params.bestMatch;\n }\n }),\n\n /** autopair by levenshtein edit distance scoring */\n autopairLevenshtein : autoPairFnBuilder({\n scoreThreshold: function(){ return this.matchPercentage; },\n match : function _matches( params ){\n params = params || {};\n var distance = levenshteinDistance( params.matchTo, params.possible ),\n score = 1.0 - ( distance / ( Math.max( params.matchTo.length, params.possible.length ) ) );\n if( score > params.bestMatch.score ){\n return {\n index: params.index,\n score: score\n };\n }\n return params.bestMatch;\n }\n }),\n\n /** autopair by longest common substrings scoring */\n autopairLCS : autoPairFnBuilder({\n scoreThreshold: function(){ return this.matchPercentage; },\n match : function _matches( params ){\n params = params || {};\n var match = this._naiveStartingAndEndingLCS( params.matchTo, params.possible ).length,\n score = match / ( Math.max( params.matchTo.length, params.possible.length ) );\n if( score > params.bestMatch.score ){\n return {\n index: params.index,\n score: score\n };\n }\n return params.bestMatch;\n }\n }),\n\n /** return the concat'd longest common prefix and suffix from two strings */\n _naiveStartingAndEndingLCS : function( s1, s2 ){\n var fwdLCS = '',\n revLCS = '',\n i = 0, j = 0;\n while( i < s1.length && i < s2.length ){\n if( s1[ i ] !== s2[ i ] ){\n break;\n }\n fwdLCS += s1[ i ];\n i += 1;\n }\n if( i === s1.length ){ return s1; }\n if( i === s2.length ){ return s2; }\n\n i = ( s1.length - 1 );\n j = ( s2.length - 1 );\n while( i >= 0 && j >= 0 ){\n if( s1[ i ] !== s2[ j ] ){\n break;\n }\n revLCS = [ s1[ i ], revLCS ].join( '' );\n i -= 1;\n j -= 1;\n }\n return fwdLCS + revLCS;\n },\n\n // ------------------------------------------------------------------------ pairing / unpairing\n /** create a pair from fwd and rev, removing them from unpaired, and placing the new pair in paired */\n _pair : function( fwd, rev, options ){\n options = options || {};\n this.debug( '_pair:', fwd, rev );\n var pair = this._createPair( fwd, rev, options.name );\n this.paired.push( pair );\n this.unpaired = _.without( this.unpaired, fwd, rev );\n if( !options.silent ){\n this.trigger( 'pair:new', pair );\n }\n return pair;\n },\n\n /** create a pair Object from fwd and rev, adding the name attribute (will guess if not given) */\n _createPair : function( fwd, rev, name ){\n // ensure existance and don't pair something with itself\n if( !( fwd && rev ) || ( fwd === rev ) ){\n throw new Error( 'Bad pairing: ' + [ JSON.stringify( fwd ), JSON.stringify( rev ) ] );\n }\n name = name || this._guessNameForPair( fwd, rev );\n return { forward : fwd, name : name, reverse : rev };\n },\n\n /** try to find a good pair name for the given fwd and rev datasets */\n _guessNameForPair : function( fwd, rev, removeExtensions ){\n removeExtensions = ( removeExtensions !== undefined )?( removeExtensions ):( this.removeExtensions );\n var fwdName = fwd.name,\n revName = rev.name,\n lcs = this._naiveStartingAndEndingLCS(\n fwdName.replace( new RegExp( this.filters[0] ), '' ),\n revName.replace( new RegExp( this.filters[1] ), '' )\n );\n if( removeExtensions ){\n var lastDotIndex = lcs.lastIndexOf( '.' );\n if( lastDotIndex > 0 ){\n var extension = lcs.slice( lastDotIndex, lcs.length );\n lcs = lcs.replace( extension, '' );\n fwdName = fwdName.replace( extension, '' );\n revName = revName.replace( extension, '' );\n }\n }\n return lcs || ( fwdName + ' & ' + revName );\n },\n\n /** unpair a pair, removing it from paired, and adding the fwd,rev datasets back into unpaired */\n _unpair : function( pair, options ){\n options = options || {};\n if( !pair ){\n throw new Error( 'Bad pair: ' + JSON.stringify( pair ) );\n }\n this.paired = _.without( this.paired, pair );\n this._addToUnpaired( pair.forward );\n this._addToUnpaired( pair.reverse );\n\n if( !options.silent ){\n this.trigger( 'pair:unpair', [ pair ] );\n }\n return pair;\n },\n\n /** unpair all paired datasets */\n unpairAll : function(){\n var pairs = [];\n while( this.paired.length ){\n pairs.push( this._unpair( this.paired[ 0 ], { silent: true }) );\n }\n this.trigger( 'pair:unpair', pairs );\n },\n\n // ------------------------------------------------------------------------ API\n /** convert a pair into JSON compatible with the collections API */\n _pairToJSON : function( pair, src ){\n src = src || 'hda';\n //TODO: consider making this the pair structure when created instead\n return {\n collection_type : 'paired',\n src : 'new_collection',\n name : pair.name,\n element_identifiers : [{\n name : 'forward',\n id : pair.forward.id,\n src : src\n }, {\n name : 'reverse',\n id : pair.reverse.id,\n src : src\n }]\n };\n },\n\n /** create the collection via the API\n * @returns {jQuery.xhr Object} the jquery ajax request\n */\n createList : function( name ){\n var creator = this,\n url = Galaxy.root + 'api/histories/' + this.historyId + '/contents/dataset_collections';\n\n //TODO: use ListPairedCollection.create()\n var ajaxData = {\n type : 'dataset_collection',\n collection_type : 'list:paired',\n name : _.escape( name || creator.$( '.collection-name' ).val() ),\n element_identifiers : creator.paired.map( function( pair ){\n return creator._pairToJSON( pair );\n })\n\n };\n //this.debug( JSON.stringify( ajaxData ) );\n creator.blocking = true;\n return jQuery.ajax( url, {\n type : 'POST',\n contentType : 'application/json',\n dataType : 'json',\n data : JSON.stringify( ajaxData )\n })\n .always( function(){\n creator.blocking = false;\n })\n .fail( function( xhr, status, message ){\n creator._ajaxErrHandler( xhr, status, message );\n })\n .done( function( response, message, xhr ){\n //this.info( 'ok', response, message, xhr );\n creator.trigger( 'collection:created', response, message, xhr );\n creator.metric( 'collection:created', response );\n if( typeof creator.oncreate === 'function' ){\n creator.oncreate.call( this, response, message, xhr );\n }\n });\n },\n\n /** handle ajax errors with feedback and details to the user (if available) */\n _ajaxErrHandler : function( xhr, status, message ){\n this.error( xhr, status, message );\n var content = _l( 'An error occurred while creating this collection' );\n if( xhr ){\n if( xhr.readyState === 0 && xhr.status === 0 ){\n content += ': ' + _l( 'Galaxy could not be reached and may be updating.' )\n + _l( ' Try again in a few minutes.' );\n } else if( xhr.responseJSON ){\n content += '
                            ' + JSON.stringify( xhr.responseJSON ) + '
                            ';\n } else {\n content += ': ' + message;\n }\n }\n creator._showAlert( content, 'alert-danger' );\n },\n\n // ------------------------------------------------------------------------ rendering\n /** render the entire interface */\n render : function( speed, callback ){\n //this.debug( '-- _render' );\n //this.$el.empty().html( PairedCollectionCreator.templates.main() );\n this.$el.empty().html( PairedCollectionCreator.templates.main() );\n this._renderHeader( speed );\n this._renderMiddle( speed );\n this._renderFooter( speed );\n this._addPluginComponents();\n this.trigger( 'rendered', this );\n return this;\n },\n\n /** render the header section */\n _renderHeader : function( speed, callback ){\n //this.debug( '-- _renderHeader' );\n var $header = this.$( '.header' ).empty().html( PairedCollectionCreator.templates.header() )\n .find( '.help-content' ).prepend( $( PairedCollectionCreator.templates.helpContent() ) );\n\n this._renderFilters();\n return $header;\n },\n /** fill the filter inputs with the filter values */\n _renderFilters : function(){\n return this.$( '.forward-column .column-header input' ).val( this.filters[0] )\n .add( this.$( '.reverse-column .column-header input' ).val( this.filters[1] ) );\n },\n\n /** render the middle including unpaired and paired sections (which may be hidden) */\n _renderMiddle : function( speed, callback ){\n var $middle = this.$( '.middle' ).empty().html( PairedCollectionCreator.templates.middle() );\n\n // (re-) hide the un/paired panels based on instance vars\n if( this.unpairedPanelHidden ){\n this.$( '.unpaired-columns' ).hide();\n } else if( this.pairedPanelHidden ){\n this.$( '.paired-columns' ).hide();\n }\n\n this._renderUnpaired();\n this._renderPaired();\n return $middle;\n },\n /** render the unpaired section, showing datasets accrd. to filters, update the unpaired counts */\n _renderUnpaired : function( speed, callback ){\n //this.debug( '-- _renderUnpaired' );\n var creator = this,\n $fwd, $rev, $prd = [],\n split = this._splitByFilters();\n // update unpaired counts\n this.$( '.forward-column .title' )\n .text([ split[0].length, _l( 'unpaired forward' ) ].join( ' ' ));\n this.$( '.forward-column .unpaired-info' )\n .text( this._renderUnpairedDisplayStr( this.unpaired.length - split[0].length ) );\n this.$( '.reverse-column .title' )\n .text([ split[1].length, _l( 'unpaired reverse' ) ].join( ' ' ));\n this.$( '.reverse-column .unpaired-info' )\n .text( this._renderUnpairedDisplayStr( this.unpaired.length - split[1].length ) );\n\n this.$( '.unpaired-columns .column-datasets' ).empty();\n\n // show/hide the auto pair button if any unpaired are left\n this.$( '.autopair-link' ).toggle( this.unpaired.length !== 0 );\n if( this.unpaired.length === 0 ){\n this._renderUnpairedEmpty();\n return;\n }\n\n // create the dataset dom arrays\n $rev = split[1].map( function( dataset, i ){\n // if there'll be a fwd dataset across the way, add a button to pair the row\n if( ( split[0][ i ] !== undefined )\n && ( split[0][ i ] !== dataset ) ){\n $prd.push( creator._renderPairButton() );\n }\n return creator._renderUnpairedDataset( dataset );\n });\n $fwd = split[0].map( function( dataset ){\n return creator._renderUnpairedDataset( dataset );\n });\n\n if( !$fwd.length && !$rev.length ){\n this._renderUnpairedNotShown();\n return;\n }\n // add to appropo cols\n //TODO: not the best way to render - consider rendering the entire unpaired-columns section in a fragment\n // and swapping out that\n this.$( '.unpaired-columns .forward-column .column-datasets' ).append( $fwd )\n .add( this.$( '.unpaired-columns .paired-column .column-datasets' ).append( $prd ) )\n .add( this.$( '.unpaired-columns .reverse-column .column-datasets' ).append( $rev ) );\n this._adjUnpairedOnScrollbar();\n },\n /** return a string to display the count of filtered out datasets */\n _renderUnpairedDisplayStr : function( numFiltered ){\n return [ '(', numFiltered, ' ', _l( 'filtered out' ), ')' ].join('');\n },\n /** return an unattached jQuery DOM element to represent an unpaired dataset */\n _renderUnpairedDataset : function( dataset ){\n //TODO: to underscore template\n return $( '
                          18. ')\n .attr( 'id', 'dataset-' + dataset.id )\n .addClass( 'dataset unpaired' )\n .attr( 'draggable', true )\n .addClass( dataset.selected? 'selected': '' )\n .append( $( '' ).addClass( 'dataset-name' ).text( dataset.name ) )\n //??\n .data( 'dataset', dataset );\n },\n /** render the button that may go between unpaired datasets, allowing the user to pair a row */\n _renderPairButton : function(){\n //TODO: *not* a dataset - don't pretend like it is\n return $( '
                          19. ').addClass( 'dataset unpaired' )\n .append( $( '' ).addClass( 'dataset-name' ).text( _l( 'Pair these datasets' ) ) );\n },\n /** a message to display when no unpaired left */\n _renderUnpairedEmpty : function(){\n //this.debug( '-- renderUnpairedEmpty' );\n var $msg = $( '
                            ' )\n .text( '(' + _l( 'no remaining unpaired datasets' ) + ')' );\n this.$( '.unpaired-columns .paired-column .column-datasets' ).empty().prepend( $msg );\n return $msg;\n },\n /** a message to display when no unpaired can be shown with the current filters */\n _renderUnpairedNotShown : function(){\n //this.debug( '-- renderUnpairedEmpty' );\n var $msg = $( '
                            ' )\n .text( '(' + _l( 'no datasets were found matching the current filters' ) + ')' );\n this.$( '.unpaired-columns .paired-column .column-datasets' ).empty().prepend( $msg );\n return $msg;\n },\n /** try to detect if the unpaired section has a scrollbar and adjust left column for better centering of all */\n _adjUnpairedOnScrollbar : function(){\n var $unpairedColumns = this.$( '.unpaired-columns' ).last(),\n $firstDataset = this.$( '.unpaired-columns .reverse-column .dataset' ).first();\n if( !$firstDataset.size() ){ return; }\n var ucRight = $unpairedColumns.offset().left + $unpairedColumns.outerWidth(),\n dsRight = $firstDataset.offset().left + $firstDataset.outerWidth(),\n rightDiff = Math.floor( ucRight ) - Math.floor( dsRight );\n //this.debug( 'rightDiff:', ucRight, '-', dsRight, '=', rightDiff );\n this.$( '.unpaired-columns .forward-column' )\n .css( 'margin-left', ( rightDiff > 0 )? rightDiff: 0 );\n },\n\n /** render the paired section and update counts of paired datasets */\n _renderPaired : function( speed, callback ){\n //this.debug( '-- _renderPaired' );\n this.$( '.paired-column-title .title' ).text([ this.paired.length, _l( 'paired' ) ].join( ' ' ) );\n // show/hide the unpair all link\n this.$( '.unpair-all-link' ).toggle( this.paired.length !== 0 );\n if( this.paired.length === 0 ){\n this._renderPairedEmpty();\n return;\n //TODO: would be best to return here (the $columns)\n } else {\n // show/hide 'remove extensions link' when any paired and they seem to have extensions\n this.$( '.remove-extensions-link' ).show();\n }\n\n this.$( '.paired-columns .column-datasets' ).empty();\n var creator = this;\n this.paired.forEach( function( pair, i ){\n //TODO: cache these?\n var pairView = new PairView({ pair: pair });\n creator.$( '.paired-columns .column-datasets' )\n .append( pairView.render().$el )\n .append([\n ''\n ].join( '' ));\n });\n },\n /** a message to display when none paired */\n _renderPairedEmpty : function(){\n var $msg = $( '
                            ' )\n .text( '(' + _l( 'no paired datasets yet' ) + ')' );\n this.$( '.paired-columns .column-datasets' ).empty().prepend( $msg );\n return $msg;\n },\n\n /** render the footer, completion controls, and cancel controls */\n _renderFooter : function( speed, callback ){\n var $footer = this.$( '.footer' ).empty().html( PairedCollectionCreator.templates.footer() );\n this.$( '.remove-extensions' ).prop( 'checked', this.removeExtensions );\n if( typeof this.oncancel === 'function' ){\n this.$( '.cancel-create.btn' ).show();\n }\n return $footer;\n },\n\n /** add any jQuery/bootstrap/custom plugins to elements rendered */\n _addPluginComponents : function(){\n this._chooseFiltersPopover( '.choose-filters-link' );\n this.$( '.help-content i' ).hoverhighlight( '.collection-creator', 'rgba( 64, 255, 255, 1.0 )' );\n },\n\n /** build a filter selection popover allowing selection of common filter pairs */\n _chooseFiltersPopover : function( selector ){\n function filterChoice( val1, val2 ){\n return [\n ''\n ].join('');\n }\n var $popoverContent = $( _.template([\n '
                            ',\n '
                            ',\n _l( 'Choose from the following filters to change which unpaired reads are shown in the display' ),\n ':
                            ',\n _.values( this.commonFilters ).map( function( filterSet ){\n return filterChoice( filterSet[0], filterSet[1] );\n }).join( '' ),\n '
                            '\n ].join(''))({}));\n\n return this.$( selector ).popover({\n container : '.collection-creator',\n placement : 'bottom',\n html : true,\n //animation : false,\n content : $popoverContent\n });\n },\n\n /** add (or clear if clear is truthy) a validation warning to what */\n _validationWarning : function( what, clear ){\n var VALIDATION_CLASS = 'validation-warning';\n if( what === 'name' ){\n what = this.$( '.collection-name' ).add( this.$( '.collection-name-prompt' ) );\n this.$( '.collection-name' ).focus().select();\n }\n if( clear ){\n what = what || this.$( '.' + VALIDATION_CLASS );\n what.removeClass( VALIDATION_CLASS );\n } else {\n what.addClass( VALIDATION_CLASS );\n }\n },\n\n // ------------------------------------------------------------------------ events\n /** set up event handlers on self */\n _setUpBehaviors : function(){\n this.once( 'rendered', function(){\n this.trigger( 'rendered:initial', this );\n });\n\n this.on( 'pair:new', function(){\n //TODO: ideally only re-render the columns (or even elements) involved\n this._renderUnpaired();\n this._renderPaired();\n\n // scroll to bottom where new pairs are added\n //TODO: this doesn't seem to work - innerHeight sticks at 133...\n // may have to do with improper flex columns\n //var $pairedView = this.$( '.paired-columns' );\n //$pairedView.scrollTop( $pairedView.innerHeight() );\n //this.debug( $pairedView.height() )\n this.$( '.paired-columns' ).scrollTop( 8000000 );\n });\n this.on( 'pair:unpair', function( pairs ){\n //TODO: ideally only re-render the columns (or even elements) involved\n this._renderUnpaired();\n this._renderPaired();\n this.splitView();\n });\n\n this.on( 'filter-change', function(){\n this.filters = [\n this.$( '.forward-unpaired-filter input' ).val(),\n this.$( '.reverse-unpaired-filter input' ).val()\n ];\n this.metric( 'filter-change', this.filters );\n this._renderFilters();\n this._renderUnpaired();\n });\n\n this.on( 'autopair', function(){\n this._renderUnpaired();\n this._renderPaired();\n\n var message, msgClass = null;\n if( this.paired.length ){\n msgClass = 'alert-success';\n message = this.paired.length + ' ' + _l( 'pairs created' );\n if( !this.unpaired.length ){\n message += ': ' + _l( 'all datasets have been successfully paired' );\n this.hideUnpaired();\n this.$( '.collection-name' ).focus();\n }\n } else {\n message = _l([\n 'Could not automatically create any pairs from the given dataset names.',\n 'You may want to choose or enter different filters and try auto-pairing again.',\n 'Close this message using the X on the right to view more help.'\n ].join( ' ' ));\n }\n this._showAlert( message, msgClass );\n });\n\n //this.on( 'all', function(){\n // this.info( arguments );\n //});\n return this;\n },\n\n events : {\n // header\n 'click .more-help' : '_clickMoreHelp',\n 'click .less-help' : '_clickLessHelp',\n 'click .header .alert button' : '_hideAlert',\n 'click .forward-column .column-title' : '_clickShowOnlyUnpaired',\n 'click .reverse-column .column-title' : '_clickShowOnlyUnpaired',\n 'click .unpair-all-link' : '_clickUnpairAll',\n //TODO: this seems kinda backasswards - re-sending jq event as a backbone event, can we listen directly?\n 'change .forward-unpaired-filter input' : function( ev ){ this.trigger( 'filter-change' ); },\n 'focus .forward-unpaired-filter input' : function( ev ){ $( ev.currentTarget ).select(); },\n 'click .autopair-link' : '_clickAutopair',\n 'click .choose-filters .filter-choice' : '_clickFilterChoice',\n 'click .clear-filters-link' : '_clearFilters',\n 'change .reverse-unpaired-filter input' : function( ev ){ this.trigger( 'filter-change' ); },\n 'focus .reverse-unpaired-filter input' : function( ev ){ $( ev.currentTarget ).select(); },\n // unpaired\n 'click .forward-column .dataset.unpaired' : '_clickUnpairedDataset',\n 'click .reverse-column .dataset.unpaired' : '_clickUnpairedDataset',\n 'click .paired-column .dataset.unpaired' : '_clickPairRow',\n 'click .unpaired-columns' : 'clearSelectedUnpaired',\n 'mousedown .unpaired-columns .dataset' : '_mousedownUnpaired',\n // divider\n 'click .paired-column-title' : '_clickShowOnlyPaired',\n 'mousedown .flexible-partition-drag' : '_startPartitionDrag',\n // paired\n 'click .paired-columns .dataset.paired' : 'selectPair',\n 'click .paired-columns' : 'clearSelectedPaired',\n 'click .paired-columns .pair-name' : '_clickPairName',\n 'click .unpair-btn' : '_clickUnpair',\n // paired - drop target\n //'dragenter .paired-columns' : '_dragenterPairedColumns',\n //'dragleave .paired-columns .column-datasets': '_dragleavePairedColumns',\n 'dragover .paired-columns .column-datasets' : '_dragoverPairedColumns',\n 'drop .paired-columns .column-datasets' : '_dropPairedColumns',\n\n 'pair.dragstart .paired-columns .column-datasets' : '_pairDragstart',\n 'pair.dragend .paired-columns .column-datasets' : '_pairDragend',\n\n // footer\n 'change .remove-extensions' : function( ev ){ this.toggleExtensions(); },\n 'change .collection-name' : '_changeName',\n 'keydown .collection-name' : '_nameCheckForEnter',\n 'click .cancel-create' : function( ev ){\n if( typeof this.oncancel === 'function' ){\n this.oncancel.call( this );\n }\n },\n 'click .create-collection' : '_clickCreate'//,\n },\n\n // ........................................................................ header\n /** expand help */\n _clickMoreHelp : function( ev ){\n this.$( '.main-help' ).addClass( 'expanded' );\n this.$( '.more-help' ).hide();\n },\n /** collapse help */\n _clickLessHelp : function( ev ){\n this.$( '.main-help' ).removeClass( 'expanded' );\n this.$( '.more-help' ).show();\n },\n\n /** show an alert on the top of the interface containing message (alertClass is bootstrap's alert-*)*/\n _showAlert : function( message, alertClass ){\n alertClass = alertClass || 'alert-danger';\n this.$( '.main-help' ).hide();\n this.$( '.header .alert' ).attr( 'class', 'alert alert-dismissable' ).addClass( alertClass ).show()\n .find( '.alert-message' ).html( message );\n },\n /** hide the alerts at the top */\n _hideAlert : function( message ){\n this.$( '.main-help' ).show();\n this.$( '.header .alert' ).hide();\n },\n\n /** toggle between showing only unpaired and split view */\n _clickShowOnlyUnpaired : function( ev ){\n //this.debug( 'click unpaired', ev.currentTarget );\n if( this.$( '.paired-columns' ).is( ':visible' ) ){\n this.hidePaired();\n } else {\n this.splitView();\n }\n },\n /** toggle between showing only paired and split view */\n _clickShowOnlyPaired : function( ev ){\n //this.debug( 'click paired' );\n if( this.$( '.unpaired-columns' ).is( ':visible' ) ){\n this.hideUnpaired();\n } else {\n this.splitView();\n }\n },\n\n /** hide unpaired, show paired */\n hideUnpaired : function( speed, callback ){\n this.unpairedPanelHidden = true;\n this.pairedPanelHidden = false;\n this._renderMiddle( speed, callback );\n },\n /** hide paired, show unpaired */\n hidePaired : function( speed, callback ){\n this.unpairedPanelHidden = false;\n this.pairedPanelHidden = true;\n this._renderMiddle( speed, callback );\n },\n /** show both paired and unpaired (splitting evenly) */\n splitView : function( speed, callback ){\n this.unpairedPanelHidden = this.pairedPanelHidden = false;\n this._renderMiddle( speed, callback );\n return this;\n },\n\n /** unpair all paired and do other super neat stuff which I'm not really sure about yet... */\n _clickUnpairAll : function( ev ){\n this.metric( 'unpairAll' );\n this.unpairAll();\n },\n\n /** attempt to autopair */\n _clickAutopair : function( ev ){\n var paired = this.autoPair();\n this.metric( 'autopair', paired.length, this.unpaired.length );\n this.trigger( 'autopair' );\n },\n\n /** set the filters based on the data attributes of the button click target */\n _clickFilterChoice : function( ev ){\n var $selected = $( ev.currentTarget );\n this.$( '.forward-unpaired-filter input' ).val( $selected.data( 'forward' ) );\n this.$( '.reverse-unpaired-filter input' ).val( $selected.data( 'reverse' ) );\n this._hideChooseFilters();\n this.trigger( 'filter-change' );\n },\n\n /** hide the choose filters popover */\n _hideChooseFilters : function(){\n //TODO: update bootstrap and remove the following hack\n // see also: https://github.com/twbs/bootstrap/issues/10260\n this.$( '.choose-filters-link' ).popover( 'hide' );\n this.$( '.popover' ).css( 'display', 'none' );\n },\n\n /** clear both filters */\n _clearFilters : function( ev ){\n this.$( '.forward-unpaired-filter input' ).val( '' );\n this.$( '.reverse-unpaired-filter input' ).val( '' );\n this.trigger( 'filter-change' );\n },\n\n // ........................................................................ unpaired\n /** select an unpaired dataset */\n _clickUnpairedDataset : function( ev ){\n ev.stopPropagation();\n return this.toggleSelectUnpaired( $( ev.currentTarget ) );\n },\n\n /** Toggle the selection of an unpaired dataset representation.\n * @param [jQuery] $dataset the unpaired dataset dom rep to select\n * @param [Boolean] options.force if defined, force selection based on T/F; otherwise, toggle\n */\n toggleSelectUnpaired : function( $dataset, options ){\n options = options || {};\n var dataset = $dataset.data( 'dataset' ),\n select = options.force !== undefined? options.force: !$dataset.hasClass( 'selected' );\n //this.debug( id, options.force, $dataset, dataset );\n if( !$dataset.size() || dataset === undefined ){ return $dataset; }\n\n if( select ){\n $dataset.addClass( 'selected' );\n if( !options.waitToPair ){\n this.pairAllSelected();\n }\n\n } else {\n $dataset.removeClass( 'selected' );\n //delete dataset.selected;\n }\n return $dataset;\n },\n\n /** pair all the currently selected unpaired datasets */\n pairAllSelected : function( options ){\n options = options || {};\n var creator = this,\n fwds = [],\n revs = [],\n pairs = [];\n creator.$( '.unpaired-columns .forward-column .dataset.selected' ).each( function(){\n fwds.push( $( this ).data( 'dataset' ) );\n });\n creator.$( '.unpaired-columns .reverse-column .dataset.selected' ).each( function(){\n revs.push( $( this ).data( 'dataset' ) );\n });\n fwds.length = revs.length = Math.min( fwds.length, revs.length );\n //this.debug( fwds );\n //this.debug( revs );\n fwds.forEach( function( fwd, i ){\n try {\n pairs.push( creator._pair( fwd, revs[i], { silent: true }) );\n\n } catch( err ){\n //TODO: preserve selected state of those that couldn't be paired\n //TODO: warn that some could not be paired\n creator.error( err );\n }\n });\n if( pairs.length && !options.silent ){\n this.trigger( 'pair:new', pairs );\n }\n return pairs;\n },\n\n /** clear the selection on all unpaired datasets */\n clearSelectedUnpaired : function(){\n this.$( '.unpaired-columns .dataset.selected' ).removeClass( 'selected' );\n },\n\n /** when holding down the shift key on a click, 'paint' the moused over datasets as selected */\n _mousedownUnpaired : function( ev ){\n if( ev.shiftKey ){\n var creator = this,\n $startTarget = $( ev.target ).addClass( 'selected' ),\n moveListener = function( ev ){\n creator.$( ev.target ).filter( '.dataset' ).addClass( 'selected' );\n };\n $startTarget.parent().on( 'mousemove', moveListener );\n\n // on any mouseup, stop listening to the move and try to pair any selected\n $( document ).one( 'mouseup', function( ev ){\n $startTarget.parent().off( 'mousemove', moveListener );\n creator.pairAllSelected();\n });\n }\n },\n\n /** attempt to pair two datasets directly across from one another */\n _clickPairRow : function( ev ){\n //if( !ev.currentTarget ){ return true; }\n var rowIndex = $( ev.currentTarget ).index(),\n fwd = $( '.unpaired-columns .forward-column .dataset' ).eq( rowIndex ).data( 'dataset' ),\n rev = $( '.unpaired-columns .reverse-column .dataset' ).eq( rowIndex ).data( 'dataset' );\n //this.debug( 'row:', rowIndex, fwd, rev );\n this._pair( fwd, rev );\n },\n\n // ........................................................................ divider/partition\n /** start dragging the visible divider/partition between unpaired and paired panes */\n _startPartitionDrag : function( ev ){\n var creator = this,\n startingY = ev.pageY;\n //this.debug( 'partition drag START:', ev );\n $( 'body' ).css( 'cursor', 'ns-resize' );\n creator.$( '.flexible-partition-drag' ).css( 'color', 'black' );\n\n function endDrag( ev ){\n //creator.debug( 'partition drag STOP:', ev );\n // doing this by an added class didn't really work well - kept flashing still\n creator.$( '.flexible-partition-drag' ).css( 'color', '' );\n $( 'body' ).css( 'cursor', '' ).unbind( 'mousemove', trackMouse );\n }\n function trackMouse( ev ){\n var offset = ev.pageY - startingY;\n //creator.debug( 'partition:', startingY, offset );\n if( !creator.adjPartition( offset ) ){\n //creator.debug( 'mouseup triggered' );\n $( 'body' ).trigger( 'mouseup' );\n }\n creator._adjUnpairedOnScrollbar();\n startingY += offset;\n }\n $( 'body' ).mousemove( trackMouse );\n $( 'body' ).one( 'mouseup', endDrag );\n },\n\n /** adjust the parition up/down +/-adj pixels */\n adjPartition : function( adj ){\n var $unpaired = this.$( '.unpaired-columns' ),\n $paired = this.$( '.paired-columns' ),\n unpairedHi = parseInt( $unpaired.css( 'height' ), 10 ),\n pairedHi = parseInt( $paired.css( 'height' ), 10 );\n //this.debug( adj, 'hi\\'s:', unpairedHi, pairedHi, unpairedHi + adj, pairedHi - adj );\n\n unpairedHi = Math.max( 10, unpairedHi + adj );\n pairedHi = pairedHi - adj;\n\n var movingUpwards = adj < 0;\n // when the divider gets close to the top - lock into hiding the unpaired section\n if( movingUpwards ){\n if( this.unpairedPanelHidden ){\n return false;\n } else if( unpairedHi <= 10 ){\n this.hideUnpaired();\n return false;\n }\n } else {\n if( this.unpairedPanelHidden ){\n $unpaired.show();\n this.unpairedPanelHidden = false;\n }\n }\n\n // when the divider gets close to the bottom - lock into hiding the paired section\n if( !movingUpwards ){\n if( this.pairedPanelHidden ){\n return false;\n } else if( pairedHi <= 15 ){\n this.hidePaired();\n return false;\n }\n\n } else {\n if( this.pairedPanelHidden ){\n $paired.show();\n this.pairedPanelHidden = false;\n }\n }\n\n $unpaired.css({\n height : unpairedHi + 'px',\n flex : '0 0 auto'\n });\n return true;\n },\n\n // ........................................................................ paired\n /** select a pair when clicked */\n selectPair : function( ev ){\n ev.stopPropagation();\n $( ev.currentTarget ).toggleClass( 'selected' );\n },\n\n /** deselect all pairs */\n clearSelectedPaired : function( ev ){\n this.$( '.paired-columns .dataset.selected' ).removeClass( 'selected' );\n },\n\n /** rename a pair when the pair name is clicked */\n _clickPairName : function( ev ){\n ev.stopPropagation();\n var $name = $( ev.currentTarget ),\n $pair = $name.parent().parent(),\n index = $pair.index( '.dataset.paired' ),\n pair = this.paired[ index ],\n response = prompt( 'Enter a new name for the pair:', pair.name );\n if( response ){\n pair.name = response;\n // set a flag (which won't be passed in json creation) for manual naming so we don't overwrite these\n // when adding/removing extensions\n //hackish\n pair.customizedName = true;\n $name.text( pair.name );\n }\n },\n\n /** unpair this pair */\n _clickUnpair : function( ev ){\n //if( !ev.currentTarget ){ return true; }\n var pairIndex = Math.floor( $( ev.currentTarget ).index( '.unpair-btn' ) );\n //this.debug( 'pair:', pairIndex );\n this._unpair( this.paired[ pairIndex ] );\n },\n\n // ........................................................................ paired - drag and drop re-ordering\n //_dragenterPairedColumns : function( ev ){\n // this.debug( '_dragenterPairedColumns:', ev );\n //},\n //_dragleavePairedColumns : function( ev ){\n // //this.debug( '_dragleavePairedColumns:', ev );\n //},\n /** track the mouse drag over the paired list adding a placeholder to show where the drop would occur */\n _dragoverPairedColumns : function( ev ){\n //this.debug( '_dragoverPairedColumns:', ev );\n ev.preventDefault();\n\n var $list = this.$( '.paired-columns .column-datasets' );\n this._checkForAutoscroll( $list, ev.originalEvent.clientY );\n //this.debug( ev.originalEvent.clientX, ev.originalEvent.clientY );\n var $nearest = this._getNearestPairedDatasetLi( ev.originalEvent.clientY );\n\n $( '.element-drop-placeholder' ).remove();\n var $placeholder = $( '
                            ' );\n if( !$nearest.size() ){\n $list.append( $placeholder );\n } else {\n $nearest.before( $placeholder );\n }\n },\n\n /** If the mouse is near enough to the list's top or bottom, scroll the list */\n _checkForAutoscroll : function( $element, y ){\n var AUTOSCROLL_SPEED = 2;\n var offset = $element.offset(),\n scrollTop = $element.scrollTop(),\n upperDist = y - offset.top,\n lowerDist = ( offset.top + $element.outerHeight() ) - y;\n //this.debug( '_checkForAutoscroll:', scrollTop, upperDist, lowerDist );\n if( upperDist >= 0 && upperDist < this.autoscrollDist ){\n $element.scrollTop( scrollTop - AUTOSCROLL_SPEED );\n } else if( lowerDist >= 0 && lowerDist < this.autoscrollDist ){\n $element.scrollTop( scrollTop + AUTOSCROLL_SPEED );\n }\n },\n\n /** get the nearest *previous* paired dataset PairView based on the mouse's Y coordinate.\n * If the y is at the end of the list, return an empty jQuery object.\n */\n _getNearestPairedDatasetLi : function( y ){\n var WIGGLE = 4,\n lis = this.$( '.paired-columns .column-datasets li' ).toArray();\n for( var i=0; i y && top - halfHeight < y ){\n //this.debug( y, top + halfHeight, top - halfHeight )\n return $li;\n }\n }\n return $();\n },\n /** drop (dragged/selected PairViews) onto the list, re-ordering both the DOM and the internal array of pairs */\n _dropPairedColumns : function( ev ){\n // both required for firefox\n ev.preventDefault();\n ev.dataTransfer.dropEffect = 'move';\n\n var $nearest = this._getNearestPairedDatasetLi( ev.originalEvent.clientY );\n if( $nearest.size() ){\n this.$dragging.insertBefore( $nearest );\n\n } else {\n // no nearest before - insert after last element (unpair button)\n this.$dragging.insertAfter( this.$( '.paired-columns .unpair-btn' ).last() );\n }\n // resync the creator's list of paired based on the new DOM order\n this._syncPairsToDom();\n return false;\n },\n /** resync the creator's list of paired based on the DOM order of pairs */\n _syncPairsToDom : function(){\n var newPaired = [];\n //TODO: doesn't seem wise to use the dom to store these - can't we sync another way?\n this.$( '.paired-columns .dataset.paired' ).each( function(){\n newPaired.push( $( this ).data( 'pair' ) );\n });\n //this.debug( newPaired );\n this.paired = newPaired;\n this._renderPaired();\n },\n /** drag communication with pair sub-views: dragstart */\n _pairDragstart : function( ev, pair ){\n //this.debug( '_pairDragstart', ev, pair )\n // auto select the pair causing the event and move all selected\n pair.$el.addClass( 'selected' );\n var $selected = this.$( '.paired-columns .dataset.selected' );\n this.$dragging = $selected;\n },\n /** drag communication with pair sub-views: dragend - remove the placeholder */\n _pairDragend : function( ev, pair ){\n //this.debug( '_pairDragend', ev, pair )\n $( '.element-drop-placeholder' ).remove();\n this.$dragging = null;\n },\n\n // ........................................................................ footer\n toggleExtensions : function( force ){\n var creator = this;\n creator.removeExtensions = ( force !== undefined )?( force ):( !creator.removeExtensions );\n\n _.each( creator.paired, function( pair ){\n // don't overwrite custom names\n if( pair.customizedName ){ return; }\n pair.name = creator._guessNameForPair( pair.forward, pair.reverse );\n });\n\n creator._renderPaired();\n creator._renderFooter();\n },\n\n /** handle a collection name change */\n _changeName : function( ev ){\n this._validationWarning( 'name', !!this._getName() );\n },\n\n /** check for enter key press when in the collection name and submit */\n _nameCheckForEnter : function( ev ){\n if( ev.keyCode === 13 && !this.blocking ){\n this._clickCreate();\n }\n },\n\n /** get the current collection name */\n _getName : function(){\n return _.escape( this.$( '.collection-name' ).val() );\n },\n\n /** attempt to create the current collection */\n _clickCreate : function( ev ){\n var name = this._getName();\n if( !name ){\n this._validationWarning( 'name' );\n } else if( !this.blocking ){\n this.createList();\n }\n },\n\n // ------------------------------------------------------------------------ misc\n /** debug a dataset list */\n _printList : function( list ){\n var creator = this;\n _.each( list, function( e ){\n if( list === creator.paired ){\n creator._printPair( e );\n } else {\n //creator.debug( e );\n }\n });\n },\n\n /** print a pair Object */\n _printPair : function( pair ){\n this.debug( pair.forward.name, pair.reverse.name, ': ->', pair.name );\n },\n\n /** string rep */\n toString : function(){ return 'PairedCollectionCreator'; }\n});\n\n\n//TODO: move to require text plugin and load these as text\n//TODO: underscore currently unnecc. bc no vars are used\n//TODO: better way of localizing text-nodes in long strings\n/** underscore template fns attached to class */\nPairedCollectionCreator.templates = PairedCollectionCreator.templates || {\n\n /** the skeleton */\n main : _.template([\n '
                            ',\n '
                            ',\n '
                            '\n ].join('')),\n\n /** the header (not including help text) */\n header : _.template([\n '
                            ',\n '', _l( 'More help' ), '',\n '
                            ',\n '', _l( 'Less' ), '',\n '
                            ',\n '
                            ',\n '
                            ',\n '',\n '',\n '
                            ',\n\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            ',\n '', _l( 'Unpaired forward' ), '',\n '',\n '
                            ',\n '
                            ',\n '',\n '
                            ',\n '
                            ',\n '
                            ',\n '',\n '
                            ',\n '
                            ',\n '
                            ',\n '', _l( 'Unpaired reverse' ), '',\n '',\n '
                            ',\n '
                            ',\n '',\n '
                            ',\n '
                            ',\n '
                            ',\n '
                            '\n ].join('')),\n\n /** the middle: unpaired, divider, and paired */\n middle : _.template([\n // contains two flex rows (rows that fill available space) and a divider btwn\n '
                            ',\n '
                            ',\n '
                              ',\n '
                              ',\n '
                              ',\n '
                                ',\n '
                                ',\n '
                                ',\n '
                                  ',\n '
                                  ',\n '
                                  ',\n '
                                  ',\n '
                                  ',\n '
                                  ',\n '
                                  ',\n '',\n '
                                  ',\n '',\n _l( 'Unpair all' ),\n '',\n '
                                  ',\n '
                                  ',\n '
                                  ',\n '
                                    ',\n '
                                    '\n ].join('')),\n\n /** creation and cancel controls */\n footer : _.template([\n '
                                    ',\n '
                                    ',\n '',\n '
                                    ',\n '
                                    ',\n '',\n '
                                    ', _l( 'Name' ), ':
                                    ',\n '
                                    ',\n '
                                    ',\n\n '
                                    ',\n '
                                    ',\n '',\n '
                                    ',\n '',\n '',\n '
                                    ',\n '
                                    ',\n\n '
                                    ',\n '',\n '
                                    ',\n '
                                    '\n ].join('')),\n\n /** help content */\n helpContent : _.template([\n '

                                    ', _l([\n 'Collections of paired datasets are ordered lists of dataset pairs (often forward and reverse reads). ',\n 'These collections can be passed to tools and workflows in order to have analyses done on each member of ',\n 'the entire group. This interface allows you to create a collection, choose which datasets are paired, ',\n 'and re-order the final collection.'\n ].join( '' )), '

                                    ',\n '

                                    ', _l([\n 'Unpaired datasets are shown in the unpaired section ',\n '(hover over the underlined words to highlight below). ',\n 'Paired datasets are shown in the paired section.',\n '

                                      To pair datasets, you can:',\n '
                                    • Click a dataset in the ',\n 'forward column ',\n 'to select it then click a dataset in the ',\n 'reverse column.',\n '
                                    • ',\n '
                                    • Click one of the \"Pair these datasets\" buttons in the ',\n 'middle column ',\n 'to pair the datasets in a particular row.',\n '
                                    • ',\n '
                                    • Click \"Auto-pair\" ',\n 'to have your datasets automatically paired based on name.',\n '
                                    • ',\n '
                                    '\n ].join( '' )), '

                                    ',\n '

                                    ', _l([\n '

                                      You can filter what is shown in the unpaired sections by:',\n '
                                    • Entering partial dataset names in either the ',\n 'forward filter or ',\n 'reverse filter.',\n '
                                    • ',\n '
                                    • Choosing from a list of preset filters by clicking the ',\n '\"Choose filters\" link.',\n '
                                    • ',\n '
                                    • Entering regular expressions to match dataset names. See: ',\n 'MDN\\'s JavaScript Regular Expression Tutorial. ',\n 'Note: forward slashes (\\\\) are not needed.',\n '
                                    • ',\n '
                                    • Clearing the filters by clicking the ',\n '\"Clear filters\" link.',\n '
                                    • ',\n '
                                    '\n ].join( '' )), '

                                    ',\n '

                                    ', _l([\n 'To unpair individual dataset pairs, click the ',\n 'unpair buttons ( ). ',\n 'Click the \"Unpair all\" link to unpair all pairs.'\n ].join( '' )), '

                                    ',\n '

                                    ', _l([\n 'You can include or remove the file extensions (e.g. \".fastq\") from your pair names by toggling the ',\n '\"Remove file extensions from pair names?\" control.'\n ].join( '' )), '

                                    ',\n '

                                    ', _l([\n 'Once your collection is complete, enter a name and ',\n 'click \"Create list\". ',\n '(Note: you do not have to pair all unpaired datasets to finish.)'\n ].join( '' )), '

                                    '\n ].join(''))\n};\n\n\n//=============================================================================\n/** a modal version of the paired collection creator */\nvar pairedCollectionCreatorModal = function _pairedCollectionCreatorModal( datasets, options ){\n\n var deferred = jQuery.Deferred(),\n creator;\n\n options = _.defaults( options || {}, {\n datasets : datasets,\n oncancel : function(){\n Galaxy.modal.hide();\n deferred.reject( 'cancelled' );\n },\n oncreate : function( creator, response ){\n Galaxy.modal.hide();\n deferred.resolve( response );\n }\n });\n\n if( !window.Galaxy || !Galaxy.modal ){\n throw new Error( 'Galaxy or Galaxy.modal not found' );\n }\n\n creator = new PairedCollectionCreator( options );\n Galaxy.modal.show({\n title : 'Create a collection of paired datasets',\n body : creator.$el,\n width : '80%',\n height : '800px',\n closing_events: true\n });\n creator.render();\n window.creator = creator;\n\n //TODO: remove modal header\n return deferred;\n};\n\n\n//=============================================================================\nfunction createListOfPairsCollection( collection ){\n var elements = collection.toJSON();\n//TODO: validate elements\n return pairedCollectionCreatorModal( elements, {\n historyId : collection.historyId\n });\n}\n\n\n//=============================================================================\n return {\n PairedCollectionCreator : PairedCollectionCreator,\n pairedCollectionCreatorModal : pairedCollectionCreatorModal,\n createListOfPairsCollection : createListOfPairsCollection\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/list-of-pairs-collection-creator.js\n ** module id = 125\n ** module chunks = 3\n **/","define([\n \"mvc/collection/list-collection-creator\",\n \"mvc/history/hdca-model\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( LIST_CREATOR, HDCA, BASE_MVC, _l ){\n\nvar logNamespace = 'collections';\n/*==============================================================================\nTODO:\n the paired creator doesn't really mesh with the list creator as parent\n it may be better to make an abstract super class for both\n composites may inherit from this (or vis-versa)\n PairedDatasetCollectionElementView doesn't make a lot of sense\n\n==============================================================================*/\n/** */\nvar PairedDatasetCollectionElementView = Backbone.View.extend( BASE_MVC.LoggableMixin ).extend({\n _logNamespace : logNamespace,\n\n//TODO: use proper class (DatasetDCE or NestedDCDCE (or the union of both))\n tagName : 'li',\n className : 'collection-element',\n\n initialize : function( attributes ){\n this.element = attributes.element || {};\n this.identifier = attributes.identifier;\n },\n\n render : function(){\n this.$el\n .attr( 'data-element-id', this.element.id )\n .html( this.template({ identifier: this.identifier, element: this.element }) );\n return this;\n },\n\n //TODO: lots of unused space in the element - possibly load details and display them horiz.\n template : _.template([\n '<%- identifier %>',\n '<%- element.name %>',\n ].join('')),\n\n /** remove the DOM and any listeners */\n destroy : function(){\n this.off();\n this.$el.remove();\n },\n\n /** string rep */\n toString : function(){\n return 'DatasetCollectionElementView()';\n }\n});\n\n\n// ============================================================================\nvar _super = LIST_CREATOR.ListCollectionCreator;\n\n/** An interface for building collections.\n */\nvar PairCollectionCreator = _super.extend({\n\n /** the class used to display individual elements */\n elementViewClass : PairedDatasetCollectionElementView,\n /** the class this creator will create and save */\n collectionClass : HDCA.HistoryPairDatasetCollection,\n className : 'pair-collection-creator collection-creator flex-row-container',\n\n /** override to no-op */\n _mangleDuplicateNames : function(){},\n\n // TODO: this whole pattern sucks. There needs to be two classes of problem area:\n // bad inital choices and\n // when the user has painted his/her self into a corner during creation/use-of-the-creator\n /** render the entire interface */\n render : function( speed, callback ){\n if( this.workingElements.length === 2 ){\n return _super.prototype.render.call( this, speed, callback );\n }\n return this._renderInvalid( speed, callback );\n },\n\n // ------------------------------------------------------------------------ rendering elements\n /** render forward/reverse */\n _renderList : function( speed, callback ){\n //this.debug( '-- _renderList' );\n //precondition: there are two valid elements in workingElements\n var creator = this,\n $tmp = jQuery( '
                                    ' ),\n $list = creator.$list();\n\n // lose the original views, create the new, append all at once, then call their renders\n _.each( this.elementViews, function( view ){\n view.destroy();\n creator.removeElementView( view );\n });\n $tmp.append( creator._createForwardElementView().$el );\n $tmp.append( creator._createReverseElementView().$el );\n $list.empty().append( $tmp.children() );\n _.invoke( creator.elementViews, 'render' );\n },\n\n /** create the forward element view */\n _createForwardElementView : function(){\n return this._createElementView( this.workingElements[0], { identifier: 'forward' } );\n },\n\n /** create the forward element view */\n _createReverseElementView : function(){\n return this._createElementView( this.workingElements[1], { identifier: 'reverse' } );\n },\n\n /** create an element view, cache in elementViews, and return */\n _createElementView : function( element, options ){\n var elementView = new this.elementViewClass( _.extend( options, {\n element : element,\n }));\n this.elementViews.push( elementView );\n return elementView;\n },\n\n /** swap the forward, reverse elements and re-render */\n swap : function(){\n this.workingElements = [\n this.workingElements[1],\n this.workingElements[0],\n ];\n this._renderList();\n },\n\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .swap' : 'swap',\n }),\n\n // ------------------------------------------------------------------------ templates\n //TODO: move to require text plugin and load these as text\n //TODO: underscore currently unnecc. bc no vars are used\n //TODO: better way of localizing text-nodes in long strings\n /** underscore template fns attached to class */\n templates : _.extend( _.clone( _super.prototype.templates ), {\n /** the middle: element list */\n middle : _.template([\n '',\n '
                                    ',\n '
                                    '\n ].join('')),\n\n /** help content */\n helpContent : _.template([\n '

                                    ', _l([\n 'Pair collections are permanent collections containing two datasets: one forward and one reverse. ',\n 'Often these are forward and reverse reads. The pair collections can be passed to tools and ',\n 'workflows in order to have analyses done on both datasets. This interface allows ',\n 'you to create a pair, name it, and swap which is forward and which reverse.'\n ].join( '' )), '

                                    ',\n '
                                      ',\n '
                                    • ', _l([\n 'Click the \"Swap\" link to make your forward dataset the reverse ',\n 'and the reverse dataset forward.'\n ].join( '' )), '
                                    • ',\n '
                                    • ', _l([\n 'Click the \"Cancel\" button to exit the interface.'\n ].join( '' )), '
                                    • ',\n '

                                    ',\n '

                                    ', _l([\n 'Once your collection is complete, enter a name and ',\n 'click \"Create list\".'\n ].join( '' )), '

                                    '\n ].join('')),\n\n /** a simplified page communicating what went wrong and why the user needs to reselect something else */\n invalidInitial : _.template([\n '
                                    ',\n '
                                    ',\n '',\n '<% if( _.size( problems ) ){ %>',\n _l( 'The following selections could not be included due to problems' ),\n '
                                      <% _.each( problems, function( problem ){ %>',\n '
                                    • <%- problem.element.name %>: <%- problem.text %>
                                    • ',\n '<% }); %>
                                    ',\n '<% } else if( _.size( elements ) === 0 ){ %>',\n _l( 'No datasets were selected' ), '.',\n '<% } else if( _.size( elements ) === 1 ){ %>',\n _l( 'Only one dataset was selected' ), ': <%- elements[0].name %>',\n '<% } else if( _.size( elements ) > 2 ){ %>',\n _l( 'Too many datasets were selected' ),\n ': <%- _.pluck( elements, \"name\" ).join( \", \") %>',\n '<% } %>',\n '
                                    ',\n _l( 'Two (and only two) elements are needed for the pair' ), '. ',\n _l( 'You may need to ' ),\n '', _l( 'cancel' ), ' ',\n _l( 'and reselect new elements' ), '.',\n '
                                    ',\n '
                                    ',\n '
                                    ',\n '
                                    ',\n '
                                    ',\n '
                                    ',\n '',\n // _l( 'Create a different kind of collection' ),\n '
                                    ',\n '
                                    ',\n '
                                    '\n ].join('')),\n }),\n\n // ------------------------------------------------------------------------ misc\n /** string rep */\n toString : function(){ return 'PairCollectionCreator'; }\n});\n\n\n//==============================================================================\n/** List collection flavor of collectionCreatorModal. */\nvar pairCollectionCreatorModal = function _pairCollectionCreatorModal( elements, options ){\n options = options || {};\n options.title = _l( 'Create a collection from a pair of datasets' );\n return LIST_CREATOR.collectionCreatorModal( elements, options, PairCollectionCreator );\n};\n\n\n//==============================================================================\n/** Use a modal to create a pair collection, then add it to the given history contents.\n * @returns {Deferred} resolved when the collection is added to the history.\n */\nfunction createPairCollection( contents ){\n var elements = contents.toJSON(),\n promise = pairCollectionCreatorModal( elements, {\n creationFn : function( elements, name ){\n elements = [\n { name: \"forward\", src: \"hda\", id: elements[0].id },\n { name: \"reverse\", src: \"hda\", id: elements[1].id }\n ];\n return contents.createHDCA( elements, 'paired', name );\n }\n });\n return promise;\n}\n\n//==============================================================================\n return {\n PairCollectionCreator : PairCollectionCreator,\n pairCollectionCreatorModal : pairCollectionCreatorModal,\n createPairCollection : createPairCollection,\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/collection/pair-collection-creator.js\n ** module id = 126\n ** module chunks = 3\n **/","define([\n \"mvc/ui/ui-modal\",\n \"utils/localization\"\n], function( MODAL, _l ){\n\n\"use strict\";\n//==============================================================================\n/**\n * A dialog/modal that allows copying a user history or 'importing' from user\n * another. Generally called via historyCopyDialog below.\n * @type {Object}\n */\nvar CopyDialog = {\n\n // language related strings/fns\n defaultName : _.template( \"Copy of '<%- name %>'\" ),\n title : _.template( _l( 'Copying history' ) + ' \"<%- name %>\"' ),\n submitLabel : _l( 'Copy' ),\n errorMessage : _l( 'History could not be copied' ),\n progressive : _l( 'Copying history' ),\n activeLabel : _l( 'Copy only the active, non-deleted datasets' ),\n allLabel : _l( 'Copy all datasets including deleted ones' ),\n anonWarning : _l( 'As an anonymous user, unless you login or register, you will lose your current history ' ) +\n _l( 'after copying this history. ' ),\n\n // template for modal body\n _template : _.template([\n //TODO: remove inline styles\n // show a warning message for losing current to anon users\n '<% if( isAnon ){ %>',\n '
                                    ',\n '<%- anonWarning %>',\n _l( 'You can' ),\n ' ', _l( 'login here' ), ' ', _l( 'or' ), ' ',\n ' ', _l( 'register here' ), '.',\n '
                                    ',\n '<% } %>',\n '
                                    ',\n '
                                    ',\n // TODO: could use required here and the form validators\n // NOTE: use unescaped here if escaped in the modal function below\n '\" />',\n '

                                    ',\n _l( 'Please enter a valid history title' ),\n '

                                    ',\n // if allowAll, add the option to copy deleted datasets, too\n '<% if( allowAll ){ %>',\n '
                                    ',\n '

                                    ', _l( 'Choose which datasets from the original history to include:' ), '

                                    ',\n // copy non-deleted is the default\n '/>',\n '',\n '
                                    ',\n '/>',\n '',\n '<% } %>',\n '
                                    '\n ].join( '' )),\n\n // empty modal body and let the user know the copy is happening\n _showAjaxIndicator : function _showAjaxIndicator(){\n var indicator = '

                                    ' + this.progressive + '...

                                    ';\n this.modal.$( '.modal-body' ).empty().append( indicator ).css({ 'margin-top': '8px' });\n },\n\n // (sorta) public interface - display the modal, render the form, and potentially copy the history\n // returns a jQuery.Deferred done->history copied, fail->user cancelled\n dialog : function _dialog( modal, history, options ){\n options = options || {};\n\n var dialog = this,\n deferred = jQuery.Deferred(),\n // TODO: getting a little byzantine here\n defaultCopyNameFn = options.nameFn || this.defaultName,\n defaultCopyName = defaultCopyNameFn({ name: history.get( 'name' ) }),\n // TODO: these two might be simpler as one 3 state option (all,active,no-choice)\n defaultCopyWhat = options.allDatasets? 'copy-all' : 'copy-non-deleted',\n allowAll = !_.isUndefined( options.allowAll )? options.allowAll : true,\n autoClose = !_.isUndefined( options.autoClose )? options.autoClose : true;\n\n this.modal = modal;\n\n\n // validate the name and copy if good\n function checkNameAndCopy(){\n var name = modal.$( '#copy-modal-title' ).val();\n if( !name ){\n modal.$( '.invalid-title' ).show();\n return;\n }\n // get further settings, shut down and indicate the ajax call, then hide and resolve/reject\n var copyAllDatasets = modal.$( 'input[name=\"copy-what\"]:checked' ).val() === 'copy-all';\n modal.$( 'button' ).prop( 'disabled', true );\n dialog._showAjaxIndicator();\n history.copy( true, name, copyAllDatasets )\n .done( function( response ){\n deferred.resolve( response );\n })\n //TODO: make this unneccessary with pub-sub error or handling via Galaxy\n .fail( function(){\n alert([ dialog.errorMessage, _l( 'Please contact a Galaxy administrator' ) ].join( '. ' ));\n deferred.rejectWith( deferred, arguments );\n })\n .always( function(){\n if( autoClose ){ modal.hide(); }\n });\n }\n\n var originalClosingCallback = options.closing_callback;\n modal.show( _.extend( options, {\n title : this.title({ name: history.get( 'name' ) }),\n body : $( dialog._template({\n name : defaultCopyName,\n isAnon : Galaxy.user.isAnonymous(),\n allowAll : allowAll,\n copyWhat : defaultCopyWhat,\n activeLabel : this.activeLabel,\n allLabel : this.allLabel,\n anonWarning : this.anonWarning,\n })),\n buttons : _.object([\n [ _l( 'Cancel' ), function(){ modal.hide(); } ],\n [ this.submitLabel, checkNameAndCopy ]\n ]),\n height : 'auto',\n closing_events : true,\n closing_callback: function _historyCopyClose( cancelled ){\n if( cancelled ){\n deferred.reject({ cancelled : true });\n }\n if( originalClosingCallback ){\n originalClosingCallback( cancelled );\n }\n }\n }));\n\n // set the default dataset copy, autofocus the title, and set up for a simple return\n modal.$( '#copy-modal-title' ).focus().select();\n modal.$( '#copy-modal-title' ).on( 'keydown', function( ev ){\n if( ev.keyCode === 13 ){\n ev.preventDefault();\n checkNameAndCopy();\n }\n });\n\n return deferred;\n },\n};\n\n//==============================================================================\n// maintain the (slight) distinction between copy and import\n/**\n * Subclass CopyDialog to use the import language.\n */\nvar ImportDialog = _.extend( {}, CopyDialog, {\n defaultName : _.template( \"imported: <%- name %>\" ),\n title : _.template( _l( 'Importing history' ) + ' \"<%- name %>\"' ),\n submitLabel : _l( 'Import' ),\n errorMessage : _l( 'History could not be imported' ),\n progressive : _l( 'Importing history' ),\n activeLabel : _l( 'Import only the active, non-deleted datasets' ),\n allLabel : _l( 'Import all datasets including deleted ones' ),\n anonWarning : _l( 'As an anonymous user, unless you login or register, you will lose your current history ' ) +\n _l( 'after importing this history. ' ),\n\n});\n\n//==============================================================================\n/**\n * Main interface for both history import and history copy dialogs.\n * @param {Backbone.Model} history the history to copy\n * @param {Object} options a hash\n * @return {jQuery.Deferred} promise that fails on close and succeeds on copy\n *\n * options:\n * (this object is also passed to the modal used to display the dialog and accepts modal options)\n * {Function} nameFn if defined, use this to build the default name shown to the user\n * (the fn is passed: {name: })\n * {bool} useImport if true, use the 'import' language (instead of Copy)\n * {bool} allowAll if true, allow the user to choose between copying all datasets and\n * only non-deleted datasets\n * {String} allDatasets default initial checked radio button: 'copy-all' or 'copy-non-deleted',\n */\nvar historyCopyDialog = function( history, options ){\n options = options || {};\n // create our own modal if Galaxy doesn't have one (mako tab without use_panels)\n var modal = window.parent.Galaxy.modal || new MODAL.View({});\n return options.useImport?\n ImportDialog.dialog( modal, history, options ):\n CopyDialog.dialog( modal, history, options );\n};\n\n\n//==============================================================================\n return historyCopyDialog;\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/copy-dialog.js\n ** module id = 127\n ** module chunks = 3\n **/","define([\n \"mvc/dataset/dataset-li-edit\",\n \"mvc/history/hda-li\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( DATASET_LI_EDIT, HDA_LI, BASE_MVC, _l ){\n//==============================================================================\nvar _super = DATASET_LI_EDIT.DatasetListItemEdit;\n/** @class Editing view for HistoryDatasetAssociation.\n */\nvar HDAListItemEdit = _super.extend(\n/** @lends HDAListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : _super.prototype.className + \" history-content\",\n\n /** In this override, only get details if in the ready state, get rerunnable if in other states.\n * Note: fetch with no 'change' event triggering to prevent automatic rendering.\n */\n _fetchModelDetails : function(){\n var view = this;\n if( view.model.inReadyState() && !view.model.hasDetails() ){\n return view.model.fetch({ silent: true });\n\n // special case the need for the rerunnable and creating_job attributes\n // needed for rendering re-run button on queued, running datasets\n } else if( !view.model.has( 'rerunnable' ) ){\n return view.model.fetch({ silent: true, data: {\n // only fetch rerunnable and creating_job to keep overhead down\n keys: [ 'rerunnable', 'creating_job' ].join(',')\n }});\n }\n return jQuery.when();\n },\n\n /** event map */\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .unhide-link' : function( ev ){ this.model.unhide(); return false; }\n }),\n\n /** string rep */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDAListItemEdit(' + modelString + ')';\n }\n});\n\n\n// ............................................................................ TEMPLATES\n/** underscore templates */\nHDAListItemEdit.prototype.templates = (function(){\n//TODO: move to require text! plugin\n\n var warnings = _.extend( {}, _super.prototype.templates.warnings, {\n hidden : BASE_MVC.wrapTemplate([\n '<% if( !dataset.visible ){ %>',\n // add a link to unhide a dataset\n '
                                    ',\n _l( 'This dataset has been hidden' ),\n '
                                    ', _l( 'Unhide it' ), '',\n '
                                    ',\n '<% } %>'\n ], 'dataset' )\n });\n\n return _.extend( {}, _super.prototype.templates, {\n //NOTE: *steal* the HDAListItemView titleBar\n titleBar : HDA_LI.HDAListItemView.prototype.templates.titleBar,\n warnings : warnings\n });\n}());\n\n\n//==============================================================================\n return {\n HDAListItemEdit : HDAListItemEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hda-li-edit.js\n ** module id = 128\n ** module chunks = 3\n **/","define([\n \"mvc/history/hdca-li\",\n \"mvc/collection/collection-view-edit\",\n \"ui/fa-icon-button\",\n \"utils/localization\"\n], function( HDCA_LI, DC_VIEW_EDIT, faIconButton, _l ){\n//==============================================================================\nvar _super = HDCA_LI.HDCAListItemView;\n/** @class Editing view for HistoryDatasetCollectionAssociation.\n */\nvar HDCAListItemEdit = _super.extend(\n/** @lends HDCAListItemEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** Override to return editable versions of the collection panels */\n _getFoldoutPanelClass : function(){\n switch( this.model.get( 'collection_type' ) ){\n case 'list':\n return DC_VIEW_EDIT.ListCollectionViewEdit;\n case 'paired':\n return DC_VIEW_EDIT.PairCollectionViewEdit;\n case 'list:paired':\n return DC_VIEW_EDIT.ListOfPairsCollectionViewEdit;\n }\n throw new TypeError( 'Uknown collection_type: ' + this.model.get( 'collection_type' ) );\n },\n\n // ......................................................................... delete\n /** In this override, add the delete button. */\n _renderPrimaryActions : function(){\n this.log( this + '._renderPrimaryActions' );\n // render the display, edit attr and delete icon-buttons\n return _super.prototype._renderPrimaryActions.call( this )\n .concat([\n this._renderDeleteButton()\n ]);\n },\n\n /** Render icon-button to delete this collection. */\n _renderDeleteButton : function(){\n var self = this,\n deleted = this.model.get( 'deleted' );\n return faIconButton({\n title : deleted? _l( 'Dataset collection is already deleted' ): _l( 'Delete' ),\n classes : 'delete-btn',\n faIcon : 'fa-times',\n disabled : deleted,\n onclick : function() {\n // ...bler... tooltips being left behind in DOM (hover out never called on deletion)\n self.$el.find( '.icon-btn.delete-btn' ).trigger( 'mouseout' );\n self.model[ 'delete' ]();\n }\n });\n },\n\n // ......................................................................... misc\n /** string rep */\n toString : function(){\n var modelString = ( this.model )?( this.model + '' ):( '(no model)' );\n return 'HDCAListItemEdit(' + modelString + ')';\n }\n});\n\n//==============================================================================\n return {\n HDCAListItemEdit : HDCAListItemEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/hdca-li-edit.js\n ** module id = 129\n ** module chunks = 3\n **/","define([\n \"mvc/history/history-model\",\n \"mvc/history/history-view-edit\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( HISTORY_MODEL, HISTORY_VIEW_EDIT, BASE_MVC, _l ){\n// ============================================================================\n/** session storage for history panel preferences (and to maintain state)\n */\nvar HistoryViewPrefs = BASE_MVC.SessionStorageModel.extend(\n/** @lends HistoryViewPrefs.prototype */{\n defaults : {\n /** should the tags editor be shown or hidden initially? */\n tagsEditorShown : false,\n /** should the annotation editor be shown or hidden initially? */\n annotationEditorShown : false,\n ///** what is the currently focused content (dataset or collection) in the current history?\n // * (the history panel will highlight and scroll to the focused content view)\n // */\n //focusedContentId : null\n /** Current scroll position */\n scrollPosition : 0\n },\n toString : function(){\n return 'HistoryViewPrefs(' + JSON.stringify( this.toJSON() ) + ')';\n }\n});\n\n/** key string to store panel prefs (made accessible on class so you can access sessionStorage directly) */\nHistoryViewPrefs.storageKey = function storageKey(){\n return ( 'history-panel' );\n};\n\n/* =============================================================================\nTODO:\n\n============================================================================= */\nvar _super = HISTORY_VIEW_EDIT.HistoryViewEdit;\n// used in root/index.mako\n/** @class View/Controller for the user's current history model as used in the history\n * panel (current right hand panel) of the analysis page.\n *\n * The only history panel that:\n * will poll for updates.\n * displays datasets in reverse hid order.\n */\nvar CurrentHistoryView = _super.extend(\n/** @lends CurrentHistoryView.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n className : _super.prototype.className + ' current-history-panel',\n\n emptyMsg : _l( \"This history is empty. Click 'Get Data' on the left tool menu to start\" ),\n noneFoundMsg : _l( \"No matching datasets found\" ),\n\n /** */\n HDCAViewClass : _super.prototype.HDCAViewClass.extend({\n foldoutStyle : 'drilldown'\n }),\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events */\n initialize : function( attributes ){\n attributes = attributes || {};\n\n // ---- persistent preferences\n /** maintain state / preferences over page loads */\n this.preferences = new HistoryViewPrefs( _.extend({\n id : HistoryViewPrefs.storageKey()\n }, _.pick( attributes, _.keys( HistoryViewPrefs.prototype.defaults ) )));\n\n _super.prototype.initialize.call( this, attributes );\n\n /** sub-views that will overlay this panel (collections) */\n this.panelStack = [];\n\n /** id of currently focused content */\n this.currentContentId = attributes.currentContentId || null;\n //NOTE: purposely not sent to localstorage since panel recreation roughly lines up with a reset of this value\n },\n\n /** Override to cache the current scroll position with a listener */\n _setUpListeners : function(){\n _super.prototype._setUpListeners.call( this );\n\n var panel = this;\n // reset scroll position when there's a new history\n this.on( 'new-model', function(){\n panel.preferences.set( 'scrollPosition', 0 );\n });\n },\n\n // ------------------------------------------------------------------------ loading history/item models\n /** (re-)loads the user's current history & contents w/ details */\n loadCurrentHistory : function( attributes ){\n this.debug( this + '.loadCurrentHistory' );\n // implemented as a 'fresh start' or for when there is no model (intial panel render)\n var panel = this;\n return this.loadHistoryWithDetails( 'current', attributes )\n .then(function( historyData, contentsData ){\n panel.trigger( 'current-history', panel );\n });\n },\n\n /** loads a history & contents w/ details and makes them the current history */\n switchToHistory : function( historyId, attributes ){\n //this.info( 'switchToHistory:', historyId, attributes );\n var panel = this,\n historyFn = function(){\n // make this current and get history data with one call\n return jQuery.getJSON( Galaxy.root + 'history/set_as_current?id=' + historyId );\n // method : 'PUT'\n //});\n };\n return this.loadHistoryWithDetails( historyId, attributes, historyFn )\n .then( function( historyData, contentsData ){\n panel.trigger( 'switched-history', panel );\n });\n },\n\n /** creates a new history on the server and sets it as the user's current history */\n createNewHistory : function( attributes ){\n if( !Galaxy || !Galaxy.user || Galaxy.user.isAnonymous() ){\n this.displayMessage( 'error', _l( 'You must be logged in to create histories' ) );\n return $.when();\n }\n var panel = this,\n historyFn = function(){\n // create a new history and save: the server will return the proper JSON\n return jQuery.getJSON( Galaxy.root + 'history/create_new_current' );\n };\n\n // id undefined bc there is no historyId yet - the server will provide\n // (no need for details - nothing expanded in new history)\n return this.loadHistory( undefined, attributes, historyFn )\n .then(function( historyData, contentsData ){\n panel.trigger( 'new-history', panel );\n });\n },\n\n /** release/free/shutdown old models and set up panel for new models */\n setModel : function( model, attributes, render ){\n _super.prototype.setModel.call( this, model, attributes, render );\n if( this.model ){\n this.log( 'checking for updates' );\n this.model.checkForUpdates();\n }\n return this;\n },\n\n // ------------------------------------------------------------------------ history/content event listening\n /** listening for collection events */\n _setUpCollectionListeners : function(){\n _super.prototype._setUpCollectionListeners.call( this );\n\n //TODO:?? may not be needed? see history-view-edit, 369\n // if a hidden item is created (gen. by a workflow), moves thru the updater to the ready state,\n // then: remove it from the collection if the panel is set to NOT show hidden datasets\n this.collection.on( 'state:ready', function( model, newState, oldState ){\n if( ( !model.get( 'visible' ) )\n && ( !this.storage.get( 'show_hidden' ) ) ){\n this.removeItemView( model );\n }\n }, this );\n },\n\n /** listening for history events */\n _setUpModelListeners : function(){\n _super.prototype._setUpModelListeners.call( this );\n // ---- history\n // re-broadcast any model change events so that listeners don't have to re-bind to each history\n this.listenTo( this.model, 'change:nice_size change:size', function(){\n this.trigger( 'history-size-change', this, this.model, arguments );\n }, this );\n },\n\n // ------------------------------------------------------------------------ panel rendering\n /** override to add a handler to capture the scroll position when the parent scrolls */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n // we need to call this in _setUpBehaviors which is called after render since the $el\n // may not be attached to $el.parent and $scrollContainer() may not work\n var panel = this;\n _super.prototype._setUpBehaviors.call( panel, $where );\n\n // cache the handler to remove and re-add so we don't pile up the handlers\n if( !this._debouncedScrollCaptureHandler ){\n this._debouncedScrollCaptureHandler = _.debounce( function scrollCapture(){\n // cache the scroll position (only if visible)\n if( panel.$el.is( ':visible' ) ){\n panel.preferences.set( 'scrollPosition', $( this ).scrollTop() );\n }\n }, 40 );\n }\n\n panel.$scrollContainer()\n .off( 'scroll', this._debouncedScrollCaptureHandler )\n .on( 'scroll', this._debouncedScrollCaptureHandler );\n return panel;\n },\n\n /** In this override, handle null models and move the search input to the top */\n _buildNewRender : function(){\n if( !this.model ){ return $(); }\n var $newRender = _super.prototype._buildNewRender.call( this );\n //TODO: hacky\n $newRender.find( '.search' ).prependTo( $newRender.find( '.controls' ) );\n this._renderQuotaMessage( $newRender );\n return $newRender;\n },\n\n /** render the message displayed when a user is over quota and can't run jobs */\n _renderQuotaMessage : function( $whereTo ){\n $whereTo = $whereTo || this.$el;\n return $( this.templates.quotaMsg( {}, this ) ).prependTo( $whereTo.find( '.messages' ) );\n },\n\n /** In this override, add links to open data uploader or get data in the tools section */\n _renderEmptyMessage : function( $whereTo ){\n var panel = this,\n $emptyMsg = panel.$emptyMessage( $whereTo ),\n $toolMenu = $( '.toolMenuContainer' );\n\n if( ( _.isEmpty( panel.views ) && !panel.searchFor )\n && ( Galaxy && Galaxy.upload && $toolMenu.size() ) ){\n $emptyMsg.empty();\n\n $emptyMsg.html([\n _l( 'This history is empty' ), '. ', _l( 'You can ' ),\n '',\n _l( 'load your own data' ),\n '',\n _l( ' or ' ), '',\n _l( 'get data from an external source' ),\n ''\n ].join('') );\n $emptyMsg.find( '.uploader-link' ).click( function( ev ){\n Galaxy.upload.show( ev );\n });\n $emptyMsg.find( '.get-data-link' ).click( function( ev ){\n $toolMenu.parent().scrollTop( 0 );\n $toolMenu.find( 'span:contains(\"Get Data\")' )\n .click();\n //.fadeTo( 200, 0.1, function(){\n // this.debug( this )\n // $( this ).fadeTo( 200, 1.0 );\n //});\n });\n return $emptyMsg.show();\n }\n return _super.prototype._renderEmptyMessage.call( this, $whereTo );\n },\n\n /** In this override, get and set current panel preferences when editor is used */\n _renderTags : function( $where ){\n var panel = this;\n // render tags and show/hide based on preferences\n _super.prototype._renderTags.call( this, $where );\n if( this.preferences.get( 'tagsEditorShown' ) ){\n this.tagsEditor.toggle( true );\n }\n // store preference when shown or hidden\n this.tagsEditor.on( 'hiddenUntilActivated:shown hiddenUntilActivated:hidden',\n function( tagsEditor ){\n panel.preferences.set( 'tagsEditorShown', tagsEditor.hidden );\n });\n },\n\n /** In this override, get and set current panel preferences when editor is used */\n _renderAnnotation : function( $where ){\n var panel = this;\n // render annotation and show/hide based on preferences\n _super.prototype._renderAnnotation.call( this, $where );\n if( this.preferences.get( 'annotationEditorShown' ) ){\n this.annotationEditor.toggle( true );\n }\n // store preference when shown or hidden\n this.annotationEditor.on( 'hiddenUntilActivated:shown hiddenUntilActivated:hidden',\n function( annotationEditor ){\n panel.preferences.set( 'annotationEditorShown', annotationEditor.hidden );\n }\n );\n },\n\n /** Override to scroll to cached position (in prefs) after swapping */\n _swapNewRender : function( $newRender ){\n _super.prototype._swapNewRender.call( this, $newRender );\n var panel = this;\n _.delay( function(){\n var pos = panel.preferences.get( 'scrollPosition' );\n if( pos ){\n panel.scrollTo( pos, 0 );\n }\n }, 10 );\n //TODO: is this enough of a delay on larger histories?\n\n return this;\n },\n\n // ------------------------------------------------------------------------ sub-views\n /** Override to add the current-content highlight class to currentContentId's view */\n _attachItems : function( $whereTo ){\n _super.prototype._attachItems.call( this, $whereTo );\n var panel = this;\n if( panel.currentContentId ){\n panel._setCurrentContentById( panel.currentContentId );\n }\n return this;\n },\n\n /** Override to remove any drill down panels */\n addItemView : function( model, collection, options ){\n var view = _super.prototype.addItemView.call( this, model, collection, options );\n if( !view ){ return view; }\n if( this.panelStack.length ){ return this._collapseDrilldownPanel(); }\n return view;\n },\n\n // ------------------------------------------------------------------------ collection sub-views\n /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n _setUpItemViewListeners : function( view ){\n var panel = this;\n _super.prototype._setUpItemViewListeners.call( panel, view );\n\n // use pub-sub to: handle drilldown expansion and collapse\n view.on( 'expanded:drilldown', function( v, drilldown ){\n this._expandDrilldownPanel( drilldown );\n }, this );\n view.on( 'collapsed:drilldown', function( v, drilldown ){\n this._collapseDrilldownPanel( drilldown );\n }, this );\n\n // when content is manipulated, make it the current-content\n // view.on( 'visualize', function( v, ev ){\n // this.setCurrentContent( v );\n // }, this );\n\n return this;\n },\n\n /** display 'current content': add a visible highlight and store the id of a content item */\n setCurrentContent : function( view ){\n this.$( '.history-content.current-content' ).removeClass( 'current-content' );\n if( view ){\n view.$el.addClass( 'current-content' );\n this.currentContentId = view.model.id;\n } else {\n this.currentContentId = null;\n }\n },\n\n /** find the view with the id and then call setCurrentContent on it */\n _setCurrentContentById : function( id ){\n var view = this.viewFromModelId( id ) || null;\n this.setCurrentContent( view );\n },\n\n /** Handle drill down by hiding this panels list and controls and showing the sub-panel */\n _expandDrilldownPanel : function( drilldown ){\n this.panelStack.push( drilldown );\n // hide this panel's controls and list, set the name for back navigation, and attach to the $el\n this.$( '> .controls' ).add( this.$list() ).hide();\n drilldown.parentName = this.model.get( 'name' );\n this.$el.append( drilldown.render().$el );\n },\n\n /** Handle drilldown close by freeing the panel and re-rendering this panel */\n _collapseDrilldownPanel : function( drilldown ){\n this.panelStack.pop();\n//TODO: MEM: free the panel\n this.render();\n },\n\n // ........................................................................ external objects/MVC\n listenToGalaxy : function( galaxy ){\n // TODO: MEM: questionable reference island / closure practice\n galaxy.on( 'galaxy_main:load', function( data ){\n var pathToMatch = data.fullpath,\n useToURLRegexMap = {\n 'display' : /datasets\\/([a-f0-9]+)\\/display/,\n 'edit' : /datasets\\/([a-f0-9]+)\\/edit/,\n 'report_error' : /dataset\\/errors\\?id=([a-f0-9]+)/,\n 'rerun' : /tool_runner\\/rerun\\?id=([a-f0-9]+)/,\n 'show_params' : /datasets\\/([a-f0-9]+)\\/show_params/,\n // no great way to do this here? (leave it in the dataset event handlers above?)\n // 'visualization' : 'visualization',\n },\n hdaId = null,\n hdaUse = null;\n _.find( useToURLRegexMap, function( regex, use ){\n var match = pathToMatch.match( regex );\n if( match && match.length == 2 ){\n hdaId = match[1];\n hdaUse = use;\n return true;\n }\n return false;\n });\n // need to type mangle to go from web route to history contents\n hdaId = 'dataset-' + hdaId;\n this._setCurrentContentById( hdaId );\n }, this );\n },\n\n//TODO: remove quota meter from panel and remove this\n /** add listeners to an external quota meter (mvc/user/user-quotameter.js) */\n connectToQuotaMeter : function( quotaMeter ){\n if( !quotaMeter ){\n return this;\n }\n // show/hide the 'over quota message' in the history when the meter tells it to\n this.listenTo( quotaMeter, 'quota:over', this.showQuotaMessage );\n this.listenTo( quotaMeter, 'quota:under', this.hideQuotaMessage );\n\n // having to add this to handle re-render of hview while overquota (the above do not fire)\n this.on( 'rendered rendered:initial', function(){\n if( quotaMeter && quotaMeter.isOverQuota() ){\n this.showQuotaMessage();\n }\n });\n return this;\n },\n\n//TODO: this seems more like a per user message than a history message; IOW, this doesn't belong here\n /** Override to preserve the quota message */\n clearMessages : function( ev ){\n var $target = !_.isUndefined( ev )?\n $( ev.currentTarget )\n :this.$messages().children( '[class$=\"message\"]' );\n $target = $target.not( '.quota-message' );\n $target.fadeOut( this.fxSpeed, function(){\n $( this ).remove();\n });\n return this;\n },\n\n /** Show the over quota message (which happens to be in the history panel).\n */\n showQuotaMessage : function(){\n var $msg = this.$( '.quota-message' );\n if( $msg.is( ':hidden' ) ){ $msg.slideDown( this.fxSpeed ); }\n },\n\n//TODO: this seems more like a per user message than a history message\n /** Hide the over quota message (which happens to be in the history panel).\n */\n hideQuotaMessage : function(){\n var $msg = this.$( '.quota-message' );\n if( !$msg.is( ':hidden' ) ){ $msg.slideUp( this.fxSpeed ); }\n },\n\n /** Return a string rep of the history\n */\n toString : function(){\n return 'CurrentHistoryView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//------------------------------------------------------------------------------ TEMPLATES\nCurrentHistoryView.prototype.templates = (function(){\n\n var quotaMsgTemplate = BASE_MVC.wrapTemplate([\n '
                                    ',\n _l( 'You are over your disk quota' ), '. ',\n _l( 'Tool execution is on hold until your disk usage drops below your allocated quota' ), '.',\n '
                                    '\n ], 'history' );\n return _.extend( _.clone( _super.prototype.templates ), {\n quotaMsg : quotaMsgTemplate\n });\n\n}());\n\n\n//==============================================================================\n return {\n CurrentHistoryView : CurrentHistoryView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-view-edit-current.js\n ** module id = 130\n ** module chunks = 3\n **/","define([\n \"mvc/history/history-view\",\n \"mvc/history/history-contents\",\n \"mvc/dataset/states\",\n \"mvc/history/hda-model\",\n \"mvc/history/hda-li-edit\",\n \"mvc/history/hdca-li-edit\",\n \"mvc/tag\",\n \"mvc/annotation\",\n \"mvc/collection/list-collection-creator\",\n \"mvc/collection/pair-collection-creator\",\n \"mvc/collection/list-of-pairs-collection-creator\",\n \"ui/fa-icon-button\",\n \"mvc/ui/popup-menu\",\n \"utils/localization\",\n \"ui/editable-text\",\n], function(\n HISTORY_VIEW,\n HISTORY_CONTENTS,\n STATES,\n HDA_MODEL,\n HDA_LI_EDIT,\n HDCA_LI_EDIT,\n TAGS,\n ANNOTATIONS,\n LIST_COLLECTION_CREATOR,\n PAIR_COLLECTION_CREATOR,\n LIST_OF_PAIRS_COLLECTION_CREATOR,\n faIconButton,\n PopupMenu,\n _l\n){\n/* =============================================================================\nTODO:\n\n============================================================================= */\nvar _super = HISTORY_VIEW.HistoryView;\n// base class for history-view-edit-current and used as-is in history/view.mako\n/** @class Editable View/Controller for the history model.\n *\n * Allows:\n * (everything HistoryView allows)\n * changing the name\n * displaying and editing tags and annotations\n * multi-selection and operations on mulitple content items\n */\nvar HistoryViewEdit = _super.extend(\n/** @lends HistoryViewEdit.prototype */{\n\n /** logger used to record this.log messages, commonly set to console */\n //logger : console,\n\n /** class to use for constructing the HistoryDatasetAssociation views */\n HDAViewClass : HDA_LI_EDIT.HDAListItemEdit,\n /** class to use for constructing the HistoryDatasetCollectionAssociation views */\n HDCAViewClass : HDCA_LI_EDIT.HDCAListItemEdit,\n\n // ......................................................................... SET UP\n /** Set up the view, set up storage, bind listeners to HistoryContents events\n * @param {Object} attributes\n */\n initialize : function( attributes ){\n attributes = attributes || {};\n _super.prototype.initialize.call( this, attributes );\n\n // ---- set up instance vars\n /** editor for tags - sub-view */\n this.tagsEditor = null;\n /** editor for annotations - sub-view */\n this.annotationEditor = null;\n\n /** allow user purge of dataset files? */\n this.purgeAllowed = attributes.purgeAllowed || false;\n\n // states/modes the panel can be in\n /** is the panel currently showing the dataset selection controls? */\n this.annotationEditorShown = attributes.annotationEditorShown || false;\n this.tagsEditorShown = attributes.tagsEditorShown || false;\n },\n\n /** Override to handle history as drag-drop target */\n _setUpListeners : function(){\n var panel = this;\n _super.prototype._setUpListeners.call( panel );\n\n panel.on( 'drop', function( ev, data ){\n panel.dataDropped( data );\n // remove the drop target\n panel.dropTargetOff();\n });\n panel.on( 'view:attached view:removed', function(){\n panel._renderCounts();\n }, panel );\n },\n\n // ------------------------------------------------------------------------ listeners\n /** listening for collection events */\n _setUpCollectionListeners : function(){\n _super.prototype._setUpCollectionListeners.call( this );\n\n this.collection.on( 'change:deleted', this._handleHdaDeletionChange, this );\n this.collection.on( 'change:visible', this._handleHdaVisibleChange, this );\n this.collection.on( 'change:purged', function( model ){\n // hafta get the new nice-size w/o the purged model\n this.model.fetch();\n }, this );\n return this;\n },\n\n /** listening for history and HDA events */\n _setUpModelListeners : function(){\n _super.prototype._setUpModelListeners.call( this );\n this.model.on( 'change:size', this.updateHistoryDiskSize, this );\n return this;\n },\n\n // ------------------------------------------------------------------------ panel rendering\n /** In this override, add tag and annotation editors and a btn to toggle the selectors */\n _buildNewRender : function(){\n // create a new render using a skeleton template, render title buttons, render body, and set up events, etc.\n var $newRender = _super.prototype._buildNewRender.call( this );\n if( !this.model ){ return $newRender; }\n\n if( Galaxy && Galaxy.user && Galaxy.user.id && Galaxy.user.id === this.model.get( 'user_id' ) ){\n this._renderTags( $newRender );\n this._renderAnnotation( $newRender );\n }\n return $newRender;\n },\n\n /** override to render counts when the items are rendered */\n renderItems : function( $whereTo ){\n var views = _super.prototype.renderItems.call( this, $whereTo );\n this._renderCounts( $whereTo );\n return views;\n },\n\n /** override to show counts, what's deleted/hidden, and links to toggle those */\n _renderCounts : function( $whereTo ){\n//TODO: too complicated\n function toggleLink( _class, text ){\n return [ '', text, '' ].join( '' );\n }\n $whereTo = $whereTo || this.$el;\n var deleted = this.collection.where({ deleted: true }),\n hidden = this.collection.where({ visible: false }),\n msgs = [];\n\n if( this.views.length ){\n msgs.push( [ this.views.length, _l( 'shown' ) ].join( ' ' ) );\n }\n if( deleted.length ){\n msgs.push( ( !this.showDeleted )?\n ([ deleted.length, toggleLink( 'toggle-deleted-link', _l( 'deleted' ) ) ].join( ' ' ))\n :( toggleLink( 'toggle-deleted-link', _l( 'hide deleted' ) ) )\n );\n }\n if( hidden.length ){\n msgs.push( ( !this.showHidden )?\n ([ hidden.length, toggleLink( 'toggle-hidden-link', _l( 'hidden' ) ) ].join( ' ' ))\n :( toggleLink( 'toggle-hidden-link', _l( 'hide hidden' ) ) )\n );\n }\n return $whereTo.find( '> .controls .subtitle' ).html( msgs.join( ', ' ) );\n },\n\n /** render the tags sub-view controller */\n _renderTags : function( $where ){\n var panel = this;\n this.tagsEditor = new TAGS.TagsEditor({\n model : this.model,\n el : $where.find( '.controls .tags-display' ),\n onshowFirstTime : function(){ this.render(); },\n // show hide sub-view tag editors when this is shown/hidden\n onshow : function(){\n panel.toggleHDATagEditors( true, panel.fxSpeed );\n },\n onhide : function(){\n panel.toggleHDATagEditors( false, panel.fxSpeed );\n },\n $activator : faIconButton({\n title : _l( 'Edit history tags' ),\n classes : 'history-tag-btn',\n faIcon : 'fa-tags'\n }).appendTo( $where.find( '.controls .actions' ) )\n });\n },\n /** render the annotation sub-view controller */\n _renderAnnotation : function( $where ){\n var panel = this;\n this.annotationEditor = new ANNOTATIONS.AnnotationEditor({\n model : this.model,\n el : $where.find( '.controls .annotation-display' ),\n onshowFirstTime : function(){ this.render(); },\n // show hide sub-view view annotation editors when this is shown/hidden\n onshow : function(){\n panel.toggleHDAAnnotationEditors( true, panel.fxSpeed );\n },\n onhide : function(){\n panel.toggleHDAAnnotationEditors( false, panel.fxSpeed );\n },\n $activator : faIconButton({\n title : _l( 'Edit history annotation' ),\n classes : 'history-annotate-btn',\n faIcon : 'fa-comment'\n }).appendTo( $where.find( '.controls .actions' ) )\n });\n },\n\n /** Set up HistoryViewEdit js/widget behaviours\n * In this override, make the name editable\n */\n _setUpBehaviors : function( $where ){\n $where = $where || this.$el;\n _super.prototype._setUpBehaviors.call( this, $where );\n if( !this.model ){ return; }\n\n // anon users shouldn't have access to any of the following\n if( ( !Galaxy.user || Galaxy.user.isAnonymous() )\n || ( Galaxy.user.id !== this.model.get( 'user_id' ) ) ){\n return;\n }\n\n var panel = this,\n nameSelector = '> .controls .name';\n $where.find( nameSelector )\n .attr( 'title', _l( 'Click to rename history' ) )\n .tooltip({ placement: 'bottom' })\n .make_text_editable({\n on_finish: function( newName ){\n var previousName = panel.model.get( 'name' );\n if( newName && newName !== previousName ){\n panel.$el.find( nameSelector ).text( newName );\n panel.model.save({ name: newName })\n .fail( function(){\n panel.$el.find( nameSelector ).text( panel.model.previous( 'name' ) );\n });\n } else {\n panel.$el.find( nameSelector ).text( previousName );\n }\n }\n });\n },\n\n /** return a new popup menu for choosing a multi selection action\n * ajax calls made for multiple datasets are queued\n */\n multiselectActions : function(){\n var panel = this,\n actions = [\n { html: _l( 'Hide datasets' ), func: function(){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype.hide;\n panel.getSelectedModels().ajaxQueue( action );\n }\n },\n { html: _l( 'Unhide datasets' ), func: function(){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype.unhide;\n panel.getSelectedModels().ajaxQueue( action );\n }\n },\n { html: _l( 'Delete datasets' ), func: function(){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype['delete'];\n panel.getSelectedModels().ajaxQueue( action );\n }\n },\n { html: _l( 'Undelete datasets' ), func: function(){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype.undelete;\n panel.getSelectedModels().ajaxQueue( action );\n }\n }\n ];\n if( panel.purgeAllowed ){\n actions.push({\n html: _l( 'Permanently delete datasets' ), func: function(){\n if( confirm( _l( 'This will permanently remove the data in your datasets. Are you sure?' ) ) ){\n var action = HDA_MODEL.HistoryDatasetAssociation.prototype.purge;\n panel.getSelectedModels().ajaxQueue( action );\n }\n }\n });\n }\n actions = actions.concat( panel._collectionActions() );\n return actions;\n },\n\n /** */\n _collectionActions : function(){\n var panel = this;\n return [\n { html: _l( 'Build Dataset List' ), func: function() {\n LIST_COLLECTION_CREATOR.createListCollection( panel.getSelectedModels() )\n .done( function(){ panel.model.refresh() });\n }\n },\n // TODO: Only show quick pair if two things selected.\n { html: _l( 'Build Dataset Pair' ), func: function() {\n PAIR_COLLECTION_CREATOR.createPairCollection( panel.getSelectedModels() )\n .done( function(){ panel.model.refresh() });\n }\n },\n { html: _l( 'Build List of Dataset Pairs' ), func: function() {\n LIST_OF_PAIRS_COLLECTION_CREATOR.createListOfPairsCollection( panel.getSelectedModels() )\n .done( function(){ panel.model.refresh() });\n }\n },\n ];\n },\n\n // ------------------------------------------------------------------------ sub-views\n // reverse HID order\n /** Override to reverse order of views - newest contents on top */\n _attachItems : function( $whereTo ){\n this.$list( $whereTo ).append( this.views.reverse().map( function( view ){\n return view.$el;\n }));\n return this;\n },\n\n /** Override to add new contents at the top */\n _attachView : function( view ){\n var panel = this;\n // override to control where the view is added, how/whether it's rendered\n panel.views.unshift( view );\n panel.$list().prepend( view.render( 0 ).$el.hide() );\n panel.trigger( 'view:attached', view );\n view.$el.slideDown( panel.fxSpeed, function(){\n panel.trigger( 'view:attached:rendered' );\n });\n },\n\n /** In this override, add purgeAllowed and whether tags/annotation editors should be shown */\n _getItemViewOptions : function( model ){\n var options = _super.prototype._getItemViewOptions.call( this, model );\n _.extend( options, {\n purgeAllowed : this.purgeAllowed,\n//TODO: not working\n tagsEditorShown : ( this.tagsEditor && !this.tagsEditor.hidden ),\n annotationEditorShown : ( this.annotationEditor && !this.annotationEditor.hidden )\n });\n return options;\n },\n\n ///** Override to alter data in drag based on multiselection */\n //_setUpItemViewListeners : function( view ){\n // var panel = this;\n // _super.prototype._setUpItemViewListeners.call( panel, view );\n //\n //},\n\n /** If this item is deleted and we're not showing deleted items, remove the view\n * @param {Model} the item model to check\n */\n _handleHdaDeletionChange : function( itemModel ){\n if( itemModel.get( 'deleted' ) && !this.showDeleted ){\n this.removeItemView( itemModel );\n }\n this._renderCounts();\n },\n\n /** If this item is hidden and we're not showing hidden items, remove the view\n * @param {Model} the item model to check\n */\n _handleHdaVisibleChange : function( itemModel ){\n if( itemModel.hidden() && !this.showHidden ){\n this.removeItemView( itemModel );\n }\n this._renderCounts();\n },\n\n /** toggle the visibility of each content's tagsEditor applying all the args sent to this function */\n toggleHDATagEditors : function( showOrHide ){\n var args = Array.prototype.slice.call( arguments, 1 );\n _.each( this.views, function( view ){\n if( view.tagsEditor ){\n view.tagsEditor.toggle.apply( view.tagsEditor, args );\n }\n });\n },\n\n /** toggle the visibility of each content's annotationEditor applying all the args sent to this function */\n toggleHDAAnnotationEditors : function( showOrHide ){\n var args = Array.prototype.slice.call( arguments, 1 );\n _.each( this.views, function( view ){\n if( view.annotationEditor ){\n view.annotationEditor.toggle.apply( view.annotationEditor, args );\n }\n });\n },\n\n // ------------------------------------------------------------------------ panel events\n /** event map */\n events : _.extend( _.clone( _super.prototype.events ), {\n 'click .show-selectors-btn' : 'toggleSelectors',\n 'click .toggle-deleted-link' : function( ev ){ this.toggleShowDeleted(); },\n 'click .toggle-hidden-link' : function( ev ){ this.toggleShowHidden(); }\n }),\n\n /** Update the history size display (curr. upper right of panel).\n */\n updateHistoryDiskSize : function(){\n this.$el.find( '.history-size' ).text( this.model.get( 'nice_size' ) );\n },\n\n // ------------------------------------------------------------------------ as drop target\n /** */\n dropTargetOn : function(){\n if( this.dropTarget ){ return this; }\n this.dropTarget = true;\n\n //TODO: to init\n var dropHandlers = {\n 'dragenter' : _.bind( this.dragenter, this ),\n 'dragover' : _.bind( this.dragover, this ),\n 'dragleave' : _.bind( this.dragleave, this ),\n 'drop' : _.bind( this.drop, this )\n };\n//TODO: scroll to top\n var $dropTarget = this._renderDropTarget();\n this.$list().before([ this._renderDropTargetHelp(), $dropTarget ]);\n for( var evName in dropHandlers ){\n if( dropHandlers.hasOwnProperty( evName ) ){\n //console.debug( evName, dropHandlers[ evName ] );\n $dropTarget.on( evName, dropHandlers[ evName ] );\n }\n }\n return this;\n },\n\n /** */\n _renderDropTarget : function(){\n this.$( '.history-drop-target' ).remove();\n return $( '
                                    ' ).addClass( 'history-drop-target' )\n .css({\n 'height': '64px',\n 'margin': '0px 10px 10px 10px',\n 'border': '1px dashed black',\n 'border-radius' : '3px'\n });\n },\n\n /** */\n _renderDropTargetHelp : function(){\n this.$( '.history-drop-target-help' ).remove();\n return $( '
                                    ' ).addClass( 'history-drop-target-help' )\n .css({\n 'margin' : '10px 10px 4px 10px',\n 'color' : 'grey',\n 'font-size' : '80%',\n 'font-style' : 'italic'\n })\n .text( _l( 'Drag datasets here to copy them to the current history' ) );\n },\n\n /** */\n dropTargetOff : function(){\n if( !this.dropTarget ){ return this; }\n //this.log( 'dropTargetOff' );\n this.dropTarget = false;\n var dropTarget = this.$( '.history-drop-target' ).get(0);\n for( var evName in this._dropHandlers ){\n if( this._dropHandlers.hasOwnProperty( evName ) ){\n dropTarget.off( evName, this._dropHandlers[ evName ] );\n }\n }\n this.$( '.history-drop-target' ).remove();\n this.$( '.history-drop-target-help' ).remove();\n return this;\n },\n /** */\n dropTargetToggle : function(){\n if( this.dropTarget ){\n this.dropTargetOff();\n } else {\n this.dropTargetOn();\n }\n return this;\n },\n\n /** */\n dragenter : function( ev ){\n //console.debug( 'dragenter:', this, ev );\n ev.preventDefault();\n ev.stopPropagation();\n this.$( '.history-drop-target' ).css( 'border', '2px solid black' );\n },\n /** */\n dragover : function( ev ){\n ev.preventDefault();\n ev.stopPropagation();\n },\n /** */\n dragleave : function( ev ){\n //console.debug( 'dragleave:', this, ev );\n ev.preventDefault();\n ev.stopPropagation();\n this.$( '.history-drop-target' ).css( 'border', '1px dashed black' );\n },\n /** */\n drop : function( ev ){\n ev.preventDefault();\n //ev.stopPropagation();\n\n var dataTransfer = ev.originalEvent.dataTransfer;\n dataTransfer.dropEffect = 'move';\n\n var panel = this,\n data = dataTransfer.getData( \"text\" );\n try {\n data = JSON.parse( data );\n\n } catch( err ){\n this.warn( 'error parsing JSON from drop:', data );\n }\n this.trigger( 'droptarget:drop', ev, data, panel );\n return false;\n },\n\n /** */\n dataDropped : function( data ){\n var panel = this;\n // HDA: dropping will copy it to the history\n if( _.isObject( data ) && data.model_class === 'HistoryDatasetAssociation' && data.id ){\n return panel.model.contents.copy( data.id );\n }\n return jQuery.when();\n },\n\n // ........................................................................ misc\n /** Return a string rep of the history */\n toString : function(){\n return 'HistoryViewEdit(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n//==============================================================================\n return {\n HistoryViewEdit : HistoryViewEdit\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-view-edit.js\n ** module id = 131\n ** module chunks = 3\n **/","define([\n \"mvc/list/list-view\",\n \"mvc/history/history-model\",\n \"mvc/history/history-contents\",\n \"mvc/history/hda-li\",\n \"mvc/history/hdca-li\",\n \"mvc/user/user-model\",\n \"ui/fa-icon-button\",\n \"mvc/ui/popup-menu\",\n \"mvc/base-mvc\",\n \"utils/localization\",\n \"ui/search-input\"\n], function(\n LIST_VIEW,\n HISTORY_MODEL,\n HISTORY_CONTENTS,\n HDA_LI,\n HDCA_LI,\n USER,\n faIconButton,\n PopupMenu,\n BASE_MVC,\n _l\n){\n\nvar logNamespace = 'history';\n\n// ============================================================================\n/** session storage for individual history preferences */\nvar HistoryPrefs = BASE_MVC.SessionStorageModel.extend(\n/** @lends HistoryPrefs.prototype */{\n//TODO:?? possibly mark as current T/F - have History.currId() (a class method) return that value\n defaults : {\n//TODO:?? expandedIds to array?\n expandedIds : {},\n //TODO:?? move to user?\n show_deleted : false,\n show_hidden : false\n //TODO: add scroll position?\n },\n /** add an hda id to the hash of expanded hdas */\n addExpanded : function( model ){\n var key = 'expandedIds';\n//TODO:?? is this right anymore?\n this.save( key, _.extend( this.get( key ), _.object([ model.id ], [ model.get( 'id' ) ]) ) );\n },\n /** remove an hda id from the hash of expanded hdas */\n removeExpanded : function( model ){\n var key = 'expandedIds';\n this.save( key, _.omit( this.get( key ), model.id ) );\n },\n toString : function(){\n return 'HistoryPrefs(' + this.id + ')';\n }\n});\n// class lvl for access w/o instantiation\nHistoryPrefs.storageKeyPrefix = 'history:';\n\n/** key string to store each histories settings under */\nHistoryPrefs.historyStorageKey = function historyStorageKey( historyId ){\n if( !historyId ){\n throw new Error( 'HistoryPrefs.historyStorageKey needs valid id: ' + historyId );\n }\n // single point of change\n return ( HistoryPrefs.storageKeyPrefix + historyId );\n};\n/** return the existing storage for the history with the given id (or create one if it doesn't exist) */\nHistoryPrefs.get = function get( historyId ){\n return new HistoryPrefs({ id: HistoryPrefs.historyStorageKey( historyId ) });\n};\n/** clear all history related items in sessionStorage */\nHistoryPrefs.clearAll = function clearAll( historyId ){\n for( var key in sessionStorage ){\n if( key.indexOf( HistoryPrefs.storageKeyPrefix ) === 0 ){\n sessionStorage.removeItem( key );\n }\n }\n};\n\n\n/* =============================================================================\nTODO:\n\n============================================================================= */\n/** @class non-editable, read-only View/Controller for a history model.\n * Allows:\n * changing the loaded history\n * displaying data, info, and download\n * tracking history attrs: size, tags, annotations, name, etc.\n * Does not allow:\n * changing the name\n */\nvar _super = LIST_VIEW.ModelListPanel;\nvar HistoryView = _super.extend(\n/** @lends HistoryView.prototype */{\n _logNamespace : logNamespace,\n\n /** class to use for constructing the HDA views */\n HDAViewClass : HDA_LI.HDAListItemView,\n /** class to use for constructing the HDCA views */\n HDCAViewClass : HDCA_LI.HDCAListItemView,\n /** class to used for constructing collection of sub-view models */\n collectionClass : HISTORY_CONTENTS.HistoryContents,\n /** key of attribute in model to assign to this.collection */\n modelCollectionKey : 'contents',\n\n tagName : 'div',\n className : _super.prototype.className + ' history-panel',\n\n /** string to display when the collection is empty */\n emptyMsg : _l( 'This history is empty' ),\n /** displayed when no items match the search terms */\n noneFoundMsg : _l( 'No matching datasets found' ),\n /** string used for search placeholder */\n searchPlaceholder : _l( 'search datasets' ),\n\n // ......................................................................... SET UP\n /** Set up the view, bind listeners.\n * @param {Object} attributes optional settings for the panel\n */\n initialize : function( attributes ){\n _super.prototype.initialize.call( this, attributes );\n // ---- instance vars\n // control contents/behavior based on where (and in what context) the panel is being used\n /** where should pages from links be displayed? (default to new tab/window) */\n this.linkTarget = attributes.linkTarget || '_blank';\n },\n\n /** In this override, clear the update timer on the model */\n freeModel : function(){\n _super.prototype.freeModel.call( this );\n//TODO: move to History.free()\n if( this.model ){\n this.model.clearUpdateTimeout();\n }\n return this;\n },\n\n /** create any event listeners for the panel\n * @fires: rendered:initial on the first render\n * @fires: empty-history when switching to a history with no contents or creating a new history\n */\n _setUpListeners : function(){\n _super.prototype._setUpListeners.call( this );\n this.on({\n error : function( model, xhr, options, msg, details ){\n this.errorHandler( model, xhr, options, msg, details );\n },\n 'loading-done' : function(){\n //TODO:?? if( this.collection.length ){\n if( !this.views.length ){\n this.trigger( 'empty-history', this );\n }\n },\n 'views:ready view:attached view:removed' : function( view ){\n this._renderSelectButton();\n }\n });\n // this.on( 'all', function(){ console.debug( arguments ); });\n },\n\n // ------------------------------------------------------------------------ loading history/hda models\n //NOTE: all the following fns replace the existing history model with a new model\n // (in the following 'details' refers to the full set of contents api data (urls, display_apps, misc_info, etc.)\n // - contents w/o details will have summary data only (name, hid, deleted, visible, state, etc.))\n//TODO: too tangled...\n\n /** loads a history & contents, getting details of any contents whose ids are stored in sessionStorage\n * (but does not make them the current history)\n */\n loadHistoryWithDetails : function( historyId, attributes, historyFn, contentsFn ){\n this.info( 'loadHistoryWithDetails:', historyId, attributes, historyFn, contentsFn );\n var detailIdsFn = function( historyData ){\n // will be called to get content ids that need details from the api\n//TODO:! non-visible contents are getting details loaded... either stop loading them at all or filter ids thru isVisible\n return _.values( HistoryPrefs.get( historyData.id ).get( 'expandedIds' ) );\n };\n return this.loadHistory( historyId, attributes, historyFn, contentsFn, detailIdsFn );\n },\n\n /** loads a history & contents (but does not make them the current history) */\n loadHistory : function( historyId, attributes, historyFn, contentsFn, detailIdsFn ){\n this.info( 'loadHistory:', historyId, attributes, historyFn, contentsFn, detailIdsFn );\n var panel = this;\n attributes = attributes || {};\n\n panel.trigger( 'loading', panel );\n //this.info( 'loadHistory:', historyId, attributes, historyFn, contentsFn, detailIdsFn );\n var xhr = HISTORY_MODEL.History.getHistoryData( historyId, {\n historyFn : historyFn,\n contentsFn : contentsFn,\n detailIdsFn : attributes.initiallyExpanded || detailIdsFn\n });\n\n return panel._loadHistoryFromXHR( xhr, attributes )\n .fail( function( xhr, where, history ){\n // throw an error up for the error handler\n panel.trigger( 'error', panel, xhr, attributes, _l( 'An error was encountered while ' + where ),\n { historyId: historyId, history: history || {} });\n })\n .always( function(){\n // bc _hideLoadingIndicator relies on this firing\n panel.trigger( 'loading-done', panel );\n });\n },\n\n /** given an xhr that will provide both history and contents data, pass data to set model or handle xhr errors */\n _loadHistoryFromXHR : function( xhr, attributes ){\n var panel = this;\n xhr.then( function( historyJSON, contentsJSON ){\n panel.JSONToModel( historyJSON, contentsJSON, attributes );\n panel.render();\n });\n xhr.fail( function( xhr, where ){\n // render anyways - whether we get a model or not\n panel.render();\n });\n return xhr;\n },\n\n /** convenience alias to the model. Updates the item list only (not the history) */\n refreshContents : function( detailIds, options ){\n if( this.model ){\n return this.model.refresh( detailIds, options );\n }\n // may have callbacks - so return an empty promise\n return $.when();\n },\n\n//TODO:?? seems unneccesary\n//TODO: Maybe better in History?\n /** create a new history model from JSON and call setModel on it */\n JSONToModel : function( newHistoryJSON, newHdaJSON, attributes ){\n this.log( 'JSONToModel:', newHistoryJSON, newHdaJSON, attributes );\n attributes = attributes || {};\n //this.log( 'JSONToModel:', newHistoryJSON, newHdaJSON.length, attributes );\n\n var model = new HISTORY_MODEL.History( newHistoryJSON, newHdaJSON, attributes );\n//TODO:?? here?\n this.setModel( model );\n return model;\n },\n\n /** release/free/shutdown old models and set up panel for new models\n * @fires new-model with the panel as parameter\n */\n setModel : function( model, attributes ){\n attributes = attributes || {};\n _super.prototype.setModel.call( this, model, attributes );\n if( this.model ){\n this._setUpWebStorage( attributes.initiallyExpanded, attributes.show_deleted, attributes.show_hidden );\n }\n },\n\n // ------------------------------------------------------------------------ browser stored prefs\n /** Set up client side storage. Currently PersistanStorage keyed under 'history:'\n * @param {Object} initiallyExpanded\n * @param {Boolean} show_deleted whether to show deleted contents (overrides stored)\n * @param {Boolean} show_hidden\n * @see PersistentStorage\n */\n _setUpWebStorage : function( initiallyExpanded, show_deleted, show_hidden ){\n //if( !this.model ){ return this; }\n //this.log( '_setUpWebStorage', initiallyExpanded, show_deleted, show_hidden );\n if( this.storage ){\n this.stopListening( this.storage );\n }\n\n this.storage = new HistoryPrefs({\n id: HistoryPrefs.historyStorageKey( this.model.get( 'id' ) )\n });\n\n // expandedIds is a map of content.ids -> a boolean repr'ing whether that item's body is already expanded\n // store any pre-expanded ids passed in\n if( _.isObject( initiallyExpanded ) ){\n this.storage.set( 'expandedIds', initiallyExpanded );\n }\n\n // get the show_deleted/hidden settings giving priority to values passed in, using web storage otherwise\n // if the page has specifically requested show_deleted/hidden, these will be either true or false\n // (as opposed to undefined, null) - and we give priority to that setting\n if( _.isBoolean( show_deleted ) ){\n this.storage.set( 'show_deleted', show_deleted );\n }\n if( _.isBoolean( show_hidden ) ){\n this.storage.set( 'show_hidden', show_hidden );\n }\n\n this.trigger( 'new-storage', this.storage, this );\n this.log( this + ' (init\\'d) storage:', this.storage.get() );\n\n this.listenTo( this.storage, {\n 'change:show_deleted' : function( view, newVal ){\n this.showDeleted = newVal;\n },\n 'change:show_hidden' : function( view, newVal ){\n this.showHidden = newVal;\n }\n }, this );\n this.showDeleted = ( show_deleted !== undefined )? show_deleted : this.storage.get( 'show_deleted' );\n this.showHidden = ( show_hidden !== undefined )? show_hidden : this.storage.get( 'show_hidden' );\n\n return this;\n },\n\n // ------------------------------------------------------------------------ panel rendering\n /** In this override, add a btn to toggle the selectors */\n _buildNewRender : function(){\n var $newRender = _super.prototype._buildNewRender.call( this );\n this._renderSelectButton( $newRender );\n return $newRender;\n },\n\n /** button for starting select mode */\n _renderSelectButton : function( $where ){\n $where = $where || this.$el;\n // do not render selector option if no actions\n if( !this.multiselectActions().length ){\n return null;\n }\n // do not render (and remove even) if nothing to select\n if( !this.views.length ){\n this.hideSelectors();\n $where.find( '.controls .actions .show-selectors-btn' ).remove();\n return null;\n }\n // don't bother rendering if there's one already\n var $existing = $where.find( '.controls .actions .show-selectors-btn' );\n if( $existing.size() ){\n return $existing;\n }\n\n return faIconButton({\n title : _l( 'Operations on multiple datasets' ),\n classes : 'show-selectors-btn',\n faIcon : 'fa-check-square-o'\n }).prependTo( $where.find( '.controls .actions' ) );\n },\n\n // ------------------------------------------------------------------------ sub-views\n /** In this override, since history contents are mixed,\n * get the appropo view class based on history_content_type\n */\n _getItemViewClass : function( model ){\n var contentType = model.get( \"history_content_type\" );\n switch( contentType ){\n case 'dataset':\n return this.HDAViewClass;\n case 'dataset_collection':\n return this.HDCAViewClass;\n }\n throw new TypeError( 'Unknown history_content_type: ' + contentType );\n },\n\n /** in this override, check if the contents would also display based on show_deleted/hidden */\n _filterItem : function( model ){\n var panel = this;\n return ( _super.prototype._filterItem.call( panel, model )\n && ( !model.hidden() || panel.showHidden )\n && ( !model.isDeletedOrPurged() || panel.showDeleted ) );\n },\n\n /** in this override, add a linktarget, and expand if id is in web storage */\n _getItemViewOptions : function( model ){\n var options = _super.prototype._getItemViewOptions.call( this, model );\n return _.extend( options, {\n linkTarget : this.linkTarget,\n expanded : !!this.storage.get( 'expandedIds' )[ model.id ],\n hasUser : this.model.ownedByCurrUser()\n });\n },\n\n /** In this override, add/remove expanded/collapsed model ids to/from web storage */\n _setUpItemViewListeners : function( view ){\n var panel = this;\n _super.prototype._setUpItemViewListeners.call( panel, view );\n\n //TODO:?? could use 'view:expanded' here?\n // maintain a list of items whose bodies are expanded\n view.on( 'expanded', function( v ){\n panel.storage.addExpanded( v.model );\n });\n view.on( 'collapsed', function( v ){\n panel.storage.removeExpanded( v.model );\n });\n return this;\n },\n\n // ------------------------------------------------------------------------ selection\n /** Override to correctly set the historyId of the new collection */\n getSelectedModels : function(){\n var collection = _super.prototype.getSelectedModels.call( this );\n collection.historyId = this.collection.historyId;\n return collection;\n },\n\n // ------------------------------------------------------------------------ panel events\n /** event map */\n events : _.extend( _.clone( _super.prototype.events ), {\n // toggle list item selectors\n 'click .show-selectors-btn' : 'toggleSelectors',\n // allow (error) messages to be clicked away\n 'click .messages [class$=message]' : 'clearMessages'\n }),\n\n /** Handle the user toggling the deleted visibility by:\n * (1) storing the new value in the persistent storage\n * (2) re-rendering the history\n * @returns {Boolean} new show_deleted setting\n */\n toggleShowDeleted : function( show, store ){\n show = ( show !== undefined )?( show ):( !this.showDeleted );\n store = ( store !== undefined )?( store ):( true );\n this.showDeleted = show;\n if( store ){\n this.storage.set( 'show_deleted', show );\n }\n //TODO:?? to events on storage('change:show_deleted')\n this.renderItems();\n this.trigger( 'show-deleted', show );\n return this.showDeleted;\n },\n\n /** Handle the user toggling the hidden visibility by:\n * (1) storing the new value in the persistent storage\n * (2) re-rendering the history\n * @returns {Boolean} new show_hidden setting\n */\n toggleShowHidden : function( show, store ){\n show = ( show !== undefined )?( show ):( !this.showHidden );\n store = ( store !== undefined )?( store ):( true );\n this.showHidden = show;\n if( store ){\n this.storage.set( 'show_hidden', show );\n }\n //TODO:?? to events on storage('change:show_deleted')\n this.renderItems();\n this.trigger( 'show-hidden', show );\n return this.showHidden;\n },\n\n /** On the first search, if there are no details - load them, then search */\n _firstSearch : function( searchFor ){\n var panel = this,\n inputSelector = '.history-search-input';\n this.log( 'onFirstSearch', searchFor );\n\n if( panel.model.contents.haveDetails() ){\n panel.searchItems( searchFor );\n return;\n }\n\n panel.$el.find( inputSelector ).searchInput( 'toggle-loading' );\n panel.model.contents.fetchAllDetails({ silent: true })\n .always( function(){\n panel.$el.find( inputSelector ).searchInput( 'toggle-loading' );\n })\n .done( function(){\n panel.searchItems( panel.searchFor );\n });\n },\n\n//TODO: break this out\n // ........................................................................ error handling\n /** Event handler for errors (from the panel, the history, or the history's contents)\n * @param {Model or View} model the (Backbone) source of the error\n * @param {XMLHTTPRequest} xhr any ajax obj. assoc. with the error\n * @param {Object} options the options map commonly used with bbone ajax\n * @param {String} msg optional message passed to ease error location\n * @param {Object} msg optional object containing error details\n */\n errorHandler : function( model, xhr, options, msg, details ){\n this.error( model, xhr, options, msg, details );\n\n // interrupted ajax\n if( xhr && xhr.status === 0 && xhr.readyState === 0 ){\n //TODO: gmail style 'retrying in Ns'\n\n // bad gateway\n } else if( xhr && xhr.status === 502 ){\n //TODO: gmail style 'retrying in Ns'\n\n // otherwise, show an error message inside the panel\n } else {\n // if sentry is available, attempt to get the event id\n var parsed = this._parseErrorMessage( model, xhr, options, msg, details );\n // it's possible to have a triggered error before the message container is rendered - wait for it to show\n if( !this.$messages().is( ':visible' ) ){\n this.once( 'rendered', function(){\n this.displayMessage( 'error', parsed.message, parsed.details );\n });\n } else {\n this.displayMessage( 'error', parsed.message, parsed.details );\n }\n }\n },\n\n /** Parse an error event into an Object usable by displayMessage based on the parameters\n * note: see errorHandler for more info on params\n */\n _parseErrorMessage : function( model, xhr, options, msg, details, sentryId ){\n //if( xhr.responseText ){\n // xhr.responseText = _.escape( xhr.responseText );\n //}\n var user = Galaxy.user,\n // add the args (w/ some extra info) into an obj\n parsed = {\n message : this._bePolite( msg ),\n details : {\n message : msg,\n raven : ( window.Raven && _.isFunction( Raven.lastEventId) )?\n ( Raven.lastEventId() ):( undefined ),\n agent : navigator.userAgent,\n // add ajax data from Galaxy object cache\n url : ( window.Galaxy )?( Galaxy.lastAjax.url ):( undefined ),\n data : ( window.Galaxy )?( Galaxy.lastAjax.data ):( undefined ),\n options : ( xhr )?( _.omit( options, 'xhr' ) ):( options ),\n xhr : xhr,\n source : ( _.isFunction( model.toJSON ) )?( model.toJSON() ):( model + '' ),\n user : ( user instanceof USER.User )?( user.toJSON() ):( user + '' )\n }\n };\n\n // add any extra details passed in\n _.extend( parsed.details, details || {} );\n // fancy xhr.header parsing (--> obj)\n if( xhr && _.isFunction( xhr.getAllResponseHeaders ) ){\n var responseHeaders = xhr.getAllResponseHeaders();\n responseHeaders = _.compact( responseHeaders.split( '\\n' ) );\n responseHeaders = _.map( responseHeaders, function( header ){\n return header.split( ': ' );\n });\n parsed.details.xhr.responseHeaders = _.object( responseHeaders );\n }\n return parsed;\n },\n\n /** Modify an error message to be fancy and wear a monocle. */\n _bePolite : function( msg ){\n msg = msg || _l( 'An error occurred while getting updates from the server' );\n return msg + '. ' + _l( 'Please contact a Galaxy administrator if the problem persists' ) + '.';\n },\n\n // ........................................................................ (error) messages\n /** Display a message in the top of the panel.\n * @param {String} type type of message ('done', 'error', 'warning')\n * @param {String} msg the message to display\n * @param {Object or HTML} modal contents displayed when the user clicks 'details' in the message\n */\n displayMessage : function( type, msg, details ){\n //precondition: msgContainer must have been rendered even if there's no model\n var panel = this;\n //this.log( 'displayMessage', type, msg, details );\n\n this.scrollToTop();\n var $msgContainer = this.$messages(),\n $msg = $( '
                                    ' ).addClass( type + 'message' ).html( msg );\n //this.log( ' ', $msgContainer );\n\n if( !_.isEmpty( details ) ){\n var $detailsLink = $( 'Details' )\n .click( function(){\n Galaxy.modal.show( panel._messageToModalOptions( type, msg, details ) );\n return false;\n });\n $msg.append( ' ', $detailsLink );\n }\n return $msgContainer.append( $msg );\n },\n\n /** convert msg and details into modal options usable by Galaxy.modal */\n _messageToModalOptions : function( type, msg, details ){\n // only error is fleshed out here\n var panel = this,\n options = { title: 'Details' };\n if( _.isObject( details ) ){\n\n details = _.omit( details, _.functions( details ) );\n var text = JSON.stringify( details, null, ' ' ),\n pre = $( '
                                    ' ).text( text );\n            options.body = $( '
                                    ' ).append( pre );\n\n } else {\n options.body = $( '
                                    ' ).html( details );\n }\n\n options.buttons = {\n 'Ok': function(){\n Galaxy.modal.hide();\n panel.clearMessages();\n }\n //TODO: if( type === 'error' ){ options.buttons[ 'Report this error' ] = function(){} }\n };\n return options;\n },\n\n /** Remove all messages from the panel. */\n clearMessages : function( ev ){\n var $target = !_.isUndefined( ev )?\n $( ev.currentTarget )\n :this.$messages().children( '[class$=\"message\"]' );\n $target.fadeOut( this.fxSpeed, function(){\n $( this ).remove();\n });\n return this;\n },\n\n // ........................................................................ scrolling\n /** Scrolls the panel to show the content sub-view with the given hid.\n * @param {Integer} hid the hid of item to scroll into view\n * @returns {HistoryView} the panel\n */\n scrollToHid : function( hid ){\n return this.scrollToItem( _.first( this.viewsWhereModel({ hid: hid }) ) );\n },\n\n // ........................................................................ misc\n /** Return a string rep of the history */\n toString : function(){\n return 'HistoryView(' + (( this.model )?( this.model.get( 'name' )):( '' )) + ')';\n }\n});\n\n\n//------------------------------------------------------------------------------ TEMPLATES\nHistoryView.prototype.templates = (function(){\n\n var controlsTemplate = BASE_MVC.wrapTemplate([\n '
                                    ',\n '
                                    ',\n '
                                    <%- history.name %>
                                    ',\n '
                                    ',\n '
                                    ',\n '
                                    <%- history.nice_size %>
                                    ',\n\n '
                                    ',\n\n '
                                    ',\n '<% if( history.deleted && history.purged ){ %>',\n '
                                    ',\n _l( 'This history has been purged and deleted' ),\n '
                                    ',\n '<% } else if( history.deleted ){ %>',\n '
                                    ',\n _l( 'This history has been deleted' ),\n '
                                    ',\n '<% } else if( history.purged ){ %>',\n '
                                    ',\n _l( 'This history has been purged' ),\n '
                                    ',\n '<% } %>',\n\n '<% if( history.message ){ %>',\n // should already be localized\n '
                                    messagesmall\">',\n '<%= history.message.text %>',\n '
                                    ',\n '<% } %>',\n '
                                    ',\n\n // add tags and annotations\n '
                                    ',\n '
                                    ',\n\n '
                                    ',\n '
                                    ',\n '
                                    ',\n\n '
                                    ',\n '
                                    ',\n '',\n '',\n '
                                    ',\n '
                                    ',\n '
                                    ',\n '
                                    ',\n '
                                    '\n ], 'history' );\n\n return _.extend( _.clone( _super.prototype.templates ), {\n controls : controlsTemplate\n });\n}());\n\n\n//==============================================================================\n return {\n HistoryView: HistoryView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/history-view.js\n ** module id = 132\n ** module chunks = 3\n **/","define([\n \"mvc/ui/popup-menu\",\n \"mvc/history/copy-dialog\",\n \"mvc/base-mvc\",\n \"utils/localization\"\n], function( PopupMenu, historyCopyDialog, BASE_MVC, _l ){\n\n\"use strict\";\n// ============================================================================\nvar menu = [\n {\n html : _l( 'History Lists' ),\n header : true\n },\n {\n html : _l( 'Saved Histories' ),\n href : 'history/list',\n },\n {\n html : _l( 'Histories Shared with Me' ),\n href : 'history/list_shared'\n },\n\n {\n html : _l( 'History Actions' ),\n header : true,\n anon : true\n },\n {\n html : _l( 'Create New' ),\n func : function() {\n if( Galaxy && Galaxy.currHistoryPanel ){\n Galaxy.currHistoryPanel.createNewHistory();\n }\n },\n },\n {\n html : _l( 'Copy History' ),\n func : function() {\n historyCopyDialog( Galaxy.currHistoryPanel.model )\n .done( function(){\n Galaxy.currHistoryPanel.loadCurrentHistory();\n });\n },\n },\n {\n html : _l( 'Share or Publish' ),\n href : 'history/sharing',\n },\n {\n html : _l( 'Show Structure' ),\n href : 'history/display_structured',\n anon : true,\n },\n {\n html : _l( 'Extract Workflow' ),\n href : 'workflow/build_from_current_history',\n },\n {\n html : _l( 'Delete' ),\n confirm : _l( 'Really delete the current history?' ),\n href : 'history/delete_current',\n },\n {\n html : _l( 'Delete Permanently' ),\n confirm : _l( 'Really delete the current history permanently? This cannot be undone.' ),\n href : 'history/delete_current?purge=True',\n purge : true,\n anon : true,\n },\n\n\n {\n html : _l( 'Dataset Actions' ),\n header : true,\n anon : true\n },\n {\n html : _l( 'Copy Datasets' ),\n href : 'dataset/copy_datasets',\n },\n {\n html : _l( 'Dataset Security' ),\n href : 'root/history_set_default_permissions',\n },\n {\n html : _l( 'Resume Paused Jobs' ),\n href : 'history/resume_paused_jobs?current=True',\n anon : true,\n },\n {\n html : _l( 'Collapse Expanded Datasets' ),\n func : function() {\n if( Galaxy && Galaxy.currHistoryPanel ){\n Galaxy.currHistoryPanel.collapseAll();\n }\n },\n },\n {\n html : _l( 'Unhide Hidden Datasets' ),\n anon : true,\n func : function() {\n if( Galaxy && Galaxy.currHistoryPanel && confirm( _l( 'Really unhide all hidden datasets?' ) ) ){\n var filtered = Galaxy.currHistoryPanel.model.contents.hidden();\n //TODO: batch\n filtered.ajaxQueue( Backbone.Model.prototype.save, { visible : true })\n .done( function(){\n Galaxy.currHistoryPanel.renderItems();\n })\n .fail( function(){\n alert( 'There was an error unhiding the datasets' );\n console.error( arguments );\n });\n }\n },\n },\n {\n html : _l( 'Delete Hidden Datasets' ),\n anon : true,\n func : function() {\n if( Galaxy && Galaxy.currHistoryPanel && confirm( _l( 'Really delete all hidden datasets?' ) ) ){\n var filtered = Galaxy.currHistoryPanel.model.contents.hidden();\n //TODO: batch\n // both delete *and* unhide them\n filtered.ajaxQueue( Backbone.Model.prototype.save, { deleted : true, visible: true })\n .done( function(){\n Galaxy.currHistoryPanel.renderItems();\n })\n .fail( function(){\n alert( 'There was an error deleting the datasets' );\n console.error( arguments );\n });\n }\n },\n },\n {\n html : _l( 'Purge Deleted Datasets' ),\n confirm : _l( 'Really delete all deleted datasets permanently? This cannot be undone.' ),\n href : 'history/purge_deleted_datasets',\n purge : true,\n anon : true,\n },\n\n\n {\n html : _l( 'Downloads' ),\n header : true\n },\n {\n html : _l( 'Export Tool Citations' ),\n href : 'history/citations',\n anon : true,\n },\n {\n html : _l( 'Export History to File' ),\n href : 'history/export_archive?preview=True',\n anon : true,\n },\n\n {\n html : _l( 'Other Actions' ),\n header : true\n },\n {\n html : _l( 'Import from File' ),\n href : 'history/import_archive',\n }\n];\n\nfunction buildMenu( isAnon, purgeAllowed, urlRoot ){\n return _.clone( menu ).filter( function( menuOption ){\n if( isAnon && !menuOption.anon ){\n return false;\n }\n if( !purgeAllowed && menuOption.purge ){\n return false;\n }\n\n //TODO:?? hard-coded galaxy_main\n if( menuOption.href ){\n menuOption.href = urlRoot + menuOption.href;\n menuOption.target = 'galaxy_main';\n }\n\n if( menuOption.confirm ){\n menuOption.func = function(){\n if( confirm( menuOption.confirm ) ){\n galaxy_main.location = menuOption.href;\n }\n };\n }\n return true;\n });\n}\n\nvar create = function( $button, options ){\n options = options || {};\n var isAnon = options.anonymous === undefined? true : options.anonymous,\n purgeAllowed = options.purgeAllowed || false,\n menu = buildMenu( isAnon, purgeAllowed, Galaxy.root );\n //console.debug( 'menu:', menu );\n return new PopupMenu( $button, menu );\n};\n\n\n// ============================================================================\n return create;\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/mvc/history/options-menu.js\n ** module id = 133\n ** module chunks = 3\n **/","// dependencies\ndefine(['utils/utils',\n 'mvc/upload/upload-settings',\n 'mvc/upload/upload-ftp',\n 'mvc/ui/ui-popover',\n 'mvc/ui/ui-misc',\n 'mvc/ui/ui-select',\n 'utils/uploadbox'],\n\n function( Utils,\n UploadSettings,\n UploadFtp,\n Popover,\n Ui,\n Select\n ) {\n\n// renders the composite upload row view\nreturn Backbone.View.extend({\n // states\n status_classes : {\n init : 'upload-mode fa fa-exclamation text-primary',\n ready : 'upload-mode fa fa-check text-success',\n running : 'upload-mode fa fa-spinner fa-spin',\n success : 'upload-mode fa fa-check',\n error : 'upload-mode fa fa-exclamation-triangle'\n },\n\n // initialize\n initialize: function(app, options) {\n // link app\n this.app = app;\n\n // link this\n var self = this;\n\n // create model\n this.model = options.model;\n\n // add upload row\n this.setElement(this._template(options.model));\n\n // build upload functions\n this.uploadinput = this.$el.uploadinput({\n ondragover: function() {\n if (self.model.get('enabled')) {\n self.$el.addClass('warning');\n }\n },\n ondragleave: function() {\n self.$el.removeClass('warning');\n },\n onchange: function(files) {\n if (self.model.get('status') != 'running' && files && files.length > 0) {\n self.model.reset({\n 'file_data': files[0],\n 'file_name': files[0].name,\n 'file_size': files[0].size,\n 'file_mode': files[0].mode || 'local'\n });\n self._refreshReady();\n }\n }\n });\n\n // source selection popup\n this.button_menu = new Ui.ButtonMenu({\n icon : 'fa-caret-down',\n title : 'Select',\n pull : 'left'\n });\n this.$('#source').append(this.button_menu.$el);\n this.button_menu.addMenu({\n icon : 'fa-laptop',\n title : 'Choose local file',\n onclick : function() {\n self.uploadinput.dialog();\n }\n });\n if (this.app.ftp_upload_site) {\n this.button_menu.addMenu({\n icon : 'fa-folder-open-o',\n title : 'Choose FTP file',\n onclick : function() {\n self._showFtp();\n }\n });\n }\n this.button_menu.addMenu({\n icon : 'fa-edit',\n title : 'Paste/Fetch data',\n onclick : function() {\n self.model.reset({\n 'file_mode': 'new',\n 'file_name': 'New File'\n });\n }\n });\n\n // add ftp file viewer\n this.ftp = new Popover.View({\n title : 'Choose FTP file:',\n container : this.$('#source').find('.ui-button-menu'),\n placement : 'right'\n });\n\n // append popup to settings icon\n this.settings = new Popover.View({\n title : 'Upload configuration',\n container : this.$('#settings'),\n placement : 'bottom'\n });\n\n //\n // ui events\n //\n\n // handle text editing event\n this.$('#text-content').on('change input', function(e) {\n self.model.set('url_paste', $(e.target).val());\n self.model.set('file_size', $(e.target).val().length);\n self._refreshReady();\n });\n\n // handle settings popover\n this.$('#settings').on('click' , function(e) { self._showSettings(); })\n .on('mousedown', function(e) { e.preventDefault(); });\n\n //\n // model events\n //\n this.model.on('change:percentage', function() {\n self._refreshPercentage();\n });\n this.model.on('change:status', function() {\n self._refreshStatus();\n });\n this.model.on('change:info', function() {\n self._refreshInfo();\n });\n this.model.on('change:file_name', function() {\n self._refreshFileName();\n });\n this.model.on('change:file_mode', function() {\n self._refreshMode();\n });\n this.model.on('change:file_size', function() {\n self._refreshFileSize();\n });\n this.model.on('remove', function() {\n self.remove();\n });\n this.app.collection.on('reset', function() {\n self.remove();\n });\n },\n\n // render\n render: function() {\n this.$('#file_name').html(this.model.get('file_name') || '-');\n this.$('#file_desc').html(this.model.get('file_desc') || 'Unavailable');\n this.$('#file_size').html(Utils.bytesToString (this.model.get('file_size')));\n this.$('#status').removeClass().addClass(this.status_classes.init);\n },\n\n // remove\n remove: function() {\n // call the base class remove method\n Backbone.View.prototype.remove.apply(this);\n },\n\n //\n // handle model events\n //\n\n // refresh ready or not states\n _refreshReady: function() {\n this.app.collection.each(function(model) {\n model.set('status', (model.get('file_size') > 0) && 'ready' || 'init');\n });\n },\n\n // refresh mode and e.g. show/hide textarea field\n _refreshMode: function() {\n var file_mode = this.model.get('file_mode');\n if (file_mode == 'new') {\n this.height = this.$el.height();\n this.$('#text').css({\n 'width' : this.$el.width() - 16 + 'px',\n 'top' : this.$el.height() - 8 + 'px'\n }).show();\n this.$el.height(this.$el.height() - 8 + this.$('#text').height() + 16);\n this.$('#text-content').val('').trigger('keyup');\n } else {\n this.$el.height(this.height);\n this.$('#text').hide();\n }\n },\n\n // information\n _refreshInfo: function() {\n var info = this.model.get('info');\n if (info) {\n this.$('#info-text').html('Failed: ' + info).show();\n } else {\n this.$('#info-text').hide();\n }\n },\n\n // percentage\n _refreshPercentage : function() {\n var percentage = parseInt(this.model.get('percentage'));\n if (percentage != 0) {\n this.$('.progress-bar').css({ width : percentage + '%' });\n } else {\n this.$('.progress-bar').addClass('no-transition');\n this.$('.progress-bar').css({ width : '0%' });\n this.$('.progress-bar')[0].offsetHeight;\n this.$('.progress-bar').removeClass('no-transition');\n }\n if (percentage != 100) {\n this.$('#percentage').html(percentage + '%');\n } else {\n this.$('#percentage').html('Adding to history...');\n }\n },\n\n // status\n _refreshStatus : function() {\n // identify new status\n var status = this.model.get('status');\n\n // identify symbol and reset classes\n this.$('#status').removeClass().addClass(this.status_classes[status]);\n\n // enable/disable model flag\n this.model.set('enabled', status != 'running');\n\n // enable/disable row fields\n this.$('#text-content').attr('disabled', !this.model.get('enabled'));\n\n // remove status classes\n this.$el.removeClass('success danger warning');\n\n // set status classes\n if (status == 'running' || status == 'ready') {\n this.model.set('percentage', 0);\n }\n if (status == 'running') {\n this.$('#source').find('.button').addClass('disabled');\n } else {\n this.$('#source').find('.button').removeClass('disabled');\n }\n if (status == 'success') {\n this.$el.addClass('success');\n this.model.set('percentage', 100);\n this.$('#percentage').html('100%');\n }\n if (status == 'error') {\n this.$el.addClass('danger');\n this.model.set('percentage', 0);\n this.$('#info-progress').hide();\n this.$('#info-text').show();\n } else {\n this.$('#info-progress').show();\n this.$('#info-text').hide();\n }\n },\n\n // file name\n _refreshFileName: function() {\n this.$('#file_name').html(this.model.get('file_name') || '-');\n },\n\n // file size\n _refreshFileSize: function() {\n this.$('#file_size').html(Utils.bytesToString (this.model.get('file_size')));\n },\n\n // show/hide ftp popup\n _showFtp: function() {\n if (!this.ftp.visible) {\n this.ftp.empty();\n var self = this;\n this.ftp.append((new UploadFtp({\n ftp_upload_site: this.app.ftp_upload_site,\n onchange: function(ftp_file) {\n self.ftp.hide();\n if (self.model.get('status') != 'running' && ftp_file) {\n self.model.reset({\n 'file_mode': 'ftp',\n 'file_name': ftp_file.path,\n 'file_size': ftp_file.size,\n 'file_path': ftp_file.path\n });\n self._refreshReady();\n }\n }\n })).$el);\n this.ftp.show();\n } else {\n this.ftp.hide();\n }\n },\n\n // show/hide settings popup\n _showSettings : function() {\n if (!this.settings.visible) {\n this.settings.empty();\n this.settings.append((new UploadSettings(this)).$el);\n this.settings.show();\n } else {\n this.settings.hide();\n }\n },\n\n // template\n _template: function(options) {\n return '' +\n '' +\n '
                                    ' +\n '
                                    ' +\n '
                                    ' +\n '
                                    You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.
                                    ' +\n '\";\n\t\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\t\n\t\t// #11217 - WebKit loses check when the name is after the checked attribute\n\t\tfragment.appendChild( div );\n\t\tdiv.innerHTML = \"\";\n\t\n\t\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n\t\t// old WebKit doesn't clone checked state correctly in fragments\n\t\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\t\n\t\t// Support: IE<9\n\t\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\t\tsupport.noCloneEvent = true;\n\t\tif ( div.attachEvent ) {\n\t\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\t\tsupport.noCloneEvent = false;\n\t\t\t});\n\t\n\t\t\tdiv.cloneNode( true ).click();\n\t\t}\n\t\n\t\t// Execute the test only if not already executed in another module.\n\t\tif (support.deleteExpando == null) {\n\t\t\t// Support: IE<9\n\t\t\tsupport.deleteExpando = true;\n\t\t\ttry {\n\t\t\t\tdelete div.test;\n\t\t\t} catch( e ) {\n\t\t\t\tsupport.deleteExpando = false;\n\t\t\t}\n\t\t}\n\t})();\n\t\n\t\n\t(function() {\n\t\tvar i, eventName,\n\t\t\tdiv = document.createElement( \"div\" );\n\t\n\t\t// Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)\n\t\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\t\teventName = \"on\" + i;\n\t\n\t\t\tif ( !(support[ i + \"Bubbles\" ] = eventName in window) ) {\n\t\t\t\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\t\t\t\tdiv.setAttribute( eventName, \"t\" );\n\t\t\t\tsupport[ i + \"Bubbles\" ] = div.attributes[ eventName ].expando === false;\n\t\t\t}\n\t\t}\n\t\n\t\t// Null elements to avoid leaks in IE.\n\t\tdiv = null;\n\t})();\n\t\n\t\n\tvar rformElems = /^(?:input|select|textarea)$/i,\n\t\trkeyEvent = /^key/,\n\t\trmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,\n\t\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\t\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\t\n\tfunction returnTrue() {\n\t\treturn true;\n\t}\n\t\n\tfunction returnFalse() {\n\t\treturn false;\n\t}\n\t\n\tfunction safeActiveElement() {\n\t\ttry {\n\t\t\treturn document.activeElement;\n\t\t} catch ( err ) { }\n\t}\n\t\n\t/*\n\t * Helper functions for managing events -- not part of the public interface.\n\t * Props to Dean Edwards' addEvent library for many of the ideas.\n\t */\n\tjQuery.event = {\n\t\n\t\tglobal: {},\n\t\n\t\tadd: function( elem, types, handler, data, selector ) {\n\t\t\tvar tmp, events, t, handleObjIn,\n\t\t\t\tspecial, eventHandle, handleObj,\n\t\t\t\thandlers, type, namespaces, origType,\n\t\t\t\telemData = jQuery._data( elem );\n\t\n\t\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\t\tif ( !elemData ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\t\tif ( handler.handler ) {\n\t\t\t\thandleObjIn = handler;\n\t\t\t\thandler = handleObjIn.handler;\n\t\t\t\tselector = handleObjIn.selector;\n\t\t\t}\n\t\n\t\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\t\tif ( !handler.guid ) {\n\t\t\t\thandler.guid = jQuery.guid++;\n\t\t\t}\n\t\n\t\t\t// Init the element's event structure and main handler, if this is the first\n\t\t\tif ( !(events = elemData.events) ) {\n\t\t\t\tevents = elemData.events = {};\n\t\t\t}\n\t\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\t\treturn typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\t\tundefined;\n\t\t\t\t};\n\t\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\t\teventHandle.elem = elem;\n\t\t\t}\n\t\n\t\t\t// Handle multiple events separated by a space\n\t\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\t\tt = types.length;\n\t\t\twhile ( t-- ) {\n\t\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\t\ttype = origType = tmp[1];\n\t\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\t\n\t\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\t\tif ( !type ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\n\t\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\n\t\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\n\t\t\t\t// Update special based on newly reset type\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\n\t\t\t\t// handleObj is passed to all event handlers\n\t\t\t\thandleObj = jQuery.extend({\n\t\t\t\t\ttype: type,\n\t\t\t\t\torigType: origType,\n\t\t\t\t\tdata: data,\n\t\t\t\t\thandler: handler,\n\t\t\t\t\tguid: handler.guid,\n\t\t\t\t\tselector: selector,\n\t\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t\t}, handleObjIn );\n\t\n\t\t\t\t// Init the event handler queue if we're the first\n\t\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\t\thandlers.delegateCount = 0;\n\t\n\t\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\t\n\t\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\tif ( special.add ) {\n\t\t\t\t\tspecial.add.call( elem, handleObj );\n\t\n\t\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Add to the element's handler list, delegates in front\n\t\t\t\tif ( selector ) {\n\t\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t\t} else {\n\t\t\t\t\thandlers.push( handleObj );\n\t\t\t\t}\n\t\n\t\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\t\tjQuery.event.global[ type ] = true;\n\t\t\t}\n\t\n\t\t\t// Nullify elem to prevent memory leaks in IE\n\t\t\telem = null;\n\t\t},\n\t\n\t\t// Detach an event or set of events from an element\n\t\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\t\tvar j, handleObj, tmp,\n\t\t\t\torigCount, t, events,\n\t\t\t\tspecial, handlers, type,\n\t\t\t\tnamespaces, origType,\n\t\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\t\n\t\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Once for each type.namespace in types; type may be omitted\n\t\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\n\t\t\tt = types.length;\n\t\t\twhile ( t-- ) {\n\t\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\t\ttype = origType = tmp[1];\n\t\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\t\n\t\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\t\tif ( !type ) {\n\t\t\t\t\tfor ( type in events ) {\n\t\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\t\thandlers = events[ type ] || [];\n\t\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\t\n\t\t\t\t// Remove matching events\n\t\t\t\torigCount = j = handlers.length;\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\thandleObj = handlers[ j ];\n\t\n\t\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\t\thandlers.splice( j, 1 );\n\t\n\t\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tdelete events[ type ];\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Remove the expando if it's no longer used\n\t\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\t\tdelete elemData.handle;\n\t\n\t\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t\t// so use it instead of delete\n\t\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t\t}\n\t\t},\n\t\n\t\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t\tvar handle, ontype, cur,\n\t\t\t\tbubbleType, special, tmp, i,\n\t\t\t\teventPath = [ elem || document ],\n\t\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\t\n\t\t\tcur = tmp = elem = elem || document;\n\t\n\t\t\t// Don't do events on text and comment nodes\n\t\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\t\tnamespaces = type.split(\".\");\n\t\t\t\ttype = namespaces.shift();\n\t\t\t\tnamespaces.sort();\n\t\t\t}\n\t\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\t\n\t\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\t\tevent = event[ jQuery.expando ] ?\n\t\t\t\tevent :\n\t\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\t\n\t\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\t\tevent.namespace = namespaces.join(\".\");\n\t\t\tevent.namespace_re = event.namespace ?\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\t\tnull;\n\t\n\t\t\t// Clean up the event in case it is being reused\n\t\t\tevent.result = undefined;\n\t\t\tif ( !event.target ) {\n\t\t\t\tevent.target = elem;\n\t\t\t}\n\t\n\t\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\t\tdata = data == null ?\n\t\t\t\t[ event ] :\n\t\t\t\tjQuery.makeArray( data, [ event ] );\n\t\n\t\t\t// Allow special events to draw outside the lines\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\t\n\t\t\t\tbubbleType = special.delegateType || type;\n\t\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t}\n\t\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\t\teventPath.push( cur );\n\t\t\t\t\ttmp = cur;\n\t\t\t\t}\n\t\n\t\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Fire handlers on the event path\n\t\t\ti = 0;\n\t\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\t\n\t\t\t\tevent.type = i > 1 ?\n\t\t\t\t\tbubbleType :\n\t\t\t\t\tspecial.bindType || type;\n\t\n\t\t\t\t// jQuery handler\n\t\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\t\tif ( handle ) {\n\t\t\t\t\thandle.apply( cur, data );\n\t\t\t\t}\n\t\n\t\t\t\t// Native handler\n\t\t\t\thandle = ontype && cur[ ontype ];\n\t\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\n\t\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tevent.type = type;\n\t\n\t\t\t// If nobody prevented the default action, do it now\n\t\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\t\n\t\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\t\tjQuery.acceptData( elem ) ) {\n\t\n\t\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\t\n\t\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\t\ttmp = elem[ ontype ];\n\t\n\t\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t\t}\n\t\t\t\t\t\tjQuery.event.triggered = undefined;\n\t\n\t\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn event.result;\n\t\t},\n\t\n\t\tdispatch: function( event ) {\n\t\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( event );\n\t\n\t\t\tvar i, ret, handleObj, matched, j,\n\t\t\t\thandlerQueue = [],\n\t\t\t\targs = slice.call( arguments ),\n\t\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\t\n\t\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\t\targs[0] = event;\n\t\t\tevent.delegateTarget = this;\n\t\n\t\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// Determine handlers\n\t\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\t\n\t\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\t\ti = 0;\n\t\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\t\tevent.currentTarget = matched.elem;\n\t\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\t\n\t\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\t\n\t\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\t\tevent.data = handleObj.data;\n\t\n\t\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t\t.apply( matched.elem, args );\n\t\n\t\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\tevent.stopPropagation();\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\t\t\t}\n\t\n\t\t\t// Call the postDispatch hook for the mapped type\n\t\t\tif ( special.postDispatch ) {\n\t\t\t\tspecial.postDispatch.call( this, event );\n\t\t\t}\n\t\n\t\t\treturn event.result;\n\t\t},\n\t\n\t\thandlers: function( event, handlers ) {\n\t\t\tvar sel, handleObj, matches, i,\n\t\t\t\thandlerQueue = [],\n\t\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\t\tcur = event.target;\n\t\n\t\t\t// Find delegate handlers\n\t\t\t// Black-hole SVG instance trees (#13180)\n\t\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\t\n\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t\t/* jshint eqeqeq: true */\n\t\n\t\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\t\tmatches = [];\n\t\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\t\thandleObj = handlers[ i ];\n\t\n\t\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\t\n\t\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Add the remaining (directly-bound) handlers\n\t\t\tif ( delegateCount < handlers.length ) {\n\t\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t\t}\n\t\n\t\t\treturn handlerQueue;\n\t\t},\n\t\n\t\tfix: function( event ) {\n\t\t\tif ( event[ jQuery.expando ] ) {\n\t\t\t\treturn event;\n\t\t\t}\n\t\n\t\t\t// Create a writable copy of the event object and normalize some properties\n\t\t\tvar i, prop, copy,\n\t\t\t\ttype = event.type,\n\t\t\t\toriginalEvent = event,\n\t\t\t\tfixHook = this.fixHooks[ type ];\n\t\n\t\t\tif ( !fixHook ) {\n\t\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t\t{};\n\t\t\t}\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\t\n\t\t\tevent = new jQuery.Event( originalEvent );\n\t\n\t\t\ti = copy.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tprop = copy[ i ];\n\t\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t\t}\n\t\n\t\t\t// Support: IE<9\n\t\t\t// Fix target property (#1925)\n\t\t\tif ( !event.target ) {\n\t\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t\t}\n\t\n\t\t\t// Support: Chrome 23+, Safari?\n\t\t\t// Target should not be a text node (#504, #13143)\n\t\t\tif ( event.target.nodeType === 3 ) {\n\t\t\t\tevent.target = event.target.parentNode;\n\t\t\t}\n\t\n\t\t\t// Support: IE<9\n\t\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\t\tevent.metaKey = !!event.metaKey;\n\t\n\t\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t\t},\n\t\n\t\t// Includes some event props shared by KeyEvent and MouseEvent\n\t\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\t\n\t\tfixHooks: {},\n\t\n\t\tkeyHooks: {\n\t\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\t\tfilter: function( event, original ) {\n\t\n\t\t\t\t// Add which for key events\n\t\t\t\tif ( event.which == null ) {\n\t\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t\t}\n\t\n\t\t\t\treturn event;\n\t\t\t}\n\t\t},\n\t\n\t\tmouseHooks: {\n\t\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\t\tfilter: function( event, original ) {\n\t\t\t\tvar body, eventDoc, doc,\n\t\t\t\t\tbutton = original.button,\n\t\t\t\t\tfromElement = original.fromElement;\n\t\n\t\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\t\tbody = eventDoc.body;\n\t\n\t\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );\n\t\t\t\t}\n\t\n\t\t\t\t// Add relatedTarget, if necessary\n\t\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t\t}\n\t\n\t\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t\t// Note: button is not normalized, so don't use it\n\t\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t\t}\n\t\n\t\t\t\treturn event;\n\t\t\t}\n\t\t},\n\t\n\t\tspecial: {\n\t\t\tload: {\n\t\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\t\tnoBubble: true\n\t\t\t},\n\t\t\tfocus: {\n\t\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\t\ttrigger: function() {\n\t\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdelegateType: \"focusin\"\n\t\t\t},\n\t\t\tblur: {\n\t\t\t\ttrigger: function() {\n\t\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\t\tthis.blur();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdelegateType: \"focusout\"\n\t\t\t},\n\t\t\tclick: {\n\t\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\t\ttrigger: function() {\n\t\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\t\tthis.click();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\n\t\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t\t_default: function( event ) {\n\t\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\tbeforeunload: {\n\t\t\t\tpostDispatch: function( event ) {\n\t\n\t\t\t\t\t// Support: Firefox 20+\n\t\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\n\t\tsimulate: function( type, elem, event, bubble ) {\n\t\t\t// Piggyback on a donor event to simulate a different one.\n\t\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t\t// simulated event prevents default then we do the same on the donor.\n\t\t\tvar e = jQuery.extend(\n\t\t\t\tnew jQuery.Event(),\n\t\t\t\tevent,\n\t\t\t\t{\n\t\t\t\t\ttype: type,\n\t\t\t\t\tisSimulated: true,\n\t\t\t\t\toriginalEvent: {}\n\t\t\t\t}\n\t\t\t);\n\t\t\tif ( bubble ) {\n\t\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t\t} else {\n\t\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t\t}\n\t\t\tif ( e.isDefaultPrevented() ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t};\n\t\n\tjQuery.removeEvent = document.removeEventListener ?\n\t\tfunction( elem, type, handle ) {\n\t\t\tif ( elem.removeEventListener ) {\n\t\t\t\telem.removeEventListener( type, handle, false );\n\t\t\t}\n\t\t} :\n\t\tfunction( elem, type, handle ) {\n\t\t\tvar name = \"on\" + type;\n\t\n\t\t\tif ( elem.detachEvent ) {\n\t\n\t\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\t\tif ( typeof elem[ name ] === strundefined ) {\n\t\t\t\t\telem[ name ] = null;\n\t\t\t\t}\n\t\n\t\t\t\telem.detachEvent( name, handle );\n\t\t\t}\n\t\t};\n\t\n\tjQuery.Event = function( src, props ) {\n\t\t// Allow instantiation without the 'new' keyword\n\t\tif ( !(this instanceof jQuery.Event) ) {\n\t\t\treturn new jQuery.Event( src, props );\n\t\t}\n\t\n\t\t// Event object\n\t\tif ( src && src.type ) {\n\t\t\tthis.originalEvent = src;\n\t\t\tthis.type = src.type;\n\t\n\t\t\t// Events bubbling up the document may have been marked as prevented\n\t\t\t// by a handler lower down the tree; reflect the correct value.\n\t\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\t\tsrc.defaultPrevented === undefined &&\n\t\t\t\t\t// Support: IE < 9, Android < 4.0\n\t\t\t\t\tsrc.returnValue === false ?\n\t\t\t\treturnTrue :\n\t\t\t\treturnFalse;\n\t\n\t\t// Event type\n\t\t} else {\n\t\t\tthis.type = src;\n\t\t}\n\t\n\t\t// Put explicitly provided properties onto the event object\n\t\tif ( props ) {\n\t\t\tjQuery.extend( this, props );\n\t\t}\n\t\n\t\t// Create a timestamp if incoming event doesn't have one\n\t\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\t\n\t\t// Mark it as fixed\n\t\tthis[ jQuery.expando ] = true;\n\t};\n\t\n\t// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n\t// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\n\tjQuery.Event.prototype = {\n\t\tisDefaultPrevented: returnFalse,\n\t\tisPropagationStopped: returnFalse,\n\t\tisImmediatePropagationStopped: returnFalse,\n\t\n\t\tpreventDefault: function() {\n\t\t\tvar e = this.originalEvent;\n\t\n\t\t\tthis.isDefaultPrevented = returnTrue;\n\t\t\tif ( !e ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\t// If preventDefault exists, run it on the original event\n\t\t\tif ( e.preventDefault ) {\n\t\t\t\te.preventDefault();\n\t\n\t\t\t// Support: IE\n\t\t\t// Otherwise set the returnValue property of the original event to false\n\t\t\t} else {\n\t\t\t\te.returnValue = false;\n\t\t\t}\n\t\t},\n\t\tstopPropagation: function() {\n\t\t\tvar e = this.originalEvent;\n\t\n\t\t\tthis.isPropagationStopped = returnTrue;\n\t\t\tif ( !e ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// If stopPropagation exists, run it on the original event\n\t\t\tif ( e.stopPropagation ) {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\n\t\t\t// Support: IE\n\t\t\t// Set the cancelBubble property of the original event to true\n\t\t\te.cancelBubble = true;\n\t\t},\n\t\tstopImmediatePropagation: function() {\n\t\t\tvar e = this.originalEvent;\n\t\n\t\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\n\t\t\tif ( e && e.stopImmediatePropagation ) {\n\t\t\t\te.stopImmediatePropagation();\n\t\t\t}\n\t\n\t\t\tthis.stopPropagation();\n\t\t}\n\t};\n\t\n\t// Create mouseenter/leave events using mouseover/out and event-time checks\n\tjQuery.each({\n\t\tmouseenter: \"mouseover\",\n\t\tmouseleave: \"mouseout\",\n\t\tpointerenter: \"pointerover\",\n\t\tpointerleave: \"pointerout\"\n\t}, function( orig, fix ) {\n\t\tjQuery.event.special[ orig ] = {\n\t\t\tdelegateType: fix,\n\t\t\tbindType: fix,\n\t\n\t\t\thandle: function( event ) {\n\t\t\t\tvar ret,\n\t\t\t\t\ttarget = this,\n\t\t\t\t\trelated = event.relatedTarget,\n\t\t\t\t\thandleObj = event.handleObj;\n\t\n\t\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\t\tevent.type = fix;\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t};\n\t});\n\t\n\t// IE submit delegation\n\tif ( !support.submitBubbles ) {\n\t\n\t\tjQuery.event.special.submit = {\n\t\t\tsetup: function() {\n\t\t\t\t// Only need this for delegated form submit events\n\t\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\n\t\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\t\tvar elem = e.target,\n\t\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// return undefined since we don't need an event listener\n\t\t\t},\n\t\n\t\t\tpostDispatch: function( event ) {\n\t\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\t\tif ( event._submit_bubble ) {\n\t\t\t\t\tdelete event._submit_bubble;\n\t\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\tteardown: function() {\n\t\t\t\t// Only need this for delegated form submit events\n\t\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\n\t\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t\t}\n\t\t};\n\t}\n\t\n\t// IE change delegation and checkbox/radio fix\n\tif ( !support.changeBubbles ) {\n\t\n\t\tjQuery.event.special.change = {\n\t\n\t\t\tsetup: function() {\n\t\n\t\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\t\tvar elem = e.target;\n\t\n\t\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\n\t\t\thandle: function( event ) {\n\t\t\t\tvar elem = event.target;\n\t\n\t\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t\t}\n\t\t\t},\n\t\n\t\t\tteardown: function() {\n\t\t\t\tjQuery.event.remove( this, \"._change\" );\n\t\n\t\t\t\treturn !rformElems.test( this.nodeName );\n\t\t\t}\n\t\t};\n\t}\n\t\n\t// Create \"bubbling\" focus and blur events\n\tif ( !support.focusinBubbles ) {\n\t\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\t\n\t\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\t\tvar handler = function( event ) {\n\t\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t\t};\n\t\n\t\t\tjQuery.event.special[ fix ] = {\n\t\t\t\tsetup: function() {\n\t\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\t\tattaches = jQuery._data( doc, fix );\n\t\n\t\t\t\t\tif ( !attaches ) {\n\t\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t\t},\n\t\t\t\tteardown: function() {\n\t\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\t\tattaches = jQuery._data( doc, fix ) - 1;\n\t\n\t\t\t\t\tif ( !attaches ) {\n\t\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\t\tjQuery._removeData( doc, fix );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tjQuery._data( doc, fix, attaches );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\t\n\tjQuery.fn.extend({\n\t\n\t\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\t\tvar type, origFn;\n\t\n\t\t\t// Types can be a map of types/handlers\n\t\t\tif ( typeof types === \"object\" ) {\n\t\t\t\t// ( types-Object, selector, data )\n\t\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t\t// ( types-Object, data )\n\t\t\t\t\tdata = data || selector;\n\t\t\t\t\tselector = undefined;\n\t\t\t\t}\n\t\t\t\tfor ( type in types ) {\n\t\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\n\t\t\tif ( data == null && fn == null ) {\n\t\t\t\t// ( types, fn )\n\t\t\t\tfn = selector;\n\t\t\t\tdata = selector = undefined;\n\t\t\t} else if ( fn == null ) {\n\t\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t\t// ( types, selector, fn )\n\t\t\t\t\tfn = data;\n\t\t\t\t\tdata = undefined;\n\t\t\t\t} else {\n\t\t\t\t\t// ( types, data, fn )\n\t\t\t\t\tfn = data;\n\t\t\t\t\tdata = selector;\n\t\t\t\t\tselector = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( fn === false ) {\n\t\t\t\tfn = returnFalse;\n\t\t\t} else if ( !fn ) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\n\t\t\tif ( one === 1 ) {\n\t\t\t\torigFn = fn;\n\t\t\t\tfn = function( event ) {\n\t\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\t\tjQuery().off( event );\n\t\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t\t};\n\t\t\t\t// Use same guid so caller can remove using origFn\n\t\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t\t}\n\t\t\treturn this.each( function() {\n\t\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t\t});\n\t\t},\n\t\tone: function( types, selector, data, fn ) {\n\t\t\treturn this.on( types, selector, data, fn, 1 );\n\t\t},\n\t\toff: function( types, selector, fn ) {\n\t\t\tvar handleObj, type;\n\t\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\t\thandleObj = types.handleObj;\n\t\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\t\thandleObj.selector,\n\t\t\t\t\thandleObj.handler\n\t\t\t\t);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( typeof types === \"object\" ) {\n\t\t\t\t// ( types-object [, selector] )\n\t\t\t\tfor ( type in types ) {\n\t\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t\t// ( types [, fn] )\n\t\t\t\tfn = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tif ( fn === false ) {\n\t\t\t\tfn = returnFalse;\n\t\t\t}\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t\t});\n\t\t},\n\t\n\t\ttrigger: function( type, data ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.event.trigger( type, data, this );\n\t\t\t});\n\t\t},\n\t\ttriggerHandler: function( type, data ) {\n\t\t\tvar elem = this[0];\n\t\t\tif ( elem ) {\n\t\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t\t}\n\t\t}\n\t});\n\t\n\t\n\tfunction createSafeFragment( document ) {\n\t\tvar list = nodeNames.split( \"|\" ),\n\t\t\tsafeFrag = document.createDocumentFragment();\n\t\n\t\tif ( safeFrag.createElement ) {\n\t\t\twhile ( list.length ) {\n\t\t\t\tsafeFrag.createElement(\n\t\t\t\t\tlist.pop()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn safeFrag;\n\t}\n\t\n\tvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\t\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\t\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\t\trleadingWhitespace = /^\\s+/,\n\t\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\t\trtagName = /<([\\w:]+)/,\n\t\trtbody = /\\s*$/g,\n\t\n\t\t// We have to close these tags to support XHTML (#13200)\n\t\twrapMap = {\n\t\t\toption: [ 1, \"\" ],\n\t\t\tlegend: [ 1, \"
                                    \", \"
                                    \" ],\n\t\t\tarea: [ 1, \"\", \"\" ],\n\t\t\tparam: [ 1, \"\", \"\" ],\n\t\t\tthead: [ 1, \"\", \"
                                    \" ],\n\t\t\ttr: [ 2, \"\", \"
                                    \" ],\n\t\t\tcol: [ 2, \"\", \"
                                    \" ],\n\t\t\ttd: [ 3, \"\", \"
                                    \" ],\n\t\n\t\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t\t_default: support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X
                                    \", \"
                                    \" ]\n\t\t},\n\t\tsafeFragment = createSafeFragment( document ),\n\t\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\t\n\twrapMap.optgroup = wrapMap.option;\n\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n\twrapMap.th = wrapMap.td;\n\t\n\tfunction getAll( context, tag ) {\n\t\tvar elems, elem,\n\t\t\ti = 0,\n\t\t\tfound = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\t\ttypeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t\tundefined;\n\t\n\t\tif ( !found ) {\n\t\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\t\tfound.push( elem );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\t\tjQuery.merge( [ context ], found ) :\n\t\t\tfound;\n\t}\n\t\n\t// Used in buildFragment, fixes the defaultChecked property\n\tfunction fixDefaultChecked( elem ) {\n\t\tif ( rcheckableType.test( elem.type ) ) {\n\t\t\telem.defaultChecked = elem.checked;\n\t\t}\n\t}\n\t\n\t// Support: IE<8\n\t// Manipulating tables requires a tbody\n\tfunction manipulationTarget( elem, content ) {\n\t\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\n\t\n\t\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\t\telem;\n\t}\n\t\n\t// Replace/restore the type attribute of script elements for safe DOM manipulation\n\tfunction disableScript( elem ) {\n\t\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\t\treturn elem;\n\t}\n\tfunction restoreScript( elem ) {\n\t\tvar match = rscriptTypeMasked.exec( elem.type );\n\t\tif ( match ) {\n\t\t\telem.type = match[1];\n\t\t} else {\n\t\t\telem.removeAttribute(\"type\");\n\t\t}\n\t\treturn elem;\n\t}\n\t\n\t// Mark scripts as having already been evaluated\n\tfunction setGlobalEval( elems, refElements ) {\n\t\tvar elem,\n\t\t\ti = 0;\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t\t}\n\t}\n\t\n\tfunction cloneCopyEvent( src, dest ) {\n\t\n\t\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tvar type, i, l,\n\t\t\toldData = jQuery._data( src ),\n\t\t\tcurData = jQuery._data( dest, oldData ),\n\t\t\tevents = oldData.events;\n\t\n\t\tif ( events ) {\n\t\t\tdelete curData.handle;\n\t\t\tcurData.events = {};\n\t\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// make the cloned public data object a copy from the original\n\t\tif ( curData.data ) {\n\t\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t\t}\n\t}\n\t\n\tfunction fixCloneNodeIssues( src, dest ) {\n\t\tvar nodeName, e, data;\n\t\n\t\t// We do not need to do anything for non-Elements\n\t\tif ( dest.nodeType !== 1 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tnodeName = dest.nodeName.toLowerCase();\n\t\n\t\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\t\tif ( !support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\t\tdata = jQuery._data( dest );\n\t\n\t\t\tfor ( e in data.events ) {\n\t\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t\t}\n\t\n\t\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\t\tdest.removeAttribute( jQuery.expando );\n\t\t}\n\t\n\t\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\t\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\t\tdisableScript( dest ).text = src.text;\n\t\t\trestoreScript( dest );\n\t\n\t\t// IE6-10 improperly clones children of object elements using classid.\n\t\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t\t} else if ( nodeName === \"object\" ) {\n\t\t\tif ( dest.parentNode ) {\n\t\t\t\tdest.outerHTML = src.outerHTML;\n\t\t\t}\n\t\n\t\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t\t// If the src has innerHTML and the destination does not,\n\t\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\t\tif ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\t\tdest.innerHTML = src.innerHTML;\n\t\t\t}\n\t\n\t\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t\t// a checked appearance if the defaultChecked value isn't also set\n\t\n\t\t\tdest.defaultChecked = dest.checked = src.checked;\n\t\n\t\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\t\tif ( dest.value !== src.value ) {\n\t\t\t\tdest.value = src.value;\n\t\t\t}\n\t\n\t\t// IE6-8 fails to return the selected option to the default selected\n\t\t// state when cloning options\n\t\t} else if ( nodeName === \"option\" ) {\n\t\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\t\n\t\t// IE6-8 fails to set the defaultValue to the correct value when\n\t\t// cloning other types of input fields\n\t\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\t\tdest.defaultValue = src.defaultValue;\n\t\t}\n\t}\n\t\n\tjQuery.extend({\n\t\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\t\tvar destElements, node, clone, i, srcElements,\n\t\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\t\n\t\t\tif ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\t\tclone = elem.cloneNode( true );\n\t\n\t\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t\t} else {\n\t\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t\t}\n\t\n\t\t\tif ( (!support.noCloneEvent || !support.noCloneChecked) &&\n\t\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\n\t\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\t\tdestElements = getAll( clone );\n\t\t\t\tsrcElements = getAll( elem );\n\t\n\t\t\t\t// Fix all IE cloning issues\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Copy the events from the original to the clone\n\t\t\tif ( dataAndEvents ) {\n\t\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\t\tdestElements = destElements || getAll( clone );\n\t\n\t\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Preserve script evaluation history\n\t\t\tdestElements = getAll( clone, \"script\" );\n\t\t\tif ( destElements.length > 0 ) {\n\t\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t\t}\n\t\n\t\t\tdestElements = srcElements = node = null;\n\t\n\t\t\t// Return the cloned set\n\t\t\treturn clone;\n\t\t},\n\t\n\t\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\t\tvar j, elem, contains,\n\t\t\t\ttmp, tag, tbody, wrap,\n\t\t\t\tl = elems.length,\n\t\n\t\t\t\t// Ensure a safe fragment\n\t\t\t\tsafe = createSafeFragment( context ),\n\t\n\t\t\t\tnodes = [],\n\t\t\t\ti = 0;\n\t\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\telem = elems[ i ];\n\t\n\t\t\t\tif ( elem || elem === 0 ) {\n\t\n\t\t\t\t\t// Add nodes directly\n\t\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\t\n\t\t\t\t\t// Convert non-html into a text node\n\t\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\t\n\t\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\t\n\t\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\t\ttag = (rtagName.exec( elem ) || [ \"\", \"\" ])[ 1 ].toLowerCase();\n\t\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\n\t\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1>\" ) + wrap[2];\n\t\n\t\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\t\tj = wrap[0];\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\t\tif ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Remove IE's autoinserted from table fragments\n\t\t\t\t\t\tif ( !support.tbody ) {\n\t\n\t\t\t\t\t\t\t// String was a , *may* have spurious \n\t\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp.firstChild :\n\t\n\t\t\t\t\t\t\t\t// String was a bare or \n\t\t\t\t\t\t\t\twrap[1] === \"
                                    \" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t\t0;\n\t\n\t\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\t\telem.removeChild( tbody );\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\t\n\t\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\t\n\t\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\t\ttmp.textContent = \"\";\n\t\n\t\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t// Fix #11356: Clear elements from fragment\n\t\t\tif ( tmp ) {\n\t\t\t\tsafe.removeChild( tmp );\n\t\t\t}\n\t\n\t\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\t\tif ( !support.appendChecked ) {\n\t\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t\t}\n\t\n\t\t\ti = 0;\n\t\t\twhile ( (elem = nodes[ i++ ]) ) {\n\t\n\t\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t\t// that element, do not do anything\n\t\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\n\t\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\t\n\t\t\t\t// Append to fragment\n\t\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\t\n\t\t\t\t// Preserve script evaluation history\n\t\t\t\tif ( contains ) {\n\t\t\t\t\tsetGlobalEval( tmp );\n\t\t\t\t}\n\t\n\t\t\t\t// Capture executables\n\t\t\t\tif ( scripts ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\ttmp = null;\n\t\n\t\t\treturn safe;\n\t\t},\n\t\n\t\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\t\tvar elem, type, id, data,\n\t\t\t\ti = 0,\n\t\t\t\tinternalKey = jQuery.expando,\n\t\t\t\tcache = jQuery.cache,\n\t\t\t\tdeleteExpando = support.deleteExpando,\n\t\t\t\tspecial = jQuery.event.special;\n\t\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\t\n\t\t\t\t\tid = elem[ internalKey ];\n\t\t\t\t\tdata = id && cache[ id ];\n\t\n\t\t\t\t\tif ( data ) {\n\t\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\t\n\t\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\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\t\n\t\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\t\tif ( cache[ id ] ) {\n\t\n\t\t\t\t\t\t\tdelete cache[ id ];\n\t\n\t\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\t\n\t\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== strundefined ) {\n\t\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\t\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\tdeletedIds.push( id );\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\t\n\tjQuery.fn.extend({\n\t\ttext: function( value ) {\n\t\t\treturn access( this, function( value ) {\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\tjQuery.text( this ) :\n\t\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t\t}, null, value, arguments.length );\n\t\t},\n\t\n\t\tappend: function() {\n\t\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\t\ttarget.appendChild( elem );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\n\t\tprepend: function() {\n\t\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\n\t\tbefore: function() {\n\t\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\t\tif ( this.parentNode ) {\n\t\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\n\t\tafter: function() {\n\t\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\t\tif ( this.parentNode ) {\n\t\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\n\t\tremove: function( selector, keepData /* Internal Use Only */ ) {\n\t\t\tvar elem,\n\t\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\t\ti = 0;\n\t\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t\t}\n\t\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn this;\n\t\t},\n\t\n\t\tempty: function() {\n\t\t\tvar elem,\n\t\t\t\ti = 0;\n\t\n\t\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t}\n\t\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\twhile ( elem.firstChild ) {\n\t\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t\t}\n\t\n\t\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t\t// Support: IE<9\n\t\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\t\telem.options.length = 0;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn this;\n\t\t},\n\t\n\t\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\t\n\t\t\treturn this.map(function() {\n\t\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t\t});\n\t\t},\n\t\n\t\thtml: function( value ) {\n\t\t\treturn access( this, function( value ) {\n\t\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\t\ti = 0,\n\t\t\t\t\tl = this.length;\n\t\n\t\t\t\tif ( value === undefined ) {\n\t\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\t\tundefined;\n\t\t\t\t}\n\t\n\t\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t\t( support.htmlSerialize || !rnoshimcache.test( value ) ) &&\n\t\t\t\t\t( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t\t!wrapMap[ (rtagName.exec( value ) || [ \"\", \"\" ])[ 1 ].toLowerCase() ] ) {\n\t\n\t\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1>\" );\n\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\telem = 0;\n\t\n\t\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t\t} catch(e) {}\n\t\t\t\t}\n\t\n\t\t\t\tif ( elem ) {\n\t\t\t\t\tthis.empty().append( value );\n\t\t\t\t}\n\t\t\t}, null, value, arguments.length );\n\t\t},\n\t\n\t\treplaceWith: function() {\n\t\t\tvar arg = arguments[ 0 ];\n\t\n\t\t\t// Make the changes, replacing each context element with the new content\n\t\t\tthis.domManip( arguments, function( elem ) {\n\t\t\t\targ = this.parentNode;\n\t\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\n\t\t\t\tif ( arg ) {\n\t\t\t\t\targ.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t});\n\t\n\t\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\n\t\t},\n\t\n\t\tdetach: function( selector ) {\n\t\t\treturn this.remove( selector, true );\n\t\t},\n\t\n\t\tdomManip: function( args, callback ) {\n\t\n\t\t\t// Flatten any nested arrays\n\t\t\targs = concat.apply( [], args );\n\t\n\t\t\tvar first, node, hasScripts,\n\t\t\t\tscripts, doc, fragment,\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length,\n\t\t\t\tset = this,\n\t\t\t\tiNoClone = l - 1,\n\t\t\t\tvalue = args[0],\n\t\t\t\tisFunction = jQuery.isFunction( value );\n\t\n\t\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\t\tif ( isFunction ||\n\t\t\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\t\t\treturn this.each(function( index ) {\n\t\t\t\t\tvar self = set.eq( index );\n\t\t\t\t\tif ( isFunction ) {\n\t\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t\t}\n\t\t\t\t\tself.domManip( args, callback );\n\t\t\t\t});\n\t\t\t}\n\t\n\t\t\tif ( l ) {\n\t\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\t\tfirst = fragment.firstChild;\n\t\n\t\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\t\tfragment = first;\n\t\t\t\t}\n\t\n\t\t\t\tif ( first ) {\n\t\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\t\thasScripts = scripts.length;\n\t\n\t\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\tnode = fragment;\n\t\n\t\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\t\n\t\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t\t}\n\t\n\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\t\n\t\t\t\t\t\t// Reenable scripts\n\t\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\t\n\t\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\t\n\t\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\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\t\t\t\t\t}\n\t\n\t\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\t\tfragment = first = null;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\treturn this;\n\t\t}\n\t});\n\t\n\tjQuery.each({\n\t\tappendTo: \"append\",\n\t\tprependTo: \"prepend\",\n\t\tinsertBefore: \"before\",\n\t\tinsertAfter: \"after\",\n\t\treplaceAll: \"replaceWith\"\n\t}, function( name, original ) {\n\t\tjQuery.fn[ name ] = function( selector ) {\n\t\t\tvar elems,\n\t\t\t\ti = 0,\n\t\t\t\tret = [],\n\t\t\t\tinsert = jQuery( selector ),\n\t\t\t\tlast = insert.length - 1;\n\t\n\t\t\tfor ( ; i <= last; i++ ) {\n\t\t\t\telems = i === last ? this : this.clone(true);\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\n\t\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\t\tpush.apply( ret, elems.get() );\n\t\t\t}\n\t\n\t\t\treturn this.pushStack( ret );\n\t\t};\n\t});\n\t\n\t\n\tvar iframe,\n\t\telemdisplay = {};\n\t\n\t/**\n\t * Retrieve the actual display of a element\n\t * @param {String} name nodeName of the element\n\t * @param {Object} doc Document object\n\t */\n\t// Called only from within defaultDisplay\n\tfunction actualDisplay( name, doc ) {\n\t\tvar style,\n\t\t\telem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\n\t\t\t// getDefaultComputedStyle might be reliably used only on attached element\n\t\t\tdisplay = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?\n\t\n\t\t\t\t// Use of this method is a temporary fix (more like optmization) until something better comes along,\n\t\t\t\t// since it was removed from specification and supported only in FF\n\t\t\t\tstyle.display : jQuery.css( elem[ 0 ], \"display\" );\n\t\n\t\t// We don't have any data stored on the element,\n\t\t// so use \"detach\" method as fast way to get rid of the element\n\t\telem.detach();\n\t\n\t\treturn display;\n\t}\n\t\n\t/**\n\t * Try to determine the default display value of an element\n\t * @param {String} nodeName\n\t */\n\tfunction defaultDisplay( nodeName ) {\n\t\tvar doc = document,\n\t\t\tdisplay = elemdisplay[ nodeName ];\n\t\n\t\tif ( !display ) {\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\n\t\t\t// If the simple way fails, read from inside an iframe\n\t\t\tif ( display === \"none\" || !display ) {\n\t\n\t\t\t\t// Use the already-created iframe if possible\n\t\t\t\tiframe = (iframe || jQuery( \"\"\n\t )\n\t });\n\t modal.show( { backdrop: true } );\n\t}\n\t\n\t\n\t// ============================================================================\n\t return {\n\t Modal : Modal,\n\t hide_modal : hide_modal,\n\t show_modal : show_modal,\n\t show_message : show_message,\n\t show_in_overlay : show_in_overlay,\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 84 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(114),\n\t __webpack_require__(13),\n\t __webpack_require__(10),\n\t __webpack_require__(6)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( Masthead, Panel, Modal, BaseMVC ) {\n\t\n\t// ============================================================================\n\tvar PageLayoutView = Backbone.View.extend( BaseMVC.LoggableMixin ).extend({\n\t _logNamespace : 'layout',\n\t\n\t el : 'body',\n\t className : 'full-content',\n\t\n\t _panelIds : [\n\t 'left', 'center', 'right'\n\t ],\n\t\n\t defaultOptions : {\n\t message_box_visible : false,\n\t message_box_content : '',\n\t message_box_class : 'info',\n\t show_inactivity_warning : false,\n\t inactivity_box_content : ''\n\t },\n\t\n\t initialize : function( options ) {\n\t // TODO: remove globals\n\t this.log( this + '.initialize:', options );\n\t _.extend( this, _.pick( options, this._panelIds ) );\n\t this.options = _.defaults( _.omit( options, this._panelIds ), this.defaultOptions );\n\t Galaxy.modal = this.modal = new Modal.View();\n\t this.masthead = new Masthead.View( this.options.config );\n\t this.$el.attr( 'scroll', 'no' );\n\t this.$el.html( this._template() );\n\t this.$el.append( this.masthead.frame.$el );\n\t this.$el.append( this.masthead.$el );\n\t this.$el.append( this.modal.$el );\n\t this.$messagebox = this.$( '#messagebox' );\n\t this.$inactivebox = this.$( '#inactivebox' );\n\t },\n\t\n\t render : function() {\n\t // TODO: Remove this line after select2 update\n\t $( '.select2-hidden-accessible' ).remove();\n\t this.log( this + '.render:' );\n\t this.masthead.render();\n\t this.renderMessageBox();\n\t this.renderInactivityBox();\n\t this.renderPanels();\n\t return this;\n\t },\n\t\n\t /** Render message box */\n\t renderMessageBox : function() {\n\t if ( this.options.message_box_visible ){\n\t var content = this.options.message_box_content || '';\n\t var level = this.options.message_box_class || 'info';\n\t this.$el.addClass( 'has-message-box' );\n\t this.$messagebox\n\t .attr( 'class', 'panel-' + level + '-message' )\n\t .html( content )\n\t .toggle( !!content )\n\t .show();\n\t } else {\n\t this.$el.removeClass( 'has-message-box' );\n\t this.$messagebox.hide();\n\t }\n\t return this;\n\t },\n\t\n\t /** Render inactivity warning */\n\t renderInactivityBox : function() {\n\t if( this.options.show_inactivity_warning ){\n\t var content = this.options.inactivity_box_content || '';\n\t var verificationLink = $( '' ).attr( 'href', Galaxy.root + 'user/resend_verification' ).text( 'Resend verification' );\n\t this.$el.addClass( 'has-inactivity-box' );\n\t this.$inactivebox\n\t .html( content + ' ' )\n\t .append( verificationLink )\n\t .toggle( !!content )\n\t .show();\n\t } else {\n\t this.$el.removeClass( 'has-inactivity-box' );\n\t this.$inactivebox.hide();\n\t }\n\t return this;\n\t },\n\t\n\t /** Render panels */\n\t renderPanels : function() {\n\t var page = this;\n\t this._panelIds.forEach( function( panelId ){\n\t if( _.has( page, panelId ) ){\n\t page[ panelId ].setElement( '#' + panelId );\n\t page[ panelId ].render();\n\t }\n\t });\n\t if( !this.left ){\n\t this.center.$el.css( 'left', 0 );\n\t }\n\t if( !this.right ){\n\t this.center.$el.css( 'right', 0 );\n\t }\n\t return this;\n\t },\n\t\n\t /** body template */\n\t _template: function() {\n\t return [\n\t '
                                    ',\n\t '
                                    ',\n\t '
                                    ',\n\t '
                                    ',\n\t this.left? '
                                    ' : '',\n\t this.center? '
                                    ' : '',\n\t this.right? '
                                    ' : '',\n\t '
                                    ',\n\t '
                                    ',\n\t ].join('');\n\t },\n\t\n\t /** hide both side panels if previously shown */\n\t hideSidePanels : function(){\n\t if( this.left ){\n\t this.left.hide();\n\t }\n\t if( this.right ){\n\t this.right.hide();\n\t }\n\t },\n\t\n\t toString : function() { return 'PageLayoutView'; }\n\t});\n\t\n\t// ============================================================================\n\t return {\n\t PageLayoutView: PageLayoutView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 85 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * bootstrap-tour - v0.10.1\n\t * http://bootstraptour.com\n\t * ========================================================================\n\t * Copyright 2012-2013 Ulrich Sossou\n\t *\n\t * ========================================================================\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * ========================================================================\n\t */\n\t\n\t(function($, window) {\n\t var Tour, document;\n\t document = window.document;\n\t Tour = (function() {\n\t function Tour(options) {\n\t var storage;\n\t try {\n\t storage = window.localStorage;\n\t } catch (_error) {\n\t storage = false;\n\t }\n\t this._options = $.extend({\n\t name: 'tour',\n\t steps: [],\n\t container: 'body',\n\t autoscroll: true,\n\t keyboard: true,\n\t storage: storage,\n\t debug: false,\n\t backdrop: false,\n\t backdropPadding: 0,\n\t redirect: true,\n\t orphan: false,\n\t duration: false,\n\t delay: false,\n\t basePath: '',\n\t template: '

                                    ',\n\t afterSetState: function(key, value) {},\n\t afterGetState: function(key, value) {},\n\t afterRemoveState: function(key) {},\n\t onStart: function(tour) {},\n\t onEnd: function(tour) {},\n\t onShow: function(tour) {},\n\t onShown: function(tour) {},\n\t onHide: function(tour) {},\n\t onHidden: function(tour) {},\n\t onNext: function(tour) {},\n\t onPrev: function(tour) {},\n\t onPause: function(tour, duration) {},\n\t onResume: function(tour, duration) {}\n\t }, options);\n\t this._force = false;\n\t this._inited = false;\n\t this.backdrop = {\n\t overlay: null,\n\t $element: null,\n\t $background: null,\n\t backgroundShown: false,\n\t overlayElementShown: false\n\t };\n\t this;\n\t }\n\t\n\t Tour.prototype.addSteps = function(steps) {\n\t var step, _i, _len;\n\t for (_i = 0, _len = steps.length; _i < _len; _i++) {\n\t step = steps[_i];\n\t this.addStep(step);\n\t }\n\t return this;\n\t };\n\t\n\t Tour.prototype.addStep = function(step) {\n\t this._options.steps.push(step);\n\t return this;\n\t };\n\t\n\t Tour.prototype.getStep = function(i) {\n\t if (this._options.steps[i] != null) {\n\t return $.extend({\n\t id: \"step-\" + i,\n\t path: '',\n\t placement: 'right',\n\t title: '',\n\t content: '

                                    ',\n\t next: i === this._options.steps.length - 1 ? -1 : i + 1,\n\t prev: i - 1,\n\t animation: true,\n\t container: this._options.container,\n\t autoscroll: this._options.autoscroll,\n\t backdrop: this._options.backdrop,\n\t backdropPadding: this._options.backdropPadding,\n\t redirect: this._options.redirect,\n\t orphan: this._options.orphan,\n\t duration: this._options.duration,\n\t delay: this._options.delay,\n\t template: this._options.template,\n\t onShow: this._options.onShow,\n\t onShown: this._options.onShown,\n\t onHide: this._options.onHide,\n\t onHidden: this._options.onHidden,\n\t onNext: this._options.onNext,\n\t onPrev: this._options.onPrev,\n\t onPause: this._options.onPause,\n\t onResume: this._options.onResume\n\t }, this._options.steps[i]);\n\t }\n\t };\n\t\n\t Tour.prototype.init = function(force) {\n\t this._force = force;\n\t if (this.ended()) {\n\t this._debug('Tour ended, init prevented.');\n\t return this;\n\t }\n\t this.setCurrentStep();\n\t this._initMouseNavigation();\n\t this._initKeyboardNavigation();\n\t this._onResize((function(_this) {\n\t return function() {\n\t return _this.showStep(_this._current);\n\t };\n\t })(this));\n\t if (this._current !== null) {\n\t this.showStep(this._current);\n\t }\n\t this._inited = true;\n\t return this;\n\t };\n\t\n\t Tour.prototype.start = function(force) {\n\t var promise;\n\t if (force == null) {\n\t force = false;\n\t }\n\t if (!this._inited) {\n\t this.init(force);\n\t }\n\t if (this._current === null) {\n\t promise = this._makePromise(this._options.onStart != null ? this._options.onStart(this) : void 0);\n\t this._callOnPromiseDone(promise, this.showStep, 0);\n\t }\n\t return this;\n\t };\n\t\n\t Tour.prototype.next = function() {\n\t var promise;\n\t promise = this.hideStep(this._current);\n\t return this._callOnPromiseDone(promise, this._showNextStep);\n\t };\n\t\n\t Tour.prototype.prev = function() {\n\t var promise;\n\t promise = this.hideStep(this._current);\n\t return this._callOnPromiseDone(promise, this._showPrevStep);\n\t };\n\t\n\t Tour.prototype.goTo = function(i) {\n\t var promise;\n\t promise = this.hideStep(this._current);\n\t return this._callOnPromiseDone(promise, this.showStep, i);\n\t };\n\t\n\t Tour.prototype.end = function() {\n\t var endHelper, promise;\n\t endHelper = (function(_this) {\n\t return function(e) {\n\t $(document).off(\"click.tour-\" + _this._options.name);\n\t $(document).off(\"keyup.tour-\" + _this._options.name);\n\t $(window).off(\"resize.tour-\" + _this._options.name);\n\t _this._setState('end', 'yes');\n\t _this._inited = false;\n\t _this._force = false;\n\t _this._clearTimer();\n\t if (_this._options.onEnd != null) {\n\t return _this._options.onEnd(_this);\n\t }\n\t };\n\t })(this);\n\t promise = this.hideStep(this._current);\n\t return this._callOnPromiseDone(promise, endHelper);\n\t };\n\t\n\t Tour.prototype.ended = function() {\n\t return !this._force && !!this._getState('end');\n\t };\n\t\n\t Tour.prototype.restart = function() {\n\t this._removeState('current_step');\n\t this._removeState('end');\n\t return this.start();\n\t };\n\t\n\t Tour.prototype.pause = function() {\n\t var step;\n\t step = this.getStep(this._current);\n\t if (!(step && step.duration)) {\n\t return this;\n\t }\n\t this._paused = true;\n\t this._duration -= new Date().getTime() - this._start;\n\t window.clearTimeout(this._timer);\n\t this._debug(\"Paused/Stopped step \" + (this._current + 1) + \" timer (\" + this._duration + \" remaining).\");\n\t if (step.onPause != null) {\n\t return step.onPause(this, this._duration);\n\t }\n\t };\n\t\n\t Tour.prototype.resume = function() {\n\t var step;\n\t step = this.getStep(this._current);\n\t if (!(step && step.duration)) {\n\t return this;\n\t }\n\t this._paused = false;\n\t this._start = new Date().getTime();\n\t this._duration = this._duration || step.duration;\n\t this._timer = window.setTimeout((function(_this) {\n\t return function() {\n\t if (_this._isLast()) {\n\t return _this.next();\n\t } else {\n\t return _this.end();\n\t }\n\t };\n\t })(this), this._duration);\n\t this._debug(\"Started step \" + (this._current + 1) + \" timer with duration \" + this._duration);\n\t if ((step.onResume != null) && this._duration !== step.duration) {\n\t return step.onResume(this, this._duration);\n\t }\n\t };\n\t\n\t Tour.prototype.hideStep = function(i) {\n\t var hideStepHelper, promise, step;\n\t step = this.getStep(i);\n\t if (!step) {\n\t return;\n\t }\n\t this._clearTimer();\n\t promise = this._makePromise(step.onHide != null ? step.onHide(this, i) : void 0);\n\t hideStepHelper = (function(_this) {\n\t return function(e) {\n\t var $element;\n\t $element = $(step.element);\n\t if (!($element.data('bs.popover') || $element.data('popover'))) {\n\t $element = $('body');\n\t }\n\t $element.popover('destroy').removeClass(\"tour-\" + _this._options.name + \"-element tour-\" + _this._options.name + \"-\" + i + \"-element\");\n\t if (step.reflex) {\n\t $element.removeClass('tour-step-element-reflex').off(\"\" + (_this._reflexEvent(step.reflex)) + \".tour-\" + _this._options.name);\n\t }\n\t if (step.backdrop) {\n\t _this._hideBackdrop();\n\t }\n\t if (step.onHidden != null) {\n\t return step.onHidden(_this);\n\t }\n\t };\n\t })(this);\n\t this._callOnPromiseDone(promise, hideStepHelper);\n\t return promise;\n\t };\n\t\n\t Tour.prototype.showStep = function(i) {\n\t var promise, showStepHelper, skipToPrevious, step;\n\t if (this.ended()) {\n\t this._debug('Tour ended, showStep prevented.');\n\t return this;\n\t }\n\t step = this.getStep(i);\n\t if (!step) {\n\t return;\n\t }\n\t skipToPrevious = i < this._current;\n\t promise = this._makePromise(step.onShow != null ? step.onShow(this, i) : void 0);\n\t showStepHelper = (function(_this) {\n\t return function(e) {\n\t var current_path, path, showPopoverAndOverlay;\n\t _this.setCurrentStep(i);\n\t path = (function() {\n\t switch ({}.toString.call(step.path)) {\n\t case '[object Function]':\n\t return step.path();\n\t case '[object String]':\n\t return this._options.basePath + step.path;\n\t default:\n\t return step.path;\n\t }\n\t }).call(_this);\n\t current_path = [document.location.pathname, document.location.hash].join('');\n\t if (_this._isRedirect(path, current_path)) {\n\t _this._redirect(step, path);\n\t return;\n\t }\n\t if (_this._isOrphan(step)) {\n\t if (!step.orphan) {\n\t _this._debug(\"Skip the orphan step \" + (_this._current + 1) + \".\\nOrphan option is false and the element does not exist or is hidden.\");\n\t if (skipToPrevious) {\n\t _this._showPrevStep();\n\t } else {\n\t _this._showNextStep();\n\t }\n\t return;\n\t }\n\t _this._debug(\"Show the orphan step \" + (_this._current + 1) + \". Orphans option is true.\");\n\t }\n\t if (step.backdrop) {\n\t _this._showBackdrop(!_this._isOrphan(step) ? step.element : void 0);\n\t }\n\t showPopoverAndOverlay = function() {\n\t if (_this.getCurrentStep() !== i) {\n\t return;\n\t }\n\t if ((step.element != null) && step.backdrop) {\n\t _this._showOverlayElement(step);\n\t }\n\t _this._showPopover(step, i);\n\t if (step.onShown != null) {\n\t step.onShown(_this);\n\t }\n\t return _this._debug(\"Step \" + (_this._current + 1) + \" of \" + _this._options.steps.length);\n\t };\n\t if (step.autoscroll) {\n\t _this._scrollIntoView(step.element, showPopoverAndOverlay);\n\t } else {\n\t showPopoverAndOverlay();\n\t }\n\t if (step.duration) {\n\t return _this.resume();\n\t }\n\t };\n\t })(this);\n\t if (step.delay) {\n\t this._debug(\"Wait \" + step.delay + \" milliseconds to show the step \" + (this._current + 1));\n\t window.setTimeout((function(_this) {\n\t return function() {\n\t return _this._callOnPromiseDone(promise, showStepHelper);\n\t };\n\t })(this), step.delay);\n\t } else {\n\t this._callOnPromiseDone(promise, showStepHelper);\n\t }\n\t return promise;\n\t };\n\t\n\t Tour.prototype.getCurrentStep = function() {\n\t return this._current;\n\t };\n\t\n\t Tour.prototype.setCurrentStep = function(value) {\n\t if (value != null) {\n\t this._current = value;\n\t this._setState('current_step', value);\n\t } else {\n\t this._current = this._getState('current_step');\n\t this._current = this._current === null ? null : parseInt(this._current, 10);\n\t }\n\t return this;\n\t };\n\t\n\t Tour.prototype._setState = function(key, value) {\n\t var e, keyName;\n\t if (this._options.storage) {\n\t keyName = \"\" + this._options.name + \"_\" + key;\n\t try {\n\t this._options.storage.setItem(keyName, value);\n\t } catch (_error) {\n\t e = _error;\n\t if (e.code === DOMException.QUOTA_EXCEEDED_ERR) {\n\t this._debug('LocalStorage quota exceeded. State storage failed.');\n\t }\n\t }\n\t return this._options.afterSetState(keyName, value);\n\t } else {\n\t if (this._state == null) {\n\t this._state = {};\n\t }\n\t return this._state[key] = value;\n\t }\n\t };\n\t\n\t Tour.prototype._removeState = function(key) {\n\t var keyName;\n\t if (this._options.storage) {\n\t keyName = \"\" + this._options.name + \"_\" + key;\n\t this._options.storage.removeItem(keyName);\n\t return this._options.afterRemoveState(keyName);\n\t } else {\n\t if (this._state != null) {\n\t return delete this._state[key];\n\t }\n\t }\n\t };\n\t\n\t Tour.prototype._getState = function(key) {\n\t var keyName, value;\n\t if (this._options.storage) {\n\t keyName = \"\" + this._options.name + \"_\" + key;\n\t value = this._options.storage.getItem(keyName);\n\t } else {\n\t if (this._state != null) {\n\t value = this._state[key];\n\t }\n\t }\n\t if (value === void 0 || value === 'null') {\n\t value = null;\n\t }\n\t this._options.afterGetState(key, value);\n\t return value;\n\t };\n\t\n\t Tour.prototype._showNextStep = function() {\n\t var promise, showNextStepHelper, step;\n\t step = this.getStep(this._current);\n\t showNextStepHelper = (function(_this) {\n\t return function(e) {\n\t return _this.showStep(step.next);\n\t };\n\t })(this);\n\t promise = this._makePromise(step.onNext != null ? step.onNext(this) : void 0);\n\t return this._callOnPromiseDone(promise, showNextStepHelper);\n\t };\n\t\n\t Tour.prototype._showPrevStep = function() {\n\t var promise, showPrevStepHelper, step;\n\t step = this.getStep(this._current);\n\t showPrevStepHelper = (function(_this) {\n\t return function(e) {\n\t return _this.showStep(step.prev);\n\t };\n\t })(this);\n\t promise = this._makePromise(step.onPrev != null ? step.onPrev(this) : void 0);\n\t return this._callOnPromiseDone(promise, showPrevStepHelper);\n\t };\n\t\n\t Tour.prototype._debug = function(text) {\n\t if (this._options.debug) {\n\t return window.console.log(\"Bootstrap Tour '\" + this._options.name + \"' | \" + text);\n\t }\n\t };\n\t\n\t Tour.prototype._isRedirect = function(path, currentPath) {\n\t return (path != null) && path !== '' && (({}.toString.call(path) === '[object RegExp]' && !path.test(currentPath)) || ({}.toString.call(path) === '[object String]' && path.replace(/\\?.*$/, '').replace(/\\/?$/, '') !== currentPath.replace(/\\/?$/, '')));\n\t };\n\t\n\t Tour.prototype._redirect = function(step, path) {\n\t if ($.isFunction(step.redirect)) {\n\t return step.redirect.call(this, path);\n\t } else if (step.redirect === true) {\n\t this._debug(\"Redirect to \" + path);\n\t return document.location.href = path;\n\t }\n\t };\n\t\n\t Tour.prototype._isOrphan = function(step) {\n\t return (step.element == null) || !$(step.element).length || $(step.element).is(':hidden') && ($(step.element)[0].namespaceURI !== 'http://www.w3.org/2000/svg');\n\t };\n\t\n\t Tour.prototype._isLast = function() {\n\t return this._current < this._options.steps.length - 1;\n\t };\n\t\n\t Tour.prototype._showPopover = function(step, i) {\n\t var $element, $tip, isOrphan, options;\n\t $(\".tour-\" + this._options.name).remove();\n\t options = $.extend({}, this._options);\n\t isOrphan = this._isOrphan(step);\n\t step.template = this._template(step, i);\n\t if (isOrphan) {\n\t step.element = 'body';\n\t step.placement = 'top';\n\t }\n\t $element = $(step.element);\n\t $element.addClass(\"tour-\" + this._options.name + \"-element tour-\" + this._options.name + \"-\" + i + \"-element\");\n\t if (step.options) {\n\t $.extend(options, step.options);\n\t }\n\t if (step.reflex && !isOrphan) {\n\t $element.addClass('tour-step-element-reflex');\n\t $element.off(\"\" + (this._reflexEvent(step.reflex)) + \".tour-\" + this._options.name);\n\t $element.on(\"\" + (this._reflexEvent(step.reflex)) + \".tour-\" + this._options.name, (function(_this) {\n\t return function() {\n\t if (_this._isLast()) {\n\t return _this.next();\n\t } else {\n\t return _this.end();\n\t }\n\t };\n\t })(this));\n\t }\n\t $element.popover({\n\t placement: step.placement,\n\t trigger: 'manual',\n\t title: step.title,\n\t content: step.content,\n\t html: true,\n\t animation: step.animation,\n\t container: step.container,\n\t template: step.template,\n\t selector: step.element\n\t }).popover('show');\n\t $tip = $element.data('bs.popover') ? $element.data('bs.popover').tip() : $element.data('popover').tip();\n\t $tip.attr('id', step.id);\n\t this._reposition($tip, step);\n\t if (isOrphan) {\n\t return this._center($tip);\n\t }\n\t };\n\t\n\t Tour.prototype._template = function(step, i) {\n\t var $navigation, $next, $prev, $resume, $template;\n\t $template = $.isFunction(step.template) ? $(step.template(i, step)) : $(step.template);\n\t $navigation = $template.find('.popover-navigation');\n\t $prev = $navigation.find('[data-role=\"prev\"]');\n\t $next = $navigation.find('[data-role=\"next\"]');\n\t $resume = $navigation.find('[data-role=\"pause-resume\"]');\n\t if (this._isOrphan(step)) {\n\t $template.addClass('orphan');\n\t }\n\t $template.addClass(\"tour-\" + this._options.name + \" tour-\" + this._options.name + \"-\" + i);\n\t if (step.prev < 0) {\n\t $prev.addClass('disabled');\n\t }\n\t if (step.next < 0) {\n\t $next.addClass('disabled');\n\t }\n\t if (!step.duration) {\n\t $resume.remove();\n\t }\n\t return $template.clone().wrap('
                                    ').parent().html();\n\t };\n\t\n\t Tour.prototype._reflexEvent = function(reflex) {\n\t if ({}.toString.call(reflex) === '[object Boolean]') {\n\t return 'click';\n\t } else {\n\t return reflex;\n\t }\n\t };\n\t\n\t Tour.prototype._reposition = function($tip, step) {\n\t var offsetBottom, offsetHeight, offsetRight, offsetWidth, originalLeft, originalTop, tipOffset;\n\t offsetWidth = $tip[0].offsetWidth;\n\t offsetHeight = $tip[0].offsetHeight;\n\t tipOffset = $tip.offset();\n\t originalLeft = tipOffset.left;\n\t originalTop = tipOffset.top;\n\t offsetBottom = $(document).outerHeight() - tipOffset.top - $tip.outerHeight();\n\t if (offsetBottom < 0) {\n\t tipOffset.top = tipOffset.top + offsetBottom;\n\t }\n\t offsetRight = $('html').outerWidth() - tipOffset.left - $tip.outerWidth();\n\t if (offsetRight < 0) {\n\t tipOffset.left = tipOffset.left + offsetRight;\n\t }\n\t if (tipOffset.top < 0) {\n\t tipOffset.top = 0;\n\t }\n\t if (tipOffset.left < 0) {\n\t tipOffset.left = 0;\n\t }\n\t $tip.offset(tipOffset);\n\t if (step.placement === 'bottom' || step.placement === 'top') {\n\t if (originalLeft !== tipOffset.left) {\n\t return this._replaceArrow($tip, (tipOffset.left - originalLeft) * 2, offsetWidth, 'left');\n\t }\n\t } else {\n\t if (originalTop !== tipOffset.top) {\n\t return this._replaceArrow($tip, (tipOffset.top - originalTop) * 2, offsetHeight, 'top');\n\t }\n\t }\n\t };\n\t\n\t Tour.prototype._center = function($tip) {\n\t return $tip.css('top', $(window).outerHeight() / 2 - $tip.outerHeight() / 2);\n\t };\n\t\n\t Tour.prototype._replaceArrow = function($tip, delta, dimension, position) {\n\t return $tip.find('.arrow').css(position, delta ? 50 * (1 - delta / dimension) + '%' : '');\n\t };\n\t\n\t Tour.prototype._scrollIntoView = function(element, callback) {\n\t var $element, $window, counter, offsetTop, scrollTop, windowHeight;\n\t $element = $(element);\n\t if (!$element.length) {\n\t return callback();\n\t }\n\t $window = $(window);\n\t offsetTop = $element.offset().top;\n\t windowHeight = $window.height();\n\t scrollTop = Math.max(0, offsetTop - (windowHeight / 2));\n\t this._debug(\"Scroll into view. ScrollTop: \" + scrollTop + \". Element offset: \" + offsetTop + \". Window height: \" + windowHeight + \".\");\n\t counter = 0;\n\t return $('body, html').stop(true, true).animate({\n\t scrollTop: Math.ceil(scrollTop)\n\t }, (function(_this) {\n\t return function() {\n\t if (++counter === 2) {\n\t callback();\n\t return _this._debug(\"Scroll into view.\\nAnimation end element offset: \" + ($element.offset().top) + \".\\nWindow height: \" + ($window.height()) + \".\");\n\t }\n\t };\n\t })(this));\n\t };\n\t\n\t Tour.prototype._onResize = function(callback, timeout) {\n\t return $(window).on(\"resize.tour-\" + this._options.name, function() {\n\t clearTimeout(timeout);\n\t return timeout = setTimeout(callback, 100);\n\t });\n\t };\n\t\n\t Tour.prototype._initMouseNavigation = function() {\n\t var _this;\n\t _this = this;\n\t return $(document).off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='prev']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='next']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='end']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='pause-resume']\").on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='next']\", (function(_this) {\n\t return function(e) {\n\t e.preventDefault();\n\t return _this.next();\n\t };\n\t })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='prev']\", (function(_this) {\n\t return function(e) {\n\t e.preventDefault();\n\t return _this.prev();\n\t };\n\t })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='end']\", (function(_this) {\n\t return function(e) {\n\t e.preventDefault();\n\t return _this.end();\n\t };\n\t })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='pause-resume']\", function(e) {\n\t var $this;\n\t e.preventDefault();\n\t $this = $(this);\n\t $this.text(_this._paused ? $this.data('pause-text') : $this.data('resume-text'));\n\t if (_this._paused) {\n\t return _this.resume();\n\t } else {\n\t return _this.pause();\n\t }\n\t });\n\t };\n\t\n\t Tour.prototype._initKeyboardNavigation = function() {\n\t if (!this._options.keyboard) {\n\t return;\n\t }\n\t return $(document).on(\"keyup.tour-\" + this._options.name, (function(_this) {\n\t return function(e) {\n\t if (!e.which) {\n\t return;\n\t }\n\t switch (e.which) {\n\t case 39:\n\t e.preventDefault();\n\t if (_this._isLast()) {\n\t return _this.next();\n\t } else {\n\t return _this.end();\n\t }\n\t break;\n\t case 37:\n\t e.preventDefault();\n\t if (_this._current > 0) {\n\t return _this.prev();\n\t }\n\t break;\n\t case 27:\n\t e.preventDefault();\n\t return _this.end();\n\t }\n\t };\n\t })(this));\n\t };\n\t\n\t Tour.prototype._makePromise = function(result) {\n\t if (result && $.isFunction(result.then)) {\n\t return result;\n\t } else {\n\t return null;\n\t }\n\t };\n\t\n\t Tour.prototype._callOnPromiseDone = function(promise, cb, arg) {\n\t if (promise) {\n\t return promise.then((function(_this) {\n\t return function(e) {\n\t return cb.call(_this, arg);\n\t };\n\t })(this));\n\t } else {\n\t return cb.call(this, arg);\n\t }\n\t };\n\t\n\t Tour.prototype._showBackdrop = function(element) {\n\t if (this.backdrop.backgroundShown) {\n\t return;\n\t }\n\t this.backdrop = $('
                                    ', {\n\t \"class\": 'tour-backdrop'\n\t });\n\t this.backdrop.backgroundShown = true;\n\t return $('body').append(this.backdrop);\n\t };\n\t\n\t Tour.prototype._hideBackdrop = function() {\n\t this._hideOverlayElement();\n\t return this._hideBackground();\n\t };\n\t\n\t Tour.prototype._hideBackground = function() {\n\t if (this.backdrop) {\n\t this.backdrop.remove();\n\t this.backdrop.overlay = null;\n\t return this.backdrop.backgroundShown = false;\n\t }\n\t };\n\t\n\t Tour.prototype._showOverlayElement = function(step) {\n\t var $element, elementData;\n\t $element = $(step.element);\n\t if (!$element || $element.length === 0 || this.backdrop.overlayElementShown) {\n\t return;\n\t }\n\t this.backdrop.overlayElementShown = true;\n\t this.backdrop.$element = $element.addClass('tour-step-backdrop');\n\t this.backdrop.$background = $('
                                    ', {\n\t \"class\": 'tour-step-background'\n\t });\n\t elementData = {\n\t width: $element.innerWidth(),\n\t height: $element.innerHeight(),\n\t offset: $element.offset()\n\t };\n\t this.backdrop.$background.appendTo('body');\n\t if (step.backdropPadding) {\n\t elementData = this._applyBackdropPadding(step.backdropPadding, elementData);\n\t }\n\t return this.backdrop.$background.width(elementData.width).height(elementData.height).offset(elementData.offset);\n\t };\n\t\n\t Tour.prototype._hideOverlayElement = function() {\n\t if (!this.backdrop.overlayElementShown) {\n\t return;\n\t }\n\t this.backdrop.$element.removeClass('tour-step-backdrop');\n\t this.backdrop.$background.remove();\n\t this.backdrop.$element = null;\n\t this.backdrop.$background = null;\n\t return this.backdrop.overlayElementShown = false;\n\t };\n\t\n\t Tour.prototype._applyBackdropPadding = function(padding, data) {\n\t if (typeof padding === 'object') {\n\t if (padding.top == null) {\n\t padding.top = 0;\n\t }\n\t if (padding.right == null) {\n\t padding.right = 0;\n\t }\n\t if (padding.bottom == null) {\n\t padding.bottom = 0;\n\t }\n\t if (padding.left == null) {\n\t padding.left = 0;\n\t }\n\t data.offset.top = data.offset.top - padding.top;\n\t data.offset.left = data.offset.left - padding.left;\n\t data.width = data.width + padding.left + padding.right;\n\t data.height = data.height + padding.top + padding.bottom;\n\t } else {\n\t data.offset.top = data.offset.top - padding;\n\t data.offset.left = data.offset.left - padding;\n\t data.width = data.width + (padding * 2);\n\t data.height = data.height + (padding * 2);\n\t }\n\t return data;\n\t };\n\t\n\t Tour.prototype._clearTimer = function() {\n\t window.clearTimeout(this._timer);\n\t this._timer = null;\n\t return this._duration = null;\n\t };\n\t\n\t return Tour;\n\t\n\t })();\n\t return window.Tour = Tour;\n\t})(jQuery, window);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*!\n\t\n\t handlebars v3.0.3\n\t\n\tCopyright (C) 2011-2014 by Yehuda Katz\n\t\n\tPermission is hereby granted, free of charge, to any person obtaining a copy\n\tof this software and associated documentation files (the \"Software\"), to deal\n\tin the Software without restriction, including without limitation the rights\n\tto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\tcopies of the Software, and to permit persons to whom the Software is\n\tfurnished to do so, subject to the following conditions:\n\t\n\tThe above copyright notice and this permission notice shall be included in\n\tall copies or substantial portions of the Software.\n\t\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\tTHE SOFTWARE.\n\t\n\t@license\n\t*/\n\t(function webpackUniversalModuleDefinition(root, factory) {\n\t\tif(true)\n\t\t\tmodule.exports = factory();\n\t\telse if(typeof define === 'function' && define.amd)\n\t\t\tdefine(factory);\n\t\telse if(typeof exports === 'object')\n\t\t\texports[\"Handlebars\"] = factory();\n\t\telse\n\t\t\troot[\"Handlebars\"] = factory();\n\t})(this, function() {\n\treturn /******/ (function(modules) { // webpackBootstrap\n\t/******/ \t// The module cache\n\t/******/ \tvar installedModules = {};\n\t\n\t/******/ \t// The require function\n\t/******/ \tfunction __webpack_require__(moduleId) {\n\t\n\t/******/ \t\t// Check if module is in cache\n\t/******/ \t\tif(installedModules[moduleId])\n\t/******/ \t\t\treturn installedModules[moduleId].exports;\n\t\n\t/******/ \t\t// Create a new module (and put it into the cache)\n\t/******/ \t\tvar module = installedModules[moduleId] = {\n\t/******/ \t\t\texports: {},\n\t/******/ \t\t\tid: moduleId,\n\t/******/ \t\t\tloaded: false\n\t/******/ \t\t};\n\t\n\t/******/ \t\t// Execute the module function\n\t/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\n\t/******/ \t\t// Flag the module as loaded\n\t/******/ \t\tmodule.loaded = true;\n\t\n\t/******/ \t\t// Return the exports of the module\n\t/******/ \t\treturn module.exports;\n\t/******/ \t}\n\t\n\t\n\t/******/ \t// expose the modules object (__webpack_modules__)\n\t/******/ \t__webpack_require__.m = modules;\n\t\n\t/******/ \t// expose the module cache\n\t/******/ \t__webpack_require__.c = installedModules;\n\t\n\t/******/ \t// __webpack_public_path__\n\t/******/ \t__webpack_require__.p = \"\";\n\t\n\t/******/ \t// Load entry module and return exports\n\t/******/ \treturn __webpack_require__(0);\n\t/******/ })\n\t/************************************************************************/\n\t/******/ ([\n\t/* 0 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\t\n\t\texports.__esModule = true;\n\t\n\t\tvar _import = __webpack_require__(1);\n\t\n\t\tvar base = _interopRequireWildcard(_import);\n\t\n\t\t// Each of these augment the Handlebars object. No need to setup here.\n\t\t// (This is done to easily share code between commonjs and browse envs)\n\t\n\t\tvar _SafeString = __webpack_require__(2);\n\t\n\t\tvar _SafeString2 = _interopRequireWildcard(_SafeString);\n\t\n\t\tvar _Exception = __webpack_require__(3);\n\t\n\t\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\t\n\t\tvar _import2 = __webpack_require__(4);\n\t\n\t\tvar Utils = _interopRequireWildcard(_import2);\n\t\n\t\tvar _import3 = __webpack_require__(5);\n\t\n\t\tvar runtime = _interopRequireWildcard(_import3);\n\t\n\t\tvar _noConflict = __webpack_require__(6);\n\t\n\t\tvar _noConflict2 = _interopRequireWildcard(_noConflict);\n\t\n\t\t// For compatibility and usage outside of module systems, make the Handlebars object a namespace\n\t\tfunction create() {\n\t\t var hb = new base.HandlebarsEnvironment();\n\t\n\t\t Utils.extend(hb, base);\n\t\t hb.SafeString = _SafeString2['default'];\n\t\t hb.Exception = _Exception2['default'];\n\t\t hb.Utils = Utils;\n\t\t hb.escapeExpression = Utils.escapeExpression;\n\t\n\t\t hb.VM = runtime;\n\t\t hb.template = function (spec) {\n\t\t return runtime.template(spec, hb);\n\t\t };\n\t\n\t\t return hb;\n\t\t}\n\t\n\t\tvar inst = create();\n\t\tinst.create = create;\n\t\n\t\t_noConflict2['default'](inst);\n\t\n\t\tinst['default'] = inst;\n\t\n\t\texports['default'] = inst;\n\t\tmodule.exports = exports['default'];\n\t\n\t/***/ },\n\t/* 1 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\t\n\t\texports.__esModule = true;\n\t\texports.HandlebarsEnvironment = HandlebarsEnvironment;\n\t\texports.createFrame = createFrame;\n\t\n\t\tvar _import = __webpack_require__(4);\n\t\n\t\tvar Utils = _interopRequireWildcard(_import);\n\t\n\t\tvar _Exception = __webpack_require__(3);\n\t\n\t\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\t\n\t\tvar VERSION = '3.0.1';\n\t\texports.VERSION = VERSION;\n\t\tvar COMPILER_REVISION = 6;\n\t\n\t\texports.COMPILER_REVISION = COMPILER_REVISION;\n\t\tvar REVISION_CHANGES = {\n\t\t 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n\t\t 2: '== 1.0.0-rc.3',\n\t\t 3: '== 1.0.0-rc.4',\n\t\t 4: '== 1.x.x',\n\t\t 5: '== 2.0.0-alpha.x',\n\t\t 6: '>= 2.0.0-beta.1'\n\t\t};\n\t\n\t\texports.REVISION_CHANGES = REVISION_CHANGES;\n\t\tvar isArray = Utils.isArray,\n\t\t isFunction = Utils.isFunction,\n\t\t toString = Utils.toString,\n\t\t objectType = '[object Object]';\n\t\n\t\tfunction HandlebarsEnvironment(helpers, partials) {\n\t\t this.helpers = helpers || {};\n\t\t this.partials = partials || {};\n\t\n\t\t registerDefaultHelpers(this);\n\t\t}\n\t\n\t\tHandlebarsEnvironment.prototype = {\n\t\t constructor: HandlebarsEnvironment,\n\t\n\t\t logger: logger,\n\t\t log: log,\n\t\n\t\t registerHelper: function registerHelper(name, fn) {\n\t\t if (toString.call(name) === objectType) {\n\t\t if (fn) {\n\t\t throw new _Exception2['default']('Arg not supported with multiple helpers');\n\t\t }\n\t\t Utils.extend(this.helpers, name);\n\t\t } else {\n\t\t this.helpers[name] = fn;\n\t\t }\n\t\t },\n\t\t unregisterHelper: function unregisterHelper(name) {\n\t\t delete this.helpers[name];\n\t\t },\n\t\n\t\t registerPartial: function registerPartial(name, partial) {\n\t\t if (toString.call(name) === objectType) {\n\t\t Utils.extend(this.partials, name);\n\t\t } else {\n\t\t if (typeof partial === 'undefined') {\n\t\t throw new _Exception2['default']('Attempting to register a partial as undefined');\n\t\t }\n\t\t this.partials[name] = partial;\n\t\t }\n\t\t },\n\t\t unregisterPartial: function unregisterPartial(name) {\n\t\t delete this.partials[name];\n\t\t }\n\t\t};\n\t\n\t\tfunction registerDefaultHelpers(instance) {\n\t\t instance.registerHelper('helperMissing', function () {\n\t\t if (arguments.length === 1) {\n\t\t // A missing field in a {{foo}} constuct.\n\t\t return undefined;\n\t\t } else {\n\t\t // Someone is actually trying to call something, blow up.\n\t\t throw new _Exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n\t\t }\n\t\t });\n\t\n\t\t instance.registerHelper('blockHelperMissing', function (context, options) {\n\t\t var inverse = options.inverse,\n\t\t fn = options.fn;\n\t\n\t\t if (context === true) {\n\t\t return fn(this);\n\t\t } else if (context === false || context == null) {\n\t\t return inverse(this);\n\t\t } else if (isArray(context)) {\n\t\t if (context.length > 0) {\n\t\t if (options.ids) {\n\t\t options.ids = [options.name];\n\t\t }\n\t\n\t\t return instance.helpers.each(context, options);\n\t\t } else {\n\t\t return inverse(this);\n\t\t }\n\t\t } else {\n\t\t if (options.data && options.ids) {\n\t\t var data = createFrame(options.data);\n\t\t data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);\n\t\t options = { data: data };\n\t\t }\n\t\n\t\t return fn(context, options);\n\t\t }\n\t\t });\n\t\n\t\t instance.registerHelper('each', function (context, options) {\n\t\t if (!options) {\n\t\t throw new _Exception2['default']('Must pass iterator to #each');\n\t\t }\n\t\n\t\t var fn = options.fn,\n\t\t inverse = options.inverse,\n\t\t i = 0,\n\t\t ret = '',\n\t\t data = undefined,\n\t\t contextPath = undefined;\n\t\n\t\t if (options.data && options.ids) {\n\t\t contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n\t\t }\n\t\n\t\t if (isFunction(context)) {\n\t\t context = context.call(this);\n\t\t }\n\t\n\t\t if (options.data) {\n\t\t data = createFrame(options.data);\n\t\t }\n\t\n\t\t function execIteration(field, index, last) {\n\t\t if (data) {\n\t\t data.key = field;\n\t\t data.index = index;\n\t\t data.first = index === 0;\n\t\t data.last = !!last;\n\t\n\t\t if (contextPath) {\n\t\t data.contextPath = contextPath + field;\n\t\t }\n\t\t }\n\t\n\t\t ret = ret + fn(context[field], {\n\t\t data: data,\n\t\t blockParams: Utils.blockParams([context[field], field], [contextPath + field, null])\n\t\t });\n\t\t }\n\t\n\t\t if (context && typeof context === 'object') {\n\t\t if (isArray(context)) {\n\t\t for (var j = context.length; i < j; i++) {\n\t\t execIteration(i, i, i === context.length - 1);\n\t\t }\n\t\t } else {\n\t\t var priorKey = undefined;\n\t\n\t\t for (var key in context) {\n\t\t if (context.hasOwnProperty(key)) {\n\t\t // We're running the iterations one step out of sync so we can detect\n\t\t // the last iteration without have to scan the object twice and create\n\t\t // an itermediate keys array.\n\t\t if (priorKey) {\n\t\t execIteration(priorKey, i - 1);\n\t\t }\n\t\t priorKey = key;\n\t\t i++;\n\t\t }\n\t\t }\n\t\t if (priorKey) {\n\t\t execIteration(priorKey, i - 1, true);\n\t\t }\n\t\t }\n\t\t }\n\t\n\t\t if (i === 0) {\n\t\t ret = inverse(this);\n\t\t }\n\t\n\t\t return ret;\n\t\t });\n\t\n\t\t instance.registerHelper('if', function (conditional, options) {\n\t\t if (isFunction(conditional)) {\n\t\t conditional = conditional.call(this);\n\t\t }\n\t\n\t\t // Default behavior is to render the positive path if the value is truthy and not empty.\n\t\t // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n\t\t // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n\t\t if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) {\n\t\t return options.inverse(this);\n\t\t } else {\n\t\t return options.fn(this);\n\t\t }\n\t\t });\n\t\n\t\t instance.registerHelper('unless', function (conditional, options) {\n\t\t return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n\t\t });\n\t\n\t\t instance.registerHelper('with', function (context, options) {\n\t\t if (isFunction(context)) {\n\t\t context = context.call(this);\n\t\t }\n\t\n\t\t var fn = options.fn;\n\t\n\t\t if (!Utils.isEmpty(context)) {\n\t\t if (options.data && options.ids) {\n\t\t var data = createFrame(options.data);\n\t\t data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);\n\t\t options = { data: data };\n\t\t }\n\t\n\t\t return fn(context, options);\n\t\t } else {\n\t\t return options.inverse(this);\n\t\t }\n\t\t });\n\t\n\t\t instance.registerHelper('log', function (message, options) {\n\t\t var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;\n\t\t instance.log(level, message);\n\t\t });\n\t\n\t\t instance.registerHelper('lookup', function (obj, field) {\n\t\t return obj && obj[field];\n\t\t });\n\t\t}\n\t\n\t\tvar logger = {\n\t\t methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },\n\t\n\t\t // State enum\n\t\t DEBUG: 0,\n\t\t INFO: 1,\n\t\t WARN: 2,\n\t\t ERROR: 3,\n\t\t level: 1,\n\t\n\t\t // Can be overridden in the host environment\n\t\t log: function log(level, message) {\n\t\t if (typeof console !== 'undefined' && logger.level <= level) {\n\t\t var method = logger.methodMap[level];\n\t\t (console[method] || console.log).call(console, message); // eslint-disable-line no-console\n\t\t }\n\t\t }\n\t\t};\n\t\n\t\texports.logger = logger;\n\t\tvar log = logger.log;\n\t\n\t\texports.log = log;\n\t\n\t\tfunction createFrame(object) {\n\t\t var frame = Utils.extend({}, object);\n\t\t frame._parent = object;\n\t\t return frame;\n\t\t}\n\t\n\t\t/* [args, ]options */\n\t\n\t/***/ },\n\t/* 2 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\texports.__esModule = true;\n\t\t// Build out our basic SafeString type\n\t\tfunction SafeString(string) {\n\t\t this.string = string;\n\t\t}\n\t\n\t\tSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n\t\t return '' + this.string;\n\t\t};\n\t\n\t\texports['default'] = SafeString;\n\t\tmodule.exports = exports['default'];\n\t\n\t/***/ },\n\t/* 3 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\texports.__esModule = true;\n\t\n\t\tvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\t\n\t\tfunction Exception(message, node) {\n\t\t var loc = node && node.loc,\n\t\t line = undefined,\n\t\t column = undefined;\n\t\t if (loc) {\n\t\t line = loc.start.line;\n\t\t column = loc.start.column;\n\t\n\t\t message += ' - ' + line + ':' + column;\n\t\t }\n\t\n\t\t var tmp = Error.prototype.constructor.call(this, message);\n\t\n\t\t // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n\t\t for (var idx = 0; idx < errorProps.length; idx++) {\n\t\t this[errorProps[idx]] = tmp[errorProps[idx]];\n\t\t }\n\t\n\t\t if (Error.captureStackTrace) {\n\t\t Error.captureStackTrace(this, Exception);\n\t\t }\n\t\n\t\t if (loc) {\n\t\t this.lineNumber = line;\n\t\t this.column = column;\n\t\t }\n\t\t}\n\t\n\t\tException.prototype = new Error();\n\t\n\t\texports['default'] = Exception;\n\t\tmodule.exports = exports['default'];\n\t\n\t/***/ },\n\t/* 4 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\texports.__esModule = true;\n\t\texports.extend = extend;\n\t\n\t\t// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\t\texports.indexOf = indexOf;\n\t\texports.escapeExpression = escapeExpression;\n\t\texports.isEmpty = isEmpty;\n\t\texports.blockParams = blockParams;\n\t\texports.appendContextPath = appendContextPath;\n\t\tvar escape = {\n\t\t '&': '&',\n\t\t '<': '<',\n\t\t '>': '>',\n\t\t '\"': '"',\n\t\t '\\'': ''',\n\t\t '`': '`'\n\t\t};\n\t\n\t\tvar badChars = /[&<>\"'`]/g,\n\t\t possible = /[&<>\"'`]/;\n\t\n\t\tfunction escapeChar(chr) {\n\t\t return escape[chr];\n\t\t}\n\t\n\t\tfunction extend(obj /* , ...source */) {\n\t\t for (var i = 1; i < arguments.length; i++) {\n\t\t for (var key in arguments[i]) {\n\t\t if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n\t\t obj[key] = arguments[i][key];\n\t\t }\n\t\t }\n\t\t }\n\t\n\t\t return obj;\n\t\t}\n\t\n\t\tvar toString = Object.prototype.toString;\n\t\n\t\texports.toString = toString;\n\t\t// Sourced from lodash\n\t\t// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n\t\t/*eslint-disable func-style, no-var */\n\t\tvar isFunction = function isFunction(value) {\n\t\t return typeof value === 'function';\n\t\t};\n\t\t// fallback for older versions of Chrome and Safari\n\t\t/* istanbul ignore next */\n\t\tif (isFunction(/x/)) {\n\t\t exports.isFunction = isFunction = function (value) {\n\t\t return typeof value === 'function' && toString.call(value) === '[object Function]';\n\t\t };\n\t\t}\n\t\tvar isFunction;\n\t\texports.isFunction = isFunction;\n\t\t/*eslint-enable func-style, no-var */\n\t\n\t\t/* istanbul ignore next */\n\t\tvar isArray = Array.isArray || function (value) {\n\t\t return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n\t\t};exports.isArray = isArray;\n\t\n\t\tfunction indexOf(array, value) {\n\t\t for (var i = 0, len = array.length; i < len; i++) {\n\t\t if (array[i] === value) {\n\t\t return i;\n\t\t }\n\t\t }\n\t\t return -1;\n\t\t}\n\t\n\t\tfunction escapeExpression(string) {\n\t\t if (typeof string !== 'string') {\n\t\t // don't escape SafeStrings, since they're already safe\n\t\t if (string && string.toHTML) {\n\t\t return string.toHTML();\n\t\t } else if (string == null) {\n\t\t return '';\n\t\t } else if (!string) {\n\t\t return string + '';\n\t\t }\n\t\n\t\t // Force a string conversion as this will be done by the append regardless and\n\t\t // the regex test will do this transparently behind the scenes, causing issues if\n\t\t // an object's to string has escaped characters in it.\n\t\t string = '' + string;\n\t\t }\n\t\n\t\t if (!possible.test(string)) {\n\t\t return string;\n\t\t }\n\t\t return string.replace(badChars, escapeChar);\n\t\t}\n\t\n\t\tfunction isEmpty(value) {\n\t\t if (!value && value !== 0) {\n\t\t return true;\n\t\t } else if (isArray(value) && value.length === 0) {\n\t\t return true;\n\t\t } else {\n\t\t return false;\n\t\t }\n\t\t}\n\t\n\t\tfunction blockParams(params, ids) {\n\t\t params.path = ids;\n\t\t return params;\n\t\t}\n\t\n\t\tfunction appendContextPath(contextPath, id) {\n\t\t return (contextPath ? contextPath + '.' : '') + id;\n\t\t}\n\t\n\t/***/ },\n\t/* 5 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\t\n\t\texports.__esModule = true;\n\t\texports.checkRevision = checkRevision;\n\t\n\t\t// TODO: Remove this line and break up compilePartial\n\t\n\t\texports.template = template;\n\t\texports.wrapProgram = wrapProgram;\n\t\texports.resolvePartial = resolvePartial;\n\t\texports.invokePartial = invokePartial;\n\t\texports.noop = noop;\n\t\n\t\tvar _import = __webpack_require__(4);\n\t\n\t\tvar Utils = _interopRequireWildcard(_import);\n\t\n\t\tvar _Exception = __webpack_require__(3);\n\t\n\t\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\t\n\t\tvar _COMPILER_REVISION$REVISION_CHANGES$createFrame = __webpack_require__(1);\n\t\n\t\tfunction checkRevision(compilerInfo) {\n\t\t var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n\t\t currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION;\n\t\n\t\t if (compilerRevision !== currentRevision) {\n\t\t if (compilerRevision < currentRevision) {\n\t\t var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision],\n\t\t compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision];\n\t\t throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n\t\t } else {\n\t\t // Use the embedded version info since the runtime doesn't know about this revision yet\n\t\t throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n\t\t }\n\t\t }\n\t\t}\n\t\n\t\tfunction template(templateSpec, env) {\n\t\t /* istanbul ignore next */\n\t\t if (!env) {\n\t\t throw new _Exception2['default']('No environment passed to template');\n\t\t }\n\t\t if (!templateSpec || !templateSpec.main) {\n\t\t throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec);\n\t\t }\n\t\n\t\t // Note: Using env.VM references rather than local var references throughout this section to allow\n\t\t // for external users to override these as psuedo-supported APIs.\n\t\t env.VM.checkRevision(templateSpec.compiler);\n\t\n\t\t function invokePartialWrapper(partial, context, options) {\n\t\t if (options.hash) {\n\t\t context = Utils.extend({}, context, options.hash);\n\t\t }\n\t\n\t\t partial = env.VM.resolvePartial.call(this, partial, context, options);\n\t\t var result = env.VM.invokePartial.call(this, partial, context, options);\n\t\n\t\t if (result == null && env.compile) {\n\t\t options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n\t\t result = options.partials[options.name](context, options);\n\t\t }\n\t\t if (result != null) {\n\t\t if (options.indent) {\n\t\t var lines = result.split('\\n');\n\t\t for (var i = 0, l = lines.length; i < l; i++) {\n\t\t if (!lines[i] && i + 1 === l) {\n\t\t break;\n\t\t }\n\t\n\t\t lines[i] = options.indent + lines[i];\n\t\t }\n\t\t result = lines.join('\\n');\n\t\t }\n\t\t return result;\n\t\t } else {\n\t\t throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n\t\t }\n\t\t }\n\t\n\t\t // Just add water\n\t\t var container = {\n\t\t strict: function strict(obj, name) {\n\t\t if (!(name in obj)) {\n\t\t throw new _Exception2['default']('\"' + name + '\" not defined in ' + obj);\n\t\t }\n\t\t return obj[name];\n\t\t },\n\t\t lookup: function lookup(depths, name) {\n\t\t var len = depths.length;\n\t\t for (var i = 0; i < len; i++) {\n\t\t if (depths[i] && depths[i][name] != null) {\n\t\t return depths[i][name];\n\t\t }\n\t\t }\n\t\t },\n\t\t lambda: function lambda(current, context) {\n\t\t return typeof current === 'function' ? current.call(context) : current;\n\t\t },\n\t\n\t\t escapeExpression: Utils.escapeExpression,\n\t\t invokePartial: invokePartialWrapper,\n\t\n\t\t fn: function fn(i) {\n\t\t return templateSpec[i];\n\t\t },\n\t\n\t\t programs: [],\n\t\t program: function program(i, data, declaredBlockParams, blockParams, depths) {\n\t\t var programWrapper = this.programs[i],\n\t\t fn = this.fn(i);\n\t\t if (data || depths || blockParams || declaredBlockParams) {\n\t\t programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n\t\t } else if (!programWrapper) {\n\t\t programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n\t\t }\n\t\t return programWrapper;\n\t\t },\n\t\n\t\t data: function data(value, depth) {\n\t\t while (value && depth--) {\n\t\t value = value._parent;\n\t\t }\n\t\t return value;\n\t\t },\n\t\t merge: function merge(param, common) {\n\t\t var obj = param || common;\n\t\n\t\t if (param && common && param !== common) {\n\t\t obj = Utils.extend({}, common, param);\n\t\t }\n\t\n\t\t return obj;\n\t\t },\n\t\n\t\t noop: env.VM.noop,\n\t\t compilerInfo: templateSpec.compiler\n\t\t };\n\t\n\t\t function ret(context) {\n\t\t var options = arguments[1] === undefined ? {} : arguments[1];\n\t\n\t\t var data = options.data;\n\t\n\t\t ret._setup(options);\n\t\t if (!options.partial && templateSpec.useData) {\n\t\t data = initData(context, data);\n\t\t }\n\t\t var depths = undefined,\n\t\t blockParams = templateSpec.useBlockParams ? [] : undefined;\n\t\t if (templateSpec.useDepths) {\n\t\t depths = options.depths ? [context].concat(options.depths) : [context];\n\t\t }\n\t\n\t\t return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths);\n\t\t }\n\t\t ret.isTop = true;\n\t\n\t\t ret._setup = function (options) {\n\t\t if (!options.partial) {\n\t\t container.helpers = container.merge(options.helpers, env.helpers);\n\t\n\t\t if (templateSpec.usePartial) {\n\t\t container.partials = container.merge(options.partials, env.partials);\n\t\t }\n\t\t } else {\n\t\t container.helpers = options.helpers;\n\t\t container.partials = options.partials;\n\t\t }\n\t\t };\n\t\n\t\t ret._child = function (i, data, blockParams, depths) {\n\t\t if (templateSpec.useBlockParams && !blockParams) {\n\t\t throw new _Exception2['default']('must pass block params');\n\t\t }\n\t\t if (templateSpec.useDepths && !depths) {\n\t\t throw new _Exception2['default']('must pass parent depths');\n\t\t }\n\t\n\t\t return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n\t\t };\n\t\t return ret;\n\t\t}\n\t\n\t\tfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n\t\t function prog(context) {\n\t\t var options = arguments[1] === undefined ? {} : arguments[1];\n\t\n\t\t return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths));\n\t\t }\n\t\t prog.program = i;\n\t\t prog.depth = depths ? depths.length : 0;\n\t\t prog.blockParams = declaredBlockParams || 0;\n\t\t return prog;\n\t\t}\n\t\n\t\tfunction resolvePartial(partial, context, options) {\n\t\t if (!partial) {\n\t\t partial = options.partials[options.name];\n\t\t } else if (!partial.call && !options.name) {\n\t\t // This is a dynamic partial that returned a string\n\t\t options.name = partial;\n\t\t partial = options.partials[partial];\n\t\t }\n\t\t return partial;\n\t\t}\n\t\n\t\tfunction invokePartial(partial, context, options) {\n\t\t options.partial = true;\n\t\n\t\t if (partial === undefined) {\n\t\t throw new _Exception2['default']('The partial ' + options.name + ' could not be found');\n\t\t } else if (partial instanceof Function) {\n\t\t return partial(context, options);\n\t\t }\n\t\t}\n\t\n\t\tfunction noop() {\n\t\t return '';\n\t\t}\n\t\n\t\tfunction initData(context, data) {\n\t\t if (!data || !('root' in data)) {\n\t\t data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {};\n\t\t data.root = context;\n\t\t }\n\t\t return data;\n\t\t}\n\t\n\t/***/ },\n\t/* 6 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\t\texports.__esModule = true;\n\t\t/*global window */\n\t\n\t\texports['default'] = function (Handlebars) {\n\t\t /* istanbul ignore next */\n\t\t var root = typeof global !== 'undefined' ? global : window,\n\t\t $Handlebars = root.Handlebars;\n\t\t /* istanbul ignore next */\n\t\t Handlebars.noConflict = function () {\n\t\t if (root.Handlebars === Handlebars) {\n\t\t root.Handlebars = $Handlebars;\n\t\t }\n\t\t };\n\t\t};\n\t\n\t\tmodule.exports = exports['default'];\n\t\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\t\n\t/***/ },\n\t/* 7 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t\"use strict\";\n\t\n\t\texports[\"default\"] = function (obj) {\n\t\t return obj && obj.__esModule ? obj : {\n\t\t \"default\": obj\n\t\t };\n\t\t};\n\t\n\t\texports.__esModule = true;\n\t\n\t/***/ }\n\t/******/ ])\n\t});\n\t;\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/*! jQuery UI - v1.9.1 - 2012-10-29\n\t* http://jqueryui.com\n\t* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.menu.js, jquery.ui.slider.js\n\t* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */\n\t\n\t(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return\"area\"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!==\"map\"?!1:(o=e(\"img[usemap=#\"+i+\"]\")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:\"a\"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().andSelf().filter(function(){return e.css(this,\"visibility\")===\"hidden\"}).length}var n=0,r=/^ui-id-\\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:\"1.9.1\",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t==\"number\"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css(\"position\"))||/absolute/.test(this.css(\"position\"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,\"position\"))&&/(auto|scroll)/.test(e.css(this,\"overflow\")+e.css(this,\"overflow-y\")+e.css(this,\"overflow-x\"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,\"overflow\")+e.css(this,\"overflow-y\")+e.css(this,\"overflow-x\"))}).eq(0),/fixed/.test(this.css(\"position\"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css(\"zIndex\",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css(\"position\");if(i===\"absolute\"||i===\"relative\"||i===\"fixed\"){s=parseInt(r.css(\"zIndex\"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id=\"ui-id-\"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr(\"id\")})}}),e(\"\").outerWidth(1).jquery||e.each([\"Width\",\"Height\"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,\"padding\"+this))||0,r&&(n-=parseFloat(e.css(t,\"border\"+this+\"Width\"))||0),s&&(n-=parseFloat(e.css(t,\"margin\"+this))||0)}),n}var i=r===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn[\"inner\"+r]=function(n){return n===t?o[\"inner\"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+\"px\")})},e.fn[\"outer\"+r]=function(t,n){return typeof t!=\"number\"?o[\"outer\"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+\"px\")})}}),e.extend(e.expr[\":\"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,\"tabindex\")))},tabbable:function(t){var n=e.attr(t,\"tabindex\"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e(function(){var t=document.body,n=t.appendChild(n=document.createElement(\"div\"));n.offsetHeight,e.extend(n.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0}),e.support.minHeight=n.offsetHeight===100,e.support.selectstart=\"onselectstart\"in n,t.removeChild(n).style.display=\"none\"}),function(){var t=/msie ([\\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];e.ui.ie=t.length?!0:!1,e.ui.ie6=parseFloat(t[1],10)===6}(),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)},isOverAxis:function(e,t,n){return e>t&&e\",options:{disabled:!1,create:null},_createWidget:function(t,r){r=e(r||this.defaultElement||this)[0],this.element=e(r),this.uuid=n++,this.eventNamespace=\".\"+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),r!==this&&(e.data(r,this.widgetName,this),e.data(r,this.widgetFullName,this),this._on(this.element,{remove:function(e){e.target===r&&this.destroy()}}),this.document=e(r.style?r.ownerDocument:r.document||r),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger(\"create\",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr(\"aria-disabled\").removeClass(this.widgetFullName+\"-disabled \"+\"ui-state-disabled\"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass(\"ui-state-hover\"),this.focusable.removeClass(\"ui-state-focus\")},_destroy:e.noop,widget:function(){return this.element},option:function(n,r){var i=n,s,o,u;if(arguments.length===0)return e.widget.extend({},this.options);if(typeof n==\"string\"){i={},s=n.split(\".\"),n=s.shift();if(s.length){o=i[n]=e.widget.extend({},this.options[n]);for(u=0;u=9||!!t.button?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return e(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+\".preventClickEvent\",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(e){return this.mouseDelayMet},_mouseStart:function(e){},_mouseDrag:function(e){},_mouseStop:function(e){},_mouseCapture:function(e){return!0}})})(jQuery);(function(e,t){function h(e,t,n){return[parseInt(e[0],10)*(l.test(e[0])?t/100:1),parseInt(e[1],10)*(l.test(e[1])?n/100:1)]}function p(t,n){return parseInt(e.css(t,n),10)||0}e.ui=e.ui||{};var n,r=Math.max,i=Math.abs,s=Math.round,o=/left|center|right/,u=/top|center|bottom/,a=/[\\+\\-]\\d+%?/,f=/^\\w+/,l=/%$/,c=e.fn.position;e.position={scrollbarWidth:function(){if(n!==t)return n;var r,i,s=e(\"
                                    \"),o=s.children()[0];return e(\"body\").append(s),r=o.offsetWidth,s.css(\"overflow\",\"scroll\"),i=o.offsetWidth,r===i&&(i=s[0].clientWidth),s.remove(),n=r-i},getScrollInfo:function(t){var n=t.isWindow?\"\":t.element.css(\"overflow-x\"),r=t.isWindow?\"\":t.element.css(\"overflow-y\"),i=n===\"scroll\"||n===\"auto\"&&t.width0?\"right\":\"center\",vertical:u<0?\"top\":o>0?\"bottom\":\"middle\"};lr(i(o),i(u))?h.important=\"horizontal\":h.important=\"vertical\",t.using.call(this,e,h)}),a.offset(e.extend(C,{using:u}))})},e.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=e.left-t.collisionPosition.marginLeft,u=i-o,a=o+t.collisionWidth-s-i,f;t.collisionWidth>s?u>0&&a<=0?(f=e.left+u+t.collisionWidth-s-i,e.left+=u-f):a>0&&u<=0?e.left=i:u>a?e.left=i+s-t.collisionWidth:e.left=i:u>0?e.left+=u:a>0?e.left-=a:e.left=r(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,s=t.within.height,o=e.top-t.collisionPosition.marginTop,u=i-o,a=o+t.collisionHeight-s-i,f;t.collisionHeight>s?u>0&&a<=0?(f=e.top+u+t.collisionHeight-s-i,e.top+=u-f):a>0&&u<=0?e.top=i:u>a?e.top=i+s-t.collisionHeight:e.top=i:u>0?e.top+=u:a>0?e.top-=a:e.top=r(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,s=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,u=e.left-t.collisionPosition.marginLeft,a=u-o,f=u+t.collisionWidth-s-o,l=t.my[0]===\"left\"?-t.elemWidth:t.my[0]===\"right\"?t.elemWidth:0,c=t.at[0]===\"left\"?t.targetWidth:t.at[0]===\"right\"?-t.targetWidth:0,h=-2*t.offset[0],p,d;if(a<0){p=e.left+l+c+h+t.collisionWidth-s-r;if(p<0||p0){d=e.left-t.collisionPosition.marginLeft+l+c+h-o;if(d>0||i(d)a&&(v<0||v0&&(d=e.top-t.collisionPosition.marginTop+c+h+p-o,e.top+c+h+p>f&&(d>0||i(d)10&&i<11,t.innerHTML=\"\",n.removeChild(t)}(),e.uiBackCompat!==!1&&function(e){var n=e.fn.position;e.fn.position=function(r){if(!r||!r.offset)return n.call(this,r);var i=r.offset.split(\" \"),s=r.at.split(\" \");return i.length===1&&(i[1]=i[0]),/^\\d/.test(i[0])&&(i[0]=\"+\"+i[0]),/^\\d/.test(i[1])&&(i[1]=\"+\"+i[1]),s.length===1&&(/left|center|right/.test(s[0])?s[1]=\"center\":(s[1]=s[0],s[0]=\"center\")),n.call(this,e.extend(r,{at:s[0]+i[0]+\" \"+s[1]+i[1],offset:t}))}}(jQuery)})(jQuery);(function(e,t){var n=0;e.widget(\"ui.autocomplete\",{version:\"1.9.1\",defaultElement:\"\",options:{appendTo:\"body\",autoFocus:!1,delay:300,minLength:1,position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var t,n,r;this.isMultiLine=this._isMultiLine(),this.valueMethod=this.element[this.element.is(\"input,textarea\")?\"val\":\"text\"],this.isNewMenu=!0,this.element.addClass(\"ui-autocomplete-input\").attr(\"autocomplete\",\"off\"),this._on(this.element,{keydown:function(i){if(this.element.prop(\"readOnly\")){t=!0,r=!0,n=!0;return}t=!1,r=!1,n=!1;var s=e.ui.keyCode;switch(i.keyCode){case s.PAGE_UP:t=!0,this._move(\"previousPage\",i);break;case s.PAGE_DOWN:t=!0,this._move(\"nextPage\",i);break;case s.UP:t=!0,this._keyEvent(\"previous\",i);break;case s.DOWN:t=!0,this._keyEvent(\"next\",i);break;case s.ENTER:case s.NUMPAD_ENTER:this.menu.active&&(t=!0,i.preventDefault(),this.menu.select(i));break;case s.TAB:this.menu.active&&this.menu.select(i);break;case s.ESCAPE:this.menu.element.is(\":visible\")&&(this._value(this.term),this.close(i),i.preventDefault());break;default:n=!0,this._searchTimeout(i)}},keypress:function(r){if(t){t=!1,r.preventDefault();return}if(n)return;var i=e.ui.keyCode;switch(r.keyCode){case i.PAGE_UP:this._move(\"previousPage\",r);break;case i.PAGE_DOWN:this._move(\"nextPage\",r);break;case i.UP:this._keyEvent(\"previous\",r);break;case i.DOWN:this._keyEvent(\"next\",r)}},input:function(e){if(r){r=!1,e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}clearTimeout(this.searching),this.close(e),this._change(e)}}),this._initSource(),this.menu=e(\"
                                      \").addClass(\"ui-autocomplete\").appendTo(this.document.find(this.options.appendTo||\"body\")[0]).menu({input:e(),role:null}).zIndex(this.element.zIndex()+1).hide().data(\"menu\"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var n=this.menu.element[0];e(t.target).closest(\".ui-menu-item\").length||this._delay(function(){var t=this;this.document.one(\"mousedown\",function(r){r.target!==t.element[0]&&r.target!==n&&!e.contains(n,r.target)&&t.close()})})},menufocus:function(t,n){if(this.isNewMenu){this.isNewMenu=!1;if(t.originalEvent&&/^mouse/.test(t.originalEvent.type)){this.menu.blur(),this.document.one(\"mousemove\",function(){e(t.target).trigger(t.originalEvent)});return}}var r=n.item.data(\"ui-autocomplete-item\")||n.item.data(\"item.autocomplete\");!1!==this._trigger(\"focus\",t,{item:r})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(r.value):this.liveRegion.text(r.value)},menuselect:function(e,t){var n=t.item.data(\"ui-autocomplete-item\")||t.item.data(\"item.autocomplete\"),r=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger(\"select\",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=e(\"\",{role:\"status\",\"aria-live\":\"polite\"}).addClass(\"ui-helper-hidden-accessible\").insertAfter(this.element),e.fn.bgiframe&&this.menu.element.bgiframe(),this._on(this.window,{beforeunload:function(){this.element.removeAttr(\"autocomplete\")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass(\"ui-autocomplete-input\").removeAttr(\"autocomplete\"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),e===\"source\"&&this._initSource(),e===\"appendTo\"&&this.menu.element.appendTo(this.document.find(t||\"body\")[0]),e===\"disabled\"&&t&&this.xhr&&this.xhr.abort()},_isMultiLine:function(){return this.element.is(\"textarea\")?!0:this.element.is(\"input\")?!1:this.element.prop(\"isContentEditable\")},_initSource:function(){var t,n,r=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(n,r){r(e.ui.autocomplete.filter(t,n.term))}):typeof this.options.source==\"string\"?(n=this.options.source,this.source=function(t,i){r.xhr&&r.xhr.abort(),r.xhr=e.ajax({url:n,data:t,dataType:\"json\",success:function(e){i(e)},error:function(){i([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){e=e!=null?e:this._value(),this.term=this._value();if(e.length\").append(e(\"\").text(n.label)).appendTo(t)},_move:function(e,t){if(!this.menu.element.is(\":visible\")){this.search(null,t);return}if(this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)){this._value(this.term),this.menu.blur();return}this.menu[e](t)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){if(!this.isMultiLine||this.menu.element.is(\":visible\"))this._move(e,t),t.preventDefault()}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")},filter:function(t,n){var r=new RegExp(e.ui.autocomplete.escapeRegex(n),\"i\");return e.grep(t,function(e){return r.test(e.label||e.value||e)})}}),e.widget(\"ui.autocomplete\",e.ui.autocomplete,{options:{messages:{noResults:\"No search results.\",results:function(e){return e+(e>1?\" results are\":\" result is\")+\" available, use up and down arrow keys to navigate.\"}}},__response:function(e){var t;this._superApply(arguments);if(this.options.disabled||this.cancelSearch)return;e&&e.length?t=this.options.messages.results(e.length):t=this.options.messages.noResults,this.liveRegion.text(t)}})})(jQuery);(function(e,t){var n,r,i,s,o=\"ui-button ui-widget ui-state-default ui-corner-all\",u=\"ui-state-hover ui-state-active \",a=\"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",f=function(){var t=e(this).find(\":ui-button\");setTimeout(function(){t.button(\"refresh\")},1)},l=function(t){var n=t.name,r=t.form,i=e([]);return n&&(r?i=e(r).find(\"[name='\"+n+\"']\"):i=e(\"[name='\"+n+\"']\",t.ownerDocument).filter(function(){return!this.form})),i};e.widget(\"ui.button\",{version:\"1.9.1\",defaultElement:\"
                                    \"\n )\n });\n modal.show( { backdrop: true } );\n}\n\n\n// ============================================================================\n return {\n Modal : Modal,\n hide_modal : hide_modal,\n show_modal : show_modal,\n show_message : show_message,\n show_in_overlay : show_in_overlay,\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/layout/modal.js\n ** module id = 83\n ** module chunks = 2\n **/","define([\n 'layout/masthead',\n 'layout/panel',\n 'mvc/ui/ui-modal',\n 'mvc/base-mvc'\n], function( Masthead, Panel, Modal, BaseMVC ) {\n\n// ============================================================================\nvar PageLayoutView = Backbone.View.extend( BaseMVC.LoggableMixin ).extend({\n _logNamespace : 'layout',\n\n el : 'body',\n className : 'full-content',\n\n _panelIds : [\n 'left', 'center', 'right'\n ],\n\n defaultOptions : {\n message_box_visible : false,\n message_box_content : '',\n message_box_class : 'info',\n show_inactivity_warning : false,\n inactivity_box_content : ''\n },\n\n initialize : function( options ) {\n // TODO: remove globals\n this.log( this + '.initialize:', options );\n _.extend( this, _.pick( options, this._panelIds ) );\n this.options = _.defaults( _.omit( options, this._panelIds ), this.defaultOptions );\n Galaxy.modal = this.modal = new Modal.View();\n this.masthead = new Masthead.View( this.options.config );\n this.$el.attr( 'scroll', 'no' );\n this.$el.html( this._template() );\n this.$el.append( this.masthead.frame.$el );\n this.$el.append( this.masthead.$el );\n this.$el.append( this.modal.$el );\n this.$messagebox = this.$( '#messagebox' );\n this.$inactivebox = this.$( '#inactivebox' );\n },\n\n render : function() {\n // TODO: Remove this line after select2 update\n $( '.select2-hidden-accessible' ).remove();\n this.log( this + '.render:' );\n this.masthead.render();\n this.renderMessageBox();\n this.renderInactivityBox();\n this.renderPanels();\n return this;\n },\n\n /** Render message box */\n renderMessageBox : function() {\n if ( this.options.message_box_visible ){\n var content = this.options.message_box_content || '';\n var level = this.options.message_box_class || 'info';\n this.$el.addClass( 'has-message-box' );\n this.$messagebox\n .attr( 'class', 'panel-' + level + '-message' )\n .html( content )\n .toggle( !!content )\n .show();\n } else {\n this.$el.removeClass( 'has-message-box' );\n this.$messagebox.hide();\n }\n return this;\n },\n\n /** Render inactivity warning */\n renderInactivityBox : function() {\n if( this.options.show_inactivity_warning ){\n var content = this.options.inactivity_box_content || '';\n var verificationLink = $( '
                                    ' ).attr( 'href', Galaxy.root + 'user/resend_verification' ).text( 'Resend verification' );\n this.$el.addClass( 'has-inactivity-box' );\n this.$inactivebox\n .html( content + ' ' )\n .append( verificationLink )\n .toggle( !!content )\n .show();\n } else {\n this.$el.removeClass( 'has-inactivity-box' );\n this.$inactivebox.hide();\n }\n return this;\n },\n\n /** Render panels */\n renderPanels : function() {\n var page = this;\n this._panelIds.forEach( function( panelId ){\n if( _.has( page, panelId ) ){\n page[ panelId ].setElement( '#' + panelId );\n page[ panelId ].render();\n }\n });\n if( !this.left ){\n this.center.$el.css( 'left', 0 );\n }\n if( !this.right ){\n this.center.$el.css( 'right', 0 );\n }\n return this;\n },\n\n /** body template */\n _template: function() {\n return [\n '
                                    ',\n '
                                    ',\n '
                                    ',\n '
                                    ',\n this.left? '
                                    ' : '',\n this.center? '
                                    ' : '',\n this.right? '
                                    ' : '',\n '
                                    ',\n '
                                    ',\n ].join('');\n },\n\n /** hide both side panels if previously shown */\n hideSidePanels : function(){\n if( this.left ){\n this.left.hide();\n }\n if( this.right ){\n this.right.hide();\n }\n },\n\n toString : function() { return 'PageLayoutView'; }\n});\n\n// ============================================================================\n return {\n PageLayoutView: PageLayoutView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/layout/page.js\n ** module id = 84\n ** module chunks = 2\n **/","/* ========================================================================\n * bootstrap-tour - v0.10.1\n * http://bootstraptour.com\n * ========================================================================\n * Copyright 2012-2013 Ulrich Sossou\n *\n * ========================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================================\n */\n\n(function($, window) {\n var Tour, document;\n document = window.document;\n Tour = (function() {\n function Tour(options) {\n var storage;\n try {\n storage = window.localStorage;\n } catch (_error) {\n storage = false;\n }\n this._options = $.extend({\n name: 'tour',\n steps: [],\n container: 'body',\n autoscroll: true,\n keyboard: true,\n storage: storage,\n debug: false,\n backdrop: false,\n backdropPadding: 0,\n redirect: true,\n orphan: false,\n duration: false,\n delay: false,\n basePath: '',\n template: '

                                    ',\n afterSetState: function(key, value) {},\n afterGetState: function(key, value) {},\n afterRemoveState: function(key) {},\n onStart: function(tour) {},\n onEnd: function(tour) {},\n onShow: function(tour) {},\n onShown: function(tour) {},\n onHide: function(tour) {},\n onHidden: function(tour) {},\n onNext: function(tour) {},\n onPrev: function(tour) {},\n onPause: function(tour, duration) {},\n onResume: function(tour, duration) {}\n }, options);\n this._force = false;\n this._inited = false;\n this.backdrop = {\n overlay: null,\n $element: null,\n $background: null,\n backgroundShown: false,\n overlayElementShown: false\n };\n this;\n }\n\n Tour.prototype.addSteps = function(steps) {\n var step, _i, _len;\n for (_i = 0, _len = steps.length; _i < _len; _i++) {\n step = steps[_i];\n this.addStep(step);\n }\n return this;\n };\n\n Tour.prototype.addStep = function(step) {\n this._options.steps.push(step);\n return this;\n };\n\n Tour.prototype.getStep = function(i) {\n if (this._options.steps[i] != null) {\n return $.extend({\n id: \"step-\" + i,\n path: '',\n placement: 'right',\n title: '',\n content: '

                                    ',\n next: i === this._options.steps.length - 1 ? -1 : i + 1,\n prev: i - 1,\n animation: true,\n container: this._options.container,\n autoscroll: this._options.autoscroll,\n backdrop: this._options.backdrop,\n backdropPadding: this._options.backdropPadding,\n redirect: this._options.redirect,\n orphan: this._options.orphan,\n duration: this._options.duration,\n delay: this._options.delay,\n template: this._options.template,\n onShow: this._options.onShow,\n onShown: this._options.onShown,\n onHide: this._options.onHide,\n onHidden: this._options.onHidden,\n onNext: this._options.onNext,\n onPrev: this._options.onPrev,\n onPause: this._options.onPause,\n onResume: this._options.onResume\n }, this._options.steps[i]);\n }\n };\n\n Tour.prototype.init = function(force) {\n this._force = force;\n if (this.ended()) {\n this._debug('Tour ended, init prevented.');\n return this;\n }\n this.setCurrentStep();\n this._initMouseNavigation();\n this._initKeyboardNavigation();\n this._onResize((function(_this) {\n return function() {\n return _this.showStep(_this._current);\n };\n })(this));\n if (this._current !== null) {\n this.showStep(this._current);\n }\n this._inited = true;\n return this;\n };\n\n Tour.prototype.start = function(force) {\n var promise;\n if (force == null) {\n force = false;\n }\n if (!this._inited) {\n this.init(force);\n }\n if (this._current === null) {\n promise = this._makePromise(this._options.onStart != null ? this._options.onStart(this) : void 0);\n this._callOnPromiseDone(promise, this.showStep, 0);\n }\n return this;\n };\n\n Tour.prototype.next = function() {\n var promise;\n promise = this.hideStep(this._current);\n return this._callOnPromiseDone(promise, this._showNextStep);\n };\n\n Tour.prototype.prev = function() {\n var promise;\n promise = this.hideStep(this._current);\n return this._callOnPromiseDone(promise, this._showPrevStep);\n };\n\n Tour.prototype.goTo = function(i) {\n var promise;\n promise = this.hideStep(this._current);\n return this._callOnPromiseDone(promise, this.showStep, i);\n };\n\n Tour.prototype.end = function() {\n var endHelper, promise;\n endHelper = (function(_this) {\n return function(e) {\n $(document).off(\"click.tour-\" + _this._options.name);\n $(document).off(\"keyup.tour-\" + _this._options.name);\n $(window).off(\"resize.tour-\" + _this._options.name);\n _this._setState('end', 'yes');\n _this._inited = false;\n _this._force = false;\n _this._clearTimer();\n if (_this._options.onEnd != null) {\n return _this._options.onEnd(_this);\n }\n };\n })(this);\n promise = this.hideStep(this._current);\n return this._callOnPromiseDone(promise, endHelper);\n };\n\n Tour.prototype.ended = function() {\n return !this._force && !!this._getState('end');\n };\n\n Tour.prototype.restart = function() {\n this._removeState('current_step');\n this._removeState('end');\n return this.start();\n };\n\n Tour.prototype.pause = function() {\n var step;\n step = this.getStep(this._current);\n if (!(step && step.duration)) {\n return this;\n }\n this._paused = true;\n this._duration -= new Date().getTime() - this._start;\n window.clearTimeout(this._timer);\n this._debug(\"Paused/Stopped step \" + (this._current + 1) + \" timer (\" + this._duration + \" remaining).\");\n if (step.onPause != null) {\n return step.onPause(this, this._duration);\n }\n };\n\n Tour.prototype.resume = function() {\n var step;\n step = this.getStep(this._current);\n if (!(step && step.duration)) {\n return this;\n }\n this._paused = false;\n this._start = new Date().getTime();\n this._duration = this._duration || step.duration;\n this._timer = window.setTimeout((function(_this) {\n return function() {\n if (_this._isLast()) {\n return _this.next();\n } else {\n return _this.end();\n }\n };\n })(this), this._duration);\n this._debug(\"Started step \" + (this._current + 1) + \" timer with duration \" + this._duration);\n if ((step.onResume != null) && this._duration !== step.duration) {\n return step.onResume(this, this._duration);\n }\n };\n\n Tour.prototype.hideStep = function(i) {\n var hideStepHelper, promise, step;\n step = this.getStep(i);\n if (!step) {\n return;\n }\n this._clearTimer();\n promise = this._makePromise(step.onHide != null ? step.onHide(this, i) : void 0);\n hideStepHelper = (function(_this) {\n return function(e) {\n var $element;\n $element = $(step.element);\n if (!($element.data('bs.popover') || $element.data('popover'))) {\n $element = $('body');\n }\n $element.popover('destroy').removeClass(\"tour-\" + _this._options.name + \"-element tour-\" + _this._options.name + \"-\" + i + \"-element\");\n if (step.reflex) {\n $element.removeClass('tour-step-element-reflex').off(\"\" + (_this._reflexEvent(step.reflex)) + \".tour-\" + _this._options.name);\n }\n if (step.backdrop) {\n _this._hideBackdrop();\n }\n if (step.onHidden != null) {\n return step.onHidden(_this);\n }\n };\n })(this);\n this._callOnPromiseDone(promise, hideStepHelper);\n return promise;\n };\n\n Tour.prototype.showStep = function(i) {\n var promise, showStepHelper, skipToPrevious, step;\n if (this.ended()) {\n this._debug('Tour ended, showStep prevented.');\n return this;\n }\n step = this.getStep(i);\n if (!step) {\n return;\n }\n skipToPrevious = i < this._current;\n promise = this._makePromise(step.onShow != null ? step.onShow(this, i) : void 0);\n showStepHelper = (function(_this) {\n return function(e) {\n var current_path, path, showPopoverAndOverlay;\n _this.setCurrentStep(i);\n path = (function() {\n switch ({}.toString.call(step.path)) {\n case '[object Function]':\n return step.path();\n case '[object String]':\n return this._options.basePath + step.path;\n default:\n return step.path;\n }\n }).call(_this);\n current_path = [document.location.pathname, document.location.hash].join('');\n if (_this._isRedirect(path, current_path)) {\n _this._redirect(step, path);\n return;\n }\n if (_this._isOrphan(step)) {\n if (!step.orphan) {\n _this._debug(\"Skip the orphan step \" + (_this._current + 1) + \".\\nOrphan option is false and the element does not exist or is hidden.\");\n if (skipToPrevious) {\n _this._showPrevStep();\n } else {\n _this._showNextStep();\n }\n return;\n }\n _this._debug(\"Show the orphan step \" + (_this._current + 1) + \". Orphans option is true.\");\n }\n if (step.backdrop) {\n _this._showBackdrop(!_this._isOrphan(step) ? step.element : void 0);\n }\n showPopoverAndOverlay = function() {\n if (_this.getCurrentStep() !== i) {\n return;\n }\n if ((step.element != null) && step.backdrop) {\n _this._showOverlayElement(step);\n }\n _this._showPopover(step, i);\n if (step.onShown != null) {\n step.onShown(_this);\n }\n return _this._debug(\"Step \" + (_this._current + 1) + \" of \" + _this._options.steps.length);\n };\n if (step.autoscroll) {\n _this._scrollIntoView(step.element, showPopoverAndOverlay);\n } else {\n showPopoverAndOverlay();\n }\n if (step.duration) {\n return _this.resume();\n }\n };\n })(this);\n if (step.delay) {\n this._debug(\"Wait \" + step.delay + \" milliseconds to show the step \" + (this._current + 1));\n window.setTimeout((function(_this) {\n return function() {\n return _this._callOnPromiseDone(promise, showStepHelper);\n };\n })(this), step.delay);\n } else {\n this._callOnPromiseDone(promise, showStepHelper);\n }\n return promise;\n };\n\n Tour.prototype.getCurrentStep = function() {\n return this._current;\n };\n\n Tour.prototype.setCurrentStep = function(value) {\n if (value != null) {\n this._current = value;\n this._setState('current_step', value);\n } else {\n this._current = this._getState('current_step');\n this._current = this._current === null ? null : parseInt(this._current, 10);\n }\n return this;\n };\n\n Tour.prototype._setState = function(key, value) {\n var e, keyName;\n if (this._options.storage) {\n keyName = \"\" + this._options.name + \"_\" + key;\n try {\n this._options.storage.setItem(keyName, value);\n } catch (_error) {\n e = _error;\n if (e.code === DOMException.QUOTA_EXCEEDED_ERR) {\n this._debug('LocalStorage quota exceeded. State storage failed.');\n }\n }\n return this._options.afterSetState(keyName, value);\n } else {\n if (this._state == null) {\n this._state = {};\n }\n return this._state[key] = value;\n }\n };\n\n Tour.prototype._removeState = function(key) {\n var keyName;\n if (this._options.storage) {\n keyName = \"\" + this._options.name + \"_\" + key;\n this._options.storage.removeItem(keyName);\n return this._options.afterRemoveState(keyName);\n } else {\n if (this._state != null) {\n return delete this._state[key];\n }\n }\n };\n\n Tour.prototype._getState = function(key) {\n var keyName, value;\n if (this._options.storage) {\n keyName = \"\" + this._options.name + \"_\" + key;\n value = this._options.storage.getItem(keyName);\n } else {\n if (this._state != null) {\n value = this._state[key];\n }\n }\n if (value === void 0 || value === 'null') {\n value = null;\n }\n this._options.afterGetState(key, value);\n return value;\n };\n\n Tour.prototype._showNextStep = function() {\n var promise, showNextStepHelper, step;\n step = this.getStep(this._current);\n showNextStepHelper = (function(_this) {\n return function(e) {\n return _this.showStep(step.next);\n };\n })(this);\n promise = this._makePromise(step.onNext != null ? step.onNext(this) : void 0);\n return this._callOnPromiseDone(promise, showNextStepHelper);\n };\n\n Tour.prototype._showPrevStep = function() {\n var promise, showPrevStepHelper, step;\n step = this.getStep(this._current);\n showPrevStepHelper = (function(_this) {\n return function(e) {\n return _this.showStep(step.prev);\n };\n })(this);\n promise = this._makePromise(step.onPrev != null ? step.onPrev(this) : void 0);\n return this._callOnPromiseDone(promise, showPrevStepHelper);\n };\n\n Tour.prototype._debug = function(text) {\n if (this._options.debug) {\n return window.console.log(\"Bootstrap Tour '\" + this._options.name + \"' | \" + text);\n }\n };\n\n Tour.prototype._isRedirect = function(path, currentPath) {\n return (path != null) && path !== '' && (({}.toString.call(path) === '[object RegExp]' && !path.test(currentPath)) || ({}.toString.call(path) === '[object String]' && path.replace(/\\?.*$/, '').replace(/\\/?$/, '') !== currentPath.replace(/\\/?$/, '')));\n };\n\n Tour.prototype._redirect = function(step, path) {\n if ($.isFunction(step.redirect)) {\n return step.redirect.call(this, path);\n } else if (step.redirect === true) {\n this._debug(\"Redirect to \" + path);\n return document.location.href = path;\n }\n };\n\n Tour.prototype._isOrphan = function(step) {\n return (step.element == null) || !$(step.element).length || $(step.element).is(':hidden') && ($(step.element)[0].namespaceURI !== 'http://www.w3.org/2000/svg');\n };\n\n Tour.prototype._isLast = function() {\n return this._current < this._options.steps.length - 1;\n };\n\n Tour.prototype._showPopover = function(step, i) {\n var $element, $tip, isOrphan, options;\n $(\".tour-\" + this._options.name).remove();\n options = $.extend({}, this._options);\n isOrphan = this._isOrphan(step);\n step.template = this._template(step, i);\n if (isOrphan) {\n step.element = 'body';\n step.placement = 'top';\n }\n $element = $(step.element);\n $element.addClass(\"tour-\" + this._options.name + \"-element tour-\" + this._options.name + \"-\" + i + \"-element\");\n if (step.options) {\n $.extend(options, step.options);\n }\n if (step.reflex && !isOrphan) {\n $element.addClass('tour-step-element-reflex');\n $element.off(\"\" + (this._reflexEvent(step.reflex)) + \".tour-\" + this._options.name);\n $element.on(\"\" + (this._reflexEvent(step.reflex)) + \".tour-\" + this._options.name, (function(_this) {\n return function() {\n if (_this._isLast()) {\n return _this.next();\n } else {\n return _this.end();\n }\n };\n })(this));\n }\n $element.popover({\n placement: step.placement,\n trigger: 'manual',\n title: step.title,\n content: step.content,\n html: true,\n animation: step.animation,\n container: step.container,\n template: step.template,\n selector: step.element\n }).popover('show');\n $tip = $element.data('bs.popover') ? $element.data('bs.popover').tip() : $element.data('popover').tip();\n $tip.attr('id', step.id);\n this._reposition($tip, step);\n if (isOrphan) {\n return this._center($tip);\n }\n };\n\n Tour.prototype._template = function(step, i) {\n var $navigation, $next, $prev, $resume, $template;\n $template = $.isFunction(step.template) ? $(step.template(i, step)) : $(step.template);\n $navigation = $template.find('.popover-navigation');\n $prev = $navigation.find('[data-role=\"prev\"]');\n $next = $navigation.find('[data-role=\"next\"]');\n $resume = $navigation.find('[data-role=\"pause-resume\"]');\n if (this._isOrphan(step)) {\n $template.addClass('orphan');\n }\n $template.addClass(\"tour-\" + this._options.name + \" tour-\" + this._options.name + \"-\" + i);\n if (step.prev < 0) {\n $prev.addClass('disabled');\n }\n if (step.next < 0) {\n $next.addClass('disabled');\n }\n if (!step.duration) {\n $resume.remove();\n }\n return $template.clone().wrap('
                                    ').parent().html();\n };\n\n Tour.prototype._reflexEvent = function(reflex) {\n if ({}.toString.call(reflex) === '[object Boolean]') {\n return 'click';\n } else {\n return reflex;\n }\n };\n\n Tour.prototype._reposition = function($tip, step) {\n var offsetBottom, offsetHeight, offsetRight, offsetWidth, originalLeft, originalTop, tipOffset;\n offsetWidth = $tip[0].offsetWidth;\n offsetHeight = $tip[0].offsetHeight;\n tipOffset = $tip.offset();\n originalLeft = tipOffset.left;\n originalTop = tipOffset.top;\n offsetBottom = $(document).outerHeight() - tipOffset.top - $tip.outerHeight();\n if (offsetBottom < 0) {\n tipOffset.top = tipOffset.top + offsetBottom;\n }\n offsetRight = $('html').outerWidth() - tipOffset.left - $tip.outerWidth();\n if (offsetRight < 0) {\n tipOffset.left = tipOffset.left + offsetRight;\n }\n if (tipOffset.top < 0) {\n tipOffset.top = 0;\n }\n if (tipOffset.left < 0) {\n tipOffset.left = 0;\n }\n $tip.offset(tipOffset);\n if (step.placement === 'bottom' || step.placement === 'top') {\n if (originalLeft !== tipOffset.left) {\n return this._replaceArrow($tip, (tipOffset.left - originalLeft) * 2, offsetWidth, 'left');\n }\n } else {\n if (originalTop !== tipOffset.top) {\n return this._replaceArrow($tip, (tipOffset.top - originalTop) * 2, offsetHeight, 'top');\n }\n }\n };\n\n Tour.prototype._center = function($tip) {\n return $tip.css('top', $(window).outerHeight() / 2 - $tip.outerHeight() / 2);\n };\n\n Tour.prototype._replaceArrow = function($tip, delta, dimension, position) {\n return $tip.find('.arrow').css(position, delta ? 50 * (1 - delta / dimension) + '%' : '');\n };\n\n Tour.prototype._scrollIntoView = function(element, callback) {\n var $element, $window, counter, offsetTop, scrollTop, windowHeight;\n $element = $(element);\n if (!$element.length) {\n return callback();\n }\n $window = $(window);\n offsetTop = $element.offset().top;\n windowHeight = $window.height();\n scrollTop = Math.max(0, offsetTop - (windowHeight / 2));\n this._debug(\"Scroll into view. ScrollTop: \" + scrollTop + \". Element offset: \" + offsetTop + \". Window height: \" + windowHeight + \".\");\n counter = 0;\n return $('body, html').stop(true, true).animate({\n scrollTop: Math.ceil(scrollTop)\n }, (function(_this) {\n return function() {\n if (++counter === 2) {\n callback();\n return _this._debug(\"Scroll into view.\\nAnimation end element offset: \" + ($element.offset().top) + \".\\nWindow height: \" + ($window.height()) + \".\");\n }\n };\n })(this));\n };\n\n Tour.prototype._onResize = function(callback, timeout) {\n return $(window).on(\"resize.tour-\" + this._options.name, function() {\n clearTimeout(timeout);\n return timeout = setTimeout(callback, 100);\n });\n };\n\n Tour.prototype._initMouseNavigation = function() {\n var _this;\n _this = this;\n return $(document).off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='prev']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='next']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='end']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='pause-resume']\").on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='next']\", (function(_this) {\n return function(e) {\n e.preventDefault();\n return _this.next();\n };\n })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='prev']\", (function(_this) {\n return function(e) {\n e.preventDefault();\n return _this.prev();\n };\n })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='end']\", (function(_this) {\n return function(e) {\n e.preventDefault();\n return _this.end();\n };\n })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='pause-resume']\", function(e) {\n var $this;\n e.preventDefault();\n $this = $(this);\n $this.text(_this._paused ? $this.data('pause-text') : $this.data('resume-text'));\n if (_this._paused) {\n return _this.resume();\n } else {\n return _this.pause();\n }\n });\n };\n\n Tour.prototype._initKeyboardNavigation = function() {\n if (!this._options.keyboard) {\n return;\n }\n return $(document).on(\"keyup.tour-\" + this._options.name, (function(_this) {\n return function(e) {\n if (!e.which) {\n return;\n }\n switch (e.which) {\n case 39:\n e.preventDefault();\n if (_this._isLast()) {\n return _this.next();\n } else {\n return _this.end();\n }\n break;\n case 37:\n e.preventDefault();\n if (_this._current > 0) {\n return _this.prev();\n }\n break;\n case 27:\n e.preventDefault();\n return _this.end();\n }\n };\n })(this));\n };\n\n Tour.prototype._makePromise = function(result) {\n if (result && $.isFunction(result.then)) {\n return result;\n } else {\n return null;\n }\n };\n\n Tour.prototype._callOnPromiseDone = function(promise, cb, arg) {\n if (promise) {\n return promise.then((function(_this) {\n return function(e) {\n return cb.call(_this, arg);\n };\n })(this));\n } else {\n return cb.call(this, arg);\n }\n };\n\n Tour.prototype._showBackdrop = function(element) {\n if (this.backdrop.backgroundShown) {\n return;\n }\n this.backdrop = $('
                                    ', {\n \"class\": 'tour-backdrop'\n });\n this.backdrop.backgroundShown = true;\n return $('body').append(this.backdrop);\n };\n\n Tour.prototype._hideBackdrop = function() {\n this._hideOverlayElement();\n return this._hideBackground();\n };\n\n Tour.prototype._hideBackground = function() {\n if (this.backdrop) {\n this.backdrop.remove();\n this.backdrop.overlay = null;\n return this.backdrop.backgroundShown = false;\n }\n };\n\n Tour.prototype._showOverlayElement = function(step) {\n var $element, elementData;\n $element = $(step.element);\n if (!$element || $element.length === 0 || this.backdrop.overlayElementShown) {\n return;\n }\n this.backdrop.overlayElementShown = true;\n this.backdrop.$element = $element.addClass('tour-step-backdrop');\n this.backdrop.$background = $('
                                    ', {\n \"class\": 'tour-step-background'\n });\n elementData = {\n width: $element.innerWidth(),\n height: $element.innerHeight(),\n offset: $element.offset()\n };\n this.backdrop.$background.appendTo('body');\n if (step.backdropPadding) {\n elementData = this._applyBackdropPadding(step.backdropPadding, elementData);\n }\n return this.backdrop.$background.width(elementData.width).height(elementData.height).offset(elementData.offset);\n };\n\n Tour.prototype._hideOverlayElement = function() {\n if (!this.backdrop.overlayElementShown) {\n return;\n }\n this.backdrop.$element.removeClass('tour-step-backdrop');\n this.backdrop.$background.remove();\n this.backdrop.$element = null;\n this.backdrop.$background = null;\n return this.backdrop.overlayElementShown = false;\n };\n\n Tour.prototype._applyBackdropPadding = function(padding, data) {\n if (typeof padding === 'object') {\n if (padding.top == null) {\n padding.top = 0;\n }\n if (padding.right == null) {\n padding.right = 0;\n }\n if (padding.bottom == null) {\n padding.bottom = 0;\n }\n if (padding.left == null) {\n padding.left = 0;\n }\n data.offset.top = data.offset.top - padding.top;\n data.offset.left = data.offset.left - padding.left;\n data.width = data.width + padding.left + padding.right;\n data.height = data.height + padding.top + padding.bottom;\n } else {\n data.offset.top = data.offset.top - padding;\n data.offset.left = data.offset.left - padding;\n data.width = data.width + (padding * 2);\n data.height = data.height + (padding * 2);\n }\n return data;\n };\n\n Tour.prototype._clearTimer = function() {\n window.clearTimeout(this._timer);\n this._timer = null;\n return this._duration = null;\n };\n\n return Tour;\n\n })();\n return window.Tour = Tour;\n})(jQuery, window);\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/libs/bootstrap-tour.js\n ** module id = 85\n ** module chunks = 2\n **/","/*!\n\n handlebars v3.0.3\n\nCopyright (C) 2011-2014 by Yehuda Katz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n@license\n*/\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Handlebars\"] = factory();\n\telse\n\t\troot[\"Handlebars\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\n\texports.__esModule = true;\n\n\tvar _import = __webpack_require__(1);\n\n\tvar base = _interopRequireWildcard(_import);\n\n\t// Each of these augment the Handlebars object. No need to setup here.\n\t// (This is done to easily share code between commonjs and browse envs)\n\n\tvar _SafeString = __webpack_require__(2);\n\n\tvar _SafeString2 = _interopRequireWildcard(_SafeString);\n\n\tvar _Exception = __webpack_require__(3);\n\n\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\n\tvar _import2 = __webpack_require__(4);\n\n\tvar Utils = _interopRequireWildcard(_import2);\n\n\tvar _import3 = __webpack_require__(5);\n\n\tvar runtime = _interopRequireWildcard(_import3);\n\n\tvar _noConflict = __webpack_require__(6);\n\n\tvar _noConflict2 = _interopRequireWildcard(_noConflict);\n\n\t// For compatibility and usage outside of module systems, make the Handlebars object a namespace\n\tfunction create() {\n\t var hb = new base.HandlebarsEnvironment();\n\n\t Utils.extend(hb, base);\n\t hb.SafeString = _SafeString2['default'];\n\t hb.Exception = _Exception2['default'];\n\t hb.Utils = Utils;\n\t hb.escapeExpression = Utils.escapeExpression;\n\n\t hb.VM = runtime;\n\t hb.template = function (spec) {\n\t return runtime.template(spec, hb);\n\t };\n\n\t return hb;\n\t}\n\n\tvar inst = create();\n\tinst.create = create;\n\n\t_noConflict2['default'](inst);\n\n\tinst['default'] = inst;\n\n\texports['default'] = inst;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\n\texports.__esModule = true;\n\texports.HandlebarsEnvironment = HandlebarsEnvironment;\n\texports.createFrame = createFrame;\n\n\tvar _import = __webpack_require__(4);\n\n\tvar Utils = _interopRequireWildcard(_import);\n\n\tvar _Exception = __webpack_require__(3);\n\n\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\n\tvar VERSION = '3.0.1';\n\texports.VERSION = VERSION;\n\tvar COMPILER_REVISION = 6;\n\n\texports.COMPILER_REVISION = COMPILER_REVISION;\n\tvar REVISION_CHANGES = {\n\t 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n\t 2: '== 1.0.0-rc.3',\n\t 3: '== 1.0.0-rc.4',\n\t 4: '== 1.x.x',\n\t 5: '== 2.0.0-alpha.x',\n\t 6: '>= 2.0.0-beta.1'\n\t};\n\n\texports.REVISION_CHANGES = REVISION_CHANGES;\n\tvar isArray = Utils.isArray,\n\t isFunction = Utils.isFunction,\n\t toString = Utils.toString,\n\t objectType = '[object Object]';\n\n\tfunction HandlebarsEnvironment(helpers, partials) {\n\t this.helpers = helpers || {};\n\t this.partials = partials || {};\n\n\t registerDefaultHelpers(this);\n\t}\n\n\tHandlebarsEnvironment.prototype = {\n\t constructor: HandlebarsEnvironment,\n\n\t logger: logger,\n\t log: log,\n\n\t registerHelper: function registerHelper(name, fn) {\n\t if (toString.call(name) === objectType) {\n\t if (fn) {\n\t throw new _Exception2['default']('Arg not supported with multiple helpers');\n\t }\n\t Utils.extend(this.helpers, name);\n\t } else {\n\t this.helpers[name] = fn;\n\t }\n\t },\n\t unregisterHelper: function unregisterHelper(name) {\n\t delete this.helpers[name];\n\t },\n\n\t registerPartial: function registerPartial(name, partial) {\n\t if (toString.call(name) === objectType) {\n\t Utils.extend(this.partials, name);\n\t } else {\n\t if (typeof partial === 'undefined') {\n\t throw new _Exception2['default']('Attempting to register a partial as undefined');\n\t }\n\t this.partials[name] = partial;\n\t }\n\t },\n\t unregisterPartial: function unregisterPartial(name) {\n\t delete this.partials[name];\n\t }\n\t};\n\n\tfunction registerDefaultHelpers(instance) {\n\t instance.registerHelper('helperMissing', function () {\n\t if (arguments.length === 1) {\n\t // A missing field in a {{foo}} constuct.\n\t return undefined;\n\t } else {\n\t // Someone is actually trying to call something, blow up.\n\t throw new _Exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n\t }\n\t });\n\n\t instance.registerHelper('blockHelperMissing', function (context, options) {\n\t var inverse = options.inverse,\n\t fn = options.fn;\n\n\t if (context === true) {\n\t return fn(this);\n\t } else if (context === false || context == null) {\n\t return inverse(this);\n\t } else if (isArray(context)) {\n\t if (context.length > 0) {\n\t if (options.ids) {\n\t options.ids = [options.name];\n\t }\n\n\t return instance.helpers.each(context, options);\n\t } else {\n\t return inverse(this);\n\t }\n\t } else {\n\t if (options.data && options.ids) {\n\t var data = createFrame(options.data);\n\t data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);\n\t options = { data: data };\n\t }\n\n\t return fn(context, options);\n\t }\n\t });\n\n\t instance.registerHelper('each', function (context, options) {\n\t if (!options) {\n\t throw new _Exception2['default']('Must pass iterator to #each');\n\t }\n\n\t var fn = options.fn,\n\t inverse = options.inverse,\n\t i = 0,\n\t ret = '',\n\t data = undefined,\n\t contextPath = undefined;\n\n\t if (options.data && options.ids) {\n\t contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n\t }\n\n\t if (isFunction(context)) {\n\t context = context.call(this);\n\t }\n\n\t if (options.data) {\n\t data = createFrame(options.data);\n\t }\n\n\t function execIteration(field, index, last) {\n\t if (data) {\n\t data.key = field;\n\t data.index = index;\n\t data.first = index === 0;\n\t data.last = !!last;\n\n\t if (contextPath) {\n\t data.contextPath = contextPath + field;\n\t }\n\t }\n\n\t ret = ret + fn(context[field], {\n\t data: data,\n\t blockParams: Utils.blockParams([context[field], field], [contextPath + field, null])\n\t });\n\t }\n\n\t if (context && typeof context === 'object') {\n\t if (isArray(context)) {\n\t for (var j = context.length; i < j; i++) {\n\t execIteration(i, i, i === context.length - 1);\n\t }\n\t } else {\n\t var priorKey = undefined;\n\n\t for (var key in context) {\n\t if (context.hasOwnProperty(key)) {\n\t // We're running the iterations one step out of sync so we can detect\n\t // the last iteration without have to scan the object twice and create\n\t // an itermediate keys array.\n\t if (priorKey) {\n\t execIteration(priorKey, i - 1);\n\t }\n\t priorKey = key;\n\t i++;\n\t }\n\t }\n\t if (priorKey) {\n\t execIteration(priorKey, i - 1, true);\n\t }\n\t }\n\t }\n\n\t if (i === 0) {\n\t ret = inverse(this);\n\t }\n\n\t return ret;\n\t });\n\n\t instance.registerHelper('if', function (conditional, options) {\n\t if (isFunction(conditional)) {\n\t conditional = conditional.call(this);\n\t }\n\n\t // Default behavior is to render the positive path if the value is truthy and not empty.\n\t // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n\t // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n\t if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) {\n\t return options.inverse(this);\n\t } else {\n\t return options.fn(this);\n\t }\n\t });\n\n\t instance.registerHelper('unless', function (conditional, options) {\n\t return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n\t });\n\n\t instance.registerHelper('with', function (context, options) {\n\t if (isFunction(context)) {\n\t context = context.call(this);\n\t }\n\n\t var fn = options.fn;\n\n\t if (!Utils.isEmpty(context)) {\n\t if (options.data && options.ids) {\n\t var data = createFrame(options.data);\n\t data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);\n\t options = { data: data };\n\t }\n\n\t return fn(context, options);\n\t } else {\n\t return options.inverse(this);\n\t }\n\t });\n\n\t instance.registerHelper('log', function (message, options) {\n\t var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;\n\t instance.log(level, message);\n\t });\n\n\t instance.registerHelper('lookup', function (obj, field) {\n\t return obj && obj[field];\n\t });\n\t}\n\n\tvar logger = {\n\t methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },\n\n\t // State enum\n\t DEBUG: 0,\n\t INFO: 1,\n\t WARN: 2,\n\t ERROR: 3,\n\t level: 1,\n\n\t // Can be overridden in the host environment\n\t log: function log(level, message) {\n\t if (typeof console !== 'undefined' && logger.level <= level) {\n\t var method = logger.methodMap[level];\n\t (console[method] || console.log).call(console, message); // eslint-disable-line no-console\n\t }\n\t }\n\t};\n\n\texports.logger = logger;\n\tvar log = logger.log;\n\n\texports.log = log;\n\n\tfunction createFrame(object) {\n\t var frame = Utils.extend({}, object);\n\t frame._parent = object;\n\t return frame;\n\t}\n\n\t/* [args, ]options */\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\t// Build out our basic SafeString type\n\tfunction SafeString(string) {\n\t this.string = string;\n\t}\n\n\tSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n\t return '' + this.string;\n\t};\n\n\texports['default'] = SafeString;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\n\tvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\n\tfunction Exception(message, node) {\n\t var loc = node && node.loc,\n\t line = undefined,\n\t column = undefined;\n\t if (loc) {\n\t line = loc.start.line;\n\t column = loc.start.column;\n\n\t message += ' - ' + line + ':' + column;\n\t }\n\n\t var tmp = Error.prototype.constructor.call(this, message);\n\n\t // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n\t for (var idx = 0; idx < errorProps.length; idx++) {\n\t this[errorProps[idx]] = tmp[errorProps[idx]];\n\t }\n\n\t if (Error.captureStackTrace) {\n\t Error.captureStackTrace(this, Exception);\n\t }\n\n\t if (loc) {\n\t this.lineNumber = line;\n\t this.column = column;\n\t }\n\t}\n\n\tException.prototype = new Error();\n\n\texports['default'] = Exception;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\texports.extend = extend;\n\n\t// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\texports.indexOf = indexOf;\n\texports.escapeExpression = escapeExpression;\n\texports.isEmpty = isEmpty;\n\texports.blockParams = blockParams;\n\texports.appendContextPath = appendContextPath;\n\tvar escape = {\n\t '&': '&',\n\t '<': '<',\n\t '>': '>',\n\t '\"': '"',\n\t '\\'': ''',\n\t '`': '`'\n\t};\n\n\tvar badChars = /[&<>\"'`]/g,\n\t possible = /[&<>\"'`]/;\n\n\tfunction escapeChar(chr) {\n\t return escape[chr];\n\t}\n\n\tfunction extend(obj /* , ...source */) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t for (var key in arguments[i]) {\n\t if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n\t obj[key] = arguments[i][key];\n\t }\n\t }\n\t }\n\n\t return obj;\n\t}\n\n\tvar toString = Object.prototype.toString;\n\n\texports.toString = toString;\n\t// Sourced from lodash\n\t// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n\t/*eslint-disable func-style, no-var */\n\tvar isFunction = function isFunction(value) {\n\t return typeof value === 'function';\n\t};\n\t// fallback for older versions of Chrome and Safari\n\t/* istanbul ignore next */\n\tif (isFunction(/x/)) {\n\t exports.isFunction = isFunction = function (value) {\n\t return typeof value === 'function' && toString.call(value) === '[object Function]';\n\t };\n\t}\n\tvar isFunction;\n\texports.isFunction = isFunction;\n\t/*eslint-enable func-style, no-var */\n\n\t/* istanbul ignore next */\n\tvar isArray = Array.isArray || function (value) {\n\t return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n\t};exports.isArray = isArray;\n\n\tfunction indexOf(array, value) {\n\t for (var i = 0, len = array.length; i < len; i++) {\n\t if (array[i] === value) {\n\t return i;\n\t }\n\t }\n\t return -1;\n\t}\n\n\tfunction escapeExpression(string) {\n\t if (typeof string !== 'string') {\n\t // don't escape SafeStrings, since they're already safe\n\t if (string && string.toHTML) {\n\t return string.toHTML();\n\t } else if (string == null) {\n\t return '';\n\t } else if (!string) {\n\t return string + '';\n\t }\n\n\t // Force a string conversion as this will be done by the append regardless and\n\t // the regex test will do this transparently behind the scenes, causing issues if\n\t // an object's to string has escaped characters in it.\n\t string = '' + string;\n\t }\n\n\t if (!possible.test(string)) {\n\t return string;\n\t }\n\t return string.replace(badChars, escapeChar);\n\t}\n\n\tfunction isEmpty(value) {\n\t if (!value && value !== 0) {\n\t return true;\n\t } else if (isArray(value) && value.length === 0) {\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t}\n\n\tfunction blockParams(params, ids) {\n\t params.path = ids;\n\t return params;\n\t}\n\n\tfunction appendContextPath(contextPath, id) {\n\t return (contextPath ? contextPath + '.' : '') + id;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\n\texports.__esModule = true;\n\texports.checkRevision = checkRevision;\n\n\t// TODO: Remove this line and break up compilePartial\n\n\texports.template = template;\n\texports.wrapProgram = wrapProgram;\n\texports.resolvePartial = resolvePartial;\n\texports.invokePartial = invokePartial;\n\texports.noop = noop;\n\n\tvar _import = __webpack_require__(4);\n\n\tvar Utils = _interopRequireWildcard(_import);\n\n\tvar _Exception = __webpack_require__(3);\n\n\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\n\tvar _COMPILER_REVISION$REVISION_CHANGES$createFrame = __webpack_require__(1);\n\n\tfunction checkRevision(compilerInfo) {\n\t var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n\t currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION;\n\n\t if (compilerRevision !== currentRevision) {\n\t if (compilerRevision < currentRevision) {\n\t var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision],\n\t compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision];\n\t throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n\t } else {\n\t // Use the embedded version info since the runtime doesn't know about this revision yet\n\t throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n\t }\n\t }\n\t}\n\n\tfunction template(templateSpec, env) {\n\t /* istanbul ignore next */\n\t if (!env) {\n\t throw new _Exception2['default']('No environment passed to template');\n\t }\n\t if (!templateSpec || !templateSpec.main) {\n\t throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec);\n\t }\n\n\t // Note: Using env.VM references rather than local var references throughout this section to allow\n\t // for external users to override these as psuedo-supported APIs.\n\t env.VM.checkRevision(templateSpec.compiler);\n\n\t function invokePartialWrapper(partial, context, options) {\n\t if (options.hash) {\n\t context = Utils.extend({}, context, options.hash);\n\t }\n\n\t partial = env.VM.resolvePartial.call(this, partial, context, options);\n\t var result = env.VM.invokePartial.call(this, partial, context, options);\n\n\t if (result == null && env.compile) {\n\t options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n\t result = options.partials[options.name](context, options);\n\t }\n\t if (result != null) {\n\t if (options.indent) {\n\t var lines = result.split('\\n');\n\t for (var i = 0, l = lines.length; i < l; i++) {\n\t if (!lines[i] && i + 1 === l) {\n\t break;\n\t }\n\n\t lines[i] = options.indent + lines[i];\n\t }\n\t result = lines.join('\\n');\n\t }\n\t return result;\n\t } else {\n\t throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n\t }\n\t }\n\n\t // Just add water\n\t var container = {\n\t strict: function strict(obj, name) {\n\t if (!(name in obj)) {\n\t throw new _Exception2['default']('\"' + name + '\" not defined in ' + obj);\n\t }\n\t return obj[name];\n\t },\n\t lookup: function lookup(depths, name) {\n\t var len = depths.length;\n\t for (var i = 0; i < len; i++) {\n\t if (depths[i] && depths[i][name] != null) {\n\t return depths[i][name];\n\t }\n\t }\n\t },\n\t lambda: function lambda(current, context) {\n\t return typeof current === 'function' ? current.call(context) : current;\n\t },\n\n\t escapeExpression: Utils.escapeExpression,\n\t invokePartial: invokePartialWrapper,\n\n\t fn: function fn(i) {\n\t return templateSpec[i];\n\t },\n\n\t programs: [],\n\t program: function program(i, data, declaredBlockParams, blockParams, depths) {\n\t var programWrapper = this.programs[i],\n\t fn = this.fn(i);\n\t if (data || depths || blockParams || declaredBlockParams) {\n\t programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n\t } else if (!programWrapper) {\n\t programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n\t }\n\t return programWrapper;\n\t },\n\n\t data: function data(value, depth) {\n\t while (value && depth--) {\n\t value = value._parent;\n\t }\n\t return value;\n\t },\n\t merge: function merge(param, common) {\n\t var obj = param || common;\n\n\t if (param && common && param !== common) {\n\t obj = Utils.extend({}, common, param);\n\t }\n\n\t return obj;\n\t },\n\n\t noop: env.VM.noop,\n\t compilerInfo: templateSpec.compiler\n\t };\n\n\t function ret(context) {\n\t var options = arguments[1] === undefined ? {} : arguments[1];\n\n\t var data = options.data;\n\n\t ret._setup(options);\n\t if (!options.partial && templateSpec.useData) {\n\t data = initData(context, data);\n\t }\n\t var depths = undefined,\n\t blockParams = templateSpec.useBlockParams ? [] : undefined;\n\t if (templateSpec.useDepths) {\n\t depths = options.depths ? [context].concat(options.depths) : [context];\n\t }\n\n\t return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths);\n\t }\n\t ret.isTop = true;\n\n\t ret._setup = function (options) {\n\t if (!options.partial) {\n\t container.helpers = container.merge(options.helpers, env.helpers);\n\n\t if (templateSpec.usePartial) {\n\t container.partials = container.merge(options.partials, env.partials);\n\t }\n\t } else {\n\t container.helpers = options.helpers;\n\t container.partials = options.partials;\n\t }\n\t };\n\n\t ret._child = function (i, data, blockParams, depths) {\n\t if (templateSpec.useBlockParams && !blockParams) {\n\t throw new _Exception2['default']('must pass block params');\n\t }\n\t if (templateSpec.useDepths && !depths) {\n\t throw new _Exception2['default']('must pass parent depths');\n\t }\n\n\t return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n\t };\n\t return ret;\n\t}\n\n\tfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n\t function prog(context) {\n\t var options = arguments[1] === undefined ? {} : arguments[1];\n\n\t return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths));\n\t }\n\t prog.program = i;\n\t prog.depth = depths ? depths.length : 0;\n\t prog.blockParams = declaredBlockParams || 0;\n\t return prog;\n\t}\n\n\tfunction resolvePartial(partial, context, options) {\n\t if (!partial) {\n\t partial = options.partials[options.name];\n\t } else if (!partial.call && !options.name) {\n\t // This is a dynamic partial that returned a string\n\t options.name = partial;\n\t partial = options.partials[partial];\n\t }\n\t return partial;\n\t}\n\n\tfunction invokePartial(partial, context, options) {\n\t options.partial = true;\n\n\t if (partial === undefined) {\n\t throw new _Exception2['default']('The partial ' + options.name + ' could not be found');\n\t } else if (partial instanceof Function) {\n\t return partial(context, options);\n\t }\n\t}\n\n\tfunction noop() {\n\t return '';\n\t}\n\n\tfunction initData(context, data) {\n\t if (!data || !('root' in data)) {\n\t data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {};\n\t data.root = context;\n\t }\n\t return data;\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\texports.__esModule = true;\n\t/*global window */\n\n\texports['default'] = function (Handlebars) {\n\t /* istanbul ignore next */\n\t var root = typeof global !== 'undefined' ? global : window,\n\t $Handlebars = root.Handlebars;\n\t /* istanbul ignore next */\n\t Handlebars.noConflict = function () {\n\t if (root.Handlebars === Handlebars) {\n\t root.Handlebars = $Handlebars;\n\t }\n\t };\n\t};\n\n\tmodule.exports = exports['default'];\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\texports[\"default\"] = function (obj) {\n\t return obj && obj.__esModule ? obj : {\n\t \"default\": obj\n\t };\n\t};\n\n\texports.__esModule = true;\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/libs/handlebars.runtime.js\n ** module id = 86\n ** module chunks = 2\n **/","/*! jQuery UI - v1.9.1 - 2012-10-29\n* http://jqueryui.com\n* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.menu.js, jquery.ui.slider.js\n* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */\n\n(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return\"area\"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!==\"map\"?!1:(o=e(\"img[usemap=#\"+i+\"]\")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:\"a\"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().andSelf().filter(function(){return e.css(this,\"visibility\")===\"hidden\"}).length}var n=0,r=/^ui-id-\\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:\"1.9.1\",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t==\"number\"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css(\"position\"))||/absolute/.test(this.css(\"position\"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,\"position\"))&&/(auto|scroll)/.test(e.css(this,\"overflow\")+e.css(this,\"overflow-y\")+e.css(this,\"overflow-x\"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,\"overflow\")+e.css(this,\"overflow-y\")+e.css(this,\"overflow-x\"))}).eq(0),/fixed/.test(this.css(\"position\"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css(\"zIndex\",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css(\"position\");if(i===\"absolute\"||i===\"relative\"||i===\"fixed\"){s=parseInt(r.css(\"zIndex\"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id=\"ui-id-\"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr(\"id\")})}}),e(\"\").outerWidth(1).jquery||e.each([\"Width\",\"Height\"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,\"padding\"+this))||0,r&&(n-=parseFloat(e.css(t,\"border\"+this+\"Width\"))||0),s&&(n-=parseFloat(e.css(t,\"margin\"+this))||0)}),n}var i=r===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn[\"inner\"+r]=function(n){return n===t?o[\"inner\"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+\"px\")})},e.fn[\"outer\"+r]=function(t,n){return typeof t!=\"number\"?o[\"outer\"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+\"px\")})}}),e.extend(e.expr[\":\"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,\"tabindex\")))},tabbable:function(t){var n=e.attr(t,\"tabindex\"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e(function(){var t=document.body,n=t.appendChild(n=document.createElement(\"div\"));n.offsetHeight,e.extend(n.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0}),e.support.minHeight=n.offsetHeight===100,e.support.selectstart=\"onselectstart\"in n,t.removeChild(n).style.display=\"none\"}),function(){var t=/msie ([\\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];e.ui.ie=t.length?!0:!1,e.ui.ie6=parseFloat(t[1],10)===6}(),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)},isOverAxis:function(e,t,n){return e>t&&e\",options:{disabled:!1,create:null},_createWidget:function(t,r){r=e(r||this.defaultElement||this)[0],this.element=e(r),this.uuid=n++,this.eventNamespace=\".\"+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),r!==this&&(e.data(r,this.widgetName,this),e.data(r,this.widgetFullName,this),this._on(this.element,{remove:function(e){e.target===r&&this.destroy()}}),this.document=e(r.style?r.ownerDocument:r.document||r),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger(\"create\",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr(\"aria-disabled\").removeClass(this.widgetFullName+\"-disabled \"+\"ui-state-disabled\"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass(\"ui-state-hover\"),this.focusable.removeClass(\"ui-state-focus\")},_destroy:e.noop,widget:function(){return this.element},option:function(n,r){var i=n,s,o,u;if(arguments.length===0)return e.widget.extend({},this.options);if(typeof n==\"string\"){i={},s=n.split(\".\"),n=s.shift();if(s.length){o=i[n]=e.widget.extend({},this.options[n]);for(u=0;u=9||!!t.button?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return e(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+\".preventClickEvent\",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(e){return this.mouseDelayMet},_mouseStart:function(e){},_mouseDrag:function(e){},_mouseStop:function(e){},_mouseCapture:function(e){return!0}})})(jQuery);(function(e,t){function h(e,t,n){return[parseInt(e[0],10)*(l.test(e[0])?t/100:1),parseInt(e[1],10)*(l.test(e[1])?n/100:1)]}function p(t,n){return parseInt(e.css(t,n),10)||0}e.ui=e.ui||{};var n,r=Math.max,i=Math.abs,s=Math.round,o=/left|center|right/,u=/top|center|bottom/,a=/[\\+\\-]\\d+%?/,f=/^\\w+/,l=/%$/,c=e.fn.position;e.position={scrollbarWidth:function(){if(n!==t)return n;var r,i,s=e(\"
                                    \"),o=s.children()[0];return e(\"body\").append(s),r=o.offsetWidth,s.css(\"overflow\",\"scroll\"),i=o.offsetWidth,r===i&&(i=s[0].clientWidth),s.remove(),n=r-i},getScrollInfo:function(t){var n=t.isWindow?\"\":t.element.css(\"overflow-x\"),r=t.isWindow?\"\":t.element.css(\"overflow-y\"),i=n===\"scroll\"||n===\"auto\"&&t.width0?\"right\":\"center\",vertical:u<0?\"top\":o>0?\"bottom\":\"middle\"};lr(i(o),i(u))?h.important=\"horizontal\":h.important=\"vertical\",t.using.call(this,e,h)}),a.offset(e.extend(C,{using:u}))})},e.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=e.left-t.collisionPosition.marginLeft,u=i-o,a=o+t.collisionWidth-s-i,f;t.collisionWidth>s?u>0&&a<=0?(f=e.left+u+t.collisionWidth-s-i,e.left+=u-f):a>0&&u<=0?e.left=i:u>a?e.left=i+s-t.collisionWidth:e.left=i:u>0?e.left+=u:a>0?e.left-=a:e.left=r(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,s=t.within.height,o=e.top-t.collisionPosition.marginTop,u=i-o,a=o+t.collisionHeight-s-i,f;t.collisionHeight>s?u>0&&a<=0?(f=e.top+u+t.collisionHeight-s-i,e.top+=u-f):a>0&&u<=0?e.top=i:u>a?e.top=i+s-t.collisionHeight:e.top=i:u>0?e.top+=u:a>0?e.top-=a:e.top=r(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,s=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,u=e.left-t.collisionPosition.marginLeft,a=u-o,f=u+t.collisionWidth-s-o,l=t.my[0]===\"left\"?-t.elemWidth:t.my[0]===\"right\"?t.elemWidth:0,c=t.at[0]===\"left\"?t.targetWidth:t.at[0]===\"right\"?-t.targetWidth:0,h=-2*t.offset[0],p,d;if(a<0){p=e.left+l+c+h+t.collisionWidth-s-r;if(p<0||p0){d=e.left-t.collisionPosition.marginLeft+l+c+h-o;if(d>0||i(d)a&&(v<0||v0&&(d=e.top-t.collisionPosition.marginTop+c+h+p-o,e.top+c+h+p>f&&(d>0||i(d)10&&i<11,t.innerHTML=\"\",n.removeChild(t)}(),e.uiBackCompat!==!1&&function(e){var n=e.fn.position;e.fn.position=function(r){if(!r||!r.offset)return n.call(this,r);var i=r.offset.split(\" \"),s=r.at.split(\" \");return i.length===1&&(i[1]=i[0]),/^\\d/.test(i[0])&&(i[0]=\"+\"+i[0]),/^\\d/.test(i[1])&&(i[1]=\"+\"+i[1]),s.length===1&&(/left|center|right/.test(s[0])?s[1]=\"center\":(s[1]=s[0],s[0]=\"center\")),n.call(this,e.extend(r,{at:s[0]+i[0]+\" \"+s[1]+i[1],offset:t}))}}(jQuery)})(jQuery);(function(e,t){var n=0;e.widget(\"ui.autocomplete\",{version:\"1.9.1\",defaultElement:\"\",options:{appendTo:\"body\",autoFocus:!1,delay:300,minLength:1,position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var t,n,r;this.isMultiLine=this._isMultiLine(),this.valueMethod=this.element[this.element.is(\"input,textarea\")?\"val\":\"text\"],this.isNewMenu=!0,this.element.addClass(\"ui-autocomplete-input\").attr(\"autocomplete\",\"off\"),this._on(this.element,{keydown:function(i){if(this.element.prop(\"readOnly\")){t=!0,r=!0,n=!0;return}t=!1,r=!1,n=!1;var s=e.ui.keyCode;switch(i.keyCode){case s.PAGE_UP:t=!0,this._move(\"previousPage\",i);break;case s.PAGE_DOWN:t=!0,this._move(\"nextPage\",i);break;case s.UP:t=!0,this._keyEvent(\"previous\",i);break;case s.DOWN:t=!0,this._keyEvent(\"next\",i);break;case s.ENTER:case s.NUMPAD_ENTER:this.menu.active&&(t=!0,i.preventDefault(),this.menu.select(i));break;case s.TAB:this.menu.active&&this.menu.select(i);break;case s.ESCAPE:this.menu.element.is(\":visible\")&&(this._value(this.term),this.close(i),i.preventDefault());break;default:n=!0,this._searchTimeout(i)}},keypress:function(r){if(t){t=!1,r.preventDefault();return}if(n)return;var i=e.ui.keyCode;switch(r.keyCode){case i.PAGE_UP:this._move(\"previousPage\",r);break;case i.PAGE_DOWN:this._move(\"nextPage\",r);break;case i.UP:this._keyEvent(\"previous\",r);break;case i.DOWN:this._keyEvent(\"next\",r)}},input:function(e){if(r){r=!1,e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}clearTimeout(this.searching),this.close(e),this._change(e)}}),this._initSource(),this.menu=e(\"
                                      \").addClass(\"ui-autocomplete\").appendTo(this.document.find(this.options.appendTo||\"body\")[0]).menu({input:e(),role:null}).zIndex(this.element.zIndex()+1).hide().data(\"menu\"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var n=this.menu.element[0];e(t.target).closest(\".ui-menu-item\").length||this._delay(function(){var t=this;this.document.one(\"mousedown\",function(r){r.target!==t.element[0]&&r.target!==n&&!e.contains(n,r.target)&&t.close()})})},menufocus:function(t,n){if(this.isNewMenu){this.isNewMenu=!1;if(t.originalEvent&&/^mouse/.test(t.originalEvent.type)){this.menu.blur(),this.document.one(\"mousemove\",function(){e(t.target).trigger(t.originalEvent)});return}}var r=n.item.data(\"ui-autocomplete-item\")||n.item.data(\"item.autocomplete\");!1!==this._trigger(\"focus\",t,{item:r})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(r.value):this.liveRegion.text(r.value)},menuselect:function(e,t){var n=t.item.data(\"ui-autocomplete-item\")||t.item.data(\"item.autocomplete\"),r=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger(\"select\",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=e(\"\",{role:\"status\",\"aria-live\":\"polite\"}).addClass(\"ui-helper-hidden-accessible\").insertAfter(this.element),e.fn.bgiframe&&this.menu.element.bgiframe(),this._on(this.window,{beforeunload:function(){this.element.removeAttr(\"autocomplete\")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass(\"ui-autocomplete-input\").removeAttr(\"autocomplete\"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),e===\"source\"&&this._initSource(),e===\"appendTo\"&&this.menu.element.appendTo(this.document.find(t||\"body\")[0]),e===\"disabled\"&&t&&this.xhr&&this.xhr.abort()},_isMultiLine:function(){return this.element.is(\"textarea\")?!0:this.element.is(\"input\")?!1:this.element.prop(\"isContentEditable\")},_initSource:function(){var t,n,r=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(n,r){r(e.ui.autocomplete.filter(t,n.term))}):typeof this.options.source==\"string\"?(n=this.options.source,this.source=function(t,i){r.xhr&&r.xhr.abort(),r.xhr=e.ajax({url:n,data:t,dataType:\"json\",success:function(e){i(e)},error:function(){i([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){e=e!=null?e:this._value(),this.term=this._value();if(e.length\").append(e(\"\").text(n.label)).appendTo(t)},_move:function(e,t){if(!this.menu.element.is(\":visible\")){this.search(null,t);return}if(this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)){this._value(this.term),this.menu.blur();return}this.menu[e](t)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){if(!this.isMultiLine||this.menu.element.is(\":visible\"))this._move(e,t),t.preventDefault()}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")},filter:function(t,n){var r=new RegExp(e.ui.autocomplete.escapeRegex(n),\"i\");return e.grep(t,function(e){return r.test(e.label||e.value||e)})}}),e.widget(\"ui.autocomplete\",e.ui.autocomplete,{options:{messages:{noResults:\"No search results.\",results:function(e){return e+(e>1?\" results are\":\" result is\")+\" available, use up and down arrow keys to navigate.\"}}},__response:function(e){var t;this._superApply(arguments);if(this.options.disabled||this.cancelSearch)return;e&&e.length?t=this.options.messages.results(e.length):t=this.options.messages.noResults,this.liveRegion.text(t)}})})(jQuery);(function(e,t){var n,r,i,s,o=\"ui-button ui-widget ui-state-default ui-corner-all\",u=\"ui-state-hover ui-state-active \",a=\"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",f=function(){var t=e(this).find(\":ui-button\");setTimeout(function(){t.button(\"refresh\")},1)},l=function(t){var n=t.name,r=t.form,i=e([]);return n&&(r?i=e(r).find(\"[name='\"+n+\"']\"):i=e(\"[name='\"+n+\"']\",t.ownerDocument).filter(function(){return!this.form})),i};e.widget(\"ui.button\",{version:\"1.9.1\",defaultElement:\"
                                    \"\n\t )\n\t });\n\t modal.show( { backdrop: true } );\n\t}\n\t\n\t\n\t// ============================================================================\n\t return {\n\t Modal : Modal,\n\t hide_modal : hide_modal,\n\t show_modal : show_modal,\n\t show_message : show_message,\n\t show_in_overlay : show_in_overlay,\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n\n/***/ },\n/* 84 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(Backbone, _, $) {!(__WEBPACK_AMD_DEFINE_ARRAY__ = [\n\t __webpack_require__(114),\n\t __webpack_require__(13),\n\t __webpack_require__(10),\n\t __webpack_require__(6)\n\t], __WEBPACK_AMD_DEFINE_RESULT__ = function( Masthead, Panel, Modal, BaseMVC ) {\n\t\n\t// ============================================================================\n\tvar PageLayoutView = Backbone.View.extend( BaseMVC.LoggableMixin ).extend({\n\t _logNamespace : 'layout',\n\t\n\t el : 'body',\n\t className : 'full-content',\n\t\n\t _panelIds : [\n\t 'left', 'center', 'right'\n\t ],\n\t\n\t defaultOptions : {\n\t message_box_visible : false,\n\t message_box_content : '',\n\t message_box_class : 'info',\n\t show_inactivity_warning : false,\n\t inactivity_box_content : ''\n\t },\n\t\n\t initialize : function( options ) {\n\t // TODO: remove globals\n\t this.log( this + '.initialize:', options );\n\t _.extend( this, _.pick( options, this._panelIds ) );\n\t this.options = _.defaults( _.omit( options, this._panelIds ), this.defaultOptions );\n\t Galaxy.modal = this.modal = new Modal.View();\n\t this.masthead = new Masthead.View( this.options.config );\n\t this.$el.attr( 'scroll', 'no' );\n\t this.$el.html( this._template() );\n\t this.$el.append( this.masthead.frame.$el );\n\t this.$el.append( this.masthead.$el );\n\t this.$el.append( this.modal.$el );\n\t this.$messagebox = this.$( '#messagebox' );\n\t this.$inactivebox = this.$( '#inactivebox' );\n\t },\n\t\n\t render : function() {\n\t // TODO: Remove this line after select2 update\n\t $( '.select2-hidden-accessible' ).remove();\n\t this.log( this + '.render:' );\n\t this.masthead.render();\n\t this.renderMessageBox();\n\t this.renderInactivityBox();\n\t this.renderPanels();\n\t return this;\n\t },\n\t\n\t /** Render message box */\n\t renderMessageBox : function() {\n\t if ( this.options.message_box_visible ){\n\t var content = this.options.message_box_content || '';\n\t var level = this.options.message_box_class || 'info';\n\t this.$el.addClass( 'has-message-box' );\n\t this.$messagebox\n\t .attr( 'class', 'panel-' + level + '-message' )\n\t .html( content )\n\t .toggle( !!content )\n\t .show();\n\t } else {\n\t this.$el.removeClass( 'has-message-box' );\n\t this.$messagebox.hide();\n\t }\n\t return this;\n\t },\n\t\n\t /** Render inactivity warning */\n\t renderInactivityBox : function() {\n\t if( this.options.show_inactivity_warning ){\n\t var content = this.options.inactivity_box_content || '';\n\t var verificationLink = $( '
                                    ' ).attr( 'href', Galaxy.root + 'user/resend_verification' ).text( 'Resend verification' );\n\t this.$el.addClass( 'has-inactivity-box' );\n\t this.$inactivebox\n\t .html( content + ' ' )\n\t .append( verificationLink )\n\t .toggle( !!content )\n\t .show();\n\t } else {\n\t this.$el.removeClass( 'has-inactivity-box' );\n\t this.$inactivebox.hide();\n\t }\n\t return this;\n\t },\n\t\n\t /** Render panels */\n\t renderPanels : function() {\n\t var page = this;\n\t this._panelIds.forEach( function( panelId ){\n\t if( _.has( page, panelId ) ){\n\t page[ panelId ].setElement( '#' + panelId );\n\t page[ panelId ].render();\n\t }\n\t });\n\t if( !this.left ){\n\t this.center.$el.css( 'left', 0 );\n\t }\n\t if( !this.right ){\n\t this.center.$el.css( 'right', 0 );\n\t }\n\t return this;\n\t },\n\t\n\t /** body template */\n\t _template: function() {\n\t return [\n\t '
                                    ',\n\t '
                                    ',\n\t '
                                    ',\n\t '
                                    ',\n\t this.left? '
                                    ' : '',\n\t this.center? '
                                    ' : '',\n\t this.right? '
                                    ' : '',\n\t '
                                    ',\n\t '
                                    ',\n\t ].join('');\n\t },\n\t\n\t /** hide both side panels if previously shown */\n\t hideSidePanels : function(){\n\t if( this.left ){\n\t this.left.hide();\n\t }\n\t if( this.right ){\n\t this.right.hide();\n\t }\n\t },\n\t\n\t toString : function() { return 'PageLayoutView'; }\n\t});\n\t\n\t// ============================================================================\n\t return {\n\t PageLayoutView: PageLayoutView\n\t };\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(3), __webpack_require__(1)))\n\n/***/ },\n/* 85 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/* ========================================================================\n\t * bootstrap-tour - v0.10.1\n\t * http://bootstraptour.com\n\t * ========================================================================\n\t * Copyright 2012-2013 Ulrich Sossou\n\t *\n\t * ========================================================================\n\t * Licensed under the Apache License, Version 2.0 (the \"License\");\n\t * you may not use this file except in compliance with the License.\n\t * You may obtain a copy of the License at\n\t *\n\t * http://www.apache.org/licenses/LICENSE-2.0\n\t *\n\t * Unless required by applicable law or agreed to in writing, software\n\t * distributed under the License is distributed on an \"AS IS\" BASIS,\n\t * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\t * See the License for the specific language governing permissions and\n\t * limitations under the License.\n\t * ========================================================================\n\t */\n\t\n\t(function($, window) {\n\t var Tour, document;\n\t document = window.document;\n\t Tour = (function() {\n\t function Tour(options) {\n\t var storage;\n\t try {\n\t storage = window.localStorage;\n\t } catch (_error) {\n\t storage = false;\n\t }\n\t this._options = $.extend({\n\t name: 'tour',\n\t steps: [],\n\t container: 'body',\n\t autoscroll: true,\n\t keyboard: true,\n\t storage: storage,\n\t debug: false,\n\t backdrop: false,\n\t backdropPadding: 0,\n\t redirect: true,\n\t orphan: false,\n\t duration: false,\n\t delay: false,\n\t basePath: '',\n\t template: '

                                    ',\n\t afterSetState: function(key, value) {},\n\t afterGetState: function(key, value) {},\n\t afterRemoveState: function(key) {},\n\t onStart: function(tour) {},\n\t onEnd: function(tour) {},\n\t onShow: function(tour) {},\n\t onShown: function(tour) {},\n\t onHide: function(tour) {},\n\t onHidden: function(tour) {},\n\t onNext: function(tour) {},\n\t onPrev: function(tour) {},\n\t onPause: function(tour, duration) {},\n\t onResume: function(tour, duration) {}\n\t }, options);\n\t this._force = false;\n\t this._inited = false;\n\t this.backdrop = {\n\t overlay: null,\n\t $element: null,\n\t $background: null,\n\t backgroundShown: false,\n\t overlayElementShown: false\n\t };\n\t this;\n\t }\n\t\n\t Tour.prototype.addSteps = function(steps) {\n\t var step, _i, _len;\n\t for (_i = 0, _len = steps.length; _i < _len; _i++) {\n\t step = steps[_i];\n\t this.addStep(step);\n\t }\n\t return this;\n\t };\n\t\n\t Tour.prototype.addStep = function(step) {\n\t this._options.steps.push(step);\n\t return this;\n\t };\n\t\n\t Tour.prototype.getStep = function(i) {\n\t if (this._options.steps[i] != null) {\n\t return $.extend({\n\t id: \"step-\" + i,\n\t path: '',\n\t placement: 'right',\n\t title: '',\n\t content: '

                                    ',\n\t next: i === this._options.steps.length - 1 ? -1 : i + 1,\n\t prev: i - 1,\n\t animation: true,\n\t container: this._options.container,\n\t autoscroll: this._options.autoscroll,\n\t backdrop: this._options.backdrop,\n\t backdropPadding: this._options.backdropPadding,\n\t redirect: this._options.redirect,\n\t orphan: this._options.orphan,\n\t duration: this._options.duration,\n\t delay: this._options.delay,\n\t template: this._options.template,\n\t onShow: this._options.onShow,\n\t onShown: this._options.onShown,\n\t onHide: this._options.onHide,\n\t onHidden: this._options.onHidden,\n\t onNext: this._options.onNext,\n\t onPrev: this._options.onPrev,\n\t onPause: this._options.onPause,\n\t onResume: this._options.onResume\n\t }, this._options.steps[i]);\n\t }\n\t };\n\t\n\t Tour.prototype.init = function(force) {\n\t this._force = force;\n\t if (this.ended()) {\n\t this._debug('Tour ended, init prevented.');\n\t return this;\n\t }\n\t this.setCurrentStep();\n\t this._initMouseNavigation();\n\t this._initKeyboardNavigation();\n\t this._onResize((function(_this) {\n\t return function() {\n\t return _this.showStep(_this._current);\n\t };\n\t })(this));\n\t if (this._current !== null) {\n\t this.showStep(this._current);\n\t }\n\t this._inited = true;\n\t return this;\n\t };\n\t\n\t Tour.prototype.start = function(force) {\n\t var promise;\n\t if (force == null) {\n\t force = false;\n\t }\n\t if (!this._inited) {\n\t this.init(force);\n\t }\n\t if (this._current === null) {\n\t promise = this._makePromise(this._options.onStart != null ? this._options.onStart(this) : void 0);\n\t this._callOnPromiseDone(promise, this.showStep, 0);\n\t }\n\t return this;\n\t };\n\t\n\t Tour.prototype.next = function() {\n\t var promise;\n\t promise = this.hideStep(this._current);\n\t return this._callOnPromiseDone(promise, this._showNextStep);\n\t };\n\t\n\t Tour.prototype.prev = function() {\n\t var promise;\n\t promise = this.hideStep(this._current);\n\t return this._callOnPromiseDone(promise, this._showPrevStep);\n\t };\n\t\n\t Tour.prototype.goTo = function(i) {\n\t var promise;\n\t promise = this.hideStep(this._current);\n\t return this._callOnPromiseDone(promise, this.showStep, i);\n\t };\n\t\n\t Tour.prototype.end = function() {\n\t var endHelper, promise;\n\t endHelper = (function(_this) {\n\t return function(e) {\n\t $(document).off(\"click.tour-\" + _this._options.name);\n\t $(document).off(\"keyup.tour-\" + _this._options.name);\n\t $(window).off(\"resize.tour-\" + _this._options.name);\n\t _this._setState('end', 'yes');\n\t _this._inited = false;\n\t _this._force = false;\n\t _this._clearTimer();\n\t if (_this._options.onEnd != null) {\n\t return _this._options.onEnd(_this);\n\t }\n\t };\n\t })(this);\n\t promise = this.hideStep(this._current);\n\t return this._callOnPromiseDone(promise, endHelper);\n\t };\n\t\n\t Tour.prototype.ended = function() {\n\t return !this._force && !!this._getState('end');\n\t };\n\t\n\t Tour.prototype.restart = function() {\n\t this._removeState('current_step');\n\t this._removeState('end');\n\t return this.start();\n\t };\n\t\n\t Tour.prototype.pause = function() {\n\t var step;\n\t step = this.getStep(this._current);\n\t if (!(step && step.duration)) {\n\t return this;\n\t }\n\t this._paused = true;\n\t this._duration -= new Date().getTime() - this._start;\n\t window.clearTimeout(this._timer);\n\t this._debug(\"Paused/Stopped step \" + (this._current + 1) + \" timer (\" + this._duration + \" remaining).\");\n\t if (step.onPause != null) {\n\t return step.onPause(this, this._duration);\n\t }\n\t };\n\t\n\t Tour.prototype.resume = function() {\n\t var step;\n\t step = this.getStep(this._current);\n\t if (!(step && step.duration)) {\n\t return this;\n\t }\n\t this._paused = false;\n\t this._start = new Date().getTime();\n\t this._duration = this._duration || step.duration;\n\t this._timer = window.setTimeout((function(_this) {\n\t return function() {\n\t if (_this._isLast()) {\n\t return _this.next();\n\t } else {\n\t return _this.end();\n\t }\n\t };\n\t })(this), this._duration);\n\t this._debug(\"Started step \" + (this._current + 1) + \" timer with duration \" + this._duration);\n\t if ((step.onResume != null) && this._duration !== step.duration) {\n\t return step.onResume(this, this._duration);\n\t }\n\t };\n\t\n\t Tour.prototype.hideStep = function(i) {\n\t var hideStepHelper, promise, step;\n\t step = this.getStep(i);\n\t if (!step) {\n\t return;\n\t }\n\t this._clearTimer();\n\t promise = this._makePromise(step.onHide != null ? step.onHide(this, i) : void 0);\n\t hideStepHelper = (function(_this) {\n\t return function(e) {\n\t var $element;\n\t $element = $(step.element);\n\t if (!($element.data('bs.popover') || $element.data('popover'))) {\n\t $element = $('body');\n\t }\n\t $element.popover('destroy').removeClass(\"tour-\" + _this._options.name + \"-element tour-\" + _this._options.name + \"-\" + i + \"-element\");\n\t if (step.reflex) {\n\t $element.removeClass('tour-step-element-reflex').off(\"\" + (_this._reflexEvent(step.reflex)) + \".tour-\" + _this._options.name);\n\t }\n\t if (step.backdrop) {\n\t _this._hideBackdrop();\n\t }\n\t if (step.onHidden != null) {\n\t return step.onHidden(_this);\n\t }\n\t };\n\t })(this);\n\t this._callOnPromiseDone(promise, hideStepHelper);\n\t return promise;\n\t };\n\t\n\t Tour.prototype.showStep = function(i) {\n\t var promise, showStepHelper, skipToPrevious, step;\n\t if (this.ended()) {\n\t this._debug('Tour ended, showStep prevented.');\n\t return this;\n\t }\n\t step = this.getStep(i);\n\t if (!step) {\n\t return;\n\t }\n\t skipToPrevious = i < this._current;\n\t promise = this._makePromise(step.onShow != null ? step.onShow(this, i) : void 0);\n\t showStepHelper = (function(_this) {\n\t return function(e) {\n\t var current_path, path, showPopoverAndOverlay;\n\t _this.setCurrentStep(i);\n\t path = (function() {\n\t switch ({}.toString.call(step.path)) {\n\t case '[object Function]':\n\t return step.path();\n\t case '[object String]':\n\t return this._options.basePath + step.path;\n\t default:\n\t return step.path;\n\t }\n\t }).call(_this);\n\t current_path = [document.location.pathname, document.location.hash].join('');\n\t if (_this._isRedirect(path, current_path)) {\n\t _this._redirect(step, path);\n\t return;\n\t }\n\t if (_this._isOrphan(step)) {\n\t if (!step.orphan) {\n\t _this._debug(\"Skip the orphan step \" + (_this._current + 1) + \".\\nOrphan option is false and the element does not exist or is hidden.\");\n\t if (skipToPrevious) {\n\t _this._showPrevStep();\n\t } else {\n\t _this._showNextStep();\n\t }\n\t return;\n\t }\n\t _this._debug(\"Show the orphan step \" + (_this._current + 1) + \". Orphans option is true.\");\n\t }\n\t if (step.backdrop) {\n\t _this._showBackdrop(!_this._isOrphan(step) ? step.element : void 0);\n\t }\n\t showPopoverAndOverlay = function() {\n\t if (_this.getCurrentStep() !== i) {\n\t return;\n\t }\n\t if ((step.element != null) && step.backdrop) {\n\t _this._showOverlayElement(step);\n\t }\n\t _this._showPopover(step, i);\n\t if (step.onShown != null) {\n\t step.onShown(_this);\n\t }\n\t return _this._debug(\"Step \" + (_this._current + 1) + \" of \" + _this._options.steps.length);\n\t };\n\t if (step.autoscroll) {\n\t _this._scrollIntoView(step.element, showPopoverAndOverlay);\n\t } else {\n\t showPopoverAndOverlay();\n\t }\n\t if (step.duration) {\n\t return _this.resume();\n\t }\n\t };\n\t })(this);\n\t if (step.delay) {\n\t this._debug(\"Wait \" + step.delay + \" milliseconds to show the step \" + (this._current + 1));\n\t window.setTimeout((function(_this) {\n\t return function() {\n\t return _this._callOnPromiseDone(promise, showStepHelper);\n\t };\n\t })(this), step.delay);\n\t } else {\n\t this._callOnPromiseDone(promise, showStepHelper);\n\t }\n\t return promise;\n\t };\n\t\n\t Tour.prototype.getCurrentStep = function() {\n\t return this._current;\n\t };\n\t\n\t Tour.prototype.setCurrentStep = function(value) {\n\t if (value != null) {\n\t this._current = value;\n\t this._setState('current_step', value);\n\t } else {\n\t this._current = this._getState('current_step');\n\t this._current = this._current === null ? null : parseInt(this._current, 10);\n\t }\n\t return this;\n\t };\n\t\n\t Tour.prototype._setState = function(key, value) {\n\t var e, keyName;\n\t if (this._options.storage) {\n\t keyName = \"\" + this._options.name + \"_\" + key;\n\t try {\n\t this._options.storage.setItem(keyName, value);\n\t } catch (_error) {\n\t e = _error;\n\t if (e.code === DOMException.QUOTA_EXCEEDED_ERR) {\n\t this._debug('LocalStorage quota exceeded. State storage failed.');\n\t }\n\t }\n\t return this._options.afterSetState(keyName, value);\n\t } else {\n\t if (this._state == null) {\n\t this._state = {};\n\t }\n\t return this._state[key] = value;\n\t }\n\t };\n\t\n\t Tour.prototype._removeState = function(key) {\n\t var keyName;\n\t if (this._options.storage) {\n\t keyName = \"\" + this._options.name + \"_\" + key;\n\t this._options.storage.removeItem(keyName);\n\t return this._options.afterRemoveState(keyName);\n\t } else {\n\t if (this._state != null) {\n\t return delete this._state[key];\n\t }\n\t }\n\t };\n\t\n\t Tour.prototype._getState = function(key) {\n\t var keyName, value;\n\t if (this._options.storage) {\n\t keyName = \"\" + this._options.name + \"_\" + key;\n\t value = this._options.storage.getItem(keyName);\n\t } else {\n\t if (this._state != null) {\n\t value = this._state[key];\n\t }\n\t }\n\t if (value === void 0 || value === 'null') {\n\t value = null;\n\t }\n\t this._options.afterGetState(key, value);\n\t return value;\n\t };\n\t\n\t Tour.prototype._showNextStep = function() {\n\t var promise, showNextStepHelper, step;\n\t step = this.getStep(this._current);\n\t showNextStepHelper = (function(_this) {\n\t return function(e) {\n\t return _this.showStep(step.next);\n\t };\n\t })(this);\n\t promise = this._makePromise(step.onNext != null ? step.onNext(this) : void 0);\n\t return this._callOnPromiseDone(promise, showNextStepHelper);\n\t };\n\t\n\t Tour.prototype._showPrevStep = function() {\n\t var promise, showPrevStepHelper, step;\n\t step = this.getStep(this._current);\n\t showPrevStepHelper = (function(_this) {\n\t return function(e) {\n\t return _this.showStep(step.prev);\n\t };\n\t })(this);\n\t promise = this._makePromise(step.onPrev != null ? step.onPrev(this) : void 0);\n\t return this._callOnPromiseDone(promise, showPrevStepHelper);\n\t };\n\t\n\t Tour.prototype._debug = function(text) {\n\t if (this._options.debug) {\n\t return window.console.log(\"Bootstrap Tour '\" + this._options.name + \"' | \" + text);\n\t }\n\t };\n\t\n\t Tour.prototype._isRedirect = function(path, currentPath) {\n\t return (path != null) && path !== '' && (({}.toString.call(path) === '[object RegExp]' && !path.test(currentPath)) || ({}.toString.call(path) === '[object String]' && path.replace(/\\?.*$/, '').replace(/\\/?$/, '') !== currentPath.replace(/\\/?$/, '')));\n\t };\n\t\n\t Tour.prototype._redirect = function(step, path) {\n\t if ($.isFunction(step.redirect)) {\n\t return step.redirect.call(this, path);\n\t } else if (step.redirect === true) {\n\t this._debug(\"Redirect to \" + path);\n\t return document.location.href = path;\n\t }\n\t };\n\t\n\t Tour.prototype._isOrphan = function(step) {\n\t return (step.element == null) || !$(step.element).length || $(step.element).is(':hidden') && ($(step.element)[0].namespaceURI !== 'http://www.w3.org/2000/svg');\n\t };\n\t\n\t Tour.prototype._isLast = function() {\n\t return this._current < this._options.steps.length - 1;\n\t };\n\t\n\t Tour.prototype._showPopover = function(step, i) {\n\t var $element, $tip, isOrphan, options;\n\t $(\".tour-\" + this._options.name).remove();\n\t options = $.extend({}, this._options);\n\t isOrphan = this._isOrphan(step);\n\t step.template = this._template(step, i);\n\t if (isOrphan) {\n\t step.element = 'body';\n\t step.placement = 'top';\n\t }\n\t $element = $(step.element);\n\t $element.addClass(\"tour-\" + this._options.name + \"-element tour-\" + this._options.name + \"-\" + i + \"-element\");\n\t if (step.options) {\n\t $.extend(options, step.options);\n\t }\n\t if (step.reflex && !isOrphan) {\n\t $element.addClass('tour-step-element-reflex');\n\t $element.off(\"\" + (this._reflexEvent(step.reflex)) + \".tour-\" + this._options.name);\n\t $element.on(\"\" + (this._reflexEvent(step.reflex)) + \".tour-\" + this._options.name, (function(_this) {\n\t return function() {\n\t if (_this._isLast()) {\n\t return _this.next();\n\t } else {\n\t return _this.end();\n\t }\n\t };\n\t })(this));\n\t }\n\t $element.popover({\n\t placement: step.placement,\n\t trigger: 'manual',\n\t title: step.title,\n\t content: step.content,\n\t html: true,\n\t animation: step.animation,\n\t container: step.container,\n\t template: step.template,\n\t selector: step.element\n\t }).popover('show');\n\t $tip = $element.data('bs.popover') ? $element.data('bs.popover').tip() : $element.data('popover').tip();\n\t $tip.attr('id', step.id);\n\t this._reposition($tip, step);\n\t if (isOrphan) {\n\t return this._center($tip);\n\t }\n\t };\n\t\n\t Tour.prototype._template = function(step, i) {\n\t var $navigation, $next, $prev, $resume, $template;\n\t $template = $.isFunction(step.template) ? $(step.template(i, step)) : $(step.template);\n\t $navigation = $template.find('.popover-navigation');\n\t $prev = $navigation.find('[data-role=\"prev\"]');\n\t $next = $navigation.find('[data-role=\"next\"]');\n\t $resume = $navigation.find('[data-role=\"pause-resume\"]');\n\t if (this._isOrphan(step)) {\n\t $template.addClass('orphan');\n\t }\n\t $template.addClass(\"tour-\" + this._options.name + \" tour-\" + this._options.name + \"-\" + i);\n\t if (step.prev < 0) {\n\t $prev.addClass('disabled');\n\t }\n\t if (step.next < 0) {\n\t $next.addClass('disabled');\n\t }\n\t if (!step.duration) {\n\t $resume.remove();\n\t }\n\t return $template.clone().wrap('
                                    ').parent().html();\n\t };\n\t\n\t Tour.prototype._reflexEvent = function(reflex) {\n\t if ({}.toString.call(reflex) === '[object Boolean]') {\n\t return 'click';\n\t } else {\n\t return reflex;\n\t }\n\t };\n\t\n\t Tour.prototype._reposition = function($tip, step) {\n\t var offsetBottom, offsetHeight, offsetRight, offsetWidth, originalLeft, originalTop, tipOffset;\n\t offsetWidth = $tip[0].offsetWidth;\n\t offsetHeight = $tip[0].offsetHeight;\n\t tipOffset = $tip.offset();\n\t originalLeft = tipOffset.left;\n\t originalTop = tipOffset.top;\n\t offsetBottom = $(document).outerHeight() - tipOffset.top - $tip.outerHeight();\n\t if (offsetBottom < 0) {\n\t tipOffset.top = tipOffset.top + offsetBottom;\n\t }\n\t offsetRight = $('html').outerWidth() - tipOffset.left - $tip.outerWidth();\n\t if (offsetRight < 0) {\n\t tipOffset.left = tipOffset.left + offsetRight;\n\t }\n\t if (tipOffset.top < 0) {\n\t tipOffset.top = 0;\n\t }\n\t if (tipOffset.left < 0) {\n\t tipOffset.left = 0;\n\t }\n\t $tip.offset(tipOffset);\n\t if (step.placement === 'bottom' || step.placement === 'top') {\n\t if (originalLeft !== tipOffset.left) {\n\t return this._replaceArrow($tip, (tipOffset.left - originalLeft) * 2, offsetWidth, 'left');\n\t }\n\t } else {\n\t if (originalTop !== tipOffset.top) {\n\t return this._replaceArrow($tip, (tipOffset.top - originalTop) * 2, offsetHeight, 'top');\n\t }\n\t }\n\t };\n\t\n\t Tour.prototype._center = function($tip) {\n\t return $tip.css('top', $(window).outerHeight() / 2 - $tip.outerHeight() / 2);\n\t };\n\t\n\t Tour.prototype._replaceArrow = function($tip, delta, dimension, position) {\n\t return $tip.find('.arrow').css(position, delta ? 50 * (1 - delta / dimension) + '%' : '');\n\t };\n\t\n\t Tour.prototype._scrollIntoView = function(element, callback) {\n\t var $element, $window, counter, offsetTop, scrollTop, windowHeight;\n\t $element = $(element);\n\t if (!$element.length) {\n\t return callback();\n\t }\n\t $window = $(window);\n\t offsetTop = $element.offset().top;\n\t windowHeight = $window.height();\n\t scrollTop = Math.max(0, offsetTop - (windowHeight / 2));\n\t this._debug(\"Scroll into view. ScrollTop: \" + scrollTop + \". Element offset: \" + offsetTop + \". Window height: \" + windowHeight + \".\");\n\t counter = 0;\n\t return $('body, html').stop(true, true).animate({\n\t scrollTop: Math.ceil(scrollTop)\n\t }, (function(_this) {\n\t return function() {\n\t if (++counter === 2) {\n\t callback();\n\t return _this._debug(\"Scroll into view.\\nAnimation end element offset: \" + ($element.offset().top) + \".\\nWindow height: \" + ($window.height()) + \".\");\n\t }\n\t };\n\t })(this));\n\t };\n\t\n\t Tour.prototype._onResize = function(callback, timeout) {\n\t return $(window).on(\"resize.tour-\" + this._options.name, function() {\n\t clearTimeout(timeout);\n\t return timeout = setTimeout(callback, 100);\n\t });\n\t };\n\t\n\t Tour.prototype._initMouseNavigation = function() {\n\t var _this;\n\t _this = this;\n\t return $(document).off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='prev']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='next']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='end']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='pause-resume']\").on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='next']\", (function(_this) {\n\t return function(e) {\n\t e.preventDefault();\n\t return _this.next();\n\t };\n\t })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='prev']\", (function(_this) {\n\t return function(e) {\n\t e.preventDefault();\n\t return _this.prev();\n\t };\n\t })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='end']\", (function(_this) {\n\t return function(e) {\n\t e.preventDefault();\n\t return _this.end();\n\t };\n\t })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='pause-resume']\", function(e) {\n\t var $this;\n\t e.preventDefault();\n\t $this = $(this);\n\t $this.text(_this._paused ? $this.data('pause-text') : $this.data('resume-text'));\n\t if (_this._paused) {\n\t return _this.resume();\n\t } else {\n\t return _this.pause();\n\t }\n\t });\n\t };\n\t\n\t Tour.prototype._initKeyboardNavigation = function() {\n\t if (!this._options.keyboard) {\n\t return;\n\t }\n\t return $(document).on(\"keyup.tour-\" + this._options.name, (function(_this) {\n\t return function(e) {\n\t if (!e.which) {\n\t return;\n\t }\n\t switch (e.which) {\n\t case 39:\n\t e.preventDefault();\n\t if (_this._isLast()) {\n\t return _this.next();\n\t } else {\n\t return _this.end();\n\t }\n\t break;\n\t case 37:\n\t e.preventDefault();\n\t if (_this._current > 0) {\n\t return _this.prev();\n\t }\n\t break;\n\t case 27:\n\t e.preventDefault();\n\t return _this.end();\n\t }\n\t };\n\t })(this));\n\t };\n\t\n\t Tour.prototype._makePromise = function(result) {\n\t if (result && $.isFunction(result.then)) {\n\t return result;\n\t } else {\n\t return null;\n\t }\n\t };\n\t\n\t Tour.prototype._callOnPromiseDone = function(promise, cb, arg) {\n\t if (promise) {\n\t return promise.then((function(_this) {\n\t return function(e) {\n\t return cb.call(_this, arg);\n\t };\n\t })(this));\n\t } else {\n\t return cb.call(this, arg);\n\t }\n\t };\n\t\n\t Tour.prototype._showBackdrop = function(element) {\n\t if (this.backdrop.backgroundShown) {\n\t return;\n\t }\n\t this.backdrop = $('
                                    ', {\n\t \"class\": 'tour-backdrop'\n\t });\n\t this.backdrop.backgroundShown = true;\n\t return $('body').append(this.backdrop);\n\t };\n\t\n\t Tour.prototype._hideBackdrop = function() {\n\t this._hideOverlayElement();\n\t return this._hideBackground();\n\t };\n\t\n\t Tour.prototype._hideBackground = function() {\n\t if (this.backdrop) {\n\t this.backdrop.remove();\n\t this.backdrop.overlay = null;\n\t return this.backdrop.backgroundShown = false;\n\t }\n\t };\n\t\n\t Tour.prototype._showOverlayElement = function(step) {\n\t var $element, elementData;\n\t $element = $(step.element);\n\t if (!$element || $element.length === 0 || this.backdrop.overlayElementShown) {\n\t return;\n\t }\n\t this.backdrop.overlayElementShown = true;\n\t this.backdrop.$element = $element.addClass('tour-step-backdrop');\n\t this.backdrop.$background = $('
                                    ', {\n\t \"class\": 'tour-step-background'\n\t });\n\t elementData = {\n\t width: $element.innerWidth(),\n\t height: $element.innerHeight(),\n\t offset: $element.offset()\n\t };\n\t this.backdrop.$background.appendTo('body');\n\t if (step.backdropPadding) {\n\t elementData = this._applyBackdropPadding(step.backdropPadding, elementData);\n\t }\n\t return this.backdrop.$background.width(elementData.width).height(elementData.height).offset(elementData.offset);\n\t };\n\t\n\t Tour.prototype._hideOverlayElement = function() {\n\t if (!this.backdrop.overlayElementShown) {\n\t return;\n\t }\n\t this.backdrop.$element.removeClass('tour-step-backdrop');\n\t this.backdrop.$background.remove();\n\t this.backdrop.$element = null;\n\t this.backdrop.$background = null;\n\t return this.backdrop.overlayElementShown = false;\n\t };\n\t\n\t Tour.prototype._applyBackdropPadding = function(padding, data) {\n\t if (typeof padding === 'object') {\n\t if (padding.top == null) {\n\t padding.top = 0;\n\t }\n\t if (padding.right == null) {\n\t padding.right = 0;\n\t }\n\t if (padding.bottom == null) {\n\t padding.bottom = 0;\n\t }\n\t if (padding.left == null) {\n\t padding.left = 0;\n\t }\n\t data.offset.top = data.offset.top - padding.top;\n\t data.offset.left = data.offset.left - padding.left;\n\t data.width = data.width + padding.left + padding.right;\n\t data.height = data.height + padding.top + padding.bottom;\n\t } else {\n\t data.offset.top = data.offset.top - padding;\n\t data.offset.left = data.offset.left - padding;\n\t data.width = data.width + (padding * 2);\n\t data.height = data.height + (padding * 2);\n\t }\n\t return data;\n\t };\n\t\n\t Tour.prototype._clearTimer = function() {\n\t window.clearTimeout(this._timer);\n\t this._timer = null;\n\t return this._duration = null;\n\t };\n\t\n\t return Tour;\n\t\n\t })();\n\t return window.Tour = Tour;\n\t})(jQuery, window);\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/*!\n\t\n\t handlebars v3.0.3\n\t\n\tCopyright (C) 2011-2014 by Yehuda Katz\n\t\n\tPermission is hereby granted, free of charge, to any person obtaining a copy\n\tof this software and associated documentation files (the \"Software\"), to deal\n\tin the Software without restriction, including without limitation the rights\n\tto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\tcopies of the Software, and to permit persons to whom the Software is\n\tfurnished to do so, subject to the following conditions:\n\t\n\tThe above copyright notice and this permission notice shall be included in\n\tall copies or substantial portions of the Software.\n\t\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\tTHE SOFTWARE.\n\t\n\t@license\n\t*/\n\t(function webpackUniversalModuleDefinition(root, factory) {\n\t\tif(true)\n\t\t\tmodule.exports = factory();\n\t\telse if(typeof define === 'function' && define.amd)\n\t\t\tdefine(factory);\n\t\telse if(typeof exports === 'object')\n\t\t\texports[\"Handlebars\"] = factory();\n\t\telse\n\t\t\troot[\"Handlebars\"] = factory();\n\t})(this, function() {\n\treturn /******/ (function(modules) { // webpackBootstrap\n\t/******/ \t// The module cache\n\t/******/ \tvar installedModules = {};\n\t\n\t/******/ \t// The require function\n\t/******/ \tfunction __webpack_require__(moduleId) {\n\t\n\t/******/ \t\t// Check if module is in cache\n\t/******/ \t\tif(installedModules[moduleId])\n\t/******/ \t\t\treturn installedModules[moduleId].exports;\n\t\n\t/******/ \t\t// Create a new module (and put it into the cache)\n\t/******/ \t\tvar module = installedModules[moduleId] = {\n\t/******/ \t\t\texports: {},\n\t/******/ \t\t\tid: moduleId,\n\t/******/ \t\t\tloaded: false\n\t/******/ \t\t};\n\t\n\t/******/ \t\t// Execute the module function\n\t/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\t\n\t/******/ \t\t// Flag the module as loaded\n\t/******/ \t\tmodule.loaded = true;\n\t\n\t/******/ \t\t// Return the exports of the module\n\t/******/ \t\treturn module.exports;\n\t/******/ \t}\n\t\n\t\n\t/******/ \t// expose the modules object (__webpack_modules__)\n\t/******/ \t__webpack_require__.m = modules;\n\t\n\t/******/ \t// expose the module cache\n\t/******/ \t__webpack_require__.c = installedModules;\n\t\n\t/******/ \t// __webpack_public_path__\n\t/******/ \t__webpack_require__.p = \"\";\n\t\n\t/******/ \t// Load entry module and return exports\n\t/******/ \treturn __webpack_require__(0);\n\t/******/ })\n\t/************************************************************************/\n\t/******/ ([\n\t/* 0 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\t\n\t\texports.__esModule = true;\n\t\n\t\tvar _import = __webpack_require__(1);\n\t\n\t\tvar base = _interopRequireWildcard(_import);\n\t\n\t\t// Each of these augment the Handlebars object. No need to setup here.\n\t\t// (This is done to easily share code between commonjs and browse envs)\n\t\n\t\tvar _SafeString = __webpack_require__(2);\n\t\n\t\tvar _SafeString2 = _interopRequireWildcard(_SafeString);\n\t\n\t\tvar _Exception = __webpack_require__(3);\n\t\n\t\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\t\n\t\tvar _import2 = __webpack_require__(4);\n\t\n\t\tvar Utils = _interopRequireWildcard(_import2);\n\t\n\t\tvar _import3 = __webpack_require__(5);\n\t\n\t\tvar runtime = _interopRequireWildcard(_import3);\n\t\n\t\tvar _noConflict = __webpack_require__(6);\n\t\n\t\tvar _noConflict2 = _interopRequireWildcard(_noConflict);\n\t\n\t\t// For compatibility and usage outside of module systems, make the Handlebars object a namespace\n\t\tfunction create() {\n\t\t var hb = new base.HandlebarsEnvironment();\n\t\n\t\t Utils.extend(hb, base);\n\t\t hb.SafeString = _SafeString2['default'];\n\t\t hb.Exception = _Exception2['default'];\n\t\t hb.Utils = Utils;\n\t\t hb.escapeExpression = Utils.escapeExpression;\n\t\n\t\t hb.VM = runtime;\n\t\t hb.template = function (spec) {\n\t\t return runtime.template(spec, hb);\n\t\t };\n\t\n\t\t return hb;\n\t\t}\n\t\n\t\tvar inst = create();\n\t\tinst.create = create;\n\t\n\t\t_noConflict2['default'](inst);\n\t\n\t\tinst['default'] = inst;\n\t\n\t\texports['default'] = inst;\n\t\tmodule.exports = exports['default'];\n\t\n\t/***/ },\n\t/* 1 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\t\n\t\texports.__esModule = true;\n\t\texports.HandlebarsEnvironment = HandlebarsEnvironment;\n\t\texports.createFrame = createFrame;\n\t\n\t\tvar _import = __webpack_require__(4);\n\t\n\t\tvar Utils = _interopRequireWildcard(_import);\n\t\n\t\tvar _Exception = __webpack_require__(3);\n\t\n\t\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\t\n\t\tvar VERSION = '3.0.1';\n\t\texports.VERSION = VERSION;\n\t\tvar COMPILER_REVISION = 6;\n\t\n\t\texports.COMPILER_REVISION = COMPILER_REVISION;\n\t\tvar REVISION_CHANGES = {\n\t\t 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n\t\t 2: '== 1.0.0-rc.3',\n\t\t 3: '== 1.0.0-rc.4',\n\t\t 4: '== 1.x.x',\n\t\t 5: '== 2.0.0-alpha.x',\n\t\t 6: '>= 2.0.0-beta.1'\n\t\t};\n\t\n\t\texports.REVISION_CHANGES = REVISION_CHANGES;\n\t\tvar isArray = Utils.isArray,\n\t\t isFunction = Utils.isFunction,\n\t\t toString = Utils.toString,\n\t\t objectType = '[object Object]';\n\t\n\t\tfunction HandlebarsEnvironment(helpers, partials) {\n\t\t this.helpers = helpers || {};\n\t\t this.partials = partials || {};\n\t\n\t\t registerDefaultHelpers(this);\n\t\t}\n\t\n\t\tHandlebarsEnvironment.prototype = {\n\t\t constructor: HandlebarsEnvironment,\n\t\n\t\t logger: logger,\n\t\t log: log,\n\t\n\t\t registerHelper: function registerHelper(name, fn) {\n\t\t if (toString.call(name) === objectType) {\n\t\t if (fn) {\n\t\t throw new _Exception2['default']('Arg not supported with multiple helpers');\n\t\t }\n\t\t Utils.extend(this.helpers, name);\n\t\t } else {\n\t\t this.helpers[name] = fn;\n\t\t }\n\t\t },\n\t\t unregisterHelper: function unregisterHelper(name) {\n\t\t delete this.helpers[name];\n\t\t },\n\t\n\t\t registerPartial: function registerPartial(name, partial) {\n\t\t if (toString.call(name) === objectType) {\n\t\t Utils.extend(this.partials, name);\n\t\t } else {\n\t\t if (typeof partial === 'undefined') {\n\t\t throw new _Exception2['default']('Attempting to register a partial as undefined');\n\t\t }\n\t\t this.partials[name] = partial;\n\t\t }\n\t\t },\n\t\t unregisterPartial: function unregisterPartial(name) {\n\t\t delete this.partials[name];\n\t\t }\n\t\t};\n\t\n\t\tfunction registerDefaultHelpers(instance) {\n\t\t instance.registerHelper('helperMissing', function () {\n\t\t if (arguments.length === 1) {\n\t\t // A missing field in a {{foo}} constuct.\n\t\t return undefined;\n\t\t } else {\n\t\t // Someone is actually trying to call something, blow up.\n\t\t throw new _Exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n\t\t }\n\t\t });\n\t\n\t\t instance.registerHelper('blockHelperMissing', function (context, options) {\n\t\t var inverse = options.inverse,\n\t\t fn = options.fn;\n\t\n\t\t if (context === true) {\n\t\t return fn(this);\n\t\t } else if (context === false || context == null) {\n\t\t return inverse(this);\n\t\t } else if (isArray(context)) {\n\t\t if (context.length > 0) {\n\t\t if (options.ids) {\n\t\t options.ids = [options.name];\n\t\t }\n\t\n\t\t return instance.helpers.each(context, options);\n\t\t } else {\n\t\t return inverse(this);\n\t\t }\n\t\t } else {\n\t\t if (options.data && options.ids) {\n\t\t var data = createFrame(options.data);\n\t\t data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);\n\t\t options = { data: data };\n\t\t }\n\t\n\t\t return fn(context, options);\n\t\t }\n\t\t });\n\t\n\t\t instance.registerHelper('each', function (context, options) {\n\t\t if (!options) {\n\t\t throw new _Exception2['default']('Must pass iterator to #each');\n\t\t }\n\t\n\t\t var fn = options.fn,\n\t\t inverse = options.inverse,\n\t\t i = 0,\n\t\t ret = '',\n\t\t data = undefined,\n\t\t contextPath = undefined;\n\t\n\t\t if (options.data && options.ids) {\n\t\t contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n\t\t }\n\t\n\t\t if (isFunction(context)) {\n\t\t context = context.call(this);\n\t\t }\n\t\n\t\t if (options.data) {\n\t\t data = createFrame(options.data);\n\t\t }\n\t\n\t\t function execIteration(field, index, last) {\n\t\t if (data) {\n\t\t data.key = field;\n\t\t data.index = index;\n\t\t data.first = index === 0;\n\t\t data.last = !!last;\n\t\n\t\t if (contextPath) {\n\t\t data.contextPath = contextPath + field;\n\t\t }\n\t\t }\n\t\n\t\t ret = ret + fn(context[field], {\n\t\t data: data,\n\t\t blockParams: Utils.blockParams([context[field], field], [contextPath + field, null])\n\t\t });\n\t\t }\n\t\n\t\t if (context && typeof context === 'object') {\n\t\t if (isArray(context)) {\n\t\t for (var j = context.length; i < j; i++) {\n\t\t execIteration(i, i, i === context.length - 1);\n\t\t }\n\t\t } else {\n\t\t var priorKey = undefined;\n\t\n\t\t for (var key in context) {\n\t\t if (context.hasOwnProperty(key)) {\n\t\t // We're running the iterations one step out of sync so we can detect\n\t\t // the last iteration without have to scan the object twice and create\n\t\t // an itermediate keys array.\n\t\t if (priorKey) {\n\t\t execIteration(priorKey, i - 1);\n\t\t }\n\t\t priorKey = key;\n\t\t i++;\n\t\t }\n\t\t }\n\t\t if (priorKey) {\n\t\t execIteration(priorKey, i - 1, true);\n\t\t }\n\t\t }\n\t\t }\n\t\n\t\t if (i === 0) {\n\t\t ret = inverse(this);\n\t\t }\n\t\n\t\t return ret;\n\t\t });\n\t\n\t\t instance.registerHelper('if', function (conditional, options) {\n\t\t if (isFunction(conditional)) {\n\t\t conditional = conditional.call(this);\n\t\t }\n\t\n\t\t // Default behavior is to render the positive path if the value is truthy and not empty.\n\t\t // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n\t\t // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n\t\t if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) {\n\t\t return options.inverse(this);\n\t\t } else {\n\t\t return options.fn(this);\n\t\t }\n\t\t });\n\t\n\t\t instance.registerHelper('unless', function (conditional, options) {\n\t\t return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n\t\t });\n\t\n\t\t instance.registerHelper('with', function (context, options) {\n\t\t if (isFunction(context)) {\n\t\t context = context.call(this);\n\t\t }\n\t\n\t\t var fn = options.fn;\n\t\n\t\t if (!Utils.isEmpty(context)) {\n\t\t if (options.data && options.ids) {\n\t\t var data = createFrame(options.data);\n\t\t data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);\n\t\t options = { data: data };\n\t\t }\n\t\n\t\t return fn(context, options);\n\t\t } else {\n\t\t return options.inverse(this);\n\t\t }\n\t\t });\n\t\n\t\t instance.registerHelper('log', function (message, options) {\n\t\t var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;\n\t\t instance.log(level, message);\n\t\t });\n\t\n\t\t instance.registerHelper('lookup', function (obj, field) {\n\t\t return obj && obj[field];\n\t\t });\n\t\t}\n\t\n\t\tvar logger = {\n\t\t methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },\n\t\n\t\t // State enum\n\t\t DEBUG: 0,\n\t\t INFO: 1,\n\t\t WARN: 2,\n\t\t ERROR: 3,\n\t\t level: 1,\n\t\n\t\t // Can be overridden in the host environment\n\t\t log: function log(level, message) {\n\t\t if (typeof console !== 'undefined' && logger.level <= level) {\n\t\t var method = logger.methodMap[level];\n\t\t (console[method] || console.log).call(console, message); // eslint-disable-line no-console\n\t\t }\n\t\t }\n\t\t};\n\t\n\t\texports.logger = logger;\n\t\tvar log = logger.log;\n\t\n\t\texports.log = log;\n\t\n\t\tfunction createFrame(object) {\n\t\t var frame = Utils.extend({}, object);\n\t\t frame._parent = object;\n\t\t return frame;\n\t\t}\n\t\n\t\t/* [args, ]options */\n\t\n\t/***/ },\n\t/* 2 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\texports.__esModule = true;\n\t\t// Build out our basic SafeString type\n\t\tfunction SafeString(string) {\n\t\t this.string = string;\n\t\t}\n\t\n\t\tSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n\t\t return '' + this.string;\n\t\t};\n\t\n\t\texports['default'] = SafeString;\n\t\tmodule.exports = exports['default'];\n\t\n\t/***/ },\n\t/* 3 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\texports.__esModule = true;\n\t\n\t\tvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\t\n\t\tfunction Exception(message, node) {\n\t\t var loc = node && node.loc,\n\t\t line = undefined,\n\t\t column = undefined;\n\t\t if (loc) {\n\t\t line = loc.start.line;\n\t\t column = loc.start.column;\n\t\n\t\t message += ' - ' + line + ':' + column;\n\t\t }\n\t\n\t\t var tmp = Error.prototype.constructor.call(this, message);\n\t\n\t\t // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n\t\t for (var idx = 0; idx < errorProps.length; idx++) {\n\t\t this[errorProps[idx]] = tmp[errorProps[idx]];\n\t\t }\n\t\n\t\t if (Error.captureStackTrace) {\n\t\t Error.captureStackTrace(this, Exception);\n\t\t }\n\t\n\t\t if (loc) {\n\t\t this.lineNumber = line;\n\t\t this.column = column;\n\t\t }\n\t\t}\n\t\n\t\tException.prototype = new Error();\n\t\n\t\texports['default'] = Exception;\n\t\tmodule.exports = exports['default'];\n\t\n\t/***/ },\n\t/* 4 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\texports.__esModule = true;\n\t\texports.extend = extend;\n\t\n\t\t// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\t\texports.indexOf = indexOf;\n\t\texports.escapeExpression = escapeExpression;\n\t\texports.isEmpty = isEmpty;\n\t\texports.blockParams = blockParams;\n\t\texports.appendContextPath = appendContextPath;\n\t\tvar escape = {\n\t\t '&': '&',\n\t\t '<': '<',\n\t\t '>': '>',\n\t\t '\"': '"',\n\t\t '\\'': ''',\n\t\t '`': '`'\n\t\t};\n\t\n\t\tvar badChars = /[&<>\"'`]/g,\n\t\t possible = /[&<>\"'`]/;\n\t\n\t\tfunction escapeChar(chr) {\n\t\t return escape[chr];\n\t\t}\n\t\n\t\tfunction extend(obj /* , ...source */) {\n\t\t for (var i = 1; i < arguments.length; i++) {\n\t\t for (var key in arguments[i]) {\n\t\t if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n\t\t obj[key] = arguments[i][key];\n\t\t }\n\t\t }\n\t\t }\n\t\n\t\t return obj;\n\t\t}\n\t\n\t\tvar toString = Object.prototype.toString;\n\t\n\t\texports.toString = toString;\n\t\t// Sourced from lodash\n\t\t// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n\t\t/*eslint-disable func-style, no-var */\n\t\tvar isFunction = function isFunction(value) {\n\t\t return typeof value === 'function';\n\t\t};\n\t\t// fallback for older versions of Chrome and Safari\n\t\t/* istanbul ignore next */\n\t\tif (isFunction(/x/)) {\n\t\t exports.isFunction = isFunction = function (value) {\n\t\t return typeof value === 'function' && toString.call(value) === '[object Function]';\n\t\t };\n\t\t}\n\t\tvar isFunction;\n\t\texports.isFunction = isFunction;\n\t\t/*eslint-enable func-style, no-var */\n\t\n\t\t/* istanbul ignore next */\n\t\tvar isArray = Array.isArray || function (value) {\n\t\t return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n\t\t};exports.isArray = isArray;\n\t\n\t\tfunction indexOf(array, value) {\n\t\t for (var i = 0, len = array.length; i < len; i++) {\n\t\t if (array[i] === value) {\n\t\t return i;\n\t\t }\n\t\t }\n\t\t return -1;\n\t\t}\n\t\n\t\tfunction escapeExpression(string) {\n\t\t if (typeof string !== 'string') {\n\t\t // don't escape SafeStrings, since they're already safe\n\t\t if (string && string.toHTML) {\n\t\t return string.toHTML();\n\t\t } else if (string == null) {\n\t\t return '';\n\t\t } else if (!string) {\n\t\t return string + '';\n\t\t }\n\t\n\t\t // Force a string conversion as this will be done by the append regardless and\n\t\t // the regex test will do this transparently behind the scenes, causing issues if\n\t\t // an object's to string has escaped characters in it.\n\t\t string = '' + string;\n\t\t }\n\t\n\t\t if (!possible.test(string)) {\n\t\t return string;\n\t\t }\n\t\t return string.replace(badChars, escapeChar);\n\t\t}\n\t\n\t\tfunction isEmpty(value) {\n\t\t if (!value && value !== 0) {\n\t\t return true;\n\t\t } else if (isArray(value) && value.length === 0) {\n\t\t return true;\n\t\t } else {\n\t\t return false;\n\t\t }\n\t\t}\n\t\n\t\tfunction blockParams(params, ids) {\n\t\t params.path = ids;\n\t\t return params;\n\t\t}\n\t\n\t\tfunction appendContextPath(contextPath, id) {\n\t\t return (contextPath ? contextPath + '.' : '') + id;\n\t\t}\n\t\n\t/***/ },\n\t/* 5 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t'use strict';\n\t\n\t\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\t\n\t\texports.__esModule = true;\n\t\texports.checkRevision = checkRevision;\n\t\n\t\t// TODO: Remove this line and break up compilePartial\n\t\n\t\texports.template = template;\n\t\texports.wrapProgram = wrapProgram;\n\t\texports.resolvePartial = resolvePartial;\n\t\texports.invokePartial = invokePartial;\n\t\texports.noop = noop;\n\t\n\t\tvar _import = __webpack_require__(4);\n\t\n\t\tvar Utils = _interopRequireWildcard(_import);\n\t\n\t\tvar _Exception = __webpack_require__(3);\n\t\n\t\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\t\n\t\tvar _COMPILER_REVISION$REVISION_CHANGES$createFrame = __webpack_require__(1);\n\t\n\t\tfunction checkRevision(compilerInfo) {\n\t\t var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n\t\t currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION;\n\t\n\t\t if (compilerRevision !== currentRevision) {\n\t\t if (compilerRevision < currentRevision) {\n\t\t var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision],\n\t\t compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision];\n\t\t throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n\t\t } else {\n\t\t // Use the embedded version info since the runtime doesn't know about this revision yet\n\t\t throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n\t\t }\n\t\t }\n\t\t}\n\t\n\t\tfunction template(templateSpec, env) {\n\t\t /* istanbul ignore next */\n\t\t if (!env) {\n\t\t throw new _Exception2['default']('No environment passed to template');\n\t\t }\n\t\t if (!templateSpec || !templateSpec.main) {\n\t\t throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec);\n\t\t }\n\t\n\t\t // Note: Using env.VM references rather than local var references throughout this section to allow\n\t\t // for external users to override these as psuedo-supported APIs.\n\t\t env.VM.checkRevision(templateSpec.compiler);\n\t\n\t\t function invokePartialWrapper(partial, context, options) {\n\t\t if (options.hash) {\n\t\t context = Utils.extend({}, context, options.hash);\n\t\t }\n\t\n\t\t partial = env.VM.resolvePartial.call(this, partial, context, options);\n\t\t var result = env.VM.invokePartial.call(this, partial, context, options);\n\t\n\t\t if (result == null && env.compile) {\n\t\t options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n\t\t result = options.partials[options.name](context, options);\n\t\t }\n\t\t if (result != null) {\n\t\t if (options.indent) {\n\t\t var lines = result.split('\\n');\n\t\t for (var i = 0, l = lines.length; i < l; i++) {\n\t\t if (!lines[i] && i + 1 === l) {\n\t\t break;\n\t\t }\n\t\n\t\t lines[i] = options.indent + lines[i];\n\t\t }\n\t\t result = lines.join('\\n');\n\t\t }\n\t\t return result;\n\t\t } else {\n\t\t throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n\t\t }\n\t\t }\n\t\n\t\t // Just add water\n\t\t var container = {\n\t\t strict: function strict(obj, name) {\n\t\t if (!(name in obj)) {\n\t\t throw new _Exception2['default']('\"' + name + '\" not defined in ' + obj);\n\t\t }\n\t\t return obj[name];\n\t\t },\n\t\t lookup: function lookup(depths, name) {\n\t\t var len = depths.length;\n\t\t for (var i = 0; i < len; i++) {\n\t\t if (depths[i] && depths[i][name] != null) {\n\t\t return depths[i][name];\n\t\t }\n\t\t }\n\t\t },\n\t\t lambda: function lambda(current, context) {\n\t\t return typeof current === 'function' ? current.call(context) : current;\n\t\t },\n\t\n\t\t escapeExpression: Utils.escapeExpression,\n\t\t invokePartial: invokePartialWrapper,\n\t\n\t\t fn: function fn(i) {\n\t\t return templateSpec[i];\n\t\t },\n\t\n\t\t programs: [],\n\t\t program: function program(i, data, declaredBlockParams, blockParams, depths) {\n\t\t var programWrapper = this.programs[i],\n\t\t fn = this.fn(i);\n\t\t if (data || depths || blockParams || declaredBlockParams) {\n\t\t programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n\t\t } else if (!programWrapper) {\n\t\t programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n\t\t }\n\t\t return programWrapper;\n\t\t },\n\t\n\t\t data: function data(value, depth) {\n\t\t while (value && depth--) {\n\t\t value = value._parent;\n\t\t }\n\t\t return value;\n\t\t },\n\t\t merge: function merge(param, common) {\n\t\t var obj = param || common;\n\t\n\t\t if (param && common && param !== common) {\n\t\t obj = Utils.extend({}, common, param);\n\t\t }\n\t\n\t\t return obj;\n\t\t },\n\t\n\t\t noop: env.VM.noop,\n\t\t compilerInfo: templateSpec.compiler\n\t\t };\n\t\n\t\t function ret(context) {\n\t\t var options = arguments[1] === undefined ? {} : arguments[1];\n\t\n\t\t var data = options.data;\n\t\n\t\t ret._setup(options);\n\t\t if (!options.partial && templateSpec.useData) {\n\t\t data = initData(context, data);\n\t\t }\n\t\t var depths = undefined,\n\t\t blockParams = templateSpec.useBlockParams ? [] : undefined;\n\t\t if (templateSpec.useDepths) {\n\t\t depths = options.depths ? [context].concat(options.depths) : [context];\n\t\t }\n\t\n\t\t return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths);\n\t\t }\n\t\t ret.isTop = true;\n\t\n\t\t ret._setup = function (options) {\n\t\t if (!options.partial) {\n\t\t container.helpers = container.merge(options.helpers, env.helpers);\n\t\n\t\t if (templateSpec.usePartial) {\n\t\t container.partials = container.merge(options.partials, env.partials);\n\t\t }\n\t\t } else {\n\t\t container.helpers = options.helpers;\n\t\t container.partials = options.partials;\n\t\t }\n\t\t };\n\t\n\t\t ret._child = function (i, data, blockParams, depths) {\n\t\t if (templateSpec.useBlockParams && !blockParams) {\n\t\t throw new _Exception2['default']('must pass block params');\n\t\t }\n\t\t if (templateSpec.useDepths && !depths) {\n\t\t throw new _Exception2['default']('must pass parent depths');\n\t\t }\n\t\n\t\t return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n\t\t };\n\t\t return ret;\n\t\t}\n\t\n\t\tfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n\t\t function prog(context) {\n\t\t var options = arguments[1] === undefined ? {} : arguments[1];\n\t\n\t\t return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths));\n\t\t }\n\t\t prog.program = i;\n\t\t prog.depth = depths ? depths.length : 0;\n\t\t prog.blockParams = declaredBlockParams || 0;\n\t\t return prog;\n\t\t}\n\t\n\t\tfunction resolvePartial(partial, context, options) {\n\t\t if (!partial) {\n\t\t partial = options.partials[options.name];\n\t\t } else if (!partial.call && !options.name) {\n\t\t // This is a dynamic partial that returned a string\n\t\t options.name = partial;\n\t\t partial = options.partials[partial];\n\t\t }\n\t\t return partial;\n\t\t}\n\t\n\t\tfunction invokePartial(partial, context, options) {\n\t\t options.partial = true;\n\t\n\t\t if (partial === undefined) {\n\t\t throw new _Exception2['default']('The partial ' + options.name + ' could not be found');\n\t\t } else if (partial instanceof Function) {\n\t\t return partial(context, options);\n\t\t }\n\t\t}\n\t\n\t\tfunction noop() {\n\t\t return '';\n\t\t}\n\t\n\t\tfunction initData(context, data) {\n\t\t if (!data || !('root' in data)) {\n\t\t data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {};\n\t\t data.root = context;\n\t\t }\n\t\t return data;\n\t\t}\n\t\n\t/***/ },\n\t/* 6 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\t\n\t\texports.__esModule = true;\n\t\t/*global window */\n\t\n\t\texports['default'] = function (Handlebars) {\n\t\t /* istanbul ignore next */\n\t\t var root = typeof global !== 'undefined' ? global : window,\n\t\t $Handlebars = root.Handlebars;\n\t\t /* istanbul ignore next */\n\t\t Handlebars.noConflict = function () {\n\t\t if (root.Handlebars === Handlebars) {\n\t\t root.Handlebars = $Handlebars;\n\t\t }\n\t\t };\n\t\t};\n\t\n\t\tmodule.exports = exports['default'];\n\t\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\t\n\t/***/ },\n\t/* 7 */\n\t/***/ function(module, exports, __webpack_require__) {\n\t\n\t\t\"use strict\";\n\t\n\t\texports[\"default\"] = function (obj) {\n\t\t return obj && obj.__esModule ? obj : {\n\t\t \"default\": obj\n\t\t };\n\t\t};\n\t\n\t\texports.__esModule = true;\n\t\n\t/***/ }\n\t/******/ ])\n\t});\n\t;\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(jQuery) {/*! jQuery UI - v1.9.1 - 2012-10-29\n\t* http://jqueryui.com\n\t* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.menu.js, jquery.ui.slider.js\n\t* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */\n\t\n\t(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return\"area\"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!==\"map\"?!1:(o=e(\"img[usemap=#\"+i+\"]\")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:\"a\"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().andSelf().filter(function(){return e.css(this,\"visibility\")===\"hidden\"}).length}var n=0,r=/^ui-id-\\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:\"1.9.1\",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t==\"number\"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css(\"position\"))||/absolute/.test(this.css(\"position\"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,\"position\"))&&/(auto|scroll)/.test(e.css(this,\"overflow\")+e.css(this,\"overflow-y\")+e.css(this,\"overflow-x\"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,\"overflow\")+e.css(this,\"overflow-y\")+e.css(this,\"overflow-x\"))}).eq(0),/fixed/.test(this.css(\"position\"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css(\"zIndex\",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css(\"position\");if(i===\"absolute\"||i===\"relative\"||i===\"fixed\"){s=parseInt(r.css(\"zIndex\"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id=\"ui-id-\"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr(\"id\")})}}),e(\"\").outerWidth(1).jquery||e.each([\"Width\",\"Height\"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,\"padding\"+this))||0,r&&(n-=parseFloat(e.css(t,\"border\"+this+\"Width\"))||0),s&&(n-=parseFloat(e.css(t,\"margin\"+this))||0)}),n}var i=r===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn[\"inner\"+r]=function(n){return n===t?o[\"inner\"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+\"px\")})},e.fn[\"outer\"+r]=function(t,n){return typeof t!=\"number\"?o[\"outer\"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+\"px\")})}}),e.extend(e.expr[\":\"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,\"tabindex\")))},tabbable:function(t){var n=e.attr(t,\"tabindex\"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e(function(){var t=document.body,n=t.appendChild(n=document.createElement(\"div\"));n.offsetHeight,e.extend(n.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0}),e.support.minHeight=n.offsetHeight===100,e.support.selectstart=\"onselectstart\"in n,t.removeChild(n).style.display=\"none\"}),function(){var t=/msie ([\\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];e.ui.ie=t.length?!0:!1,e.ui.ie6=parseFloat(t[1],10)===6}(),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)},isOverAxis:function(e,t,n){return e>t&&e\",options:{disabled:!1,create:null},_createWidget:function(t,r){r=e(r||this.defaultElement||this)[0],this.element=e(r),this.uuid=n++,this.eventNamespace=\".\"+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),r!==this&&(e.data(r,this.widgetName,this),e.data(r,this.widgetFullName,this),this._on(this.element,{remove:function(e){e.target===r&&this.destroy()}}),this.document=e(r.style?r.ownerDocument:r.document||r),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger(\"create\",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr(\"aria-disabled\").removeClass(this.widgetFullName+\"-disabled \"+\"ui-state-disabled\"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass(\"ui-state-hover\"),this.focusable.removeClass(\"ui-state-focus\")},_destroy:e.noop,widget:function(){return this.element},option:function(n,r){var i=n,s,o,u;if(arguments.length===0)return e.widget.extend({},this.options);if(typeof n==\"string\"){i={},s=n.split(\".\"),n=s.shift();if(s.length){o=i[n]=e.widget.extend({},this.options[n]);for(u=0;u=9||!!t.button?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return e(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+\".preventClickEvent\",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(e){return this.mouseDelayMet},_mouseStart:function(e){},_mouseDrag:function(e){},_mouseStop:function(e){},_mouseCapture:function(e){return!0}})})(jQuery);(function(e,t){function h(e,t,n){return[parseInt(e[0],10)*(l.test(e[0])?t/100:1),parseInt(e[1],10)*(l.test(e[1])?n/100:1)]}function p(t,n){return parseInt(e.css(t,n),10)||0}e.ui=e.ui||{};var n,r=Math.max,i=Math.abs,s=Math.round,o=/left|center|right/,u=/top|center|bottom/,a=/[\\+\\-]\\d+%?/,f=/^\\w+/,l=/%$/,c=e.fn.position;e.position={scrollbarWidth:function(){if(n!==t)return n;var r,i,s=e(\"
                                    \"),o=s.children()[0];return e(\"body\").append(s),r=o.offsetWidth,s.css(\"overflow\",\"scroll\"),i=o.offsetWidth,r===i&&(i=s[0].clientWidth),s.remove(),n=r-i},getScrollInfo:function(t){var n=t.isWindow?\"\":t.element.css(\"overflow-x\"),r=t.isWindow?\"\":t.element.css(\"overflow-y\"),i=n===\"scroll\"||n===\"auto\"&&t.width0?\"right\":\"center\",vertical:u<0?\"top\":o>0?\"bottom\":\"middle\"};lr(i(o),i(u))?h.important=\"horizontal\":h.important=\"vertical\",t.using.call(this,e,h)}),a.offset(e.extend(C,{using:u}))})},e.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=e.left-t.collisionPosition.marginLeft,u=i-o,a=o+t.collisionWidth-s-i,f;t.collisionWidth>s?u>0&&a<=0?(f=e.left+u+t.collisionWidth-s-i,e.left+=u-f):a>0&&u<=0?e.left=i:u>a?e.left=i+s-t.collisionWidth:e.left=i:u>0?e.left+=u:a>0?e.left-=a:e.left=r(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,s=t.within.height,o=e.top-t.collisionPosition.marginTop,u=i-o,a=o+t.collisionHeight-s-i,f;t.collisionHeight>s?u>0&&a<=0?(f=e.top+u+t.collisionHeight-s-i,e.top+=u-f):a>0&&u<=0?e.top=i:u>a?e.top=i+s-t.collisionHeight:e.top=i:u>0?e.top+=u:a>0?e.top-=a:e.top=r(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,s=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,u=e.left-t.collisionPosition.marginLeft,a=u-o,f=u+t.collisionWidth-s-o,l=t.my[0]===\"left\"?-t.elemWidth:t.my[0]===\"right\"?t.elemWidth:0,c=t.at[0]===\"left\"?t.targetWidth:t.at[0]===\"right\"?-t.targetWidth:0,h=-2*t.offset[0],p,d;if(a<0){p=e.left+l+c+h+t.collisionWidth-s-r;if(p<0||p0){d=e.left-t.collisionPosition.marginLeft+l+c+h-o;if(d>0||i(d)a&&(v<0||v0&&(d=e.top-t.collisionPosition.marginTop+c+h+p-o,e.top+c+h+p>f&&(d>0||i(d)10&&i<11,t.innerHTML=\"\",n.removeChild(t)}(),e.uiBackCompat!==!1&&function(e){var n=e.fn.position;e.fn.position=function(r){if(!r||!r.offset)return n.call(this,r);var i=r.offset.split(\" \"),s=r.at.split(\" \");return i.length===1&&(i[1]=i[0]),/^\\d/.test(i[0])&&(i[0]=\"+\"+i[0]),/^\\d/.test(i[1])&&(i[1]=\"+\"+i[1]),s.length===1&&(/left|center|right/.test(s[0])?s[1]=\"center\":(s[1]=s[0],s[0]=\"center\")),n.call(this,e.extend(r,{at:s[0]+i[0]+\" \"+s[1]+i[1],offset:t}))}}(jQuery)})(jQuery);(function(e,t){var n=0;e.widget(\"ui.autocomplete\",{version:\"1.9.1\",defaultElement:\"\",options:{appendTo:\"body\",autoFocus:!1,delay:300,minLength:1,position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var t,n,r;this.isMultiLine=this._isMultiLine(),this.valueMethod=this.element[this.element.is(\"input,textarea\")?\"val\":\"text\"],this.isNewMenu=!0,this.element.addClass(\"ui-autocomplete-input\").attr(\"autocomplete\",\"off\"),this._on(this.element,{keydown:function(i){if(this.element.prop(\"readOnly\")){t=!0,r=!0,n=!0;return}t=!1,r=!1,n=!1;var s=e.ui.keyCode;switch(i.keyCode){case s.PAGE_UP:t=!0,this._move(\"previousPage\",i);break;case s.PAGE_DOWN:t=!0,this._move(\"nextPage\",i);break;case s.UP:t=!0,this._keyEvent(\"previous\",i);break;case s.DOWN:t=!0,this._keyEvent(\"next\",i);break;case s.ENTER:case s.NUMPAD_ENTER:this.menu.active&&(t=!0,i.preventDefault(),this.menu.select(i));break;case s.TAB:this.menu.active&&this.menu.select(i);break;case s.ESCAPE:this.menu.element.is(\":visible\")&&(this._value(this.term),this.close(i),i.preventDefault());break;default:n=!0,this._searchTimeout(i)}},keypress:function(r){if(t){t=!1,r.preventDefault();return}if(n)return;var i=e.ui.keyCode;switch(r.keyCode){case i.PAGE_UP:this._move(\"previousPage\",r);break;case i.PAGE_DOWN:this._move(\"nextPage\",r);break;case i.UP:this._keyEvent(\"previous\",r);break;case i.DOWN:this._keyEvent(\"next\",r)}},input:function(e){if(r){r=!1,e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}clearTimeout(this.searching),this.close(e),this._change(e)}}),this._initSource(),this.menu=e(\"
                                      \").addClass(\"ui-autocomplete\").appendTo(this.document.find(this.options.appendTo||\"body\")[0]).menu({input:e(),role:null}).zIndex(this.element.zIndex()+1).hide().data(\"menu\"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var n=this.menu.element[0];e(t.target).closest(\".ui-menu-item\").length||this._delay(function(){var t=this;this.document.one(\"mousedown\",function(r){r.target!==t.element[0]&&r.target!==n&&!e.contains(n,r.target)&&t.close()})})},menufocus:function(t,n){if(this.isNewMenu){this.isNewMenu=!1;if(t.originalEvent&&/^mouse/.test(t.originalEvent.type)){this.menu.blur(),this.document.one(\"mousemove\",function(){e(t.target).trigger(t.originalEvent)});return}}var r=n.item.data(\"ui-autocomplete-item\")||n.item.data(\"item.autocomplete\");!1!==this._trigger(\"focus\",t,{item:r})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(r.value):this.liveRegion.text(r.value)},menuselect:function(e,t){var n=t.item.data(\"ui-autocomplete-item\")||t.item.data(\"item.autocomplete\"),r=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger(\"select\",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=e(\"\",{role:\"status\",\"aria-live\":\"polite\"}).addClass(\"ui-helper-hidden-accessible\").insertAfter(this.element),e.fn.bgiframe&&this.menu.element.bgiframe(),this._on(this.window,{beforeunload:function(){this.element.removeAttr(\"autocomplete\")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass(\"ui-autocomplete-input\").removeAttr(\"autocomplete\"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),e===\"source\"&&this._initSource(),e===\"appendTo\"&&this.menu.element.appendTo(this.document.find(t||\"body\")[0]),e===\"disabled\"&&t&&this.xhr&&this.xhr.abort()},_isMultiLine:function(){return this.element.is(\"textarea\")?!0:this.element.is(\"input\")?!1:this.element.prop(\"isContentEditable\")},_initSource:function(){var t,n,r=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(n,r){r(e.ui.autocomplete.filter(t,n.term))}):typeof this.options.source==\"string\"?(n=this.options.source,this.source=function(t,i){r.xhr&&r.xhr.abort(),r.xhr=e.ajax({url:n,data:t,dataType:\"json\",success:function(e){i(e)},error:function(){i([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){e=e!=null?e:this._value(),this.term=this._value();if(e.length\").append(e(\"\").text(n.label)).appendTo(t)},_move:function(e,t){if(!this.menu.element.is(\":visible\")){this.search(null,t);return}if(this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)){this._value(this.term),this.menu.blur();return}this.menu[e](t)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){if(!this.isMultiLine||this.menu.element.is(\":visible\"))this._move(e,t),t.preventDefault()}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")},filter:function(t,n){var r=new RegExp(e.ui.autocomplete.escapeRegex(n),\"i\");return e.grep(t,function(e){return r.test(e.label||e.value||e)})}}),e.widget(\"ui.autocomplete\",e.ui.autocomplete,{options:{messages:{noResults:\"No search results.\",results:function(e){return e+(e>1?\" results are\":\" result is\")+\" available, use up and down arrow keys to navigate.\"}}},__response:function(e){var t;this._superApply(arguments);if(this.options.disabled||this.cancelSearch)return;e&&e.length?t=this.options.messages.results(e.length):t=this.options.messages.noResults,this.liveRegion.text(t)}})})(jQuery);(function(e,t){var n,r,i,s,o=\"ui-button ui-widget ui-state-default ui-corner-all\",u=\"ui-state-hover ui-state-active \",a=\"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",f=function(){var t=e(this).find(\":ui-button\");setTimeout(function(){t.button(\"refresh\")},1)},l=function(t){var n=t.name,r=t.form,i=e([]);return n&&(r?i=e(r).find(\"[name='\"+n+\"']\"):i=e(\"[name='\"+n+\"']\",t.ownerDocument).filter(function(){return!this.form})),i};e.widget(\"ui.button\",{version:\"1.9.1\",defaultElement:\"
                                    \"\n )\n });\n modal.show( { backdrop: true } );\n}\n\n\n// ============================================================================\n return {\n Modal : Modal,\n hide_modal : hide_modal,\n show_modal : show_modal,\n show_message : show_message,\n show_in_overlay : show_in_overlay,\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/layout/modal.js\n ** module id = 83\n ** module chunks = 2\n **/","define([\n 'layout/masthead',\n 'layout/panel',\n 'mvc/ui/ui-modal',\n 'mvc/base-mvc'\n], function( Masthead, Panel, Modal, BaseMVC ) {\n\n// ============================================================================\nvar PageLayoutView = Backbone.View.extend( BaseMVC.LoggableMixin ).extend({\n _logNamespace : 'layout',\n\n el : 'body',\n className : 'full-content',\n\n _panelIds : [\n 'left', 'center', 'right'\n ],\n\n defaultOptions : {\n message_box_visible : false,\n message_box_content : '',\n message_box_class : 'info',\n show_inactivity_warning : false,\n inactivity_box_content : ''\n },\n\n initialize : function( options ) {\n // TODO: remove globals\n this.log( this + '.initialize:', options );\n _.extend( this, _.pick( options, this._panelIds ) );\n this.options = _.defaults( _.omit( options, this._panelIds ), this.defaultOptions );\n Galaxy.modal = this.modal = new Modal.View();\n this.masthead = new Masthead.View( this.options.config );\n this.$el.attr( 'scroll', 'no' );\n this.$el.html( this._template() );\n this.$el.append( this.masthead.frame.$el );\n this.$el.append( this.masthead.$el );\n this.$el.append( this.modal.$el );\n this.$messagebox = this.$( '#messagebox' );\n this.$inactivebox = this.$( '#inactivebox' );\n },\n\n render : function() {\n // TODO: Remove this line after select2 update\n $( '.select2-hidden-accessible' ).remove();\n this.log( this + '.render:' );\n this.masthead.render();\n this.renderMessageBox();\n this.renderInactivityBox();\n this.renderPanels();\n return this;\n },\n\n /** Render message box */\n renderMessageBox : function() {\n if ( this.options.message_box_visible ){\n var content = this.options.message_box_content || '';\n var level = this.options.message_box_class || 'info';\n this.$el.addClass( 'has-message-box' );\n this.$messagebox\n .attr( 'class', 'panel-' + level + '-message' )\n .html( content )\n .toggle( !!content )\n .show();\n } else {\n this.$el.removeClass( 'has-message-box' );\n this.$messagebox.hide();\n }\n return this;\n },\n\n /** Render inactivity warning */\n renderInactivityBox : function() {\n if( this.options.show_inactivity_warning ){\n var content = this.options.inactivity_box_content || '';\n var verificationLink = $( '
                                    ' ).attr( 'href', Galaxy.root + 'user/resend_verification' ).text( 'Resend verification' );\n this.$el.addClass( 'has-inactivity-box' );\n this.$inactivebox\n .html( content + ' ' )\n .append( verificationLink )\n .toggle( !!content )\n .show();\n } else {\n this.$el.removeClass( 'has-inactivity-box' );\n this.$inactivebox.hide();\n }\n return this;\n },\n\n /** Render panels */\n renderPanels : function() {\n var page = this;\n this._panelIds.forEach( function( panelId ){\n if( _.has( page, panelId ) ){\n page[ panelId ].setElement( '#' + panelId );\n page[ panelId ].render();\n }\n });\n if( !this.left ){\n this.center.$el.css( 'left', 0 );\n }\n if( !this.right ){\n this.center.$el.css( 'right', 0 );\n }\n return this;\n },\n\n /** body template */\n _template: function() {\n return [\n '
                                    ',\n '
                                    ',\n '
                                    ',\n '
                                    ',\n this.left? '
                                    ' : '',\n this.center? '
                                    ' : '',\n this.right? '
                                    ' : '',\n '
                                    ',\n '
                                    ',\n ].join('');\n },\n\n /** hide both side panels if previously shown */\n hideSidePanels : function(){\n if( this.left ){\n this.left.hide();\n }\n if( this.right ){\n this.right.hide();\n }\n },\n\n toString : function() { return 'PageLayoutView'; }\n});\n\n// ============================================================================\n return {\n PageLayoutView: PageLayoutView\n };\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/layout/page.js\n ** module id = 84\n ** module chunks = 2\n **/","/* ========================================================================\n * bootstrap-tour - v0.10.1\n * http://bootstraptour.com\n * ========================================================================\n * Copyright 2012-2013 Ulrich Sossou\n *\n * ========================================================================\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================================\n */\n\n(function($, window) {\n var Tour, document;\n document = window.document;\n Tour = (function() {\n function Tour(options) {\n var storage;\n try {\n storage = window.localStorage;\n } catch (_error) {\n storage = false;\n }\n this._options = $.extend({\n name: 'tour',\n steps: [],\n container: 'body',\n autoscroll: true,\n keyboard: true,\n storage: storage,\n debug: false,\n backdrop: false,\n backdropPadding: 0,\n redirect: true,\n orphan: false,\n duration: false,\n delay: false,\n basePath: '',\n template: '

                                    ',\n afterSetState: function(key, value) {},\n afterGetState: function(key, value) {},\n afterRemoveState: function(key) {},\n onStart: function(tour) {},\n onEnd: function(tour) {},\n onShow: function(tour) {},\n onShown: function(tour) {},\n onHide: function(tour) {},\n onHidden: function(tour) {},\n onNext: function(tour) {},\n onPrev: function(tour) {},\n onPause: function(tour, duration) {},\n onResume: function(tour, duration) {}\n }, options);\n this._force = false;\n this._inited = false;\n this.backdrop = {\n overlay: null,\n $element: null,\n $background: null,\n backgroundShown: false,\n overlayElementShown: false\n };\n this;\n }\n\n Tour.prototype.addSteps = function(steps) {\n var step, _i, _len;\n for (_i = 0, _len = steps.length; _i < _len; _i++) {\n step = steps[_i];\n this.addStep(step);\n }\n return this;\n };\n\n Tour.prototype.addStep = function(step) {\n this._options.steps.push(step);\n return this;\n };\n\n Tour.prototype.getStep = function(i) {\n if (this._options.steps[i] != null) {\n return $.extend({\n id: \"step-\" + i,\n path: '',\n placement: 'right',\n title: '',\n content: '

                                    ',\n next: i === this._options.steps.length - 1 ? -1 : i + 1,\n prev: i - 1,\n animation: true,\n container: this._options.container,\n autoscroll: this._options.autoscroll,\n backdrop: this._options.backdrop,\n backdropPadding: this._options.backdropPadding,\n redirect: this._options.redirect,\n orphan: this._options.orphan,\n duration: this._options.duration,\n delay: this._options.delay,\n template: this._options.template,\n onShow: this._options.onShow,\n onShown: this._options.onShown,\n onHide: this._options.onHide,\n onHidden: this._options.onHidden,\n onNext: this._options.onNext,\n onPrev: this._options.onPrev,\n onPause: this._options.onPause,\n onResume: this._options.onResume\n }, this._options.steps[i]);\n }\n };\n\n Tour.prototype.init = function(force) {\n this._force = force;\n if (this.ended()) {\n this._debug('Tour ended, init prevented.');\n return this;\n }\n this.setCurrentStep();\n this._initMouseNavigation();\n this._initKeyboardNavigation();\n this._onResize((function(_this) {\n return function() {\n return _this.showStep(_this._current);\n };\n })(this));\n if (this._current !== null) {\n this.showStep(this._current);\n }\n this._inited = true;\n return this;\n };\n\n Tour.prototype.start = function(force) {\n var promise;\n if (force == null) {\n force = false;\n }\n if (!this._inited) {\n this.init(force);\n }\n if (this._current === null) {\n promise = this._makePromise(this._options.onStart != null ? this._options.onStart(this) : void 0);\n this._callOnPromiseDone(promise, this.showStep, 0);\n }\n return this;\n };\n\n Tour.prototype.next = function() {\n var promise;\n promise = this.hideStep(this._current);\n return this._callOnPromiseDone(promise, this._showNextStep);\n };\n\n Tour.prototype.prev = function() {\n var promise;\n promise = this.hideStep(this._current);\n return this._callOnPromiseDone(promise, this._showPrevStep);\n };\n\n Tour.prototype.goTo = function(i) {\n var promise;\n promise = this.hideStep(this._current);\n return this._callOnPromiseDone(promise, this.showStep, i);\n };\n\n Tour.prototype.end = function() {\n var endHelper, promise;\n endHelper = (function(_this) {\n return function(e) {\n $(document).off(\"click.tour-\" + _this._options.name);\n $(document).off(\"keyup.tour-\" + _this._options.name);\n $(window).off(\"resize.tour-\" + _this._options.name);\n _this._setState('end', 'yes');\n _this._inited = false;\n _this._force = false;\n _this._clearTimer();\n if (_this._options.onEnd != null) {\n return _this._options.onEnd(_this);\n }\n };\n })(this);\n promise = this.hideStep(this._current);\n return this._callOnPromiseDone(promise, endHelper);\n };\n\n Tour.prototype.ended = function() {\n return !this._force && !!this._getState('end');\n };\n\n Tour.prototype.restart = function() {\n this._removeState('current_step');\n this._removeState('end');\n return this.start();\n };\n\n Tour.prototype.pause = function() {\n var step;\n step = this.getStep(this._current);\n if (!(step && step.duration)) {\n return this;\n }\n this._paused = true;\n this._duration -= new Date().getTime() - this._start;\n window.clearTimeout(this._timer);\n this._debug(\"Paused/Stopped step \" + (this._current + 1) + \" timer (\" + this._duration + \" remaining).\");\n if (step.onPause != null) {\n return step.onPause(this, this._duration);\n }\n };\n\n Tour.prototype.resume = function() {\n var step;\n step = this.getStep(this._current);\n if (!(step && step.duration)) {\n return this;\n }\n this._paused = false;\n this._start = new Date().getTime();\n this._duration = this._duration || step.duration;\n this._timer = window.setTimeout((function(_this) {\n return function() {\n if (_this._isLast()) {\n return _this.next();\n } else {\n return _this.end();\n }\n };\n })(this), this._duration);\n this._debug(\"Started step \" + (this._current + 1) + \" timer with duration \" + this._duration);\n if ((step.onResume != null) && this._duration !== step.duration) {\n return step.onResume(this, this._duration);\n }\n };\n\n Tour.prototype.hideStep = function(i) {\n var hideStepHelper, promise, step;\n step = this.getStep(i);\n if (!step) {\n return;\n }\n this._clearTimer();\n promise = this._makePromise(step.onHide != null ? step.onHide(this, i) : void 0);\n hideStepHelper = (function(_this) {\n return function(e) {\n var $element;\n $element = $(step.element);\n if (!($element.data('bs.popover') || $element.data('popover'))) {\n $element = $('body');\n }\n $element.popover('destroy').removeClass(\"tour-\" + _this._options.name + \"-element tour-\" + _this._options.name + \"-\" + i + \"-element\");\n if (step.reflex) {\n $element.removeClass('tour-step-element-reflex').off(\"\" + (_this._reflexEvent(step.reflex)) + \".tour-\" + _this._options.name);\n }\n if (step.backdrop) {\n _this._hideBackdrop();\n }\n if (step.onHidden != null) {\n return step.onHidden(_this);\n }\n };\n })(this);\n this._callOnPromiseDone(promise, hideStepHelper);\n return promise;\n };\n\n Tour.prototype.showStep = function(i) {\n var promise, showStepHelper, skipToPrevious, step;\n if (this.ended()) {\n this._debug('Tour ended, showStep prevented.');\n return this;\n }\n step = this.getStep(i);\n if (!step) {\n return;\n }\n skipToPrevious = i < this._current;\n promise = this._makePromise(step.onShow != null ? step.onShow(this, i) : void 0);\n showStepHelper = (function(_this) {\n return function(e) {\n var current_path, path, showPopoverAndOverlay;\n _this.setCurrentStep(i);\n path = (function() {\n switch ({}.toString.call(step.path)) {\n case '[object Function]':\n return step.path();\n case '[object String]':\n return this._options.basePath + step.path;\n default:\n return step.path;\n }\n }).call(_this);\n current_path = [document.location.pathname, document.location.hash].join('');\n if (_this._isRedirect(path, current_path)) {\n _this._redirect(step, path);\n return;\n }\n if (_this._isOrphan(step)) {\n if (!step.orphan) {\n _this._debug(\"Skip the orphan step \" + (_this._current + 1) + \".\\nOrphan option is false and the element does not exist or is hidden.\");\n if (skipToPrevious) {\n _this._showPrevStep();\n } else {\n _this._showNextStep();\n }\n return;\n }\n _this._debug(\"Show the orphan step \" + (_this._current + 1) + \". Orphans option is true.\");\n }\n if (step.backdrop) {\n _this._showBackdrop(!_this._isOrphan(step) ? step.element : void 0);\n }\n showPopoverAndOverlay = function() {\n if (_this.getCurrentStep() !== i) {\n return;\n }\n if ((step.element != null) && step.backdrop) {\n _this._showOverlayElement(step);\n }\n _this._showPopover(step, i);\n if (step.onShown != null) {\n step.onShown(_this);\n }\n return _this._debug(\"Step \" + (_this._current + 1) + \" of \" + _this._options.steps.length);\n };\n if (step.autoscroll) {\n _this._scrollIntoView(step.element, showPopoverAndOverlay);\n } else {\n showPopoverAndOverlay();\n }\n if (step.duration) {\n return _this.resume();\n }\n };\n })(this);\n if (step.delay) {\n this._debug(\"Wait \" + step.delay + \" milliseconds to show the step \" + (this._current + 1));\n window.setTimeout((function(_this) {\n return function() {\n return _this._callOnPromiseDone(promise, showStepHelper);\n };\n })(this), step.delay);\n } else {\n this._callOnPromiseDone(promise, showStepHelper);\n }\n return promise;\n };\n\n Tour.prototype.getCurrentStep = function() {\n return this._current;\n };\n\n Tour.prototype.setCurrentStep = function(value) {\n if (value != null) {\n this._current = value;\n this._setState('current_step', value);\n } else {\n this._current = this._getState('current_step');\n this._current = this._current === null ? null : parseInt(this._current, 10);\n }\n return this;\n };\n\n Tour.prototype._setState = function(key, value) {\n var e, keyName;\n if (this._options.storage) {\n keyName = \"\" + this._options.name + \"_\" + key;\n try {\n this._options.storage.setItem(keyName, value);\n } catch (_error) {\n e = _error;\n if (e.code === DOMException.QUOTA_EXCEEDED_ERR) {\n this._debug('LocalStorage quota exceeded. State storage failed.');\n }\n }\n return this._options.afterSetState(keyName, value);\n } else {\n if (this._state == null) {\n this._state = {};\n }\n return this._state[key] = value;\n }\n };\n\n Tour.prototype._removeState = function(key) {\n var keyName;\n if (this._options.storage) {\n keyName = \"\" + this._options.name + \"_\" + key;\n this._options.storage.removeItem(keyName);\n return this._options.afterRemoveState(keyName);\n } else {\n if (this._state != null) {\n return delete this._state[key];\n }\n }\n };\n\n Tour.prototype._getState = function(key) {\n var keyName, value;\n if (this._options.storage) {\n keyName = \"\" + this._options.name + \"_\" + key;\n value = this._options.storage.getItem(keyName);\n } else {\n if (this._state != null) {\n value = this._state[key];\n }\n }\n if (value === void 0 || value === 'null') {\n value = null;\n }\n this._options.afterGetState(key, value);\n return value;\n };\n\n Tour.prototype._showNextStep = function() {\n var promise, showNextStepHelper, step;\n step = this.getStep(this._current);\n showNextStepHelper = (function(_this) {\n return function(e) {\n return _this.showStep(step.next);\n };\n })(this);\n promise = this._makePromise(step.onNext != null ? step.onNext(this) : void 0);\n return this._callOnPromiseDone(promise, showNextStepHelper);\n };\n\n Tour.prototype._showPrevStep = function() {\n var promise, showPrevStepHelper, step;\n step = this.getStep(this._current);\n showPrevStepHelper = (function(_this) {\n return function(e) {\n return _this.showStep(step.prev);\n };\n })(this);\n promise = this._makePromise(step.onPrev != null ? step.onPrev(this) : void 0);\n return this._callOnPromiseDone(promise, showPrevStepHelper);\n };\n\n Tour.prototype._debug = function(text) {\n if (this._options.debug) {\n return window.console.log(\"Bootstrap Tour '\" + this._options.name + \"' | \" + text);\n }\n };\n\n Tour.prototype._isRedirect = function(path, currentPath) {\n return (path != null) && path !== '' && (({}.toString.call(path) === '[object RegExp]' && !path.test(currentPath)) || ({}.toString.call(path) === '[object String]' && path.replace(/\\?.*$/, '').replace(/\\/?$/, '') !== currentPath.replace(/\\/?$/, '')));\n };\n\n Tour.prototype._redirect = function(step, path) {\n if ($.isFunction(step.redirect)) {\n return step.redirect.call(this, path);\n } else if (step.redirect === true) {\n this._debug(\"Redirect to \" + path);\n return document.location.href = path;\n }\n };\n\n Tour.prototype._isOrphan = function(step) {\n return (step.element == null) || !$(step.element).length || $(step.element).is(':hidden') && ($(step.element)[0].namespaceURI !== 'http://www.w3.org/2000/svg');\n };\n\n Tour.prototype._isLast = function() {\n return this._current < this._options.steps.length - 1;\n };\n\n Tour.prototype._showPopover = function(step, i) {\n var $element, $tip, isOrphan, options;\n $(\".tour-\" + this._options.name).remove();\n options = $.extend({}, this._options);\n isOrphan = this._isOrphan(step);\n step.template = this._template(step, i);\n if (isOrphan) {\n step.element = 'body';\n step.placement = 'top';\n }\n $element = $(step.element);\n $element.addClass(\"tour-\" + this._options.name + \"-element tour-\" + this._options.name + \"-\" + i + \"-element\");\n if (step.options) {\n $.extend(options, step.options);\n }\n if (step.reflex && !isOrphan) {\n $element.addClass('tour-step-element-reflex');\n $element.off(\"\" + (this._reflexEvent(step.reflex)) + \".tour-\" + this._options.name);\n $element.on(\"\" + (this._reflexEvent(step.reflex)) + \".tour-\" + this._options.name, (function(_this) {\n return function() {\n if (_this._isLast()) {\n return _this.next();\n } else {\n return _this.end();\n }\n };\n })(this));\n }\n $element.popover({\n placement: step.placement,\n trigger: 'manual',\n title: step.title,\n content: step.content,\n html: true,\n animation: step.animation,\n container: step.container,\n template: step.template,\n selector: step.element\n }).popover('show');\n $tip = $element.data('bs.popover') ? $element.data('bs.popover').tip() : $element.data('popover').tip();\n $tip.attr('id', step.id);\n this._reposition($tip, step);\n if (isOrphan) {\n return this._center($tip);\n }\n };\n\n Tour.prototype._template = function(step, i) {\n var $navigation, $next, $prev, $resume, $template;\n $template = $.isFunction(step.template) ? $(step.template(i, step)) : $(step.template);\n $navigation = $template.find('.popover-navigation');\n $prev = $navigation.find('[data-role=\"prev\"]');\n $next = $navigation.find('[data-role=\"next\"]');\n $resume = $navigation.find('[data-role=\"pause-resume\"]');\n if (this._isOrphan(step)) {\n $template.addClass('orphan');\n }\n $template.addClass(\"tour-\" + this._options.name + \" tour-\" + this._options.name + \"-\" + i);\n if (step.prev < 0) {\n $prev.addClass('disabled');\n }\n if (step.next < 0) {\n $next.addClass('disabled');\n }\n if (!step.duration) {\n $resume.remove();\n }\n return $template.clone().wrap('
                                    ').parent().html();\n };\n\n Tour.prototype._reflexEvent = function(reflex) {\n if ({}.toString.call(reflex) === '[object Boolean]') {\n return 'click';\n } else {\n return reflex;\n }\n };\n\n Tour.prototype._reposition = function($tip, step) {\n var offsetBottom, offsetHeight, offsetRight, offsetWidth, originalLeft, originalTop, tipOffset;\n offsetWidth = $tip[0].offsetWidth;\n offsetHeight = $tip[0].offsetHeight;\n tipOffset = $tip.offset();\n originalLeft = tipOffset.left;\n originalTop = tipOffset.top;\n offsetBottom = $(document).outerHeight() - tipOffset.top - $tip.outerHeight();\n if (offsetBottom < 0) {\n tipOffset.top = tipOffset.top + offsetBottom;\n }\n offsetRight = $('html').outerWidth() - tipOffset.left - $tip.outerWidth();\n if (offsetRight < 0) {\n tipOffset.left = tipOffset.left + offsetRight;\n }\n if (tipOffset.top < 0) {\n tipOffset.top = 0;\n }\n if (tipOffset.left < 0) {\n tipOffset.left = 0;\n }\n $tip.offset(tipOffset);\n if (step.placement === 'bottom' || step.placement === 'top') {\n if (originalLeft !== tipOffset.left) {\n return this._replaceArrow($tip, (tipOffset.left - originalLeft) * 2, offsetWidth, 'left');\n }\n } else {\n if (originalTop !== tipOffset.top) {\n return this._replaceArrow($tip, (tipOffset.top - originalTop) * 2, offsetHeight, 'top');\n }\n }\n };\n\n Tour.prototype._center = function($tip) {\n return $tip.css('top', $(window).outerHeight() / 2 - $tip.outerHeight() / 2);\n };\n\n Tour.prototype._replaceArrow = function($tip, delta, dimension, position) {\n return $tip.find('.arrow').css(position, delta ? 50 * (1 - delta / dimension) + '%' : '');\n };\n\n Tour.prototype._scrollIntoView = function(element, callback) {\n var $element, $window, counter, offsetTop, scrollTop, windowHeight;\n $element = $(element);\n if (!$element.length) {\n return callback();\n }\n $window = $(window);\n offsetTop = $element.offset().top;\n windowHeight = $window.height();\n scrollTop = Math.max(0, offsetTop - (windowHeight / 2));\n this._debug(\"Scroll into view. ScrollTop: \" + scrollTop + \". Element offset: \" + offsetTop + \". Window height: \" + windowHeight + \".\");\n counter = 0;\n return $('body, html').stop(true, true).animate({\n scrollTop: Math.ceil(scrollTop)\n }, (function(_this) {\n return function() {\n if (++counter === 2) {\n callback();\n return _this._debug(\"Scroll into view.\\nAnimation end element offset: \" + ($element.offset().top) + \".\\nWindow height: \" + ($window.height()) + \".\");\n }\n };\n })(this));\n };\n\n Tour.prototype._onResize = function(callback, timeout) {\n return $(window).on(\"resize.tour-\" + this._options.name, function() {\n clearTimeout(timeout);\n return timeout = setTimeout(callback, 100);\n });\n };\n\n Tour.prototype._initMouseNavigation = function() {\n var _this;\n _this = this;\n return $(document).off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='prev']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='next']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='end']\").off(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='pause-resume']\").on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='next']\", (function(_this) {\n return function(e) {\n e.preventDefault();\n return _this.next();\n };\n })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='prev']\", (function(_this) {\n return function(e) {\n e.preventDefault();\n return _this.prev();\n };\n })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='end']\", (function(_this) {\n return function(e) {\n e.preventDefault();\n return _this.end();\n };\n })(this)).on(\"click.tour-\" + this._options.name, \".popover.tour-\" + this._options.name + \" *[data-role='pause-resume']\", function(e) {\n var $this;\n e.preventDefault();\n $this = $(this);\n $this.text(_this._paused ? $this.data('pause-text') : $this.data('resume-text'));\n if (_this._paused) {\n return _this.resume();\n } else {\n return _this.pause();\n }\n });\n };\n\n Tour.prototype._initKeyboardNavigation = function() {\n if (!this._options.keyboard) {\n return;\n }\n return $(document).on(\"keyup.tour-\" + this._options.name, (function(_this) {\n return function(e) {\n if (!e.which) {\n return;\n }\n switch (e.which) {\n case 39:\n e.preventDefault();\n if (_this._isLast()) {\n return _this.next();\n } else {\n return _this.end();\n }\n break;\n case 37:\n e.preventDefault();\n if (_this._current > 0) {\n return _this.prev();\n }\n break;\n case 27:\n e.preventDefault();\n return _this.end();\n }\n };\n })(this));\n };\n\n Tour.prototype._makePromise = function(result) {\n if (result && $.isFunction(result.then)) {\n return result;\n } else {\n return null;\n }\n };\n\n Tour.prototype._callOnPromiseDone = function(promise, cb, arg) {\n if (promise) {\n return promise.then((function(_this) {\n return function(e) {\n return cb.call(_this, arg);\n };\n })(this));\n } else {\n return cb.call(this, arg);\n }\n };\n\n Tour.prototype._showBackdrop = function(element) {\n if (this.backdrop.backgroundShown) {\n return;\n }\n this.backdrop = $('
                                    ', {\n \"class\": 'tour-backdrop'\n });\n this.backdrop.backgroundShown = true;\n return $('body').append(this.backdrop);\n };\n\n Tour.prototype._hideBackdrop = function() {\n this._hideOverlayElement();\n return this._hideBackground();\n };\n\n Tour.prototype._hideBackground = function() {\n if (this.backdrop) {\n this.backdrop.remove();\n this.backdrop.overlay = null;\n return this.backdrop.backgroundShown = false;\n }\n };\n\n Tour.prototype._showOverlayElement = function(step) {\n var $element, elementData;\n $element = $(step.element);\n if (!$element || $element.length === 0 || this.backdrop.overlayElementShown) {\n return;\n }\n this.backdrop.overlayElementShown = true;\n this.backdrop.$element = $element.addClass('tour-step-backdrop');\n this.backdrop.$background = $('
                                    ', {\n \"class\": 'tour-step-background'\n });\n elementData = {\n width: $element.innerWidth(),\n height: $element.innerHeight(),\n offset: $element.offset()\n };\n this.backdrop.$background.appendTo('body');\n if (step.backdropPadding) {\n elementData = this._applyBackdropPadding(step.backdropPadding, elementData);\n }\n return this.backdrop.$background.width(elementData.width).height(elementData.height).offset(elementData.offset);\n };\n\n Tour.prototype._hideOverlayElement = function() {\n if (!this.backdrop.overlayElementShown) {\n return;\n }\n this.backdrop.$element.removeClass('tour-step-backdrop');\n this.backdrop.$background.remove();\n this.backdrop.$element = null;\n this.backdrop.$background = null;\n return this.backdrop.overlayElementShown = false;\n };\n\n Tour.prototype._applyBackdropPadding = function(padding, data) {\n if (typeof padding === 'object') {\n if (padding.top == null) {\n padding.top = 0;\n }\n if (padding.right == null) {\n padding.right = 0;\n }\n if (padding.bottom == null) {\n padding.bottom = 0;\n }\n if (padding.left == null) {\n padding.left = 0;\n }\n data.offset.top = data.offset.top - padding.top;\n data.offset.left = data.offset.left - padding.left;\n data.width = data.width + padding.left + padding.right;\n data.height = data.height + padding.top + padding.bottom;\n } else {\n data.offset.top = data.offset.top - padding;\n data.offset.left = data.offset.left - padding;\n data.width = data.width + (padding * 2);\n data.height = data.height + (padding * 2);\n }\n return data;\n };\n\n Tour.prototype._clearTimer = function() {\n window.clearTimeout(this._timer);\n this._timer = null;\n return this._duration = null;\n };\n\n return Tour;\n\n })();\n return window.Tour = Tour;\n})(jQuery, window);\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/libs/bootstrap-tour.js\n ** module id = 85\n ** module chunks = 2\n **/","/*!\n\n handlebars v3.0.3\n\nCopyright (C) 2011-2014 by Yehuda Katz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n@license\n*/\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Handlebars\"] = factory();\n\telse\n\t\troot[\"Handlebars\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\n\texports.__esModule = true;\n\n\tvar _import = __webpack_require__(1);\n\n\tvar base = _interopRequireWildcard(_import);\n\n\t// Each of these augment the Handlebars object. No need to setup here.\n\t// (This is done to easily share code between commonjs and browse envs)\n\n\tvar _SafeString = __webpack_require__(2);\n\n\tvar _SafeString2 = _interopRequireWildcard(_SafeString);\n\n\tvar _Exception = __webpack_require__(3);\n\n\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\n\tvar _import2 = __webpack_require__(4);\n\n\tvar Utils = _interopRequireWildcard(_import2);\n\n\tvar _import3 = __webpack_require__(5);\n\n\tvar runtime = _interopRequireWildcard(_import3);\n\n\tvar _noConflict = __webpack_require__(6);\n\n\tvar _noConflict2 = _interopRequireWildcard(_noConflict);\n\n\t// For compatibility and usage outside of module systems, make the Handlebars object a namespace\n\tfunction create() {\n\t var hb = new base.HandlebarsEnvironment();\n\n\t Utils.extend(hb, base);\n\t hb.SafeString = _SafeString2['default'];\n\t hb.Exception = _Exception2['default'];\n\t hb.Utils = Utils;\n\t hb.escapeExpression = Utils.escapeExpression;\n\n\t hb.VM = runtime;\n\t hb.template = function (spec) {\n\t return runtime.template(spec, hb);\n\t };\n\n\t return hb;\n\t}\n\n\tvar inst = create();\n\tinst.create = create;\n\n\t_noConflict2['default'](inst);\n\n\tinst['default'] = inst;\n\n\texports['default'] = inst;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\n\texports.__esModule = true;\n\texports.HandlebarsEnvironment = HandlebarsEnvironment;\n\texports.createFrame = createFrame;\n\n\tvar _import = __webpack_require__(4);\n\n\tvar Utils = _interopRequireWildcard(_import);\n\n\tvar _Exception = __webpack_require__(3);\n\n\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\n\tvar VERSION = '3.0.1';\n\texports.VERSION = VERSION;\n\tvar COMPILER_REVISION = 6;\n\n\texports.COMPILER_REVISION = COMPILER_REVISION;\n\tvar REVISION_CHANGES = {\n\t 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it\n\t 2: '== 1.0.0-rc.3',\n\t 3: '== 1.0.0-rc.4',\n\t 4: '== 1.x.x',\n\t 5: '== 2.0.0-alpha.x',\n\t 6: '>= 2.0.0-beta.1'\n\t};\n\n\texports.REVISION_CHANGES = REVISION_CHANGES;\n\tvar isArray = Utils.isArray,\n\t isFunction = Utils.isFunction,\n\t toString = Utils.toString,\n\t objectType = '[object Object]';\n\n\tfunction HandlebarsEnvironment(helpers, partials) {\n\t this.helpers = helpers || {};\n\t this.partials = partials || {};\n\n\t registerDefaultHelpers(this);\n\t}\n\n\tHandlebarsEnvironment.prototype = {\n\t constructor: HandlebarsEnvironment,\n\n\t logger: logger,\n\t log: log,\n\n\t registerHelper: function registerHelper(name, fn) {\n\t if (toString.call(name) === objectType) {\n\t if (fn) {\n\t throw new _Exception2['default']('Arg not supported with multiple helpers');\n\t }\n\t Utils.extend(this.helpers, name);\n\t } else {\n\t this.helpers[name] = fn;\n\t }\n\t },\n\t unregisterHelper: function unregisterHelper(name) {\n\t delete this.helpers[name];\n\t },\n\n\t registerPartial: function registerPartial(name, partial) {\n\t if (toString.call(name) === objectType) {\n\t Utils.extend(this.partials, name);\n\t } else {\n\t if (typeof partial === 'undefined') {\n\t throw new _Exception2['default']('Attempting to register a partial as undefined');\n\t }\n\t this.partials[name] = partial;\n\t }\n\t },\n\t unregisterPartial: function unregisterPartial(name) {\n\t delete this.partials[name];\n\t }\n\t};\n\n\tfunction registerDefaultHelpers(instance) {\n\t instance.registerHelper('helperMissing', function () {\n\t if (arguments.length === 1) {\n\t // A missing field in a {{foo}} constuct.\n\t return undefined;\n\t } else {\n\t // Someone is actually trying to call something, blow up.\n\t throw new _Exception2['default']('Missing helper: \"' + arguments[arguments.length - 1].name + '\"');\n\t }\n\t });\n\n\t instance.registerHelper('blockHelperMissing', function (context, options) {\n\t var inverse = options.inverse,\n\t fn = options.fn;\n\n\t if (context === true) {\n\t return fn(this);\n\t } else if (context === false || context == null) {\n\t return inverse(this);\n\t } else if (isArray(context)) {\n\t if (context.length > 0) {\n\t if (options.ids) {\n\t options.ids = [options.name];\n\t }\n\n\t return instance.helpers.each(context, options);\n\t } else {\n\t return inverse(this);\n\t }\n\t } else {\n\t if (options.data && options.ids) {\n\t var data = createFrame(options.data);\n\t data.contextPath = Utils.appendContextPath(options.data.contextPath, options.name);\n\t options = { data: data };\n\t }\n\n\t return fn(context, options);\n\t }\n\t });\n\n\t instance.registerHelper('each', function (context, options) {\n\t if (!options) {\n\t throw new _Exception2['default']('Must pass iterator to #each');\n\t }\n\n\t var fn = options.fn,\n\t inverse = options.inverse,\n\t i = 0,\n\t ret = '',\n\t data = undefined,\n\t contextPath = undefined;\n\n\t if (options.data && options.ids) {\n\t contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.';\n\t }\n\n\t if (isFunction(context)) {\n\t context = context.call(this);\n\t }\n\n\t if (options.data) {\n\t data = createFrame(options.data);\n\t }\n\n\t function execIteration(field, index, last) {\n\t if (data) {\n\t data.key = field;\n\t data.index = index;\n\t data.first = index === 0;\n\t data.last = !!last;\n\n\t if (contextPath) {\n\t data.contextPath = contextPath + field;\n\t }\n\t }\n\n\t ret = ret + fn(context[field], {\n\t data: data,\n\t blockParams: Utils.blockParams([context[field], field], [contextPath + field, null])\n\t });\n\t }\n\n\t if (context && typeof context === 'object') {\n\t if (isArray(context)) {\n\t for (var j = context.length; i < j; i++) {\n\t execIteration(i, i, i === context.length - 1);\n\t }\n\t } else {\n\t var priorKey = undefined;\n\n\t for (var key in context) {\n\t if (context.hasOwnProperty(key)) {\n\t // We're running the iterations one step out of sync so we can detect\n\t // the last iteration without have to scan the object twice and create\n\t // an itermediate keys array.\n\t if (priorKey) {\n\t execIteration(priorKey, i - 1);\n\t }\n\t priorKey = key;\n\t i++;\n\t }\n\t }\n\t if (priorKey) {\n\t execIteration(priorKey, i - 1, true);\n\t }\n\t }\n\t }\n\n\t if (i === 0) {\n\t ret = inverse(this);\n\t }\n\n\t return ret;\n\t });\n\n\t instance.registerHelper('if', function (conditional, options) {\n\t if (isFunction(conditional)) {\n\t conditional = conditional.call(this);\n\t }\n\n\t // Default behavior is to render the positive path if the value is truthy and not empty.\n\t // The `includeZero` option may be set to treat the condtional as purely not empty based on the\n\t // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative.\n\t if (!options.hash.includeZero && !conditional || Utils.isEmpty(conditional)) {\n\t return options.inverse(this);\n\t } else {\n\t return options.fn(this);\n\t }\n\t });\n\n\t instance.registerHelper('unless', function (conditional, options) {\n\t return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash });\n\t });\n\n\t instance.registerHelper('with', function (context, options) {\n\t if (isFunction(context)) {\n\t context = context.call(this);\n\t }\n\n\t var fn = options.fn;\n\n\t if (!Utils.isEmpty(context)) {\n\t if (options.data && options.ids) {\n\t var data = createFrame(options.data);\n\t data.contextPath = Utils.appendContextPath(options.data.contextPath, options.ids[0]);\n\t options = { data: data };\n\t }\n\n\t return fn(context, options);\n\t } else {\n\t return options.inverse(this);\n\t }\n\t });\n\n\t instance.registerHelper('log', function (message, options) {\n\t var level = options.data && options.data.level != null ? parseInt(options.data.level, 10) : 1;\n\t instance.log(level, message);\n\t });\n\n\t instance.registerHelper('lookup', function (obj, field) {\n\t return obj && obj[field];\n\t });\n\t}\n\n\tvar logger = {\n\t methodMap: { 0: 'debug', 1: 'info', 2: 'warn', 3: 'error' },\n\n\t // State enum\n\t DEBUG: 0,\n\t INFO: 1,\n\t WARN: 2,\n\t ERROR: 3,\n\t level: 1,\n\n\t // Can be overridden in the host environment\n\t log: function log(level, message) {\n\t if (typeof console !== 'undefined' && logger.level <= level) {\n\t var method = logger.methodMap[level];\n\t (console[method] || console.log).call(console, message); // eslint-disable-line no-console\n\t }\n\t }\n\t};\n\n\texports.logger = logger;\n\tvar log = logger.log;\n\n\texports.log = log;\n\n\tfunction createFrame(object) {\n\t var frame = Utils.extend({}, object);\n\t frame._parent = object;\n\t return frame;\n\t}\n\n\t/* [args, ]options */\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\t// Build out our basic SafeString type\n\tfunction SafeString(string) {\n\t this.string = string;\n\t}\n\n\tSafeString.prototype.toString = SafeString.prototype.toHTML = function () {\n\t return '' + this.string;\n\t};\n\n\texports['default'] = SafeString;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\n\tvar errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\n\tfunction Exception(message, node) {\n\t var loc = node && node.loc,\n\t line = undefined,\n\t column = undefined;\n\t if (loc) {\n\t line = loc.start.line;\n\t column = loc.start.column;\n\n\t message += ' - ' + line + ':' + column;\n\t }\n\n\t var tmp = Error.prototype.constructor.call(this, message);\n\n\t // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n\t for (var idx = 0; idx < errorProps.length; idx++) {\n\t this[errorProps[idx]] = tmp[errorProps[idx]];\n\t }\n\n\t if (Error.captureStackTrace) {\n\t Error.captureStackTrace(this, Exception);\n\t }\n\n\t if (loc) {\n\t this.lineNumber = line;\n\t this.column = column;\n\t }\n\t}\n\n\tException.prototype = new Error();\n\n\texports['default'] = Exception;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\texports.__esModule = true;\n\texports.extend = extend;\n\n\t// Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\texports.indexOf = indexOf;\n\texports.escapeExpression = escapeExpression;\n\texports.isEmpty = isEmpty;\n\texports.blockParams = blockParams;\n\texports.appendContextPath = appendContextPath;\n\tvar escape = {\n\t '&': '&',\n\t '<': '<',\n\t '>': '>',\n\t '\"': '"',\n\t '\\'': ''',\n\t '`': '`'\n\t};\n\n\tvar badChars = /[&<>\"'`]/g,\n\t possible = /[&<>\"'`]/;\n\n\tfunction escapeChar(chr) {\n\t return escape[chr];\n\t}\n\n\tfunction extend(obj /* , ...source */) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t for (var key in arguments[i]) {\n\t if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n\t obj[key] = arguments[i][key];\n\t }\n\t }\n\t }\n\n\t return obj;\n\t}\n\n\tvar toString = Object.prototype.toString;\n\n\texports.toString = toString;\n\t// Sourced from lodash\n\t// https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n\t/*eslint-disable func-style, no-var */\n\tvar isFunction = function isFunction(value) {\n\t return typeof value === 'function';\n\t};\n\t// fallback for older versions of Chrome and Safari\n\t/* istanbul ignore next */\n\tif (isFunction(/x/)) {\n\t exports.isFunction = isFunction = function (value) {\n\t return typeof value === 'function' && toString.call(value) === '[object Function]';\n\t };\n\t}\n\tvar isFunction;\n\texports.isFunction = isFunction;\n\t/*eslint-enable func-style, no-var */\n\n\t/* istanbul ignore next */\n\tvar isArray = Array.isArray || function (value) {\n\t return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false;\n\t};exports.isArray = isArray;\n\n\tfunction indexOf(array, value) {\n\t for (var i = 0, len = array.length; i < len; i++) {\n\t if (array[i] === value) {\n\t return i;\n\t }\n\t }\n\t return -1;\n\t}\n\n\tfunction escapeExpression(string) {\n\t if (typeof string !== 'string') {\n\t // don't escape SafeStrings, since they're already safe\n\t if (string && string.toHTML) {\n\t return string.toHTML();\n\t } else if (string == null) {\n\t return '';\n\t } else if (!string) {\n\t return string + '';\n\t }\n\n\t // Force a string conversion as this will be done by the append regardless and\n\t // the regex test will do this transparently behind the scenes, causing issues if\n\t // an object's to string has escaped characters in it.\n\t string = '' + string;\n\t }\n\n\t if (!possible.test(string)) {\n\t return string;\n\t }\n\t return string.replace(badChars, escapeChar);\n\t}\n\n\tfunction isEmpty(value) {\n\t if (!value && value !== 0) {\n\t return true;\n\t } else if (isArray(value) && value.length === 0) {\n\t return true;\n\t } else {\n\t return false;\n\t }\n\t}\n\n\tfunction blockParams(params, ids) {\n\t params.path = ids;\n\t return params;\n\t}\n\n\tfunction appendContextPath(contextPath, id) {\n\t return (contextPath ? contextPath + '.' : '') + id;\n\t}\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar _interopRequireWildcard = __webpack_require__(7)['default'];\n\n\texports.__esModule = true;\n\texports.checkRevision = checkRevision;\n\n\t// TODO: Remove this line and break up compilePartial\n\n\texports.template = template;\n\texports.wrapProgram = wrapProgram;\n\texports.resolvePartial = resolvePartial;\n\texports.invokePartial = invokePartial;\n\texports.noop = noop;\n\n\tvar _import = __webpack_require__(4);\n\n\tvar Utils = _interopRequireWildcard(_import);\n\n\tvar _Exception = __webpack_require__(3);\n\n\tvar _Exception2 = _interopRequireWildcard(_Exception);\n\n\tvar _COMPILER_REVISION$REVISION_CHANGES$createFrame = __webpack_require__(1);\n\n\tfunction checkRevision(compilerInfo) {\n\t var compilerRevision = compilerInfo && compilerInfo[0] || 1,\n\t currentRevision = _COMPILER_REVISION$REVISION_CHANGES$createFrame.COMPILER_REVISION;\n\n\t if (compilerRevision !== currentRevision) {\n\t if (compilerRevision < currentRevision) {\n\t var runtimeVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[currentRevision],\n\t compilerVersions = _COMPILER_REVISION$REVISION_CHANGES$createFrame.REVISION_CHANGES[compilerRevision];\n\t throw new _Exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').');\n\t } else {\n\t // Use the embedded version info since the runtime doesn't know about this revision yet\n\t throw new _Exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').');\n\t }\n\t }\n\t}\n\n\tfunction template(templateSpec, env) {\n\t /* istanbul ignore next */\n\t if (!env) {\n\t throw new _Exception2['default']('No environment passed to template');\n\t }\n\t if (!templateSpec || !templateSpec.main) {\n\t throw new _Exception2['default']('Unknown template object: ' + typeof templateSpec);\n\t }\n\n\t // Note: Using env.VM references rather than local var references throughout this section to allow\n\t // for external users to override these as psuedo-supported APIs.\n\t env.VM.checkRevision(templateSpec.compiler);\n\n\t function invokePartialWrapper(partial, context, options) {\n\t if (options.hash) {\n\t context = Utils.extend({}, context, options.hash);\n\t }\n\n\t partial = env.VM.resolvePartial.call(this, partial, context, options);\n\t var result = env.VM.invokePartial.call(this, partial, context, options);\n\n\t if (result == null && env.compile) {\n\t options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env);\n\t result = options.partials[options.name](context, options);\n\t }\n\t if (result != null) {\n\t if (options.indent) {\n\t var lines = result.split('\\n');\n\t for (var i = 0, l = lines.length; i < l; i++) {\n\t if (!lines[i] && i + 1 === l) {\n\t break;\n\t }\n\n\t lines[i] = options.indent + lines[i];\n\t }\n\t result = lines.join('\\n');\n\t }\n\t return result;\n\t } else {\n\t throw new _Exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode');\n\t }\n\t }\n\n\t // Just add water\n\t var container = {\n\t strict: function strict(obj, name) {\n\t if (!(name in obj)) {\n\t throw new _Exception2['default']('\"' + name + '\" not defined in ' + obj);\n\t }\n\t return obj[name];\n\t },\n\t lookup: function lookup(depths, name) {\n\t var len = depths.length;\n\t for (var i = 0; i < len; i++) {\n\t if (depths[i] && depths[i][name] != null) {\n\t return depths[i][name];\n\t }\n\t }\n\t },\n\t lambda: function lambda(current, context) {\n\t return typeof current === 'function' ? current.call(context) : current;\n\t },\n\n\t escapeExpression: Utils.escapeExpression,\n\t invokePartial: invokePartialWrapper,\n\n\t fn: function fn(i) {\n\t return templateSpec[i];\n\t },\n\n\t programs: [],\n\t program: function program(i, data, declaredBlockParams, blockParams, depths) {\n\t var programWrapper = this.programs[i],\n\t fn = this.fn(i);\n\t if (data || depths || blockParams || declaredBlockParams) {\n\t programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths);\n\t } else if (!programWrapper) {\n\t programWrapper = this.programs[i] = wrapProgram(this, i, fn);\n\t }\n\t return programWrapper;\n\t },\n\n\t data: function data(value, depth) {\n\t while (value && depth--) {\n\t value = value._parent;\n\t }\n\t return value;\n\t },\n\t merge: function merge(param, common) {\n\t var obj = param || common;\n\n\t if (param && common && param !== common) {\n\t obj = Utils.extend({}, common, param);\n\t }\n\n\t return obj;\n\t },\n\n\t noop: env.VM.noop,\n\t compilerInfo: templateSpec.compiler\n\t };\n\n\t function ret(context) {\n\t var options = arguments[1] === undefined ? {} : arguments[1];\n\n\t var data = options.data;\n\n\t ret._setup(options);\n\t if (!options.partial && templateSpec.useData) {\n\t data = initData(context, data);\n\t }\n\t var depths = undefined,\n\t blockParams = templateSpec.useBlockParams ? [] : undefined;\n\t if (templateSpec.useDepths) {\n\t depths = options.depths ? [context].concat(options.depths) : [context];\n\t }\n\n\t return templateSpec.main.call(container, context, container.helpers, container.partials, data, blockParams, depths);\n\t }\n\t ret.isTop = true;\n\n\t ret._setup = function (options) {\n\t if (!options.partial) {\n\t container.helpers = container.merge(options.helpers, env.helpers);\n\n\t if (templateSpec.usePartial) {\n\t container.partials = container.merge(options.partials, env.partials);\n\t }\n\t } else {\n\t container.helpers = options.helpers;\n\t container.partials = options.partials;\n\t }\n\t };\n\n\t ret._child = function (i, data, blockParams, depths) {\n\t if (templateSpec.useBlockParams && !blockParams) {\n\t throw new _Exception2['default']('must pass block params');\n\t }\n\t if (templateSpec.useDepths && !depths) {\n\t throw new _Exception2['default']('must pass parent depths');\n\t }\n\n\t return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths);\n\t };\n\t return ret;\n\t}\n\n\tfunction wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) {\n\t function prog(context) {\n\t var options = arguments[1] === undefined ? {} : arguments[1];\n\n\t return fn.call(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), depths && [context].concat(depths));\n\t }\n\t prog.program = i;\n\t prog.depth = depths ? depths.length : 0;\n\t prog.blockParams = declaredBlockParams || 0;\n\t return prog;\n\t}\n\n\tfunction resolvePartial(partial, context, options) {\n\t if (!partial) {\n\t partial = options.partials[options.name];\n\t } else if (!partial.call && !options.name) {\n\t // This is a dynamic partial that returned a string\n\t options.name = partial;\n\t partial = options.partials[partial];\n\t }\n\t return partial;\n\t}\n\n\tfunction invokePartial(partial, context, options) {\n\t options.partial = true;\n\n\t if (partial === undefined) {\n\t throw new _Exception2['default']('The partial ' + options.name + ' could not be found');\n\t } else if (partial instanceof Function) {\n\t return partial(context, options);\n\t }\n\t}\n\n\tfunction noop() {\n\t return '';\n\t}\n\n\tfunction initData(context, data) {\n\t if (!data || !('root' in data)) {\n\t data = data ? _COMPILER_REVISION$REVISION_CHANGES$createFrame.createFrame(data) : {};\n\t data.root = context;\n\t }\n\t return data;\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\texports.__esModule = true;\n\t/*global window */\n\n\texports['default'] = function (Handlebars) {\n\t /* istanbul ignore next */\n\t var root = typeof global !== 'undefined' ? global : window,\n\t $Handlebars = root.Handlebars;\n\t /* istanbul ignore next */\n\t Handlebars.noConflict = function () {\n\t if (root.Handlebars === Handlebars) {\n\t root.Handlebars = $Handlebars;\n\t }\n\t };\n\t};\n\n\tmodule.exports = exports['default'];\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\n\texports[\"default\"] = function (obj) {\n\t return obj && obj.__esModule ? obj : {\n\t \"default\": obj\n\t };\n\t};\n\n\texports.__esModule = true;\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./galaxy/scripts/libs/handlebars.runtime.js\n ** module id = 86\n ** module chunks = 2\n **/","/*! jQuery UI - v1.9.1 - 2012-10-29\n* http://jqueryui.com\n* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.menu.js, jquery.ui.slider.js\n* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */\n\n(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return\"area\"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!==\"map\"?!1:(o=e(\"img[usemap=#\"+i+\"]\")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:\"a\"===u?t.href||n:n)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().andSelf().filter(function(){return e.css(this,\"visibility\")===\"hidden\"}).length}var n=0,r=/^ui-id-\\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:\"1.9.1\",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t==\"number\"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.ui.ie&&/(static|relative)/.test(this.css(\"position\"))||/absolute/.test(this.css(\"position\"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,\"position\"))&&/(auto|scroll)/.test(e.css(this,\"overflow\")+e.css(this,\"overflow-y\")+e.css(this,\"overflow-x\"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,\"overflow\")+e.css(this,\"overflow-y\")+e.css(this,\"overflow-x\"))}).eq(0),/fixed/.test(this.css(\"position\"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css(\"zIndex\",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css(\"position\");if(i===\"absolute\"||i===\"relative\"||i===\"fixed\"){s=parseInt(r.css(\"zIndex\"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id=\"ui-id-\"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr(\"id\")})}}),e(\"\").outerWidth(1).jquery||e.each([\"Width\",\"Height\"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,\"padding\"+this))||0,r&&(n-=parseFloat(e.css(t,\"border\"+this+\"Width\"))||0),s&&(n-=parseFloat(e.css(t,\"margin\"+this))||0)}),n}var i=r===\"Width\"?[\"Left\",\"Right\"]:[\"Top\",\"Bottom\"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn[\"inner\"+r]=function(n){return n===t?o[\"inner\"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+\"px\")})},e.fn[\"outer\"+r]=function(t,n){return typeof t!=\"number\"?o[\"outer\"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+\"px\")})}}),e.extend(e.expr[\":\"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,\"tabindex\")))},tabbable:function(t){var n=e.attr(t,\"tabindex\"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e(function(){var t=document.body,n=t.appendChild(n=document.createElement(\"div\"));n.offsetHeight,e.extend(n.style,{minHeight:\"100px\",height:\"auto\",padding:0,borderWidth:0}),e.support.minHeight=n.offsetHeight===100,e.support.selectstart=\"onselectstart\"in n,t.removeChild(n).style.display=\"none\"}),function(){var t=/msie ([\\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];e.ui.ie=t.length?!0:!1,e.ui.ie6=parseFloat(t[1],10)===6}(),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?\"selectstart\":\"mousedown\")+\".ui-disableSelection\",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(\".ui-disableSelection\")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)},isOverAxis:function(e,t,n){return e>t&&e\",options:{disabled:!1,create:null},_createWidget:function(t,r){r=e(r||this.defaultElement||this)[0],this.element=e(r),this.uuid=n++,this.eventNamespace=\".\"+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),r!==this&&(e.data(r,this.widgetName,this),e.data(r,this.widgetFullName,this),this._on(this.element,{remove:function(e){e.target===r&&this.destroy()}}),this.document=e(r.style?r.ownerDocument:r.document||r),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger(\"create\",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr(\"aria-disabled\").removeClass(this.widgetFullName+\"-disabled \"+\"ui-state-disabled\"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass(\"ui-state-hover\"),this.focusable.removeClass(\"ui-state-focus\")},_destroy:e.noop,widget:function(){return this.element},option:function(n,r){var i=n,s,o,u;if(arguments.length===0)return e.widget.extend({},this.options);if(typeof n==\"string\"){i={},s=n.split(\".\"),n=s.shift();if(s.length){o=i[n]=e.widget.extend({},this.options[n]);for(u=0;u=9||!!t.button?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return e(document).unbind(\"mousemove.\"+this.widgetName,this._mouseMoveDelegate).unbind(\"mouseup.\"+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+\".preventClickEvent\",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(e){return this.mouseDelayMet},_mouseStart:function(e){},_mouseDrag:function(e){},_mouseStop:function(e){},_mouseCapture:function(e){return!0}})})(jQuery);(function(e,t){function h(e,t,n){return[parseInt(e[0],10)*(l.test(e[0])?t/100:1),parseInt(e[1],10)*(l.test(e[1])?n/100:1)]}function p(t,n){return parseInt(e.css(t,n),10)||0}e.ui=e.ui||{};var n,r=Math.max,i=Math.abs,s=Math.round,o=/left|center|right/,u=/top|center|bottom/,a=/[\\+\\-]\\d+%?/,f=/^\\w+/,l=/%$/,c=e.fn.position;e.position={scrollbarWidth:function(){if(n!==t)return n;var r,i,s=e(\"
                                    \"),o=s.children()[0];return e(\"body\").append(s),r=o.offsetWidth,s.css(\"overflow\",\"scroll\"),i=o.offsetWidth,r===i&&(i=s[0].clientWidth),s.remove(),n=r-i},getScrollInfo:function(t){var n=t.isWindow?\"\":t.element.css(\"overflow-x\"),r=t.isWindow?\"\":t.element.css(\"overflow-y\"),i=n===\"scroll\"||n===\"auto\"&&t.width0?\"right\":\"center\",vertical:u<0?\"top\":o>0?\"bottom\":\"middle\"};lr(i(o),i(u))?h.important=\"horizontal\":h.important=\"vertical\",t.using.call(this,e,h)}),a.offset(e.extend(C,{using:u}))})},e.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=e.left-t.collisionPosition.marginLeft,u=i-o,a=o+t.collisionWidth-s-i,f;t.collisionWidth>s?u>0&&a<=0?(f=e.left+u+t.collisionWidth-s-i,e.left+=u-f):a>0&&u<=0?e.left=i:u>a?e.left=i+s-t.collisionWidth:e.left=i:u>0?e.left+=u:a>0?e.left-=a:e.left=r(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,s=t.within.height,o=e.top-t.collisionPosition.marginTop,u=i-o,a=o+t.collisionHeight-s-i,f;t.collisionHeight>s?u>0&&a<=0?(f=e.top+u+t.collisionHeight-s-i,e.top+=u-f):a>0&&u<=0?e.top=i:u>a?e.top=i+s-t.collisionHeight:e.top=i:u>0?e.top+=u:a>0?e.top-=a:e.top=r(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,s=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,u=e.left-t.collisionPosition.marginLeft,a=u-o,f=u+t.collisionWidth-s-o,l=t.my[0]===\"left\"?-t.elemWidth:t.my[0]===\"right\"?t.elemWidth:0,c=t.at[0]===\"left\"?t.targetWidth:t.at[0]===\"right\"?-t.targetWidth:0,h=-2*t.offset[0],p,d;if(a<0){p=e.left+l+c+h+t.collisionWidth-s-r;if(p<0||p0){d=e.left-t.collisionPosition.marginLeft+l+c+h-o;if(d>0||i(d)a&&(v<0||v0&&(d=e.top-t.collisionPosition.marginTop+c+h+p-o,e.top+c+h+p>f&&(d>0||i(d)10&&i<11,t.innerHTML=\"\",n.removeChild(t)}(),e.uiBackCompat!==!1&&function(e){var n=e.fn.position;e.fn.position=function(r){if(!r||!r.offset)return n.call(this,r);var i=r.offset.split(\" \"),s=r.at.split(\" \");return i.length===1&&(i[1]=i[0]),/^\\d/.test(i[0])&&(i[0]=\"+\"+i[0]),/^\\d/.test(i[1])&&(i[1]=\"+\"+i[1]),s.length===1&&(/left|center|right/.test(s[0])?s[1]=\"center\":(s[1]=s[0],s[0]=\"center\")),n.call(this,e.extend(r,{at:s[0]+i[0]+\" \"+s[1]+i[1],offset:t}))}}(jQuery)})(jQuery);(function(e,t){var n=0;e.widget(\"ui.autocomplete\",{version:\"1.9.1\",defaultElement:\"\",options:{appendTo:\"body\",autoFocus:!1,delay:300,minLength:1,position:{my:\"left top\",at:\"left bottom\",collision:\"none\"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var t,n,r;this.isMultiLine=this._isMultiLine(),this.valueMethod=this.element[this.element.is(\"input,textarea\")?\"val\":\"text\"],this.isNewMenu=!0,this.element.addClass(\"ui-autocomplete-input\").attr(\"autocomplete\",\"off\"),this._on(this.element,{keydown:function(i){if(this.element.prop(\"readOnly\")){t=!0,r=!0,n=!0;return}t=!1,r=!1,n=!1;var s=e.ui.keyCode;switch(i.keyCode){case s.PAGE_UP:t=!0,this._move(\"previousPage\",i);break;case s.PAGE_DOWN:t=!0,this._move(\"nextPage\",i);break;case s.UP:t=!0,this._keyEvent(\"previous\",i);break;case s.DOWN:t=!0,this._keyEvent(\"next\",i);break;case s.ENTER:case s.NUMPAD_ENTER:this.menu.active&&(t=!0,i.preventDefault(),this.menu.select(i));break;case s.TAB:this.menu.active&&this.menu.select(i);break;case s.ESCAPE:this.menu.element.is(\":visible\")&&(this._value(this.term),this.close(i),i.preventDefault());break;default:n=!0,this._searchTimeout(i)}},keypress:function(r){if(t){t=!1,r.preventDefault();return}if(n)return;var i=e.ui.keyCode;switch(r.keyCode){case i.PAGE_UP:this._move(\"previousPage\",r);break;case i.PAGE_DOWN:this._move(\"nextPage\",r);break;case i.UP:this._keyEvent(\"previous\",r);break;case i.DOWN:this._keyEvent(\"next\",r)}},input:function(e){if(r){r=!1,e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}clearTimeout(this.searching),this.close(e),this._change(e)}}),this._initSource(),this.menu=e(\"
                                      \").addClass(\"ui-autocomplete\").appendTo(this.document.find(this.options.appendTo||\"body\")[0]).menu({input:e(),role:null}).zIndex(this.element.zIndex()+1).hide().data(\"menu\"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var n=this.menu.element[0];e(t.target).closest(\".ui-menu-item\").length||this._delay(function(){var t=this;this.document.one(\"mousedown\",function(r){r.target!==t.element[0]&&r.target!==n&&!e.contains(n,r.target)&&t.close()})})},menufocus:function(t,n){if(this.isNewMenu){this.isNewMenu=!1;if(t.originalEvent&&/^mouse/.test(t.originalEvent.type)){this.menu.blur(),this.document.one(\"mousemove\",function(){e(t.target).trigger(t.originalEvent)});return}}var r=n.item.data(\"ui-autocomplete-item\")||n.item.data(\"item.autocomplete\");!1!==this._trigger(\"focus\",t,{item:r})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(r.value):this.liveRegion.text(r.value)},menuselect:function(e,t){var n=t.item.data(\"ui-autocomplete-item\")||t.item.data(\"item.autocomplete\"),r=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger(\"select\",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=e(\"\",{role:\"status\",\"aria-live\":\"polite\"}).addClass(\"ui-helper-hidden-accessible\").insertAfter(this.element),e.fn.bgiframe&&this.menu.element.bgiframe(),this._on(this.window,{beforeunload:function(){this.element.removeAttr(\"autocomplete\")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass(\"ui-autocomplete-input\").removeAttr(\"autocomplete\"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),e===\"source\"&&this._initSource(),e===\"appendTo\"&&this.menu.element.appendTo(this.document.find(t||\"body\")[0]),e===\"disabled\"&&t&&this.xhr&&this.xhr.abort()},_isMultiLine:function(){return this.element.is(\"textarea\")?!0:this.element.is(\"input\")?!1:this.element.prop(\"isContentEditable\")},_initSource:function(){var t,n,r=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(n,r){r(e.ui.autocomplete.filter(t,n.term))}):typeof this.options.source==\"string\"?(n=this.options.source,this.source=function(t,i){r.xhr&&r.xhr.abort(),r.xhr=e.ajax({url:n,data:t,dataType:\"json\",success:function(e){i(e)},error:function(){i([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){e=e!=null?e:this._value(),this.term=this._value();if(e.length\").append(e(\"\").text(n.label)).appendTo(t)},_move:function(e,t){if(!this.menu.element.is(\":visible\")){this.search(null,t);return}if(this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)){this._value(this.term),this.menu.blur();return}this.menu[e](t)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){if(!this.isMultiLine||this.menu.element.is(\":visible\"))this._move(e,t),t.preventDefault()}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,\"\\\\$&\")},filter:function(t,n){var r=new RegExp(e.ui.autocomplete.escapeRegex(n),\"i\");return e.grep(t,function(e){return r.test(e.label||e.value||e)})}}),e.widget(\"ui.autocomplete\",e.ui.autocomplete,{options:{messages:{noResults:\"No search results.\",results:function(e){return e+(e>1?\" results are\":\" result is\")+\" available, use up and down arrow keys to navigate.\"}}},__response:function(e){var t;this._superApply(arguments);if(this.options.disabled||this.cancelSearch)return;e&&e.length?t=this.options.messages.results(e.length):t=this.options.messages.noResults,this.liveRegion.text(t)}})})(jQuery);(function(e,t){var n,r,i,s,o=\"ui-button ui-widget ui-state-default ui-corner-all\",u=\"ui-state-hover ui-state-active \",a=\"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",f=function(){var t=e(this).find(\":ui-button\");setTimeout(function(){t.button(\"refresh\")},1)},l=function(t){var n=t.name,r=t.form,i=e([]);return n&&(r?i=e(r).find(\"[name='\"+n+\"']\"):i=e(\"[name='\"+n+\"']\",t.ownerDocument).filter(function(){return!this.form})),i};e.widget(\"ui.button\",{version:\"1.9.1\",defaultElement:\"