--- /dev/null
+https://trac.ffmpeg.org/wiki/AudioChannelManipulation
+
+ffmpeg -y -i multi_audiotest5.mkv -filter_complex "[0:a:0][0:a:1]amerge=inputs=2[a]" -map "[a]" -ac 2 -map 0:v mixed_audio_output.mkv
+
+megtartja az eredeti hangot is
+ffmpeg -y -i multi_audiotest5.mkv -filter_complex "[0:a:0][0:a:1]amerge=inputs=2[a]" -map "[a]" -ac 2 -map 0 mixed_audio_output.mkv
+
--- /dev/null
+from datetime import datetime
+from typing import Optional
+
+from fastapi.middleware.cors import CORSMiddleware
+from fastapi.staticfiles import StaticFiles
+from fastapi import BackgroundTasks, FastAPI
+from pydantic import BaseModel
+from transcode import TranscodeItem, TranscodeStatus, TranscodeJob, background_tasks_results, simulate_background_task
+
+
+# https://docs.pydantic.dev/2.4/concepts/models/
+class TaskStatusResponse(BaseModel):
+ task_id: str
+ started: Optional[datetime]
+ finished: Optional[datetime]
+ status: Optional[TranscodeStatus]
+ progress: int
+
+
+app = FastAPI()
+
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=["*"],
+ allow_credentials=True,
+ allow_methods=["*"],
+ allow_headers=["*"],
+)
+app.mount("/video", StaticFiles(directory="hls"), name="VIDEO")
+
+
+@app.post("/submit")
+async def submit(item: TranscodeItem, background_tasks: BackgroundTasks):
+ task_id = str(len(background_tasks_results) + 1)
+ background_tasks.add_task(simulate_background_task, task_id, item.delay)
+ job = TranscodeJob()
+ job.status = TranscodeStatus.RUNNING
+ background_tasks_results[task_id] = job
+ return {"task_id": task_id}
+
+
+@app.get("/status/{task_id}", response_model=TaskStatusResponse)
+async def status(task_id: str):
+
+ if background_tasks_results.__contains__(task_id):
+ job = background_tasks_results.get(task_id, TranscodeJob())
+ return {"task_id": task_id,
+ "status": job.status,
+ "progress": job.progress,
+ "started": job.started,
+ "finished": job.finished}
+ else:
+ return {"task_id": "0",
+ "status": None,
+ "progress": 0,
+ "started": None,
+ "finished": None}
+
+
+@app.get("/test")
+async def get_test():
+ return {"test": "TEST"}
+
--- /dev/null
+import shutil
+
+from ffmpeg import FFmpeg, Progress, FFmpegError
+from pymediainfo import MediaInfo
+
+
+def main():
+ input_file = r'd:\data\video\hls\ma.mkv'
+
+ media_info = MediaInfo.parse(input_file)
+ for track in media_info.tracks:
+ if track.track_type == "Video":
+ frame_count = int(track.frame_count)
+ # print("Duration (raw value):", track.duration)
+
+ output_directory = 'hls/out/'
+ output_file = output_directory + r'%v/prog_index.m3u8'
+ shutil.rmtree(output_directory, ignore_errors=True)
+
+ output_options = {
+ 'preset': 'slow',
+ 'g': 48,
+ 'sc_threshold': 0,
+ 'map': ['0:0', '0:1', '0:8'],
+ 's:v:0': '960x540',
+ 'c:v:0': 'libx264',
+ 'b:v:0': '2000k',
+ 'c:a:0': 'aac',
+ 'c:a:1': 'aac',
+ 'var_stream_map': 'a:0,agroup:audio,default:yes a:1,agroup:audio v:0,agroup:audio',
+ 'master_pl_name': 'master.m3u8',
+ 'f': 'hls',
+ 'hls_time': 6,
+ 'hls_list_size': 0,
+ 'hls_segment_filename': f'{output_directory}/%v/fileSequence%03d.ts',
+ }
+
+ ffmpeg = (
+ FFmpeg()
+ .option("y")
+ .input(input_file)
+ .output(
+ output_file,
+ output_options
+ )
+ )
+
+ @ffmpeg.on("start")
+ def on_start(arguments: list[str]):
+ print("arguments:", arguments)
+
+ @ffmpeg.on("progress")
+ def on_progress(progress: Progress):
+ print(round(progress.frame * 100 / frame_count))
+
+ try:
+ ffmpeg.execute()
+ except FFmpegError as e:
+ print(e.args)
+
+
+if __name__ == "__main__":
+ main()
--- /dev/null
+ffmpeg -y -i d:\data\video\hls\oceans.mp4 ^
+ -preset slow -g 48 -sc_threshold 0 ^
+ -map 0:0 -map 0:1 -map 0:0 -map 0:1 ^
+ -s:v:0 640x360 -c:v:0 libx264 -b:v:0 365k ^
+ -s:v:1 960x540 -c:v:1 libx264 -b:v:1 2000k ^
+ -c:a copy ^
+ -var_stream_map "v:0,a:0 v:1,a:1" ^
+ -master_pl_name master.m3u8 ^
+ -f hls -hls_time 6 -hls_list_size 0 ^
+ -hls_segment_filename "out/v%%v/fileSequence%%d.ts" ^
+ out/v%%v/prog_index.m3u8
\ No newline at end of file
--- /dev/null
+ffmpeg -y -i d:\data\video\hls\ma.mkv ^
+ -preset slow -g 48 -sc_threshold 0 ^
+ -map 0:0 -map 0:1 -map 0:8 ^
+ -s:v:0 960x540 -c:v:0 libx264 -b:v:0 2000k ^
+ -c:a:0 aac ^
+ -c:a:1 aac ^
+ -var_stream_map "a:0,agroup:audio,default:yes a:1,agroup:audio v:0,agroup:audio" ^
+ -master_pl_name master.m3u8 ^
+ -f hls -hls_time 6 -hls_list_size 0 ^
+ -hls_segment_filename "out/%%v/fileSequence%%03d.ts" ^
+ out/%%v/prog_index.m3u8
--- /dev/null
+ffmpeg -y -i d:\data\video\hls\ma.mkv ^
+-preset slow -g 48 -sc_threshold 0 ^
+-map 0:0 -map 0:1 -map 0:8 ^
+-s:v:0 960x540 -c:v:0 libx264 -b:v:0 2000k ^
+-c:a:0 aac ^
+-c:a:1 aac ^
+-var_stream_map "a:0,agroup:audio,default:yes a:1,agroup:audio v:0,agroup:audio" ^
+-f hls ^
+-hls_time 6 ^
+-hls_playlist_type vod ^
+-hls_segment_type mpegts ^
+-hls_flags independent_segments ^
+-hls_segment_filename "out/%%v/fileSequence%%03d.ts" ^
+-master_pl_name master.m3u8 ^
+out/%%v/prog_index.m3u8
--- /dev/null
+https://hlsbook.net/creating-a-master-playlist-with-ffmpeg/
+http://underpop.online.fr/f/ffmpeg/help/hls-2.htm.gz
+https://trac.ffmpeg.org/wiki/AudioChannelManipulation
+https://trac.ffmpeg.org/wiki/Map
+
+tools https://github.com/videojs/http-streaming#tools
+online coding https://replit.com/@vasary/Phind-Code-Snippet#pyproject.toml
+video host https://api.video
+
+https://mediaarea.net/hr/MediaInfo/Support/Fields
\ No newline at end of file
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+ <link href="https://vjs.zencdn.net/7.6.6/video-js.css" rel="stylesheet" />
+</head>
+
+<body>
+ <link href="https://vjs.zencdn.net/7.6.6/video-js.css" rel="stylesheet" />
+ <video-js id="my-video" class="vjs-default-skin" controls preload="auto" width="640" height="268">
+<!-- <source src="http://localhost:8080/video/oceans.mp4" type="video/mp4" />-->
+ <source src="/video/out/master.m3u8" type="application/x-mpegURL" />
+ </video-js>
+ <script src="https://vjs.zencdn.net/7.6.6/video.js"></script>
+
+ <script>
+ var player = videojs('my-video');
+ </script>
+
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html>
+<html>
+<head>
+ <link href="https://vjs.zencdn.net/7.6.6/video-js.css" rel="stylesheet" />
+</head>
+
+<body>
+ <link href="https://vjs.zencdn.net/7.6.6/video-js.css" rel="stylesheet" />
+ <video-js id="my-video" class="vjs-default-skin" controls preload="auto" width="640" height="268">
+ <source src="https://d2zihajmogu5jn.cloudfront.net/bipbop-advanced/bipbop_16x9_variant.m3u8" type="application/x-mpegURL" />
+ </video-js>
+ <script src="https://vjs.zencdn.net/7.6.6/video.js"></script>
+ <script>
+ var player = videojs('my-video');
+ player.ready(function() {
+ console.log(player.hls, player.tech().hls);
+ })
+ </script>
+</body>
+</html>
\ No newline at end of file
--- /dev/null
+from pprint import pprint
+from pymediainfo import MediaInfo
+
+
+def audio_tracks_count(filename):
+ media_info = MediaInfo.parse(filename)
+ return len(media_info.audio_tracks)
+
+
+def showinfo(filename):
+ media_info = MediaInfo.parse(filename)
+ # Tracks can be accessed via the 'tracks' attribute or through shortcuts
+ # such as 'image_tracks', 'audio_tracks', 'video_tracks', etc.
+ video_track = len(media_info.video_tracks)
+ audio_track = len(media_info.audio_tracks)
+ print(
+ f"Video tracks {video_track}, audio tracks {audio_track}"
+ )
+
+ for track in media_info.tracks:
+ if track.track_type == "Video":
+ print("Bit rate: {t.bit_rate}, Frame rate: {t.frame_rate}, "
+ "Format: {t.format}".format(t=track))
+ print("Duration (raw value):", track.duration)
+ print("Duration (other values:")
+ pprint(track.other_duration)
+ elif track.track_type == "Audio":
+ print("Track data:")
+ pprint(track.to_data())
--- /dev/null
+import uvicorn
+from api import app
+from site_icon import site_icon_lizzard
+from nicegui import ui
+
+
+def start_job():
+ ui.notify("Start job!")
+
+
+ui.label("MEDIA SAMURAI")
+grid = ui.aggrid({
+ "columnDefs": [
+ {"headerName": "Name", "field": "name"},
+ {"headerName": "Type", "field": "type"},
+ ],
+ "rowData": [],
+})
+grid.props('inline height=500px')
+
+with ui.row():
+ ui.button('Start', on_click=start_job).props('small outline')
+
+
+ui.run_with(app, favicon=site_icon_lizzard)
+if __name__ == "__main__":
+ uvicorn.run(app, port=8181)
--- /dev/null
+uvicorn~=0.22.0
+fastapi~=0.104.1
+pydantic~=2.4.2
+nicegui~=1.4.2
+pymediainfo~=6.1.0
+tqdm~=4.66.1
+gevent~=23.9.1
\ No newline at end of file
--- /dev/null
+site_icon_lizzard = '''
+<svg xmlns="http://www.w3.org/2000/svg" version="1.0" width="790.000000pt" height="1280.000000pt" viewBox="0 0 790.000000 1280.000000" preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.15, written by Peter Selinger 2001-2017
+</metadata>
+<g transform="translate(0.000000,1280.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">
+<path d="M4299 12798 c-1 -2 -3 -12 -5 -23 -6 -35 -9 -50 -16 -61 -4 -6 -13 -41 -20 -78 -7 -36 -16 -66 -21 -66 -4 0 -5 -4 -2 -10 3 -5 -1 -20 -9 -33 -9 -12 -17 -32 -19 -43 -1 -11 -12 -33 -24 -48 -12 -15 -19 -34 -16 -42 3 -8 1 -14 -5 -14 -5 0 -19 -19 -30 -42 -11 -24 -38 -58 -61 -77 -23 -19 -41 -40 -41 -46 0 -7 -8 -19 -18 -28 -24 -22 -42 -5 -42 39 0 40 -16 84 -36 98 -8 7 -16 20 -18 31 -2 15 -12 21 -37 23 -30 2 -35 -1 -47 -30 -7 -18 -21 -51 -31 -73 -10 -22 -19 -44 -21 -50 -6 -25 -41 -85 -54 -92 -8 -4 -40 -37 -71 -73 -33 -38 -65 -65 -77 -66 -11 -1 -32 -13 -47 -27 -14 -15 -43 -40 -63 -58 -21 -17 -35 -35 -32 -40 3 -5 -11 -25 -30 -45 -20 -21 -36 -43 -36 -51 0 -24 -1 -28 -17 -45 -10 -11 -17 -42 -19 -85 -4 -76 -17 -110 -48 -119 -29 -9 -86 -61 -125 -115 -14 -19 -51 -56 -83 -84 -110 -94 -128 -112 -128 -134 0 -26 -82 -111 -108 -111 -10 0 -32 -11 -48 -25 -16 -14 -35 -25 -41 -25 -7 0 -13 -4 -13 -10 0 -5 -6 -10 -12 -10 -7 0 -27 -14 -45 -30 -18 -17 -35 -30 -38 -30 -8 0 -60 -37 -116 -82 -26 -21 -50 -38 -53 -38 -3 0 -15 -9 -26 -20 -12 -12 -25 -18 -31 -14 -15 9 -31 53 -36 97 -2 22 -9 51 -14 65 l-10 27 -19 -25 c-12 -15 -20 -41 -20 -67 0 -61 -21 -54 -43 13 -16 52 -16 58 0 107 9 29 28 66 42 84 34 42 83 110 99 140 8 13 20 27 29 30 8 3 46 38 85 77 38 39 75 71 80 71 6 0 14 7 17 16 3 8 27 35 54 59 26 24 47 48 47 53 0 5 6 23 14 40 26 61 39 144 32 212 -9 85 -45 139 -119 175 -47 22 -67 25 -209 30 l-156 5 -41 37 c-23 20 -41 43 -41 50 0 8 -5 19 -12 26 -9 9 -14 7 -24 -6 -18 -23 -17 -42 5 -88 21 -42 38 -59 88 -87 25 -14 57 -17 171 -17 131 0 142 -2 167 -22 56 -47 65 -59 65 -82 0 -14 7 -32 16 -41 11 -10 14 -26 11 -48 -8 -48 -12 -66 -19 -73 -4 -3 -4 -12 -1 -20 3 -8 0 -14 -6 -14 -6 0 -11 -7 -11 -15 0 -8 -11 -25 -25 -39 -14 -14 -25 -34 -25 -46 0 -12 -9 -24 -23 -29 -13 -5 -34 -24 -48 -41 -13 -18 -32 -40 -42 -49 -52 -47 -69 -61 -76 -61 -4 0 -36 -31 -72 -69 -75 -80 -101 -111 -93 -111 3 0 -2 -7 -10 -16 -9 -8 -17 -22 -17 -30 -1 -8 -3 -17 -4 -21 -1 -5 -6 -23 -10 -41 -4 -18 -12 -35 -16 -38 -14 -8 -11 -65 6 -125 23 -78 33 -94 75 -118 37 -20 56 -46 42 -55 -16 -9 -120 13 -152 33 -19 11 -45 21 -57 21 -13 0 -24 8 -28 20 -8 26 -41 26 -48 0 -4 -15 7 -30 39 -59 24 -21 44 -41 44 -45 0 -11 -60 -36 -89 -36 -34 0 -101 -36 -101 -55 0 -7 -9 -24 -20 -38 -30 -37 -25 -58 25 -108 24 -24 45 -48 45 -53 0 -5 -14 -23 -31 -41 -30 -30 -33 -31 -59 -18 -39 19 -110 131 -110 172 0 17 -7 48 -16 69 -21 51 -23 145 -3 168 8 11 24 39 34 64 10 25 27 65 38 89 11 26 16 53 12 68 -7 29 -92 113 -114 113 -9 0 -28 6 -42 14 -22 11 -46 14 -81 7 -21 -4 -48 -48 -48 -80 0 -20 -7 -58 -16 -86 -8 -27 -18 -59 -21 -70 -9 -29 -10 -175 -1 -210 3 -16 12 -57 19 -90 7 -33 17 -69 23 -80 5 -11 12 -30 13 -42 3 -21 14 -40 71 -130 29 -45 19 -57 -40 -48 -50 8 -115 63 -159 136 -30 51 -55 178 -46 241 12 94 -27 178 -75 162 -12 -3 -27 1 -38 11 -15 14 -29 16 -63 11 -64 -10 -74 -26 -78 -126 -2 -47 -8 -91 -13 -98 -16 -23 -15 -124 3 -177 39 -118 92 -154 95 -66 1 34 18 31 31 -7 6 -16 15 -35 21 -43 6 -8 15 -25 19 -39 4 -14 15 -34 25 -45 9 -11 21 -28 26 -37 5 -9 35 -39 66 -66 42 -37 53 -53 45 -61 -16 -16 -22 -14 -80 25 -49 34 -146 130 -147 146 0 4 -11 19 -24 33 -14 15 -26 31 -28 37 -2 5 -23 13 -47 18 -39 7 -46 5 -76 -21 -18 -16 -41 -29 -51 -29 -24 0 -34 -8 -62 -44 -29 -38 -28 -62 8 -115 20 -29 30 -57 30 -80 0 -44 61 -195 92 -228 41 -44 51 -28 49 74 -2 91 6 116 29 88 7 -8 18 -15 25 -15 6 0 19 -8 29 -18 20 -23 111 -69 151 -77 17 -3 67 -9 111 -12 64 -4 89 -2 114 11 18 9 39 16 46 16 7 0 25 10 41 23 31 26 86 43 183 57 121 17 185 35 188 53 2 9 9 17 15 17 6 0 20 9 32 19 49 48 113 101 120 101 9 0 69 53 173 151 64 61 77 69 111 69 35 0 71 -22 71 -44 0 -4 13 -35 29 -69 27 -56 74 -107 88 -94 2 3 9 34 13 69 5 35 11 72 14 83 2 11 5 26 5 33 1 16 42 15 106 -3 56 -17 85 -46 85 -86 0 -20 38 -108 51 -119 4 -3 9 -15 13 -27 7 -21 64 -58 74 -48 3 3 6 24 7 48 3 57 30 100 59 91 31 -10 115 -55 122 -65 2 -5 -4 -16 -15 -25 -16 -14 -17 -22 -10 -42 6 -14 7 -39 3 -56 -4 -17 -8 -38 -9 -46 -2 -8 -8 -30 -15 -48 -19 -50 -42 -38 -60 32 -17 60 -44 91 -54 59 -33 -117 -46 -193 -37 -216 12 -31 6 -54 -13 -54 -18 0 -86 -42 -86 -54 0 -5 -6 -9 -13 -9 -8 0 -24 -9 -37 -20 -13 -11 -31 -20 -41 -20 -10 0 -22 -6 -26 -14 -4 -7 -30 -23 -56 -35 -26 -12 -51 -28 -54 -36 -3 -8 -11 -15 -18 -15 -8 0 -23 -13 -35 -30 -12 -16 -27 -30 -34 -30 -21 0 -66 -40 -66 -59 0 -9 -9 -24 -20 -34 -11 -9 -20 -25 -20 -35 0 -10 -5 -23 -11 -29 -8 -8 -9 -25 -4 -50 5 -21 8 -41 7 -44 -2 -9 36 -48 81 -83 20 -16 37 -36 37 -43 0 -8 -20 -33 -45 -57 -25 -25 -45 -48 -45 -53 0 -7 -64 -63 -73 -63 -2 0 -23 -18 -47 -40 -23 -22 -52 -42 -62 -46 -20 -6 -58 -39 -58 -49 0 -7 -17 -28 -44 -55 -20 -20 -20 -20 2 -50 28 -37 28 -50 -3 -86 -14 -16 -25 -32 -25 -36 0 -4 -14 -15 -31 -24 -18 -9 -56 -40 -85 -70 -29 -30 -57 -54 -63 -54 -6 0 -20 -13 -32 -29 -12 -16 -30 -32 -41 -34 -11 -3 -22 -15 -25 -26 -3 -12 -12 -21 -19 -21 -8 0 -23 -14 -33 -31 -10 -17 -28 -37 -40 -45 -11 -8 -35 -43 -51 -77 -17 -34 -37 -71 -45 -81 -8 -11 -15 -29 -15 -41 0 -12 -5 -26 -10 -31 -8 -8 -7 -14 3 -22 11 -9 19 -6 39 16 27 29 98 128 98 137 0 12 44 65 54 65 6 0 19 14 28 30 9 17 32 39 51 50 18 11 40 31 47 45 7 13 22 27 33 31 19 6 37 19 88 64 48 42 58 50 68 50 5 0 19 13 31 29 11 17 30 33 41 36 43 14 69 120 44 178 -4 11 -3 23 4 30 6 6 11 7 11 3 0 -4 19 9 42 29 23 19 66 47 95 60 29 14 56 31 60 39 4 8 25 21 46 30 22 9 41 25 44 36 3 11 13 20 23 20 28 0 54 30 80 90 13 30 30 63 38 72 12 15 10 24 -17 71 -17 29 -41 58 -54 64 -15 7 -27 23 -30 40 -5 23 2 35 36 71 23 23 46 42 53 42 6 0 19 11 28 25 9 14 26 25 37 25 11 0 36 16 56 35 20 19 44 35 55 35 10 0 27 9 39 21 18 18 24 19 44 9 13 -7 28 -23 34 -36 6 -13 17 -24 25 -24 7 0 19 -7 26 -15 7 -8 21 -15 31 -15 11 0 19 -4 19 -9 0 -4 11 -6 25 -3 14 2 25 0 25 -6 0 -6 21 -18 48 -25 26 -8 65 -31 86 -51 46 -41 52 -43 59 -17 6 23 -7 47 -45 88 -31 32 -31 53 0 53 21 0 113 -52 131 -74 10 -12 17 -13 34 -4 18 9 24 7 43 -17 12 -15 26 -25 32 -21 13 8 21 65 10 72 -4 3 -8 14 -8 25 0 19 29 27 44 12 4 -5 12 -8 18 -8 6 0 16 -9 22 -20 6 -11 16 -23 22 -27 7 -4 15 -25 19 -45 4 -21 11 -44 17 -50 7 -9 7 -17 0 -26 -15 -18 -8 -73 9 -69 24 6 39 24 39 47 0 12 6 28 14 34 31 26 28 65 -9 136 -39 76 -43 95 -17 96 53 2 88 11 100 26 19 27 14 41 -18 48 -29 6 -52 25 -30 25 12 0 63 34 101 68 14 12 48 31 74 40 27 10 50 23 52 29 6 18 -72 39 -100 26 -46 -22 -73 -29 -94 -25 -33 5 -28 15 20 37 23 10 61 32 85 48 23 15 42 25 42 22 0 -3 14 2 32 11 l31 16 -24 20 c-18 14 -34 18 -66 14 -46 -6 -59 9 -21 23 13 5 23 17 23 27 0 38 103 68 227 66 107 -2 131 10 71 33 -21 9 -47 21 -58 27 -11 6 -53 12 -94 14 -40 1 -78 7 -83 12 -15 15 16 32 66 33 26 1 49 6 52 11 3 4 15 8 27 8 12 0 55 18 95 40 51 29 72 46 72 60 0 13 -7 20 -20 20 -11 0 -20 4 -20 8 0 10 135 82 154 82 15 0 86 79 86 96 0 22 -24 21 -59 -3 -18 -13 -39 -23 -46 -23 -7 0 -18 -7 -25 -15 -14 -16 -60 -21 -60 -6 0 19 57 71 90 82 19 7 51 24 70 39 60 46 84 47 175 2 44 -22 133 -66 198 -97 64 -32 117 -61 117 -65 0 -4 25 -34 55 -66 51 -56 54 -62 55 -111 0 -46 4 -56 30 -79 23 -21 28 -32 23 -55 -3 -16 -1 -35 4 -41 15 -19 26 -112 24 -204 -1 -44 3 -92 8 -107 12 -30 4 -56 -31 -100 -15 -19 -21 -38 -20 -65 2 -27 -5 -49 -23 -76 -14 -20 -25 -41 -25 -45 0 -5 -7 -14 -15 -21 -9 -7 -15 -29 -15 -54 0 -37 -5 -46 -56 -91 -52 -47 -61 -63 -63 -108 -1 -9 -10 -25 -21 -34 -11 -10 -20 -21 -20 -25 0 -5 -18 -26 -40 -48 -22 -22 -39 -43 -39 -47 6 -35 -6 -64 -41 -98 -21 -22 -39 -45 -40 -51 0 -26 -42 -93 -60 -99 -11 -4 -30 -27 -42 -53 -12 -26 -30 -53 -40 -60 -10 -7 -27 -30 -37 -51 -11 -20 -27 -43 -35 -50 -9 -7 -13 -17 -10 -22 3 -5 -6 -13 -19 -18 -14 -6 -28 -14 -31 -19 -3 -5 -31 -22 -62 -38 -31 -16 -63 -39 -71 -51 -9 -13 -21 -23 -28 -23 -7 0 -27 -16 -46 -35 -19 -19 -46 -40 -61 -46 -16 -6 -28 -16 -28 -22 0 -17 -44 -77 -56 -77 -13 0 -49 -39 -57 -62 -4 -10 -11 -18 -16 -18 -5 0 -12 -8 -16 -19 -3 -10 -18 -21 -33 -24 -16 -3 -34 -17 -42 -31 -7 -14 -22 -26 -32 -26 -10 0 -43 -25 -74 -55 -38 -39 -63 -55 -82 -56 -15 0 -54 -2 -87 -4 -33 -2 -82 -4 -110 -5 -65 -2 -113 -19 -121 -43 -6 -21 10 -37 37 -37 8 0 30 -15 47 -33 l33 -34 -51 -26 -50 -26 -370 -7 c-246 -5 -373 -4 -382 3 -16 13 -95 16 -102 4 -3 -4 3 -16 14 -26 11 -10 20 -26 20 -37 0 -10 4 -18 9 -18 4 0 20 -10 34 -22 47 -40 91 -73 92 -68 0 3 15 -9 33 -25 39 -37 35 -56 -14 -74 -53 -19 -134 -72 -134 -88 0 -7 5 -22 12 -33 7 -10 10 -21 8 -24 -3 -2 -52 -5 -110 -7 -104 -2 -184 -17 -247 -45 -17 -8 -35 -14 -40 -13 -4 1 -21 -3 -36 -9 -16 -7 -37 -12 -48 -12 -10 0 -27 -8 -37 -17 -39 -39 -117 -47 -142 -15 -10 13 -66 50 -116 75 -44 23 -56 25 -116 18 -59 -6 -73 -12 -103 -41 -50 -48 -46 -66 15 -74 27 -4 50 -11 50 -15 0 -5 17 -16 39 -24 38 -16 55 -44 45 -72 -4 -8 -31 -16 -70 -20 -35 -4 -66 -11 -69 -15 -9 -15 37 -44 67 -42 17 1 41 -4 54 -13 13 -8 32 -15 43 -15 11 0 24 -8 29 -17 17 -32 55 -200 49 -215 -3 -8 -26 -21 -52 -28 -99 -28 -180 30 -201 142 -22 119 -64 197 -142 264 -68 58 -186 77 -239 39 -17 -13 -17 -15 5 -38 13 -14 34 -28 46 -31 12 -3 38 -25 57 -48 31 -39 34 -49 35 -113 1 -53 6 -79 23 -105 11 -19 21 -42 21 -50 0 -8 22 -42 48 -75 27 -33 51 -68 55 -77 3 -10 11 -18 17 -18 18 0 50 -34 50 -53 0 -17 -6 -18 -60 -14 -42 3 -68 10 -83 24 -12 11 -31 25 -43 31 -11 6 -32 33 -45 59 -30 61 -48 83 -67 83 -7 0 -28 7 -45 14 -134 62 -213 66 -271 16 -17 -15 -41 -32 -52 -38 -25 -13 -38 -63 -21 -75 7 -4 33 -5 58 -2 25 3 49 2 53 -2 4 -5 11 -8 14 -8 12 -1 57 -28 64 -39 4 -6 8 -23 8 -37 0 -27 53 -84 102 -110 12 -6 38 -25 56 -40 18 -16 39 -29 46 -29 14 0 30 -29 21 -38 -3 -3 -28 0 -56 6 -28 7 -74 9 -104 6 -47 -6 -54 -4 -64 15 -7 11 -19 21 -28 21 -8 0 -31 9 -50 21 -43 27 -63 19 -63 -24 0 -85 51 -164 128 -199 23 -11 48 -28 55 -39 9 -14 23 -19 55 -19 24 0 53 -5 64 -11 11 -6 50 -14 86 -17 96 -10 100 -25 26 -103 -88 -93 -156 -159 -164 -159 -4 0 -11 -15 -14 -33 -3 -19 -17 -44 -30 -56 -14 -13 -30 -36 -37 -53 -7 -16 -28 -47 -47 -68 -18 -21 -33 -41 -32 -45 0 -3 -13 -22 -29 -41 -17 -19 -31 -41 -31 -49 0 -22 -118 -105 -151 -105 -34 0 -58 -33 -37 -53 32 -29 87 -49 120 -43 126 24 158 28 158 18 0 -5 -7 -13 -16 -16 -14 -5 -14 -9 -3 -22 13 -16 56 -15 107 1 31 10 30 -18 -3 -57 -14 -16 -25 -36 -25 -43 0 -8 -11 -26 -25 -41 -14 -15 -30 -44 -35 -65 -6 -21 -15 -41 -20 -44 -6 -3 -10 -16 -10 -27 0 -11 -9 -35 -19 -52 -10 -17 -24 -58 -31 -91 -7 -33 -19 -64 -27 -70 -7 -6 -19 -29 -26 -51 -7 -23 -30 -74 -52 -113 -35 -62 -43 -71 -63 -66 -20 5 -23 3 -18 -13 8 -24 -9 -38 -57 -46 -21 -4 -48 -17 -60 -29 l-21 -21 35 -14 c18 -8 54 -17 79 -19 50 -4 198 21 214 37 5 5 14 10 18 10 14 0 9 -29 -7 -37 -9 -5 -12 -17 -8 -31 6 -23 6 -23 70 -24 38 0 43 -3 43 -23 0 -12 -6 -28 -14 -34 -19 -16 -40 -165 -27 -190 18 -33 14 -245 -6 -304 -12 -35 -19 -46 -21 -32 -9 44 -22 37 -22 -12 0 -58 -31 -138 -60 -153 -25 -14 -25 -26 -1 -33 12 -3 22 1 25 9 3 8 13 14 23 14 10 0 34 13 53 28 40 33 80 56 86 49 3 -2 1 -23 -5 -46 -10 -44 -9 -45 30 -55 21 -5 28 -2 32 14 3 11 13 20 24 20 10 0 32 17 50 37 27 33 32 36 39 20 3 -10 0 -37 -7 -60 -20 -60 -18 -317 4 -427 45 -235 51 -278 39 -333 -17 -78 -22 -117 -16 -117 13 0 74 53 74 65 0 6 9 20 20 30 11 10 20 23 20 29 0 6 16 28 35 48 19 20 30 38 25 40 -6 2 0 25 14 53 13 28 26 59 30 69 12 34 19 8 17 -61 0 -38 1 -84 5 -104 4 -31 9 -36 29 -33 36 3 44 11 51 49 3 19 10 35 16 35 5 0 14 14 19 30 18 50 44 39 69 -27 12 -32 34 -85 49 -118 74 -160 94 -220 115 -358 15 -96 16 -111 3 -131 -9 -12 -16 -31 -17 -42 -4 -30 11 -84 24 -84 6 0 37 31 69 68 75 88 70 81 87 130 7 24 19 46 27 50 12 7 21 57 26 141 3 48 21 49 42 1 10 -22 21 -40 26 -40 4 0 15 -23 24 -50 9 -28 20 -50 25 -50 19 0 31 66 33 179 0 66 3 121 7 121 3 0 25 -39 50 -87 24 -49 50 -101 59 -118 8 -16 25 -38 38 -48 13 -10 23 -23 23 -29 0 -6 12 -27 26 -46 24 -31 25 -38 16 -70 -16 -53 -30 -128 -37 -195 -3 -32 -14 -77 -25 -100 -11 -22 -20 -47 -20 -56 0 -21 -38 -97 -56 -111 -7 -7 -14 -19 -14 -27 0 -8 -8 -27 -18 -41 -38 -55 -38 -55 7 -49 23 2 50 12 60 21 9 9 22 16 27 16 5 0 17 9 27 20 9 11 24 20 32 20 9 0 21 11 27 25 6 14 19 25 28 25 10 0 20 9 23 21 3 11 15 23 26 26 14 3 21 13 21 29 0 13 9 28 19 34 17 9 20 6 23 -18 3 -30 -31 -173 -51 -210 -10 -18 -9 -23 3 -28 16 -6 73 39 81 65 2 9 14 22 25 29 18 11 22 9 32 -13 8 -18 8 -31 0 -48 -6 -12 -13 -89 -16 -172 -5 -153 -24 -246 -61 -298 -8 -12 -15 -34 -15 -49 0 -14 -5 -39 -10 -54 -13 -34 -11 -36 28 -25 33 10 117 89 126 119 7 21 54 72 66 72 17 0 11 -28 -7 -40 -15 -10 -15 -11 -1 -6 24 7 45 -23 52 -78 3 -27 13 -60 21 -72 12 -19 24 -149 15 -179 -13 -49 26 -81 61 -49 10 9 19 21 19 26 0 4 14 27 30 50 17 22 30 45 30 50 0 4 13 27 30 50 18 25 30 53 30 73 0 52 44 77 56 31 3 -14 12 -27 20 -30 8 -3 14 -15 14 -26 0 -17 34 -112 46 -128 1 -2 12 2 24 8 18 10 21 17 16 45 -4 21 -2 36 5 41 15 9 39 -22 39 -49 0 -10 11 -32 25 -49 13 -16 29 -46 35 -67 5 -21 20 -51 32 -67 19 -23 23 -41 23 -116 1 -95 8 -115 26 -75 6 13 22 31 35 38 14 7 29 28 36 51 6 21 17 38 23 38 19 0 27 -43 31 -169 2 -63 8 -119 13 -124 12 -12 61 28 61 49 0 7 4 14 8 16 11 4 52 106 52 129 0 34 18 29 32 -8 8 -25 13 -83 12 -170 -1 -118 1 -133 16 -133 20 0 62 44 81 84 34 72 54 14 24 -69 -8 -22 -15 -50 -15 -63 0 -31 -55 -134 -80 -150 -11 -7 -20 -19 -20 -27 0 -15 -74 -75 -92 -75 -16 0 -78 -32 -78 -40 0 -15 60 -32 90 -26 17 3 54 17 84 31 29 14 60 25 68 25 8 0 42 27 75 61 33 34 63 57 66 52 3 -5 -5 -31 -19 -58 -29 -61 -30 -75 -4 -75 11 0 20 4 20 8 0 5 18 17 40 27 54 24 120 87 120 113 0 12 4 22 10 22 10 0 60 99 60 119 0 6 4 19 9 29 31 56 42 126 40 249 -1 71 -6 134 -12 141 -5 7 -7 16 -3 19 10 10 39 -10 52 -35 17 -35 47 -63 56 -54 5 5 9 33 9 63 2 66 8 78 23 47 6 -12 18 -23 26 -23 43 0 52 135 12 178 -12 13 -22 28 -22 34 0 6 -15 38 -34 71 -25 45 -31 63 -22 72 8 8 7 10 -6 5 -17 -7 -108 71 -108 93 0 6 -10 14 -22 18 -29 8 -59 34 -53 45 7 10 63 3 79 -10 20 -17 138 -81 148 -81 6 0 26 -13 45 -30 33 -30 83 -41 83 -19 0 10 -37 58 -88 114 -10 11 -26 36 -35 55 -10 19 -22 42 -27 50 -14 22 -36 78 -39 100 0 6 -6 10 -12 10 -5 0 -7 -4 -4 -10 15 -25 -12 -6 -54 38 -54 55 -96 86 -131 95 -40 11 -56 25 -44 37 7 7 26 6 65 -6 76 -23 129 -46 129 -56 0 -4 8 -8 19 -8 10 0 35 -7 54 -15 81 -34 76 -14 -22 82 -87 86 -140 131 -180 152 -14 7 -30 19 -36 25 -5 7 -25 16 -44 22 -19 5 -39 18 -45 29 -6 11 -15 23 -20 27 -5 3 -17 38 -27 76 -10 39 -30 97 -45 129 -40 83 -40 93 -3 93 22 0 32 -5 36 -20 6 -24 12 -24 38 -5 14 12 34 14 80 9 49 -5 64 -3 77 10 18 18 54 21 63 6 3 -5 15 -10 25 -10 10 0 25 -7 34 -15 8 -8 24 -15 36 -15 11 0 37 -7 57 -15 20 -9 43 -13 52 -10 9 2 27 -1 41 -8 34 -17 265 -23 275 -6 5 6 -12 31 -41 59 -88 86 -114 117 -114 134 0 22 40 21 88 -2 41 -20 82 -18 82 4 0 8 -18 32 -39 53 -22 22 -47 52 -57 66 -15 23 -15 28 -3 36 8 5 23 6 34 3 32 -10 153 -6 175 6 37 20 258 35 505 35 169 -1 244 3 252 11 16 16 2 66 -23 79 -11 6 -35 22 -54 37 -20 15 -53 35 -75 45 -22 10 -51 26 -65 35 -14 10 -58 24 -99 33 -119 25 -120 34 -3 74 46 16 86 31 88 34 3 3 0 14 -7 26 -7 11 -11 22 -9 23 38 27 120 70 141 75 16 3 34 12 40 19 6 8 17 14 24 14 8 0 26 11 42 24 15 13 42 27 60 30 17 4 37 14 44 23 7 8 22 19 34 24 20 9 38 20 87 52 14 9 39 18 55 19 15 1 34 8 41 15 7 7 22 13 32 13 17 0 96 32 150 59 26 14 16 34 -20 44 -19 5 -38 13 -41 19 -4 6 -69 11 -158 11 -103 2 -151 6 -151 13 0 6 10 24 21 39 12 15 23 38 25 52 1 14 12 32 24 40 32 22 39 52 22 87 -12 22 -12 31 -3 34 13 4 51 74 51 95 0 19 24 67 33 67 5 0 5 4 2 10 -3 5 0 24 8 42 36 84 47 117 51 163 3 28 15 68 26 90 11 21 20 49 20 62 0 12 8 30 18 40 11 10 22 26 25 36 4 9 13 17 21 17 14 0 36 28 36 46 0 16 -120 -5 -146 -25 -15 -12 -35 -21 -44 -21 -10 0 -32 -14 -50 -30 -18 -16 -36 -30 -41 -30 -5 0 -16 -11 -25 -25 -24 -37 -48 -33 -40 7 6 33 9 73 7 95 -1 6 -11 13 -23 15 -23 3 -23 6 -25 153 -1 83 -6 175 -11 205 -6 30 -9 96 -8 145 1 76 6 99 29 146 28 57 35 103 17 114 -5 3 -10 3 -10 -2 0 -12 -59 -43 -81 -43 -10 0 -19 -6 -19 -14 0 -8 -27 -36 -60 -61 -36 -28 -60 -54 -60 -65 0 -11 -8 -24 -17 -29 -21 -11 -43 -55 -68 -134 -25 -79 -36 -93 -61 -77 -10 6 -30 30 -44 52 -14 23 -29 46 -35 52 -23 26 -55 76 -55 86 0 5 -4 10 -10 10 -5 0 -10 7 -10 16 0 19 -104 124 -143 143 -15 8 -45 29 -65 46 -25 21 -48 32 -72 32 -48 1 -175 76 -203 119 -12 19 -26 34 -31 34 -5 0 -14 8 -21 17 -11 15 -15 15 -29 4 -10 -9 -13 -18 -7 -25 5 -6 11 -46 13 -88 3 -43 10 -84 17 -92 7 -8 11 -29 9 -47 l-3 -32 -31 26 c-43 36 -64 35 -64 -3 0 -16 -2 -30 -5 -30 -12 0 -101 33 -105 40 -3 4 -23 13 -45 20 -22 7 -47 18 -55 25 -8 7 -40 20 -70 30 -30 10 -59 21 -65 26 -5 5 -17 9 -26 9 -10 0 -39 18 -64 40 -25 22 -51 40 -57 40 -5 0 -21 9 -35 19 -24 20 -53 19 -53 -2 0 -12 46 -141 61 -169 5 -10 9 -22 9 -28 0 -16 -40 -12 -46 5 -3 8 -14 17 -25 20 -10 4 -19 12 -19 20 0 17 -53 27 -62 12 -4 -7 -5 -19 -2 -27 4 -8 12 -33 18 -55 6 -22 18 -45 26 -52 8 -7 13 -13 10 -13 -42 -8 -568 -7 -581 1 -29 15 -112 16 -117 1 -7 -21 63 -78 143 -117 41 -20 75 -40 75 -45 0 -5 -12 -12 -27 -16 -16 -3 -41 -10 -57 -15 -16 -5 -50 -9 -75 -9 -55 0 -119 -34 -86 -46 28 -9 137 -54 155 -64 22 -11 18 -34 -5 -38 -46 -8 -185 -54 -190 -63 -4 -5 -16 -9 -28 -9 -13 0 -40 -9 -62 -20 -22 -11 -48 -20 -58 -20 -10 0 -33 -6 -50 -14 -48 -21 -179 -27 -212 -10 -38 20 -54 18 -66 -10 -8 -18 -7 -30 5 -54 9 -17 16 -40 16 -51 0 -13 15 -29 45 -47 25 -14 45 -30 45 -35 0 -6 15 -16 33 -24 49 -20 61 -38 39 -57 -9 -9 -27 -19 -38 -22 -23 -7 -39 -56 -22 -67 5 -3 -24 -40 -66 -82 -42 -42 -76 -80 -76 -84 0 -4 -16 -25 -35 -47 -19 -21 -35 -41 -35 -45 0 -3 -4 -12 -9 -20 -15 -24 -127 79 -135 124 -5 23 -20 45 -46 68 -33 28 -40 40 -40 69 0 27 -5 37 -19 41 -15 3 -20 18 -26 66 -5 41 -13 65 -25 74 -13 9 -18 30 -22 79 -3 54 -9 73 -28 93 -21 22 -22 29 -12 45 16 26 15 86 -3 135 -9 25 -14 81 -15 152 0 112 0 112 41 190 25 49 38 87 36 102 -3 14 7 46 24 78 16 30 29 63 29 72 0 21 47 114 79 158 20 26 22 38 17 76 -6 38 -4 47 13 59 11 8 25 26 32 41 7 15 16 27 20 27 5 0 12 15 17 32 5 21 15 34 28 36 25 5 73 58 81 91 10 41 42 88 63 94 11 3 24 16 29 30 5 14 14 26 20 28 6 2 12 14 14 26 4 26 45 73 63 73 7 0 21 15 33 33 22 36 80 83 97 79 6 -1 32 18 58 43 27 25 57 45 67 45 11 0 22 7 25 15 4 8 14 15 24 15 18 0 37 18 55 52 5 11 43 37 83 59 40 21 82 48 92 61 10 13 47 36 83 53 37 17 68 37 70 47 4 13 15 18 40 18 19 0 65 15 106 36 46 23 78 33 91 29 13 -4 30 1 46 14 36 28 50 26 91 -9 23 -21 41 -29 56 -25 49 12 176 21 193 14 35 -14 99 -9 134 9 l34 19 42 -29 c44 -30 101 -37 122 -16 7 7 40 15 74 19 124 15 207 38 263 75 30 20 61 34 69 31 8 -3 19 -23 26 -44 15 -45 44 -97 79 -138 14 -17 35 -43 46 -58 11 -15 25 -27 32 -27 6 0 18 -9 25 -19 8 -11 27 -21 42 -24 15 -2 36 -13 45 -24 9 -11 26 -26 39 -32 12 -7 22 -18 22 -26 0 -17 -41 -82 -71 -112 -33 -32 -19 -53 35 -53 25 0 48 5 51 10 4 6 24 22 46 35 22 15 48 43 60 67 12 24 25 45 28 48 4 3 15 32 26 65 10 33 24 65 31 70 12 10 14 75 3 75 -4 0 -9 8 -11 18 -4 12 -22 23 -52 32 -26 7 -49 17 -52 21 -3 5 -21 9 -40 9 -45 0 -103 30 -131 69 -52 70 -7 85 50 16 28 -33 45 -45 65 -45 15 0 45 -9 68 -19 23 -11 53 -17 68 -14 17 4 33 -1 45 -11 11 -10 22 -13 25 -8 3 6 29 13 56 17 27 4 53 11 56 16 3 5 9 7 14 4 5 -3 27 -1 48 5 22 5 61 12 87 14 26 3 55 11 64 19 33 29 51 28 92 -6 21 -17 39 -38 39 -45 0 -8 15 -35 32 -60 18 -26 34 -49 35 -51 1 -2 9 2 18 9 18 15 21 134 3 177 -12 31 -14 39 -16 68 -1 11 -38 54 -82 96 -77 73 -82 76 -131 78 -37 1 -62 -5 -86 -19 -58 -34 -144 -60 -218 -67 -126 -11 -122 -11 -199 28 -50 25 -68 51 -47 72 7 7 14 7 24 -1 8 -7 17 -9 21 -5 3 4 61 8 129 9 102 1 136 6 207 29 55 18 92 36 103 52 10 12 27 23 38 23 11 0 40 20 64 45 25 24 58 51 74 60 16 8 32 24 36 35 3 11 10 20 15 20 5 0 18 9 29 21 27 30 83 40 184 32 84 -6 87 -5 87 15 0 12 -9 26 -20 32 -11 6 -20 17 -20 25 0 9 -12 23 -28 33 -15 9 -42 28 -61 42 -23 18 -46 25 -79 26 -26 1 -63 2 -82 3 -61 4 -160 -30 -160 -54 0 -8 -4 -15 -10 -15 -5 0 -21 -22 -35 -50 -14 -27 -34 -54 -45 -60 -11 -6 -20 -16 -20 -23 0 -19 -60 -55 -144 -87 -89 -35 -125 -37 -181 -10 -22 10 -43 16 -48 13 -12 -7 -37 17 -37 37 0 10 -6 20 -12 23 -18 6 19 47 42 47 15 0 47 25 116 90 12 11 26 20 33 20 6 0 14 7 17 15 3 8 15 17 27 21 19 6 55 43 87 89 8 12 27 40 41 61 15 22 36 48 47 60 11 11 28 36 37 55 24 48 45 69 67 69 11 0 22 9 25 20 6 22 24 28 93 32 28 2 45 8 45 16 0 6 -3 11 -7 10 -4 -2 -14 6 -22 17 -9 11 -16 16 -16 11 0 -5 -7 -3 -15 4 -8 6 -19 9 -25 5 -5 -3 -10 0 -10 7 0 40 -145 46 -179 7 -8 -11 -21 -19 -27 -19 -6 0 -28 -14 -50 -30 -32 -26 -45 -30 -87 -29 -56 3 -72 -11 -83 -70 -4 -20 -10 -40 -14 -46 -4 -5 -10 -26 -14 -45 -4 -25 -22 -51 -59 -87 -72 -71 -146 -88 -83 -20 26 29 56 83 56 103 0 7 7 17 15 21 21 12 28 238 8 255 -17 13 -2 42 44 86 42 40 52 40 60 2 3 -17 10 -33 15 -36 12 -8 56 33 64 60 9 29 56 95 93 131 17 17 31 36 31 43 0 6 6 12 13 12 7 0 26 12 43 28 17 15 41 34 54 42 109 72 185 137 194 168 4 11 18 27 31 36 16 10 25 26 25 41 0 14 5 25 11 25 5 0 15 13 20 29 7 20 17 29 33 28 32 0 73 29 85 61 11 27 18 40 55 95 l19 29 23 -28 c13 -15 24 -33 24 -39 0 -7 6 -18 14 -24 8 -7 17 -25 21 -40 3 -16 15 -38 25 -49 11 -12 20 -26 20 -32 0 -16 61 -80 76 -80 7 0 28 -13 46 -29 20 -16 50 -31 75 -35 42 -6 43 -6 39 21 -5 36 -16 63 -26 63 -5 0 -11 14 -15 30 -4 18 -11 27 -18 23 -6 -4 -8 0 -4 10 3 9 2 19 -4 23 -7 4 -8 58 -3 157 7 158 -2 242 -31 300 -8 16 -15 43 -15 59 0 18 -5 28 -15 28 -8 0 -15 9 -15 19 0 10 -13 46 -29 78 -17 33 -40 88 -52 124 -12 35 -26 70 -32 77 -5 6 -6 12 -2 12 4 0 3 6 -3 13 -5 6 -13 33 -17 60 -7 43 -6 47 14 47 12 0 50 -29 93 -70 101 -98 109 -105 145 -119 17 -7 34 -19 37 -27 3 -8 16 -14 30 -14 14 0 28 -4 31 -10 8 -14 58 -13 72 1 14 14 2 51 -31 94 -13 17 -33 55 -46 85 -12 30 -28 67 -36 81 -7 14 -16 45 -20 68 -4 23 -13 49 -21 56 -7 8 -12 18 -11 22 3 14 -25 98 -36 105 -5 3 -11 21 -12 39 -1 17 -7 41 -13 53 -35 72 -68 156 -61 156 5 0 15 3 24 6 12 4 21 -6 35 -37 45 -102 70 -98 72 10 1 40 -3 76 -8 80 -15 9 -26 68 -15 75 6 3 22 0 36 -8 39 -20 214 -20 244 0 12 8 20 19 17 24 -4 6 -1 10 4 10 12 0 -25 40 -36 40 -5 0 -33 23 -63 50 -30 27 -59 53 -65 58 -5 5 -19 21 -30 37 -11 15 -32 41 -47 58 -16 18 -28 35 -28 38 0 11 -158 166 -194 191 -17 12 -33 25 -36 28 -3 3 -17 11 -32 17 -16 7 -28 16 -28 20 0 18 19 36 38 38 64 4 202 159 218 246 4 19 11 39 16 45 5 7 8 16 7 20 -1 5 3 22 9 37 28 67 8 119 -60 154 -51 26 -89 31 -152 19 -32 -6 -38 -5 -33 8 3 8 -3 26 -14 40 -19 24 -21 24 -40 8 -11 -9 -27 -18 -37 -18 -9 -1 -33 -5 -53 -9 -34 -6 -37 -5 -42 22 -4 20 1 39 19 65 25 39 31 73 14 83 -5 3 -10 14 -10 24 0 10 -12 28 -26 42 -22 21 -36 24 -105 25 l-80 1 -31 -37 c-16 -21 -38 -40 -48 -43 -13 -3 -19 -19 -24 -63 -3 -33 -7 -65 -8 -71 -2 -16 3 -17 -108 7 -51 11 -109 20 -127 20 l-34 0 3 78 c2 70 4 79 30 102 15 13 28 35 28 47 0 13 5 23 10 23 6 0 10 7 10 17 0 15 -1 15 -18 0 -10 -10 -26 -17 -35 -17 -10 0 -26 -5 -37 -12 -10 -7 -23 -8 -27 -4 -4 5 -3 11 3 13 6 2 28 19 48 38 21 19 46 37 57 40 15 5 17 10 9 25 -15 27 -44 33 -85 16 -24 -11 -43 -12 -59 -6 -13 5 -49 6 -80 3 -31 -3 -75 -1 -98 6 -24 6 -93 13 -155 15 -61 2 -116 7 -123 11 -6 4 -32 2 -56 -5 -25 -7 -48 -9 -52 -5 -4 4 16 28 43 53 28 26 54 55 57 64 10 26 -25 32 -64 11 -27 -14 -55 -17 -150 -16 -65 1 -126 7 -137 12 -11 6 -44 11 -75 11 -30 0 -57 4 -61 9 -7 13 41 58 85 79 19 9 62 42 95 74 32 32 62 58 66 58 3 0 19 19 35 42 16 23 49 63 74 89 25 26 44 52 42 58 -2 6 1 11 7 11 6 0 26 32 45 70 18 39 38 76 43 83 13 18 30 75 38 127 4 25 12 48 17 51 6 4 13 28 15 53 l6 47 -84 -3 c-82 -3 -84 -4 -81 -27 4 -29 -15 -77 -45 -114 -13 -16 -23 -37 -23 -48 0 -11 -7 -22 -15 -25 -8 -4 -15 -12 -15 -19 0 -6 -8 -19 -17 -28 -10 -9 -27 -33 -38 -54 -11 -21 -28 -44 -37 -51 -10 -7 -18 -21 -18 -31 0 -22 -29 -36 -43 -22 -5 5 -12 37 -16 71 -8 65 -19 80 -62 80 -28 0 -46 -31 -84 -148 -12 -34 -34 -77 -49 -95 -16 -17 -38 -51 -48 -74 -10 -24 -23 -43 -29 -43 -5 0 -19 -15 -30 -34 -26 -45 -49 -53 -71 -26 -12 15 -16 30 -11 49 5 23 4 24 -9 13 -9 -7 -29 -12 -44 -10 -32 2 -74 -17 -74 -34 0 -11 -6 -18 -78 -93 -39 -41 -54 -52 -107 -81 -16 -9 -38 -25 -48 -35 -10 -11 -26 -19 -37 -19 -10 0 -22 -4 -25 -10 -3 -5 -14 -10 -23 -10 -9 0 -28 -7 -42 -15 -53 -30 -72 -36 -85 -25 -10 9 -12 7 -9 -7 4 -14 -1 -19 -23 -21 -15 -1 -34 -10 -40 -19 -7 -9 -13 -14 -13 -10 0 4 -15 1 -34 -7 -39 -16 -96 -64 -96 -81 0 -17 -21 -34 -36 -28 -16 6 -7 31 23 63 59 63 68 71 82 68 10 -2 20 8 26 27 6 18 23 36 41 45 16 8 46 27 66 43 19 15 40 27 45 27 6 0 16 6 22 14 7 8 24 17 39 21 26 6 126 75 147 100 6 7 24 21 41 31 34 21 112 84 156 127 16 15 33 27 38 27 6 0 10 6 10 13 0 13 56 67 71 67 5 0 15 12 23 28 8 15 23 36 35 46 12 11 21 24 21 31 0 7 22 37 50 69 30 35 53 72 60 99 13 50 29 85 50 111 8 10 15 31 15 47 l0 29 -75 0 c-74 0 -75 -1 -96 -33 -40 -61 -84 -144 -84 -159 0 -9 -18 -33 -40 -54 -22 -22 -40 -42 -40 -46 0 -12 -113 -127 -120 -123 -8 5 4 78 18 116 35 85 54 174 47 216 -10 71 -22 83 -77 83 -27 0 -49 -1 -49 -2z m2285 -1487 c3 -5 -1 -11 -9 -15 -9 -3 -12 -12 -9 -21 4 -9 -6 -41 -21 -71 -24 -48 -29 -52 -40 -38 -7 11 -19 15 -29 11 -19 -8 -12 -27 10 -27 34 0 10 -18 -28 -22 -48 -5 -98 10 -98 29 0 15 51 43 78 43 11 0 22 7 25 15 4 8 22 21 42 29 20 9 34 20 30 25 -3 6 0 19 7 31 13 21 33 26 42 11z m-1911 -7041 c33 -6 65 -9 73 -6 7 3 19 -3 26 -13 7 -10 26 -26 41 -36 15 -10 34 -30 42 -46 9 -17 31 -33 60 -44 30 -12 45 -24 45 -35 0 -10 12 -25 26 -35 23 -15 26 -22 21 -56 -4 -33 -1 -41 20 -57 35 -26 33 -69 -5 -123 -18 -24 -38 -65 -46 -91 -8 -26 -32 -69 -53 -95 -22 -27 -42 -55 -46 -65 -6 -16 -63 -35 -75 -24 -3 4 -11 -6 -18 -21 -7 -18 -29 -37 -60 -52 -27 -13 -65 -32 -85 -41 -19 -10 -53 -21 -75 -25 -21 -4 -52 -16 -69 -28 -17 -12 -56 -25 -90 -29 -130 -18 -242 -29 -280 -29 -22 0 -56 0 -75 0 -19 0 -55 5 -80 10 -25 6 -85 16 -135 22 -49 7 -103 21 -120 31 -16 10 -38 18 -48 18 -9 0 -25 4 -35 9 -9 6 -33 12 -53 16 -20 3 -44 14 -53 24 -16 18 -15 22 20 77 21 33 41 61 46 62 4 2 8 10 8 18 0 8 17 31 39 52 21 20 41 47 45 59 4 12 29 41 57 63 34 29 49 49 49 66 0 13 5 24 10 24 6 0 15 11 20 24 4 13 20 26 34 30 24 6 78 50 155 127 20 19 43 40 51 45 9 5 23 21 32 36 10 15 31 29 48 33 17 4 34 13 37 20 2 8 21 19 41 26 19 6 49 20 66 29 17 10 71 23 121 30 49 6 91 13 93 15 7 6 117 -3 175 -15z"/>
+<path d="M4231 12654 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
+<path d="M4725 12470 c-3 -5 -1 -10 4 -10 6 0 11 5 11 10 0 6 -2 10 -4 10 -3 0 -8 -4 -11 -10z"/>
+<path d="M4500 12230 c0 -5 5 -10 11 -10 5 0 7 5 4 10 -3 6 -8 10 -11 10 -2 0 -4 -4 -4 -10z"/>
+<path d="M4370 12110 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0 -10 -4 -10 -10z"/>
+<path d="M4045 11900 c-3 -5 -2 -10 4 -10 5 0 13 5 16 10 3 6 2 10 -4 10 -5 0 -13 -4 -16 -10z"/>
+<path d="M4445 8530 c-3 -5 -1 -10 4 -10 6 0 11 5 11 10 0 6 -2 10 -4 10 -3 0 -8 -4 -11 -10z"/>
+<path d="M5920 8159 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10 -5 -10 -11z"/>
+<path d="M4560 5130 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0 -10 -4 -10 -10z"/>
+<path d="M4840 5086 c0 -8 7 -16 15 -20 17 -6 18 -4 9 18 -8 20 -24 21 -24 2z"/>
+<path d="M3440 4940 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0 -10 -4 -10 -10z"/>
+<path d="M3440 4830 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0 -10 -4 -10 -10z"/>
+<path d="M2565 4300 c-3 -5 1 -10 9 -10 9 0 16 5 16 10 0 6 -4 10 -9 10 -6 0 -13 -4 -16 -10z"/>
+<path d="M4268 2233 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
+<path d="M4535 1610 c3 -5 8 -10 11 -10 2 0 4 5 4 10 0 6 -5 10 -11 10 -5 0 -7 -4 -4 -10z"/>
+<path d="M4760 1369 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10 -5 -10 -11z"/>
+<path d="M4452 1318 c5 -15 28 -23 28 -10 0 5 -7 13 -16 16 -10 4 -14 1 -12 -6z"/>
+<path d="M4380 300 c0 -19 3 -21 12 -12 9 9 9 15 0 24 -9 9 -12 7 -12 -12z"/>
+</g>
+</svg>
+'''
--- /dev/null
+from concurrent.futures import ThreadPoolExecutor
+from datetime import datetime
+
+from pydantic import BaseModel
+from enum import Enum
+import time
+
+background_tasks_results = {}
+executor = ThreadPoolExecutor(max_workers=5)
+
+
+class TranscodeItem(BaseModel):
+ name: str
+ delay: int
+
+
+class TranscodeStatus(str, Enum):
+ PENDING = "PENDING"
+ RUNNING = "RUNNING"
+ NONE = "NONE"
+ COMPLETED = "COMPLETED"
+
+
+class TranscodeJob:
+ def __init__(self):
+ self.status = TranscodeStatus.NONE
+ self.progress = 0
+ self.started = None
+ self.finished = None
+
+
+def simulate_background_task(task_id, duration):
+ job = background_tasks_results[task_id]
+ job.started = datetime.now()
+ for i in range(0, 11):
+ job.progress = i * 10
+ time.sleep(duration)
+ job.finished = datetime.now()
+ job.status = TranscodeStatus.COMPLETED