Show More
@@ -60,7 +60,7 b' class APITest(NotebookTestBase):' | |||||
60 | cc1.outputs.append(new_output(output_type="stream", data=u'12')) |
|
60 | cc1.outputs.append(new_output(output_type="stream", data=u'12')) | |
61 | cc1.outputs.append(new_output(output_type="execute_result", |
|
61 | cc1.outputs.append(new_output(output_type="execute_result", | |
62 | mime_bundle={'image/png' : png_green_pixel}, |
|
62 | mime_bundle={'image/png' : png_green_pixel}, | |
63 | prompt_number=1, |
|
63 | execution_count=1, | |
64 | )) |
|
64 | )) | |
65 | nb.cells.append(cc1) |
|
65 | nb.cells.append(cc1) | |
66 |
|
66 |
@@ -471,7 +471,7 b' define([' | |||||
471 | this.code_mirror.clearHistory(); |
|
471 | this.code_mirror.clearHistory(); | |
472 | this.auto_highlight(); |
|
472 | this.auto_highlight(); | |
473 | } |
|
473 | } | |
474 |
this.set_input_prompt(data. |
|
474 | this.set_input_prompt(data.execution_count); | |
475 | this.output_area.trusted = data.metadata.trusted || false; |
|
475 | this.output_area.trusted = data.metadata.trusted || false; | |
476 | this.output_area.fromJSON(data.outputs); |
|
476 | this.output_area.fromJSON(data.outputs); | |
477 | if (data.metadata.collapsed !== undefined) { |
|
477 | if (data.metadata.collapsed !== undefined) { | |
@@ -490,9 +490,9 b' define([' | |||||
490 | data.source = this.get_text(); |
|
490 | data.source = this.get_text(); | |
491 | // is finite protect against undefined and '*' value |
|
491 | // is finite protect against undefined and '*' value | |
492 | if (isFinite(this.input_prompt_number)) { |
|
492 | if (isFinite(this.input_prompt_number)) { | |
493 |
data. |
|
493 | data.execution_count = this.input_prompt_number; | |
494 | } else { |
|
494 | } else { | |
495 |
data. |
|
495 | data.execution_count = null; | |
496 | } |
|
496 | } | |
497 | var outputs = this.output_area.toJSON(); |
|
497 | var outputs = this.output_area.toJSON(); | |
498 | data.outputs = outputs; |
|
498 | data.outputs = outputs; |
@@ -220,7 +220,7 b' define([' | |||||
220 | json = content.data; |
|
220 | json = content.data; | |
221 | json.output_type = msg_type; |
|
221 | json.output_type = msg_type; | |
222 | json.metadata = content.metadata; |
|
222 | json.metadata = content.metadata; | |
223 |
json. |
|
223 | json.execution_count = content.execution_count; | |
224 | } else if (msg_type === "error") { |
|
224 | } else if (msg_type === "error") { | |
225 | json.ename = content.ename; |
|
225 | json.ename = content.ename; | |
226 | json.evalue = content.evalue; |
|
226 | json.evalue = content.evalue; | |
@@ -414,7 +414,7 b' define([' | |||||
414 |
|
414 | |||
415 |
|
415 | |||
416 | OutputArea.prototype.append_execute_result = function (json) { |
|
416 | OutputArea.prototype.append_execute_result = function (json) { | |
417 |
var n = json. |
|
417 | var n = json.execution_count || ' '; | |
418 | var toinsert = this.create_output_area(); |
|
418 | var toinsert = this.create_output_area(); | |
419 | if (this.prompt_area) { |
|
419 | if (this.prompt_area) { | |
420 | toinsert.find('div.prompt').addClass('output_prompt').text('Out[' + n + ']:'); |
|
420 | toinsert.find('div.prompt').addClass('output_prompt').text('Out[' + n + ']:'); |
@@ -13,7 +13,7 b' casper.notebook_test(function () {' | |||||
13 | this.evaluate(function () { |
|
13 | this.evaluate(function () { | |
14 | var cell = IPython.notebook.get_cell(0); |
|
14 | var cell = IPython.notebook.get_cell(0); | |
15 | var json = cell.toJSON(); |
|
15 | var json = cell.toJSON(); | |
16 |
json. |
|
16 | json.execution_count = "<script> alert('hello from input prompts !')</script>"; | |
17 | cell.fromJSON(json); |
|
17 | cell.fromJSON(json); | |
18 | }); |
|
18 | }); | |
19 |
|
19 |
@@ -17,6 +17,7 b'' | |||||
17 | }, |
|
17 | }, | |
18 | { |
|
18 | { | |
19 | "cell_type": "code", |
|
19 | "cell_type": "code", | |
|
20 | "execution_count": 1, | |||
20 | "metadata": { |
|
21 | "metadata": { | |
21 | "collapsed": false |
|
22 | "collapsed": false | |
22 | }, |
|
23 | }, | |
@@ -28,18 +29,17 b'' | |||||
28 | "text": "\nWelcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\nFor more information, type 'help(pylab)'.\n" |
|
29 | "text": "\nWelcome to pylab, a matplotlib-based Python environment [backend: module://IPython.kernel.zmq.pylab.backend_inline].\nFor more information, type 'help(pylab)'.\n" | |
29 | } |
|
30 | } | |
30 | ], |
|
31 | ], | |
31 | "prompt_number": 1, |
|
|||
32 | "source": [ |
|
32 | "source": [ | |
33 | "%pylab inline" |
|
33 | "%pylab inline" | |
34 | ] |
|
34 | ] | |
35 | }, |
|
35 | }, | |
36 | { |
|
36 | { | |
37 | "cell_type": "code", |
|
37 | "cell_type": "code", | |
|
38 | "execution_count": 2, | |||
38 | "metadata": { |
|
39 | "metadata": { | |
39 | "collapsed": false |
|
40 | "collapsed": false | |
40 | }, |
|
41 | }, | |
41 | "outputs": [], |
|
42 | "outputs": [], | |
42 | "prompt_number": 2, |
|
|||
43 | "source": [ |
|
43 | "source": [ | |
44 | "import numpy as np" |
|
44 | "import numpy as np" | |
45 | ] |
|
45 | ] | |
@@ -53,62 +53,62 b'' | |||||
53 | }, |
|
53 | }, | |
54 | { |
|
54 | { | |
55 | "cell_type": "code", |
|
55 | "cell_type": "code", | |
|
56 | "execution_count": 6, | |||
56 | "metadata": { |
|
57 | "metadata": { | |
57 | "collapsed": false |
|
58 | "collapsed": false | |
58 | }, |
|
59 | }, | |
59 | "outputs": [], |
|
60 | "outputs": [], | |
60 | "prompt_number": 6, |
|
|||
61 | "source": [ |
|
61 | "source": [ | |
62 | "a = np.random.uniform(size=(100,100))" |
|
62 | "a = np.random.uniform(size=(100,100))" | |
63 | ] |
|
63 | ] | |
64 | }, |
|
64 | }, | |
65 | { |
|
65 | { | |
66 | "cell_type": "code", |
|
66 | "cell_type": "code", | |
|
67 | "execution_count": 7, | |||
67 | "metadata": { |
|
68 | "metadata": { | |
68 | "collapsed": false |
|
69 | "collapsed": false | |
69 | }, |
|
70 | }, | |
70 | "outputs": [ |
|
71 | "outputs": [ | |
71 | { |
|
72 | { | |
|
73 | "execution_count": 7, | |||
72 | "metadata": {}, |
|
74 | "metadata": {}, | |
73 | "output_type": "execute_result", |
|
75 | "output_type": "execute_result", | |
74 | "prompt_number": 7, |
|
|||
75 | "text/plain": [ |
|
76 | "text/plain": [ | |
76 | "(100, 100)" |
|
77 | "(100, 100)" | |
77 | ] |
|
78 | ] | |
78 | } |
|
79 | } | |
79 | ], |
|
80 | ], | |
80 | "prompt_number": 7, |
|
|||
81 | "source": [ |
|
81 | "source": [ | |
82 | "a.shape" |
|
82 | "a.shape" | |
83 | ] |
|
83 | ] | |
84 | }, |
|
84 | }, | |
85 | { |
|
85 | { | |
86 | "cell_type": "code", |
|
86 | "cell_type": "code", | |
|
87 | "execution_count": 8, | |||
87 | "metadata": { |
|
88 | "metadata": { | |
88 | "collapsed": false |
|
89 | "collapsed": false | |
89 | }, |
|
90 | }, | |
90 | "outputs": [], |
|
91 | "outputs": [], | |
91 | "prompt_number": 8, |
|
|||
92 | "source": [ |
|
92 | "source": [ | |
93 | "evs = np.linalg.eigvals(a)" |
|
93 | "evs = np.linalg.eigvals(a)" | |
94 | ] |
|
94 | ] | |
95 | }, |
|
95 | }, | |
96 | { |
|
96 | { | |
97 | "cell_type": "code", |
|
97 | "cell_type": "code", | |
|
98 | "execution_count": 10, | |||
98 | "metadata": { |
|
99 | "metadata": { | |
99 | "collapsed": false |
|
100 | "collapsed": false | |
100 | }, |
|
101 | }, | |
101 | "outputs": [ |
|
102 | "outputs": [ | |
102 | { |
|
103 | { | |
|
104 | "execution_count": 10, | |||
103 | "metadata": {}, |
|
105 | "metadata": {}, | |
104 | "output_type": "execute_result", |
|
106 | "output_type": "execute_result", | |
105 | "prompt_number": 10, |
|
|||
106 | "text/plain": [ |
|
107 | "text/plain": [ | |
107 | "(100,)" |
|
108 | "(100,)" | |
108 | ] |
|
109 | ] | |
109 | } |
|
110 | } | |
110 | ], |
|
111 | ], | |
111 | "prompt_number": 10, |
|
|||
112 | "source": [ |
|
112 | "source": [ | |
113 | "evs.shape" |
|
113 | "evs.shape" | |
114 | ] |
|
114 | ] | |
@@ -122,14 +122,15 b'' | |||||
122 | }, |
|
122 | }, | |
123 | { |
|
123 | { | |
124 | "cell_type": "code", |
|
124 | "cell_type": "code", | |
|
125 | "execution_count": 14, | |||
125 | "metadata": { |
|
126 | "metadata": { | |
126 | "collapsed": false |
|
127 | "collapsed": false | |
127 | }, |
|
128 | }, | |
128 | "outputs": [ |
|
129 | "outputs": [ | |
129 | { |
|
130 | { | |
|
131 | "execution_count": 14, | |||
130 | "metadata": {}, |
|
132 | "metadata": {}, | |
131 | "output_type": "execute_result", |
|
133 | "output_type": "execute_result", | |
132 | "prompt_number": 14, |
|
|||
133 | "text/plain": [ |
|
134 | "text/plain": [ | |
134 | "(array([95, 4, 0, 0, 0, 0, 0, 0, 0, 1]),\n", |
|
135 | "(array([95, 4, 0, 0, 0, 0, 0, 0, 0, 1]),\n", | |
135 | " array([ -2.93566063, 2.35937011, 7.65440086, 12.9494316 ,\n", |
|
136 | " array([ -2.93566063, 2.35937011, 7.65440086, 12.9494316 ,\n", | |
@@ -147,18 +148,17 b'' | |||||
147 | ] |
|
148 | ] | |
148 | } |
|
149 | } | |
149 | ], |
|
150 | ], | |
150 | "prompt_number": 14, |
|
|||
151 | "source": [ |
|
151 | "source": [ | |
152 | "hist(evs.real)" |
|
152 | "hist(evs.real)" | |
153 | ] |
|
153 | ] | |
154 | }, |
|
154 | }, | |
155 | { |
|
155 | { | |
156 | "cell_type": "code", |
|
156 | "cell_type": "code", | |
|
157 | "execution_count": null, | |||
157 | "metadata": { |
|
158 | "metadata": { | |
158 | "collapsed": false |
|
159 | "collapsed": false | |
159 | }, |
|
160 | }, | |
160 | "outputs": [], |
|
161 | "outputs": [], | |
161 | "prompt_number": null, |
|
|||
162 | "source": [] |
|
162 | "source": [] | |
163 | } |
|
163 | } | |
164 | ], |
|
164 | ], |
@@ -3,16 +3,8 b'' | |||||
3 | # Copyright (c) IPython Development Team. |
|
3 | # Copyright (c) IPython Development Team. | |
4 | # Distributed under the terms of the Modified BSD License. |
|
4 | # Distributed under the terms of the Modified BSD License. | |
5 |
|
5 | |||
6 | #----------------------------------------------------------------------------- |
|
|||
7 | # Imports |
|
|||
8 | #----------------------------------------------------------------------------- |
|
|||
9 |
|
||||
10 | from .base import Preprocessor |
|
6 | from .base import Preprocessor | |
11 |
|
7 | |||
12 |
|
||||
13 | #----------------------------------------------------------------------------- |
|
|||
14 | # Classes |
|
|||
15 | #----------------------------------------------------------------------------- |
|
|||
16 | class ClearOutputPreprocessor(Preprocessor): |
|
8 | class ClearOutputPreprocessor(Preprocessor): | |
17 | """ |
|
9 | """ | |
18 | Removes the output from all code cells in a notebook. |
|
10 | Removes the output from all code cells in a notebook. | |
@@ -24,5 +16,5 b' class ClearOutputPreprocessor(Preprocessor):' | |||||
24 | """ |
|
16 | """ | |
25 | if cell.cell_type == 'code': |
|
17 | if cell.cell_type == 'code': | |
26 | cell.outputs = [] |
|
18 | cell.outputs = [] | |
27 |
cell. |
|
19 | cell.execution_count = None | |
28 | return cell, resources |
|
20 | return cell, resources |
@@ -88,8 +88,7 b' class ExecutePreprocessor(Preprocessor):' | |||||
88 |
|
88 | |||
89 | # set the prompt number for the input and the output |
|
89 | # set the prompt number for the input and the output | |
90 | if 'execution_count' in content: |
|
90 | if 'execution_count' in content: | |
91 |
cell[' |
|
91 | cell['execution_count'] = content['execution_count'] | |
92 | out.prompt_number = content['execution_count'] |
|
|||
93 |
|
92 | |||
94 | if msg_type == 'status': |
|
93 | if msg_type == 'status': | |
95 | if content['execution_state'] == 'idle': |
|
94 | if content['execution_state'] == 'idle': | |
@@ -101,8 +100,6 b' class ExecutePreprocessor(Preprocessor):' | |||||
101 | elif msg_type == 'clear_output': |
|
100 | elif msg_type == 'clear_output': | |
102 | outs = [] |
|
101 | outs = [] | |
103 | continue |
|
102 | continue | |
104 | elif msg_type == 'execute_result': |
|
|||
105 | cell['prompt_number'] = content['execution_count'] |
|
|||
106 |
|
103 | |||
107 | try: |
|
104 | try: | |
108 | out = output_from_msg(msg) |
|
105 | out = output_from_msg(msg) |
@@ -27,7 +27,7 b' class PreprocessorTestsBase(TestsBase):' | |||||
27 | out['application/pdf'] = 'aA==' |
|
27 | out['application/pdf'] = 'aA==' | |
28 | outputs.append(out) |
|
28 | outputs.append(out) | |
29 |
|
29 | |||
30 |
cells=[nbformat.new_code_cell(source="$ e $", |
|
30 | cells=[nbformat.new_code_cell(source="$ e $", execution_count=1, outputs=outputs), | |
31 | nbformat.new_markdown_cell(source="$ e $")] |
|
31 | nbformat.new_markdown_cell(source="$ e $")] | |
32 |
|
32 | |||
33 | return nbformat.new_notebook(cells=cells) |
|
33 | return nbformat.new_notebook(cells=cells) |
@@ -2,17 +2,18 b'' | |||||
2 | "cells": [ |
|
2 | "cells": [ | |
3 | { |
|
3 | { | |
4 | "cell_type": "code", |
|
4 | "cell_type": "code", | |
|
5 | "execution_count": 1, | |||
5 | "metadata": { |
|
6 | "metadata": { | |
6 | "collapsed": false |
|
7 | "collapsed": false | |
7 | }, |
|
8 | }, | |
8 | "outputs": [], |
|
9 | "outputs": [], | |
9 | "prompt_number": 1, |
|
|||
10 | "source": [ |
|
10 | "source": [ | |
11 | "from IPython.display import clear_output" |
|
11 | "from IPython.display import clear_output" | |
12 | ] |
|
12 | ] | |
13 | }, |
|
13 | }, | |
14 | { |
|
14 | { | |
15 | "cell_type": "code", |
|
15 | "cell_type": "code", | |
|
16 | "execution_count": 2, | |||
16 | "metadata": { |
|
17 | "metadata": { | |
17 | "collapsed": false |
|
18 | "collapsed": false | |
18 | }, |
|
19 | }, | |
@@ -24,7 +25,6 b'' | |||||
24 | "text": "9\n" |
|
25 | "text": "9\n" | |
25 | } |
|
26 | } | |
26 | ], |
|
27 | ], | |
27 | "prompt_number": 2, |
|
|||
28 | "source": [ |
|
28 | "source": [ | |
29 | "for i in range(10):\n", |
|
29 | "for i in range(10):\n", | |
30 | " clear_output()\n", |
|
30 | " clear_output()\n", |
@@ -2,17 +2,18 b'' | |||||
2 | "cells": [ |
|
2 | "cells": [ | |
3 | { |
|
3 | { | |
4 | "cell_type": "code", |
|
4 | "cell_type": "code", | |
|
5 | "execution_count": 1, | |||
5 | "metadata": { |
|
6 | "metadata": { | |
6 | "collapsed": false |
|
7 | "collapsed": false | |
7 | }, |
|
8 | }, | |
8 | "outputs": [], |
|
9 | "outputs": [], | |
9 | "prompt_number": 1, |
|
|||
10 | "source": [ |
|
10 | "source": [ | |
11 | "i, j = 1, 1" |
|
11 | "i, j = 1, 1" | |
12 | ] |
|
12 | ] | |
13 | }, |
|
13 | }, | |
14 | { |
|
14 | { | |
15 | "cell_type": "code", |
|
15 | "cell_type": "code", | |
|
16 | "execution_count": 2, | |||
16 | "metadata": { |
|
17 | "metadata": { | |
17 | "collapsed": false |
|
18 | "collapsed": false | |
18 | }, |
|
19 | }, | |
@@ -24,7 +25,6 b'' | |||||
24 | "text": "2\n3\n5\n8\n13\n21\n34\n55\n89\n144\n" |
|
25 | "text": "2\n3\n5\n8\n13\n21\n34\n55\n89\n144\n" | |
25 | } |
|
26 | } | |
26 | ], |
|
27 | ], | |
27 | "prompt_number": 2, |
|
|||
28 | "source": [ |
|
28 | "source": [ | |
29 | "for m in range(10):\n", |
|
29 | "for m in range(10):\n", | |
30 | " i, j = j, i + j\n", |
|
30 | " i, j = j, i + j\n", |
@@ -2,6 +2,7 b'' | |||||
2 | "cells": [ |
|
2 | "cells": [ | |
3 | { |
|
3 | { | |
4 | "cell_type": "code", |
|
4 | "cell_type": "code", | |
|
5 | "execution_count": 1, | |||
5 | "metadata": { |
|
6 | "metadata": { | |
6 | "collapsed": false |
|
7 | "collapsed": false | |
7 | }, |
|
8 | }, | |
@@ -13,7 +14,6 b'' | |||||
13 | "text": "Hello World\n" |
|
14 | "text": "Hello World\n" | |
14 | } |
|
15 | } | |
15 | ], |
|
16 | ], | |
16 | "prompt_number": 1, |
|
|||
17 | "source": [ |
|
17 | "source": [ | |
18 | "print(\"Hello World\")" |
|
18 | "print(\"Hello World\")" | |
19 | ] |
|
19 | ] |
@@ -2,22 +2,22 b'' | |||||
2 | "cells": [ |
|
2 | "cells": [ | |
3 | { |
|
3 | { | |
4 | "cell_type": "code", |
|
4 | "cell_type": "code", | |
|
5 | "execution_count": 1, | |||
5 | "metadata": { |
|
6 | "metadata": { | |
6 | "collapsed": false |
|
7 | "collapsed": false | |
7 | }, |
|
8 | }, | |
8 | "outputs": [], |
|
9 | "outputs": [], | |
9 | "prompt_number": 1, |
|
|||
10 | "source": [ |
|
10 | "source": [ | |
11 | "from IPython.display import Image" |
|
11 | "from IPython.display import Image" | |
12 | ] |
|
12 | ] | |
13 | }, |
|
13 | }, | |
14 | { |
|
14 | { | |
15 | "cell_type": "code", |
|
15 | "cell_type": "code", | |
|
16 | "execution_count": 2, | |||
16 | "metadata": { |
|
17 | "metadata": { | |
17 | "collapsed": false |
|
18 | "collapsed": false | |
18 | }, |
|
19 | }, | |
19 | "outputs": [], |
|
20 | "outputs": [], | |
20 | "prompt_number": 2, |
|
|||
21 | "source": [ |
|
21 | "source": [ | |
22 | "Image('../input/python.png');" |
|
22 | "Image('../input/python.png');" | |
23 | ] |
|
23 | ] |
@@ -2,22 +2,24 b'' | |||||
2 | "cells": [ |
|
2 | "cells": [ | |
3 | { |
|
3 | { | |
4 | "cell_type": "code", |
|
4 | "cell_type": "code", | |
|
5 | "execution_count": 1, | |||
5 | "metadata": { |
|
6 | "metadata": { | |
6 | "collapsed": false |
|
7 | "collapsed": false | |
7 | }, |
|
8 | }, | |
8 | "outputs": [], |
|
9 | "outputs": [], | |
9 | "prompt_number": 1, |
|
|||
10 | "source": [ |
|
10 | "source": [ | |
11 | "from IPython.display import SVG" |
|
11 | "from IPython.display import SVG" | |
12 | ] |
|
12 | ] | |
13 | }, |
|
13 | }, | |
14 | { |
|
14 | { | |
15 | "cell_type": "code", |
|
15 | "cell_type": "code", | |
|
16 | "execution_count": 2, | |||
16 | "metadata": { |
|
17 | "metadata": { | |
17 | "collapsed": false |
|
18 | "collapsed": false | |
18 | }, |
|
19 | }, | |
19 | "outputs": [ |
|
20 | "outputs": [ | |
20 | { |
|
21 | { | |
|
22 | "execution_count": 2, | |||
21 | "image/svg+xml": [ |
|
23 | "image/svg+xml": [ | |
22 | "<svg height=\"100\" width=\"100\">\n", |
|
24 | "<svg height=\"100\" width=\"100\">\n", | |
23 | " <circle cx=\"50\" cy=\"50\" fill=\"red\" r=\"40\" stroke=\"black\" stroke-width=\"2\"/>\n", |
|
25 | " <circle cx=\"50\" cy=\"50\" fill=\"red\" r=\"40\" stroke=\"black\" stroke-width=\"2\"/>\n", | |
@@ -25,13 +27,11 b'' | |||||
25 | ], |
|
27 | ], | |
26 | "metadata": {}, |
|
28 | "metadata": {}, | |
27 | "output_type": "execute_result", |
|
29 | "output_type": "execute_result", | |
28 | "prompt_number": 2, |
|
|||
29 | "text/plain": [ |
|
30 | "text/plain": [ | |
30 | "<IPython.core.display.SVG object>" |
|
31 | "<IPython.core.display.SVG object>" | |
31 | ] |
|
32 | ] | |
32 | } |
|
33 | } | |
33 | ], |
|
34 | ], | |
34 | "prompt_number": 2, |
|
|||
35 | "source": [ |
|
35 | "source": [ | |
36 | "SVG(data='''\n", |
|
36 | "SVG(data='''\n", | |
37 | "<svg height=\"100\" width=\"100\">\n", |
|
37 | "<svg height=\"100\" width=\"100\">\n", |
@@ -2,6 +2,7 b'' | |||||
2 | "cells": [ |
|
2 | "cells": [ | |
3 | { |
|
3 | { | |
4 | "cell_type": "code", |
|
4 | "cell_type": "code", | |
|
5 | "execution_count": 1, | |||
5 | "metadata": { |
|
6 | "metadata": { | |
6 | "collapsed": false |
|
7 | "collapsed": false | |
7 | }, |
|
8 | }, | |
@@ -19,13 +20,13 b'' | |||||
19 | ] |
|
20 | ] | |
20 | } |
|
21 | } | |
21 | ], |
|
22 | ], | |
22 | "prompt_number": 1, |
|
|||
23 | "source": [ |
|
23 | "source": [ | |
24 | "raise Exception(\"message\")" |
|
24 | "raise Exception(\"message\")" | |
25 | ] |
|
25 | ] | |
26 | }, |
|
26 | }, | |
27 | { |
|
27 | { | |
28 | "cell_type": "code", |
|
28 | "cell_type": "code", | |
|
29 | "execution_count": 2, | |||
29 | "metadata": { |
|
30 | "metadata": { | |
30 | "collapsed": false |
|
31 | "collapsed": false | |
31 | }, |
|
32 | }, | |
@@ -37,7 +38,6 b'' | |||||
37 | "text": "ok\n" |
|
38 | "text": "ok\n" | |
38 | } |
|
39 | } | |
39 | ], |
|
40 | ], | |
40 | "prompt_number": 2, |
|
|||
41 | "source": [ |
|
41 | "source": [ | |
42 | "print('ok')" |
|
42 | "print('ok')" | |
43 | ] |
|
43 | ] |
@@ -2,6 +2,7 b'' | |||||
2 | "cells": [ |
|
2 | "cells": [ | |
3 | { |
|
3 | { | |
4 | "cell_type": "code", |
|
4 | "cell_type": "code", | |
|
5 | "execution_count": 1, | |||
5 | "metadata": { |
|
6 | "metadata": { | |
6 | "collapsed": false |
|
7 | "collapsed": false | |
7 | }, |
|
8 | }, | |
@@ -13,7 +14,6 b'' | |||||
13 | "text": "\u2603\n" |
|
14 | "text": "\u2603\n" | |
14 | } |
|
15 | } | |
15 | ], |
|
16 | ], | |
16 | "prompt_number": 1, |
|
|||
17 | "source": [ |
|
17 | "source": [ | |
18 | "print('\u2603')" |
|
18 | "print('\u2603')" | |
19 | ] |
|
19 | ] |
@@ -32,4 +32,4 b' class TestClearOutput(PreprocessorTestsBase):' | |||||
32 | preprocessor = self.build_preprocessor() |
|
32 | preprocessor = self.build_preprocessor() | |
33 | nb, res = preprocessor(nb, res) |
|
33 | nb, res = preprocessor(nb, res) | |
34 | assert nb.cells[0].outputs == [] |
|
34 | assert nb.cells[0].outputs == [] | |
35 |
assert nb.cells[0]. |
|
35 | assert nb.cells[0].execution_count is None |
@@ -33,7 +33,7 b' class TestCoalesceStreams(PreprocessorTestsBase):' | |||||
33 | nbformat.new_output(output_type="stream", name="stdout", text="5"), |
|
33 | nbformat.new_output(output_type="stream", name="stdout", text="5"), | |
34 | nbformat.new_output(output_type="stream", name="stdout", text="6"), |
|
34 | nbformat.new_output(output_type="stream", name="stdout", text="6"), | |
35 | nbformat.new_output(output_type="stream", name="stdout", text="7")] |
|
35 | nbformat.new_output(output_type="stream", name="stdout", text="7")] | |
36 |
cells=[nbformat.new_code_cell(source="# None", |
|
36 | cells=[nbformat.new_code_cell(source="# None", execution_count=1,outputs=outputs)] | |
37 |
|
37 | |||
38 | nb = nbformat.new_notebook(cells=cells) |
|
38 | nb = nbformat.new_notebook(cells=cells) | |
39 | res = self.build_resources() |
|
39 | res = self.build_resources() | |
@@ -49,7 +49,7 b' class TestCoalesceStreams(PreprocessorTestsBase):' | |||||
49 | nbformat.new_output(output_type="stream", name="stdout", text="\nz"), |
|
49 | nbformat.new_output(output_type="stream", name="stdout", text="\nz"), | |
50 | nbformat.new_output(output_type="stream", name="stdout", text="\rc\n"), |
|
50 | nbformat.new_output(output_type="stream", name="stdout", text="\rc\n"), | |
51 | nbformat.new_output(output_type="stream", name="stdout", text="z\rz\rd")] |
|
51 | nbformat.new_output(output_type="stream", name="stdout", text="z\rz\rd")] | |
52 |
cells=[nbformat.new_code_cell(source="# None", |
|
52 | cells=[nbformat.new_code_cell(source="# None", execution_count=1,outputs=outputs)] | |
53 |
|
53 | |||
54 | nb = nbformat.new_notebook(cells=cells) |
|
54 | nb = nbformat.new_notebook(cells=cells) | |
55 | res = self.build_resources() |
|
55 | res = self.build_resources() |
@@ -53,9 +53,9 b' class TestExecute(PreprocessorTestsBase):' | |||||
53 | normalized_actual_outputs = list(map(self.normalize_output, actual_outputs)) |
|
53 | normalized_actual_outputs = list(map(self.normalize_output, actual_outputs)) | |
54 | assert normalized_expected_outputs == normalized_actual_outputs |
|
54 | assert normalized_expected_outputs == normalized_actual_outputs | |
55 |
|
55 | |||
56 |
expected_ |
|
56 | expected_execution_count = expected_cell.get('execution_count', None) | |
57 |
actual_ |
|
57 | actual_execution_count = actual_cell.get('execution_count', None) | |
58 |
assert expected_ |
|
58 | assert expected_execution_count == actual_execution_count | |
59 |
|
59 | |||
60 |
|
60 | |||
61 | def build_preprocessor(self): |
|
61 | def build_preprocessor(self): | |
@@ -81,8 +81,8 b' class TestExecute(PreprocessorTestsBase):' | |||||
81 | preprocessor = self.build_preprocessor() |
|
81 | preprocessor = self.build_preprocessor() | |
82 | cleaned_input_nb = copy.deepcopy(input_nb) |
|
82 | cleaned_input_nb = copy.deepcopy(input_nb) | |
83 | for cell in cleaned_input_nb.cells: |
|
83 | for cell in cleaned_input_nb.cells: | |
84 |
if ' |
|
84 | if 'execution_count' in cell: | |
85 |
del cell[' |
|
85 | del cell['execution_count'] | |
86 | cell['outputs'] = [] |
|
86 | cell['outputs'] = [] | |
87 | output_nb, _ = preprocessor(cleaned_input_nb, res) |
|
87 | output_nb, _ = preprocessor(cleaned_input_nb, res) | |
88 | self.assert_notebooks_equal(output_nb, input_nb) |
|
88 | self.assert_notebooks_equal(output_nb, input_nb) |
@@ -21,9 +21,9 b' class Testrevealhelp(PreprocessorTestsBase):' | |||||
21 | slide_metadata = {'slideshow' : {'slide_type': 'slide'}} |
|
21 | slide_metadata = {'slideshow' : {'slide_type': 'slide'}} | |
22 | subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}} |
|
22 | subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}} | |
23 |
|
23 | |||
24 |
cells=[nbformat.new_code_cell(source="", |
|
24 | cells=[nbformat.new_code_cell(source="", execution_count=1, outputs=outputs), | |
25 | nbformat.new_markdown_cell(source="", metadata=slide_metadata), |
|
25 | nbformat.new_markdown_cell(source="", metadata=slide_metadata), | |
26 |
nbformat.new_code_cell(source="", |
|
26 | nbformat.new_code_cell(source="", execution_count=2, outputs=outputs), | |
27 | nbformat.new_markdown_cell(source="", metadata=slide_metadata), |
|
27 | nbformat.new_markdown_cell(source="", metadata=slide_metadata), | |
28 | nbformat.new_markdown_cell(source="", metadata=subslide_metadata)] |
|
28 | nbformat.new_markdown_cell(source="", metadata=subslide_metadata)] | |
29 |
|
29 |
@@ -47,7 +47,7 b' class Testsvg2pdf(PreprocessorTestsBase):' | |||||
47 | slide_metadata = {'slideshow' : {'slide_type': 'slide'}} |
|
47 | slide_metadata = {'slideshow' : {'slide_type': 'slide'}} | |
48 | subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}} |
|
48 | subslide_metadata = {'slideshow' : {'slide_type': 'subslide'}} | |
49 |
|
49 | |||
50 |
cells=[nbformat.new_code_cell(source="", |
|
50 | cells=[nbformat.new_code_cell(source="", execution_count=1, outputs=outputs)] | |
51 |
|
51 | |||
52 | return nbformat.new_notebook(cells=cells) |
|
52 | return nbformat.new_notebook(cells=cells) | |
53 |
|
53 |
@@ -23,8 +23,8 b'' | |||||
23 |
|
23 | |||
24 | {% block in_prompt -%} |
|
24 | {% block in_prompt -%} | |
25 | <div class="prompt input_prompt"> |
|
25 | <div class="prompt input_prompt"> | |
26 |
{%- if cell. |
|
26 | {%- if cell.execution_count is defined -%} | |
27 |
In [{{ cell. |
|
27 | In [{{ cell.execution_count|replace(None, " ") }}]: | |
28 | {%- else -%} |
|
28 | {%- else -%} | |
29 | In [ ]: |
|
29 | In [ ]: | |
30 | {%- endif -%} |
|
30 | {%- endif -%} | |
@@ -55,8 +55,8 b' In [ ]:' | |||||
55 | <div class="output_area"> |
|
55 | <div class="output_area"> | |
56 | {%- if output.output_type == 'execute_result' -%} |
|
56 | {%- if output.output_type == 'execute_result' -%} | |
57 | <div class="prompt output_prompt"> |
|
57 | <div class="prompt output_prompt"> | |
58 |
{%- if cell. |
|
58 | {%- if cell.execution_count is defined -%} | |
59 |
Out[{{ cell. |
|
59 | Out[{{ cell.execution_count|replace(None, " ") }}]: | |
60 | {%- else -%} |
|
60 | {%- else -%} | |
61 | Out[ ]: |
|
61 | Out[ ]: | |
62 | {%- endif -%} |
|
62 | {%- endif -%} |
@@ -20,7 +20,7 b'' | |||||
20 | ((*- if type in ['text']*)) |
|
20 | ((*- if type in ['text']*)) | |
21 | ((( add_prompt(output.text, cell, 'Out') ))) |
|
21 | ((( add_prompt(output.text, cell, 'Out') ))) | |
22 | ((*- else -*)) |
|
22 | ((*- else -*)) | |
23 |
\verb+Out[((( cell. |
|
23 | \verb+Out[((( cell.execution_count )))]:+((( super() ))) | |
24 | ((*- endif -*)) |
|
24 | ((*- endif -*)) | |
25 | ((*- endfor -*)) |
|
25 | ((*- endfor -*)) | |
26 | ((* endblock execute_result *)) |
|
26 | ((* endblock execute_result *)) | |
@@ -33,13 +33,13 b'' | |||||
33 | % Name: draw_prompt |
|
33 | % Name: draw_prompt | |
34 | % Purpose: Renders an output/input prompt |
|
34 | % Purpose: Renders an output/input prompt | |
35 | ((* macro add_prompt(text, cell, prompt) -*)) |
|
35 | ((* macro add_prompt(text, cell, prompt) -*)) | |
36 |
((*- if cell. |
|
36 | ((*- if cell.execution_count is defined -*)) | |
37 |
((*- set |
|
37 | ((*- set execution_count = "" ~ (cell.execution_count | replace(None, " ")) -*)) | |
38 | ((*- else -*)) |
|
38 | ((*- else -*)) | |
39 |
((*- set |
|
39 | ((*- set execution_count = " " -*)) | |
40 | ((*- endif -*)) |
|
40 | ((*- endif -*)) | |
41 |
((*- set indentation = " " * ( |
|
41 | ((*- set indentation = " " * (execution_count | length + 7) -*)) | |
42 | \begin{verbatim} |
|
42 | \begin{verbatim} | |
43 |
(((- text | add_prompts(first=prompt ~ '[' ~ |
|
43 | (((- text | add_prompts(first=prompt ~ '[' ~ execution_count ~ ']: ', cont=indentation) -))) | |
44 | \end{verbatim} |
|
44 | \end{verbatim} | |
45 | ((*- endmacro *)) |
|
45 | ((*- endmacro *)) |
@@ -33,7 +33,7 b'' | |||||
33 | ((*- if type in ['text']*)) |
|
33 | ((*- if type in ['text']*)) | |
34 | ((( add_prompt(output.text | escape_latex, cell, 'Out', 'outcolor') ))) |
|
34 | ((( add_prompt(output.text | escape_latex, cell, 'Out', 'outcolor') ))) | |
35 | ((* else -*)) |
|
35 | ((* else -*)) | |
36 |
\texttt{\color{outcolor}Out[{\color{outcolor}((( cell. |
|
36 | \texttt{\color{outcolor}Out[{\color{outcolor}((( cell.execution_count )))}]:}((( super() ))) | |
37 | ((*- endif -*)) |
|
37 | ((*- endif -*)) | |
38 | ((*- endfor -*)) |
|
38 | ((*- endfor -*)) | |
39 | ((* endblock execute_result *)) |
|
39 | ((* endblock execute_result *)) | |
@@ -46,13 +46,13 b'' | |||||
46 | % Name: draw_prompt |
|
46 | % Name: draw_prompt | |
47 | % Purpose: Renders an output/input prompt |
|
47 | % Purpose: Renders an output/input prompt | |
48 | ((* macro add_prompt(text, cell, prompt, prompt_color) -*)) |
|
48 | ((* macro add_prompt(text, cell, prompt, prompt_color) -*)) | |
49 |
((*- if cell. |
|
49 | ((*- if cell.execution_count is defined -*)) | |
50 |
((*- set |
|
50 | ((*- set execution_count = "" ~ (cell.execution_count | replace(None, " ")) -*)) | |
51 | ((*- else -*)) |
|
51 | ((*- else -*)) | |
52 |
((*- set |
|
52 | ((*- set execution_count = " " -*)) | |
53 | ((*- endif -*)) |
|
53 | ((*- endif -*)) | |
54 |
((*- set indention = " " * ( |
|
54 | ((*- set indention = " " * (execution_count | length + 7) -*)) | |
55 | \begin{Verbatim}[commandchars=\\\{\}] |
|
55 | \begin{Verbatim}[commandchars=\\\{\}] | |
56 |
((( text | add_prompts(first='{\color{' ~ prompt_color ~ '}' ~ prompt ~ '[{\\color{' ~ prompt_color ~ '}' ~ |
|
56 | ((( text | add_prompts(first='{\color{' ~ prompt_color ~ '}' ~ prompt ~ '[{\\color{' ~ prompt_color ~ '}' ~ execution_count ~ '}]:} ', cont=indention) ))) | |
57 | \end{Verbatim} |
|
57 | \end{Verbatim} | |
58 | ((*- endmacro *)) |
|
58 | ((*- endmacro *)) |
@@ -5,7 +5,7 b'' | |||||
5 | {% endblock header %} |
|
5 | {% endblock header %} | |
6 |
|
6 | |||
7 | {% block in_prompt %} |
|
7 | {% block in_prompt %} | |
8 |
# In[{{ cell. |
|
8 | # In[{{ cell.execution_count if cell.execution_count else ' ' }}]: | |
9 | {% endblock in_prompt %} |
|
9 | {% endblock in_prompt %} | |
10 |
|
10 | |||
11 | {% block input %} |
|
11 | {% block input %} |
@@ -17,11 +17,11 b'' | |||||
17 | }, |
|
17 | }, | |
18 | { |
|
18 | { | |
19 | "cell_type": "code", |
|
19 | "cell_type": "code", | |
|
20 | "execution_count": 2, | |||
20 | "metadata": { |
|
21 | "metadata": { | |
21 | "collapsed": false |
|
22 | "collapsed": false | |
22 | }, |
|
23 | }, | |
23 | "outputs": [], |
|
24 | "outputs": [], | |
24 | "prompt_number": 2, |
|
|||
25 | "source": [ |
|
25 | "source": [ | |
26 | "from sympy import init_printing\n", |
|
26 | "from sympy import init_printing\n", | |
27 | "from sympy import *\n", |
|
27 | "from sympy import *\n", | |
@@ -37,11 +37,11 b'' | |||||
37 | }, |
|
37 | }, | |
38 | { |
|
38 | { | |
39 | "cell_type": "code", |
|
39 | "cell_type": "code", | |
|
40 | "execution_count": 4, | |||
40 | "metadata": { |
|
41 | "metadata": { | |
41 | "collapsed": false |
|
42 | "collapsed": false | |
42 | }, |
|
43 | }, | |
43 | "outputs": [], |
|
44 | "outputs": [], | |
44 | "prompt_number": 4, |
|
|||
45 | "source": [ |
|
45 | "source": [ | |
46 | "x,y,z = symbols('x y z')" |
|
46 | "x,y,z = symbols('x y z')" | |
47 | ] |
|
47 | ] | |
@@ -55,15 +55,16 b'' | |||||
55 | }, |
|
55 | }, | |
56 | { |
|
56 | { | |
57 | "cell_type": "code", |
|
57 | "cell_type": "code", | |
|
58 | "execution_count": 6, | |||
58 | "metadata": { |
|
59 | "metadata": { | |
59 | "collapsed": false |
|
60 | "collapsed": false | |
60 | }, |
|
61 | }, | |
61 | "outputs": [ |
|
62 | "outputs": [ | |
62 | { |
|
63 | { | |
|
64 | "execution_count": 6, | |||
63 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKMAAAAZBAMAAACvE4OgAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAACz0lEQVRIDa1UTWjUQBT+ZpvdzW7TGlrxItjYSg/C6vbiDwjmoCgUpHioPYhdqig9\nFJYiPYmW4klB14NgFGnw4EHpj7UgUtTFXhSEBgVBxIOFggWVrrUqiMY3mZkkLNIK7oN575vvvfky\n8yYJIGzgkSlRrULKrivVSkvq6LbxtcaSjV3aSo0lgWyl5pK69V+SRlEsPxNTGYhhDrV3M2Ue2etc\nEDmuMmM+IjolrCuHXNoLoQDNSAXdzbjsfFVKTY1vCgFXFIxenG4cFSSzRewAPnN0FugXjPDr45MQ\nJwoKtitgXL9zT+CsJeIHYG+Z4H1gwhRU4G/FcAQbbYU3KdDo+0sCK8lRU0guA72uKqMYk9RehHxP\niDIu0NS2v90KGShJYi7T7tgvkrQ2vIT2XtRISWNra6lzGc8/PW3ji4PL7Vmge095YIX0iB71NCaZ\n5N3XyM0VCuNIyFNIyY3AMG/KDUvjn90DGmwq9wpIl5AyU5WsTYy0aJf6JFGB5An3Der5jExKHjNR\n4JKPge/EXqDBoOXpkxkmkJHFfAFRVhDIveWA0S57N2Me6yw+DSX1n1uCq3sIfCF2IcjNkjeWyKli\nginHubboOB4vSNAjyaiXE26ygrkyTfod55Lj3CTE+n2P73ImJpnk6wJJKjYJSwt3OQbNJu4icM5s\nKGGbzMuD70N6JSbJD44x7pLDyJrbkfiLpOEhYVMJSVEj83x5YFLyNrAzJsmvJ+uhLrieXvcJDshy\nHtQuD54c2IWWEnSXfUTDZJJfAjcpOW5imp9aHvw4ZZ4NDV4FGjw0tzadKgbFwinJUd//AT0P1tdW\nBtuRU39oKdk9ONQ163fM+nvu/s4D/FX30otdQIZGlSnJKpq6KUxKVqV1WxGHFIhishjhEO1Gi3r4\nkZCMg+hH1henV8EjmFoly1PTMs/Uadaox+FceY2STpmvt9co/Pe0Jvt1GvgDK/Osw/4jQ4wAAAAA\nSUVORK5CYII=\n", |
|
65 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKMAAAAZBAMAAACvE4OgAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAACz0lEQVRIDa1UTWjUQBT+ZpvdzW7TGlrxItjYSg/C6vbiDwjmoCgUpHioPYhdqig9\nFJYiPYmW4klB14NgFGnw4EHpj7UgUtTFXhSEBgVBxIOFggWVrrUqiMY3mZkkLNIK7oN575vvvfky\n8yYJIGzgkSlRrULKrivVSkvq6LbxtcaSjV3aSo0lgWyl5pK69V+SRlEsPxNTGYhhDrV3M2Ue2etc\nEDmuMmM+IjolrCuHXNoLoQDNSAXdzbjsfFVKTY1vCgFXFIxenG4cFSSzRewAPnN0FugXjPDr45MQ\nJwoKtitgXL9zT+CsJeIHYG+Z4H1gwhRU4G/FcAQbbYU3KdDo+0sCK8lRU0guA72uKqMYk9RehHxP\niDIu0NS2v90KGShJYi7T7tgvkrQ2vIT2XtRISWNra6lzGc8/PW3ji4PL7Vmge095YIX0iB71NCaZ\n5N3XyM0VCuNIyFNIyY3AMG/KDUvjn90DGmwq9wpIl5AyU5WsTYy0aJf6JFGB5An3Der5jExKHjNR\n4JKPge/EXqDBoOXpkxkmkJHFfAFRVhDIveWA0S57N2Me6yw+DSX1n1uCq3sIfCF2IcjNkjeWyKli\nginHubboOB4vSNAjyaiXE26ygrkyTfod55Lj3CTE+n2P73ImJpnk6wJJKjYJSwt3OQbNJu4icM5s\nKGGbzMuD70N6JSbJD44x7pLDyJrbkfiLpOEhYVMJSVEj83x5YFLyNrAzJsmvJ+uhLrieXvcJDshy\nHtQuD54c2IWWEnSXfUTDZJJfAjcpOW5imp9aHvw4ZZ4NDV4FGjw0tzadKgbFwinJUd//AT0P1tdW\nBtuRU39oKdk9ONQ163fM+nvu/s4D/FX30otdQIZGlSnJKpq6KUxKVqV1WxGHFIhishjhEO1Gi3r4\nkZCMg+hH1henV8EjmFoly1PTMs/Uadaox+FceY2STpmvt9co/Pe0Jvt1GvgDK/Osw/4jQ4wAAAAA\nSUVORK5CYII=\n", | |
64 | "metadata": {}, |
|
66 | "metadata": {}, | |
65 | "output_type": "execute_result", |
|
67 | "output_type": "execute_result", | |
66 | "prompt_number": 6, |
|
|||
67 | "text/latex": [ |
|
68 | "text/latex": [ | |
68 | "$$x^{2} + 2.0 y + \\sin{\\left (z \\right )}$$" |
|
69 | "$$x^{2} + 2.0 y + \\sin{\\left (z \\right )}$$" | |
69 | ], |
|
70 | ], | |
@@ -73,22 +74,22 b'' | |||||
73 | ] |
|
74 | ] | |
74 | } |
|
75 | } | |
75 | ], |
|
76 | ], | |
76 | "prompt_number": 6, |
|
|||
77 | "source": [ |
|
77 | "source": [ | |
78 | "e = x**2 + 2.0*y + sin(z); e" |
|
78 | "e = x**2 + 2.0*y + sin(z); e" | |
79 | ] |
|
79 | ] | |
80 | }, |
|
80 | }, | |
81 | { |
|
81 | { | |
82 | "cell_type": "code", |
|
82 | "cell_type": "code", | |
|
83 | "execution_count": 7, | |||
83 | "metadata": { |
|
84 | "metadata": { | |
84 | "collapsed": false |
|
85 | "collapsed": false | |
85 | }, |
|
86 | }, | |
86 | "outputs": [ |
|
87 | "outputs": [ | |
87 | { |
|
88 | { | |
|
89 | "execution_count": 7, | |||
88 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAOBAMAAADd6iHDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAAgElEQVQIHWNgVDJ2YICAMAb2H1BmKgPDTChzFgNDvgOEvT8AzgQKrA9gPZPYUwNk\ncXxnCGd4dWA1kMllwFDKUB9wEchUZmAIYNgMZDDwJIDIPyDiEgOjAAPLFwZWBhYFBh6BqzwfGI4y\nSJUXZXH8Zf7A+IBh////v1hzjh5/xwAAW80hUDE8HYkAAAAASUVORK5CYII=\n", |
|
90 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAABQAAAAOBAMAAADd6iHDAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIpm7MhCriUTv3c12\nVGZoascqAAAAgElEQVQIHWNgVDJ2YICAMAb2H1BmKgPDTChzFgNDvgOEvT8AzgQKrA9gPZPYUwNk\ncXxnCGd4dWA1kMllwFDKUB9wEchUZmAIYNgMZDDwJIDIPyDiEgOjAAPLFwZWBhYFBh6BqzwfGI4y\nSJUXZXH8Zf7A+IBh////v1hzjh5/xwAAW80hUDE8HYkAAAAASUVORK5CYII=\n", | |
89 | "metadata": {}, |
|
91 | "metadata": {}, | |
90 | "output_type": "execute_result", |
|
92 | "output_type": "execute_result", | |
91 | "prompt_number": 7, |
|
|||
92 | "text/latex": [ |
|
93 | "text/latex": [ | |
93 | "$$2 x$$" |
|
94 | "$$2 x$$" | |
94 | ], |
|
95 | ], | |
@@ -97,22 +98,22 b'' | |||||
97 | ] |
|
98 | ] | |
98 | } |
|
99 | } | |
99 | ], |
|
100 | ], | |
100 | "prompt_number": 7, |
|
|||
101 | "source": [ |
|
101 | "source": [ | |
102 | "diff(e, x)" |
|
102 | "diff(e, x)" | |
103 | ] |
|
103 | ] | |
104 | }, |
|
104 | }, | |
105 | { |
|
105 | { | |
106 | "cell_type": "code", |
|
106 | "cell_type": "code", | |
|
107 | "execution_count": 8, | |||
107 | "metadata": { |
|
108 | "metadata": { | |
108 | "collapsed": false |
|
109 | "collapsed": false | |
109 | }, |
|
110 | }, | |
110 | "outputs": [ |
|
111 | "outputs": [ | |
111 | { |
|
112 | { | |
|
113 | "execution_count": 8, | |||
112 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAALsAAAAZBAMAAACbakK8AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAADAklEQVRIDbVVS2gTURQ90/wmk0k6tCJCsR1SKShIsxE3CgNWBKUxq9qFmqFqShfF\nUKQrkaDiF0pcCKYgBBcuBLV+wIWKARe6kQ4UhNKKWdiF4KIptmA/xPvmzZuMxdYUzIPcd+655568\nvLlJAL6G32oOasQWNHz5Rvg6nrKh/mygfSzlX2ygPaBUGmov6//NXs1yq4sex2EPrsHemTd2snNg\ntkb+Cx1zBL6SqwxZLvQAKYHzKZaPY4fh4TeHd0S5Nox9OClItm/jiU9DrEwwVEawpiVis9VkimqX\nAOr4o2cCs/0BT2I5+FYJRhJbePQxgzcD7QLEqtV5gdnu2Icr3L45gcCyt74Z7neL4SLQ0nm4S+dM\nYCz1gSPHnhKZDWyHhcCCNKwjqaF/TkwGl0L6nClie/wc1D1xdoNsSLhT0IJkhi7Lzr22xb8keE/N\nPm0Sc9yEuhRUyuiG9HzvFNeImCyq39SriOhtQI7IV/TiTqE8glqwohjE0NJwiANxOZTdZoxtfzSa\nx2tI8DtHcKQoQFmV6f1XT2swibxFL+6k5EgenhBCqKLTPX3ULnaYdDlaTMcCSd8zuXTvBq2bJUJr\nlE4WgSV5ZRdBzLFgO6nzhJp1ltvrlB2HCoWxQuG+jTvt2GxBWUZaU2mMApZNuSHA3vJpCliRhqqs\nZtvbTrb9ZIk+i70Ut1OcnpgeKskTCFUwjaYy8Jhr3eiefq0HIfa7yC6HOwVyULRuNDn21JngbcL+\nE8A+MNnSxb+w59+Cj2tELJBbjEZr8SGwn0j2aLkTPdp08R2OcKV6fXB3ikPH3n8tM5WTfrETtZcw\ng3QWH0dH7nKNiMkszqo/EDafaHhJ5Bm6ee4UtdAabxnMcmUUl0SnYx+uVqs5XAGN9QGgdeCrASv0\n3TmCsJcOdhnozexD38goK9HXynEKr1OKDs9guhQD039kGySyIQpJAdbvJ9YTlPvyUl3/aLUf34G/\nuGxIyXpE37DoLbAHwJaU53t9MRCfrU8o/k4iRn36Lar8Wd5wAfgN4R6xelyy/ssAAAAASUVORK5C\nYII=\n", |
|
114 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAALsAAAAZBAMAAACbakK8AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEHarIkSJZt3NVLsy\nme8Q6PJIAAADAklEQVRIDbVVS2gTURQ90/wmk0k6tCJCsR1SKShIsxE3CgNWBKUxq9qFmqFqShfF\nUKQrkaDiF0pcCKYgBBcuBLV+wIWKARe6kQ4UhNKKWdiF4KIptmA/xPvmzZuMxdYUzIPcd+655568\nvLlJAL6G32oOasQWNHz5Rvg6nrKh/mygfSzlX2ygPaBUGmov6//NXs1yq4sex2EPrsHemTd2snNg\ntkb+Cx1zBL6SqwxZLvQAKYHzKZaPY4fh4TeHd0S5Nox9OClItm/jiU9DrEwwVEawpiVis9VkimqX\nAOr4o2cCs/0BT2I5+FYJRhJbePQxgzcD7QLEqtV5gdnu2Icr3L45gcCyt74Z7neL4SLQ0nm4S+dM\nYCz1gSPHnhKZDWyHhcCCNKwjqaF/TkwGl0L6nClie/wc1D1xdoNsSLhT0IJkhi7Lzr22xb8keE/N\nPm0Sc9yEuhRUyuiG9HzvFNeImCyq39SriOhtQI7IV/TiTqE8glqwohjE0NJwiANxOZTdZoxtfzSa\nx2tI8DtHcKQoQFmV6f1XT2swibxFL+6k5EgenhBCqKLTPX3ULnaYdDlaTMcCSd8zuXTvBq2bJUJr\nlE4WgSV5ZRdBzLFgO6nzhJp1ltvrlB2HCoWxQuG+jTvt2GxBWUZaU2mMApZNuSHA3vJpCliRhqqs\nZtvbTrb9ZIk+i70Ut1OcnpgeKskTCFUwjaYy8Jhr3eiefq0HIfa7yC6HOwVyULRuNDn21JngbcL+\nE8A+MNnSxb+w59+Cj2tELJBbjEZr8SGwn0j2aLkTPdp08R2OcKV6fXB3ikPH3n8tM5WTfrETtZcw\ng3QWH0dH7nKNiMkszqo/EDafaHhJ5Bm6ee4UtdAabxnMcmUUl0SnYx+uVqs5XAGN9QGgdeCrASv0\n3TmCsJcOdhnozexD38goK9HXynEKr1OKDs9guhQD039kGySyIQpJAdbvJ9YTlPvyUl3/aLUf34G/\nuGxIyXpE37DoLbAHwJaU53t9MRCfrU8o/k4iRn36Lar8Wd5wAfgN4R6xelyy/ssAAAAASUVORK5C\nYII=\n", | |
113 | "metadata": {}, |
|
115 | "metadata": {}, | |
114 | "output_type": "execute_result", |
|
116 | "output_type": "execute_result", | |
115 | "prompt_number": 8, |
|
|||
116 | "text/latex": [ |
|
117 | "text/latex": [ | |
117 | "$$x^{2} z + 2.0 y z - \\cos{\\left (z \\right )}$$" |
|
118 | "$$x^{2} z + 2.0 y z - \\cos{\\left (z \\right )}$$" | |
118 | ], |
|
119 | ], | |
@@ -122,18 +123,17 b'' | |||||
122 | ] |
|
123 | ] | |
123 | } |
|
124 | } | |
124 | ], |
|
125 | ], | |
125 | "prompt_number": 8, |
|
|||
126 | "source": [ |
|
126 | "source": [ | |
127 | "integrate(e, z)" |
|
127 | "integrate(e, z)" | |
128 | ] |
|
128 | ] | |
129 | }, |
|
129 | }, | |
130 | { |
|
130 | { | |
131 | "cell_type": "code", |
|
131 | "cell_type": "code", | |
|
132 | "execution_count": null, | |||
132 | "metadata": { |
|
133 | "metadata": { | |
133 | "collapsed": false |
|
134 | "collapsed": false | |
134 | }, |
|
135 | }, | |
135 | "outputs": [], |
|
136 | "outputs": [], | |
136 | "prompt_number": null, |
|
|||
137 | "source": [] |
|
137 | "source": [] | |
138 | } |
|
138 | } | |
139 | ], |
|
139 | ], |
@@ -17,6 +17,7 b'' | |||||
17 | }, |
|
17 | }, | |
18 | { |
|
18 | { | |
19 | "cell_type": "code", |
|
19 | "cell_type": "code", | |
|
20 | "execution_count": 1, | |||
20 | "metadata": { |
|
21 | "metadata": { | |
21 | "collapsed": false |
|
22 | "collapsed": false | |
22 | }, |
|
23 | }, | |
@@ -28,7 +29,6 b'' | |||||
28 | "text": "module://IPython.kernel.zmq.pylab.backend_inline\n" |
|
29 | "text": "module://IPython.kernel.zmq.pylab.backend_inline\n" | |
29 | } |
|
30 | } | |
30 | ], |
|
31 | ], | |
31 | "prompt_number": 1, |
|
|||
32 | "source": [ |
|
32 | "source": [ | |
33 | "%matplotlib inline\n", |
|
33 | "%matplotlib inline\n", | |
34 | "import matplotlib\n", |
|
34 | "import matplotlib\n", | |
@@ -38,11 +38,11 b'' | |||||
38 | }, |
|
38 | }, | |
39 | { |
|
39 | { | |
40 | "cell_type": "code", |
|
40 | "cell_type": "code", | |
|
41 | "execution_count": 2, | |||
41 | "metadata": { |
|
42 | "metadata": { | |
42 | "collapsed": false |
|
43 | "collapsed": false | |
43 | }, |
|
44 | }, | |
44 | "outputs": [], |
|
45 | "outputs": [], | |
45 | "prompt_number": 2, |
|
|||
46 | "source": [ |
|
46 | "source": [ | |
47 | "from IPython.display import set_matplotlib_formats\n", |
|
47 | "from IPython.display import set_matplotlib_formats\n", | |
48 | "set_matplotlib_formats('png', 'pdf')\n", |
|
48 | "set_matplotlib_formats('png', 'pdf')\n", | |
@@ -51,31 +51,31 b'' | |||||
51 | }, |
|
51 | }, | |
52 | { |
|
52 | { | |
53 | "cell_type": "code", |
|
53 | "cell_type": "code", | |
|
54 | "execution_count": 3, | |||
54 | "metadata": { |
|
55 | "metadata": { | |
55 | "collapsed": false |
|
56 | "collapsed": false | |
56 | }, |
|
57 | }, | |
57 | "outputs": [ |
|
58 | "outputs": [ | |
58 | { |
|
59 | { | |
|
60 | "execution_count": 3, | |||
59 | "metadata": {}, |
|
61 | "metadata": {}, | |
60 | "output_type": "execute_result", |
|
62 | "output_type": "execute_result", | |
61 | "prompt_number": 3, |
|
|||
62 | "text/plain": [ |
|
63 | "text/plain": [ | |
63 | "{matplotlib.figure.Figure: <function IPython.core.pylabtools.<lambda>>}" |
|
64 | "{matplotlib.figure.Figure: <function IPython.core.pylabtools.<lambda>>}" | |
64 | ] |
|
65 | ] | |
65 | } |
|
66 | } | |
66 | ], |
|
67 | ], | |
67 | "prompt_number": 3, |
|
|||
68 | "source": [ |
|
68 | "source": [ | |
69 | "ip.display_formatter.formatters['application/pdf'].type_printers" |
|
69 | "ip.display_formatter.formatters['application/pdf'].type_printers" | |
70 | ] |
|
70 | ] | |
71 | }, |
|
71 | }, | |
72 | { |
|
72 | { | |
73 | "cell_type": "code", |
|
73 | "cell_type": "code", | |
|
74 | "execution_count": 4, | |||
74 | "metadata": { |
|
75 | "metadata": { | |
75 | "collapsed": false |
|
76 | "collapsed": false | |
76 | }, |
|
77 | }, | |
77 | "outputs": [], |
|
78 | "outputs": [], | |
78 | "prompt_number": 4, |
|
|||
79 | "source": [ |
|
79 | "source": [ | |
80 | "import numpy as np" |
|
80 | "import numpy as np" | |
81 | ] |
|
81 | ] | |
@@ -89,62 +89,62 b'' | |||||
89 | }, |
|
89 | }, | |
90 | { |
|
90 | { | |
91 | "cell_type": "code", |
|
91 | "cell_type": "code", | |
|
92 | "execution_count": 5, | |||
92 | "metadata": { |
|
93 | "metadata": { | |
93 | "collapsed": false |
|
94 | "collapsed": false | |
94 | }, |
|
95 | }, | |
95 | "outputs": [], |
|
96 | "outputs": [], | |
96 | "prompt_number": 5, |
|
|||
97 | "source": [ |
|
97 | "source": [ | |
98 | "a = np.random.uniform(size=(100,100))" |
|
98 | "a = np.random.uniform(size=(100,100))" | |
99 | ] |
|
99 | ] | |
100 | }, |
|
100 | }, | |
101 | { |
|
101 | { | |
102 | "cell_type": "code", |
|
102 | "cell_type": "code", | |
|
103 | "execution_count": 6, | |||
103 | "metadata": { |
|
104 | "metadata": { | |
104 | "collapsed": false |
|
105 | "collapsed": false | |
105 | }, |
|
106 | }, | |
106 | "outputs": [ |
|
107 | "outputs": [ | |
107 | { |
|
108 | { | |
|
109 | "execution_count": 6, | |||
108 | "metadata": {}, |
|
110 | "metadata": {}, | |
109 | "output_type": "execute_result", |
|
111 | "output_type": "execute_result", | |
110 | "prompt_number": 6, |
|
|||
111 | "text/plain": [ |
|
112 | "text/plain": [ | |
112 | "(100, 100)" |
|
113 | "(100, 100)" | |
113 | ] |
|
114 | ] | |
114 | } |
|
115 | } | |
115 | ], |
|
116 | ], | |
116 | "prompt_number": 6, |
|
|||
117 | "source": [ |
|
117 | "source": [ | |
118 | "a.shape" |
|
118 | "a.shape" | |
119 | ] |
|
119 | ] | |
120 | }, |
|
120 | }, | |
121 | { |
|
121 | { | |
122 | "cell_type": "code", |
|
122 | "cell_type": "code", | |
|
123 | "execution_count": 7, | |||
123 | "metadata": { |
|
124 | "metadata": { | |
124 | "collapsed": false |
|
125 | "collapsed": false | |
125 | }, |
|
126 | }, | |
126 | "outputs": [], |
|
127 | "outputs": [], | |
127 | "prompt_number": 7, |
|
|||
128 | "source": [ |
|
128 | "source": [ | |
129 | "evs = np.linalg.eigvals(a)" |
|
129 | "evs = np.linalg.eigvals(a)" | |
130 | ] |
|
130 | ] | |
131 | }, |
|
131 | }, | |
132 | { |
|
132 | { | |
133 | "cell_type": "code", |
|
133 | "cell_type": "code", | |
|
134 | "execution_count": 8, | |||
134 | "metadata": { |
|
135 | "metadata": { | |
135 | "collapsed": false |
|
136 | "collapsed": false | |
136 | }, |
|
137 | }, | |
137 | "outputs": [ |
|
138 | "outputs": [ | |
138 | { |
|
139 | { | |
|
140 | "execution_count": 8, | |||
139 | "metadata": {}, |
|
141 | "metadata": {}, | |
140 | "output_type": "execute_result", |
|
142 | "output_type": "execute_result", | |
141 | "prompt_number": 8, |
|
|||
142 | "text/plain": [ |
|
143 | "text/plain": [ | |
143 | "(100,)" |
|
144 | "(100,)" | |
144 | ] |
|
145 | ] | |
145 | } |
|
146 | } | |
146 | ], |
|
147 | ], | |
147 | "prompt_number": 8, |
|
|||
148 | "source": [ |
|
148 | "source": [ | |
149 | "evs.shape" |
|
149 | "evs.shape" | |
150 | ] |
|
150 | ] | |
@@ -166,14 +166,15 b'' | |||||
166 | }, |
|
166 | }, | |
167 | { |
|
167 | { | |
168 | "cell_type": "code", |
|
168 | "cell_type": "code", | |
|
169 | "execution_count": 9, | |||
169 | "metadata": { |
|
170 | "metadata": { | |
170 | "collapsed": false |
|
171 | "collapsed": false | |
171 | }, |
|
172 | }, | |
172 | "outputs": [ |
|
173 | "outputs": [ | |
173 | { |
|
174 | { | |
|
175 | "execution_count": 9, | |||
174 | "metadata": {}, |
|
176 | "metadata": {}, | |
175 | "output_type": "execute_result", |
|
177 | "output_type": "execute_result", | |
176 | "prompt_number": 9, |
|
|||
177 | "text/plain": [ |
|
178 | "text/plain": [ | |
178 | "(array([97, 2, 0, 0, 0, 0, 0, 0, 0, 1]),\n", |
|
179 | "(array([97, 2, 0, 0, 0, 0, 0, 0, 0, 1]),\n", | |
179 | " array([ -2.59479443, 2.67371141, 7.94221725, 13.21072308,\n", |
|
180 | " array([ -2.59479443, 2.67371141, 7.94221725, 13.21072308,\n", | |
@@ -192,7 +193,6 b'' | |||||
192 | ] |
|
193 | ] | |
193 | } |
|
194 | } | |
194 | ], |
|
195 | ], | |
195 | "prompt_number": 9, |
|
|||
196 | "source": [ |
|
196 | "source": [ | |
197 | "plt.hist(evs.real)" |
|
197 | "plt.hist(evs.real)" | |
198 | ] |
|
198 | ] |
@@ -211,7 +211,7 b' class NotebookNotary(LoggingConfigurable):' | |||||
211 | output_type = output['output_type'] |
|
211 | output_type = output['output_type'] | |
212 | if output_type in {'execute_result', 'display_data'}: |
|
212 | if output_type in {'execute_result', 'display_data'}: | |
213 | # if there are any data keys not in the safe whitelist |
|
213 | # if there are any data keys not in the safe whitelist | |
214 |
output_keys = set(output).difference({"output_type", " |
|
214 | output_keys = set(output).difference({"output_type", "execution_count", "metadata"}) | |
215 | if output_keys.difference(safe): |
|
215 | if output_keys.difference(safe): | |
216 | return False |
|
216 | return False | |
217 |
|
217 |
@@ -52,7 +52,7 b'' | |||||
52 | ] |
|
52 | ] | |
53 | } |
|
53 | } | |
54 | ], |
|
54 | ], | |
55 |
" |
|
55 | "execution_count": 1 | |
56 | }, |
|
56 | }, | |
57 | { |
|
57 | { | |
58 | "cell_type": "heading", |
|
58 | "cell_type": "heading", | |
@@ -88,13 +88,13 b'' | |||||
88 | ], |
|
88 | ], | |
89 | "metadata": {}, |
|
89 | "metadata": {}, | |
90 | "output_type": "execute_result", |
|
90 | "output_type": "execute_result", | |
91 |
" |
|
91 | "execution_count": 3, | |
92 | "text/plain": [ |
|
92 | "text/plain": [ | |
93 | "<IPython.core.display.HTML at 0x1112757d0>" |
|
93 | "<IPython.core.display.HTML at 0x1112757d0>" | |
94 | ] |
|
94 | ] | |
95 | } |
|
95 | } | |
96 | ], |
|
96 | ], | |
97 |
" |
|
97 | "execution_count": 3 | |
98 | }, |
|
98 | }, | |
99 | { |
|
99 | { | |
100 | "cell_type": "code", |
|
100 | "cell_type": "code", | |
@@ -118,7 +118,7 b'' | |||||
118 | ] |
|
118 | ] | |
119 | } |
|
119 | } | |
120 | ], |
|
120 | ], | |
121 |
" |
|
121 | "execution_count": 7 | |
122 | }, |
|
122 | }, | |
123 | { |
|
123 | { | |
124 | "cell_type": "heading", |
|
124 | "cell_type": "heading", | |
@@ -143,13 +143,13 b'' | |||||
143 | "metadata": {}, |
|
143 | "metadata": {}, | |
144 | "output_type": "execute_result", |
|
144 | "output_type": "execute_result", | |
145 | "image/png": "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\n", |
|
145 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAggAAABDCAYAAAD5/P3lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAH3AAAB9wBYvxo6AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURB\nVHic7Z15uBxF1bjfugkJhCWBsCSAJGACNg4QCI3RT1lEAVE+UEBNOmwCDcjHT1wQgU+WD3dFxA1o\nCAikAZFFVlnCjizpsCUjHQjBIAkQlpCFJGS79fvjdGf69vTsc2fuza33eeaZmeqq6jM9vZw6dc4p\nBUwC+tE+fqW1fqmRDpRSHjCggS40sBxYDCxKvL8KzNBaL21EPoPB0DPIWVY/4NlE0ffzYfhgu+Qx\nGHoy/YFjaK+CcB3QkIIAHAWs3wRZsuhUSs0CXgQeBm7UWi/spn0Z+jA5yxpEfYruqnwYllRic5a1\nMaWv8U5gaT4M19Sx396IAnZLfB/SLkEMhp5O/3YL0AvoAHaKXl8HLlZK3QZcpbWe0lbJDOsaHuDU\n0e4u4JAy2wPk/C1JzrKWArOQ0fUtwH35MOysQxaDwbCO0NFuAXoh6wPjgQeUUvcqpUa0WyCDoQls\nCIwBjgfuAV7KWdY+7RWpmJxlXZezrEdylvXxdstiMKzrGAtCYxwI/EspdZbW+g/tFsbQ67kQuBHY\nFNgseh9FV6vCbUAeWBC9PgBeq2EfS6J2MQOBrRDTe5KdgAdzlvW1fBjeUUP/3UbOsoYBE6OvG7VT\nFoOhL9Af+BUwFLkZpV+DaY6V4UPkRpb1+ncT+m8nGwK/V0oN01qf025hDL2XfBi+DLycLMtZVo6u\nCsKfGnSq8/NheEpqHwOBEcDBwJnAsGhTP2ByzrJG5cPwnQb22Sy+0G4BDIa+RH+t9dmlNiqlFKIk\nJJWGi+jq5JPmq8BbJJQArfXqpkncczlbKbVQa/3rdgtiMNRCPgxXAK8Ar+Qs63LgXmDvaPPGwPeA\nH7VJvCRfbLcABkNfouwUg9ZaAwuj178BlFLvVejzgR4WFviM1npcuQpKqf6IyXIjxLS7GzAWuUnu\nXsO+fqWUellr3ZBJdq/jr9+BDn1uve07O9Rz0y6f8PtGZGgWe53oT6SBkZ/q1/nHZy47aloTRTKU\nIR+Gy3OWNR6Zxtg0Kv4KRkEwGPocxgcBiCwcsSI0F5iOhF+ilPok8C3gVGS+thK/VErdrbWuO2ys\ns/+aLZTuOKbe9krrIUCPUBB0B+PQ1P1bdKe6EzAKQgvJh+GbOct6gkJkxM45y+qXDIWMHBhjBWJe\nPgyDWvaRs6zPIVObAG/nw/DpEvUGAp8E9gGGJzbtl7Os7cvs4skqp0V0Yl8jgcOBjyMDhbmIZeWl\nfBg+UUVfReQsayhwELAnsAXi6/E28BxwTz4MP6iyn92RaSCA+/NhuCwqXx9R4MYhU0MfRTK/AjyW\nD8MFGd0ZDFVhFIQKaK3/BXxfKXUlklTq0xWafAI4Driyu2UzGLqRlygoCArYHJif2H4gcFb0+Z2c\nZW2bD8NV1XScs6yNgH8g/jsAPwCeTmzfFPgjYsnbiez71MUVdnMQcF8V4nyUs6whwB8QX4+0s2Ys\n0yPAt/NhGFbRZ/wbzgO+DaxXotqqnGX9GbigCkXhf5CBCsDngYdzljURGQhsWqLN+znL+iFwdT4M\ndYk6BkNJTJhjlWitQ2Bf4P4qqv848t8wGHor6Yd9+ruHJFkC2BI4rIa+D6egHKwmstYlGAxMQCwH\nrRjEPI5ER5S7ZvcFXsxZ1phKneUsawSi8HyH0soB0bbvAM9Ebaplt5xlnYkct1LKAYiFZhJwSQ19\nGwxrMRaEGtBar1RKfRX4JxIzXortou3PN1mE+YgJsSwaeoLHOQCqUy3QSr9eqZ6G/gq2aYVMhqrY\nOfF5FeJwvJZ8GM7JWdY/gC9HRS7wtyr7Pjrx+e6MqYC3KLbU7Qhck/h+FJIKvRRVjfSREXicU8EH\npgAvIIqLBZwGfC7avl5Uf29KkLOsTZCMq8npj9sQx89no37HIlaAODplNPBIzrJ2z4dhNVlaT0HC\nXwFmIkrAC4if2PaIz8/3KCgn385Z1pX5MJxeRd8Gw1qMglAjWutlSqnTgUcqVP0SzVYQtP5mcMXE\nSvvtUUy9YsK5QEWHy7EnTB6lOtSsFohkqEDOsgYAdqJoagkT9Z8pKAj75yzr4/kwnF2h748ho/GY\nq9J1oqiKLj4JOctKK8Yz8mH4Yrl9VcnHkXVYTsyHoZ8WJWdZNyPThbF5/3M5yzowH4alpi9+T0E5\nWA18Nx+Gf0zVeRG4KmdZ90R9bwCMRKwyX69C5h2j91uA4/JhuCSxbTYwJWdZtwNPIFbifsAFSISZ\nwVA1ZoqhDrTWjyIjjXIc3ApZDIZu4ELgY4nvt5Wody8wJ/qsgBOr6HsihfvOfCRrY7v5dYZyAECk\nGP0ISEZmZYZ55yxrB8SyEXNxhnKQ7Pt64H8TRUfmLGuXKmWeC4xPKQfJvp9CLCJlZTYYymEUhPq5\ntcL2XVsihcHQJHKWtU3Osi5GnAZj5iKWgiKitRouTxQdl7OscnPu0HV64dp8GLY7R8pyxEGxJPkw\nfBcZ9ceUSvN8IoV76upK/UZcgawcG3NKqYopfleFU+gDic/b5SzLWIwNNWFOmPqp5CG9sVJqPa11\nVZ7dBkOL2D1nWcmcBkOR8MFtgM/QdTXJZcCR+TBcXqa/SYj5egAFZ8VMX4ScZe2FRPnEXF2z9M3n\n3nwYVsrtAmK6/0z0uVR4ZXLtivvzYfhGpU7zYbgkZ1k3ACdHRQdWIQsUO3ZmkUzB3Q/xjaolLbeh\nj2MUhDrRWr+mlFpJ+eV5hyIxz4YWs98Fj/Rf8uZbozo0/ZYt7D8rf9ORK9stUw/hU9GrEnMAp1R+\ngph8GL4bzdNPiIpOorSzYtJ68FS1IYPdTLWp3hcnPm+Q3pizrA7E+TCmFn+aZN0dcpY1LB+G5e4b\ny6rM8bA49X39GmQyGMwUQ4NUGnkMrbDd0A3sdeLk4z6cN+89pTtDTWd+gyErF+7pTv5eu+XqJbyK\nTDHsmg/DJ6tsc2ni8+dzljUqXSGaevhmoqjIObFNVBzlV8kQug4W5tbQNl13WGatAv+poW+DoW6M\nBaExPgC2LrO9nHWhpSilDqI4NPMhrfXUJvS9M/DfqeJXtdY3N9p3rex50uQ9lFKT6BrTvoFCXbTX\nyZNfmnrZxHtbLVMP4xng74nvK5DzeD7wfIWRayb5MHwiZ1kzgF0oOCuemar2ZQoK8zLgr7Xup5t4\ns0n9DEl9b0RBSPeV5q0a+jYY6sYoCI1RacnZ91siRXUMAH6eKnsYicdulDOAY1NlpzWh35pRqG9R\nIuGN7uw4AfG878s8nw/DX3RDv5dScGY8NmdZP86HYXJaJzm9cHMp7/s2UHdK9BTpKaxBNbRN163k\nt9Rux05DH8FMMTTGZhW2v9sSKarjbopNk/sqpUY30qlSahCSGS/JCuD6RvqtF6UpMm/HaHTJbYaG\nmQzED/0umRVzlrUZhXwJ0HOmF5pJOlXyxzJrZbNt6rtZP8HQIzAKQp0opTZAlsItxTKtdTnv75YS\nLR7lpYqrjV0vx2EUH4fbtdZtucnpMqOrDjPy6jYii8DkRFHSYnAEhem22cBjrZKrVeTDcCldTf/p\nh345ksrEGprnF2EwNIRREOrnMxW2z2uJFLVxJcXmy2OVUo34ShydUda+EaIq7T2u0SZTY/eSdFY8\nMGdZm0efk86J6/LCQUnFp5pIkZjkcvQz8mH4YZPkMRgawigI9VNp7v7BlkhRA1rr+RQneNqC2hba\nWYtSajiS9z3JXLomaGktq/VllLIUdKqSWe0MjZMPwxlIel8Q/6Zv5CxrGIX8AJ10XU+hFtIRQ+UW\nKWoXyYyTu+Qsa79KDXKWNRpJyx5zZ9OlMhjqxCgIdaCU6g98o0K1npBCNotLM8rcOvuagCRgSXKN\n1rozq3IrCCZNfFkrfRjotWsCaJinUBODK51/tkuuPkTy/DoYOIDCfeb+fBjW4t2/lqhdcmRdbUri\nVnILXS2HZ1WRvfAcCk61K4A/dYdgBkM9GAWhPr5F6XSrIBf6Qy2SpSaidSReShV/XilV7veUIj29\noOkB2fGmXT7x7sCbOGpFf7VZx4A1m0/znG2nehMyc+0bms7NFJxzxwH7J7Y1OvWUPG9/mLOsLRvs\nr6lEaaOT0TtfBB5ITLWsJWdZg3KWdRNwTKL4wnwYzu9mMQ2GqjFhjjWilBqBpJYtx51a66UV6rST\nS+maJz52VvxRdvVilFK7UbzexGNa67Kr+bWS6X+ekPYs79HkLGt34JOI+Xyz6D2d1vfMnGUdini6\nL0C851/Oh2HD+SyaQT4MV+YsaxJyLm1Gwf9gAXBHg93/JNHHtsArOcuajCztPBDYCkkytBXg5sOw\n5QmF8mF4W86yLgK+HxXtC8zKWVaALMm8CslHsicS7RFzL8VhyAZDWzEKQg0opbYE7qd8prPVdF2h\nrSdyLfALYMNE2XFKqR/XsHbEURll62L4Wiv5PuBUqPPF6JXkLuCQbpGoPi4HfohYKGMHWD9axrlu\n8mF4Z7RuwfioaDBwaonqRemQW0U+DH+Qs6xFwHnIFNwQsv+3mMnA8dHiVwZDj8FMMVSJUuow4DkK\na7GX4gqt9cstEKlutNaL6boULMho5tBq2iul+lH8IFuCmJcNfZx8GM6hOCFVU5THfBhOQHxfylkH\n3gY+asb+6iUfhhcCewC3l5BlFbJk/P75MDwqlVTKYOgRKK1rizhSSk2h67ximo1abV5XSi2n9EIk\nz2itx5XYVqnfQcjI7DiqW2XtfeCTUbRA3ex50nWfUrqjeJEcrfcLrpj4SCN9xyilxgDPp4of0Fof\nUEXbg4B/pIqv1FrXnVNh7AmTR3V0qIwwRH1E4E28pd5+De0hZ1m/Bb4bfX0+H4Z7dMM+hgGjkDwC\nS5FpjFk9bR4/Z1mDkGmF4VHR20g4Y3oxJYOhR9EXphg6lFLlVjFbH0mZvDGwCTAayCFe0ntTOZ1y\nzDLgkEaVg1ahtX5BKfUU8OlE8ReUUjtorSstCduzch8YehSR5/6ERFG3nBvRuhE9frXUfBguA6pd\n+Mpg6DH0BQXBBro7o+Ea4Bta66e6eT/N5lK6KggKOAE4u1QDpdTGFOdNmNkLf7uh+zgYcRQEMa+3\nJe22wWBoDOOD0DhLgYla67vaLUgd3ETxglLHRXkeSnEExQ5gbQ9tNPQokis5TsqHoVlbwGDohRgF\noTECYHet9Y3tFqQetNYrKDb/DqN46eYk6emF1UhUhMFAzrImUEhDvgr4VRvFMRgMDWAUhPpYAvwf\n8Bmte31+/8uQBEdJMjMrKqW2o5A2N+YfWusePw9s6F5yltWRs6zxwKRE8RXtyEVgMBiaQ1/wQWgm\neWTe/jqtdU9Zz74htNavKaXuAw5KFB+glBqptZ6Tqj6RQlrYGDO90AfJWdY5wNeQFQwHIAmetk5U\neZFCsiCDwdALMQpCed5AphEC4NF12BHvUroqCAoJ7TwvVS+d++BdJEmPoe+xKRLnn0UeODwfhm3N\nRWAwGBqjLygIbwN/LbNdI1MGH6ReL/eWkMUmcDeSeGa7RNlRSqnzdZQoQym1C7Bzqt11NWReNKxb\nzEMU6GHAesBiYCaSLOviaF0Cg8HQi+kLCsLrWuvT2y1ET0ZrvUYp5SG57mO2Bz4LPB59/2ZRQ5P7\noM+SD8OLgYvbLYfBYOg+jJOiIeZKxOs8STJiIb28daC1/lf3imQwGAyGdmEUBAMA0XTKraniI5VS\nA6O0zOnloI31wGAwGNZhjIJgSHJp6vtgJBNlehW65cANLZHIYDAYDG3BKAiGtWitHwVeShV/muLF\nuW7VWi9qjVQGg8FgaAd9wUnRUBuXAn9IfN8f+FyqTo/OfbDnSX8brDpXnqEUe2ropzQvdtDx66ev\nGN9XolIMPQDb9T8LrBd4zsPtlsXQe7Bd/0BgQeA5QbtlMQqCIc21wC+ADaPv6WWu5wAPtVKgWtjt\n6Os2XG/9jhdQjIzTQ2rFF9bQecy4E2/I9UQlwXb9LYDDK1R7K/Cc21shj6FxbNcfDjwGKNv1Rwae\n83q7ZWo2tusPBb6ELGW9BbAICX99Gngs8Jx0hlZDBWzXHwvcC6ywXX9o4DlL2ymPURAMXdBaL1ZK\n+ZRItwz8Jc6N0BMZMFB9GxiZsWnzTjrPAH7QWomqYgTF/h9pngC6RUGwXf+XwC2B50ztjv57M7br\nXwJMCjxneo1NP0SWgAfJq7LOYLv+esAFwOkUL9wWM912/d0Dz+lsnWQ9A9v1BwEXAT8PPKfWVOML\nkPVt3kNWQm0rxgfBkEWph5UG/tJCOWqnQ40ttUkrvWcrRamWwHOmAZsguSfGAi9Hmy5AUhgPAz7f\nHfu2XX8k8ENgx+7ovzdju/4uwP9D/peaCDxnCbANsF3gOYubLVu7sF1/AHAHcBaiHDwI/C+ywNsE\n4KfA68BdfVE5iNgbOBmxqtRE4Dn/BoYDnwg8Z02zBasVY0EwFKG1fkEp9RTioJjkIa11zzaVarYq\nvVFt2TpBaiN6oCwB5tiu/2FUPCvwnLTTaLM5oJv77800dGwCz1kXHXkvRNKydwI/Cjzn1+kKtuuf\ni2TX7Ks0et681yxBGsUoCIZSBBQrCL0h98EbdW7rddiuPwoYFJu/bdffFNgL2BZ4DZgWKR5ZbRWS\n2+KIqGiE7fpjUtXmlrtZRdaHscBAYDowM/CckimWbdffFfgw8JzXou/9kfUccojV5MXAcz4s0XYw\nsCsymu8PzAVmBJ7zVqn9pdoPRVKF7wSsAN4EgqzRve36HcAoZDEqgO0zjs3rged8kGo3gOJ05ADT\ns0bTkan+k9HXGaVGjNFxykVf81nH2Hb9Ich/MRJJeT291H9fL7brj6CwANfPspQDgOi3rijRx/rI\nb8kB7wPPBZ4zL6Ne/JvfCDzn/WhufhvgvsBzVkR1dgN2AR4JPGduom38P7wXeM7c6FzfCfgU4iMR\nlFLebNfPIefXzMBzikz8tusPQyx676bljmTeCfhyVLST7frp//TV9Dluu/6GwOhUvTWB58zIkjFq\nsykyNfmfwHMW2K7fLzoWeyDTFPnAc14t1T7qYwNgT+Rc/wi5ZyT/N20UBEMRSqn+wNdTxQspTqTU\n41BaP6yVOipzGzzSYnG6m6uBz0YPv7OQm3dytc35tuuflHZutF3/BuArwEaJ4p/QNdU2wGnAH9M7\njRSTG5CbS5LQdv2joymTLKYBzwHjbNc/DomW2TCxfbXt+sMCz3k/sa8RwM+Qh/X6qf5W2q4/CTit\nzMN1OPB7CopQktW2658YeM5fEvXvRKZzBiXqZaWUPha4JlW2NfB8Rt0hiANfmjWIuf5jiLPfvVm/\nAfmvbgNmB54zKrkheuD+Bjg11Wap7fpnBJ5TybelFk4E+iE+Fb+ptbHt+scg//nGqfJbgeMDz1mY\nKN4UOZYX2q7fSWHhuNdt198ZOBc4MypbbLv+5wPPeTb6PiJqe5ft+ichx3WXRN8rbdc/OfCcrGis\nR4ChiHKSlSn2f4BzkOvitMRvCKJ9DEzU9TPafwGZlkkyBvExSrKUrtdnmoOBycA5tus/iCyat3li\nu7Zd/0rk2ihS1mzXPwT4E3LulaLTKAiGLL6EaMlJbtBat91pphIjFw289t9DVh4N7Jva9EKnWnpJ\nG0RqBXcjCa08YCqy/PJE4L8A33b9HQPPeTNR/0bgvujzGchoywPSq5U+nd6R7fp7IDfRjYDrEE99\nDeyHrPb5lO364xI36zTb2q4/AUnt/SSyLHQHMvJZklQOIhYChyCLid2FWBoGIQrDfwGnAP8Gskzd\nVvSbBgPvIMdpJjLHuxdikXgg1ewa4Jbo84+BHRAFI/3gT9/QQZa+/iIy9zwccVQrSeA5nbbrX4s8\ncI6htIIQK7xdFJLIAvEEYjmYBlyP/E4LeXj92Xb94YHnnFtOjhrYJ3q/vtbpE9v1fwqcjYxUL0GO\n51bI//g1YIzt+mNTSgJIivfNEIXgBOThfx0ySv8Nct7vgzgfj0+1HQf8E5iPKM/vI+vLHA9cZbs+\nJZSEevgDBZ++3yIKzgVI1FeSrCnD6ci0zebAJxCfjmoZjxzXPPBL5By0gW8jCt3sqHwtkYL1N0RB\n/R2ymOG2yHE5CLFAHAu8ahQEQxbfyijrDdML3HTTkWvUBRfsb88bPb6TzjEK+oHKL184YHL+Jmdl\nu+XrJsYBhwaec0dcYLu+hzw0dkcu/AvjbUmLgu36DqIgPB54zuQq9nURMgI8LjnyBibZrj8z2s/l\ntuvvVcJJbWvkXDoi8JzbKu0s8JxFtut/IqXgAPzOdv0/IiPnb5KhICAjpMGIEjAhPV1iu35HWsbA\nc25ObD8ZURAeqibENBqpTYnark8FBSHiakRBOMx2/cHpB29kSv4KooSlLRYnIcrBHcBXk7/Fdv0b\ngReAM23Xvz7wnJlVyFIJK3qfXUsj2/U/jiiiq4B9ktEytuv/Fhlpfx2xEnw31XxHYLfAc6bbrv8k\ncny/Bnwz8Jy/2q6/DTLd9F8Zu94ceXAeEHhOvM7MNbbrT0UU4vNs15+c2FY3gedcm/hNP0EUhDvL\nKMrJtkuIFPboWNWiIOSAO4HDE7/Dj67FSxEn21+m2pyOWDpuCDxn7fG2Xf8e4F1EIVsceE5oohgM\nXVBKjURuSEke11qXMhv3OPR553VO9Sb407yJZwTexO8FnnNV/qYj11XlAOCfSeUA1s4D/y36mp7f\nrAvb9fdGLDMzU8pBzMXIg2wsMhLKQiFhgxWVg5gM5SDm+uh9VHqD7fr7IlaNFcAJWb4UPcHLPvCc\n2YgVZn3gyIwq30AsQg8lQ+aiefUfR1/PzlB08sD9Udusfmsi2t+Q6GutjspnIE6L16dDaSN/irMR\np8dTbddPOxK/nwgxTZr8747e30SsEkNL7PvXGQrAVYgvwggK/gK9mXMyfuON0fvWkY9Dkp2i97uT\nhYHnLKNgURsDxknRUMz5FJ8XP22DHIbqSc9pxsSOW8ObtJ89ovdXbNcvpQC8j4zcdiTbnAoy4q2b\n6Ia3CYV5/Y0zqsXOf4/WEYveaq5GQuOOQaZekhydqJNkW2BLZF2UzhL/R+xE2XAIa+A52nb9lUho\nY63hd7GD5d1ZGwPPmW27/iuIUrkLXc/n9xP13rZd/yNgVezoF8n1NjAyyyKETGGl97fGdv1/IlaL\n3h7e+06WM2PgOQtt11+GTMcNo6vVJ1aWsyK+4nvFQjAKgiGBUmoshfnOmGe11vdl1Tf0GOaUKI9v\nlqrE9lqJb6b/Hb3KsU2Zba/VslPb9bdDfA0ORLz0N62iWWxVqMkc3iZuRuawP2u7/g6JKI9RSCTR\nYoodhOP/YgNKK2Ix2zZJzjnINMN2NbaL/4uiaIUE/0EUhB3pqiCkMwl2IscjXZZFJ/B2iW1xRtWR\nZWTqDcwps63U9f8Q0TSN7fp/iK0PtuvviPjmrCHyR1qrICilNkTmHjZDLsDke/JzOtwnzY1KqXcR\nR4cFiBab9XlRT87I19dQSo1GNPz0tJOxHvR8mhrOVobB0XuAOBiWo1zmwaqdXW3X3x+4BzGVv4SM\npN9AnPEg21McxMIArTs2dRN4zoe26/8NOA6xGJwfbYqV9b8GnrM81Sz+Lz5A0qOXo2y4Ww3MoT4F\nIY4+KTfNF58TaXN4VthstVNDitLKcdxvOjKmEj0tv0M953fs87E3Eul0B2JliBflOzfwnFcA+iul\n5iEmwQFNEBaK569L0amUWggcqrXO8gg2FKHG2CdW4Uem9XvBlUflu7RUaiByU3lPa92ZKN8cSav8\nfUQBTHKr1rrqueIsxp18/eg1azrLjSYB6NfRsY3G6Is9nDjDYxh4zundvbMotvtm5N50duA5P09t\nT0faJIkfirU+zNrF1YiC4FBQECZE73/JqB//F+u14r+ImIVEOB1iu/6ZNfhwzEamp7YuU2e7RN1m\noZBnW5YVIfZ1qNWfotw51yuIph++hET0bAkcikwpTAEuCjxnSly3PzIP0a8NcnYgD6SBlSoaIhQX\nV2UtVup24LBU6S7IyG+NUuodZP52awojrTSvIjeshlij9XdQKh2jXYRRDtpGfOCruQfEpmzbdn0V\ndP9iPLsgjnEryI67Lzd/PCt6/5Tt+v3LJXAqQ/z7ut2ZO/Ccx23XfxUYZbt+7D8xCngl8Jwsa80s\nZBS8ke36O7cg4ybA5UgegJ0QE/XN5auvZRaiIMQRF12wXX8TCv9ls6eERpOtIMR+EXNS5YsRh8dS\nTo/V+CzUck21i6uR5++4wHNeKFXJRDH0PfoR5fqmtHKwDDhCa73O5JA3lCSeF04v6Z3FPRTMzBO7\nS6AE8Q12PbomgYn5Xpm29yMPhu2RUK96iKMn9q6zfa38JXo/NHoly7oQeM5K4Iro60+jKINuJVJC\nYu/439uuX805A4VkWyfbrp+V/MdFnOmeCmpfFKsSRYMc2/U/DeyG3OfSjpOx5WmfVHmcuXFcFfus\n5ZpqObbrb45EtswqpxyAcVI0FDMbOFxrXeT9a+heopvnEArzolvashT0wmbEapdgGpIU5XDb9R9F\nYqrXQyyL8wPPeTeuGHjOMtv1T0VuqldH6W//jigNmyHOcAcBgwPPcZog20xkRLcJ8DPb9S9CRqM7\nI7kDvoDE1hfdxwLPWWy7/plI7oCLbNffHXm4zUQeRtsjGRP/EXhOKSfcABkpj49i5+9G/putgHmB\n5yxIN4iSF21C14V6Rtiu/yYSW15uHv4a4P8oKAedlPcvOAv4KmItfCTKKfAS8v8NR1ILHwnsl5GA\nqF7ORdYaGA48HGWyfBqYgViDRwCfQR72PkDgOU9E2TvHI4m0TgeeRczb30DyH2iKcyA0ymrgWNv1\nFyDK1NvIQ3tStN3LCH+9HUl29UPb9echFo8BUbtLEKfJtJ9EmgA59ifbrj8bCR3cGDlvZqdTLcPa\n9NCbUMhs2GFLKvPFSAKxZl7/CxEL8pgoA+QMxD+kE3HenAHcHnjOGmNB6Dt8iGjHWSFKK4HHkcQr\nOxvloLXYrr+77fqrEIejNyiE6P0WccZbabv+lFLtG+Ry5AY/BHkYfRDtR9M79QAAA3FJREFUcwYS\nNdCFwHPuQR6a7wHfAR5GMhk+i9xcT6G6KIOKBJ6zFBn9r0GUmBlIWN9ziHf/5yjO/phsfy2yqt4i\nxOJxF3INTI9k/Q7ZoV4xv0PC5LZCci4sQm6g08kYHdquvxy5lt4DwsSmF5EENCts1//Idv3M9LbR\negJTkEx4NvBA1joFifqLIjkeR6wcfwdeQfIFTEEcjHNU79RXkShvw95Ixs5+yOj/KuSh+ATiAHcq\nxb4fxwOXRfJMQc6zlxGF6B3g4MBznmmWnBFzEUfP0xDFcCGiAG+JHKushESXIdanjRBF4l3EInAj\n8vuOqWK/5yNRGaOQFNkfIhkOX6CQgwAA2/W3jkI3V0T7ejjatAFyXb2PXP/LbVnroWGi6bbzo697\nIlaWk5Br93wkk+jztusP7o94Lna7eaoMZU0cVXIAped7eqGZfP2ZqmPFl+ptrVf3n19UpvVMYLRS\nagBywxuEjLwWAe9qrTMXV2mUzs7OP/Xrp+6qt33Hmn5Zue3XNeZTOVoky5nqKiQkrNT883Qk3WvJ\nsMLAc1bbrv9Z5AH6KWRkOB+5wRWlWo7a3Ga7/mOIomAho/GFyI30YeDREru7ELlOq07TG3jONbbr\nT0Nu9KOQm+i/gFsDz3nTdv2fI2FbpdpfHnlpH4LcnHdAlIz5yLErqXgFnvOR7fo28lDYE7lu3kKO\nTdZ9K52xrhTl7knnUVB6SqVeTsr4apQU6lDEbG4hCsFbROsRBE1ebjrwnNB2/XGIGf5gRBkYhPyv\n7yDpjR9MtVkOnGK7/vWIgrFrVPcF4O8ZKbaXIuduWkH6KfL/JbkEsWClfWK2CDzHt10/jzhXjkGO\nyzNIZEiRD00ga3ocaLv+kUh2xo8hSuVURKmIUyiXVGYCWVzKQlJD7xrJNg85b9LX8RLgF6X6SpFU\n9Cpe28gaJgORqEEAbNffDLlvHIQoAndR8NEYilwjExD/nwuUiTQ0GAwGw7qC7fqjEUvKqsBzmhWd\nt05gu/5pyNoifw48J9N5PForxQeeNFMMBoPBYDD0DWL/llvK1In9jt4zCoLBYDAYDH2DePo5MwrJ\ndv0hFPwTnjBRDAaDwWAw9A3+hPgOHRPl25iK+FhsiuR4OARx0Lwf+J1REAwGg8Fg6AMEnvNklL78\nHMRRca/E5hVINNIVwI2B56z6/3ExLRI31pXNAAAAAElFTkSuQmCC\n", | |
146 |
" |
|
146 | "execution_count": 6, | |
147 | "text/plain": [ |
|
147 | "text/plain": [ | |
148 | "<IPython.core.display.Image at 0x111275490>" |
|
148 | "<IPython.core.display.Image at 0x111275490>" | |
149 | ] |
|
149 | ] | |
150 | } |
|
150 | } | |
151 | ], |
|
151 | ], | |
152 |
" |
|
152 | "execution_count": 6 | |
153 | } |
|
153 | } | |
154 | ] |
|
154 | ] | |
155 | } |
|
155 | } |
@@ -75,6 +75,7 b' def upgrade_cell(cell):' | |||||
75 | code cell: |
|
75 | code cell: | |
76 | - remove language metadata |
|
76 | - remove language metadata | |
77 | - cell.input -> cell.source |
|
77 | - cell.input -> cell.source | |
|
78 | - cell.prompt_number -> cell.execution_count | |||
78 | - update outputs |
|
79 | - update outputs | |
79 | """ |
|
80 | """ | |
80 | cell.setdefault('metadata', NotebookNode()) |
|
81 | cell.setdefault('metadata', NotebookNode()) | |
@@ -82,7 +83,7 b' def upgrade_cell(cell):' | |||||
82 | cell.pop('language', '') |
|
83 | cell.pop('language', '') | |
83 | cell.metadata.collapsed = cell.pop('collapsed') |
|
84 | cell.metadata.collapsed = cell.pop('collapsed') | |
84 | cell.source = cell.pop('input') |
|
85 | cell.source = cell.pop('input') | |
85 |
cell. |
|
86 | cell.execution_count = cell.pop('prompt_number', None) | |
86 | cell.outputs = upgrade_outputs(cell.outputs) |
|
87 | cell.outputs = upgrade_outputs(cell.outputs) | |
87 | elif cell.cell_type == 'html': |
|
88 | elif cell.cell_type == 'html': | |
88 | # Technically, this exists. It will never happen in practice. |
|
89 | # Technically, this exists. It will never happen in practice. | |
@@ -90,9 +91,18 b' def upgrade_cell(cell):' | |||||
90 | return cell |
|
91 | return cell | |
91 |
|
92 | |||
92 | def downgrade_cell(cell): |
|
93 | def downgrade_cell(cell): | |
|
94 | """downgrade a cell from v4 to v3 | |||
|
95 | ||||
|
96 | code cell: | |||
|
97 | - set cell.language | |||
|
98 | - cell.input <- cell.source | |||
|
99 | - cell.prompt_number <- cell.execution_count | |||
|
100 | - update outputs | |||
|
101 | """ | |||
93 | if cell.cell_type == 'code': |
|
102 | if cell.cell_type == 'code': | |
94 | cell.language = 'python' |
|
103 | cell.language = 'python' | |
95 | cell.input = cell.pop('source', '') |
|
104 | cell.input = cell.pop('source', '') | |
|
105 | cell.prompt_number = cell.pop('execution_count', None) | |||
96 | cell.collapsed = cell.metadata.pop('collapsed', False) |
|
106 | cell.collapsed = cell.metadata.pop('collapsed', False) | |
97 | cell.outputs = downgrade_outputs(cell.outputs) |
|
107 | cell.outputs = downgrade_outputs(cell.outputs) | |
98 | return cell |
|
108 | return cell | |
@@ -134,6 +144,7 b' def upgrade_output(output):' | |||||
134 | if output['output_type'] in {'pyout', 'display_data'}: |
|
144 | if output['output_type'] in {'pyout', 'display_data'}: | |
135 | if output['output_type'] == 'pyout': |
|
145 | if output['output_type'] == 'pyout': | |
136 | output['output_type'] = 'execute_result' |
|
146 | output['output_type'] = 'execute_result' | |
|
147 | output['execution_count'] = output.pop('prompt_number', None) | |||
137 | to_mime_key(output) |
|
148 | to_mime_key(output) | |
138 | to_mime_key(output.metadata) |
|
149 | to_mime_key(output.metadata) | |
139 | if 'application/json' in output: |
|
150 | if 'application/json' in output: | |
@@ -158,6 +169,7 b' def downgrade_output(output):' | |||||
158 | """ |
|
169 | """ | |
159 | if output['output_type'] == 'execute_result': |
|
170 | if output['output_type'] == 'execute_result': | |
160 | output['output_type'] = 'pyout' |
|
171 | output['output_type'] = 'pyout' | |
|
172 | output['prompt_number'] = output.pop('execution_count', None) | |||
161 | if 'application/json' in output: |
|
173 | if 'application/json' in output: | |
162 | output['application/json'] = json.dumps(output['application/json']) |
|
174 | output['application/json'] = json.dumps(output['application/json']) | |
163 | from_mime_key(output) |
|
175 | from_mime_key(output) |
@@ -74,7 +74,7 b' def output_from_msg(msg):' | |||||
74 | return new_output(output_type=msg_type, |
|
74 | return new_output(output_type=msg_type, | |
75 | metadata=content['metadata'], |
|
75 | metadata=content['metadata'], | |
76 | mime_bundle=content['data'], |
|
76 | mime_bundle=content['data'], | |
77 |
|
|
77 | execution_count=content['execution_count'], | |
78 | ) |
|
78 | ) | |
79 |
|
79 | |||
80 | elif msg_type == 'stream': |
|
80 | elif msg_type == 'stream': | |
@@ -103,7 +103,7 b" def new_code_cell(source='', **kwargs):" | |||||
103 | cell.update(from_dict(kwargs)) |
|
103 | cell.update(from_dict(kwargs)) | |
104 | cell.setdefault('metadata', NotebookNode()) |
|
104 | cell.setdefault('metadata', NotebookNode()) | |
105 | cell.setdefault('source', '') |
|
105 | cell.setdefault('source', '') | |
106 |
cell.setdefault(' |
|
106 | cell.setdefault('execution_count', None) | |
107 | cell.setdefault('outputs', []) |
|
107 | cell.setdefault('outputs', []) | |
108 |
|
108 | |||
109 | validate(cell, 'code_cell') |
|
109 | validate(cell, 'code_cell') |
@@ -150,7 +150,7 b'' | |||||
150 | "description": "Notebook code cell.", |
|
150 | "description": "Notebook code cell.", | |
151 | "type": "object", |
|
151 | "type": "object", | |
152 | "additionalProperties": false, |
|
152 | "additionalProperties": false, | |
153 |
"required": ["cell_type", "metadata", "source", "outputs", " |
|
153 | "required": ["cell_type", "metadata", "source", "outputs", "execution_count"], | |
154 | "properties": { |
|
154 | "properties": { | |
155 | "cell_type": { |
|
155 | "cell_type": { | |
156 | "description": "String identifying the type of cell.", |
|
156 | "description": "String identifying the type of cell.", | |
@@ -179,7 +179,7 b'' | |||||
179 | "type": "array", |
|
179 | "type": "array", | |
180 | "items": {"$ref": "#/definitions/output"} |
|
180 | "items": {"$ref": "#/definitions/output"} | |
181 | }, |
|
181 | }, | |
182 |
" |
|
182 | "execution_count": { | |
183 | "description": "The code cell's prompt number. Will be null if the cell has not been run.", |
|
183 | "description": "The code cell's prompt number. Will be null if the cell has not been run.", | |
184 | "type": ["integer", "null"], |
|
184 | "type": ["integer", "null"], | |
185 | "minimum": 0 |
|
185 | "minimum": 0 | |
@@ -199,15 +199,15 b'' | |||||
199 | "description": "Result of executing a code cell.", |
|
199 | "description": "Result of executing a code cell.", | |
200 | "type": "object", |
|
200 | "type": "object", | |
201 | "additionalProperties": false, |
|
201 | "additionalProperties": false, | |
202 |
"required": ["output_type", "metadata", " |
|
202 | "required": ["output_type", "metadata", "execution_count"], | |
203 | "properties": { |
|
203 | "properties": { | |
204 | "output_type": { |
|
204 | "output_type": { | |
205 | "description": "Type of cell output.", |
|
205 | "description": "Type of cell output.", | |
206 | "enum": ["execute_result"] |
|
206 | "enum": ["execute_result"] | |
207 | }, |
|
207 | }, | |
208 |
" |
|
208 | "execution_count": { | |
209 | "description": "A result's prompt number.", |
|
209 | "description": "A result's prompt number.", | |
210 | "type": ["integer"], |
|
210 | "type": ["integer", "null"], | |
211 | "minimum": 0 |
|
211 | "minimum": 0 | |
212 | }, |
|
212 | }, | |
213 | "application/json": { |
|
213 | "application/json": { | |
@@ -314,7 +314,7 b'' | |||||
314 | "description": "Contents of the cell, represented as an array of lines.", |
|
314 | "description": "Contents of the cell, represented as an array of lines.", | |
315 | "$ref": "#/definitions/misc/multiline_string" |
|
315 | "$ref": "#/definitions/misc/multiline_string" | |
316 | }, |
|
316 | }, | |
317 |
" |
|
317 | "execution_count": { | |
318 | "description": "The code cell's prompt number. Will be null if the cell has not been run.", |
|
318 | "description": "The code cell's prompt number. Will be null if the cell has not been run.", | |
319 | "type": ["integer", "null"], |
|
319 | "type": ["integer", "null"], | |
320 | "minimum": 0 |
|
320 | "minimum": 0 |
@@ -20,7 +20,7 b' cells.append(new_markdown_cell(' | |||||
20 |
|
20 | |||
21 | cells.append(new_code_cell( |
|
21 | cells.append(new_code_cell( | |
22 | source='import numpy', |
|
22 | source='import numpy', | |
23 | prompt_number=1, |
|
23 | execution_count=1, | |
24 | )) |
|
24 | )) | |
25 |
|
25 | |||
26 | cells.append(new_markdown_cell( |
|
26 | cells.append(new_markdown_cell( | |
@@ -38,20 +38,20 b' cells.append(new_heading_cell(' | |||||
38 |
|
38 | |||
39 | cells.append(new_code_cell( |
|
39 | cells.append(new_code_cell( | |
40 | source='a = numpy.random.rand(100)', |
|
40 | source='a = numpy.random.rand(100)', | |
41 | prompt_number=2, |
|
41 | execution_count=2, | |
42 | )) |
|
42 | )) | |
43 | cells.append(new_code_cell( |
|
43 | cells.append(new_code_cell( | |
44 | source='a = 10\nb = 5\n', |
|
44 | source='a = 10\nb = 5\n', | |
45 | prompt_number=3, |
|
45 | execution_count=3, | |
46 | )) |
|
46 | )) | |
47 | cells.append(new_code_cell( |
|
47 | cells.append(new_code_cell( | |
48 | source='a = 10\nb = 5', |
|
48 | source='a = 10\nb = 5', | |
49 | prompt_number=4, |
|
49 | execution_count=4, | |
50 | )) |
|
50 | )) | |
51 |
|
51 | |||
52 | cells.append(new_code_cell( |
|
52 | cells.append(new_code_cell( | |
53 | source=u'print "ünîcødé"', |
|
53 | source=u'print "ünîcødé"', | |
54 | prompt_number=3, |
|
54 | execution_count=3, | |
55 | outputs=[new_output( |
|
55 | outputs=[new_output( | |
56 | output_type=u'execute_result', |
|
56 | output_type=u'execute_result', | |
57 | mime_bundle={ |
|
57 | mime_bundle={ | |
@@ -66,7 +66,7 b' cells.append(new_code_cell(' | |||||
66 | }, |
|
66 | }, | |
67 | 'application/javascript': u'var i=0;' |
|
67 | 'application/javascript': u'var i=0;' | |
68 | }, |
|
68 | }, | |
69 | prompt_number=3 |
|
69 | execution_count=3 | |
70 | ),new_output( |
|
70 | ),new_output( | |
71 | output_type=u'display_data', |
|
71 | output_type=u'display_data', | |
72 | mime_bundle={ |
|
72 | mime_bundle={ |
@@ -61,7 +61,7 b' def test_empty_stream():' | |||||
61 | nt.assert_equal(output.text, '') |
|
61 | nt.assert_equal(output.text, '') | |
62 |
|
62 | |||
63 | def test_empty_execute_result(): |
|
63 | def test_empty_execute_result(): | |
64 |
output = new_output('execute_result', |
|
64 | output = new_output('execute_result', execution_count=1) | |
65 | nt.assert_equal(output.output_type, 'execute_result') |
|
65 | nt.assert_equal(output.output_type, 'execute_result') | |
66 |
|
66 | |||
67 | mimebundle = { |
|
67 | mimebundle = { | |
@@ -80,8 +80,8 b' def test_display_data():' | |||||
80 | nt.assert_equal(output[key], expected) |
|
80 | nt.assert_equal(output[key], expected) | |
81 |
|
81 | |||
82 | def test_execute_result(): |
|
82 | def test_execute_result(): | |
83 |
output = new_output('execute_result', mimebundle, |
|
83 | output = new_output('execute_result', mimebundle, execution_count=10) | |
84 |
nt.assert_equal(output. |
|
84 | nt.assert_equal(output.execution_count, 10) | |
85 | for key, expected in mimebundle.items(): |
|
85 | for key, expected in mimebundle.items(): | |
86 | nt.assert_equal(output[key], expected) |
|
86 | nt.assert_equal(output[key], expected) | |
87 |
|
87 | |||
@@ -95,15 +95,15 b' def test_error():' | |||||
95 | nt.assert_equal(o.traceback, [u'frame 0', u'frame 1', u'frame 2']) |
|
95 | nt.assert_equal(o.traceback, [u'frame 0', u'frame 1', u'frame 2']) | |
96 |
|
96 | |||
97 | def test_code_cell_with_outputs(): |
|
97 | def test_code_cell_with_outputs(): | |
98 |
cell = new_code_cell( |
|
98 | cell = new_code_cell(execution_count=10, outputs=[ | |
99 | new_output('display_data', mimebundle), |
|
99 | new_output('display_data', mimebundle), | |
100 | new_output('stream', text='hello'), |
|
100 | new_output('stream', text='hello'), | |
101 |
new_output('execute_result', mimebundle, |
|
101 | new_output('execute_result', mimebundle, execution_count=10), | |
102 | ]) |
|
102 | ]) | |
103 |
nt.assert_equal(cell. |
|
103 | nt.assert_equal(cell.execution_count, 10) | |
104 | nt.assert_equal(len(cell.outputs), 3) |
|
104 | nt.assert_equal(len(cell.outputs), 3) | |
105 | er = cell.outputs[-1] |
|
105 | er = cell.outputs[-1] | |
106 |
nt.assert_equal(er. |
|
106 | nt.assert_equal(er.execution_count, 10) | |
107 | nt.assert_equal(er['output_type'], 'execute_result') |
|
107 | nt.assert_equal(er['output_type'], 'execute_result') | |
108 |
|
108 | |||
109 | def test_stream(): |
|
109 | def test_stream(): |
General Comments 0
You need to be logged in to leave comments.
Login now