
    H*j_                     X   S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJr  S SK	J
r
  S SKrS SKrS SKJr  S SKJr  S SKJr  S SKJr  S SKrS SKJr  S S	KJrJr  S S
KJr  S SKJrJrJ r J!r!  S SK"J#r#  S SK$J%r%J&r&  S SK'J(r(J)r)J*r*J+r+  S SK,J-r-  S SKJ.r.  S SK/r/S SK0J1r1  S SK2J3r3  S SK2J4r4  S SK5J6r6  S SK7J8r8  S SK9J:r:  S SK;J<r<  S SK=J>r>  S SK?J@r@  SrA " S S\%5      rB " S S\%5      rC " S S \%5      rD " S! S"\%5      rE " S# S$\%5      rFS% rGS& rHS' rIS( rJS/S) jrK " S* S+5      rLS,\M4S- jrNS0S. jrOg)1    N)validateValidationError)	AIMessage)OllamaEmbeddings)FAISS)ChatPromptTemplate)AsyncWebCrawler)PromptTemplate)StrOutputParserPydanticOutputParser)RunnablePassthrough)PyPDFLoader
TextLoaderDocx2txtLoaderUnstructuredPowerPointLoader)SemanticChunker)	BaseModelField)ListOptionalDictUnion)urlparse)RunnableLambda)Presentation)	OllamaLLM)
ChatOllama)PdfConverter)create_model_dict)text_from_rendered)Path)MarkdownHeaderTextSplitter)fetch_image_for_slideznomic-embed-textc                       \ rS rSr% \" S5      r\\S'   \" SSS9r\	\   \S'   \" SS	S9r
\\   \S
'   \" SSS9r\\S'   \" SSS9r\	\   \S'   Srg)SlideContent(   flashtypeNz$An optional subheading for the slidedescription
subheading.z(List of paragraphs for the slide content
paragraphsz^A detailed suggestion for a relevant visualization or image (5-8 words with specific elements)visualization_suggestionzURL of the image for the slideimage )__name__
__module____qualname____firstlineno__r   r(   str__annotations__r+   r   r,   r   r-   r.   __static_attributes__r/       R/var/www/eduai.edurigo.com/storigo/production/generate_storigo_content_document.pyr%   r%   (   sn    gD# %d8^ _J_!#3]^JS	^$)#  <\  %]c  ] 3STE8C=Tr7   r%   c                   ~    \ rS rSr% \" S5      r\\S'   \" SSS9r\\S'   \" SSS9r	\
\   \S	'   \" SS
S9r\\S'   Srg)
MCQContent/   Questionr(   .zThe multiple-choice questionr)   questionzA list of 4 answer optionsoptionsz0The correct answer (e.g., 'a', 'b', 'c', or 'd')correct_answerr/   N)r0   r1   r2   r3   r   r(   r4   r5   r=   r>   r   r?   r6   r/   r7   r8   r:   r:   /   sK    j!D#!#+IJHcJs0LMGT#YM1cdNCdr7   r:   c                   P    \ rS rSr% \" SSS9r\\\4   \	S'   \" SSS9r
\\	S'   S	rg
)StorigoContent5   .7Dictionary of slide contents with slide numbers as keysr)   slidesr   /Total token count for all the generated contenttoken_countr/   N)r0   r1   r2   r3   r   rD   r   r4   r%   r5   rF   intr6   r/   r7   r8   rA   rA   5   s0    &+C=v&wFDl"#wQ,]^K^r7   rA   c                   r    \ rS rSr% \" SSS9r\\\4   \	S'   \" SSS9r
\\\4   \	S'   \" SS	S9r\\	S
'   Srg)StorigoContentMCQ9   .rC   r)   rD   z8Dictionary of MCQs with identifiers like 'mcq_1' as keysmcqsr   rE   rF   r/   N)r0   r1   r2   r3   r   rD   r   r4   r%   r5   rK   r:   rF   rG   r6   r/   r7   r8   rI   rI   9   sK    &+C=v&wFDl"#w"'9s"tD$sJ
tQ,]^K^r7   rI   c                   Z    \ rS rSr% \" SSS9r\\\\	\
4   4   \S'   \" SSS9r\\S'   S	rg
)StorigoContentMCQMid>   .zYDictionary of slide contents with slide numbers as keys and MCQs with MCQ numbers as keysr)   rD   r   rE   rF   r/   N)r0   r1   r2   r3   r   rD   r   r4   r   r%   r:   r5   rF   rG   r6   r/   r7   r8   rM   rM   >   sD    9>s  Ql  :mFDeL*4556  mQ,]^K^r7   rM   c                 F    [         R                  " SU 5      n[        U5      $ )Nz\w+)refindalllen)texttokenss     r8   count_tokensrU   B   s    ZZ%Fv;r7   c                 T    [        [        5       S9nU" U 5      n[        U5      u  p4nU$ )z@Heavy parsing using marker library (OCR + Layout reconstruction))artifact_dict)r   r   r    )
input_path	converterrenderedrS   _imagess         r8   marker_parsingr]   F   s-    +<+>?I$H(2ODVKr7   c                    [         R                  R                  U 5      S   R                  5       n US:X  a  [	        U 5      nUR                  5       nSR                  U Vs/ s H  oDR                  PM     sn5      nU(       a  [        U5      [        U5      -  OSn[        UR                  5       5      S:  a   US:  a  [        S[        U5       S35        U$ [        S	5        [        U 5      $ US
:X  aF  [        U 5      nUR                  5       nSR                  U Vs/ s H  oDR                  PM     sn5      $ US:X  aF  [        U 5      nUR                  5       nSR                  U Vs/ s H  oDR                  PM     sn5      $ US:X  aE  [        U SS9nUR                  5       nSR                  U Vs/ s H  oDR                  PM     sn5      $  [        U SSS9 nUR!                  5       sSSS5        $ s  snf s  snf s  snf s  snf ! , (       d  f       g= f!   [        U 5      s $ = f! ["         aD  n[        SU 35         [        U 5      s SnA$ ! ["         a  n	[#        SU	 35      eSn	A	ff = fSnAff = f)z)Robust hybrid parsing with fast fallbacks   z.pdf
r   d   2   z'Fast PDF parsing successful. Extracted z characters.zEFast PDF parsing returned low quality text. Falling back to marker...z.docxz.pptxz.txtutf-8encodingrNz/Error in fast parsing, falling back to marker: zFinal parsing attempt failed: )ospathsplitextlowerr   loadjoinpage_contentrR   stripprintr]   r   r   r   openread	Exception)
	file_pathextloaderdocsdocrS   avg_chars_per_pagefefinal_es
             r8   parsingr|   M   s4   
''

9
%a
(
.
.
0C.H&= +F;;=D99$?$3..$?@D ;?TSY!6A4::< 3&+=+B?D	{,WX YZ!),,G^#I.F;;=D99$?$3..$?@@G^1)<F;;=D99$?$3..$?@@F]	G<F;;=D99$?$3..$?@@1)S7;q668 <;? @  @
 @
 @
 <;1%i00 H?sCD	H!),, 	H<WIFGG	H	Hs   0H1 "G:7A#H1 H1 10H1 !G?6H1 =0H1 -HH1 	/H1 8H	H1 H  H0	H :H1 
HH H H.,H1 .H1 1
I?;I:

II?
I7$I22I77I::I?c                 >    [        U 5      nUR                  U5      nU$ N)r"   
split_text)headers_to_split_oncontentmarkdown_splittermd_header_splitss       r8   marks_splitterr      s%    23FG(33G<r7   c                 \   / n[        U 5       Hv  u  pE[        US5      (       a  UR                  nOA[        US5      (       a  UR                  nO#[	        U[
        5      (       a  UnO[        U5      nUR                  XF45        Mx     U VVs/ s H  u  pG[        U5      U:  d  M  XG4PM     nnnU(       d  0 $ [        S U 5       5      n	0 n
UnU H2  u  p[        U5      U	-  n[        S[        X-  5      5      nXU'   X-  nM4     US:  a6  [        XR                  S9nX   S:  a  X==   S-  ss'   US-  nOOUS:  a  M6  US:  a]  [        US SS	9n[        [        U[        U5      5      5       H'  nUU   S   nU
R                  US5      S-   X'   US-  nM)     US:  a  M]  U
$ s  snnf )
Nrm   r   c              3   <   #    U  H  u  p[        U5      v   M     g 7fr~   rR   ).0r[   txts      r8   	<genexpr>"allocate_slides.<locals>.<genexpr>   s     3U61c#hhUs   r_   r   keyc                     [        U S   5      $ )Nr_   r   xs    r8   <lambda>!allocate_slides.<locals>.<lambda>   s    S1Yr7   T)r   reverse)	enumeratehasattrrm   r   
isinstancer4   appendrR   summaxroundgetsortedrangemin)chunkstotal_slides	min_chars	extractedichunkrS   r   validtotal_charsallocations	remainingidxpropcntmax_idxsorted_by_sizes                    r8   allocate_slidesr      s   If%5.))%%DUI&&==Ds##Du:D!# & %.GI&!SY1FXaXIEG	3U33KKI3x+%!U4./0C		  a-k7!# A% NI a- a-+>Ms9c.&9:;A #A&C*sA6:KNI < a- ; Hs   F(&F(c                   D    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)SlideCollection   c                     0 U l         g r~   rD   selfs    r8   __init__SlideCollection.__init__   s	    r7   c                      X R                   U'   g r~   r   )r   r   r   s      r8   	add_slideSlideCollection.add_slide   s    "Cr7   c                 6    U R                   R                  5       $ r~   )rD   keysr   s    r8   r   SlideCollection.keys   s    {{!!r7   c                 ,    [        U R                  5      $ r~   )iterrD   r   s    r8   __iter__SlideCollection.__iter__       DKK  r7   c                      U R                   U   $ r~   r   )r   r   s     r8   __getitem__SlideCollection.__getitem__   s    {{3r7   c                 6    U R                   R                  5       $ r~   )rD   itemsr   s    r8   r   SlideCollection.items   s    {{  ""r7   c                 6    U R                   R                  5       $ r~   )rD   valuesr   s    r8   r   SlideCollection.values   s    {{!!##r7   c                 ,    [        U R                  5      $ r~   )reprrD   r   s    r8   __repr__SlideCollection.__repr__   r   r7   r   N)r0   r1   r2   r3   r   r   r   r   r   r   r   r   r6   r/   r7   r8   r   r      s*    #"! #$!r7   r   returnc                 v  ^ [        U S5      (       a  U R                  mO[        U 5      m[        R                  " SST[        R
                  S9m[        R                  " SST[        R
                  S9m[        R                  " SST[        R
                  S9mTR                  5       mU4S jn[        R                  " SUT5      m[        R                  " S	S
T5      m[        R                  " SST5      m [        R                  " T5      n[        U[        5      (       aE  SU;   a?  [        US   [        5      (       a'  SUS   ;   a  US   R                  S5      nSU;  a  X2S'   [        U[        5      (       a  SU;   a  [        R                  " US   5      $ [        R                  " U5      $ !    T$ = f)Nr   z^```json\s* )flagsz^```\s*z\s*```$c                 z  >^^ U R                  5       nTS U nUR                  5       mTUS-   S  R                  5       mUR                  S5      (       a  U R                  S5      $ [	        U4S jS 5       5      (       a  U R                  S5      $ [	        U4S jS 5       5      (       a  U R                  S5      $ g)	Nr_   \r   c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr~   )endswith)r   clefts     r8   r   ;quick_json_fix.<locals>.is_not_delimiter.<locals>.<genexpr>   s     0At}}Q   !z{[:,c              3   F   >#    U  H  nTR                  U5      v   M     g 7fr~   )
startswith)r   r   rights     r8   r   r      s     3Fqu""Fr   z}],:z\")startrn   r   groupany)mpos	left_textr   r   rS   s      @@r8   is_not_delimiter(quick_json_fix.<locals>.is_not_delimiter   s    ggi#J	 SUV""$ d##771: 0000771:3F333771:r7   "z	'(\w+)\":z"\1":z,\s*([\]}])z\1rD   rF   
properties)r   r   r4   rP   sub	MULTILINErn   jsonloadsr   dictpopdumps)
ai_messager   parsed	token_valrS   s       @r8   quick_json_fixr      so   z9%%!!: 66."d",,?D66*b$bll;D66*b$bll;D::<D( 66$($/D 66,$/D66.%.DD! fd##F(:z&QYJZ\`?a?ax 00"8,00?	 .,5=) fd##(>::f\233zz&!!Ks   9B#F3 F3 3F8c	                 <  ^:^;#    [        SU  S35         U(       a  U" SSS.5        [        S5        [        R                  " 5       n	U	R                  S [        U 5      I S h  vN n
[        S[        U
5       35        [        SS	S
S9 nUR                  U
5        S S S 5        SS/n[        SSS
S9 nUR                  5       nS S S 5        [        UW5      n[        XSS9nU(       a  U" SSSU S[        U5       S3S.5        [        SU S[        U5       S35        Sn[        [        S9m;[        R                  " U5      n[        SSS9n[!        ["        5      nS S U;4S jS .U-  U-  U-  T;-  n[%        5       nS!nU(       a  U" SSS"S.5        [        S#5        ['        [)        U5      5       GH  u  nnUU   nUU   n[+        US$[+        US%[-        U5      5      5      n[        S&US!-    S'[        U5       S(U S)35        UR/                  UUS*.5      n[1        US+5      (       a  UR2                  nO5[1        US,5      (       a  UR5                  5       OUnUR7                  S+0 5      n[9        U[:        5      (       a  S-U;   a  UR=                  S-5        [)        UR?                  5       S. S/9 H  nUU   nURA                  S0U 3U5        U(       a  [9        U[:        5      (       a4  UR7                  S15      n UR7                  S25      n!UR7                  S35      n"O$URB                  n URD                  n!URF                  n"U" S4S0U 3U U!U"S0U S53S6.5        US!-  nM     GM     S7[,        4S8 jm:[;        [)        UR2                  RI                  5       U:4S9 jS/95      n#U#Ul        [        S:[        UR2                  5       S;35        U(       Gay  U(       a  U" SS<S=S.5        [        S>5        UR2                  RI                  5        GH;  u  nn$[9        U$[:        5      (       a  [K        Sd0 U$D6n%OU$n%U%RF                  (       a  [        S?U S@U%RF                   SA35        [M        UU%RF                  5      n&U&(       aJ  [9        U$[:        5      (       a  U&UR2                  U   SB'   OU&U$l'        U(       a  U" SBUU&U SC3SD.5        M  M  [9        U$[:        5      (       a  S UR2                  U   SB'   OS U$l'        U(       a  U" SBUS U SE3SD.5        GM  GM
  [9        U$[:        5      (       a  S UR2                  U   SB'   GM4  S U$l'        GM>     O]UR2                   HM  n[9        UR2                  U   [:        5      (       a  S UR2                  U   SB'   M9  S UR2                  U   l'        MO     [Q        UR2                  R?                  5       5      n'SFn(U(       Ga  U(       a  U" SSGSHU SI3S.5        [        SJU SI35        SKn)[        [R        S9n*[        R                  " U)5      n+0 n,[U        SL[        U'5      SM5       GH  n[        U,5      U:  d  M  [        SN[        U,5      S!-    S'U SO35        / n-[U        U[W        USM-   [        U'5      5      5       H  n.U'U.   n/UR2                  U/   n0[9        U0[:        5      (       a%  U0R7                  S1SF5      n1U0R7                  S2/ 5      n2OU0RB                  n1U0RD                  n2U-RY                  U1 SPSQR[                  U25       35        M     SRR[                  U-5      n( U+U-  U-  U*-  R/                  U(U*R]                  5       SS.5      n3U3U,ST[        U,5      S!-    3'   U(       aO  U" SGST[        U,5      S!-    3U3R^                  U3R`                  U3Rb                  SU[        U,5      S!-    SV3SW.5        GM  GM     U(       a  U" SSYS.5        [        SZ5        0 n5SLn6US!:X  ae  USL:  a  X#-  OUn7['        U'5       HI  u  n8nUR2                  U   U5U'   U8S!-   U7-  SL:X  d  M&  U6U:  d  M.  STU6S!-    3n9U9U,;   a  U,U9   U5U9'   U6S!-  n6MK     OEU' H  nUR2                  U   U5U'   M     [U        U5       H  n6STU6S!-    3n9U9U,;   d  M  U,U9   U5U9'   M     [        S[5        [        S\[        U55       S]35        [g        U5SLS^9$ [        S_5        [        S[5        [        S\[        UR2                  5       S`35        [        UR2                  SLS^9$  GN! , (       d  f       GN= f! , (       d  f       GNp= f! [d         a  n4[        SXU4 35         S n4A4GM%  S n4A4ff = f! [d         a+  n4[        SaU4 Sb35        [e        Sc[-        U45       35      eS n4A4ff = f7f)eNz$--- Starting Content Generation for z ---statuszParsing document...)r(   messagez[Step 1/5] Parsing document...z0Successfully parsed document. Total characters: zparse_data.mdwrc   rd   )#zHeader 1)z##zHeader 2rf   ra   )r   stage
slide_textz
Allocated z slides across z chunks.)r(   r   r   z document chunks.a6	  
Based on the following context, generate professional and engaging content for exactly {num_slides} slides in a Storigos presentation.

Each slide must include:
- A clear and concise **sub-heading**
- **Paragraphs** that effectively communicate the key ideas and insights
- A specific, concise **visualization suggestion**

**Context**: {query}

Focus on creating content that is both informative and engaging. Ensure each slide:
- Has a well-structured sub-heading that captures the main point
- Uses clear and concise paragraphs to communicate important information

Use a professional and creative tone throughout. Each slide should incorporate the following elements where appropriate:
- **Thought-provoking questions** to encourage reflection
- **Relevant statistics** or data points that add credibility
- **Industry insights** or emerging trends to demonstrate expertise
- **Practical examples** or case studies to illustrate key concepts
- **Calls to action** to guide the audience toward specific actions or takeaways

For the visualization suggestion:
- Provide a clear and specific description of an image that would be relevant to the slide content.
- Keep it very concise, using a maximum of 5 words.
- Focus on concrete objects, scenes, or concepts that can be easily visualized.
- Avoid abstract or overly complex ideas.
- Include the context of the topic (e.g., "Python programming logo" instead of just "Python logo").

Make sure all content is drawn exclusively from the provided context or embedded data. Avoid introducing external information not found in the source material.

{format_instructions}

CRITICAL: The output must be a valid JSON object with this EXACT structure:
{{
  "slides": {{
    "slide_1": {{
      "type": "flash",
      "subheading": "...",
      "paragraphs": ["...", "..."],
      "visualization_suggestion": "...",
      "image": null
    }},
    "slide_2": {{ ... }}
  }},
  "token_count": 0
}}

IMPORTANT: If any paragraph or subheading contains double quotes, you MUST escape them with a backslash (e.g., "quoted text") or use single quotes.

DO NOT put "token_count" inside the "slides" object. It must be at the root level.
DO NOT include any explanations or additional text - only the JSON object.
The final output must be in strict sequential order: "slide_1", "slide_2", ..., up to "slide_{num_slides}".
)pydantic_objectzhttp://127.0.0.1:11434z
gemma3:12b)base_urlmodelc                     U S   $ )Nqueryr/   r   s    r8   r   1generate_slide_content_document.<locals>.<lambda>`  s    1W:r7   c                     U S   $ )N
num_slidesr/   r   s    r8   r   r   a  s    ,r7   c                 $   > TR                  5       $ r~   )get_format_instructions)r   parsers    r8   r   r   b  s    1O1O1Qr7   )r   r  format_instructionsr_   z$Generating slide content with LLM...z0[Step 2/5] Generating slide content using LLM...rm   r   z
  - Chunk /z: Generating z
 slides...)r   r  rD   
model_dumprF   c                 <    [        U R                  S5      S   5      $ )Nr[   r_   )rG   split)ks    r8   r   r     s    c!''RU,WX/FZr7   r   slide_r+   r,   r-   slidez	 prepared)r(   	slide_keyr+   r,   r-   r   item_keyc                     U R                  SS5      u  pUS:X  a  SnOUS:X  a  SnOSnUR                  5       (       a  [        U5      OSnX44$ )Nr[   r_   r  r   mcqi  )r
  isdigitrG   )r  prefixnum_strr   numbers        r8   custom_slide_sort_key>generate_slide_content_document.<locals>.custom_slide_sort_key  sQ    &nnS!4OF 5%,__%6%6S\CF?"r7   c                    > T" U S   5      $ )Nr   r/   )kvr  s    r8   r   r     s    OdeghiejOkr7   zSuccessfully generated z total slides.r\   z Fetching visualization images...z6[Step 3/5] Fetching visualization images for slides...z  - Fetching image for z: ''r.   z image ready)r(   r  r.   r   z image not foundr   r  zGenerating z multiple-choice questions...z[Step 4/5] Generating uH  
Based on the following context from the last two slides, generate one multiple-choice question (MCQ). The question should be relevant to the content and designed to test comprehension.

**Context**: {context}

The MCQ must include:
- A **question** related to the context
- Exactly **4 answer options**
- A clear indication of the **correct answer** as a single letter: 'a', 'b', 'c', or 'd'

⚠️ **Critical Requirements**:
- ✅ Return **only valid JSON** — no explanations, headers, or extra text.
- ✅ Ensure all fields and options are enclosed in **double quotes (`"`)**.
- ✅ Escape any internal double quotes with a backslash (e.g., `"`).
- ✅ Do **not** use letters like "A.", "B." in the options — just the plain text.
- Directly follow the format given below

The final output **must strictly follow** this format:
```json
{{
    "question": "<The MCQ question>",
    "options": [
        "<Option 1>",
        "<Option 2>",
        "<Option 3>",
        "<Option 4>"
    ],
    "correct_answer": "<Correct option (e.g., 'a', 'b', 'c', or 'd')>"
}}
```

{format_instructions}
r      z  - Generating MCQ z based on slides...z:  r`   )contextr  mcq_zMCQ z ready)r(   mcq_keyr=   r>   r?   r   zError generating MCQ: zAssembling final content...z&[Step 5/5] Assembling final content...z)--- Generation Completed Successfully ---zFinal content has z items (slides + MCQs).)rD   rF   z [Step 5/5] Finalizing content...z slides.z!!! Error generating content: z !!!z Error generating slide content: r/   )4ro   asyncioget_event_looprun_in_executorr|   rR   rp   writerq   r   r   r   rA   r   from_templater   r   r   r   r   r   getattrr4   invoker   rD   r  r   r   r   r   r   r   r+   r,   r-   r   r%   r#   r.   listr:   r   r   r   rl   r  r=   r>   r?   rr   rM   )<temp_file_path	client_idr  num_mcqsis_imageis_questionquestion_positionGPUprogress_cbloop
parse_datary   r   r   r   
allocationslide_content_templateslide_content_promptllm
json_fixerslide_content_chain
all_slidescounterr   	chunk_idxnr   r   resultslide_itemsrawr  r+   r,   vizordered_slidesslide_content	slide_obj
image_path
slide_keyscontext_textmcq_template
mcq_parser
mcq_promptrK   context_slidesjr   r  titleparas
mcq_resultrz   interleaved_contentmcq_counterintervalr   r  r  r  s<                                                             @@r8   generate_slide_content_documentrQ    s
    	00@
EFIEXBW$XY.0%%'//g~NN
@Z@QRS/39QGGJ : 
 /39QffhG : 3W=$V3G
<jYcXddstw  yC  uD  tE  EM  MN  O  P
:,oc*o5FFWXY4"l &nE1??@VW-

 $N3
 .7'Q
 ##    	 %&
<Lrst@B%fZ&89LAy9%A9%EE>75)SQVZ3XYEJqse1S_$5]1#ZPQ(//%q0QRFvx(($mm-4V\-J-Jf'')PV!ggh3+t,,+1M.#K$4$4$6<Z[	%i0$$vgY%7A!'400%,[[%>
%,[[%>
%kk*DE%,%7%7
%,%7%7
%>> ''-gY%7&0&047%+G9I#>!  1/ \# :T		#C 		# fZ%6%6%<%<%>Dklm*
'J,=,=(>'?~NOWxLnopJL,6,=,=,C,C,E(	=mT22 , =} =I -I553I;c)BdBdAeefgh!6!!::"J "%mT::DNJ--i8A2<M/&'y[eu~t  @L  sM  )N  O ' &mT::DHJ--i8A26M/&'y[_oxny  zJ  mK  )L  M ' "-66@D
)))4W=.2+= -F@ (..	j//	:DAA<@J%%i099=J%%i06	 / *++0023
Wu;W_V``}I~  A*8*4QRS LB .jIJ+99,GJD1c*oq1t9x'/D	AazI\]^%'N"1c!a%Z&AB(m * 1 1# 6%eT22$)IIlB$?E$)IIlB$?E$)$4$4E$)$4$4E&--r#((5/9J.KL C $(99^#<L!&!"() )) !&'33=3U3U3W"  # 8BtCIM?34&'(--1#d)a-+A,6,?,?+5+=+=2<2K2K-1#d)a-+G)  '? 2X X:WXY:<"$K A%5=\:1z&/
&;NC5?5F5Fy5Q'	2a8+q0[85K$(q(9":"d?;?=/8#q( '< ",I5?5F5Fy5Q'	2 ", $)?K $[1_$56G$7;G}+G4 $3
 =?&s+>'?&@@WXY'/BPQRR46=?&s:+<+<'=&>hGH!):):JJA
 O :9 :9d % ! 6qc:; !N  E.qc67:3q6(CDDEs   fAe$ !d"&e$ de$ 1d+Ve$ C%e$ 2Bd=A(e$ 0e$ 8Ae$ 8e$ 	f
Ae$ fe$ 
d(#e$ +
d:5e$ =
e!ee$ e!!e$ $
f.&fff)<   r~   )Prg   timerandomrP   r   heapq
jsonschemar   r   langchain_core.messagesr   requestsnumpynplangchain_community.embeddingsr    langchain_community.vectorstoresr   langchain_core.promptsr   crawl4air	   r   r
   langchain_core.output_parsersr   r   langchain_core.runnablesr   $langchain_community.document_loadersr   r   r   r   $langchain_experimental.text_splitterr   pydanticr   r   typingr   r   r   r   urllib.parser   r   shutilpptxr   langchain_ollamar   r   marker.converters.pdfr   marker.modelsr   marker.outputr    pathlibr!   langchain_text_splittersr"   storigo_image_generatorr#   OLLAMA_MODELr%   r:   rA   rI   rM   rU   r]   r|   r   r   r   r4   r   rQ  r/   r7   r8   <module>rp     s    	   	   0 -   ; 2 5 $  1 O 8 v v @ % . . ! 3   & ' . + ,  ? :!U9 Ue e_Y __	 _
_9 _2Hh
*X! !29# 9vKEr7   