def test_resolve_uri_returns_html_for_directory(): """Should return an html listing of contents when passed directory.""" from server import resolve_uri file1 = 'sample.txt' file2 = 'a_web_page.html' assert file1 in resolve_uri('webroot')[0] assert file2 in resolve_uri('webroot')[0]
def test_resolve_uri_fails_given_dots(): with pytest.raises(IOError): req = ( b"GET /../heres/the/URI HTTP/1.1\r\n" b"Host: www.example.com\r\n" b"\r\n" b"blah blah some kind of body\r\n" b"\r\n" ) server.resolve_uri(req)
def test_resolve_uri_directory(): """Test resolve uri will return correct body response and content type.""" from server import resolve_uri response = ( '<html><body><a style="display:block;margin:10px" href="/a_web_page.html">a_web_page.html</a><a style="display:block;margin:10px" href="/images">images📂</a><a style="display:block;margin:10px" href="/make_time.py">make_time.py</a><a style="display:block;margin:10px" href="/sample.txt">sample.txt</a></body></html>', None) assert resolve_uri("/") == response
def test_resolve_uri_accessing_py_in_root(): """Test if can access a Python file in the root directory.""" from server import resolve_uri assert resolve_uri('/make_time.py') == (b"""#!/usr/bin/env python \"\"\" make_time.py simple script that returns and HTML page with the current time \"\"\" import datetime time_str = datetime.datetime.now().isoformat() html = \"\"\" <http> <body> <h2> The time is: </h2> <p> %s <p> </body> </http> \"\"\" % time_str print(html) """, 'text/x-python')
def test_resolve_uri(msg, result): """Take a msg and return a body of requested resource.""" from server import resolve_uri file_type, body_len, body = resolve_uri(msg) assert b'HTTP/1.1 200 OK\r\nContent-Type: ' + file_type.encode( 'utf8') + b'\r\nContent-Length: ' + str(body_len).encode( 'utf8') + b'\r\n\r\n' + body == result
def test_resolve_uri_accessing_plain_text_in_root(): """Test if can access a plain text file in the root directory.""" from server import resolve_uri assert resolve_uri('/sample.txt') == (b"""This is a very simple text file. Just to show that we can serve it up. It is three lines long. """, 'text/plain')
def test_resolve_uri_python_file(): """Resolve should return the contents of a python file.""" from server import resolve_uri return_val = ("""#!/usr/bin/env python \"\"\" make_time.py simple script that returns and HTML page with the current time \"\"\" import datetime time_str = datetime.datetime.now().isoformat() html = \"\"\" <http> <body> <h2> The time is: </h2> <p> %s <p> </body> </http> \"\"\" % time_str print(html) """, 'text/x-python') assert resolve_uri(b'webroot/make_time.py') == return_val
def test_resolve_uri_returns_content_of_text_file(): """Should properly return the contents of a text file in a tuple.""" from server import resolve_uri return_val = ("""This is a very simple text file. Just to show that we can serve it up. It is three lines long.\n""", "text/plain") assert resolve_uri(b'webroot/sample.txt') == return_val
def send_response(conn, addr): """Send response to client.""" conn.settimeout(2) req = b'' try: packet = conn.recv(8) req = packet while b'\r\n\r\n' not in req: packet = conn.recv(8) req += packet except socket.timeout: pass print(req.decode('utf8')) try: uri = parse_request(req) uri = uri if isinstance(uri, str) else uri.decode('utf8') res = response_ok(*resolve_uri(uri)) except ValueError: res = response_error(400, 'Bad Request') except NotImplementedError as error: if 'GET' in error.args[0]: res = response_error(405, 'Method Not Allowed') else: res = response_error(501, 'Not Implmented') except (OSError, IOError) as error: res = response_error(404, 'Not Found') conn.sendall(res) conn.close()
def test_file_found(): """Test that if a file is found, it will be returned.""" from server import resolve_uri path = "sample.txt" body = (b"This is a very simple text file.\n" b"Just to show that we can serve it up.\n" b"It is three lines long.\n" ) assert resolve_uri(path) == ("text/plain", body)
def test_resolve_uri_html_sub_directory(): """Test if returns HTML file, with the contents of a sub-directory.""" from server import resolve_uri assert resolve_uri('/images') == (b"""<!DOCTYPE html> <html> <body> JPEG_example.jpg sample_1.png Sample_Scene_Balls.jpg </body> </html> """, 'text/html')
def test_valid_root_directory(monkeypatch): monkeypatch.setattr(os.path, 'isdir', lambda x: True) monkeypatch.setattr(os, 'listdir', lambda x: ['foo1.html', 'foo2.html', 'foo3.html']) (body, cont_type) = server.resolve_uri(b'/path/to/dir') expected_body = (b'<head>\n<body>\n<ul>\n' b'<li>foo1.html</li>\n' b'<li>foo2.html</li>\n' b'<li>foo3.html</li>\n</ul>\n' b'</body>\n</head>') assert body == expected_body assert cont_type == 'dir'
def test_resolve_uri_html_root_directory(): """Test if returns HTML file, with the contents of the root directory.""" from server import resolve_uri assert resolve_uri('/') == (b"""<!DOCTYPE html> <html> <body> a_web_page.html images make_time.py sample.txt </body> </html> """, 'text/html')
def test_resolve_uri_to_response_ok_working_for_html(fake_socket): """Test that response_ok returns the file from resolve_uri as the body.""" from server import response_ok, resolve_uri if sys.version_info.major == 3: from http.client import HTTPResponse else: from httplib import HTTPResponse response_str = response_ok(*resolve_uri('/a_web_page.html')) source = fake_socket(response_str) response = HTTPResponse(source) response.begin() assert response.read(len(response_str)) == b"""<!DOCTYPE html>
def test_resolve_uri_accessing_html_in_root(): """Test if can access HTML file in the root directory.""" from server import resolve_uri assert resolve_uri('/a_web_page.html') == (b"""<!DOCTYPE html> <html> <body> <h1>Code Fellows</h1> <p>A fine place to learn Python web programming!</p> </body> </html> """, 'text/html')
def test_resolve_uri_content_of_html(): """Test to see if html file is processed correctly.""" from server import resolve_uri return_val = ("""<!DOCTYPE html> <html> <body> <h1>Code Fellows</h1> <p>A fine place to learn Python web programming!</p> </body> </html> """, "text/html") assert resolve_uri(b'webroot/a_web_page.html') == return_val
def server(conn, address): """Return message to client.""" try: buffer_length = 8 reply_complete = False full_string = u"" while not reply_complete: part = conn.recv(buffer_length) full_string = full_string + part.decode('utf-8') if len(part) < buffer_length: reply_complete = True print(full_string) try: uri = parse_request(full_string) body_tuple = resolve_uri(uri) if body_tuple: conn.send(response_ok(body_tuple)) else: conn.sendall(response_error(u'404 Page Not Found')) conn.close() except NameError('Method not GET'): conn.sendall(response_error(u'405 Method Not Allowed')) conn.close() except TypeError('HTTP protol incorrect'): conn.sendall(response_error(u'505 HTTP Version Not Supported')) conn.close() except SyntaxError('URI incorrect'): conn.sendall(response_error(u'404 Page Not Found')) conn.close() except IOError('File not found'): conn.sendall(response_error(u'404 Page Not Found')) conn.close() except SystemError('Request not fully received'): conn.sendall(response_error()) conn.close() except KeyboardInterrupt: conn.close() finally: conn.close()
def send_http_response(conn, address): # pragma: no cover """Send a properly formatted HTTP response to the client. Request sent by the client should be a properly formatted HTTP request. """ conn.settimeout(2) request = b'' try: packet = conn.recv(8) request = packet while b'\r\n\r\n' not in request: packet = conn.recv(8) request += packet except socket.timeout: pass print(request.decode('utf8')) try: uri = parse_request(request) uri = uri if isinstance(uri, str) else uri.decode('utf8') response = response_ok(*resolve_uri(uri)) except ValueError: response = response_error(400, 'Bad Request') except NotImplementedError as error: if 'GET' in error.args[0]: response = response_error(405, 'Method Not Allowed') else: response = response_error(501, 'Not Implmented') except (OSError, IOError) as error: response = response_error(404, 'Not Found') conn.sendall(response) conn.close()
def test_valid_content_type(monkeypatch): monkeypatch.setattr(os.path, 'isdir', lambda x: False) monkeypatch.setattr(os.path, 'abspath', lambda x: '/abs/path') monkeypatch.setattr(os.path, 'dirname', lambda x: 'dirname') # This class mocks out the opened file class MockOpenResult(object): def read(self): return 'file.txt content 1 2 3' # This class mocks out what happens with 'with open(filename) as f ...' class MockOpenResultHelper(object): def __enter__(self): return MockOpenResult() def __exit__(self, *args): pass monkeypatch.setattr(__builtin__, 'open', lambda x: MockOpenResultHelper()) (body, cont_type) = server.resolve_uri(b'/path/to/file.txt') expected_body = b'file.txt content 1 2 3' assert body == expected_body assert cont_type == 'txt'
def test_resolve_uri_jpeg(): assert server.resolve_uri(b'/images/JPEG_example.jpg')[1] == CONTENT_TYPES[1]
def test_resolve_uri(): """Test that function resolves path and returns directory content.""" from server import resolve_uri path = "/" assert resolve_uri(path) == ("text/html", DIR_RESP)
def test_resolve_uri_dir(uri, body): """Test resolve uri function for a directory.""" assert body in resolve_uri(uri)[0]
def test_resolve_uri_jpg(uri, body, content_length, file_type): """Test resolve uri function with a proper jpg file.""" assert resolve_uri(uri) == (body, content_length, file_type)
def test_resolve_uri_raises_415(): """Test unsupported file type raises 415 error.""" from server import resolve_uri with pytest.raises(TypeError): resolve_uri('/images/sample.bmp')
def test_resolve_uri_images(): """Test image files are present.""" from server import resolve_uri our_tuple = resolve_uri('/images/Sample_Scene_Balls.jpg') assert our_tuple[1] == 'jpg'
def test_resolve_uri_html_type(): """Check uri type for html file.""" from server import resolve_uri contents, content_type, size = resolve_uri('/a_web_page.html') assert content_type == 'text/html'
def test_not_found(): not_found = b"GET starbucks.html HTTP/1.1\r\nHost:" with pytest.raises(LookupError): resolve_uri(parse_request(not_found))
def test_uri_response(): request = b"GET sample.txt HTTP/1.1\r\nHost:" uri = parse_request(request) response = resolve_uri(uri) assert b"This is a very simple text file" in response[0] assert b"text" in response[1]
def test_uri_dir(): request = b"GET images HTTP/1.1\r\nHost:" uri = parse_request(request) response = resolve_uri(uri) assert b"JPEG" in response[0]
def test_resolve_uri_nonexistant_file(): """Assert function returns the correct body.""" from server import resolve_uri path = resolve_uri('/WTF.txt') result = False assert path == result
def test_resolve_uri_dir(): """Test image files are present.""" from server import resolve_uri our_tuple = resolve_uri('/images') assert our_tuple[1] == 'text/html'
def test_resolve_uri_files(): """Test image files are present.""" from server import resolve_uri our_tuple = resolve_uri('/sample.txt') assert our_tuple[1] == 'txt'
def test_resolve_uri_txt_type(): """Check uri type for sample.txt file.""" from server import resolve_uri contents, content_type, size = resolve_uri('/sample.txt') assert content_type == 'text/plain'
def test_resolve_uri_bad(): with pytest.raises(IOError): server.resolve_uri(b'/badfile.txt')
def test_resolve_uri_value_error(): with pytest.raises(ValueError): server.resolve_uri(b'/path/to/../')
def test_resolve_uri_directory(): assert server.resolve_uri(b'/images')[1] == CONTENT_TYPES[3]
def test_resolve_uri_works_with_directory(): """Test proper URI resolution with directory input.""" from server import resolve_uri assert resolve_uri('/images')[0] == 'text/directory'
def test_resolve_uri_python(): assert server.resolve_uri(b'/make_time.py')[1] == CONTENT_TYPES[4]
def test_resolve_uri_raises_404(): """Test bad directory raises 404 error.""" from server import resolve_uri with pytest.raises(IOError): resolve_uri('/your_mom')
def test_resolve_uri_html(): assert server.resolve_uri(b'/a_web_page.html')[1] == CONTENT_TYPES[3]
def test_resolve_uri_py(uri, body, content_length, file_type): """Test resolve uri function for a py file.""" assert resolve_uri(uri) == (body, content_length, file_type)
def test_resolve_uri_png(): assert server.resolve_uri(b'/images/sample_1.png')[1] == CONTENT_TYPES[2]
def test_resolve_uri_error(uri): """Test resolve uri function for bad uri.""" with pytest.raises(IOError): resolve_uri(uri)
def test_resolve_raises_error_bad_path(): """Should raise value error when given a non existent path.""" from server import resolve_uri with pytest.raises(ValueError): resolve_uri('webrot/make_time.py')
def test_file_not_found(): """Test that a directory not found raises an error.""" from server import resolve_uri with pytest.raises(OSError): resolve_uri('/webroot.html/')
def test_resolve_uri_success(): body, content_type = server.resolve_uri(b'/sample.txt') assert b"simple text file" in body assert b"text" in content_type
def test_resolve_uri_txt(): assert server.resolve_uri(b'/sample.txt')[1] == CONTENT_TYPES[0]
def test_resolve_uri_failure(): with pytest.raises(IOError): server.resolve_uri(b"laskjdhfku")
def test_resolve_uri(): """Test if resolve uri returns correct vals.""" from server import resolve_uri resolve_uri('test.txt') == (b'txt', b'content of test file', b'20')
def test_resolve_uri_invalid(): with pytest.raises(LookupError): server.resolve_uri("http://www.host.com/blah")
def test_resolve_uri_py_type(): """Check uri type for .py file.""" from server import resolve_uri contents, content_type, size = resolve_uri('/make_time.py') assert content_type == 'text/x-python'
def test_resolve_uri_works_with_html(): """Test proper URI resolution with html file.""" from server import resolve_uri assert resolve_uri('/a_web_page.html')[0] == 'text/html'
def test_resolve_uri_img_type(): """Check uri type for images directory.""" from server import resolve_uri contents, content_type, size = resolve_uri('/webroot/images') assert content_type == 'directory'
def test_resolve_uri_works_with_python_file(): """Test proper URI resolution with .py file.""" from server import resolve_uri assert resolve_uri('/make_time.py')[0] == 'text/plain'
def test_resolve_uri(): body, resource_type = resolve_uri('/') assert resource_type == 'text/html' assert '<li>sample.txt</li>' in body lines = body.split() assert lines[0] == '<!DOCTYPE'
def bad_parse(): request = b"""GETTER sample.txt HTTP/1.11\r\n Content-Type: noodles\r\nHoster: bathtime""" with pytest.raises(AttributeError): resolve_uri(request)
def test_resolve_uri_image(): """Should return contents of the image and type.""" from server import resolve_uri return_val = (b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04\xb0\x00\x00\x04\xb0\x08\x06\x00\x00\x00\xeb!\xb3\xcf\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\tpHYs\x00\x00\x0b\x12\x00\x00\x0b\x12\x01\xd2\xdd~\xfc\x00\x00\x00\x15tEXtCreation Time\x003/28/09\xee/\xfb\xfc\x00\x00\x00\x1ctEXtSoftware\x00Adobe Fireworks CS3\x98\xd6F\x03\x00\x00 \x00IDATx\x9c\xec\xda1n\xc3@\x10\x04A\x9e\xc1\xff\x7fy\x1d:s$z\xdbR\xd5\x0b&\xe1\x81h\xec\x99\xeb\x9a\x0b\x00\x80\x979\xfe\xae\x00\x00^\xeak{\x00\x00\x00\x00\x00\xfcF\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 \xed\xde\x1e\x00<\xefl\x0f\x00\xf84\x1e^\x80\xbf5\xdb\x03\x80\xa7\xb9\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 \xed\xde\x1e\x00P33\xdb\x13\x00\x80\x0fw\xce\xd9\x9e\x00\x90\xe2\x02\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x80\xb4{{\x00\xc0G:g{\x01\xf0\xa03\xdb\x0b\x80'\xcd\xe5#\x07\xf8k.\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H\xbb\xb7\x07\x00\x00\xbc\x9d3\xdb\x0b\x80'\xf9\xc4{\xbc\xbb\xf0\xf6\\`\x01\x00\x00\x00\x90&`\x01\x00\x00\x00\x90v_3g{\x04\xf0\xe3\x9cG>I7\xd51\xe7\xba\xbc\xbd\xf0\xde\xbc\xbb\x00\x00/\xe4\x02\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x804\x01\x0b\x00\x00\x00\x80\xb4{{\x00\xc0'\x9a\x99\xd9\xde\x00\x00\x00\xf0_\xb8\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x02\x00\x00\x00 M\xc0\x82\xefv\xed\x18\x85a \x08\x82 \x07\xfa\xff\x97\xd7\xa9\x1d8\x12x\x1b\xb9\xea\x05\x137\x03\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4\tX\x00\x00\x00\x00\xa4]\xdb\x03\x00j\xce9\xdb\x13\x00\x00\x00x\xe3\x81\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\x9a\x80\x05\x00\x00\x00@\xda\xb5=\x00\xf8\x89\xb3=\x00\xe0\xbf\xccl/\x00\x00x\x12\x0f,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\xae\xed\x01\xc0\xa7\x99\xd9\x9e\x00\xc0M\xe7l/\x00\x00x\x16\x0f,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\xbd\xde\x00\x13\x00\x00\x01\x85IDAT\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\x04,\x00\x00\x00\x00\xd2\xce\xcclo\x00\x00\x00\x00\x80\xaf<\xb0\x00\x00\x00\x00H\x13\xb0\x00\x00\x00\x00H{\x010m&k\x81\xac\xde\x1e\x00\x00\x00\x00IEND\xaeB`\x82", 'image/png') assert resolve_uri(b'webroot/images/sample_1.png') == return_val
def test_resolve_uri_dir(): body, ctype = server.resolve_uri("http://www.host.com/") assert ctype == b'text/html' assert b'a_web_page.html' in body assert b'JPEG_example.jpg' not in body
def test_resolve_uri_file(): body, resource_type = resolve_uri('/sample.txt') assert resource_type == 'text/plain' assert 'This is a very simple text file.' in body
def test_resolve_uri_not_found(): with pytest.raises(LookupError): resolve_uri('/foo/bar.txt')