Files
VoiceVault/backend/__pycache__/api_routes.cpython-311.pyc

210 lines
42 KiB
Plaintext
Raw Normal View History

2026-02-14 21:46:48 -07:00
<EFBFBD>
2026-02-15 10:33:57 -07:00
<00><02>i<EFBFBD>{<00><00>
<00>UdZddlZddlZddlZddlZddlmZddlZddlZddl m
Z
ddl m Z m Z ddlZddlmZddlmZddl mZmZmZdd lmZmZdd
lmZdd lmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m.Z.m$Z$e<10><00>ed e7d <0A><0E><00>Z8eej9dd<10><00><00><00>Z:e:<3A>;dd<11><12><00>hd<13>Z<ej9dd<15><00>Z=ej9dd<17><00>Z>ej9dd<19><00>Z?ej9dej9dd<1C><00><00><00>Z@daAedzeBd<defd<1F>ZCd_d!eDd"eEfd#<23>ZFd$eDdeGfd%<25>ZHd&edeDfd'<27>ZId(eDd)eDdeDfd*<2A>ZJd+e eDe fde eDe ffd,<2C>ZKe8<65>Ld-<2D><00>d.<2E><00><00>ZMe8<65>Nd/<2F><00>d0<64><00><00>ZOe8<65>Nd1<64><00>d2<64><00><00>ZPe8<65>Nd3<64><00>d4<64><00><00>ZQe8<65>Ld5<64><00>d6eEfd7<64><04><00>ZRe8<65>Ld8<64><00>d9<64><00><00>ZSe8<65>Nd:<3A><00>d;<3B><00><00>ZTe8<65>Ld<<3C><00>d6eEfd=<3D><04><00>ZUe8<65>Nd><3E><00>d?<3F><00><00>ZVe8<65>Ld><3E><00>d@<40><00><00>ZWe8<65>LdA<64><00>dBeEfdC<64><04><00>ZXe8<65>YdA<64><00>dBeEfdD<64><04><00>ZZe8<65>LdE<64><00>dBeEfdF<64><04><00>Z[e8<65>LdG<64><00>dBeEfdH<64><04><00>Z\e8<65>NdI<64><00>dBeEfdJ<64><04><00>Z]e8<65>LdI<64><00>dBeEfdK<64><04><00>Z^e8<65>_dL<64><00>dBeEfdM<64><04><00>Z`e8<65>LdL<64><00>dBeEfdN<64><04><00>Zae8<65>_dO<64><00>dBeEfdP<64><04><00>Zbe8<65>LdO<64><00>dBeEfdQ<64><04><00>Zce8<65>NdR<64><00>dBeEfdS<64><04><00>Zde8<65>LdR<64><00>dBeEfdT<64><04><00>Zee8<65>NdU<64><00>dV<64><00><00>Zfe8<65>LdU<64><00>dW<64><00><00>Zge8<65>LdX<64><00>dBeEfdY<64><04><00>Zhe8<65>LdZ<64><00>dBeEfd[<5B><04><00>Zie8<65>jdA<64><00>dBeEfd\<5C><04><00>Zke8<65>_d]<5D><00>dBeEfd^<5E><04><00>ZldS)`z}
2026-02-14 21:46:48 -07:00
Flask API routes aligned with TitanForge/schema.sql.
2026-02-14 22:04:39 -07:00
Includes auth, upload+transcription, history, and RAG search workflow.
2026-02-15 10:33:57 -07:00
<EFBFBD>N)<01>Path)<01> send_file)<02>Dict<63>Any)<01> load_dotenv)<01> WhisperModel)<03> Blueprint<6E>jsonify<66>request)<02>check_password_hash<73>generate_password_hash)<01>secure_filename)<1D>add_archive_file<6C> add_audit_log<6F>add_rag_chunks<6B>create_audio_post<73> create_user<65>get_archive_metadata<74>get_original_audio_url<72>get_archive_rights<74>get_audio_post_by_id<69>get_post_bundle<6C>get_user_by_email<69>get_user_by_id<69>list_archive_files<65>list_audio_posts<74>list_audit_logs<67>list_rag_chunks<6B>list_user_history<72>search_rag_chunks<6B>update_audio_post<73>upload_storage_object<63>upsert_archive_metadata<74>upsert_archive_rights<74>delete_rag_chunks<6B>delete_archive_files<65>delete_metadata<74> delete_rights<74>delete_audio_postr!r<00>apiz/api)<01>
url_prefix<EFBFBD>BACKEND_UPLOAD_DIR<49>uploadsT)<02>parents<74>exist_ok> <00>m4a<34>mkv<6B>mov<6F>mp3<70>mp4<70>ogg<67>wav<61>flac<61>webm<62> WHISPER_MODEL<45>base<73>WHISPER_DEVICE<43>cpu<70>WHISPER_COMPUTE_TYPE<50>int8<74>SUPABASE_BUCKET<45>SUPABASE_ARCHIVE_BUCKET<45>archives<65>_whisper_model<65>returnc<00>`<00>t<00>!tttt<00><01><00>atS)N)<02>device<63> compute_type)rBrr9r;r=<00><00><00> TitanForge/backend/api_routes.py<70>_modelrJBs-<00><00><15><1D>%<25> <19>!<21>-<2D>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<EFBFBD>
<EFBFBD><0E>
2026-02-15 10:33:57 -07:00
<1A>rH<00><><00>message<67>statusc<00>(<00>td|i<01><00>|fS)N<>error)r
)rLrMs rI<00>_errorrPMs<00><00> <12>G<EFBFBD>W<EFBFBD>%<25> &<26> &<26><06> .<2E>.rH<00>filenamec<00>x<00>d|vrdS|<00>dd<03><00>d<00><00><00>tvS)N<>.F<>)<03>rsplit<69>lower<65>ALLOWED_MEDIA_EXTENSIONS)rQs rI<00> _allowed_filerXQs=<00><00>
<EFBFBD>(<28><1A><1A><14>u<EFBFBD> <13>?<3F>?<3F>3<EFBFBD><01> "<22> "<22>1<EFBFBD> %<25> +<2B> +<2B> -<2D> -<2D>1I<31> I<>IrH<00>pathc<00>
<00>tj<00><00>}|<00>d<01><00>5} |<02>d<03><00>}|sn|<01>|<03><00><00>. ddd<00><00>n #1swxYwY|<01><00><00>S)N<>rbTi)<06>hashlib<69>sha256<35>open<65>read<61>update<74> hexdigest)rY<00>h<>f<>chunks rI<00>_sha256reWs<><00><00><0F><0E><18><18>A<EFBFBD> <0A><19><19>4<EFBFBD><1F><1F><1C>A<EFBFBD> <1C><15>F<EFBFBD>F<EFBFBD>;<3B>'<27>'<27>E<EFBFBD><18> <16><15> <0A>H<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD>O<EFBFBD>O<EFBFBD>  <1C><16> <1C><1C><1C><1C><1C><1C><1C><1C><1C><1C><1C><><EFBFBD><EFBFBD><1C><1C><1C><1C> <0A>;<3B>;<3B>=<3D>=<3D>s<00>0A&<03>&A*<07>-A*<07>transcript_text<78>titlec<00><00>d|<01>d|<00>d<03>S)NzaYou are an archive assistant. Use the following transcribed audio as source context. Post title: z.
2026-02-14 22:04:39 -07:00
Transcript:
z4
2026-02-15 10:33:57 -07:00
Answer user questions grounded in this transcript.rG)rfrgs rI<00> _build_promptribs-<00><00> =<3D><1C> =<3D> =<3D> <1B> =<3D> =<3D> =<3D>rH<00>postc<00><><00>|<00>d<01><00>dkr+ t|dd<04><05><00>}|d|d<n#YnxYw|S)z%Add signed audio URL to post if readyrM<00>ready<64>post_id<69><00><01>
2026-02-15 01:21:05 -07:00
expires_in<EFBFBD>
2026-02-15 10:33:57 -07:00
signed_url<EFBFBD> audio_url)<02>getr)rj<00>
audio_datas rI<00>_add_audio_urlrujsY<00><00> <0B>x<EFBFBD>x<EFBFBD><08><19><19>W<EFBFBD>$<24>$<24> <11>/<2F><04>Y<EFBFBD><0F>D<EFBFBD>Q<>Q<>Q<>J<EFBFBD> *<2A><<3C> 8<>D<EFBFBD><1B> <1D> <1D><> <11> <10>D<EFBFBD><44><EFBFBD><EFBFBD> <0F>Ks <00>"><00>Az/healthc<00>H<00>tdtttd<02><04><00>S)N<>ok)rM<00> whisper_model<65>whisper_device<63>whisper_compute_type)r
r9r;r=rGrHrI<00>healthr{vs*<00><00> <12><16>&<26>(<28> 4<> <06><06> <07> <07>rHz/auth/registerc <00>&<00>tjdd<02><03><00>pi}|<00>d<04><00>pd<05><00><00><00><00><00>}|<00>d<06><00>pd}|r|st dd<08><00>St |<01><00>}|rt d d
<EFBFBD><00>S t|t|<02><00>|<00>d <0B><00>|<00>d <0C><00>|<00>d <0A><00>d<0E><05><00>}t|ddtj d|i<01><00>d<11><03><00>td|d|d|<04>d <0B><00>d<13>i<01><00>dfS#t$r'}t t|<05><00>d<15><00>cYd}~Sd}~wwxYw)NTF<54><02>force<63>silent<6E>email<69><00>password<72>$'email' and 'password' are required.rKz#User already exists for this email.i<><00> display_name<6D>
avatar_url<EFBFBD>bio)r<><00> password_hashr<68>r<>r<><00>user_idz user.register<65>r<><00>action<6F>details<6C>user)r<>r<>r<><00><><00><>)r <00>get_jsonrs<00>striprVrPrrr r<00>json<6F>dumpsr
<00> Exception<6F>str)<06>payloadr<64>r<><00>existingr<67><00>es rI<00> api_registerr<72><00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><17> !<21> !<21> '<27>R<EFBFBD> .<2E> .<2E> 0<> 0<> 6<> 6<> 8<> 8<>E<EFBFBD><16>{<7B>{<7B>:<3A>&<26>&<26>,<2C>"<22>H<EFBFBD> <10>C<01><08>C<01><15><<3C>c<EFBFBD>B<>B<>B<> <20><15>'<27>'<27>H<EFBFBD><0F>B<01><15>;<3B>S<EFBFBD>A<>A<>A<>#<23><1A><1E>!7<><08>!A<>!A<> '<27> <0B> <0B>N<EFBFBD> ;<3B> ;<3B>%<25>k<EFBFBD>k<EFBFBD>,<2C>7<>7<><1E>{<7B>{<7B>5<EFBFBD>)<29>)<29>  <0E> <0E>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<EFBFBD><04> <16>$<24>y<EFBFBD>/<2F>_<EFBFBD>Y]<5D>Yc<59>el<65>ns<6E>dt<64>Yu<59>Yu<59>v<>v<>w<>w<>w<><16> <12><1F> <09>?<3F><1D>g<EFBFBD><1D> $<24><08><08><1E> 8<> 8<><0E><0E>
<EFBFBD> <0B> <0B> <10> <10> <10><> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>!B=E<00>
F<03>)F <03>F<03> Fz /auth/loginc
<00><><00>tjdd<02><03><00>pi}|<00>d<04><00>pd<05><00><00><00><00><00>}|<00>d<06><00>pd}|r|st dd<08><00>St |<01><00>}|st d d
<EFBFBD><00>St|d |<02><00>st d d
<EFBFBD><00>St|d d tj
2026-02-15 10:33:57 -07:00
d|i<01><00>d<0E><03><00>td|d |d|<03>d<10><00>|<03>d<11><00>|<03>d<12><00>d<13>i<01><00>S)NTFr}r<>r<>r<>r<>rKzInvalid credentials.i<>r<>r<>z
user.loginr<6E>r<>r<>r<>r<>)r<>r<>r<>r<>r<>) r r<>rsr<>rVrPrr rr<>r<>r
)r<>r<>r<>r<>s rI<00> api_loginr<6E><00>s\<00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><17> !<21> !<21> '<27>R<EFBFBD> .<2E> .<2E> 0<> 0<> 6<> 6<> 8<> 8<>E<EFBFBD><16>{<7B>{<7B>:<3A>&<26>&<26>,<2C>"<22>H<EFBFBD> <10>C<01><08>C<01><15><<3C>c<EFBFBD>B<>B<>B<> <1C>U<EFBFBD> #<23> #<23>D<EFBFBD> <0F>3<><15>,<2C>c<EFBFBD>2<>2<>2<> <1E>t<EFBFBD>O<EFBFBD>4<>h<EFBFBD> ?<3F> ?<3F>3<><15>,<2C>c<EFBFBD>2<>2<>2<><11>d<EFBFBD>9<EFBFBD>o<EFBFBD><1C>RV<52>R\<5C>^e<>gl<67>]m<>Rn<52>Rn<52>o<>o<>p<>p<>p<> <12> <12><1F> <09>?<3F><1D>g<EFBFBD><1D> $<24><08><08><1E> 8<> 8<>"<22>h<EFBFBD>h<EFBFBD>|<7C>4<>4<><1B>x<EFBFBD>x<EFBFBD><05><EFBFBD><EFBFBD> <0E><0E>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<06>
<06>
2026-02-15 10:33:57 -07:00
rHz /posts/uploadc <00><> <00>dtjvrtdd<03><00>Stjd}|jstdd<03><00>St |j<00><00>stdd<03><00>Stj<00>d<06><00>}tj<00>d<07><00>pd<08><00><00>}tj<00>d <09><00>}tj<00>d
2026-02-14 22:04:39 -07:00
<EFBFBD><00>pd <0B><00><00><00><00><00>}tj<00>d <0C><00>pd <0A><00><00><00><00><00>}|dvrtdd<03><00>S t|<01><00>}n'#ttf$rtdd<03><00>cYSwxYwt|<06><00>}|stdd<12><00>Sttj<00><00><00><00>}t!|j<00><00>} d|<06>d|<08><00>}
|<06>d|<08>d| <09><00>} t"|<08>d| <09><00>z } |<00>| <0C><00>d} t'||||d||
2026-02-15 10:33:57 -07:00
d<18><07><00>} t| d<00><00>}t)| <0C><00>}| <0C>d<1A><00>5}t-t.| |<10><00><00>|jpdd<1C><1D><00>ddd<00><00>n #1swxYwYt5|dt.<00>d| <0B><00>|j| <0C><00><00>j|d<1F><05><00>t;<00><00><00>t| <0C><00><00><00>\}}g}g}|D]<5D>}|j<00><00><00>}|s<01>|<14> |<16><00>|<13> tC|j"<00><00>tC|j#<00><00>||j$<00>tC|j$<00><00>nddd <20><05><00><00><>d!<21>%|<14><00><00><00><00>}tM||<02><00>}|rtO||<13><00>tQ|tSj*|tW|<17><00>| |d"<22><04><00><00><00>t5|d#|
<EFBFBD>d$<24>d%tW|<17>,d&<26><00><00><00>t[j.|<17>,d&<26><00><00><00><00>/<00><00>d<1F><05><00>ta|d'd(i<01><00>tc||d)tSj*||
d*<2A><02><00>d+<2B><04><00>te||d(t.<00>d| <0B><00>||tW|<13><00>d,<2C><07><00>d-fS#tf$r<>}| r<>| <0A>d<19><00>rmtat| d<00><00>d'd.i<01><00>tct| d<00><00>|d/tSj*d0t|<19><00>i<01><00>d+<2B><04><00>td1|<19><00>d2<64><00>cYd}~Sd}~wwxYw)3N<33>filezMissing 'file' in form-data.rKzFilename is empty.zUnsupported media extension.r<>rgzUntitled recording<6E> description<6F>
visibility<EFBFBD>private<74>language<67>en<65><00>publicr<63><00>+'visibility' must be 'private' or 'public'.z-'user_id' is required and must be an integer.<2E>User not found.<2E><>zarchive/<2F>/z
/original/<2F>_<>
2026-02-15 10:33:57 -07:00
processing)r<>rgr<>r<>rMr<><00>storage_prefixrmr[zapplication/octet-streamF)<05>bucket<65> object_path<74>content<6E> content_type<70>upsert<72>original_audio)<05>rolerYr<><00>
size_bytesr])<05> start_sec<65>end_sec<65>text<78>
confidence<EFBFBD> embedding<6E> )<04>prompt<70>transcript_length_chars<72> source_filer<65><00>transcript_txtz/transcript.txtz
text/plainzutf-8rMrlzpost.upload.transcribed)r<>r<><00>rmr<>r<>r<>)rmr<>rM<00>
audio_pathrfr<><00>rag_chunk_countr<74><00>failedzpost.upload.failedrOzUpload/transcription failed: r<>)4r <00>filesrPrQrX<00>formrsr<>rV<00>int<6E> TypeError<6F>
ValueErrorrr<><00>uuid<69>uuid4r<00>
UPLOAD_DIR<EFBFBD>saverrer^r"<00>ARCHIVE_BUCKETr_<00>mimetyper<00>stat<61>st_sizerJ<00>
transcriber<EFBFBD><00>append<6E>float<61>start<72>end<6E> avg_logprob<6F>joinrirr#r<>r<><00>len<65>encoder\r]rar!rr
r<>)<1A>media<69> user_id_rawrgr<>r<>r<>r<>r<><00> post_uuid<69> safe_namer<65><00>storage_object_path<74>
saved_path<EFBFBD> created_postrm<00> media_sha<68>
media_file<EFBFBD>segments<74>_info<66>rag_rows<77>transcript_parts<74>seg<65> segment_textrf<00> prompt_textr<74>s rI<00>api_upload_postr<74><00>s<><00><00> <0A>W<EFBFBD>]<5D>"<22>"<22><15>4<>c<EFBFBD>:<3A>:<3A>:<3A> <13>M<EFBFBD>&<26> !<21>E<EFBFBD> <10>><3E>1<><15>*<2A>C<EFBFBD>0<>0<>0<> <18><15><1E> (<28> (<28>;<3B><15>4<>c<EFBFBD>:<3A>:<3A>:<3A><19>,<2C>"<22>"<22>9<EFBFBD>-<2D>-<2D>K<EFBFBD> <14>\<5C> <1D> <1D>g<EFBFBD> &<26> &<26> ><3E>*><3E> E<> E<> G<> G<>E<EFBFBD><19>,<2C>"<22>"<22>=<3D>1<>1<>K<EFBFBD><19>,<2C>"<22>"<22><<3C>0<>0<>=<3D>I<EFBFBD>D<>D<>F<>F<>L<>L<>N<>N<>J<EFBFBD><17> <0C> <20> <20><1A>,<2C>,<2C>4<><04>;<3B>;<3B>=<3D>=<3D>C<>C<>E<>E<>H<EFBFBD><11>.<2E>.<2E>.<2E><15>C<>S<EFBFBD>I<>I<>I<>L<01><15>k<EFBFBD>"<22>"<22><07><07><> <15>z<EFBFBD> "<22>L<01>L<01>L<01><15>E<>s<EFBFBD>K<>K<>K<>K<>K<>L<01><><EFBFBD><EFBFBD> <1A>'<27> "<22> "<22>D<EFBFBD> <0F>.<2E><15>'<27><13>-<2D>-<2D>-<2D><13>D<EFBFBD>J<EFBFBD>L<EFBFBD>L<EFBFBD>!<21>!<21>I<EFBFBD><1F><05><0E>/<2F>/<2F>I<EFBFBD>5<><07>5<>5<>)<29>5<>5<>N<EFBFBD>$<24>G<>G<>y<EFBFBD>G<>G<>I<EFBFBD>G<>G<><17><1B><19>8<>8<>Y<EFBFBD>8<>8<>8<>J<EFBFBD> <09>J<EFBFBD>J<EFBFBD>z<EFBFBD><1A><1A><1A><17>L<EFBFBD>r@<01>(<28>"<22><1E>*<2A>(<28>&<26>$<24>"0<> <0E> <0E>
2026-02-14 22:04:39 -07:00

<EFBFBD>

<EFBFBD> <0C><16>l<EFBFBD>9<EFBFBD>-<2D>.<2E>.<2E><07><1B>J<EFBFBD>'<27>'<27> <09> <17>_<EFBFBD>_<EFBFBD>T<EFBFBD> "<22> "<22> <0E>j<EFBFBD> !<21>%<25>/<2F>"<22><0F><0F>)<29>)<29>"<22>^<5E>I<>/I<><1C>  <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E> <0E><><EFBFBD><EFBFBD> <0E> <0E> <0E> <0E> <19> <13>(<28>)<29>A<>A<>,?<3F>A<>A<> %<25><0E>(<28>o<EFBFBD>o<EFBFBD>/<2F>/<2F>7<>#<23>  <0E> <0E>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<EFBFBD>
2026-02-15 10:33:57 -07:00
<EFBFBD>!<21>(<28>(<28>-<2D>-<2D>c<EFBFBD>*<2A>o<EFBFBD>o<EFBFBD>><3E>><3E><0F><08>%<25><15><08><1D><18><1B> <0E> <0E>C<EFBFBD><1E>8<EFBFBD>><3E>><3E>+<2B>+<2B>L<EFBFBD><1F> <19><18> <1C> #<23> #<23>L<EFBFBD> 1<> 1<> 1<> <14>O<EFBFBD>O<EFBFBD>!&<26>s<EFBFBD>y<EFBFBD>!1<>!1<>$<24>S<EFBFBD>W<EFBFBD>~<7E>~<7E>(<28><?<3F>O<EFBFBD><W<>%<25><03><0F>"8<>"8<>"8<>]a<>!%<25> <12><12> <0E> <0E> <0E> <0E><1E>(<28>(<28>#3<>4<>4<>:<3A>:<3A><<3C><<3C><0F>#<23>O<EFBFBD>U<EFBFBD>;<3B>;<3B> <0B> <13> .<2E> <1A>7<EFBFBD>H<EFBFBD> -<2D> -<2D> -<2D><1F> <13> <10>J<EFBFBD>)<29>/2<>?<3F>/C<>/C<>#,<2C> (<28> <12><12> <0E> <0E>
2026-02-14 22:04:39 -07:00
<EFBFBD>
<EFBFBD>
<EFBFBD> <19> <13>(<28>)<29>:<3A>:<3A>:<3A> ,<2C>!<21>/<2F>"8<>"8<><17>"A<>"A<>B<>B<>!<21>.<2E><1F>)?<3F>)?<3F><07>)H<>)H<>I<>I<>S<>S<>U<>U<>  <0E> <0E>
<EFBFBD>
<EFBFBD>
<EFBFBD> <1A>'<27>H<EFBFBD>g<EFBFBD>#6<>7<>7<>7<><15>"<22>"<22>3<><1F>:<3A>Z<EFBFBD>Sa<53>&b<>&b<>c<>c<>  <0E> <0E>
<EFBFBD>
<EFBFBD>
<EFBFBD><17>"<22>(<28>!<21>!/<2F>G<>G<>2E<32>G<>G<>#2<>%<25>#&<26>x<EFBFBD>=<3D>=<3D> <0E> <0E>
2026-02-14 22:04:39 -07:00

<EFBFBD>

<EFBFBD> <0F>
<0F>
2026-02-15 10:33:57 -07:00
<0F><> <15> @<01> @<01> @<01> <17> <0E>L<EFBFBD>,<2C>,<2C>Y<EFBFBD>7<>7<> <0E> <1D>c<EFBFBD>,<2C>y<EFBFBD>"9<>:<3A>:<3A>X<EFBFBD>x<EFBFBD><P<> Q<> Q<> Q<> <19>"<22><<3C> <09>#:<3A>;<3B>;<3B>&<26>2<>#<23>z<EFBFBD>7<EFBFBD>C<EFBFBD><01>F<EFBFBD>F<EFBFBD>*;<3B><<3C><<3C> <12><12> <0E> <0E> <0E><16>9<>a<EFBFBD>9<>9<>3<EFBFBD>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F>?<3F><><EFBFBD><EFBFBD><EFBFBD> @<01><><EFBFBD>sW<00><F <00> !F0<03>/F0<03>AT4<00>3K<03> T4<00>K<07>T4<00>K<07>IT4<00>4
W<03>>BW<03>W<03>Wz/users/<int:user_id>/historyr<79>c
2026-02-14 22:04:39 -07:00
<00><><00>tj<00>ddt<00><03><00>}tj<00>ddt<00><03><00>} t |||<02><06><00>}t ||t td|<02><00>d<07><00>d<08><03><00>S#t$r'}tt|<04><00>d <09><00>cYd}~Sd}~wwxYw)
2026-02-15 10:33:57 -07:00
N<EFBFBD>pagerT<00><02>default<6C>type<70>limit<69><00>r<>r<><00>d)<03>historyr<79>r<>r<>) r <00>argsrsr<>rr
<00>min<69>maxr<78>rPr<>)r<>r<>r<><00>postsr<73>s rI<00>api_user_historyr<79>bs<><00><00> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B> ;<3B>E<EFBFBD>#<23>!<21>'<27><04>E<EFBFBD>B<>B<>B<><05><16>5<EFBFBD>$<24><13>S<EFBFBD><11>E<EFBFBD>]<5D>]<5D>TW<54>AX<41>AX<41>Y<>Y<>Z<>Z<>Z<><5A> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>AB<00>
C<03>B=<03>7C<03>=Cz /rag/searchc
<00><><00>tj<00>d<01><00>pd<02><00><00>}tj<00>dt<00><04><00>}tj<00>ddt<00><07><00>}tj<00>dd t<00><07><00>}|st d
d <0B><00>S|st d d <0B><00>S t ||||<03> <0A><00>}t||ttd|<03><00>d<0E><00>d<0F><03><00>S#t$r'}t t|<05><00>d<10><00>cYd}~Sd}~wwxYw)N<>qr<71>r<><00>r<>r<>rTr<>r<><00>z'user_id' is required.rKz'q' is required.)r<><00>
query_textr<EFBFBD>r<>r<>)<03>resultsr<73>r<>r<>) r r<>rsr<>r<>rPr r
r<>r<>r<>r<>)r<>r<>r<>r<><00>rowsr<73>s rI<00>api_rag_searchr<68>ns7<00><00><19>,<2C>"<22>"<22>3<EFBFBD>'<27>'<27>-<2D>2<EFBFBD>4<>4<>6<>6<>J<EFBFBD><15>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>3<>G<EFBFBD> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B> ;<3B>E<EFBFBD> <12>5<><15>.<2E><03>4<>4<>4<> <15>/<2F><15>(<28>#<23>.<2E>.<2E>.<2E>#<23> <20><17>Z<EFBFBD>d<EFBFBD>Z_<5A>`<60>`<60>`<60><04><16>4<EFBFBD><14><03>C<EFBFBD><01>5<EFBFBD>M<EFBFBD>M<EFBFBD>SV<53>@W<>@W<>X<>X<>Y<>Y<>Y<><59> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00> AD<00>
E<03>D;<03>5E<03>;Ez/usersc<00>6<00>tjdd<02><03><00>pi} tt|<00><00><00><00>dfS#t$r'}t t |<01><00>d<05><00>cYd}~Sd}~wt$r'}t t |<01><00>d<06><00>cYd}~Sd}~wwxYw<01>NTFr}r<>rKr<>)r r<>r
rr<>rPr<>r<><00>r<>r<>s rI<00>api_create_userr<00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>{<7B>7<EFBFBD>+<2B>+<2B>,<2C>,<2C>c<EFBFBD>1<>1<><31> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD><EFBFBD>-<00>8<00>
B<03>A$<03>B<03>$ B<03>1B<03> B<03>Bz/users/<int:user_id>c<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>S)Nr<4E>r<>)rrPr
)r<>r<>s rI<00> api_get_userr<00>s4<00><00> <19>'<27> "<22> "<22>D<EFBFBD> <0F>.<2E><15>'<27><13>-<2D>-<2D>-<2D> <12>4<EFBFBD>=<3D>=<3D>rHz/postsc<00>6<00>tjdd<02><03><00>pi} tt|<00><00><00><00>dfS#t$r'}t t |<01><00>d<05><00>cYd}~Sd}~wt$r'}t t |<01><00>d<06><00>cYd}~Sd}~wwxYwr)r r<>r
rr<>rPr<>r<>rs rI<00>api_create_postr<00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>(<28><17>1<>1<>2<>2<>C<EFBFBD>7<>7<><37> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>rc
2026-02-15 01:21:05 -07:00
<00>h<00><05>tj<00>ddt<00><03><00>}tj<00>ddt<00><03><00>}tj<00>d<06><00>}tj<00>dt<00><08><00><00> t |||<02> <09><00>}<03>r<0F>fd
2026-02-15 10:33:57 -07:00
<EFBFBD>|D<00><00>}n d <0B>|D<00><00>}d <0C>|D<00><00>}t ||t td|<01><00>d <0A><00>d<0E><03><00>S#t$r'}tt|<04><00>d<0F><00>cYd}~Sd}~wwxYw)Nr<4E>rTr<>r<>r<>r<><00>current_user_idr<64>)r<>r<>r<>c<00>x<00><01>g|]6}|<01>d<00><00>dks|<01>d<02><00><00>k<00>4|<01><02>7S)r<>r<>r<><00>rs)<03>.0<EFBFBD>pr s <20>rI<00>
<listcomp>z"api_list_posts.<locals>.<listcomp><3E>sG<00><><00>n<>n<>n<>!<21>q<EFBFBD>u<EFBFBD>u<EFBFBD>\<5C>':<3A>':<3A>h<EFBFBD>'F<>'F<>!<21>%<25>%<25>PY<50>JZ<4A>JZ<4A>^m<>Jm<4A>Jm<4A>A<EFBFBD>Jm<4A>Jm<4A>JmrHc<00>D<00>g|]}|<01>d<00><00>dk<00>|<01><02>S)r<>r<>r )r r s rIrz"api_list_posts.<locals>.<listcomp><3E>s.<00><00>G<>G<>G<>!<21>q<EFBFBD>u<EFBFBD>u<EFBFBD>\<5C>':<3A>':<3A>h<EFBFBD>'F<>'F<>A<EFBFBD>'F<>'F<>'FrHc<00>,<00>g|]}t|<01><00><00><02>SrG)ru)r rjs rIrz"api_list_posts.<locals>.<listcomp><3E>s <00><00>6<>6<>6<><14><0E>t<EFBFBD>$<24>$<24>6<>6<>6rHr<>)r<>r<>r<>r<>) r r<>rsr<>rr
r<>r<>r<>rPr<>)r<>r<>r<>r<>r<>r s @rI<00>api_list_postsr<00>sA<00><><00> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>b<EFBFBD>s<EFBFBD> <1C> ;<3B> ;<3B>E<EFBFBD><18><1C>!<21>!<21>,<2C>/<2F>/<2F>J<EFBFBD><1D>l<EFBFBD>&<26>&<26>'8<>s<EFBFBD>&<26>C<>C<>O<EFBFBD>#<23><1F>T<EFBFBD><15>:<3A>N<>N<>N<><04> <1B> H<01>n<>n<>n<>n<>t<EFBFBD>n<>n<>n<>D<EFBFBD>D<EFBFBD>G<>G<>t<EFBFBD>G<>G<>G<>D<EFBFBD>7<>6<><14>6<>6<>6<><04><16><14>t<EFBFBD>c<EFBFBD>#<23>a<EFBFBD><15>-<2D>-<2D>QT<51>>U<>>U<>V<>V<>W<>W<>W<><57> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>A)D<00>
2026-02-15 01:21:05 -07:00
D1<03>
2026-02-15 10:33:57 -07:00
D,<03>&D1<03>,D1z/posts/<int:post_id>rmc<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>S<00>N<>Post not found.r<>)rrPr
<00>rm<00>rows rI<00> api_get_postr<00>s4<00><00>
2026-02-14 21:46:48 -07:00
<1E>w<EFBFBD>
'<27>
2026-02-15 10:33:57 -07:00
'<27>C<EFBFBD> <0E>.<2E><15>'<27><13>-<2D>-<2D>-<2D> <12>3<EFBFBD><<3C><<3C>rHc<00><><00>tjdd<02><03><00>pi} t||<01><00>}|stdd<05><00>St |<02><00>S#t
$r'}tt |<03><00>d<06><00>cYd}~Sd}~wwxYw)NTFr}rr<>r<>)r r<>r!rPr
r<>r<>)rmr<>rr<>s rI<00>api_patch_postr<00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><1F><07><17>1<>1<><03><12> 2<><19>+<2B>S<EFBFBD>1<>1<> 1<><16>s<EFBFBD>|<7C>|<7C><1B><> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s"<00>!A <00>A <00>
A<<03>A7<03>1A<<03>7A<z/posts/<int:post_id>/bundlec<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>Sr)rrPr
)rm<00>bundles rI<00>api_post_bundler<00>s4<00><00> <1C>W<EFBFBD> %<25> %<25>F<EFBFBD> <11>.<2E><15>'<27><13>-<2D>-<2D>-<2D> <12>6<EFBFBD>?<3F>?<3F>rHz/posts/<int:post_id>/audio-urlc<00><><00>t|<00><00>}|stdd<02><00>S|<01>d<03><00>}|<01>d<04><00>}tj<00>dt
<00><05><00>}tj<00>ddt
<00><08><00>}t td |<05><00>d
<EFBFBD><00>}|d kr||krtd d <0A><00>S t||<05><0E><00>}t|<06><00>S#t$r'}tt|<07><00>d<02><00>cYd}~Sd}~wt$r'}tt|<07><00>d<10><00>cYd}~Sd}~wwxYw)z<>
Get signed URL for original audio/video so users can play it.
Private posts require owner user_id in query params.
2026-02-15 10:33:57 -07:00
rr<>r<>r<>r<>rprnr<><00><i<>Qr<>z,Not authorized to access this private audio.<2E><>)rmrpNr<4E>) rrPrsr r<>r<>r<>r<>rr
r<>r<>r<>)rmrr<><00>owner_id<69> requester_idrp<00>resultr<74>s rI<00>api_post_audio_urlr#<00>sc<00><00> <1F>w<EFBFBD>
'<27>
'<27>C<EFBFBD> <0E>.<2E><15>'<27><13>-<2D>-<2D>-<2D><14><17><17><1C>&<26>&<26>J<EFBFBD><12>w<EFBFBD>w<EFBFBD>y<EFBFBD>!<21>!<21>H<EFBFBD><1A><<3C>#<23>#<23>I<EFBFBD>C<EFBFBD>#<23>8<>8<>L<EFBFBD><18><1C>!<21>!<21>,<2C><04>3<EFBFBD>!<21>G<>G<>J<EFBFBD><14>S<EFBFBD><12>Z<EFBFBD>(<28>(<28>%<25>0<>0<>J<EFBFBD><11>Y<EFBFBD><1E><1E><<3C>8<EFBFBD>#;<3B>#;<3B><15>D<>c<EFBFBD>J<>J<>J<>#<23>'<27><07>J<EFBFBD>O<>O<>O<><06><16>v<EFBFBD><EFBFBD><EFBFBD><1E><> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s0<00>C4<00>4
2026-02-15 10:33:57 -07:00
E<03>>D <03>E<03> E<03>-E<03> E<03>Ez/posts/<int:post_id>/filesc<00>8<00>tjdd<02><03><00>pi} tt||<01><00><00><00>dfS#t$r'}t t |<02><00>d<05><00>cYd}~Sd}~wt$r'}t t |<02><00>d<06><00>cYd}~Sd}~wwxYwr)r r<>r
rr<>rPr<>r<><00>rmr<>r<>s rI<00> api_add_filer&<00>s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>'<27><07><17>9<>9<>:<3A>:<3A>C<EFBFBD>?<3F>?<3F><> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s-<00>9<00>
B<03>A%<03>B<03>% B<03>2B<03>B<03>Bc<00><><00> tdt|<00><00>i<01><00>S#t$r'}tt |<01><00>d<02><00>cYd}~Sd}~wwxYw)Nr<4E>r<>)r
rr<>rPr<>)rmr<>s rI<00>api_list_filesr(<00>sg<00><00>#<23><16><07>!3<>G<EFBFBD>!<<3C>!<<3C>=<3D>><3E>><3E>><3E><> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00> <00>
A<03>A <03>A<03> Az/posts/<int:post_id>/metadatac<00>$<00>tjdd<02><03><00>pi}|<01>d<04><00>}|<02>tdd<06><00>S t t ||<02><00><00><00>S#t $r'}tt|<03><00>d<07><00>cYd}~Sd}~wwxYw)NTFr}<00>metadataz'metadata' is required.rKr<>)r r<>rsrPr
r#r<>r<>)rmr<>r*r<>s rI<00>api_put_metadatar+s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD><16>{<7B>{<7B>:<3A>&<26>&<26>H<EFBFBD><0F><17><15>/<2F><13>5<>5<>5<>#<23><16>.<2E>w<EFBFBD><08>A<>A<>B<>B<>B<><42> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>A<00>
2026-02-14 21:46:48 -07:00
B<03>(B
<03>B<03>
2026-02-15 10:33:57 -07:00
Bc<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>S)NzMetadata not found.r<>)rrPr
rs rI<00>api_get_metadatar-s4<00><00>
2026-02-14 21:46:48 -07:00
<1E>w<EFBFBD>
'<27>
2026-02-15 10:33:57 -07:00
'<27>C<EFBFBD> <0E>2<><15>+<2B>S<EFBFBD>1<>1<>1<> <12>3<EFBFBD><<3C><<3C>rHz/posts/<int:post_id>/rightsc<00><><00>tjdd<02><03><00>pi} tt||<01><00><00><00>S#t$r'}t t |<02><00>d<04><00>cYd}~Sd}~wwxYw)NTFr}r<>)r r<>r
r$r<>rPr<>r%s rI<00>api_put_rightsr/s~<00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>,<2C>W<EFBFBD>g<EFBFBD>><3E>><3E>?<3F>?<3F>?<3F><> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>7<00>
A(<03>A#<03>A(<03>#A(c<00>b<00>t|<00><00>}|stdd<02><00>St|<01><00>S)NzRights not found.r<>)rrPr
rs rI<00>api_get_rightsr1$s4<00><00>
2026-02-14 21:46:48 -07:00
<1C>W<EFBFBD>
%<25>
2026-02-15 10:33:57 -07:00
%<25>C<EFBFBD> <0E>0<><15>)<29>3<EFBFBD>/<2F>/<2F>/<2F> <12>3<EFBFBD><<3C><<3C>rHz/posts/<int:post_id>/chunksc<00>r<00>tjdd<02><03><00>pi}|<01>d<04><00>}t|t<00><00>st dd<06><00>S t ||<02><00>}tt|<03><00>|d<07><02><00>dfS#t$r'}t t|<04><00>d <09><00>cYd}~Sd}~wwxYw)
NTFr}<00>chunksz'chunks' must be a list.rK)<02>insertedr3r<>r<>) r r<>rs<00>
isinstance<EFBFBD>listrPrr
r<>r<>r<>)rmr<>r3r<>r<>s rI<00>api_add_chunksr7,s<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD> <14>[<5B>[<5B><18> "<22> "<22>F<EFBFBD> <15>f<EFBFBD>d<EFBFBD> #<23> #<23>7<><15>0<>#<23>6<>6<>6<>#<23><1D>g<EFBFBD>v<EFBFBD>.<2E>.<2E><04><16>C<EFBFBD><04>I<EFBFBD>I<EFBFBD><14>><3E>><3E>?<3F>?<3F><13>D<>D<><44> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>0B<00>
B6<03>B1<03>+B6<03>1B6c<00>J<00>tj<00>ddt<00><03><00>}tj<00>ddt<00><03><00>} t dt |||<02><07><00>i<01><00>S#t $r'}tt|<03><00>d<08><00>cYd}~Sd}~wwxYw) Nr<4E>rTr<>r<><00><>r3r<>r<>) r r<>rsr<>r
rr<>rPr<><00>rmr<>r<>r<>s rI<00>api_get_chunksr;;s<><00><00> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C> <<3C>E<EFBFBD>#<23><16><08>/<2F>'<27><04>E<EFBFBD>"R<>"R<>"R<>S<>T<>T<>T<><54> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD><EFBFBD><00> A1<00>1
B"<03>;B<03>B"<03>B"z/auditc<00>6<00>tjdd<02><03><00>pi} tt|<00><00><00><00>dfS#t$r'}t t |<01><00>d<05><00>cYd}~Sd}~wt$r'}t t |<01><00>d<06><00>cYd}~Sd}~wwxYwr)r r<>r
rr<>rPr<>r<>rs rI<00>api_create_auditr>Fs<><00><00><15><1E>T<EFBFBD>%<25>8<>8<>8<>><3E>B<EFBFBD>G<EFBFBD>#<23><16>}<7D>W<EFBFBD>-<2D>-<2D>.<2E>.<2E><03>3<>3<><33> <15>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>rc <00><><00>tj<00>dt<00><02><00>}tj<00>dt<00><02><00>}tj<00>ddt<00><06><00>}tj<00>ddt<00><06><00>} t d t ||||<03>
<EFBFBD><00>i<01><00>S#t $r'}tt|<04><00>d <0B><00>cYd}~Sd}~wwxYw) Nrmr<>r<>r<>rTr<>r<>r<><00>logs)rmr<>r<>r<>r<><00> r r<>rsr<>r
rr<>rPr<>)rmr<>r<>r<>r<>s rI<00>api_list_auditrBQs<><00><00><15>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>3<>G<EFBFBD><15>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>3<>G<EFBFBD> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C> <<3C>E<EFBFBD>#<23><16><06><0F><07><17>W[<5B>ch<63> i<> i<> i<>j<>k<>k<>k<><6B> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>s<00>!B><00>>
C/<03>C*<03>$C/<03>*C/z/posts/<int:post_id>/auditc<00>J<00>tj<00>ddt<00><03><00>}tj<00>ddt<00><03><00>} t dt |||<02><07><00>i<01><00>S#t $r'}tt|<03><00>d<08><00>cYd}~Sd}~wwxYw) Nr<4E>rTr<>r<>r<>r@)rmr<>r<>r<>rAr:s rI<00>api_post_auditrD^s<><00><00> <12><<3C> <1B> <1B>F<EFBFBD>A<EFBFBD>C<EFBFBD> <1B> 8<> 8<>D<EFBFBD> <13>L<EFBFBD> <1C> <1C>W<EFBFBD>c<EFBFBD><03> <1C> <<3C> <<3C>E<EFBFBD>#<23><16><06><0F><07>d<EFBFBD>RW<52> X<> X<> X<>Y<>Z<>Z<>Z<><5A> <14>#<23>#<23>#<23><15>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>c<EFBFBD>"<22>"<22>"<22>"<22>"<22>"<22>"<22>"<22><><EFBFBD><EFBFBD><EFBFBD>#<23><><EFBFBD>r<z/posts/<int:post_id>/downloadc <00> <00> t|<00><00>}|stdd<02><00>St|<00><00>}t|<00><00>}t j<00><00>}t j|dt j<00><00>5}|<03>r<>|<03> d<04><00><00>r<> t|dt<00><00>rtj |d<00><00>n|d}d}d|vrc|d}|<08>d<07><00>} t| <09><00>dkr3| d<00>d <09><00>d
<00><00><00>}|<01> d <0B><00>|<01> d <0C><00>|<06> d d<0E><00>|<06> d<0F><00>|<01> d<10><00>|<01> d<11><00>d<12>}
|<05>dtj|
d<14><15><00><00><00>|r|<05>d|<07><00>n)#t&$r} t)d| <0B><00><02><00>Yd} ~ nd} ~ wwxYw|D]<5D>} | <0C> d<19><00>dkr<> t+|d<1B><1C><00>} | <0A> d<1D><00>}|rxt-j |d<1E><1F><00>}|jd kr@| d!<00>d"<22><00>d#}|<05>d$|<10><00>|j<00><00>nt)d%|j<00><00><02><00><00><>#t&$r} t)d&| <0B><00><02><00>Yd} ~ <0B><>d} ~ wwxYw<01><> t3|dd'<27>(<28><00>}|r5d)<29>d*<2A>|D<00><00><00><00>}|<05>d+|<12><00>n)#t&$r} t)d,| <0B><00><02><00>Yd} ~ nd} ~ wwxYwddd<18><00>n #1swxYwY|<04>d
<EFBFBD><00>d<05>d-<2D>|<01> d d.<2E><00>D<00><00><00><00><00><00><00>}|<13>d/d0<64><00>dd1<64>}t;|d2d3|<13>d0|<00>d4<64><04>5<EFBFBD><00>S#t&$rT} t)d6| <0B><00><02><00>d
dl}|<14><00><00>td7t| <0B><00><00><00>d8<64><00>cYd} ~ Sd} ~ wwxYw)9z{
Download post as a ZIP file containing:
- Original audio file
- Transcript as text
- Metadata as JSON
zPost not foundr<64><00>wr*r<>r<>z Transcript:
rTz
Answer user questionsrrgr<>r<>r<>r<><00>
created_atr<EFBFBD>)rgr<>r<><00>transcript_lengthrGr<>z metadata.json<6F>)<01>indentztranscript.txtzError adding metadata: Nr<4E>r<>i,rorqr<>)<01>timeoutr9rYr<><00><><EFBFBD><EFBFBD><EFBFBD>zaudio/zFailed to download audio: HTTP zError adding audio file: i<>r<>z
c <00>L<00>g|]!}d|dd<02>d|dd<02>d|d<00><00><06><02>"S)<07>[r<>z.2fzs - r<>zs]
r<EFBFBD>rG)r rds rIrz!download_post.<locals>.<listcomp><3E>sX<00><00>/<16>/<16>/<16>!<21>b<01>E<EFBFBD>+<2B>.<2E>a<>a<>a<><05>i<EFBFBD>8H<38>a<>a<>a<>RW<52>X^<5E>R_<52>a<>a<>/<16>/<16>/rHztranscript_timestamped.txtzError adding chunks: c3<00>JK<00>|]}|<01><00><00>s|dv<00>|V<00><00>dS))r<><00>-r<>N)<01>isalnum)r <00>cs rI<00> <genexpr>z download_post.<locals>.<genexpr><3E>s;<00><00><00><00>l<>l<>1<EFBFBD><01> <09> <09> <0B> <0B>l<>WX<57>\k<>Wk<57>Wk<57>Q<EFBFBD>Wk<57>Wk<57>Wk<57>Wk<57>l<>lrH<00>archiver<65>r<><00>2zapplication/zipTz.zip)r<><00> as_attachment<6E> download_namezDownload error: zFailed to create download: r<>) rrPrr<00>io<69>BytesIO<49>zipfile<6C>ZipFile<6C> ZIP_DEFLATEDrsr5r<>r<><00>loads<64>splitr<74>r<><00>writestrr<72>r<><00>printr<00>requests<74> status_coder<65>rr<><00>seek<65>replacer<00> traceback<63> print_exc)rmrjr<><00> metadata_row<6F>
zip_buffer<EFBFBD>zipf<70> metadata_dictrfr<><00>match<63>clean_metadatar<61><00> file_info<66>audio_url_datarq<00>response<73>original_filenamer3<00> chunks_text<78>
safe_titleres rI<00> download_postrsis<><00><00>aC<01>#<23>G<EFBFBD>,<2C>,<2C><04><13> 1<><19>*<2A>C<EFBFBD>0<>0<> 0<>#<23>7<EFBFBD>+<2B>+<2B><05>+<2B>G<EFBFBD>4<>4<> <0C><18>Z<EFBFBD>\<5C>\<5C>
<EFBFBD> <14>_<EFBFBD>Z<EFBFBD><13>g<EFBFBD>.B<> C<> C<>@ 3<>t<EFBFBD><1B> 9<> <0C> 0<> 0<><1A> <<3C> <<3C> 9<>9<>LV<4C>Wc<57>dn<64>Wo<57>qt<71>Lu<4C>Lu<4C>%T<02>D<EFBFBD>J<EFBFBD>|<7C>J<EFBFBD>/G<>$H<>$H<>$H<>|H<02>IS<02>|T<02>M<EFBFBD>')<29>O<EFBFBD><1F>=<3D>0<>0<>!.<2E>x<EFBFBD>!8<><06> &<26> <0C> <0C>_<EFBFBD> =<3D> =<3D><05><1E>u<EFBFBD>:<3A>:<3A><01>><3E>><3E>.3<EFBFBD>A<EFBFBD>h<EFBFBD>n<EFBFBD>n<EFBFBD>=X<>.Y<>.Y<>Z[<5B>.\<5C>.b<>.b<>.d<>.d<>O<EFBFBD>"&<26><18><18>'<27>!2<>!2<>'+<2B>x<EFBFBD>x<EFBFBD> <0A>'><3E>'><3E>$1<>$5<>$5<>j<EFBFBD>$<24>$G<>$G<>-:<3A>-><3E>-><3E>?X<>-Y<>-Y<>&*<2A>h<EFBFBD>h<EFBFBD>|<7C>&<<3C>&<<3C>&*<2A>h<EFBFBD>h<EFBFBD>|<7C>&<<3C>&<<3C> &<16>&<16>N<EFBFBD><19>M<EFBFBD>M<EFBFBD>/<2F>4<EFBFBD>:<3A>n<EFBFBD>UV<55>3W<33>3W<33>3W<33>X<>X<>X<>'<27>I<01><1C> <0A> <0A>&6<><0F>H<>H<>H<><48><EFBFBD> <20>9<>9<>9<><19>7<>A<EFBFBD>7<>7<>8<>8<>8<>8<>8<>8<>8<>8<><38><EFBFBD><EFBFBD><EFBFBD>9<><39><EFBFBD><EFBFBD>#<23> ?<3F> ?<3F> <09><1C>=<3D>=<3D><16>(<28>(<28>,<<3C><<3C><<3C>?<3F>)?<3F><07>TW<54>)X<>)X<>)X<><0E>%3<>%7<>%7<> <0C>%E<>%E<>
<EFBFBD>%<25> `<01>'/<2F>|<7C>J<EFBFBD><02>'K<>'K<>'K<>H<EFBFBD>'<27>3<>s<EFBFBD>:<3A>:<3A>4=<3D>f<EFBFBD>4E<34>4K<34>4K<34>C<EFBFBD>4P<34>4P<34>QS<51>4T<34> 1<> $<24> <0A> <0A>.J<>7H<37>.J<>.J<>H<EFBFBD>L\<5C> ]<5D> ]<5D> ]<5D> ]<5D> %<25>&^<5E><08>H\<5C>&^<5E>&^<5E> _<> _<> _<><5F><EFBFBD>$<24>?<3F>?<3F>?<3F><1D>=<3D>!<21>=<3D>=<3D>><3E>><3E>><3E>><3E>><3E>><3E>><3E>><3E><><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>!=<3D>( 3<>(<28><17>q<EFBFBD><04>E<>E<>E<><06><19>M<01>"(<28>+<2B>+<2B>/<16>/<16>%+<2B>/<16>/<16>/<16>#<17>#<17>K<EFBFBD><19>M<EFBFBD>M<EFBFBD>"><3E> <0B>L<>L<>L<><4C><EFBFBD><1C> 3<> 3<> 3<><15>1<>a<EFBFBD>1<>1<>2<>2<>2<>2<>2<>2<>2<>2<><32><EFBFBD><EFBFBD><EFBFBD> 3<><33><EFBFBD><EFBFBD>@ 3<>@ 3<>@ 3<>@ 3<>@ 3<>@ 3<>@ 3<>@ 3<>@ 3<>@ 3<>@ 3<><33><EFBFBD><EFBFBD>@ 3<>@ 3<>@ 3<>@ 3<>F <13><0F><0F><01><1A><1A><1A><18>W<EFBFBD>W<EFBFBD>l<>l<><04><08><08><17>)<29>(D<>(D<>l<>l<>l<>l<>l<>r<>r<>t<>t<>
<EFBFBD><1F>'<27>'<27><03>S<EFBFBD>1<>1<>#<23>2<EFBFBD>#<23>6<>
<EFBFBD><18> <16>&<26><1E>'<27>7<>7<>'<27>7<>7<>7<> 
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><EFBFBD> <15>C<01>C<01>C<01> <0A>$<24><11>$<24>$<24>%<25>%<25>%<25><18><18><18><18><11><1B><1B><1D><1D><1D><15><<3C>C<EFBFBD><01>F<EFBFBD>F<EFBFBD><<3C><<3C>c<EFBFBD>B<>B<>B<>B<>B<>B<>B<>B<><42><EFBFBD><EFBFBD><EFBFBD> C<01><><EFBFBD>s<EFBFBD><00> P"<00>AP"<00>4N<03>E$G4<02>3N<03>4
H<05>>H<05>N<03>H<05> N<03>;B K<04>N<03>
L<07>&K=<07>8N<03>=L<07>N<03>A M<02>N<03>
M7<05>M2<05>-N<03>2M7<05>7N<03>: P"<00>N
<07>
P"<00> N
<07>BP"<00>"
R<03>,A Q;<03>5R<03>;Rc
<00><><00>tj<00>dt<00><02><00>}|st dd<04><00>St |<00><00>}|st dd<06><00>S|<02>d<01><00>|krt dd<08><00>S t |d tj||<02>d
<EFBFBD><00>d <0B><02><00>d <0C><03><00>t|<00><00>t|<00><00>t|<00><00>t|<00><00>t|<00><00>td |d<0E><02><00>S#t$r*}t dt!|<03><00><00><00>d<10><00>cYd}~Sd}~wwxYw)Nr<4E>r<><00>('user_id' is required for authorization.rKrr<>z.You don't have permission to delete this post.rz post.deletedrg)<02>deleted_post_idrgr<>zPost deleted successfully)rLrmzFailed to delete post: r<>)r r<>rsr<>rPrrr<>r<>r%r&r'r(r)r
r<>r<>)rmr<>rjr<>s rI<00>api_delete_postrwZsy<00><00><15>l<EFBFBD><1E><1E>y<EFBFBD>s<EFBFBD><1E>3<>3<>G<EFBFBD> <12>G<01><15>@<40>#<23>F<>F<>F<> <1F><07> (<28> (<28>D<EFBFBD> <0F>.<2E><15>'<27><13>-<2D>-<2D>-<2D> <0B>x<EFBFBD>x<EFBFBD> <09><1A><1A>g<EFBFBD>%<25>%<25><15>F<><03>L<>L<>L<>?<3F><15><1E>$<24><1B>z<EFBFBD>g<EFBFBD><04><08><08>QX<51>HY<48>HY<48>"Z<>"Z<>[<5B>[<5B>
<EFBFBD>
<EFBFBD> <0B> <0B> <0B> <1A>'<27>"<22>"<22>"<22><1C>W<EFBFBD>%<25>%<25>%<25><17><07> <20> <20> <20><15>g<EFBFBD><1E><1E><1E><19>'<27>"<22>"<22>"<22><16>#><3E>7<EFBFBD>S<>S<>T<>T<>T<><54> <14>?<3F>?<3F>?<3F><15>8<><03>A<EFBFBD><06><06>8<>8<>#<23>><3E>><3E>><3E>><3E>><3E>><3E>><3E>><3E><><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD>s<00>BD<00>
E<03>&E <03>E<03> Ez/posts/<int:post_id>/editc <00><><00>tjd<01><02><00>pi}|<01>d<03><00>}|stdd<05><00>St |<00><00>}|stdd<07><00>S|<03>d<03><00>|krtdd <09><00>Si}d
|vr3|d
pd <0B><00><00>}|std d<05><00>S||d
<d |vr |d |d <d|vrG|dpd <0B><00><00><00><00><00>}|dvrtdd<05><00>S||d<|stdd<05><00>S t||<04><00>}t||dtj
dt|<04> <00><00><00><00>i<01><00>d<14><04><00>t|<07><00>S#t$r*}tdt|<08><00><00><00>d<16><00>cYd}~Sd}~wwxYw)NT)r~r<>rurKrr<>z,You don't have permission to edit this post.rrgr<>zTitle cannot be empty.r<>r<>r<>r<>zNo valid fields to update.z post.edited<65>changesr<73>zFailed to update post: r<>)r r<>rsrPrr<>rVr!rr<>r<>r6<00>keysr
r<>r<>) rmr<>r<>rj<00>updatesrgr<><00> updated_postr<74>s rI<00> api_edit_postr}ys%<00><00><15><1E>T<EFBFBD>*<2A>*<2A>*<2A>0<>b<EFBFBD>G<EFBFBD><15>k<EFBFBD>k<EFBFBD>)<29>$<24>$<24>G<EFBFBD> <12>G<01><15>@<40>#<23>F<>F<>F<> <1F><07> (<28> (<28>D<EFBFBD> <0F>.<2E><15>'<27><13>-<2D>-<2D>-<2D> <0B>x<EFBFBD>x<EFBFBD> <09><1A><1A>g<EFBFBD>%<25>%<25><15>D<>c<EFBFBD>J<>J<>J<><10>G<EFBFBD><0E>'<27><19><19><18><17>!<21>'<27>R<EFBFBD>.<2E>.<2E>0<>0<><05><14> 9<><19>2<>C<EFBFBD>8<>8<> 8<> <20><07><07><18><14><07><1F><1F>!(<28><1D>!7<><07> <0A><1E><13>w<EFBFBD><1E><1E><1D>l<EFBFBD>+<2B>1<>r<EFBFBD>8<>8<>:<3A>:<3A>@<40>@<40>B<>B<>
<EFBFBD> <15>2<> 2<> 2<><19>G<><13>M<>M<> M<> *<2A><07> <0C><1D> <12>9<><15>2<>C<EFBFBD>8<>8<>8<>
?<3F>(<28><17>'<27>:<3A>:<3A> <0C><15><1E><1E>#<23><1B>z<EFBFBD>9<EFBFBD>d<EFBFBD>7<EFBFBD><<3C><<3C>><3E>><3E>.B<>.B<>"C<>D<>D<> 
<EFBFBD>
<EFBFBD> <0B> <0B> <0B> <17>|<7C>$<24>$<24>$<24><> <14>?<3F>?<3F>?<3F><15>8<><03>A<EFBFBD><06><06>8<>8<>#<23>><3E>><3E>><3E>><3E>><3E>><3E>><3E>><3E><><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD>s<00>/A%F<00>
G <03>G<03>>G <03>G )rK)m<>__doc__r\r<><00>osr<73><00>pathlibrrXrZ<00>flaskr<00>typingrrra<00>dotenvr<00>faster_whisperrr r
2026-02-15 01:52:26 -07:00
r <00>werkzeug.securityr r <00>werkzeug.utilsr<00>
2026-02-15 10:33:57 -07:00
db_queriesrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)<00>__name__r*<00>getenvr<76><00>mkdirrWr9r;r=r<>rB<00>__annotations__rJr<>r<>rP<00>boolrXrerirursr{rjr<>r<>r<>r<>r<>rrrrr<00>patchrrr#r&r(<00>putr+r-r/r1r7r;r>rBrDrs<00>deleterwr}rGrHrI<00><module>r<>s^ <00><01><04><04><04>
<0F><0E><0E><0E> <0B> <0B> <0B> <0B> <09> <09> <09> <09> <0B> <0B> <0B> <0B><18><18><18><18><18><18> <09> <09> <09> <09><0E><0E><0E><0E><1B><1B><1B><1B><1B><1B><1C><1C><1C><1C><1C><1C><1C><1C><0F><0F><0F><0F><1E><1E><1E><1E><1E><1E>'<27>'<27>'<27>'<27>'<27>'<27>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>-<2D>I<>I<>I<>I<>I<>I<>I<>I<>*<2A>*<2A>*<2A>*<2A>*<2A>*<2A><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02>8 <0C> <0B> <0A> <0A> <0A><0F>i<EFBFBD><05>x<EFBFBD>F<EFBFBD>3<>3<>3<><03> <11>T<EFBFBD>)<29>"<22>)<29>0<>)<29><<3C><<3C> =<3D> =<3D>
2026-02-14 22:04:39 -07:00
<EFBFBD>
2026-02-15 10:33:57 -07:00
<EFBFBD><10><10><14><04><10>-<2D>-<2D>-<2D>\<5C>\<5C>\<5C><18><19><02> <09>/<2F>6<EFBFBD>2<>2<> <0A><1A><12><19>+<2B>U<EFBFBD>3<>3<><0E> <20>r<EFBFBD>y<EFBFBD>!7<><16>@<40>@<40><14><1A><12><19>,<2C>i<EFBFBD>b<EFBFBD>i<EFBFBD>8Q<38>S]<5D>.^<5E>.^<5E>_<>_<><0E>&*<2A><0E> <0C>t<EFBFBD>#<23>*<2A>*<2A>*<2A><1A> <0C><1A><1A><1A><1A>/<2F>/<2F>C<EFBFBD>/<2F><13>/<2F>/<2F>/<2F>/<2F>J<01>C<EFBFBD>J<01>D<EFBFBD>J<01>J<01>J<01>J<01> <19>$<24><19>3<EFBFBD><19><19><19><19><06>3<EFBFBD><06>s<EFBFBD><06>s<EFBFBD><06><06><06><06><10><14>c<EFBFBD>3<EFBFBD>h<EFBFBD><1E><10>D<EFBFBD><13>c<EFBFBD><18>N<EFBFBD><10><10><10><10><05><17><17><19><13><13><07><07><14><13><07><05><18><18>
<1A><1B><1B>#<23>#<23><1C><1B>#<23>D<05><18><18>-<2D><18><18><06><06><19><18><06>@<05><18><18>/<2F><1A><1A>V@<01>V@<01><1B><1A>V@<01>v<05><17><17> '<27>(<28>(<28>#<23>c<EFBFBD>#<23>#<23>#<23>)<29>(<28>#<23><05><17><17><1D><17><17>#<23>#<23><18><17>#<23>(<05><18><18>(<28><13><13>#<23>#<23><14><13>#<23><05><17><17> <1F> <20> <20><19>#<23><19><19><19>!<21> <20><19><05><18><18>(<28><13><13>#<23>#<23><14><13>#<23><05><17><17><18><12><12>#<23>#<23><13><12>#<23>0<05><17><17> <1F> <20> <20><18>#<23><18><18><18>!<21> <20><18><05><19><19> !<21>"<22>"<22>#<23>C<EFBFBD>#<23>#<23>#<23>#<23>"<22>#<23><05><17><17> &<26>'<27>'<27><1B>S<EFBFBD><1B><1B><1B>(<28>'<27><1B><05><17><17> )<29>*<2A>*<2A>#<23><03>#<23>#<23>#<23>+<2B>*<2A>#<23>6<05><18><18>
2026-02-14 22:04:39 -07:00
&<26>'<27>'<27>#<23>#<23>#<23>#<23>#<23>(<28>'<27>#<23><05><17><17> %<25>&<26>&<26>#<23>C<EFBFBD>#<23>#<23>#<23>'<27>&<26>#<23><05><17><17> (<28>)<29>)<29> #<23>c<EFBFBD> #<23> #<23> #<23>*<2A>)<29> #<23><05><17><17> (<28>)<29>)<29><18>c<EFBFBD><18><18><18>*<2A>)<29><18><05><17><17> &<26>'<27>'<27>#<23>C<EFBFBD>#<23>#<23>#<23>(<28>'<27>#<23><05><17><17> &<26>'<27>'<27><18>C<EFBFBD><18><18><18>(<28>'<27><18><05><18><18>
2026-02-15 10:33:57 -07:00
'<27>(<28>(<28> #<23>C<EFBFBD> #<23> #<23> #<23>)<29>(<28> #<23><05><17><17> &<26>'<27>'<27>#<23>C<EFBFBD>#<23>#<23>#<23>(<28>'<27>#<23><05><18><18>(<28><13><13>#<23>#<23><14><13>#<23><05><17><17><18><12><12> #<23> #<23><13><12> #<23><05><17><17> %<25>&<26>&<26>#<23>C<EFBFBD>#<23>#<23>#<23>'<27>&<26>#<23><05><17><17> (<28>)<29>)<29>hC<01>3<EFBFBD>hC<01>hC<01>hC<01>*<2A>)<29>hC<01>`<05><1A><1A> "<22>#<23>#<23>?<3F>S<EFBFBD>?<3F>?<3F>?<3F>$<24>#<23>?<3F><<05><17><17> $<24>%<25>%<25>&?<3F>3<EFBFBD>&?<3F>&?<3F>&?<3F>&<26>%<25>&?<3F>&?<3F>&?rH