Talk Python in Production
Episode Deep Dive
Guest Introduction and Background
Christopher Trudeau serves as the guest host for this special episode, turning the tables to interview Michael Kennedy about his new book. Christopher is a well-known figure in the Python community, active on Bluesky at trudeau.dev, and has authored books and video courses himself. He brings a Django-centric perspective to the conversation, offering thoughtful counterpoints to Michael's Flask and FastAPI experiences. His background includes working with various hosting providers and teaching Python to students, making him an ideal interviewer to draw out practical insights about production deployments.
This episode features an unusual format where the regular host becomes the guest, with Michael Kennedy discussing his journey from a math PhD student to running Talk Python as a full-time business, and the lessons learned deploying Python web applications over the past decade.
What to Know If You're New to Python
Before diving into this episode's production-focused content, here are some foundational concepts that will help you get the most from this analysis:
- Virtual environments are isolated Python installations that keep project dependencies separate - this episode discusses how they compare to Docker containers for development
- Web frameworks like Flask, Django, FastAPI, and Pyramid are tools for building web applications - the episode covers how to choose between them
- Docker containers package applications with their dependencies for consistent deployment - a major topic in this episode
- Understanding basic Linux command line and SSH will help contextualize the deployment discussions
Key Points and Takeaways
1. Right-Sized Engineering: Rejecting Over-Architecture
The central thesis of Michael's book "Talk Python in Production" is that most developers over-engineer their deployments based on aspirational thinking rather than actual needs. Michael observed that much advice in the tech space is "a little bit of a flex" - recommending seven different services, auto-scaling, and geo-distributed databases when a simple $30 server would suffice. This "resume-based architecture" mentality leads developers to build for Netflix-scale traffic when they have a small product that just needs to work. The book advocates for understanding your actual requirements and choosing infrastructure that matches them, not what might theoretically be needed if your product goes viral.
- Links and Tools:
- talkpython.fm/book - Talk Python in Production book
- hetzner.com - Budget-friendly cloud hosting
- digitalocean.com - Developer-friendly cloud provider
2. The One Big Server Philosophy
Rather than managing multiple small servers (Michael once had eight), the book advocates consolidating to one appropriately-sized server running multiple Docker containers. This approach provides isolation between applications without the operational overhead of managing separate machines. Michael's current production server has 8 cores, 16GB RAM, costs $30/month, and includes 2-4 terabytes of free bandwidth - which would cost approximately $1,700 on AWS. The key insight is that modern hardware is so powerful that a single well-configured server can handle substantial traffic, and the included bandwidth at providers like Hetzner or DigitalOcean eliminates surprise bills.
- Links and Tools:
- hetzner.com/cloud - Cloud servers with generous bandwidth
- digitalocean.com/products/droplets - Virtual private servers
3. Docker as Infrastructure Abstraction
Michael initially resisted Docker but came to appreciate it as "just writing down in a file what I would normally have to type in the terminal." Docker provides isolation between applications running on the same server without the complexity of managing separate VMs. A key insight is that for self-hosted applications (not distributed libraries), larger container images with developer-friendly tools like Oh My Zsh are perfectly acceptable - disk space is cheap, and comfort during debugging is valuable. The book recommends installing terminal tools that make you comfortable rather than optimizing for minimal image size when you're the only one running the container.
- Links and Tools:
- docker.com - Container platform
- ohmyz.sh - Zsh framework for enhanced terminal experience
4. Monitoring Docker Containers in Production
When running 27+ containers on a single server, the cloud provider's basic metrics (CPU, memory) become insufficient - you need to know which specific container is causing issues. Michael recommends two complementary tools: Glances provides a dashboard with container-specific performance data including memory, CPU, and IO per container. BTOP offers moving graphs over time showing network traffic, per-core CPU usage, and process details. Both tools can run as Docker containers themselves and surface individual process names, making it critical to set meaningful process names in your Python applications.
- Links and Tools:
- nicolargo.github.io/glances - Glances system monitoring
- github.com/aristocratos/btop - Resource monitor with graphs
5. CDNs and the True Cost of Cloud Bandwidth
One of Michael's motivations for leaving major cloud providers was bandwidth pricing - AWS charges approximately $100 per terabyte while providers like Hetzner include 20TB free with a $30 server. Talk Python ships about a terabyte of XML monthly just for podcast RSS feeds, plus video courses and MP3s. CDNs like Bunny.net not only reduce origin server load but provide geographic distribution with 119+ locations including coverage across Africa. The key lesson is that bandwidth-heavy applications can see dramatic cost reductions by choosing providers with generous included bandwidth rather than paying per-gigabyte.
- Links and Tools:
- bunny.net - Privacy-focused CDN with global coverage
- cloudflare.com - CDN and security services
6. Mixing Static and Dynamic Content with Nginx
A powerful architectural pattern is using a front-end web server like Nginx to route different URL paths to different backends - static sites, Python apps, or CDN-served content can all appear as one cohesive site. This approach lets you choose the best technology for each component: Hugo for a blog, Django or FastAPI for dynamic features, and static file serving for documentation. The insight is that you don't need to force everything through one framework - tools like Nginx, Caddy, or Traefik can seamlessly stitch together disparate technologies under a single domain.
- Links and Tools:
- nginx.org - Web server and reverse proxy
- caddyserver.com - Automatic HTTPS web server
- traefik.io - Cloud-native reverse proxy
- gohugo.io - Static site generator
7. Choosing Tools Beyond Your Language Identity
Developers often choose tools based on what language they're written in rather than fitness for purpose - "I'm a Python developer, so I'll use the Python static site generator." Michael challenges this by using Hugo (written in Go) for his blog because it's excellent at its job. The operating system isn't written in Python, nor is your word processor - why should your static site generator be? This pragmatic approach extends to choosing the best monitoring tools, CDNs, and other infrastructure components regardless of their implementation language.
- Links and Tools:
- gohugo.io - Fast static site generator (Go)
- pandoc.org - Universal document converter
8. Web Framework Selection: Context Matters
Chapter 13 of the book provides a nuanced comparison of Python web frameworks that Christopher called "one of my favorites." Michael's framework journey went from Pyramid (chosen in 2015 because Flask didn't properly support Python 3) to Quart/FastAPI as async support and Pydantic became important. The key factors include: async support for modern ORMs like Beanie, active maintenance and security updates, typing support, and community momentum. The chapter avoids religious wars by presenting pros and cons in context rather than declaring winners.
- Links and Tools:
- fastapi.tiangolo.com - Modern async web framework
- flask.palletsprojects.com - Lightweight web framework
- djangoproject.com - Full-featured web framework
- docs.pydantic.dev - Data validation using Python types
- beanie-odm.dev - Async MongoDB ODM
9. AI-Assisted Development: A Pragmatic View
Michael draws a parallel between modern AI coding tools and earlier developer aids like autocomplete - using tools that help you code faster doesn't make you less of a programmer. He shares a concrete example: converting 8,000+ lines of Bootstrap 3 to Bulma CSS in four hours using Claude, a task that would have taken weeks manually. The key distinction is between using AI as a productivity tool versus using it to generate content that falsely represents expertise you don't have - the book carries a "Made by Humans" badge because Michael wrote every word himself.
- Links and Tools:
- cursor.com - AI-powered code editor
- claude.ai - Anthropic's AI assistant
- bulma.io - Modern CSS framework
10. Self-Publishing with Python and Markdown
Michael wrote the entire book in plain Markdown files (one per chapter) and built a Python program to assemble them into various ebook formats via Pandoc. This approach enabled unique features like "galleries" - separate sections that extract and list all code samples, figures, and links by chapter for easy reference. The Python tooling also generates high-resolution images for a web gallery since Kindle compresses embedded images. This demonstrates how Python's text processing capabilities can solve real publishing workflow problems.
- Links and Tools:
- pandoc.org - Document converter supporting dozens of formats
- pixelmator.com - Mac image editor (used for graphics)
11. Database Security: The Case Against Public Endpoints
Michael points out that some managed database services expose databases on the public internet with only password protection. His preferred approach keeps databases on a private Docker network where they're not even accessible from the host - only containers in the same Docker network can connect. This defense-in-depth strategy means a password compromise alone isn't sufficient for access. The tradeoff is that you become responsible for backups and maintenance, which requires discipline but provides better isolation.
- Links and Tools:
- mongodb.com - Document database
- postgresql.org - Relational database
12. Coolify: Self-Hosted PaaS Alternative
For those who find direct Docker management too complex, Coolify provides a self-hosted alternative to Heroku, Vercel, or Railway. It offers a web UI for deploying Docker Compose applications, automatic SSL certificate generation, and database backup configuration to S3-compatible storage. Michael notes it's "two steps forward, 1.8 steps back" - easier in some ways but with quirks like awkward environment variable management. It's positioned as a stepping stone for those not ready to manage Docker directly.
- Links and Tools:
- coolify.io - Self-hosted PaaS platform
- railway.app - Managed deployment platform
- vercel.com - Frontend deployment platform
13. UV for Python Environment Management
Michael highlighted UV as a game-changer, especially in Docker contexts. Instead of requiring a Python-specific Docker base image, you can use any base image and simply run uv venv --python 3.14 to install Python in seconds. UV unifies multiple tools (pip, virtualenv, pip-tools) into one fast package, with cached downloads making repeated builds nearly instant. This flexibility means you can choose Docker base images optimized for other requirements without sacrificing easy Python installation.
- Links and Tools:
- astral.sh/uv - Fast Python package installer and resolver
- github.com/astral-sh/uv - UV source repository
14. The setproctitle Library for Process Identification
Michael's "notable library" pick was setproctitle - a package with one function that sets your Python process name in the operating system. This seemingly simple capability becomes invaluable when monitoring shows "Python, Python, Python" and you need to identify which process is consuming resources or needs to be killed. It's especially useful when AI coding tools spawn runaway servers that claim ports. The library works in development and production, making Activity Monitor and task managers actually useful for Python applications.
- Links and Tools:
- github.com/dvarrazzo/py-setproctitle - Process title library
Interesting Quotes and Stories
"A lot of the advice out there is a little bit of a flex in the sense that, oh, look at this, we're using these seven services and then this technology, and then we're auto scaling it with that... a lot of people who just have an app they just want to go from it works on my machine to look what I made. They see this complexity and think I can't do that." -- Michael Kennedy
"It's sometimes referred to as resume-based architecture, right? Like, do we need this or is this because I'm trying to learn it?" -- Christopher Trudeau
"I realized actually, Docker is just writing down in a file what I would normally have to type in the terminal to make things happen. Except I put RUN in front of the command or COPY instead of cp and I get repeatability." -- Michael Kennedy
"I think there's a lack of recognition of the cost of both in energy and money - energy as in human effort - of the next 1%. So getting from 90% uptime to 95% uptime costs something. Getting from 95 to 96 costs more than that." -- Christopher Trudeau
"The reason technology is interesting is not just because there's an API I can call, but it's a journey and there is a story." -- Michael Kennedy
"Does it justify me rewriting that much UI so that I can feel a little bit better and use a little bit nicer UI tooling? No, it definitely doesn't. And then I was sitting on my porch... I thought, you know what? I bet Claude could do it. Four hours later, the whole thing was redone, 20,000 lines of edits." -- Michael Kennedy on converting Bootstrap 3 to Bulma
"Pandora is on the loose, right? So given that, putting your head in the sand is not going to make it go away. Should you use it or not? It's a very powerful tool." -- Michael Kennedy on AI coding tools
"Setting a process name might save you a reboot." -- Christopher Trudeau on the setproctitle library
Story: The Vercel Bill Horror Story
Michael recounts the story of a photographer in South Korea who created a service to detect AI-generated art. When it reached #6 in the app store, her Vercel cloud bill hit $96,000 in a single week - not as a business, but as someone who built something fun as a side project. This illustrates the danger of pay-per-use cloud pricing without hard spending limits.
Story: Cloud Outage Season
In the weeks before recording, AWS, Azure, GitHub, and Cloudflare all experienced significant outages. The AWS outage was caused by a DynamoDB DNS problem that cascaded to Lambda and other services - illustrating how complexity creates interdependencies where one failure brings down everything.
Key Definitions and Terms
PaaS (Platform as a Service): A cloud service model where the provider manages infrastructure and you just deploy code. Examples include Heroku, Railway, and Vercel.
CDN (Content Delivery Network): A geographically distributed network of servers that cache and serve content from locations closer to users, reducing latency and origin server load.
Docker Compose: A tool for defining and running multi-container Docker applications using a YAML configuration file.
Reverse Proxy: A server that sits in front of web applications and forwards client requests to them. Nginx, Caddy, and Traefik are popular choices.
ODM (Object Document Mapper): Similar to an ORM but for document databases like MongoDB. Beanie is an async ODM for MongoDB.
Agentic AI: AI systems that can take actions autonomously, like coding agents that can edit files and run commands rather than just generating text.
Right-Sized Engineering: Choosing infrastructure and architecture complexity that matches your actual needs rather than theoretical future scale.
Learning Resources
For those looking to go deeper on the topics discussed in this episode, here are relevant courses from Talk Python Training:
Full Web Apps with FastAPI: Learn to build complete web applications with the framework Michael now uses for his projects, covering both API and HTML-based applications.
Modern APIs with FastAPI and Python: Dive deep into building APIs with FastAPI, including deployment to cloud servers - directly relevant to the production topics discussed.
MongoDB with Async Python: Covers Beanie ODM and async database patterns that Michael mentioned as motivation for moving to async frameworks.
Python Web Apps that Fly with CDNs: A hands-on guide to integrating CDNs with Flask applications - directly related to the Bunny.net and performance discussions.
HTMX + Flask: Modern Python Web Apps, Hold the JavaScript: Build interactive web apps without heavy JavaScript frameworks, using the approach Michael takes with his sites.
Python for Absolute Beginners: If you're new to Python and want to build up to understanding production deployments, start here with a comprehensive introduction.
Overall Takeaway
This episode delivers a refreshingly honest perspective on deploying Python web applications: you probably don't need as much infrastructure as the internet tells you. Michael Kennedy's decade-long journey from Python Anywhere to managing 27 Docker containers on a $30 server demonstrates that right-sized engineering - choosing tools and architecture that match your actual needs - leads to both cost savings and operational simplicity.
The conversation challenges the prevailing wisdom that more services, more redundancy, and more complexity equals better infrastructure. Instead, it advocates for understanding your requirements deeply, starting simple, and adding complexity only when genuine need arises. Whether you're deploying your first web app or reconsidering an over-engineered stack, the message is clear: a single well-configured server with Docker, a CDN, and monitoring tools can take you remarkably far.
Most importantly, this episode reminds us that behind every technical choice is a human story - the midnight debugging sessions, the surprise cloud bills, and the gradual accumulation of hard-won knowledge. Michael's willingness to share not just what he built but why he made each decision, including the mistakes along the way, makes this book and episode invaluable resources for anyone serious about running Python in production.
Links from the show
Michael's personal site: mkennedy.codes
Talk Python in Production Book: talkpython.fm
glances: github.com
btop: github.com
Uptimekuma: uptimekuma.org
Coolify: coolify.io
Talk Python Blog: talkpython.fm
Hetzner (€20 credit with link): hetzner.cloud
OpalStack: www.opalstack.com
Bunny.net CDN: bunny.net
Galleries from the book: github.com
Pandoc: pandoc.org
Docker: www.docker.com
Watch this episode on YouTube: youtube.com
Episode #531 deep-dive: talkpython.fm/531
Episode transcripts: talkpython.fm
Theme Song: Developer Rap
🥁 Served in a Flask 🎸: talkpython.fm/flasksong
---== Don't be a stranger ==---
YouTube: youtube.com/@talkpython
Bluesky: @talkpython.fm
Mastodon: @talkpython@fosstodon.org
X.com: @talkpython
Michael on Bluesky: @mkennedy.codes
Michael on Mastodon: @mkennedy@fosstodon.org
Michael on X.com: @mkennedy
Episode Transcript
Collapse transcript
00:00
00:02
00:05
00:08
00:10
00:14
00:17
00:20
00:44
00:48
00:50
00:53
00:59
01:03
01:09
01:14
01:21
01:25
01:30
01:35
01:37
01:42
01:44
01:47
01:50
01:51
01:58
02:00
02:01
02:03
02:06
02:07
02:09
02:13
02:18
02:20
02:22
02:27
02:31
02:33
02:34
02:34
02:39
02:41
02:43
02:48
02:49
02:57
03:00
03:04
03:05
03:09
03:10
03:16
03:19
03:22
03:23
03:26
03:28
03:31
03:34
03:36
03:38
03:40
03:43
03:47
03:49
03:50
03:51
03:57
03:58
04:00
04:02
04:07
04:12
04:18
04:22
04:25
04:28
04:30
04:34
04:37
04:39
04:42
04:44
04:48
04:52
04:53
04:57
04:57
04:58
04:58
05:03
05:04
05:06
05:08
05:11
05:17
05:17
05:20
05:24
05:27
05:33
05:35
05:42
05:46
05:55
06:03
06:11
06:19
06:25
06:30
06:36
06:41
06:47
06:51
06:57
07:03
07:08
07:14
07:20
07:25
07:30
07:32
07:35
07:36
07:38
07:39
07:39
07:40
07:43
07:44
07:48
07:50
07:52
07:58
08:02
08:05
08:05
08:12
08:17
08:18
08:21
08:23
08:32
08:38
08:46
08:50
08:55
09:01
09:06
09:12
09:19
09:23
09:26
09:30
09:30
09:31
09:40
09:42
09:47
09:52
09:58
10:03
10:11
10:16
10:22
10:24
10:28
10:30
10:32
10:40
10:42
10:46
10:49
10:51
10:56
10:56
10:58
11:03
11:05
11:10
11:13
11:17
11:21
11:25
11:26
11:27
11:31
11:31
11:32
11:34
11:35
11:40
11:45
11:52
11:58
12:03
12:07
12:09
12:12
12:14
12:16
12:19
12:24
12:27
12:30
12:36
12:40
12:45
12:52
12:58
13:02
13:06
13:10
13:15
13:22
13:30
13:35
13:39
13:42
13:45
13:45
13:51
13:52
13:58
13:59
13:59
14:01
14:01
14:03
14:05
14:09
14:13
14:15
14:17
14:19
14:24
14:26
14:30
14:34
14:46
14:52
14:53
15:02
15:10
15:15
15:23
15:29
15:30
15:33
15:34
15:40
15:45
15:47
15:50
15:54
15:58
16:02
16:08
16:11
16:13
16:18
16:21
16:23
16:29
16:36
16:40
16:42
16:44
17:00
17:07
17:11
17:17
17:19
17:22
17:24
17:27
17:29
17:30
17:37
17:42
17:42
17:46
17:47
17:51
17:51
17:56
17:59
18:04
18:05
18:07
18:07
18:09
18:13
18:14
18:23
18:23
18:29
18:30
18:31
18:31
18:40
18:41
18:43
18:49
18:55
19:02
19:07
19:13
19:16
19:17
19:17
19:22
19:27
19:30
19:33
19:38
19:40
19:42
19:47
19:47
19:48
19:50
19:52
19:57
20:00
20:04
20:08
20:11
20:15
20:18
20:21
20:22
20:28
20:29
20:29
20:29
20:35
20:36
20:36
20:36
20:37
20:45
20:48
20:51
20:55
20:57
21:01
21:04
21:06
21:09
21:11
21:26
21:31
21:34
21:37
21:40
21:43
21:48
21:50
21:52
21:54
21:56
22:01
22:07
22:13
22:19
22:25
22:32
22:39
22:43
22:50
22:55
22:59
23:00
23:01
23:01
23:03
23:07
23:09
23:12
23:14
23:15
23:17
23:19
23:20
23:24
23:28
23:30
23:38
23:42
23:44
23:45
23:46
23:47
23:50
23:57
23:57
23:59
24:01
24:06
24:13
24:16
24:19
24:22
24:25
24:27
24:29
24:35
24:40
24:43
24:50
24:55
24:59
25:05
25:11
25:12
25:16
25:18
25:24
25:28
25:33
25:37
25:41
25:48
25:51
25:56
25:59
26:01
26:03
26:04
26:07
26:12
26:18
26:20
26:22
26:27
26:28
26:31
26:32
26:34
26:37
26:43
26:49
26:49
26:53
26:57
27:00
27:00
27:04
27:07
27:08
27:11
27:12
27:14
27:15
27:16
27:16
27:19
27:20
27:22
27:27
27:31
27:32
27:39
27:41
27:44
27:46
27:51
27:52
27:53
27:58
28:02
28:05
28:10
28:10
28:12
28:16
28:19
28:25
28:27
28:28
28:31
28:36
28:37
28:42
28:44
28:47
28:51
28:52
28:55
28:56
28:58
29:05
29:08
29:13
29:15
29:18
29:20
29:21
29:23
29:24
29:25
29:25
29:29
29:33
29:34
29:38
29:43
29:48
29:50
29:50
29:51
29:52
29:53
29:53
30:08
30:15
30:16
30:17
30:19
30:21
30:21
30:24
30:27
30:28
30:31
30:35
30:37
30:45
30:47
30:53
30:57
31:02
31:05
31:08
31:10
31:17
31:21
31:27
31:33
31:39
31:46
31:50
31:54
31:59
32:06
32:10
32:16
32:19
32:23
32:30
32:36
32:42
32:46
32:49
32:55
32:57
33:00
33:05
33:07
33:15
33:17
33:18
33:25
33:27
33:30
33:35
33:42
33:47
33:54
34:01
34:05
34:10
34:16
34:20
34:22
34:31
34:34
34:40
34:46
34:53
34:59
35:05
35:11
35:16
35:21
35:24
35:29
35:35
35:43
35:47
35:54
35:56
35:58
36:02
36:06
36:10
36:13
36:19
36:22
36:23
36:29
36:35
36:41
36:47
36:52
36:55
36:55
36:57
37:03
37:06
37:08
37:11
37:12
37:17
37:18
37:22
37:27
37:31
37:34
37:37
37:40
37:42
37:44
37:47
37:48
37:53
38:00
38:05
38:10
38:13
38:14
38:17
38:21
38:27
38:30
38:36
38:38
38:41
38:45
38:48
38:53
38:59
39:05
39:11
39:15
39:20
39:22
39:25
39:30
39:34
39:38
39:42
39:48
40:04
40:10
40:15
40:17
40:22
40:27
40:31
40:36
40:41
40:46
40:52
40:52
40:57
41:02
41:05
41:07
41:11
41:11
41:13
41:14
41:15
41:18
41:19
41:24
41:27
41:30
41:32
41:38
41:41
41:45
41:50
41:52
41:58
42:02
42:04
42:05
42:08
42:10
42:13
42:16
42:19
42:20
42:25
42:28
42:29
42:32
42:38
42:44
42:48
42:53
42:59
43:01
43:07
43:09
43:11
43:13
43:16
43:19
43:24
43:31
43:34
43:35
43:36
43:37
43:38
43:39
43:40
43:41
43:45
43:47
43:51
43:52
43:56
43:59
44:04
44:07
44:11
44:16
44:20
44:22
44:23
44:33
44:34
44:36
44:37
44:40
44:46
44:48
44:48
44:51
44:52
45:00
45:04
45:05
45:11
45:14
45:16
45:18
45:19
45:21
45:22
45:25
45:26
45:31
45:36
45:37
45:41
45:44
45:45
45:47
45:53
45:55
46:00
46:02
46:06
46:11
46:13
46:19
46:22
46:26
46:31
46:32
46:37
46:41
46:45
46:49
46:53
46:57
47:03
47:08
47:08
47:14
47:14
47:16
47:18
47:25
47:29
47:33
47:39
47:46
47:51
47:57
48:03
48:07
48:11
48:16
48:23
48:28
48:34
48:40
48:45
48:53
48:59
49:04
49:10
49:17
49:23
49:28
49:32
49:37
49:42
49:48
49:53
49:56
50:01
50:05
50:11
50:15
50:20
50:27
50:33
50:38
50:43
50:48
50:53
50:59
51:06
51:11
51:17
51:21
51:23
51:25
51:30
51:34
51:37
51:37
51:44
51:45
51:48
51:51
51:53
51:58
52:00
52:03
52:08
52:12
52:13
52:20
52:25
52:33
52:37
52:43
52:48
52:50
52:55
52:57
52:59
53:00
53:02
53:08
53:14
53:19
53:24
53:25
53:26
53:28
53:32
53:34
53:36
53:41
53:43
53:48
53:52
53:57
54:02
54:07
54:11
54:16
54:22
54:26
54:31
54:37
54:45
54:51
54:57
55:03
55:07
55:12
55:18
55:24
55:29
55:33
55:35
55:39
55:44
55:46
55:46
55:52
55:57
56:03
56:10
56:15
56:19
56:24
56:28
56:35
56:40
56:46
56:52
56:56
57:02
57:08
57:13
57:17
57:22
57:29
57:35
57:42
57:47
57:53
57:57
58:02
58:09
58:15
58:20
58:28
58:34
58:41
58:46
58:51
58:52
58:57
59:02
59:04
59:04
59:07
59:07
59:17
59:19
59:21
59:29
59:30
59:33
59:41
59:45
59:45
59:46
59:52
01:00:00
01:00:07
01:00:11
01:00:16
01:00:26
01:00:33
01:00:37
01:00:40
01:00:44
01:00:51
01:00:53
01:00:58
01:00:59
01:01:05
01:01:07
01:01:12
01:01:18
01:01:46
01:01:50
01:01:55
01:01:57
01:02:02
01:02:04
01:02:08
01:02:13
01:02:15
01:02:27
01:02:31
01:02:33
01:02:34
01:02:37
01:02:44
01:02:46
01:02:48
01:02:51
01:02:52
01:02:54
01:02:56
01:02:57
01:03:02
01:03:02
01:03:03
01:03:03
01:03:06
01:03:07
01:03:11
01:03:13
01:03:16
01:03:17
01:03:22
01:03:24
01:03:27
01:03:32
01:03:38
01:03:43
01:03:45
01:03:47
01:03:51
01:03:52
01:03:54
01:03:57
01:04:03
01:04:05
01:04:08
01:04:09
01:04:10
01:04:16
01:04:17
01:04:21
01:04:23
01:04:27
01:04:29
01:04:37
01:04:42
01:04:49
01:04:55
01:04:59
01:05:01
01:05:08
01:05:12
01:05:13
01:05:18
01:05:22
01:05:24
01:05:26
01:05:28
01:05:30
01:05:31
01:05:34
01:05:35
01:05:38
01:05:42
01:05:43
01:05:48
01:05:54
01:05:55
01:05:58
01:06:01
01:06:03
01:06:07
01:06:09
01:06:12
01:06:14
01:06:17
01:06:21
01:06:25
01:06:28
01:06:32
01:06:38
01:06:40
01:06:43
01:06:47
01:06:53
01:06:58
01:07:02
01:07:04
01:07:07
01:07:09
01:07:16
01:07:19
01:07:23
01:07:25
01:07:30
01:07:30
01:07:36
01:07:36
01:07:38
01:07:39
01:07:41
01:07:41
01:07:46
01:07:48
01:07:52
01:07:57
01:08:01
01:08:06
01:08:07
01:08:12
01:08:13
01:08:14
01:08:17
01:08:18
01:08:20
01:08:22
01:08:22
01:08:25
01:08:31
01:08:37
01:08:42
01:08:49
01:08:54
01:08:56
01:09:00
01:09:04
01:09:06
01:09:10
01:09:12
01:09:15
01:09:19
01:09:22
01:09:28
01:09:29
01:09:33
01:09:34
01:09:34
01:09:39
01:09:40
01:09:46
01:09:50
01:09:51
01:09:51
01:09:54
01:09:59
01:10:02
01:10:05
01:10:06
01:10:08
01:10:15
01:10:18
01:10:20
01:10:21
01:10:22
01:10:28
01:10:31
01:10:35
01:10:40
01:10:45
01:10:50
01:10:51
01:10:52
01:10:57
01:10:59
01:11:04
01:11:07
01:11:11
01:11:15
01:11:22
01:11:29
01:11:35
01:11:39
01:11:45
01:11:50
01:11:55
01:12:00
01:12:04
01:12:05
01:12:06
01:12:07
01:12:15
01:12:20
01:12:22
01:12:26
01:12:26
01:12:31
01:12:36
01:12:39
01:12:43
01:12:47
01:12:48
01:12:52
01:12:52
01:12:52
01:12:52
01:12:56
01:13:02
01:13:07
01:13:12
01:13:16
01:13:21
01:13:26
01:13:34
01:13:38
01:13:41
01:13:46
01:13:52
01:13:58
01:14:04
01:14:09
01:14:11
01:14:13
01:14:19
01:14:23
01:14:26
01:14:29
01:14:31
01:14:32
01:14:33
01:14:36
01:14:39
01:14:40
01:14:41
01:14:49
01:14:51
01:14:56
01:14:56
01:14:57
01:14:57
01:14:59
01:15:00
01:15:04
01:15:06
01:15:09
01:15:12
01:15:21
01:15:24
01:15:28
01:15:29
01:15:33
01:15:36
01:15:38
01:15:41
01:15:42
01:15:45
01:15:46
01:15:50
01:15:53
01:15:57
01:15:59
01:16:01
01:16:03
01:16:10
01:16:14
01:16:20
01:16:23
01:16:24
01:16:30
01:16:34
01:16:37
01:16:45
01:16:49
01:16:54
01:16:59
01:17:06
01:17:10
01:17:14
01:17:18
01:17:24
01:17:28
01:17:32
01:17:36
01:17:38
01:17:40
01:17:46
01:17:47
01:17:52
01:17:55
01:17:57
01:18:02
01:18:05
01:18:10
01:18:15
01:18:19
01:18:25
01:18:29
01:18:35
01:18:39
01:18:45
01:18:51
01:18:56
01:19:01
01:19:06
01:19:11
01:19:16
01:19:18
01:19:21
01:19:23
01:19:27
01:19:32
01:19:38
01:19:44
01:19:51
01:19:57
01:20:04
01:20:10
01:20:17
01:20:23
01:20:27
01:20:29
01:20:30
01:20:32
01:20:35
01:20:37
01:20:39
01:20:40
01:20:42
01:20:55


