From acdc58ef4908c0dc8603916999b2ac5da03da4df Mon Sep 17 00:00:00 2001 From: wuyuan <15505152113@163.com> Date: Wed, 8 Jan 2025 11:26:54 +0800 Subject: [PATCH] =?UTF-8?q?=E7=8B=97=E5=BC=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-druid.yml | 2 +- yq-admin/src/main/resources/application.yml | 20 +-- yq-admin/src/main/resources/logback.xml | 2 +- yq-common/libs/arcsoft-sdk-face-3.0.0.0.jar | Bin 0 -> 62469 bytes yq-common/pom.xml | 21 ++- .../yq/common/arcsoft/FaceEngineTest.java | 107 ++++++++++++ .../java/yq/common/utils/FaceEnginUtil.java | 157 ++++++++++++++++++ 7 files changed, 293 insertions(+), 16 deletions(-) create mode 100644 yq-common/libs/arcsoft-sdk-face-3.0.0.0.jar create mode 100644 yq-common/src/main/java/yq/common/arcsoft/FaceEngineTest.java create mode 100644 yq-common/src/main/java/yq/common/utils/FaceEnginUtil.java diff --git a/yq-admin/src/main/resources/application-druid.yml b/yq-admin/src/main/resources/application-druid.yml index f97a6b4..d04b155 100644 --- a/yq-admin/src/main/resources/application-druid.yml +++ b/yq-admin/src/main/resources/application-druid.yml @@ -6,7 +6,7 @@ spring: druid: # 主库数据源 master: - url: jdbc:mysql://localhost:3306/sys?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3307/mine?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 # 从库数据源 diff --git a/yq-admin/src/main/resources/application.yml b/yq-admin/src/main/resources/application.yml index 5b39f5b..a19ced1 100644 --- a/yq-admin/src/main/resources/application.yml +++ b/yq-admin/src/main/resources/application.yml @@ -9,7 +9,7 @@ ruoyi: # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) - profile: G:/yq/uploadPath + profile: D:/yq/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数字计算 char 字符验证 @@ -18,7 +18,7 @@ ruoyi: # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 - port: 8080 + port: 1111 servlet: # 应用的访问路径 context-path: / @@ -68,15 +68,6 @@ spring: restart: # 热部署开关 enabled: true - mqtt: - username: adminRQ # 用户名 - password: yongqiang666 # 密码 - hostUrl: tcp://106.13.50.125:1883 # tcp://ip:端口 - clientId: ${random.int} # 客户端id - defaultTopic: test # 订阅主题 - timeout: 100 # 超时时间 (单位:秒) - keepalive: 60 # 心跳 (单位:秒) - enabled: true # 是否使用mqtt功能 # redis 配置 redis: @@ -87,7 +78,7 @@ spring: # 数据库索引 database: 0 # 密码 - password: + password: 123456 # 连接超时时间 timeout: 10s lettuce: @@ -140,3 +131,8 @@ xss: excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* +arcsoft: + appId: 7MtFQZ9S9Ue2UC7koYxJbeL5iEHhqGtp3d5SJbJ4ou92 + sdkKey: 4VM5rVL8eKmmELhRi8ZoopH33GzsgPoptA94zSXyHvzz + faceEngine: E:\arcsoft_lib\LINUX64 + thread-pool-size: 10 \ No newline at end of file diff --git a/yq-admin/src/main/resources/logback.xml b/yq-admin/src/main/resources/logback.xml index 7264f84..b550f00 100644 --- a/yq-admin/src/main/resources/logback.xml +++ b/yq-admin/src/main/resources/logback.xml @@ -1,7 +1,7 @@ - + diff --git a/yq-common/libs/arcsoft-sdk-face-3.0.0.0.jar b/yq-common/libs/arcsoft-sdk-face-3.0.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..3091a2ecb54d799156b2d8aa00f4a7a73f8882d9 GIT binary patch literal 62469 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

waV8)eg z5nLXXiVrLP*H!4=OZpZQiQyJJ=^g9eZeulni(?0@pZVO*oUs$L!Sdb2oPxhZY}h$= z8gWPW08IYnYK|5?ky;Qee6VM|>bhuk>>rrQW zPiX(afC4F3Y#6E0(gqL$bbWB@lddL0SAB6;efm?JihBFsBc*@H#-aMj7SzeYC{-K^ zHCo4Z0Y)C{|FVYLh4ZhJN9J?!rMR+!MM4h|GwRkL{6+$WU_b5tk!V zS|>`+6Qz_0Lr4>(kZDjkL(-t$`#5X!P{*8fzw6Gu2P;r<`DUoOd(XEjS%D7ILiZp*UJEnDOG zWru6shR?X6N05g0+b-9hLnjdDPSTr>pnB|BnRhP~rF)D3^Eb{df>4_+@se}WJ|a;H zo&-`Hd1AEGbXl@cJh}1|DKQ<1pO$df517FKoFEULL3ajWcj6vlpZOfJI>EX48;+3D>Yn*F0fIhDokI>ta{{*qnMQL6Kqg0^c)6Ce`)T4|l=AgZraS9f>UgBR7azct*_ zx1Ti(q?m%L%dA?*MbVCWoE%r8mlEmmTOl(J22QNnnq+M>yJmo!BAh$)?^|*_-gBS~ ziNu(YO%Lj)1bkOx)jSOAEo}IaCw+IplBXTTFfl3GNkK+`4 zkT@`SM{V z7wk}f;>I@>O0)oZnna1eyfBYJ8@6kZ)&}PS4L5nPu{~}iunC28hRaY?mWv<9Al!;6H;4O$AX&RR0=xQ0hRJY{niSH#>C>=g>^2%)o zSk(g#viU^sY!2<(0YLTB)u-K`;0&Ao&+<)Y9Wtjz(_wP^g+LHS#BhTq<0H~afvQwc zxiHO6JgEn86+>AKAeO?k1c({?cF)9lK%B}i?sQ?ijdCEHQhlkSOZB^7P(A2M;D!KW z6k}RBQnJ~MvR*)FKtv@AuUy)ian%%ps=2$=o|bu3n5it%3<5P?4w?cv7sM(a$CL3o zH#>(*n-h9ibaXTZx(4x=)uQIE@|<@j+iX%3u9SYFiNx{?uQL1njf6>16zy42!mkre z`FRLKF^vc>4_UEzvRl%C zcaoXD>zu5sOt3!0pa;@mtg-PI6hm%i@Fu$$19;@B)FB6Q=X9dvQHL;k_94bUb_n&= z=>iy495frdmrM(+MMJ5y`AWZXHY!@&)HryVxVt1#h@)$*WV$M*G1D6zUSsiK`ATUH zH|MFci!S+7($y+EJM~8eE$#j5bxW?^nO<^+Qn5QL0!-bsg<|=iUs zYUg_+_4A1;jzsmJ;HEcrA}4&AK{*9zjGhY-&;I6)7t#4f+9?+dov=$jFb095leu~uMr zA&Ru_sg?_k0F3aaXx|GnkN@AWyBp{Zy!=qx8|&5Z*+h=NA^OjFe9??U3(qKc1BL@{ z&rOSUDbQ!278POzIoYni?`I+9zkL4_tj<@4f;u5t&(nD#LH;75tCNO|v;XwM9x5qq zF8_?SBW0zf{q;A`iYi!>W(W!3^RakspehZi7xpIfbJda2-5GB>NDj9T0;f;Egw*l}n1e^hdsYlD!pLG#{lr&-Tr3=qw9+wOk zXh!8Wn|w?>#YW7^yZPS$_6JPXFcd44ZDU%1rEYB`+~H7Z=j{tq zf3uRmn=1+N)P%%ym<)?JKFG<0Mh;`as4Ek=d6-U%C_X~Q38V(iWmkL$5Ur<2-u0Fhf(7_qpRbsA0AV4Wn?6Zy&wt* z4rw}(G?*#s_G)xw>r3$Oe&0%S4C?tH{R~Jw7pC)wmlDworT#XY%kYR21p_&z2X<%2 zuZa4R{Y3AE}N%4 zqHqB!j;vb3`rl78mK(655W7;;rV#*>!9@^BBW65m0swlST8l0(+~x+a24fbmW+IqN zX~5=KHp8K$nZ=0uKwpNrX5yXnpMWLQa?IM|nX9Pu8tE0giZ#)bNmFaoSIlP-od zSBm*1$^6m~sXI9Ho`RHMA~JKvlF^_Lt)dX^j=z?Uv@l_BLqi_BX?Nn&+W zX+?pK4WxqPb+`zI%%GbR{~q%M^204HIcrD(YMLR}_(tb3T`LVGXY9Cf8=<%dBfhsIg1vWioZFI88tbR7&nFl?U-;O3;tvpwo>I( z=#iR$b{2d&jSCr!YE*>t_)wHs2TU=w?=wzJRGLUOv%4`aQxbII-Qn1J2WS}vU${){ zC|W}of@qL`n!KfTZtQ!^&#rR3aMy<6{u}NM&!>?}HSfc5X1E-zHh)_z4W#h2&^?r) zAJoPju}n1-aJEnYouO;7p@wiKJ!z~unV}yz=_gqGjh=dpSPEC+d#<^2sNt+h0nBig zY&cKx-y3`zfndHk3EakwJODFX# zUvAjBNeirjd4Zq4U}xLbW*0&|iBQ}IKZuY!C=>WDZ5$AFOeNuBsx|NgWf3eIYSr#AyQ2jZC`A zZjx7N&5!{gZ`85}i+fTQ6kxe5Pc$POAyGuXpx>m8qR%v@UDYk3!CUrP+@LOM@w!NP z@v!BXmDQ3R4J6z(>}oBRp0ue zfdxntDIGU0oD_1PZ}~B@?o3;e{u2Z< zg&D2mpwW>%OQeTU@GZmO7eT6$U;3?P@H6OYp)cGlP5zL}B=MacC-D5W8OR#2s4-d| zNyxmNCz4{R(jr92>ASvVuJB`y$y&k=E6CEv3FmiZQP8ymr}l&!L<4IDS7Po5kAS`v zX*g(vegj+ZRjXPyD~u&2$brUN$Ncqb5u2MXGR^;k1ACksF?f}_kn=ztrWAZxcEcv| z_nph47azsK=huG*+W!@d4aRXI6$J$Xn*YueVEebh*nb;=7ICw-Gc$MoS9~@tT~`rR z7;WrpVPi=%-yxf z%}LqJRcXZcLN9lc7z~ZJ&s6)NF~}Y6S=-oltak3wWo*E7UZ!j*h2eO5?p;^3akLqG zpeDDKXC&prf+-K6-q6@`wu4ZYlgp3~CqUL?`HS8>nRs0RL%ZPKDI(pwZ#<{NY2U12 zo5tL~>Wz`rVg+5roQbVt0yWJ;tEbyycjs*CwpL@Xl)+7}>+P2ow8bzfm)zaj!F70$ppxRn6UNvzV*GuUT~F>;k{B%bV?Xk*w~Z=0*Sq1%xl; znT3emltr9xf}%eqg|JY+-P}=y3-NO@u*{mlH71bQS{Agu6@$CpD_Gf4=^DaxdpDF5 zYlRJ56%No>{Y&wB)Z(Lj!9+7xVu|Sw-S(ls^)}Rw4H|C)Yc!jQ^1V~aKE;H5a1Iw| zZzMGr;Ru@r7Q~18;9xTxsje-MXw6b!*pcp~Px?)_qqpGtx}=AXem&dN_rjW;b$$!6 zvwADOCUc%x?)c076@?n=y17I-kg(<)b%-)d5qgKxcm2T$N4a>QA*P5IjrrEH8TVuc z!cf#NjA0Lbk8~&^3=x_TP2hTHe|IdEfAnb~ zx%%>e6Y8KgMv8L*EI8r0lI3;eh^Z9*G02FJcVHhRJrO`+-!KdIHV>SR)KG$l;Sl0S zzS@q^P!d>r*r0@a!8_>h8dwTeqlf_8Ht3IXp$Vy#A6R& z@@Q*yL|zkUw1b%jJi`6=`hiGyfJX&L0~#$WAd^o(|NDr8CnnXefPsJlzg5w{%?Xh- zclg#f(he4m|I#^O%7Zqj%4qzK$rG7oHuLKe_VV+qG}a(9MIB90DlKRx`eHB)h7^oW zCOnLC6#GM8P6r~wv{W7F?^F*xr-{o%=*L?gS6M!@+#bh&>g#uaFZLaP5p2B7lo^@q zc&swt+Msn2+Q6Mf(I3^xh!C_dz>Sdv(Z<<4;=!BVy6VAXeiErkHmBr8=l$Bw9G8)N zbM~bx9$2K#j5CB#4YC;g#k~J*Gm42O7 z=90a;G9(gKJrh01#<<$Onc}PTY;V3KT+;AL+_v72vfz2odXpZFg~BH6Jlmi^^5pV# z0J^Fzlj`%pEK29O0sO4zMS(>zwBy}cqT)seDDn$E7yCR8P^p+{;BB*oe$9ZS`0nNj zG0DcWS^mO7!lP?V7=lTb^{La~IrCOXS}#p2zaT5^d}BW|bK|HR8kSgFGb)#+A)H+4 zE@hJNP-|{;?_bn09`-YfpFt+cJqKF?;uPkyWEbb-%o?hXIE_55IAU!mrIXmYRc1}- z79cB`8O9$L%|}LQh#iGYJFIT|HyjLqmnpTb{+u78H24|A`}9EwI`j0%`W)+j;x;jM zM1L3u?S6s>zheu(AVWJeojX3L9%4kqd?^|JnLt_F?M%DZ{Q4gmL=5|D2c;lDKza~B zKs5hOKK?UBOWNMp()=GxBkuVhDN`vs-%AzJnB`lFK|))b5}FvjNGHY~*znFCaN24~ zFf;_=YYU#N&+o^nt)fruOd+}0SDAf6^V~H9YJ!!}jI6EGDGve8=8wClF-IV+uyUM| z0l7gaKDi;57j%|tGlC>-*`Wh6KI6nz-X3ZLmx-NrFHKLlqPS5AQ2h~)65A_Pruhoy z$biNt^BCbm|8YSV)VmyuT3T_{4n{08ogs%dvXB;aH>T*&6t!ir3Pu)+3%aPMU5wllol0AXm3;+O~LJpP`R|r**7}75tcXk51c#EyPi? zUlQZDOB(Y|>ym93?A30FxtxZL+I`e!^v_#P#YKI-u9D8@C-`5BS0`a)lyFnzzwHdq zOw^bc2aU~pcM+Y6m5Y;+>0VZI4m*^ge;!48B&o28ut-sau{eGtmG=yCFHoL27R1We zwT8rER^)QlsY)@e$GcqUm@Je<9WluJMD4m!4P+wVl$?^=pA-Np5U|J35=mV^Z@*oM z&3tHta;834N?Ir~&v~lP7Y9g%7@pBepht}nx7<6Xl=s#~VxjJMjuhS!4@*}AeU&XF z>!C0dMj*A@vVl22VEIF&GjC(snREPctMfz-@#dFK7$ft9L+dE95@>4Syqlzl$4Q2T zT&7lfYMr$)LKc3EVH!%_Knbg1Dme$1RazkjQKYIhW*o`RNvrOR?=o!OwYK^G21y>7 z5w4a9u(3oc)=hLl;V!@C^NVV}7PN#2A;{gjLfML%=1eXRA#t;>b{gEh!WQJ|45gvHxn+Q{604@z7yeuM& zvHNYku|VCz+2$bv7xu%j8>q3%{!eD#u7a>vg9QS*{?00-{l7B1gt4isqqEn)xP3|U zB|vQn{i|>4)`9{tIS>?1S_sW`oFkHH8B7^P4r|IH@;6v&kC_2Q$b=lv9SC&kE=pA! zgLv&*v{lP`G)4;5C2no&QkVK)2iwMvd&XbTwO2k+%I5w1t{ zF$3r2D8I>9ugQY|;^i194Z*z;H3H0yC`qiS$hk3YI1uh?mFIAX?|tVQA5Hd{*d6KI zw^IuBxzWnMXkQvV0-b9`%v9N>79=O&#RB}X$#YdHQ5ic9dr2RETB69n(V^T-!MsP@ zai@l|$RrQtJHBA0GMJS{e-j^=XC*zVJ1tbbZ2~ss+4FH*feqz$f?TZU$b1l$hXS4# zX}qkSTDKyvKS&dBgy2_B5IG8ZH0NGy_QGZ%(zwiJ&sAhnWR%pZyJHSfLZ-C7v~EKd z+n`of#QUud2j{caG^|#5QPeArhb}RS7h*?E^_tryMzSmu5OoG?l=KQuDrvnITPrTp+5dYZRv_1s!_yf>(_C6ZN3dZ{HkGXa z9@Br;X_p(!wNq!cYG=AEa_E$U9M^Kwa0*Sjw&V~_m%NISWD!KpuD4f0uI_{#f*oL% zRK+~z?xO3b2h};-&yEH|k9n$e_FTQI7>oNHbK4%W_`4L>QjrRSql^5ysa?`aSiDp` zLWR_N8Jj-VsZ_MjpfldUH*gRLi4ldUIOGu%&c zPyxO^scsr$0rbghAKfZ-^Skyt+26JcJ6#DX@+{^{+Lp}bIKlqZ<#%&HO6rayt4bN8NN z71^;hq0C96zx?FNf>Um&hQ`2KdsPS`FD0T;h`dCXm0X@M$*HSOh9;ZsEoanhMb5+fNw+?r*CkXI!v1@qt=4D z0E_%$>-{n}WBnb=r!OHX#RCrE=*KqEd=(6YarH$=c~ybo_${L9Sd`qk$b ze`3pJ8*a;HBNvUT3NGOCXn0rbYzDhOazh4_FD!L*mReqVj71Ux0BWPvFgW7t9RweE zjc0 z{TSpi7hESMz$1cpjJ=S!N(FS)&4w)o`)2#8hC0Yk7nl^EJci{A85qj z15nFnZ%|YZh*^8VHWhRjL-Ko5l0hE1QzHe0;DV{W8o_*`E?_%IUfDx?Lax zj-o`4$qc1%E6TWAC9LG;8>r5w%A_=vN9jVK03wgpj$li|T{>3ddtc=qwj=w!Zw{@+X zvz7t(#=i|i33Rh|pqSTh0`d$$laeQ|w$w1guEv$8Y_N9o&!*Hzz3f<4j?MB`eGC|K zT3@(B#?Qub-}TmJ`J+{FoSiEV@dtWLeDbE#Q>s^;U%!15d(AOfv&3bvbmAGmonJ2& zJ+>0w={5u*8ymFvqc0%x&s-iusyacn)Gls2ecg$*dP)(iW(_W;0&vP7O{M#g@|F`8 z3`bQyug04EbCU#hdd{@GgSckrr7!wNlGBELGpAfJWnUF6+H=V5ITiaMGmIErdK0*N zK%n)aK007H_iQ#}4K~AVe=ydKEOaPXc;YrnU+1_%bD&Orm|bEx|02Im)`lEYEV<=@ z^|KNpP09-iF*77Jr4>fB&sCIg5aP}9z{V~{{rH>8O^(`>#38m)B@QB<jzt6jxBni(V7TG+!T`Jyk+CO!Gnz4pBB5p zDDtFL?uo0|RB+fCgmI$u^2-pju0>ykA}K@`TTUQy_J>Jw@qz_MaMzhgB*cJJJ|c9Y z7VsZMM;-y*(9!*!_jBQ~r+U>GmZx_nH)Pcmw#tD0jfm&A=dp3Ul`_wTt00?mfSw}{ zCw_1a{dp?qhmc>r{;7IeU!kt|PdgvKc;zPaJ6&kL0aO0*T|}162rUDI8|^!$9k_%B z*L&nZNw4uS>1Il)deM?aQLqPT=oN>{aniUUuwn7PGU*u-$FCqF^OH#tyctbXY)wdX zM1>n%D$vUU>6H@D55UP!EHCT4M8Fz{R@I?AaZ%lRB7X-S$n=ZBTm^Z^7K5GN3J~V- zs8>p;f}MQj_QCXOP#%7dN*xI*bDHR7vp*!WOeD)AM0jT2`1hG1IczV^sP$d#>EWGv z3ZGdg?U)Qn9U}Wx=jN46WH|hC(`}zxT6PJ*{5>w8P-l?$&eigbT4SCXAD? zAbK9JS)n5LV7T>^J+(5CC;;(~1)^NnJVQ@=uEsm(Ryv+Yu)|eoGZ!A?DU(5X^ETyH+?+!f@CCs2Gl06`)yGUPh$AjLgK0Mv(ej#2an_92e*WSplK=wz5p8TySP#1G8Pz z^bxR+`T?MrVj~Gk_eL>}vdkpl?mNTPGLv#=5MguV_N(Nj!Z*SH?zgzR##yKO_FK$- z`z)^ zie$5!Rv}j6aJ;yGbYkFnPPc?}r?!TL?m&$$P&=82{^&#f%oUQ`BPC7uoU0+HQy!E* zR0|VDk8Ua|Ukw3p)yp+c{#ctLS7{>??9uKzjRZlU#VDa}@zd`P*1ks)is3YU^_S6@ zYw)KoF=(AlLm*gCkH%|}z279n45TSE&Db@(Dm6A8+)?H2HKEU4_`{UxbsA?b%C-~F z)@^|>@rSP$DVleMDaP-daVUILFM;bV{IZMg+{jt} zT8>HU>?MdRSK*a}=lFxUujXDPAwkjeaDm@%@n}3Dt=0@Hp3#@vb{QUmxUDH%#JzdW zwOkxPPau7%-*ZH$qDcE$U3HRsiK>M?a%E{-!A*ZeGI=8}y``*{7#GFiIPaI`+17Y z8#bNgUH^GLtfC0$7c*#pFg{z;NQ%UablZIFXQsT-BK`q>PiH3fvB?{4!>sfg%&5w( zl@NL{J8fXM5+L?G!l&{Xsrpp6)en4Kv7!Zb=a->S@dmj7CJHSst2k))I@K?_>dK>! zlJvFb4j4q0EB^cC$dcZWbZl*MuUcY7{>G}=DivCuv=n4)zEH_8I4|(9Uz>^5lf)}V z`rs<#AvJ{-eh5&1^Kk?!%+^SaKvUq>tpWD?68DnY(6 zcjbjFP>}#4_H7xq>HoodbHc;Hdf$Q$_sx6M|4+R4?Q;63sHZeK{8QBP_D5ZX*N}B} z(`r>B;FKXC;k1Bp*Cgkw_P1bHk#Oa1!1{JP@&k6*$$FE5MQF|v$JL_n0J$Y>V#HOr z04gXD4Nj4L9T6|xYNpD!yDO1pGbGNxttQkZ=*lpoN<%I;kMRA#_ti-k3W-Axkf$%s zeL%Qm^BgssX{qSs3?_;uKYhyx)n6f4jfI(= zh!Gi&IRGZyco-Sq;p%OTGVURNNG z;SOeOv*~b~F9MW{V|v57b`k%(E^dbyswag60usmjfAI?br=#Q_bM#l+UJ*?b?Q^ES z!=Jes1Q5(9PTfKWPG%h=ydI7v627L5wY9Z21qWhn#iTKeF;XT|xf&U_Zd0ss06SC^ zU~zTvS{YFIr|;sT_iiX=?%TZ4a(~Qo$@iIYnc;uhv=?5OwK9d6ug$Gm>oPUhV=q1p zKhx28j6H2zT3X8L3^wmJP6HN&^vYcvS3JaPWrRH8Pye|9g|@<9`*W#GEhSPert?Iv%>;CEARlZ>5axZK5y5 zFCZ(|S3;+?88n;Xefbr(eE!B%$287=OS;_>HZDS(F${Lz!Cb1$mJHfg>#&BCXZfw` zcdG9nTEA(ck#4Z_IK%&#zI=TwVeQw}@);Nx@dlsevGIeV$$@Z3;yxAmXsQe1Qb9DX zdGHjZB;5?z{{hz8B~zTUuYFA7=4Iq|Vd=K^%`rVciaF2)rNjhkS4|}u9_kYugRHxN zgP|TWF1-PW#*yLR<&P0a1JF6-JEkcWm%LQGK3;6BcK5A!sk6^ucOL}vwMI-wM zRACRwE~%iisU!sKg$#Mz@ovYHSQ7beacJ14>x^SI7k5j;SI2oI0%3_2hTba_Fz5Fs zVS75jPEjIzS~9-16-iIEKBa_$>to`N7QElVY$&J`hHtLq(D+)x*(Ip#Quy_JjjfF@y_p3z!8u}~Pf zmlje&DT8=;lGk|h9F`CU!n)t2<%F^;!cW1@ya?o$zjS%*%3}`L53}m3yR??klEWu z_rR2;o)sHwD(eX;eiYXXBMA2-pP)WpVZF=)3lN0YA6_xDq49-{gBp`FIXy)xY09Uk zKZz~`fy$i%neXm8kXX*}um#Is`(^eocz~rc*cQr86`%dPO@QL6yE*zjMCns~>}}T7R$>Zr&pp zcZU|4l6bd*b=-ulxSpI)-+ph!({Qr;i4|B7LYCi`imIl~d!-)`U2m|b;Nqn^tSoL^ z;9LebMt&t@)@fzr?Yp+i-ew~|<>nMY*ngsyGgCeis-vtg%^<;TUq!f{mRG|LJ!xol z*#RReLz-1<5eK(A0Wr--=vo`hG&=5BQeDa665BitDM`Q5>I~hfOUZ^x9aBx{21Nh{ zN%c5mIN&l%CL<=xtHdG)&55 zXnxV^9+l^v#4hYd8>Pv7Zy`q1Nq)Is(|WZ=%Y@3AV{T#!CS@H95;dY3DcXBhR{-#T zUuu`wpOKipKY3Wb|8?TuhHJl9S94Y|VFyb)^M6`Fwd%jVO>nfWH(H4;HfSp9GnVK@ znNpRtz?10Gb2*g|Q%Tf_iYk)Q3Ms$xedN5bbP>-;8hV<=4&nFMF$7xwAYKAWuBg92 zCK%GAPn*1dHhBf4OGDLQrftnhjLEFEW1-TaFx+y*xr@*fBa@R!(q*V9X|d?(3c1zC zqDc&eU05^9wVi7!)R}C#(7kdvkGl!BGeN_9>0@KvOu#b~U#`Lj^T zb1_2INQeu-n&g_BZRBQLx3`Ne7GC|0>RWPCT%bxrO}vDY$cHPZMAi?dTCyP}egy{_ zb&{{j6p%OW*YENxbnXnuFJhDMr%JGiV<(Lf{V&$uF-Wr~+aB(&>auOywr$(CZQHKu zsxI5MZQHhOyfyQixOZm$b8p-a?-Ow%PMjysmy?-$XRf{0+9y5jx#bcO1m7Hw>$v)d z1$vir~H>|g6W1mgO%u03)o%7YvsYhh1%^Dp}nv+~@YPDcCKX#C-^d(}D zRgsW++8+bYJt)HgGEb7fgw8{T>K6+ikf#j_oc}mpgc(`BFMAlFoh9G&$ZUGA*G5`F z2d{He)s_-S3X0zw_m|xAc*)#{^Jx;S7^+TT`kTxV*8`t?ZaKJ4al6{0L)Ep2iX zxros-IEO*g=`ll=&F`rf8tC~`A&4{IR@9xfZJ%y;Fv!PrG^Q3i5T$bAu``i#HGa6J{(m}r{B5}j8|gVZ z+5f{bBPf1N20;#Xu&Zvvd97gD{-#%GUz%oA-<56#_UBrl?{8H?IqdP1THPAQKh74O zH&-`G@B@NTHxvCl;vbWGb&J8evl(0rCWn8vERT+=rnY{RZ%0QVB2(?l)5bQLfis6U z8{y@puZ>cw+5Vb6m|eY`BPl>hnm8i*SwlA6wZpRNXZg#ccJoHxHx==i$*=!IJrB7YT=J+<>#IMGs_6m;crwS4t4LCTo2DgY3xSs99Z&|hPRqiTBO{@7 zX*Fqqoj_o%lj6*yR!PAdl`$Ztp|N}apcR0w%UyC?9Ct${#!x}U!CZS^an9A+M~j7L zdLB?jTlNyWZ~R~Z7w{s}b-m&ZN?-Ee_KN^jZ?wjfDx=jBlP#ufC=-L$GG((_o1yqd zLS3~`=Z1r7abezZg*uE#DP0)Z001H7LEPX+DxAhVh&Y&?cW?h?zBiIER5QBJ*o^)U-Aa6~?T3WDVQ}Y)4Z&!*eE;r$6Z@Zy~KI zaThTU{v&ii&@S3ILw^@RPdC||K5Ah{IO_$fWF$ctSfnmI!!Mi}7jjjBIa4cFP)}ouOCX;fKWqss|PfT$_QMhp*x#J~{w>PM>U4J<;0H{Ox!E@0z zMpxDtcR&!r`4Qs7S_>C9^!`-LnnyvMV$EKFs9OL^U{4vXEFm&j>`F+-ThUl|=^?E1 zloURE9zS~z`nU7)@GNnL?e}?^;X6wZ{--G`W-n>xY-DZZ;P79l7=@_hq_m`rlIY~r zf&`^F^`s2NjD&=wbi?89?9%M6{IvWvq$Q$j~V7L~PYW5e6a;07$r}o{h31#z$0P~{O73qkC$!Q(jEp(ar32Nw zEB+Z%?n_)Nb=ziV@|cGRN8wK%?!NJ`4b6~g^LK_r)S+6iaM`^kYb@Mno1gk)n#B>i z&<>=cl;Yz-Auz0_BlleDzwj_hz#^%ENQWgArg>|mXO!`(7)e0Xpg_ClNtbg`3sN%G z0qR5q=Flq(kVS^Oj@Lfxeb9|peL;BT%*D*)uK}FFVO$H3F zp!+tXTWj+x!I^hg(a}pHl8o~M zm)7j9C;wW+$6e-?_M79-?NOb2=H%v6eaqL%JkiD26 zxmM?(19PXbA1}JSvbVPF)?Auh%@=tf$Lgaj3ql2evyfiT{0asa)#H;hR?` zZsk|gmo_6;1c1Xt2W68oo%ZDw6E?2FR#oglE<_;IhG0U4uh;E3DIwCs1wtQwjgXfR zkGPd}TD1T9Z(nrzPZ8nrw>K3c{f{3+|MM3WvbVSSi`n)!EFwe0LIFVy{qwSFSR^CE zzL`u?ki&7E0?XO?c8Kwa`AWS1?tI+wzBawp zk>VAwG?#+0zSU_kl~HO|=qR8v#hm`uXpZJ_$Hc~3>_C(UsFlb1xURNJO3g)KX~U6a zzkg6~+A(Nutdf|IoWtX{<%9nHqx;dwn5uy{R`wF0_I9$4^W%7y!*MT-T6@F0)|_XQ zb?PeNrR^~fYi3qzLBhhl34STJBv79`gPQl41`je2ldBfxi1ekv%EMUm*KFjCj585@ zuvy6rydVPbjjq2XH&AHrCd$k!)o+V@_66y_bFzxf$ns0h^}3KRlD+vDEl)iHZ}7f-?l>?SW1|>sT~aylYiF zYc*Ii>gy=*6Bo@9AF{wEAk}wsudUCITt-}#y>aw0X%#(pljMMV;L)B zfJ^##u52Yrc)hkah(webPM+-Vua6FkAzdUeVk+_xzmC|s9KLP?iF~8jf&^>SS^^0b zRDVYQWB(G>_nVcEA2*vzo%kJJS(|C^yUWcv=74shsk7s&Ao z;nc^q#rSos1yFWGrzijA#Fz!~_H<-^h&Z%*(QKu%e7AnB;La!C&8G0D;{-N}G65py z2ujj6-7rSdva06o4^qpF*axw1w~Ax@yEWJ>de^w>LDf}%B6;zq+<_ztJ0{;~AVRj( z>ZTNMlBey%JCL)NfTx!}fn^|*Qwlb;5S9=c%Zr5f(AD8X*__Pk*UPYS)pb`HNi6i>{5W8;q)c#- zI}6=Q05EMv0}GXncjMcXN=O}|=NEk}#}{O)KEJ5p#W+X^>&3KU9wRkm z2@VE%nN0CSnL>+1J)mus~v3@601wKrjD|yF23si@3zQq0Uu>qsvu= z>_iP#5VEKveQv*!a5q%R4^DKUbL@+u1WS235SB@-k*hD<`=0&DRb@SkjVoA@N*|g% z;%WOvB6CSVe_w+KLdC8hkk$RWQ7Ju49`fN-u@}XwP*fIana$9g*A{;V4Nfjg$sU|HstFaDjQZ2ZiMz8wWhwm1 zq*-^Y8tC@GovPj_4mxkFbk;<2FubZZsATF>wxQ7t=oN`>ciOY&q;$C7w5!!~S5hjz zVsAI3h?`Rsr5*5rdEU>^E!C2njI$lWtj?8ELRAXjVRxX1iOO6{N=vEXu`D?>yV>Xi z!3^WiuB#b_|D?PV%c1Pj(MikoX#m$pS%Sw6iLL3bBvB=L>nMyeub7imlKyRCFY%1; zdHH2L%3ZxRZtB8r-GlC6jsg?23`IIM%A&D3v8H9OqMT&)i<6?1df|*hE?F9#k;zCO z(^0@$<5D81WothnKU161*EtPpT~sc-z#P@Wyi%Drgx(y{;qOavq-3~x4AI^v##9m& zb2971w8L&->4mUP{1fJIaX6L{h6lp4tC2~XdO$r8#+P*r6SILy%I3T3RI#J$vdG`O zqi#sNWtPXk-9o;la{9@Z9kmQ^^Bl`NSm(%3D7TgYU3YJC!Q8KUJ!dxNaAl?8C(79I)Mu~ zHZ=GC=GqY|p~WpEk|Q&gyA$irV>YDHroG2QiqFZW&XrE-049hl?F1|}b_--esEr># zgACIkFENx+lR}K5_Bg;vV=b`V$&fvI6gYK&u-roCZ++Xo&J?U~h}fOW-IL%mf!)2kfGJK#osLR_Z;csQ8(6 z1h#sw@~R!Cyz4REeFL>3cn=A*3dN=jH;nxU@(V>EU0LKCM>Sl#U^iEPlwi_SEg5LQiC$Zztq21_+1rUGt3q+!7-H@)gmk>v>HZLm$ za41JHDC*k1!gCI#NP_{LTjJ!w(m7_dg2}Y~gjdZySeq0>d?fCErU&-N)X?vaD>=zw zgyzlD(bt=HT0s6mC0dB>sAPx7CUaoETOPf1V6}4yJhLA7U1U(5+Uk|}*-Ji@SDxGa zK{3kCUB0}l7q;d${jS7 zx$XGX`x)*8;njh*|X%vLcI|4-)G`QBw&{GLDz9Tki8g*^31xdsowBRb z^Ru|ukOasP7Slu?;w!-v1rh8ieuGuH>vaqaRqpXT9`&RLmQI;^X`Ql<=?|G4mMq|^&Bf9|Nm+4j1;<=mDykSlS)s!B> z#W`DldW(TP_FtF5W^Gr32N*lFm=FqqS5Wmr%&1QlZ?BCVf1NZ(O5^sg_1i~)V7y^N zam>DpmhHA6y=qnY!q39&Z?d&WxfSYb0;T?8xuCo~X0bHTy3sX3*4+qq23M+YdF$Ie zh&gf<=xbStae2;KXJ`%ST2YwmiBp%|&u76GeKq=XIk8FACwf!0;@$+u?Gns$Jdo0k zBGC82^B7$y@Bx^YgX3YdA+57}_4Z|EyZANMGL0qu13T~Q5{GSS6H4o`GVki^ymIu* zM9;9^1u;|ntHG9mYjwk;?5maC_6@{y2P2>_r>+2E_Oq-jIeDj>z+?)DCO_sABd6{Y z>4Gu6@YX{r>Tq7wklSg~Xd%;bXKTx1Z!$2WXjlnggo3MWIE01^CnR z@atazHX~DBDa4vo|(4IA4lbiyB9(^A*t3;boTsO1#Z+Wq}0e z9i;P(z_awyi@qnPzkv|ujpOK#S7*o5%G>^v3QyM$+OTjOdT!8dfpt0Byl&8K_{-Xr zZJIwn>2YdaSbZrkOPa@Bvr=W2cNCEH2B#DSQJWM6(Rftg3>cLn>8#68O~y-p>#obe znba#1qPi#%qTP|pN5UW?5*AAgo-V%LD)aMGCQw`rO^8>jZ#L|;8Bd056s&qPdC%2W zqqx8T}y7H?shv#!YZU^rNnBwoi* ze&nW$V3OdMF`n|&AB-?2!_lEwQQj<-EgU^Qls7gQh^2M@k|cT!v{dR9WVLThxV3i+ zxjh+06kohp{cKcfv9Lx7lMCE`tqcsRrcmpvL==B<+?V9@Pqm+ZsSDOltXx^B?Wpgh;`JHM+z;=X9D zWqGOz05%vak`>j7_Hg@mz#g_az*mX3+*H-WPzA zsEDZt*woJp!gbip_`R&b@;x3Q_iIcTJ=7NJ5|`Nk`F_*9WB>l z=iAUh;H(}LtS_+9IfE$aS8(+gQezGwqY79rgMlU?uJ+w_6B@r~HG1A^x~5l~MEoi5Mo z29ejDD;}cgZ8$jo-FT*;T7FB5pU=VGLAUkQfKZ2sL zM@k>hl3BX1PFdcb=De~t$Kl?d*0Qn!t)*{&=Bu-*kG;93^Qpm4rMR-2SW4jdItrT3 z)DzGb8g#<$=V#0e57-?E&MF8@4ZWQ1(bWo~W8;+0ju~p%DI?~s_~--})US4_-Sl#*&>m`0wInvR8@ z=~wvie}Q6%T zc7}A0aIu53bAk?gdT_CO2m>*np)IDJ|Hb~ZJUg4TjnT_xT4Q&&p<2_FFLSLWL-92&Chj zyH8v=gH~w02(Zs_#eQ5RKzimKs1dl#x-xZMJ?7)b?~+~7nK&g{k`{+6GgCyj2bSK>Y8~38aMKnwLf88gCNJ(K0`Il@76$De&jyN z3ce|n{Aa?$_h+fy8x1x*<1Tz#u$%reI&_~1Wh2xeH%eFUG}wytYj^;&{LpjrQ-GfH zT@%qFl}J)IF-p1Jd68ZNqLHDn2yLGCehzrsp|Mtpq|2SoDw(_t6=*{qzSrlJ`V}~{ zpExMFaGci(O()4dC0DRp#QgrQe%EYI^7b`W)n15G~42=D-!xBFrJ_Yr&6vFEx zf=+?uiIs0tn{^slys46GE=G+Cp8EXO7Hb6vq%=SEd2Bj-v%jQeeBR%0vAW^y9v|NpQg<)YDAS5DM8K6QZ{MXm;sH|N!m2sERH@5Z*FdQRx*SR1uSBlu1jmw$z|yQ%KGbUQ)Ten2<_I8@81Y z_Ene}RhhLlq_3j5<}TAh73nitMWg+IsFZ7JzQU2+?J{m_Y?_Qcm2>bAsgP}bnk)p) zGip0T*KQkuW9TH2uWJ`Kam|So--{?umG%_@4p%(^SO~jR$I&WBplVq+Ws$NNJAB{s zNx#FC?jhC5&i7a1)D!(ek?;AHN!}b`0&cAv*fk3tOk0lYrx(2J6kiWtIA>dOD=K_p zp6%!==-Y2y;Gyg`WZGcg!M*IHI4bd&R-?Y6nhg~**9d`OkdDMl-$Mk%GgO~g-9`PEHbdZW5XTEB%hXanp3H z%r4g)#nG8HD8wS->IeHAQ(|~TOanVv$ivUx(Hk0v($6Vb4id&PBpx3_ApP=jjdDdA zXvSj^Ouo@)*)0R{9JT@zyZI$VwICz~xsBf(BN_W1zWc294z9-o2PQ-V%N25N5zq^Y zs1p;mH4Mw12epPW2}_X`kf9A#G3P5uFFX-a;vG^LUQTo5{crmC8J~{q?C&g;`oB-( zzw4caZS1Y|9RHq)Iuf@edcOnh){{#55SfHaRa*FccG9B6uxS9-2+$X=|G6KhqUCY#rkN`XV7H^Gb8!K0HDD)*W&8MyV1@@NG>L+9oW3(SOKy@eKNH( zJ=dJOLXkq*0CMli9qrox;n|p}&Dq8js*Ui8AxXV4yNoxb$2%@kG&w3)zn2V<5ECiN z?ck`|3s-NSI4-K(+8=VSF68DVL!+Anb+96N!{aBI@CS6Lu9jA`#>UL{$wvc|8dt`Z z%jMdMBzxxg^bX~rKzoQrsNXd>YHk1?Rg@oX52!GT{y7L;7yO`)&Z!Nqd0(z9Zab_f zvXL2as*izu+80hgj?{}_3rC82XBuK>Q77voVtfT|6N#o- z8A%vvY7F9cy})-s|GM2!ACAC=`R-7HPx!x9;QqT_^j9+d?V05d&!b^O^~t-dme8uMP%JrrqZe3BrB$xcNn`1!0xY6X2tJHlYB4E3?N7fk2V4Z$ zemqeBT!mkJaEE_F@JYAXNLZ}cbGvblmbN-rjyk)pFk(7Aru2UNKGOwry{VOd2hi4z zG(p-!k*ERa>fagDbPys70>td>buZ}Mq15?ytL%*%ucE*lXcylx4N7`HVnI}<>ngE@ zyfY6nNZpcGooE-{VLfa@iZ;KTB;QPoHE2H*x)r=3`diGKO&_Ta~uN5qjJ~8$FOFP2w!K6qA5QP}C*eMP?D9*BO~@yi2Y*T1fid0eq=0(%4N~FHH#g*#;@I zAHV1wChijj$&R(YZ#{pNC?-7a#01*OnsUd|L-8a}b~7nI&k0vNpg+ z#g+a0Ss8d!%`kLlp)JP<5xxHs(xq-3TzgJ+h>-9#Ob~~f;jb@6Mih9ooa z1=T6v|0MTvQPTT2AwAZ7Khlc);v+SKB7#pfr9|g14s*O*pP8OnYcV-W?hK~F%Fu$+ z;_`4gHv@fmygY|`vRr9F?3qKi;6o+m(YTNa2E;rWGLoM~wh9|u6oS*7v8~_00Rv&M z^Xc6R&$jwwsKJRXk#?T2jVg8^gg$}FZ~K#(-BDiAg(YKhew`o7y}N~@xsi6KavZYehS@l%{meH7qZ z;9VibDAYi9N|!E)rzobRK-jp7GxF<$%*Wfv`8{exH$v<83?NX;!S&Eys%^Dy(z}#W z(p6Qw6C??2DafgM--xmg`Sf_wXYo6x-Yu^eeTHO^Izv6ch%F_%>&abfXdob-`l=rh z7L)9fC`E>7KfE(L0`S8AVDbjn>>z6Iv%get#b;rx683AKBS-`178Eh^lo=+(i+^8V`g{Sn;Zbr2>Zc)r)t`*9`uAMF)O#EE;7MLqbm;@* zht6cpkvE=BTPIF9h`@L;Yq>AH*4hb&H!BPjcG!g=^!tGVYBi zM^5`Dg;M;mSf1aLOgnNh=T-X@e^ltM%M815z{DCdB&=iJJRq2YOMtB8$+2J_a5~@l zfCMfa^KMJcU&~CRmKwkD9twq>L0YcR-Z;_X5gCH2V;jODJOrx*JrueB=GwFRe5JKlKUkPeYjTM+hWZ1 zgKn^K>#J5<+J$s8=%7Do3IQ6>IQ0dLMT(^8<5vMJGzd0@LpF~}yk+Q6cjXq~R-K$7 z0Xc@`a1suAel61;Ib8E!=A#o%x^=xXillH*1+RB9&p2xzK8LYs1h4Y?P)OH<8zgPCzX zM;%$jhf$nJ;Q90wHM*qq&l9vxx>;-RVBT*lfK(1(B7k({Q2F*Wif96)4b;iQ9e0K8 zRh+OE5x>af@Dn42OjRdp_Os{gJvrRhh1?uhCdRfB{E}CYIf>bGUlgX8*sRAyu$q|L z3s-Iyk&0h*2vXIvE4cI@tt{Hg$fjwf=ML94zJ+IX#8J)Ox_J;zuIoB00!pUHfIdcB zf-T+<#7TY5npZK>jZqnLpbG8R&nnhX+Czq zMx$IC3N@<2ovL0Yj+R?%LB4u{yCe6l`D-#bXc*k%D4uce&M;2O8c#Xi+fe76Nw4V0 zCzmJTmm4)LWh@IdZX8L75{1jifj|v$a~zY$rpuc%bq#ncOKTf-PG%b+BNxKX&d!!L zSH~BJiOf|^MFt`$OC2;MQQm4UGA>)-trI}4kRfNQCr4gIPILF-@f#W*?5~fH_Jisr zWNWJnOPe(vZ}YHFfhf4|IlyYONeHj-VvkOa))p7bMnk2wWNr+c4Nmn~=4waI9D?N8 z(nkkT32$1DJzAC7(h>|<((08okN7cT4{Lm4s zl!w)Uee%#_tdvL9{(a)mWvtI^<%h7_u=}vP)5AGo0t_LvAxxO+tb(ld_M!HncA*Zc zV|YDyBX|QjQ34zxPMC`hq7JNKeZbHdZ0X}Wh|p-ze^?!Dm&bDw`bsccSuJ;}llsgs zTiMbl^)Ny%Fr96Wcd8TmsG-}~?(LWRa$rQJZ_qpePF`kOyi8y+%61x@+=>_)U+ya> zx!FDL?yi(|J%%#5Bp^1fdelx_2p~2_S|63_dLod1RJ$n=;V}Hz6&;gH&ZDBBDx(}y zjczD!#57^swD&&{977)yOHQCFQk8Bbn7WKnZgwQfAG=Uk{AvyV7X z9-E_VqmpS_H*VRm4>5{4kRH=YZlm&`dQyF)>)AP?@vYn?VReH`yzWDVj z`Pq(;{?_9FfwsFc8-Lb5|B3nj+lmJUlZ?u#E&o z;kFFI)H7>vYWc=1ef2fe$t56MlBa#WF4z5hL6)h*eG=ZL;7OXaR0%?y)Q#4rz|+|ooThim#7DDL+!)~W)uZQ+v&^;YrGM?3 zZs@YC&0=tvS(Zw<<~Y@;dWot~jf`dUGN=+Ev%F;@H90aCm3m1;l4;U0YK3FtgX)dB zR&L$IP*}`T0sES_|FfW%KQ&wxTvq;=W687O4Vil=H=k$eGb5K`O4w5P(utmXsB6cw zW5t+@AL4kdKZ29n3w5G@s{C~J#;sN~;&{CON^7pCinGz7XpbgW`}ZB&p;(V6*WaEA zA&d6#bJc#|rA6fH)?gn{!|9NBO2#;+L{!1*lu&Fa?RwuVw2nfBf(!__N3M}>5^k0c zwd&n4?NYU_Muj$oi#)Kh5M!h0lnu3k-Q>H9%h;~04sPIf%Do$M zjc^HZ5_F2mICJ!~M7W%iU6$->?P}aBx|BVe?QXcId9*$=-(0jVZs2VabSf;hwDr40 zJe|6`#JFZXYjbUI3A{_*)ZIh6WIc=Y^OVXsP9gJ%yc@U|dQ?8U?cyv!U6S-qp?u|M z9(aqt1Kh}*tz4S)KSk&iA2nwoeWgDOxmUiq-9!w~%-pR@4A3Ba`F~UPs6T~nXik7G zQwFMFd9qPjb>O<>-^<+N-k5HxB6JE++O}Z73ZEC;!``TFEc&}DQq;SY-`P9HJG9@k zpIz?lpMY;L25e?2)~~|1D7_=JPd3S|`)%gR*4GBEV7nCFHro2Hka_Y|+MYtUC_cHc zY_AY_C_lZh9IsG(c;ET3?0s-QW1st4XFhVC33hpAr7q!aLjs`fqOrSxK`x6;ubN0j zwunI?i=C_*PerysqLR%CT|=osFPJ6oCs1Ih+9-G?36v}mR>ra+VuUU5g)Qj;1u0SJ z1w5K?g6|$iG&cYoOfomxJ#471Fk=dkqy$%NOPSN(%?i+QOad!SD=R?CK$}Y2->ujy z3)m2-2Yd>)+6~Fy;+Ohsshg5N$d4^>2lx<97*&-Q)l3&oFVU|ca0XZzmK^FCObOUO zkPbKv)Bvg+PZ7hED3Sq|B$6eTP?Gk$?|><;R54w39PJ2iFzrgWaW5jER$vLRG=U^T zb(E|{c8IKrE=$fPFOFWT9|ITzq-UUQuAc)a15~<*DXlHHUa}tqXdTo!$vE9LTdyV{ z3c?}Ux3lk7HwqX8q$Z!L>9%+;KA;W>CG)jZFFfE9Y%+Rta`kvOU#~qN3%oLFb87Xh zFJ3vlEl7{ewso&L;1fImFf@WcFg9)=B&VP$<27i`NOxYKF<=ZrFK{MdIo&m5&OkRq zV5nbSpfcbTd@gV%Nk3$}XefqjSoLBzMPQ&G4_rL(r?@DZYtppwHWYuG9}CzSWV@8A z%{CVQDlV)v{V|>;t*YR%X?37&Z4Z4f8Sn|}X(S(u8^(4;3ysJt@mVa*pPc&{M�L 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.servlet javax.servlet-api - + + com.arcsoft.face + arcsoft-sdk-face + 3.0.0.0 + system + ${basedir}/libs/arcsoft-sdk-face-3.0.0.0.jar + - + + + + org.springframework.boot + spring-boot-maven-plugin + + + true + + + + \ No newline at end of file diff --git a/yq-common/src/main/java/yq/common/arcsoft/FaceEngineTest.java b/yq-common/src/main/java/yq/common/arcsoft/FaceEngineTest.java new file mode 100644 index 0000000..980fab8 --- /dev/null +++ b/yq-common/src/main/java/yq/common/arcsoft/FaceEngineTest.java @@ -0,0 +1,107 @@ +package yq.common.arcsoft; + + +import com.arcsoft.face.*; +import com.arcsoft.face.enums.DetectMode; +import com.arcsoft.face.enums.DetectOrient; +import com.arcsoft.face.enums.ErrorInfo; +import com.arcsoft.face.toolkit.ImageInfo; +import yq.common.utils.FaceEnginUtil; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import static com.arcsoft.face.toolkit.ImageFactory.getRGBData; + + +public class FaceEngineTest { + + + public static void main(String[] args) { + + // //从官网获取 + // String appId = "7MtFQZ9S9Ue2UC7koYxJbeL5iEHhqGtp3d5SJbJ4ou92"; + // String sdkKey = "4VM5rVL8eKmmELhRi8ZoopH33GzsgPoptA94zSXyHvzz"; + // + // + // FaceEngine faceEngine = new FaceEngine("E:\\arcsoft_lib\\LINUX64"); + // //激活引擎 + // int errorCode = faceEngine.activeOnline(appId, sdkKey); + // + // if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { + // System.out.println("引擎激活失败"); + // } + // + // + // ActiveFileInfo activeFileInfo=new ActiveFileInfo(); + // errorCode = faceEngine.getActiveFileInfo(activeFileInfo); + // if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { + // System.out.println("获取激活文件信息失败"); + // } + // + // //引擎配置 + // EngineConfiguration engineConfiguration = new EngineConfiguration(); + // engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE); + // engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT); + // engineConfiguration.setDetectFaceMaxNum(10); + // engineConfiguration.setDetectFaceScaleVal(16); + // //功能配置 + // FunctionConfiguration functionConfiguration = new FunctionConfiguration(); + // functionConfiguration.setSupportAge(true); + // functionConfiguration.setSupportFace3dAngle(true); + // functionConfiguration.setSupportFaceDetect(true); + // functionConfiguration.setSupportFaceRecognition(true); + // functionConfiguration.setSupportGender(true); + // functionConfiguration.setSupportLiveness(true); + // functionConfiguration.setSupportIRLiveness(true); + // engineConfiguration.setFunctionConfiguration(functionConfiguration); + // + // + // //初始化引擎 + // errorCode = faceEngine.init(engineConfiguration); + // + // if (errorCode != ErrorInfo.MOK.getValue()) { + // System.out.println("初始化引擎失败"); + // } + // + // + // //人脸检测 + // ImageInfo imageInfo = getRGBData(new File("E:\\dog\\dog1.jpg")); + // List faceInfoList = new ArrayList(); + // errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList); + // System.out.println(faceInfoList); + // + // //特征提取 + // FaceFeature faceFeature = new FaceFeature(); + // errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature); + // System.out.println("特征值大小:" + faceFeature.getFeatureData().length); + // + // //人脸检测2 + // ImageInfo imageInfo2 = getRGBData(new File("E:\\dog\\dog2.jpg")); + // List faceInfoList2 = new ArrayList(); + // errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo2.getImageFormat(), faceInfoList2); + // System.out.println(faceInfoList2); + // + // //特征提取2 + // FaceFeature faceFeature2 = new FaceFeature(); + // errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo2.getImageFormat(), faceInfoList2.get(0), faceFeature2); + // System.out.println("特征值大小:" + faceFeature2.getFeatureData().length); + // + // //特征比对 + // FaceFeature targetFaceFeature = new FaceFeature(); + // targetFaceFeature.setFeatureData(faceFeature.getFeatureData()); + // FaceFeature sourceFaceFeature = new FaceFeature(); + // sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData()); + // FaceSimilar faceSimilar = new FaceSimilar(); + // + // errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar); + // + // System.out.println("相似度:" + faceSimilar.getScore()); + // + // + // //引擎卸载 + // errorCode = faceEngine.unInit(); + + } +} diff --git a/yq-common/src/main/java/yq/common/utils/FaceEnginUtil.java b/yq-common/src/main/java/yq/common/utils/FaceEnginUtil.java new file mode 100644 index 0000000..7533243 --- /dev/null +++ b/yq-common/src/main/java/yq/common/utils/FaceEnginUtil.java @@ -0,0 +1,157 @@ +package yq.common.utils; + + +import cn.hutool.core.collection.CollectionUtil; +import com.arcsoft.face.*; +import com.arcsoft.face.enums.DetectMode; +import com.arcsoft.face.enums.DetectOrient; +import com.arcsoft.face.enums.ErrorInfo; +import com.arcsoft.face.enums.ImageFormat; +import com.arcsoft.face.toolkit.ImageFactory; +import com.arcsoft.face.toolkit.ImageInfo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.multipart.MultipartFile; +import yq.common.exception.ServiceException; +import yq.common.utils.file.ImageUtils; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + + +/** + * minio文件上传工具类 + * @author: jeecg-boot + */ +@Slf4j +public class FaceEnginUtil { + @Value(value = "${arcsoft.appId}") + private static String appId; + + @Value(value = "${arcsoft.sdkKey}") + private static String sdkKey; + + + @Value(value = "${arcsoft.faceEngine}") + private static String faceEngineUrl; + + + public static FaceEngine init() { + FaceEngine faceEngine = new FaceEngine(faceEngineUrl); + //激活引擎 + int errorCode = faceEngine.activeOnline(appId, sdkKey); + + if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { + System.out.println("引擎激活失败"); + } + + + ActiveFileInfo activeFileInfo=new ActiveFileInfo(); + errorCode = faceEngine.getActiveFileInfo(activeFileInfo); + if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { + System.out.println("获取激活文件信息失败"); + } + + //引擎配置 + EngineConfiguration engineConfiguration = new EngineConfiguration(); + engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE); + engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT); + engineConfiguration.setDetectFaceMaxNum(10); + engineConfiguration.setDetectFaceScaleVal(16); + //功能配置 + FunctionConfiguration functionConfiguration = new FunctionConfiguration(); + functionConfiguration.setSupportAge(true); + functionConfiguration.setSupportFace3dAngle(true); + functionConfiguration.setSupportFaceDetect(true); + functionConfiguration.setSupportFaceRecognition(true); + functionConfiguration.setSupportGender(true); + functionConfiguration.setSupportLiveness(true); + functionConfiguration.setSupportIRLiveness(true); + engineConfiguration.setFunctionConfiguration(functionConfiguration); + + + //初始化引擎 + errorCode = faceEngine.init(engineConfiguration); + + if (errorCode != ErrorInfo.MOK.getValue()) { + System.out.println("初始化引擎失败"); + } + return faceEngine; + } + + /** + * 录入人脸接口存入byte数组特征值 + * @param file + * @return + */ + public static byte[] uploadInput(MultipartFile file) { + FaceEngine faceEngine = FaceEnginUtil.init(); + InputStream inputstream = null; + ImageInfo imageInfo = null; + try { + inputstream = file.getInputStream(); + imageInfo = ImageFactory.getRGBData(inputstream); + if (inputstream != null) { + inputstream.close(); + } + } catch (IOException e) { + throw new ServiceException("文件非图像类型"); + } + + List faceInfoList = new ArrayList(); + faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList); + //特征提取 + FaceFeature faceFeature = new FaceFeature(); + faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature); + byte[] featureData = faceFeature.getFeatureData(); + FaceEnginUtil.close(faceEngine); + return featureData; + } + + /** + * 人脸匹配 + * @param file 人脸数据 + * @param faceFeature1 数据库人脸存根 + * @return float 数据判断大于0.7以上 + */ + public static float uploadContrast(MultipartFile file,Byte[] faceFeature1) { + FaceEngine faceEngine = FaceEnginUtil.init(); + InputStream inputstream = null; + ImageInfo imageInfo = null; + try { + inputstream = file.getInputStream(); + imageInfo = ImageFactory.getRGBData(inputstream); + if (inputstream != null) { + inputstream.close(); + } + } catch (IOException e) { + throw new ServiceException("文件非图像类型"); + } + + List faceInfoList = new ArrayList(); + faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList); + //特征提取 + FaceFeature faceFeature = new FaceFeature(); + faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature); + byte[] featureData = faceFeature.getFeatureData(); + //特征比对 + FaceFeature targetFaceFeature = new FaceFeature(); + targetFaceFeature.setFeatureData(featureData); + FaceFeature sourceFaceFeature = new FaceFeature(); + sourceFaceFeature.setFeatureData(faceFeature.getFeatureData()); + FaceSimilar faceSimilar = new FaceSimilar(); + faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar); + FaceEnginUtil.close(faceEngine); + return faceSimilar.getScore(); + } + + public static void close(FaceEngine faceEngine) { + faceEngine.unInit(); + } + + +}