
    B{"ie                        S r SSKJrJr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S9r\R#                  S	S
/S9\S 5       5       rS rS rS r\R#                  SS
/S9\S 5       5       r\R#                  SS/S9\\S 5       5       5       r\R#                  SS/S9\\S 5       5       5       r\R#                  SS/S9\\S 5       5       5       r\R#                  SS
/S9\S 5       5       r\R#                  SS/S9\\S 5       5       5       r\R#                  SS/S9\\S 5       5       5       r\R#                  SS/S9\\S 5       5       5       r\R#                  SS
/S9\S  5       5       r\R#                  SS/S9\\S! 5       5       5       r\R#                  S"S/S9\\S# 5       5       5       r \R#                  S"S/S9\\S$ 5       5       5       r!\R#                  S%S
/S9\S& 5       5       r"\R#                  S%S/S9\\S' 5       5       5       r#\R#                  S(S/S9\\S) 5       5       5       r$\R#                  S(S/S9\\S* 5       5       5       r%\R#                  S+S
/S9\S, 5       5       r&\R#                  S+S/S9\\S- 5       5       5       r'\R#                  S.S/S9\\S/ 5       5       5       r(\R#                  S.S/S9\\S0 5       5       5       r)\R#                  S1S
/S9\S2 5       5       r*\R#                  S1S/S9\\S3 5       5       5       r+\R#                  S4S/S9\\S5 5       5       5       r,\R#                  S4S/S9\\S6 5       5       5       r-\R#                  S7S
/S9\S8 5       5       r.\R#                  S9S
/S9\S: 5       5       r/\R#                  S9S/S9\S; 5       5       r0\R#                  S9S/S9\S< 5       5       r1\R#                  S=S/S9\S> 5       5       r2g?)@uu   
用户级别的Augment配置API - V1（兼容性）
使用新的统一表augment_configs，但保持旧的API接口
    )	Blueprintjsonifyrequestg)dbSystemConfigAugmentSessionTokenAugmentConfig)login_requiredwrapsuser_augment_apiz/api/user/augment)
url_prefixz/check-permissionGET)methodsc                  h    [         R                  " 5       n [        SU U (       a  SS.5      $ SS.5      $ )u.   检查用户是否有权限修改Augment配置Tu   允许修改配置+   管理员已禁用用户Augment配置功能)successenabledmessager   is_user_augment_config_enabledr   )r   s    G   /Users/yu22x/Desktop/ddd_副本5/ctf/app/routes/api/user_augment_api.pycheck_permissionr      sE     99;G+2'   9f      c                     [        [        S5      (       aq  [        R                  (       a\  [        [        R                  S5      (       a  [        R                  R                  n U $ [        R                  R	                  S5      n U $ g)u   获取当前用户IDuseridN)hasattrr   r   r   getuser_ids    r   get_current_user_idr#      sS    q&aff&qvvt44!&&)) ;<&&**T:Jr   c                 0   ^  [        T 5      U 4S j5       nU$ )u%   装饰器：检查Augment配置权限c                  h   > [         R                  " 5       (       d  [        SSS.5      S4$ T" U 0 UD6$ )NFr   r   r   i  r   )argskwargsfs     r   decorated_function3augment_config_required.<locals>.decorated_function#   sF    ::<< H    $!&!!r   r   )r)   r*   s   ` r   augment_config_requiredr,   !   s!    
1X" " r   c           
         U R                  5       nUS   US   US   US   US   S.nUS:X  a:  UR                  US   UR                  S	S
5      UR                  SS
5      S.5        U$ US:X  aK  UR                  US   UR                  SS
5      UR                  SS
5      UR                  SS
5      S.5        U$ US:X  a:  UR                  US   UR                  SS
5      UR                  SS
5      S.5        U$ US:X  a:  UR                  US   UR                  SS
5      UR                  SS5      S.5        U$ US:X  a:  UR                  US   UR                  SS
5      UR                  SS
5      S.5        U$ US:X  aZ  UR                  US   UR                  SS
5      UR                  SS
5      UR                  SS
5      UR                  SS
5      S .5        U$ )!u%   将AugmentConfig转换为旧API格式r   r"   r   
created_at
updated_at)r   r"   r   r.   r/   	cli_paramnamevalue description)r1   r2   r4   
mcp_servercommandr'   env)r1   r6   r'   r7   
permissionlevel)toolr9   r4   rulecontentprioritymedium)titler<   r=   )r1   r<   r4   subagenttypemodelprompttools)r1   rA   rB   rC   rD   )to_dictupdater    )configconfig_typedataresults       r   convert_to_old_formatrK   .   s<   >>D4j	?	?<(<(F k!tF|dhhw6K\`\d\dertv\wxy M 
	$tF|B8OY]YaYabhjlYmvzv~v~  @E  GI  wJ  K  	L M 
	$tF|dhhw6K\`\d\dertv\wxy M 
	V)R9P^b^f^fgqs{^|}~ M 
		!tF|B8O`d`h`hivxz`{|} M 

	"tF|TXXfb5ITXT\T\]dfhTiuyu}u}  G  IK  vL  W[  W_  W_  `g  ik  Wl  m  	nMr   z/cli-paramsc                      [        5       n [        R                  " SU 5      u  p[        SU Vs/ s H  n[	        US5      PM     snU Vs/ s H  n[	        US5      PM     snS.5      $ s  snf s  snf )Nr0   T)r   user_paramsglobal_paramsr#   r
   get_user_and_globalr   rK   r"   user_configsglobal_configscs       r   get_cli_paramsrU   M   sq     "#G#0#D#D[RY#Z LGST|!-a=|TIWXA/;?X  TX   A)

A.POSTc            
         [        5       n [        R                  " 5       n[        R                  " XR                  S5      UR                  S5      UR                  SS5      UR                  SS5      5      n[        R                  R                  U5        [        R                  R                  5         [        S[        US5      S.5      $ )	Nr1   r2   r4   r3   r   Tr0   r   param)r#   r   get_jsonr
   create_cli_paramr    r   sessionaddcommitr   rK   r"   rI   rG   s      r   r\   r\   Y   s     "#GD++GXXf5EtxxPWGXZ^ZbZbcprtZuw{ww  AJ  LP  xQ  RFJJNN6JJt.CFK.XYZZr   z/cli-params/<int:param_id>PUTc                    [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  " 5       nUR                  SUR                  5      Ul	        UR                  SUR                  5      Ul
        UR                  5       nUR                  S	UR                  S	S
5      5      US	'   UR                  SUR                  SS
5      5      US'   UR                  U5        [        R                  R                  5         [        S[!        US5      S.5      $ )Nr0   r   r"   rH   F   参数不存在或无权限r&     r1   r   r2   r3   r4   TrY   )r#   r
   query	filter_byfirstr   r   r[   r    r1   r   get_config_dataset_config_datar   r]   r_   rK   )param_idr"   rG   rI   config_datas        r   update_cli_paramrm   e   s
    "#G  **hU`*aggiF55RSTVYYYD((66;;/FKXXi8FN((*K88G[__Wb-IJK!%-XZ9[!\K
;'JJt.CFK.XYZZr   DELETEc                 0   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  R                  U5        [        R                  R                  5         [        SS05      $ )	Nr0   rc   Frd   r&   re   r   T
r#   r
   rf   rg   rh   r   r   r]   deleter_   )rk   r"   rG   s      r   delete_cli_paramrr   y   s}     "#G  **hU`*aggiF55RSTVYYYJJfJJIt$%%r   z
/subagentsc                      [        5       n [        R                  " SU 5      u  p[        SU Vs/ s H  n[	        US5      PM     snU Vs/ s H  n[	        US5      PM     snS.5      $ s  snf s  snf )Nr@   T)r   user_subagentsglobal_subagentsrO   rQ   s       r   get_subagentsrv      sq     "#G#0#D#DZQX#Y LIUVA0J?VKYZ>a21jA>Z  VZrV   c            	         [        5       n [        R                  " 5       n[        U SUR	                  S5      UR	                  SS5      S9nUR                  UR	                  SS5      UR	                  SS5      UR	                  S	S5      UR	                  S
S5      S.5        [        R                  R                  U5        [        R                  R                  5         [        S[        US5      S.5      $ )Nr@   r1   r   Tr"   rH   r1   r   rA   r3   rB   rC   rD   rA   rB   rC   rD   r   r@   )r#   r   r[   r
   r    rj   r   r]   r^   r_   r   rK   r`   s      r   create_subagentr{      s     "#GD7
RXIYcgckckluw{c|}F
DHHVR$8488GUWCXdhdldlmuwydz  FJ  FN  FN  OV  XZ  F[  \  ]JJNN6JJt1Fvz1Z[\\r   z/subagents/<int:subagent_id>c                    [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  " 5       nUR                  SUR                  5      Ul	        UR                  SUR                  5      Ul
        UR                  5       nUR                  S	 Vs0 s H$  oUUR                  XTR                  US
5      5      _M&     sn5        UR                  U5        [        R                  R!                  5         [        S[#        US5      S.5      $ s  snf )Nr@   rc   F   子代理不存在或无权限r&   re   r1   r   ry   r3   Trz   )r#   r
   rf   rg   rh   r   r   r[   r    r1   r   ri   rF   rj   r   r]   r_   rK   )subagent_idr"   rG   rI   rl   ks         r   update_subagentr      s    "#G  **kXb*ciikF55UVWY\\\D((66;;/FKXXi8FN((*KHlmHl1488Aq"'=>>Hlmn
;'JJt1Fvz1Z[\\ ns   +D=c                 0   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  R                  U5        [        R                  R                  5         [        SS05      $ )	Nr@   rc   Fr}   r&   re   r   Trp   )r~   r"   rG   s      r   delete_subagentr      s}     "#G  **kXb*ciikF55UVWY\\\JJfJJIt$%%r   z/mcp-serversc                      [        5       n [        R                  " SU 5      u  p[        SU Vs/ s H  n[	        US5      PM     snU Vs/ s H  n[	        US5      PM     snS.5      $ s  snf s  snf )Nr5   T)r   user_serversglobal_serversrO   rQ   s       r   get_mcp_serversr      sq     "#G#0#D#D\SZ#[ LIUVA.q,?VKYZ>a0LA>Z  VZrV   c            	         [        5       n [        R                  " 5       n[        U SUR	                  S5      UR	                  SS5      S9nUR                  UR                  5        VVs0 s H  u  p4US;  d  M  X4_M     snn5        [        R                  R                  U5        [        R                  R                  5         [        S[        US5      S.5      $ s  snnf )Nr5   r1   r   Trx   r   r"   rH   r   r.   r/   r1   r   serverr#   r   r[   r
   r    rj   itemsr   r]   r^   r_   r   rK   r"   rI   rG   r   vs        r   create_mcp_serverr      s     "#GD7488TZK[eiememnwy}e~F
TZZ\  W\TQQ  GV  >VDAD\  W  XJJNN6JJt/DV\/Z[\\ W   )C
9C
z/mcp-servers/<int:server_id>c                 8   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  " 5       nSU;   a
  US   Ul        SU;   a
  US   Ul	        UR                  5       nUR                  UR                  5        VVs0 s H  u  pVUS	;  d  M  XV_M     snn5        UR                  U5        [        R                  R!                  5         [        S
[#        US5      S.5      $ s  snnf )Nr5   rc   F!   MCP服务器不存在或无权限r&   re   r1   r   r   Tr   r#   r
   rf   rg   rh   r   r   r[   r1   r   ri   rF   r   rj   r   r]   r_   rK   )	server_idr"   rG   rI   rl   r   r   s          r   update_mcp_serverr      s	    "#G  **iVb*ciikF55XYZ\___D~6lDi((*K  S  CR  :R  S  T
;'JJt/DV\/Z[\\ S   1D
D
c                 0   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  R                  U5        [        R                  R                  5         [        SS05      $ )	Nr5   rc   Fr   r&   re   r   Trp   )r   r"   rG   s      r   delete_mcp_serverr      s}     "#G  **iVb*ciikF55XYZ\___JJfJJIt$%%r   z/permissionsc                      [        5       n [        R                  " SU 5      u  p[        SU Vs/ s H  n[	        US5      PM     snU Vs/ s H  n[	        US5      PM     snS.5      $ s  snf s  snf )Nr8   T)r   user_permissionsglobal_permissionsrO   rQ   s       r   get_permissionsr     sq     "#G#0#D#D\SZ#[ LMYZ\21lC\ZO]^~!4QE~^  Z^rV   c                     [        5       n [        R                  " 5       n[        U SUR	                  S5      SS9nUR                  UR                  5        VVs0 s H  u  p4US;  d  M  X4_M     snn5        [        R                  R                  U5        [        R                  R                  5         [        S[        US5      S.5      $ s  snnf )Nr8   r:   Trx   r   r"   rH   r   r.   r/   r:   r   r8   r   r   s        r   create_permissionr     s     "#GD7488TZK[eijF
TZZ\  W\TQQ  GV  >VDAD\  W  XJJNN6JJt3HQ]3^_`` Ws   C
)C
z /permissions/<int:permission_id>c                    [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  " 5       nSU;   a
  US   Ul        UR                  5       nUR                  UR                  5        VVs0 s H  u  pVUS;  d  M  XV_M     snn5        UR                  U5        [        R                  R                  5         [        S	[!        US5      S
.5      $ s  snnf )Nr8   rc   F   权限不存在或无权限r&   re   r:   r   Tr   )r#   r
   rf   rg   rh   r   r   r[   r1   ri   rF   r   rj   r   r]   r_   rK   )permission_idr"   rG   rI   rl   r   r   s          r   update_permissionr     s     "#G  **mZf*gmmoF55RSTVYYYD~6l((*K  S  CR  :R  S  T
;'JJt3HQ]3^_`` Ss   !D
1D
c                 0   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  R                  U5        [        R                  R                  5         [        SS05      $ )	Nr8   rc   Fr   r&   re   r   Trp   )r   r"   rG   s      r   delete_permissionr   )  s}     "#G  **mZf*gmmoF55RSTVYYYJJfJJIt$%%r   z/rulesc                      [        5       n [        R                  " SU 5      u  p[        SU Vs/ s H  n[	        US5      PM     snU Vs/ s H  n[	        US5      PM     snS.5      $ s  snf s  snf )Nr;   T)r   
user_rulesglobal_rulesrO   rQ   s       r   	get_rulesr   :  sp     "#G#0#D#DVW#U LAMNA,Q7NCQR>a.q&9>R  NRrV   c            	         [        5       n [        R                  " 5       n[        U SUR	                  S5      UR	                  SS5      S9nUR                  UR                  5        VVs0 s H  u  p4US;  d  M  X4_M     snn5        [        R                  R                  U5        [        R                  R                  5         [        S[        US5      S.5      $ s  snnf )Nr;   r?   r   Trx   r   r"   rH   r   r.   r/   r?   r   r;   r   r   s        r   create_ruler   E  s     "#GD7TXXgEV`d`h`hirtx`yzF
TZZ\  X\TQQ  GW  >WDAD\  X  YJJNN6JJt-B66-RSTT Xr   z/rules/<int:rule_id>c                 8   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  " 5       nSU;   a
  US   Ul        SU;   a
  US   Ul	        UR                  5       nUR                  UR                  5        VVs0 s H  u  pVUS	;  d  M  XV_M     snn5        UR                  U5        [        R                  R!                  5         [        S
[#        US5      S.5      $ s  snnf )Nr;   rc   F   规则不存在或无权限r&   re   r?   r   r   Tr   r   )rule_idr"   rG   rI   rl   r   r   s          r   update_ruler   Q  s	    "#G  **gTZ*[aacF55RSTVYYYD$7mDi((*K  T  CS  :S  T  U
;'JJt-B66-RSTT Tr   c                 0   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  R                  U5        [        R                  R                  5         [        SS05      $ )	Nr;   rc   Fr   r&   re   r   Trp   )r   r"   rG   s      r   delete_ruler   d  s}     "#G  **gTZ*[aacF55RSTVYYYJJfJJIt$%%r   z	/commandsc                      [        5       n [        R                  " SU 5      u  p[        SU Vs/ s H  n[	        US5      PM     snU Vs/ s H  n[	        US5      PM     snS.5      $ s  snf s  snf )Nr6   T)r   user_commandsglobal_commandsrO   rQ   s       r   get_commandsr   u  sq     "#G#0#D#DYPW#X LGST|!/9=|TIWXA1!Y?X  TXrV   c            	         [        5       n [        R                  " 5       n[        U SUR	                  S5      UR	                  SS5      S9nUR                  UR                  5        VVs0 s H  u  p4US;  d  M  X4_M     snn5        [        R                  R                  U5        [        R                  R                  5         [        S[        US5      S.5      $ s  snnf )Nr6   r1   r   Trx   r   r   r6   r   r   s        r   create_commandr     s     "#GD7	QWHXbfbjbjktvzb{|F
TZZ\  W\TQQ  GV  >VDAD\  W  XJJNN6JJt0Efi0XYZZ Wr   z/commands/<int:command_id>c                 8   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  " 5       nSU;   a
  US   Ul        SU;   a
  US   Ul	        UR                  5       nUR                  UR                  5        VVs0 s H  u  pVUS	;  d  M  XV_M     snn5        UR                  U5        [        R                  R!                  5         [        S
[#        US5      S.5      $ s  snnf )Nr6   rc   F   命令不存在或无权限r&   re   r1   r   r   Tr   r   )
command_idr"   rG   rI   rl   r   r   s          r   update_commandr     s	    "#G  **jW`*aggiF55RSTVYYYD~6lDi((*K  S  CR  :R  S  T
;'JJt0Efi0XYZZ Sr   c                 0   [        5       n[        R                  R                  XSS9R	                  5       nU(       d  [        SSS.5      S4$ [        R                  R                  U5        [        R                  R                  5         [        SS05      $ )	Nr6   rc   Fr   r&   re   r   Trp   )r   r"   rG   s      r   delete_commandr     s}     "#G  **jW`*aggiF55RSTVYYYJJfJJIt$%%r   z/export-configc                      [        5       n / SQn0 nU H6  n[        R                  " X0SS9nU Vs/ s H  n[        XS5      PM     snX#'   M8     [	        SUS.5      $ s  snf )u   导出用户的Augment配置)r0   r5   r8   r;   r6   T)enabled_only)r   rG   )r#   r
   get_by_typerK   r   )r"   config_typesrJ   rH   configsrT   s         r   export_configr     sg     "#GOLF#++KtTNUVg4QDgV $ tv677 Ws   Az/session-tokenc            
         [        5       n [        R                  R                  U SS9R	                  5       n[        R                  R                  SS9R	                  5       nUSLnSnU(       a:  UR
                  UR                  (       a  UR                  R                  5       OSS.nU(       a  [        SUR                  UR
                  UR                  UR                  (       a  UR                  R                  5       OSUR                  (       a  UR                  R                  5       OSUR                  (       a  UR                  R                  5       OSS.UUS.5      $ [        SSUUS.5      $ )	u   获取用户的Session TokenF)r"   	is_globalT)r   N)r1   r.   )r   r1   tokenr.   r/   	last_used)r   r   has_global_tokenglobal_token_info)r#   r	   rf   rg   rh   r1   r.   	isoformatr   r   r   r/   r   )r"   token_recordglobal_tokenr   r   s        r   get_session_tokenr     sV    "#G&,,66 7  eg  ',,666FLLNL#4/ %%AMAXAX,11;;=^b

 "oo$))%++EQE\E\l55??AbfEQE\E\l55??AbfCOCYCY\33==?_c !1!2
  	  0!2	
  	r   c            	         SSK n SSKnUR                  [        5      n[	        5       n[
        R                  " 5       nU(       a  SU;  a  [        SSS.5      S4$ US   R                  5       nU(       d  [        SSS.5      S4$ UR                  S	S5      nU(       dx   SS
K
Jn  UR                  S[        U5       35        U" U5      nUR                  SU 35        US   (       d-  UR                  SUS    35        [        SSUS    3S.5      S4$ OUR                  S[        U5       35        [&        R(                  R+                  US9R-                  5       n
U
(       a2  XZl        SU;   a
  US   U
l        SSKJn  UR5                  5       U
l        O^SSKJn  ['        UUUR                  SS5      UR5                  5       UR5                  5       S9n
[8        R:                  R=                  U
5        [8        R:                  R?                  5         [        SSU
R@                  U
R0                  U
RB                  (       a  U
RB                  RE                  5       OSU
R6                  (       a  U
R6                  RE                  5       OSS.S.5      $ ! [         ab  n	UR!                  S[#        U	5       35        UR!                  U R%                  5       5        [        SS[#        U	5       3S.5      S4s Sn	A	$ Sn	A	ff = f)u   保存或更新用户的Session Token

支持两种模式：
1. 已验证模式：前端已调用test接口验证通过，传入validated=true，直接保存
2. 未验证模式：前端未验证，后端先验证再保存
r   Nr   Fu   Token数据不能为空r&        Token不能为空	validatedvalidate_augment_tokenu   保存前验证Token，长度:    验证结果: validu"   Token验证失败，拒绝保存: r   u#   Token验证失败，无法保存：   Token验证异常:    Token验证失败:   u(   Token已验证，直接保存，长度: r!   r1   )datetimer3   )r"   r   r1   r.   r/   Tu   Token保存成功)r   r1   r.   r/   )r   r   r   )#	tracebacklogging	getLogger__name__r#   r   r[   r   stripr    app.services.augment_helperr   infolenwarning	Exceptionerrorstr
format_excr	   rf   rg   rh   r   r1   r   utcnowr/   r   r]   r^   r_   r   r.   r   )r   r   loggerr"   rI   	token_stralready_validatedr   rJ   er   r   s               r   save_session_tokenr     s    x(F!#GD7$&55NOPRUUUW##%I55HIJCOO e4	JKK9#i.9IJK+I6FKK.12'?!CF9DUCVWX$!DVIEVDWX     #  	>s9~>NOP ',,66w6GMMOL&T> $VL%"*//"3 	&*&"%((
 	

|$JJ&// %%AMAXAX,11;;=^bAMAXAX,11;;=^b	
	 	 	E  	LL.s1vh78LL--/0 0Q9   	s    A5J 
K<AK71K<7K<c                  0   [        5       n [        R                  R                  U S9R	                  5       nU(       aK  [
        R                  R                  U5        [
        R                  R                  5         [        SSS.5      $ [        SSS.5      S4$ )u   删除用户的Session Tokenr!   Tu   Token已删除r&   Fu   Token不存在re   )
r#   r	   rf   rg   rh   r   r]   rq   r_   r   )r"   r   s     r   delete_session_tokenr   I  sz     "#G&,,66w6GMMOL


,'


44DEFFu1ABCSHHr   z/session-token/testc                  0   SSK n [        R                  " 5       nU(       a  SU;  a  [        SSS.5      S4$ US   R	                  5       nU(       d  [        SSS.5      S4$  SSKJn  SSKnUR                  [        5      nUR                  S	[        U5       35        U" U5      nUR                  S
U 35        US   (       a"  [        SUS   UR                  S0 5      S.5      $ UR                  SUS    35        [        SUS   S.5      S4$ ! [         a{  nSSKnUR                  [        5      nUR                  S[!        U5       35        UR                  U R#                  5       5        [        SS[!        U5       3S.5      S4s SnA$ SnAff = f)uB   测试Session Token是否有效（实际调用Augment API验证）r   Nr   Fr   r&   r   r   u   开始验证Token，长度: r   r   Tr   
token_info)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   rI   r   r   r   r   rJ   r   s           r   test_session_tokenr   X  s    D7$&55HIJCOOM!E55HIJCOO MF""8,23u:,?@'.nVH-.'?!),$jjr:   NN0	1B0CDE !),   
  ""8,*3q6(34Y))+,,SVH5
   	s&   "BD &)D 
FA0F
FFN)3__doc__flaskr   r   r   r   app.models.database.modelsr   r   r	   r
   app.services.decoratorsr   	functoolsr   r   user_augment_api_bprouter   r#   r,   rK   rU   r\   rm   rr   rv   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   r   <module>r      ss   1 0 [ [ 2  2HI\]  .@  A
> =5':  ; =6(;[   <[ 7%I[   J[" 7(L&   M& <%9  : <&:]   ;] 9E7K]   L] 9H:N&   O& >E7;  < >F8<]   =] 9E7K]   L]  9H:N&   O& >E7;  < >F8<a   =a =wOa   Pa =zR&   S& 8eW5  6 8fX6U   7U 1E7CU   DU  1H:F&   G& ;8  9 ;9[   :[ 7%I[   J[  7(L&   M& +eW=
8  >
8" +eW='  >'T +fX>U  ?Up +hZ@
I  A
I 06(C/M  D/Mr   