
    <|jj                        d Z ddlmZ ddlZddlmZ h dZdZh dZg d	Z	dd
Z
ddZddZddZddZd dZd!dZd"dZd#dZd Zd Zd Zd Zd Zd Zd Zd Zd$dZd%dZy)&uI   纪念币解析器 (board 10) - 复用 parser 项目的核心解析逻辑    )annotationsN   )PriceRecord>N      中行   交行   亮证   代友   以上   农行   出售   包邮   华夏   地址   如题   姓名   工行   微信   手机   招商   招行   来自   查看   楼主   民生   浦发   淘宝   电联   电话   评分   邮政	   代友求	   以上各	   以上需	   先款收	   加微信	   卷起步	   所在地	   支付宝	   营销员	   认证员   中国银行   交易等级   亮照亮证   亮证链接   以上全部   以上收好   以上暂定   以上每个   先款回收   先款求购   出售香港   华夏银行   卖家包邮   工行商友   民生银行   浦发银行   现款回收   电联确认   营销员第   认证会员   认证员注   高价先款   业余爱好者   也可加微信   工行商友卡   高级认证员   业余爱好者第   也可以加微信   出售香港回归QQqq   要   价格   低价   先款   单价   现款   起步   面值   面额   高价g     j@>      件   元   散   散卡   个   卡   卷   原   套   对   枚   盒   箱rK   rL   rM   rN      卡册   原包   原卷   原封   原桶   原盒   原箱   散币   散新rO   rP   rQ   rR   rS   )u   美品u   好品rd   rf   rb   re   rg   rc   u   原件u   全品u   上品   差品   裂卷u   氧化u   生锈   流通好品	   卷拆品u   卷拆u   好卷rk   u   远光u	   流通品u   带光u   原合u   一合c                   | sy| j                         } d| j                         v ryt        j                  d|       sy| j	                  dd      }t        |      dk\  ry	 t        |       }d|cxk  xr	 t        k  S c S # t        $ r Y yw xY w)uY   判断字符串是否像真实价格（排除电话号/银行卡号/科学计数法）。Fe	\d+\.?\d*.    r   )	striplowerre	fullmatchreplacelenfloat
ValueError	PRICE_MAX)sdigitsvs      ,/opt/daily-market/src/parsers/coin_parser.py_looks_like_pricer   4   s    		A
aggi<<a(YYsBF
6{a!H qI  s    A? ?	B
Bc                    t        |       S )u3   对外接口：判断价格字段值是否有效。)r   r}   s    r   _is_valid_price_valuer   H   s    Q    c                H    | xs dj                  d      j                         S )u:   去除名称末尾的冒号/空白，便于噪声匹配。rr   u   :： 　)rstriprt   )names    r   _strip_namer   M   s     JBz*0022r   c                \   | sy| }t         D ]  }|j                  |d      } |j                  dd      }|j                  dd      }t        j                  dd|      j	                         }|j	                  d      }d}|rd}d	D ]|  }|j                  d|z         s|j                  d|z         r|d
d j                         }d}A|j                  |      r$t        |      dkD  r|d
d j                         }d}v||k(  s| y |rt        j                  dd|      j	                         }|S )uN   清理品种名称：去品相词、标点、多余空白，保留纯名称。rr    u	   纪念币    \s+u   :：，,。.；;、·  TF)r[   u   好u   裂Nr   )QUALITY_WORDSrx   rv   subrt   endswithr   ry   )r   nqchangeds       r   _clean_namer   R   s%   A IIa 	
		+s#A			&#A
vsA$$&A	,-AG
& 	Azz#'"ajj!&<crFMMOA3q6A:crFMMOa	  	vsA$$&AHr   c                J   t        |       }|sy|t        v ryt        j                  d|      ryt        j                  d|      ry|t
        v ryt        |      dk(  ryt        |      dkD  rt        j                  d|      ryt        D ]  }|s|j                  |      s y y)u!   名称是否为已知噪声词。Trp   z^[^\u4e00-\u9fff]r      ue  (包邮|所售|三包|偏远地区|一切货品|视 频|拆包验货|电联确认|录像|评分|闲鱼|极兔|百世|当天有效|第三方|异地发货|长期收|邮寄地址|签名档|本人拒收|默认顺丰|全程录像|货到付款|跟帖确认|发货请|劳务费|市场忙|每个品种|每人每单|容易 品种|更新求购|精制系列|精致币)F)	r   NOISE_NAMESrv   rw   matchPACKAGE_WORDSry   search
startswith)r   coreprefixs      r   _is_noise_namer   s   s    tD{	||L$'	xx$d+}
4yA~
4y2~"))  %M  OS  T doof- r   c                    | r|sydD ]S  }|j                  | |z         }|dk(  s|t        |       dz   d j                         }t        j                  d|      sS y y)u   判断是否为银行账户行（区分"建行:6227..."银行账户 vs "建行1250/枚"纪念币）。
    银行账户特征：名称后紧跟冒号 + 银行卡号（连续数字>=4位）。
    F):   ：r   r   r   Nz^\d{4,}T)findry   lstriprv   r   )r   raw_textsepidxafters        r   _is_bank_account_rowr      sg     x  mmD3J'!8SY]^,335Exx
E* r   c                     j                  d      xs dj                         }t        |      ry j                  d      xs  j                  d      xs d}t        ||      ryt	         fddD              }t         j                  d      xs dj                               }|s|sy j                  d	      xs d}|rt        |      s
d d	<   |s|syy
)u9   校验单条解析记录是否有效，无效则丢弃。   品种名称rr   F   原始文本
raw_sourcec              3  T   K   | ]  }t        j                  |d              ! yw)rr   N)r   get).0krs     r   	<genexpr>z#_is_valid_record.<locals>.<genexpr>   s(       	aeeArl+s   %()   盒价(元)   卷价(元)   散新价(元)   卡册价(元)   需求数量	   参考价T)r   rt   r   r   anyboolr   )r   r   r   	has_pricehas_qtyrefs   `     r   _is_valid_recordr      s    EE.!'R..0Dd uu^$Al(;ArHD(+ S I AEE.)/R6689G W %%

"C
(-+r   c                   g }d}| D ]n  }|dv r|dz  }|j                  |       |dv r!t        d|dz
        }|j                  |       C|dv r|dkD  r|j                  d       ^|j                  |       p dj                  |      S )u;   保护 ()[]{} 内的逗号，避免 split_entries 误拆。r   z([{r   z)]}u   ,， rr   )appendmaxjoin)lineoutdepthchs       r   _mask_commas_in_parensr      s    
CE 
;QJEJJrN5[519%EJJrN6\eaiJJvJJrN
 773<r   c                &    | j                  dd      S )Nr   ,)rx   r   s    r   _unmaskr      s    99VS!!r   c                   | j                  dd      j                  dd      j                  dd      j                  dd      } | j                  d	d
      j                  dd      j                  dd      j                  dd      } t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } | j                         S )uK   清洗原始文本：统一全角标点、修正小数点、多余空格等   ，r   u   。rq      ；;r   r   u   【[u   】]u   （(u   ）)z(\d+)\.{2,}(\d+)z\1.\2z(\d+)\s+\.(\d+)uL   (\d+)\.(?=\s|盒|卷|散|卡|要|箱|个|对|枚|套|北|开|原|[，,\[\]])z\1z[ \t]+r   )rx   rv   r   rt   )texts    r   
preprocessr      s    <<s#++E37??sKSSTY[^_D<<s#++E37??sKSSTY[^_D66%x6D66$h5D66achjnoD66)S$'D::<r   c                   | j                         }|sg S g }t        j                  d|      }t        j                  dd|      }t	        |      }t        j
                  d|      }|D cg c]  }t        |       }}d}t        |      D ]  \  }	}|j                         }|s|	dk(  r-|}|r|dz   dj                  |      z   }|j                  |       Lt        t        j                  d|            }
t        t        j                  d|            }t        t        j                  d	|            }t        t        j                  d
|            xr |
xs |}|
s|r|s|rt        j                  d|      rXt        j                  d|      }d}|r!|rt        |      }||j                  d      z   }|j                  |r|dz   |z   n|       F|rhd}t        j                  d|      rd}nt        j                  d|      rd}d}|rt        |      }|r||z   nd}|j                  |r|dz   |z   n|       |j                  |       |s|d   dz   |z   |d<    |S c c}w )u3   将一行内的多个独立条目拆分为多行。z
\[[^\]]*\]rr   u   [,，]Nr   r   u	   要\s*\d+u   \d+\.?\d*\s*/\s*(枚|套|对)u0   ^(散币|真正卷拆品|单边|任意单边)\d*z
^\d+\.?\d*u-   ^(散币|真正卷拆品|单边|任意单边)u3   ^(散币|真正卷拆品|单边\S*|任意单边\S*)r   u   散币|散新rh   u   原卷|原桶r   r   )rt   rv   findallr   r   splitr   	enumerater   r   r   r   r   extract_name_simplegroup)raw_liner   entriesnotes_in_bracketsline_no_notesmaskedpartsp
base_entryihas_independent_qtyhas_independent_priceis_price_clause_startis_numeric_price_clausem_namer   	main_namepkg_tags                     r   split_entriesr      sE   >>D	G

=$7FF="d3M $M2FHHY'E!&'AWQZ'E'J%  &:1GGI6J '#-9J0KK
NN:&"&ryyq'A"B$(3SUV)W$X!$(2egh)i$j!&*288M1+E&F&yL_Lxcx##(=BW\s88LaPXX&\^_`FF*$7
$C	!*V\\!_!<NNv6C<!#31E, Gyy!115"*#3Q7"$F!$7
$C	8AW!4rNNv6C<!#31ENN1%")"+"5"9GBKM&:N NU (s   )I$c                r    t        j                  d|       }|r|j                  d      j                         S y)u?   简易提取名称：取开头非数字非单位的文字部分u/   ^([^\d盒卷散新卡要枚对套个箱元/.]+)r   rr   )rv   r   r   rt   )r   ms     r   r   r      s0    
CTJAwwqz!!r   c                   | j                         }t        j                  d|      }|r||j                         d }t        j                  d|      }|r!||j                         d j                         }t        j                  d|      }|r!||j                         d j                         }t        j                  d|      }|r.|j	                  d      j                         }t        |      }|r|S t        j                  d|      }|r.|j	                  d      j                         }t        |      }|r|S t        j                  dd	|      }t        j                  d
d	|      }t        |      xs |S )u'   从解析文本中提取品种名称。u3   ^(收购|求购|出售|收|求|出|售)\s*[:：]\s*Nu3   ^\d+\.?\d*\s*(收购|求购|出售|收|求|出|售)u0   ^(收购|求购|出售|收|求|出|售)(?![\d:])u4   ^(.+?)(?=(?:盒|卷|散新|散币|卡|件|\d|要|/))r   z^(.+?)(?=(?:\d|/))z[\d\.]rr   uK   (盒|卷|散新|散币|卡|件|要|枚|套|对|个|箱|元|/|,|，|\[.*?\]))rt   rv   r   endr   r   r   )	r   tm_verb_colonm_prefixm_verb_onlym1r   m2fallbacks	            r   extract_namer   +  sO   

A 88RTUVLl !" xxNPQRHhllno$$& ((NPQRKkoo !'')	I1	MB	xx{  "4 K	'	+B	xx{  "4 KvviQ'HvvdfhjrsHx %A%r   c                    | j                         } t        j                  dd|       } t        j                  dd|       } | j                  d      r| dd } | S )u   清理价格字符串r   rr   z\.{2,}rq   Nr   )rt   rv   r   r   r   s    r   normalize_pricer   U  sL    		A
vr1A
y#q!Azz#crFHr   c                   dddddd}| }|r |j                  |      r|t        |      d }n|}t        j                  d      }|j	                  |      D ]  }|j                  d      |j                  d      |j                  d      }	}}|d   xs |	|d<   t        |      }|d	v r|d
   xs ||d
<   ^|dv r|d   xs ||d<   o|dv r|d   xs ||d<   |dv s|d   xs ||d<    t        j                  d      }
|
j	                  |      D ]k  }|j                  d      |j                  d      |j                  d      }	}}|d   xs |	|d<   t        |      }|d	v r|d
   s||d
<   \|dv sa|d   rg||d<   m t        j                  d      }|j	                  |      D ]m  }|j                  d      |j                  d      |j                  d      }}	}|d   xs |	|d<   t        |      }|dk(  r|d
   s||d
<   ]|dk(  sc|d   ri||d<   o |j                  d      }|dk\  r|d| n|}t        j                  d      }|j                  |      }|r2t        |j                  d            }|d
   xs ||d
<   |d   xs ||d<   t        j                  d      }|j                  |      }|r"|d
   st        |j                  d            |d
<   t        j                  d      }|j                  |      }|r[|d
   sV|j                  d      }|t        d|dz
        | }t        j                  d|      st        |j                  d            |d
<   t        j                  d      }|j                  |      }|r"|d   st        |j                  d            |d<   t        j                  d      }|j                  |      }|r[|d   sV|j                  d      }|t        d|dz
        | }t        j                  d|      st        |j                  d            |d<   t        j                  d      }|j                  |      }|r"|d   st        |j                  d            |d<   t        j                  d      }|j                  |      }|r"|d   st        |j                  d            |d<   t        j                  d       }|j                  |      } | r"|d   st        | j                  d            |d<   t        j                  d!      }!|!j                  |      }"|"r"|d   st        |"j                  d            |d<   t        |d
   |d   |d   |d   g      sBt        j                  d"|      }#|#r*t        |#j                  d            }t        |      r||d<   |d   sSt        j                  d#|      rd$|d<   n7t        j                  d%|      rd&|d<   nt        j                  d'|      rd(|d<   |j                  d      }$|$dk\  rU||$d }%t        j                  d)|%      st        j                  d*|%      r$|d   r|d
   s|d   |d
<   |d   r|d   s|d   |d<   |S )+uJ   提取各包装形式价格。返回 dict: {'he','juan','san','ka','unit'}rr   )hejuansankaunitNuL   (盒|卷|散新|散币|卡|卡册|件)\s*(\d+\.?\d*)\s*/\s*(枚|套|对|个)r         r  )r_   r   )rZ   r   )ri   rh   r   )rY   ra   r  uI   (盒|卷|散新|散币|卡|卡册|件)(\d+\.?\d*)\s*/\s*(枚|套|对|个)uJ   (?:^|[^盒卷散新卡件])(\d+\.?\d*)\s*/\s*(枚|套|对|个)\s*(盒|卷)r_   rZ   rJ   r   u"   (?:盒卷|卷盒)\.?\s*(\d+\.?\d*)u   盒(?!卷)\.?\s*(\d+\.?\d*)u   (\d+\.?\d*)\s*盒(?!卷)u   (卷|散新|散币|卡|件)$u   卷(?!盒|拆)\.?\s*(\d+\.?\d*)u   (\d+\.?\d*)\s*卷(?!拆|盒)u   (盒|散新|散币|卡|件)$u    (散新|散币)\.?\s*(\d+\.?\d*)u   (\d+\.?\d*)\s*(散新|散币)u    (?:^|[^二])卡\.?\s*(\d+\.?\d*)u   卡(\d+\.?\d*)z\D*?(\d+\.?\d*)u   /枚r^   u   /套r\   u   /对r]   u!   要[盒卷散新卡件原]*盒卷u	   要盒卷)r   ry   rv   compilefinditerr   r   r   r   startr   r   r   r   )&r   r   resultr   bodypkg_unit_pricer   pkgpricer  pkg_unit_price2rev_pkgyao_idx
price_body	combo_patm_combocombo_pricehe_patm_hehe_pat2m_he2r   prejuan_patm_juan	juan_pat2m_juan2san_patm_sansan_pat2m_san2ka_patm_kaka_pat2m_ka2bare_patyao	after_yaos&                                         r   extract_pricesr(  _  s#   2RDFAT"T} ZZ opN$$T* 1771:qwwqz1771:DU/4v&(?!$<05F4LH_#F^4uF6N(("5M2UF5M%%!$<05F4L1 jj!mnO%%d+ #771:qwwqz1771:DU/4v&(?6$< F4LH_VF^"F6N# jjfgGd# #771:qwwqz1771:St/4v&%<t F4LE\&."F6N# iiG#*a<hwTJ

@AIz*G%gmmA&67d|2{t6;vZZ67F==$DF4L&tzz!}5tjj45GNN:&EVD\kk!nQa-yy8#>*5;;q>:F4Lzz<=H__Z(FfVn(a9v

:;Iz*Gvf~mmAQa-yy8#>,W]]1-=>F6Njj<=GNN4 EVE]'A7uzz:;H__T"FfUm'Q8uZZ;<F==$DF4L&tzz!}5tjj*+GNN:&EVD\&u{{1~6t tfVnfUmVD\JK88.5#HNN1$56E ' %u &>99Wd#"F6NYYw%"F6NYYw%"F6N ))E
C
axJ	9999ES_ajIke}VD\%e}te}VF^!'vMr   c                   | }t        j                  d      }t        |j                  |            }|r:|d   }|j	                  d      }|j	                  d      xs d}t        |      }||fS t        j                  d      }|j                  |      }|r/t        |j	                  d            |j	                  d      xs dfS y)	u   返回 (qty, qty_unit)uo   要\s*(?:盒|卷|散新|散币|卡|件|原卷|原桶|盒卷|卷盒)?\s*(\d+\.?\d*)\s*(套|枚|对|个|箱|盒)?r   r   r  rr   u   要\s*(\d+\.?\d*)\s*(箱)r`   )rr   rr   )rv   r  listr  r   r   r   )	r   r   qty_patmatcheslastqtyr  qty_pat2r   s	            r   extract_quantityr0    s    Ajj  L  MG7##A&'Gr{jjmzz!}"c"Dyzz67H		B	rxx{+RXXa[-AEAAr   c                   ! | }|}|r|j                  |dd      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }t        j                  dd|      }g dg d	 d
g}g g !g t        j                  d|      }t	         z   |z   t
        d       !fd}	|D ]%  }
t        j                  d|
      D ]
  } |	|        ' |}t               }D ]~  }||v s||vs|v xs
 |!v xs |v }|sN|j                  |       |v rj                  |       n'| v r!j                  |       nj                  |       |j                  |d      } t        j                  d|      D ]
  } |	|        t        j                  dd|      j                         }|re|j                         D cg c]/  }t        |j                               dk\  s |j                         1 }}|D ]  }|vsj                  |        d }t         z   |z         fd}D cg c]  } ||      r| c}d } |dj                   |                  } |dj                   |!                  } |dj                   |                  }|||fS c c}w c c}w )u$   返回 (pkg_req, quality_req, other)r   r   u!   \d+\.?\d*\s*/\s*(枚|套|对|个)rp   u.   \b(盒|卷|散新|散币|卡|卡册|件|元)\bu    要\s*(套|枚|对|个|箱|盒)?z\s+/\s*)
rc   u   原桶未开re   u   开盒不开袋u	   北方版u	   单边卷u   任意单边卷u   单边朝天宫u   单边u   不要卷币)u   真正卷拆品rm   rl   u   9品ri   rj   u   达不到卷拆不要u   达不到真正卷拆的不要u   差品不要u   币里面无油或微油u   币里面可微油u   无油或微油u	   可微油u   油大不要u   差品看货议价z\[([^\]]*)\]T)keyreversec                P   | j                         } | sy D ]V  }|| v s|v rj                  |       n'|v rj                  |       nj                  |       | j                  |d      } X t        j                  dd|       }t        |      dk\  rj                  |       y y )Nr   )   [\s,，。.；;：:、/\\\[\]\(\)（）]+rr   r  )rt   r   rx   rv   r   ry   )	fragkwremainall_kw_sortedother_partspkg_keywordspkg_req_partsquality_keywordsquality_req_partss	      r   classify_fragmentz(extract_notes.<locals>.classify_fragment  s    zz| 	-BTz%!((,++%,,R0&&r*||B,	- Db$Ov;!v& r   u
   [,，;；]r5  r  c                    t               }g }| D ],  }|s||vs|j                  |       |j                  |       . |S )N)setaddr   )seqseenr   xs       r   dedupzextract_notes.<locals>.dedupG  sC    u 	AQd]

1	 
r   c                    t        |       dk  ryt        j                  d|       ry| vr"D ]  }t        |       dk\  s| |v s| |k7  s y y)Nr   Tu-   [盒卷散卡件枚套对个箱原桶不开]+r  F)ry   rv   rw   )fr7  all_kw_flats     r   is_junk_fragz#extract_notes.<locals>.is_junk_fragR  sY    q6Q;<<H!LK!  q6Q;AGR  r   c                    t        j                  dd| j                               } t        j                  dd|       } t        j                  dd|       } | j                  d      j                         S )Nu   [，,、；;]+$rr   u   ^[，,、；;]+u   [，,]+   、)rv   r   rt   r   s    r   clean_joinedz#extract_notes.<locals>.clean_joined_  sW    FF%r17795FF%r1-FF:ua(wwu~##%%r   rL  )rx   rv   r   r   sortedry   r   rA  rB  r   rt   r   )"r   r   pricesr.  qty_unitr   cleanedother_known_notesbracketsr?  br6  	remaining	found_kwsr7  alreadysegremaining_cleanrH  fragsrF  rJ  rE  rM  pkg_reqquality_reqotherrI  r9  r:  r;  r<  r=  r>  s"                              @@@@@@@r   extract_notesr^    s   AG//$Q/ff93HGff\30GffFWUGff8#wGGffZg.GL
 ..MKzz/1-H<*::=NNTWaefM' '"  $HH]A. 	$Dd#	$$ II 3?r2]*_6G0G_RS^M^Gb!%!((,++%,,R0&&r*!))"c2I3 xxy1 # ffI3PYZ``bO$3$9$9$;Sqs1779~QR?RSS 	)D;&""4(	) l%558IIJK	 *Aa1AK& 5::eM&:;<Guzz%0A*BCDKE+$678EK&&O T6 Bs   2!KK"K0Kc                Z   dddddddddddd|xs | d}	 t        |       }||d<   t        | |      }|d   |d<   |d   |d<   |d   |d	<   |d
   |d<   |d   |d<   g }dD ]%  }||   }|s	 |j                  t        |             ' |rt        t        |            |d<   nd|d<   t        |       \  }}	||d<   |	|d<   |d   s	|	dv r|	|d<   t        | ||||	      \  }
}}|
|d<   ||d<   ||d<   |S # t        $ r Y w xY w# t        $ r#}|d   r|d   dz   ndd| z   |d<   Y d}~|S d}~ww xY w)u$   解析单行/单条目，返回 dictrr   )r   r   r   r   r   r      单位r      数量单位   包装要求   品相要求   其他备注r   r   r   r   r   r   r   r   r  r   r  r`  )r   r   r   r  r   r   ra  )r^   r\   r]   rX   rb  rc  rd  r   u   解析异常:N)
r   r(  r   rz   r{   strminr0  r^  	Exception)
entry_textr   recordr   rO  
all_pricesr2  r   r.  rP  r[  r\  r]  ro   s                 r   parse_entryrk  o  s    "0jF&zJ'!%~
D1 &t} &v}#)%= #)$< !&>x
. 	CsA%%eAh/		 "%c*o"6F;"$F;(4X!$~!)~hH0L$L'F8&3fc8'
#e ")~!,~!&~ M- " (  zDJ>DZ&"85"@`bhuvwuxfy!y~Mzs=   AC> *C/A)C> /	C;8C> :C;;C> >	D*D%%D*c                   t        |       }g }|j                  d      D ]  }|j                         }|st        |      D ]~  }|j                         }|st	        ||      }t        |      s/|j                  t        |d   |d   |d   |d   |d   |d   d	|d
   |d   |d   |d   |d   |d   |d   
               |S )uW   纪念币解析入口：预处理 → 按行拆分 → 逐条解析 → 转 PriceRecord
)r   r   r   r   r   r   r   )u   盒价u   卷价u	   散新价u	   卡册价r`  r   ra  rb  rc  rd  r   )
r   	ref_priceprice_detailsr  quantityquantity_unitpackage_reqr\  other_notesr   )r   r   rt   r   rk  r   r   r   )r   rQ  recordsr   entr   s         r   parserv    s    G!#Gd# zz| & 	C))+CCD1A#A&NN;~&K...!"#3!4!"#3!4	 x[>*/n-n-n->* 		8 Nr   )r}   re  returnr   )r   re  rw  re  )r   re  rw  r   )r   re  r   re  rw  r   )r   dictrw  r   )r   re  rw  re  )r}   re  rw  re  )rr   )r   re  rw  zlist[PriceRecord])__doc__
__future__r   rv   baser   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(  r0  r^  rk  rv   r   r   <module>r}     s    O " 	 " 	( 
3
B:"<$"7t$&T~H.o'j8| r   