From 4b12811ed5883d40d39473ffb0ceb645943ff7ba Mon Sep 17 00:00:00 2001 From: DMGithubPublisher Date: Thu, 23 Oct 2025 16:18:38 +0800 Subject: [PATCH 1/6] update to internal commit d4f2d79c --- .../api-reference/barcode-scanner.md | 2 +- .../api-reference/enum-localization-mode.md | 30 ++++--- .../javascript/assets/return-button.png | Bin 0 -> 51074 bytes .../javascript/faq/adaptive-wasm-loading.md | 80 ++++++++++++++++++ programming/javascript/index.md | 34 ++++---- programming/javascript/release-notes/index.md | 1 + programming/javascript/release-notes/js-11.md | 63 ++++++++++++++ .../javascript/upgrade-guide/10to11.md | 2 +- .../user-guide/assets/updateBarcodeFormat.png | Bin 4951 -> 5524 bytes .../barcode-scanner-customization.md | 22 ++--- .../javascript/user-guide/barcode-scanner.md | 48 +++++------ programming/javascript/user-guide/index.md | 66 +++++++-------- .../javascript/user-guide/use-in-framework.md | 20 ++--- 13 files changed, 257 insertions(+), 111 deletions(-) create mode 100644 programming/javascript/assets/return-button.png create mode 100644 programming/javascript/faq/adaptive-wasm-loading.md diff --git a/programming/javascript/api-reference/barcode-scanner.md b/programming/javascript/api-reference/barcode-scanner.md index f2eeb7d6..33b53851 100644 --- a/programming/javascript/api-reference/barcode-scanner.md +++ b/programming/javascript/api-reference/barcode-scanner.md @@ -178,7 +178,7 @@ interface BarcodeScannerConfig { // engineResourcePaths typically is only assigned when using a framework like React/Angular/Vue where the resources are not in the same location as the script reference. engineResourcePaths: {rootDirectory:"https://cdn.jsdelivr.net/npm/"}, // path to the UI file - uiPath: "https://cdn.jsdelivr.net/npm/dynamsoft-barcode-reader-bundle@11.0.6000/dist/ui/barcode-scanner.ui.xml", + uiPath: "https://cdn.jsdelivr.net/npm/dynamsoft-barcode-reader-bundle@11.2.2000/dist/ui/barcode-scanner.ui.xml", barcodeFormats: [Dynamsoft.DBR.EnumBarcodeFormat.BF_QR_CODE , Dynamsoft.DBR.EnumBarcodeFormat.BF_CODE_128], showPoweredByDynamsoft: false, duplicateForgetTime: 3000, diff --git a/programming/javascript/api-reference/enum-localization-mode.md b/programming/javascript/api-reference/enum-localization-mode.md index 7143201e..b5f76d81 100644 --- a/programming/javascript/api-reference/enum-localization-mode.md +++ b/programming/javascript/api-reference/enum-localization-mode.md @@ -20,29 +20,31 @@ codeAutoHeight: true > ```javascript enum EnumLocalizationMode { - /** Omits the localization process entirely. */ - LM_SKIP = 0x00, /** Automatic localization mode selection; not yet implemented. */ - LM_AUTO = 0x01, + LM_AUTO = 1, /** Identifies barcodes by finding connected blocks, offering optimal results, especially recommended for highest priority in most scenarios. */ - LM_CONNECTED_BLOCKS = 0x02, + LM_CONNECTED_BLOCKS = 2, /** Detects barcodes through analysis of patterns of contiguous black and white regions, tailored for QR Codes and DataMatrix codes. */ - LM_STATISTICS = 0x04, + LM_STATISTICS = 4, /** Locates barcodes by identifying linear patterns, designed primarily for 1D barcodes and PDF417 codes. */ - LM_LINES = 0x08, + LM_LINES = 8, /** Provides rapid barcode localization, suited for interactive applications where speed is crucial. */ - LM_SCAN_DIRECTLY = 0x10, + LM_SCAN_DIRECTLY = 16, /** Targets barcode localization through detection of specific mark groups, optimized for Direct Part Marking (DPM) codes. */ - LM_STATISTICS_MARKS = 0x20, + LM_STATISTICS_MARKS = 32, /** Combines methods of locating connected blocks and linear patterns to efficiently localize postal codes. */ - LM_STATISTICS_POSTAL_CODE = 0x40, + LM_STATISTICS_POSTAL_CODE = 64, /** Initiates barcode localization from the image center, facilitating faster detection in certain layouts. */ - LM_CENTRE = 0x80, + LM_CENTRE = 128, /** Specialized for quick localization of 1D barcodes, enhancing performance in fast-scan scenarios. */ - LM_ONED_FAST_SCAN = 0x100, - /** Placeholder value with no functional meaning. */ - LM_END=0xFFFFFFFF, + LM_ONED_FAST_SCAN = 256, + /**Localizes barcodes by utilizing a neural network model. Introduced in Dynamsoft Barcode Reader Bundle version 11.2.2000. */ + LM_NEURAL_NETWORK = 512, /** Reserved for future use in localization mode settings. */ - LM_REV = -2147483648 + LM_REV = -2147483648, + /** Omits the localization process entirely. */ + LM_SKIP = 0, + /** Placeholder value with no functional meaning. */ + LM_END = -1 } ``` \ No newline at end of file diff --git a/programming/javascript/assets/return-button.png b/programming/javascript/assets/return-button.png new file mode 100644 index 0000000000000000000000000000000000000000..27d75ca2b17f83fae52c7e36fbe35846a6ab3996 GIT binary patch literal 51074 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%0D^734yDa@X1G*=H1MTI$8)_UNrxG$`1+j5hd~Z zDCv8q)<@L$`M!KNC5cd#h$wM-`4}NOb;yk~%d)gIrn6zn>P3kHtVUe_ne2m}Qq@$WdMq z%K?YHXf(8d9R>GOO_IIbiQfF({QJnBN8-Ef@AUmEE}J?loaiZwDtm5q9iZA)zoEjN zQAk_A1vJw#L;?vZ!x_W9{Ol*-S1g%519eXQA*S`!%nR+$(Ywp+W@tkvdBe-g>wt;Q z^>{tZW*g~oST{PaisRJOc?ak-lIuw;VViubJ45b|K7S;w&9Ol)XFfH+>8XoU#{k_o25H^Bs6mToSlU|{PZ5S*0LBD>q+26HC|E$fsuS_Qa3)Y;RT*Z4}xgX!J zOnUmzeCt~@nievaG?mXLWn#FdxlSiF0elU5WktNvT|BuZI3}%=Qdfk(Rhp>-QL&6vunUe)Gk74w5_h7tw|b9>$i>U$4kHRvW5i{jr*IUB~tVX*38`%KG3%M&8bJ7 zMma9sxw|2|o(6sSVe@`G7l57@iovC>W>2>5DQ8sLW2~kWjROal##;ms75U+Jm#=0@ zjLi>*w^T@3(6NRiA>m#7nR#UHM!9t>Pk2 zbY1dNeEMhSaR)r}VTq0YXo7U_HHLtu>B>oAPw)IG8d`!W9Sir2%lt8F89n5C4qveXPnI-JHHd@e zk_su>kIWn;Jh;-@(z41Z|G=RIyI!caSJBwc6;~Y9DMNr)1a#s(is!>gR4#0O@8h z!qLa(`%ej5FK77H6FD{Q_o+uf{@UbQ^o#BO+WR%JAkmy3)YmKZi;4m(_dPvj*!fN= zx7tl@kBV*ahYDhgin(^EdHYRS2^RaJw4!NP>s7|AR%_1HttEtCWqG0KvKy%3T<#EG z{M-mbWB;OI5@$o{zz#Q$MpM_UYVKI+j8$X>5>a(wP((9T2SJ&k)mq59W<2jl@d$eL z3SnR>*I9T)GSr%f<-Or+%}8h4TyGYcb%1wIAr@a`o+1|k40Vzve1NL7JDC}j^<#zZ z=QhKWa+X^3*@LEgF47&D2YT2hW6`1FBSD!656xZ1R8~UR6sMHr3U!-cwq1Wo-;xV; zoaVqbRe!K_bx*{eCeq(BaXiUD>h}b!-Az?G{rml{HzCa$a7r}UyZ$+rf!%1u*8D{@ zCQb`MHlw5NL0$|BoRZPV)+GMAUJ~K{!yQ-r>|*quvZKf~`Se2O#3BFaj?yYf`t;nX@KBTd zW68CaZ5!8kL|kc5!{+x3-Ta)KAP=Mm34Ytnq$*-lg!Z%y2lZpLc&ouI74ZhKRd zcB7KU{hODloe8W}1o)B^CzTj_nwm8nX)IXX&jUtzHS z;Ft%!)bv#6Upk@=s3*%^WV#ym8{VE;~8+J31usBIL|!Bd9MS3{xj^LbUfJYuL;8DGPl|TC_M` zBX|nLZz4^A7N1EXDzBN_r73`avcemHywWItVrL&i7^s%eIW)iev$axpadnwE9w`)^ zmiF=VgB&EDhR3e^)6(*CVtgOy%@``+cV(senBi=#kq^o$^lVGs(VHO`!sV*phLxF; z1$-&uH1)7iOYXFldfnq};w|l+%GZX?oKwQev(>|jdwOS;xcMp5vvGEd3Uwfwe+xE( zVbY2laGTA9N?wclBR40{F6=fXD@(5NczS%et5!g+?ZS}}Rk6OIS?$jsp_G&qIiK4X z&!rKU!!g~Eh|M;QC`QX!!$(_G=(jnSW8OHAjV+Y@tStB*mE$p@!T;Eds+v}csQ;7C zX@)LjQxO`Waq^qSe-{i))Jm>ecVr;9Y zVIn2zbNa2}%KOFcVaq2`$>ug{D%v8*619q|YDs3J;v*;`pf2K=qQwDqZmmygzDGAU zY@%iD&e=nubLjf6aD#l;l`PxODTNs(g%iW1*%nM)8h_c;5=$U|%8_{g#c4GlpU75v zmTb$K!W+IhbF+tvwfl^cW%Ea#h_$0(0<=+-3fz!ncUsY&8LccBq|beCdF;A3(VZ*Xd`o})fkBuG&)8|9r|c4ZaBq1|L`y)RyYGOS|r$nHz1Hl%4#T{!Usnw z2j9?!`g%}-g}KpVN6*F3rVQw*O5>Ua`>Ff~&63YxEWa|Vsg=ZHVQ&+=N=$sJD1={> zojvTizS^d)*6)kxkB2&gHv;Mh;wv7^4NlwYg(R1hPxW{(+CuWc&ZpSR0Vn!WJW*J& zA@NbaMJ3c-CcKZ%#Jg2o=>&_8|=EV1d1iZ3?p z>W>nIpF%wij13E+WE!*abAF~LChds+sa>ZmjVpJ<&0tUA4|@vQA&|h9ydt2ILS$%^ zLR;g=z}R5Q!=tB3^Tlt+Z>`4(_Lbb)t`&AR-umR(?bO`;H}76;#9s;TcP_JFb#so8 z5QB}Q21#G7OEvn`E#8ByYw}5UHxh*P$k;h0h;Kvhu`GHDmc5Q8oA2`Ka=;F0c>(I~+uW;9()8-jrQ?=i_R`~p5!Y-0#w_%RWsEvrI&8Pe zZ9`VpLszh~SQ2{wGL?xLGb4!-w;Yp{= z{IQ1*^=@fSYn{h8SPd}~FK9|^Bn{Z6-W|#JO+!{F&Vjv8iH|4EE}T{5SwaiLRXryi zvm~UYmATdr$2(@?q_X3jey#8X*nX87DKi^2eH=hh1+IVBRvpZnSJD#gn36hGH%C*E zi#i$0-$BN{T(utOg~MLLV|pgSI1|-8J*M5SL#9m)yDieN3Um4mjg0Ea9fvUn zBF7?Ur$t`0HBQW&CLK7L6n>9{p2;^EAm-+(7umCwx!#;{Na#GK;vEj%cc^=62>1Rz z548}b(l>sF`f9yf(#_#iKg%!u@q_Z$rmtPo3VKfFITT?b%#VI!nhzR>ou+hs$Hm4u zD{Dh`8%x#J^-1P70n4R>v!9#dGgtJN&*<<8JB>i1^wr_>o{^b5U)tQ68TY5Ed#RDu zp9(C;(bJm&kxG~uPqF|03da&@CzWzDv$zOo{j>VIb3|@y(Bfm7Ir^W`2sUI=D?vH0 z^iJi$$+o19NOa>PRC7H#G}+GRSfHBt__U6-)7zm9fP+J`a^Ad=VS>y9qV=9Pl5SoY z*raL!4++mM)U*Ho_tX#W!OBuRIkRPNVBobqJ10)?UV1Q!-*Y=TS|glnY$-y4Ryv4% zm(E+vBq>`#87|4=)Z+TPI1e4$nNC`~N-r_vhe{bmQ%HR0JwqRDe?+NYe9oWcl5%bB ziVZIR%*72`lnc_ zNJV>Bf?p>DI>qZT-REdqsg3eXrCn#J2;DSKQX}>YpjmWVG3PY)?MhkcIjsivVg*$T z6W8#JoI>&AQ2qQoy4B{7+8XIR#(DSGbXsz++ZY?(7<%7X)qu9%53##&qWK>PupD4p zSvP6QbQOB6dU*z5+1op}-{XGq`N%HMTtw?6f}Rh7i&q2R$@bB-&-zC5Cz+RJ=_ONQ z5chyHObsq^dEM6{-FyNKqzZIk{-zh0n=z+piR3bkPR%bbY_(eN^XWz?yzf&O=bH`> z0JrK+pUmy$KEQ6gr{T4knW|?WSKTglTJP&!K2uMu++iCxd1rh<$rbfH;sxIDnb9d6 z28a7f>@gA)z~HI&uA&XbHPzq749qp%<5@3r68fJT@GBl)2}dUg{aWwsA+z2nU7wm; z_5Y6FBXbRFC^w5=H6#$+cl4X==EL5d4JoWFJJ9w-7z&Eb^4#VCJXY~m=6g&;w|cVq zzUST7i{7PGonf!9gtBe~Jj4F|gcp<$71}cngm1|!YbW~pA2%&5O7l*d)da~UjEe^z zA^x(Sx#m?0TCe<8&Fj4y*&ng1DQn$qqp*-yu{`~TZ_tWcm=w?43~NMi7Pgvk4q1g5 z5;t^eZND5P2w#b=UZvIRG$PgfN{H{IMx3BQI%q3l2c05ub?4vY6n51aC96u-G-zkJ z(nHVt9SHU}QZWyxvl3q7LF~Qyr$e@0j>Tcwc!DFi!{jF}e_))g2Tpr6mgV3bzhtqw zMlR$+a6X_$EV2Bh{K)G}gY;CL1Lnbz@_qQ~dE;-9?h$nes32>U^xmVWlKnvu$YW9U zpb}O$D~+WL>>z3?0YpZI*Tq}TVi4iW9#$lhxPSfGZ^Y&s$u?~Sa;>Z z-aUj>(AjtYMr=E>JH-t7J!Q-j2e{wC{d(FMPYVd);owT&gxaSh- z6`V5=&vb%vNM5Zj$exp2&FSi*zyYzUUgSV}U$ z6M?%f$2z`1wA5E*XWkuP&pF}utfd0pR(V>$z4H&4W4W!Q3wb*Jquz6eg}-I4qm~UT zyt2kdc!q96OAsx?hmap`=PM(6`)IB%x?;Vk)Z6r~!qTG0#AxaHg7=Q5*qS#Uo|q_oqtL_Pqc?kZ`X+Dn z6rgG+dfinuyP0y)hmH_7tyg`CFnkLj`F;wYS9Gkz#_6*4Ov}LF?%mOuiV4HpInh98 zGDCx1TSqIy7?!RLVxKTVdXS_^lf2IR_oA_y&0~ig^r07c@perwNWu}HB4WMy!g^m% zOwNWF`mn9@D{si2_s%_o1=$BLEA{Y)x|^snvmEWx1|K<$dDzbv5Bk&{t$+AaQP^7b zZaExHFL9)2vht#z*s9DOKVuY$-j9}B7lpVLZYmsLS13q@2ii~=D(HPDG->^k?$#QD zDk4e^H`lFEzx5HbpRcpzw6pb5caJ{$P!w@q@Hg6X&Eo#<;}~M}I?40%u%WWRAl37+ z$zUhE!orAVQz*Z{56SI{E~=CaLwc`B(k(JA1#4jsPY-A?Fo&lle4H7Tl}RAN_5A;0 z?=6Gk3ZHjDoIwYI>p)0=;1FbR7zi31LJ~YcaEIVNKnNZ*xJ$4=aJMi>a1z|z-E9x~ z{qNnnyIWgZb*uKnty_EuROOsGr|0dr`|aoHr?Fpz;Mwczr|)X46YCbVOPWbTX05X2 z((7VhHt0Ez4tv3)K<(Z)fPerhWFawuq=THOW6kOGIIr<7D^w`+g2wKd-3fy%W7^)H z<9!)IZ*oT5$XpU+%L9lqM013MjQL&An0a-Hu3JL&nw&$MFC9G&H|dp>htT#vU`Ho~ za5A9r)p3!>H?e%qf1xYA)?|!2_jF@S+jfR|Qb#=N5h1? zJm7ftQ;fBp+f@r_K4^3!YVIOAR$YDV`W2$lwW_LtbTZPRxRW87(o1nEaZt^~nRktp z^k_Q_A!{qP=4rgIBx~mP+xAVJ6$m>2UMIJ!>)H3h?>IeVDRJHKMVmiARz}zK7DAV` z=Jt{)J&teD2iVy9EJ-Zjrz4PMIxia7upLkBoK=FIw2HlWLum`R3M#-#R+%BoB?**Ji;&Jx2$NgAlq41dO4wTQFhmq z%_mW%?u>!I^0Y>@VCvt!HbjJlb;<^eT0X9?j)i@i^AO66|0O6t<8k4?iM(p`m?l5z z_#q3L5_~s4eXh$N^PTNx)v75f7JE%LpWRDY z);}cW7o@4#*fvS2jS%uSF1~rvE_2G@g$hf$;9voI1k~TWAzd@cJMqo;l5YC4_I~CQ zQDJe8RNpqur`)QIYRRnN^FKRg&M{a<_8k<{Ih}g-!r!m|9-$9?E@V!B+k2WSFZYJZ z8p)Z*=LLNo&K-oAn?G4yV-9hmmn?PewNg}){k|gr@0^S%fSiaC9xBOLC&!59I%jU@ z9p6zdt!k?lBz&=U^C8n0zxEd$*$*-n52F?0U$l-K!l-rjd#i%ETUoA-b1b4SV`-~I z^Vk1+I$z9t*8^SDUWviMh~~Xk0F-gi=);a4)Zq7E+u8k{nkvgg4Kz5p)rIg1ib==E zoBFqehPNoZ*rFJpnsXIVRxTlUf(ob82}XuZ-gLw1idjzuY~LnjtjEv0e{b5`A4CzF zUg-HdyIk40V(A%WdbHiI(4tTz?{IoZIF$0Y(fNX7s1p->c}eTiv=?`pm2PuMO^;;G zIz4uNiJZ1_U9gd8?(QOWs-fv6CDykvI@;lMR`z@1V-2czr!Aj7oCFkg_5GNNn9x0b zU3<1B2{<@oDS(=3oWEgZ^)}|v5udmGN*I}4-VVJ)T18pNDj|59{j{YI+sG$3FuQY5 z4N7&i+9mzP)Q->{K&s@YOKF&_d^d!#4mN4Op2V`EjfXln!Q77hIAo=V5940K>i8FN zuL$?{Y{!1@;ucsKqja!WZcP33VA?v(UP&Yfm;uVkTO;&e!ooABgNIGE_a)8Pb~Kf0b~!NbEJPTOV~arofK zGQeIRHaFIJVA@}pKVlOagtG6Aco;~D{|Z6Sz1IEtIVvJ=rgk=HwP$kG7`Dh=SnGn~ zM*Gpr8opn{%M+@brTF@pR8H)N%e5LU{;$6b0ttSwuMLz_f0C!W+nu&xT>NQL7VqHj8X^W3zNAw^Xp<>Guc z$@6BrC>N5h8|TCThY&S|^#yv{ZK0?PZs)(LZwm@bS##0lt5;<{}t213};YXu@dZP$?*Ivb?p*9^M4 znjPe#q)qvR;m^&tTt+YAbqwpUUpjCbJu*p@cb2YY?Vrlb8}67+$dyWS^ylf(nE@c| zFfw5MdUhqraglS;joOMm5Ytod*5mk|{i&7C9~-`J(H;$5`r5SMN6_WxK0yFYd!U4= z>#{x1Gik5_QRnMW``^yKv5{rY%s79?pFKe~ zL?iK$gk?BnxiRPKN_IhQi2brW@agrG@s}pA&;-&1pphz!2Yaqh#(-wIX1r=oc|G(< zP006%XYRYh1pDf;_>li1dybt92)fSwB!B=vPaM2iuWK!?5^HQ+Rl9Y*3lVqnX#3@~ zafG^0340gX82qDg$JxDvs7h+a`AIuGQzuUW#3NwZa-jZR;Ypt9YEN|-x?O+aUeL^! z*{Sww3WGFij6yN9shBn=oS=!cmd67XkT!WMZn$6R|8YyK5%jXTkYl8^WpZ{6-L0r_ zgsbX0>d~rqaC49vXD-4h?&t1*Jn3+!Oizl(s;aMESw`1QkE>Qubb84{Ui{rEO>NT5 zZiW@?xh2#?;^BW029o4p$;iQsN^g*FH?=9LJo+4&|KqTj_vfZ<_Z zd4>;eW^0Vf=uaEo2S_5PZ$X#b&T z0L^#20Ey@@mQnqhVCLWlqy`SMYY&8qnsWl@TRmm>?DRFBlz(C=-iI2ab*@r`0)~An zdDf>V^UEcw3*-Zx&6O?1bH2ZQwGDBc(BOBSCHh+@;n9|UW#L+f#HH+l!#`4J@uU5MWw?%1H?yW#>*%Thr3%YsF^dtT()Jq-p zQpC9rP%t;Q;WZoU_IQSW;$MrT7ip$)=LD zkJNuBYxmFbwkD!c#o9pyuP>mm`p{{wULcVH?u(?W90#sn2i7|_=pR1Qw1vh75cj-cFE9^UG-l^dd zh!uVK&r?r?mQ$}ioR90)oYH8YsHh0HwRYrL|3EiS_kK^KxS3^MsTi*mJDQIGyiHK4oqc+H9rM(u`_CLFyoTtsY zzZ4O9A}7$dMe6pg+;hiCgJ@T7OUyHG$#w4m3;81z0AHoz6<^>Tn#~jz0mCC#z}6$+_wcTA0cJ6rG!H$PYcY8doR@0Prdu?q#ymFFmKA73+2nstLWHl&nEX?vf zN)_$uG2ezv;G8LQ`jNLav%gQH$l2FcVSdW<1>5fL=;m)0_VQ)=W(JS>_5COW&BxeS z4c?b8r8HuRc*TVkO$F?Lyh6z482gE7Cv?SEmSfc?Ge3c}cV_TTjGK?$&sTIKL)HNeGTi|;D8^weY#oL!FkCmI4#f&VNCVRx>K`+4@j`l*yv*S|ALV}7^jmj8_ z_vDcTk>-ngL=7HS)N?i#2{quT$kCmNa%TGZX0c~62*`9)LstLVb6HRX`-Qo!QOw3R z!NkTk^;$zgfqVSWUi=Yi8ui}DemBn$SrhhZ>SNB;@O#(u0+z1&3Nr-u;XPxiC-?;k z>1yz6)HaEy1I60=HLYW+&I16Eqm%Oz0-?=4jmwR;I2zw=ay<~QVK)>hV4A~TIwIPb z^Jy}5miyUxuqJlzc`@@$8J9;zUpByVe0=c@I=kzfP2x`?W6eHA7vDK->k(_~r6rNt z@-HDJ+dEe7T0s|oQ(t>-9h(Az7ok1N7lZKx%Vjbe#GW}gI&7>NVGgmO-RVz>^euIH z*H%|Y*2Ojw-Btsa+8>bj?CeyfrO~KrtzUq3bPE-+vi3$$V{#@Mh0!>9h@=?jZ|V2S z*wu9}5stO44Lbf8{E3Buy~{kF-`Xt(_3B_M2Ck#{wTj!PZ$JtjImS70-`3_!iNoQm z&hC_RbIs1u#?}&n3oq9Ye=beluf>xCRpNE6XCX^(BMS5tH{Gt@E;}}h?v=*Bvn+8S z%L;VhKFVGC|#@``Q=7ncKQq*PC8z>5=%| ze1DCIsP2A|xSGWdetXAwtGY!p!hJN0aiN;i#4%f309}}S^$~t(96(O7n^Qi#DIpMn zdp>s9^V#jRv$NAngoSfHdG(Lqe5a_WsJ!=XeN^QJy#+Z#s;!}Uk~T>3>ql>!w6W9C z&t$%-wr~v05c334SiIx~^F>Wd{h zu)3$ke2DV&j1R6C?eCYIc{94sFttEqGUQ@t4mY*;@S6y&kvvbQ&5V-ij)d5bVrCJ) zB{@Am4=qvN*MBD{|32fjPx#L=nQlf4Oxk34JwN?^G*)?QV=U>EhLem4b1TygIhB47 zd-n^1gTA-#-sStZ8%-bD7Hj3K+za9fBfos@!ytvq3vFBUp`xZJII|gQqZVQ^vh`4y z?}yjO-!ynmS-BMBj~A`6#2x+^m8|#n_V)ML-J=3EX~?-WH`aHol!gRjyhAVu$;g<5 z;~piYBqf`|Tx>d6@>*LBBBT7F96RO)-Md{?V~y~m2lB+wmfdrc&Heot&wWCs3HnQ4 z7YAk9*VMGs1Zhjty}z408%rY@43lptR_5Xl>>9%i^po<`e$#X>4igN0<1Xvh%W+(j zsP*LSWi=Uhs>EI37G~2h?&Re~N^^4>P7%naq7`_XhQ6cUcPM9SWfK~V>9%kG5a}qk znzp1>`|$p&uddM<)*ODtY`Y8o(PUC;Dn56s*f2^tIX7cC!5|k5uj>FMk~k7`7r^)^ zFcZehPLkqYR5@?fWzc2}|5Cx4Xr)t>#m-uM zW0Hqzp49_xib@E2r5j)5ax5cad^4KAgN4b2*L{LmnTHa~bv3^96XqhWgXRZPA?~4=O{{B|qTET*P%wuqJ=sjtF)E6oQ^`qrio+oru%Q2$C`@uos%ik7i}T0lSAoeJbMLI> zOrokK=N#1fkq})BlM8|pv)L`85Ex zifw2c9X{X+pf;eRTx#9?^%Z43QLvCatJ|g_$fAE6{l;0^`U;Oq z3hQ@qUk`EE7V0qn{|xWq|B107-Y(4cPk-vd8_+LFs-NuG0&aF4|aw}EkiN=*KcJbRO9vol!{FB-Jyuc4H?S zLu=$R^BL<-|6~e-A;|x~2um&&6LpM?#4J{w4ADc&#RnnxMbNtk%?4Fa{JqoKWoKa2 z-LSoQz)C=r)Gy4Hs=7t{hkDwZqoPC3ULr5*a8-v4Y#e+r30W$~r3iF3N_Fe*=pOn| z0mb~s&9M8Wdyn)$nA{0AR8 zy+V7Wr5@k+x`!3{h}H)v6#s#xQM@^U?0d;#o$6M=&{6r;Ehv5gau9U_!7R|Cv8rno z=Z#3WY8dON*7g0?zJ;t*fVg)Oufn~PCBN5_@fE%I3jT?@cT?U188 zq$v2cLXArOaPN3);WuV7Tt!)KYOZ_OCDqhgvUrLeaUperUNGS%D$f2J>??AwR?|nx z5@GN$Xq#R0t$iJ=Gw{Tc7BHm!?u4Yh&@T&z9vnImO;6?if?<*O-4U z0C_;HTq;`Hd`vKHPsN*(z>1$gHPEEq;o#r^a(Jvu(21&ph1SI5;_u(hJw0`fw~>6W zPhZT{JB9G`^B30DC1K;>6y@eVi`ITHX!TJl*Kfv#Tln;ROHWs}v9WO!gF@x%>+7BG zu3h?uh7!H*9S@a8zkI<4xWOcurJkOiRh5-bw_-RsIaN$x9^*M40VRbvdu@WJ@o8!7 z2pSriCn3j&3u9vpOXgretM-|x*~gCfq6J?>lH8eD`i%Uw_VwOg7WWSa* zG`x2XGq%CJUhR&c8l_Dw7Hep1L|q#g7)a|0gCIqOrtiowiw-ulaooCD5lvhfFzO}RP1%6&v1*!#eNzb z5Z1-m{snzSgVbHS?f&7z(@dr+2v5!)0|P@gr0U(yM2%E8V9NLJ-+vVgo;7FahAdZG zr{;*9vUbNOj13RdIT0hwQB7p1r>%4C&oj?Ag_+R!o|3~i2Ge4ZBTxDhIs1|RIwx^a z76fVsdE8!d|3V=8+qw)@58JRB?XdRuM&v6m=URYRI{$Agi$l1Gq1699Z zINqQ`xQD&hS|7>PM3lh_lzg*C)qyMSJ1bH!@>Zt7CMn{3lz`p5oOn^XCWLD-86tyi zl#F2m?2+-tr#jNoaO%!UD_Znvf9NTAkW;VW*#oe99!uK!z9(0q0dsS6Gc8M;fDf25=M>90?V@lZb?bq^I~HsmgMeFdy4bJGk;s z4yOAOwG4zvQCl>b);-oOyL|-%hyuaJxw0+5ey&)bta66-POXMgYZGk)+Kr8kaBy%q zE}v(fMr~`$w(jzuCBWoqa68H-SAa)FMt;fa<~FGVqC{?>0M6X<+cW=99iO-BYrw_K z>~>yWx6CF?8BdHEAHlgqo&Z*o*Uu-KY|;R+w~NBe_z>H z>J0fxwnF{T&;U0^fwgmkkX?|-aV)EhX1T=(BP(MdHnJ)9;ru(Z$PUX8o~QW5)X`#* zBR+a(FM3y~9q1Tutpv>lljk`&Sks8H=!#oq|uxUf?n7}6GcgGg}7*; zA;?|gxFOrvs!xJ_;t4b%hjK=nnkwJH1ThIA>_l)2$||)`{B)t|$dwcUI|Yv_Jv=^O z9oxLz?(ns;Dkhhu&Y{gk)B^^sNC@&3r#Cc3zcL&q#N1?Ih8h4*+n{EK>Rsa4(RMv% zM7^buU0$x@T;eftgvx}xLB4SrGDwKOVd(DuE>aRiM~GxBiG@tt@}%q>GQDpX`?uUi z`w0@gVP4MGFy!+@r3)_0h&f=sRDNpX_#B5#r*Rv&eNCp*0H_`K@sEli0CGzn=Q0X< zfM-g7SV0&-*zqoSkdFb7EN4Iyh^kf6cjMreCN!|(C2%vY+aFo~K75G* z<~RRvzwmH#s?&O=b9!(;*P65NaJNt(ew`zpEq*s9o+tirB3>YV6)T=4e%mP?SLb^O zzW49BQfxg1mVlQn-0+ef_V2S{5)dv4x4w&v+gM-N!;$#CEWO{*-TlVHZN}-)!;Jv-4fyeu%~A>M1xA2JdT4*SW^0Os z>T9~AAom1>p8JaSL1D?@uGsf^@YLhtIJ^r1mI3_bYmgfs&p!U>4n`fVA3L4fT^8;` zfuBfE@dUBG6^niWUi0J1A#YiDG?INV7V^Pg#80&A&Q~9F$u7tFM=T_0S6@+F-{|=6 z*!6l|{O1+y{=Gsc94YPY(V8MBN{$-@9Hb#Umj)=0|GTq>P^`!JpTT?{4c0-yh^DLB z{WtR7=j`EDt3Hr9uHxYd9cSM#B;B@qhvRWI;x7ERyB-QWtS`iAt8IdZ$h}hbo}wRT z4eWR3r|#;$*;m{S43?2~3$|zs>@o14xc|8~;L+B=*JGdXAIto| zY);kXGN9+rpY!w>lH1clAS!}_g8t5WdV2oQG&dGvv;av&CVZr?zaOW|Y8nv*QM{s~ z@VdgW_#@E?{m@okTH1>iBb~Hm4nd&NoVzce-Q#f4A70!M zEg&fPP7I3LRwqSD%^-T*K3TYQN`yjt3DZ*`wUl!x38rr7d;l`5=hS=1T)lsgmS|v~ z!#;l|$O(XsW1*Hcbku*PHc^AAdS|8q5!&C$W}#TS90kMlG3e5gr{3Or2?iS}e_#kV z#%0S5@#?{OjJie0D51-cZek4FV@aP}O!+N02?&Go&8P~9t1cS6A}_Bf55CgG7>{!0 zqt`Ws(9n<|&=Ka1l&0{TF@J(Ms3D;Ga$XdfAsa<2ufNB-Nxf85RP>lhBk0h^kqyI( zMuH_VE9iCQpV)+q!Ht2`67d!xZX!($lI%s^LnKKxeH9rb3^_h3U(1{`H8ph%$HeEu z_qH_wvP!4DV!{AQttKkWjil&pbkxHhUS+0q?4VwBWB-%hUU}{s%5saPyd8-Nl7Q~^ zLdFWC4ryu1pza+Lf5OtDqL{~+YiJU!&-5FJi^_3VKnG-3(FJbWA~gcY&K*nib0{gOF{SXl?V;fj+t^5I3^cgnKra6W0n|)?6>ipV zuK?$1|J(NYm$*;fP(f|2tYT|c-f9c^WYT;d<1a=INyL-dP}wn{FXYx}`|*@o2wnmA zdOK&{M0vI7Wyz*>-rnAhL|9u}i#bX^n}NRqTERj9H8rNb@gvj^ZT08zWltrk6{L4| zcKp4_aTGvrUCirHY%Xf$ceHun;ULVSz+7IMZtCUgT>u0I?541)F#ox8QhH7X+YD#Z z>DG4xo{4T8U^rYPpr@}-JNXyshc5WM%7x&=XuB{%FyZQu8Aycq*hPfmqA=S0=u0Wz zS?gtTyryLfGot$uk?DR0kwKcz3%2li?dX=s#S0A~>|#MTU7~7FDg;fO_TVsJssK@+ z9v2}821?-t-KbZZD$yh^MUo-P&d-B92r%cCT5D^yJ0vOFs;wrZ8B6jP(-_L?>fTO= z`S#!j;_3Nk(xdi}0*Uz?OwHR*L?XbWY)`708BCi?NewvqhxkC_)0DDn3H-M~nS0Sh z9umR?A^Z&ZE=!O*q!pYiRq*JFE&}zM+<_Tq?@dPleg&nU7r9CyD$j>sSy%RvUY|R^ z5H7I@JLl+#0f(ZnQ_w|0Cv>zzn46oP2X+uGj{s9sp9Y?jI7ix_7C#{muR5pc4tRoJ z^Xf50bfia}j^vjV2Tfd8??rQm;z4V2B(Q-)Tedhsxhaq%GDB7r`u$(#<_1-uej^MK z({833#2=^i-hdNeXHXh0d_44?Ks~?VLB4hLQu{E-$seBE zrFM51&CSVGCkb;uq`)F@<*@v08A@L8OY##t=CE^?iD0S9?UfXT^FW~Uy>YJg)EQJW zwJ&!IDV3Es?H&_B-+CUCf1@kbwxI8OuTrfxX7P>X#=>UQ3%kog2v0+h7k~H=D1JD! zZ{1oDCodS_-=9r#Hi~B~?Mfha09CqwwV(se|FNdCXa)m?gzQiGHS4)5Zj8hfyM+vC zAuWEcxcJt`w=go|AclvaA@O_oq>QxD*yv+V2}ZcPZU&bBmJ*wvLG0yDCW;OQ`o@(y zn!CR*-$%95^AQ}jty1Y9J`6;?;G*f9u-6VwI4Fl)tTEv2XbyV2U~WBW_~as4Af6Id z_c-kary5}pK@i#H78H4t?^hw}urG{{PQIwRlo7ys(#V&tj30MpdK?%I3-ZMhD|$6N-IS~I2xSweD>@+^`n{`oqipG=Q0k6 z$Gg<18v|^4fMu_t$h!B#Oq5SlDPn-Vs-c30tMKHf6I;K|`6hUif;GRUEInD!`)tpW zau<@h)$3qc*xY%>r)sQ0G*?ubgBVI5n_g$c!vptQk-vYRY~j@*diwkt=okXjYXRy$ z!xn$jjUKWrUjwl55jmrm*YxqWb!n_w}g>>mMx*>#ZzzEIwE!tO>0O z?K|EnjixiHWQ=tuc!IDz#8;Jfy)GgxEiH>`?flO1>wl_c^n3v3m_Sx`2m?0OB7bHn zD=X!V9y@ZU3QoOqZmbN~7jucaG-%a_31e~$U2mi0GjrEFn zjeXe<*ovhYM9i0k|}71jk7!xkmI&Ax6GYRp3&6Ohmk?;UR^2iAL40h z=}9%tP8I+;#5aHgK90IiPv`Fo=`+sJdw9NDuaY|0A~+QuuJyIJ(q-r4f))$a_l#o|YBI?ywj?DK04d(I59MMp9|OwWws7G(u%?c(f0r-z${G zc0M~l|6^Y-d**DDRaND#ew3=VcZzzfMv_-DGox6{cJlk@y1f&Crvv~qg_cy$OT|?` z>C?|yII28Fok`iLs;-eMPp_2K)svi@fPQ*-v0$b&6#AN$l zj6d3Qxl9)aqt(k#razRsKC}@ca&Ewz>jRd880Vi{3k&HoY%65TjY3kw;$qV~);!Xy zLTRL)PdYrAVfENCo1FwZwrqA=N-6o2b_EC?@?%V^o#keKc;%nF3WXojhNR-r; z_!z%_)F%udsmDpQa2?uO!}B}{66j09b-3$@p|roy$BE~T*%VaOdjA`3Egi1)o4tff zZSCZHw`he&n{>k0IC+~3$mqyE|1X(Wqkr=~7Y5o6nP2^SK6<^MRfRg?d}|8Kl|nuI zgO#=T9xGm}UR(L{XnP9P(x&TNQGkS`-gS_Tlk-Pnm_YJ!z&^(-c*t0>z@EQ|ao}BC z46!WayoUM3^B^J2*%|`-hkb8GtP2JB8J-!4Y(1Zu{blUOsluG!)!&R1!lJV3r_iS+ z7G~|sxy)_rWtB=VHm`OBoC8Je;nlUSJXypi*v4UB`fb%&V`a2eI7@%Vpi9#HPz%aF zcfInmi~SN-uBMXVd4XplF0@E8FwY;KFq^qQPoMlvC%^9UnaBA0yc8O&(84mtn0$+d zQJ7#UMWB2$^5P5r#rHr|7WSTOrl?t+m(?~WCyH^=Uti7KAi70`Zz!AHw)OR565}N~ zGa6TxMjTj}Tj~fN^h*3w&6Mf9v<0(KB9#zFHs*G%1 z&A<-4_k(`GPzqzk+pSIoD1YYsdUXNgT09FQbFQ6gcFNB!Np&o%pZJLCs&k-m4&(e7R#LY7!t*jklO^hcIf=&{lrXh-hh3s%}YrU60xccaGM0hM<`W;8& zUzpptM+RTdJL%##uWJpCkMjam;o;*^6hP=-&ButaTGaCe?M;?zu>}^@{u})*IYG=2 zf1E8qFsbi@Cn9Eebd*OAKPo$WS-pXhMwXBptE#5InAAGw=zHF-4A#Kwp+igagg(Xo z!phNRUhvsekZE8$0k%OR!L7_(=lx%ncv4dhy#e;~KC8_|0@^*~_yppy6(*bAtA$Ka z#+X>o^N=bLaoHp8k+_stDfcV)rtO}5MeV_{{s~*1+=?v@&n?@2^N3LNhnKO&aY?B# zR-Hks`DJ|!!kA1>WqsckANwNuyqK*`QlN1|#ZNl&#m^P!~H^>7!-H9U$S z9h0!*_V(%XXJ*5HBX`4%UE|it2A|3`_je$Z6b@E224Z>NmjP2Gy)7bu+GBdX#US(S_W)-vwy}jv*ryA<27#vc3acc; zPh!no&S?HhqD^SYkEo3}AC%3kckrRj@BqWvvJOdV!>K>Helm~5drC`8wfv`}BjDyQ zYmH%ocB;{*393kQ7xz#=@uP(6htTBuZC#F;k5LR>#!1qj%)JAE;(J=9D?L9un;m-O zKuJscH7b?OO$K5C{>G(>7?~$!9~|gIwNo#z{n8$^63@3`(KrG7;bm2P{7#NwW_&zX z#F}4--+>KvL+`zzRFux^7!}&g6`^xi3tP(onP3bH6K6Ji!pWs*M#k=UV1^P*rUm50 zkUzf-eOoup%#+T#SR)5)v^mP!OE?C{@@q}=R16MYz8G+%aI@{G9_i&15LPOl$281L zX>X@@zf|c1UN~3HjmkTQ=V@oSm#6E_Qc?wIs8)uK_ln=uG0rcGy+KlPB_p{!2 za#0g%g(LWI-|TcdRK586m2#a#0Pa0%R{>pS(?=eO@xpyyh{=Nn4IN?JpWEb(w^dk! z$H<~iJ*fNSI-wBsQ7h5?g}jGJ)r@B#%pO9vu)YXmc9nbYt;JH`xTqyiTkMLoM?B#Y z;@BdoIK&j|Y0_AYdw|Q6*KgFzw9hwsh5=7D{u}q{g9fTLCH6`?{qNxOEj-he!YJPF@W0<0DKOF(r~#0Dxw8<%{5K`@lJI|e zSZF}GGN=#<@^<)({qDmeihgRYQO1|CTfc-NfVv>gt5?W#YkD(gDY7U&QRQRq-hPI* zaWqlv_w_7K?Y;@ABcT7Z)v%AVSUjy8m2$m&CW8~2hGO(RWs%ooU$)S`)%MN?SD8$K zR^kK$aW#W-Ifh)w`u0;$D~E6TqO;G`-BPka*4`*Io*kMNyz+MJW`*S58GwRsw~+BB zusoA@F**}rh&ixh&|*g1ziEYAhkrnlI6i0FBwAWpYM!2rsSAy+QRyP?PZ3<3m(c*T zMU+oKKm!0x>F}>GF)`Or@jf4HZDF~I*)6ohpF;P6(Qi@PRo} zhzR+&8X82UB_+ed!_hrkOy7WFSpP%-QV*VBG_7ArH0qXqlba+TAD=pyxW1x-e)yO# zt*^DdULL@tc!h;o55ThX2??a%i;HuBaIcsg8HwM!Fg?w31b~vrQ^OoxOXN1PX<%BB z=;M)3xq)mwA&%$g=g;=q+We{rx2o8x2+zLX6Y`6Svb)FF0`D-4e@e1kO=D$c^(2z_ z-hT7Rnj}YDbwh&!9v&VrSc&b31w8HF;DGCn2~4+ERXsC8x<0JBcYC-OZT7i)ADLxL z;}k80puQ$CMzM?3tXGTL#%hr826YPdNwzGu1pMwnrQouSDF7s%uVIKMeKLAIIeP-+ zEoegeTo|nyuwkrV&b`NBw!jdrRgtGp1JpG%*2v?HJLvA0e}x@q0OsidONDVE#me=w zv9sqTC6NnuuXak0h+Ix!7#`Evxw+NdihEtEb|5!RlNgb4=n_bUV1+q7parCIeN56V z1Rwdd71HV1+Lon;1O@eq_o4FAFfxy}PcHdBf|*8WGP1I3m!o-#$G&IVTJnMX%eQ^; ztjAGf;c1kzLYl<;6h<2X#5ji=z=n6srD7HY_gdA~=Umoo4;&v6~Ap5lu=HK~O6a`^wZ`%SeBOudzJToBiFQRc?q8?cV5>=-f+gA3rj3B_cgP zuoL=*XGUd720(hmWMqJR8Y^q8)9dixzh4W=tR*=o4O>?ItgJ-2x(j|KYS?9T3{-!6 zxx-spYIRnsk+~*&sAy=|A1+Y{I*^}Jk&}>{N23pF(Ic54(;GhNOroR3kTea@j&cqP z3Ub6Zj(i9TLif)PnFw*Vlw0~kk6)Y)2ulgRL45*&a9WHby?XVkS3EqeFJC&um|O_3 zF1h$7(pFsCBDZDpFnz}@JUS+Z-srn8yqzjo-ySz7(7uYI8`J1LZ4XLAP^5jCM~K>+ z986T4rxI6|x#K;?E}1ScTBKE+zygmqQg|k2W*Ky7n^awSGS>qs0?VZ<(6@}Zw!kr5 zts(QPjpEt^hbuitdrgak_-_1197MGg8XEeP=naR0 zT(r(vq)$M)rd@+NP?`o2IwWJFpG}l`9oT&-xCx@aol)i6D<(Z zyEp<>$g)wcCL`Zz1NLa|t^s{pozV{J*7)WoHgdNtQv=Whg6w4R!0S-xv~@>RQbaGXM*@nE$Npjuqb5 zr+_sk#LXX1AVFGdJNMOC&*J;Ni`JL>5t0BQ=6`llU+xmT#s(gUU{?Dr$tE@t+>eAh z5*eUOwc!0TlIp=bEM$z;83Gi>&k0z@MR32+QyUO+#4B>fH48YBAV6kaUVcW~{WOW- z_~c~m7HFv{%`*hBW;NLGdFM}Q%929+GS-kGLX_1LqJWw!;6@@|o9GAykhv2xOd_R~ zo&ItL*&RuoK68+h9*u8N90xXhe@KMVLzhIL`H%&a;8D&B=K)9=Xq*Vnz#Qjzgx1jd zcprh&RHZ^a;2#($&f*cpf~Kf8K4P*2%wvxT696cEdPH>TRrCKLHrB8`AUqSoGG9O9 zxSdn*Y4k_1MdI5d>KXhKs~YF=7k{3AaGV*DCD|hohGO~;&>3X>-yi(Hq^bYg_F7t4 z7=1E1`S#o6P5=aRo+B4WGcz;HW8(nhLk3zR#r`Jull<4V)DwUI_L)pP#xh=heuZyb zm6st$($GU7AYkEu!DOg-m2LGbXnt%8AbENDCsA0%Jk?cIat+zpPea2ZBNP6!)7shE zCOBITQ?n6a2;j1u23F+Ah$j&YGg;bKHzP5EI;zCE zfQ^FybCG<7_~^T@3v5_C+QQ08ahc19u6CQ|4o$RZeptI_g9&Yq_4)H?KOti1n+tC_R-z%n`kh9a)vu$&DcRg?w}UL2 z_$8RQ8A11db^!VbO44VpedwDYq-b<~nsDOnu~Ted6i0{_-r!J%IOhX1c-Z;yK3X{< z@+*2cS$JeVs$qDvOsFQZyB7c18;24Z+T)@l2_Zf=I#RyxKx~Ru?jMbhLNVg{vpAI@mC2+1Z z9RB3$+VA&E5QD4fgA(S7pMQAo#KZ*IXDJ^yO*-7J&f>p3+z#WOoo(8IxkuOFC}LX3 zc9(dc1k|q*UBwy~p3BNxWWAfS-9)V$si7d&7~0|q(EQ~`=T6#l;nNWY5{6qpnU;nO-5Y9O90Yuf%Ha?bMT5PVbG zLpG}&O<_TYIw~a-{+v3;mmsoIYhv0ba7i(9Wlxw1u6kL9S>RiF+jPjsn5wi4VJuky zuum@+n1s>cn<`Z|#6310(lSZGudPZ73CcNaiA#$vKj`YK=|$j>WBkm{1Gb|^_u3`UxYeuOLq^xW z+0UT%o_~2EgCkDFZyhi4hc>w$4JOnLU~q)cz;N0a(R6j3puI6mlWJLF*dkz1ON4pm>BWL>`LRcl?|EH z5XBc>J#LBTmI;*lvqzKjTWZSpY&FJ1k9r$7_ac7j_;T6HeRx0CX2U6Asf*T5^&MvF zeVqvByf&k~+ve!@)kxOZi38; zf~><2AC?`cUIodH#1@pVdbxtTcl^E|%w}zNX--dz9^&2-Dn&%8zm-Pg13EYJOjll* z{7|{jNqIrfk$&vx^n!sQZJ9{J++%(Y2S2B_wtua|u<{Tn9z7y2^@4(NiHWjDM_8IJ z#p#fS55?beb1skPQIBP2V1Gpmot~Ud@c88V z_xZz3ZTSl}k$~Xt{M9Bp;WQpWc71=sjA)4~^sB0-7MYonPH)=>KqQ5v(i*GxMVz*( z1VDC(`q-Zs(zv+~5edEFW^y`}2!gJGv_;_`7?8M%^q1R^K&!0JY$377d7LX4O ztx*4H?e&y|I39%TpBWbo(C4Q*wV$DFREt@DQbAfM`+kDEj!8+iol_P5TH$w3K~S}l z&>@_;`Hh@>Z;__1+N(zERBCsxOaxfx#nW5t=7ZgYlYs%32KVA*4-A>LTZXnqGe=ds zCO{iHnQF(v+eKa<&;Fp@IL6e=@=Hy9WbZfm5;*ETHw^IZmEu<6p1&obYBxKAK28;QSD%! znSy=nv}I|H(tO|q&N3}<^k9^tj*5s-7mAhFbmnEZ+y9(3D5q#DSZU#46R52f0vz>~ zOkXSCNpTEqswPIuNjvk1`i^iI1-*JTz7*3rKS;VG9L8cbCmf&fhP1GJVaw6kE8yhU zNF&FE>NIV6>Y*JM`5aUzC@cYi(&$r)Z}yZ2aduGk(5hCpWv2C0Wl| zg#xl~J5oK%mYklPKMqux{~W#Pn3zZ?q!W-zC-`;MV(ptc%kwRnJkLx8qB!S&-OLWO z?!N+x!(V?0*Y?%N>^I9|KQCgi)A?xX5|6d}G(u@WP0L2~&$uuHwx-rxZcDmrI6ezU zpX*Xcr1P=kOZV!Z0Kgk@dMclixDhQQ8&XtwnVcFGjz4_%)vBucr{XICmdycAGq}^s zSc{L-rKD9hMK88aFRyew#ztPf`?i0lY(7)wJm_%4#3Va4Hk4Ies@K=5|H?*1U*Ym> z=Q(l*(tMMrqCk?gL(_&$I}J_U1mAdV)$kqvML?S#P|sTWyG1Jdc zI}c9T-Z3|INViQ$9G&ha%`;hhNnhtW*yM2^$D=Wev-AC6TumwMWtZsOK@lC3MorZD zl^4Ww&U)7+irQkDc7B6Ix^6dcry5g_Ml)_MlgS2by7NNxMf(11S@u^d)413aSsJ^A zFPM>56vD#$eCTxPtGpM-%|-Qs3IlQl4Z%W|cD}D_S^A;3(L(y7MzEfh>-vb-AeEVY z4QJ=LRSQeY)j!cQ=_tVAe3P==YkfVxu%smE)2B4T!M;|RW~u#OmhUX&n_v#*=aaLu z(GLmNAHPKPX9om0a*QHce>ZBZ;i_V}C|iXmfs! zk)@QmpgK)-E9FjV6MQXb7%-O;urp!d__tYqg>Lg24iEx_FSp^t>UxS>75gp|0#j~} zK+57UQYjaGt|{5@Zh+^6B05zGA}TFWNQ4*WezkAvCOW6*+{~pCc|pEC5|$X=Xm<%A z(*dtd{@VIAdo)7N!e-bxfcO4gQo&`RT!WTA$Bek0esgXy;Sw+JW{r(K+1S!Nsi~Ri z=one~b8AP-RLbP-!k;%ZrXTZFwbtbw}oZ@-UE91B~{`JZ>c8kuWke=MV`Rba*G*hl2&GrkZP4rFAU!#0{= z$X`#!_!26Y7jTRHy|i&>`TuC`Eu*6B`gmbVItGx=0ci=9ZiWU4K|zodknZjpK&2a{ z8$`OKyOoyip}U71-i!M=_p{DA@A+`ndEfamYu1`8_ukju*Z)^_0^2>p8CNQ=fLVUQGWiX(eci-W@>JRU3N1k?{SUzjUJ2gCBZ5r@V>X&@YET0 z(P^ExVrFb$heO@TU#wL-6|sChfJ|?*XH-tp>uu?pu2Fqv>FFAId0EHyLg*Wj#<*z- za!KuRE^bF&u%|nZLYRK4vq2Pi~GdF z((FQ4bg9K8cD@wgRZ&00L1v&L>NYPXzb~e(l{Cm7t?aK*Z?OoyRl) zN-8?y7F!@hY2;7s#oGjJr9_h2x0(~I#sF-8es?0xZdTPX|0-O0Xou8&Au^7Lox6<* z8k3fw6n<8%VXpRY5)P9KllLGYmggAiTPF5!I1(p$N~+xAjluOBz%%uIWFZdoRB&r5 zHjy#UE041c6z_7LIS%VRAcV`r{vx2UagL3NFT|kvFsrUFddK#bqtP)pfmXu#b~VIv zHW1!*TUobJCwXW5OZMplqco6*(9BGxxLBGk|28ePW2vQS9t)TyWVlV+9zGu~Tj$r? zi=a44e$v9m!{-14^F{Qbrim|KIeX)dt}%XC1BnuwH>{_JDUR8}x)g)8?xNLOte%c% zQyONMT15ZqTT=2u5?)1Hi)yT~@#M6`Yeq(sgcy*T^-^671516toQPU0TTMmY*QFMB zdmGMHgV(;nedYEBI(nv63I!n)^+cZccUVK4Wo&>#4E6XOrc_i538br3BmuNjhWCpT zD=hIZiIRe9erdXjl@a6Z@t9)nm+2>lkx_}T%11wy@ci95Vg5K&n_tUcv=N&v-cQa; zl1ErMUUiicd29rD-<(KgT-K)(l}}>`FN+pJXG&~%mnVX6;cQ||iBm~r#o2XAb*{b4 z%-gE0goM87F;9o#)ZB_VrCR%* z>03Tj7pkR9&J~~c;?3U7EzFt|+-Bm_~1}oy8_NuP{H?v=QiW;$wcC z_}ZJ|H~vm+xiocp=6I0X7#^ld#KDKBrvygV)=+ABr^mY2p&rwzHoTR-)s=N}@9OO^ z>I6T{RF{^Pm`Nu~3nz_0Y z48-3p{LIV95C#_eKogs@4c~lspEg2 zjVUv~J?`W4hQ`5DKkP?Y&1;+KC#I{slv`>rZU6#L69ZnsfWxA95upB`8Fl~f1f%~K zTV{eDMQMFaO-)3I{Hq3HNKy2j&+>_M!gUzRL}|zI!G937)zr0kXqMsi_}BG4{nm14 z<5Md=9?+H=)ozJFfB30d_=LlqKf69F1#fh(6fI{L9c`L?bnIr03#NA02Dj!JBf;>+ zRZZia=bhxQ&6C0j04s0gRh=*P1i9%_P#%R{QjPomi1ed>y&+2}>mc05RU`UjS7R1n zH0@nv-gY7T&-3lq)KC_lBK;Uzaryq>Y?hWZ@=)$rIIt@LXc`#|9mLu#t1$Xj4L5q) z4BhLq3L_nQgVFZ?5Uf%(sS#e28xUh&w8)luEDR84DP_D36ms-5fuTD%F{qBX| zX=#lE1@tydFctuv-QVy%>JEj4h1c&of-wSH*pP6~FAqKlU3&9e(b3Y92C7f(?phgP z!Qc)t=o^fS!^6X0oZ79_GDNcv4s5L~EweW_KQ(&8?dT02Zf|ai+S(*Q1y$0+fW@lU z1EM8OO;r`(^#v!4&CIY~-)-z494OubD#yIxxjEh9`lhB^na0vm&PLZgQh>2MwzkIb zcY0d+8|&?(@(^8EN-zqjSg7?EJ^-ZEY?wM-=R3E4jJnK+S+;~Zrr>3UH$(d2n(Iq#=;NLd^B12niTiZmhn%AXt zt~vJJUS4^){ee!%7jAq9K&=bKL~%aEDZ8Yy@ zorNd4T7ND~dJF0FY{xP|J%xI0X;xb$b-0hUR;ra*{NdOR;XaINzMMVn3+y>1Gk2*pZ z9v@0FnK)`POiWMK_&Axd2LU}>lHy7<>Id-1;NVw4qS#D?iT(mzD2lK! z9xN_yFrJ*4I3N@e+eZCb6d3pxOUK6!-@kv)0W_SF!v3>YhVS3UIDqhQKNp~Oc6L6) za|v>$*4EYzj}X-Q_9khw0q~KodE_Z~+AsVf6ud<3UC1PrlZ9nTkn4$s8N?Q3Wl0Xd zAww9yt)bDa-(CG%q8)fQN`af0ff^ed8>foL95pd95i;{8RHBq9J&I*}W3JZPXVMTPPQ&3PqFnJ^&3#lF|^HWpI8zx3UpcpMYV$s^P zH0qNm9;p{8xj8u~o)?B<=6Dldz9%L!ne7Gm0|nc(t}G*slET8BSb;Ar6Z`u%0Z^lr zdo!5f0Ez*anLP?jhDdy#O`HZJ??$D#H(R0e6SZme5MF0>}~F&me~g@c?S82=z9v z7y#=VS3O_6KHCa;pDn_tz;5m7*+8yFor|9kR>MlSo{LWN(lP^(U|^vZXNyioJ8z@9 zW@pCYOJ-&nba$PFl{xqTcTWyriu)PM+^1```f;9DS>^srM?fovk(Xn1m=@DLj+0C@E&&$3l=glO>kaK&D-G@ z7AwV;!sK+36CH&RW1+7D;elU})4zSA_&i<1^NCgB3tnXzkchjY!$=T;ipw&t-{8a) zqs@XNYWjTMF+%ViQUv()?YnmaLRzl`r>iCvtbO}&I=hl^MBnBGc4!}#cq`fK!KK?!qCHGLoHdL{fx47!U^`8#Gd~Z@<6DI*Z^>ZpmB0r=xVceGR*6iUg9G7M}FhOlYM;5^jkgm)j@m7*9fpZ$fZKi!YIp zXc$V{%6YV;Fk=SPFqLH3IjEog3CAj_3Th4w4P7T6eHRKmgoOP^<(NqOi(nes$VI5D zG4m4gph7vr`3RtBQ4%#O@tsZ*m}-y@0MkxJH01L~OV7_nihaYVdJRB43s3F$Xwnq^ABim{Z=W09Ai0$ZY0>lczHr($BzD|KJ`XLY@ z@Q4!nNM!$e9pdts$LA+Ek&j|O@O`!a_dj~S zz<)38_9?i1)cD;oH=?I4>jAO+(DW#a413qTeDlFS-0yzcUw@GApQHI_{d+W3Mzo)} z4*E#FcOwsXBVxpA=jQ$h^Ycu^t$)t)Jwcmt+l{?{qTdPJ?@fRS6pU|q9!ApB_5gp# zKrAiadY|L89ph-U{)1g^5&YXc?v!B37SdgN5xO&!7ZN(+wW`145Q&FBRl@wYK~DHWh%{@DD_r`Rd=! zXUGFy$$qu)@rQ)ovtHLgHCy6z^mQqNglq}XE+m@&C{$bj=Yv?cU0R>pKOD4O{1zBU zm)2>EAsJus$BH2{+a{Q1GE(>l^OZ2P@PFJEGpo%A(!R%vnD@W6&$wp3`TKCDy@8*j z-iuHUXl9l6_h_W(UHGSioQ3?`L2#I%{^!w%*ybpRzen%NybT%KKYOpwg4F-#?79Cv z`~Th0seaU10`n6f{(JIoQ=5||M*gqE4!H6e+rq~kngb8T|BNT@|Dn1Bw*BuYCVP#k zU{YQNjK@bOtp5%s?x*0Hp#xwrn?sLbq5nO1S>p{|*+Q``$`M0p0I^ z+WrU#@D{>N_k~R4Klb*kN~zl+;6_Lx-TQt88U5a8yybe7M|MWz{d;mp&d`8|*;$TC z)9in3*Z=tmdjTjgfE7`oRM6S>_I7(anj|J=A*yCbr^wX{9b?{t!a_C<4h~ScC7qbp zvyEWEAgtBlbdfj=bev!kbaZ0Pvt1*5Tibk~jwU3R#*RdcY9=itsBMyqN*DTc6);PH z!C-12;Kj1d=8l__Q&G>|-8}#_Y1AG=|IbR#q*F?c`W6e>bCmhD2H&6`W3aXs?0w{~ zU4VW;E9yaif^=R84X7Cy7>Gj;B{#MLNn%=Hn2t8qHb+H8NqPfJ7CFuVMvDF)(3s3j z?t{00f?bk+&cK%Ja}_`!i>k%vB!dR9H!(~R}#r8C+ zn2hf?5_sLMS0E}A?mY)QQERA@9_!-?;A(}*{Ed8_1fA;Az-yIE-gYY zeT=;dyuTq!KS}QpTm=MO4@zF-j7mUOy3ku~Z8CZ^6{==PyOL~Qc%9)ytJeklIyN#o zzVY#=Yzbhs_J_b6Wd})+6%(}rqMlnWd>*|B#35l#d_gS=4st}ghoEo2JwqJ@kN@z& z?0TP`no9f)Xg$-iDy#c`oG>gH&MG~$qeDsv9a0K%L1aZL;m5q`W74wd4|f6PZ-h{g zV4^&*W{4r^o7>u^`$IrKeB2dqISruv7cQ>zOkeOso268yCnktLYX;{)I?jT!1I7a6 zzaFqePS?=mB}4~)Au9uy@*{7vA%XhaMH9P_em)9wB6@cb>+&;^7IS#$#iDP zQ}A@A+yTNybz0`<%>1}Sr=9H>_MB`w=NA_PG9lTau|Z=$hE)7)j|h& zhwQMxC=}G=3J6H?o2xO60iM`tG=C0F4DyXE z&fgt+- zEYK#A@3Z|T1O2)sZYXvFmX?;<`SH>~`e4a0o`5*#hGf8BEPwY>F(+^)PW{ z;GN~2_%@9Ri5Dcb;&lA90wPV@zgte{S;+vIm%@&5H8qtv4>(PD`_|t<e&Rj$g|hfMBt2q=@R&YDwivQ{-ROA01p69Leye;?omucJ}me@M414N z;ot$q(GH`$1PC5Y#h$9%XuCBCi!e`V}#EnkxM7i-SLOOg*1j)hB_3aRFL zs!f7zyFxllC}IT?L|M5jYVdzNx>8 z!1?MP@dcbrDB1OJ-+p%JiH!+$-^Y=_n_IC*jhR2W-il<#gymLb<{*sH61L{0%+Ro? zseP)W1c34imya0axcPQ=;Ek34bwY-i?{hU;3Exwwfv9({hpN3nTXvsX<{NFpw)LHT zFL^b=#aH;=*Qb1?Kg*P_5UZ7y5|;+o5B-aE)64U+M@wz-ycqk)j5hAhkxMOJa^)Ek z`F(okxAX9tN|;?a73Fp=i*2+_Ml!cSzcjzvuVMM<42K1t13TM^+bB1$>;2+|shd+* z5nG!h#p{pImO9%q&M{}z>c-8(J^7i-DQ4FicXh*u0B8r}gTpVibQ*h0 zo~DA-JVRs?z9p)RX`8%fg+H~ZSQQaoYQ;EI8uBcIPQ(e_>C&PSb9a)OWC@3LLISzk&W`0HkjO?Ibvy1{UCqkPk{Wk?w~+5J_Yfi9!9hYJ|?id{1<$3a zAjzQR0C!zKjiPW*$g-yXfEHjTh%9To))VEl7n}_M(3c@>$Vgy%qNmc=FM0Xb4U+GT z-w=xVA%q=TMJ1F&JRVd{I7kxTjnS5W1hooEs5QLy;k)<)Bzm<%X>7_gRIP+nB3=We zeByW0jV#GbQS((b-5eP9d)8hVSWH4;ZY>^0<|gSH-x4OBF^*&247I>8V570)-{?7* zp<(c&vHlqu`j)l+5ATr6J^sdIY#12xj7}?0pS@%a`C@M5Ak(P|iUjl^V=w?fKFcw7 z0leU+Bq>g`ugKM84y#v1^U}rY7ajL>32PT!xot&E0RuG6t>YB(uE6xLP zlW=YB9duEBFxr+c+2+<@-B9@SLBcopyQe#y=Yk}r&nn+!l2pxJe$M{U81-X!QL~K> z-@PcmAw#!WTixa(RVd!(;ox&78U5@AHohW^)7?-q`z6mUy6wf(X_u0mxJ@$cZOGNT zlPN-R0TFqfZ?n9-!iv{DW`|$K?rD_NUguP=C%*S3Qq;Y7_=b{+<=Ob;xedKo2FUk({VLz8ubqDcxwfuuG`Oyix6g_5IoAZD zBes4}IEO}!>>sGNM(-R}w~SxhyiR#>fv4153c?Mo4k>?)c{_>7`^GSwnOoCM4iMq9 z`?tvl;k4NpVA0mCh)N>J$V}e)@;Pn8k@vD{zU=U5w5qE5Z4lG4)mlau4GuVs5`TCq9d6UuZ1QrmI!6ux$?F69%-?h?XR+QvrHhDlT&`z zEiN7_MIVpXD5|#(sN;8M6Jv~zn}PWs7ezLD-&*>bh#2{V^_sJaf>V>~MNx-m3=H!D zZKjp2Wi0$}%~H#d@bk?&;qh+km&b?Sg$(p-h7evTI9+3)+y*KJUL23T8XR`#_H~AiZZiTY879__-!)P|N?)Cdv*@GO;^Hh52aqo4 z4(Uc$4@u4P3pIdjw#oSkmFWf=p`}}gO|og$7cbKJg~XN=HGiA(ONc2p=rp{hKU}+> znnJ&T!yjR3RzA*jr6K#O@$?fK>eNfj)#DV5UyW7dzdr18n}6w;7JD`dUiS zEdrqohM)Xs@jS>NmDt-p@T4{3I13LSxz5W=xL|pcTSXto=Y`*|`I}1sKygW3IMOyJ z2Qs(DTM}OFBF3SEDWyefbDmMR2+%DAFUuB_u-3gD%0p;HeOR{|&1$-!F{J*9av16I zZ9Ebz_D_30NIDugm8N8fyWYY-e3-9#;(XtW=XFsQ&hHlGksl|$ms%Dnl4_msjauzZ z?AW9PuL`lIb4_!NLKsGqQ=q$pg?gPEDd{3-aj?m&r}4TgjA+cP%+Q}Typ*&~WZv3I z$!uS+j_Zvv`!} zhc8c;53KuG!I^Bw z>HRY%=KQgEb3}BsXkLOTe0L?x{YX=;%3I)$wv4Ucwn#o9B}I~Zxn^Q&mm$P+12tBA zHrJfn+r#wjDYXY#KGmLe(HM}u7A24QLAm;=;|aA&R6`Bs-qB8;U{d-02F~EnKz@U# zdtWqrNke6Z7~Ds9ex~49;c|0&c13v!)yt_((R7<4W&LlzbfZs4{NCLY?C`JIbIkQh zD1h(%j*lq=r#&qiCh{~WCpX8!$A>+}4m!a8@_B@p_ie~=9lV((X8-0lDfiZUPHK)Uap87Tqi0kuZD$oA#y>3JkXef5!&-reT zGmvDP;|&;LOhtJ=K|gn>s8+pjz2N18DVP?ug;DPA6}1+J6m06vWVquQJ9;Kk9@U<( zZzUH1f#1r+zQat_&g7UJQ1| zNL4;RH|AJu&}UlqC@My_vT!#KFX)wDZ}{39D%_~4DNmqN|DoxygV$T~kC7nNl@}Dr z13u-CrTR*^?{+2|wxPJvesZ$p!@9zU$I_y2xFq@B!l!Y6gyJ_$SlV;`7tU45YXF_!U)>`@K`obUU%ERy%<%D5tf=QOv~=1Mu{qZdp{(l**gEi6 zBSbQGtqs`23Xq@;I6h?%5f3Gc#_1_*9*rC)YrpP_A-fJz#CFZ4Df=1k_=~4x^$_LK zu{ojdWf5Uth+_h3!}*szN!8prHqL~v>?$rH(&oa>*QP0oL!2C&s{@sx4h`L zhISh;?g>C;`U~JRJ-%20&>>J&1(d4)cX8SOe{Z>r5*8-!(v3;7g&}Tr^z?4g=O<$O z^U0G7N`M+r-!THnre+Th4+YBFkN-Gydo7uWNl$-0f^4ypnbG(JCFp&pVdhRozX1N? zn{enX>6bvlK5WF}Lv!~Vb9H-reLWPuFY&Ot5>r<%U}0h+JqK!}878MaJQ%yVK|koK zeqjA0fIKLYmwuo!x3GRHZpo@9Fck*wY^7!y5?klL9zkXbG)dzM2iB2@RlpZWcc5EA zA~88pLvu)fPE3#p^@2^B&0tMlZu89XE4N~9OidxQ$s`Fr%C@Qc2Y|Dil%fdm?=7h> z;qDv$MJ3@xYeW{twwiIjU-5fpW3{6(1@ zYoHrDv$YAQR4)HqNsG_neC{Q$%2UP!-R>nGO(zX)RRoRd3K?p<(HDcJ4M%eeZwp z<4DPKA{{33u}LdV{#y14T@UIE?VK4b5Z0kx-a|h8^A|}FV{i1CPqT(o=wc?i$IUrm z{-?Yb;QdkYOggku5Ssk++w799j{7hdrk7E5&2>kfP&Z0^&st)jZc(|uSXf2XlaQXS zEaF|ZjQ`7K+B~eLrB3q8$;sPghv^NRF|tB^GRcRm=B|5NA$yCTg;(q6(c`{YF6tQe zn&_zOPuUluje_2!?Q;ViBM^{+W9+A|`WMw}M!*&T(;TvO&DGkykC^aTOrhxTX`?$Q_@?-c#}_pPR^4%@qgWX+9IcCYK*$kz+fFJ|_? zwe4l?en@=#C-TRSMwNpDdoz?Hx@{Tp907ZSH|}cndN@U8Wd$G7%F4V8-YkJrv^W_ z|0+)qEG)zi;d4J!CmGV$(UC2M(~eJZl~Yd&W=Am^RPNi2cVW2e5C~8tPR@?mpwj|fWoA(4htAErH0_eYnRb6}R#947d8w`i!tLja)B8}lQUv(; z-fa9)YSh%1&dntzk`NbH6?lU&G(WSTbjCqNWXJKOD;m!*5!79Mj!S)66Hi3k6YP7v z|3d$lM{L2C_A{C~+O!uEIb*R>!v3qGiB%_i2M5I2RWD!l@NjVtYsy@aD4FNZ{GC;_ z7ZLWz(Hh_2(6%sMQaMI92yACHGc#2mxY$eMR~e>C)n)Q?w@==i%kJzH#ZpsH%Fau8 z+i0Nod@JNh$ayH%GtuV}WriF%zaw5_*?XVrMcj;qp*FhRKP)e~y2*~&Ec#1Rzf_>j zSq}s&K8=lF{VcQk=B;`R7!%j=lm{{FtF|2q{=5ViFT2?NLEwGy*7coh$YJ$}kZWTh z%>gv8Zu_qL&a^rrGFK^YTOg@I53$#5m-+k0Q@z%<*ekGX*bCF?~Te0Ke^H3H=AptiJVyx34OD)pl5;h ztKL6Q4NbJKJc#&lfQuS@zq~)jWs^bbf^jqXFXw(=51*A)#1MM^qL(c4Ys?RO%fvem zYP$Wkjc&}BiXNV7!**%&Cq6x9f&mw`{&|a@MB8a}_;GR+P2HneH?shedE1ADgO4PYB@tVn_Rd%a{9g&!*OGLVD30&59o_emmDuX% z0bTg1h_VAECISj_K|Uga1VDB9h=?^SD{8!eYP$%N)b~ilmPy>Fpt_M+^#}2KDrs%+ zSL3f|dvZhRC54X^H}BPv5d!tsq%u>v5E~o)>Dk4*=LgSQZdonsf;7e z1o(wGckCL;h;|UvEXt$IaVomWPjyXL*w9i%rl-35N1cD9e&&qUWoYg*&V0plHF1)P z75HR`snt(67Q?~MRsWO`p*cRf_hxaF0fng>|;P zm{Jhp1R)BQcVQUjPVo5D*O!M7x6DZM)B6yLt{s2(DOpi4?=T^{g#B1++9mDbH!C5o$kV2L|VW+w% z*kP7uFip1K`z`yHPRb7RA=83s$KSe|p|t8vYx|YnU;*>%Up%*vn=4D_K4G%Jt-a9o zKU}O7&K}R{Fq*t$Q&wV@X>7T8n?C#$7I+hr8C`iorX?Jz+6Z>WNmrWUWnPjPKY0lT za<2_YKP749H7|ROfE_A=pY3*C{Z7j>s}{DSgT-y0q?+TT(k&?(-lB&xwG}sDZI}uj z*Lt*?BpX**ps;cccU|Ee#7h)e|BlttbGKE|w+XBOqXoBNv?YQBQJ{2(1(by#$-9PR zP4>6=3aOv`ub6IIOu*-Eb-P`2@TWr@M`mXld)OHy3gGg0^Sn>gNWJ&KsV0w~oV)si@B(ty`qB;xuA@*VQX>cHeHr*KvarLLvly7Sk;6AfKL|j*4X23ChXJQhfcY zY^IrhON!5CN#Jr36B6^~^GF!GITtpz)7ac>aFQ0SKh>YG)X$xf>v^UT5fL8_*ud*g zlN9}JAfs6*si3MCkR@xV0P&lcvW^R7kAHCttJXPtP9+?vtx~uT~R`yBqaE(vaHdeI=MllNpJp8^N>tDL3!WNhLU^AJ?u&umaC)A-`5%R$*nM2?<$& z9p-H)9GCTFzVn%aMP)D>3v^q5k6=Ob06Y3tRZUVe7)P45L&3W)v3iivf!zKP4S zK`#m`{S(-A5fOww4_fi?ZZSPmyeI^OTQZ*eOUw`*-JjHt4*VGuzIrj_=%qmXMpsvf zGFdY!zel#{xpSvfXGOtMK2(yR858vcE=LH)J3A}n;}zg%U}7WTbLE=-Ns=u03>th- zb1wR(RD|yv^r98RQ;33`re#XkK46ZN&Lbj39_^wmlnUy=26YHRs{+|TepO%^BUqqD zZJ*s%bdsHbM3y*%bgkrA_*Kl$@5~9KGuOI4hx|76qf1Ky#nm^6_&n*;;Q+4wJTq|G zJrpEZmJtnf`;d67Y?)ykEF8p9soizX8xAN?6b!{IHGT%LWR%mQ#t2rfq zNd?(`=`{$IB!whAhsKFwWDsUATX5t1yqY`ma=ARG-$MsGJe});Iw(S8GQNKXbL3sG zI}lu(Do##L_WL+yU?1|(ZkQ@TDYpQBKkNa>FBQyXg=-$D(Q*A+Jt5@xSC;ZJR^o$` zOV8fwRxTp;otZg_Sd8VUnH3CCqJo>X;g#g{i~(s6r65ijvmhyn9Aj6-pDo_u-Q8$E z%l#!^VJ*%z3eS?SVTdqsqv17D+v85y6Q z$DbJMn=F&eo%~T*{C&Rfb^J+-@3fxdp*vC2#@@Fhd1MzJ*%RbY+c^3fMGBfCi#gW+ zg4&Y8L;PoI9GM?ezy@1nkdWY*7!+NbgfjK7m{Z6QE5I^W*ZB}uou#@`C_w4vMT!YK z+f2GU-1BGeWNR%uT7xWA8wHXvu4<_r0GaNcWRoYaatI}ag%?>%%DOFMK10ve7|hG) zwUV%BzMNp?ecBAqnm9AwHDNl%;b1C-wxbA!){1i8BkB&3zbVh7RAB|?MraVf1(VaU1my_5*K2JOzxDQ>x!hOxcX@pe*sr;nF0h)& zQ#|3iJSh^Si+5Iz8_{~YtX644;PjG)yiR=L#MWH%^695is`(7}qeD`Sc%re1hu7nr zyl&%vu0p8X{V7s1^90rS1tmnCTz^_g<_4G8=j1>f_ol)TR+8EY%EISq!s5iHkv%dXA9!>>E zrkB%!S9Py{Ve`FBenKx#(ev?VsWnv1z1+?&<3sA;t1jWFdqx%Q=>(<5()iy$W`!7X zbe?L^jaNGzuMTOWJlHO~X8Ckk!Qt$J)g^7ulD)KZ}aen)RL)ZuZ*~ z=8<|%@=xYAs}6};fI&7mrm&V)o0OQ9_De+UdPs3uLM4A<)4WJN?!)CZ_vlQK^+^ia z@m(iF=?Jy%hx2&ma`S`H4-Biakuz2{HVky&wOjk@c-+F0; z$JMMwsWKDp6h^}?Nt4%4TB`5dNDgdES=l_EdHyNA5sL1+xG;@;sz`oN8v>HivZKtv zXSbYzR#?kZ=y;3vLU^vI9KF1-Gu09s!%RDTe@SE3t@yW9MaU5~BJZ6&6`&+Nkoejl zP`$l#5IkK1IXgIgxx2ULQr@8xx)!H_OA!4TG&j3Mw7UA-75j>b0pT%!(qLF4zr=`% zaql5Z>1!t2kmQ_{lhdrXBq`Q*{D$uRj4Y3$S;2F3Q!--tQ9U_S3u|i@JS|3_AT84Y zAUo25k5|K2MNKs-reHbvFhe{+{oz-6^uWujD^F!!_eig6{E=Sa@2Pr%wY&PE!B<-c zFLxElg^Tfn1$r_;$fv2*+IbXMgaf~`en#|4I=6G%b85B#V!v|2Z=bY@`-r4)- zf1>AIsmZBj)H1P!Jk`4Ah*P{Su!)lbYHOi%9pe5@9syHR{J4>?+sV|K z+Wow>b9%Rb3DyTh)p6p&S_)15@tpR@Ubpfq6U!YjJUL z(ct#%eOMgxZ`*?DFnQ6de(|_~stM#0`#L_?ccI3Ku=?PUk>Nv3MA!+e z>V&Ic&(Zn%_VnS&LWT%!7#}IK2W{K$MPJBYC$g%)?v96y*4tB_INJA#*80)SiKQ!uljcLW~kI_ zeb1@oYOgA$UgD~6#c?QE#GW%?zy7_+ikk-)1ra-?_Mx~#3*EgG{&e(mckM~;wFl+` z{HpEEdge 79+
Safari 14.5+
Firefox 68+ | Chrome 91+
Edge 91+
Safari 16.4+
Firefox 89+ | Chrome 91+
Edge 91+
Safari 16.4+
Firefox 89+ | +| **Wasm Size** | 5588 KB | 6974 KB | 8225 KB | + +--- + +## How to enable -SIMD-Pthread Wasm for accelerated deep learning computation? + +To unlock multi-threaded performance with the **-SIMD-Pthread Wasm** variant, configure your server to enable **cross-origin isolation** by adding the following HTTP headers to all responses: + +```text +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp +``` + +Then, ensure that all SDK resources are **served under the same origin**. + +Once correctly configured, the SDK will automatically detect the environment and load the `-SIMD-Pthread Wasm` to leverage multi-core acceleration. + +>[!TIP] +>You can verify whether your site is correctly isolated by checking the browser console for cross-origin isolation status or by calling window.crossOriginIsolated in DevTools. + +## How to manually specify which Wasm variant to load? + +By default, the SDK automatically determines the most suitable WebAssembly (Wasm) variant to load based on the browser’s capabilities. +However, developers can **manually override** this behavior and explicitly specify which Wasm module to load through the `wasmLoadOptions` property. + +### Example + +```javascript +Dynamsoft.Core.CoreModule.wasmLoadOptions = { + wasmType: "ml-simd-pthread", + pthreadPoolSize: 5, +}; +``` + +### Supported Wasm Types + +```javascript +type WasmType = + | "baseline" // Basic single-threaded variant + | "ml-simd" // SIMD-optimized variant + | "ml-simd-pthread" // Multi-threaded + SIMD optimized variant + | "auto"; // Automatically select based on environment +``` + +>[!NOTE] +>Setting wasmType to "auto" (default) allows the SDK to automatically choose the optimal Wasm based on runtime capability detection. +> +>When using "ml-simd-pthread", ensure that cross-origin isolation is properly configured as described in How to enable `-SIMD-Pthread Wasm` for accelerated deep learning computation. +> +>If the specified Wasm variant is not supported in the current browser, the SDK will gracefully fall back to a compatible variant. + +## Why isn’t -SIMD-Pthread Wasm enabled by default on iOS? + +Due to iOS’s strict memory allocation and management limitations, loading `-SIMD-Pthread Wasm` can sometimes lead to “out of memory” errors on older devices or iOS versions. +To ensure stability and compatibility, the SDK does not load `-SIMD-Pthread Wasm` by default on iOS. Instead, it automatically falls back to the most suitable Baseline or SIMD variant depending on the environment. \ No newline at end of file diff --git a/programming/javascript/index.md b/programming/javascript/index.md index cf0a17ff..8d24e4de 100644 --- a/programming/javascript/index.md +++ b/programming/javascript/index.md @@ -13,25 +13,25 @@ breadcrumbText: JavaScript Dynamsoft Barcode Reader (DBR) can be used in JavaScript to add barcode reading capabilities to websites running in modern browsers. It is ideal for -* organizations who already have sophisticated websites and do not intend to develop mobile applications for the same purposes; or -* organizations whose customers have no desire to install applications for temporary usage of their services. +- organizations who already have sophisticated websites and do not intend to develop mobile applications for the same purposes; or +- organizations whose customers have no desire to install applications for temporary usage of their services. To get a fast start, you can -* read the [User Guide](user-guide/barcode-scanner.html), or -* try the [Samples and Demos](samples-demos/) +- read the [User Guide](user-guide/barcode-scanner.html), or +- try the [Samples and Demos](samples-demos/) The following describes the highlights of DBR JavaScript edition (DBR-JS) version 11.x. # ✨BarcodeScanner – Simplified API and Built-in UI -The `BarcodeScanner` class offering a streamlined API and a prebuilt interactive UI, making barcode scanning integration easier than ever. This is now the recommended way to use DBR-JS, especially for developers who want a quick, clean, and robust scanning experience with minimal setup. +The `BarcodeScanner` class offers a streamlined API and a prebuilt interactive UI, making barcode scanning integration easier than ever. This is now the recommended way to use DBR-JS, especially for developers who want a quick, clean, and robust scanning experience with minimal setup. With `BarcodeScanner`, you can: -- Instantiate and configure the scanner with just a few lines of code; +- Instantiate and configure the scanner with just a few lines of code. -- Select your scanning mode and present a ready-to-use scanning interface; +- Select your scanning mode and present a ready-to-use scanning interface. - Focus on your application logic without worrying about camera setup, UI rendering, or lifecycle management. @@ -42,11 +42,11 @@ With `BarcodeScanner`, you can: ## Fast Integration -This [JSFiddle example](https://jsfiddle.net/DynamsoftTeam/gcqjf5r7/) demonstrates all the code needed to build a web application using `BarcodeScanner`, end users of the web page can open it in a browser, access their cameras and read barcodes directly from the video input. +This [JSFiddle example](https://jsfiddle.net/DynamsoftTeam/gcqjf5r7/) demonstrates all the code needed to build a web application using `BarcodeScanner`. End users of the web page can open it in a browser, access their cameras, and read barcodes directly from the video input. ### Camera Control -Customers generally need to scan a barcode on the fly at which time there is no better input than the camera hooked to or built into the device itself. As shown in the code snippet above, the product **Dynamsoft Camera Enhancer (DCE)** is used to provide camera support. It makes use of the powerful [**MediaDevices**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices) interface (provided by the browser itself) to instantly access the video input of the camera, capture image frames and supply them to the back-end decoding engine. +Customers generally need to scan a barcode on the fly at which time there is no better input than the camera hooked to or built into the device itself. As shown in the example above, the product **Dynamsoft Camera Enhancer (DCE)** is used to provide camera support. It makes use of the powerful [**MediaDevices**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices) interface (provided by the browser itself) to instantly access the video input of the camera, capture image frames and supply them to the back-end decoding engine. > DBR and DCE communicate through the interface called [Image Source Adapter]({{ site.dcvb_architecture }}input.html#image-source-adapter?lang=js). @@ -74,21 +74,21 @@ The actual use environment is unpredictable. The barcode may appear distorted, i DBR does a lot of preparation work to make sure the barcode is as legible as possible for the decoding engine to read. This ensures a very high accuracy. In addition, DBR achieves even higher accuracy through the following ways: -* DBR can verify results by comparing the results of multiple consecutive recognitions; -* DBR has a confidence score for each recognition which can be used to filter unwanted results; -* DBR is also able to verify the barcode result with printed text that accompanies the barcode with the help of the product **Dynamsoft Label Recognizer (DLR)**. +- DBR can verify results by comparing the results of multiple consecutive recognitions; +- DBR has a confidence score for each recognition which can be used to filter unwanted results; +- DBR is also able to verify the barcode result with printed text that accompanies the barcode with the help of the product **Dynamsoft Label Recognizer (DLR)**. -Through many experiences, DBR has also cultivated its error correction ability to handle +Through extensive real-world use, DBR has also cultivated its error correction ability to handle: -* Non-standard barcodes which do not strictly abide by the specification; -* Deformed barcodes which are usually caused by improper printing. +- Non-standard barcodes which do not strictly abide by the specification; +- Deformed barcodes which are usually caused by improper printing. ## Effortless Expansion DBR-JS v11.x is based on [Dynamsoft Capture Vision]({{site.dcvb_architecture}}) which is a modular architecture. This architecture makes it easy to add new functionality or custom behavior with very little change to the code. Two examples are: -* Add **Dynamsoft Document Normalizer (DDN)** to do perspective correction before pass an image frame to read barcodes; -* Add **Dynamsoft Code Parser (DCP)** to parse the text embedded in the PDF417 on driver's licenses. +- Add **Dynamsoft Document Normalizer (DDN)** to do perspective correction before passing an image frame to read barcodes; +- Add **Dynamsoft Code Parser (DCP)** to parse the text embedded in the PDF417 on driver's licenses. ## Next Step diff --git a/programming/javascript/release-notes/index.md b/programming/javascript/release-notes/index.md index 1b620133..e216b9f6 100644 --- a/programming/javascript/release-notes/index.md +++ b/programming/javascript/release-notes/index.md @@ -9,6 +9,7 @@ breadcrumbText: Release Notes # DBR JavaScript SDK - Release Notes +- [11.2.2000 (10/30/2025)](js-11.html#1122000-10302025) - [11.0.6000 (08/14/2025)](js-11.html#1106000-08142025) - [11.0.3000 (07/09/2025)](js-11.html#1103000-07092025) - [10.5.3000 (04/24/2025)](js-10.html#1053000-04242025) diff --git a/programming/javascript/release-notes/js-11.md b/programming/javascript/release-notes/js-11.md index 0a85b937..9db586d4 100644 --- a/programming/javascript/release-notes/js-11.md +++ b/programming/javascript/release-notes/js-11.md @@ -10,6 +10,69 @@ noTitleIndex: true # Release Notes for Dynamsoft Barcode Reader JavaScript SDK +## 11.2.2000 (10/30/2025) + +### ✨ Key Highlights +#### AI-Powered Barcode Detection and Decoding + +- New Localization Models – Introduces [`OneDLocalization`]({{ site.dcvb_parameters }}barcode-reader-task-settings/localization-modes.html#modelnamearray) and [`DataMatrixQRCodeLocalization`]({{ site.dcvb_parameters }}barcode-reader-task-settings/localization-modes.html#modelnamearray) neural network models for improved detection of **blurred / low-resolution 1D codes**, or **partially damaged DataMatrix/QR codes**. +- Specialized Decoders – Adds [`EAN13Decoder`]({{ site.dcvb_parameters }}barcode-reader-task-settings/deblur-modes.html#modelnamearray) and [`Code128Decoder`]({{ site.dcvb_parameters }}barcode-reader-task-settings/deblur-modes.html#modelnamearray) models optimized for **long-distance** and **motion-blurred** decoding scenarios. +- Redesigned Deblur Model – The [`OneDDeblur`]({{ site.dcvb_parameters }}barcode-reader-task-settings/deblur-modes.html#modelnamearray) model now provides more effective recovery from **motion and focus blur**. +- Configurable Model Selection – The new `ModelNameArray` parameter supports flexible model loading and fine-grained control for specific barcode types. + +#### Precision and Processing Control + +- Enhanced Deblur Methods – [`DM_DEEP_ANALYSIS`]({{ site.dcvb_parameters }}barcode-reader-task-settings/deblur-modes.html#dm_deep_analysis) now includes sub-level control with `OneDGeneral`, `TwoDGeneral`, and `EAN13Enhanced` options. +- Barcode Count Expectation – The new [`ExpectedBarcodesCount`]({{ site.dcvb_parameters }}barcode-format-specification/expected-barcodes-count.html) parameter enables **format-specific quantity control** and **early termination** in fixed-count workflows. +- Improved Region Detection – The new [`RPM_GRAY_CONSISTENCY`]({{ site.dcvb_parameters }}image-parameter/region-predetection-modes.html#rpm_gray_consistency) mode provides more precise region extraction based on **grayscale uniformity** and **local consistency** for document and label processing. + +### Performance Highlights + +- Up to **26.5%** higher read rates under blur conditions with as much as **44%** faster processing. +- Reliable decoding of DataMatrix and QR codes with missing or damaged finder patterns. +- Extended operational range beyond 75 cm for long-distance barcode scanning. + +### Developer Notes + +- Backward Compatibility – Fully compatible with existing integrations; no code-level changes required for upgrade. +- Configuration Flexibility – Expanded parameter set allows comprehensive model configuration for scenario-specific tuning. +- Production Stability – All new models validated in enterprise environments. + +#### Updates for [BarcodeScanner](https://dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/barcode-scanner.html) + +- In **single** mode, if the target barcode is not found among the candidates, there is now an opportunity to rescan. + +- Fixed an issue where the barcode location could be inaccurate in certain cases. +- Fixed a problem where, in specific cases when the camera was occupied, the video stream could not be displayed correctly. +- Other known issues fixed. + +#### Engineering Optimizations + +- Optimized the parallel download logic to improve resource loading speed. +- Optimized [adaptive WASM loading logic](../faq/adaptive-wasm-loading.md) to further enhance performance in modern browser environments. + +### API Changes + +#### New + +- Added the `switchCapturingTemplate()` method to the `CaptureVisionRouter` class to enable switching the active capturing template during the image processing workflow. +- Added methods `toBlob()`, `toImage()`, and `toCanvas()` to the `originalImageResultItem` interface for flexible image data conversion. +- Added the `SetGlobalIntraOpNumThreads()` method to the `CaptureVisionRouter` class to configure the global thread count for model inference. +- Added the `clearDLModelBuffers()` method to the `CaptureVisionRouter` class to manually release memory occupied by loaded models. +- Added callback functions `onSpecLoadProgressChanged()` and `onWasmLoadProgressChanged()` to monitor resource loading progress. +- Added the `convertToContainCoordinates()` method to the `CameraEnhancer` class to convert coordinates from `fit: cover` to `fit: contain` mode. +- Added the `LM_NEURAL_NETWORK` enumeration to `EnumLocalizationMode`. + +#### Updated + +- Changed the default value of `MaxThreadsInOneTask` from **4** to **0**. +- Changed the default value of `IncludeTrailingCheckDigit` from **1** to **0**. + +#### Deprecated + +- Deprecated the `DeblurModelNameArray` argument in the `DeblurModes` parameter. Use `ModelNameArray` instead. +- Deprecated the `appendModelBuffer()` method in the `CaptureVisionRouter` class. Use `appendDLModelBuffer()` instead. + ## 11.0.6000 (08/14/2025) ### New diff --git a/programming/javascript/upgrade-guide/10to11.md b/programming/javascript/upgrade-guide/10to11.md index e036d73c..a8dff16e 100644 --- a/programming/javascript/upgrade-guide/10to11.md +++ b/programming/javascript/upgrade-guide/10to11.md @@ -14,7 +14,7 @@ permalink: /programming/javascript/upgrade-guide/10to11.html To use version 11, include the following script in your HTML: ```html - + ``` ## APIs changes introduced in v11 diff --git a/programming/javascript/user-guide/assets/updateBarcodeFormat.png b/programming/javascript/user-guide/assets/updateBarcodeFormat.png index 6978e16c515941f4c4c2eb12d89a79d44f32a290..49b910127c5ba8bb236d71c8fb8757d10b0db899 100644 GIT binary patch literal 5524 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 diff --git a/programming/javascript/user-guide/barcode-scanner-customization.md b/programming/javascript/user-guide/barcode-scanner-customization.md index 507e5342..7f426be4 100644 --- a/programming/javascript/user-guide/barcode-scanner-customization.md +++ b/programming/javascript/user-guide/barcode-scanner-customization.md @@ -3,7 +3,7 @@ layout: default-layout needAutoGenerateSidebar: true needGenerateH3Content: true noTitleIndex: true -title: Customizations - Dynamsoft Barcode Scanner v11.0.6000 JavaScript Edition +title: Customizations - Dynamsoft Barcode Scanner v11.2.2000 JavaScript Edition keywords: Documentation, Barcode Scanner, Dynamsoft Barcode Scanner JavaScript Edition, customization description: Dynamsoft Barcode Scanner customization --- @@ -12,7 +12,7 @@ description: Dynamsoft Barcode Scanner customization - [Specify the barcode format](#specify-the-barcode-format) - [Use customized template](#use-customized-template) -- [Config the pre-built UIs](#config-the-pre-built-uis) +- [Configure the pre-built UIs](#configure-the-pre-built-uis) - [Use BarcodeScanner in frameworks](#use-barcodescanner-in-frameworks) ## Specify the barcode format @@ -49,7 +49,7 @@ The benefit of this approach is that the template file can be reused across diff Refer to [`Use customized template`](#use-customized-template) for more details. > [!IMPORTANT] -> Due to the powerful customization capabilities, the number of configurable parameters in the templates is extensive and relatively complex. feel free to [contact us](https://www.dynamsoft.com/contact/) if you need help creating a custom template. +> Due to the powerful customization capabilities, the number of configurable parameters in the templates is extensive and relatively complex. Feel free to [contact us](https://www.dynamsoft.com/contact/) if you need help creating a custom template. ## Use customized template @@ -61,13 +61,13 @@ In more complex scenarios—such as blurred, damaged, curved, or unevenly lit ba ```js const barcodeScannerConfig = { // The path to your custom JSON template that defines the scanning process. - templateFilePath:'path/to/DBR-PresetTemplates.json' + templateFilePath: 'path/to/DBR-PresetTemplates.json' }; // Initialize the BarcodeScanner with the above BarcodeScannerConfig object const barcodeScanner = new Dynamsoft.BarcodeScanner(barcodeScannerConfig); ``` -## Config the Pre-built UIs +## Configure the Pre-built UIs The built-in UI of `BarcodeScanner` is composed of `BarcodeScannerView` and `BarcodeResultView`. In `MULTI_UNIQUE` mode, `BarcodeResultView` is shown by default to ensure the essential workflow can proceed. Other UI components can be shown or hidden manually through `barcodeScannerConfig`. Let's break down these two Views: @@ -81,7 +81,7 @@ The `BarcodeScannerView` is composed of the following UI elements: 2. **Load Image Button**: This button allows the user to scan a file of a barcode-containing image from the device's local storage. You can decide whether to show or hide the button by [showUploadImageButton]({{ site.js_api }}barcode-scanner.html#barcodescannerconfig) property. -3. **Close Scanner Button**: This button closes the Barcode Scanner, return a [`BarcodeScanResult`]({{ site.js_api }}barcode-scanner.html#barcodescanresult) object and destroys the **`BarcodeScanner`** instance. You can decide whether to show or hide the button by [showCloseButton]({{ site.js_api }}barcode-scanner.html#scannerviewconfig) property. +3. **Close Scanner Button**: This button closes the Barcode Scanner, returns a [`BarcodeScanResult`]({{ site.js_api }}barcode-scanner.html#barcodescanresult) object and destroys the **`BarcodeScanner`** instance. You can decide whether to show or hide the button by [showCloseButton]({{ site.js_api }}barcode-scanner.html#scannerviewconfig) property. 4. **Flash Button**: This button allows the user to toggle the camera's torch. You can decide whether to show or hide the button by [showFlashButton]({{ site.js_api }}barcode-scanner.html#barcodescannerconfig) property. @@ -97,11 +97,11 @@ Here is a quick breakdown of the `MULTI_UNIQUE` UI elements of the `BarcodeResul 2. **Clear Button**: The button on the bottom left, which clears all elements of the current `Barcode Results List`. You can change the style of the Button with [BarcodeResultViewToolbarButtonsConfig]({{ site.js_api }}barcode-scanner.html#barcoderesultviewtoolbarbuttonsconfig). -3. **Done Button**: The button on the bottom right, which closes the Barcode Scanner, return a [`BarcodeScanResult`]({{ site.js_api }}barcode-scanner.html#barcodescanresult) object that includes all unique barcodes and destroys the **`BarcodeScanner`** instance. You can change the style of the Button with [BarcodeResultViewToolbarButtonsConfig]({{ site.js_api }}barcode-scanner.html#barcoderesultviewtoolbarbuttonsconfig). +3. **Done Button**: The button on the bottom right, which closes the Barcode Scanner, returns a [`BarcodeScanResult`]({{ site.js_api }}barcode-scanner.html#barcodescanresult) object that includes all unique barcodes and destroys the **`BarcodeScanner`** instance. You can change the style of the Button with [BarcodeResultViewToolbarButtonsConfig]({{ site.js_api }}barcode-scanner.html#barcoderesultviewtoolbarbuttonsconfig). ### Manually modify the UI file -Another way to fully customize the UI is by directly editing the `.xml` file. In the `dist/` directory, you'll find the `barcode-scanner.ui.xml` file, which is the default UI for the `BarcodeScanner`. +Another way to fully customize the UI is by directly editing the `.xml` file. In the `dist/ui/` directory, you'll find the `barcode-scanner.ui.xml` file, which is the default UI for the `BarcodeScanner`. > [!NOTE] > Although it is essentially HTML, using a .xml extension can help prevent compatibility issues with the Live Server plugin. @@ -136,7 +136,7 @@ Integrating `BarcodeScanner` into frameworks like `Angular`, `React`, and `Vue` Open the terminal from your project root and install **Dynamsoft Barcode Reader SDK** with the following command: ```sh -npm install dynamsoft-barcode-reader-bundle@11.0.6000 -E +npm install dynamsoft-barcode-reader-bundle@11.2.2000 -E ``` ### Component for video decoding @@ -164,10 +164,10 @@ Below is an example using the official CDN — feel free to replace it with your // Configures the paths where the .wasm files and other necessary resources for modules are located. engineResourcePaths: { // Using jsDelivr CDN as an example - rootDirectory: "https://cdn.jsdelivr.net/npm/dynamsoft-barcode-reader-bundle@11.0.6000/dist/", + rootDirectory: "https://cdn.jsdelivr.net/npm/", }, // Path to the UI (.xml template file). - uiPath: "https://cdn.jsdelivr.net/npm/dynamsoft-barcode-reader-bundle@11.0.6000/dist/barcode-scanner.ui.xml", + uiPath: "https://cdn.jsdelivr.net/npm/dynamsoft-barcode-reader-bundle@11.2.2000/dist/ui/barcode-scanner.ui.xml", }; ``` diff --git a/programming/javascript/user-guide/barcode-scanner.md b/programming/javascript/user-guide/barcode-scanner.md index 8461318a..5c11ea77 100644 --- a/programming/javascript/user-guide/barcode-scanner.md +++ b/programming/javascript/user-guide/barcode-scanner.md @@ -3,7 +3,7 @@ layout: default-layout needAutoGenerateSidebar: true needGenerateH3Content: true noTitleIndex: true -title: User Guide - Dynamsoft Barcode Scanner v11.0.6000 JavaScript Edition +title: User Guide - Dynamsoft Barcode Scanner v11.2.2000 JavaScript Edition keywords: Documentation, Barcode Scanner, Dynamsoft Barcode Scanner JavaScript Edition, description: Dynamsoft Barcode Scanner User Guide --- @@ -66,7 +66,7 @@ If you are fully satisfied with the solution and would like to move forward with - + + ``` -In this example, we include the precompiled Barcode Scanner SDK script via public CDN in the header. +In this example, we include the precompiled Barcode Scanner SDK script via public CDN in the body.
@@ -127,24 +127,24 @@ The simplest way to include the SDK is to use either the [**jsDelivr**](https:// - jsDelivr ```html - + ``` - UNPKG ```html - + ``` When using a framework such as **React**, **Vue** or **Angular**, we recommend adding the package as a dependency using a package manager such as **npm** or **yarn**: ```sh - npm i dynamsoft-barcode-reader-bundle@11.0.6000 + npm i dynamsoft-barcode-reader-bundle@11.2.2000 # or - yarn add dynamsoft-barcode-reader-bundle@11.0.6000 + yarn add dynamsoft-barcode-reader-bundle@11.2.2000 ``` -As for package managers like **npm** or **yarn**, you likely need to specify the location of the engine files as a link to a CDN. Please see the [BarcodeScannerConfig API](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/barcode-scanner.html#barcodescannerconfig) for a code snippet on how to set the `engineResourcePaths`. +When using package managers like **npm** or **yarn**, you likely need to specify the location of the engine files as a link to a CDN. Please see the [BarcodeScannerConfig API](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/barcode-scanner.html#barcodescannerconfig) for a code snippet on how to set the `engineResourcePaths`.
@@ -154,14 +154,14 @@ Alternatively, you may choose to download the SDK and host the files on your own - From the website - [Download Dynamsoft Barcode Reader JavaScript Package](https://www.dynamsoft.com/barcode-reader/downloads/?ver=11.0.60&utm_source=guide&product=dbr&package=js) + [Download Dynamsoft Barcode Reader JavaScript Package](https://www.dynamsoft.com/barcode-reader/downloads/?ver=11.2.20&utm_source=guide&product=dbr&package=js) The resources are located in the `./dist/` directory. - From npm ```sh - npm i dynamsoft-barcode-reader-bundle@11.0.6000 + npm i dynamsoft-barcode-reader-bundle@11.2.2000 ``` The resources are located at the path `node_modules/`, without `@`. You can copy it elsewhere and add `@` tag. @@ -169,10 +169,10 @@ Alternatively, you may choose to download the SDK and host the files on your own > [!IMPORTANT] > Since "node_modules" is reserved for Node.js dependencies, and in our case the package is used only as static resources, we recommend either renaming the "node_modules" folder or moving the "dynamsoft-" packages to a dedicated folder for static resources in your project to facilitate self-hosting. -You can typically include SDK like this: +You can typically include the SDK like this: ```html - + ```
@@ -184,9 +184,9 @@ Barcode Scanner comes with a **Ready-to-Use UI**. When the Barcode Scanner launc ```js // Initialize the Dynamsoft Barcode Scanner -const barcodescanner = new Dynamsoft.BarcodeScanner({ +const barcodeScanner = new Dynamsoft.BarcodeScanner({ // Please don't forget to replace YOUR_LICENSE_KEY_HERE - license: "YOUR_LICENSE_KEY_HERE", + license: "YOUR_LICENSE_KEY_HERE", }); ``` @@ -197,7 +197,7 @@ This is the **simplest** way to initialize the Barcode Scanner. The configuratio ```js // Initialize the Dynamsoft Barcode Scanner in MULTI_UNIQUE mode -const barcodescanner = new Dynamsoft.BarcodeScanner({ +const barcodeScanner = new Dynamsoft.BarcodeScanner({ license: "YOUR_LICENSE_KEY_HERE", scanMode: Dynamsoft.EnumScanMode.SM_MULTI_UNIQUE, }); @@ -208,7 +208,7 @@ const barcodescanner = new Dynamsoft.BarcodeScanner({ ```js (async () => { // Launch the scanner and wait for the result - const result = await barcodescanner.launch(); + const result = await barcodeScanner.launch(); // Display the first detected barcode's text in an alert if (result.barcodeResults.length) { alert(result.barcodeResults[0].text); @@ -219,12 +219,12 @@ const barcodescanner = new Dynamsoft.BarcodeScanner({ Now that the Barcode Scanner has been initialized and configured, it is ready to be launched! Upon launch, the Barcode Scanner presents the main **`BarcodeScannerView`** UI in its container on the page, and is ready to start scanning. By default, we use the `SINGLE` scanning mode, which means only one decoding result will be included in the final result. In the code above, we directly alerted the successfully decoded barcode text on the page. > [!NOTE] -> In the Hello World sample, after a successfully decoding process, the scanner closes and the user is met with an empty page. In order to open the scanner again, the user must refresh the page. You may choose to implement a more user-friendly behavior in a production environment, such as presenting the user with an option to re-open the Barcode Scanner upon closing it. +> In the Hello World sample, after a successful decoding process, the scanner closes and the user is met with an empty page. In order to open the scanner again, the user must refresh the page. You may choose to implement a more user-friendly behavior in a production environment, such as presenting the user with an option to re-open the Barcode Scanner upon closing it. ## Next Steps -Now that you've implemented the basic functionality, here are some recommended next steps to further explore the capabilities of the Barcode Scanner +Now that you've implemented the basic functionality, here are some recommended next steps to further explore the capabilities of the Barcode Scanner: 1. Learn how to [Customize the Barcode Scanner](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/user-guide/barcode-scanner-customization.html) -2. Check out the [Official Samples and Demo](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/samples-demos/index.html?ver=11.0.6000) -3. Learn about the [APIs of BarcodeScanner](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/barcode-scanner.html?ver=11.0.6000) +2. Check out the [Official Samples and Demo](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/samples-demos/index.html?ver=11.2.2000) +3. Learn about the [APIs of BarcodeScanner](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/barcode-scanner.html?ver=11.2.2000) diff --git a/programming/javascript/user-guide/index.md b/programming/javascript/user-guide/index.md index ec6266f0..0e119a8f 100644 --- a/programming/javascript/user-guide/index.md +++ b/programming/javascript/user-guide/index.md @@ -1,6 +1,6 @@ --- layout: default-layout -title: v11.0.6000 User Guide - Dynamsoft Barcode Reader JavaScript Edition +title: v11.2.2000 User Guide - Dynamsoft Barcode Reader JavaScript Edition description: This is the user guide of Dynamsoft Barcode Reader JavaScript SDK. keywords: user guide, javascript, js breadcrumbText: User Guide @@ -64,21 +64,21 @@ In this guide, you will learn step by step on how to integrate the DBR-JS SDK in **Popular Examples** -- Hello World - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/hello-world/hello-world.html) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/hello-world/hello-world.html?ver=11.0.60&utm_source=guide) -- Angular App - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/hello-world/angular) -- React App - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/hello-world/react) -- Vue App - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/hello-world/vue) -- PWA App - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/hello-world/pwa) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/hello-world/pwa/helloworld-pwa.html?ver=11.0.60&utm_source=guide) -- WebView in Android and iOS - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/tree/v11.0.60/foundational-api-samples/hello-world/webview) -- Read Driver Licenses - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/use-case/read-a-drivers-license/index.html) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/use-case/read-a-drivers-license/index.html?ver=11.0.60&utm_source=guide) -- Fill A Form - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/use-case/fill-a-form-with-barcode-reading.html) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/use-case/fill-a-form-with-barcode-reading.html?ver=11.0.60&utm_source=guide) -- Show result information on the video - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/use-case/show-result-texts-on-the-video.html) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/use-case/show-result-texts-on-the-video.html?ver=11.0.60&utm_source=guide) -- Debug Camera and Collect Video Frame - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.0.60/foundational-api-samples/others/debug) +- Hello World - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/hello-world/hello-world.html) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/hello-world/hello-world.html?ver=11.2.20&utm_source=guide) +- Angular App - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/hello-world/angular) +- React App - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/hello-world/react) +- Vue App - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/hello-world/vue) +- PWA App - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/hello-world/pwa) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/hello-world/pwa/helloworld-pwa.html?ver=11.2.20&utm_source=guide) +- WebView in Android and iOS - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/tree/v11.2.20/foundational-api-samples/hello-world/webview) +- Read Driver Licenses - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/use-case/read-a-drivers-license/index.html) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/use-case/read-a-drivers-license/index.html?ver=11.2.20&utm_source=guide) +- Fill A Form - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/use-case/fill-a-form-with-barcode-reading.html) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/use-case/fill-a-form-with-barcode-reading.html?ver=11.2.20&utm_source=guide) +- Show result information on the video - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/use-case/show-result-texts-on-the-video.html) \| [Run](https://demo.dynamsoft.com/Samples/DBR/JS/foundational-api-samples/use-case/show-result-texts-on-the-video.html?ver=11.2.20&utm_source=guide) +- Debug Camera and Collect Video Frame - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/blob/v11.2.20/foundational-api-samples/others/debug) You can also: -- Try the Official Demo - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-demo/) \| [Run](https://demo.dynamsoft.com/barcode-reader-js/?ver=11.0.60&utm_source=guide) -- Try Online Examples - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/tree/v11.0.60/) +- Try the Official Demo - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-demo/) \| [Run](https://demo.dynamsoft.com/barcode-reader-js/?ver=11.2.20&utm_source=guide) +- Try Online Examples - [Github](https://github.com/Dynamsoft/barcode-reader-javascript-samples/tree/v11.2.20/) ## Hello World - Simplest Implementation @@ -102,7 +102,7 @@ The complete code of the "Hello World" example is shown below
- + + ``` - UNPKG ```html - + ``` @@ -246,9 +246,9 @@ The simplest way to include the SDK is to use either the [jsDelivr](https://jsde - In frameworks like React, Vue and Angular, you may want to add the package as a dependency. ```sh - npm i dynamsoft-barcode-reader-bundle@11.0.6000 -E + npm i dynamsoft-barcode-reader-bundle@11.2.2000 -E # or - yarn add dynamsoft-barcode-reader-bundle@11.0.6000 -E + yarn add dynamsoft-barcode-reader-bundle@11.2.2000 -E ``` NOTE that in frameworks, you need to [specify the location of the engine files](#2-optional-specify-the-location-of-the-engine-files). @@ -261,14 +261,14 @@ Besides using the public CDN, you can also download the SDK and host its files o - From the website - [Download Dynamsoft Barcode Reader JavaScript Package](https://www.dynamsoft.com/barcode-reader/downloads/?ver=11.0.60&utm_source=guide&product=dbr&package=js) + [Download Dynamsoft Barcode Reader JavaScript Package](https://www.dynamsoft.com/barcode-reader/downloads/?ver=11.2.20&utm_source=guide&product=dbr&package=js) The resources are located at path `dynamsoft/distributables/@`. - From npm ```sh - npm i dynamsoft-barcode-reader-bundle@11.0.6000 -E + npm i dynamsoft-barcode-reader-bundle@11.2.2000 -E # Compared with using CDN, you need to set up more resources. npm i dynamsoft-capture-vision-std@1.4.21 -E npm i dynamsoft-image-processing@2.4.31 -E @@ -280,7 +280,7 @@ Besides using the public CDN, you can also download the SDK and host its files o You can typically include SDK like this: ```html - + ```
@@ -312,7 +312,7 @@ To enable the SDK's functionality, you must provide a valid license. Utilize the Dynamsoft.License.LicenseManager.initLicense("DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9"); ``` -As previously stated, the key "DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9" serves as a test license valid for 24 hours, applicable to any newly authorized browser. To test the SDK further, you can request a 30-day free trial license via the Request a Trial License link. +As previously stated, the key "DLS2eyJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSJ9" serves as a test license valid for 24 hours, applicable to any newly authorized browser. To test the SDK further, you can request a 30-day free trial license via the Request a Trial License link. > Upon registering a Dynamsoft account and obtaining the SDK package from the official website, Dynamsoft will automatically create a 30-day free trial license and embed the corresponding license key into all the provided SDK samples. @@ -591,7 +591,7 @@ await cvRouter.startCapturing("ReadSingleBarcode"); The preset templates have many more settings that can be customized to suit your use case best. If you [download the SDK from Dynamsoft website](https://www.dynamsoft.com/barcode-reader/downloads/1000003-confirmation/), you can find the templates under -* "/dynamsoft-barcode-reader-js-11.0.6000/dynamsoft/templates/" +* "/dynamsoft-barcode-reader-js-11.2.2000/dist/templates/" Upon completing the template editing, you can invoke the `initSettings` method and provide it with the template path as an argument. @@ -693,7 +693,7 @@ The UI is part of the auxiliary SDK "Dynamsoft Camera Enhancer", read more on ho ### API Reference You can check out the detailed documentation about the APIs of the SDK at -[https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/?ver=11.0.6000](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/?ver=11.0.6000). +[https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/?ver=11.2.2000](https://www.dynamsoft.com/barcode-reader/docs/web/programming/javascript/api-reference/?ver=11.2.2000). +- [Build a Web-Based Barcode Scanner Using Just a Few Lines of JavaScript](#build-a-web-based-barcode-scanner-using-just-a-few-lines-of-javascript) + - [License](#license) + - [Quick Start: Hello World Example](#quick-start-hello-world-example) + - [Step 1: Setting up the HTML and Including the Barcode Scanner](#step-1-setting-up-the-html-and-including-the-barcode-scanner) + - [Step 2: Initializing the Barcode Scanner](#step-2-initializing-the-barcode-scanner) + - [Step 3: Launching the Barcode Scanner](#step-3-launching-the-barcode-scanner) + - [Next Steps](#next-steps) + This user guide provides a step-by-step walkthrough of a "Hello World" web application using the `BarcodeScanner` JavaScript Edition. The `BarcodeScanner` class offers the following features: @@ -45,20 +54,11 @@ new Dynamsoft.BarcodeScanner().launch().then(result=>alert(result.barcodeResults ## License -When getting started with Barcode Scanner, we recommend getting your own 30-day trial license. - - - -{% include trialLicense.html %} - - + {% include trialLicense.html %} --> ## Quick Start: Hello World Example diff --git a/programming/javascript/user-guide/zip-guide.md b/programming/javascript/user-guide/zip-guide.md index 94069231..3757d51c 100644 --- a/programming/javascript/user-guide/zip-guide.md +++ b/programming/javascript/user-guide/zip-guide.md @@ -48,8 +48,8 @@ Here are a couple of easy ways to start one: ## Sample Folders -- `barcode-scanner-api-samples/` – Samples using the Barcode Scanner API with a prebuilt interactive UI, making barcode scanning integration quick and easy. -- `foundational-api-samples/` – Samples using the foundational API with full customization capabilities. +- `frameworks/` – This directory contains framework-specific examples demonstrating how to integrate the Dynamsoft Barcode Reader (JavaScript edition) into common web and hybrid frameworks. Each framework folder contains one or more runnable sub-examples (for example, scan-using-foundational-api and/or scan-using-rtu-api) showing practical integration patterns. +- `scenarios/` – This directory contains focused scenario samples that show common real-world uses of the Dynamsoft Barcode Reader (JavaScript edition). --- From 0d5561c6b64896c2596ae4f0581b333ad09ff22e Mon Sep 17 00:00:00 2001 From: DMGithubPublisher Date: Wed, 29 Oct 2025 16:47:06 +0800 Subject: [PATCH 3/6] update to internal commit 4e8a3be7 --- programming/javascript/user-guide/barcode-scanner.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/programming/javascript/user-guide/barcode-scanner.md b/programming/javascript/user-guide/barcode-scanner.md index a20fd61e..5b2b0741 100644 --- a/programming/javascript/user-guide/barcode-scanner.md +++ b/programming/javascript/user-guide/barcode-scanner.md @@ -221,6 +221,8 @@ Now that the Barcode Scanner has been initialized and configured, it is ready to > [!NOTE] > In the Hello World sample, after a successful decoding process, the scanner closes and the user is met with an empty page. In order to open the scanner again, the user must refresh the page. You may choose to implement a more user-friendly behavior in a production environment, such as presenting the user with an option to re-open the Barcode Scanner upon closing it. +> [!TIP] +> When running performance benchmarks, make sure to disable the console, avoid using `console.log()`, and run in non-debug mode whenever possible. This ensures that your benchmark results reflect true performance without interference from logging or debugging overhead. ## Next Steps Now that you've implemented the basic functionality, here are some recommended next steps to further explore the capabilities of the Barcode Scanner: From 01a383353caf9cd4b1b9e016866211288c4942a1 Mon Sep 17 00:00:00 2001 From: DMGithubPublisher Date: Tue, 4 Nov 2025 13:26:32 +0800 Subject: [PATCH 4/6] update to internal commit 44e4e8c0 --- programming/javascript/release-notes/index.md | 2 +- programming/javascript/release-notes/js-11.md | 2 +- programming/javascript/user-guide/zip-guide.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/programming/javascript/release-notes/index.md b/programming/javascript/release-notes/index.md index e216b9f6..2eb1474c 100644 --- a/programming/javascript/release-notes/index.md +++ b/programming/javascript/release-notes/index.md @@ -9,7 +9,7 @@ breadcrumbText: Release Notes # DBR JavaScript SDK - Release Notes -- [11.2.2000 (10/30/2025)](js-11.html#1122000-10302025) +- [11.2.2000 (11/04/2025)](js-11.html#1122000-11042025) - [11.0.6000 (08/14/2025)](js-11.html#1106000-08142025) - [11.0.3000 (07/09/2025)](js-11.html#1103000-07092025) - [10.5.3000 (04/24/2025)](js-10.html#1053000-04242025) diff --git a/programming/javascript/release-notes/js-11.md b/programming/javascript/release-notes/js-11.md index 9db586d4..40e94af8 100644 --- a/programming/javascript/release-notes/js-11.md +++ b/programming/javascript/release-notes/js-11.md @@ -10,7 +10,7 @@ noTitleIndex: true # Release Notes for Dynamsoft Barcode Reader JavaScript SDK -## 11.2.2000 (10/30/2025) +## 11.2.2000 (11/04/2025) ### ✨ Key Highlights #### AI-Powered Barcode Detection and Decoding diff --git a/programming/javascript/user-guide/zip-guide.md b/programming/javascript/user-guide/zip-guide.md index 3757d51c..94069231 100644 --- a/programming/javascript/user-guide/zip-guide.md +++ b/programming/javascript/user-guide/zip-guide.md @@ -48,8 +48,8 @@ Here are a couple of easy ways to start one: ## Sample Folders -- `frameworks/` – This directory contains framework-specific examples demonstrating how to integrate the Dynamsoft Barcode Reader (JavaScript edition) into common web and hybrid frameworks. Each framework folder contains one or more runnable sub-examples (for example, scan-using-foundational-api and/or scan-using-rtu-api) showing practical integration patterns. -- `scenarios/` – This directory contains focused scenario samples that show common real-world uses of the Dynamsoft Barcode Reader (JavaScript edition). +- `barcode-scanner-api-samples/` – Samples using the Barcode Scanner API with a prebuilt interactive UI, making barcode scanning integration quick and easy. +- `foundational-api-samples/` – Samples using the foundational API with full customization capabilities. --- From 137e19bd0c63b36e5f31a9275dc69ee8788a1969 Mon Sep 17 00:00:00 2001 From: DMGithubPublisher Date: Tue, 4 Nov 2025 16:26:37 +0800 Subject: [PATCH 5/6] update to internal commit 0fa96ddd --- programming/javascript/samples-demos/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/programming/javascript/samples-demos/index.md b/programming/javascript/samples-demos/index.md index 018a728a..9489f4e2 100644 --- a/programming/javascript/samples-demos/index.md +++ b/programming/javascript/samples-demos/index.md @@ -112,6 +112,9 @@ needAutoGenerateSidebar: false templates for scanning various barcode types.">Use Customized Template + -
Others
From 7809f70f66dab22b56d0d633adb60a532d93aaae Mon Sep 17 00:00:00 2001 From: DMGithubPublisher Date: Tue, 4 Nov 2025 16:54:38 +0800 Subject: [PATCH 6/6] update to internal commit 8a21948b --- programming/javascript/user-guide/barcode-scanner.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/programming/javascript/user-guide/barcode-scanner.md b/programming/javascript/user-guide/barcode-scanner.md index 5b2b0741..2a65134e 100644 --- a/programming/javascript/user-guide/barcode-scanner.md +++ b/programming/javascript/user-guide/barcode-scanner.md @@ -11,13 +11,13 @@ description: Dynamsoft Barcode Scanner User Guide # Build a Web-Based Barcode Scanner Using Just a Few Lines of JavaScript -- [Build a Web-Based Barcode Scanner Using Just a Few Lines of JavaScript](#build-a-web-based-barcode-scanner-using-just-a-few-lines-of-javascript) + This user guide provides a step-by-step walkthrough of a "Hello World" web application using the `BarcodeScanner` JavaScript Edition. @@ -54,11 +54,11 @@ new Dynamsoft.BarcodeScanner().launch().then(result=>alert(result.barcodeResults ## License -When getting started with Barcode Scanner, we recommend [getting your own 30-day trial license](https://www.dynamsoft.com/customer/license/trialLicense/?product=dbr&utm_source=guide&package=js) + - + {% include trialLicense.html %} ## Quick Start: Hello World Example