##// END OF EJS Templates
More work on the dual mode UX.
Brian E. Granger -
Show More
@@ -1,468 +1,469 b''
1 1 //----------------------------------------------------------------------------
2 2 // Copyright (C) 2008-2011 The IPython Development Team
3 3 //
4 4 // Distributed under the terms of the BSD License. The full license is in
5 5 // the file COPYING, distributed as part of this software.
6 6 //----------------------------------------------------------------------------
7 7
8 8 //============================================================================
9 9 // Cell
10 10 //============================================================================
11 11 /**
12 12 * An extendable module that provide base functionnality to create cell for notebook.
13 13 * @module IPython
14 14 * @namespace IPython
15 15 * @submodule Cell
16 16 */
17 17
18 18 var IPython = (function (IPython) {
19 19 "use strict";
20 20
21 21 var utils = IPython.utils;
22 22
23 23 /**
24 24 * The Base `Cell` class from which to inherit
25 25 * @class Cell
26 26 **/
27 27
28 28 /*
29 29 * @constructor
30 30 *
31 31 * @param {object|undefined} [options]
32 32 * @param [options.cm_config] {object} config to pass to CodeMirror, will extend default parameters
33 33 */
34 34 var Cell = function (options) {
35 35
36 36 options = this.mergeopt(Cell, options);
37 37 // superclass default overwrite our default
38 38
39 39 this.placeholder = options.placeholder || '';
40 40 this.read_only = options.cm_config.readOnly;
41 41 this.selected = false;
42 42 this.rendered = false;
43 43 this.mode = 'command';
44 44 this.metadata = {};
45 45 // load this from metadata later ?
46 46 this.user_highlight = 'auto';
47 47 this.cm_config = options.cm_config;
48 48 this.cell_id = utils.uuid();
49 49 this._options = options;
50 50
51 51 // For JS VM engines optimisation, attributes should be all set (even
52 52 // to null) in the constructor, and if possible, if different subclass
53 53 // have new attributes with same name, they should be created in the
54 54 // same order. Easiest is to create and set to null in parent class.
55 55
56 56 this.element = null;
57 57 this.cell_type = this.cell_type || null;
58 58 this.code_mirror = null;
59 59
60 60
61 61 this.create_element();
62 62 if (this.element !== null) {
63 63 this.element.data("cell", this);
64 64 this.bind_events();
65 65 }
66 66 };
67 67
68 68 Cell.options_default = {
69 69 cm_config : {
70 70 indentUnit : 4,
71 71 readOnly: false,
72 72 theme: "default"
73 73 }
74 74 };
75 75
76 76 // FIXME: Workaround CM Bug #332 (Safari segfault on drag)
77 77 // by disabling drag/drop altogether on Safari
78 78 // https://github.com/marijnh/CodeMirror/issues/332
79 79
80 80 if (utils.browser[0] == "Safari") {
81 81 Cell.options_default.cm_config.dragDrop = false;
82 82 }
83 83
84 84 Cell.prototype.mergeopt = function(_class, options, overwrite){
85 85 options = options || {};
86 86 overwrite = overwrite || {};
87 87 return $.extend(true, {}, _class.options_default, options, overwrite)
88 88
89 89 }
90 90
91 91
92 92
93 93 /**
94 94 * Empty. Subclasses must implement create_element.
95 95 * This should contain all the code to create the DOM element in notebook
96 96 * and will be called by Base Class constructor.
97 97 * @method create_element
98 98 */
99 99 Cell.prototype.create_element = function () {
100 100 };
101 101
102 102
103 103 /**
104 104 * Subclasses can implement override bind_events.
105 105 * Be carefull to call the parent method when overwriting as it fires event.
106 106 * this will be triggerd after create_element in constructor.
107 107 * @method bind_events
108 108 */
109 109 Cell.prototype.bind_events = function () {
110 110 var that = this;
111 111 // We trigger events so that Cell doesn't have to depend on Notebook.
112 112 that.element.click(function (event) {
113 113 if (that.selected === false) {
114 114 $([IPython.events]).trigger('select.Cell', {'cell':that});
115 115 }
116 116 });
117 117 that.element.focusin(function (event) {
118 118 if (that.selected === false) {
119 119 $([IPython.events]).trigger('select.Cell', {'cell':that});
120 120 }
121 121 });
122 122 if (this.code_mirror) {
123 123 this.code_mirror.on("change", function(cm, change) {
124 124 $([IPython.events]).trigger("set_dirty.Notebook", {value: true});
125 125 });
126 }
126 };
127 if (this.code_mirror) {
128 this.code_mirror.on('focus', function(cm, change) {
129 $([IPython.events]).trigger('edit_mode.Cell', {cell: that});
130 });
131 };
127 132 };
128 133
129 134 /**
130 135 * Triger typsetting of math by mathjax on current cell element
131 136 * @method typeset
132 137 */
133 138 Cell.prototype.typeset = function () {
134 139 if (window.MathJax) {
135 140 var cell_math = this.element.get(0);
136 141 MathJax.Hub.Queue(["Typeset", MathJax.Hub, cell_math]);
137 142 };
138 143 };
139 144
140 145 /**
141 146 * handle cell level logic when a cell is selected
142 147 * @method select
143 148 * @return is the action being taken
144 149 */
145 150 Cell.prototype.select = function () {
151 console.log('Cell.select');
146 152 if (!this.selected) {
147 153 this.element.addClass('selected');
148 154 this.element.removeClass('unselected');
149 155 this.selected = true;
150 156 return true;
151 157 } else {
158 console.log('WARNING: select');
152 159 return false;
153 160 };
154 161 };
155 162
156 163 /**
157 164 * handle cell level logic when a cell is unselected
158 165 * @method unselect
159 166 * @return is the action being taken
160 167 */
161 168 Cell.prototype.unselect = function () {
169 console.log('Cell.unselect');
162 170 if (this.selected) {
163 171 this.element.addClass('unselected');
164 172 this.element.removeClass('selected');
165 173 this.selected = false;
166 174 return true;
167 175 } else {
176 console.log('WARNING: unselect');
168 177 return false;
169 178 };
170 179 };
171 180
172 181 /**
173 182 * handle cell level logic when a cell is rendered
174 183 * @method render
175 184 * @return is the action being taken
176 185 */
177 186 Cell.prototype.render = function () {
187 console.log('Cell.render');
178 188 if (!this.rendered) {
179 189 this.element.addClass('rendered');
180 190 this.element.removeClass('unrendered');
181 191 this.rendered = true;
182 192 return true;
183 193 } else {
194 console.log('WARNING: render');
184 195 return false;
185 196 };
186 197 };
187 198
188 199 /**
189 200 * handle cell level logic when a cell is unrendered
190 201 * @method unrender
191 202 * @return is the action being taken
192 203 */
193 204 Cell.prototype.unrender = function () {
205 console.log('Cell.unrender');
194 206 if (this.rendered) {
195 207 this.element.addClass('unrendered');
196 208 this.element.removeClass('rendered');
197 209 this.rendered = false;
198 210 return true;
199 211 } else {
212 console.log('WARNING: unrender');
200 213 return false;
201 214 };
202 215 };
203 216
204 217 /**
205 218 * enter the command mode for the cell
206 219 * @method command_mode
207 220 * @return is the action being taken
208 221 */
209 222 Cell.prototype.command_mode = function () {
223 console.log('Cell.command_mode:', this.mode);
210 224 if (this.mode !== 'command') {
211 225 this.element.addClass('command_mode');
212 226 this.element.removeClass('edit_mode');
213 227 this.mode = 'command';
214 228 return true;
215 229 } else {
230 console.log('WARNING: command_mode');
216 231 return false;
217 232 };
218 233 };
219 234
220 235 /**
221 236 * enter the edit mode for the cell
222 237 * @method command_mode
223 238 * @return is the action being taken
224 239 */
225 240 Cell.prototype.edit_mode = function () {
241 console.log('Cell.edit_mode:', this.mode);
226 242 if (this.mode !== 'edit') {
227 243 this.element.addClass('edit_mode');
228 244 this.element.removeClass('command_mode');
229 245 this.mode = 'edit';
230 246 return true;
231 247 } else {
248 console.log('WARNING: edit_mode');
232 249 return false;
233 250 };
234 251 }
235 252
236 253 /**
237 254 * Focus the cell in the DOM sense
238 255 * @method focus_cell
239 256 */
240 257 Cell.prototype.focus_cell = function () {
241 258 this.element.focus();
242 259 }
243 260
244 261 /**
245 262 * Focus the editor area so a user can type
246 263 * @method focus_editor
247 264 */
248 265 Cell.prototype.focus_editor = function () {
249 this.code_mirror.refresh();
266 this.refresh();
250 267 this.code_mirror.focus();
251 268 }
252 269
253 270 /**
254 * should be overritten by subclass
255 * @method get_text
256 */
257 Cell.prototype.get_text = function () {
258 };
259
260 /**
261 * should be overritten by subclass
262 * @method set_text
263 * @param {string} text
264 */
265 Cell.prototype.set_text = function (text) {
266 };
267
268 /**
269 271 * Refresh codemirror instance
270 272 * @method refresh
271 273 */
272 274 Cell.prototype.refresh = function () {
273 275 this.code_mirror.refresh();
274 276 };
275 277
276
277 278 /**
278 279 * should be overritten by subclass
279 * @method edit
280 **/
281 Cell.prototype.edit = function () {
280 * @method get_text
281 */
282 Cell.prototype.get_text = function () {
282 283 };
283 284
284
285 285 /**
286 286 * should be overritten by subclass
287 * @method render
288 **/
289 Cell.prototype.render = function () {
287 * @method set_text
288 * @param {string} text
289 */
290 Cell.prototype.set_text = function (text) {
290 291 };
291 292
292 293 /**
293 294 * should be overritten by subclass
294 295 * serialise cell to json.
295 296 * @method toJSON
296 297 **/
297 298 Cell.prototype.toJSON = function () {
298 299 var data = {};
299 300 data.metadata = this.metadata;
300 301 data.cell_type = this.cell_type;
301 302 return data;
302 303 };
303 304
304 305
305 306 /**
306 307 * should be overritten by subclass
307 308 * @method fromJSON
308 309 **/
309 310 Cell.prototype.fromJSON = function (data) {
310 311 if (data.metadata !== undefined) {
311 312 this.metadata = data.metadata;
312 313 }
313 314 this.celltoolbar.rebuild();
314 315 };
315 316
316 317
317 318 /**
318 319 * can the cell be split into two cells
319 320 * @method is_splittable
320 321 **/
321 322 Cell.prototype.is_splittable = function () {
322 323 return true;
323 324 };
324 325
325 326
326 327 /**
327 328 * can the cell be merged with other cells
328 329 * @method is_mergeable
329 330 **/
330 331 Cell.prototype.is_mergeable = function () {
331 332 return true;
332 333 };
333 334
334 335
335 336 /**
336 337 * @return {String} - the text before the cursor
337 338 * @method get_pre_cursor
338 339 **/
339 340 Cell.prototype.get_pre_cursor = function () {
340 341 var cursor = this.code_mirror.getCursor();
341 342 var text = this.code_mirror.getRange({line:0, ch:0}, cursor);
342 343 text = text.replace(/^\n+/, '').replace(/\n+$/, '');
343 344 return text;
344 345 }
345 346
346 347
347 348 /**
348 349 * @return {String} - the text after the cursor
349 350 * @method get_post_cursor
350 351 **/
351 352 Cell.prototype.get_post_cursor = function () {
352 353 var cursor = this.code_mirror.getCursor();
353 354 var last_line_num = this.code_mirror.lineCount()-1;
354 355 var last_line_len = this.code_mirror.getLine(last_line_num).length;
355 356 var end = {line:last_line_num, ch:last_line_len}
356 357 var text = this.code_mirror.getRange(cursor, end);
357 358 text = text.replace(/^\n+/, '').replace(/\n+$/, '');
358 359 return text;
359 360 };
360 361
361 362 /**
362 363 * Show/Hide CodeMirror LineNumber
363 364 * @method show_line_numbers
364 365 *
365 366 * @param value {Bool} show (true), or hide (false) the line number in CodeMirror
366 367 **/
367 368 Cell.prototype.show_line_numbers = function (value) {
368 369 this.code_mirror.setOption('lineNumbers', value);
369 370 this.code_mirror.refresh();
370 371 };
371 372
372 373 /**
373 374 * Toggle CodeMirror LineNumber
374 375 * @method toggle_line_numbers
375 376 **/
376 377 Cell.prototype.toggle_line_numbers = function () {
377 378 var val = this.code_mirror.getOption('lineNumbers');
378 379 this.show_line_numbers(!val);
379 380 };
380 381
381 382 /**
382 383 * Force codemirror highlight mode
383 384 * @method force_highlight
384 385 * @param {object} - CodeMirror mode
385 386 **/
386 387 Cell.prototype.force_highlight = function(mode) {
387 388 this.user_highlight = mode;
388 389 this.auto_highlight();
389 390 };
390 391
391 392 /**
392 393 * Try to autodetect cell highlight mode, or use selected mode
393 394 * @methods _auto_highlight
394 395 * @private
395 396 * @param {String|object|undefined} - CodeMirror mode | 'auto'
396 397 **/
397 398 Cell.prototype._auto_highlight = function (modes) {
398 399 //Here we handle manually selected modes
399 400 if( this.user_highlight != undefined && this.user_highlight != 'auto' )
400 401 {
401 402 var mode = this.user_highlight;
402 403 CodeMirror.autoLoadMode(this.code_mirror, mode);
403 404 this.code_mirror.setOption('mode', mode);
404 405 return;
405 406 }
406 407 var current_mode = this.code_mirror.getOption('mode', mode);
407 408 var first_line = this.code_mirror.getLine(0);
408 409 // loop on every pairs
409 410 for( var mode in modes) {
410 411 var regs = modes[mode]['reg'];
411 412 // only one key every time but regexp can't be keys...
412 413 for(var reg in regs ) {
413 414 // here we handle non magic_modes
414 415 if(first_line.match(regs[reg]) != null) {
415 416 if(current_mode == mode){
416 417 return;
417 418 }
418 419 if (mode.search('magic_') != 0) {
419 420 this.code_mirror.setOption('mode', mode);
420 421 CodeMirror.autoLoadMode(this.code_mirror, mode);
421 422 return;
422 423 }
423 424 var open = modes[mode]['open']|| "%%";
424 425 var close = modes[mode]['close']|| "%%end";
425 426 var mmode = mode;
426 427 mode = mmode.substr(6);
427 428 if(current_mode == mode){
428 429 return;
429 430 }
430 431 CodeMirror.autoLoadMode(this.code_mirror, mode);
431 432 // create on the fly a mode that swhitch between
432 433 // plain/text and smth else otherwise `%%` is
433 434 // source of some highlight issues.
434 435 // we use patchedGetMode to circumvent a bug in CM
435 436 CodeMirror.defineMode(mmode , function(config) {
436 437 return CodeMirror.multiplexingMode(
437 438 CodeMirror.patchedGetMode(config, 'text/plain'),
438 439 // always set someting on close
439 440 {open: open, close: close,
440 441 mode: CodeMirror.patchedGetMode(config, mode),
441 442 delimStyle: "delimit"
442 443 }
443 444 );
444 445 });
445 446 this.code_mirror.setOption('mode', mmode);
446 447 return;
447 448 }
448 449 }
449 450 }
450 451 // fallback on default
451 452 var default_mode
452 453 try {
453 454 default_mode = this._options.cm_config.mode;
454 455 } catch(e) {
455 456 default_mode = 'text/plain';
456 457 }
457 458 if( current_mode === default_mode){
458 459 return
459 460 }
460 461 this.code_mirror.setOption('mode', default_mode);
461 462 };
462 463
463 464 IPython.Cell = Cell;
464 465
465 466 return IPython;
466 467
467 468 }(IPython));
468 469
@@ -1,497 +1,506 b''
1 1 //----------------------------------------------------------------------------
2 2 // Copyright (C) 2008-2011 The IPython Development Team
3 3 //
4 4 // Distributed under the terms of the BSD License. The full license is in
5 5 // the file COPYING, distributed as part of this software.
6 6 //----------------------------------------------------------------------------
7 7
8 8 //============================================================================
9 9 // CodeCell
10 10 //============================================================================
11 11 /**
12 12 * An extendable module that provide base functionnality to create cell for notebook.
13 13 * @module IPython
14 14 * @namespace IPython
15 15 * @submodule CodeCell
16 16 */
17 17
18 18
19 19 /* local util for codemirror */
20 20 var posEq = function(a, b) {return a.line == b.line && a.ch == b.ch;};
21 21
22 22 /**
23 23 *
24 24 * function to delete until previous non blanking space character
25 25 * or first multiple of 4 tabstop.
26 26 * @private
27 27 */
28 28 CodeMirror.commands.delSpaceToPrevTabStop = function(cm){
29 29 var from = cm.getCursor(true), to = cm.getCursor(false), sel = !posEq(from, to);
30 30 if (!posEq(from, to)) { cm.replaceRange("", from, to); return; }
31 31 var cur = cm.getCursor(), line = cm.getLine(cur.line);
32 32 var tabsize = cm.getOption('tabSize');
33 33 var chToPrevTabStop = cur.ch-(Math.ceil(cur.ch/tabsize)-1)*tabsize;
34 34 from = {ch:cur.ch-chToPrevTabStop,line:cur.line};
35 35 var select = cm.getRange(from,cur);
36 36 if( select.match(/^\ +$/) !== null){
37 37 cm.replaceRange("",from,cur);
38 38 } else {
39 39 cm.deleteH(-1,"char");
40 40 }
41 41 };
42 42
43 43
44 44 var IPython = (function (IPython) {
45 45 "use strict";
46 46
47 47 var utils = IPython.utils;
48 48 var key = IPython.utils.keycodes;
49 49
50 50 /**
51 51 * A Cell conceived to write code.
52 52 *
53 53 * The kernel doesn't have to be set at creation time, in that case
54 54 * it will be null and set_kernel has to be called later.
55 55 * @class CodeCell
56 56 * @extends IPython.Cell
57 57 *
58 58 * @constructor
59 59 * @param {Object|null} kernel
60 60 * @param {object|undefined} [options]
61 61 * @param [options.cm_config] {object} config to pass to CodeMirror
62 62 */
63 63 var CodeCell = function (kernel, options) {
64 64 this.kernel = kernel || null;
65 65 this.collapsed = false;
66 66
67 67 // create all attributed in constructor function
68 68 // even if null for V8 VM optimisation
69 69 this.input_prompt_number = null;
70 70 this.celltoolbar = null;
71 71 this.output_area = null;
72 72 this.last_msg_id = null;
73 73 this.completer = null;
74 74
75 75
76 76 var cm_overwrite_options = {
77 77 onKeyEvent: $.proxy(this.handle_codemirror_keyevent,this)
78 78 };
79 79
80 80 options = this.mergeopt(CodeCell, options, {cm_config:cm_overwrite_options});
81 81
82 82 IPython.Cell.apply(this,[options]);
83 83
84 84 // Attributes we want to override in this subclass.
85 85 this.cell_type = "code";
86 86
87 87 var that = this;
88 88 this.element.focusout(
89 89 function() { that.auto_highlight(); }
90 90 );
91 91 };
92 92
93 93 CodeCell.options_default = {
94 94 cm_config : {
95 95 extraKeys: {
96 96 "Tab" : "indentMore",
97 97 "Shift-Tab" : "indentLess",
98 98 "Backspace" : "delSpaceToPrevTabStop",
99 99 "Cmd-/" : "toggleComment",
100 100 "Ctrl-/" : "toggleComment"
101 101 },
102 102 mode: 'ipython',
103 103 theme: 'ipython',
104 104 matchBrackets: true
105 105 }
106 106 };
107 107
108 108
109 109 CodeCell.prototype = new IPython.Cell();
110 110
111 111 /**
112 112 * @method auto_highlight
113 113 */
114 114 CodeCell.prototype.auto_highlight = function () {
115 115 this._auto_highlight(IPython.config.cell_magic_highlight);
116 116 };
117 117
118 118 /** @method create_element */
119 119 CodeCell.prototype.create_element = function () {
120 120 IPython.Cell.prototype.create_element.apply(this, arguments);
121 121
122 122 var cell = $('<div></div>').addClass('cell border-box-sizing code_cell');
123 123 cell.attr('tabindex','2');
124 124
125 125 var input = $('<div></div>').addClass('input');
126 126 var prompt = $('<div/>').addClass('prompt input_prompt');
127 127 var inner_cell = $('<div/>').addClass('inner_cell');
128 128 this.celltoolbar = new IPython.CellToolbar(this);
129 129 inner_cell.append(this.celltoolbar.element);
130 130 var input_area = $('<div/>').addClass('input_area');
131 131 this.code_mirror = CodeMirror(input_area.get(0), this.cm_config);
132 132 $(this.code_mirror.getInputField()).attr("spellcheck", "false");
133 133 inner_cell.append(input_area);
134 134 input.append(prompt).append(inner_cell);
135 135 var output = $('<div></div>');
136 136 cell.append(input).append(output);
137 137 this.element = cell;
138 138 this.output_area = new IPython.OutputArea(output, true);
139 139 this.completer = new IPython.Completer(this);
140 140 };
141 141
142 /** @method bind_events */
143 CodeCell.prototype.bind_events = function () {
144 IPython.Cell.prototype.bind_events.apply(this);
145 var that = this;
146
147 this.element.focusout(
148 function() { that.auto_highlight(); }
149 );
150 };
151
142 152 /**
143 153 * This method gets called in CodeMirror's onKeyDown/onKeyPress
144 154 * handlers and is used to provide custom key handling. Its return
145 155 * value is used to determine if CodeMirror should ignore the event:
146 156 * true = ignore, false = don't ignore.
147 157 * @method handle_codemirror_keyevent
148 158 */
149 159 CodeCell.prototype.handle_codemirror_keyevent = function (editor, event) {
150 160
151 161 var that = this;
152 162
153 163 if (this.mode === 'command') {
154 164 return false
155 165 } else if (this.mode === 'edit') {
156 166 // whatever key is pressed, first, cancel the tooltip request before
157 167 // they are sent, and remove tooltip if any, except for tab again
158 168 if (event.type === 'keydown' && event.which != key.TAB ) {
159 169 IPython.tooltip.remove_and_cancel_tooltip();
160 170 };
161 171
162 172 var cur = editor.getCursor();
163 173 if (event.keyCode === key.ENTER){
164 174 this.auto_highlight();
165 175 }
166 176
167 177 if (event.keyCode === key.ENTER && (event.shiftKey || event.ctrlKey)) {
168 178 // Always ignore shift-enter in CodeMirror as we handle it.
169 179 return true;
170 180
171 181 } else if (event.which === 40 && event.type === 'keypress' && IPython.tooltip.time_before_tooltip >= 0) {
172 182 // triger on keypress (!) otherwise inconsistent event.which depending on plateform
173 183 // browser and keyboard layout !
174 184 // Pressing '(' , request tooltip, don't forget to reappend it
175 185 // The second argument says to hide the tooltip if the docstring
176 186 // is actually empty
177 187 IPython.tooltip.pending(that, true);
178 188 } else if (event.which === key.UPARROW && event.type === 'keydown') {
179 189 // If we are not at the top, let CM handle the up arrow and
180 190 // prevent the global keydown handler from handling it.
181 191 if (!that.at_top()) {
182 192 event.stop();
183 193 return false;
184 194 } else {
185 195 return true;
186 196 };
187 197 } else if (event.which === key.ESC) {
188 198 IPython.tooltip.remove_and_cancel_tooltip(true);
189 199 return true;
190 200 } else if (event.which === key.DOWNARROW && event.type === 'keydown') {
191 201 // If we are not at the bottom, let CM handle the down arrow and
192 202 // prevent the global keydown handler from handling it.
193 203 if (!that.at_bottom()) {
194 204 event.stop();
195 205 return false;
196 206 } else {
197 207 return true;
198 208 };
199 209 } else if (event.keyCode === key.TAB && event.type == 'keydown' && event.shiftKey) {
200 210 if (editor.somethingSelected()){
201 211 var anchor = editor.getCursor("anchor");
202 212 var head = editor.getCursor("head");
203 213 if( anchor.line != head.line){
204 214 return false;
205 215 }
206 216 }
207 217 }
208 218 IPython.tooltip.request(that);
209 219 event.stop();
210 220 return true;
211 221 } else if (event.keyCode === key.TAB && event.type == 'keydown') {
212 222 // Tab completion.
213 223 IPython.tooltip.remove_and_cancel_tooltip();
214 224 if (editor.somethingSelected()) {
215 225 return false;
216 226 }
217 227 var pre_cursor = editor.getRange({line:cur.line,ch:0},cur);
218 228 if (pre_cursor.trim() === "") {
219 229 // Don't autocomplete if the part of the line before the cursor
220 230 // is empty. In this case, let CodeMirror handle indentation.
221 231 return false;
222 232 } else {
223 233 // keypress/keyup also trigger on TAB press, and we don't want to
224 234 // use those to disable tab completion.
225 235 return false;
226 236 };
227 237 return false;
228 238 }
229 239 return false;
230 240 };
231 241
232 242
233 243 // Kernel related calls.
234 244
235 245 CodeCell.prototype.set_kernel = function (kernel) {
236 246 this.kernel = kernel;
237 247 };
238 248
239 249 /**
240 250 * Execute current code cell to the kernel
241 251 * @method execute
242 252 */
243 253 CodeCell.prototype.execute = function () {
244 254 this.output_area.clear_output();
245 255 this.set_input_prompt('*');
246 256 this.element.addClass("running");
247 257 if (this.last_msg_id) {
248 258 this.kernel.clear_callbacks_for_msg(this.last_msg_id);
249 259 }
250 260 var callbacks = this.get_callbacks();
251 261
252 262 this.last_msg_id = this.kernel.execute(this.get_text(), callbacks, {silent: false, store_history: true});
253 263 };
254 264
255 265 /**
256 266 * Construct the default callbacks for
257 267 * @method get_callbacks
258 268 */
259 269 CodeCell.prototype.get_callbacks = function () {
260 270 return {
261 271 shell : {
262 272 reply : $.proxy(this._handle_execute_reply, this),
263 273 payload : {
264 274 set_next_input : $.proxy(this._handle_set_next_input, this),
265 275 page : $.proxy(this._open_with_pager, this)
266 276 }
267 277 },
268 278 iopub : {
269 279 output : $.proxy(this.output_area.handle_output, this.output_area),
270 280 clear_output : $.proxy(this.output_area.handle_clear_output, this.output_area),
271 281 },
272 282 input : $.proxy(this._handle_input_request, this)
273 283 };
274 284 };
275 285
276 286 CodeCell.prototype._open_with_pager = function (payload) {
277 287 $([IPython.events]).trigger('open_with_text.Pager', payload);
278 288 };
279 289
280 290 /**
281 291 * @method _handle_execute_reply
282 292 * @private
283 293 */
284 294 CodeCell.prototype._handle_execute_reply = function (msg) {
285 295 this.set_input_prompt(msg.content.execution_count);
286 296 this.element.removeClass("running");
287 297 $([IPython.events]).trigger('set_dirty.Notebook', {value: true});
288 298 };
289 299
290 300 /**
291 301 * @method _handle_set_next_input
292 302 * @private
293 303 */
294 304 CodeCell.prototype._handle_set_next_input = function (payload) {
295 305 var data = {'cell': this, 'text': payload.text};
296 306 $([IPython.events]).trigger('set_next_input.Notebook', data);
297 307 };
298 308
299 309 /**
300 310 * @method _handle_input_request
301 311 * @private
302 312 */
303 313 CodeCell.prototype._handle_input_request = function (msg) {
304 314 this.output_area.append_raw_input(msg);
305 315 };
306 316
307 317
308 318 // Basic cell manipulation.
309 319
310 320 CodeCell.prototype.select = function () {
311 var continue = IPython.Cell.prototype.select.apply(this);
312 if (continue) {
321 var cont = IPython.Cell.prototype.select.apply(this);
322 console.log('CodeCell.select', cont);
323 if (cont) {
313 324 this.code_mirror.refresh();
314 325 this.auto_highlight();
315 326 };
316 return continue;
327 return cont;
317 328 };
318 329
319 330 CodeCell.prototype.render = function () {
320 var continue = IPython.Cell.prototype.render.apply(this);
321 if (continue) {
322 this.execute();
323 };
324 return continue;
331 var cont = IPython.Cell.prototype.render.apply(this);
332 console.log('CodeCell.render');
333 // Always execute, even if we are already in the rendered state
334 return cont;
325 335 };
326 336
327 337 CodeCell.prototype.unrender = function () {
328 var continue = IPython.Cell.prototype.unrender.apply(this);
329 if (continue) {
330 this.clear_output(true, true, true);
331 };
332 return continue;
338 // CodeCell is always rendered
339 return false;
333 340 };
334 341
335 342 CodeCell.prototype.command_mode = function () {
336 var continue = IPython.Cell.prototype.command_mode.apply(this);
337 if (continue) {
343 var cont = IPython.Cell.prototype.command_mode.apply(this);
344 console.log('CodeCell.command_mode');
345 if (cont) {
338 346 this.focus_cell();
339 347 };
340 return continue;
348 return cont;
341 349 }
342 350
343 351 CodeCell.prototype.edit_mode = function () {
344 var continue = IPython.Cell.prototype.edit_mode.apply(this);
345 if (continue) {
352 var cont = IPython.Cell.prototype.edit_mode.apply(this);
353 console.log('CodeCell.edit_mode');
354 if (cont) {
346 355 this.focus_editor();
347 356 };
348 return continue;
357 return cont;
349 358 }
350 359
351 360 CodeCell.prototype.select_all = function () {
352 361 var start = {line: 0, ch: 0};
353 362 var nlines = this.code_mirror.lineCount();
354 363 var last_line = this.code_mirror.getLine(nlines-1);
355 364 var end = {line: nlines-1, ch: last_line.length};
356 365 this.code_mirror.setSelection(start, end);
357 366 };
358 367
359 368
360 369 CodeCell.prototype.collapse = function () {
361 370 this.collapsed = true;
362 371 this.output_area.collapse();
363 372 };
364 373
365 374
366 375 CodeCell.prototype.expand = function () {
367 376 this.collapsed = false;
368 377 this.output_area.expand();
369 378 };
370 379
371 380
372 381 CodeCell.prototype.toggle_output = function () {
373 382 this.collapsed = Boolean(1 - this.collapsed);
374 383 this.output_area.toggle_output();
375 384 };
376 385
377 386
378 387 CodeCell.prototype.toggle_output_scroll = function () {
379 388 this.output_area.toggle_scroll();
380 389 };
381 390
382 391
383 392 CodeCell.input_prompt_classical = function (prompt_value, lines_number) {
384 393 var ns = prompt_value || "&nbsp;";
385 394 return 'In&nbsp;[' + ns + ']:';
386 395 };
387 396
388 397 CodeCell.input_prompt_continuation = function (prompt_value, lines_number) {
389 398 var html = [CodeCell.input_prompt_classical(prompt_value, lines_number)];
390 399 for(var i=1; i < lines_number; i++) {
391 400 html.push(['...:']);
392 401 }
393 402 return html.join('<br/>');
394 403 };
395 404
396 405 CodeCell.input_prompt_function = CodeCell.input_prompt_classical;
397 406
398 407
399 408 CodeCell.prototype.set_input_prompt = function (number) {
400 409 var nline = 1;
401 410 if (this.code_mirror !== undefined) {
402 411 nline = this.code_mirror.lineCount();
403 412 }
404 413 this.input_prompt_number = number;
405 414 var prompt_html = CodeCell.input_prompt_function(this.input_prompt_number, nline);
406 415 this.element.find('div.input_prompt').html(prompt_html);
407 416 };
408 417
409 418
410 419 CodeCell.prototype.clear_input = function () {
411 420 this.code_mirror.setValue('');
412 421 };
413 422
414 423
415 424 CodeCell.prototype.get_text = function () {
416 425 return this.code_mirror.getValue();
417 426 };
418 427
419 428
420 429 CodeCell.prototype.set_text = function (code) {
421 430 return this.code_mirror.setValue(code);
422 431 };
423 432
424 433
425 434 CodeCell.prototype.at_top = function () {
426 435 var cursor = this.code_mirror.getCursor();
427 436 if (cursor.line === 0 && cursor.ch === 0) {
428 437 return true;
429 438 } else {
430 439 return false;
431 440 }
432 441 };
433 442
434 443
435 444 CodeCell.prototype.at_bottom = function () {
436 445 var cursor = this.code_mirror.getCursor();
437 446 if (cursor.line === (this.code_mirror.lineCount()-1) && cursor.ch === this.code_mirror.getLine(cursor.line).length) {
438 447 return true;
439 448 } else {
440 449 return false;
441 450 }
442 451 };
443 452
444 453
445 454 CodeCell.prototype.clear_output = function (wait) {
446 455 this.output_area.clear_output(wait);
447 456 };
448 457
449 458
450 459 // JSON serialization
451 460
452 461 CodeCell.prototype.fromJSON = function (data) {
453 462 IPython.Cell.prototype.fromJSON.apply(this, arguments);
454 463 if (data.cell_type === 'code') {
455 464 if (data.input !== undefined) {
456 465 this.set_text(data.input);
457 466 // make this value the starting point, so that we can only undo
458 467 // to this state, instead of a blank cell
459 468 this.code_mirror.clearHistory();
460 469 this.auto_highlight();
461 470 }
462 471 if (data.prompt_number !== undefined) {
463 472 this.set_input_prompt(data.prompt_number);
464 473 } else {
465 474 this.set_input_prompt();
466 475 }
467 476 this.output_area.fromJSON(data.outputs);
468 477 if (data.collapsed !== undefined) {
469 478 if (data.collapsed) {
470 479 this.collapse();
471 480 } else {
472 481 this.expand();
473 482 }
474 483 }
475 484 }
476 485 };
477 486
478 487
479 488 CodeCell.prototype.toJSON = function () {
480 489 var data = IPython.Cell.prototype.toJSON.apply(this);
481 490 data.input = this.get_text();
482 491 // is finite protect against undefined and '*' value
483 492 if (isFinite(this.input_prompt_number)) {
484 493 data.prompt_number = this.input_prompt_number;
485 494 }
486 495 var outputs = this.output_area.toJSON();
487 496 data.outputs = outputs;
488 497 data.language = 'python';
489 498 data.collapsed = this.collapsed;
490 499 return data;
491 500 };
492 501
493 502
494 503 IPython.CodeCell = CodeCell;
495 504
496 505 return IPython;
497 506 }(IPython));
@@ -1,2267 +1,2338 b''
1 1 //----------------------------------------------------------------------------
2 2 // Copyright (C) 2011 The IPython Development Team
3 3 //
4 4 // Distributed under the terms of the BSD License. The full license is in
5 5 // the file COPYING, distributed as part of this software.
6 6 //----------------------------------------------------------------------------
7 7
8 8 //============================================================================
9 9 // Notebook
10 10 //============================================================================
11 11
12 12 var IPython = (function (IPython) {
13 13 "use strict";
14 14
15 15 var utils = IPython.utils;
16 16 var key = IPython.utils.keycodes;
17 17
18 18 /**
19 19 * A notebook contains and manages cells.
20 20 *
21 21 * @class Notebook
22 22 * @constructor
23 23 * @param {String} selector A jQuery selector for the notebook's DOM element
24 24 * @param {Object} [options] A config object
25 25 */
26 26 var Notebook = function (selector, options) {
27 27 var options = options || {};
28 28 this._baseProjectUrl = options.baseProjectUrl;
29 29 this.notebook_path = options.notebookPath;
30 30 this.notebook_name = options.notebookName;
31 31 this.element = $(selector);
32 32 this.element.scroll();
33 33 this.element.data("notebook", this);
34 34 this.next_prompt_number = 1;
35 35 this.session = null;
36 36 this.kernel = null;
37 37 this.clipboard = null;
38 38 this.undelete_backup = null;
39 39 this.undelete_index = null;
40 40 this.undelete_below = false;
41 41 this.paste_enabled = false;
42 this.mode = 'command';
43 this.edit_index = null;
42 44 this.set_dirty(false);
43 45 this.metadata = {};
44 46 this._checkpoint_after_save = false;
45 47 this.last_checkpoint = null;
46 48 this.checkpoints = [];
47 49 this.autosave_interval = 0;
48 50 this.autosave_timer = null;
49 51 // autosave *at most* every two minutes
50 52 this.minimum_autosave_interval = 120000;
51 53 // single worksheet for now
52 54 this.worksheet_metadata = {};
53 55 this.control_key_active = false;
54 56 this.notebook_name_blacklist_re = /[\/\\:]/;
55 57 this.nbformat = 3 // Increment this when changing the nbformat
56 58 this.nbformat_minor = 0 // Increment this when changing the nbformat
57 59 this.style();
58 60 this.create_elements();
59 61 this.bind_events();
60 62 };
61 63
62 64 /**
63 65 * Tweak the notebook's CSS style.
64 66 *
65 67 * @method style
66 68 */
67 69 Notebook.prototype.style = function () {
68 70 $('div#notebook').addClass('border-box-sizing');
69 71 };
70 72
71 73 /**
72 74 * Get the root URL of the notebook server.
73 75 *
74 76 * @method baseProjectUrl
75 77 * @return {String} The base project URL
76 78 */
77 79 Notebook.prototype.baseProjectUrl = function(){
78 80 return this._baseProjectUrl || $('body').data('baseProjectUrl');
79 81 };
80 82
81 83 Notebook.prototype.notebookName = function() {
82 84 return $('body').data('notebookName');
83 85 };
84 86
85 87 Notebook.prototype.notebookPath = function() {
86 88 return $('body').data('notebookPath');
87 89 };
88 90
89 91 /**
90 92 * Create an HTML and CSS representation of the notebook.
91 93 *
92 94 * @method create_elements
93 95 */
94 96 Notebook.prototype.create_elements = function () {
95 97 // We add this end_space div to the end of the notebook div to:
96 98 // i) provide a margin between the last cell and the end of the notebook
97 99 // ii) to prevent the div from scrolling up when the last cell is being
98 100 // edited, but is too low on the page, which browsers will do automatically.
99 101 var that = this;
100 102 this.container = $("<div/>").addClass("container").attr("id", "notebook-container");
101 103 var end_space = $('<div/>').addClass('end_space');
102 104 end_space.dblclick(function (e) {
103 105 var ncells = that.ncells();
104 106 that.insert_cell_below('code',ncells-1);
105 107 });
106 108 this.element.append(this.container);
107 109 this.container.append(end_space);
108 110 $('div#notebook').addClass('border-box-sizing');
109 111 };
110 112
111 113 /**
112 114 * Bind JavaScript events: key presses and custom IPython events.
113 115 *
114 116 * @method bind_events
115 117 */
116 118 Notebook.prototype.bind_events = function () {
117 119 var that = this;
118 120
119 121 $([IPython.events]).on('set_next_input.Notebook', function (event, data) {
120 122 var index = that.find_cell_index(data.cell);
121 123 var new_cell = that.insert_cell_below('code',index);
122 124 new_cell.set_text(data.text);
123 125 that.dirty = true;
124 126 });
125 127
126 128 $([IPython.events]).on('set_dirty.Notebook', function (event, data) {
127 129 that.dirty = data.value;
128 130 });
129 131
130 132 $([IPython.events]).on('select.Cell', function (event, data) {
131 133 var index = that.find_cell_index(data.cell);
132 134 that.select(index);
133 135 });
134 136
137 $([IPython.events]).on('edit_mode.Cell', function (event, data) {
138 var index = that.find_cell_index(data.cell);
139 that.select(index);
140 that.edit_mode();
141 });
142
135 143 $([IPython.events]).on('status_autorestarting.Kernel', function () {
136 144 IPython.dialog.modal({
137 145 title: "Kernel Restarting",
138 146 body: "The kernel appears to have died. It will restart automatically.",
139 147 buttons: {
140 148 OK : {
141 149 class : "btn-primary"
142 150 }
143 151 }
144 152 });
145 153 });
146 154
147
148 155 $(document).keydown(function (event) {
149 156
150 // Save (CTRL+S) or (AppleKey+S)
151 //metaKey = applekey on mac
157 // Event handlers for both command and edit mode
152 158 if ((event.ctrlKey || event.metaKey) && event.keyCode==83) {
159 // Save (CTRL+S) or (Command+S on Mac)
153 160 that.save_checkpoint();
154 161 event.preventDefault();
155 162 return false;
156 163 } else if (event.which === key.ESC) {
157 164 // Intercept escape at highest level to avoid closing
158 165 // websocket connection with firefox
159 IPython.pager.collapse();
160 166 event.preventDefault();
167 // Don't return yet to allow edit/command modes to handle
161 168 } else if (event.which === key.SHIFT) {
162 169 // ignore shift keydown
163 170 return true;
171 } else if (event.which === key.ENTER && event.shiftKey) {
172 that.execute_selected_cell('shift');
173 return false;
174 } else if (event.which === key.ENTER && event.altKey) {
175 // Execute code cell, and insert new in place
176 that.execute_selected_cell('alt');
177 return false;
178 } else if (event.which === key.ENTER && event.ctrlKey) {
179 that.execute_selected_cell('ctrl');
180 return false;
164 181 }
165 if (event.which === key.UPARROW && !event.shiftKey) {
182
183 // Event handlers for edit mode
184 if (that.mode === 'edit') {
185 if (event.which === key.ESC) {
186 // ESC
187 that.command_mode();
188 return false;
189 } else if (event.which === 77 && event.ctrlKey) {
190 // Ctrl-m
191 that.command_mode();
192 return false;
193 } else if (event.which === key.UPARROW && !event.shiftKey) {
166 194 var cell = that.get_selected_cell();
167 195 if (cell && cell.at_top()) {
168 196 event.preventDefault();
197 that.command_mode()
169 198 that.select_prev();
199 that.edit_mode();
200 return false;
170 201 };
171 202 } else if (event.which === key.DOWNARROW && !event.shiftKey) {
172 203 var cell = that.get_selected_cell();
173 204 if (cell && cell.at_bottom()) {
174 205 event.preventDefault();
206 that.command_mode()
175 207 that.select_next();
176 };
177 } else if (event.which === key.ENTER && event.shiftKey) {
178 that.execute_selected_cell();
179 return false;
180 } else if (event.which === key.ENTER && event.altKey) {
181 // Execute code cell, and insert new in place
182 that.execute_selected_cell();
183 // Only insert a new cell, if we ended up in an already populated cell
184 if (/\S/.test(that.get_selected_cell().get_text()) == true) {
185 that.insert_cell_above('code');
186 }
208 that.edit_mode();
187 209 return false;
188 } else if (event.which === key.ENTER && event.ctrlKey) {
189 that.execute_selected_cell({terminal:true});
210 };
211 };
212 // Event handlers for command mode
213 } else if (that.mode === 'command' && !(event.ctrlKey || event.altKey)) {
214 if (event.which === key.ENTER && !(event.ctrlKey || event.altKey || event.shiftKey)) {
215 // Enter edit mode = ENTER alone
216 that.edit_mode();
217 return false
218 } else if (event.which === key.UPARROW && !event.shiftKey) {
219 var index = that.get_selected_index();
220 if (index !== 0 && index !== null) {
221 that.select_prev();
222 var cell = that.get_selected_cell();
223 cell.focus_cell();
224 };
190 225 return false;
191 } else if (event.which === 77 && event.ctrlKey && that.control_key_active == false) {
192 that.control_key_active = true;
226 } else if (event.which === key.DOWNARROW && !event.shiftKey) {
227 var index = that.get_selected_index();
228 if (index !== (that.ncells()-1) && index !== null) {
229 that.select_next();
230 var cell = that.get_selected_cell();
231 cell.focus_cell();
232 };
193 233 return false;
194 } else if (event.which === 88 && that.control_key_active) {
234 } else if (event.which === 88) {
195 235 // Cut selected cell = x
196 236 that.cut_cell();
197 that.control_key_active = false;
198 237 return false;
199 } else if (event.which === 67 && that.control_key_active) {
238 } else if (event.which === 67) {
200 239 // Copy selected cell = c
201 240 that.copy_cell();
202 that.control_key_active = false;
203 241 return false;
204 } else if (event.which === 86 && that.control_key_active) {
242 } else if (event.which === 86) {
205 243 // Paste below selected cell = v
206 244 that.paste_cell_below();
207 that.control_key_active = false;
208 245 return false;
209 } else if (event.which === 68 && that.control_key_active) {
246 } else if (event.which === 68) {
210 247 // Delete selected cell = d
211 248 that.delete_cell();
212 that.control_key_active = false;
213 249 return false;
214 } else if (event.which === 65 && that.control_key_active) {
250 } else if (event.which === 65) {
215 251 // Insert code cell above selected = a
216 252 that.insert_cell_above('code');
217 that.control_key_active = false;
253 that.select_prev();
218 254 return false;
219 } else if (event.which === 66 && that.control_key_active) {
255 } else if (event.which === 66) {
220 256 // Insert code cell below selected = b
221 257 that.insert_cell_below('code');
222 that.control_key_active = false;
258 that.select_next();
223 259 return false;
224 } else if (event.which === 89 && that.control_key_active) {
260 } else if (event.which === 89) {
225 261 // To code = y
226 262 that.to_code();
227 that.control_key_active = false;
228 263 return false;
229 } else if (event.which === 77 && that.control_key_active) {
264 } else if (event.which === 77) {
230 265 // To markdown = m
231 266 that.to_markdown();
232 that.control_key_active = false;
233 267 return false;
234 } else if (event.which === 84 && that.control_key_active) {
268 } else if (event.which === 84) {
235 269 // To Raw = t
236 270 that.to_raw();
237 that.control_key_active = false;
238 271 return false;
239 } else if (event.which === 49 && that.control_key_active) {
272 } else if (event.which === 49) {
240 273 // To Heading 1 = 1
241 274 that.to_heading(undefined, 1);
242 that.control_key_active = false;
243 275 return false;
244 } else if (event.which === 50 && that.control_key_active) {
276 } else if (event.which === 50) {
245 277 // To Heading 2 = 2
246 278 that.to_heading(undefined, 2);
247 that.control_key_active = false;
248 279 return false;
249 } else if (event.which === 51 && that.control_key_active) {
280 } else if (event.which === 51) {
250 281 // To Heading 3 = 3
251 282 that.to_heading(undefined, 3);
252 that.control_key_active = false;
253 283 return false;
254 } else if (event.which === 52 && that.control_key_active) {
284 } else if (event.which === 52) {
255 285 // To Heading 4 = 4
256 286 that.to_heading(undefined, 4);
257 that.control_key_active = false;
258 287 return false;
259 } else if (event.which === 53 && that.control_key_active) {
288 } else if (event.which === 53) {
260 289 // To Heading 5 = 5
261 290 that.to_heading(undefined, 5);
262 that.control_key_active = false;
263 291 return false;
264 } else if (event.which === 54 && that.control_key_active) {
292 } else if (event.which === 54) {
265 293 // To Heading 6 = 6
266 294 that.to_heading(undefined, 6);
267 that.control_key_active = false;
268 295 return false;
269 } else if (event.which === 79 && that.control_key_active) {
296 } else if (event.which === 79) {
270 297 // Toggle output = o
271 298 if (event.shiftKey){
272 299 that.toggle_output_scroll();
273 300 } else {
274 301 that.toggle_output();
275 }
276 that.control_key_active = false;
302 };
277 303 return false;
278 } else if (event.which === 83 && that.control_key_active) {
304 } else if (event.which === 83) {
279 305 // Save notebook = s
280 306 that.save_checkpoint();
281 307 that.control_key_active = false;
282 308 return false;
283 } else if (event.which === 74 && that.control_key_active) {
309 } else if (event.which === 74) {
284 310 // Move cell down = j
285 311 that.move_cell_down();
286 that.control_key_active = false;
287 312 return false;
288 } else if (event.which === 75 && that.control_key_active) {
313 } else if (event.which === 75) {
289 314 // Move cell up = k
290 315 that.move_cell_up();
291 that.control_key_active = false;
292 316 return false;
293 } else if (event.which === 80 && that.control_key_active) {
317 } else if (event.which === 80) {
294 318 // Select previous = p
295 319 that.select_prev();
296 that.control_key_active = false;
297 320 return false;
298 } else if (event.which === 78 && that.control_key_active) {
321 } else if (event.which === 78) {
299 322 // Select next = n
300 323 that.select_next();
301 that.control_key_active = false;
302 324 return false;
303 } else if (event.which === 76 && that.control_key_active) {
325 } else if (event.which === 76) {
304 326 // Toggle line numbers = l
305 327 that.cell_toggle_line_numbers();
306 that.control_key_active = false;
307 328 return false;
308 } else if (event.which === 73 && that.control_key_active) {
329 } else if (event.which === 73) {
309 330 // Interrupt kernel = i
310 that.session.interrupt_kernel();
311 that.control_key_active = false;
331 that.kernel.interrupt();
312 332 return false;
313 } else if (event.which === 190 && that.control_key_active) {
333 } else if (event.which === 190) {
314 334 // Restart kernel = . # matches qt console
315 335 that.restart_kernel();
316 that.control_key_active = false;
317 336 return false;
318 } else if (event.which === 72 && that.control_key_active) {
337 } else if (event.which === 72) {
319 338 // Show keyboard shortcuts = h
320 339 IPython.quick_help.show_keyboard_shortcuts();
321 that.control_key_active = false;
322 340 return false;
323 } else if (event.which === 90 && that.control_key_active) {
341 } else if (event.which === 90) {
324 342 // Undo last cell delete = z
325 343 that.undelete();
326 that.control_key_active = false;
327 return false;
328 } else if ((event.which === 189 || event.which === 173) &&
329 that.control_key_active) {
330 // how fun! '-' is 189 in Chrome, but 173 in FF and Opera
331 // Split cell = -
332 that.split_cell();
333 that.control_key_active = false;
334 344 return false;
335 } else if (that.control_key_active) {
336 that.control_key_active = false;
337 return true;
338 }
345 };
346 };
347
348 // If we havn't handled it, let someone else.
339 349 return true;
340 350 });
341 351
342 352 var collapse_time = function(time){
343 353 var app_height = $('#ipython-main-app').height(); // content height
344 354 var splitter_height = $('div#pager_splitter').outerHeight(true);
345 355 var new_height = app_height - splitter_height;
346 356 that.element.animate({height : new_height + 'px'}, time);
347 }
357 };
348 358
349 359 this.element.bind('collapse_pager', function (event,extrap) {
350 360 var time = (extrap != undefined) ? ((extrap.duration != undefined ) ? extrap.duration : 'fast') : 'fast';
351 361 collapse_time(time);
352 362 });
353 363
354 364 var expand_time = function(time) {
355 365 var app_height = $('#ipython-main-app').height(); // content height
356 366 var splitter_height = $('div#pager_splitter').outerHeight(true);
357 367 var pager_height = $('div#pager').outerHeight(true);
358 368 var new_height = app_height - pager_height - splitter_height;
359 369 that.element.animate({height : new_height + 'px'}, time);
360 }
370 };
361 371
362 372 this.element.bind('expand_pager', function (event, extrap) {
363 373 var time = (extrap != undefined) ? ((extrap.duration != undefined ) ? extrap.duration : 'fast') : 'fast';
364 374 expand_time(time);
365 375 });
366 376
367 377 // Firefox 22 broke $(window).on("beforeunload")
368 378 // I'm not sure why or how.
369 379 window.onbeforeunload = function (e) {
370 380 // TODO: Make killing the kernel configurable.
371 381 var kill_kernel = false;
372 382 if (kill_kernel) {
373 383 that.session.kill_kernel();
374 384 }
375 385 // if we are autosaving, trigger an autosave on nav-away.
376 386 // still warn, because if we don't the autosave may fail.
377 387 if (that.dirty) {
378 388 if ( that.autosave_interval ) {
379 389 // schedule autosave in a timeout
380 390 // this gives you a chance to forcefully discard changes
381 391 // by reloading the page if you *really* want to.
382 392 // the timer doesn't start until you *dismiss* the dialog.
383 393 setTimeout(function () {
384 394 if (that.dirty) {
385 395 that.save_notebook();
386 396 }
387 397 }, 1000);
388 398 return "Autosave in progress, latest changes may be lost.";
389 399 } else {
390 400 return "Unsaved changes will be lost.";
391 401 }
392 402 };
393 403 // Null is the *only* return value that will make the browser not
394 404 // pop up the "don't leave" dialog.
395 405 return null;
396 406 };
397 407 };
398 408
399 409 /**
400 410 * Set the dirty flag, and trigger the set_dirty.Notebook event
401 411 *
402 412 * @method set_dirty
403 413 */
404 414 Notebook.prototype.set_dirty = function (value) {
405 415 if (value === undefined) {
406 416 value = true;
407 417 }
408 418 if (this.dirty == value) {
409 419 return;
410 420 }
411 421 $([IPython.events]).trigger('set_dirty.Notebook', {value: value});
412 422 };
413 423
414 424 /**
415 425 * Scroll the top of the page to a given cell.
416 426 *
417 427 * @method scroll_to_cell
418 428 * @param {Number} cell_number An index of the cell to view
419 429 * @param {Number} time Animation time in milliseconds
420 430 * @return {Number} Pixel offset from the top of the container
421 431 */
422 432 Notebook.prototype.scroll_to_cell = function (cell_number, time) {
423 433 var cells = this.get_cells();
424 434 var time = time || 0;
425 435 cell_number = Math.min(cells.length-1,cell_number);
426 436 cell_number = Math.max(0 ,cell_number);
427 437 var scroll_value = cells[cell_number].element.position().top-cells[0].element.position().top ;
428 438 this.element.animate({scrollTop:scroll_value}, time);
429 439 return scroll_value;
430 440 };
431 441
432 442 /**
433 443 * Scroll to the bottom of the page.
434 444 *
435 445 * @method scroll_to_bottom
436 446 */
437 447 Notebook.prototype.scroll_to_bottom = function () {
438 448 this.element.animate({scrollTop:this.element.get(0).scrollHeight}, 0);
439 449 };
440 450
441 451 /**
442 452 * Scroll to the top of the page.
443 453 *
444 454 * @method scroll_to_top
445 455 */
446 456 Notebook.prototype.scroll_to_top = function () {
447 457 this.element.animate({scrollTop:0}, 0);
448 458 };
449 459
450 460 // Edit Notebook metadata
451 461
452 462 Notebook.prototype.edit_metadata = function () {
453 463 var that = this;
454 464 IPython.dialog.edit_metadata(this.metadata, function (md) {
455 465 that.metadata = md;
456 466 }, 'Notebook');
457 467 };
458 468
459 469 // Cell indexing, retrieval, etc.
460 470
461 471 /**
462 472 * Get all cell elements in the notebook.
463 473 *
464 474 * @method get_cell_elements
465 475 * @return {jQuery} A selector of all cell elements
466 476 */
467 477 Notebook.prototype.get_cell_elements = function () {
468 478 return this.container.children("div.cell");
469 479 };
470 480
471 481 /**
472 482 * Get a particular cell element.
473 483 *
474 484 * @method get_cell_element
475 485 * @param {Number} index An index of a cell to select
476 486 * @return {jQuery} A selector of the given cell.
477 487 */
478 488 Notebook.prototype.get_cell_element = function (index) {
479 489 var result = null;
480 490 var e = this.get_cell_elements().eq(index);
481 491 if (e.length !== 0) {
482 492 result = e;
483 493 }
484 494 return result;
485 495 };
486 496
487 497 /**
488 498 * Count the cells in this notebook.
489 499 *
490 500 * @method ncells
491 501 * @return {Number} The number of cells in this notebook
492 502 */
493 503 Notebook.prototype.ncells = function () {
494 504 return this.get_cell_elements().length;
495 505 };
496 506
497 507 /**
498 508 * Get all Cell objects in this notebook.
499 509 *
500 510 * @method get_cells
501 511 * @return {Array} This notebook's Cell objects
502 512 */
503 513 // TODO: we are often calling cells as cells()[i], which we should optimize
504 514 // to cells(i) or a new method.
505 515 Notebook.prototype.get_cells = function () {
506 516 return this.get_cell_elements().toArray().map(function (e) {
507 517 return $(e).data("cell");
508 518 });
509 519 };
510 520
511 521 /**
512 522 * Get a Cell object from this notebook.
513 523 *
514 524 * @method get_cell
515 525 * @param {Number} index An index of a cell to retrieve
516 526 * @return {Cell} A particular cell
517 527 */
518 528 Notebook.prototype.get_cell = function (index) {
519 529 var result = null;
520 530 var ce = this.get_cell_element(index);
521 531 if (ce !== null) {
522 532 result = ce.data('cell');
523 533 }
524 534 return result;
525 535 }
526 536
527 537 /**
528 538 * Get the cell below a given cell.
529 539 *
530 540 * @method get_next_cell
531 541 * @param {Cell} cell The provided cell
532 542 * @return {Cell} The next cell
533 543 */
534 544 Notebook.prototype.get_next_cell = function (cell) {
535 545 var result = null;
536 546 var index = this.find_cell_index(cell);
537 547 if (this.is_valid_cell_index(index+1)) {
538 548 result = this.get_cell(index+1);
539 549 }
540 550 return result;
541 551 }
542 552
543 553 /**
544 554 * Get the cell above a given cell.
545 555 *
546 556 * @method get_prev_cell
547 557 * @param {Cell} cell The provided cell
548 558 * @return {Cell} The previous cell
549 559 */
550 560 Notebook.prototype.get_prev_cell = function (cell) {
551 561 // TODO: off-by-one
552 562 // nb.get_prev_cell(nb.get_cell(1)) is null
553 563 var result = null;
554 564 var index = this.find_cell_index(cell);
555 565 if (index !== null && index > 1) {
556 566 result = this.get_cell(index-1);
557 567 }
558 568 return result;
559 569 }
560 570
561 571 /**
562 572 * Get the numeric index of a given cell.
563 573 *
564 574 * @method find_cell_index
565 575 * @param {Cell} cell The provided cell
566 576 * @return {Number} The cell's numeric index
567 577 */
568 578 Notebook.prototype.find_cell_index = function (cell) {
569 579 var result = null;
570 580 this.get_cell_elements().filter(function (index) {
571 581 if ($(this).data("cell") === cell) {
572 582 result = index;
573 583 };
574 584 });
575 585 return result;
576 586 };
577 587
578 588 /**
579 589 * Get a given index , or the selected index if none is provided.
580 590 *
581 591 * @method index_or_selected
582 592 * @param {Number} index A cell's index
583 593 * @return {Number} The given index, or selected index if none is provided.
584 594 */
585 595 Notebook.prototype.index_or_selected = function (index) {
586 596 var i;
587 597 if (index === undefined || index === null) {
588 598 i = this.get_selected_index();
589 599 if (i === null) {
590 600 i = 0;
591 601 }
592 602 } else {
593 603 i = index;
594 604 }
595 605 return i;
596 606 };
597 607
598 608 /**
599 609 * Get the currently selected cell.
600 610 * @method get_selected_cell
601 611 * @return {Cell} The selected cell
602 612 */
603 613 Notebook.prototype.get_selected_cell = function () {
604 614 var index = this.get_selected_index();
605 615 return this.get_cell(index);
606 616 };
607 617
608 618 /**
609 619 * Check whether a cell index is valid.
610 620 *
611 621 * @method is_valid_cell_index
612 622 * @param {Number} index A cell index
613 623 * @return True if the index is valid, false otherwise
614 624 */
615 625 Notebook.prototype.is_valid_cell_index = function (index) {
616 626 if (index !== null && index >= 0 && index < this.ncells()) {
617 627 return true;
618 628 } else {
619 629 return false;
620 630 };
621 631 }
622 632
623 633 /**
624 634 * Get the index of the currently selected cell.
625 635
626 636 * @method get_selected_index
627 637 * @return {Number} The selected cell's numeric index
628 638 */
629 639 Notebook.prototype.get_selected_index = function () {
630 640 var result = null;
631 641 this.get_cell_elements().filter(function (index) {
632 642 if ($(this).data("cell").selected === true) {
633 643 result = index;
634 644 };
635 645 });
636 646 return result;
637 647 };
638 648
639 649
640 650 // Cell selection.
641 651
642 652 /**
643 653 * Programmatically select a cell.
644 654 *
645 655 * @method select
646 656 * @param {Number} index A cell's index
647 657 * @return {Notebook} This notebook
648 658 */
649 659 Notebook.prototype.select = function (index) {
650 660 if (this.is_valid_cell_index(index)) {
651 661 var sindex = this.get_selected_index()
652 662 if (sindex !== null && index !== sindex) {
653 663 this.get_cell(sindex).unselect();
654 664 };
655 665 var cell = this.get_cell(index);
666 console.log('Notebook.select', index);
656 667 cell.select();
657 668 if (cell.cell_type === 'heading') {
658 669 $([IPython.events]).trigger('selected_cell_type_changed.Notebook',
659 670 {'cell_type':cell.cell_type,level:cell.level}
660 671 );
661 672 } else {
662 673 $([IPython.events]).trigger('selected_cell_type_changed.Notebook',
663 674 {'cell_type':cell.cell_type}
664 675 );
665 676 };
666 677 };
667 678 return this;
668 679 };
669 680
670 681 /**
671 682 * Programmatically select the next cell.
672 683 *
673 684 * @method select_next
674 685 * @return {Notebook} This notebook
675 686 */
676 687 Notebook.prototype.select_next = function () {
677 688 var index = this.get_selected_index();
678 689 this.select(index+1);
679 690 return this;
680 691 };
681 692
682 693 /**
683 694 * Programmatically select the previous cell.
684 695 *
685 696 * @method select_prev
686 697 * @return {Notebook} This notebook
687 698 */
688 699 Notebook.prototype.select_prev = function () {
689 700 var index = this.get_selected_index();
690 701 this.select(index-1);
691 702 return this;
692 703 };
693 704
694 705
706 // Edit/Command mode
707
708 /**
709 * Enter command mode for the currently selected cell
710 *
711 * @method command_mode
712 */
713 Notebook.prototype.command_mode = function () {
714 console.log('Notebook.command_mode', this.mode, this.edit_index);
715 if (this.mode !== 'command') {
716 var cell = this.get_cell(this.edit_index);
717 if (cell) {
718 cell.command_mode();
719 this.mode = 'command';
720 this.edit_index = null;
721 };
722 };
723 };
724
725 /**
726 * Enter edit mode for the currently selected cell
727 *
728 * @method editmode
729 */
730 Notebook.prototype.edit_mode = function () {
731 var index = this.get_selected_index();
732 console.log('Notebook.edit_mode', this.mode, index);
733 if (index !== this.edit_index) {
734 if (this.edit_index !== null) {
735 var old_cell = this.get_cell(this.edit_index)
736 old_cell.command_mode();
737 }
738 var cell = this.get_cell(index);
739 if (cell) {
740 cell.edit_mode();
741 this.mode = 'edit';
742 this.edit_index = index;
743 };
744 };
745 };
746
747
695 748 // Cell movement
696 749
697 750 /**
698 751 * Move given (or selected) cell up and select it.
699 752 *
700 753 * @method move_cell_up
701 754 * @param [index] {integer} cell index
702 755 * @return {Notebook} This notebook
703 756 **/
704 757 Notebook.prototype.move_cell_up = function (index) {
705 758 var i = this.index_or_selected(index);
706 759 if (this.is_valid_cell_index(i) && i > 0) {
707 760 var pivot = this.get_cell_element(i-1);
708 761 var tomove = this.get_cell_element(i);
709 762 if (pivot !== null && tomove !== null) {
710 763 tomove.detach();
711 764 pivot.before(tomove);
712 765 this.select(i-1);
713 766 };
714 767 this.set_dirty(true);
715 768 };
716 769 return this;
717 770 };
718 771
719 772
720 773 /**
721 774 * Move given (or selected) cell down and select it
722 775 *
723 776 * @method move_cell_down
724 777 * @param [index] {integer} cell index
725 778 * @return {Notebook} This notebook
726 779 **/
727 780 Notebook.prototype.move_cell_down = function (index) {
728 781 var i = this.index_or_selected(index);
729 782 if ( this.is_valid_cell_index(i) && this.is_valid_cell_index(i+1)) {
730 783 var pivot = this.get_cell_element(i+1);
731 784 var tomove = this.get_cell_element(i);
732 785 if (pivot !== null && tomove !== null) {
733 786 tomove.detach();
734 787 pivot.after(tomove);
735 788 this.select(i+1);
736 789 };
737 790 };
738 791 this.set_dirty();
739 792 return this;
740 793 };
741 794
742 795
743 796 // Insertion, deletion.
744 797
745 798 /**
746 799 * Delete a cell from the notebook.
747 800 *
748 801 * @method delete_cell
749 802 * @param [index] A cell's numeric index
750 803 * @return {Notebook} This notebook
751 804 */
752 805 Notebook.prototype.delete_cell = function (index) {
753 806 var i = this.index_or_selected(index);
754 807 var cell = this.get_selected_cell();
755 808 this.undelete_backup = cell.toJSON();
756 809 $('#undelete_cell').removeClass('disabled');
757 810 if (this.is_valid_cell_index(i)) {
758 811 var ce = this.get_cell_element(i);
759 812 ce.remove();
760 813 if (i === (this.ncells())) {
761 814 this.select(i-1);
762 815 this.undelete_index = i - 1;
763 816 this.undelete_below = true;
764 817 } else {
765 818 this.select(i);
766 819 this.undelete_index = i;
767 820 this.undelete_below = false;
768 821 };
769 822 $([IPython.events]).trigger('delete.Cell', {'cell': cell, 'index': i});
770 823 this.set_dirty(true);
771 824 };
772 825 return this;
773 826 };
774 827
775 828 /**
776 829 * Insert a cell so that after insertion the cell is at given index.
777 830 *
778 831 * Similar to insert_above, but index parameter is mandatory
779 832 *
780 833 * Index will be brought back into the accissible range [0,n]
781 834 *
782 835 * @method insert_cell_at_index
783 836 * @param type {string} in ['code','markdown','heading']
784 837 * @param [index] {int} a valid index where to inser cell
785 838 *
786 839 * @return cell {cell|null} created cell or null
787 840 **/
788 841 Notebook.prototype.insert_cell_at_index = function(type, index){
789 842
790 843 var ncells = this.ncells();
791 844 var index = Math.min(index,ncells);
792 845 index = Math.max(index,0);
793 846 var cell = null;
794 847
795 848 if (ncells === 0 || this.is_valid_cell_index(index) || index === ncells) {
796 849 if (type === 'code') {
797 850 cell = new IPython.CodeCell(this.kernel);
798 851 cell.set_input_prompt();
799 852 } else if (type === 'markdown') {
800 853 cell = new IPython.MarkdownCell();
801 854 } else if (type === 'raw') {
802 855 cell = new IPython.RawCell();
803 856 } else if (type === 'heading') {
804 857 cell = new IPython.HeadingCell();
805 858 }
806 859
807 860 if(this._insert_element_at_index(cell.element,index)){
808 861 cell.render();
809 this.select(this.find_cell_index(cell));
810 862 $([IPython.events]).trigger('create.Cell', {'cell': cell, 'index': index});
863 cell.refresh();
864 // TODO: should we really get rid of this?
865 //this.select(this.find_cell_index(cell));
811 866 this.set_dirty(true);
812 867 }
813 868 }
814 869 return cell;
815 870
816 871 };
817 872
818 873 /**
819 874 * Insert an element at given cell index.
820 875 *
821 876 * @method _insert_element_at_index
822 877 * @param element {dom element} a cell element
823 878 * @param [index] {int} a valid index where to inser cell
824 879 * @private
825 880 *
826 881 * return true if everything whent fine.
827 882 **/
828 883 Notebook.prototype._insert_element_at_index = function(element, index){
829 884 if (element === undefined){
830 885 return false;
831 886 }
832 887
833 888 var ncells = this.ncells();
834 889
835 890 if (ncells === 0) {
836 891 // special case append if empty
837 892 this.element.find('div.end_space').before(element);
838 893 } else if ( ncells === index ) {
839 894 // special case append it the end, but not empty
840 895 this.get_cell_element(index-1).after(element);
841 896 } else if (this.is_valid_cell_index(index)) {
842 897 // otherwise always somewhere to append to
843 898 this.get_cell_element(index).before(element);
844 899 } else {
845 900 return false;
846 901 }
847 902
848 903 if (this.undelete_index !== null && index <= this.undelete_index) {
849 904 this.undelete_index = this.undelete_index + 1;
850 905 this.set_dirty(true);
851 906 }
852 907 return true;
853 908 };
854 909
855 910 /**
856 911 * Insert a cell of given type above given index, or at top
857 912 * of notebook if index smaller than 0.
858 913 *
859 914 * default index value is the one of currently selected cell
860 915 *
861 916 * @method insert_cell_above
862 917 * @param type {string} cell type
863 918 * @param [index] {integer}
864 919 *
865 920 * @return handle to created cell or null
866 921 **/
867 922 Notebook.prototype.insert_cell_above = function (type, index) {
868 923 index = this.index_or_selected(index);
869 924 return this.insert_cell_at_index(type, index);
870 925 };
871 926
872 927 /**
873 928 * Insert a cell of given type below given index, or at bottom
874 929 * of notebook if index greater thatn number of cell
875 930 *
876 931 * default index value is the one of currently selected cell
877 932 *
878 933 * @method insert_cell_below
879 934 * @param type {string} cell type
880 935 * @param [index] {integer}
881 936 *
882 937 * @return handle to created cell or null
883 938 *
884 939 **/
885 940 Notebook.prototype.insert_cell_below = function (type, index) {
886 941 index = this.index_or_selected(index);
887 942 return this.insert_cell_at_index(type, index+1);
888 943 };
889 944
890 945
891 946 /**
892 947 * Insert cell at end of notebook
893 948 *
894 949 * @method insert_cell_at_bottom
895 950 * @param {String} type cell type
896 951 *
897 952 * @return the added cell; or null
898 953 **/
899 954 Notebook.prototype.insert_cell_at_bottom = function (type){
900 955 var len = this.ncells();
901 956 return this.insert_cell_below(type,len-1);
902 957 };
903 958
904 959 /**
905 960 * Turn a cell into a code cell.
906 961 *
907 962 * @method to_code
908 963 * @param {Number} [index] A cell's index
909 964 */
910 965 Notebook.prototype.to_code = function (index) {
911 966 var i = this.index_or_selected(index);
912 967 if (this.is_valid_cell_index(i)) {
913 968 var source_element = this.get_cell_element(i);
914 969 var source_cell = source_element.data("cell");
915 970 if (!(source_cell instanceof IPython.CodeCell)) {
916 971 var target_cell = this.insert_cell_below('code',i);
917 972 var text = source_cell.get_text();
918 973 if (text === source_cell.placeholder) {
919 974 text = '';
920 975 }
921 976 target_cell.set_text(text);
922 977 // make this value the starting point, so that we can only undo
923 978 // to this state, instead of a blank cell
924 979 target_cell.code_mirror.clearHistory();
925 980 source_element.remove();
926 981 this.set_dirty(true);
927 982 };
928 983 };
929 984 };
930 985
931 986 /**
932 987 * Turn a cell into a Markdown cell.
933 988 *
934 989 * @method to_markdown
935 990 * @param {Number} [index] A cell's index
936 991 */
937 992 Notebook.prototype.to_markdown = function (index) {
938 993 var i = this.index_or_selected(index);
939 994 if (this.is_valid_cell_index(i)) {
940 995 var source_element = this.get_cell_element(i);
941 996 var source_cell = source_element.data("cell");
942 997 if (!(source_cell instanceof IPython.MarkdownCell)) {
943 998 var target_cell = this.insert_cell_below('markdown',i);
944 999 var text = source_cell.get_text();
945 1000 if (text === source_cell.placeholder) {
946 1001 text = '';
947 1002 };
948 1003 // The edit must come before the set_text.
949 1004 target_cell.unrender();
950 1005 target_cell.set_text(text);
951 1006 // make this value the starting point, so that we can only undo
952 1007 // to this state, instead of a blank cell
953 1008 target_cell.code_mirror.clearHistory();
954 1009 source_element.remove();
1010 this.select(i);
1011 this.edit_mode();
955 1012 this.set_dirty(true);
956 1013 };
957 1014 };
958 1015 };
959 1016
960 1017 /**
961 1018 * Turn a cell into a raw text cell.
962 1019 *
963 1020 * @method to_raw
964 1021 * @param {Number} [index] A cell's index
965 1022 */
966 1023 Notebook.prototype.to_raw = function (index) {
967 1024 var i = this.index_or_selected(index);
968 1025 if (this.is_valid_cell_index(i)) {
969 1026 var source_element = this.get_cell_element(i);
970 1027 var source_cell = source_element.data("cell");
971 1028 var target_cell = null;
972 1029 if (!(source_cell instanceof IPython.RawCell)) {
973 1030 target_cell = this.insert_cell_below('raw',i);
974 1031 var text = source_cell.get_text();
975 1032 if (text === source_cell.placeholder) {
976 1033 text = '';
977 1034 };
978 1035 // The edit must come before the set_text.
979 1036 target_cell.unrender();
980 1037 target_cell.set_text(text);
981 1038 // make this value the starting point, so that we can only undo
982 1039 // to this state, instead of a blank cell
983 1040 target_cell.code_mirror.clearHistory();
984 1041 source_element.remove();
985 1042 this.set_dirty(true);
986 1043 };
987 1044 };
988 1045 };
989 1046
990 1047 /**
991 1048 * Turn a cell into a heading cell.
992 1049 *
993 1050 * @method to_heading
994 1051 * @param {Number} [index] A cell's index
995 1052 * @param {Number} [level] A heading level (e.g., 1 becomes &lt;h1&gt;)
996 1053 */
997 1054 Notebook.prototype.to_heading = function (index, level) {
998 1055 level = level || 1;
999 1056 var i = this.index_or_selected(index);
1000 1057 if (this.is_valid_cell_index(i)) {
1001 1058 var source_element = this.get_cell_element(i);
1002 1059 var source_cell = source_element.data("cell");
1003 1060 var target_cell = null;
1004 1061 if (source_cell instanceof IPython.HeadingCell) {
1005 1062 source_cell.set_level(level);
1006 1063 } else {
1007 1064 target_cell = this.insert_cell_below('heading',i);
1008 1065 var text = source_cell.get_text();
1009 1066 if (text === source_cell.placeholder) {
1010 1067 text = '';
1011 1068 };
1012 1069 // The edit must come before the set_text.
1013 1070 target_cell.set_level(level);
1014 1071 target_cell.unrender();
1015 1072 target_cell.set_text(text);
1016 1073 // make this value the starting point, so that we can only undo
1017 1074 // to this state, instead of a blank cell
1018 1075 target_cell.code_mirror.clearHistory();
1019 1076 source_element.remove();
1020 1077 this.set_dirty(true);
1021 1078 };
1022 1079 $([IPython.events]).trigger('selected_cell_type_changed.Notebook',
1023 1080 {'cell_type':'heading',level:level}
1024 1081 );
1025 1082 };
1026 1083 };
1027 1084
1028 1085
1029 1086 // Cut/Copy/Paste
1030 1087
1031 1088 /**
1032 1089 * Enable UI elements for pasting cells.
1033 1090 *
1034 1091 * @method enable_paste
1035 1092 */
1036 1093 Notebook.prototype.enable_paste = function () {
1037 1094 var that = this;
1038 1095 if (!this.paste_enabled) {
1039 1096 $('#paste_cell_replace').removeClass('disabled')
1040 1097 .on('click', function () {that.paste_cell_replace();});
1041 1098 $('#paste_cell_above').removeClass('disabled')
1042 1099 .on('click', function () {that.paste_cell_above();});
1043 1100 $('#paste_cell_below').removeClass('disabled')
1044 1101 .on('click', function () {that.paste_cell_below();});
1045 1102 this.paste_enabled = true;
1046 1103 };
1047 1104 };
1048 1105
1049 1106 /**
1050 1107 * Disable UI elements for pasting cells.
1051 1108 *
1052 1109 * @method disable_paste
1053 1110 */
1054 1111 Notebook.prototype.disable_paste = function () {
1055 1112 if (this.paste_enabled) {
1056 1113 $('#paste_cell_replace').addClass('disabled').off('click');
1057 1114 $('#paste_cell_above').addClass('disabled').off('click');
1058 1115 $('#paste_cell_below').addClass('disabled').off('click');
1059 1116 this.paste_enabled = false;
1060 1117 };
1061 1118 };
1062 1119
1063 1120 /**
1064 1121 * Cut a cell.
1065 1122 *
1066 1123 * @method cut_cell
1067 1124 */
1068 1125 Notebook.prototype.cut_cell = function () {
1069 1126 this.copy_cell();
1070 1127 this.delete_cell();
1071 1128 }
1072 1129
1073 1130 /**
1074 1131 * Copy a cell.
1075 1132 *
1076 1133 * @method copy_cell
1077 1134 */
1078 1135 Notebook.prototype.copy_cell = function () {
1079 1136 var cell = this.get_selected_cell();
1080 1137 this.clipboard = cell.toJSON();
1081 1138 this.enable_paste();
1082 1139 };
1083 1140
1084 1141 /**
1085 1142 * Replace the selected cell with a cell in the clipboard.
1086 1143 *
1087 1144 * @method paste_cell_replace
1088 1145 */
1089 1146 Notebook.prototype.paste_cell_replace = function () {
1090 1147 if (this.clipboard !== null && this.paste_enabled) {
1091 1148 var cell_data = this.clipboard;
1092 1149 var new_cell = this.insert_cell_above(cell_data.cell_type);
1093 1150 new_cell.fromJSON(cell_data);
1094 1151 var old_cell = this.get_next_cell(new_cell);
1095 1152 this.delete_cell(this.find_cell_index(old_cell));
1096 1153 this.select(this.find_cell_index(new_cell));
1097 1154 };
1098 1155 };
1099 1156
1100 1157 /**
1101 1158 * Paste a cell from the clipboard above the selected cell.
1102 1159 *
1103 1160 * @method paste_cell_above
1104 1161 */
1105 1162 Notebook.prototype.paste_cell_above = function () {
1106 1163 if (this.clipboard !== null && this.paste_enabled) {
1107 1164 var cell_data = this.clipboard;
1108 1165 var new_cell = this.insert_cell_above(cell_data.cell_type);
1109 1166 new_cell.fromJSON(cell_data);
1110 1167 };
1111 1168 };
1112 1169
1113 1170 /**
1114 1171 * Paste a cell from the clipboard below the selected cell.
1115 1172 *
1116 1173 * @method paste_cell_below
1117 1174 */
1118 1175 Notebook.prototype.paste_cell_below = function () {
1119 1176 if (this.clipboard !== null && this.paste_enabled) {
1120 1177 var cell_data = this.clipboard;
1121 1178 var new_cell = this.insert_cell_below(cell_data.cell_type);
1122 1179 new_cell.fromJSON(cell_data);
1123 1180 };
1124 1181 };
1125 1182
1126 1183 // Cell undelete
1127 1184
1128 1185 /**
1129 1186 * Restore the most recently deleted cell.
1130 1187 *
1131 1188 * @method undelete
1132 1189 */
1133 1190 Notebook.prototype.undelete = function() {
1134 1191 if (this.undelete_backup !== null && this.undelete_index !== null) {
1135 1192 var current_index = this.get_selected_index();
1136 1193 if (this.undelete_index < current_index) {
1137 1194 current_index = current_index + 1;
1138 1195 }
1139 1196 if (this.undelete_index >= this.ncells()) {
1140 1197 this.select(this.ncells() - 1);
1141 1198 }
1142 1199 else {
1143 1200 this.select(this.undelete_index);
1144 1201 }
1145 1202 var cell_data = this.undelete_backup;
1146 1203 var new_cell = null;
1147 1204 if (this.undelete_below) {
1148 1205 new_cell = this.insert_cell_below(cell_data.cell_type);
1149 1206 } else {
1150 1207 new_cell = this.insert_cell_above(cell_data.cell_type);
1151 1208 }
1152 1209 new_cell.fromJSON(cell_data);
1153 1210 this.select(current_index);
1154 1211 this.undelete_backup = null;
1155 1212 this.undelete_index = null;
1156 1213 }
1157 1214 $('#undelete_cell').addClass('disabled');
1158 1215 }
1159 1216
1160 1217 // Split/merge
1161 1218
1162 1219 /**
1163 1220 * Split the selected cell into two, at the cursor.
1164 1221 *
1165 1222 * @method split_cell
1166 1223 */
1167 1224 Notebook.prototype.split_cell = function () {
1168 1225 // Todo: implement spliting for other cell types.
1169 1226 var cell = this.get_selected_cell();
1170 1227 if (cell.is_splittable()) {
1171 1228 var texta = cell.get_pre_cursor();
1172 1229 var textb = cell.get_post_cursor();
1173 1230 if (cell instanceof IPython.CodeCell) {
1174 1231 cell.set_text(textb);
1175 1232 var new_cell = this.insert_cell_above('code');
1176 1233 new_cell.set_text(texta);
1177 1234 this.select_next();
1178 1235 } else if (cell instanceof IPython.MarkdownCell) {
1179 1236 cell.set_text(textb);
1180 1237 cell.render();
1181 1238 var new_cell = this.insert_cell_above('markdown');
1182 1239 new_cell.unrender(); // editor must be visible to call set_text
1183 1240 new_cell.set_text(texta);
1184 1241 new_cell.render();
1185 1242 this.select_next();
1186 1243 }
1187 1244 };
1188 1245 };
1189 1246
1190 1247 /**
1191 1248 * Combine the selected cell into the cell above it.
1192 1249 *
1193 1250 * @method merge_cell_above
1194 1251 */
1195 1252 Notebook.prototype.merge_cell_above = function () {
1196 1253 var index = this.get_selected_index();
1197 1254 var cell = this.get_cell(index);
1198 1255 if (!cell.is_mergeable()) {
1199 1256 return;
1200 1257 }
1201 1258 if (index > 0) {
1202 1259 var upper_cell = this.get_cell(index-1);
1203 1260 if (!upper_cell.is_mergeable()) {
1204 1261 return;
1205 1262 }
1206 1263 var upper_text = upper_cell.get_text();
1207 1264 var text = cell.get_text();
1208 1265 if (cell instanceof IPython.CodeCell) {
1209 1266 cell.set_text(upper_text+'\n'+text);
1210 1267 } else if (cell instanceof IPython.MarkdownCell) {
1211 1268 cell.unrender();
1212 1269 cell.set_text(upper_text+'\n'+text);
1213 1270 cell.render();
1214 1271 };
1215 1272 this.delete_cell(index-1);
1216 1273 this.select(this.find_cell_index(cell));
1217 1274 };
1218 1275 };
1219 1276
1220 1277 /**
1221 1278 * Combine the selected cell into the cell below it.
1222 1279 *
1223 1280 * @method merge_cell_below
1224 1281 */
1225 1282 Notebook.prototype.merge_cell_below = function () {
1226 1283 var index = this.get_selected_index();
1227 1284 var cell = this.get_cell(index);
1228 1285 if (!cell.is_mergeable()) {
1229 1286 return;
1230 1287 }
1231 1288 if (index < this.ncells()-1) {
1232 1289 var lower_cell = this.get_cell(index+1);
1233 1290 if (!lower_cell.is_mergeable()) {
1234 1291 return;
1235 1292 }
1236 1293 var lower_text = lower_cell.get_text();
1237 1294 var text = cell.get_text();
1238 1295 if (cell instanceof IPython.CodeCell) {
1239 1296 cell.set_text(text+'\n'+lower_text);
1240 1297 } else if (cell instanceof IPython.MarkdownCell) {
1241 1298 cell.unrender();
1242 1299 cell.set_text(text+'\n'+lower_text);
1243 1300 cell.render();
1244 1301 };
1245 1302 this.delete_cell(index+1);
1246 1303 this.select(this.find_cell_index(cell));
1247 1304 };
1248 1305 };
1249 1306
1250 1307
1251 1308 // Cell collapsing and output clearing
1252 1309
1253 1310 /**
1254 1311 * Hide a cell's output.
1255 1312 *
1256 1313 * @method collapse
1257 1314 * @param {Number} index A cell's numeric index
1258 1315 */
1259 1316 Notebook.prototype.collapse = function (index) {
1260 1317 var i = this.index_or_selected(index);
1261 1318 this.get_cell(i).collapse();
1262 1319 this.set_dirty(true);
1263 1320 };
1264 1321
1265 1322 /**
1266 1323 * Show a cell's output.
1267 1324 *
1268 1325 * @method expand
1269 1326 * @param {Number} index A cell's numeric index
1270 1327 */
1271 1328 Notebook.prototype.expand = function (index) {
1272 1329 var i = this.index_or_selected(index);
1273 1330 this.get_cell(i).expand();
1274 1331 this.set_dirty(true);
1275 1332 };
1276 1333
1277 1334 /** Toggle whether a cell's output is collapsed or expanded.
1278 1335 *
1279 1336 * @method toggle_output
1280 1337 * @param {Number} index A cell's numeric index
1281 1338 */
1282 1339 Notebook.prototype.toggle_output = function (index) {
1283 1340 var i = this.index_or_selected(index);
1284 1341 this.get_cell(i).toggle_output();
1285 1342 this.set_dirty(true);
1286 1343 };
1287 1344
1288 1345 /**
1289 1346 * Toggle a scrollbar for long cell outputs.
1290 1347 *
1291 1348 * @method toggle_output_scroll
1292 1349 * @param {Number} index A cell's numeric index
1293 1350 */
1294 1351 Notebook.prototype.toggle_output_scroll = function (index) {
1295 1352 var i = this.index_or_selected(index);
1296 1353 this.get_cell(i).toggle_output_scroll();
1297 1354 };
1298 1355
1299 1356 /**
1300 1357 * Hide each code cell's output area.
1301 1358 *
1302 1359 * @method collapse_all_output
1303 1360 */
1304 1361 Notebook.prototype.collapse_all_output = function () {
1305 1362 var ncells = this.ncells();
1306 1363 var cells = this.get_cells();
1307 1364 for (var i=0; i<ncells; i++) {
1308 1365 if (cells[i] instanceof IPython.CodeCell) {
1309 1366 cells[i].output_area.collapse();
1310 1367 }
1311 1368 };
1312 1369 // this should not be set if the `collapse` key is removed from nbformat
1313 1370 this.set_dirty(true);
1314 1371 };
1315 1372
1316 1373 /**
1317 1374 * Expand each code cell's output area, and add a scrollbar for long output.
1318 1375 *
1319 1376 * @method scroll_all_output
1320 1377 */
1321 1378 Notebook.prototype.scroll_all_output = function () {
1322 1379 var ncells = this.ncells();
1323 1380 var cells = this.get_cells();
1324 1381 for (var i=0; i<ncells; i++) {
1325 1382 if (cells[i] instanceof IPython.CodeCell) {
1326 1383 cells[i].output_area.expand();
1327 1384 cells[i].output_area.scroll_if_long();
1328 1385 }
1329 1386 };
1330 1387 // this should not be set if the `collapse` key is removed from nbformat
1331 1388 this.set_dirty(true);
1332 1389 };
1333 1390
1334 1391 /**
1335 1392 * Expand each code cell's output area, and remove scrollbars.
1336 1393 *
1337 1394 * @method expand_all_output
1338 1395 */
1339 1396 Notebook.prototype.expand_all_output = function () {
1340 1397 var ncells = this.ncells();
1341 1398 var cells = this.get_cells();
1342 1399 for (var i=0; i<ncells; i++) {
1343 1400 if (cells[i] instanceof IPython.CodeCell) {
1344 1401 cells[i].output_area.expand();
1345 1402 cells[i].output_area.unscroll_area();
1346 1403 }
1347 1404 };
1348 1405 // this should not be set if the `collapse` key is removed from nbformat
1349 1406 this.set_dirty(true);
1350 1407 };
1351 1408
1352 1409 /**
1353 1410 * Clear each code cell's output area.
1354 1411 *
1355 1412 * @method clear_all_output
1356 1413 */
1357 1414 Notebook.prototype.clear_all_output = function () {
1358 1415 var ncells = this.ncells();
1359 1416 var cells = this.get_cells();
1360 1417 for (var i=0; i<ncells; i++) {
1361 1418 if (cells[i] instanceof IPython.CodeCell) {
1362 1419 cells[i].clear_output();
1363 1420 // Make all In[] prompts blank, as well
1364 1421 // TODO: make this configurable (via checkbox?)
1365 1422 cells[i].set_input_prompt();
1366 1423 }
1367 1424 };
1368 1425 this.set_dirty(true);
1369 1426 };
1370 1427
1371 1428
1372 1429 // Other cell functions: line numbers, ...
1373 1430
1374 1431 /**
1375 1432 * Toggle line numbers in the selected cell's input area.
1376 1433 *
1377 1434 * @method cell_toggle_line_numbers
1378 1435 */
1379 1436 Notebook.prototype.cell_toggle_line_numbers = function() {
1380 1437 this.get_selected_cell().toggle_line_numbers();
1381 1438 };
1382 1439
1383 1440 // Session related things
1384 1441
1385 1442 /**
1386 1443 * Start a new session and set it on each code cell.
1387 1444 *
1388 1445 * @method start_session
1389 1446 */
1390 1447 Notebook.prototype.start_session = function () {
1391 1448 this.session = new IPython.Session(this.notebook_name, this.notebook_path, this);
1392 1449 this.session.start($.proxy(this._session_started, this));
1393 1450 };
1394 1451
1395 1452
1396 1453 /**
1397 1454 * Once a session is started, link the code cells to the kernel
1398 1455 *
1399 1456 */
1400 1457 Notebook.prototype._session_started = function(){
1401 1458 this.kernel = this.session.kernel;
1402 1459 var ncells = this.ncells();
1403 1460 for (var i=0; i<ncells; i++) {
1404 1461 var cell = this.get_cell(i);
1405 1462 if (cell instanceof IPython.CodeCell) {
1406 1463 cell.set_kernel(this.session.kernel);
1407 1464 };
1408 1465 };
1409 1466 };
1410 1467
1411 1468 /**
1412 1469 * Prompt the user to restart the IPython kernel.
1413 1470 *
1414 1471 * @method restart_kernel
1415 1472 */
1416 1473 Notebook.prototype.restart_kernel = function () {
1417 1474 var that = this;
1418 1475 IPython.dialog.modal({
1419 1476 title : "Restart kernel or continue running?",
1420 1477 body : $("<p/>").html(
1421 1478 'Do you want to restart the current kernel? You will lose all variables defined in it.'
1422 1479 ),
1423 1480 buttons : {
1424 1481 "Continue running" : {},
1425 1482 "Restart" : {
1426 1483 "class" : "btn-danger",
1427 1484 "click" : function() {
1428 1485 that.session.restart_kernel();
1429 1486 }
1430 1487 }
1431 1488 }
1432 1489 });
1433 1490 };
1434 1491
1435 1492 /**
1436 1493 * Run the selected cell.
1437 1494 *
1438 1495 * Execute or render cell outputs.
1439 1496 *
1440 1497 * @method execute_selected_cell
1441 1498 * @param {Object} options Customize post-execution behavior
1442 1499 */
1443 Notebook.prototype.execute_selected_cell = function (options) {
1444 // add_new: should a new cell be added if we are at the end of the nb
1445 // terminal: execute in terminal mode, which stays in the current cell
1446 var default_options = {terminal: false, add_new: true};
1447 $.extend(default_options, options);
1500 Notebook.prototype.execute_selected_cell = function (mode) {
1501 // mode = shift, ctrl, alt
1502 mode = mode || 'shift'
1448 1503 var that = this;
1449 1504 var cell = that.get_selected_cell();
1450 1505 var cell_index = that.find_cell_index(cell);
1451 if (cell instanceof IPython.CodeCell) {
1506
1452 1507 cell.execute();
1453 }
1454 if (default_options.terminal) {
1455 cell.select_all();
1456 } else {
1457 if ((cell_index === (that.ncells()-1)) && default_options.add_new) {
1508 console.log('Notebook.execute_selected_cell', mode);
1509 if (mode === 'shift') {
1510 if (cell_index === (that.ncells()-1)) {
1458 1511 that.insert_cell_below('code');
1459 // If we are adding a new cell at the end, scroll down to show it.
1512 that.select(cell_index+1);
1513 that.edit_mode();
1460 1514 that.scroll_to_bottom();
1461 1515 } else {
1516 that.command_mode();
1517 }
1518 } else if (mode === 'ctrl') {
1462 1519 that.select(cell_index+1);
1463 };
1464 };
1520 that.get_cell(cell_index+1).focus_cell();
1521 } else if (mode === 'alt') {
1522 // Only insert a new cell, if we ended up in an already populated cell
1523 if (/\S/.test(that.get_next_cell().get_text()) == true) {
1524 that.insert_cell_below('code');
1525 }
1526 var next_index = cell_index+1;
1527 that.select(cell_index+1);
1528 that.edit_mode();
1529 }
1530
1465 1531 this.set_dirty(true);
1466 1532 };
1467 1533
1534
1468 1535 /**
1469 1536 * Execute all cells below the selected cell.
1470 1537 *
1471 1538 * @method execute_cells_below
1472 1539 */
1473 1540 Notebook.prototype.execute_cells_below = function () {
1474 1541 this.execute_cell_range(this.get_selected_index(), this.ncells());
1475 1542 this.scroll_to_bottom();
1476 1543 };
1477 1544
1478 1545 /**
1479 1546 * Execute all cells above the selected cell.
1480 1547 *
1481 1548 * @method execute_cells_above
1482 1549 */
1483 1550 Notebook.prototype.execute_cells_above = function () {
1484 1551 this.execute_cell_range(0, this.get_selected_index());
1485 1552 };
1486 1553
1487 1554 /**
1488 1555 * Execute all cells.
1489 1556 *
1490 1557 * @method execute_all_cells
1491 1558 */
1492 1559 Notebook.prototype.execute_all_cells = function () {
1493 1560 this.execute_cell_range(0, this.ncells());
1494 1561 this.scroll_to_bottom();
1495 1562 };
1496 1563
1497 1564 /**
1498 1565 * Execute a contiguous range of cells.
1499 1566 *
1500 1567 * @method execute_cell_range
1501 1568 * @param {Number} start Index of the first cell to execute (inclusive)
1502 1569 * @param {Number} end Index of the last cell to execute (exclusive)
1503 1570 */
1504 1571 Notebook.prototype.execute_cell_range = function (start, end) {
1505 1572 for (var i=start; i<end; i++) {
1506 1573 this.select(i);
1507 1574 this.execute_selected_cell({add_new:false});
1508 1575 };
1509 1576 };
1510 1577
1511 1578 // Persistance and loading
1512 1579
1513 1580 /**
1514 1581 * Getter method for this notebook's name.
1515 1582 *
1516 1583 * @method get_notebook_name
1517 1584 * @return {String} This notebook's name
1518 1585 */
1519 1586 Notebook.prototype.get_notebook_name = function () {
1520 1587 var nbname = this.notebook_name.substring(0,this.notebook_name.length-6);
1521 1588 return nbname;
1522 1589 };
1523 1590
1524 1591 /**
1525 1592 * Setter method for this notebook's name.
1526 1593 *
1527 1594 * @method set_notebook_name
1528 1595 * @param {String} name A new name for this notebook
1529 1596 */
1530 1597 Notebook.prototype.set_notebook_name = function (name) {
1531 1598 this.notebook_name = name;
1532 1599 };
1533 1600
1534 1601 /**
1535 1602 * Check that a notebook's name is valid.
1536 1603 *
1537 1604 * @method test_notebook_name
1538 1605 * @param {String} nbname A name for this notebook
1539 1606 * @return {Boolean} True if the name is valid, false if invalid
1540 1607 */
1541 1608 Notebook.prototype.test_notebook_name = function (nbname) {
1542 1609 nbname = nbname || '';
1543 1610 if (this.notebook_name_blacklist_re.test(nbname) == false && nbname.length>0) {
1544 1611 return true;
1545 1612 } else {
1546 1613 return false;
1547 1614 };
1548 1615 };
1549 1616
1550 1617 /**
1551 1618 * Load a notebook from JSON (.ipynb).
1552 1619 *
1553 1620 * This currently handles one worksheet: others are deleted.
1554 1621 *
1555 1622 * @method fromJSON
1556 1623 * @param {Object} data JSON representation of a notebook
1557 1624 */
1558 1625 Notebook.prototype.fromJSON = function (data) {
1559 1626 var content = data.content;
1560 1627 var ncells = this.ncells();
1561 1628 var i;
1562 1629 for (i=0; i<ncells; i++) {
1563 1630 // Always delete cell 0 as they get renumbered as they are deleted.
1564 1631 this.delete_cell(0);
1565 1632 };
1566 1633 // Save the metadata and name.
1567 1634 this.metadata = content.metadata;
1568 1635 this.notebook_name = data.name;
1569 1636 // Only handle 1 worksheet for now.
1570 1637 var worksheet = content.worksheets[0];
1571 1638 if (worksheet !== undefined) {
1572 1639 if (worksheet.metadata) {
1573 1640 this.worksheet_metadata = worksheet.metadata;
1574 1641 }
1575 1642 var new_cells = worksheet.cells;
1576 1643 ncells = new_cells.length;
1577 1644 var cell_data = null;
1578 1645 var new_cell = null;
1579 1646 for (i=0; i<ncells; i++) {
1580 1647 cell_data = new_cells[i];
1581 1648 // VERSIONHACK: plaintext -> raw
1582 1649 // handle never-released plaintext name for raw cells
1583 1650 if (cell_data.cell_type === 'plaintext'){
1584 1651 cell_data.cell_type = 'raw';
1585 1652 }
1586 1653
1587 1654 new_cell = this.insert_cell_at_bottom(cell_data.cell_type);
1588 1655 new_cell.fromJSON(cell_data);
1589 1656 };
1590 1657 };
1591 1658 if (content.worksheets.length > 1) {
1592 1659 IPython.dialog.modal({
1593 1660 title : "Multiple worksheets",
1594 1661 body : "This notebook has " + data.worksheets.length + " worksheets, " +
1595 1662 "but this version of IPython can only handle the first. " +
1596 1663 "If you save this notebook, worksheets after the first will be lost.",
1597 1664 buttons : {
1598 1665 OK : {
1599 1666 class : "btn-danger"
1600 1667 }
1601 1668 }
1602 1669 });
1603 1670 }
1604 1671 };
1605 1672
1606 1673 /**
1607 1674 * Dump this notebook into a JSON-friendly object.
1608 1675 *
1609 1676 * @method toJSON
1610 1677 * @return {Object} A JSON-friendly representation of this notebook.
1611 1678 */
1612 1679 Notebook.prototype.toJSON = function () {
1613 1680 var cells = this.get_cells();
1614 1681 var ncells = cells.length;
1615 1682 var cell_array = new Array(ncells);
1616 1683 for (var i=0; i<ncells; i++) {
1617 1684 cell_array[i] = cells[i].toJSON();
1618 1685 };
1619 1686 var data = {
1620 1687 // Only handle 1 worksheet for now.
1621 1688 worksheets : [{
1622 1689 cells: cell_array,
1623 1690 metadata: this.worksheet_metadata
1624 1691 }],
1625 1692 metadata : this.metadata
1626 1693 };
1627 1694 return data;
1628 1695 };
1629 1696
1630 1697 /**
1631 1698 * Start an autosave timer, for periodically saving the notebook.
1632 1699 *
1633 1700 * @method set_autosave_interval
1634 1701 * @param {Integer} interval the autosave interval in milliseconds
1635 1702 */
1636 1703 Notebook.prototype.set_autosave_interval = function (interval) {
1637 1704 var that = this;
1638 1705 // clear previous interval, so we don't get simultaneous timers
1639 1706 if (this.autosave_timer) {
1640 1707 clearInterval(this.autosave_timer);
1641 1708 }
1642 1709
1643 1710 this.autosave_interval = this.minimum_autosave_interval = interval;
1644 1711 if (interval) {
1645 1712 this.autosave_timer = setInterval(function() {
1646 1713 if (that.dirty) {
1647 1714 that.save_notebook();
1648 1715 }
1649 1716 }, interval);
1650 1717 $([IPython.events]).trigger("autosave_enabled.Notebook", interval);
1651 1718 } else {
1652 1719 this.autosave_timer = null;
1653 1720 $([IPython.events]).trigger("autosave_disabled.Notebook");
1654 1721 };
1655 1722 };
1656 1723
1657 1724 /**
1658 1725 * Save this notebook on the server.
1659 1726 *
1660 1727 * @method save_notebook
1661 1728 */
1662 1729 Notebook.prototype.save_notebook = function (extra_settings) {
1663 1730 // Create a JSON model to be sent to the server.
1664 1731 var model = {};
1665 1732 model.name = this.notebook_name;
1666 1733 model.path = this.notebook_path;
1667 1734 model.content = this.toJSON();
1668 1735 model.content.nbformat = this.nbformat;
1669 1736 model.content.nbformat_minor = this.nbformat_minor;
1670 1737 // time the ajax call for autosave tuning purposes.
1671 1738 var start = new Date().getTime();
1672 1739 // We do the call with settings so we can set cache to false.
1673 1740 var settings = {
1674 1741 processData : false,
1675 1742 cache : false,
1676 1743 type : "PUT",
1677 1744 data : JSON.stringify(model),
1678 1745 headers : {'Content-Type': 'application/json'},
1679 1746 success : $.proxy(this.save_notebook_success, this, start),
1680 1747 error : $.proxy(this.save_notebook_error, this)
1681 1748 };
1682 1749 if (extra_settings) {
1683 1750 for (var key in extra_settings) {
1684 1751 settings[key] = extra_settings[key];
1685 1752 }
1686 1753 }
1687 1754 $([IPython.events]).trigger('notebook_saving.Notebook');
1688 1755 var url = utils.url_join_encode(
1689 1756 this._baseProjectUrl,
1690 1757 'api/notebooks',
1691 1758 this.notebook_path,
1692 1759 this.notebook_name
1693 1760 );
1694 1761 $.ajax(url, settings);
1695 1762 };
1696 1763
1697 1764 /**
1698 1765 * Success callback for saving a notebook.
1699 1766 *
1700 1767 * @method save_notebook_success
1701 1768 * @param {Integer} start the time when the save request started
1702 1769 * @param {Object} data JSON representation of a notebook
1703 1770 * @param {String} status Description of response status
1704 1771 * @param {jqXHR} xhr jQuery Ajax object
1705 1772 */
1706 1773 Notebook.prototype.save_notebook_success = function (start, data, status, xhr) {
1707 1774 this.set_dirty(false);
1708 1775 $([IPython.events]).trigger('notebook_saved.Notebook');
1709 1776 this._update_autosave_interval(start);
1710 1777 if (this._checkpoint_after_save) {
1711 1778 this.create_checkpoint();
1712 1779 this._checkpoint_after_save = false;
1713 1780 };
1714 1781 };
1715 1782
1716 1783 /**
1717 1784 * update the autosave interval based on how long the last save took
1718 1785 *
1719 1786 * @method _update_autosave_interval
1720 1787 * @param {Integer} timestamp when the save request started
1721 1788 */
1722 1789 Notebook.prototype._update_autosave_interval = function (start) {
1723 1790 var duration = (new Date().getTime() - start);
1724 1791 if (this.autosave_interval) {
1725 1792 // new save interval: higher of 10x save duration or parameter (default 30 seconds)
1726 1793 var interval = Math.max(10 * duration, this.minimum_autosave_interval);
1727 1794 // round to 10 seconds, otherwise we will be setting a new interval too often
1728 1795 interval = 10000 * Math.round(interval / 10000);
1729 1796 // set new interval, if it's changed
1730 1797 if (interval != this.autosave_interval) {
1731 1798 this.set_autosave_interval(interval);
1732 1799 }
1733 1800 }
1734 1801 };
1735 1802
1736 1803 /**
1737 1804 * Failure callback for saving a notebook.
1738 1805 *
1739 1806 * @method save_notebook_error
1740 1807 * @param {jqXHR} xhr jQuery Ajax object
1741 1808 * @param {String} status Description of response status
1742 1809 * @param {String} error HTTP error message
1743 1810 */
1744 1811 Notebook.prototype.save_notebook_error = function (xhr, status, error) {
1745 1812 $([IPython.events]).trigger('notebook_save_failed.Notebook', [xhr, status, error]);
1746 1813 };
1747 1814
1748 1815 Notebook.prototype.new_notebook = function(){
1749 1816 var path = this.notebook_path;
1750 1817 var base_project_url = this._baseProjectUrl;
1751 1818 var settings = {
1752 1819 processData : false,
1753 1820 cache : false,
1754 1821 type : "POST",
1755 1822 dataType : "json",
1756 1823 async : false,
1757 1824 success : function (data, status, xhr){
1758 1825 var notebook_name = data.name;
1759 1826 window.open(
1760 1827 utils.url_join_encode(
1761 1828 base_project_url,
1762 1829 'notebooks',
1763 1830 path,
1764 1831 notebook_name
1765 1832 ),
1766 1833 '_blank'
1767 1834 );
1768 1835 }
1769 1836 };
1770 1837 var url = utils.url_join_encode(
1771 1838 base_project_url,
1772 1839 'api/notebooks',
1773 1840 path
1774 1841 );
1775 1842 $.ajax(url,settings);
1776 1843 };
1777 1844
1778 1845
1779 1846 Notebook.prototype.copy_notebook = function(){
1780 1847 var path = this.notebook_path;
1781 1848 var base_project_url = this._baseProjectUrl;
1782 1849 var settings = {
1783 1850 processData : false,
1784 1851 cache : false,
1785 1852 type : "POST",
1786 1853 dataType : "json",
1787 1854 data : JSON.stringify({copy_from : this.notebook_name}),
1788 1855 async : false,
1789 1856 success : function (data, status, xhr) {
1790 1857 window.open(utils.url_join_encode(
1791 1858 base_project_url,
1792 1859 'notebooks',
1793 1860 data.path,
1794 1861 data.name
1795 1862 ), '_blank');
1796 1863 }
1797 1864 };
1798 1865 var url = utils.url_join_encode(
1799 1866 base_project_url,
1800 1867 'api/notebooks',
1801 1868 path
1802 1869 );
1803 1870 $.ajax(url,settings);
1804 1871 };
1805 1872
1806 1873 Notebook.prototype.rename = function (nbname) {
1807 1874 var that = this;
1808 1875 var data = {name: nbname + '.ipynb'};
1809 1876 var settings = {
1810 1877 processData : false,
1811 1878 cache : false,
1812 1879 type : "PATCH",
1813 1880 data : JSON.stringify(data),
1814 1881 dataType: "json",
1815 1882 headers : {'Content-Type': 'application/json'},
1816 1883 success : $.proxy(that.rename_success, this),
1817 1884 error : $.proxy(that.rename_error, this)
1818 1885 };
1819 1886 $([IPython.events]).trigger('rename_notebook.Notebook', data);
1820 1887 var url = utils.url_join_encode(
1821 1888 this._baseProjectUrl,
1822 1889 'api/notebooks',
1823 1890 this.notebook_path,
1824 1891 this.notebook_name
1825 1892 );
1826 1893 $.ajax(url, settings);
1827 1894 };
1828 1895
1829 1896
1830 1897 Notebook.prototype.rename_success = function (json, status, xhr) {
1831 1898 this.notebook_name = json.name;
1832 1899 var name = this.notebook_name;
1833 1900 var path = json.path;
1834 1901 this.session.rename_notebook(name, path);
1835 1902 $([IPython.events]).trigger('notebook_renamed.Notebook', json);
1836 1903 }
1837 1904
1838 1905 Notebook.prototype.rename_error = function (xhr, status, error) {
1839 1906 var that = this;
1840 1907 var dialog = $('<div/>').append(
1841 1908 $("<p/>").addClass("rename-message")
1842 1909 .html('This notebook name already exists.')
1843 1910 )
1844 1911 $([IPython.events]).trigger('notebook_rename_failed.Notebook', [xhr, status, error]);
1845 1912 IPython.dialog.modal({
1846 1913 title: "Notebook Rename Error!",
1847 1914 body: dialog,
1848 1915 buttons : {
1849 1916 "Cancel": {},
1850 1917 "OK": {
1851 1918 class: "btn-primary",
1852 1919 click: function () {
1853 1920 IPython.save_widget.rename_notebook();
1854 1921 }}
1855 1922 },
1856 1923 open : function (event, ui) {
1857 1924 var that = $(this);
1858 1925 // Upon ENTER, click the OK button.
1859 1926 that.find('input[type="text"]').keydown(function (event, ui) {
1860 1927 if (event.which === utils.keycodes.ENTER) {
1861 1928 that.find('.btn-primary').first().click();
1862 1929 }
1863 1930 });
1864 1931 that.find('input[type="text"]').focus();
1865 1932 }
1866 1933 });
1867 1934 }
1868 1935
1869 1936 /**
1870 1937 * Request a notebook's data from the server.
1871 1938 *
1872 1939 * @method load_notebook
1873 1940 * @param {String} notebook_name and path A notebook to load
1874 1941 */
1875 1942 Notebook.prototype.load_notebook = function (notebook_name, notebook_path) {
1876 1943 var that = this;
1877 1944 this.notebook_name = notebook_name;
1878 1945 this.notebook_path = notebook_path;
1879 1946 // We do the call with settings so we can set cache to false.
1880 1947 var settings = {
1881 1948 processData : false,
1882 1949 cache : false,
1883 1950 type : "GET",
1884 1951 dataType : "json",
1885 1952 success : $.proxy(this.load_notebook_success,this),
1886 1953 error : $.proxy(this.load_notebook_error,this),
1887 1954 };
1888 1955 $([IPython.events]).trigger('notebook_loading.Notebook');
1889 1956 var url = utils.url_join_encode(
1890 1957 this._baseProjectUrl,
1891 1958 'api/notebooks',
1892 1959 this.notebook_path,
1893 1960 this.notebook_name
1894 1961 );
1895 1962 $.ajax(url, settings);
1896 1963 };
1897 1964
1898 1965 /**
1899 1966 * Success callback for loading a notebook from the server.
1900 1967 *
1901 1968 * Load notebook data from the JSON response.
1902 1969 *
1903 1970 * @method load_notebook_success
1904 1971 * @param {Object} data JSON representation of a notebook
1905 1972 * @param {String} status Description of response status
1906 1973 * @param {jqXHR} xhr jQuery Ajax object
1907 1974 */
1908 1975 Notebook.prototype.load_notebook_success = function (data, status, xhr) {
1909 1976 this.fromJSON(data);
1910 1977 if (this.ncells() === 0) {
1911 1978 this.insert_cell_below('code');
1979 this.select(0);
1980 this.edit_mode();
1981 } else {
1982 this.select(0);
1983 this.command_mode();
1912 1984 };
1913 1985 this.set_dirty(false);
1914 this.select(0);
1915 1986 this.scroll_to_top();
1916 1987 if (data.orig_nbformat !== undefined && data.nbformat !== data.orig_nbformat) {
1917 1988 var msg = "This notebook has been converted from an older " +
1918 1989 "notebook format (v"+data.orig_nbformat+") to the current notebook " +
1919 1990 "format (v"+data.nbformat+"). The next time you save this notebook, the " +
1920 1991 "newer notebook format will be used and older versions of IPython " +
1921 1992 "may not be able to read it. To keep the older version, close the " +
1922 1993 "notebook without saving it.";
1923 1994 IPython.dialog.modal({
1924 1995 title : "Notebook converted",
1925 1996 body : msg,
1926 1997 buttons : {
1927 1998 OK : {
1928 1999 class : "btn-primary"
1929 2000 }
1930 2001 }
1931 2002 });
1932 2003 } else if (data.orig_nbformat_minor !== undefined && data.nbformat_minor !== data.orig_nbformat_minor) {
1933 2004 var that = this;
1934 2005 var orig_vs = 'v' + data.nbformat + '.' + data.orig_nbformat_minor;
1935 2006 var this_vs = 'v' + data.nbformat + '.' + this.nbformat_minor;
1936 2007 var msg = "This notebook is version " + orig_vs + ", but we only fully support up to " +
1937 2008 this_vs + ". You can still work with this notebook, but some features " +
1938 2009 "introduced in later notebook versions may not be available."
1939 2010
1940 2011 IPython.dialog.modal({
1941 2012 title : "Newer Notebook",
1942 2013 body : msg,
1943 2014 buttons : {
1944 2015 OK : {
1945 2016 class : "btn-danger"
1946 2017 }
1947 2018 }
1948 2019 });
1949 2020
1950 2021 }
1951 2022
1952 2023 // Create the session after the notebook is completely loaded to prevent
1953 2024 // code execution upon loading, which is a security risk.
1954 2025 if (this.session == null) {
1955 2026 this.start_session();
1956 2027 }
1957 2028 // load our checkpoint list
1958 2029 this.list_checkpoints();
1959 2030
1960 2031 // load toolbar state
1961 2032 if (this.metadata.celltoolbar) {
1962 2033 IPython.CellToolbar.global_show();
1963 2034 IPython.CellToolbar.activate_preset(this.metadata.celltoolbar);
1964 2035 }
1965 2036
1966 2037 $([IPython.events]).trigger('notebook_loaded.Notebook');
1967 2038 };
1968 2039
1969 2040 /**
1970 2041 * Failure callback for loading a notebook from the server.
1971 2042 *
1972 2043 * @method load_notebook_error
1973 2044 * @param {jqXHR} xhr jQuery Ajax object
1974 2045 * @param {String} status Description of response status
1975 2046 * @param {String} error HTTP error message
1976 2047 */
1977 2048 Notebook.prototype.load_notebook_error = function (xhr, status, error) {
1978 2049 $([IPython.events]).trigger('notebook_load_failed.Notebook', [xhr, status, error]);
1979 2050 if (xhr.status === 400) {
1980 2051 var msg = error;
1981 2052 } else if (xhr.status === 500) {
1982 2053 var msg = "An unknown error occurred while loading this notebook. " +
1983 2054 "This version can load notebook formats " +
1984 2055 "v" + this.nbformat + " or earlier.";
1985 2056 }
1986 2057 IPython.dialog.modal({
1987 2058 title: "Error loading notebook",
1988 2059 body : msg,
1989 2060 buttons : {
1990 2061 "OK": {}
1991 2062 }
1992 2063 });
1993 2064 }
1994 2065
1995 2066 /********************* checkpoint-related *********************/
1996 2067
1997 2068 /**
1998 2069 * Save the notebook then immediately create a checkpoint.
1999 2070 *
2000 2071 * @method save_checkpoint
2001 2072 */
2002 2073 Notebook.prototype.save_checkpoint = function () {
2003 2074 this._checkpoint_after_save = true;
2004 2075 this.save_notebook();
2005 2076 };
2006 2077
2007 2078 /**
2008 2079 * Add a checkpoint for this notebook.
2009 2080 * for use as a callback from checkpoint creation.
2010 2081 *
2011 2082 * @method add_checkpoint
2012 2083 */
2013 2084 Notebook.prototype.add_checkpoint = function (checkpoint) {
2014 2085 var found = false;
2015 2086 for (var i = 0; i < this.checkpoints.length; i++) {
2016 2087 var existing = this.checkpoints[i];
2017 2088 if (existing.id == checkpoint.id) {
2018 2089 found = true;
2019 2090 this.checkpoints[i] = checkpoint;
2020 2091 break;
2021 2092 }
2022 2093 }
2023 2094 if (!found) {
2024 2095 this.checkpoints.push(checkpoint);
2025 2096 }
2026 2097 this.last_checkpoint = this.checkpoints[this.checkpoints.length - 1];
2027 2098 };
2028 2099
2029 2100 /**
2030 2101 * List checkpoints for this notebook.
2031 2102 *
2032 2103 * @method list_checkpoints
2033 2104 */
2034 2105 Notebook.prototype.list_checkpoints = function () {
2035 2106 var url = utils.url_join_encode(
2036 2107 this._baseProjectUrl,
2037 2108 'api/notebooks',
2038 2109 this.notebook_path,
2039 2110 this.notebook_name,
2040 2111 'checkpoints'
2041 2112 );
2042 2113 $.get(url).done(
2043 2114 $.proxy(this.list_checkpoints_success, this)
2044 2115 ).fail(
2045 2116 $.proxy(this.list_checkpoints_error, this)
2046 2117 );
2047 2118 };
2048 2119
2049 2120 /**
2050 2121 * Success callback for listing checkpoints.
2051 2122 *
2052 2123 * @method list_checkpoint_success
2053 2124 * @param {Object} data JSON representation of a checkpoint
2054 2125 * @param {String} status Description of response status
2055 2126 * @param {jqXHR} xhr jQuery Ajax object
2056 2127 */
2057 2128 Notebook.prototype.list_checkpoints_success = function (data, status, xhr) {
2058 2129 var data = $.parseJSON(data);
2059 2130 this.checkpoints = data;
2060 2131 if (data.length) {
2061 2132 this.last_checkpoint = data[data.length - 1];
2062 2133 } else {
2063 2134 this.last_checkpoint = null;
2064 2135 }
2065 2136 $([IPython.events]).trigger('checkpoints_listed.Notebook', [data]);
2066 2137 };
2067 2138
2068 2139 /**
2069 2140 * Failure callback for listing a checkpoint.
2070 2141 *
2071 2142 * @method list_checkpoint_error
2072 2143 * @param {jqXHR} xhr jQuery Ajax object
2073 2144 * @param {String} status Description of response status
2074 2145 * @param {String} error_msg HTTP error message
2075 2146 */
2076 2147 Notebook.prototype.list_checkpoints_error = function (xhr, status, error_msg) {
2077 2148 $([IPython.events]).trigger('list_checkpoints_failed.Notebook');
2078 2149 };
2079 2150
2080 2151 /**
2081 2152 * Create a checkpoint of this notebook on the server from the most recent save.
2082 2153 *
2083 2154 * @method create_checkpoint
2084 2155 */
2085 2156 Notebook.prototype.create_checkpoint = function () {
2086 2157 var url = utils.url_join_encode(
2087 2158 this._baseProjectUrl,
2088 2159 'api/notebooks',
2089 2160 this.notebookPath(),
2090 2161 this.notebook_name,
2091 2162 'checkpoints'
2092 2163 );
2093 2164 $.post(url).done(
2094 2165 $.proxy(this.create_checkpoint_success, this)
2095 2166 ).fail(
2096 2167 $.proxy(this.create_checkpoint_error, this)
2097 2168 );
2098 2169 };
2099 2170
2100 2171 /**
2101 2172 * Success callback for creating a checkpoint.
2102 2173 *
2103 2174 * @method create_checkpoint_success
2104 2175 * @param {Object} data JSON representation of a checkpoint
2105 2176 * @param {String} status Description of response status
2106 2177 * @param {jqXHR} xhr jQuery Ajax object
2107 2178 */
2108 2179 Notebook.prototype.create_checkpoint_success = function (data, status, xhr) {
2109 2180 var data = $.parseJSON(data);
2110 2181 this.add_checkpoint(data);
2111 2182 $([IPython.events]).trigger('checkpoint_created.Notebook', data);
2112 2183 };
2113 2184
2114 2185 /**
2115 2186 * Failure callback for creating a checkpoint.
2116 2187 *
2117 2188 * @method create_checkpoint_error
2118 2189 * @param {jqXHR} xhr jQuery Ajax object
2119 2190 * @param {String} status Description of response status
2120 2191 * @param {String} error_msg HTTP error message
2121 2192 */
2122 2193 Notebook.prototype.create_checkpoint_error = function (xhr, status, error_msg) {
2123 2194 $([IPython.events]).trigger('checkpoint_failed.Notebook');
2124 2195 };
2125 2196
2126 2197 Notebook.prototype.restore_checkpoint_dialog = function (checkpoint) {
2127 2198 var that = this;
2128 2199 var checkpoint = checkpoint || this.last_checkpoint;
2129 2200 if ( ! checkpoint ) {
2130 2201 console.log("restore dialog, but no checkpoint to restore to!");
2131 2202 return;
2132 2203 }
2133 2204 var body = $('<div/>').append(
2134 2205 $('<p/>').addClass("p-space").text(
2135 2206 "Are you sure you want to revert the notebook to " +
2136 2207 "the latest checkpoint?"
2137 2208 ).append(
2138 2209 $("<strong/>").text(
2139 2210 " This cannot be undone."
2140 2211 )
2141 2212 )
2142 2213 ).append(
2143 2214 $('<p/>').addClass("p-space").text("The checkpoint was last updated at:")
2144 2215 ).append(
2145 2216 $('<p/>').addClass("p-space").text(
2146 2217 Date(checkpoint.last_modified)
2147 2218 ).css("text-align", "center")
2148 2219 );
2149 2220
2150 2221 IPython.dialog.modal({
2151 2222 title : "Revert notebook to checkpoint",
2152 2223 body : body,
2153 2224 buttons : {
2154 2225 Revert : {
2155 2226 class : "btn-danger",
2156 2227 click : function () {
2157 2228 that.restore_checkpoint(checkpoint.id);
2158 2229 }
2159 2230 },
2160 2231 Cancel : {}
2161 2232 }
2162 2233 });
2163 2234 }
2164 2235
2165 2236 /**
2166 2237 * Restore the notebook to a checkpoint state.
2167 2238 *
2168 2239 * @method restore_checkpoint
2169 2240 * @param {String} checkpoint ID
2170 2241 */
2171 2242 Notebook.prototype.restore_checkpoint = function (checkpoint) {
2172 2243 $([IPython.events]).trigger('notebook_restoring.Notebook', checkpoint);
2173 2244 var url = utils.url_join_encode(
2174 2245 this._baseProjectUrl,
2175 2246 'api/notebooks',
2176 2247 this.notebookPath(),
2177 2248 this.notebook_name,
2178 2249 'checkpoints',
2179 2250 checkpoint
2180 2251 );
2181 2252 $.post(url).done(
2182 2253 $.proxy(this.restore_checkpoint_success, this)
2183 2254 ).fail(
2184 2255 $.proxy(this.restore_checkpoint_error, this)
2185 2256 );
2186 2257 };
2187 2258
2188 2259 /**
2189 2260 * Success callback for restoring a notebook to a checkpoint.
2190 2261 *
2191 2262 * @method restore_checkpoint_success
2192 2263 * @param {Object} data (ignored, should be empty)
2193 2264 * @param {String} status Description of response status
2194 2265 * @param {jqXHR} xhr jQuery Ajax object
2195 2266 */
2196 2267 Notebook.prototype.restore_checkpoint_success = function (data, status, xhr) {
2197 2268 $([IPython.events]).trigger('checkpoint_restored.Notebook');
2198 2269 this.load_notebook(this.notebook_name, this.notebook_path);
2199 2270 };
2200 2271
2201 2272 /**
2202 2273 * Failure callback for restoring a notebook to a checkpoint.
2203 2274 *
2204 2275 * @method restore_checkpoint_error
2205 2276 * @param {jqXHR} xhr jQuery Ajax object
2206 2277 * @param {String} status Description of response status
2207 2278 * @param {String} error_msg HTTP error message
2208 2279 */
2209 2280 Notebook.prototype.restore_checkpoint_error = function (xhr, status, error_msg) {
2210 2281 $([IPython.events]).trigger('checkpoint_restore_failed.Notebook');
2211 2282 };
2212 2283
2213 2284 /**
2214 2285 * Delete a notebook checkpoint.
2215 2286 *
2216 2287 * @method delete_checkpoint
2217 2288 * @param {String} checkpoint ID
2218 2289 */
2219 2290 Notebook.prototype.delete_checkpoint = function (checkpoint) {
2220 2291 $([IPython.events]).trigger('notebook_restoring.Notebook', checkpoint);
2221 2292 var url = utils.url_join_encode(
2222 2293 this._baseProjectUrl,
2223 2294 'api/notebooks',
2224 2295 this.notebookPath(),
2225 2296 this.notebook_name,
2226 2297 'checkpoints',
2227 2298 checkpoint
2228 2299 );
2229 2300 $.ajax(url, {
2230 2301 type: 'DELETE',
2231 2302 success: $.proxy(this.delete_checkpoint_success, this),
2232 2303 error: $.proxy(this.delete_notebook_error,this)
2233 2304 });
2234 2305 };
2235 2306
2236 2307 /**
2237 2308 * Success callback for deleting a notebook checkpoint
2238 2309 *
2239 2310 * @method delete_checkpoint_success
2240 2311 * @param {Object} data (ignored, should be empty)
2241 2312 * @param {String} status Description of response status
2242 2313 * @param {jqXHR} xhr jQuery Ajax object
2243 2314 */
2244 2315 Notebook.prototype.delete_checkpoint_success = function (data, status, xhr) {
2245 2316 $([IPython.events]).trigger('checkpoint_deleted.Notebook', data);
2246 2317 this.load_notebook(this.notebook_name, this.notebook_path);
2247 2318 };
2248 2319
2249 2320 /**
2250 2321 * Failure callback for deleting a notebook checkpoint.
2251 2322 *
2252 2323 * @method delete_checkpoint_error
2253 2324 * @param {jqXHR} xhr jQuery Ajax object
2254 2325 * @param {String} status Description of response status
2255 2326 * @param {String} error_msg HTTP error message
2256 2327 */
2257 2328 Notebook.prototype.delete_checkpoint_error = function (xhr, status, error_msg) {
2258 2329 $([IPython.events]).trigger('checkpoint_delete_failed.Notebook');
2259 2330 };
2260 2331
2261 2332
2262 2333 IPython.Notebook = Notebook;
2263 2334
2264 2335
2265 2336 return IPython;
2266 2337
2267 2338 }(IPython));
@@ -1,583 +1,583 b''
1 1 //----------------------------------------------------------------------------
2 2 // Copyright (C) 2008-2012 The IPython Development Team
3 3 //
4 4 // Distributed under the terms of the BSD License. The full license is in
5 5 // the file COPYING, distributed as part of this software.
6 6 //----------------------------------------------------------------------------
7 7
8 8 //============================================================================
9 9 // TextCell
10 10 //============================================================================
11 11
12 12
13 13
14 14 /**
15 15 A module that allow to create different type of Text Cell
16 16 @module IPython
17 17 @namespace IPython
18 18 */
19 19 var IPython = (function (IPython) {
20 20 "use strict";
21 21
22 22 // TextCell base class
23 23 var key = IPython.utils.keycodes;
24 24
25 25 /**
26 26 * Construct a new TextCell, codemirror mode is by default 'htmlmixed', and cell type is 'text'
27 27 * cell start as not redered.
28 28 *
29 29 * @class TextCell
30 30 * @constructor TextCell
31 31 * @extend IPython.Cell
32 32 * @param {object|undefined} [options]
33 33 * @param [options.cm_config] {object} config to pass to CodeMirror, will extend/overwrite default config
34 34 * @param [options.placeholder] {string} default string to use when souce in empty for rendering (only use in some TextCell subclass)
35 35 */
36 36 var TextCell = function (options) {
37 37 // in all TextCell/Cell subclasses
38 38 // do not assign most of members here, just pass it down
39 39 // in the options dict potentially overwriting what you wish.
40 40 // they will be assigned in the base class.
41 41
42 42 // we cannot put this as a class key as it has handle to "this".
43 43 var cm_overwrite_options = {
44 44 onKeyEvent: $.proxy(this.handle_codemirror_keyevent,this)
45 45 };
46 46
47 47 options = this.mergeopt(TextCell,options,{cm_config:cm_overwrite_options});
48 48
49 49 this.cell_type = this.cell_type || 'text';
50 50
51 51 IPython.Cell.apply(this, [options]);
52 52
53 53 this.rendered = false;
54 54 };
55 55
56 56 TextCell.prototype = new IPython.Cell();
57 57
58 58 TextCell.options_default = {
59 59 cm_config : {
60 60 extraKeys: {"Tab": "indentMore","Shift-Tab" : "indentLess"},
61 61 mode: 'htmlmixed',
62 62 lineWrapping : true,
63 63 }
64 64 };
65 65
66 66
67
68 67 /**
69 68 * Create the DOM element of the TextCell
70 69 * @method create_element
71 70 * @private
72 71 */
73 72 TextCell.prototype.create_element = function () {
74 73 IPython.Cell.prototype.create_element.apply(this, arguments);
75 74
76 75 var cell = $("<div>").addClass('cell text_cell border-box-sizing');
77 76 cell.attr('tabindex','2');
78 77
79 78 var prompt = $('<div/>').addClass('prompt input_prompt');
80 79 cell.append(prompt);
81 80 var inner_cell = $('<div/>').addClass('inner_cell');
82 81 this.celltoolbar = new IPython.CellToolbar(this);
83 82 inner_cell.append(this.celltoolbar.element);
84 83 var input_area = $('<div/>').addClass('text_cell_input border-box-sizing');
85 84 this.code_mirror = CodeMirror(input_area.get(0), this.cm_config);
86 85 // The tabindex=-1 makes this div focusable.
87 86 var render_area = $('<div/>').addClass('text_cell_render border-box-sizing').
88 87 addClass('rendered_html').attr('tabindex','-1');
89 88 inner_cell.append(input_area).append(render_area);
90 89 cell.append(inner_cell);
91 90 this.element = cell;
92 91 };
93 92
94 93
95 94 /**
96 95 * Bind the DOM evet to cell actions
97 96 * Need to be called after TextCell.create_element
98 97 * @private
99 98 * @method bind_event
100 99 */
101 100 TextCell.prototype.bind_events = function () {
102 101 IPython.Cell.prototype.bind_events.apply(this);
103 102 var that = this;
103
104 // TODO: move this to the notebook event handler
104 105 this.element.keydown(function (event) {
105 106 if (event.which === 13 && !event.shiftKey) {
106 107 if (that.rendered) {
107 108 that.unrender();
108 109 return false;
109 110 };
110 111 };
111 112 });
113
112 114 this.element.dblclick(function () {
113 115 that.unrender();
114 116 });
115 117 };
116 118
119
117 120 /**
118 121 * This method gets called in CodeMirror's onKeyDown/onKeyPress
119 122 * handlers and is used to provide custom key handling.
120 123 *
121 124 * Subclass should override this method to have custom handeling
122 125 *
123 126 * @method handle_codemirror_keyevent
124 127 * @param {CodeMirror} editor - The codemirror instance bound to the cell
125 128 * @param {event} event -
126 129 * @return {Boolean} `true` if CodeMirror should ignore the event, `false` Otherwise
127 130 */
128 131 TextCell.prototype.handle_codemirror_keyevent = function (editor, event) {
129
132 if (this.mode === 'command') {
133 return false
134 } else if (this.mode === 'edit') {
130 135 if (event.keyCode === 13 && (event.shiftKey || event.ctrlKey)) {
131 136 // Always ignore shift-enter in CodeMirror as we handle it.
132 137 return true;
133 }
138 };
139 return false;
140 };
134 141 return false;
135 142 };
136 143
137 144 // Cell level actions
138 145
139 146 TextCell.prototype.select = function () {
140 var continue = IPython.Cell.prototype.select.apply(this);
141 if (continue) {
147 var cont = IPython.Cell.prototype.select.apply(this);
148 if (cont) {
142 149 if (this.mode === 'edit') {
143 150 this.code_mirror.refresh();
144 151 }
145 152 };
146 return continue;
147 };
148
149 TextCell.prototype.render = function () {
150 var continue = IPython.Cell.prototype.render.apply(this);
151 if (continue) {
152 this.execute();
153 };
154 return continue;
153 return cont;
155 154 };
156 155
157 156 TextCell.prototype.unrender = function () {
158 157 if (this.read_only) return;
159 var continue = IPython.Cell.prototype.unrender.apply(this);
160 if (continue) {
158 var cont = IPython.Cell.prototype.unrender.apply(this);
159 if (cont) {
161 160 var text_cell = this.element;
162 161 var output = text_cell.find("div.text_cell_render");
163 162 output.hide();
164 163 text_cell.find('div.text_cell_input').show();
165 164 this.focus_editor();
166 165 if (this.get_text() === this.placeholder) {
167 166 this.set_text('');
168 167 this.refresh();
169 168 }
170 169
171 170 };
172 return continue;
171 return cont;
172 };
173
174 TextCell.prototype.execute = function () {
175 this.render();
173 176 };
174 177
175 178 TextCell.prototype.command_mode = function () {
176 var continue = IPython.Cell.prototype.command_mode.apply(this);
177 if (continue) {
179 var cont = IPython.Cell.prototype.command_mode.apply(this);
180 if (cont) {
178 181 this.focus_cell();
179 182 };
180 return continue;
183 return cont;
181 184 }
182 185
183 186 TextCell.prototype.edit_mode = function () {
184 var continue = IPython.Cell.prototype.edit_mode.apply(this);
185 if (continue) {
187 var cont = IPython.Cell.prototype.edit_mode.apply(this);
188 if (cont) {
186 189 this.focus_editor();
187 190 };
188 return continue;
191 return cont;
189 192 }
190 193
191 194 /**
192 195 * setter: {{#crossLink "TextCell/set_text"}}{{/crossLink}}
193 196 * @method get_text
194 197 * @retrun {string} CodeMirror current text value
195 198 */
196 199 TextCell.prototype.get_text = function() {
197 200 return this.code_mirror.getValue();
198 201 };
199 202
200 203 /**
201 204 * @param {string} text - Codemiror text value
202 205 * @see TextCell#get_text
203 206 * @method set_text
204 207 * */
205 208 TextCell.prototype.set_text = function(text) {
206 209 this.code_mirror.setValue(text);
207 210 this.code_mirror.refresh();
208 211 };
209 212
210 213 /**
211 214 * setter :{{#crossLink "TextCell/set_rendered"}}{{/crossLink}}
212 215 * @method get_rendered
213 216 * @return {html} html of rendered element
214 217 * */
215 218 TextCell.prototype.get_rendered = function() {
216 219 return this.element.find('div.text_cell_render').html();
217 220 };
218 221
219 222 /**
220 223 * @method set_rendered
221 224 */
222 225 TextCell.prototype.set_rendered = function(text) {
223 226 this.element.find('div.text_cell_render').html(text);
224 227 };
225 228
226 229 /**
227 * not deprecated, but implementation wrong
228 230 * @method at_top
229 * @deprecated
230 * @return {Boolean} true is cell rendered, false otherwise
231 * I doubt this is what it is supposed to do
232 * this implementation is completly false
231 * @return {Boolean}
233 232 */
234 233 TextCell.prototype.at_top = function () {
235 234 if (this.rendered) {
236 235 return true;
237 236 } else {
237 if (cursor.line === 0 && cursor.ch === 0) {
238 return true;
239 } else {
238 240 return false;
239 }
240 241 };
242 };
243 };
244
241 245
246 /** @method at_bottom **/
247 TextCell.prototype.at_bottom = function () {
248 if (this.rendered) {
249 return true
250 } else {
251 var cursor = this.code_mirror.getCursor();
252 if (cursor.line === (this.code_mirror.lineCount()-1) && cursor.ch === this.code_mirror.getLine(cursor.line).length) {
253 return true;
254 } else {
255 return false;
256 };
257 };
258 };
242 259
243 260 /**
244 * not deprecated, but implementation wrong
245 261 * @method at_bottom
246 * @deprecated
247 * @return {Boolean} true is cell rendered, false otherwise
248 * I doubt this is what it is supposed to do
249 * this implementation is completly false
262 * @return {Boolean}
250 263 * */
251 264 TextCell.prototype.at_bottom = function () {
252 265 if (this.rendered) {
253 266 return true;
254 267 } else {
268 var cursor = this.code_mirror.getCursor();
269 if (cursor.line === (this.code_mirror.lineCount()-1) && cursor.ch === this.code_mirror.getLine(cursor.line).length) {
270 return true;
271 } else {
255 272 return false;
256 }
273 };
274 };
257 275 };
258 276
259 277 /**
260 278 * Create Text cell from JSON
261 279 * @param {json} data - JSON serialized text-cell
262 280 * @method fromJSON
263 281 */
264 282 TextCell.prototype.fromJSON = function (data) {
265 283 IPython.Cell.prototype.fromJSON.apply(this, arguments);
266 284 if (data.cell_type === this.cell_type) {
267 285 if (data.source !== undefined) {
268 286 this.set_text(data.source);
269 287 // make this value the starting point, so that we can only undo
270 288 // to this state, instead of a blank cell
271 289 this.code_mirror.clearHistory();
272 290 this.set_rendered(data.rendered || '');
273 291 this.rendered = false;
274 292 this.render();
275 293 }
276 294 }
277 295 };
278 296
279 297 /** Generate JSON from cell
280 298 * @return {object} cell data serialised to json
281 299 */
282 300 TextCell.prototype.toJSON = function () {
283 301 var data = IPython.Cell.prototype.toJSON.apply(this);
284 302 data.source = this.get_text();
285 303 if (data.source == this.placeholder) {
286 304 data.source = "";
287 305 }
288 306 return data;
289 307 };
290 308
291 309
292 310 /**
293 311 * @class MarkdownCell
294 312 * @constructor MarkdownCell
295 313 * @extends IPython.HTMLCell
296 314 */
297 315 var MarkdownCell = function (options) {
298 316 options = this.mergeopt(MarkdownCell, options);
299 317
300 318 this.cell_type = 'markdown';
301 319 TextCell.apply(this, [options]);
302 320 };
303 321
304 322 MarkdownCell.options_default = {
305 323 cm_config: {
306 324 mode: 'gfm'
307 325 },
308 326 placeholder: "Type *Markdown* and LaTeX: $\\alpha^2$"
309 327 }
310 328
311
312
313
314 329 MarkdownCell.prototype = new TextCell();
315 330
316 331 /**
317 332 * @method render
318 333 */
319 334 MarkdownCell.prototype.render = function () {
320 if (this.rendered === false) {
335 var cont = IPython.TextCell.prototype.render.apply(this);
336 if (cont) {
321 337 var text = this.get_text();
322 338 var math = null;
323 339 if (text === "") { text = this.placeholder; }
324 340 var text_and_math = IPython.mathjaxutils.remove_math(text);
325 341 text = text_and_math[0];
326 342 math = text_and_math[1];
327 343 var html = marked.parser(marked.lexer(text));
328 344 html = $(IPython.mathjaxutils.replace_math(html, math));
329 345 // links in markdown cells should open in new tabs
330 346 html.find("a[href]").not('[href^="#"]').attr("target", "_blank");
331 347 try {
332 348 this.set_rendered(html);
333 349 } catch (e) {
334 350 console.log("Error running Javascript in Markdown:");
335 351 console.log(e);
336 352 this.set_rendered($("<div/>").addClass("js-error").html(
337 353 "Error rendering Markdown!<br/>" + e.toString())
338 354 );
339 355 }
340 356 this.element.find('div.text_cell_input').hide();
341 357 this.element.find("div.text_cell_render").show();
342 this.typeset();
343 this.rendered = true;
344 }
358 this.typeset()
359 };
360 return cont;
345 361 };
346 362
347 363
348 364 // RawCell
349 365
350 366 /**
351 367 * @class RawCell
352 368 * @constructor RawCell
353 369 * @extends IPython.TextCell
354 370 */
355 371 var RawCell = function (options) {
356 372 options = this.mergeopt(RawCell, options);
357 373
358 374 this.cell_type = 'raw';
359 375 TextCell.apply(this, [options]);
360
361 var that = this;
362 this.element.focusout(
363 function() { that.auto_highlight(); }
364 );
365 376 };
366 377
367 378 RawCell.options_default = {
368 379 placeholder : "Write raw LaTeX or other formats here, for use with nbconvert.\n" +
369 380 "It will not be rendered in the notebook.\n" +
370 381 "When passing through nbconvert, a Raw Cell's content is added to the output unmodified."
371 382 };
372 383
373
374
375 384 RawCell.prototype = new TextCell();
376 385
386 /** @method bind_events **/
387 RawCell.prototype.bind_events = function () {
388 TextCell.prototype.bind_events.apply(this);
389 var that = this
390 this.element.focusout(function() {
391 that.auto_highlight();
392 });
393 };
394
377 395 /**
378 396 * Trigger autodetection of highlight scheme for current cell
379 397 * @method auto_highlight
380 398 */
381 399 RawCell.prototype.auto_highlight = function () {
382 400 this._auto_highlight(IPython.config.raw_cell_highlight);
383 401 };
384 402
385 403 /** @method render **/
386 404 RawCell.prototype.render = function () {
387
388 this.rendered = true;
405 // Make sure that this cell type can never be rendered
406 if (this.rendered) {
407 this.unrender();
408 }
389 409 var text = this.get_text();
390 410 if (text === "") { text = this.placeholder; }
391 411 this.set_text(text);
392 this.unrender();
393 412 };
394 413
395 414
396 415 /** @method handle_codemirror_keyevent **/
397 416 RawCell.prototype.handle_codemirror_keyevent = function (editor, event) {
398 417
399 418 var that = this;
419 if (this.mode === 'command') {
420 return false
421 } else if (this.mode === 'edit') {
422 // TODO: review these handlers...
400 423 if (event.which === key.UPARROW && event.type === 'keydown') {
401 424 // If we are not at the top, let CM handle the up arrow and
402 425 // prevent the global keydown handler from handling it.
403 426 if (!that.at_top()) {
404 427 event.stop();
405 428 return false;
406 429 } else {
407 430 return true;
408 431 };
409 432 } else if (event.which === key.DOWNARROW && event.type === 'keydown') {
410 433 // If we are not at the bottom, let CM handle the down arrow and
411 434 // prevent the global keydown handler from handling it.
412 435 if (!that.at_bottom()) {
413 436 event.stop();
414 437 return false;
415 438 } else {
416 439 return true;
417 440 };
418 441 };
419 442 return false;
420 443 };
421
422 /** @method select **/
423 RawCell.prototype.select = function () {
424 IPython.Cell.prototype.select.apply(this);
425 this.edit();
426 };
427
428 /** @method at_top **/
429 RawCell.prototype.at_top = function () {
430 var cursor = this.code_mirror.getCursor();
431 if (cursor.line === 0 && cursor.ch === 0) {
432 return true;
433 } else {
434 444 return false;
435 }
436 };
437
438
439 /** @method at_bottom **/
440 RawCell.prototype.at_bottom = function () {
441 var cursor = this.code_mirror.getCursor();
442 if (cursor.line === (this.code_mirror.lineCount()-1) && cursor.ch === this.code_mirror.getLine(cursor.line).length) {
443 return true;
444 } else {
445 return false;
446 }
447 445 };
448 446
449 447
450 448 /**
451 449 * @class HeadingCell
452 450 * @extends IPython.TextCell
453 451 */
454 452
455 453 /**
456 454 * @constructor HeadingCell
457 455 * @extends IPython.TextCell
458 456 */
459 457 var HeadingCell = function (options) {
460 458 options = this.mergeopt(HeadingCell, options);
461 459
462 460 this.level = 1;
463 461 this.cell_type = 'heading';
464 462 TextCell.apply(this, [options]);
465 463
466 464 /**
467 465 * heading level of the cell, use getter and setter to access
468 466 * @property level
469 467 */
470 468 };
471 469
472 470 HeadingCell.options_default = {
473 471 placeholder: "Type Heading Here"
474 472 };
475 473
476 474 HeadingCell.prototype = new TextCell();
477 475
478 476 /** @method fromJSON */
479 477 HeadingCell.prototype.fromJSON = function (data) {
480 478 if (data.level != undefined){
481 479 this.level = data.level;
482 480 }
483 481 TextCell.prototype.fromJSON.apply(this, arguments);
484 482 };
485 483
486 484
487 485 /** @method toJSON */
488 486 HeadingCell.prototype.toJSON = function () {
489 487 var data = TextCell.prototype.toJSON.apply(this);
490 488 data.level = this.get_level();
491 489 return data;
492 490 };
493 491
494 492 /**
495 493 * can the cell be split into two cells
496 494 * @method is_splittable
497 495 **/
498 496 HeadingCell.prototype.is_splittable = function () {
499 497 return false;
500 498 };
501 499
502 500
503 501 /**
504 502 * can the cell be merged with other cells
505 503 * @method is_mergeable
506 504 **/
507 505 HeadingCell.prototype.is_mergeable = function () {
508 506 return false;
509 507 };
510 508
511 509 /**
512 510 * Change heading level of cell, and re-render
513 511 * @method set_level
514 512 */
515 513 HeadingCell.prototype.set_level = function (level) {
516 514 this.level = level;
517 515 if (this.rendered) {
518 516 this.rendered = false;
519 517 this.render();
520 518 };
521 519 };
522 520
523 521 /** The depth of header cell, based on html (h1 to h6)
524 522 * @method get_level
525 523 * @return {integer} level - for 1 to 6
526 524 */
527 525 HeadingCell.prototype.get_level = function () {
528 526 return this.level;
529 527 };
530 528
531 529
532 530 HeadingCell.prototype.set_rendered = function (html) {
533 531 this.element.find("div.text_cell_render").html(html);
534 532 };
535 533
536 534
537 535 HeadingCell.prototype.get_rendered = function () {
538 536 var r = this.element.find("div.text_cell_render");
539 537 return r.children().first().html();
540 538 };
541 539
542 540
543 541 HeadingCell.prototype.render = function () {
544 if (this.rendered === false) {
542 var cont = IPython.TextCell.prototype.render.apply(this);
543 if (cont) {
545 544 var text = this.get_text();
546 545 var math = null;
547 546 // Markdown headings must be a single line
548 547 text = text.replace(/\n/g, ' ');
549 548 if (text === "") { text = this.placeholder; }
550 549 text = Array(this.level + 1).join("#") + " " + text;
551 550 var text_and_math = IPython.mathjaxutils.remove_math(text);
552 551 text = text_and_math[0];
553 552 math = text_and_math[1];
554 553 var html = marked.parser(marked.lexer(text));
555 554 var h = $(IPython.mathjaxutils.replace_math(html, math));
556 555 // add id and linkback anchor
557 556 var hash = h.text().replace(/ /g, '-');
558 557 h.attr('id', hash);
559 558 h.append(
560 559 $('<a/>')
561 560 .addClass('anchor-link')
562 561 .attr('href', '#' + hash)
563 562 .text('ΒΆ')
564 563 );
565 564
566 565 this.set_rendered(h);
567 566 this.typeset();
568 567 this.element.find('div.text_cell_input').hide();
569 568 this.element.find("div.text_cell_render").show();
570 this.rendered = true;
569
571 570 };
571 return cont;
572 572 };
573 573
574 574 IPython.TextCell = TextCell;
575 575 IPython.MarkdownCell = MarkdownCell;
576 576 IPython.RawCell = RawCell;
577 577 IPython.HeadingCell = HeadingCell;
578 578
579 579
580 580 return IPython;
581 581
582 582 }(IPython));
583 583
@@ -1,39 +1,47 b''
1 1 div.cell {
2 2 border: 1px solid transparent;
3 3 .vbox();
4 4
5 5 &.selected {
6 6 .corner-all;
7 7 border : thin @border_color solid;
8 8 }
9
10 &.edit_mode {
11 .corner-all;
12 border : thin green solid;
13 }
14 }
15
16 div.cell {
9 17 width: 100%;
10 18 padding: 5px 5px 5px 0px;
11 19 /* This acts as a spacer between cells, that is outside the border */
12 20 margin: 0px;
13 21 outline: none;
14 22 }
15 23
16 24 div.prompt {
17 25 /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */
18 26 min-width: 11ex;
19 27 /* This padding is tuned to match the padding on the CodeMirror editor. */
20 28 padding: @code_padding;
21 29 margin: 0px;
22 30 font-family: @monoFontFamily;
23 31 text-align: right;
24 32 /* This has to match that of the the CodeMirror class line-height below */
25 33 line-height: @code_line_height;
26 34 }
27 35
28 36 div.inner_cell {
29 37 .vbox();
30 38 .box-flex1();
31 39 }
32 40
33 41 /* This is needed so that empty prompt areas can collapse to zero height when there
34 42 is no content in the output_subarea and the prompt. The main purpose of this is
35 43 to make sure that empty JavaScript output_subareas have no height. */
36 44 div.prompt:empty {
37 45 padding-top: 0;
38 46 padding-bottom: 0;
39 47 }
@@ -1,148 +1,150 b''
1 1 .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
2 2 .clearfix:after{clear:both;}
3 3 .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
4 4 .input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
5 5 .border-box-sizing{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;}
6 6 .corner-all{border-radius:4px;}
7 7 .hbox{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
8 8 .hbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
9 9 .vbox{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
10 10 .vbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
11 11 .reverse{-webkit-box-direction:reverse;-moz-box-direction:reverse;box-direction:reverse;}
12 12 .box-flex0{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
13 13 .box-flex1{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
14 14 .box-flex{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
15 15 .box-flex2{-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;}
16 16 .box-group1{-webkit-box-flex-group:1;-moz-box-flex-group:1;box-flex-group:1;}
17 17 .box-group2{-webkit-box-flex-group:2;-moz-box-flex-group:2;box-flex-group:2;}
18 18 .start{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;}
19 19 .end{-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;}
20 20 .center{-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;}
21 21 .center-nav{display:inline-block;margin-bottom:-4px;}
22 22 .alternate_upload{background-color:none;display:inline;}
23 23 .alternate_upload.form{padding:0;margin:0;}
24 24 .alternate_upload input.fileinput{background-color:red;position:relative;opacity:0;z-index:2;width:295px;margin-left:163px;cursor:pointer;}
25 25 .list_toolbar{padding:5px;height:25px;line-height:25px;}
26 26 .toolbar_info{float:left;}
27 27 .toolbar_buttons{float:right;}
28 28 .list_header{font-weight:bold;}
29 29 .list_container{margin-top:16px;margin-bottom:16px;border:1px solid #ababab;border-radius:4px;}
30 30 .list_container>div{border-bottom:1px solid #ababab;}.list_container>div:hover .list-item{background-color:red;}
31 31 .list_container>div:last-child{border:none;}
32 32 .list_item:hover .list_item{background-color:#ddd;}
33 33 .item_name{line-height:24px;}
34 34 .list_container>div>span,.list_container>div>div{padding:8px;}
35 35 .list_item a{text-decoration:none;}
36 36 input.nbname_input{height:15px;}
37 37 .highlight_text{color:blue;}
38 38 #project_name>.breadcrumb{padding:0px;margin-bottom:0px;background-color:transparent;font-weight:bold;}
39 39 input.engine_num_input{height:20px;margin-bottom:2px;padding-top:0;padding-bottom:0;width:60px;}
40 40 .ansibold{font-weight:bold;}
41 41 .ansiblack{color:black;}
42 42 .ansired{color:darkred;}
43 43 .ansigreen{color:darkgreen;}
44 44 .ansiyellow{color:brown;}
45 45 .ansiblue{color:darkblue;}
46 46 .ansipurple{color:darkviolet;}
47 47 .ansicyan{color:steelblue;}
48 48 .ansigray{color:gray;}
49 49 .ansibgblack{background-color:black;}
50 50 .ansibgred{background-color:red;}
51 51 .ansibggreen{background-color:green;}
52 52 .ansibgyellow{background-color:yellow;}
53 53 .ansibgblue{background-color:blue;}
54 54 .ansibgpurple{background-color:magenta;}
55 55 .ansibgcyan{background-color:cyan;}
56 56 .ansibggray{background-color:gray;}
57 div.cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;padding:5px 5px 5px 0px;margin:0px;outline:none;}div.cell.selected{border-radius:4px;border:thin #ababab solid;}
57 div.cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}div.cell.selected{border-radius:4px;border:thin #ababab solid;}
58 div.cell.edit_mode{border-radius:4px;border:thin green solid;}
59 div.cell{width:100%;padding:5px 5px 5px 0px;margin:0px;outline:none;}
58 60 div.prompt{min-width:11ex;padding:0.4em;margin:0px;font-family:monospace;text-align:right;line-height:1.231em;}
59 61 div.inner_cell{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
60 62 div.prompt:empty{padding-top:0;padding-bottom:0;}
61 63 div.input{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
62 64 div.input_area{border:1px solid #cfcfcf;border-radius:4px;background:#f7f7f7;}
63 65 div.input_prompt{color:navy;border-top:1px solid transparent;}
64 66 .CodeMirror{line-height:1.231em;height:auto;background:none;}
65 67 .CodeMirror-scroll{overflow-y:hidden;overflow-x:auto;}
66 68 @-moz-document url-prefix(){.CodeMirror-scroll{overflow-x:hidden;}}.CodeMirror-lines{padding:0.4em;}
67 69 .CodeMirror-linenumber{padding:0 8px 0 4px;}
68 70 .CodeMirror-gutters{border-bottom-left-radius:4px;border-top-left-radius:4px;}
69 71 .CodeMirror pre{padding:0;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
70 72 pre code{display:block;padding:0.5em;}
71 73 .highlight-base,pre code,pre .subst,pre .tag .title,pre .lisp .title,pre .clojure .built_in,pre .nginx .title{color:black;}
72 74 .highlight-string,pre .string,pre .constant,pre .parent,pre .tag .value,pre .rules .value,pre .rules .value .number,pre .preprocessor,pre .ruby .symbol,pre .ruby .symbol .string,pre .aggregate,pre .template_tag,pre .django .variable,pre .smalltalk .class,pre .addition,pre .flow,pre .stream,pre .bash .variable,pre .apache .tag,pre .apache .cbracket,pre .tex .command,pre .tex .special,pre .erlang_repl .function_or_atom,pre .markdown .header{color:#BA2121;}
73 75 .highlight-comment,pre .comment,pre .annotation,pre .template_comment,pre .diff .header,pre .chunk,pre .markdown .blockquote{color:#408080;font-style:italic;}
74 76 .highlight-number,pre .number,pre .date,pre .regexp,pre .literal,pre .smalltalk .symbol,pre .smalltalk .char,pre .go .constant,pre .change,pre .markdown .bullet,pre .markdown .link_url{color:#080;}
75 77 pre .label,pre .javadoc,pre .ruby .string,pre .decorator,pre .filter .argument,pre .localvars,pre .array,pre .attr_selector,pre .important,pre .pseudo,pre .pi,pre .doctype,pre .deletion,pre .envvar,pre .shebang,pre .apache .sqbracket,pre .nginx .built_in,pre .tex .formula,pre .erlang_repl .reserved,pre .prompt,pre .markdown .link_label,pre .vhdl .attribute,pre .clojure .attribute,pre .coffeescript .property{color:#8888ff;}
76 78 .highlight-keyword,pre .keyword,pre .id,pre .phpdoc,pre .aggregate,pre .css .tag,pre .javadoctag,pre .phpdoc,pre .yardoctag,pre .smalltalk .class,pre .winutils,pre .bash .variable,pre .apache .tag,pre .go .typename,pre .tex .command,pre .markdown .strong,pre .request,pre .status{color:#008000;font-weight:bold;}
77 79 .highlight-builtin,pre .built_in{color:#008000;}
78 80 pre .markdown .emphasis{font-style:italic;}
79 81 pre .nginx .built_in{font-weight:normal;}
80 82 pre .coffeescript .javascript,pre .javascript .xml,pre .tex .formula,pre .xml .javascript,pre .xml .vbscript,pre .xml .css,pre .xml .cdata{opacity:0.5;}
81 83 .cm-s-ipython span.cm-variable{color:black;}
82 84 .cm-s-ipython span.cm-keyword{color:#008000;font-weight:bold;}
83 85 .cm-s-ipython span.cm-number{color:#080;}
84 86 .cm-s-ipython span.cm-comment{color:#408080;font-style:italic;}
85 87 .cm-s-ipython span.cm-string{color:#BA2121;}
86 88 .cm-s-ipython span.cm-builtin{color:#008000;}
87 89 .cm-s-ipython span.cm-error{color:#f00;}
88 90 .cm-s-ipython span.cm-operator{color:#AA22FF;font-weight:bold;}
89 91 .cm-s-ipython span.cm-meta{color:#AA22FF;}
90 92 .cm-s-ipython span.cm-tab{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);background-position:right;background-repeat:no-repeat;}
91 93 div.output_wrapper{position:relative;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
92 94 div.output_scroll{height:24em;width:100%;overflow:auto;border-radius:4px;-webkit-box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);-moz-box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);}
93 95 div.output_collapsed{margin:0px;padding:0px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
94 96 div.out_prompt_overlay{height:100%;padding:0px 0.4em;position:absolute;border-radius:4px;}
95 97 div.out_prompt_overlay:hover{-webkit-box-shadow:inset 0 0 1px #000000;-moz-box-shadow:inset 0 0 1px #000000;box-shadow:inset 0 0 1px #000000;background:rgba(240, 240, 240, 0.5);}
96 98 div.output_prompt{color:darkred;}
97 99 div.output_area{padding:0px;page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}div.output_area .MathJax_Display{text-align:left !important;}
98 100 div.output_area .rendered_html table{margin-left:0;margin-right:0;}
99 101 div.output_area .rendered_html img{margin-left:0;margin-right:0;}
100 102 .output{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
101 103 div.output_area pre{font-family:monospace;margin:0;padding:0;border:0;font-size:100%;vertical-align:baseline;color:black;background-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;line-height:inherit;}
102 104 div.output_subarea{padding:0.4em 0.4em 0em 0.4em;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
103 105 div.output_text{text-align:left;color:#000000;font-family:monospace;line-height:1.231em;}
104 106 div.output_stderr{background:#fdd;}
105 107 div.output_latex{text-align:left;}
106 108 div.output_javascript:empty{padding:0;}
107 109 .js-error{color:darkred;}
108 110 div.raw_input{padding-top:0px;padding-bottom:0px;height:1em;line-height:1em;font-family:monospace;}
109 111 span.input_prompt{font-family:inherit;}
110 112 input.raw_input{font-family:inherit;font-size:inherit;color:inherit;width:auto;margin:-2px 0px 0px 1px;padding-left:1px;padding-top:2px;height:1em;}
111 113 p.p-space{margin-bottom:10px;}
112 114 .rendered_html{color:black;}.rendered_html em{font-style:italic;}
113 115 .rendered_html strong{font-weight:bold;}
114 116 .rendered_html u{text-decoration:underline;}
115 117 .rendered_html :link{text-decoration:underline;}
116 118 .rendered_html :visited{text-decoration:underline;}
117 119 .rendered_html h1{font-size:197%;margin:.65em 0;font-weight:bold;}
118 120 .rendered_html h2{font-size:153.9%;margin:.75em 0;font-weight:bold;}
119 121 .rendered_html h3{font-size:123.1%;margin:.85em 0;font-weight:bold;}
120 122 .rendered_html h4{font-size:100%;margin:0.95em 0;font-weight:bold;}
121 123 .rendered_html h5{font-size:85%;margin:1.5em 0;font-weight:bold;}
122 124 .rendered_html h6{font-size:77%;margin:1.65em 0;font-weight:bold;}
123 125 .rendered_html ul{list-style:disc;margin:1em 2em;}
124 126 .rendered_html ul ul{list-style:square;margin:0em 2em;}
125 127 .rendered_html ul ul ul{list-style:circle;margin:0em 2em;}
126 128 .rendered_html ol{list-style:decimal;margin:1em 2em;}
127 129 .rendered_html ol ol{list-style:upper-alpha;margin:0em 2em;}
128 130 .rendered_html ol ol ol{list-style:lower-alpha;margin:0em 2em;}
129 131 .rendered_html ol ol ol ol{list-style:lower-roman;margin:0em 2em;}
130 132 .rendered_html ol ol ol ol ol{list-style:decimal;margin:0em 2em;}
131 133 .rendered_html hr{color:black;background-color:black;}
132 134 .rendered_html pre{margin:1em 2em;}
133 135 .rendered_html pre,.rendered_html code{border:0;background-color:#ffffff;color:#000000;font-size:100%;padding:0px;}
134 136 .rendered_html blockquote{margin:1em 2em;}
135 137 .rendered_html table{margin-left:auto;margin-right:auto;border:1px solid black;border-collapse:collapse;}
136 138 .rendered_html tr,.rendered_html th,.rendered_html td{border:1px solid black;border-collapse:collapse;margin:1em 2em;}
137 139 .rendered_html td,.rendered_html th{text-align:left;vertical-align:middle;padding:4px;}
138 140 .rendered_html th{font-weight:bold;}
139 141 .rendered_html p{text-align:justify;}
140 142 .rendered_html img{display:block;margin-left:auto;margin-right:auto;}
141 143 .rendered_html *+p{margin-top:1em;}
142 144 .rendered_html *+table{margin-top:1em;}
143 145 .rendered_html *+img{margin-top:1em;}
144 146 div.text_cell{padding:5px 5px 5px 0px;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
145 147 div.text_cell_input{color:#000000;border:1px solid #cfcfcf;border-radius:4px;background:#f7f7f7;}
146 148 div.text_cell_render{outline:none;resize:none;width:inherit;border-style:none;padding:5px;color:#000000;}
147 149 a.anchor-link:link{text-decoration:none;padding:0px 20px;visibility:hidden;}
148 150 h1:hover .anchor-link,h2:hover .anchor-link,h3:hover .anchor-link,h4:hover .anchor-link,h5:hover .anchor-link,h6:hover .anchor-link{visibility:visible;}
@@ -1,1581 +1,1583 b''
1 1 .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
2 2 .clearfix:after{clear:both;}
3 3 .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
4 4 .input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
5 5 article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
6 6 audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
7 7 audio:not([controls]){display:none;}
8 8 html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
9 9 a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
10 10 a:hover,a:active{outline:0;}
11 11 sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
12 12 sup{top:-0.5em;}
13 13 sub{bottom:-0.25em;}
14 14 img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
15 15 #map_canvas img,.google-maps img{max-width:none;}
16 16 button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
17 17 button,input{*overflow:visible;line-height:normal;}
18 18 button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
19 19 button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}
20 20 label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer;}
21 21 input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
22 22 input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
23 23 textarea{overflow:auto;vertical-align:top;}
24 24 @media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} a,a:visited{text-decoration:underline;} a[href]:after{content:" (" attr(href) ")";} abbr[title]:after{content:" (" attr(title) ")";} .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:"";} pre,blockquote{border:1px solid #999;page-break-inside:avoid;} thead{display:table-header-group;} tr,img{page-break-inside:avoid;} img{max-width:100% !important;} @page {margin:0.5cm;}p,h2,h3{orphans:3;widows:3;} h2,h3{page-break-after:avoid;}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:20px;color:#000000;background-color:#ffffff;}
25 25 a{color:#0088cc;text-decoration:none;}
26 26 a:hover,a:focus{color:#005580;text-decoration:underline;}
27 27 .img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
28 28 .img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);}
29 29 .img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;}
30 30 .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
31 31 .row:after{clear:both;}
32 32 .row:before,.row:after{display:table;content:"";line-height:0;}
33 33 .row:after{clear:both;}
34 34 [class*="span"]{float:left;min-height:1px;margin-left:20px;}
35 35 .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
36 36 .span12{width:940px;}
37 37 .span11{width:860px;}
38 38 .span10{width:780px;}
39 39 .span9{width:700px;}
40 40 .span8{width:620px;}
41 41 .span7{width:540px;}
42 42 .span6{width:460px;}
43 43 .span5{width:380px;}
44 44 .span4{width:300px;}
45 45 .span3{width:220px;}
46 46 .span2{width:140px;}
47 47 .span1{width:60px;}
48 48 .offset12{margin-left:980px;}
49 49 .offset11{margin-left:900px;}
50 50 .offset10{margin-left:820px;}
51 51 .offset9{margin-left:740px;}
52 52 .offset8{margin-left:660px;}
53 53 .offset7{margin-left:580px;}
54 54 .offset6{margin-left:500px;}
55 55 .offset5{margin-left:420px;}
56 56 .offset4{margin-left:340px;}
57 57 .offset3{margin-left:260px;}
58 58 .offset2{margin-left:180px;}
59 59 .offset1{margin-left:100px;}
60 60 .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
61 61 .row:after{clear:both;}
62 62 .row:before,.row:after{display:table;content:"";line-height:0;}
63 63 .row:after{clear:both;}
64 64 [class*="span"]{float:left;min-height:1px;margin-left:20px;}
65 65 .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
66 66 .span12{width:940px;}
67 67 .span11{width:860px;}
68 68 .span10{width:780px;}
69 69 .span9{width:700px;}
70 70 .span8{width:620px;}
71 71 .span7{width:540px;}
72 72 .span6{width:460px;}
73 73 .span5{width:380px;}
74 74 .span4{width:300px;}
75 75 .span3{width:220px;}
76 76 .span2{width:140px;}
77 77 .span1{width:60px;}
78 78 .offset12{margin-left:980px;}
79 79 .offset11{margin-left:900px;}
80 80 .offset10{margin-left:820px;}
81 81 .offset9{margin-left:740px;}
82 82 .offset8{margin-left:660px;}
83 83 .offset7{margin-left:580px;}
84 84 .offset6{margin-left:500px;}
85 85 .offset5{margin-left:420px;}
86 86 .offset4{margin-left:340px;}
87 87 .offset3{margin-left:260px;}
88 88 .offset2{margin-left:180px;}
89 89 .offset1{margin-left:100px;}
90 90 .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
91 91 .row-fluid:after{clear:both;}
92 92 .row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
93 93 .row-fluid:after{clear:both;}
94 94 .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;}
95 95 .row-fluid [class*="span"]:first-child{margin-left:0;}
96 96 .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;}
97 97 .row-fluid .span12{width:100%;*width:99.94680851063829%;}
98 98 .row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;}
99 99 .row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;}
100 100 .row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;}
101 101 .row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;}
102 102 .row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;}
103 103 .row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;}
104 104 .row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;}
105 105 .row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;}
106 106 .row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;}
107 107 .row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;}
108 108 .row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;}
109 109 .row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;}
110 110 .row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;}
111 111 .row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;}
112 112 .row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;}
113 113 .row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;}
114 114 .row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;}
115 115 .row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;}
116 116 .row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;}
117 117 .row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;}
118 118 .row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;}
119 119 .row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;}
120 120 .row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;}
121 121 .row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;}
122 122 .row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;}
123 123 .row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;}
124 124 .row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;}
125 125 .row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;}
126 126 .row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;}
127 127 .row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;}
128 128 .row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;}
129 129 .row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;}
130 130 .row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;}
131 131 .row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;}
132 132 .row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;}
133 133 .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
134 134 .row-fluid:after{clear:both;}
135 135 .row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
136 136 .row-fluid:after{clear:both;}
137 137 .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;}
138 138 .row-fluid [class*="span"]:first-child{margin-left:0;}
139 139 .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;}
140 140 .row-fluid .span12{width:100%;*width:99.94680851063829%;}
141 141 .row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;}
142 142 .row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;}
143 143 .row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;}
144 144 .row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;}
145 145 .row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;}
146 146 .row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;}
147 147 .row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;}
148 148 .row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;}
149 149 .row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;}
150 150 .row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;}
151 151 .row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;}
152 152 .row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;}
153 153 .row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;}
154 154 .row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;}
155 155 .row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;}
156 156 .row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;}
157 157 .row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;}
158 158 .row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;}
159 159 .row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;}
160 160 .row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;}
161 161 .row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;}
162 162 .row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;}
163 163 .row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;}
164 164 .row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;}
165 165 .row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;}
166 166 .row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;}
167 167 .row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;}
168 168 .row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;}
169 169 .row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;}
170 170 .row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;}
171 171 .row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;}
172 172 .row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;}
173 173 .row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;}
174 174 .row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;}
175 175 .row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;}
176 176 [class*="span"].hide,.row-fluid [class*="span"].hide{display:none;}
177 177 [class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;}
178 178 .container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;}
179 179 .container:after{clear:both;}
180 180 .container:before,.container:after{display:table;content:"";line-height:0;}
181 181 .container:after{clear:both;}
182 182 .container:before,.container:after{display:table;content:"";line-height:0;}
183 183 .container:after{clear:both;}
184 184 .container:before,.container:after{display:table;content:"";line-height:0;}
185 185 .container:after{clear:both;}
186 186 .container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
187 187 .container-fluid:after{clear:both;}
188 188 .container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
189 189 .container-fluid:after{clear:both;}
190 190 p{margin:0 0 10px;}
191 191 .lead{margin-bottom:20px;font-size:19.5px;font-weight:200;line-height:30px;}
192 192 small{font-size:85%;}
193 193 strong{font-weight:bold;}
194 194 em{font-style:italic;}
195 195 cite{font-style:normal;}
196 196 .muted{color:#999999;}
197 197 a.muted:hover,a.muted:focus{color:#808080;}
198 198 .text-warning{color:#c09853;}
199 199 a.text-warning:hover,a.text-warning:focus{color:#a47e3c;}
200 200 .text-error{color:#b94a48;}
201 201 a.text-error:hover,a.text-error:focus{color:#953b39;}
202 202 .text-info{color:#3a87ad;}
203 203 a.text-info:hover,a.text-info:focus{color:#2d6987;}
204 204 .text-success{color:#468847;}
205 205 a.text-success:hover,a.text-success:focus{color:#356635;}
206 206 .text-left{text-align:left;}
207 207 .text-right{text-align:right;}
208 208 .text-center{text-align:center;}
209 209 h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;}
210 210 h1,h2,h3{line-height:40px;}
211 211 h1{font-size:35.75px;}
212 212 h2{font-size:29.25px;}
213 213 h3{font-size:22.75px;}
214 214 h4{font-size:16.25px;}
215 215 h5{font-size:13px;}
216 216 h6{font-size:11.049999999999999px;}
217 217 h1 small{font-size:22.75px;}
218 218 h2 small{font-size:16.25px;}
219 219 h3 small{font-size:13px;}
220 220 h4 small{font-size:13px;}
221 221 .page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;}
222 222 ul,ol{padding:0;margin:0 0 10px 25px;}
223 223 ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
224 224 li{line-height:20px;}
225 225 ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
226 226 ul.inline,ol.inline{margin-left:0;list-style:none;}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;*zoom:1;padding-left:5px;padding-right:5px;}
227 227 dl{margin-bottom:20px;}
228 228 dt,dd{line-height:20px;}
229 229 dt{font-weight:bold;}
230 230 dd{margin-left:10px;}
231 231 .dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;}
232 232 .dl-horizontal:after{clear:both;}
233 233 .dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;}
234 234 .dl-horizontal:after{clear:both;}
235 235 .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
236 236 .dl-horizontal dd{margin-left:180px;}
237 237 hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
238 238 abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;}
239 239 abbr.initialism{font-size:90%;text-transform:uppercase;}
240 240 blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16.25px;font-weight:300;line-height:1.25;}
241 241 blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
242 242 blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
243 243 blockquote.pull-right small:before{content:'';}
244 244 blockquote.pull-right small:after{content:'\00A0 \2014';}
245 245 q:before,q:after,blockquote:before,blockquote:after{content:"";}
246 246 address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;}
247 247 code,pre{padding:0 3px 2px;font-family:monospace;font-size:11px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
248 248 code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap;}
249 249 pre{display:block;padding:9.5px;margin:0 0 10px;font-size:12px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;}
250 250 pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0;}
251 251 .pre-scrollable{max-height:340px;overflow-y:scroll;}
252 252 form{margin:0 0 20px;}
253 253 fieldset{padding:0;margin:0;border:0;}
254 254 legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:19.5px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;}
255 255 label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:20px;}
256 256 input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
257 257 label{display:block;margin-bottom:5px;}
258 258 select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:13px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;}
259 259 input,textarea,.uneditable-input{width:206px;}
260 260 textarea{height:auto;}
261 261 textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);}
262 262 input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;}
263 263 input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
264 264 select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;}
265 265 select{width:220px;border:1px solid #cccccc;background-color:#ffffff;}
266 266 select[multiple],select[size]{height:auto;}
267 267 select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
268 268 .uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
269 269 .uneditable-input{overflow:hidden;white-space:nowrap;}
270 270 .uneditable-textarea{width:auto;height:auto;}
271 271 input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
272 272 input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
273 273 input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
274 274 input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
275 275 input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
276 276 input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
277 277 .radio,.checkbox{min-height:20px;padding-left:20px;}
278 278 .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;}
279 279 .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
280 280 .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
281 281 .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
282 282 .input-mini{width:60px;}
283 283 .input-small{width:90px;}
284 284 .input-medium{width:150px;}
285 285 .input-large{width:210px;}
286 286 .input-xlarge{width:270px;}
287 287 .input-xxlarge{width:530px;}
288 288 input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
289 289 .input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
290 290 input,textarea,.uneditable-input{margin-left:0;}
291 291 .controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
292 292 input.span12,textarea.span12,.uneditable-input.span12{width:926px;}
293 293 input.span11,textarea.span11,.uneditable-input.span11{width:846px;}
294 294 input.span10,textarea.span10,.uneditable-input.span10{width:766px;}
295 295 input.span9,textarea.span9,.uneditable-input.span9{width:686px;}
296 296 input.span8,textarea.span8,.uneditable-input.span8{width:606px;}
297 297 input.span7,textarea.span7,.uneditable-input.span7{width:526px;}
298 298 input.span6,textarea.span6,.uneditable-input.span6{width:446px;}
299 299 input.span5,textarea.span5,.uneditable-input.span5{width:366px;}
300 300 input.span4,textarea.span4,.uneditable-input.span4{width:286px;}
301 301 input.span3,textarea.span3,.uneditable-input.span3{width:206px;}
302 302 input.span2,textarea.span2,.uneditable-input.span2{width:126px;}
303 303 input.span1,textarea.span1,.uneditable-input.span1{width:46px;}
304 304 input,textarea,.uneditable-input{margin-left:0;}
305 305 .controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
306 306 input.span12,textarea.span12,.uneditable-input.span12{width:926px;}
307 307 input.span11,textarea.span11,.uneditable-input.span11{width:846px;}
308 308 input.span10,textarea.span10,.uneditable-input.span10{width:766px;}
309 309 input.span9,textarea.span9,.uneditable-input.span9{width:686px;}
310 310 input.span8,textarea.span8,.uneditable-input.span8{width:606px;}
311 311 input.span7,textarea.span7,.uneditable-input.span7{width:526px;}
312 312 input.span6,textarea.span6,.uneditable-input.span6{width:446px;}
313 313 input.span5,textarea.span5,.uneditable-input.span5{width:366px;}
314 314 input.span4,textarea.span4,.uneditable-input.span4{width:286px;}
315 315 input.span3,textarea.span3,.uneditable-input.span3{width:206px;}
316 316 input.span2,textarea.span2,.uneditable-input.span2{width:126px;}
317 317 input.span1,textarea.span1,.uneditable-input.span1{width:46px;}
318 318 .controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
319 319 .controls-row:after{clear:both;}
320 320 .controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
321 321 .controls-row:after{clear:both;}
322 322 .controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;}
323 323 .controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;}
324 324 input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;}
325 325 input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
326 326 .control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
327 327 .control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;}
328 328 .control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;}
329 329 .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
330 330 .control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
331 331 .control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;}
332 332 .control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;}
333 333 .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
334 334 .control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
335 335 .control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;}
336 336 .control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;}
337 337 .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
338 338 .control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
339 339 .control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;}
340 340 .control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;}
341 341 .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
342 342 .control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
343 343 .control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;}
344 344 .control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;}
345 345 .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
346 346 .control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
347 347 .control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;}
348 348 .control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;}
349 349 .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
350 350 .control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;}
351 351 .control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;}
352 352 .control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;}
353 353 .control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;}
354 354 .control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;}
355 355 .control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;}
356 356 .control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;}
357 357 .control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;}
358 358 input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
359 359 .form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
360 360 .form-actions:after{clear:both;}
361 361 .form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
362 362 .form-actions:after{clear:both;}
363 363 .help-block,.help-inline{color:#262626;}
364 364 .help-block{display:block;margin-bottom:10px;}
365 365 .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
366 366 .input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:13px;}
367 367 .input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;}
368 368 .input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:13px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;}
369 369 .input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
370 370 .input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;}
371 371 .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
372 372 .input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
373 373 .input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
374 374 .input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;}
375 375 .input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
376 376 .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
377 377 .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
378 378 .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
379 379 .input-prepend.input-append .btn-group:first-child{margin-left:0;}
380 380 input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
381 381 .form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
382 382 .form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
383 383 .form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
384 384 .form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
385 385 .form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
386 386 .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;}
387 387 .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
388 388 .form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;}
389 389 .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
390 390 .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
391 391 .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
392 392 .control-group{margin-bottom:10px;}
393 393 legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;}
394 394 .form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
395 395 .form-horizontal .control-group:after{clear:both;}
396 396 .form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
397 397 .form-horizontal .control-group:after{clear:both;}
398 398 .form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;}
399 399 .form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;}
400 400 .form-horizontal .help-block{margin-bottom:0;}
401 401 .form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px;}
402 402 .form-horizontal .form-actions{padding-left:180px;}
403 403 table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
404 404 .table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
405 405 .table th{font-weight:bold;}
406 406 .table thead th{vertical-align:bottom;}
407 407 .table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
408 408 .table tbody+tbody{border-top:2px solid #dddddd;}
409 409 .table .table{background-color:#ffffff;}
410 410 .table-condensed th,.table-condensed td{padding:4px 5px;}
411 411 .table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
412 412 .table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
413 413 .table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
414 414 .table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;}
415 415 .table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
416 416 .table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
417 417 .table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;}
418 418 .table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;}
419 419 .table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
420 420 .table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;}
421 421 .table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9;}
422 422 .table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5;}
423 423 table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;}
424 424 .table td.span1,.table th.span1{float:none;width:44px;margin-left:0;}
425 425 .table td.span2,.table th.span2{float:none;width:124px;margin-left:0;}
426 426 .table td.span3,.table th.span3{float:none;width:204px;margin-left:0;}
427 427 .table td.span4,.table th.span4{float:none;width:284px;margin-left:0;}
428 428 .table td.span5,.table th.span5{float:none;width:364px;margin-left:0;}
429 429 .table td.span6,.table th.span6{float:none;width:444px;margin-left:0;}
430 430 .table td.span7,.table th.span7{float:none;width:524px;margin-left:0;}
431 431 .table td.span8,.table th.span8{float:none;width:604px;margin-left:0;}
432 432 .table td.span9,.table th.span9{float:none;width:684px;margin-left:0;}
433 433 .table td.span10,.table th.span10{float:none;width:764px;margin-left:0;}
434 434 .table td.span11,.table th.span11{float:none;width:844px;margin-left:0;}
435 435 .table td.span12,.table th.span12{float:none;width:924px;margin-left:0;}
436 436 .table tbody tr.success>td{background-color:#dff0d8;}
437 437 .table tbody tr.error>td{background-color:#f2dede;}
438 438 .table tbody tr.warning>td{background-color:#fcf8e3;}
439 439 .table tbody tr.info>td{background-color:#d9edf7;}
440 440 .table-hover tbody tr.success:hover>td{background-color:#d0e9c6;}
441 441 .table-hover tbody tr.error:hover>td{background-color:#ebcccc;}
442 442 .table-hover tbody tr.warning:hover>td{background-color:#faf2cc;}
443 443 .table-hover tbody tr.info:hover>td{background-color:#c4e3f3;}
444 444 [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;}
445 445 .icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");}
446 446 .icon-glass{background-position:0 0;}
447 447 .icon-music{background-position:-24px 0;}
448 448 .icon-search{background-position:-48px 0;}
449 449 .icon-envelope{background-position:-72px 0;}
450 450 .icon-heart{background-position:-96px 0;}
451 451 .icon-star{background-position:-120px 0;}
452 452 .icon-star-empty{background-position:-144px 0;}
453 453 .icon-user{background-position:-168px 0;}
454 454 .icon-film{background-position:-192px 0;}
455 455 .icon-th-large{background-position:-216px 0;}
456 456 .icon-th{background-position:-240px 0;}
457 457 .icon-th-list{background-position:-264px 0;}
458 458 .icon-ok{background-position:-288px 0;}
459 459 .icon-remove{background-position:-312px 0;}
460 460 .icon-zoom-in{background-position:-336px 0;}
461 461 .icon-zoom-out{background-position:-360px 0;}
462 462 .icon-off{background-position:-384px 0;}
463 463 .icon-signal{background-position:-408px 0;}
464 464 .icon-cog{background-position:-432px 0;}
465 465 .icon-trash{background-position:-456px 0;}
466 466 .icon-home{background-position:0 -24px;}
467 467 .icon-file{background-position:-24px -24px;}
468 468 .icon-time{background-position:-48px -24px;}
469 469 .icon-road{background-position:-72px -24px;}
470 470 .icon-download-alt{background-position:-96px -24px;}
471 471 .icon-download{background-position:-120px -24px;}
472 472 .icon-upload{background-position:-144px -24px;}
473 473 .icon-inbox{background-position:-168px -24px;}
474 474 .icon-play-circle{background-position:-192px -24px;}
475 475 .icon-repeat{background-position:-216px -24px;}
476 476 .icon-refresh{background-position:-240px -24px;}
477 477 .icon-list-alt{background-position:-264px -24px;}
478 478 .icon-lock{background-position:-287px -24px;}
479 479 .icon-flag{background-position:-312px -24px;}
480 480 .icon-headphones{background-position:-336px -24px;}
481 481 .icon-volume-off{background-position:-360px -24px;}
482 482 .icon-volume-down{background-position:-384px -24px;}
483 483 .icon-volume-up{background-position:-408px -24px;}
484 484 .icon-qrcode{background-position:-432px -24px;}
485 485 .icon-barcode{background-position:-456px -24px;}
486 486 .icon-tag{background-position:0 -48px;}
487 487 .icon-tags{background-position:-25px -48px;}
488 488 .icon-book{background-position:-48px -48px;}
489 489 .icon-bookmark{background-position:-72px -48px;}
490 490 .icon-print{background-position:-96px -48px;}
491 491 .icon-camera{background-position:-120px -48px;}
492 492 .icon-font{background-position:-144px -48px;}
493 493 .icon-bold{background-position:-167px -48px;}
494 494 .icon-italic{background-position:-192px -48px;}
495 495 .icon-text-height{background-position:-216px -48px;}
496 496 .icon-text-width{background-position:-240px -48px;}
497 497 .icon-align-left{background-position:-264px -48px;}
498 498 .icon-align-center{background-position:-288px -48px;}
499 499 .icon-align-right{background-position:-312px -48px;}
500 500 .icon-align-justify{background-position:-336px -48px;}
501 501 .icon-list{background-position:-360px -48px;}
502 502 .icon-indent-left{background-position:-384px -48px;}
503 503 .icon-indent-right{background-position:-408px -48px;}
504 504 .icon-facetime-video{background-position:-432px -48px;}
505 505 .icon-picture{background-position:-456px -48px;}
506 506 .icon-pencil{background-position:0 -72px;}
507 507 .icon-map-marker{background-position:-24px -72px;}
508 508 .icon-adjust{background-position:-48px -72px;}
509 509 .icon-tint{background-position:-72px -72px;}
510 510 .icon-edit{background-position:-96px -72px;}
511 511 .icon-share{background-position:-120px -72px;}
512 512 .icon-check{background-position:-144px -72px;}
513 513 .icon-move{background-position:-168px -72px;}
514 514 .icon-step-backward{background-position:-192px -72px;}
515 515 .icon-fast-backward{background-position:-216px -72px;}
516 516 .icon-backward{background-position:-240px -72px;}
517 517 .icon-play{background-position:-264px -72px;}
518 518 .icon-pause{background-position:-288px -72px;}
519 519 .icon-stop{background-position:-312px -72px;}
520 520 .icon-forward{background-position:-336px -72px;}
521 521 .icon-fast-forward{background-position:-360px -72px;}
522 522 .icon-step-forward{background-position:-384px -72px;}
523 523 .icon-eject{background-position:-408px -72px;}
524 524 .icon-chevron-left{background-position:-432px -72px;}
525 525 .icon-chevron-right{background-position:-456px -72px;}
526 526 .icon-plus-sign{background-position:0 -96px;}
527 527 .icon-minus-sign{background-position:-24px -96px;}
528 528 .icon-remove-sign{background-position:-48px -96px;}
529 529 .icon-ok-sign{background-position:-72px -96px;}
530 530 .icon-question-sign{background-position:-96px -96px;}
531 531 .icon-info-sign{background-position:-120px -96px;}
532 532 .icon-screenshot{background-position:-144px -96px;}
533 533 .icon-remove-circle{background-position:-168px -96px;}
534 534 .icon-ok-circle{background-position:-192px -96px;}
535 535 .icon-ban-circle{background-position:-216px -96px;}
536 536 .icon-arrow-left{background-position:-240px -96px;}
537 537 .icon-arrow-right{background-position:-264px -96px;}
538 538 .icon-arrow-up{background-position:-289px -96px;}
539 539 .icon-arrow-down{background-position:-312px -96px;}
540 540 .icon-share-alt{background-position:-336px -96px;}
541 541 .icon-resize-full{background-position:-360px -96px;}
542 542 .icon-resize-small{background-position:-384px -96px;}
543 543 .icon-plus{background-position:-408px -96px;}
544 544 .icon-minus{background-position:-433px -96px;}
545 545 .icon-asterisk{background-position:-456px -96px;}
546 546 .icon-exclamation-sign{background-position:0 -120px;}
547 547 .icon-gift{background-position:-24px -120px;}
548 548 .icon-leaf{background-position:-48px -120px;}
549 549 .icon-fire{background-position:-72px -120px;}
550 550 .icon-eye-open{background-position:-96px -120px;}
551 551 .icon-eye-close{background-position:-120px -120px;}
552 552 .icon-warning-sign{background-position:-144px -120px;}
553 553 .icon-plane{background-position:-168px -120px;}
554 554 .icon-calendar{background-position:-192px -120px;}
555 555 .icon-random{background-position:-216px -120px;width:16px;}
556 556 .icon-comment{background-position:-240px -120px;}
557 557 .icon-magnet{background-position:-264px -120px;}
558 558 .icon-chevron-up{background-position:-288px -120px;}
559 559 .icon-chevron-down{background-position:-313px -119px;}
560 560 .icon-retweet{background-position:-336px -120px;}
561 561 .icon-shopping-cart{background-position:-360px -120px;}
562 562 .icon-folder-close{background-position:-384px -120px;width:16px;}
563 563 .icon-folder-open{background-position:-408px -120px;width:16px;}
564 564 .icon-resize-vertical{background-position:-432px -119px;}
565 565 .icon-resize-horizontal{background-position:-456px -118px;}
566 566 .icon-hdd{background-position:0 -144px;}
567 567 .icon-bullhorn{background-position:-24px -144px;}
568 568 .icon-bell{background-position:-48px -144px;}
569 569 .icon-certificate{background-position:-72px -144px;}
570 570 .icon-thumbs-up{background-position:-96px -144px;}
571 571 .icon-thumbs-down{background-position:-120px -144px;}
572 572 .icon-hand-right{background-position:-144px -144px;}
573 573 .icon-hand-left{background-position:-168px -144px;}
574 574 .icon-hand-up{background-position:-192px -144px;}
575 575 .icon-hand-down{background-position:-216px -144px;}
576 576 .icon-circle-arrow-right{background-position:-240px -144px;}
577 577 .icon-circle-arrow-left{background-position:-264px -144px;}
578 578 .icon-circle-arrow-up{background-position:-288px -144px;}
579 579 .icon-circle-arrow-down{background-position:-312px -144px;}
580 580 .icon-globe{background-position:-336px -144px;}
581 581 .icon-wrench{background-position:-360px -144px;}
582 582 .icon-tasks{background-position:-384px -144px;}
583 583 .icon-filter{background-position:-408px -144px;}
584 584 .icon-briefcase{background-position:-432px -144px;}
585 585 .icon-fullscreen{background-position:-456px -144px;}
586 586 .dropup,.dropdown{position:relative;}
587 587 .dropdown-toggle{*margin-bottom:-3px;}
588 588 .dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
589 589 .caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";}
590 590 .dropdown .caret{margin-top:8px;margin-left:2px;}
591 591 .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;}
592 592 .dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
593 593 .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;}
594 594 .dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);}
595 595 .dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);}
596 596 .dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999;}
597 597 .dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default;}
598 598 .open{*z-index:1000;}.open>.dropdown-menu{display:block;}
599 599 .dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990;}
600 600 .pull-right>.dropdown-menu{right:0;left:auto;}
601 601 .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";}
602 602 .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
603 603 .dropdown-submenu{position:relative;}
604 604 .dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
605 605 .dropdown-submenu:hover>.dropdown-menu{display:block;}
606 606 .dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;}
607 607 .dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
608 608 .dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
609 609 .dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
610 610 .dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;}
611 611 .typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
612 612 .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
613 613 .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
614 614 .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
615 615 .fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;}
616 616 .collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;}
617 617 .close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
618 618 button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
619 619 .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:13px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #cccccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;}
620 620 .btn:active,.btn.active{background-color:#cccccc \9;}
621 621 .btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;}
622 622 .btn:active,.btn.active{background-color:#cccccc \9;}
623 623 .btn:first-child{*margin-left:0;}
624 624 .btn:first-child{*margin-left:0;}
625 625 .btn:hover,.btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
626 626 .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
627 627 .btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
628 628 .btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
629 629 .btn-large{padding:11px 19px;font-size:16.25px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
630 630 .btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;}
631 631 .btn-small{padding:2px 10px;font-size:11.049999999999999px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
632 632 .btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;}
633 633 .btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px;}
634 634 .btn-mini{padding:0 6px;font-size:9.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
635 635 .btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
636 636 .btn-block+.btn-block{margin-top:5px;}
637 637 input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;}
638 638 .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
639 639 .btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;}
640 640 .btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
641 641 .btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;}
642 642 .btn-primary:active,.btn-primary.active{background-color:#003399 \9;}
643 643 .btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;}
644 644 .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
645 645 .btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;}
646 646 .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
647 647 .btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;}
648 648 .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
649 649 .btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;}
650 650 .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
651 651 .btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;}
652 652 .btn-success:active,.btn-success.active{background-color:#408140 \9;}
653 653 .btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;}
654 654 .btn-success:active,.btn-success.active{background-color:#408140 \9;}
655 655 .btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;}
656 656 .btn-info:active,.btn-info.active{background-color:#24748c \9;}
657 657 .btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;}
658 658 .btn-info:active,.btn-info.active{background-color:#24748c \9;}
659 659 .btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;}
660 660 .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
661 661 .btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;}
662 662 .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
663 663 button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
664 664 button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
665 665 button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
666 666 button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
667 667 .btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
668 668 .btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
669 669 .btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent;}
670 670 .btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333333;text-decoration:none;}
671 671 .btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;}
672 672 .btn-group:first-child{*margin-left:0;}
673 673 .btn-group+.btn-group{margin-left:5px;}
674 674 .btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px;}
675 675 .btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
676 676 .btn-group>.btn+.btn{margin-left:-1px;}
677 677 .btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:13px;}
678 678 .btn-group>.btn-mini{font-size:9.75px;}
679 679 .btn-group>.btn-small{font-size:11.049999999999999px;}
680 680 .btn-group>.btn-large{font-size:16.25px;}
681 681 .btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
682 682 .btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
683 683 .btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
684 684 .btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
685 685 .btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
686 686 .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
687 687 .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;}
688 688 .btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;}
689 689 .btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;}
690 690 .btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;}
691 691 .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
692 692 .btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
693 693 .btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;}
694 694 .btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;}
695 695 .btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
696 696 .btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
697 697 .btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
698 698 .btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
699 699 .btn .caret{margin-top:8px;margin-left:0;}
700 700 .btn-large .caret{margin-top:6px;}
701 701 .btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;}
702 702 .btn-mini .caret,.btn-small .caret{margin-top:8px;}
703 703 .dropup .btn-large .caret{border-bottom-width:5px;}
704 704 .btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
705 705 .btn-group-vertical{display:inline-block;*display:inline;*zoom:1;}
706 706 .btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
707 707 .btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;}
708 708 .btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
709 709 .btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
710 710 .btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;}
711 711 .btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
712 712 .alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
713 713 .alert,.alert h4{color:#c09853;}
714 714 .alert h4{margin:0;}
715 715 .alert .close{position:relative;top:-2px;right:-21px;line-height:20px;}
716 716 .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}
717 717 .alert-success h4{color:#468847;}
718 718 .alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}
719 719 .alert-danger h4,.alert-error h4{color:#b94a48;}
720 720 .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}
721 721 .alert-info h4{color:#3a87ad;}
722 722 .alert-block{padding-top:14px;padding-bottom:14px;}
723 723 .alert-block>p,.alert-block>ul{margin-bottom:0;}
724 724 .alert-block p+p{margin-top:5px;}
725 725 .nav{margin-left:0;margin-bottom:20px;list-style:none;}
726 726 .nav>li>a{display:block;}
727 727 .nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee;}
728 728 .nav>li>a>img{max-width:none;}
729 729 .nav>.pull-right{float:right;}
730 730 .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
731 731 .nav li+.nav-header{margin-top:9px;}
732 732 .nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
733 733 .nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
734 734 .nav-list>li>a{padding:3px 15px;}
735 735 .nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;}
736 736 .nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;}
737 737 .nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
738 738 .nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;}
739 739 .nav-tabs:after,.nav-pills:after{clear:both;}
740 740 .nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;}
741 741 .nav-tabs:after,.nav-pills:after{clear:both;}
742 742 .nav-tabs>li,.nav-pills>li{float:left;}
743 743 .nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
744 744 .nav-tabs{border-bottom:1px solid #ddd;}
745 745 .nav-tabs>li{margin-bottom:-1px;}
746 746 .nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #dddddd;}
747 747 .nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
748 748 .nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
749 749 .nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#ffffff;background-color:#0088cc;}
750 750 .nav-stacked>li{float:none;}
751 751 .nav-stacked>li>a{margin-right:0;}
752 752 .nav-tabs.nav-stacked{border-bottom:0;}
753 753 .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
754 754 .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
755 755 .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
756 756 .nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2;}
757 757 .nav-pills.nav-stacked>li>a{margin-bottom:3px;}
758 758 .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
759 759 .nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
760 760 .nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
761 761 .nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;}
762 762 .nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580;}
763 763 .nav-tabs .dropdown-toggle .caret{margin-top:8px;}
764 764 .nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;}
765 765 .nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
766 766 .nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer;}
767 767 .nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#ffffff;background-color:#999999;border-color:#999999;}
768 768 .nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
769 769 .tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999999;}
770 770 .tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;}
771 771 .tabbable:after{clear:both;}
772 772 .tabbable:before,.tabbable:after{display:table;content:"";line-height:0;}
773 773 .tabbable:after{clear:both;}
774 774 .tab-content{overflow:auto;}
775 775 .tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;}
776 776 .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
777 777 .tab-content>.active,.pill-content>.active{display:block;}
778 778 .tabs-below>.nav-tabs{border-top:1px solid #ddd;}
779 779 .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;}
780 780 .tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd;}
781 781 .tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd;}
782 782 .tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;}
783 783 .tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
784 784 .tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
785 785 .tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
786 786 .tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
787 787 .tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
788 788 .tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
789 789 .tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
790 790 .tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
791 791 .tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
792 792 .nav>.disabled>a{color:#999999;}
793 793 .nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default;}
794 794 .navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2;}
795 795 .navbar-inner{min-height:36px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;}
796 796 .navbar-inner:after{clear:both;}
797 797 .navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;}
798 798 .navbar-inner:after{clear:both;}
799 799 .navbar .container{width:auto;}
800 800 .nav-collapse.collapse{height:auto;overflow:visible;}
801 801 .navbar .brand{float:left;display:block;padding:8px 20px 8px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none;}
802 802 .navbar-text{margin-bottom:0;line-height:36px;color:#777777;}
803 803 .navbar-link{color:#777777;}.navbar-link:hover,.navbar-link:focus{color:#333333;}
804 804 .navbar .divider-vertical{height:36px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;}
805 805 .navbar .btn,.navbar .btn-group{margin-top:3px;}
806 806 .navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0;}
807 807 .navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;}
808 808 .navbar-form:after{clear:both;}
809 809 .navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;}
810 810 .navbar-form:after{clear:both;}
811 811 .navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:3px;}
812 812 .navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;}
813 813 .navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
814 814 .navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
815 815 .navbar-search{position:relative;float:left;margin-top:3px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
816 816 .navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
817 817 .navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
818 818 .navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;}
819 819 .navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;}
820 820 .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
821 821 .navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
822 822 .navbar-fixed-top{top:0;}
823 823 .navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);}
824 824 .navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);}
825 825 .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
826 826 .navbar .nav.pull-right{float:right;margin-right:0;}
827 827 .navbar .nav>li{float:left;}
828 828 .navbar .nav>li>a{float:none;padding:8px 15px 8px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;}
829 829 .navbar .nav .dropdown-toggle .caret{margin-top:8px;}
830 830 .navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;}
831 831 .navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);}
832 832 .navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;}
833 833 .navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;}
834 834 .navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;}
835 835 .navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;}
836 836 .navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
837 837 .btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
838 838 .navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
839 839 .navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
840 840 .navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
841 841 .navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
842 842 .navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333333;border-bottom-color:#333333;}
843 843 .navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;}
844 844 .navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;}
845 845 .navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
846 846 .navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;}
847 847 .navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;}
848 848 .navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
849 849 .navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;}
850 850 .navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#ffffff;}
851 851 .navbar-inverse .brand{color:#999999;}
852 852 .navbar-inverse .navbar-text{color:#999999;}
853 853 .navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;}
854 854 .navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;}
855 855 .navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#ffffff;}
856 856 .navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;}
857 857 .navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;}
858 858 .navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
859 859 .navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;}
860 860 .navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
861 861 .navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;}
862 862 .navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;}
863 863 .navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
864 864 .navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;}
865 865 .navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;}
866 866 .navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
867 867 .navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
868 868 .navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;}
869 869 .navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;}
870 870 .navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;}
871 871 .navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;}
872 872 .breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}.breadcrumb>li>.divider{padding:0 5px;color:#ccc;}
873 873 .breadcrumb>.active{color:#999999;}
874 874 .pagination{margin:20px 0;}
875 875 .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
876 876 .pagination ul>li{display:inline;}
877 877 .pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;}
878 878 .pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;}
879 879 .pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;}
880 880 .pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999999;background-color:transparent;cursor:default;}
881 881 .pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
882 882 .pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
883 883 .pagination-centered{text-align:center;}
884 884 .pagination-right{text-align:right;}
885 885 .pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:16.25px;}
886 886 .pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
887 887 .pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
888 888 .pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;}
889 889 .pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;}
890 890 .pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.049999999999999px;}
891 891 .pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:9.75px;}
892 892 .pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;}
893 893 .pager:after{clear:both;}
894 894 .pager:before,.pager:after{display:table;content:"";line-height:0;}
895 895 .pager:after{clear:both;}
896 896 .pager li{display:inline;}
897 897 .pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
898 898 .pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5;}
899 899 .pager .next>a,.pager .next>span{float:right;}
900 900 .pager .previous>a,.pager .previous>span{float:left;}
901 901 .pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;}
902 902 .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
903 903 .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
904 904 .modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
905 905 .modal.fade.in{top:10%;}
906 906 .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
907 907 .modal-header h3{margin:0;line-height:30px;}
908 908 .modal-body{position:relative;overflow-y:auto;max-height:400px;padding:15px;}
909 909 .modal-form{margin-bottom:0;}
910 910 .modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;}
911 911 .modal-footer:after{clear:both;}
912 912 .modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;}
913 913 .modal-footer:after{clear:both;}
914 914 .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
915 915 .modal-footer .btn-group .btn+.btn{margin-left:-1px;}
916 916 .modal-footer .btn-block+.btn-block{margin-left:0;}
917 917 .tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
918 918 .tooltip.top{margin-top:-3px;padding:5px 0;}
919 919 .tooltip.right{margin-left:3px;padding:0 5px;}
920 920 .tooltip.bottom{margin-top:3px;padding:5px 0;}
921 921 .tooltip.left{margin-left:-3px;padding:0 5px;}
922 922 .tooltip-inner{max-width:200px;padding:8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
923 923 .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;}
924 924 .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;}
925 925 .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;}
926 926 .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;}
927 927 .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;}
928 928 .popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);white-space:normal;}.popover.top{margin-top:-10px;}
929 929 .popover.right{margin-left:10px;}
930 930 .popover.bottom{margin-top:10px;}
931 931 .popover.left{margin-left:-10px;}
932 932 .popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}.popover-title:empty{display:none;}
933 933 .popover-content{padding:9px 14px;}
934 934 .popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;}
935 935 .popover .arrow{border-width:11px;}
936 936 .popover .arrow:after{border-width:10px;content:"";}
937 937 .popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0, 0, 0, 0.25);bottom:-11px;}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff;}
938 938 .popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0, 0, 0, 0.25);}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff;}
939 939 .popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0, 0, 0, 0.25);top:-11px;}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff;}
940 940 .popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0, 0, 0, 0.25);}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px;}
941 941 .thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;}
942 942 .thumbnails:after{clear:both;}
943 943 .thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;}
944 944 .thumbnails:after{clear:both;}
945 945 .row-fluid .thumbnails{margin-left:0;}
946 946 .thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;}
947 947 .thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}
948 948 a.thumbnail:hover,a.thumbnail:focus{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
949 949 .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
950 950 .thumbnail .caption{padding:9px;color:#555555;}
951 951 .media,.media-body{overflow:hidden;*overflow:visible;zoom:1;}
952 952 .media,.media .media{margin-top:15px;}
953 953 .media:first-child{margin-top:0;}
954 954 .media-object{display:block;}
955 955 .media-heading{margin:0 0 5px;}
956 956 .media>.pull-left{margin-right:10px;}
957 957 .media>.pull-right{margin-left:10px;}
958 958 .media-list{margin-left:0;list-style:none;}
959 959 .label,.badge{display:inline-block;padding:2px 4px;font-size:10.998px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
960 960 .label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
961 961 .badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
962 962 .label:empty,.badge:empty{display:none;}
963 963 a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer;}
964 964 .label-important,.badge-important{background-color:#b94a48;}
965 965 .label-important[href],.badge-important[href]{background-color:#953b39;}
966 966 .label-warning,.badge-warning{background-color:#f89406;}
967 967 .label-warning[href],.badge-warning[href]{background-color:#c67605;}
968 968 .label-success,.badge-success{background-color:#468847;}
969 969 .label-success[href],.badge-success[href]{background-color:#356635;}
970 970 .label-info,.badge-info{background-color:#3a87ad;}
971 971 .label-info[href],.badge-info[href]{background-color:#2d6987;}
972 972 .label-inverse,.badge-inverse{background-color:#333333;}
973 973 .label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
974 974 .btn .label,.btn .badge{position:relative;top:-1px;}
975 975 .btn-mini .label,.btn-mini .badge{top:0;}
976 976 @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
977 977 .progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;}
978 978 .progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);}
979 979 .progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;}
980 980 .progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
981 981 .progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);}
982 982 .progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
983 983 .progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);}
984 984 .progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
985 985 .progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);}
986 986 .progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
987 987 .progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);}
988 988 .progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);}
989 989 .accordion{margin-bottom:20px;}
990 990 .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
991 991 .accordion-heading{border-bottom:0;}
992 992 .accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
993 993 .accordion-toggle{cursor:pointer;}
994 994 .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
995 995 .carousel{position:relative;margin-bottom:20px;line-height:1;}
996 996 .carousel-inner{overflow:hidden;width:100%;position:relative;}
997 997 .carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1;}
998 998 .carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block;}
999 999 .carousel-inner>.active{left:0;}
1000 1000 .carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%;}
1001 1001 .carousel-inner>.next{left:100%;}
1002 1002 .carousel-inner>.prev{left:-100%;}
1003 1003 .carousel-inner>.next.left,.carousel-inner>.prev.right{left:0;}
1004 1004 .carousel-inner>.active.left{left:-100%;}
1005 1005 .carousel-inner>.active.right{left:100%;}
1006 1006 .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
1007 1007 .carousel-control:hover,.carousel-control:focus{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
1008 1008 .carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none;}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255, 255, 255, 0.25);border-radius:5px;}
1009 1009 .carousel-indicators .active{background-color:#fff;}
1010 1010 .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);}
1011 1011 .carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;}
1012 1012 .carousel-caption h4{margin:0 0 5px;}
1013 1013 .carousel-caption p{margin-bottom:0;}
1014 1014 .hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
1015 1015 .hero-unit li{line-height:30px;}
1016 1016 .pull-right{float:right;}
1017 1017 .pull-left{float:left;}
1018 1018 .hide{display:none;}
1019 1019 .show{display:block;}
1020 1020 .invisible{visibility:hidden;}
1021 1021 .affix{position:fixed;}
1022 1022 .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
1023 1023 .clearfix:after{clear:both;}
1024 1024 .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
1025 1025 .input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
1026 1026 @-ms-viewport{width:device-width;}.hidden{display:none;visibility:hidden;}
1027 1027 .visible-phone{display:none !important;}
1028 1028 .visible-tablet{display:none !important;}
1029 1029 .hidden-desktop{display:none !important;}
1030 1030 .visible-desktop{display:inherit !important;}
1031 1031 @media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}.visible-print{display:none !important;}
1032 1032 @media print{.visible-print{display:inherit !important;} .hidden-print{display:none !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} .row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:30px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} .row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:30px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} input.span12,textarea.span12,.uneditable-input.span12{width:1156px;} input.span11,textarea.span11,.uneditable-input.span11{width:1056px;} input.span10,textarea.span10,.uneditable-input.span10{width:956px;} input.span9,textarea.span9,.uneditable-input.span9{width:856px;} input.span8,textarea.span8,.uneditable-input.span8{width:756px;} input.span7,textarea.span7,.uneditable-input.span7{width:656px;} input.span6,textarea.span6,.uneditable-input.span6{width:556px;} input.span5,textarea.span5,.uneditable-input.span5{width:456px;} input.span4,textarea.span4,.uneditable-input.span4{width:356px;} input.span3,textarea.span3,.uneditable-input.span3{width:256px;} input.span2,textarea.span2,.uneditable-input.span2{width:156px;} input.span1,textarea.span1,.uneditable-input.span1{width:56px;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} input.span12,textarea.span12,.uneditable-input.span12{width:1156px;} input.span11,textarea.span11,.uneditable-input.span11{width:1056px;} input.span10,textarea.span10,.uneditable-input.span10{width:956px;} input.span9,textarea.span9,.uneditable-input.span9{width:856px;} input.span8,textarea.span8,.uneditable-input.span8{width:756px;} input.span7,textarea.span7,.uneditable-input.span7{width:656px;} input.span6,textarea.span6,.uneditable-input.span6{width:556px;} input.span5,textarea.span5,.uneditable-input.span5{width:456px;} input.span4,textarea.span4,.uneditable-input.span4{width:356px;} input.span3,textarea.span3,.uneditable-input.span3{width:256px;} input.span2,textarea.span2,.uneditable-input.span2{width:156px;} input.span1,textarea.span1,.uneditable-input.span1{width:56px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;} .row-fluid .thumbnails{margin-left:0;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} .row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} .row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12,textarea.span12,.uneditable-input.span12{width:710px;} input.span11,textarea.span11,.uneditable-input.span11{width:648px;} input.span10,textarea.span10,.uneditable-input.span10{width:586px;} input.span9,textarea.span9,.uneditable-input.span9{width:524px;} input.span8,textarea.span8,.uneditable-input.span8{width:462px;} input.span7,textarea.span7,.uneditable-input.span7{width:400px;} input.span6,textarea.span6,.uneditable-input.span6{width:338px;} input.span5,textarea.span5,.uneditable-input.span5{width:276px;} input.span4,textarea.span4,.uneditable-input.span4{width:214px;} input.span3,textarea.span3,.uneditable-input.span3{width:152px;} input.span2,textarea.span2,.uneditable-input.span2{width:90px;} input.span1,textarea.span1,.uneditable-input.span1{width:28px;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12,textarea.span12,.uneditable-input.span12{width:710px;} input.span11,textarea.span11,.uneditable-input.span11{width:648px;} input.span10,textarea.span10,.uneditable-input.span10{width:586px;} input.span9,textarea.span9,.uneditable-input.span9{width:524px;} input.span8,textarea.span8,.uneditable-input.span8{width:462px;} input.span7,textarea.span7,.uneditable-input.span7{width:400px;} input.span6,textarea.span6,.uneditable-input.span6{width:338px;} input.span5,textarea.span5,.uneditable-input.span5{width:276px;} input.span4,textarea.span4,.uneditable-input.span4{width:214px;} input.span3,textarea.span3,.uneditable-input.span3{width:152px;} input.span2,textarea.span2,.uneditable-input.span2{width:90px;} input.span1,textarea.span1,.uneditable-input.span1{width:28px;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .row-fluid [class*="offset"]:first-child{margin-left:0;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade{top:-100px;} .modal.fade.in{top:20px;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .media .pull-left,.media .pull-right{float:none;display:block;margin-bottom:10px;} .media-object{margin-right:0;margin-left:0;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.divider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .open>.dropdown-menu{display:block;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);} .navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}}@font-face{font-family:'FontAwesome';src:url('../components/font-awesome/build/assets/font-awesome/font/fontawesome-webfont.eot?v=3.1.0');src:url('../components/font-awesome/build/assets/font-awesome/font/fontawesome-webfont.eot?#iefix&v=3.1.0') format('embedded-opentype'),url('../components/font-awesome/build/assets/font-awesome/font/fontawesome-webfont.woff?v=3.1.0') format('woff'),url('../components/font-awesome/build/assets/font-awesome/font/fontawesome-webfont.ttf?v=3.1.0') format('truetype'),url('../components/font-awesome/build/assets/font-awesome/font/fontawesome-webfont.svg#fontawesomeregular?v=3.1.0') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;}
1033 1033 [class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;}
1034 1034 .icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;}
1035 1035 a [class^="icon-"],a [class*=" icon-"],a [class^="icon-"]:before,a [class*=" icon-"]:before{display:inline;}
1036 1036 [class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.2857142857142858em;text-align:center;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.5714285714285714em;}
1037 1037 ul.icons-ul{list-style-type:none;text-indent:-0.7142857142857143em;margin-left:2.142857142857143em;}ul.icons-ul>li .icon-li{width:0.7142857142857143em;display:inline-block;text-align:center;}
1038 1038 [class^="icon-"].hide,[class*=" icon-"].hide{display:none;}
1039 1039 .icon-muted{color:#eeeeee;}
1040 1040 .icon-light{color:#ffffff;}
1041 1041 .icon-dark{color:#333333;}
1042 1042 .icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
1043 1043 .icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
1044 1044 .icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
1045 1045 .icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
1046 1046 .icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;}
1047 1047 .pull-right{float:right;}
1048 1048 .pull-left{float:left;}
1049 1049 [class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;}
1050 1050 [class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;}
1051 1051 [class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;}
1052 1052 .icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;}
1053 1053 .btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;}
1054 1054 .btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;}
1055 1055 .nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;}
1056 1056 .btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;}
1057 1057 .btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;}
1058 1058 .btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;}
1059 1059 .btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;}
1060 1060 .btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;}
1061 1061 .btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;}
1062 1062 .icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;}
1063 1063 .icon-stack .icon-stack-base{font-size:2em;*line-height:1em;}
1064 1064 .icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;}
1065 1065 @-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);}
1066 1066 .icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);}
1067 1067 .icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);}
1068 1068 .icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);}
1069 1069 .icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);}
1070 1070 .icon-glass:before{content:"\f000";}
1071 1071 .icon-music:before{content:"\f001";}
1072 1072 .icon-search:before{content:"\f002";}
1073 1073 .icon-envelope:before{content:"\f003";}
1074 1074 .icon-heart:before{content:"\f004";}
1075 1075 .icon-star:before{content:"\f005";}
1076 1076 .icon-star-empty:before{content:"\f006";}
1077 1077 .icon-user:before{content:"\f007";}
1078 1078 .icon-film:before{content:"\f008";}
1079 1079 .icon-th-large:before{content:"\f009";}
1080 1080 .icon-th:before{content:"\f00a";}
1081 1081 .icon-th-list:before{content:"\f00b";}
1082 1082 .icon-ok:before{content:"\f00c";}
1083 1083 .icon-remove:before{content:"\f00d";}
1084 1084 .icon-zoom-in:before{content:"\f00e";}
1085 1085 .icon-zoom-out:before{content:"\f010";}
1086 1086 .icon-off:before{content:"\f011";}
1087 1087 .icon-signal:before{content:"\f012";}
1088 1088 .icon-cog:before{content:"\f013";}
1089 1089 .icon-trash:before{content:"\f014";}
1090 1090 .icon-home:before{content:"\f015";}
1091 1091 .icon-file:before{content:"\f016";}
1092 1092 .icon-time:before{content:"\f017";}
1093 1093 .icon-road:before{content:"\f018";}
1094 1094 .icon-download-alt:before{content:"\f019";}
1095 1095 .icon-download:before{content:"\f01a";}
1096 1096 .icon-upload:before{content:"\f01b";}
1097 1097 .icon-inbox:before{content:"\f01c";}
1098 1098 .icon-play-circle:before{content:"\f01d";}
1099 1099 .icon-repeat:before,.icon-rotate-right:before{content:"\f01e";}
1100 1100 .icon-refresh:before{content:"\f021";}
1101 1101 .icon-list-alt:before{content:"\f022";}
1102 1102 .icon-lock:before{content:"\f023";}
1103 1103 .icon-flag:before{content:"\f024";}
1104 1104 .icon-headphones:before{content:"\f025";}
1105 1105 .icon-volume-off:before{content:"\f026";}
1106 1106 .icon-volume-down:before{content:"\f027";}
1107 1107 .icon-volume-up:before{content:"\f028";}
1108 1108 .icon-qrcode:before{content:"\f029";}
1109 1109 .icon-barcode:before{content:"\f02a";}
1110 1110 .icon-tag:before{content:"\f02b";}
1111 1111 .icon-tags:before{content:"\f02c";}
1112 1112 .icon-book:before{content:"\f02d";}
1113 1113 .icon-bookmark:before{content:"\f02e";}
1114 1114 .icon-print:before{content:"\f02f";}
1115 1115 .icon-camera:before{content:"\f030";}
1116 1116 .icon-font:before{content:"\f031";}
1117 1117 .icon-bold:before{content:"\f032";}
1118 1118 .icon-italic:before{content:"\f033";}
1119 1119 .icon-text-height:before{content:"\f034";}
1120 1120 .icon-text-width:before{content:"\f035";}
1121 1121 .icon-align-left:before{content:"\f036";}
1122 1122 .icon-align-center:before{content:"\f037";}
1123 1123 .icon-align-right:before{content:"\f038";}
1124 1124 .icon-align-justify:before{content:"\f039";}
1125 1125 .icon-list:before{content:"\f03a";}
1126 1126 .icon-indent-left:before{content:"\f03b";}
1127 1127 .icon-indent-right:before{content:"\f03c";}
1128 1128 .icon-facetime-video:before{content:"\f03d";}
1129 1129 .icon-picture:before{content:"\f03e";}
1130 1130 .icon-pencil:before{content:"\f040";}
1131 1131 .icon-map-marker:before{content:"\f041";}
1132 1132 .icon-adjust:before{content:"\f042";}
1133 1133 .icon-tint:before{content:"\f043";}
1134 1134 .icon-edit:before{content:"\f044";}
1135 1135 .icon-share:before{content:"\f045";}
1136 1136 .icon-check:before{content:"\f046";}
1137 1137 .icon-move:before{content:"\f047";}
1138 1138 .icon-step-backward:before{content:"\f048";}
1139 1139 .icon-fast-backward:before{content:"\f049";}
1140 1140 .icon-backward:before{content:"\f04a";}
1141 1141 .icon-play:before{content:"\f04b";}
1142 1142 .icon-pause:before{content:"\f04c";}
1143 1143 .icon-stop:before{content:"\f04d";}
1144 1144 .icon-forward:before{content:"\f04e";}
1145 1145 .icon-fast-forward:before{content:"\f050";}
1146 1146 .icon-step-forward:before{content:"\f051";}
1147 1147 .icon-eject:before{content:"\f052";}
1148 1148 .icon-chevron-left:before{content:"\f053";}
1149 1149 .icon-chevron-right:before{content:"\f054";}
1150 1150 .icon-plus-sign:before{content:"\f055";}
1151 1151 .icon-minus-sign:before{content:"\f056";}
1152 1152 .icon-remove-sign:before{content:"\f057";}
1153 1153 .icon-ok-sign:before{content:"\f058";}
1154 1154 .icon-question-sign:before{content:"\f059";}
1155 1155 .icon-info-sign:before{content:"\f05a";}
1156 1156 .icon-screenshot:before{content:"\f05b";}
1157 1157 .icon-remove-circle:before{content:"\f05c";}
1158 1158 .icon-ok-circle:before{content:"\f05d";}
1159 1159 .icon-ban-circle:before{content:"\f05e";}
1160 1160 .icon-arrow-left:before{content:"\f060";}
1161 1161 .icon-arrow-right:before{content:"\f061";}
1162 1162 .icon-arrow-up:before{content:"\f062";}
1163 1163 .icon-arrow-down:before{content:"\f063";}
1164 1164 .icon-share-alt:before,.icon-mail-forward:before{content:"\f064";}
1165 1165 .icon-resize-full:before{content:"\f065";}
1166 1166 .icon-resize-small:before{content:"\f066";}
1167 1167 .icon-plus:before{content:"\f067";}
1168 1168 .icon-minus:before{content:"\f068";}
1169 1169 .icon-asterisk:before{content:"\f069";}
1170 1170 .icon-exclamation-sign:before{content:"\f06a";}
1171 1171 .icon-gift:before{content:"\f06b";}
1172 1172 .icon-leaf:before{content:"\f06c";}
1173 1173 .icon-fire:before{content:"\f06d";}
1174 1174 .icon-eye-open:before{content:"\f06e";}
1175 1175 .icon-eye-close:before{content:"\f070";}
1176 1176 .icon-warning-sign:before{content:"\f071";}
1177 1177 .icon-plane:before{content:"\f072";}
1178 1178 .icon-calendar:before{content:"\f073";}
1179 1179 .icon-random:before{content:"\f074";}
1180 1180 .icon-comment:before{content:"\f075";}
1181 1181 .icon-magnet:before{content:"\f076";}
1182 1182 .icon-chevron-up:before{content:"\f077";}
1183 1183 .icon-chevron-down:before{content:"\f078";}
1184 1184 .icon-retweet:before{content:"\f079";}
1185 1185 .icon-shopping-cart:before{content:"\f07a";}
1186 1186 .icon-folder-close:before{content:"\f07b";}
1187 1187 .icon-folder-open:before{content:"\f07c";}
1188 1188 .icon-resize-vertical:before{content:"\f07d";}
1189 1189 .icon-resize-horizontal:before{content:"\f07e";}
1190 1190 .icon-bar-chart:before{content:"\f080";}
1191 1191 .icon-twitter-sign:before{content:"\f081";}
1192 1192 .icon-facebook-sign:before{content:"\f082";}
1193 1193 .icon-camera-retro:before{content:"\f083";}
1194 1194 .icon-key:before{content:"\f084";}
1195 1195 .icon-cogs:before{content:"\f085";}
1196 1196 .icon-comments:before{content:"\f086";}
1197 1197 .icon-thumbs-up:before{content:"\f087";}
1198 1198 .icon-thumbs-down:before{content:"\f088";}
1199 1199 .icon-star-half:before{content:"\f089";}
1200 1200 .icon-heart-empty:before{content:"\f08a";}
1201 1201 .icon-signout:before{content:"\f08b";}
1202 1202 .icon-linkedin-sign:before{content:"\f08c";}
1203 1203 .icon-pushpin:before{content:"\f08d";}
1204 1204 .icon-external-link:before{content:"\f08e";}
1205 1205 .icon-signin:before{content:"\f090";}
1206 1206 .icon-trophy:before{content:"\f091";}
1207 1207 .icon-github-sign:before{content:"\f092";}
1208 1208 .icon-upload-alt:before{content:"\f093";}
1209 1209 .icon-lemon:before{content:"\f094";}
1210 1210 .icon-phone:before{content:"\f095";}
1211 1211 .icon-check-empty:before{content:"\f096";}
1212 1212 .icon-bookmark-empty:before{content:"\f097";}
1213 1213 .icon-phone-sign:before{content:"\f098";}
1214 1214 .icon-twitter:before{content:"\f099";}
1215 1215 .icon-facebook:before{content:"\f09a";}
1216 1216 .icon-github:before{content:"\f09b";}
1217 1217 .icon-unlock:before{content:"\f09c";}
1218 1218 .icon-credit-card:before{content:"\f09d";}
1219 1219 .icon-rss:before{content:"\f09e";}
1220 1220 .icon-hdd:before{content:"\f0a0";}
1221 1221 .icon-bullhorn:before{content:"\f0a1";}
1222 1222 .icon-bell:before{content:"\f0a2";}
1223 1223 .icon-certificate:before{content:"\f0a3";}
1224 1224 .icon-hand-right:before{content:"\f0a4";}
1225 1225 .icon-hand-left:before{content:"\f0a5";}
1226 1226 .icon-hand-up:before{content:"\f0a6";}
1227 1227 .icon-hand-down:before{content:"\f0a7";}
1228 1228 .icon-circle-arrow-left:before{content:"\f0a8";}
1229 1229 .icon-circle-arrow-right:before{content:"\f0a9";}
1230 1230 .icon-circle-arrow-up:before{content:"\f0aa";}
1231 1231 .icon-circle-arrow-down:before{content:"\f0ab";}
1232 1232 .icon-globe:before{content:"\f0ac";}
1233 1233 .icon-wrench:before{content:"\f0ad";}
1234 1234 .icon-tasks:before{content:"\f0ae";}
1235 1235 .icon-filter:before{content:"\f0b0";}
1236 1236 .icon-briefcase:before{content:"\f0b1";}
1237 1237 .icon-fullscreen:before{content:"\f0b2";}
1238 1238 .icon-group:before{content:"\f0c0";}
1239 1239 .icon-link:before{content:"\f0c1";}
1240 1240 .icon-cloud:before{content:"\f0c2";}
1241 1241 .icon-beaker:before{content:"\f0c3";}
1242 1242 .icon-cut:before{content:"\f0c4";}
1243 1243 .icon-copy:before{content:"\f0c5";}
1244 1244 .icon-paper-clip:before{content:"\f0c6";}
1245 1245 .icon-save:before{content:"\f0c7";}
1246 1246 .icon-sign-blank:before{content:"\f0c8";}
1247 1247 .icon-reorder:before{content:"\f0c9";}
1248 1248 .icon-list-ul:before{content:"\f0ca";}
1249 1249 .icon-list-ol:before{content:"\f0cb";}
1250 1250 .icon-strikethrough:before{content:"\f0cc";}
1251 1251 .icon-underline:before{content:"\f0cd";}
1252 1252 .icon-table:before{content:"\f0ce";}
1253 1253 .icon-magic:before{content:"\f0d0";}
1254 1254 .icon-truck:before{content:"\f0d1";}
1255 1255 .icon-pinterest:before{content:"\f0d2";}
1256 1256 .icon-pinterest-sign:before{content:"\f0d3";}
1257 1257 .icon-google-plus-sign:before{content:"\f0d4";}
1258 1258 .icon-google-plus:before{content:"\f0d5";}
1259 1259 .icon-money:before{content:"\f0d6";}
1260 1260 .icon-caret-down:before{content:"\f0d7";}
1261 1261 .icon-caret-up:before{content:"\f0d8";}
1262 1262 .icon-caret-left:before{content:"\f0d9";}
1263 1263 .icon-caret-right:before{content:"\f0da";}
1264 1264 .icon-columns:before{content:"\f0db";}
1265 1265 .icon-sort:before{content:"\f0dc";}
1266 1266 .icon-sort-down:before{content:"\f0dd";}
1267 1267 .icon-sort-up:before{content:"\f0de";}
1268 1268 .icon-envelope-alt:before{content:"\f0e0";}
1269 1269 .icon-linkedin:before{content:"\f0e1";}
1270 1270 .icon-undo:before,.icon-rotate-left:before{content:"\f0e2";}
1271 1271 .icon-legal:before{content:"\f0e3";}
1272 1272 .icon-dashboard:before{content:"\f0e4";}
1273 1273 .icon-comment-alt:before{content:"\f0e5";}
1274 1274 .icon-comments-alt:before{content:"\f0e6";}
1275 1275 .icon-bolt:before{content:"\f0e7";}
1276 1276 .icon-sitemap:before{content:"\f0e8";}
1277 1277 .icon-umbrella:before{content:"\f0e9";}
1278 1278 .icon-paste:before{content:"\f0ea";}
1279 1279 .icon-lightbulb:before{content:"\f0eb";}
1280 1280 .icon-exchange:before{content:"\f0ec";}
1281 1281 .icon-cloud-download:before{content:"\f0ed";}
1282 1282 .icon-cloud-upload:before{content:"\f0ee";}
1283 1283 .icon-user-md:before{content:"\f0f0";}
1284 1284 .icon-stethoscope:before{content:"\f0f1";}
1285 1285 .icon-suitcase:before{content:"\f0f2";}
1286 1286 .icon-bell-alt:before{content:"\f0f3";}
1287 1287 .icon-coffee:before{content:"\f0f4";}
1288 1288 .icon-food:before{content:"\f0f5";}
1289 1289 .icon-file-alt:before{content:"\f0f6";}
1290 1290 .icon-building:before{content:"\f0f7";}
1291 1291 .icon-hospital:before{content:"\f0f8";}
1292 1292 .icon-ambulance:before{content:"\f0f9";}
1293 1293 .icon-medkit:before{content:"\f0fa";}
1294 1294 .icon-fighter-jet:before{content:"\f0fb";}
1295 1295 .icon-beer:before{content:"\f0fc";}
1296 1296 .icon-h-sign:before{content:"\f0fd";}
1297 1297 .icon-plus-sign-alt:before{content:"\f0fe";}
1298 1298 .icon-double-angle-left:before{content:"\f100";}
1299 1299 .icon-double-angle-right:before{content:"\f101";}
1300 1300 .icon-double-angle-up:before{content:"\f102";}
1301 1301 .icon-double-angle-down:before{content:"\f103";}
1302 1302 .icon-angle-left:before{content:"\f104";}
1303 1303 .icon-angle-right:before{content:"\f105";}
1304 1304 .icon-angle-up:before{content:"\f106";}
1305 1305 .icon-angle-down:before{content:"\f107";}
1306 1306 .icon-desktop:before{content:"\f108";}
1307 1307 .icon-laptop:before{content:"\f109";}
1308 1308 .icon-tablet:before{content:"\f10a";}
1309 1309 .icon-mobile-phone:before{content:"\f10b";}
1310 1310 .icon-circle-blank:before{content:"\f10c";}
1311 1311 .icon-quote-left:before{content:"\f10d";}
1312 1312 .icon-quote-right:before{content:"\f10e";}
1313 1313 .icon-spinner:before{content:"\f110";}
1314 1314 .icon-circle:before{content:"\f111";}
1315 1315 .icon-reply:before,.icon-mail-reply:before{content:"\f112";}
1316 1316 .icon-folder-close-alt:before{content:"\f114";}
1317 1317 .icon-folder-open-alt:before{content:"\f115";}
1318 1318 .icon-expand-alt:before{content:"\f116";}
1319 1319 .icon-collapse-alt:before{content:"\f117";}
1320 1320 .icon-smile:before{content:"\f118";}
1321 1321 .icon-frown:before{content:"\f119";}
1322 1322 .icon-meh:before{content:"\f11a";}
1323 1323 .icon-gamepad:before{content:"\f11b";}
1324 1324 .icon-keyboard:before{content:"\f11c";}
1325 1325 .icon-flag-alt:before{content:"\f11d";}
1326 1326 .icon-flag-checkered:before{content:"\f11e";}
1327 1327 .icon-terminal:before{content:"\f120";}
1328 1328 .icon-code:before{content:"\f121";}
1329 1329 .icon-reply-all:before{content:"\f122";}
1330 1330 .icon-mail-reply-all:before{content:"\f122";}
1331 1331 .icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";}
1332 1332 .icon-location-arrow:before{content:"\f124";}
1333 1333 .icon-crop:before{content:"\f125";}
1334 1334 .icon-code-fork:before{content:"\f126";}
1335 1335 .icon-unlink:before{content:"\f127";}
1336 1336 .icon-question:before{content:"\f128";}
1337 1337 .icon-info:before{content:"\f129";}
1338 1338 .icon-exclamation:before{content:"\f12a";}
1339 1339 .icon-superscript:before{content:"\f12b";}
1340 1340 .icon-subscript:before{content:"\f12c";}
1341 1341 .icon-eraser:before{content:"\f12d";}
1342 1342 .icon-puzzle-piece:before{content:"\f12e";}
1343 1343 .icon-microphone:before{content:"\f130";}
1344 1344 .icon-microphone-off:before{content:"\f131";}
1345 1345 .icon-shield:before{content:"\f132";}
1346 1346 .icon-calendar-empty:before{content:"\f133";}
1347 1347 .icon-fire-extinguisher:before{content:"\f134";}
1348 1348 .icon-rocket:before{content:"\f135";}
1349 1349 .icon-maxcdn:before{content:"\f136";}
1350 1350 .icon-chevron-sign-left:before{content:"\f137";}
1351 1351 .icon-chevron-sign-right:before{content:"\f138";}
1352 1352 .icon-chevron-sign-up:before{content:"\f139";}
1353 1353 .icon-chevron-sign-down:before{content:"\f13a";}
1354 1354 .icon-html5:before{content:"\f13b";}
1355 1355 .icon-css3:before{content:"\f13c";}
1356 1356 .icon-anchor:before{content:"\f13d";}
1357 1357 .icon-unlock-alt:before{content:"\f13e";}
1358 1358 .icon-bullseye:before{content:"\f140";}
1359 1359 .icon-ellipsis-horizontal:before{content:"\f141";}
1360 1360 .icon-ellipsis-vertical:before{content:"\f142";}
1361 1361 .icon-rss-sign:before{content:"\f143";}
1362 1362 .icon-play-sign:before{content:"\f144";}
1363 1363 .icon-ticket:before{content:"\f145";}
1364 1364 .icon-minus-sign-alt:before{content:"\f146";}
1365 1365 .icon-check-minus:before{content:"\f147";}
1366 1366 .icon-level-up:before{content:"\f148";}
1367 1367 .icon-level-down:before{content:"\f149";}
1368 1368 .icon-check-sign:before{content:"\f14a";}
1369 1369 .icon-edit-sign:before{content:"\f14b";}
1370 1370 .icon-external-link-sign:before{content:"\f14c";}
1371 1371 .icon-share-sign:before{content:"\f14d";}
1372 1372 .border-box-sizing{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;}
1373 1373 .corner-all{border-radius:4px;}
1374 1374 .hbox{display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
1375 1375 .hbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
1376 1376 .vbox{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
1377 1377 .vbox>*{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
1378 1378 .reverse{-webkit-box-direction:reverse;-moz-box-direction:reverse;box-direction:reverse;}
1379 1379 .box-flex0{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;}
1380 1380 .box-flex1{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
1381 1381 .box-flex{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
1382 1382 .box-flex2{-webkit-box-flex:2;-moz-box-flex:2;box-flex:2;}
1383 1383 .box-group1{-webkit-box-flex-group:1;-moz-box-flex-group:1;box-flex-group:1;}
1384 1384 .box-group2{-webkit-box-flex-group:2;-moz-box-flex-group:2;box-flex-group:2;}
1385 1385 .start{-webkit-box-pack:start;-moz-box-pack:start;box-pack:start;}
1386 1386 .end{-webkit-box-pack:end;-moz-box-pack:end;box-pack:end;}
1387 1387 .center{-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;}
1388 1388 body{background-color:white;position:absolute;left:0px;right:0px;top:0px;bottom:0px;overflow:visible;}
1389 1389 div#header{display:none;}
1390 1390 #ipython_notebook{padding-left:16px;}
1391 1391 #noscript{width:auto;padding-top:16px;padding-bottom:16px;text-align:center;font-size:22px;color:red;font-weight:bold;}
1392 1392 #ipython_notebook img{font-family:Verdana,"Helvetica Neue",Arial,Helvetica,Geneva,sans-serif;height:24px;text-decoration:none;color:black;}
1393 1393 #site{width:100%;display:none;}
1394 1394 .ui-button .ui-button-text{padding:0.2em 0.8em;font-size:77%;}
1395 1395 input.ui-button{padding:0.3em 0.9em;}
1396 1396 .navbar span{margin-top:3px;}
1397 1397 span#login_widget{float:right;}
1398 1398 .nav-header{text-transform:none;}
1399 1399 .navbar-nobg{background-color:transparent;background-image:none;}
1400 1400 #header>span{margin-top:10px;}
1401 1401 .modal-body{max-height:500px;}
1402 1402 .center-nav{display:inline-block;margin-bottom:-4px;}
1403 1403 .alternate_upload{background-color:none;display:inline;}
1404 1404 .alternate_upload.form{padding:0;margin:0;}
1405 1405 .alternate_upload input.fileinput{background-color:red;position:relative;opacity:0;z-index:2;width:295px;margin-left:163px;cursor:pointer;}
1406 1406 .list_toolbar{padding:5px;height:25px;line-height:25px;}
1407 1407 .toolbar_info{float:left;}
1408 1408 .toolbar_buttons{float:right;}
1409 1409 .list_header{font-weight:bold;}
1410 1410 .list_container{margin-top:16px;margin-bottom:16px;border:1px solid #ababab;border-radius:4px;}
1411 1411 .list_container>div{border-bottom:1px solid #ababab;}.list_container>div:hover .list-item{background-color:red;}
1412 1412 .list_container>div:last-child{border:none;}
1413 1413 .list_item:hover .list_item{background-color:#ddd;}
1414 1414 .item_name{line-height:24px;}
1415 1415 .list_container>div>span,.list_container>div>div{padding:8px;}
1416 1416 .list_item a{text-decoration:none;}
1417 1417 input.nbname_input{height:15px;}
1418 1418 .highlight_text{color:blue;}
1419 1419 #project_name>.breadcrumb{padding:0px;margin-bottom:0px;background-color:transparent;font-weight:bold;}
1420 1420 input.engine_num_input{height:20px;margin-bottom:2px;padding-top:0;padding-bottom:0;width:60px;}
1421 1421 .ansibold{font-weight:bold;}
1422 1422 .ansiblack{color:black;}
1423 1423 .ansired{color:darkred;}
1424 1424 .ansigreen{color:darkgreen;}
1425 1425 .ansiyellow{color:brown;}
1426 1426 .ansiblue{color:darkblue;}
1427 1427 .ansipurple{color:darkviolet;}
1428 1428 .ansicyan{color:steelblue;}
1429 1429 .ansigray{color:gray;}
1430 1430 .ansibgblack{background-color:black;}
1431 1431 .ansibgred{background-color:red;}
1432 1432 .ansibggreen{background-color:green;}
1433 1433 .ansibgyellow{background-color:yellow;}
1434 1434 .ansibgblue{background-color:blue;}
1435 1435 .ansibgpurple{background-color:magenta;}
1436 1436 .ansibgcyan{background-color:cyan;}
1437 1437 .ansibggray{background-color:gray;}
1438 div.cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;padding:5px 5px 5px 0px;margin:0px;outline:none;}div.cell.selected{border-radius:4px;border:thin #ababab solid;}
1438 div.cell{border:1px solid transparent;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}div.cell.selected{border-radius:4px;border:thin #ababab solid;}
1439 div.cell.edit_mode{border-radius:4px;border:thin green solid;}
1440 div.cell{width:100%;padding:5px 5px 5px 0px;margin:0px;outline:none;}
1439 1441 div.prompt{min-width:11ex;padding:0.4em;margin:0px;font-family:monospace;text-align:right;line-height:1.231em;}
1440 1442 div.inner_cell{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
1441 1443 div.prompt:empty{padding-top:0;padding-bottom:0;}
1442 1444 div.input{page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
1443 1445 div.input_area{border:1px solid #cfcfcf;border-radius:4px;background:#f7f7f7;}
1444 1446 div.input_prompt{color:navy;border-top:1px solid transparent;}
1445 1447 .CodeMirror{line-height:1.231em;height:auto;background:none;}
1446 1448 .CodeMirror-scroll{overflow-y:hidden;overflow-x:auto;}
1447 1449 @-moz-document url-prefix(){.CodeMirror-scroll{overflow-x:hidden;}}.CodeMirror-lines{padding:0.4em;}
1448 1450 .CodeMirror-linenumber{padding:0 8px 0 4px;}
1449 1451 .CodeMirror-gutters{border-bottom-left-radius:4px;border-top-left-radius:4px;}
1450 1452 .CodeMirror pre{padding:0;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
1451 1453 pre code{display:block;padding:0.5em;}
1452 1454 .highlight-base,pre code,pre .subst,pre .tag .title,pre .lisp .title,pre .clojure .built_in,pre .nginx .title{color:black;}
1453 1455 .highlight-string,pre .string,pre .constant,pre .parent,pre .tag .value,pre .rules .value,pre .rules .value .number,pre .preprocessor,pre .ruby .symbol,pre .ruby .symbol .string,pre .aggregate,pre .template_tag,pre .django .variable,pre .smalltalk .class,pre .addition,pre .flow,pre .stream,pre .bash .variable,pre .apache .tag,pre .apache .cbracket,pre .tex .command,pre .tex .special,pre .erlang_repl .function_or_atom,pre .markdown .header{color:#BA2121;}
1454 1456 .highlight-comment,pre .comment,pre .annotation,pre .template_comment,pre .diff .header,pre .chunk,pre .markdown .blockquote{color:#408080;font-style:italic;}
1455 1457 .highlight-number,pre .number,pre .date,pre .regexp,pre .literal,pre .smalltalk .symbol,pre .smalltalk .char,pre .go .constant,pre .change,pre .markdown .bullet,pre .markdown .link_url{color:#080;}
1456 1458 pre .label,pre .javadoc,pre .ruby .string,pre .decorator,pre .filter .argument,pre .localvars,pre .array,pre .attr_selector,pre .important,pre .pseudo,pre .pi,pre .doctype,pre .deletion,pre .envvar,pre .shebang,pre .apache .sqbracket,pre .nginx .built_in,pre .tex .formula,pre .erlang_repl .reserved,pre .prompt,pre .markdown .link_label,pre .vhdl .attribute,pre .clojure .attribute,pre .coffeescript .property{color:#8888ff;}
1457 1459 .highlight-keyword,pre .keyword,pre .id,pre .phpdoc,pre .aggregate,pre .css .tag,pre .javadoctag,pre .phpdoc,pre .yardoctag,pre .smalltalk .class,pre .winutils,pre .bash .variable,pre .apache .tag,pre .go .typename,pre .tex .command,pre .markdown .strong,pre .request,pre .status{color:#008000;font-weight:bold;}
1458 1460 .highlight-builtin,pre .built_in{color:#008000;}
1459 1461 pre .markdown .emphasis{font-style:italic;}
1460 1462 pre .nginx .built_in{font-weight:normal;}
1461 1463 pre .coffeescript .javascript,pre .javascript .xml,pre .tex .formula,pre .xml .javascript,pre .xml .vbscript,pre .xml .css,pre .xml .cdata{opacity:0.5;}
1462 1464 .cm-s-ipython span.cm-variable{color:black;}
1463 1465 .cm-s-ipython span.cm-keyword{color:#008000;font-weight:bold;}
1464 1466 .cm-s-ipython span.cm-number{color:#080;}
1465 1467 .cm-s-ipython span.cm-comment{color:#408080;font-style:italic;}
1466 1468 .cm-s-ipython span.cm-string{color:#BA2121;}
1467 1469 .cm-s-ipython span.cm-builtin{color:#008000;}
1468 1470 .cm-s-ipython span.cm-error{color:#f00;}
1469 1471 .cm-s-ipython span.cm-operator{color:#AA22FF;font-weight:bold;}
1470 1472 .cm-s-ipython span.cm-meta{color:#AA22FF;}
1471 1473 .cm-s-ipython span.cm-tab{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);background-position:right;background-repeat:no-repeat;}
1472 1474 div.output_wrapper{position:relative;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
1473 1475 div.output_scroll{height:24em;width:100%;overflow:auto;border-radius:4px;-webkit-box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);-moz-box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);box-shadow:inset 0 2px 8px rgba(0, 0, 0, 0.8);}
1474 1476 div.output_collapsed{margin:0px;padding:0px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
1475 1477 div.out_prompt_overlay{height:100%;padding:0px 0.4em;position:absolute;border-radius:4px;}
1476 1478 div.out_prompt_overlay:hover{-webkit-box-shadow:inset 0 0 1px #000000;-moz-box-shadow:inset 0 0 1px #000000;box-shadow:inset 0 0 1px #000000;background:rgba(240, 240, 240, 0.5);}
1477 1479 div.output_prompt{color:darkred;}
1478 1480 div.output_area{padding:0px;page-break-inside:avoid;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}div.output_area .MathJax_Display{text-align:left !important;}
1479 1481 div.output_area .rendered_html table{margin-left:0;margin-right:0;}
1480 1482 div.output_area .rendered_html img{margin-left:0;margin-right:0;}
1481 1483 .output{display:-webkit-box;-webkit-box-orient:vertical;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:vertical;-moz-box-align:stretch;display:box;box-orient:vertical;box-align:stretch;width:100%;}
1482 1484 div.output_area pre{font-family:monospace;margin:0;padding:0;border:0;font-size:100%;vertical-align:baseline;color:black;background-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;line-height:inherit;}
1483 1485 div.output_subarea{padding:0.4em 0.4em 0em 0.4em;-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;}
1484 1486 div.output_text{text-align:left;color:#000000;font-family:monospace;line-height:1.231em;}
1485 1487 div.output_stderr{background:#fdd;}
1486 1488 div.output_latex{text-align:left;}
1487 1489 div.output_javascript:empty{padding:0;}
1488 1490 .js-error{color:darkred;}
1489 1491 div.raw_input{padding-top:0px;padding-bottom:0px;height:1em;line-height:1em;font-family:monospace;}
1490 1492 span.input_prompt{font-family:inherit;}
1491 1493 input.raw_input{font-family:inherit;font-size:inherit;color:inherit;width:auto;margin:-2px 0px 0px 1px;padding-left:1px;padding-top:2px;height:1em;}
1492 1494 p.p-space{margin-bottom:10px;}
1493 1495 .rendered_html{color:black;}.rendered_html em{font-style:italic;}
1494 1496 .rendered_html strong{font-weight:bold;}
1495 1497 .rendered_html u{text-decoration:underline;}
1496 1498 .rendered_html :link{text-decoration:underline;}
1497 1499 .rendered_html :visited{text-decoration:underline;}
1498 1500 .rendered_html h1{font-size:197%;margin:.65em 0;font-weight:bold;}
1499 1501 .rendered_html h2{font-size:153.9%;margin:.75em 0;font-weight:bold;}
1500 1502 .rendered_html h3{font-size:123.1%;margin:.85em 0;font-weight:bold;}
1501 1503 .rendered_html h4{font-size:100%;margin:0.95em 0;font-weight:bold;}
1502 1504 .rendered_html h5{font-size:85%;margin:1.5em 0;font-weight:bold;}
1503 1505 .rendered_html h6{font-size:77%;margin:1.65em 0;font-weight:bold;}
1504 1506 .rendered_html ul{list-style:disc;margin:1em 2em;}
1505 1507 .rendered_html ul ul{list-style:square;margin:0em 2em;}
1506 1508 .rendered_html ul ul ul{list-style:circle;margin:0em 2em;}
1507 1509 .rendered_html ol{list-style:decimal;margin:1em 2em;}
1508 1510 .rendered_html ol ol{list-style:upper-alpha;margin:0em 2em;}
1509 1511 .rendered_html ol ol ol{list-style:lower-alpha;margin:0em 2em;}
1510 1512 .rendered_html ol ol ol ol{list-style:lower-roman;margin:0em 2em;}
1511 1513 .rendered_html ol ol ol ol ol{list-style:decimal;margin:0em 2em;}
1512 1514 .rendered_html hr{color:black;background-color:black;}
1513 1515 .rendered_html pre{margin:1em 2em;}
1514 1516 .rendered_html pre,.rendered_html code{border:0;background-color:#ffffff;color:#000000;font-size:100%;padding:0px;}
1515 1517 .rendered_html blockquote{margin:1em 2em;}
1516 1518 .rendered_html table{margin-left:auto;margin-right:auto;border:1px solid black;border-collapse:collapse;}
1517 1519 .rendered_html tr,.rendered_html th,.rendered_html td{border:1px solid black;border-collapse:collapse;margin:1em 2em;}
1518 1520 .rendered_html td,.rendered_html th{text-align:left;vertical-align:middle;padding:4px;}
1519 1521 .rendered_html th{font-weight:bold;}
1520 1522 .rendered_html p{text-align:justify;}
1521 1523 .rendered_html img{display:block;margin-left:auto;margin-right:auto;}
1522 1524 .rendered_html *+p{margin-top:1em;}
1523 1525 .rendered_html *+table{margin-top:1em;}
1524 1526 .rendered_html *+img{margin-top:1em;}
1525 1527 div.text_cell{padding:5px 5px 5px 0px;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;}
1526 1528 div.text_cell_input{color:#000000;border:1px solid #cfcfcf;border-radius:4px;background:#f7f7f7;}
1527 1529 div.text_cell_render{outline:none;resize:none;width:inherit;border-style:none;padding:5px;color:#000000;}
1528 1530 a.anchor-link:link{text-decoration:none;padding:0px 20px;visibility:hidden;}
1529 1531 h1:hover .anchor-link,h2:hover .anchor-link,h3:hover .anchor-link,h4:hover .anchor-link,h5:hover .anchor-link,h6:hover .anchor-link{visibility:visible;}
1530 1532 body{background-color:#ffffff;}
1531 1533 body.notebook_app{overflow:hidden;}
1532 1534 span#notebook_name{height:1em;line-height:1em;padding:3px;border:none;font-size:146.5%;}
1533 1535 div#notebook_panel{margin:0px 0px 0px 0px;padding:0px;-webkit-box-shadow:0 -1px 10px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 -1px 10px rgba(0, 0, 0, 0.1);box-shadow:0 -1px 10px rgba(0, 0, 0, 0.1);}
1534 1536 div#notebook{overflow-y:scroll;overflow-x:auto;width:100%;padding:5px 5px 15px 5px;margin:0px;border-top:1px solid #ababab;}
1535 1537 div.ui-widget-content{border:1px solid #ababab;outline:none;}
1536 1538 pre.dialog{background-color:#f7f7f7;border:1px solid #ddd;border-radius:4px;padding:0.4em;padding-left:2em;}
1537 1539 p.dialog{padding:0.2em;}
1538 1540 pre,code,kbd,samp{white-space:pre-wrap;}
1539 1541 #fonttest{font-family:monospace;}
1540 1542 p{margin-bottom:0;}
1541 1543 .end_space{height:200px;}
1542 1544 .celltoolbar{border:thin solid #CFCFCF;border-bottom:none;background:#EEE;border-radius:3px 3px 0px 0px;width:100%;-webkit-box-pack:end;height:22px;display:-webkit-box;-webkit-box-orient:horizontal;-webkit-box-align:stretch;display:-moz-box;-moz-box-orient:horizontal;-moz-box-align:stretch;display:box;box-orient:horizontal;box-align:stretch;-webkit-box-direction:reverse;-moz-box-direction:reverse;box-direction:reverse;}
1543 1545 .ctb_hideshow{display:none;vertical-align:bottom;padding-right:2px;}
1544 1546 .celltoolbar>div{padding-top:0px;}
1545 1547 .ctb_global_show .ctb_show.ctb_hideshow{display:block;}
1546 1548 .ctb_global_show .ctb_show+.input_area,.ctb_global_show .ctb_show+div.text_cell_input{border-top-right-radius:0px;border-top-left-radius:0px;}
1547 1549 .celltoolbar .button_container select{margin:10px;margin-top:1px;margin-bottom:0px;padding:0;font-size:87%;width:auto;display:inline-block;height:18px;line-height:18px;vertical-align:top;}
1548 1550 .celltoolbar label{display:inline-block;height:15px;line-height:15px;vertical-align:top;}
1549 1551 .celltoolbar label span{font-size:85%;}
1550 1552 .celltoolbar input[type=checkbox]{margin:0px;margin-left:4px;margin-right:4px;}
1551 1553 .celltoolbar .ui-button{border:none;vertical-align:top;height:20px;min-width:30px;}
1552 1554 .completions{position:absolute;z-index:10;overflow:hidden;border:1px solid #ababab;border-radius:4px;-webkit-box-shadow:0px 6px 10px -1px #adadad;-moz-box-shadow:0px 6px 10px -1px #adadad;box-shadow:0px 6px 10px -1px #adadad;}
1553 1555 .completions select{background:white;outline:none;border:none;padding:0px;margin:0px;overflow:auto;font-family:monospace;font-size:110%;color:#000000;}
1554 1556 .completions select option.context{color:#0064cd;}
1555 1557 #menubar .navbar-inner{min-height:28px;border-top:1px;border-radius:0px 0px 4px 4px;}
1556 1558 #menubar .navbar{margin-bottom:8px;}
1557 1559 .nav-wrapper{border-bottom:1px solid #d4d4d4;}
1558 1560 #menubar li.dropdown{line-height:12px;}
1559 1561 #notification_area{z-index:10;}
1560 1562 .notification_widget{color:#777777;padding:1px 12px;margin:2px 4px;z-index:10;border:1px solid #ccc;border-radius:4px;background:rgba(240, 240, 240, 0.5);}
1561 1563 div#pager_splitter{height:8px;}
1562 1564 #pager-container{position:relative;padding:15px 0px;}
1563 1565 div#pager{overflow:auto;display:none;}div#pager pre{font-size:13px;line-height:1.231em;color:#000000;background-color:#f7f7f7;padding:0.4em;}
1564 1566 .shortcut_key{display:inline-block;width:15ex;text-align:right;font-family:monospace;}
1565 1567 .shortcut_descr{display:inline-block;}
1566 1568 div.quickhelp{float:left;width:50%;}
1567 1569 span#save_widget{padding:0px 5px;margin-top:12px;}
1568 1570 span#checkpoint_status,span#autosave_status{font-size:small;}
1569 1571 @media (max-width:767px){span#save_widget{font-size:small;} span#checkpoint_status,span#autosave_status{font-size:x-small;}}@media (max-width:767px){span#checkpoint_status,span#autosave_status{display:none;}}@media (min-width:768px) and (max-width:979px){span#checkpoint_status{display:none;} span#autosave_status{font-size:x-small;}}.toolbar{padding:0px 10px;margin-top:-5px;}.toolbar select,.toolbar label{width:auto;height:26px;vertical-align:middle;margin-right:2px;margin-bottom:0px;display:inline;font-size:92%;margin-left:0.3em;margin-right:0.3em;padding:0px;padding-top:3px;}
1570 1572 .toolbar .btn{padding:2px 8px;}
1571 1573 .toolbar .btn-group{margin-top:0px;}
1572 1574 .toolbar-inner{border:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important;box-shadow:none !important;}
1573 1575 #maintoolbar{margin-bottom:0px;}
1574 1576 @-moz-keyframes fadeOut{from{opacity:1;} to{opacity:0;}}@-webkit-keyframes fadeOut{from{opacity:1;} to{opacity:0;}}@-moz-keyframes fadeIn{from{opacity:0;} to{opacity:1;}}@-webkit-keyframes fadeIn{from{opacity:0;} to{opacity:1;}}.bigtooltip{overflow:auto;height:200px;-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;}
1575 1577 .smalltooltip{-webkit-transition-property:height;-webkit-transition-duration:500ms;-moz-transition-property:height;-moz-transition-duration:500ms;transition-property:height;transition-duration:500ms;text-overflow:ellipsis;overflow:hidden;height:80px;}
1576 1578 .tooltipbuttons{position:absolute;padding-right:15px;top:0px;right:0px;}
1577 1579 .tooltiptext{padding-right:30px;}
1578 1580 .ipython_tooltip{max-width:700px;-webkit-animation:fadeOut 400ms;-moz-animation:fadeOut 400ms;animation:fadeOut 400ms;-webkit-animation:fadeIn 400ms;-moz-animation:fadeIn 400ms;animation:fadeIn 400ms;vertical-align:middle;background-color:#f7f7f7;overflow:visible;border:#ababab 1px solid;outline:none;padding:3px;margin:0px;padding-left:7px;font-family:monospace;min-height:50px;-moz-box-shadow:0px 6px 10px -1px #adadad;-webkit-box-shadow:0px 6px 10px -1px #adadad;box-shadow:0px 6px 10px -1px #adadad;border-radius:4px;position:absolute;z-index:2;}.ipython_tooltip a{float:right;}
1579 1581 .ipython_tooltip .tooltiptext pre{border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;font-size:100%;background-color:#f7f7f7;}
1580 1582 .pretooltiparrow{left:0px;margin:0px;top:-16px;width:40px;height:16px;overflow:hidden;position:absolute;}
1581 1583 .pretooltiparrow:before{background-color:#f7f7f7;border:1px #ababab solid;z-index:11;content:"";position:absolute;left:15px;top:10px;width:25px;height:25px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);}
General Comments 0
You need to be logged in to leave comments. Login now