@authme/identity-verification 2.4.7 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs CHANGED
@@ -25,6 +25,7 @@ require('core-js/modules/es.parse-int.js');
25
25
  require('core-js/modules/es.regexp.exec.js');
26
26
  require('core-js/modules/es.string.replace.js');
27
27
  require('core-js/modules/es.object.from-entries.js');
28
+ var operators = require('rxjs/operators');
28
29
  require('core-js/modules/es.array-buffer.slice.js');
29
30
  require('core-js/modules/es.typed-array.uint8-array.js');
30
31
  require('core-js/modules/es.typed-array.fill.js');
@@ -73,7 +74,7 @@ function __awaiter(thisArg, _arguments, P, generator) {
73
74
  });
74
75
  }
75
76
 
76
- const LIVENESS_GUIDE_IMG = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEASABIAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAG8AM4DAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+9aVrrWLy4tLe4ls9Lsm8i7ubVzFd315gNJaWtwButre1VlW6uYGFw9wzW0MkDW8zNWyva7e19kv8xb6dFv8A5f5kv/CMeHTzJommXDnlpbyzhvZ3Pq9xdpNPIx7s8jE9zS5pd38nb8g5V2Xz1/MX/hGPDX/QvaH/AOCmw/8Akejml/M/vYcsey+5B/wjHhr/AKF7Q/8AwU2H/wAj0c0v5n97Dlj2X3IP+EY8Nf8AQvaH/wCCmw/+R6OaX8z+9hyx7L7kH/CMeGv+he0P/wAFNh/8j0c0v5n97Dlj2X3IP+EY8Nf9C9of/gpsP/kejml/M/vYcsey+5B/wjHhr/oXtD/8FNh/8j0c0v5n97Dlj2X3IP8AhGPDX/QvaH/4KbD/AOR6OaX8z+9hyx7L7kH/AAjHhr/oXtD/APBTYf8AyPRzS/mf3sOWPZfcg/4Rjw1/0L2h/wDgpsP/AJHo5pfzP72HLHsvuQf8Ix4a/wChe0P/AMFNh/8AI9HNL+Z/ew5Y9l9yD/hGPDX/AEL2h/8AgpsP/kejml/M/vYcsey+5B/wjHhr/oXtD/8ABTYf/I9HNL+Z/ew5Y9l9yD/hGPDX/QvaH/4KbD/5Ho5pfzP72HLHsvuQf8Ix4a/6F7Q//BTYf/I9HNL+Z/ew5Y9l9yD/AIRjw1/0L2h/+Cmw/wDkejml/M/vYcsey+5B/wAIx4a/6F7Q/wDwU2H/AMj0c0v5n97Dlj2X3IP+EY8Nf9C9of8A4KbD/wCR6OaX8z+9hyx7L7kH/CMeGv8AoXtD/wDBTYf/ACPRzS/mf3sOWPZfcg/4Rjw1/wBC9of/AIKbD/5Ho5pfzP72HLHsvuQf8Ix4a/6F7Q//AAU2H/yPRzS/mf3sOWPZfcg/4Rjw1/0L2h/+Cmw/+R6OaX8z+9hyx7L7kH/CMeGv+he0P/wU2H/yPRzS/mf3sOWPZfchp8NaMgJsrOPSZuSlzo6rpsyPggP/AKKqRTYznyrmKeB8BZYpEypOZ9Xf11/r5Byrpp6af8Ak028uhcXGlaiySXtrGlxFcxp5aahYyO0cdz5YASK5jkRobyCMlFk8uaMJFcRxoPutu3Z/1sC7Pf8AQj8Nc6NbOeXmlvriVj1ea4v7qaVye5aR2JJ5560S3+78kEdvv/M3qQz8cv2+/iB+1V4K/aL+F1r8CNY8b6q2uaJ8Hbf4d+AfD0fj7T/Cc3jY/HeSw+Lt58QU0f4O+L/BXxF8PeI/hDqVlp99p3iP4keCm+Dmj+HdZ+JMyacmp2HinS9YKLT5rdbvTbl0tqmrPXS/Nt3umVPjj8d/2x7/AOMn7MEfgbwd8YNS+D1l8UvB0Pjvx18H/hjB4a8L/Em88V/GrxV4F1zwp428LfFPxL/wsnwd4M+E3w58N2+o6zq8ljb6N8QvEXjC28YaVq+keFfDel2mvNRhad2r2dk3e2ie6XK22/la2r2D7K/Yrb4xweHvjzonxo8XePPHereF/wBp34qeHfB3i34g6Hpmganrnw/srbwxNoN5pFlomg+HNDbwyby61dNFl0fTjp6Qo9pDdXTWskpifLePKkrwTaWuut/mCPs6oGFABQAUAFABQAUAFABQAUAFABQAUAFABQB+JH7df/BVL4q/Bjwx8U9B/Zf/AGVfiv8AEb4k+CbP9o3RoPFHjX4deNH8C2Xjr9nxvgTebLLw74atv7V+IPg34haV8Z5/+EW8QaX4q8LNNeeENbW2t9Qjgna22p0lJrmmkvddk1ezv16NW10YmzqfgB4j/bu/aB/ZS/a+jsviXr3w2+POg/tm/tTeFfhFrnijwF4b0jUZPhH4J8eXCeAfAvhSfxX4T1Pw74dsdc0pF8NeG/ix4g8C/E+Lw7aznxBceGvGc9kls5LkjKOl4uEW0n9prV6Nardq6+QamJ/wTF8P/t96p4p8Y+Nv2gvi748f4TaNqPibwWfh38Um1rxpq/i/xjo+sapo+o6/4X1j4gfsxfss/EnwFp/hbUdKjEOrW8PxM+GXxR0jW0fwvpngu+0O9lcq+zslFK+jutLK3W0pJt/Jq2u6BXPxt/bm/bf/AOC+HgD9q74x+D/2bPg7N4k+CWia3o8HgTWf+EOGpNeWs/hXQbzWBJdL4600ebbeI7jWLSa2On2bWMtu9k1vGbcqNYU6LinJ69dfP0E2z9av+CMHx+/4KOfHDwJ491H9vXwHH4S8UWHxBvdN0mzm09dCkh8Ex+EdEvdM1eKxGueJHlubnxVPqelxK1xpyXtp9vuAlw2hgDKtGnFrkd9Px9bDV+p+zfi2eWzn0y6t22TiLULfeM58qV9PkdeCOrwRn22+9ZxV7/L9RS6fP9DZ8M/8gOx+lx/6VT0pbv8AroNbI3aQwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/hn/AJAdj9Lj/wBKp6mW7/roNbI3aQwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/hn/kB2P0uP/Sqeplu/wCug1sjdpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA4Pxv00z63n8rWrj1+RMuhv+Gf8AkB2P0uP/AEqnqZbv+ug1sjdpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA4Pxv00z63n8rWrj1+RMuhv+Gf+QHY/S4/9Kp6mW7/AK6DWyN2kMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/wCQHY/S4/8ASqeplu/66DWyN2kMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/5Adj9Lj/0qnqZbv8AroNbI3aQwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/hn/AJAdj9Lj/wBKp6mW7/roNbI3aQwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/hn/kB2P0uP/Sqeplu/wCug1sjdpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA4Pxv00z63n8rWrj1+RMuhv+Gf8AkB2P0uP/AEqnqZbv+ug1sjdpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA4Pxv00z63n8rWrj1+RMuhv+Gf+QHY/S4/9Kp6mW7/AK6DWyN2kMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/wCQHY/S4/8ASqeplu/66DWyN2kMKACgAoAKACgAoAKACgAoAKAPM/E/xp+DngmUQeM/iz8M/CM56Q+J/HfhbQJTzjiPVdVtH68dOvHWgDR8KfFL4Y+PAT4H+I3gTxmBjJ8KeL/D/iIDJwMnSNQvOp4HqaA8zu6ACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/wCQHY/S4/8ASqeplu/66DWyN2kMKACgAoAKACgAoAKAPyk/4KGf8Fof2Cv+Calpc6V8ePii3iH4uf2dDqWlfAH4V29l4x+Lmo292XSyuNQ0ltR0zQ/Bun3bI72+o+Odf8N297DHK2lf2lMggaXJR337LclyUd/61sfxXftl/wDB3r+3f8YrjWPD/wCx98P/AAP+yX4QF7Oml+K77SdI+NHxfuNOjYosl/feMdMm+G2iS3duRcTWFl8PtWutOm3Q2vie5MK3MsOo+ll+f+XqCldcy+G6V1r1S/r+mfzhfHr9vj9uX9pK+1DUfjt+11+0H8UlvpTPc6R4j+K/i+fwxAZGdZotO8F2mp2vhHRrZTt/0HStEtbaFGKoiKoFQ23u3/X9f1uZc0W2uZu+tntHl/z9Nz5T0i8LXXmyLc3TyZeZpWSV5SGf55FnYtKq7htL+ZgnLq4OKT2dt2t7f1/WpSa07yW++n3XPY/D/iW0hKf2Yy6TdZLJJp6fZZC8MBcB3VYi8oG4FoZUUqw2qNzVi1LZq/Z6v/hv8zeMotdFHZeer/rqz6z+DX/BUj9vT9l7W7e5+BX7YHx08EWlkokh0C1+JfiLxP4GwBtWG6+HfjS+8S+Ar11UgRpe6DdRxlR5eNuTpF1NHzta21vt538iJyS2te3TXt6rb+tbn9Gv7Ff/AAeI/tE+BX0jw3+278HfDfx+8MRsYtQ+I/wusdP+GfxaihkJc6he+GopF+F/ieaHAjTTNM034ap5brJLqEjKxbb2jTs7Nd0/v0/4YE73fz/4Hqf2j/sKf8FQ/wBif/go14VfxB+y98ZNI8SeINPsobzxR8KvEif8Ip8XfBiy4DHxB4F1OUahLYRSn7P/AMJJ4el17wjdXCtDYeIbx0YC4yjLZjP0DqgCgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/wCQHY/S4/8ASqeplu/66DWyN2kMKACgAoAKACgDE8SeJfD3g3w/rXizxbreleGvDHhvS73W/EHiDXL+20vRtF0jTbeS6v8AU9T1G8khtbKxs7aKSe5ubiWOKKJGd2AFGwH8A/8AwWI/4Or/AIieI/E3iT9nf/gmbcXngDwRot/Np3ij9qrV9FceNvGz2ciia2+EPh3W7eNPBvhaZ45o28Wa/p8/i/XbeSGfR7DwZFALvWcZTurR27rf5W2MqkpKSik1d/F5dT+Oj4s/Fnx/8atYn8c/Eya31/xlrl3PqGteL5dHhtde8QX91NK1ze+INUhQyanfz3DySTTyEM+1ZZt0rmRskkm0peqbb176/iypuSitOa7Xe6votr/dY8uuNJiNqpuL0rLCgKQMQDGG4MYjADED3IYYBVmJqtdle3Xtf9f8yFTcXzOoo3s3H17MxI52Z2s5gJLsptt55Nw6DKwSyOSZY3iyI974QnGApKgIUYtq0tXotVfXS3XTf+kX5vsdnpqoNqXt3crAy5JK24G1rhR8uSHDb0LBMhVUcmjr5W/H11KVnDR2aTSer67/AIfLsPlvoltEs12TW0amGKWJmSZnjdjLI4ISUbm8xmyCkaOSGZiiMrfj/X3r+u4nVajypXSt73Trb5vc52SKKV2nXzESJRK0bFjIc5G1WwWZZCPkc9jljtXhkc0ue3RWvt3Xfunb8T74/Y7+KXg3wRrU1tdrpinV9bsNN1HTtf8ABPhDxzp91oF7pOtXaavaDxLrum39prOiX9oukajZaXIun+IdA1KP7Td6fqVkkmqZVE/PbdO3VXvZed/kdtCad4q27Tj3Vnazs+vya21Pqj47fDT4q/sEftE/Cf476FfXXw113WJPD/jm9svhxrOp+Dta8Fw3WvbNKm0q+8L3wuPCOp6jbWl5aSS6d4q1SLUrmDWptOvp4ob+1syLc4+67NX5Jtrm0Sau/vtts11La5JNr4WleLTta+ie39JNdj/TN/YI/bLb4y/B/wCFd54z1q58T/8ACV+DND1TRviNcrZxT6hNLbSRappPi17e10i0m13w9qtvNoOqaxp+k2Md1qESyXunQGX+077WlWbSVS1725lon8rv5/l1FOKUny7b2v8Al+X9afpwCGAZSCCAQQcgg8ggjggjkEda6TMWgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/AIZ/5Adj9Lj/ANKp6mW7/roNbI3aQwoAKACgAoAwvFHifw74J8N694w8X63pfhrwr4X0jUdf8R+IdavINO0jRNE0m1lvtT1TU7+5eO3tLGxs4Jbi5uJnWOKKNnYgChtJXeiA/wA3T/gst/wcf/tH/tAfEfxZ8OP2N9Xu/hX+zH4I1qHQrLUJtOtI/HnxX1PTLhrqbxvr6ahZT3Hh7w9NcRQp4Y8LxgTRWsA1HXy2rXg0vRuSpL2vuptR30um7bbWe+qX9JSlyJ2SbTs+a6tf7vwfc/lk8afFfxB8WdUvvGPiHxBNf+Ob+aZtbn1S2sH/ALRmuJXkWfT5TbwxWskcY+ztCuze4jlh8oHylmMeXSzaet1ffz/4PczVWTV7Pm7N3ul1jfXr+K16nn9xquvTRra3l28jx7mgSQFwACo8v5hhUdANjqCVmVhwznFpJbW9UKVZuPKvi7LVp2v/AF59tSGPSZ9SmIurh5FEUk58xiAgijeZwVkxgbIGLdPlUlRjGXt/XVv07v7zGKnOT953tbrbtq9v60IbfRH/ALVl81CGt3VCjuwPmG5jjAKnnp5qA/dwucHAyaet/u6msaejT1UWtbO/R6bu1+hs6lpqXNot42d1tvgwSzfNM0cE8oZgGJ82SCVSpxmabKhUBpeVvn9+nT+t/MfLGEnFaXsr3vrpe2mistdb63tYxksd+oTQsygxpBHgDaBvVXlVVGQMmbDBcYG48Zp/1+hk1OVorbTXu+n59ibVbFm0i5vVTbb3GpC2ifCgjyk3iMZK7h5XlFsnaOoJLgUvLrYdSNkmlayauvuetn+a8kUdIW60MR67a3clpfQzhbB45HWQS7A5kCj7yLGWEilWDFogysjnJo9N7/PT+vvLvyqLUrRfvXfktru7/rY+pb39rH4x+PdP0rwT8SfE8nizwl/wsGx+JfigXNhpY1/xBqmmxC1tl1bxJdWdzqE2laVphubfR9ELDRdK+1XbWdhFJNI1S4JKXKtWrbvT0/4JoqzbjHmuruTSva71fRa/L/I/cT4U/wDBfX4ifDPRf7O8F+CPBlprgnu4dDmtNJGieG/CmmX1lDZ3kw8G280kWreJr+OwtUgWz1XSbR47aJLi5WKScyY8ko67P9dPu6a/cdF1K127tJb+8uqtp3P3n/4I7f8ABdDxzDrmn/CT9qDRtU0n9ly832HgT9oP4n6veR/EDRPGWuamL23sfFVilo+jHwFqc19dx6dHp8livg23hij0+1PhezNrpe1OtyPknK93bpaOnfrH8tO5fspySajrp7qvzN+mrv32Xkj+0SOSOaNJYnSWKVFkjkjZXjkjdQyOjqSro6kMrKSrKQQSDXYYD6ACgAoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/5Adj9Lj/0qnqZbv+ug1sjdpDCgAoAKACgD+F//AIOd/wDgol8RvG2v2P7D/wAGteg0j4TeGksvF3xwvbK8mtdS8c+INP1a5g0Xw7qc8N5Gtv4H0W9065v4NOvbVj4k1zT4vEsEN1ouh6RqTctapf3U9Fv5/wDDFx5Urt9ezdrfK3+R/Df4s1CY3UpNwJ9xlXzmUQR3qKSvlSK2PmOzMYYhgxKA5BDRC2/n9z/4Iqmi0t5p+nbVvpt9x5LcaALx2m0+N1lDD7RBgMqhirs21cMq85OQu3YDk5OLvZb2/BHLKCa5oylpfTVv5dunr2Wxe+zalprLFewl2URzqrx7/wB3j91IjPkNjJJA4B3RsysCtW/es47fLRrf+vwDRNPSSVrprp3XfTf8+hrpcTSNHI8G6zKmG4EAxLDHKojk3BVU42szbV/jIchxuV4e3n59X+GxamtZRT5LpKysnrtby76+VztvDvh5ft7Cac3FujIFfOJntfOhIEkmWQ4tYxtB/eRzKInUJymbknp+Pn+BtCGju9dk3e9vPq3fr/T2odBttQ029t1eFLq2tYEeFNrM11bXc2mao0bgEbMR2V5Aq4KJqKbQxO8Jtp31e9t+qur/ADf4Mnld7aWe9lbX+tUeXXWmTWN5eoEE08UkiXLKDsVljjJXa2MSCVvKIO4Bo2YcLltU00n0fe3TT+v83ockW3G2u92trf0jbv8AwvdCwsEuI3hgge5unVinlW8bwac6SFAAxneBmkRThpBsCkFmNTzK/fRJff59CPZycF72l22ou93pfbXXX79tTzvXb23EyW8S7Y4mkbyWILorbBCrlQFwIIommbkO2FHJDC0tN9dF6/1fzMaijsny2SfK2/uS2va7eu689L2jW8O5GuHCvfGF7uVlO21s3O9cN/fnYNIq5yRFEBuD4pPT7tvPfrb+vvKjBQ1vfZu6atfpom/U9M+ED+GE8ZaZN4lvLzTNGlv7YnWLQkT6Ttuke0nSXy5thRYkBaS3YlMxhVikkLRNScdNd/V6fjY1oO/NLono9b/r36f5n9o3/BJlv2Wf+E/1fSfHUeg/E7xFq+oanefAr4m+MdVm1PxfY2fhTTLPxLefDPVRNJbaVpIawnuNS0jxBYaF4c03xPJLfQtpk5igW8wtDmbktLxTjdpJu+q781tb3t31R2e1lyWWjUt1rJxWm7inrfma20truf2xfBP4gS3llZ+GNaZ1lFtC+iXNwYg0tu8SumnOYSYd8CZS28sJEVjMMKqn2eMdtGba5X028072Xysc8rN3V9ddf6+Z9G1uIKACgAoAKAOD8b9NM+t5/K1q49fkTLob/hn/AJAdj9Lj/wBKp6mW7/roNbI3aQwoAKACgD5s/aa+NWm/B/wUJJrz7Ff67LHYLqBlit7fQtPuJ4rS51m/u5g0djAsk8dtDcujNG8k13GjLYTlM6s+SOmrenyBbpfP5Lc/ye/26/jlB45+MX7Snim+8Y23idvHvxx8Snw1Na2CwXGp+EfCerXejeDtVnu7i1ufL0FtE+3/AGHTrTUhNcXrl7yLy4LaR+O3NJWd7Lf8fz0/EOZKMeZ+9vJeck7+X5fkfmPcyC9ea0lfzonLSKygeWUA3+aj/wAEsYUZKKofKh4txdhqrJJ2t0e7/rUpR5tXrq7W7Xb+9R+RoW2jS2XkyxOpDSII9Q4SRVJUGORN7BiVc5QCZWKloZJW+VlzKV7r5Nv8fy/QxceRbu7d77K76NPp6fjc7/SNHsZrhIb0QyNCH8lpGW4gl3Plot+RJ9mfLM+1bi4icRtHbsC7HNzlrZtX6J6f1+Y4RdouSUpe8tNVbyX62KGt6To1nqa3Gkrd2cI2NJaoQ/lOjb3eHG8XQxnzISwkiyUKwn5AKTtbRrz/ACNFT6apaNJaK/mjs7DSRfxwhYlt7wqDFcoPMhuY3jYszKDkxukgc4wpyssQ/d+VS/r+v0Nt3bvovx+7TocxZw6tot7qAktJHuIhKZyiia28rdayedu2YVI7q2gk3HYxQbJVC+VSlJaJ8v8AX/Ab/paV7KT1tsm/u++xbt/DB1+XxJrtzC9mIYJrm+jhXcPtlhDKbqOP/bubqB5MqCUWfex8tGw+b4V2vp6/1/lqHsr8zs7pa73Tu9L99vQyXvC174oJSW4nubmzk03ez/ZLWJobSFybdnw62QkQzTYLiC2jKADeBWjUdtn63IacE0777u66efW36dzw+x8P/wDCQ69drAXW0V5JmkuABKmn2zFzPIE4LyQxqGSPd+8kAQbBkbOVkvds9tNr+f8AX6HLGLqTbatbS9t009PPXrt2Ogk0zMV8IYJhChVVlmAAjiEiqs+2BWVSxi8oRl5MINoLbRsm+13rvZL8Pxv0NeS19Pd8/TZ+vmN0NGZ54YUdRLZpHEgG9hcRPAIpFQLtLuyBFGAw3k7s5YuVrL19NLPoKCS5lFW2TVn2Tv2btY+mvhLfPoeu+H7jUfFHiXwYLfVrFbvxL4U1i40jXdFspJrWxmutPmW4jie8ihdnUST24VSrfaFAVThLW9lfsnrd9tO3Tqbx0+779P8Agvv6H9gn7PfwK/4LIfDzwd4G+JP7Pn7b+seNPBdzpumar4b8G/tHeBV8eaE+hTRm70iSDxb4Nn+I2rnTZmQS2F5pKWN3aWzwx+RZNGlvGUvetNqUUrq8fe2v9ly07bXCXs2277u767322emnbstD+vb9g/49fFn9oH9nvw34l/aA+HVr8LvjvoE9x4V+KnhjSJZLnwje+INOWKS28YeAru5nmv7jwX4v0u4s9X02HVVg1XRb+TVvDWoxyXeiS3dz3wlzRTvd2V9Lfh+JjJWemx9mVQgoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/5Adj9Lj/0qnqZbv8AroNbI3aQwoAKAIp54baCa5uJEhgt4pJ55ZDtSKGJDJJI7HgIiKzMewBNGwH8vH/Bdv8AaKv/AAT+z7rfiBCQ3jPRfHvh3QY7gSGLTJBZWFhYXMIikVl1AaReajb2ySLLbtqesSXoj320YrjqScmrp6vZ9Fsrfm/VjSXMvNK618+zXVI/zY/Fdz/bEl5fyq6wvczM1skshFvHM5kjUjbyVHl5mC7pJY3aQM7MrTDe3+X5/wBaepVSKcbNX7/Pz+Vl/wAOeeWEs1pcgCeZoJGx5kaBmw2fnK7lQ7WXD4YMRnvzWj26d7ee39ehEFy7N2fd3tp08loej200UyxmJIGCxeXIgUyQTxKqhXvLBvMdQyKP3yCKOMrvVw/zDLVX8ttddb7Nf16GnKpKz1tt/Xr/AFobtrNYyWsdrF56yF8i380R+VL90pbSEASEhdsQdo5wEEayXI2xquv+XXT5r1GopKy9fPz/AOCaJ8vU4goLC7Vldg6bblJtoaNZYX2CQI2cK4aQIzmGe3XMKrbfp+BpGDlrsr7s2tN0/VIrFL63kl862kmkgwdrWsscsMrW8MrK7LazrMXw4ZIpJPs8jCYu0+bqJbeln38/zN1RfxKLe7tqttbLRvz1/VHqnhDUI21G2k1LT4Z7W5Y2qG6tn+yyRajhLiymLgSWiMvl20Ik8yC3vJrC4hnaEWyycuIno7aS1dlo1bVNd/l0PRwtFqSlJXUkrfFyyUkuaMo201dk2+/z+iLj4Q2UWitFZ6dJpVvrMYWYTYaZLu1NnFC0kxWKQ2uoQtqInZRIBPvt02TwPAvEsbLmSbTalq7y0vF+dt7aeR67yxOMpxg4pxvrrqten81tX1PGPjH8FZ/C3hvS4Lc3Npq/iCwGpyyNAYwLK5S+vbLTbRd6ruu9PnW61Er5iQqbRSDl67MNi41J1NVZXUX00dm3d7322PLx+Wzo0aOj52ryesm3JN2t0SWru1vseO+Afgb4lmvNTtrXTru4MWnbL25jgM4jSa1ld54Nqygo++OyiOMyXV2ibXzIketbGU42bkm27JKWrd9e3m/luceGyytVv7slGKUpu2lunR79vToaHxJ+HS6Nc3mj+QqXlvHbI2y4hjtXSO3TEEUUAdZLgbPumfzHka5YNh1U1Qr865ldK+z7br/hmRiMFOjdNWe+l7WXlv06fNbnntl8P7mNWEenNDLgzHezxbFiCRL50mNtsszO2zzSem8fIGrb2q6P9fPfy79/M51QtrZrXqm3olf0vor9lt1K+r6ZqNpbJE8ImRp1aTEX2qJFZtjMTZ/vZQhYyNE7rPLhWKE5NXFpvz/FPf8AFaepE4cqbV3ra29tD+7z/g3D/a+HxY/Zh1D4AeJ9fubrxl8CrubT9Hs9Tvnulvvh7f3Md5pzWjXE000Z0bVdWuNDmtBK8UNrFYPCkYEscbp3hNxb92SvFdLt2elvR/8Abz7GMmpLm2ez0ffR/of0ZzfHfwR+zyLXxr451WHRPB2o654V8HaxeyAvHb3Hi3xJpfhjQ7oldx8qx1bVreScRh2TTvtTQRgqyV0waTveys7vzuv+D+GvR5t6pWd5OySW76/hr8j9EwQQCCCCMgjkEHoQe4NbALQAUAFAHB+N+mmfW8/la1cevyJl0N/wz/yA7H6XH/pVPUy3f9dBrZG7SGFABQB4/wDGbxANL8NDSYmP2nXXeCRFOH/s232NenIIKiQyQQHJG+OSYDocRN2XqB/I5/wcRa14Zsf2Mjb65d3EPiKy8b6bb+FI1uZY01Hw/rsF0uquQcw3d3Z3um6dLJAVSaGG1jvLe4yZo65GnG17/Fddbq3rv9xcGlJPyfr5d+v6vTc/z+3VNZ1Axx+eHklLvJJcStbp955XuA2FTdEkk8whxHtRpdygMRSuley9LK/4db23FKMZPr23dvLS/lf9Se30sI4E0z3kM6kRWTyPFGkbYKzyFCNgcIOHLyyRKBtAwCnK/RLz326fj8u5XKl6fh6nd6N4RS/uI0sLaC0R5wU22svyFhu3yXBeRBsBXBR9z+YCqR4KjKVRJXk3ZK/TZLXt+vmdFKi5yikleUrf+BaLX17nr1n8EPFDqLiHRGuRJlY2t5kR5C7eZElxFdFrZg4JYPE29QqFGO3zDxPH0U37zVu6drdbWTt8+h60MmrzXMoRd9VaV35aX9X6a2PUtF/Zt8capP5k2k6xZPL5e+e4RxHhioSdJTJEHZiAWLO6OXVo49uJK5qmaUIxb9om101bbs9LaO2iulrY7sPkGKm3zU3yt6P3opeejX9I9O8O/BCbStRcy3puUtHia9macJY26xSMIwZ2tZlQyD920Hk3rXzhUjjhSeJm4Z5hzJWdr30Salt1Tl57pJeZ7FHJJQu/e0a5+aXNCKit78rX4O+nWx9PfD34YeGIre81zXdK0+Oys737E9pZ3swh1Z3ZontTpz39x5bXcu2Miyu7LM73CHSdkdzFZ8VXGN2UW2+W6bjZpaWab369H0s2ehSy3lUm1Czk0lpaUr2a5U22nvdOP+F9PvPRfB/wJtPDGlWs94tzPZQ6fctBBeoLTSlY+W1tObqSO5vRZ2Qv764KSQ2cLQjIgN5Kw8SpjcVKo+WDSvKPM0lz2W/urq7RV03r1W31FDLsLCjFVJqU4qnKUE3aPM9YtbStCXNJ3skvi1OI8b/Cf4M38fhFrrTtU1jV/ENg8WjaBc3UP220TS9oP2x7tXa3XVJjaw3Yna3nT+zbSyXyrcqUKOY117V3jThSlarUt7nvu32VZzSi3on1k2upXyjCVFSfs3KpV/h05aSVtNeiUr9WrWsex2P7MHhTwvoUl74bv9Hm13XNLW3axuxcQW2nT29/evaQRHZPdi6nV0mtbL7FPZC6jSZY8BJLXj/t32s2pOTjCUrSWraa0bS3V1Z7WT2vo+z/AFajShK0IKU4qMk1e0k3f4m372lly2uux+SHxm8CaXoniXWHvrK71DVA11JLqN5cfaWe6Z43kDPJdRqk807SC5imS0MZkjSEg7bY/WYHFe1jFxmuW2vL2vbayVtL6XPgMzy76vOpzU7uUmlKS0TvfTW1rNKzs0+m9vkTVp0mNzbg21vKBIGgEKmSch97LJ9qeeLzhLj5BIquVWSNroGR296mm7ON7XX8rsvkr69b7bM+UryVnGUYxevLy3TbVt/O79Ntzx7UmgurO8iuUt3S3uGMk1vELSWJJZUUELYiKIxOvyOjqYneW2mLKrM8fbBW1b/r01R5VS6j6uzaPsb/AIJY/tjH9kL9tL4Y+O2OoReFdQ1mPwd4106z1F4rTVNA1h59HeSe2jFvaTy6eNQu5I1v1kFvI8t1HLHeRQyxaSTilOMmuXVaJ+q9GktvLoc90207rS/+XTe/6n+jV8SfAfg/4znwRaa+BqUGqavpE/h/S7pJ2t00yCDSPF3i7V5tJTfbxm50Ozl8K2mqOHlsf+EqkMN7FcX1usWtlKKe8ZLTpdyScm1192/3S7Mz+GSfXRPXom2l2+JpN97LY/Wj4b68Nc8L2fmyB73S/wDiVX3OSZLVFEEpJ5Yz2hglZiATK0gxxXRF3XpoI72qAKACgDg/G/TTPrefytauPX5Ey6G/4Z/5Adj9Lj/0qnqZbv8AroNbI3aQwoAKAPjP4wa7JqnifUUhJa306FtHtyThFmikC3DZ9ftrzKCpyQkYOMcY1Jau3p8/+HGfxp/8HR3juGw8F/s0/D/7PH9o1vXPFviBb1J9kltbaXa2cFxa+RGpYC7e6sZFZ2MbPaNlTs3rjKNlstr6eqt36BH4pdEkr+rcv+B87n8WUNvDayX86XBjthFJLdJ5iiaWFiStpEr5LSXXlbSynHlq5YBVIkLtrZu1kumvW3l93Qvq/S722vt/Wp6B4Zs5vEkjJJHFZrJvuHRXZ2S32wxQxhflMksjzIwzhmK54wi1i3ZfK5pBczinpftv+X9fifePwY+DNld3OlwfY7jUb++mUwRSsqwfPDE0UkkhRcgMW8yczYjjGAEQwyHwMwxns1Unz8sIK8pXaVkru12otrorfmfa5Tlim6MORzlUmlGDgnJpK95NK+136+qP2J+Bf/BPfxD45WG6e2s9KhXymW/uowgWd4tsZs7d2kkTcWVkEy2/AdnRTL5ifAY/imFBuFLmrzd10tvq22rPfpfX5X/SsBwq5ckq8Y0oqKk3a8rtacsW7pf+Ap72ufT/AIq/Y0ufhZoKSar4GsvFFoFT/ibeH71tOuJCS8yT31tdxLbTASKzPM6zxbFSa48hlZZ/FWe1a9V/7S6PN9mok43X2YtWkr9EumyfT6ZZJh40Pdw8KzWjnBck72Tk5xba06S5mmtWo2tL4m8ffDXS47xNR13WvCfhfQEeb7Hpljr1lrmsKFV3+13un6Pe3uy4uEMqvLYWdjp9rkRrPAHkEnvYXMqjpuMKdXEVLe9KUHTg3ZK0JyiuaK3s5tvdbXPBx2WU1PmnVpUKf2KcJKrUemjnGnUlZtrT2cUlte1ovzDw98MvG3xH8Srb+BfDfinWrWGT7Pps95aXGm6bpumEMkd/di3hliW51HM7rEyTRQpGYJZrhHnN76NbH4TB0VLGVqVJpXlGMlUqSm0vcjrqo6Juy6XWunlQy7G4yolgsPWqLncYSqR9jQpwv8TbsnOV7x3sklzN3PufwT+wD4ih8Owax4gkudX1W4mkY2UZuJ/s1p5UiCGy0m1PkWo3hZpb/UXvHe3hggltwpNtH8riuJ1UquGFg4U07JtLmbT1lKo1s1tCKSTvZ2Vz7HLuGKNOF8dP21VXTav7GMdlCFNOzlzb1Jt3UVHltv6r4E/YI1vUNb/tm5hGgO0ulmC+No1xqt3HHcPcSWsdvMY7e2s5YYwJpFaeG4aaN2tGhSKA8GI4gn7OUIwlUUYTclqoN9PeSblK+uuu6u2z1aWSYajKNWcknKcfeUU58sJXlHVxjFW2vf8AmSvo/sfw3+zLJp0/iTQr+2S5tY9Ms1W41DZLNc4spIo5zIiMsMNut3NbTQeWY7mJJ4zEoZ/M+elj63NzJyXK2+VdLNSb5U9XpdN3s7Pex7E4YWFOm4xVSMpWm5JSbtzRa1Vtn0Wvoz8sf2nv2YbSK+1+x1OGe4toGkm0+9RHj1C2WTrB5SjF5GkyTz2DQyRCY+TDbC2aW1UfaZNn7jGm0/fvFTWkovWybW8W72lfV3b6Nnxmf5FDERnOUb0qi517tpxv69U7uN2ktEuXQ/Bb9oP4N694TmluWkklsr1XbTdUTeouoVeUsr3aYQqWV4/KmTzYrkS2s5S5jwf1bLMdSxMPdaU42VSD+zK2umzeitbS2vmfiOeZVWwlRKUeanUdqVRXa5dd5J3v7ttWndWsfFt3reoWjzw30pgLq1vubcqXEYdlWOZCo2uCjruBZBcwqwZuHr3EotKzb9EfJVHJPlkmrfK/T9GcZo+pPbagrPE90ZtSRlmjkEdwg3xn7RYMq5WRHjAnVo3DyABkiKo1a2Vtei/TRPqjklUSkle95ctk7u/pv999D/Ux/wCCYHxf/wCGgf2S/wBn74o3d9Pql9ZfCmy8G3d3JG6G+1/QLyLwxrt43nu12hnh8I6E224UNtklfzblJkmrOk7pR/593SfZaWS9F+b16GkrXfdtN/r+Nz9g/g1qbWOtXumSuoj1iN5FUfd+22nzpg4wM25njPPzFYxzgV0wetu5J9M1qIKACgDg/G/TTPrefytauPX5Ey6G/wCGf+QHY/S4/wDSqeplu/66DWyN2kMKAKGqXqabpt/qD422VncXRBOAxhieQL9XZQo9SQKHorgfBHiXz5ra7u5S/nPK907AbmlbzRNIzJgBi+5j8rbt3Q8Vhvq+j/zGf5//APwcy/FWfxh+2H4Y+HEEl4kPwu+HGnxeS0kBskvfFbrr/m2caEzO0lg1nDO0rB0O+JfkTdWcm3N+kV5atyT8tJ66bhFJxbs9ZdOvK+X9On4H81YlE/EX+sY+WyzJvR7lm2vL5n3U6gKW2h1UtwWkZ1ay3Ss/Lbs+r/pFfJ3/AKb/AKbPr39nj4S+I/EGs2rzQ3Us7RyXMECRu7+XbsLiW4VApaSKONGjDDYmSEXJVM+TmGMp0YS95K/u32Xvaaa79tz38py2tiKsG6bdrySerdlzJ235Ur3v523V/wCnv9ij9lHR/Nj8X61apdR/ZdJ+xN5IuBbCe0S6u2hRsqbjzyDG8gIil4VRhdv45xJn05/7LSlyx9pUdRqzuk1aL5ns7S0uk/mfu3DuR06PLiakIybpU1S5pRaTcfeaTlruredj9wvBXg+XShCohtLS1h2m3tYIySCy/febam5xG3zMhEQckRooHmH4ePO5Obb1fX4nez136N9T6+pyqKsvesk1ppyqys1v1vuvRH0RDokeo2aRyx2qq6DarxvK4fZztO9CPLGQSHYKrqVJ4r0KVPnjol71nazbtF209L+f4nmOvKlOduZ2VtGrXlZq6a220baaWt1ocDefsx/DzXrq41PW/DOhardXJWQSN4d0W3nMm5S0j3MFkt1IztjC3DyRlVUuCQuOynSrJXhVqRTtyxg5RW1npe2+mqb67mjzGLSi6cJctryqWnL75K9ulr6dPPvPDnwG8IaLYy2Wm+FLLT7fy3wLCxgtGmDIFZFNusIV3MYDSAImxioPzFhrHAVKt5zUm0pe8/flLR2S5ns3bZ+nnz1c4hCyhVpx1XuaRjF300Wl3rq7yelz0iz+H+nparZ2+npb2jxmOYCEefGqBgEQbmz5mWhIYqqR5VQerdSy1W+GNpXv7q5rqzVruyvs9e9uh5zzZxk26t5qSjTtO0JJ2veye1rqy1fqc1N4WZNQyLUW8VsXt4SY4VhDslmibGUgxrEkbYUx7FWfIQbePNr4JqpZQcU5SgrrTRX6Sf8ANHTyPQjjYyg5KftFP33FTd425pO61avp1V9lfcx7jw7HbyXM0sT7xGIyFCyGREWQFZBsGV+fGVyfmIPGQfOnh3CUnOLuk46dn1uvv1OyGIdaK5WldqSTaik36tLVK1kunqfGvx4+Dmk+ObS50y4gS0upLG5j0rUBAATFLEd1jdMJAjbX8mS2Z23KIsozgTiXijWqYWvGpBPlT53HvyW282nbz+R60fZVsM41fefNOMl7t/ft8MuVO11fyd/M/B39p39lyfU/B2vaPLYPJquhatq8cksSbklW5s3ntjHMkcTxo8L6brFnKshkdV1BXLfZ5I4/0bh/PFDEU5XtTqU6Vr9HGXLJSet9XOLWunL0Z+e8QZL7fD1IKKc41Kko3alJczfLa8U1dKEk/wDGten8ynx98C6h4N16aNoLqOxnSKeGeZCoaKSJZopHB+Vp4sBJVIBEsMuUUSqzfsWArwrUoyi094+7smnqrdu3r5H4XnOFnhq9pJqL1TtvfZ7vtZ/8OeFeH545L4t5W2dmKwXLwMIUlDAbykZ8sMBIHBUDGV4AOa75q63ttfv8v66dTw1CLnfld7r3mtOt9e+39bf6RX/BvdcXA/YM0yxkSUW2l+O9fXTvPmtiRaalY6JqLx2sEGHjtfPuTN5sytNK87F2U7okijvO/f8Aq/3Gs9076tX/AB/rQ/fzw5etpup6bqMYf/Q7qK4IBBLKsq+YrDcDtlXcmTjhhgcnG+z+ZB9pqyuquhDI6hlYdGVhlSPYggitxDqACgDg/G/TTPrefytauPX5Ey6G/wCGf+QHY/S4/wDSqeplu/66DWyN2kMKAPO/ije/ZfCVzAG2tqN3ZWIPfaZhcyj6NFbOh6ghsY5qZuy9QPjvxlcy2ejXD2SiTUpwLPToWyYpLuc7YvNVQSLeLAlnOV/dI4VgxSsfTukvm0l+L18hvZ+j+6135n+XT/wUw1qXx3+3F8f9e1C7v7i7n+I3ieziutUE3n3ljp19NpKNcBkTyDFDaCC3XykjiSOEhDhaxbtJvfWWt79fv06XLj8ENLPkTt5u777/AK3Pl74U/B+38UavZrcaZqF1becj2rLNFbwGUTK0Zublo5RNFvZo9iKXdiAiIxweXFYhUqcnJpaPZbWT6X/HY9LA4KWIqw0duZaaJO+tm3urLVJXWh/RN+zF+zNN4cvPDVxe29kl3qTqLi1tmS5umsxGk0cU0rqVto0mgG9iUMjoSYWLHP5Ln2dqftaUJScY7SbslLbRrVvW6333P2zh7JPZeyqNLmko83KtFGK0TbXe77bXXf8Acr4F+D7fwPYQeE9PiX7Jpq291CRyoW8FwjQAsN4t1uIJjCGciK3nitQoWFVX84r15YnEOpZJyu5W05uXRPTS9uW/ez9T9Bo0o0qKpq/JG9k7+6u0Wne0W2lq2kkr7H2fZ6bI/wBkdspsY+ZtQ742IJy2MgoPkYjlMPg5PSmo2TVm3a+m2rd16aKxjKbvNKL5bWi7qze9t7p2e767Hq2jILbyWmeXCMQqKke1Ij1Y/KuWOFMi7txVehfgejh5Wiud68zta2idrJa/f5bHl4hK8ow0ulezvqt1u11v1R6JYmyQIsmPMDM0eHztbAbjJyAyluhI5I+7mvVouK5bNbu6vrfXRJtP7vU8fEqvK/K/dWsrWXuvTotl+LsdDbXYbow2gEfvQGbeWO3cqkHaQvy7TyrAnAU59ClV03j5fLvzX1tru7nm1sPLR+8r2v7N2XKlqneMk3fz/Gxpqw8lirIzsCVOza0ZYYO/5pVwuMAkbVzkjHFdTcVC6cXvq1Z90mlJuyutdOuhwTjP2iUoSiouOjmmpptP3fcjdt2ej7WszMuTYWqOTbrMHZvO3LHhsMDlxtxnBDkhRuIUZXmuerOhDmbgpJttv3WlZxvd7dHq7vujtpRxdZq0/Z8qtHlU73lGUdPft3XxaXfc8y8SzW6vM1syruJZwoBCMwKmIFeAOOgYBTtGB0PzeY1Ic75FGN007W76arR6eX3n1OWqpyU1Vbdlu09bK6d3rrdW21+Z4drsKmeW4kVZThlKsvmDyUyhwPu5wRklcEnI9/npK9bma0jGTacdHo+rstku578FdJXelnfz3t+PrqfJXxV+GOh+I0mvfLd4r+F9N1OwRo1s7+zLO8ZnUqSl3YzNmCcE5ge4tmX/AEgMm+GxnsZKKvZSjODW8Wmm7e8tGt9d7O2jJr0VNO8E5Wcbu/K/XrdPbpa5/Jn/AMFAfhPo/hvxxrVlrNhPBp2oT39tbyvbtJFaPLcSXmn3JmCDbBfLJK1yPkbzo4Yw0JvPMr9u4Wx7xOHpuMlJxUebXW1uVrfdWt/wUfi3F+Ap05t1E4qd+V8sbK15Rl397b1tbU/GBPC8Wm6jLZy3M0Nrazqsaqhy8swLRo2Cq4U7txDs7pCWSOQYA++UnJX3uvXTbf02uflkqfJJxT0Tdrddf6+Z/pb/APBGDwFH8N/2IvhRpH7l7zW9Is/Et4EZ3miXVtJ0qSxuruFQRbyaho66RdQJG8rG3mM1wsNxI8Ed0ftPvJu2l7a2uul/P1Inv10dtbfL8D9i7Jd3IDdMj5hGDkDplScY6qSCOmeCDsQfXng+7N74Z0aZiS62aWzktuJezZrRizdyTDkn1Nbx+FegjpaYBQBwfjfppn1vP5WtXHr8iZdDf8M/8gOx+lx/6VT1Mt3/AF0GtkbtIYUAeK/GS5222h2gOd1xc3TqO3lC3ijbH1mkAP1x3rOfReo0fK3iO5VXt7mVS8RuES3VGI+YyRqpI6rv3s5c7QqDnAHEdLtddOn6dxWv9zXyasz/ADjP+CzXwX1L4P8A7bnj1L/T5rHSPGOseIvEHh/XbUJbf2pba7evrl28dwyLazGyl1WXTXhhlecNZeZKsZmiFczvzO7T95t213d9Pv7msPhgr7RSfyutfWxV/YW+Gx+I+raLpMdzHFa2NxAY9sCHa7SRebNcriGJpUVlChWmLyu0doNvnO3yXEmM+qYepN630SvZu9tF1e99PmfecK4JYqvTjotYyutUox0d79+n3H9S3w3+F2j+FrHS7WKGO6urdET7asMcCRgwyBRHFEsSKrMwiWNV+Z5WZg2DX4di68qzqVJ6qV3Zy0vulr10Tv5dD96wVFUoKMUkkktFbp11e7fZdUfS3hHSxa3c1xIg88SLK5UYKxRBliiVeTsQlyM8fNINvOE8dVeWSlot+l338/LqrdDuqXceWDum7X6XaXnte59C6Or3B6xrbtGm8lwrGQiPByVBUkFUAw2dwyd3Xvpxc7cu1r3t5X/rXY4K0o01eV3NXvFO9+n4+XnbodvbwOckfKVIHzCPaSFwEVUyRvDsctk4XAGNtdiguXSVp/LT1Sv1tvb7rnHz0k+Zx1aenLorvRpWs/T+W501jbBQk0ZaSUFjOD91sIY1DMVDAAklAcqA3y7eo7qNN2U4t8yTuu9uZfgn+CscM5fFCWilZRXL1VpdZPt0XkaqNI6or+b8jqAI9ucBjnPlkElGYYDHcyrkbgCD0pSjpJST7x1u/S6/UwkoRb5VB8y+0tdFrrK6V1ppbX7y3GJHdZgU+RgzF1dGeTHUuM4HbcAyEHBX5TVrmdr99VJatpWVr6JLVdd2YScVFpp+8rR5GnFRd2k1qn5p67+RDf8AmNvKRTGSJUd8ujfaGC5Zfmy0f7tFOcfcyBnGWzrSupe5Lvo1aStsrw01S7Xs3e7KwysknKFpPlVoWatqm/eezfbsecasGLMCUU797hxgglmJTeMAkYyrFQC2CcAq1eDiW+Zv4etnd2vo1p1Vr9j6DDRjGKa1vpzPvG627b6ej7HnPiOKTYbiHLFR+9jGA7qXeJgoDdSFTcDnJYhVZl54Kz91tdnfr1t39T0KMkpcrd+bW+2qaWv9aHhXiGANG8W1hIs+ACrj72dykdWBJOWZfl4RduCK4IN+18ku6/M761P/AGdP4W3Fu+t91pv5X8tD8O/+Co3wssL/AOHEHiJrK2kNilxHfzYQStb6oxtIkLbEULG0EcUDvJvj81guArV+mcEYuUcY6HPKMamsfKUVsnppqtEv8z874ywiq4KVVQTdLeySfJZ3Te78n5pH8sPw4+Het/Ez4o+H/A2h6Tc6xrmt+KtL0Kys7aCW8nkZr0QmOeFAPkhhjllkAbakSSF3hSOWRf3KLSgpPdQT7a231/X7j+f60Pf5Y9JSs9lZN6v06+ulz/Up/ZG8GWfwq+B3w98DQ2KabLougadps0X2iK6v5ILLTIbPTF1i/t41D30Gk21jayQW8aWlmkKQWe6ySFjtSTjFX3f36bX/AB9OhxSab0d07va2ru9F28/0PsGw2TKpEyBz8wTzyzHd2wwjfBx2bDDgE5FaiPpr4XTl/DstuTk2uoTIuG3L5csNvMNuSWAMjy5VjkNnk8E6w2+Yj0irAKAOD8b9NM+t5/K1q49fkTLob/hn/kB2P0uP/Sqeplu/66DWyN2kMKAPnj4yyudStIkBbytJWTjoDLd3CnPBxgRKxx7Z44OU916DPB9Tt/tUaRsQEhAIVl++23ABORsCBc8DjLcccpO1n0ve3drbfb1A/iU/4LcfDG2+Lf7VvxFn+0RWmteDtA0yHRbttRWWKG207Rraa40+PTnfZAbyZ3uwkBjSR3uJ3LzSqJPgaue1aGf43DTi3RhOlSgknaSdOm3K/wAPxPfvpsrn7BhuCsPiuCsszelUhGvVjWqV3zQvH97UUbrmU38KVrOyTte58df8EnL7TrX4p3fh2WaS4uLaz822JZjGbzc0d1cYyyHbcTFINmFEMZY5wWPn8bOTwNOolZOautNE+W2qW21/vM+B4KGMqUW+aUabskut5X9NW9r7n9SGiTEQIE2rIsYOw/MfMba29sDcTuXDH1zjGBX41XtKElbVP8O93/Vuh+yUm4pJ6e6l81ZK706aLR272PTNG1mzsmN5dTwQ2+QLqS4lSCKJQwLM7yFFVAS/zMcYUAN1z59OnJ1I3i+W+l1e70+9nRp7Kz3u2rrayffztrZnbaR+0N8B7a5k0wfFLwcJ4HEF6516xFvDd5ZZLW5vWmWzt7kRsSEmmV8DIAwpr6ehgq1o/wCz1uWUee/sZctno942dkt/nsfO4mqqk5SVWlaMraVaWnu31Slu3pa19ddtPetKvtD1+BLrR9Vs722kCvHcWN9b3kMymNcNG8UjJJGVeMrIpKspDYO5c19WU5PlbjJLROyeiSvZ/PW2zM/aSpe84c6ldJO27u76bdfyOxhVbYLm4BZ2DEFAAWHJwMoWGCcso29OcqSOynFU3FTk3ffbS3W/4v0Xoc8p+1U7R+HRO7v2f/BV7bGpO1shijxuNwdysMMgIB2fMBhRuJCj733R93GOtypJRV7ty36KNr6vpdrTv96OOlGtLmbdlTThZ6XTau7a30abd7L5WdgxiRIkjZFZBk7erKMZVlHGN5+b72MfKytwE4RtFqdtpNJ20tdbv5b+dzOLkpSlK7UruzSXvPTR6X0X39CW6XzISEEbltnmxAbnbOSYwykMQc4QHHGQrBWpSUWnFRT2Vlq5XSV15310f6mVJ8s1zuUeRScJdEr7vW2tkjzbXdJkit5Ll9zbCFXsUUurEyrtIKggbCBhQ5OCMk+NisFJRlU1td2W19dXfov66n0GFxtOb5FJe9vJ/DorWTV9Ul5Xem7R4Pr/AIz8G6XJNa6v4l0fS7ncAkV7q9hBM4YjCpHJcRsc5JYKpGA3lg5215Douamo05Kya5lee+nSN1bz738z24yUXCT5U2ly7J9dNWuuu1vM8n8S3lrcxx3VncR3VpM4mtbi1ZJYJomVjHLFLCXUowwd/CvjJQA5rzI0JU6nK9Gn13cXazS/4btfv3uspQkmlbl678yvqm30fa+vmfDn7Zfg/SvFP7OvxZS+SPyLDwXrWpqx3HB0q2fVIwrdQY3gUoSmQdrkocMv3HDMHSx+CmnZ+1jH/wACVpff/XY+Q4hbqZfilJLk9hU8/g9/T7t/+HPwv/4IsfAC4+P37YkMdrrFpoOneCtA1XX/ABHq/lxz6m+nStbaXbWemk21wYdVu0uizTT25s7nR7TUIXmCz/Z5f3yLU1RpdZxu7vZK1+2vvLTz3sfzpiY6V6rvyqpGK+HWc3KVt00nCEmrLt3V/wDQQ0Xwzp+k2tlZ2mw2un2qRwGeDzFEMMYijRVcIFLL91t+HcMcs5Jr0FBRVl366+Wh5Wl2+53FjZ2m9f8ARrefPzN+5jIYdQwbaSqjjKMTjbwectQHvfwsitreLV4bX5Y3NjOEGdgJW5QlQQNpKhAwx2HA76Q6/IGetVoIKAOD8b9NM+t5/K1q49fkTLob/hn/AJAdj9Lj/wBKp6mW7/roNbI3aQwoA+evijiTXnQ4/wCQdaxqMZ5Z5mU4yOAXJP0HYGsp7/IaPDdWUWsUs9zHJLLjiMoGjdyAqGLJC5zkjcCACRzjiAZ/Kr/wX18F2vw7u/BfxT0PTrK11f4rWdz4V1SCKG2fUbrVdIsX+0X7qp8+GCbRJLGxvby38too1UliS2fjM6ytrOKWYw0p16UY10p2XtqbXLLlWj542bb+0u71/U+GuJP+MWxmQ1UnXoYmFTCe5GU3h6vP7SPPbaFRvzSl0SufiH/wSksZD+0c7Mu5otGv55mWMiIbJYU3qXG5WaSSd1BAAjIVg4GU8XjSa/smmurqQirvXaL6X00+WnmdnA0Jf2viH7r5ac20m925SSW12vXc/qhtbi5VRJEvzsHVFBAZn5fYQwHADZUEgY5xggV+Nyerk0+V9NN/Py9GfsEotJ3Wj7Pr1ev4fcfKPi/9nz42/HHxLrA+JvxdPgL4WgsLHwh4HlEWpX0ERHlSapq8nlNG7qokm2PtZmEaIqRs9e1g8yy/BU6c6GDhWxvLeWIxHK1B9VTpfPe3d3d7HDXwGLxs5RqYypDCv4aFDlhOSt9uqknrvZaPVbHIa5/wTg/ZdOhz2sXxp8W6Rqdugv1e71yynheUkk3rxwjTpnxtkG6SeQAKzEqqE17MOMsbTs5UqFWNlaMYSStpaKabSv0SS10aPMnwnh675EqsIqN41XVinG17yaau9Xu5X0s9D5O1T9nP9qb4T6m1/wDs8ftWWXiiaFHutJ0L/hI1sdQuoJ5ZLWKCS1vZLmzkuZZLaa1jU39w0TWjb8i3Xy+7/WPJsVH/AIUctlRTdpVYwvy6Jt80YwktHeWmz3szifD+dYP/AHDM1XUffVGq+aD3Vmpc8E9GlJtWs7tbHsvwX/b9/bx+E+p6ToH7QHw91rxfoTXVvZTavdeHvs+oWaEzRu0mpaTZPbXA86EWaTG3OXvLORjIs6NXHj8JkuKhUnlWY06TjFz9nKcZpq0W4pTlzwbvqlNbNW0OzAV8yjN0czy6UpT9z21OKg4PVpyjTUqco3VnaLbumpJNtf0Z+F/EVt4k0fSdQilP+n2NrfxpJuVoPtMMc8YkRkSRXjWTBDoCGA3IThR8fRxjlpz3mlJNN3SemjV7aaK+3md1ahOhKdoe5flb25o36O28ku3VdToLnURbu7PcogWN9rbiSgI3DLHIbABU7zubIY8qoPRVxbgnLnUbxstWtd302s+++3llCjKpFe5eLeqtG19ulv6v1ufid+1p/wAFSvin8M/ifqXwY+A3wt1Lxb4n8PXkljrGtahpWq3um29wPIltUsxYKqTCS1S8uJDcTbVhhjUqFl3V7eTYGWKwyx+MzKGFw3M/ZQ54OpJRk4uUvaO0btWXuu6d9DhzCtChXWEw+X1cZXmryfLKNGm5KLUW4pu+vRqzW2tz4ovPid/wVI/aYv4LXxN4utfg74R1id4be6vdQs/Db3UbIZzFHpVmwvpUjiWWZobiKWV4o3WRnP7x/WnjeGMFHWrVzGstZLm5ofEleXNamlzNJuN/xMKGB4hxLvCjhcroLVTSXt5Kzelk6i0u7Ta/I7nw5/wTK8UeMrFr7x1+1jqGpavOkyP/AGRBBcxrLErxTGNpJrKYkXAbzA+6R8bXeFo2cYvi7CwajhsqoQhZ2U5xV7Wfwxi91+D63NJcM4iTticzxtapJXc6cFyX1Ts5TvZNPaK9Oh678M/hR+0F+y34o0rwp/wlT/GH4PXk1nYSPdB7fW/DMs8kSTajFBJJdh7dBLJPKiXBjEcju7LInzeXjsZlmbx9s6CwWOjJyXI1KlVivhi7Ncsu0rfI9DC4PH5U1SWIeMwbirKq1GrRbd5SW94u7vHsm+iv6R+2mkrfsmfHcWMjwyyfDfXR5yHDbbhIom24ZcZgYrIqkIV3DaUYg78PSazLBxa1VdWvZ6b9ez1vvbsjlz6PNlmMab5JYedtk7yg9+lrX16H8zf/AAS3/aA8cfs0fG2X4q+ENVhikvIraw1TwzctdQR+NvDE+ofbPEOi2s6QyxQ6toEdtBrVhfNY6pHpoaFGsNR+0nR7390gry9om17NcttF1UrLzaST9OjSP56xaahGnJX9pN1NHZpRSUVJOy01a7czdz/RV+C3xR8K/FzwVovjHwnrVhrOn6zZi4W6s7izk8x0dYryC5gspHtDc2lwTb3wtXmhik2T2s1zp11ZX916EJcy13t/wz00/rzPKaaeq79U+tun9fp9H6dCjxfIESUMp+VWjK4OGDqMKdwGBjsSdx61Qj2H4bkLd6mgQITBETtBAO2XrkjnO/jnjpWkN38gZ63WggoA4Pxv00z63n8rWrj1+RMuhv8Ahn/kB2P0uP8A0qnqZbv+ug1sjdpDCgDwD4ijHiWQ462Vpz7Yf+uayn8QzxHxbfWGnRpqGpTLDY6ZBcajeNyT5cCYXCgEuwLblVQWJGFBNRdJa6e8nfoui/ruDP5G/wDgrj8QNQ+LWt/ECxuJbWNtM0YaH4MDC9a5gu5JbLVLiLSWmWO3juIdBF6l00UUks94+p2QMT6klqvm4yPt6coys+XWCd7XXK42Tuk9fTd9NPWymtLD4inVvyqblCq4pX5Gmmr76t+ltOp+bH/BKrwFqmhfGLxJq+tWdzYSp4buCsN5CY7hftN7p6wmUusbec9tGWlUFQrliSuWB/L+MsTCrg6VCLXNTqpSs9pRjaSS7X0v5H7JwXgqlHF1K7i4qtT5qbdm3GUmltdJuHof0uaBYxXZhlZXYLHI0bKUYlzHsBIwCeP7wDEcKfm+X8ixFRped7PW27007n6nTpSdpct1fRPrsr+iXX/hz8tv23vHv7WvgW18Q2vwn8GQeKNMvLeexi1Cw1H7FqWl3N0yQwXH2V1hLQxxjezW8/2iC4jS7S5gRJIrv6Xh2jkuJrUlj8VOjUU78jpzlCcUm2lJXipduaya91xd+ZeXnVfOMJhZyy3B0cRdOLk60IVYzdrT5XZuCWnuPmTs0+/883jT4b/tX+JLc+KPiJ8SPFenLqVxq8GoeGPDcd5c6voF5bW73Gny6hcahdAR6Xe3ULrcXAubezhWO4EXElvBL+x0VkuHw9J4XC0ayU4xnzRp+1cFFv2sYJRvZ2Vk29dj8Zxq4nq16jx2LxVGnKPND6vUl9XhNuzpTnZyg3vso6uz6H0N+z7+wf4y8d+LNDuPhZ8efGXw2fTPCl5481G6+M3iPw5pnh/T7+z127s9Igl1jw7rt7AE1i0S4YaXcDSNesr77T9ls7u2EWpT9U/7Kx/1hU8PSeGhStUrVqNOhPncU3GKlo9NEmpX23R42Hq57gPqvLXxVTGPEJxo4WtVxFNqLkrzk0mnbezSW+jvb9+/2Qvit491u6X4UfEnWfDuveJrfSje2q6VrVnrgnsYDGINV0zUoZ5nvtPuAUYaRrK23izw+/lxaslxDc2N5P8AiHE3D0MLWlWwSaw1ST+GcZQTley0cvZ9nFtRe8Utl+/ZLmlerg6bxtoYin8UXF8z5ElJXcVzLS6cXrre+jf6a/BnW7nXtRvdOjdhc2MstlIkskmwvby+UW2sm4qf9ZGA5HzEg4JUfH4DD1frboLWUfd0d7q6Vl67de57eazprCKs0lF2b0vbT5Put7/K9vS/ijq+o+GoJY5iyuqF2K7kUKF+c/vI067hht4AfcoO4Hb25rQr0Zqi23Jp+7e2q2urK+mm+6PPyeWGrRdXl5oq7S0nfW97p2t18vxPyO/aS+Knja9u5/Avwl0ywvPHev28sRv5IY0awF1cpY22ovdzQtaaXpdlqdxbx3WvatugWWQ2+mWepX88EQ9bh3hyrja8JYmVSeHhJSmoSlGmrO8uZ3atrqopvVOTSte86zOOBwM69JQVRc6p01HmnKdm1ZL7Ts1Z66Nq9rL+d/4zfCP9rPwZ8a7j4efGb9ozxJ4VvLLXL3xB9s8FeEvFHxF0yxvbzw7p2raZfww6fdw31z4d1q31TxHaXlzDZsLb+wL5m0uUXENqn7lQyzh3A1Vh6+GoYdPCKUa9SnzxrU4tWhFrduXKkpNvms2fgVfP+J8bSli8PisTW5ca41MPSqwpTw8m503OXtHdxSV3Fw09otVozzPwN8Wf2yPg5pGkfEy91TU/G3hBfE8nheKbw3f3VrrW3Sk+3tdW+kmf7Frkct3qs9rfS3tlKy3VrcwCaOdxOmWMybJcdhm4UqGHcuZU5zjGKk1KKUoyXvKKUVZ2cV12sduV5/xBhcXZzxGPow5JVIxnKTjByk+WSfNTlNuUtObm0dtGf0wfsTftF+Kv2h/B+n6vqvhXXtJYWhku9R1vTLnTBdX08pDRW1pOiTiBAjzBmCRxpP5AP7mN5PxjPcBDKsU6UMTTn72kaNTnko2upOSvq9Fb1fVKP7VluIjmuEjiPq9bD8y5rVY8jb10UZatRavfbV211Pef2lNCj1P4EfGDRywkTUPhz4pt1jkIIH/EnvGDAhd4UOoIJ74KAYrtyDEJ43Czu7xrUrye6vJRlq9NnfySPNzrDJ4HFQiuZToVEl7tk1CT16r+ux/Pz+zz+xLreseAfBngfW5tb0P4j6trFx488MTaXHfXGqaB4U8Xabejw1410i2s47Vprax8VXUmneJdNM13dWmo+E/EBSKxuLBtP8Tf0JQ1pQck7VOWffmSvHffZdLaNH80Y6yxNVJqUYOUedNacv52enXbpqj9yf8AgjF+0l4rTx/4v/Z5+JVqujeNfstp4re32LZ2J8V2Fp9j1i90qzS0htIdP8R+FRb6hcW9pefY7S20XT9I0nRrSPQNQuT102o1bP4Xez0WsU3a2nTT5Hn1Y3XMopW+Kz18/uev+R/UBpt2ZLePePLGQsjeh3HowwAEwRhvfBYYzuYHsXw5KtfagVJYi0jUsep/fKw6cHr1H07VcN36AeuVqIKAOD8b9NM+t5/K1q49fkTLob/hn/kB2P0uP/Sqeplu/wCug1sjdpDCgD57+Ksv2TXopCN5m0y2Mca5Duwnuozg47BMk9ABk57ZT+L5fcM+SfiHcXN7cwW8krRWgtrmTUZFVXj2q0Qh0m2tSsn2u7vC8pd2WWKNLeVPIkZyqTJpOKSTvvp+XXfzJevrpbX8fRH8/viz9nu0+Lv7f/wv+Dup6aZ/Dug6d4i+KnxWtBNcFBp+k6zfJ4R0ApdmVpdPtNYNjayPMgfUf7cvrm4hYMJn4Z03OpCmr+825dLRXN91/Pfpc76E4xo1at0rKEE3FfHK17LRJLSz8vU3f2ifgdoHwb/bH8W654ejWxg+JnhiDxXd6dDDHbwQak14sd49nDCEjihkkiuJ2hiRUEjSgBlBx+T8cYP6vmKjDSGIpe2UdlGadpqy095q+u93fZn7p4c42eKyqDnrPCYhYeVRvmlKnK3K3dXTi5Wu29n8voLwHdyNYwRDDOU+Vz8xxuJyMchV+UYO0AjPG05/JcRDmqSTb9fR36rf+r6H67Kh+7i9bWTtdLRq/TW3l92j19ebwVB4i065h1KMXKXv7u4SaB5IJYmOYg5wysArbkYFSCAM9GNYeMo3cdWnbmtZ2ai97dGr31d/keRiKnLJqCUlZaJrvvbT/PqzxzW/2bPB2p+VDrPgHTfEkMVzLcW0/wBjWGdbn7Lc2kM80hSN2mtUn823VkaJJdk6jPJ6o5jmuFf+zzqtbLlk3pdOyvJNXtrpt6Ao4GvDlruEJR9600pK6Vk2nHez627nVeD/ANmjwlpDwy6D8MvDmjzxowW41OcSySx+c9zsdTYG4kjXesXlJcLhIYYlkWOIY7IZhnWMSU04r3re1qtxulZtxS8rX1b0vo2cVSeWYbWnPmbe2GowTs7Xs9E11tqtlZHrF18OdLsdN+26xp+gqdLaO/S/j02GCexuonXFzb3hU3NtMWiVJFEgFyhaHyjuBLmq/s5LE1YuLXvKMWlo001Z9GurTelovZcqxHtKyWHjUV20ueTvKPLrzR1095pOKsrdLM8O+FPiH+x/iVJNAhhjvp7idwcqFjnleVEKKUMcoRkDs+cSMhXdkE+Xg5f7bGorrlbfNtLRtpX83a2+r3PcxVBzwNSM1vHZbJpJtu/m2mvLU7747+J5tSvTDeNItrcRFGZdxJDhiZVLHDxn5XA38hscNgV0ZrUlUxSqz95crad9nfVNdH0Xk1Y5stw8KGD9lC13JJqPL7qukk7fK602PEbr9lrwFr8eoavB4I8P69qutRQeZqN5DHNq17a2pia2gXULhZIrUW8UH7uzWRIII4/NjcHaqduGxeYUYRhhq0+Vc0lBVHFNO+jtZX/H9HVr4WUmsTGNrpSk6cKisk1flsnJa7pNq2jPnz4ofsQeA/iBe20vizQ/HltfadCun2JltLjW7W1tozF9n0+yulv71ILKBjPILPcbFnuJfMtSZZXf1f8AW7N6EadPE4evVjT+HmftYxbv8PxOz0vZqzOB8OcO4l1J044FTq3lOUIwo1Kku8klGLaW7dP1jdXOu8EfsVfDXSW0m20jwneNbaXZ21jZya7aWunpb2tsEKfZ9LSHTNLilVm88vaWyysxRlkwqFOHE8RZpmD/AOX1OmnpF80LRd7pXa6dO3dnTQy/K8BBU6UMPdJJ+zSmm+kmorfRSba02vZH2BpHwy0jwRbr/ZOmW1vDshSXZEi+RtSJG+VSIy396RAuZPnYK7HHh16cqknUlaUpWu29bPZ38nbQ64V5TSpQnLljdQipNLrsuVadWu2hm+GfD1h4r+K3gzwtqVtBqWm6v4o0S11PTLqJLi1vtNbUIJLy0ureQNHNa3Nok0M8MqNHJG8qspVnU/ScH0FXzjBUJx5oSxFHmTSaklLmkmn0tHXfTzPD4sqywvD2YYiC5ZxwtVXvZxlKEqaknZ6pyT/VX16bx58EbPwX8R/hZc6LYWMU/wAJv2j/AA5pVnLFZIZ5/hX8R08M6JcaH9rC+ZHbW3jfWbHWJS7BWk0LWo7ci1vrm0T+j5U+W8Y7QqQkrae7zJWV7X091+mx/LPtHJ3k7udOae2rSbb76tXfrqz4o/bU+Bc/7Nfxn8PftkfDO4vdI/4Ux8XPAusfEzS7KaSO18UfBn4z+KrG31G71CS2tpXtLXTviLa+Ih4gCRPapY+MNX1SRYmlkkep021OWnMuWols9pKSSSt0V15q/cISurNbrlTvpe6+96rU/o/8JarBrGiaLrtgwuLHXNJsdRhOCd8d3BHcwTD0l8l08xcKRtwcMOdE7qL/AJkn8mYWa0e6Z798NIEFzq0yKqjyrZPkY7DueU5C8Bf9Xjgc4z3rWHX5AeuVoIKAOD8b9NM+t5/K1q49fkTLob/hn/kB2P0uP/Sqeplu/wCug1sjdpDCgD57+NCvDqGjXW4Ks2n3lujccPBKsj8HvtuFVOvzMCRheZcU2m/uA+Xr7SP7W13SJpU3C0SaXTo8yYjmTYtxfyKH2yM0cjRwF1YxhvkMbO+YavKK0XSN/wCtvN7B521Pjn4M+A0n/bP+JfxGFrBPZR+E9S8D6feywyrdRMviq01vULeKaVys0Elx50ZmCb2a2EYcwrGqYL+O5W2U4ejUtNet3Jr5Oxopv2LhfSThJxvbZW29dfV7G5+2V+zPP8TLzRPif4deBfEHw60HV5r61uJPs41HQTBcvepBL91ruwBee2t5AgnF1InmCVIhJ8XxpkeKzKhRxuDlTVXCKr7WE5W9pQ5W5crtZTg1GavZS99Xukfonh9xLhsnxGIy7GRn7HMalCNGrBc3ssSp8sOaP8k07SmvgaTem/wZ4FuWW3tsZLB8nphQu5Bk5BK4XlTtYnBPbH8/4lWqS1afM9uuuy0/zP6zw1KNWjHmimpU0rre2ji9L207a/r9ueAZBfwCNk3Mipt3DKKxj5wpBVgzDjI4Vdx5wRrg/wB6uVJJ67vZJ77a6b/I+TzvDRwrul8TafXTRJ38kna/fqj2q08NidU8tArkbS5YDaCeBjOO4weTlgT7e9SwPtEkvdb+1e17LpdPt0b69T4urjI0G/aSb5deX1vu99ui27mgPClnalWm3Ss4LMmScnnLE7sZBKlgSVwp+QZ3V1LLlSd5Nyavf3uur2t12/zvpy/2k6/MqcFGK2lq730sk3LbXor6e9bR/Pfxr1Kc2i2iAWVhGHYRx/dmciRw0vHzKhP7sEFVHOW+9Xg5rXs/ZpKMdkkreT1+9fefRZNhU1Ko3zz0fM9HGNkvdu2le6vZJa6I+T/hbYyX3jJZvJ3KhSFiZFRI1keNZpk5J2wwLJJGin5UXAKllauPLqbeIio2a1cr9Uv0Wj+XqfQ4yolQna9+Rq2jWmu+m9u23kej/FbRGj1LT/kdjuuIysjABAHd0AQJuRmXdhgxYjqpCRNXRmkHCpC66Tv1bs7Ly8/10OfA1LwTlZKTi0u6SXXV/FHz1s9djsfhVdahbQRafOBIsewxGTJZ0ZWDDKLiONsKwACBmL/LgFhhga753Tvez27La3zvYyzDCU5WqJcrcdXF2XTa3ZeWvc+im8PG7QTsjxl97NGiKCyKoYFthA2pll2sqswO3aqqa92VCU+WW10+7vbXX3l1ta63fVb/AD3tKdOT1vGLsnKaSb879+yuy5Z+HGSKU3C4ZQXhL5DMqhlBJWRl5wADlchkZsMcApYOfK5Tsv5U2lovtfrre5M8TTlOMKbb53yzs78rdr2urq19X1V7dTxP4ialFZLcIGKnJCjj+9h3OS20/d4OARnKg4avExdRRm1Hvrd3aa7afgfY5Jl8qsacmrx3vfu32T3+/wC44n9m+NdU/aC8I3DjEViuvX8rAqURbPw7qtxA2cEqpn8oBugLbl5GB9f4fUnVz/DN7QVap13hRqWPm/FT2eF4Vxaho6joUr7X58RRVltfS9/L7z7T8deHRq/i22v/ALKRNr/jf4ax6UkSsXkPg7xDqfi+a8uQR8qt/Z17H5udhiSMAAMxl/oKXxP/ALdins2+Zvmt5u0vkz+UFK65bfzW72sk/k1+Pqc3+1F8KNO+Ifgzxh4K1HTo7nS/id8KPid8I9bYxoHkPiDRLODw3sucM1vcQ6vcG60+42ullcJczQeXcTlWuDXPFuXXlk3rpJWt1/mv8m9bBfRpdPeX+Jar77W+Zlf8E4viDP8AEL9k34T3d7M1zqnhrT7r4d67cSmV3l8R/DPVbn4feJp9zxwstvca/oGpPZJ5aqlqIkXcqB2zgmoqNvh93TXbVa97NL5XKm7ycrWT1+bP1R+HFqIrXVJ1+5NdQRqvZfJiZ22n0JuBx2+hFbw2b8/6/MhnpNWIKAOD8b9NM+t5/K1q49fkTLob/hn/AJAdj9Lj/wBKp6mW7/roNbI3aQwoA8P+OVjLc6LotxCuXj1SWy3HOEF/ZTMrNgE7RLaRHtlwg6kAp/d/wwHzfr0v9jaUmo2MJl1F7OewtFk3Eve3KrFEWwPkiS4CySEDiNWIXIwZe2q1W3n/AMADzz4XeE4tO1PXb9cu9vqqWsNz1knVgt1qN2ztl2kvNVvrppTI3zeTGQNoVjmorW/utO3q7a/O7/4cE7697fhsex+NLPzdHv47pA8Oo6JrOlTnAUn7Vp86RM3LKN3yqQTweCSOaxxFpYevBx5lKlVXnrTaXTvp536HThJOGKw9SO8K9GS9VUi/+HPwU8KQJ5gt1baYpXwd5xg4DRnGCw3IG64/h6bgf5Ix1SNHFVYTls3Zb6Xun+nysf3dktZSwlDnV37Om9bNfAm1s9N9ep9i/DfUvsZSV5CSoG9Q2VICjAbgZQ427QQAcYHOazwWLVOaknpd8yvZW/rT8NTn4hwscTSSjBOSu+yW1rW00V3621ufSlrrwMAMCrCxYsCys7OCBwDlcAN74UDGC2K+oo5krJL3WtVdSkmrNaPS17p/I/McRln7xupF1Fs7SSitbXd1q/NMsXOuQxW7yXcoUBSZDIQoACkFl6AfeyCWODgHnkFbNoQjKc7cyvzXk1+bWi6dPM5qeXylNKlCy6W11T1vJ6OPqz84/j18ZodS1O/0HQoPtUemqRe3gHyRTTEoqLIrMgkVNu5TtXbIu8rjFfN1cQ8bNVFZQUmoJe9J2692t/x9T73LsueFoa80qk1qotJRSUUkkk73t0endmF+zdq66rqVtchnZZolmlkKmZWgkG4OMD52AC4kI2qMOS5PHfhYuhiNU7tcrj1V3Z3/AJdV/SDF0k8PWna/u+6ua2rWmvmul112Z7V8aNTcXkEi2zLG0UkqSqAY0uI40UxuVkDLMUKsilWQ+XOWZSEDa5nJVKjkktE7J72Svpfz636o5sBhuWhzOV5Lmdk2rXk7NaNfK/S/a/n/AMOPitc6bqtsl/o00tvLOYN7LvxtjduFKoAnythDgbSw8z5lB8V13gmqsIxqK6clfXfS1t9d9L7voetUwEMXhZwlV9nUlT5qU4u0VJO8ou13quvya6H3Zo3i/RNZtorqxlwUWMuyMjEMVULGykhkyCCykBiRnPc/S4TOMHiYpp8tSK96N43hrqrS1/DS3U+HxGT43DSlCorwk3a/Mm7at39eu3zNu+121SwkiCb125AcqrkFgWwxJO04OF+ZgMjoAtd1bNKMaTgrT6bJ3XXW1rar7tzjw+WVXiI1L8tmubldo3vs421a2butD4w+Kd2001wdpUEY3DJbYsYKK2V+5uXkjbkspGfmz8bUrqdZt2tzPsravX8Ufs2QUIwwsUrcyWqeul3t3tt30+Z3v7HWjfaPiHqmqyxJnS/COozKZSTGs93c2NgHLAELsjkm+bBOFIG7OK/WfDTDxlmFas/+XWFlyyerTqShF+ezet9mfifjTjbZXRw0WkquOjdbNqEJybel7J2svPQ/R7TdEW71SLxPdIS1qVsNFicFVgt5MR3V2I2PFxcMvlCVxujg3onlm4nSv2l6ta3SVl91m/K+x/NC2263v19Cr490p9X0iW0UCOabUZRazZZTDJNpkgt5iVwxRbuS3Z1zggfMpUbS4pPRu2sflrq+m2/4X6g3bU+Df+CXcvkfCr4i+GArrbeF/jN4/wBNihaOCOWC41jVZ/G+oGT7KxgjkkvfFs2+FT5ltJE8cyrOrIsJ/Gna6kr/ACilf8CpLSKd/hjrdXaS0va+vfU/bPwPbfZ9Ahbp9pnuLj3xvEC59crACP8AZwO1bw+H1/4b9CDr6oAoA4Pxv00z63n8rWrj1+RMuhv+Gf8AkB2P0uP/AEqnqZbv+ug1sjdpDCgDj/Humf2r4U1a3AJkhhS+hI+8r2EqXZK5/iaOKSP6ORSeq3t5gfFurM0k1nYSMw+zXC3C5Hzkyk7h6fIwftjYcjgg0rLTV/8AA10/EDS8M2gg+2BPk+1lJoSwADhZI44WDZ/5aCMBz97OCB1IicWlfo23f7k7/gM7+7s49W0m4tLgBkuLWeFxkDJKMuQ+eG4wCO59KzkuaMo94tfemioS5Jwn/LKL+5p/hY/ACz0ufTL69TYUk0/VryzmJPR7Wd4ZA2SWJxGQCSQD83Sv4/ztSWOxVKStOlWqQd917OclbW3R3t3P7cyHEf7FhZcycKlCjJPylTvpr006bH0N4PVJBCVdgTsO7JweSQrDkfIWycDO0npyT4lKa50ne/bvt/TX3Hs4vE/u3HRr53/Pr0t5Hss2vW2j2hlnnSJYkLMZGGMANlcE8g9sckgA9cD0/wC0fYU3e14Rsm7+m1r3t2/4J8p9Sni6jjFNxm/5ZJvbVNR730b31PNdS1+98RRXdy7yw2G2T7MjkRrcFVOGeMncELYUZKqy5wAoU1xe1q4xurUbVNybjHVLRXVvNea+49NYTDYJKlRUZVF/ElZtxbVuVPRdFfR376HypGY/C/ia5j1PSlvrfVr/AFa8ttV862RbW9n0y9GmQ3RuisUFwmqG1a0vZpo7O1kNtcXk1vHDJJXZC9CaqKUXTlRqw5ZuV4VJUZqnJcvRVHFrRtStKzsdOMpSr4Nezck4V8O6qp/HUw8a9GWIhBJqT5qXtFJRalKMpQjdyPQPgZrHh3TvF80FsibIpJLO5tb/AH215YXLFXEc8Uu2QsxX93OC9rdqd1tczxEPXdgMwUK8FOMZQh7sk3de705ovdWS2vr73nw4/Czlg6nJOacpRnTajKzg/KSUkrSv8O1tmfQXx1vvCKaDawpGY72W6UtKZXdgpjYhlAbpkBI1OSGdfLHyEr7Gc43ASpx9hBqcXJvVv/NbdDzOHsPj/bVZYmpGVFwcaUeVJ32fMrXdrpq21lfR2Xz54Wi+0rBLdafFY2VkYvskjytJc3cvlu3mybNkVuoYhETcxyvOUA3fKQ5qzk56QldpNPfWzejeqd/v2PpanLTXsk0200mr2Stt2vrZrfTTRlxPEl78PPFFpf5c+GdXljS4bDNDY3cpCgS7T+5t52bdFIyqkUpMfy74UPl1XVwGJjWp39m1ecYtu1tdlpa1tLba2VmzsVOlmWDnhpW+sQ5nB3SuotfDpe7drp9+9kfTbeJLW/so54JEkidFbejBiB1IG3PUAn5uAewHX2njViKS5Wtb367pff166HzEMDUoV3CalpaykrN6uy6J2+66PCPGTw3t24X94kjKSVJwoRgB36PtwxYEHthTWFOKlNXStzb/AIL8eh9Vhq/1XDWbalFO66vr+HN59l5fUP7GeixtqXju+eNngtLDQ9OijIwrzX11qV1JuKkb9n2OJ+RtUMCyAtx+8+GUL/2lVs+WFPD0lddZe0m0rr+6r9NfI/nLxfxTqvK6Ld5yqYms/wDDBU6cXvs+aW+9vI/QGSMJZ7MqoQIc/wAJCsHcYxk5G7AA3ZxjkGv1c/Eevl+pzmrQm5ntonyjR3Nq68FlMkPmOGI5Gzy4fn9JARnAaneyffv+gH58f8E3UiJ/a/lhmluYJP21v2hFtpcK0SW1l4wudLtbK3EajbHY29lFb7Dub5VZSImjVCceWtVXnDTtzQi7fmO94x0+z93vS0/G3rc/cTS7X7Dp1jaH71vawxv7yKg8w/8AApNx/GtkrJIkv0wCgDg/G/TTPrefytauPX5Ey6G/4Z/5Adj9Lj/0qnqZbv8AroNbI3aQwoAa6LIjxuAyOrI6noysCrA+xBINAHxL8R9DbSLtrlRITYahLE8g6mMSYjEnTdHJEQ3QfLt6Z5yvb1i7r0/y6g7rVaj/AA+n2nTNHYZV/scf3Cux1hxuV1B+9lM4YZBBIPaiV7LtZff1+/8ANDOwtTmVoJQfKbLsyDftGCf9X/CHwGYkEJnJwOBH9abh/Wux+SPxc8Cr4Y+LvjnQngaK1168uPEGjSgARSWmrn7e3l8AN5F+NQtflXIaHBGDiv5f8Qctnl/EeLfLy0sVL63RaTScay99xvppUU07dT+q+Ac0/tHhfAVYzTq4GCweJg9ZJ0nyqUrWsnTlBx1d9OmhU8J6fMYW8pjG8TyQkFRvDjaVyByQ3DAjsckfMc/n3JJylKFt2uunX8/67fYYivbe7uotb2s73t3dvkZfjG3bRzrviDXJ5ZNF8L6XZ6o0LQzzxuJEv7q7v2ji3vObWGyMVvDEkmJWMgV5AipKw9V1n7ROfI6UYxd7SdVNxezb5eVRXRPrvbtwlWNWlh6dK1OeIqVozqcyvBU3BRj717NqfNJ9VfTt4D4S/aX+FXxKmlt/B/jbw9rUlq0Ud9ZadqUEt3YpLEZUe4sGdZ0SZFZ43eMIygsr9MfQ/Ucbh1fEYHE04yjpKpSkopW/n5WrtPe6b7HRHLVNyhSxeGqVIpzUIV6ftJKL3dNSb5Ut2rrbc9VjsNG8QKSiW1wZFGP3sRQt95hseQ5B3D5juwCFUkkUQhCpFxlFpfh17xjfbSz2Oarg8woS5pRasna3M/RWSsu2u172NPw18Dri212Lxfpo04iC1nilt8yrFdWlxmHyrkwKMNuCyRORIY5YkzgLmtKeT4mbc6Hs/ZpOUk3P+bS3uu13bS9r31OLFZrSpxWGqutCq2op2Ss4pN212cbqz6Ho+t+Bbq9WC+8R3NhFaWaA29vMY1Vrg8Da0s4MhRS6KMDZ5ZB+UsrdVTKa8V7TEzhFWi+W+6ulpZ3vtq1f9OTDYzmlKlg4Vp1JaXjGUtfd5ndKSV7LRu7b66nkev65oeixSwtqNoVtUuWYi4jkXbbI0jyhlPKxwoZWZUURoGLFQMLxypNydKlCVSV7RjSUm7Lsle/39bLdHsxwOMcPb1UqcNJOVR+zUbr7Tm0lZp36+R8s6n+1b8KNR22Nvd6v4k0ubVBoFzd6V4c1PUtES4a/fSJ4pdRexSykggvFe1upYJZ4YJWVHkQSI1TjMpzCNCtOrhZQVGEp1I1pU6c0lFO3K5J83J9lx5tNr3PSw2AglRq0sVCp9Z5Y05UearTnNytdTUWuXTdSceaKbbPpnwT4c8TaVqOv6XZ3st54Wtzp0umx3TSyXFi9/YQXNzpi3BYGaG1MiSWvmbpUSUwM5ESZ+aoOdOUo01P2VoXurxi5NyS+6yaS6+ejzCvRjCnOvyrEfvIu2jtTm487u3a7Xne+lkdxBopubu4aVy8NnteYkEBcfdB6g/MO4w2CcdRXq4dznaK0vLdLV3fkt+3qeDisYrJv3m0+WN99336JP1P0X/Zw8Fnwt4BjvLqIRX3iq9m8QujR4kitJ44bfTIpCdrKslpD9qRWGV+1yfL8xr+n+BMrllmQUHVUvbY2TxU+a6lGEklSTuk9YLm/7e6n8t+IebrNeI60aUk6GAprCQcXeEqkJSlXlF/9fJcl7u6h2PoJlDqyEYXaBnHBzkYHUAj0I5B4zzj7M+GPNvHmsy6B4e1jV4TE+pWWmm20m2ckLca9qUg0nQbL72cX2p3kSxtnaDNhsLu26xSXvSSatdq9rpK9k+72Xm0J9l10utGtUr/JNv5Hh/8AwT+8CaZpOlfEhdMjiW11b48fEbVNRkSFoF1LV9D1h/C/ivU5YQqBLjVPFXhjWrm7wNrTzuZHkkdmlVrzk+r9m5dm/Zxu1tu7/gCTSV/7zX+Fzk46/wCG3/Dn6rVoAUAFAHB+N+mmfW8/la1cevyJl0N/wz/yA7H6XH/pVPUy3f8AXQa2Ru0hhQAUAeL/ABS8Nrfwy3Cj5b2AQyrg48+LbGjblHys0brwThhExxleYa95Pyf9fcHQ+f8Awg8yWt9parL9r8PXk1u0ZBYPBIFuIyhOCwaKRRuBxu3ICNpNS07ejt8t0/xGdzZapaNfyDmF1dZfKkBQKNuHiJYMD/dBY4IyWBbBE26rbb7wPAP2l/h/Y+LdCs/F2hpF/wAJJ4WczRxRKWk1DTJGBu7FSq5eSPBubaMcb0eJDmbNfBcf8Of25lSxGHhzZhl6lUpKK9+rQvzVKKvu96kE3vzJatX/AETw64n/ALDzWWDxNRRy7M+WlWcn7lGvZxpVt1ZNtUpt6WcX9k+GNNu1try11CJg9peSIlyh+URzR7URjjo0gyuzHLoVPXI/maUPZVfeUoyu1OLTTT7NO9nffon6H9GuftKUopp2ipU5bqVN2cbNXXwta3enU9X1HT7TVNLcyok0F1byWc6smVMDbzGHU53YLsuWzwzAL0x6LpwqQjNWbslrdJ8l5RT8ua60/m3seXQxc8NiEk3zU5qrG/8AMo2lZ3W9ou118KZ+MP7Sv7HupfC/xzpnx3/Z01S28H+ItKm1Ka40K6jluvCN5dappd/pNzpuu6OjwpqHhW8iv5rzyFnt7nQtRtlvbC4hjRoX+1yXPZSo/U8ZH29KVNU3CSjz+4otOEpJ3kmt2ndbq578srw3E1LlpzeCzbDOpUw+LpNxVWLitK0Y2fL713ytWcVKL7+3/A/9rD4N+IU8OeFf2jPAup/B3x5onwu0q38Y/EC2tbjT/hnr3jWOX7HeS+GrzQLq7EUk4hGtqviDT9PCW+pRacst49mzH1KuWZJiP3kWoR9nOK5HyVFUv+7bp25eZK6ejUmr310+arYbxIyFTp044rF0Y4mNRfu4Yuk6TX7xRquUpKD3SfI4K2iaZ+l1l8DPCWq+DfDfiLwZ8UdcEOtjws41K11nQrjTNTstVu7I3dzZSppsgkuLu0mkl09FmeJrg26BSGJrvlwbgVg8PVw+PqRqzlh41uadLkSqShGtpFqcXC8mklo7X6nzMPFPPaOPxWHzPIsBiYUFjHRU8JiKc4zo05+z5r1OWUbqPNLS66q6ZF458CfAj4X6rok3xQ+JU0zarput3WnaV4x8SWlnJrTac9gss+n2OnW+n3t7JYfbYF+yWomeU3MZaGQou28Vwxk2X1KE8RjKlSlOlVbVaagpTjKKik4++l7ztFW5rWv2vL+OeOuJaWKwuQ5LSoTpVcPFvKsFUnKlTl7RtTlWlVj78o3lUlZRST0Ukz85fib8cX+IHhLT/APwl+HNr8PPD/iXwDeaR401zXbHHj19b16UWuo2miXdne37WlqmlwNbSajLezz3kmriGBbNrAPN4zzDB4GnSWAw1KhXhTlCviZXnKclPmVWi5u8YSikrS95pyVtVb9Qyjw8z7HV6mZcZ5niK9J1YVMPl1Kso0o0VC6ji407U7qcrpRTs17tSTk2bvwe/Zr8P+H/AAvZaa9jHPi60q4lW5VWaKDT7lL6GBDtG2NbgKfJUfvmctMpydvwmc5hWxznCNSdpSbm3J/vG2uZu99JK6Tvd7s+ix+aYbByhh8LCFOnhqcqcfZr3U00oqFm0krXvZPdu2x9s39tDoGlWlhbqpv73dcXBTG95ZzhnPdQFGI8AhECgAbAK82VGFKhSim+aS5pa63dnr38vQ+HnipYzFVqtXmlTg/ZwdntCUuvXmk25dXe51fwy8Dw+JNfstMvdw0qGVL7X7oRsFnVRui0pJzlfNu8DzVGHWBLiUcoAfvOBOGZZ1mMJ14NYHDShVxE7NKfK7woprrVtd25Xyx8j4fjTiaOS5fUlRlFY7ExnRwdO/vQXwzxDj2pXstHeUoroz9IIzbmOFbXykjWOGNRHtWNVwFVFAASNAq7ANrYUEhh1H9JRjGKUYpRUdEkrJJdEuiXS2lkkj+apSlJuUm5Sk23J7ttttvzb1Yk80MaY+ffuKsGdeyg7flVSRuHXOPm2/N1DEeV+IEOu6tZaZx9hguDe3xUKfOmMMkFvFvYOypY21xe3ZKrHIt79kEU3yXCVrFS26Oy6f1ZdfOwn/Xmbv7DHhxrP4OWvi5ojHD8QfEnxD+I+mBmVm/s74p/E3xl8TrUnAG0pYeLbCALgBDFIi5QKaq3vzlrrOX3J2T+5K3kPpFdoxv6uKct9veb02WyPtWmIKACgDg/G/TTPrefytauPX5Ey6G/4Z/5Adj9Lj/0qnqZbv8AroNbI3aQwoAKAMvWbAajYTQYzKu2aD2miO9B/wACwU9Pmz2pPbTcD5Z8Q2X9j6/Z6vbgRQ6ky6dqJIG0zFj9kmkyPl3OXiZm+bkZIUACLXSfd2fTVbX/AK/yGVr2SW2uReeWka4XexAZZNm7gjbyHGdm4dV6gDmrJpJbL80I0jJBqU9rErQGO1LX0yFV2mQr5cSMNpwPvkJjuAuCOJ1irW1bD9NV6n5P/FrV7LQPjf8AELweYIrO0kvrbUrSBI1jg8vVtPtL1zGuFEbrczTthAFdTuXBVhX8weIGCoYbiXH0aUI0nUdLEKMElF+1pqpKyT0tNy2vZ3vZH9T8B4mpjuGMtr1JzqypKeHdRvmlFUpunCM291yq2t3ZLUveHfExW0vNOu5QWtSpikdj+8gBBjYD7rMACjck7gx5XFfEU604RtJ9eq7dtvwXY+jxGEjKpGolHVtXu7c2i/4NvVbJi+J9Ch8QaTdW11D59nd2rqV4YNE6Deq8EO6FvlJ3bmDDOCRXr4ZyUVUUt/eUtdNN0736aPe+tgwmLq4LEU6tLSpSqX1+GUduV9XFrSXyPlO2+C13o19eNBpOk+ItJu43h3XdoLmSMGSYh/LwstvLHvVVVHMZRV+fZmM+rRzj2aanSjU5ouLfLKcez0Wz6uzW3VLX9WwfEmX46jTjLE18DiIWlKk6nJB+6vhk5cs4O7Wq0t5XOsf4K/DqeyshL8N/DaXVtcrdx4hktI1vLUGSG5WNJVVJ/OPmrImGiaRthBY12081y9rmnSgptcrSqyjF82148y287tWMJ4qn7aa+sUq0JOT97C4apJKb1tJwbaSve+jV7p7vun8AxNaRR6b4N0OS8MDWz6hcQy39xBEoEscEFxqFzcG3t85j2wCIDzHJJHNOpnFCFOVOhhaLm7x59araTvaMpNqLv6PbTQ46WYZfg6tSpPMatGk5c31ahClhqdRv3XKccPClzSSbklPms+ilqc34f+FVlomp/bbzbeaiGcyLEo8i3Bky0aDCghNxSPlVwAVHy5PzOMxdWu+W1o815LW711v71tH310ucub8W1sZSnh8M5UaXwqbbVSW9tG7xT0Ut2/U92tWttMhLiJUEG15gOS7AEwwIo4LFtm5FBAfj+EgcVZx5o2i+ZJXb1V1pZO+vfunfY+G5qsuZznzc97X36cz331vF9LqWyRxnjfxtZeDvCviXx9rSSXf9iaNqurR2Fuf31zFptjPdm0tFc7fMkWEwQ5wpdtzEK2R2YPB/XK+HpXbderTpa7R55KC2TdlfrfzZy16ywlGtNK1KhTnVn1lJU4ubs/5m01H8dEfQf7BXxS1H4+/so+C/iXqXh218J+KNWvfF8Os6LZ75007xF4c8Y69oXltcygTXStb6Tbqly2BNC+I0jj2xL/VHDuWUMpyujgsPGKVJP2k0lF1a12/aSWm6svKKS6H8ucSZnWzfNq+MquVppKjTbk1RpJaU0npa/M20vicnrc+49Pe4ghjvIJDPZXMZlNouEe23pl12/MR5bHa8WcBu47ew3fW1vL+up4Y6fUEuiRbjPlxkTS8+XaRKOUiIXa9y0e52C7vJLqX+YBGqPayvfS6fbuB5t4603VLj4f8AjJNEd4/EfivTpvBXhqSB3W4i8QeLE/4R/TLm2kVWkB059TtrkTpufdFczgmRs1prGXNGz5fe18k+X8bfP8V223S1dtLpO3nZs+4/BfhbTvBHhHwz4P0mJIdN8MaFpehWUaDCrb6ZZQ2ceB15WIHn1oirJLskht3bfc6emIKACgDg/G/TTPrefytauPX5Ey6G/wCGf+QHY/S4/wDSqeplu/66DWyN2kMKACgAoA8b+IfhxJre7KL+4vc3Cf3YruErKyjA43FTLHkH5mfbgLxLdnr8PXS/9fkB5zBFDfaO4uwBKkP+sU8yRx4U+ZnjeDjkAE/ezkYJGV3bZa20/Pf+mByVp4Jur6a5ubfVZtPlaTBaKSZJVQKfLAVHVXAX7u8EAnngYpPl1u2n5dOz3Qf10/zPx+/ao0V/Dn7Rur2jarqGrfadJ0O6nv7+WM3cbtbFIkjEEcaLBEsI2x7S0aPhmfJr+ZvFqLp8R88ZScnhcNUvezi+VxSTS0Vo6LXd37n9QeE8/a8LxjOKjGni8RBJbPW/NrvK7eqtfTR9eXs9aurGe3Mx3bDhfSW3kXbLC5yBuGS8Z4G5dm4cCvzaliYYnlhL3K2ikre7L3U9O3Xb8T9CrYdwUlZOm9YNfFFtX12Wkn7tu2p7Z4U1r+09Km0yZlSZEeW1PJkUCTaBwcOVbpgBcOtezg6i5JUu2q8/Lfq9dup5GKouFWnWXwzdpKzsnvfrZv1/yDSdUt4rq7gbAELNvDMwO5zjywpVnBBIkCbfu85CAY3owg5Tt5aXV7f57pq35m3sZuNOVtW/dW6tGN77b7eZ2dgRNlzb3co3E5aWMqVjfACJsLIHD8h2BwV+bg12RoQ09y6TTtfpFdPUwxXtqWkZQstHH37ptaX953d+2jWuvW9f6pY2kMjTyNCuSHUlsbhlGGEJ2kfKiAAHBLhfuiqmoRjLeOmqfS/f7/ncyo0cTUlH3VOSfbRRvq2297fgcMlwvzXzAuGEjjO+NGKkKqoGAzt6OSQSw/vHFeXWkoWmubeS1t2sul9bvy6nVXoSbkk1FJq2kejWui6K9t7mRc3EztFbxNK0k83mvGjBxsILxBg2MCEE7nA4I+Zj0PFK7e1r6pef9fmVeMr3WkI8rlqnorO2rTXNZdranlXxM0tNVgtdC1u/az0jWJ7fSNSukUlbDTdSkS0upkUbXIt7aZ5flZXYxgbgxAHt5FKKzXL3NuFOOKw7cmtFH2kOa9+itfY8bNrvKswVJc0pYbExS11fs5JJb63+XTQ+g/8AgmxbXfwzsf2i/wBn/VZY2vvhH8ctbg0e2V1j2eCvEWk6deeENSlheQsjeIrO1k8SOyZS4m1ia6A3TFa/rHDJL20E21zxkmlb3XGyf/b3IpeTb26fylirydKbiot05KS/lanJtX0ulzNL0fRH6VWFs7yNFckwwyXkzLDG0iblZpJSHlPzAFSoZVAIDDI6g9iir9Om/lf8zkLN6iWoi0+2jVTevJNHFEAdiIYjJEpGMHDQo2QDsaXb8xJqU+ZtLvoB6h4I8FwX15o2u337228O3N5daVb/ADGM6xNbT6cL052hlsLC7vooo2R4/tN3HOrCexj2Eb2d+r/Lzv6eWlw/S/3/ANfme5VQBQAUAFAHB+N+mmfW8/la1cevyJl0N/wz/wAgOx+lx/6VT1Mt3/XQa2Ru0hhQAUAFAFHUbCLUrOa0m4Ei/I+MmOQcxyL7q3UZG5Sy5ANAHzpfaXNp8t3bXKmDyrua1mG0mMRS5likXKjKOrqUbJBzGc8kUR1TUrLTda3+f5/oBU1/VtF8HaNf+ItavrfTNJ0i0mur65ubsRQCKCMuxeSQqrYdQEB5b7mCGxWFapTo0516slCFKLnOctIxUVdtvp93XS9zSjSq4irToUYSqVas1TpwgnKUpSdkkl579km2fz3eOfiQfiz8VvE/jaRHSLUdYMenxOCDDpUB8jTVIbBDiySKSQYwJZZB2Ir+T+Os0Wb5riMdHWnOXs6TT09lSdoX1/lipPZK5/W/BWVPJsnoYCUf3kbSqtJL95Us5/8Ak2jPSRov2/Tg6AY8sfOMFo2C53EdQme4JIb/AGTx8BOm2o1KcpXUr3Sato9N9tbbdj7GNZRm6dRWTvo9nf59mtyDRrm90XUI/tJcwAopmUMR5e4ZLHHQAZAHysBhjjr2YbG2fLVuparmSdtNNd7afmTXw8ZxfLaSsvPW2i33va3pqe+6L4e0HXAt+wBnlG6WSJ9okA4EmQTjPBwDgnLHAOK+lwc6U7StaWt97X2vrp2+T7niVsTicInCOqim4qUFdLd6+Tbtfoe46N4Y0axtIQWIk37sZBV14JUEEfKAu7BPHC/MFyfqMNSoKEXJpPWXvNOPnsk7Lr2Pl8XmeNq1JKMY8sk1e1mpW3XZ9EN17QfD13bK5gt9qMTMzYdnOfuhRwcYPBG5QOuKnFwwc6KahBaq7et976bN21Tb0Hgcdj6dSXNOUpSXLBJLRNJJybvLdyX3dbnh+rWrXt1Lp2lW3nBA8eEGIo1YIGkuJFBVDkEkZ8yXGIlJGR8nUvKcoQhKVp6WWiT6ye1276ro9uh9C6qhTjOtNRk7uWqvJ6v3Yu1+ye2lm72NbTPCVvpcJlnBuLnaPNuOgCdWijU5IXjBAJLH5mJIGNaeEj7sp+8730u4t/NJeml9Ls82tjqlWXLD3YN8sV2Wru16X6o+Zfj1u/s29MKmMMQoDbhliR/COSFAUEAAZGOKqk40sQpRTjacZXaS0ve66fNap2e50qEqlDkbUvc5Xppa8nqlv1vfdXTuj8qtY/b4+I/7G/7Xlt8cfGNu2v8Awz8e+AvDnwk+J4jtjb3DDwc8t38PPHM0sZZLrU7DT7m48KX93cKXms0to5JA3l4/eOGeKJ4qlTpVZKrVo0lT0d5VKcXpzarnqRSjZ7208z8U4q4Rhhp1K1BOjQq151JOSvGnOd3prFRhJu1ktJXvbQ/o4+Dv7eHwD+Kvwz0f4sv4t0zRPCet2sF9aahf38EMccsLC1u9NlUuWi1BLpBbm1IeSVnQ26zb1r9ApYqGJpRxEZcqd17ycUmt1Lm1Xne/r1PzXE4Otha8qE4OUlquX3uZP7UWkrrzsfaXw31G3+K9xpvifw8yjQbmJZdJudrqX02QRStqBhIR4RcQ3O+ATqkk3mwkpGQQOmNpRuno3uuvS6/rz7HI01dNWeqt2Pr+2tobO3itrdBHDCgSNR2A5JPqzElmPVmJJ5NWBPQAUAFABQBwfjfppn1vP5WtXHr8iZdDf8M/8gOx+lx/6VT1Mt3/AF0GtkbtIYUAFABQAUAeYfFjTNem8H65qvhDRo9f8WaXpl1d6VoLXkWnHxDNbQySx6PHfTlba2u7ph5dhPdtHapcOsdxNbwSvcw51p1KdKpUpUvbVIQlKFFSUHVkk2qanL3YuT0Tlpd6tLVbYeFOpWpU61VUKU6kYTrOMpqlGTSdRwi1KUYrVqPvWTsm9H/Lz8Uf2hPjf+0V4vv9J8fRXvgrwz4cvprWb4eRJc2K2V7YyNE0GvRzJFdXeo20qlZYLtUjt5kO21SRS5/nbizjLMMwlUws+fB0o1JQlg4pU5RknyuNVu1Sck1aSnZJqyjsf0fwtwZleVQpYqmqeLryhGcMa+WopqSclKha8I02pXUouTkmnd2uYXgqxB1qZI1PlpcLgHP3OVzjGQAQG65HBOecfnOMfPRp6Xu3e2y3P0LC/u6m9tV2tyt32+X3n2h4T09HghU4CvGd6kAgDOABnjAOfUj8a82lSTXL3TbW/bSwYupLnu09Fo9bq217Ps1a/b5nWXngR7hY2gRHx+8yFCllPVSB14OOvpgVrPLJtPkS2Tulo016d7/duzjhmqpStOcnfRttW8v6enqTaT4ZlspDHHcTWo+YhYmZcNhc4U8bSemPTOOpqaGGrUpW9pKFtl1vf5ddPy3KxGNjNOThCemjaWunbW/np89j0rT/AA/q0qp5mq3m0YREDRscFRzlkYg4yAOoBxxk5+gwmHxdRR5q9RJtLXl23vqn99zwMRmVGk2o0KV7tuTjft5v0/I1pvC5EcYa6vLhQNzCe4bbnJydsKxg9wVctz0HQV3zwNVpJzqTV22pu6Xk0rK3S1vL08+ObtubUaVN7Lkgk7fZ1abvun56m1YeG4La3Ty0SPf87IsaKGJOTtGM4PAyQGOeo7dVHL4wgr+7za+7Gy09P8jgrZlKdSzblbS976X117qxieI7ZVgMKbVG7btHGMHaSc8dcFRzk8keuOIpxp8sY2vq9N+u/Y78DUk37SWqSuuqejVvJ63+XmfHPxh0xruDyIkLpuO4/ec7c54wQBkBieuR0Irza8WvetolbTR33S/BLfc+jw2sOb4eZ37O2tlbutE/6Z+aHxq+CugfEaz1HQ/EOlQalbT2xtGhniEiypIGeRSCvGVWEoc5zyME8a4PMsRgKkatKo4SUk/durNX/Pr6nVWwWHxsJUq0ITpyVmppNa6vXdeTWz1t3+n/APgmB+xJ4MtPB/jrw5b2l9qx074pafd6Hpt7Y6ZfNBFe6Bpl0bW11C6tZLmNGlSR553nX7LAsjb49zTL+98DZjPOctxFWtb2lKtGKstWmm7+u2ux+AeIeVUslzLCQofBXw8p/G5KNp2snbbS6V3a6Vj+pj4U/DXTvhn4bXSrYpLf3kn2zVJ4xthFwyKq2tnGAqx2dogEUW1EMzB53RGk8tPv4R5YpH5o3dt92z0+qEFABQAUAFAHB+N+mmfW8/la1cevyJl0N/wz/wAgOx+lx/6VT1Mt3/XQa2Ru0hhQAUAFABQAUAfAP7Wf7F+kfF/7f8Rfh5bWGi/FVbaMalERHaab46t7ZBHHBqUoCpa6/DbqsNhrEgKXEcUOnakywC2vtO/NuN+BKWfxlmOWqFDN4RXNF2hRx8Y/Zqu1oYhR0p1npJKNKraPLUp/pXBPHlXIXDLcyc6+USk3Tmk51svnJ356S3nhnLWpQWsW3VpJy5qdX8Y9E8H614X8a6zoniDSb/Rda0lktdS07ULaS2vbO5jLF45oJFV8MGWRG27ZomSWNnR1Y/z3i8LiMJUq4TF0atCvQm4VKNWDjOE1a6cWrpNapv3Wmmm00z+g8NjcNiaVPF4WtTxNCvBTpVaU4ypzh3jJb63TW8WnFq6aX0RpB+zywRLnP8Kj5AFcqegGMqSVPJxkdOlea1ytcrer1S7dV5f16l1purBSTaSdntbZfp5eh9DaDbmew81vL2CM9TiQEfwr0BztOeM4xntX1WCoOrS53a1uXpzX5V0vt5v57I+QzCqqVaMVe99NHyOPdu9lbpp+ej18PiW4ZidhHzAkHLDbkDHUHI9Tmp/s/mm7rl5U2mle7bVt3o9P66xPMOWkopc32dOiejd7/lsrmzYCYqNsbKwYjawMchZT3BGRnHAzjnjgk1vhufmUeXpomrap+dn8+vWxw4pxldykrSirtNOy9TdtrCQpsmYhVO5UVyQNx3EMxJJyxO7LYwcdMV69OjJL321f3knrq3du+mj/ADueZVxEG7wS5mpRva23Kr20svlfy3NKcCOMKF4GBgdcD0+nX37VvK1tEtL7JXs9zkhedTo29b9pN9H0/S55z4gkcO/yKYRGeit53mKRt5PATbuLEDduOOmTXj4pv2r91cqi0rfFzX0e2q1sfT4Hl9jG825tpNaONrO/W99mna2/XU+b/Fenm6ediQVRJSEPIwd21vbHfAJx7DB8+p9ptXjZ3TV3rordF18j38HUlZOb91Wim9L+jfW/e/l3PB/D/wAIvE3xM8YTeHPB+iza34gv5ovs9rbKCLKFkFs17dmRlt7SzUKZZL28lhtreNt8jgHnnwOW43NcVHB4DD1MRiKrtGlBK6jdXnUk7Qp043XPUnKMYrVtI7cwzHAZVhJ4zHYmnhsNSjdzm21JtN+zpw1lUqzafLTgnOT+GMtbfut+yP8AsraL+zL4Ov7FtQ/t7xf4mvItW8RamEAsrKcWVvarpOih0SdrG2ELGS9uQt1qE0kkzxWsHkWVv/THCPDa4by36vUre3xWImq2KnG6pRqcij7Kimk3ThZrnklKo7yairQj/M/GHE8uJ8yWIhRdDCYaEqGEhKzqyp87k6tZq8VUndP2cG400lFSm05y+ua+qPkgoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/hn/kB2P0uP/Sqeplu/66DWyN2kMKACgAoAKACgAoA8S+LXwB+H/wAXo0u9c09dP8T2sPkaf4s0yOKLV4YhylpetgJq2nK2Stle7/I3zNYTWUs0krfM8Q8KZVxHSX1qn7LFwjajjqMYqvBdIVLrlr0r/wDLup8N5ezlTlJyf0vD/FWa8O1H9Vqe1wk5XrYGs5OhN9Z07e9Qq/8ATynbmsvaRqRion5n/FT9nvx/8LLqTUrnS5dd8OwsdniLRY5bmzghY5D6hCEa50plOBJ9sjFp5jBIb2fqf574o4Kzrh+Uq8sPLF4BO/13CQlOjCO168UnUw7ta7qx9nze7CrPRn7/AML8ZZLxBGOGjiFg8ZNa4PFypwqTn1VCTtTxC3cVBuo0rzpwOh8IQibSYMBS7ohKtwF4YEDAOWOR7E9T6mVQcsPHW90nbTqovfv8zizmcKOLlFu0FzJaLX3rJPstb+h28dsoGHUH0yOw4ABx09c9c16qpcr1SV++7Vr20676/ifPVKrfwy7K6v1d29UlsrK2hJHbxq2Qiglic4/AHnOPbB9u/JGEVLZNrrvddPRrTTyXkZyqSlZc0rJLS+nXp/wHcmZ9mBnnbuJCk9CfTk+uPSteqXlf8bW9dNhKLactLc3LdtaO3f08vIqS5IB3dM5PTJHXjIOPpwOlZT3Wt99Oi369fu17lQs38MLSvyvR8u+613tp5nBa2S6PIoyxZ1U8qMDJG0AcljkknHHrxXBiI6czWt7cx72D0ko3WkVdJdVo2320/wA0aXw7/Zk8f/Eq5a/1K3l8I+FrgqDq+rQOl9eWpPzNpGlMYrm4EkWGiubn7JZMH3RXMpBSvoMl4IzfOpRq1oSy7AtpvEYiLVSpC939Xw94zneL92c/Z0ne6nKzR52b8cZTk9J0KMvr+OhKTVChNOlCatZV665owtJe9CHPUTTUoR0P0W+FPwQ+HPwasby38E6Db2mpautp/wAJB4iuFSfX9feyjMVsdS1Aorm3tw0jWun26wafavNPJBapLPPJL+0ZJw9lfD9B0cvw6hOpy/WMTO08TiJRVk6tS1+VbxpQUaUG24wTbb/HM84jzXiGtGrmOIlOnSc/q2FheGGwym7yVKldrmlop1ZuVWaUVKbUYpet17h4QUAFABQAUAFABQBwfjfppn1vP5WtXHr8iZdDf8M/8gOx+lx/6VT1Mt3/AF0GtkbtIYUAFABQAUAFABQAUAIQCCCAQRgg8gg9QR3BoA8v1z4OeANbeSf+xItHu5WLyXWhbNNZ3bO6SS3jjaxlkYks0klo0jMSWckmvm8bwnkeMcp/U44SrNtyqYK2Hcm93KnGLoyk93KVJyb+0e/huJs5w8FTeKliqSVlTxl8Ryra0akn7aKS0UVUUUtkeX6n+zrLuZtH8SxsuSY4dTsWRlGeFe6tZXD9slbOPkZ284HzOI4AldvCZjFr7MMRQaa7Xq05u/qqUfQ9uhxjHRYnBST+1KhVTT9KdSKt86kjk5fgH43jJVJ9CuV5+ZL64TPp8stjHj8zg9z28uXAucRm7TwU0/tRr1F6aToxPQjxZlT15MXDRaSpQeq841Zb/wBdRbb4AeNnYedc6DbryCz3t1KRnPIWKxfOOONw9M1VPgbOHJc9TA011brVZP7oUX+aJnxbliVowxc/SnBXfnzVV99tjr9N/ZygLI+t+I3dBnfb6VZLExzjO28u5JgB1BBsT2IIr1sN4fwunjMwckr3hhqKi+m1WrKf/pk8+txnJX+q4JJ9J16nMvL93TUf/Tp6x4a+FHgTwrJHcadoVtcX8TeZHqWphdQvo5MY82CSdTHaSY432cVucFh0Zs/U5fw3k+WuM6GDhOtDWOIxH7+tF6e9CU040pab0o0+q2Z4GNz/ADXHKUKuLnClNWlQoN0aUo/yzUGpVI+VWU19yPRa908YKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/wCGf+QHY/S4/wDSqeplu/66DWyN2kMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/5Adj9Lj/0qnqZbv+ug1sjdpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA4Pxv00z63n8rWrj1+RMuhv8Ahn/kB2P0uP8A0qnqZbv+ug1sjdpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA4Pxv00z63n8rWrj1+RMuhv+Gf+QHY/S4/9Kp6mW7/roNbI3aQwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/AIZ/5Adj9Lj/ANKp6mW7/roNbI3aQwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/hn/kB2P0uP/Sqeplu/66DWyN2kMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/wCGf+QHY/S4/wDSqeplu/66DWyN2kMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/4Z/5Adj9Lj/0qnqZbv+ug1sjdpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA4Pxv00z63n8rWrj1+RMuhv8Ahn/kB2P0uP8A0qnqZbv+ug1sjdpDCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA4Pxv00z63n8rWrj1+RMuhv+Gf+QHY/S4/9Kp6mW7/roNbI3aQwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/AIZ/5Adj9Lj/ANKp6mW7/roNbI3aQwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOD8b9NM+t5/K1q49fkTLob/hn/kB2P0uP/Sqeplu/66DWyN2kMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G/wCGf+QHY/S4/wDSqeplu/66DWyN2kMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDg/G/TTPrefytauPX5Ey6G5oTi1+2aLKQtxYXNzLCjEBp9NvLmW5s7mJR1ijErWLkfdntZNwUMgMvWz72+9LX/P5jXVdvy6f5HQUhhQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAcvdW9vr2rNA2ZLPSLeaG4dDhW1K8e1kWBHGQXs7a3ZrlcZU3sC53LIq1ey83+Wv5/oTu/T83b+vma9/plvfmGR2mt7q2Ja1vbWTybu2Lbd4RyrpJFJtUTW1xHNazhQJoZAAAk7enZlWPE9V+JviLSb6axji0y7SBionu7afz32sy7n+y3drBk7cnZAgyTgAYA1VOLSeqv2/4NzHnktNDO/wCFv+Jf+fHQ/wDwGv8A/wCWdP2ce7/D/IPaS7L8f8w/4W/4l/58dD/8Br//AOWdHs493+H+Qe0l2X4/5h/wt/xL/wA+Oh/+A1//APLOj2ce7/D/ACD2kuy/H/MP+Fv+Jf8Anx0P/wABr/8A+WdHs493+H+Qe0l2X4/5h/wt/wAS/wDPjof/AIDX/wD8s6PZx7v8P8g9pLsvx/zD/hb/AIl/58dD/wDAa/8A/lnR7OPd/h/kHtJdl+P+Yf8AC3/Ev/Pjof8A4DX/AP8ALOj2ce7/AA/yD2kuy/H/ADD/AIW/4l/58dD/APAa/wD/AJZ0ezj3f4f5B7SXZfj/AJh/wt/xL/z46H/4DX//AMs6PZx7v8P8g9pLsvx/zD/hb/iX/nx0P/wGv/8A5Z0ezj3f4f5B7SXZfj/mH/C3/Ev/AD46H/4DX/8A8s6PZx7v8P8AIPaS7L8f8w/4W/4l/wCfHQ//AAGv/wD5Z0ezj3f4f5B7SXZfj/mH/C3/ABL/AM+Oh/8AgNf/APyzo9nHu/w/yD2kuy/H/MP+Fv8AiX/nx0P/AMBr/wD+WdHs493+H+Qe0l2X4/5h/wALf8S/8+Oh/wDgNf8A/wAs6PZx7v8AD/IPaS7L8f8AMP8Ahb/iX/nx0P8A8Br/AP8AlnR7OPd/h/kHtJdl+P8AmH/C3/Ev/Pjof/gNf/8Ayzo9nHu/w/yD2kuy/H/MP+Fv+Jf+fHQ//Aa//wDlnR7OPd/h/kHtJdl+P+Yf8Lf8S/8APjof/gNf/wDyzo9nHu/w/wAg9pLsvx/zD/hb/iX/AJ8dD/8AAa//APlnR7OPd/h/kHtJdl+P+Yf8Lf8AEv8Az46H/wCA1/8A/LOj2ce7/D/IPaS7L8f8w/4W/wCJf+fHQ/8AwGv/AP5Z0ezj3f4f5B7SXZfj/mdd4U8Waz4yupLK9mTTYViLs2jobeaQAtlDNdtfSRKwXBe3aCZQSUlRsETKKgk1r6/0vxKjJy029P8Ag3PWLS0trGCO1tIlhgiB2IuTyzFndmYs8kkjlnkkkZpJHZndmdiTluaJW2D/2Q==';
77
+ const LIVENESS_GUIDE_IMG = '<svg width="327" height="275" viewBox="0 0 327 275" fill="none" xmlns="http://www.w3.org/2000/svg"><rect width="327" height="275" fill="#F8F8F8"/><path d="M94.4575 88.8376L67.3527 70.2703C65.5273 68.6387 63.2943 67.4476 60.8821 67.0724C57.5409 66.5502 53.5151 67.3987 52.7491 74.186C52.1297 79.7008 54.0204 85.1992 57.5735 89.4413L94.4575 138.03V88.8376Z" fill="#F8CCC7"/><path opacity="0.3" d="M116.709 27H231.892C244.165 27 254.139 36.9853 254.139 49.2711V274.462H94.4609V49.2711C94.4609 36.9853 104.436 27 116.709 27Z" fill="#43A2C2"/><path d="M117.245 45.9929H231.352C237.644 45.9929 242.761 51.0997 242.761 57.4139V274.463H105.836V57.3976C105.836 51.0997 110.937 45.9766 117.245 45.9766V45.9929Z" fill="white"/><path d="M120.359 259.957H227.832C229.592 259.957 231.027 261.393 231.027 263.155V274.478H117.164V263.155C117.164 261.393 118.598 259.957 120.359 259.957Z" fill="#00C1B6"/><path d="M271.819 274.46L271.51 243.639C271.51 243.639 275.405 162.223 255.26 153.723C255.26 153.723 238.651 150.688 238.407 185.604L236.956 226.508C236.956 226.508 209.917 235.073 206.07 274.46" fill="#F8CCC7"/><path d="M79.5461 242.401C79.5461 242.401 65.3336 221.892 67.9251 202.134C68.5445 197.369 70.7611 192.866 74.5424 189.913C76.1071 188.689 78.014 187.629 80.2795 187.074L94.4431 207.175V216.753C96.4152 222.039 99.3164 227.537 100.62 233.036C101.696 237.588 102.56 242.205 102.886 246.888C103.098 249.923 103.945 254.817 102.283 257.558C101.256 259.239 98.8927 259.484 97.0509 259.304C88.2659 258.488 83.8652 248.65 79.5461 242.417V242.401Z" fill="#F8CCC7"/><path d="M94.4587 207.175V216.752C96.4309 222.038 99.332 227.537 100.636 233.035C101.712 237.587 102.575 242.205 102.901 246.887C103.113 249.922 103.961 254.817 102.298 257.558C101.272 259.238 98.9083 259.483 97.0665 259.304C88.2815 258.488 83.8809 248.649 79.5617 242.417C79.5617 242.417 65.3492 221.908 67.9407 202.149C68.5601 197.385 70.7767 192.882 74.558 189.929C76.1227 188.705 78.0296 187.645 80.2951 187.09" stroke="#F2B1AC" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M88.2668 42.532C85.7568 40.7372 84.2084 39.7093 81.7962 39.3341C78.455 38.812 74.4292 39.6604 73.6631 46.4478C73.0438 51.9625 74.9344 57.4609 78.4876 61.703L94.4929 82.783V46.8067L88.2668 42.5483V42.532Z" fill="#F8CCC7"/><path d="M87.3713 202.868C87.3713 202.868 71.5941 182.701 66.9001 157.493C66.297 154.247 66.2481 150.902 67.0305 147.704C68.7418 140.705 74.6257 131.519 94.4612 137.213V163.269C94.4612 163.269 105.3 184.969 103.621 200.094C103.621 200.094 101.665 218.808 87.3876 202.868H87.3713Z" fill="#F8CCC7"/><path d="M94.4605 163.269C94.4605 163.269 105.299 184.969 103.62 200.094C103.62 200.094 101.665 218.808 87.3869 202.868C87.3869 202.868 71.6097 182.701 66.9157 157.493C66.3127 154.247 66.2638 150.902 67.0461 147.704C68.7575 140.705 74.6413 131.519 94.4768 137.213" stroke="#F2B1AC" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M217.398 119.43H224.081" stroke="white" stroke-miterlimit="10" stroke-linecap="round"/><path d="M222.668 117.195L224.64 119.398L222.391 121.65" stroke="white" stroke-linecap="round" stroke-linejoin="round"/><mask id="mask0_10140_795428" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="120" y="75" width="108" height="135"><path d="M174.096 209.362C203.558 209.362 227.441 179.485 227.441 142.63C227.441 105.775 203.558 75.8984 174.096 75.8984C144.634 75.8984 120.75 105.775 120.75 142.63C120.75 179.485 144.634 209.362 174.096 209.362Z" fill="white"/></mask><g mask="url(#mask0_10140_795428)"><path d="M206.662 179.129C206.662 179.129 274.058 185.362 233.946 232.498H126.864C126.864 232.498 89.5074 199.263 139.381 179.129H206.679H206.662Z" fill="#25608A"/><path d="M156.591 185.804L149.859 249.011L197.875 246.172L189.726 175.312H157.275L156.591 185.804Z" fill="#F8CCC7"/><path d="M128.234 137.375C128.234 137.375 116.075 137.897 117.297 150.264C117.297 150.264 118.943 158.227 133.27 159.401L128.217 137.375H128.234Z" fill="#F8CCC7"/><path d="M126.21 130.867L134.229 165.897C134.229 165.897 138.532 187.972 171.553 189.588C204.59 191.203 209.92 171.085 209.92 171.085L223.562 119.691C223.562 119.691 226.398 79.7823 178.415 75.9807C178.415 75.9807 116.854 71.5591 126.21 130.867Z" fill="#F8CCC7"/><path d="M207.705 208.105L171.326 230.393L147.562 209.737" stroke="#231815" stroke-linecap="round" stroke-linejoin="round"/><path d="M216.927 135.402C216.927 135.402 229.086 135.924 227.863 148.292C227.863 148.292 226.217 156.254 211.891 157.429L216.943 135.402H216.927Z" fill="#F8CCC7"/><path d="M192.27 146.123C194.727 146.123 196.719 144.129 196.719 141.669C196.719 139.209 194.727 137.215 192.27 137.215C189.812 137.215 187.82 139.209 187.82 141.669C187.82 144.129 189.812 146.123 192.27 146.123Z" fill="#231815"/><path d="M159.848 146.123C162.305 146.123 164.298 144.129 164.298 141.669C164.298 139.209 162.305 137.215 159.848 137.215C157.391 137.215 155.398 139.209 155.398 141.669C155.398 144.129 157.391 146.123 159.848 146.123Z" fill="#231815"/><path d="M176.07 143.887V157.755" stroke="#231815" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M171.75 168.492C171.75 168.492 175.01 170.499 180.388 168.492" stroke="#231815" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M156.459 186.992C156.459 186.992 167.607 194.449 191.126 187.661L192.088 195.835C192.088 195.835 178.136 204.695 155.562 195.427L156.459 186.992Z" fill="#272828"/><path d="M191.275 132.76L202.163 131.993L200.989 111.549L213.621 136.447H223.596C223.596 136.447 247.424 79.1627 202.098 80.3537C202.098 80.3537 164.627 46.319 125.233 86.6353C125.233 86.6353 101.176 117.586 126.195 139.743L138.011 138.585L141.255 112.545L191.275 132.76Z" fill="#272828"/></g><path d="M174.096 209.362C203.558 209.362 227.441 179.485 227.441 142.63C227.441 105.775 203.558 75.8984 174.096 75.8984C144.634 75.8984 120.75 105.775 120.75 142.63C120.75 179.485 144.634 209.362 174.096 209.362Z" stroke="#00C1B6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><path d="M174.1 195.685C198.128 195.685 217.607 171.427 217.607 141.504C217.607 111.582 198.128 87.3242 174.1 87.3242C150.072 87.3242 130.594 111.582 130.594 141.504C130.594 171.427 150.072 195.685 174.1 195.685Z" stroke="#00C1B6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="5 5"/></svg>';
77
78
  const DEFAULT_ICON_URI = 'data:image/png;base64,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';
78
79
 
79
80
  const defaultIdentityVerificationConfig = {
@@ -90,6 +91,7 @@ const defaultExtraDocumentConfig = {
90
91
  requestInfoHandler: () => ({}),
91
92
  showCloseButton: true,
92
93
  continue: true,
94
+ border: undefined,
93
95
  extraText: {
94
96
  title: 'extra.title"',
95
97
  frontSide: 'extra.frontSide"',
@@ -103,7 +105,9 @@ const defaultLivenessConfig = {
103
105
  headerMode: 1,
104
106
  showCloseButton: true,
105
107
  subtitle: null,
106
- uploadFullFrame: false
108
+ uploadFullFrame: false,
109
+ passive: false,
110
+ compareCustomerClientId: null
107
111
  };
108
112
  const defaultIdRecognitionConfig = {
109
113
  icon: DEFAULT_ICON_URI,
@@ -122,7 +126,8 @@ const defaultIdRecognitionConfig = {
122
126
  uploadFullFrame: true,
123
127
  disablePassportConfirm: false,
124
128
  antiFraudIMetalTagValidCountTh: false,
125
- cardTypes: []
129
+ cardTypes: [],
130
+ cardTypeConfigs: []
126
131
  };
127
132
 
128
133
  function setCorrectViewHeight() {
@@ -7081,9 +7086,11 @@ const card_ud = () => ({
7081
7086
  markers: []
7082
7087
  });
7083
7088
 
7084
- const success = () => {
7085
- const authmeScannerSuccess = util.getCssVariable('--authme__upload_success', 'authme-container');
7089
+ const success = params => {
7090
+ var _a;
7091
+ const authmeScannerSuccess = (_a = params === null || params === void 0 ? void 0 : params.color) !== null && _a !== void 0 ? _a : util.getCssVariable('--authme__upload_success', 'authme-container');
7086
7092
  const lottieColor = authmeScannerSuccess ? util.RGBToLottieColor(util.colorToRGB(authmeScannerSuccess)) : [];
7093
+ const opacity = (params === null || params === void 0 ? void 0 : params.opacity) ? params.opacity * 100 : 100;
7087
7094
  return {
7088
7095
  v: '5.7.4',
7089
7096
  fr: 29.9700012207031,
@@ -7823,7 +7830,7 @@ const success = () => {
7823
7830
  ks: {
7824
7831
  o: {
7825
7832
  a: 0,
7826
- k: 100,
7833
+ k: opacity,
7827
7834
  ix: 11
7828
7835
  },
7829
7836
  r: {
@@ -8626,11 +8633,16 @@ const arrow_down = () => {
8626
8633
  };
8627
8634
  };
8628
8635
 
8629
- const scan = () => {
8630
- const authmeScannning = util.getCssVariable('--authme__scanning', 'authme-container');
8636
+ const scan = params => {
8637
+ var _a, _b;
8638
+ const authmeScannning = (_a = params === null || params === void 0 ? void 0 : params.color) !== null && _a !== void 0 ? _a : util.getCssVariable('--authme__scanning', 'authme-container');
8639
+ const authmeScannningGradient = (_b = params === null || params === void 0 ? void 0 : params.gradient) !== null && _b !== void 0 ? _b : util.getCssVariable('--authme__scanning', 'authme-container');
8631
8640
  const lottieColor = authmeScannning ? util.RGBToLottieColor(util.colorToRGB(authmeScannning)) : [];
8632
8641
  const [r, g, b] = lottieColor.map(c => parseFloat(c.toFixed(3)));
8633
- const lottieGradient = [0, r, g, b, 0.5, r, g, b, 1, r, g, b, 0, 0.03, 0.5, 0.515, 1, 1];
8642
+ const lottieColorGradient = authmeScannningGradient ? util.RGBToLottieColor(util.colorToRGB(authmeScannningGradient)) : [];
8643
+ const [rGradient, gGradient, bGradient] = lottieColorGradient.map(c => parseFloat(c.toFixed(3)));
8644
+ const opacity = (params === null || params === void 0 ? void 0 : params.opacity) ? params.opacity * 100 : 40;
8645
+ const lottieGradient = [0, rGradient, gGradient, bGradient, 0.5, r, g, b, 1, r, g, b, 0, 0.03, 0.5, 0.515, 1, 1];
8634
8646
  return {
8635
8647
  v: '5.9.2',
8636
8648
  fr: 29.9700012207031,
@@ -8653,7 +8665,7 @@ const scan = () => {
8653
8665
  ks: {
8654
8666
  o: {
8655
8667
  a: 0,
8656
- k: 100,
8668
+ k: opacity,
8657
8669
  ix: 11
8658
8670
  },
8659
8671
  r: {
@@ -8811,7 +8823,7 @@ const scan = () => {
8811
8823
  ks: {
8812
8824
  o: {
8813
8825
  a: 0,
8814
- k: 100,
8826
+ k: opacity,
8815
8827
  ix: 11
8816
8828
  },
8817
8829
  r: {
@@ -23504,8 +23516,8 @@ const renderLivenessUI = config => {
23504
23516
  config.videoContainer.appendChild(titleTextPanel);
23505
23517
  config.videoContainer.appendChild(statusTextPanel);
23506
23518
  // Set init text
23507
- titleText.textContent = translateService.translate('liveness.title');
23508
- statusText.textContent = translateService.translate('liveness.error.noFace');
23519
+ titleText.textContent = translateService.translate('sdk.liveness.detection.step');
23520
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noFace');
23509
23521
  setStatusTextTop({
23510
23522
  maskHeight,
23511
23523
  statusTextPanel,
@@ -23585,17 +23597,15 @@ const renderLivenessGuideUI = ({
23585
23597
  ele.classList.add('liveness-guide-header-title');
23586
23598
  const title = document.createElement('div');
23587
23599
  title.classList.add('liveness-guide-header-title-text');
23588
- title.textContent = translateService.translate('liveness.guide.title');
23600
+ title.textContent = translateService.translate('sdk.liveness.detection.title');
23589
23601
  ele.appendChild(title);
23590
23602
  return ele;
23591
23603
  };
23592
23604
  const createLivenessGuideImg = () => {
23593
23605
  const ele = document.createElement('div');
23594
23606
  ele.classList.add('liveness-guide-img-container');
23595
- const img = document.createElement('img');
23596
- img.classList.add('liveness-guid-img');
23597
- img.src = LIVENESS_GUIDE_IMG;
23598
- ele.appendChild(img);
23607
+ const svg = LIVENESS_GUIDE_IMG;
23608
+ ele.innerHTML = svg;
23599
23609
  return ele;
23600
23610
  };
23601
23611
  const createLivenessHintGroup = () => {
@@ -23605,11 +23615,12 @@ const renderLivenessGuideUI = ({
23605
23615
  };
23606
23616
  const createLivenessHints = () => {
23607
23617
  const ul = document.createElement('ul');
23608
- for (const key of ['hint1', 'hint2', 'hint3']) {
23618
+ const descList = ['sdk.liveness.detection.infopageHint.face', 'sdk.liveness.detection.infopageHint.environment'];
23619
+ descList.forEach(desc => {
23609
23620
  const li = document.createElement('li');
23610
- li.textContent = translateService.translate(`liveness.${key}`);
23621
+ li.textContent = translateService.translate(desc);
23611
23622
  ul.appendChild(li);
23612
- }
23623
+ });
23613
23624
  return ul;
23614
23625
  };
23615
23626
  const createContinueButtonDivide = () => {
@@ -23620,7 +23631,7 @@ const renderLivenessGuideUI = ({
23620
23631
  const createContinueButton = () => {
23621
23632
  const ele = document.createElement('div');
23622
23633
  ele.classList.add('liveness-guid-continue-btn');
23623
- ele.textContent = translateService.translate('liveness.continue');
23634
+ ele.textContent = translateService.translate('sdk.general.start');
23624
23635
  return ele;
23625
23636
  };
23626
23637
  const background = createLivenessBackground();
@@ -23693,7 +23704,7 @@ const sendFrame = (canvasSizeInfo, canvas, video, frameCallback, fps, bas64Forma
23693
23704
  })), rxjs.tap(() => received = true))))));
23694
23705
  };
23695
23706
 
23696
- const translateService = core.getTranslateInstance();
23707
+ const translateService$1 = core.getTranslateInstance();
23697
23708
  var RESIZE_STYLE;
23698
23709
  (function (RESIZE_STYLE) {
23699
23710
  RESIZE_STYLE[RESIZE_STYLE["RESIZE_WIDTH_LIMIT"] = 320] = "RESIZE_WIDTH_LIMIT";
@@ -23708,15 +23719,35 @@ var RESIZE_EVENT;
23708
23719
  function detectScreenResize$() {
23709
23720
  const initWidth = window.outerWidth;
23710
23721
  const initHeight = window.outerHeight;
23711
- const resize$ = rxjs.merge(rxjs.fromEvent(window, 'resize'), rxjs.of(0)).pipe(rxjs.map(() => {
23712
- if (window.innerWidth < RESIZE_STYLE.RESIZE_WIDTH_LIMIT || window.innerHeight < RESIZE_STYLE.RESIZE_HEIGHT_LIMIT) {
23713
- return RESIZE_EVENT.SCREEN_RESOLUTION_TOO_LOW;
23722
+ let resize$;
23723
+ if (util.isMobile()) {
23724
+ if (!window.visualViewport) {
23725
+ return rxjs.of(RESIZE_EVENT.PASS);
23714
23726
  }
23715
- if (window.outerWidth !== initWidth || window.outerHeight !== initHeight) {
23716
- return RESIZE_EVENT.SCREEN_SIZE_CHANGED;
23717
- }
23718
- return RESIZE_EVENT.PASS;
23719
- }));
23727
+ resize$ = rxjs.merge(rxjs.fromEvent(window.visualViewport, 'resize'), rxjs.of(0)).pipe(rxjs.map(() => {
23728
+ var _a, _b, _c;
23729
+ const scale = ((_a = window === null || window === void 0 ? void 0 : window.visualViewport) === null || _a === void 0 ? void 0 : _a.scale) || 1;
23730
+ const width = ((_b = window === null || window === void 0 ? void 0 : window.visualViewport) === null || _b === void 0 ? void 0 : _b.width) || window.outerWidth;
23731
+ const height = ((_c = window === null || window === void 0 ? void 0 : window.visualViewport) === null || _c === void 0 ? void 0 : _c.height) || window.outerHeight;
23732
+ if (width < RESIZE_STYLE.RESIZE_WIDTH_LIMIT || height < RESIZE_STYLE.RESIZE_HEIGHT_LIMIT) {
23733
+ return RESIZE_EVENT.SCREEN_RESOLUTION_TOO_LOW;
23734
+ }
23735
+ if (scale > 1.1) {
23736
+ return RESIZE_EVENT.SCREEN_SIZE_CHANGED;
23737
+ }
23738
+ return RESIZE_EVENT.PASS;
23739
+ }));
23740
+ } else {
23741
+ resize$ = rxjs.merge(rxjs.fromEvent(window, 'resize'), rxjs.of(0)).pipe(rxjs.map(() => {
23742
+ if (window.innerWidth < RESIZE_STYLE.RESIZE_WIDTH_LIMIT || window.innerHeight < RESIZE_STYLE.RESIZE_HEIGHT_LIMIT) {
23743
+ return RESIZE_EVENT.SCREEN_RESOLUTION_TOO_LOW;
23744
+ }
23745
+ if (window.outerWidth !== initWidth || window.outerHeight !== initHeight) {
23746
+ return RESIZE_EVENT.SCREEN_SIZE_CHANGED;
23747
+ }
23748
+ return RESIZE_EVENT.PASS;
23749
+ }));
23750
+ }
23720
23751
  return resize$;
23721
23752
  }
23722
23753
  function handleScreenResizeError$(resize$, unsubscribe$, shouldResizeTriggerError) {
@@ -23724,10 +23755,10 @@ function handleScreenResizeError$(resize$, unsubscribe$, shouldResizeTriggerErro
23724
23755
  util.hidePopup();
23725
23756
  switch (x) {
23726
23757
  case RESIZE_EVENT.SCREEN_SIZE_CHANGED:
23727
- util.showPopup(translateService.translate('error.screenSizeChange.title'), translateService.translate('error.screenSizeChange.content'), false);
23758
+ util.showPopup(translateService$1.translate('sdk.general.error.screenSizeChange.title'), translateService$1.translate('sdk.general.error.screenSizeChange.content'), false);
23728
23759
  break;
23729
23760
  case RESIZE_EVENT.SCREEN_RESOLUTION_TOO_LOW:
23730
- util.showPopup(translateService.translate('error.screenSize.title'), translateService.translate('error.screenSize.content'), false);
23761
+ util.showPopup(translateService$1.translate('sdk.general.insufficientScreen.title'), translateService$1.translate('sdk.general.insufficientScreen.content'), false);
23731
23762
  break;
23732
23763
  }
23733
23764
  }), rxjs.map(x => __awaiter(this, void 0, void 0, function* () {
@@ -23812,19 +23843,19 @@ function startLiveness(config) {
23812
23843
  let errorMessage = undefined;
23813
23844
  switch ((_f = (_e = (_d = error.cause) === null || _d === void 0 ? void 0 : _d.meta) === null || _e === void 0 ? void 0 : _e.responseContent) === null || _f === void 0 ? void 0 : _f.message) {
23814
23845
  case INIT_RESPONSE_ERROR_MESSAGE__LivenessInavailable:
23815
- errorMessage = 'eventName.invalid.functionNotEnabled';
23846
+ errorMessage = 'sdk.general.error.functionNotEnabled';
23816
23847
  throwError = new core.AuthmeError(core.ErrorCode.EVENT_NAME_WRONG, INIT_RESPONSE_ERROR_MESSAGE__LivenessInavailable);
23817
23848
  break;
23818
23849
  case INIT_RESPONSE_ERROR_MESSAGE__NotAllowedNewEvent:
23819
- errorMessage = 'eventName.invalid.notAllowedNewEvent';
23850
+ errorMessage = 'sdk.general.error.notAllowedNewEvent';
23820
23851
  throwError = new core.AuthmeError(core.ErrorCode.EVENT_NAME_WRONG, INIT_RESPONSE_ERROR_MESSAGE__NotAllowedNewEvent);
23821
23852
  break;
23822
23853
  }
23823
23854
  if (errorMessage) {
23824
- yield util.asyncOnLineShowErrorMessage(translateService.translate(errorMessage), false);
23855
+ yield util.asyncOnLineShowErrorMessage(translateService.translate(errorMessage), translateService.translate('sdk.general.error.retry'), false);
23825
23856
  } else {
23826
- const defaultErrorMessage = `${translateService.translate('eventName.invalid.promptTitle')} : ${translateService.translate('eventName.invalid.promptText')}`;
23827
- yield util.asyncOnLineShowErrorMessage(defaultErrorMessage, false);
23857
+ const defaultErrorMessage = `${translateService.translate('sdk.general.error.eventNameInvalid.title')} : ${translateService.translate('sdk.general.error.eventNameInvalid.content')}`;
23858
+ yield util.asyncOnLineShowErrorMessage(defaultErrorMessage, translateService.translate('sdk.general.error.retry'), false);
23828
23859
  }
23829
23860
  yield util.waitTime(SHOW_ERROR_MESSAGE_INTERVAL);
23830
23861
  throw throwError;
@@ -23836,19 +23867,19 @@ function startLiveness(config) {
23836
23867
  sendStatusDescription$2(fasRecognitionResultMapping(result.eStatus));
23837
23868
  switch (result.eStatus) {
23838
23869
  case liveness.FasRecognitionResult.NoFace:
23839
- statusText.textContent = translateService.translate('liveness.error.noFace');
23870
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noFace');
23840
23871
  setBorderStatus('error');
23841
23872
  break;
23842
23873
  case liveness.FasRecognitionResult.FaceNotAtCenter:
23843
- statusText.textContent = translateService.translate('liveness.error.faceNotAtCenter');
23874
+ statusText.textContent = translateService.translate('sdk.general.verify.error.faceNotAtCenter');
23844
23875
  setBorderStatus('error');
23845
23876
  break;
23846
23877
  case liveness.FasRecognitionResult.FaceTooSmall:
23847
- statusText.textContent = translateService.translate('liveness.error.faceTooSmall');
23878
+ statusText.textContent = translateService.translate('sdk.general.verify.error.getCloser');
23848
23879
  setBorderStatus('error');
23849
23880
  break;
23850
23881
  case liveness.FasRecognitionResult.FaceTooLarge:
23851
- statusText.textContent = translateService.translate('liveness.error.faceTooLarge');
23882
+ statusText.textContent = translateService.translate('sdk.general.verify.error.faceTooLarge');
23852
23883
  if (result.eStage === liveness.EAuthMeFASServiceStage.Scale) {
23853
23884
  setBorderStatus(null);
23854
23885
  setFrameScaleSmall();
@@ -23857,31 +23888,31 @@ function startLiveness(config) {
23857
23888
  }
23858
23889
  break;
23859
23890
  case liveness.FasRecognitionResult.NeedFaceToCamera:
23860
- statusText.textContent = translateService.translate('liveness.error.needFaceToCamera');
23891
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needFaceToCamera');
23861
23892
  setBorderStatus('error');
23862
23893
  break;
23863
23894
  case liveness.FasRecognitionResult.FaceMasked:
23864
- statusText.textContent = translateService.translate('liveness.error.faceMasked');
23895
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noShelter');
23865
23896
  setBorderStatus('error');
23866
23897
  break;
23867
23898
  case liveness.FasRecognitionResult.NeedOpenMouth:
23868
- statusText.textContent = translateService.translate('liveness.error.needOpenMouth');
23899
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needOpenMouth');
23869
23900
  setBorderStatus(null);
23870
23901
  break;
23871
23902
  case liveness.FasRecognitionResult.NeedCloseMouth:
23872
- statusText.textContent = translateService.translate('liveness.error.needCloseMouth');
23903
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needCloseMouth');
23873
23904
  setBorderStatus(null);
23874
23905
  break;
23875
23906
  case liveness.FasRecognitionResult.NeedSmile:
23876
- statusText.textContent = translateService.translate('liveness.error.needSmile');
23907
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needSmile');
23877
23908
  setBorderStatus(null);
23878
23909
  break;
23879
23910
  case liveness.FasRecognitionResult.NeedOpenEyes:
23880
- statusText.textContent = translateService.translate('liveness.error.needOpenEyes');
23911
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needOpenEyes');
23881
23912
  setBorderStatus('error');
23882
23913
  break;
23883
23914
  case liveness.FasRecognitionResult.NeedMoreFrame:
23884
- statusText.textContent = translateService.translate('liveness.needMoreFrame');
23915
+ statusText.textContent = translateService.translate('sdk.general.verify.success');
23885
23916
  setBorderStatus('pass');
23886
23917
  break;
23887
23918
  case liveness.FasRecognitionResult.Pass:
@@ -23893,13 +23924,13 @@ function startLiveness(config) {
23893
23924
  }
23894
23925
  break;
23895
23926
  case liveness.FasRecognitionResult.Error:
23896
- statusText.textContent = translateService.translate('verify.error.serverError');
23897
- util.showErrorMessage(translateService.translate('verify.error.serverError'), true);
23927
+ statusText.textContent = translateService.translate('sdk.general.error.alert.serverError');
23928
+ util.showErrorMessage(translateService.translate('sdk.general.error.alert.serverError'), true);
23898
23929
  break;
23899
23930
  }
23900
23931
  };
23901
23932
  // Register Event
23902
- rxjs.fromEvent(window, 'offline').pipe(rxjs.switchMap(() => util.asyncOnLineShowErrorMessage(translateService.translate('network.error.offline'), true)), rxjs.takeUntil(unsubscribe$)).subscribe();
23933
+ rxjs.fromEvent(window, 'offline').pipe(rxjs.switchMap(() => util.asyncOnLineShowErrorMessage(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'), true)), rxjs.takeUntil(unsubscribe$)).subscribe();
23903
23934
  rxjs.fromEvent(window, 'resize').pipe(rxjs.throttleTime(100), rxjs.switchMap(() => util.getCanvasSize(video)), rxjs.tap(canvasSizeInfo => {
23904
23935
  config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight);
23905
23936
  const maskHeight = window.outerHeight * 0.48;
@@ -23917,8 +23948,8 @@ function startLiveness(config) {
23917
23948
  showCloseButton: config.livenessConfig.showCloseButton
23918
23949
  }));
23919
23950
  const step2 = rxjs.of({}).pipe(rxjs.tap(() => {
23920
- util.startSpinner(translateService.translate('general.loading'), true);
23921
- headerTitle.textContent = translateService.translate('liveness.header.liveness');
23951
+ util.startSpinner(translateService.translate('sdk.general.loading'), true);
23952
+ headerTitle.textContent = translateService.translate('sdk.liveness.detection.header');
23922
23953
  if (config.livenessConfig.subtitle) {
23923
23954
  headerSubtitle.textContent = translateService.translate(config.livenessConfig.subtitle);
23924
23955
  }
@@ -23996,7 +24027,7 @@ function startLiveness(config) {
23996
24027
  // : of(resp).pipe(
23997
24028
  // tap(() =>
23998
24029
  // showErrorMessage(
23999
- // translateService.translate('verify.error.timeout')
24030
+ // translateService.translate('sdk.general.error.timeout.content')
24000
24031
  // )
24001
24032
  // ),
24002
24033
  // switchMap(() => waitTime(2000)),
@@ -24004,9 +24035,9 @@ function startLiveness(config) {
24004
24035
  // map(() => resp)
24005
24036
  // )
24006
24037
  // ),
24007
- rxjs.switchMap(resp => window.navigator.onLine ? rxjs.of(resp) : rxjs.from(util.asyncOnLineShowErrorMessage(translateService.translate('network.error.offline'), true)).pipe(rxjs.map(() => resp))), rxjs.tap(() => {
24038
+ rxjs.switchMap(resp => window.navigator.onLine ? rxjs.of(resp) : rxjs.from(util.asyncOnLineShowErrorMessage(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'), true)).pipe(rxjs.map(() => resp))), rxjs.tap(() => {
24008
24039
  sendStatusDescription$2(core.StatusDescription.UploadingStart);
24009
- util.startSpinner(translateService.translate('liveness.uploading'), true);
24040
+ util.startSpinner(translateService.translate('sdk.general.uploading'), true);
24010
24041
  }), rxjs.switchMap(() => rxjs.defer(() => config.onSuccess())))));
24011
24042
  return rxjs.of({}).pipe(() => {
24012
24043
  var _a;
@@ -24186,24 +24217,51 @@ var OcrRotateAnimationName;
24186
24217
  OcrRotateAnimationName["Bottom"] = "slideinBottom";
24187
24218
  OcrRotateAnimationName["BottomToDefault"] = "slideinBottomToDefault";
24188
24219
  })(OcrRotateAnimationName || (OcrRotateAnimationName = {}));
24189
- const initAnimation = params => {
24220
+ var OcrFrame;
24221
+ (function (OcrFrame) {
24222
+ OcrFrame["borderType"] = "cornered";
24223
+ OcrFrame["borderColor"] = "#FFF";
24224
+ OcrFrame[OcrFrame["borderOpacity"] = 1] = "borderOpacity";
24225
+ OcrFrame["lineColor"] = "#00C1B6";
24226
+ OcrFrame["lineGradient"] = "#7CFFF9";
24227
+ OcrFrame[OcrFrame["lineGradientOpacity"] = 0.5] = "lineGradientOpacity";
24228
+ OcrFrame["successColor"] = "#7CFFF9";
24229
+ OcrFrame[OcrFrame["successOpacity"] = 1] = "successOpacity";
24230
+ OcrFrame["textColor"] = "#FFF";
24231
+ OcrFrame[OcrFrame["textOpacity"] = 0.7] = "textOpacity";
24232
+ OcrFrame["imageColor"] = "#FFF";
24233
+ OcrFrame[OcrFrame["imageOpacity"] = 0.4] = "imageOpacity";
24234
+ })(OcrFrame || (OcrFrame = {}));
24235
+ const initScanAnimation = params => {
24236
+ var _a, _b, _c;
24237
+ lottie__default["default"].destroy('scan');
24190
24238
  lottie__default["default"].loadAnimation({
24191
24239
  container: params.scanAnimationContainer,
24192
24240
  renderer: 'svg',
24193
24241
  loop: true,
24194
24242
  autoplay: true,
24195
24243
  name: 'scan',
24196
- animationData: scan()
24244
+ animationData: scan({
24245
+ color: (_a = params.scanColor) !== null && _a !== void 0 ? _a : OcrFrame.lineColor,
24246
+ gradient: (_b = params.scanGradient) !== null && _b !== void 0 ? _b : OcrFrame.lineGradient,
24247
+ opacity: (_c = params.scanOpacity) !== null && _c !== void 0 ? _c : OcrFrame.lineGradientOpacity
24248
+ })
24197
24249
  });
24250
+ lottie__default["default"].stop('scan');
24251
+ };
24252
+ const initSuccessAnimation = params => {
24253
+ lottie__default["default"].destroy('success');
24198
24254
  lottie__default["default"].loadAnimation({
24199
- container: params.successAnimationContainer,
24255
+ container: params.animationContainer,
24200
24256
  renderer: 'svg',
24201
24257
  loop: false,
24202
24258
  autoplay: true,
24203
24259
  name: 'success',
24204
- animationData: success()
24260
+ animationData: success({
24261
+ color: '#7CFFF9',
24262
+ opacity: 1
24263
+ })
24205
24264
  });
24206
- lottie__default["default"].stop('scan');
24207
24265
  lottie__default["default"].stop('success');
24208
24266
  };
24209
24267
  const renderCameraSwitch = config => {
@@ -24251,14 +24309,17 @@ const renderOCRUI = config => {
24251
24309
  //Statement
24252
24310
  const statementContainer = document.createElement('div');
24253
24311
  statementContainer.classList.add('statement');
24254
- statementContainer.textContent = translateService.translate('verify.menu.footer.content');
24312
+ statementContainer.textContent = translateService.translate('sdk.general.footer');
24255
24313
  // Animation
24256
24314
  const scanAnimationContainer = document.createElement('div');
24257
24315
  scanAnimationContainer.classList.add('scan');
24258
24316
  const successAnimationContainer = document.createElement('div');
24259
- successAnimationContainer.classList.add('success');
24317
+ successAnimationContainer.classList.add('success_container');
24318
+ const successAnimationDom = document.createElement('div');
24319
+ successAnimationDom.classList.add('success');
24260
24320
  const arrowAnimationContainer = document.createElement('div');
24261
- arrowAnimationContainer.classList.add('arrow');
24321
+ arrowAnimationContainer.classList.add('arrow_container');
24322
+ successAnimationContainer.appendChild(successAnimationDom);
24262
24323
  config.videoContainer.appendChild(titleTextPanel);
24263
24324
  if (config.showStatement) {
24264
24325
  config.videoContainer.appendChild(statementContainer);
@@ -24274,14 +24335,14 @@ const renderOCRUI = config => {
24274
24335
  antiFraudInstructionContainer.classList.add('anti-fraud-instruction-container');
24275
24336
  const instructionText = document.createElement('div');
24276
24337
  instructionText.classList.add('anti-fraud-instruction-container__text');
24277
- instructionText.textContent = translateService.translate('verify.fraudDescribe');
24338
+ instructionText.textContent = translateService.translate('sdk.guard.verify.guide.fraudDescribe');
24278
24339
  const antiFraudInstructionAnimationContainer = document.createElement('div');
24279
24340
  antiFraudInstructionAnimationContainer.classList.add('anti-fraud-instruction-animation-container');
24280
24341
  const btnContainer = document.createElement('div');
24281
24342
  btnContainer.classList.add('btn-container');
24282
24343
  const confirmBtn = document.createElement('button');
24283
24344
  confirmBtn.classList.add('confirm-btn');
24284
- confirmBtn.textContent = translateService.translate('verify.startVerifyBtn.loading');
24345
+ confirmBtn.textContent = translateService.translate('sdk.general.preparing');
24285
24346
  confirmBtn.disabled = true;
24286
24347
  btnContainer.appendChild(confirmBtn);
24287
24348
  antiFraudInstructionContainer.appendChild(instructionText);
@@ -24294,7 +24355,7 @@ const renderOCRUI = config => {
24294
24355
  confirmImageContainer.classList.add('confirm-image-container');
24295
24356
  const imageTypeText = document.createElement('div');
24296
24357
  imageTypeText.classList.add('image-type-text');
24297
- imageTypeText.textContent = translateService.translate('verify.frontSide');
24358
+ imageTypeText.textContent = translateService.translate('sdk.general.frontSide');
24298
24359
  const imageLine = document.createElement('div');
24299
24360
  imageLine.classList.add('image-line');
24300
24361
  const imageLineLineDesktop = document.createElement('div');
@@ -24307,10 +24368,10 @@ const renderOCRUI = config => {
24307
24368
  imageFooter.classList.add('image-footer');
24308
24369
  const retryBtn = document.createElement('button');
24309
24370
  retryBtn.classList.add('btn-retry');
24310
- retryBtn.textContent = translateService.translate('verify.retryBtn');
24371
+ retryBtn.textContent = translateService.translate('sdk.ocr.verify.retry');
24311
24372
  const completeBtn = document.createElement('button');
24312
24373
  completeBtn.classList.add('btn-complete');
24313
- completeBtn.textContent = translateService.translate('verify.clearBtn');
24374
+ completeBtn.textContent = translateService.translate('sdk.ocr.verify.clear');
24314
24375
  imageFooter.appendChild(completeBtn);
24315
24376
  imageFooter.appendChild(retryBtn);
24316
24377
  confirmImageContainer.appendChild(imageTypeText);
@@ -24319,10 +24380,6 @@ const renderOCRUI = config => {
24319
24380
  confirmImageContainer.appendChild(imageLineLineDesktop);
24320
24381
  confirmImageContainer.appendChild(imageFooter);
24321
24382
  config.container.appendChild(confirmImageContainer);
24322
- initAnimation({
24323
- scanAnimationContainer,
24324
- successAnimationContainer
24325
- });
24326
24383
  return {
24327
24384
  antiFraudInstructionContainer,
24328
24385
  titleTextPanel,
@@ -24333,6 +24390,7 @@ const renderOCRUI = config => {
24333
24390
  lottieMask,
24334
24391
  arrowAnimationContainer,
24335
24392
  successAnimationContainer,
24393
+ successAnimationDom,
24336
24394
  scanAnimationContainer,
24337
24395
  antiFraudInstructionAnimationContainer,
24338
24396
  confirmImageContainer,
@@ -24373,19 +24431,23 @@ function renderConfirmUI({
24373
24431
  const keyMapping = {
24374
24432
  [idRecognition.IdRecognitionCardType.IDCard]: 'idCard',
24375
24433
  [idRecognition.IdRecognitionCardType.DriverLicense]: 'driverLicense',
24376
- [idRecognition.IdRecognitionCardType.HealthCard]: 'healthCard',
24434
+ [idRecognition.IdRecognitionCardType.HealthCard]: 'HealthCard',
24377
24435
  [idRecognition.IdRecognitionCardType.ResidentCard]: 'residentCard',
24378
24436
  [idRecognition.IdRecognitionCardType.Passport]: 'passport'
24379
24437
  };
24380
24438
  elem.classList.add('data-type');
24381
- elem.textContent = translate(cardType ? `confirm.${keyMapping[cardType]}` : '');
24439
+ elem.textContent = translate(cardType ? `sdk.ocr.verify.result.title.${keyMapping[cardType]}` : '');
24382
24440
  }), _render('div', elem => {
24383
24441
  elem.classList.add('data');
24384
24442
  }, items.columns.map(column => _render('div', elem => {
24385
24443
  elem.classList.add('data-column');
24386
24444
  }, [_render('div', elem => {
24387
24445
  elem.classList.add('title');
24388
- elem.textContent = translate('confirm.' + column);
24446
+ if (column === 'issueReason') {
24447
+ elem.textContent = translate('sdk.ocr.verify.result.issueType');
24448
+ } else {
24449
+ elem.textContent = translate('sdk.ocr.verify.result.' + column);
24450
+ }
24389
24451
  }), column === 'address' ? _render('textarea', elem => {
24390
24452
  var _a;
24391
24453
  elem.name = column;
@@ -24393,7 +24455,7 @@ function renderConfirmUI({
24393
24455
  elem.classList.add('content');
24394
24456
  elem.classList.add('textarea');
24395
24457
  elem.textContent = (_a = items.details[column]) !== null && _a !== void 0 ? _a : '';
24396
- elem.placeholder = translate('home.input.placeHolder');
24458
+ elem.placeholder = translate('sdk.ocr.verify.result.placeHolder');
24397
24459
  }) : _render('input', elem => {
24398
24460
  var _a;
24399
24461
  elem.value;
@@ -24401,7 +24463,7 @@ function renderConfirmUI({
24401
24463
  elem.type = 'text';
24402
24464
  elem.classList.add('content');
24403
24465
  elem.value = (_a = items.details[column]) !== null && _a !== void 0 ? _a : '';
24404
- elem.placeholder = translate('home.input.placeHolder');
24466
+ elem.placeholder = translate('sdk.ocr.verify.result.placeHolder');
24405
24467
  })]))), _render('div', elem => {
24406
24468
  elem.classList.add('d-flex');
24407
24469
  elem.classList.add('justify-content-center');
@@ -24411,7 +24473,7 @@ function renderConfirmUI({
24411
24473
  elem.classList.add('btn-success');
24412
24474
  elem.classList.add('text-light');
24413
24475
  elem.classList.add('confirm-btn');
24414
- elem.textContent = translate('confirm.confirmBtn');
24476
+ elem.textContent = translate('sdk.general.accept');
24415
24477
  })])])]);
24416
24478
  document.body.appendChild(confirmContainerElem);
24417
24479
  return new Promise((resolve, reject) => {
@@ -24475,15 +24537,23 @@ function mirrorPoints(points) {
24475
24537
  }));
24476
24538
  }
24477
24539
  const renderOCRMask = params => {
24540
+ let newCardPoints;
24541
+ let borderColor = '';
24542
+ let borderOpacity = OcrFrame.borderOpacity;
24543
+ let borderColorSuccess = '';
24544
+ let borderOpacitySuccess = OcrFrame.successOpacity;
24478
24545
  const {
24479
24546
  cardPoints,
24480
- container,
24481
- cardFrameColor
24547
+ container
24482
24548
  } = params;
24483
24549
  const _cardPoints = params.mirrored ? mirrorPoints(cardPoints) : cardPoints;
24550
+ const windowWidth = container.offsetWidth;
24551
+ const windowHeight = container.offsetHeight;
24552
+ const radius = 10;
24553
+ let borderType = OcrFrame.borderType;
24484
24554
  // 創建SVG元素
24485
24555
  const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
24486
- svg.setAttribute('id', 'authme-mask-svg');
24556
+ svg.setAttribute('id', 'authme_frame_border');
24487
24557
  svg.setAttribute('width', '100%');
24488
24558
  svg.setAttribute('height', '100%');
24489
24559
  svg.style.position = 'absolute';
@@ -24505,10 +24575,78 @@ const renderOCRMask = params => {
24505
24575
  mask.appendChild(path);
24506
24576
  defs.appendChild(mask);
24507
24577
  svg.appendChild(defs);
24578
+ const rectOfFrame = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
24579
+ rectOfFrame.setAttribute('rx', '10');
24580
+ rectOfFrame.setAttribute('ry', '10');
24581
+ rectOfFrame.setAttribute('stroke', OcrFrame.borderColor);
24582
+ rectOfFrame.setAttribute('stroke-width', '3');
24583
+ rectOfFrame.setAttribute('fill', 'none');
24508
24584
  const pathOfFrame = document.createElementNS('http://www.w3.org/2000/svg', 'path');
24509
24585
  pathOfFrame.setAttribute('fill', 'none');
24510
- pathOfFrame.setAttribute('stroke', cardFrameColor !== null && cardFrameColor !== void 0 ? cardFrameColor : '#fff');
24586
+ pathOfFrame.setAttribute('stroke', OcrFrame.borderColor);
24511
24587
  pathOfFrame.setAttribute('stroke-width', '3');
24588
+ const setBorderType = params => {
24589
+ var _a;
24590
+ const _mirrored = (_a = params.mirrored) !== null && _a !== void 0 ? _a : false;
24591
+ borderType = params.type;
24592
+ if (params.color) {
24593
+ borderColor = params.color;
24594
+ }
24595
+ if (params.strokeOpacity !== undefined) {
24596
+ borderOpacity = params.strokeOpacity;
24597
+ }
24598
+ if (params.type === 'bordered') {
24599
+ const rectX = newCardPoints[0].x * windowWidth;
24600
+ const rectY = newCardPoints[0].y * windowHeight;
24601
+ const rectWidth = newCardPoints[1].x * windowWidth - rectX;
24602
+ const rectHeight = newCardPoints[3].y * windowHeight - rectY;
24603
+ pathOfFrame.setAttribute('visibility', 'hidden');
24604
+ rectOfFrame.setAttribute('visibility', 'visible');
24605
+ rectOfFrame.setAttribute('x', rectX.toString());
24606
+ rectOfFrame.setAttribute('y', rectY.toString());
24607
+ rectOfFrame.setAttribute('width', rectWidth.toString());
24608
+ rectOfFrame.setAttribute('height', rectHeight.toString());
24609
+ rectOfFrame.setAttribute('stroke-opacity', borderOpacity.toString());
24610
+ svg.appendChild(rectOfFrame);
24611
+ } else {
24612
+ rectOfFrame.setAttribute('visibility', 'hidden');
24613
+ pathOfFrame.setAttribute('visibility', 'visible');
24614
+ // 掃描框的樣式,四個圓角
24615
+ const dFrame = newCardPoints.reduce((acc, {
24616
+ x,
24617
+ y
24618
+ }, index) => {
24619
+ var _a, _b;
24620
+ const lineRotio = 2;
24621
+ const previosPoint = (_a = newCardPoints[index - 1]) !== null && _a !== void 0 ? _a : newCardPoints[newCardPoints.length - 1];
24622
+ const nextPoint = (_b = newCardPoints[index + 1]) !== null && _b !== void 0 ? _b : newCardPoints[0];
24623
+ const _x1 = windowWidth * previosPoint.x;
24624
+ const _y1 = windowHeight * previosPoint.y;
24625
+ const _x2 = windowWidth * x;
24626
+ const _y2 = windowHeight * y;
24627
+ const _x3 = windowWidth * nextPoint.x;
24628
+ const _y3 = windowHeight * nextPoint.y;
24629
+ const v = new Vector({
24630
+ x: _x1,
24631
+ y: _y1
24632
+ }, {
24633
+ x: _x2,
24634
+ y: _y2
24635
+ });
24636
+ const vNext = new Vector({
24637
+ x: _x2,
24638
+ y: _y2
24639
+ }, {
24640
+ x: _x3,
24641
+ y: _y3
24642
+ });
24643
+ return `${acc} M ${_x2 - lineRotio * radius * v.unitVector.x},${_y2 - lineRotio * radius * v.unitVector.y} L ${_x2 - radius * v.unitVector.x}, ${_y2 - radius * v.unitVector.y} A 10, 10 0 0, ${_mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y} L ${_x2 + lineRotio * radius * vNext.unitVector.x},${_y2 + lineRotio * radius * vNext.unitVector.y} `;
24644
+ }, '');
24645
+ pathOfFrame.setAttribute('d', dFrame);
24646
+ pathOfFrame.setAttribute('stroke-opacity', borderOpacity.toString());
24647
+ svg.appendChild(pathOfFrame);
24648
+ }
24649
+ };
24512
24650
  // 創建帶有遮罩的長方形
24513
24651
  const maskedRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
24514
24652
  maskedRect.setAttribute('width', '100%');
@@ -24516,12 +24654,10 @@ const renderOCRMask = params => {
24516
24654
  maskedRect.setAttribute('fill', 'rgba(0, 0, 0, 0.65)');
24517
24655
  maskedRect.setAttribute('mask', 'url(#hole)');
24518
24656
  svg.appendChild(maskedRect);
24519
- svg.appendChild(pathOfFrame);
24520
24657
  // 添加SVG到容器
24521
24658
  container.appendChild(svg);
24522
- const radius = 10;
24523
- const setCardPoints = (_newCardPoints, mirrored = false) => {
24524
- const newCardPoints = mirrored ? mirrorPoints(_newCardPoints) : _newCardPoints;
24659
+ const setCardPoints = (_newCardPoints, antiFraud = false, _mirrored = false) => {
24660
+ newCardPoints = _mirrored ? mirrorPoints(_newCardPoints) : _newCardPoints;
24525
24661
  const d = newCardPoints.reduce((acc, {
24526
24662
  x,
24527
24663
  y
@@ -24552,9 +24688,9 @@ const renderOCRMask = params => {
24552
24688
  x: _x3,
24553
24689
  y: _y3
24554
24690
  });
24555
- return `${acc} ${command} ${_x2 - radius * v.unitVector.x},${_y2 - radius * v.unitVector.y} A 10,10 0 0, ${mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y}`;
24691
+ return `${acc} ${command} ${_x2 - radius * v.unitVector.x},${_y2 - radius * v.unitVector.y} A 10,10 0 0, ${_mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y}`;
24556
24692
  }, '') + ' Z'; // 結尾加上'Z'來關閉路徑
24557
- const dFrame = newCardPoints.reduce((acc, {
24693
+ newCardPoints.reduce((acc, {
24558
24694
  x,
24559
24695
  y
24560
24696
  }, index) => {
@@ -24584,31 +24720,126 @@ const renderOCRMask = params => {
24584
24720
  x: _x3,
24585
24721
  y: _y3
24586
24722
  });
24587
- return `${acc} M ${_x2 - lineRotio * radius * v.unitVector.x},${_y2 - lineRotio * radius * v.unitVector.y} L ${_x2 - radius * v.unitVector.x}, ${_y2 - radius * v.unitVector.y} A 10, 10 0 0, ${mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y} L ${_x2 + lineRotio * radius * vNext.unitVector.x},${_y2 + lineRotio * radius * vNext.unitVector.y} `;
24723
+ return `${acc} M ${_x2 - lineRotio * radius * v.unitVector.x},${_y2 - lineRotio * radius * v.unitVector.y} L ${_x2 - radius * v.unitVector.x}, ${_y2 - radius * v.unitVector.y} A 10, 10 0 0, ${_mirrored ? '0' : '1'} ${_x2 + radius * vNext.unitVector.x},${_y2 + radius * vNext.unitVector.y} L ${_x2 + lineRotio * radius * vNext.unitVector.x},${_y2 + lineRotio * radius * vNext.unitVector.y} `;
24588
24724
  }, '');
24589
24725
  path.setAttribute('d', d);
24590
- pathOfFrame.setAttribute('d', dFrame);
24726
+ if (antiFraud) {
24727
+ setBorderType({
24728
+ type: borderType,
24729
+ mirrored: _mirrored
24730
+ });
24731
+ }
24591
24732
  };
24592
- const setCardBorderColor = status => {
24593
- let color = '#fff';
24733
+ function setBorderSuccess(color, opacity) {
24734
+ borderColorSuccess = color;
24735
+ borderOpacitySuccess = opacity;
24736
+ }
24737
+ function setCardBorderColor(status) {
24738
+ let color = borderColor;
24739
+ let opacity = borderOpacity;
24594
24740
  switch (status) {
24595
24741
  case 'error':
24596
- color = 'var(--authme-scanner-error-color)';
24742
+ color = borderColor || 'var(--authme-scanner-error-color)';
24743
+ opacity = borderOpacity;
24597
24744
  break;
24598
24745
  case 'pass':
24599
- color = 'var(--authme-scanning_color)';
24600
- break;
24601
- default:
24602
- color = '#fff';
24746
+ color = borderColorSuccess || 'var(--authme-scanning_color)';
24747
+ opacity = borderOpacitySuccess;
24603
24748
  break;
24604
24749
  }
24605
- pathOfFrame.setAttribute('stroke', color);
24606
- };
24750
+ if (borderType === 'bordered') {
24751
+ rectOfFrame.setAttribute('stroke', color);
24752
+ rectOfFrame.setAttribute('stroke-opacity', opacity.toString());
24753
+ } else {
24754
+ pathOfFrame.setAttribute('stroke', color);
24755
+ pathOfFrame.setAttribute('stroke-opacity', opacity.toString());
24756
+ }
24757
+ }
24758
+ function frameImage(faceMode, zIndex, base64, color, opacity) {
24759
+ color = color !== null && color !== void 0 ? color : OcrFrame.imageColor;
24760
+ opacity = opacity !== null && opacity !== void 0 ? opacity : OcrFrame.imageOpacity;
24761
+ const rectX = newCardPoints[0].x * windowWidth;
24762
+ const rectY = newCardPoints[0].y * windowHeight;
24763
+ const rectWidth = newCardPoints[1].x * windowWidth - rectX;
24764
+ const rectHeight = newCardPoints[3].y * windowHeight - rectY;
24765
+ let domContainer = document.querySelector('#authme_frame_image');
24766
+ let domImage = document.querySelector('#authme_frame_image_svg');
24767
+ const domImageStyle = `
24768
+ width: 100%;
24769
+ height: 100%;
24770
+ background-color: ${color};
24771
+ opacity: ${opacity};
24772
+ -webkit-mask-image: url(data:image/svg+xml;base64,${base64});
24773
+ mask-image: url(data:image/svg+xml;base64,${base64});
24774
+ -webkit-mask-size: contain;
24775
+ mask-size: contain;
24776
+ mask-repeat: no-repeat no-repeat;
24777
+ mask-position: center center;
24778
+ `;
24779
+ if (!domContainer) {
24780
+ domContainer = document.createElement('div');
24781
+ domContainer.setAttribute('id', 'authme_frame_image');
24782
+ container.appendChild(domContainer);
24783
+ }
24784
+ if (!domImage) {
24785
+ domImage = document.createElement('div');
24786
+ domImage.setAttribute('id', 'authme_frame_image_svg');
24787
+ domContainer.appendChild(domImage);
24788
+ }
24789
+ if (faceMode === 'front') {
24790
+ domImage.classList.add('front');
24791
+ }
24792
+ domImage.setAttribute('style', domImageStyle);
24793
+ domImage.setAttribute('preserveAspectRatio', 'none');
24794
+ domContainer.setAttribute('style', `
24795
+ z-index: ${zIndex};
24796
+ position: absolute;
24797
+ left: ${rectX}px;
24798
+ top: ${rectY}px;
24799
+ width: ${rectWidth}px;
24800
+ height: ${rectHeight}px;
24801
+ opacity: ${opacity};
24802
+ `);
24803
+ }
24804
+ function frameText(zIndex, text, color, opacity) {
24805
+ color = color !== null && color !== void 0 ? color : OcrFrame.textColor;
24806
+ opacity = opacity !== null && opacity !== void 0 ? opacity : OcrFrame.textOpacity;
24807
+ const rectX = newCardPoints[0].x * windowWidth;
24808
+ const rectY = newCardPoints[0].y * windowHeight;
24809
+ const rectWidth = newCardPoints[1].x * windowWidth - rectX;
24810
+ const rectHeight = newCardPoints[3].y * windowHeight - rectY;
24811
+ let dom = document.querySelector('#authme_frame_text');
24812
+ if (!dom) {
24813
+ dom = document.createElement('div');
24814
+ dom.setAttribute('id', 'authme_frame_text');
24815
+ container.appendChild(dom);
24816
+ }
24817
+ dom.setAttribute('style', `
24818
+ z-index: ${zIndex};
24819
+ position: absolute;
24820
+ left: ${rectX}px;
24821
+ top: ${rectY}px;
24822
+ width: ${rectWidth}px;
24823
+ height: ${rectHeight}px;
24824
+ opacity: ${opacity};
24825
+ color: ${color};
24826
+ display: flex;
24827
+ align-items: center;
24828
+ justify-content: center;
24829
+ font-size: 60px;
24830
+ font-weight: 500;
24831
+ `);
24832
+ dom.textContent = text;
24833
+ }
24607
24834
  // 初始化位置
24608
24835
  setCardPoints(_cardPoints);
24609
24836
  return {
24610
24837
  setCardPoints,
24611
- setCardBorderColor
24838
+ setCardBorderColor,
24839
+ setBorderType,
24840
+ frameImage,
24841
+ frameText,
24842
+ setBorderSuccess
24612
24843
  };
24613
24844
  };
24614
24845
 
@@ -24620,7 +24851,8 @@ const cardSvgStyle = `.d{fill:#f7f7f7;}.e{fill:#f2f2f2;}.f{fill:#ed5454;}.g{fill
24620
24851
  function makeSvgTag(viewBox, styleSetting = '') {
24621
24852
  const newSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
24622
24853
  const style = makeStyleTag(styleSetting);
24623
- newSvg.style['position'] = 'absolute';
24854
+ newSvg.style['position'] = 'relative';
24855
+ newSvg.style['width'] = '100%';
24624
24856
  newSvg.setAttribute('version', '1.1');
24625
24857
  newSvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
24626
24858
  newSvg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
@@ -24664,16 +24896,19 @@ function renderCardRotateAnimate(container) {
24664
24896
  const {
24665
24897
  cardMainGroup
24666
24898
  } = createSvgCard();
24667
- container.style.transition = `opacity ${fadeDuration}ms`;
24668
- container.style.opacity = '0';
24899
+ const div = document.createElement('div');
24900
+ div.setAttribute('class', 'arrow');
24901
+ div.style.transition = `opacity ${fadeDuration}ms`;
24902
+ div.style.opacity = '0';
24669
24903
  cardSvg.style.transition = `transform ${aimateDuration}ms `;
24670
24904
  cardSvg.style.zIndex = `var(--authme-layers-1-z-index)`;
24671
24905
  frontArrowSvg.style.zIndex = `var(--authme-layers-2-z-index)`;
24672
24906
  cardSvg.appendChild(cardMainGroup);
24673
- container.appendChild(cardSvg);
24907
+ div.appendChild(cardSvg);
24674
24908
  cardSvg.style.display = 'none';
24675
24909
  frontArrowSvg.style.display = 'none';
24676
24910
  backArrowSvg.style.display = 'none';
24911
+ container.appendChild(div);
24677
24912
  return {
24678
24913
  stopAnimate: () => {
24679
24914
  if (rotateTimeout.length > 0) {
@@ -25007,7 +25242,7 @@ function renderCardRotateAnimate(container) {
25007
25242
  });
25008
25243
  }
25009
25244
  function fadeAnimate(inOrOut) {
25010
- container.style.opacity = inOrOut === 'in' ? '0.8' : '0';
25245
+ div.style.opacity = inOrOut === 'in' ? '0.8' : '0';
25011
25246
  return new Promise(resolve => {
25012
25247
  setTimeout(() => {
25013
25248
  resolve(true);
@@ -25063,10 +25298,442 @@ function renderCardRotateAnimate(container) {
25063
25298
  cardSvg.style.display = 'none';
25064
25299
  frontArrowSvg.style.display = 'none';
25065
25300
  backArrowSvg.style.display = 'none';
25066
- // container.removeChild(svg);
25301
+ // div.removeChild(svg);
25067
25302
  }
25068
25303
  }
25069
25304
 
25305
+ const captureButton = () => {
25306
+ let dom = document.querySelector('#btn_capture');
25307
+ if (dom) {
25308
+ return dom;
25309
+ }
25310
+ const videoContainer = document.querySelector('.video-container');
25311
+ if (!videoContainer) {
25312
+ console.error('captureButton: videoContainer not found');
25313
+ return null;
25314
+ }
25315
+ dom = document.createElement('div');
25316
+ dom.id = 'btn_capture';
25317
+ const pictureInner = document.createElement('div');
25318
+ pictureInner.classList.add('inner');
25319
+ dom.appendChild(pictureInner);
25320
+ videoContainer.appendChild(dom);
25321
+ return dom;
25322
+ };
25323
+
25324
+ const modal = arg => {
25325
+ const authmeContainer = document.querySelector('.authme-container');
25326
+ if (!authmeContainer) {
25327
+ console.error('modal: authmeContainer not found');
25328
+ return;
25329
+ }
25330
+ function removeModal() {
25331
+ var _a;
25332
+ (_a = document.querySelector('.video-container__modal')) === null || _a === void 0 ? void 0 : _a.remove();
25333
+ }
25334
+ const domModal = document.createElement('div');
25335
+ const domHeaderContainer = document.createElement('div');
25336
+ const domHeader = document.createElement('div');
25337
+ const domContainer = document.createElement('div');
25338
+ const domTitle = document.createElement('div');
25339
+ const domSubtitle = document.createElement('div');
25340
+ const domImage = document.createElement('img');
25341
+ const domContent = document.createElement('div');
25342
+ const domFooter = document.createElement('div');
25343
+ const domClose = document.createElement('div');
25344
+ const domConfirm = document.createElement('div');
25345
+ const domCopyRight = document.createElement('div');
25346
+ domModal.classList.add('video-container__modal');
25347
+ domHeaderContainer.classList.add('video-container__modal-header-container');
25348
+ domHeader.classList.add('video-container__modal-header');
25349
+ domContainer.classList.add('video-container__modal-container');
25350
+ domTitle.classList.add('video-container__modal-title');
25351
+ domSubtitle.classList.add('video-container__modal-subtitle');
25352
+ domImage.classList.add('video-container__modal-image');
25353
+ domContent.classList.add('video-container__modal-content');
25354
+ domFooter.classList.add('video-container__modal-footer');
25355
+ domClose.classList.add('video-container__modal-close');
25356
+ domConfirm.classList.add('video-container__modal-confirm');
25357
+ domCopyRight.classList.add('video-container__modal-copy-right');
25358
+ domHeader.innerText = arg.header;
25359
+ domTitle.innerText = arg.title;
25360
+ domSubtitle.innerText = arg.subtitle;
25361
+ domImage.src = arg.image;
25362
+ domContent.innerHTML = arg.content;
25363
+ domClose.innerHTML = '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19.1943 6.41714C19.6393 5.97216 19.6393 5.2507 19.1943 4.80571C18.7493 4.36073 18.0278 4.36073 17.5829 4.80571L12 10.3886L6.41714 4.80572C5.97216 4.36073 5.2507 4.36073 4.80571 4.80571C4.36073 5.2507 4.36073 5.97216 4.80571 6.41714L10.3886 12L4.80571 17.5829C4.36073 18.0278 4.36073 18.7493 4.80571 19.1943C5.2507 19.6393 5.97216 19.6393 6.41714 19.1943L12 13.6114L17.5829 19.1943C18.0278 19.6393 18.7493 19.6393 19.1943 19.1943C19.6393 18.7493 19.6393 18.0278 19.1943 17.5829L13.6114 12L19.1943 6.41714Z" fill="#545454"/></svg>';
25364
+ domConfirm.innerText = arg.confirm;
25365
+ domClose.addEventListener('click', () => __awaiter(void 0, void 0, void 0, function* () {
25366
+ if (arg.onClose) {
25367
+ yield arg.onClose();
25368
+ }
25369
+ removeModal();
25370
+ }));
25371
+ domConfirm.addEventListener('click', () => __awaiter(void 0, void 0, void 0, function* () {
25372
+ if (arg.onConfirm) {
25373
+ yield arg.onConfirm();
25374
+ }
25375
+ removeModal();
25376
+ }));
25377
+ domHeaderContainer.appendChild(domHeader);
25378
+ domHeaderContainer.appendChild(domClose);
25379
+ domModal.appendChild(domHeaderContainer);
25380
+ domContainer.appendChild(domTitle);
25381
+ domContainer.appendChild(domSubtitle);
25382
+ domContainer.appendChild(domImage);
25383
+ domContainer.appendChild(domContent);
25384
+ domModal.appendChild(domContainer);
25385
+ domFooter.appendChild(domConfirm);
25386
+ domModal.appendChild(domFooter);
25387
+ if (arg.copyRight) {
25388
+ domCopyRight.innerText = arg.copyRight;
25389
+ domFooter.appendChild(domCopyRight);
25390
+ }
25391
+ authmeContainer.appendChild(domModal);
25392
+ };
25393
+
25394
+ const tiltFrame = isTilt => {
25395
+ var _a, _b, _c, _d;
25396
+ document.querySelector('.video-container');
25397
+ if (isTilt) {
25398
+ (_a = document.querySelector('#authme_frame_image')) === null || _a === void 0 ? void 0 : _a.classList.add('svg-tilt');
25399
+ (_b = document.querySelector('#authme_frame_image_svg')) === null || _b === void 0 ? void 0 : _b.classList.add('svg-tilt');
25400
+ } else {
25401
+ (_c = document.querySelector('#authme_frame_image')) === null || _c === void 0 ? void 0 : _c.classList.remove('svg-tilt');
25402
+ (_d = document.querySelector('#authme_frame_image_svg')) === null || _d === void 0 ? void 0 : _d.classList.remove('svg-tilt');
25403
+ }
25404
+ };
25405
+ const resetFrame = () => {
25406
+ const domContainer = document.querySelector('#authme_frame_image');
25407
+ const domImage = document.querySelector('#authme_frame_image_svg');
25408
+ if (domContainer) {
25409
+ domContainer.setAttribute('style', 'display: none');
25410
+ }
25411
+ if (domImage) {
25412
+ domImage.setAttribute('style', 'display: none');
25413
+ }
25414
+ };
25415
+ const countdownTimer = (time, doSomething) => {
25416
+ let end = false;
25417
+ const init = () => {
25418
+ const endTime = new Date().getTime() + time * 1000;
25419
+ const timer = setInterval(function () {
25420
+ const currentTime = new Date().getTime();
25421
+ const remainingTime = endTime - currentTime;
25422
+ if (remainingTime <= 0) {
25423
+ clearInterval(timer);
25424
+ end = true;
25425
+ if (doSomething) {
25426
+ doSomething();
25427
+ }
25428
+ }
25429
+ }, 300);
25430
+ };
25431
+ const getStatus = () => {
25432
+ return end;
25433
+ };
25434
+ return {
25435
+ init: init,
25436
+ end: getStatus
25437
+ };
25438
+ };
25439
+
25440
+ const translateService = core.getTranslateInstance();
25441
+ // TODO 處理參數
25442
+ const startThickness = (type, cardType, cardTypeConfig, setHintTextLocale, setCardPoints, setCardBorderColor, statusText, canvasSizeInfo$, showVideoElement, config, cardRotateByStage, getCardBorderPoint, setBorderType, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, facingMode, ocrEngineConfig, sdkFlowTimeout = undefined, makeSDKFlowTimeout, image, video, retryBtn, completeBtn, confirmImageContainer) => {
25443
+ const videoToCanvas = (sizeInfo, data) => {
25444
+ const ctx2 = image.getContext('2d');
25445
+ image.width = sizeInfo.canvasWidth;
25446
+ image.height = sizeInfo.canvasHeight;
25447
+ if (data) {
25448
+ const imgData = ctx2.createImageData(image.width, image.height);
25449
+ imgData.data.set(data);
25450
+ ctx2.putImageData(imgData, 0, 0);
25451
+ } else {
25452
+ ctx2.drawImage(video, sizeInfo.startX, sizeInfo.startY, sizeInfo.width, sizeInfo.height, 0, 0, sizeInfo.canvasWidth, sizeInfo.canvasHeight);
25453
+ }
25454
+ };
25455
+ const checkConfirmImageManual = (sizeInfo, data) => __awaiter(void 0, void 0, void 0, function* () {
25456
+ videoToCanvas(sizeInfo, data);
25457
+ showVideoElement(false);
25458
+ util.showElement(confirmImageContainer);
25459
+ const retryEvents = rxjs.fromEvent(retryBtn, 'click').pipe(rxjs.mapTo(true));
25460
+ const confirmEvents = rxjs.fromEvent(completeBtn, 'click').pipe(rxjs.mapTo(false));
25461
+ const allEvents$ = rxjs.merge(retryEvents, confirmEvents);
25462
+ return yield rxjs.firstValueFrom(allEvents$.pipe());
25463
+ });
25464
+ const generateImage = canvasSizeInfo => {
25465
+ return util.dataURItoBlob(image.toDataURL('image/jpeg', 0.85));
25466
+ // const ocrOriginImg = UintArrayToBlob(
25467
+ // canvasSizeInfo.width,
25468
+ // canvasSizeInfo.height,
25469
+ // data.data,
25470
+ // virtualCanvas
25471
+ // );
25472
+ //
25473
+ // return ocrOriginImg;
25474
+ };
25475
+
25476
+ const initThicknessFrame = () => __awaiter(void 0, void 0, void 0, function* () {
25477
+ const cardMatchROI = config.getCardMatchROI ? yield config.getCardMatchROI() : undefined;
25478
+ yield cardRotateByStage(idRecognition.EAuthMeIDCardAntiFraudStage.Down, false, cardMatchROI);
25479
+ });
25480
+ const applyTextByResult = result => {
25481
+ if (!setCardBorderColor) return;
25482
+ statusText.classList.add('non-empty');
25483
+ switch (result.eStatus) {
25484
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.PositionNotMatch:
25485
+ statusText.textContent = translateService.translate('sdk.general.verify.error.missmatch');
25486
+ sendStatusDescription$1(core.StatusDescription.PositionNotMatch);
25487
+ setCardBorderColor('error');
25488
+ break;
25489
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedMoreFrame:
25490
+ statusText.textContent = '';
25491
+ statusText.classList.remove('non-empty');
25492
+ sendStatusDescription$1(core.StatusDescription.NeedMoreFrame);
25493
+ setCardBorderColor('pass');
25494
+ break;
25495
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.Detect:
25496
+ statusText.textContent = '';
25497
+ statusText.classList.remove('non-empty');
25498
+ sendStatusDescription$1(core.StatusDescription.NeedMoreFrame);
25499
+ setCardBorderColor('pass');
25500
+ break;
25501
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.NoCard:
25502
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noCard');
25503
+ sendStatusDescription$1(core.StatusDescription.NoCard);
25504
+ setCardBorderColor('error');
25505
+ break;
25506
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.WrongCardType:
25507
+ statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
25508
+ sendStatusDescription$1(core.StatusDescription.WrongCardType);
25509
+ setCardBorderColor('error');
25510
+ break;
25511
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.CardThicknessFailed:
25512
+ statusText.textContent = translateService.translate('sdk.general.verify.error.CardThicknessFailed');
25513
+ sendStatusDescription$1(core.StatusDescription.CardThicknessFailed);
25514
+ setCardBorderColor('error');
25515
+ break;
25516
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.Reflective:
25517
+ statusText.textContent = translateService.translate('sdk.general.verify.error.reflective');
25518
+ sendStatusDescription$1(core.StatusDescription.Reflective);
25519
+ setCardBorderColor('error');
25520
+ break;
25521
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.Blur:
25522
+ statusText.textContent = translateService.translate('sdk.general.verify.error.blur');
25523
+ sendStatusDescription$1(core.StatusDescription.Blur);
25524
+ setCardBorderColor('error');
25525
+ break;
25526
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.Gray:
25527
+ statusText.classList.remove('non-empty');
25528
+ statusText.textContent = '';
25529
+ sendStatusDescription$1(core.StatusDescription.Gray);
25530
+ setCardBorderColor('error');
25531
+ break;
25532
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.Error:
25533
+ statusText.textContent = translateService.translate('sdk.general.error.alert.serverError');
25534
+ util.showErrorMessage(translateService.translate('sdk.general.error.alert.serverError'), true);
25535
+ sendStatusDescription$1(core.StatusDescription.Error);
25536
+ break;
25537
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationFrontal:
25538
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25539
+ break;
25540
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationLeft:
25541
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25542
+ break;
25543
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationRight:
25544
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25545
+ break;
25546
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationUp:
25547
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25548
+ break;
25549
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationDown:
25550
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25551
+ break;
25552
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.CardCutByCamera:
25553
+ statusText.textContent = translateService.translate('sdk.general.verify.error.cardCutByCamera');
25554
+ break;
25555
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.CardNotInROI:
25556
+ statusText.textContent = translateService.translate('verify.error.CardNotInROI');
25557
+ break;
25558
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.CardTooSmall:
25559
+ statusText.textContent = translateService.translate('sdk.general.verify.error.getCloser');
25560
+ break;
25561
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedHoldCard:
25562
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needHoldCard');
25563
+ break;
25564
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.StagePass:
25565
+ statusText.textContent = translateService.translate('sdk.general.verify.error.stagePass');
25566
+ setCardBorderColor('pass');
25567
+ break;
25568
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.Pass:
25569
+ setCardBorderColor('pass');
25570
+ statusText.textContent = translateService.translate('sdk.general.verify.error.pass');
25571
+ break;
25572
+ case idRecognition.EAuthMeIDCardAntiFraudStatus.Failed:
25573
+ setCardBorderColor('error');
25574
+ statusText.textContent = translateService.translate('sdk.general.verify.error.pass');
25575
+ break;
25576
+ default:
25577
+ emptyStatusText();
25578
+ break;
25579
+ }
25580
+ function emptyStatusText() {
25581
+ setCardBorderColor(null);
25582
+ statusText.textContent = '';
25583
+ statusText.classList.remove('non-empty');
25584
+ }
25585
+ };
25586
+ const init = retry => canvasSizeInfo$.pipe(rxjs.take(1), rxjs.switchMap(canvasSizeInfo => rxjs.from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(rxjs.switchMap(() => util.checkOnlineStatus(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'))), rxjs.tap(() => {
25587
+ if (!retry) {
25588
+ util.startSpinner(translateService.translate('sdk.general.loading'), true);
25589
+ }
25590
+ }), rxjs.switchMap(() => config.thicknessStart ? config.thicknessStart(getCardBorderPoint(), type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, facingMode, cardType, cardTypeConfig, retry) : rxjs.of(idRecognition.thicknessDefaultConfig)), rxjs.switchMap(result => {
25591
+ tiltFrame(true);
25592
+ if (result && result.thicknessWelcomeSetting && result.thicknessWelcomeSetting.welcome && !retry) {
25593
+ thicknessMode = cardTypeConfig.mode;
25594
+ return new rxjs.Observable(observer => {
25595
+ const pageInfo = result.thicknessWelcomeSetting;
25596
+ modal({
25597
+ header: translateService.translate('sdk.thickness.detection.guide.title'),
25598
+ title: pageInfo.title.enable ? pageInfo.title.text : translateService.translate(idRecognition.thicknessDefaultConfig.thicknessWelcomeSetting.title.text),
25599
+ subtitle: pageInfo.subtitle ? pageInfo.subtitle.text : translateService.translate(idRecognition.thicknessDefaultConfig.thicknessWelcomeSetting.subtitle.text),
25600
+ image: pageInfo.imageShow.enable ? pageInfo.imageShow.src : translateService.translate(idRecognition.thicknessDefaultConfig.thicknessWelcomeSetting.imageShow.src),
25601
+ content: pageInfo.content.enable ? pageInfo.content.text : translateService.translate(idRecognition.thicknessDefaultConfig.thicknessWelcomeSetting.content.text),
25602
+ confirm: translateService.translate('sdk.general.continue'),
25603
+ onClose: () => {
25604
+ return observer.error({
25605
+ isSuccess: false,
25606
+ code: `${core.ErrorCode.USER_CANCEL}`,
25607
+ message: new core.AuthmeError(core.ErrorCode.USER_CANCEL).message,
25608
+ data: {}
25609
+ });
25610
+ },
25611
+ onConfirm: () => {
25612
+ observer.next(canvasSizeInfo);
25613
+ observer.complete();
25614
+ }
25615
+ });
25616
+ });
25617
+ } else {
25618
+ return rxjs.of(canvasSizeInfo);
25619
+ }
25620
+ }), rxjs.tap(() => {
25621
+ util.stopSpinner();
25622
+ if (!retry) {
25623
+ thicknessTimer.init();
25624
+ }
25625
+ }), rxjs.map(() => canvasSizeInfo))));
25626
+ const autoDetectProcess = retry => init(retry).pipe(rxjs.tap(() => {
25627
+ setStatusView(core.StatusView.Running);
25628
+ if (ocrEngineConfig.expiredIn && !sdkFlowTimeout) {
25629
+ sdkFlowTimeout = makeSDKFlowTimeout(ocrEngineConfig.expiredIn);
25630
+ }
25631
+ }), rxjs.switchMap(canvasSizeInfo => {
25632
+ // 不用使用 await 等待 initThicknessFrame 完成, 因為這段是非同步的, 單純出 UI 而已
25633
+ initThicknessFrame();
25634
+ if (!config.onThicknessFrame) {
25635
+ return rxjs.of(canvasSizeInfo);
25636
+ }
25637
+ return rxjs.of(true).pipe(sendFrame(canvasSizeInfo, image, video, config.onThicknessFrame, ocrEngineConfig.fraudMaxFps, false, 'jpg', cardType, undefined, type), rxjs.tap(x => applyTextByResult(x.result)), rxjs.filter(({
25638
+ result
25639
+ }) => {
25640
+ if (result.eStatus === idRecognition.EAuthMeIDCardAntiFraudStatus.Pass) {
25641
+ statusText.textContent = translateService.translate('sdk.general.verify.success');
25642
+ }
25643
+ return result.eStatus === idRecognition.EAuthMeIDCardAntiFraudStatus.Pass || thicknessTimer.end();
25644
+ }), rxjs.take(1),
25645
+ // tap(() => {
25646
+ // statusText.textContent = translateService.translate(
25647
+ // 'sdk.general.verify.success'
25648
+ // );
25649
+ // }),
25650
+ rxjs.switchMap(({
25651
+ result
25652
+ }) => {
25653
+ if (thicknessTimer.end()) {
25654
+ util.startSpinner(translateService.translate('sdk.general.uploading'), true);
25655
+ videoToCanvas(canvasSizeInfo, result.imageData);
25656
+ return config.confirmThickness ? config.confirmThickness(generateImage(), cardType) : rxjs.of(false);
25657
+ }
25658
+ return rxjs.from(checkConfirmImageManual(canvasSizeInfo, result.imageData)).pipe(rxjs.tap(() => applyTextByResult('')), rxjs.switchMap(needRetry => {
25659
+ util.startSpinner(translateService.translate('sdk.general.uploading'), true);
25660
+ return needRetry ? rxjs.of(true) : rxjs.from(config.confirmThickness ? config.confirmThickness(generateImage(), cardType) : rxjs.of(false)).pipe(rxjs.tap(() => sendStatusAction$1(core.StatusAction.Uploading)), rxjs.map(confirmResp => !confirmResp));
25661
+ }), rxjs.switchMap(confirmResp => {
25662
+ showVideoElement(true);
25663
+ util.hideElement(confirmImageContainer);
25664
+ util.stopSpinner();
25665
+ if (confirmResp) {
25666
+ return autoDetectProcess(true);
25667
+ } else {
25668
+ return rxjs.of(confirmResp);
25669
+ }
25670
+ }));
25671
+ }));
25672
+ }));
25673
+ const manualProcess = () => init(false).pipe(rxjs.tap(() => {
25674
+ setStatusView(core.StatusView.Running);
25675
+ if (ocrEngineConfig.expiredIn && !sdkFlowTimeout) {
25676
+ sdkFlowTimeout = makeSDKFlowTimeout(ocrEngineConfig.expiredIn);
25677
+ }
25678
+ }), rxjs.switchMap(() => {
25679
+ return new rxjs.Observable(observer => {
25680
+ const captureBtn = captureButton();
25681
+ if (captureBtn) {
25682
+ util.showElement(captureBtn);
25683
+ }
25684
+ const interval$ = rxjs.interval(400);
25685
+ const checkTimeout = interval$.pipe(operators.takeWhile(() => !thicknessTimer.end()),
25686
+ // 當 end() 函數返回 false 時繼續
25687
+ operators.finalize(() => __awaiter(void 0, void 0, void 0, function* () {
25688
+ if (thicknessTimer.end()) {
25689
+ util.startSpinner(translateService.translate('sdk.general.uploading'), true);
25690
+ const sizeInfo = yield util.getCanvasSize(video);
25691
+ videoToCanvas(sizeInfo);
25692
+ if (config.confirmThickness) {
25693
+ yield config.confirmThickness(generateImage(), cardType);
25694
+ }
25695
+ util.hideElement(captureBtn);
25696
+ checkTimeout.unsubscribe();
25697
+ observer.next(sizeInfo);
25698
+ }
25699
+ }))).subscribe(() => {
25700
+ // 在每次 interval 發出值時執行的操作
25701
+ });
25702
+ rxjs.fromEvent(captureBtn, 'click').pipe(rxjs.switchMap(() => util.getCanvasSize(video)), rxjs.switchMap(canvasSizeInfo => {
25703
+ return rxjs.from(checkConfirmImageManual(canvasSizeInfo)).pipe(rxjs.switchMap(needRetry => {
25704
+ util.startSpinner(translateService.translate('sdk.general.uploading'), true);
25705
+ return needRetry ? rxjs.of(true) : rxjs.from(config.confirmThickness ? config.confirmThickness(generateImage(), cardType) : rxjs.of(false)).pipe(rxjs.tap(() => sendStatusAction$1(core.StatusAction.Uploading)), rxjs.map(confirmResp => !confirmResp));
25706
+ }), rxjs.tap(confirmResp => {
25707
+ util.hideElement(confirmImageContainer);
25708
+ util.stopSpinner();
25709
+ showVideoElement(true);
25710
+ if (!confirmResp) {
25711
+ checkTimeout.unsubscribe(); // 取消 interval$ 的訂閱
25712
+ util.hideElement(captureBtn);
25713
+ observer.next(canvasSizeInfo);
25714
+ }
25715
+ }));
25716
+ }), rxjs.map(confirmResp => {
25717
+ rxjs.of(confirmResp);
25718
+ })).subscribe();
25719
+ });
25720
+ }));
25721
+ const thicknessTimer = countdownTimer(60); // TODO default 60 need get from server
25722
+ let thicknessMode = cardTypeConfig.mode;
25723
+ const point = getCardBorderPoint();
25724
+ setCardPoints(point.map(([x, y]) => ({
25725
+ x,
25726
+ y
25727
+ })), false);
25728
+ setCardBorderColor(null);
25729
+ setHintTextLocale();
25730
+ if (thicknessMode === 'auto') {
25731
+ return autoDetectProcess(false);
25732
+ } else {
25733
+ return manualProcess();
25734
+ }
25735
+ };
25736
+
25070
25737
  const initEvenTrackingStatus = ocrConfig => {
25071
25738
  setFeature$1(ocrConfig.needAntiFraud ? core.Feature.OCRFraud : core.Feature.OCR);
25072
25739
  };
@@ -25131,6 +25798,7 @@ function startOCR(config) {
25131
25798
  lottieMask,
25132
25799
  arrowAnimationContainer,
25133
25800
  scanAnimationContainer,
25801
+ successAnimationDom,
25134
25802
  antiFraudInstructionAnimationContainer,
25135
25803
  confirmImageContainer,
25136
25804
  imageTypeText,
@@ -25146,7 +25814,11 @@ function startOCR(config) {
25146
25814
  const cardPoints = getCardBorderPoint();
25147
25815
  const {
25148
25816
  setCardPoints,
25149
- setCardBorderColor
25817
+ setCardBorderColor,
25818
+ setBorderType,
25819
+ frameImage,
25820
+ frameText,
25821
+ setBorderSuccess
25150
25822
  } = renderOCRMask({
25151
25823
  cardPoints: cardPoints.map(point => ({
25152
25824
  x: point[0],
@@ -25175,9 +25847,18 @@ function startOCR(config) {
25175
25847
  // fromEvent(window, 'resize').pipe(switchMapTo(getCanvasSize(video)))
25176
25848
  );
25177
25849
 
25850
+ const currentType = (() => {
25851
+ const data = {};
25852
+ return (method, obj) => {
25853
+ if (method === 'set') {
25854
+ Object.assign(data, obj);
25855
+ }
25856
+ return data;
25857
+ };
25858
+ })();
25178
25859
  function makeSDKFlowTimeout(expiredIn) {
25179
25860
  return setTimeout(() => __awaiter(this, void 0, void 0, function* () {
25180
- util.asyncShowErrorMessage(translateService.translate('verify.error.timeout'), false);
25861
+ util.asyncShowErrorMessage(translateService.translate('sdk.general.error.timeout.content'), false);
25181
25862
  yield util.waitTime(3 * util.TIME_UNIT.SECOND);
25182
25863
  timeout$.next({
25183
25864
  isSuccess: false,
@@ -25201,7 +25882,7 @@ function startOCR(config) {
25201
25882
  statusText.classList.add('non-empty');
25202
25883
  switch (result.eStatus) {
25203
25884
  case idRecognition.EAuthMeIDCardAntiFraudStatus.PositionNotMatch:
25204
- statusText.textContent = translateService.translate('verify.error.mismatch');
25885
+ statusText.textContent = translateService.translate('sdk.general.verify.error.missmatch');
25205
25886
  sendStatusDescription$1(core.StatusDescription.PositionNotMatch);
25206
25887
  setCardBorderColor('error');
25207
25888
  break;
@@ -25218,22 +25899,22 @@ function startOCR(config) {
25218
25899
  setCardBorderColor('pass');
25219
25900
  break;
25220
25901
  case idRecognition.EAuthMeIDCardAntiFraudStatus.NoCard:
25221
- statusText.textContent = translateService.translate('verify.error.noCard');
25902
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noCard');
25222
25903
  sendStatusDescription$1(core.StatusDescription.NoCard);
25223
25904
  setCardBorderColor('error');
25224
25905
  break;
25225
25906
  case idRecognition.EAuthMeIDCardAntiFraudStatus.WrongCardType:
25226
- statusText.textContent = translateService.translate('verify.error.wrongCardType');
25907
+ statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
25227
25908
  sendStatusDescription$1(core.StatusDescription.WrongCardType);
25228
25909
  setCardBorderColor('error');
25229
25910
  break;
25230
25911
  case idRecognition.EAuthMeIDCardAntiFraudStatus.Reflective:
25231
- statusText.textContent = translateService.translate('verify.error.reflective');
25912
+ statusText.textContent = translateService.translate('sdk.general.verify.error.reflective');
25232
25913
  sendStatusDescription$1(core.StatusDescription.Reflective);
25233
25914
  setCardBorderColor('error');
25234
25915
  break;
25235
25916
  case idRecognition.EAuthMeIDCardAntiFraudStatus.Blur:
25236
- statusText.textContent = translateService.translate('verify.error.blur');
25917
+ statusText.textContent = translateService.translate('sdk.general.verify.error.blur');
25237
25918
  blurCount++;
25238
25919
  sendStatusDescription$1(core.StatusDescription.Blur);
25239
25920
  setCardBorderColor('error');
@@ -25245,55 +25926,55 @@ function startOCR(config) {
25245
25926
  setCardBorderColor('error');
25246
25927
  break;
25247
25928
  case idRecognition.EAuthMeIDCardAntiFraudStatus.Error:
25248
- statusText.textContent = translateService.translate('verify.error.serverError');
25249
- util.showErrorMessage(translateService.translate('verify.error.serverError'), true);
25929
+ statusText.textContent = translateService.translate('sdk.general.error.alert.serverError');
25930
+ util.showErrorMessage(translateService.translate('sdk.general.error.alert.serverError'), true);
25250
25931
  sendStatusDescription$1(core.StatusDescription.Error);
25251
25932
  break;
25252
25933
  case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationFrontal:
25253
25934
  needDeformationCount++;
25254
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25935
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25255
25936
  break;
25256
25937
  case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationLeft:
25257
25938
  needDeformationCount++;
25258
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25939
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25259
25940
  break;
25260
25941
  case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationRight:
25261
25942
  needDeformationCount++;
25262
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25943
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25263
25944
  break;
25264
25945
  case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationUp:
25265
25946
  needDeformationCount++;
25266
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25947
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25267
25948
  break;
25268
25949
  case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedDeformationDown:
25269
25950
  needDeformationCount++;
25270
- statusText.textContent = translateService.translate('verify.error.NeedDeformationFrontal');
25951
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needDeformationFrontal');
25271
25952
  break;
25272
25953
  case idRecognition.EAuthMeIDCardAntiFraudStatus.CardCutByCamera:
25273
- statusText.textContent = translateService.translate('verify.error.CardCutByCamera');
25954
+ statusText.textContent = translateService.translate('sdk.general.verify.error.cardCutByCamera');
25274
25955
  break;
25275
25956
  case idRecognition.EAuthMeIDCardAntiFraudStatus.CardNotInROI:
25276
25957
  statusText.textContent = translateService.translate('verify.error.CardNotInROI');
25277
25958
  break;
25278
25959
  case idRecognition.EAuthMeIDCardAntiFraudStatus.CardTooSmall:
25279
- statusText.textContent = translateService.translate('verify.error.CardTooSmall');
25960
+ statusText.textContent = translateService.translate('sdk.general.verify.error.getCloser');
25280
25961
  break;
25281
25962
  case idRecognition.EAuthMeIDCardAntiFraudStatus.NeedHoldCard:
25282
- statusText.textContent = translateService.translate('verify.error.NeedHoldCard');
25963
+ statusText.textContent = translateService.translate('sdk.general.verify.error.needHoldCard');
25283
25964
  break;
25284
25965
  case idRecognition.EAuthMeIDCardAntiFraudStatus.StagePass:
25285
- statusText.textContent = translateService.translate('verify.error.StagePass');
25966
+ statusText.textContent = translateService.translate('sdk.general.verify.error.stagePass');
25286
25967
  stopAnimate();
25287
25968
  previosAntiFraudAnimateTime = Date.now();
25288
25969
  setCardBorderColor('pass');
25289
25970
  break;
25290
25971
  case idRecognition.EAuthMeIDCardAntiFraudStatus.Pass:
25291
25972
  setCardBorderColor('pass');
25292
- statusText.textContent = translateService.translate('verify.error.Pass');
25973
+ statusText.textContent = translateService.translate('sdk.general.verify.error.pass');
25293
25974
  break;
25294
25975
  case idRecognition.EAuthMeIDCardAntiFraudStatus.Failed:
25295
25976
  setCardBorderColor('pass');
25296
- statusText.textContent = translateService.translate('verify.error.Pass');
25977
+ statusText.textContent = translateService.translate('sdk.general.verify.error.pass');
25297
25978
  break;
25298
25979
  default:
25299
25980
  emptyStatusText();
@@ -25314,7 +25995,7 @@ function startOCR(config) {
25314
25995
  statusText.classList.remove('non-empty');
25315
25996
  }
25316
25997
  };
25317
- const antiFraudStart$ = rxjs.of(true).pipe(rxjs.switchMap(() => util.checkOnlineStatus(translateService.translate('network.error.offline'))), rxjs.switchMap(() => canvasSizeInfo$), rxjs.switchMap(canvasSizeInfo => rxjs.from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(rxjs.switchMap(() => config.antiFraudStart(getCardBorderPoint())), rxjs.tap(() => __awaiter(this, void 0, void 0, function* () {
25998
+ const antiFraudStart$ = rxjs.of(true).pipe(rxjs.switchMap(() => util.checkOnlineStatus(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'))), rxjs.switchMap(() => canvasSizeInfo$), rxjs.switchMap(canvasSizeInfo => rxjs.from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(rxjs.switchMap(() => config.antiFraudStart(getCardBorderPoint(), setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationDom, frameImage, frameText, facingMode)), rxjs.tap(() => __awaiter(this, void 0, void 0, function* () {
25318
25999
  setStatusView(core.StatusView.Aligning);
25319
26000
  if (buttonDisable$) {
25320
26001
  const cardMatchROI = config.getCardMatchROI ? yield config.getCardMatchROI() : undefined;
@@ -25375,57 +26056,57 @@ function startOCR(config) {
25375
26056
  if (!config.ocrConfig.needOCR && type === idRecognition.EAuthMeCardClass.TWN_IDCard_Front) {
25376
26057
  return rxjs.of(true);
25377
26058
  }
25378
- if (config.ocrConfig.needAntiFraud) {
25379
- const point = getCardBorderPoint();
25380
- setCardPoints(point.map(([x, y]) => ({
25381
- x,
25382
- y
25383
- })));
25384
- setHintTextLocale();
25385
- }
26059
+ // if (config.ocrConfig.needAntiFraud) {
26060
+ const point = getCardBorderPoint();
26061
+ setCardPoints(point.map(([x, y]) => ({
26062
+ x,
26063
+ y
26064
+ })), config.ocrConfig.needAntiFraud);
26065
+ setHintTextLocale();
26066
+ // }
25386
26067
  const applyTextByResult = result => {
25387
26068
  statusText.classList.add('non-empty');
25388
26069
  switch (result.eStatus) {
25389
26070
  case idRecognition.EAuthMeCardOCRStatus.NoCard:
25390
26071
  case idRecognition.EAuthMeMRZServiceStatus.NotFound:
25391
- statusText.textContent = translateService.translate('verify.error.noCard');
26072
+ statusText.textContent = translateService.translate('sdk.general.verify.error.noCard');
25392
26073
  sendStatusDescription$1(core.StatusDescription.NoCard);
25393
26074
  setCardBorderColor('error');
25394
26075
  break;
25395
26076
  case idRecognition.EAuthMeCardOCRStatus.WrongCardType:
25396
- statusText.textContent = translateService.translate('verify.error.wrongCardType');
26077
+ statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
25397
26078
  sendStatusDescription$1(core.StatusDescription.WrongCardType);
25398
26079
  setCardBorderColor('error');
25399
26080
  break;
25400
26081
  case idRecognition.EAuthMeCardOCRStatus.PositionNotMatch:
25401
- statusText.textContent = translateService.translate('verify.error.mismatch');
26082
+ statusText.textContent = translateService.translate('sdk.general.verify.error.missmatch');
25402
26083
  sendStatusDescription$1(core.StatusDescription.PositionNotMatch);
25403
26084
  setCardBorderColor('error');
25404
26085
  break;
25405
26086
  case idRecognition.EAuthMeCardOCRStatus.Reflective:
25406
- statusText.textContent = translateService.translate('verify.error.reflective');
26087
+ statusText.textContent = translateService.translate('sdk.general.verify.error.reflective');
25407
26088
  sendStatusDescription$1(core.StatusDescription.Reflective);
25408
26089
  setCardBorderColor('error');
25409
26090
  break;
25410
26091
  case idRecognition.EAuthMeCardOCRStatus.Blur:
25411
- statusText.textContent = translateService.translate('verify.error.blur');
26092
+ statusText.textContent = translateService.translate('sdk.general.verify.error.blur');
25412
26093
  sendStatusDescription$1(core.StatusDescription.Blur);
25413
26094
  setCardBorderColor('error');
25414
26095
  blurCount++;
25415
26096
  break;
25416
26097
  case idRecognition.EAuthMeMRZServiceStatus.RecogFailed:
25417
26098
  case idRecognition.EAuthMeMRZServiceStatus.WrongCardType:
25418
- statusText.textContent = translateService.translate('verify.error.wrongCardType');
26099
+ statusText.textContent = translateService.translate('sdk.general.verify.error.wrongCardType');
25419
26100
  sendStatusDescription$1(core.StatusDescription.WrongCardType);
25420
26101
  setCardBorderColor('error');
25421
26102
  break;
25422
26103
  case idRecognition.EAuthMeMRZServiceStatus.NotAligned:
25423
- statusText.textContent = translateService.translate('verify.error.mismatch');
26104
+ statusText.textContent = translateService.translate('sdk.general.verify.error.missmatch');
25424
26105
  sendStatusDescription$1(core.StatusDescription.NotAligned);
25425
26106
  setCardBorderColor('error');
25426
26107
  break;
25427
26108
  case idRecognition.EAuthMeMRZServiceStatus.Reflective:
25428
- statusText.textContent = translateService.translate('verify.error.reflective');
26109
+ statusText.textContent = translateService.translate('sdk.general.verify.error.reflective');
25429
26110
  sendStatusDescription$1(core.StatusDescription.Reflective);
25430
26111
  setCardBorderColor('error');
25431
26112
  break;
@@ -25434,7 +26115,8 @@ function startOCR(config) {
25434
26115
  showCameraSwitchButton(deviceMetas);
25435
26116
  }
25436
26117
  };
25437
- const init = retry => canvasSizeInfo$.pipe(rxjs.take(1), rxjs.switchMap(canvasSizeInfo => rxjs.from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(rxjs.switchMap(() => util.checkOnlineStatus(translateService.translate('network.error.offline'))), rxjs.switchMap(() => config.ocrStart(getCardBorderPoint(), type, cardType, retry)), rxjs.tap(() => {
26118
+ const init = retry => canvasSizeInfo$.pipe(rxjs.take(1), rxjs.switchMap(canvasSizeInfo => rxjs.from(config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(rxjs.switchMap(() => util.checkOnlineStatus(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'))), rxjs.switchMap(() => config.ocrStart(getCardBorderPoint(), type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationDom, frameImage, frameText, facingMode, cardType, retry)), rxjs.tap(() => {
26119
+ tiltFrame(false);
25438
26120
  util.stopSpinner();
25439
26121
  util.showElement(scanAnimationContainer);
25440
26122
  scanAnimationContainer.style.width = `${cardSizeInfo.width + scanPadding}px`;
@@ -25462,7 +26144,7 @@ function startOCR(config) {
25462
26144
  // }),
25463
26145
  rxjs.take(1), rxjs.tap(() => {
25464
26146
  setCardBorderColor('pass');
25465
- statusText.textContent = translateService.translate('verify.ocrSuccess');
26147
+ statusText.textContent = translateService.translate('sdk.general.verify.success');
25466
26148
  lottie__default["default"].stop('scan');
25467
26149
  util.hideElement(scanAnimationContainer);
25468
26150
  }), rxjs.switchMap(resp => rxjs.of(true).pipe(rxjs.tap(() => {
@@ -25470,23 +26152,60 @@ function startOCR(config) {
25470
26152
  }), rxjs.map(() => resp))), rxjs.switchMap(({
25471
26153
  result
25472
26154
  }) => rxjs.from(type === idRecognition.EAuthMeCardClass.Passport && config.ocrConfig.disablePassportConfirm ? rxjs.of(false) : checkConfirmImage(result.imageData, result.iWidth, result.iHeight)).pipe(rxjs.switchMap(needRetry => {
25473
- util.startSpinner(translateService.translate('verify.uploading'));
26155
+ util.startSpinner(translateService.translate('sdk.general.uploading'));
25474
26156
  return needRetry ? rxjs.of(true) : rxjs.from(config.confirmImage(type, cardType)).pipe(rxjs.tap(() => sendStatusAction$1(core.StatusAction.Uploading)), rxjs.map(confirmResp => !confirmResp));
25475
26157
  }), rxjs.tap(() => {
25476
26158
  util.hideElement(confirmImageContainer);
26159
+ util.stopSpinner();
25477
26160
  showVideoElement();
25478
26161
  }), rxjs.switchMap(needRetry => needRetry ? recognition(true) : rxjs.of(true)))))));
25479
26162
  return recognition(false);
25480
26163
  }
25481
- function createFlowByType(type, cardType) {
26164
+ function createFlowByType(type, cardType, cardTypeConfig) {
25482
26165
  return rxjs.of(true).pipe(rxjs.tap(() => {
26166
+ currentType('set', {
26167
+ type,
26168
+ cardType
26169
+ });
25483
26170
  setStatusEvent$1(cardClassMapping(type));
25484
26171
  setUIByType(type, cardType);
25485
- }), rxjs.switchMap(() => startAntiFraud(type)), rxjs.tap(() => {
25486
- setStatusEvent$1(cardClassMapping(type));
25487
- setUIByType(type, cardType);
25488
- }), rxjs.switchMap(() => startOCR(type, cardType)));
26172
+ }), rxjs.switchMap(() => {
26173
+ if (type === idRecognition.EAuthMeCardClass.TWN_IDCard_Front && config.ocrConfig.needAntiFraud) {
26174
+ return rxjs.from(startAntiFraud(type)).pipe(rxjs.switchMap(() => {
26175
+ hideFrameUI(false);
26176
+ return startOCR(type, cardType);
26177
+ }));
26178
+ } else if (cardType.toLocaleLowerCase().includes('thickness')) {
26179
+ hideCameraSwitchButton();
26180
+ return startThickness(type, cardType, cardTypeConfig, setHintTextLocale, setCardPoints, setCardBorderColor, statusText, canvasSizeInfo$, showVideoElement, {
26181
+ getCardMatchROI: config.getCardMatchROI,
26182
+ setFrameSize: config.setFrameSize,
26183
+ thicknessStart: config.thicknessStart,
26184
+ onThicknessFrame: config.onThicknessFrame,
26185
+ confirmThickness: config.confirmThickness
26186
+ }, cardRotateByStage, getCardBorderPoint, setBorderType, setBorderSuccess, scanAnimationContainer, successAnimationDom, frameImage, frameText, facingMode, ocrEngineConfig, sdkFlowTimeout, makeSDKFlowTimeout, image, video, retryBtn, completeBtn, confirmImageContainer);
26187
+ } else if (cardType.toLocaleLowerCase().includes('front')) {
26188
+ hideFrameUI(false);
26189
+ return startOCR(type, cardType);
26190
+ } else if (cardType.toLocaleLowerCase().includes('back')) {
26191
+ hideFrameUI(false);
26192
+ return startOCR(type, cardType);
26193
+ } else if (cardType.toLocaleLowerCase().includes('passport')) {
26194
+ hideFrameUI(false);
26195
+ return startOCR(type, cardType);
26196
+ } else {
26197
+ console.error('unknow flow');
26198
+ return rxjs.of(false);
26199
+ }
26200
+ })
26201
+ // tap(() => {
26202
+ // setStatusEvent(cardClassMapping(type));
26203
+ // setUIByType(type, cardType);
26204
+ // }),
26205
+ // switchMap(() => startOCR(type, cardType)),
26206
+ );
25489
26207
  }
26208
+
25490
26209
  function main() {
25491
26210
  const flags = {
25492
26211
  onConfirm: false
@@ -25498,9 +26217,9 @@ function startOCR(config) {
25498
26217
  } = showAntiFraudLottie();
25499
26218
  buttonDisable$ = buttonDisable;
25500
26219
  } else {
25501
- util.startSpinner(translateService.translate('general.loading'));
26220
+ util.startSpinner(translateService.translate('sdk.general.loading'));
25502
26221
  }
25503
- const flow$ = config.cardTypes.map(x => createFlowByType(idRecognition.mapCardtypeToAuthmeClass(x), x)).reduce((prev, cur) => prev.pipe(rxjs.switchMap(() => cur)), canvasSizeInfo$.pipe(rxjs.take(1), rxjs.tap(() => {
26222
+ const flow$ = config.cardTypes.map((x, index) => createFlowByType(idRecognition.mapCardtypeToAuthmeClass(x), x, config.cardTypeConfigs[index])).reduce((prev, cur) => prev.pipe(rxjs.switchMap(() => cur)), canvasSizeInfo$.pipe(rxjs.take(1), rxjs.tap(() => {
25504
26223
  setUIByType(idRecognition.mapCardtypeToAuthmeClass(config.cardTypes[0]), config.cardTypes[0]);
25505
26224
  }), rxjs.switchMap(canvasSizeInfo => rxjs.from(config.init(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight)).pipe(rxjs.tap(x => ocrEngineConfig = x), rxjs.tap(() => __awaiter(this, void 0, void 0, function* () {
25506
26225
  if (config.ocrConfig.needAntiFraud) return;
@@ -25508,7 +26227,7 @@ function startOCR(config) {
25508
26227
  })), rxjs.tap(() => eventListenerService$1.start()))))).pipe(rxjs.tap(() => {
25509
26228
  sendStatusAction$1(core.StatusAction.Uploading);
25510
26229
  util.hideElement(videoContainer);
25511
- util.startSpinner(translateService.translate('verify.uploading'));
26230
+ util.startSpinner(translateService.translate('sdk.general.uploading'));
25512
26231
  }), rxjs.switchMap(() => config.onSuccess()), rxjs.tap(() => {
25513
26232
  setStatusEvent$1(cardClassResultMapping(config.acceptTypes[config.acceptTypes.length - 1]));
25514
26233
  util.stopSpinner();
@@ -25548,20 +26267,28 @@ function startOCR(config) {
25548
26267
  util.stopSpinner();
25549
26268
  reset();
25550
26269
  }));
25551
- const cancel$ = rxjs.fromEvent(closeIcon, 'click').pipe(rxjs.map(() => {
25552
- document.body.removeChild(container);
25553
- sendStatusAction$1(core.StatusAction.BtnClose);
25554
- return {
26270
+ const cancel$ = rxjs.fromEvent(closeIcon, 'click').pipe(rxjs.switchMap(() => util.getCanvasSize(video)), rxjs.concatMap(canvasSizeInfo => {
26271
+ const type = currentType('get', null).type;
26272
+ const cardType = currentType('get', null).cardType;
26273
+ const ctx = image.getContext('2d');
26274
+ const imageData = util.getImageData(image, ctx, video, canvasSizeInfo, false, 'jpg');
26275
+ const imageBlob = util.UintArrayToBlob(canvasSizeInfo.width, canvasSizeInfo.height, imageData.data);
26276
+ const cancelResultObj = {
25555
26277
  isSuccess: false,
25556
26278
  code: `${core.ErrorCode.USER_CANCEL}`,
25557
26279
  message: new core.AuthmeError(core.ErrorCode.USER_CANCEL).message,
25558
26280
  data: {}
25559
26281
  };
25560
- }), rxjs.takeUntil(unsubscribe$));
26282
+ const cancelResult = config.ocrCancel ? rxjs.from(config.ocrCancel(type, cardType, imageBlob)).pipe(rxjs.map(() => cancelResultObj)) : rxjs.of(cancelResultObj);
26283
+ return cancelResult;
26284
+ }), rxjs.takeUntil(unsubscribe$), rxjs.finalize(() => {
26285
+ document.body.removeChild(container);
26286
+ sendStatusAction$1(core.StatusAction.BtnClose);
26287
+ }));
25561
26288
  const detectScreenResizeError$ = handleScreenResizeError$(detectScreenResize$(), unsubscribe$, () => !flags.onConfirm);
25562
26289
  return rxjs.merge(flow$, cancel$, detectScreenResizeError$, timeout$).pipe(rxjs.take(1));
25563
26290
  }
25564
- rxjs.fromEvent(window, 'offline').pipe(rxjs.switchMap(() => util.asyncOnLineShowErrorMessage(translateService.translate('network.error.offline'), true)), rxjs.takeUntil(unsubscribe$)).subscribe();
26291
+ rxjs.fromEvent(window, 'offline').pipe(rxjs.switchMap(() => util.asyncOnLineShowErrorMessage(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'), true)), rxjs.takeUntil(unsubscribe$)).subscribe();
25565
26292
  // resize
25566
26293
  rxjs.fromEvent(window, 'resize').pipe(rxjs.switchMapTo(util.getCanvasSize(video)), rxjs.switchMap(canvasSizeInfo => config.setFrameSize(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight, getCardBorderPoint())), rxjs.tap(() => {
25567
26294
  scanAnimationContainer.style.width = `${cardSizeInfo.width + scanPadding}px`;
@@ -25573,7 +26300,7 @@ function startOCR(config) {
25573
26300
  showVideoElement(false);
25574
26301
  util.showElement(antiFraudInstructionContainer);
25575
26302
  util.showElement(lottieMask);
25576
- setHeaderText(translateService.translate('verify.idCard'), translateService.translate('verify.header.step', {
26303
+ setHeaderText(translateService.translate('verify.idCard'), translateService.translate('sdk.verify.header.stepper', {
25577
26304
  current: 1,
25578
26305
  total: 3
25579
26306
  }));
@@ -25610,11 +26337,11 @@ function startOCR(config) {
25610
26337
  function countdownTimer(countdown) {
25611
26338
  return __awaiter(this, void 0, void 0, function* () {
25612
26339
  if (countdown <= 0 && !isTutorialFinish) {
25613
- confirmBtn.innerText = translateService.translate('verify.startVerifyBtn');
26340
+ confirmBtn.innerText = translateService.translate('sdk.guard.verify.guide.start');
25614
26341
  yield finishTutorial(point);
25615
26342
  return;
25616
26343
  }
25617
- confirmBtn.innerText = `${translateService.translate('verify.startVerifyBtn')} (${countdown})`;
26344
+ confirmBtn.innerText = `${translateService.translate('sdk.guard.verify.guide.start')} (${countdown})`;
25618
26345
  setTimeout(() => {
25619
26346
  countdownTimer(countdown - 1);
25620
26347
  }, util.TIME_UNIT.SECOND);
@@ -25643,6 +26370,35 @@ function startOCR(config) {
25643
26370
  return yield rxjs.firstValueFrom(allEvents$.pipe());
25644
26371
  });
25645
26372
  }
26373
+ function hideFrameUI(flag) {
26374
+ const frameImageDom = document.querySelector('#authme_frame_image');
26375
+ const frameTextDom = document.querySelector('#authme_frame_text');
26376
+ if (frameImageDom) {
26377
+ if (flag) {
26378
+ util.hideElement(frameImageDom);
26379
+ } else {
26380
+ util.showElement(frameImageDom);
26381
+ }
26382
+ }
26383
+ if (frameTextDom) {
26384
+ if (flag) {
26385
+ util.hideElement(frameTextDom);
26386
+ } else {
26387
+ util.showElement(frameTextDom);
26388
+ }
26389
+ }
26390
+ }
26391
+ // function tiltFrame(isTilt: boolean) {
26392
+ // if (isTilt) {
26393
+ // videoContainer.classList.add('container-tilt');
26394
+ // document.querySelector('#authme_frame_border')?.classList.add('svg-tilt');
26395
+ // document.querySelector('#authme_frame_image')?.classList.add('svg-tilt');
26396
+ // } else {
26397
+ // videoContainer.classList.remove('container-tilt');
26398
+ // document.querySelector('#authme_frame_border')?.classList.remove('svg-tilt');
26399
+ // document.querySelector('#authme_frame_image')?.classList.remove('svg-tilt');
26400
+ // }
26401
+ // }
25646
26402
  function setTopText(title) {
25647
26403
  titleText.textContent = title;
25648
26404
  }
@@ -25654,16 +26410,18 @@ function startOCR(config) {
25654
26410
  function setTextByType(type, cardType) {
25655
26411
  var _a, _b, _c;
25656
26412
  const _typeMap = {
25657
- EAuthMeCardClass_Passport: 'verify.passportFrontSide',
25658
- EAuthMeCardClass_TWN_IDCard_Front: 'verify.idCardFrontSide',
25659
- EAuthMeCardClass_TWN_IDCard_Back: 'verify.idCardBackSide',
25660
- EAuthMeCardClass_TWN_DriverLicense_Front: 'verify.licenseFrontSide',
25661
- EAuthMeCardClass_TWN_DriverLicense_Back: 'verify.licenseBackSide',
25662
- EAuthMeCardClass_TWN_ResidentCard_Front: 'verify.residentCardFrontSide',
25663
- EAuthMeCardClass_TWN_ResidentCard_Back: 'verify.residentCardBackSide',
25664
- EAuthMeCardClass_TWN_HealthCard_Front: 'verify.healthFrontSide',
26413
+ EAuthMeCardClass_Passport: 'sdk.ocr.verify.passportFrontSide',
26414
+ EAuthMeCardClass_TWN_IDCard_Front: 'sdk.ocr.verify.idCardFrontSide',
26415
+ EAuthMeCardClass_TWN_IDCard_Back: 'sdk.ocr.verify.idCardBackSide',
26416
+ EAuthMeCardClass_TWN_DriverLicense_Front: 'sdk.ocr.verify.driverFrontSide',
26417
+ EAuthMeCardClass_TWN_DriverLicense_Back: 'sdk.ocr.verify.driverBackSide',
26418
+ EAuthMeCardClass_TWN_ResidentCard_Front: 'sdk.ocr.verify.residentCardFrontSide',
26419
+ EAuthMeCardClass_TWN_ResidentCard_Back: 'sdk.ocr.verify.residentCardBackSide',
26420
+ EAuthMeCardClass_TWN_HealthCard_Front: 'sdk.ocr.verify.healthCardFrontSide',
25665
26421
  EAuthMeCardClass_TWN_VehiclesLicense_Front: 'verify.vehiclesLicenseFrontSide'
26422
+ // EAuthMeCardClass_TWN_IDCard_Thickness: 'verify.idCardThickness',
25666
26423
  };
26424
+
25667
26425
  const typeMap = _typeMap;
25668
26426
  let titleKey = typeMap[`${type}`];
25669
26427
  if (typeMap[`${type}`] == null) {
@@ -25673,18 +26431,20 @@ function startOCR(config) {
25673
26431
  titleText.textContent = translateService.translate(titleKey !== null && titleKey !== void 0 ? titleKey : 'verify.unexpected');
25674
26432
  statusText.textContent = '';
25675
26433
  statusText.classList.remove('non-empty');
25676
- hintText.textContent = type.includes('Back') ? translateService.translate('verify.backSide') : translateService.translate('verify.frontSide');
26434
+ hintText.textContent = type.includes('Back') ? translateService.translate('sdk.general.backSide') : translateService.translate('sdk.general.frontSide');
25677
26435
  const _typeConfirmTextMap = {
25678
- EAuthMeCardClass_Passport: 'verify.confirmPassportFrontSide',
25679
- EAuthMeCardClass_TWN_IDCard_Front: 'verify.confirmIdCardFront',
25680
- EAuthMeCardClass_TWN_IDCard_Back: 'verify.confirmIdCardBack',
25681
- EAuthMeCardClass_TWN_DriverLicense_Front: 'verify.confirmLicenseFront',
25682
- EAuthMeCardClass_TWN_DriverLicense_Back: 'verify.confirmLicenseBack',
25683
- EAuthMeCardClass_TWN_ResidentCard_Front: 'verify.confirmResidentCardFrontSide',
25684
- EAuthMeCardClass_TWN_ResidentCard_Back: 'verify.confirmResidentCardBackSide',
25685
- EAuthMeCardClass_TWN_HealthCard_Front: 'verify.confirmHealthFront',
26436
+ EAuthMeCardClass_Passport: 'sdk.ocr.verify.confirmPassportFront',
26437
+ EAuthMeCardClass_TWN_IDCard_Front: 'sdk.ocr.verify.confirmIdCardFront',
26438
+ EAuthMeCardClass_TWN_IDCard_Back: 'sdk.ocr.verify.confirmIdCardBack',
26439
+ EAuthMeCardClass_TWN_DriverLicense_Front: 'sdk.ocr.verify.confirmDriverFront',
26440
+ EAuthMeCardClass_TWN_DriverLicense_Back: 'sdk.ocr.verify.confirmDriverBack',
26441
+ EAuthMeCardClass_TWN_ResidentCard_Front: 'sdk.ocr.verify.confirmResidentCardFront',
26442
+ EAuthMeCardClass_TWN_ResidentCard_Back: 'sdk.ocr.verify.confirmResidentCardBack',
26443
+ EAuthMeCardClass_TWN_HealthCard_Front: 'sdk.ocr.verify.confirmHealthCardFront',
25686
26444
  EAuthMeCardClass_TWN_VehiclesLicense_Front: 'verify.confirmVehiclesLicenseFrontSide'
26445
+ // EAuthMeCardClass_TWN_IDCard_Thickness: 'verify.confirmIdCardThickness',
25687
26446
  };
26447
+
25688
26448
  const typeConfirmTextMap = _typeConfirmTextMap;
25689
26449
  let titleConfirmKey = typeConfirmTextMap[type];
25690
26450
  if (titleConfirmKey == null) {
@@ -25694,33 +26454,38 @@ function startOCR(config) {
25694
26454
  }
25695
26455
  function setHeaderByType(type) {
25696
26456
  const typeMap = {
25697
- EAuthMeCardClass_Passport: 'verify.header.passport',
25698
- EAuthMeCardClass_TWN_IDCard_Front: 'verify.header.idCard',
25699
- EAuthMeCardClass_TWN_IDCard_Back: 'verify.header.idCard',
25700
- EAuthMeCardClass_TWN_DriverLicense_Front: 'verify.header.driverLicense',
25701
- EAuthMeCardClass_TWN_DriverLicense_Back: 'verify.header.driverLicense',
25702
- EAuthMeCardClass_TWN_HealthCard_Front: 'verify.header.healthCard'
26457
+ EAuthMeCardClass_Passport: 'sdk.verify.passport.header',
26458
+ EAuthMeCardClass_TWN_IDCard_Front: 'sdk.verify.idCard.header',
26459
+ EAuthMeCardClass_TWN_IDCard_Back: 'sdk.verify.idCard.header',
26460
+ EAuthMeCardClass_TWN_DriverLicense_Front: 'sdk.verify.driverLicense.header',
26461
+ EAuthMeCardClass_TWN_DriverLicense_Back: 'sdk.verify.driverLicense.header',
26462
+ EAuthMeCardClass_TWN_HealthCard_Front: 'sdk.verify.healthCard.header',
26463
+ EAuthMeCardClass_JPN_IDCard_Front: 'sdk.verify.myNumberCard.header',
26464
+ EAuthMeCardClass_JPN_IDCard_Back: 'sdk.verify.myNumberCard.header',
26465
+ EAuthMeCardClass_JPN_IDCard_Thickness: 'sdk.verify.myNumberCard.header',
26466
+ EAuthMeCardClass_TWN_ResidentCard_Front: 'sdk.verify.residentCard.header',
26467
+ EAuthMeCardClass_TWN_ResidentCard_Back: 'sdk.verify.residentCard.header'
25703
26468
  };
25704
26469
  if (type.includes('Health') || type.includes('Passport')) {
25705
- setHeaderText(translateService.translate(typeMap[type]), translateService.translate('verify.header.step', {
26470
+ setHeaderText(translateService.translate(typeMap[type]), translateService.translate('sdk.verify.header.stepper', {
25706
26471
  current: 1,
25707
26472
  total: 1
25708
26473
  }));
25709
26474
  } else {
25710
26475
  if (type.includes('Front')) {
25711
- const stepNow = type.includes('TWN_IDCard') ? translateService.translate('verify.header.step', {
26476
+ const stepNow = type.includes('TWN_IDCard') ? translateService.translate('sdk.verify.header.stepper', {
25712
26477
  current: 2,
25713
26478
  total: 3
25714
- }) : translateService.translate('verify.header.step', {
26479
+ }) : translateService.translate('sdk.verify.header.stepper', {
25715
26480
  current: 1,
25716
26481
  total: 2
25717
26482
  });
25718
26483
  setHeaderText(translateService.translate(typeMap[type]), stepNow);
25719
26484
  } else {
25720
- const stepNow = type.includes('TWN_IDCard') ? translateService.translate('verify.header.step', {
26485
+ const stepNow = type.includes('TWN_IDCard') ? translateService.translate('sdk.verify.header.stepper', {
25721
26486
  current: 3,
25722
26487
  total: 3
25723
- }) : translateService.translate('verify.header.step', {
26488
+ }) : translateService.translate('sdk.verify.header.stepper', {
25724
26489
  current: 2,
25725
26490
  total: 2
25726
26491
  });
@@ -25729,6 +26494,7 @@ function startOCR(config) {
25729
26494
  }
25730
26495
  }
25731
26496
  function setCardSize(type) {
26497
+ var _a, _b;
25732
26498
  let CARD_SIZE;
25733
26499
  (function (CARD_SIZE) {
25734
26500
  CARD_SIZE[CARD_SIZE["MAX_WIDTH_RATE"] = 0.95] = "MAX_WIDTH_RATE";
@@ -25758,7 +26524,8 @@ function startOCR(config) {
25758
26524
  width,
25759
26525
  height
25760
26526
  };
25761
- statusTextPanel.style.top = `${windowHeight / 2 + height / 2}px`;
26527
+ const textTopRef = ((_a = document.querySelector('.video-container')) === null || _a === void 0 ? void 0 : _a.clientHeight) || windowHeight;
26528
+ (_b = document.querySelector('.status')) === null || _b === void 0 ? void 0 : _b.setAttribute('style', `top: ${textTopRef / 2 + height / 2}px`);
25762
26529
  scanAnimationContainer.style.width = `${width + scanPadding}px`;
25763
26530
  scanAnimationContainer.style.height = `${height + scanPadding}px`;
25764
26531
  }
@@ -25798,7 +26565,7 @@ function startOCR(config) {
25798
26565
  } = renderCameraSwitch({
25799
26566
  container: videoContainer
25800
26567
  });
25801
- cameraHint.textContent = translateService.translate('verify.switchCamera');
26568
+ cameraHint.innerHTML = translateService.translate('sdk.general.verify.error.switchCamera');
25802
26569
  cameraSwitchContainer.addEventListener('click', () => __awaiter(this, void 0, void 0, function* () {
25803
26570
  const _nextCameraNumber = parseInt(switchText.textContent) + 1;
25804
26571
  const nextCameraNumber = _nextCameraNumber > backCameraList.length ? 1 : _nextCameraNumber;
@@ -25810,13 +26577,19 @@ function startOCR(config) {
25810
26577
  switchText.textContent = '1';
25811
26578
  cameraSwitchShow = true;
25812
26579
  }
26580
+ function hideCameraSwitchButton() {
26581
+ var _a, _b;
26582
+ cameraSwitchShow = false;
26583
+ (_a = document.querySelector('.camera-switch-container')) === null || _a === void 0 ? void 0 : _a.remove();
26584
+ (_b = document.querySelector('.camera-switch__hint')) === null || _b === void 0 ? void 0 : _b.remove();
26585
+ }
25813
26586
  function cardRotateByStage(stage, mandatoryRotate = false, point) {
25814
26587
  return __awaiter(this, void 0, void 0, function* () {
25815
26588
  if ((stage === idRecognition.EAuthMeIDCardAntiFraudStage.Done || stage === currentAntiFraudStage) && mandatoryRotate === false) return;
25816
26589
  const cardMatchROI = point ? point : config.getCardMatchROI ? yield config.getCardMatchROI() : null;
25817
- if (!cardMatchROI) throw new core.AuthmeError(core.ErrorCode.SDK_INTERNAL_ERROR, 'getCardMatchROI is null');
26590
+ if (!cardMatchROI || cardMatchROI.length == 0) throw new core.AuthmeError(core.ErrorCode.SDK_INTERNAL_ERROR, 'getCardMatchROI is null');
25818
26591
  setCardBorderColor('error');
25819
- setCardPoints(cardMatchROI, facingMode === 'front');
26592
+ setCardPoints(cardMatchROI, config.ocrConfig.needAntiFraud, facingMode === 'front');
25820
26593
  setHintTextLocale();
25821
26594
  currentAntiFraudStage = stage;
25822
26595
  if (isTutorialFinish && !getIsRotateCardAnimating() || mandatoryRotate) {
@@ -25828,16 +26601,16 @@ function startOCR(config) {
25828
26601
  function cardRotateTextProcess(stage) {
25829
26602
  switch (stage) {
25830
26603
  case idRecognition.EAuthMeIDCardAntiFraudStage.Left:
25831
- facingMode === 'front' ? setTopText(translateService.translate('verify.idCardFlipRight')) : setTopText(translateService.translate('verify.idCardFlipLeft'));
26604
+ facingMode === 'front' ? setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip')) : setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
25832
26605
  break;
25833
26606
  case idRecognition.EAuthMeIDCardAntiFraudStage.Right:
25834
- facingMode === 'front' ? setTopText(translateService.translate('verify.idCardFlipLeft')) : setTopText(translateService.translate('verify.idCardFlipRight'));
26607
+ facingMode === 'front' ? setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip')) : setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
25835
26608
  break;
25836
26609
  case idRecognition.EAuthMeIDCardAntiFraudStage.Up:
25837
- setTopText(translateService.translate('verify.idCardFlipUp'));
26610
+ setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
25838
26611
  break;
25839
26612
  case idRecognition.EAuthMeIDCardAntiFraudStage.Down:
25840
- setTopText(translateService.translate('verify.idCardFlipDown'));
26613
+ setTopText(translateService.translate('sdk.guard.verify.guide.idCardFlip'));
25841
26614
  break;
25842
26615
  }
25843
26616
  }
@@ -25885,10 +26658,10 @@ function startOCR(config) {
25885
26658
  }
25886
26659
  function setHintTextLocale() {
25887
26660
  var _a;
25888
- const TITLE_TOP_RANGE = 40;
26661
+ const TITLE_TOP_RANGE = 100;
25889
26662
  const ORIGINAL_TITLE_CLIENT_HEIGHT = window.getComputedStyle(titleText).getPropertyValue('line-height');
25890
26663
  const titleClientHight = parseInt(ORIGINAL_TITLE_CLIENT_HEIGHT.replace('px', ''));
25891
- const maskRect = (_a = document.querySelector('#authme-mask-svg path')) === null || _a === void 0 ? void 0 : _a.getClientRects();
26664
+ const maskRect = (_a = document.querySelector('#authme_frame_border path')) === null || _a === void 0 ? void 0 : _a.getClientRects();
25892
26665
  if (!maskRect || (maskRect === null || maskRect === void 0 ? void 0 : maskRect.length) <= 0) return;
25893
26666
  titleTextPanel.style.top = `${maskRect[0].top - TITLE_TOP_RANGE - titleClientHight}px`;
25894
26667
  }
@@ -25918,7 +26691,7 @@ const renderExtraUI = config => {
25918
26691
  config.videoContainer.appendChild(titleTextPanel);
25919
26692
  config.videoContainer.appendChild(cardborderContainer);
25920
26693
  // Set init text
25921
- titleText.textContent = translateService.translate('extra.title');
26694
+ titleText.innerHTML = translateService.translate('extra.title');
25922
26695
  // Picture
25923
26696
  const confirmImageContainer = document.createElement('div');
25924
26697
  confirmImageContainer.classList.add('confirm-image-container', 'confirm-image-container-extra');
@@ -25939,10 +26712,10 @@ const renderExtraUI = config => {
25939
26712
  imageFooter.classList.add('image-footer');
25940
26713
  const retryBtn = document.createElement('button');
25941
26714
  retryBtn.classList.add('btn-retry');
25942
- retryBtn.textContent = translateService.translate('verify.retryBtn');
26715
+ retryBtn.textContent = translateService.translate('sdk.ocr.verify.retry');
25943
26716
  const completeBtn = document.createElement('button');
25944
26717
  completeBtn.classList.add('btn-complete');
25945
- completeBtn.textContent = translateService.translate('verify.clearBtn');
26718
+ completeBtn.textContent = translateService.translate('sdk.ocr.verify.clear');
25946
26719
  imageFooter.appendChild(completeBtn);
25947
26720
  imageFooter.appendChild(retryBtn);
25948
26721
  confirmImageContainer.appendChild(confirmImageWapper);
@@ -25969,7 +26742,7 @@ const renderExtraUI = config => {
25969
26742
  endBtn.textContent = translateService.translate('verify.endBtn');
25970
26743
  const continueBtn = document.createElement('button');
25971
26744
  continueBtn.classList.add('btn-continue');
25972
- continueBtn.textContent = translateService.translate('verify.continueBtn');
26745
+ continueBtn.textContent = translateService.translate('sdk.general.continue');
25973
26746
  checkOtherImageFooter.appendChild(continueBtn);
25974
26747
  checkOtherImageFooter.appendChild(endBtn);
25975
26748
  checkOtherImageContainer.appendChild(checkOtherImageWapper);
@@ -25987,7 +26760,8 @@ const renderExtraUI = config => {
25987
26760
  endBtn,
25988
26761
  completeBtn,
25989
26762
  continueBtn,
25990
- image
26763
+ image,
26764
+ cardborderContainer
25991
26765
  };
25992
26766
  };
25993
26767
 
@@ -26020,15 +26794,21 @@ function startExtra(config) {
26020
26794
  completeBtn,
26021
26795
  endBtn,
26022
26796
  continueBtn,
26023
- image
26797
+ image,
26798
+ cardborderContainer
26024
26799
  } = renderExtraUI({
26025
26800
  videoContainer,
26026
26801
  container
26027
26802
  });
26803
+ if (config.extraConfig.border == 'none') {
26804
+ util.hideElement(cardborderContainer);
26805
+ } else {
26806
+ util.showElement(cardborderContainer);
26807
+ }
26028
26808
  const canvas = document.createElement('canvas');
26029
26809
  // Register Event
26030
26810
  const requestCamera$ = rxjs.of(true).pipe(rxjs.tap(() => {
26031
- util.startSpinner(translateService.translate('general.loading'));
26811
+ util.startSpinner(translateService.translate('sdk.general.loading'));
26032
26812
  }), rxjs.switchMap(() => rxjs.from(util.requestCamera({
26033
26813
  video,
26034
26814
  facingMode: 'back',
@@ -26041,20 +26821,30 @@ function startExtra(config) {
26041
26821
  util.stopSpinner();
26042
26822
  util.showElement(videoContainer);
26043
26823
  }));
26044
- rxjs.fromEvent(window, 'offline').pipe(rxjs.switchMap(() => util.asyncOnLineShowErrorMessage(translateService.translate('network.error.offline'), true)), rxjs.takeUntil(unsubscribe$)).subscribe();
26824
+ rxjs.fromEvent(window, 'offline').pipe(rxjs.switchMap(() => util.asyncOnLineShowErrorMessage(translateService.translate('sdk.general.error.alert.offline'), translateService.translate('sdk.general.error.retry'), true)), rxjs.takeUntil(unsubscribe$)).subscribe();
26045
26825
  rxjs.fromEvent(window, 'resize').pipe(rxjs.throttleTime(100), rxjs.switchMap(() => util.getCanvasSize(video)), rxjs.takeUntil(unsubscribe$)).subscribe();
26046
26826
  rxjs.fromEvent(closeIcon, 'click').pipe(rxjs.switchMap(() => reset()), rxjs.takeUntil(unsubscribe$)).subscribe();
26047
26827
  rxjs.fromEvent(pictureIcon, 'click').pipe(rxjs.switchMap(() => util.getCanvasSize(video)), rxjs.switchMap(canvasSizeInfo => rxjs.from(checkConfirmImage(canvasSizeInfo)).pipe(rxjs.switchMap(needRetry => needRetry ? rxjs.of(true) : rxjs.from(config.confirmImage(canvasSizeInfo.canvasWidth, canvasSizeInfo.canvasHeight, imageData, canvas)).pipe(rxjs.map(confirmResp => !confirmResp))), rxjs.tap(() => {
26828
+ if (config.extraConfig.border == 'none') {
26829
+ util.hideElement(cardborderContainer);
26830
+ } else {
26831
+ util.showElement(cardborderContainer);
26832
+ }
26048
26833
  showVideoElement();
26049
26834
  util.hideElement(confirmImageContainer);
26050
26835
  }))), rxjs.switchMap(needRetry => needRetry ? rxjs.of(true) : config.extraConfig.continue === false ? reset() : rxjs.from(takeOtherImage()).pipe(rxjs.switchMap(needContinue => needContinue ? rxjs.of(true) : rxjs.of(false)), rxjs.tap(() => {
26836
+ if (config.extraConfig.border == 'none') {
26837
+ util.hideElement(cardborderContainer);
26838
+ } else {
26839
+ util.showElement(cardborderContainer);
26840
+ }
26051
26841
  showVideoElement();
26052
26842
  util.hideElement(checkOtherImageContainer);
26053
26843
  }), rxjs.switchMap(needContinue => needContinue ? rxjs.of(true) : reset()))), rxjs.takeUntil(unsubscribe$)).subscribe();
26054
- rxjs.merge(rxjs.fromEvent(window, 'resize'), rxjs.of(0)).pipe(rxjs.map(() => window.innerWidth >= 320 && window.innerHeight >= 500), rxjs.filter(x => x !== isValidScreenSize), rxjs.tap(x => isValidScreenSize = x), rxjs.tap(x => x ? util.hidePopup() : util.showPopup(translateService.translate('error.screenSize.title'), translateService.translate('error.screenSize.content'), false)), rxjs.takeUntil(unsubscribe$)).subscribe();
26844
+ rxjs.merge(rxjs.fromEvent(window, 'resize'), rxjs.of(0)).pipe(rxjs.map(() => window.innerWidth >= 320 && window.innerHeight >= 500), rxjs.filter(x => x !== isValidScreenSize), rxjs.tap(x => isValidScreenSize = x), rxjs.tap(x => x ? util.hidePopup() : util.showPopup(translateService.translate('sdk.general.insufficientScreen.title'), translateService.translate('sdk.general.insufficientScreen.content'), false)), rxjs.takeUntil(unsubscribe$)).subscribe();
26055
26845
  // Start
26056
26846
  // headerTitle.textContent = translateService.translate(
26057
- // 'liveness.header.liveness'
26847
+ // 'sdk.liveness.detection.header'
26058
26848
  // );
26059
26849
  util.showElement(pictureIcon);
26060
26850
  function main() {
@@ -26123,7 +26913,7 @@ function startExtra(config) {
26123
26913
 
26124
26914
  function SendRequestWithRetry$4(promiseFactory) {
26125
26915
  return util.retryPromiseWithCondition(promiseFactory, () => __awaiter(this, void 0, void 0, function* () {
26126
- return util.asyncShowErrorMessage(core.getTranslateInstance().translate('verify.error.serverError'), true);
26916
+ return util.asyncShowErrorMessage(core.getTranslateInstance().translate('sdk.general.error.alert.serverError'), true);
26127
26917
  }));
26128
26918
  }
26129
26919
  class ExtraModule {
@@ -26147,7 +26937,7 @@ class ExtraModule {
26147
26937
  })
26148
26938
  }));
26149
26939
  if (resp.retry) {
26150
- yield util.asyncShowPopup(translateService.translate('verify.error.blur'), translateService.translate('verify.error.blurDescribe'), true);
26940
+ yield util.asyncShowPopup(translateService.translate('sdk.verify.error.blurRetake.title'), translateService.translate('sdk.verify.error.blurRetake.content'), true);
26151
26941
  throw 'recognition failed';
26152
26942
  }
26153
26943
  result.push(resp);
@@ -26185,7 +26975,7 @@ class ExtraModule {
26185
26975
 
26186
26976
  function SendRequestWithRetry$3(promiseFactory) {
26187
26977
  return util.retryPromiseWithCondition(promiseFactory, () => __awaiter(this, void 0, void 0, function* () {
26188
- return util.asyncShowErrorMessage(core.getTranslateInstance().translate('verify.error.serverError'), true);
26978
+ return util.asyncShowErrorMessage(core.getTranslateInstance().translate('sdk.general.error.alert.serverError'), true);
26189
26979
  }));
26190
26980
  }
26191
26981
  class LivenessVerifyModule {
@@ -26233,22 +27023,22 @@ class LivenessVerifyModule {
26233
27023
  return resp.parameters;
26234
27024
  } catch (e) {
26235
27025
  let error = e;
26236
- let message = core.getTranslateInstance().translate('verify.error.serverError');
27026
+ let message = core.getTranslateInstance().translate('sdk.general.error.alert.serverError');
26237
27027
  while (error instanceof core.AuthmeError) {
26238
27028
  error = error.cause;
26239
27029
  }
26240
27030
  switch ((_b = (_a = error === null || error === void 0 ? void 0 : error.error) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.code) {
26241
27031
  case 'AuthMe.CustomerManagementService:000111':
26242
- message = core.getTranslateInstance().translate('livenessVerify.error.customerNotFound');
27032
+ message = core.getTranslateInstance().translate('sdk.general.verify.error.clientCustomerId.notFound');
26243
27033
  break;
26244
27034
  case 'AuthMe.CustomerManagementService:000131':
26245
- message = core.getTranslateInstance().translate('livenessVerify.error.deactivateCustomer');
27035
+ message = core.getTranslateInstance().translate('sdk.general.verify.error.clientCustomerId.deactivate');
26246
27036
  break;
26247
27037
  case 'AuthMe.CustomerManagementService:000132':
26248
- message = core.getTranslateInstance().translate('livenessVerify.error.customerInProgress');
27038
+ message = core.getTranslateInstance().translate('sdk.general.verify.error.clientCustomerId.inProgress');
26249
27039
  break;
26250
27040
  case 'AuthMe.CustomerManagementService:000202':
26251
- message = core.getTranslateInstance().translate('livenessVerify.error.unexpectedError');
27041
+ message = core.getTranslateInstance().translate('sdk.general.error.unexpectedError');
26252
27042
  break;
26253
27043
  default:
26254
27044
  break;
@@ -26413,7 +27203,7 @@ class LivenessVerifyModule {
26413
27203
 
26414
27204
  function SendRequestWithRetry$2(promiseFactory) {
26415
27205
  return util.retryPromiseWithCondition(promiseFactory, () => __awaiter(this, void 0, void 0, function* () {
26416
- return util.asyncShowErrorMessage(core.getTranslateInstance().translate('verify.error.serverError'), true);
27206
+ return util.asyncShowErrorMessage(core.getTranslateInstance().translate('sdk.general.error.alert.serverError'), true);
26417
27207
  }));
26418
27208
  }
26419
27209
  class LivenessModule {
@@ -26441,7 +27231,7 @@ class LivenessModule {
26441
27231
  try {
26442
27232
  const result = yield rxjs.firstValueFrom(startLiveness({
26443
27233
  init: () => __awaiter(this, void 0, void 0, function* () {
26444
- const resp = yield liveness.LivenessAPI.IdentityVerification.init(true);
27234
+ const resp = yield liveness.LivenessAPI.IdentityVerification.init(true, config.passive, config.compareCustomerClientId);
26445
27235
  id = resp.id;
26446
27236
  if (resp.parameters.pubKey) {
26447
27237
  yield this.fasService.setPublicKeyForJson(resp.parameters.pubKey);
@@ -26615,9 +27405,188 @@ class LivenessModule {
26615
27405
  }
26616
27406
  }
26617
27407
 
27408
+ function initFrameView(cardPoints, scanId, faceMode, scanView, cardType, cardTypeConfig, setBorderType, setCardBorderColor, setBorderSuccess) {
27409
+ return __awaiter(this, void 0, void 0, function* () {
27410
+ const scanAnimationContainer = document.querySelector('.scan');
27411
+ const successAnimationDom = document.querySelector('.success');
27412
+ document.querySelector('#authme_frame_border');
27413
+ const videoContainer = document.querySelector('.video-container');
27414
+ const windowWidth = videoContainer.offsetWidth;
27415
+ const windowHeight = videoContainer.offsetHeight;
27416
+ const lottieScanSetting = {
27417
+ scanAnimationContainer: scanAnimationContainer
27418
+ };
27419
+ const lottieSuccessSetting = {
27420
+ animationContainer: successAnimationDom
27421
+ };
27422
+ function frameImage(faceMode, zIndex, base64, color, opacity) {
27423
+ color = color !== null && color !== void 0 ? color : OcrFrame.imageColor;
27424
+ opacity = opacity !== null && opacity !== void 0 ? opacity : OcrFrame.imageOpacity;
27425
+ const rectX = cardPoints[0][0] * windowWidth;
27426
+ const rectY = cardPoints[0][1] * windowHeight;
27427
+ const rectWidth = cardPoints[1][0] * windowWidth - rectX;
27428
+ const rectHeight = cardPoints[3][1] * windowHeight - rectY;
27429
+ let domContainer = document.querySelector('#authme_frame_image');
27430
+ let domImage = document.querySelector('#authme_frame_image_svg');
27431
+ const domImageStyle = `
27432
+ width: 100%;
27433
+ height: 100%;
27434
+ background-color: ${color};
27435
+ opacity: ${opacity};
27436
+ -webkit-mask-image: url(data:image/svg+xml;base64,${base64});
27437
+ mask-image: url(data:image/svg+xml;base64,${base64});
27438
+ -webkit-mask-size: contain;
27439
+ mask-size: contain;
27440
+ mask-repeat: no-repeat no-repeat;
27441
+ mask-position: center center;
27442
+ `;
27443
+ if (!domContainer) {
27444
+ domContainer = document.createElement('div');
27445
+ domContainer.setAttribute('id', 'authme_frame_image');
27446
+ videoContainer.appendChild(domContainer);
27447
+ }
27448
+ if (!domImage) {
27449
+ domImage = document.createElement('div');
27450
+ domImage.setAttribute('id', 'authme_frame_image_svg');
27451
+ domContainer.appendChild(domImage);
27452
+ }
27453
+ if (faceMode === 'front') {
27454
+ domImage.classList.add('front');
27455
+ }
27456
+ domImage.setAttribute('style', domImageStyle);
27457
+ domImage.setAttribute('preserveAspectRatio', 'none');
27458
+ domContainer.setAttribute('style', `
27459
+ z-index: ${zIndex};
27460
+ position: absolute;
27461
+ left: ${rectX}px;
27462
+ top: ${rectY}px;
27463
+ width: ${rectWidth}px;
27464
+ height: ${rectHeight}px;
27465
+ opacity: ${opacity};
27466
+ `);
27467
+ }
27468
+ function frameText(zIndex, text, color, opacity) {
27469
+ color = color !== null && color !== void 0 ? color : OcrFrame.textColor;
27470
+ opacity = opacity !== null && opacity !== void 0 ? opacity : OcrFrame.textOpacity;
27471
+ const rectX = cardPoints[0][0] * windowWidth;
27472
+ const rectY = cardPoints[0][1] * windowHeight;
27473
+ const rectWidth = cardPoints[1][0] * windowWidth - rectX;
27474
+ const rectHeight = cardPoints[3][1] * windowHeight - rectY;
27475
+ let dom = document.querySelector('#authme_frame_text');
27476
+ if (!dom) {
27477
+ dom = document.createElement('div');
27478
+ dom.setAttribute('id', 'authme_frame_text');
27479
+ videoContainer.appendChild(dom);
27480
+ }
27481
+ dom.setAttribute('style', `
27482
+ z-index: ${zIndex};
27483
+ position: absolute;
27484
+ left: ${rectX}px;
27485
+ top: ${rectY}px;
27486
+ width: ${rectWidth}px;
27487
+ height: ${rectHeight}px;
27488
+ opacity: ${opacity};
27489
+ color: ${color};
27490
+ display: flex;
27491
+ align-items: center;
27492
+ justify-content: center;
27493
+ font-size: 60px;
27494
+ font-weight: 500;
27495
+ `);
27496
+ dom.textContent = text;
27497
+ }
27498
+ initSuccessAnimation(lottieSuccessSetting);
27499
+ const scanViewSetting = {
27500
+ document_type: '',
27501
+ border: {
27502
+ enable: true,
27503
+ type: OcrFrame.borderType,
27504
+ color: OcrFrame.borderColor,
27505
+ opacity: OcrFrame.borderOpacity
27506
+ },
27507
+ success: {
27508
+ enable: false,
27509
+ color: OcrFrame.successColor,
27510
+ opacity: 1
27511
+ },
27512
+ content: [],
27513
+ line: {
27514
+ enable: false,
27515
+ color: OcrFrame.lineColor,
27516
+ gradient: {
27517
+ enable: false,
27518
+ color: OcrFrame.lineGradient,
27519
+ opacity: OcrFrame.lineGradientOpacity
27520
+ }
27521
+ }
27522
+ };
27523
+ if (scanView) {
27524
+ Object.assign(scanViewSetting, scanView);
27525
+ }
27526
+ if (cardType.includes('Thickness')) {
27527
+ if (cardTypeConfig.mode === 'manual') {
27528
+ setBorderType({
27529
+ type: scanViewSetting.border.type,
27530
+ strokeOpacity: 0,
27531
+ color: scanViewSetting.border.color
27532
+ });
27533
+ setCardBorderColor(null);
27534
+ // success setting
27535
+ // TODO need to check the success style
27536
+ if (scanViewSetting.success.enable) {
27537
+ setBorderSuccess(scanViewSetting.success.color, scanViewSetting.success.opacity);
27538
+ }
27539
+ } else {
27540
+ setBorderType({
27541
+ type: scanViewSetting.border.type,
27542
+ strokeOpacity: 0,
27543
+ color: scanViewSetting.border.color
27544
+ });
27545
+ if (scanViewSetting.success.enable) {
27546
+ setBorderSuccess(scanViewSetting.success.color, 0);
27547
+ }
27548
+ }
27549
+ } else {
27550
+ if (scanViewSetting.border.enable) {
27551
+ setBorderType({
27552
+ type: scanViewSetting.border.type,
27553
+ strokeOpacity: scanViewSetting.border.opacity,
27554
+ color: scanViewSetting.border.color
27555
+ });
27556
+ setCardBorderColor(null);
27557
+ // success setting
27558
+ if (scanViewSetting.success.enable) {
27559
+ setBorderSuccess(scanViewSetting.success.color, scanViewSetting.success.opacity);
27560
+ }
27561
+ }
27562
+ }
27563
+ // scan setting
27564
+ if (scanViewSetting.line.enable) {
27565
+ lottieScanSetting['scanColor'] = scanViewSetting.line.color;
27566
+ if (scanViewSetting.line.gradient.enable) {
27567
+ lottieScanSetting['scanOpacity'] = scanViewSetting.line.gradient.opacity;
27568
+ lottieScanSetting['scanGradient'] = scanViewSetting.line.gradient.color;
27569
+ }
27570
+ initScanAnimation(lottieScanSetting);
27571
+ }
27572
+ // content setting
27573
+ resetFrame();
27574
+ for (let i = 0; i < scanViewSetting.content.length; i++) {
27575
+ const contentSetting = scanViewSetting.content[i];
27576
+ if (contentSetting.type === 'svg') {
27577
+ const imageData = yield idRecognition.initScanDocumentResourceBase64(scanId, contentSetting.content);
27578
+ frameImage(faceMode, i, imageData.data, contentSetting.color, contentSetting.opacity);
27579
+ }
27580
+ if (contentSetting.type === 'text') {
27581
+ frameText(i, contentSetting.content, contentSetting.color, contentSetting.opacity);
27582
+ }
27583
+ }
27584
+ });
27585
+ }
27586
+
26618
27587
  function SendRequestWithRetry$1(promiseFactory) {
26619
27588
  return util.retryPromiseWithCondition(promiseFactory, () => __awaiter(this, void 0, void 0, function* () {
26620
- return util.asyncShowErrorMessage(core.getTranslateInstance().translate('verify.error.serverError'), true);
27589
+ return util.asyncShowErrorMessage(core.getTranslateInstance().translate('sdk.general.error.alert.serverError'), true);
26621
27590
  }));
26622
27591
  }
26623
27592
  class MRZModule {
@@ -26684,7 +27653,7 @@ class MRZModule {
26684
27653
  expiredIn: resp.expiredIn
26685
27654
  });
26686
27655
  }),
26687
- ocrStart: (points, type, cardType, retry = false) => __awaiter(this, void 0, void 0, function* () {
27656
+ ocrStart: (points, type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, faceMode, cardType, retry = false) => __awaiter(this, void 0, void 0, function* () {
26688
27657
  yield this.mrzService.init();
26689
27658
  yield this.mrzService.setFrameSize(frameWidth, frameHeight);
26690
27659
  yield this.mrzService.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
@@ -26693,7 +27662,7 @@ class MRZModule {
26693
27662
  docInfos[type].ocrImg = null;
26694
27663
  docInfos[type].ocrOriginImg = null;
26695
27664
  } else {
26696
- const resp = yield SendRequestWithRetry$1(() => idRecognition.initScanDocument(scanId, idRecognition.twoWayAuthmeCardClassMap.toServer(type)));
27665
+ const resp = yield SendRequestWithRetry$1(() => idRecognition.initScanDocument(scanId, cardType));
26697
27666
  if (docInfos[type]) {
26698
27667
  docInfos[type].docId = resp.scanDocumentId;
26699
27668
  } else {
@@ -26705,6 +27674,9 @@ class MRZModule {
26705
27674
  fraudResult: null
26706
27675
  };
26707
27676
  }
27677
+ if (resp.scanView) {
27678
+ initFrameView(points, scanId, faceMode, resp.scanView, cardType, '', setBorderType, setCardBorderColor, setBorderSuccess);
27679
+ }
26708
27680
  }
26709
27681
  return true;
26710
27682
  }),
@@ -26758,6 +27730,7 @@ class MRZModule {
26758
27730
  }
26759
27731
  }),
26760
27732
  cardTypes: config.cardTypes,
27733
+ cardTypeConfigs: config.cardTypeConfigs,
26761
27734
  antiFraudStart: () => __awaiter(this, void 0, void 0, function* () {
26762
27735
  throw 'MRZ Fraud Not Supported.';
26763
27736
  }),
@@ -26816,9 +27789,9 @@ function SendRequestWithRetry(promiseFactory, options = {}) {
26816
27789
  return util.retryPromiseWithCondition(promiseFactory, e => __awaiter(this, void 0, void 0, function* () {
26817
27790
  var _a, _b, _c;
26818
27791
  const errorParams = (options === null || options === void 0 ? void 0 : options.onErrorHandler) ? options === null || options === void 0 ? void 0 : options.onErrorHandler(e) : {};
26819
- return util.asyncShowErrorMessage(core.getTranslateInstance().translate((_a = errorParams === null || errorParams === void 0 ? void 0 : errorParams.errorText) !== null && _a !== void 0 ? _a : 'verify.error.serverError'), errorParams.showRetryButton, {
27792
+ return util.asyncShowErrorMessage(core.getTranslateInstance().translate((_a = errorParams === null || errorParams === void 0 ? void 0 : errorParams.errorText) !== null && _a !== void 0 ? _a : 'sdk.general.error.alert.serverError'), errorParams.showRetryButton, {
26820
27793
  callback: errorParams === null || errorParams === void 0 ? void 0 : errorParams.onButtonClick,
26821
- buttonText: core.getTranslateInstance().translate((_b = errorParams === null || errorParams === void 0 ? void 0 : errorParams.buttonText) !== null && _b !== void 0 ? _b : 'verify.error.retryBtn'),
27794
+ buttonText: core.getTranslateInstance().translate((_b = errorParams === null || errorParams === void 0 ? void 0 : errorParams.buttonText) !== null && _b !== void 0 ? _b : 'sdk.general.error.retry'),
26822
27795
  titleText: core.getTranslateInstance().translate((_c = errorParams === null || errorParams === void 0 ? void 0 : errorParams.titleText) !== null && _c !== void 0 ? _c : ''),
26823
27796
  showErrorMessageHandler: errorParams === null || errorParams === void 0 ? void 0 : errorParams.showErrorMessageHandler
26824
27797
  });
@@ -26979,7 +27952,7 @@ class OCRModule {
26979
27952
  yield this.antiFraudInstance.destroy();
26980
27953
  });
26981
27954
  }
26982
- run(config, cardTypes) {
27955
+ run(config, cardTypes, cardTypeConfigs) {
26983
27956
  return __awaiter(this, void 0, void 0, function* () {
26984
27957
  let scanId = '';
26985
27958
  let frameHeight = 0;
@@ -27025,6 +27998,7 @@ class OCRModule {
27025
27998
  const translateService = core.getTranslateInstance();
27026
27999
  const eventNameWrong$ = new rxjs.Subject();
27027
28000
  return yield rxjs.firstValueFrom(rxjs.race(startOCR({
28001
+ cardTypeConfigs: cardTypeConfigs,
27028
28002
  ocrConfig: config,
27029
28003
  init: (width, height) => __awaiter(this, void 0, void 0, function* () {
27030
28004
  var _a, _b, _c, _d;
@@ -27038,9 +28012,9 @@ class OCRModule {
27038
28012
  const _error = e;
27039
28013
  if (((_c = (_b = (_a = _error === null || _error === void 0 ? void 0 : _error.cause) === null || _a === void 0 ? void 0 : _a.meta) === null || _b === void 0 ? void 0 : _b.responseContent) === null || _c === void 0 ? void 0 : _c.code) === 7) {
27040
28014
  return {
27041
- buttonText: 'verify.error.wrongEventCode.close',
27042
- titleText: 'eventName.invalid.promptTitle',
27043
- errorText: 'verify.error.wrongEventCode',
28015
+ buttonText: 'sdk.general.confirm',
28016
+ titleText: 'sdk.general.error.eventNameInvalid.title',
28017
+ errorText: 'sdk.general.error.eventNameInvalid.content',
27044
28018
  onButtonClick: () => {
27045
28019
  eventNameWrong$.next({
27046
28020
  isSuccess: false,
@@ -27077,9 +28051,8 @@ class OCRModule {
27077
28051
  expiredIn: resp.expiredIn
27078
28052
  });
27079
28053
  }),
27080
- ocrStart: (points, type, cardType, retry = false) => __awaiter(this, void 0, void 0, function* () {
27081
- const _service = type === engine.EAuthMeCardClass.TWN_ResidentCard_Back // workaround: resident card need MRZ, refactor later.
27082
- ? this.residentCardMrzService : this.ocrService;
28054
+ ocrStart: (points, type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, faceMode, cardType, retry = false) => __awaiter(this, void 0, void 0, function* () {
28055
+ const _service = this.ocrService;
27083
28056
  yield _service.init();
27084
28057
  yield _service.setFrameSize(frameWidth, frameHeight);
27085
28058
  yield _service.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
@@ -27088,6 +28061,7 @@ class OCRModule {
27088
28061
  const oldParams = yield this.ocrService.getParams();
27089
28062
  newParams[F_IMAGE_BLUE_TH] = 750;
27090
28063
  newParams['fCardMatchTh'] = 0.5;
28064
+ newParams['fImageReflectiveTriggerTh'] = 0.15;
27091
28065
  yield this.ocrService.setParams(Object.assign(Object.assign({}, oldParams), newParams));
27092
28066
  if (cardTypes.map(idRecognition.mapCardtypeToAuthmeClass).filter(n => n == engine.EAuthMeCardClass.Unknown).length > 0) {
27093
28067
  this.ocrService.setOption({
@@ -27117,16 +28091,320 @@ class OCRModule {
27117
28091
  fraudResult: null
27118
28092
  };
27119
28093
  }
28094
+ const scanView = resp.scanView ? true : false;
28095
+ const lottieScanSetting = {
28096
+ scanAnimationContainer: scanAnimationContainer
28097
+ };
28098
+ const lottieSuccessSetting = {
28099
+ animationContainer: successAnimationContainer
28100
+ };
28101
+ initSuccessAnimation(lottieSuccessSetting);
28102
+ const scanViewSetting = {
28103
+ document_type: '',
28104
+ border: {
28105
+ enable: true,
28106
+ type: OcrFrame.borderType,
28107
+ color: OcrFrame.borderColor,
28108
+ opacity: OcrFrame.borderOpacity
28109
+ },
28110
+ success: {
28111
+ enable: true,
28112
+ color: OcrFrame.successColor,
28113
+ opacity: 1
28114
+ },
28115
+ content: [],
28116
+ line: {
28117
+ enable: true,
28118
+ color: OcrFrame.lineColor,
28119
+ gradient: {
28120
+ enable: true,
28121
+ color: OcrFrame.lineGradient,
28122
+ opacity: OcrFrame.lineGradientOpacity
28123
+ }
28124
+ }
28125
+ };
28126
+ if (scanView) {
28127
+ Object.assign(scanViewSetting, resp.scanView);
28128
+ }
28129
+ // border setting
28130
+ if (scanViewSetting.border.enable) {
28131
+ setBorderType({
28132
+ type: scanViewSetting.border.type,
28133
+ strokeOpacity: scanViewSetting.border.opacity,
28134
+ color: scanViewSetting.border.color
28135
+ });
28136
+ setCardBorderColor(null);
28137
+ // success setting
28138
+ if (scanViewSetting.success.enable) {
28139
+ setBorderSuccess(scanViewSetting.success.color, scanViewSetting.success.opacity);
28140
+ }
28141
+ }
28142
+ // scan setting
28143
+ if (scanViewSetting.line.enable) {
28144
+ lottieScanSetting['scanColor'] = scanViewSetting.line.color;
28145
+ if (scanViewSetting.line.gradient.enable) {
28146
+ lottieScanSetting['scanOpacity'] = scanViewSetting.line.gradient.opacity;
28147
+ lottieScanSetting['scanGradient'] = scanViewSetting.line.gradient.color;
28148
+ }
28149
+ initScanAnimation(lottieScanSetting);
28150
+ }
28151
+ // content setting
28152
+ resetFrame();
28153
+ for (let i = 0; i < scanViewSetting.content.length; i++) {
28154
+ const contentSetting = scanViewSetting.content[i];
28155
+ if (contentSetting.type === 'svg') {
28156
+ const imageData = yield idRecognition.initScanDocumentResourceBase64(scanId, contentSetting.content);
28157
+ frameImage(faceMode, i, imageData.data, contentSetting.color, contentSetting.opacity);
28158
+ }
28159
+ if (contentSetting.type === 'text') {
28160
+ frameText(i, contentSetting.content, contentSetting.color, contentSetting.opacity);
28161
+ }
28162
+ }
27120
28163
  }
27121
28164
  return true;
27122
28165
  }),
28166
+ thicknessStart: (points, type, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, faceMode, cardType, cardTypeConfig, retry = false) => __awaiter(this, void 0, void 0, function* () {
28167
+ const _service = this.antiFraudInstance;
28168
+ yield _service.init();
28169
+ yield _service.setFrameSize(frameWidth, frameHeight);
28170
+ yield _service.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
28171
+ const newParams = {};
28172
+ const oldParams = yield _service.getParams();
28173
+ if (config.antiFraudIMetalTagValidCountTh !== false) newParams['iMetalTagValidCountTh'] = config.antiFraudIMetalTagValidCountTh;
28174
+ newParams['timeoutSec'] = 1000;
28175
+ newParams['fCardMatchTh'] = 0.5;
28176
+ newParams['fImageReflectiveTriggerTh'] = 0.15;
28177
+ newParams['fImageThicknessTh'] = 0.3;
28178
+ newParams['fCardDeformationTh'] = 12;
28179
+ yield _service.setParams(Object.assign(Object.assign({}, oldParams), newParams));
28180
+ _service.setOption({
28181
+ key: 'thickness_detector',
28182
+ value: 'enable'
28183
+ });
28184
+ _service.setOption({
28185
+ key: 'ignore_card_type_checking',
28186
+ value: 'enable'
28187
+ });
28188
+ yield _service.setStage([engine.EAuthMeIDCardAntiFraudStage.Down]);
28189
+ yield _service.startSession();
28190
+ let thicknessWelcomeSetting = idRecognition.thicknessDefaultConfig.thicknessWelcomeSetting;
28191
+ if (retry) {
28192
+ docInfos[cardType].ocrImg = null;
28193
+ docInfos[cardType].ocrOriginImg = null;
28194
+ } else {
28195
+ const resp = yield SendRequestWithRetry(() => idRecognition.initScanDocument(scanId, cardType));
28196
+ if (docInfos[cardType]) {
28197
+ docInfos[cardType].docId = resp.scanDocumentId;
28198
+ } else {
28199
+ docInfos[cardType] = {
28200
+ docId: resp.scanDocumentId,
28201
+ ocrImg: null,
28202
+ ocrOriginImg: null,
28203
+ fraudOriginImg: null,
28204
+ fraudResult: null
28205
+ };
28206
+ }
28207
+ // TODO assign
28208
+ if (resp.welcome) {
28209
+ thicknessWelcomeSetting = resp.welcome;
28210
+ } else {
28211
+ thicknessWelcomeSetting.title.text = translateService.translate(thicknessWelcomeSetting.title.text);
28212
+ thicknessWelcomeSetting.subtitle.text = translateService.translate(thicknessWelcomeSetting.subtitle.text);
28213
+ thicknessWelcomeSetting.content.text = translateService.translate(thicknessWelcomeSetting.content.text);
28214
+ }
28215
+ const scanView = resp.scanView ? true : false;
28216
+ const lottieScanSetting = {
28217
+ scanAnimationContainer: scanAnimationContainer
28218
+ };
28219
+ const lottieSuccessSetting = {
28220
+ animationContainer: successAnimationContainer
28221
+ };
28222
+ initSuccessAnimation(lottieSuccessSetting);
28223
+ const scanViewSetting = {
28224
+ document_type: '',
28225
+ border: {
28226
+ enable: true,
28227
+ type: OcrFrame.borderType,
28228
+ color: OcrFrame.borderColor,
28229
+ opacity: OcrFrame.borderOpacity
28230
+ },
28231
+ success: {
28232
+ enable: false,
28233
+ color: OcrFrame.successColor,
28234
+ opacity: 1
28235
+ },
28236
+ content: [],
28237
+ line: {
28238
+ enable: false,
28239
+ color: OcrFrame.lineColor,
28240
+ gradient: {
28241
+ enable: false,
28242
+ color: OcrFrame.lineGradient,
28243
+ opacity: OcrFrame.lineGradientOpacity
28244
+ }
28245
+ }
28246
+ };
28247
+ if (scanView) {
28248
+ Object.assign(scanViewSetting, resp.scanView);
28249
+ }
28250
+ // TODO for test, remove for prod
28251
+ // my number card
28252
+ //
28253
+ // if (cardType === 'JPN_IDCard_Thickness') {
28254
+ // frameImage(
28255
+ // faceMode,
28256
+ // 1,
28257
+ // 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuWcluWxpF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMzM5IDIyMC40IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMzkgMjIwLjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7b3BhY2l0eTowLjQ7ZmlsbDojRkZGRkZGO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjI7fQoJLnN0MntmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjEuNTt9Cgkuc3Qze29wYWNpdHk6MC4yO2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDR7b3BhY2l0eTowLjU7ZmlsbDojRkZGRkZGO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0NXtmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjIuOTIwMjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTExLDE3LjVoODhjMS4xLDAsMiwwLjksMiwydjEzYzAsMS4xLTAuOSwyLTIsMkgxMWMtMS4xLDAtMi0wLjktMi0ydi0xM0M5LDE4LjQsOS45LDE3LjUsMTEsMTcuNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTEsNDIuNWgyMThjMS4xLDAsMiwwLjksMiwydjEzYzAsMS4xLTAuOSwyLTIsMkgxMWMtMS4xLDAtMi0wLjktMi0ydi0xM0M5LDQzLjQsOS45LDQyLjUsMTEsNDIuNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTIyLDc3LjVoMjA2YzEuMSwwLDIsMC45LDIsMnY5YzAsMS4xLTAuOSwyLTIsMkgxMjJjLTEuMSwwLTItMC45LTItMnYtOUMxMjAsNzguNCwxMjAuOSw3Ny41LDEyMiw3Ny41eiIvPgoJCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0yODMsNTkuNWg0MWMxLjEsMCwyLDAuOSwyLDJ2OWMwLDEuMS0wLjksMi0yLDJoLTQxYy0xLjEsMC0yLTAuOS0yLTJ2LTlDMjgxLDYwLjQsMjgxLjksNTkuNSwyODMsNTkuNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjk5LDE1LjVoMjNjMy45LDAsNywzLjEsNyw3djI1YzAsMy45LTMuMSw3LTcsN2gtMjNjLTMuOSwwLTctMy4xLTctN3YtMjVDMjkyLDE4LjcsMjk1LjIsMTUuNSwyOTksMTUuNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QyIiBkPSJNMTIsOC41aDMxNWM1LjUsMCwxMCw0LjUsMTAsMTB2MTkwYzAsNS41LTQuNSwxMC0xMCwxMEgxMmMtNS41LDAtMTAtNC41LTEwLTEwdi0xOTBDMiwxMyw2LjUsOC41LDEyLDguNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QzIiBkPSJNMTEsNjkuNWg5MGMxLjEsMCwyLDAuOSwyLDJ2MTE1YzAsMS4xLTAuOSwyLTIsMkgxMWMtMS4xLDAtMi0wLjktMi0ydi0xMTVDOSw3MC40LDkuOSw2OS41LDExLDY5LjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0NCIgZD0iTTEwLDE4OC41di04LjJjMCwwLDI1LjEtNS4zLDI4LjItMTNsMy4xLTcuN2MwLDAtOC4zLTcuMS04LjktMTcuN2MwLDAtMy4xLDAuOS00LTkuN3MyLjItNy43LDIuMi03LjcKCQkJcy0xLjktMTQuNywwLTE4LjljMS45LTQuMSwwLjktMTUuNiwyMi4yLTIxLjJDNzQsNzksODEuMSw5Ni43LDgxLjEsOTYuN3MzLjcsMi40LDQuMyw4LjVjMC42LDYuMiwwLjksMTkuMiwwLjksMTkuMgoJCQlzMy40LTAuOSwyLjgsNWMtMC42LDUuOS0zLjEsMTMuOC01LjUsMTNjMCwwLTEuMiwxMy4zLTgsMTUuNmMwLDAsMS41LDEzLDkuNSwxNS4zczE4LDYuMiwxOCw2LjJ2OUwxMCwxODguNUwxMCwxODguNXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMTEsNzAuNWg5MGMwLjYsMCwxLDAuNCwxLDF2MTE1YzAsMC42LTAuNCwxLTEsMUgxMWMtMC42LDAtMS0wLjQtMS0xdi0xMTVDMTAsNzEsMTAuNSw3MC41LDExLDcwLjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTEyMSwxMTguNWMwLTAuNiwwLjQtMSwxLTFoMjA2YzAuNiwwLDEsMC40LDEsMXY1OWMwLDAuNi0wLjQsMS0xLDFIMTIyYy0wLjYsMC0xLTAuNC0xLTFWMTE4LjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTIxMyw5OS41YzAtMC42LDAuNC0xLDEtMWgxMTRjMC42LDAsMSwwLjQsMSwxdjEyYzAsMC42LTAuNCwxLTEsMUgyMTRjLTAuNiwwLTEtMC40LTEtMVY5OS41eiIvPgoJCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xMjEsMTMwLjVoMjA4Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEyMSIgeTE9IjE0Ni41IiB4Mj0iMzI5IiB5Mj0iMTQ2LjUiLz4KCQk8bGluZSBjbGFzcz0ic3QxIiB4MT0iMTIxIiB5MT0iMTYyLjUiIHgyPSIzMzAiIHkyPSIxNjIuNSIvPgoJCTxsaW5lIGNsYXNzPSJzdDEiIHgxPSIyNDciIHkxPSI5OC41IiB4Mj0iMjQ3IiB5Mj0iMTEyLjUiLz4KCTwvZz4KCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik0xMS41LDEuOWgzMTZjNS41LDAsMTAsNC40LDEwLDkuOHYxOTcuMWMwLDUuNC00LjUsOS44LTEwLDkuOGgtMzE2Yy01LjUsMC0xMC00LjQtMTAtOS44VjExLjYKCQlDMS41LDYuMyw2LDEuOSwxMS41LDEuOXoiLz4KPC9nPgo8L3N2Zz4K',
28258
+ // '#fff',
28259
+ // 1
28260
+ // );
28261
+ // }
28262
+ //
28263
+ // // driver
28264
+ //
28265
+ // if (cardType === 'JPN_DriverLicense_Thickness') {
28266
+ // frameImage(
28267
+ // faceMode,
28268
+ // 1,
28269
+ // 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuWcluWxpF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMzM5IDIyMC40IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMzkgMjIwLjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7b3BhY2l0eTowLjI7ZmlsbDojRkZGRkZGO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0MXtmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjI7fQoJLnN0MntvcGFjaXR5OjAuNDtmaWxsOiNGRkZGRkY7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3Qze29wYWNpdHk6MC41O2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDR7ZmlsbDpub25lO3N0cm9rZTojRkZGRkZGO3N0cm9rZS13aWR0aDoxLjU7fQoJLnN0NXtmaWxsOm5vbmU7c3Ryb2tlOiNGRkZGRkY7c3Ryb2tlLXdpZHRoOjIuOTIwMjt9Cjwvc3R5bGU+CjxnPgoJPGc+CgkJPHBhdGggY2xhc3M9InN0MCIgZD0iTTIzMi41LDY1LjVoOTFjMS4xLDAsMiwwLjksMiwydjExOWMwLDEuMS0wLjksMi0yLDJoLTkxYy0xLjEsMC0yLTAuOS0yLTJ2LTExOQoJCQlDMjMwLjUsNjYuNCwyMzEuNCw2NS41LDIzMi41LDY1LjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTIzMi41LDY2LjVoOTFjMC42LDAsMSwwLjQsMSwxdjExOWMwLDAuNi0wLjQsMS0xLDFoLTkxYy0wLjYsMC0xLTAuNC0xLTF2LTExOUMyMzEuNSw2NywyMzIsNjYuNSwyMzIuNSw2Ni41CgkJCXoiLz4KCQk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjAuNSw1MC41aDI5OGMzLjksMCw3LDMuMSw3LDd2MTQ0YzAsMy45LTMuMSw3LTcsN2gtMjk4Yy0zLjksMC03LTMuMS03LTd2LTE0NAoJCQlDMTMuNSw1My43LDE2LjcsNTAuNSwyMC41LDUwLjV6Ii8+CgkJPHBhdGggY2xhc3M9InN0MSIgZD0iTTIxLDE3LjVoMjk3YzQuMSwwLDcuNSwzLjQsNy41LDcuNWwwLDBjMCw0LjEtMy40LDcuNS03LjUsNy41SDIxYy00LjEsMC03LjUtMy40LTcuNS03LjVsMCwwCgkJCUMxMy41LDIwLjksMTYuOSwxNy41LDIxLDE3LjV6Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjM4LjUiIHkxPSIxNi41IiB4Mj0iMzguNSIgeTI9IjMyLjUiLz4KCQk8bGluZSBjbGFzcz0ic3QxIiB4MT0iMjEyLjciIHkxPSIxNy41IiB4Mj0iMjEyLjciIHkyPSIzMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEyLjUiIHkxPSI2NC41IiB4Mj0iMzI2LjUiIHkyPSI2NC41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEyLjUiIHkxPSI4MC41IiB4Mj0iMjI3LjUiIHkyPSI4MC41Ii8+CgkJPHJlY3QgeD0iMTIuNSIgeT0iODEuNSIgY2xhc3M9InN0MiIgd2lkdGg9IjIwMSIgaGVpZ2h0PSIyMCIvPgoJCTxyZWN0IHg9IjEyMi41IiB5PSIxNjguNSIgY2xhc3M9InN0MSIgd2lkdGg9Ijg4IiBoZWlnaHQ9IjM2Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEzMy41IiB5MT0iMTg1LjUiIHgyPSIyMTEuNSIgeTI9IjE4NS41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjEzNC41IiB5MT0iMTY3LjUiIHgyPSIxMzQuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE0NS41IiB5MT0iMTY3LjUiIHgyPSIxNDUuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE3OC41IiB5MT0iMTY3LjUiIHgyPSIxNzguNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE4OS41IiB5MT0iMTY3LjUiIHgyPSIxODkuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjIwMC41IiB5MT0iMTY3LjUiIHgyPSIyMDAuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE1Ni41IiB5MT0iMTY3LjUiIHgyPSIxNTYuNSIgeTI9IjIwMy41Ii8+CgkJPGxpbmUgY2xhc3M9InN0MSIgeDE9IjE2Ny41IiB5MT0iMTY3LjUiIHgyPSIxNjcuNSIgeTI9IjIwMy41Ii8+CgkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzMS41LDE4Ny41di04LjJjMCwwLDI1LjEtNS4zLDI4LjItMTNsMy4xLTcuN2MwLDAtOC4zLTcuMS04LjktMTcuN2MwLDAtMy4xLDAuOS00LTkuNwoJCQljLTAuOS0xMC42LDIuMi03LjcsMi4yLTcuN3MtMS45LTE0LjcsMC0xOC45YzEuOS00LjEsMC45LTE1LjYsMjIuMi0yMS4yYzIxLjMtNS42LDI4LjMsMTIuMSwyOC4zLDEyLjFzMy43LDIuNCw0LjMsOC41CgkJCWMwLjYsNi4yLDAuOSwxOS4yLDAuOSwxOS4yczMuNC0wLjksMi44LDVjLTAuNiw1LjktMy4xLDEzLjgtNS41LDEzYzAsMC0xLjIsMTMuMy04LDE1LjZjMCwwLDEuNSwxMyw5LjUsMTUuM2M4LDIuNCwxOCw2LjIsMTgsNi4yCgkJCXY5TDIzMS41LDE4Ny41TDIzMS41LDE4Ny41eiIvPgoJCTxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0xMS41LDguNWgzMTZjNS41LDAsMTAsNC41LDEwLDEwdjE5MGMwLDUuNS00LjUsMTAtMTAsMTBoLTMxNmMtNS41LDAtMTAtNC41LTEwLTEwdi0xOTAKCQkJQzEuNSwxMyw2LDguNSwxMS41LDguNXoiLz4KCTwvZz4KCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik0xMS41LDEuOWgzMTZjNS41LDAsMTAsNC40LDEwLDkuOHYxOTcuMWMwLDUuNC00LjUsOS44LTEwLDkuOGgtMzE2Yy01LjUsMC0xMC00LjQtMTAtOS44VjExLjYKCQlDMS41LDYuMyw2LDEuOSwxMS41LDEuOXoiLz4KPC9nPgo8L3N2Zz4K',
28270
+ // '#fff',
28271
+ // 1
28272
+ // );
28273
+ // }
28274
+ //
28275
+ // // resident
28276
+ //
28277
+ // if (cardType === 'JPN_ResidentCard_Thickness') {
28278
+ // frameImage(
28279
+ // faceMode,
28280
+ // 1,
28281
+ // 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjIuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuWcluWxpF8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMzM5IDIyMC40IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMzkgMjIwLjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDpub25lO3N0cm9rZTojRkZGRkZGO3N0cm9rZS13aWR0aDoxLjU7fQoJLnN0MXtvcGFjaXR5OjAuNDtmaWxsOiNGRkZGRkY7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3Qye29wYWNpdHk6MC4yO2ZpbGw6I0ZGRkZGRjtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDN7ZmlsbDpub25lO3N0cm9rZTojRkZGRkZGO3N0cm9rZS13aWR0aDoyO30KCS5zdDR7b3BhY2l0eTowLjQ7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkZGRkZGO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0NXtvcGFjaXR5OjAuNTtmaWxsOiNGRkZGRkY7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3Q2e2ZpbGw6bm9uZTtzdHJva2U6I0ZGRkZGRjtzdHJva2Utd2lkdGg6Mi45MjAyO30KPC9zdHlsZT4KPGc+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTEuNiw5LjJoMzE2YzUuNSwwLDEwLDQuNSwxMCwxMHYxODkuN2MwLDUuNS00LjUsMTAtMTAsMTBoLTMxNmMtNS41LDAtMTAtNC41LTEwLTEwVjE5LjIKCQlDMS42LDEzLjcsNi4xLDkuMiwxMS42LDkuMnoiLz4KCTxyZWN0IHg9IjEuNiIgeT0iMTguMiIgY2xhc3M9InN0MSIgd2lkdGg9IjMzNiIgaGVpZ2h0PSIxNiIvPgoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTMuNiwxOTMuOWgyNDFjMS4xLDAsMiwwLjksMiwydjEyYzAsMS4xLTAuOSwyLTIsMkgzLjZjLTEuMSwwLTItMC45LTItMnYtMTJDMS42LDE5NC44LDIuNSwxOTMuOSwzLjYsMTkzLjl6IgoJCS8+Cgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNODMuNiwxMTRoMTQ5YzEuMSwwLDIsMC45LDIsMnYyNGMwLDEuMS0wLjksMi0yLDJoLTE0OWMtMS4xLDAtMi0wLjktMi0ydi0yNEM4MS42LDExNC45LDgyLjUsMTE0LDgzLjYsMTE0eiIKCQkvPgoJPHBhdGggY2xhc3M9InN0MiIgZD0iTTIzOC42LDY0LjFoOTEuOGMxLjEsMCwyLDAuOSwyLDJ2MTE5YzAsMS4xLTAuOSwyLTIsMmgtOTEuOGMtMS4xLDAtMi0wLjktMi0ydi0xMTkKCQlDMjM2LjYsNjUsMjM3LjUsNjQuMSwyMzguNiw2NC4xeiIvPgoJPHBhdGggY2xhc3M9InN0MiIgZD0iTTIzOC42LDY0LjFoOTEuOGMxLjEsMCwyLDAuOSwyLDJ2MTE5YzAsMS4xLTAuOSwyLTIsMmgtOTEuOGMtMS4xLDAtMi0wLjktMi0ydi0xMTkKCQlDMjM2LjYsNjUsMjM3LjUsNjQuMSwyMzguNiw2NC4xeiIvPgoJPHBhdGggY2xhc3M9InN0MyIgZD0iTTIzOC42LDY1LjFoOTEuOGMwLjYsMCwxLDAuNCwxLDF2MTE5YzAsMC42LTAuNCwxLTEsMWgtOTEuOGMtMC42LDAtMS0wLjQtMS0xdi0xMTkKCQlDMjM3LjYsNjUuNSwyMzguMSw2NS4xLDIzOC42LDY1LjF6Ii8+Cgk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMTkxLjYsMTc3LjlsLTUtNmw1LTZsMCwwbDUsNkwxOTEuNiwxNzcuOUwxOTEuNiwxNzcuOXoiLz4KCTxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik0yMjYuNiwxNzcuOWwtNS02bDUtNmwwLDBsNSw2TDIyNi42LDE3Ny45TDIyNi42LDE3Ny45eiIvPgoJPHBhdGggY2xhc3M9InN0NCIgZD0iTTIxOS42LDE3MS45bDUsNmwwLDBoLTMxbDUtNmwtNS02aDMxTDIxOS42LDE3MS45eiIvPgoJPHBhdGggY2xhc3M9InN0NSIgZD0iTTIzOC42LDE4Ny4yVjE3OWMwLDAsMjUuMS01LjMsMjguMi0xM2wzLjEtNy43YzAsMC04LjMtNy4xLTguOS0xNy43YzAsMC0zLjEsMC45LTQtOS43CgkJYy0wLjktMTAuNiwyLjItNy43LDIuMi03LjdzLTEuOS0xNC43LDAtMTguOWMxLjgtNC4xLDAuOS0xNS42LDIyLjItMjEuMmMyMS4zLTUuNiwyOC4zLDEyLjEsMjguMywxMi4xczMuNywyLjQsNC4zLDguNQoJCWMwLjYsNi4yLDAuOSwxOS4yLDAuOSwxOS4yczMuNC0wLjksMi44LDVjLTAuNiw1LjktMy4xLDEzLjgtNS41LDEzYzAsMC0xLjIsMTMuMy04LDE1LjZjMCwwLDEuNSwxMyw5LjUsMTUuM2M4LDIuNCwxOCw2LjIsMTgsNi4yCgkJdjlMMjM4LjYsMTg3LjJMMjM4LjYsMTg3LjJ6Ii8+Cgk8cGF0aCBjbGFzcz0ic3Q2IiBkPSJNMTEuNiwyLjJoMzE2YzUuNSwwLDEwLDQuNCwxMCw5Ljh2MTk3LjFjMCw1LjQtNC41LDkuOC0xMCw5LjhoLTMxNmMtNS41LDAtMTAtNC40LTEwLTkuOFYxMgoJCUMxLjYsNi42LDYuMSwyLjIsMTEuNiwyLjJ6Ii8+CjwvZz4KPC9zdmc+Cg==',
28282
+ // '#fff',
28283
+ // 1
28284
+ // );
28285
+ // }
28286
+ // border setting
28287
+ if (scanViewSetting.border.enable && cardTypeConfig.mode === 'manual') {
28288
+ setBorderType({
28289
+ type: scanViewSetting.border.type,
28290
+ strokeOpacity: 0,
28291
+ color: scanViewSetting.border.color
28292
+ });
28293
+ setCardBorderColor(null);
28294
+ // success setting
28295
+ // TODO need to check the success style
28296
+ if (scanViewSetting.success.enable) {
28297
+ setBorderSuccess(scanViewSetting.success.color, scanViewSetting.success.opacity);
28298
+ }
28299
+ } else {
28300
+ setBorderType({
28301
+ type: scanViewSetting.border.type,
28302
+ strokeOpacity: 0,
28303
+ color: scanViewSetting.border.color
28304
+ });
28305
+ if (scanViewSetting.success.enable) {
28306
+ setBorderSuccess(scanViewSetting.success.color, 0);
28307
+ }
28308
+ }
28309
+ // scan setting
28310
+ if (scanViewSetting.line.enable) {
28311
+ lottieScanSetting['scanColor'] = scanViewSetting.line.color;
28312
+ if (scanViewSetting.line.gradient.enable) {
28313
+ lottieScanSetting['scanOpacity'] = scanViewSetting.line.gradient.opacity;
28314
+ lottieScanSetting['scanGradient'] = scanViewSetting.line.gradient.color;
28315
+ }
28316
+ initScanAnimation(lottieScanSetting);
28317
+ }
28318
+ // content setting
28319
+ resetFrame();
28320
+ for (let i = 0; i < scanViewSetting.content.length; i++) {
28321
+ const contentSetting = scanViewSetting.content[i];
28322
+ if (contentSetting.type === 'svg') {
28323
+ const imageData = yield idRecognition.initScanDocumentResourceBase64(scanId, contentSetting.content);
28324
+ frameImage(faceMode, i, imageData.data, contentSetting.color, contentSetting.opacity);
28325
+ }
28326
+ if (contentSetting.type === 'text') {
28327
+ frameText(i, contentSetting.content, contentSetting.color, contentSetting.opacity);
28328
+ }
28329
+ }
28330
+ }
28331
+ return {
28332
+ thicknessWelcomeSetting
28333
+ };
28334
+ }),
28335
+ onThicknessFrame: (data, _base64, cardType, type) => __awaiter(this, void 0, void 0, function* () {
28336
+ var _e, _f;
28337
+ nextDebugRound(type);
28338
+ const antiFraudRecogitionResult = yield functionLogging(() => __awaiter(this, void 0, void 0, function* () {
28339
+ var _g;
28340
+ return yield (_g = this.antiFraudInstance) === null || _g === void 0 ? void 0 : _g.recognition(data);
28341
+ }), {
28342
+ runFunction: util.RUN_FUNCTION_NAME.ANTI_FARUD_RECOGNITION,
28343
+ isAntiFraud: true
28344
+ });
28345
+ if (!cardType) {
28346
+ return antiFraudRecogitionResult;
28347
+ }
28348
+ if (this.canvas) {
28349
+ const debugData = yield (_e = this.antiFraudInstance) === null || _e === void 0 ? void 0 : _e.getDebugImageData(data);
28350
+ const ctx = this.canvas.getContext('2d');
28351
+ this.canvas.width = frameWidth;
28352
+ this.canvas.height = frameHeight;
28353
+ ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
28354
+ const imgData = ctx.createImageData(frameWidth, frameHeight);
28355
+ imgData.data.set(debugData);
28356
+ ctx.putImageData(imgData, 0, 0);
28357
+ }
28358
+ saveDebugImage({
28359
+ data,
28360
+ type,
28361
+ getDebugImageData: (_f = this.antiFraudInstance) === null || _f === void 0 ? void 0 : _f.getDebugImageData.bind(this.antiFraudInstance),
28362
+ result,
28363
+ width: frameWidth,
28364
+ height: frameHeight
28365
+ });
28366
+ const fraudOriginImg = util.UintArrayToBlob(frameWidth, frameHeight, data, virtualCanvas);
28367
+ const thicknessResult = Object.assign(Object.assign({}, antiFraudRecogitionResult), {
28368
+ imageData: data
28369
+ });
28370
+ if (antiFraudRecogitionResult.eStatus === idRecognition.EAuthMeIDCardAntiFraudStatus.Pass || antiFraudRecogitionResult.eStatus === idRecognition.EAuthMeIDCardAntiFraudStatus.Failed) {
28371
+ yield this.antiFraudInstance.stop();
28372
+ yield this.antiFraudInstance.destroy();
28373
+ } else if (uploadFullFrame) {
28374
+ const docId = docInfos[cardType].docId;
28375
+ const requestImg = yield encryptImageBase64(fraudOriginImg);
28376
+ pushNewDebugImage(fraudOriginImg, {
28377
+ result: thicknessResult,
28378
+ status: 'recognition',
28379
+ type: type,
28380
+ isAntiFraud: true
28381
+ });
28382
+ frameIndex++;
28383
+ util.backgroundRequest(() => idRecognition.uploadFrameBase64(docId, requestImg, frameIndex, idRecognition.ResourceImageType.Recognition // upload fill frame 時先使用 recognition 當成一個過渡方案, 目前後端會對這個處理存成 original image, 後續會再調整
28384
+ ));
28385
+ }
28386
+
28387
+ return thicknessResult;
28388
+ }),
28389
+ confirmThickness: (imageData, cardType) => __awaiter(this, void 0, void 0, function* () {
28390
+ const frameIndex = 0;
28391
+ const docId = docInfos[cardType].docId;
28392
+ const requestImg = yield encryptImageBase64(imageData);
28393
+ try {
28394
+ yield SendRequestWithRetry(() => idRecognition.uploadFrameBase64(docId, requestImg, frameIndex, idRecognition.ResourceImageType.Attach, undefined));
28395
+ yield SendRequestWithRetry(() => idRecognition.finishScanDocument(docId, {}, null));
28396
+ return true;
28397
+ } catch (error) {
28398
+ console.error('confirmThickness:', error);
28399
+ return false;
28400
+ }
28401
+ }),
27123
28402
  cardTypes,
27124
28403
  acceptTypes: cardTypes.map(idRecognition.mapCardtypeToAuthmeClass),
27125
28404
  recognition: (data, _base64, cardType, type) => __awaiter(this, void 0, void 0, function* () {
27126
28405
  const durationTimeRecognition = setTimeDuration(`ocr_recognition_${type}`);
27127
28406
  nextDebugRound(type);
27128
- const _service = type === engine.EAuthMeCardClass.TWN_ResidentCard_Back // workaround: resident card need MRZ, refactor later.
27129
- ? this.residentCardMrzService : this.ocrService;
28407
+ const _service = this.ocrService;
27130
28408
  const result = yield functionLogging(() => __awaiter(this, void 0, void 0, function* () {
27131
28409
  return yield _service.recognition(data);
27132
28410
  }), {
@@ -27151,7 +28429,6 @@ class OCRModule {
27151
28429
  height: frameHeight
27152
28430
  });
27153
28431
  const ocrOriginImg = util.UintArrayToBlob(frameWidth, frameHeight, data, virtualCanvas);
27154
- // console.log("cardType:" + cardType + ":" + docInfos[cardType ?? ""]);
27155
28432
  const eClass = cardType !== null && cardType !== void 0 ? cardType : '';
27156
28433
  if (result.eStatus === idRecognition.EAuthMeCardOCRStatus.Pass && result.imageData && !!docInfos[eClass].docId) {
27157
28434
  const resultOcrImg = util.UintArrayToBlob(result.iWidth, result.iHeight, result === null || result === void 0 ? void 0 : result.imageData, virtualCanvas);
@@ -27183,7 +28460,7 @@ class OCRModule {
27183
28460
  durationTimeRecognition.end();
27184
28461
  return result;
27185
28462
  }),
27186
- confirmImage: (type, cardType) => __awaiter(this, void 0, void 0, function* () {
28463
+ confirmImage: (type, cardType, imageData) => __awaiter(this, void 0, void 0, function* () {
27187
28464
  // 將二進位圖片進行加密,目前不需要使用,不確定未來是否需要,先註解
27188
28465
  // const encryptImage = async (blob: Blob): Promise<Blob> => {
27189
28466
  // const imageArrayBuffer = await blobToArrayBuffer(blob);
@@ -27197,7 +28474,12 @@ class OCRModule {
27197
28474
  const docId = docInfos[cardType].docId;
27198
28475
  if (docId) {
27199
28476
  const needFraudOption = config.needAntiFraud && type === engine.EAuthMeCardClass.TWN_IDCard_Front;
27200
- const ocrOriginImg = docInfos[cardType].ocrOriginImg;
28477
+ let ocrOriginImg;
28478
+ if (imageData) {
28479
+ ocrOriginImg = imageData;
28480
+ } else {
28481
+ ocrOriginImg = docInfos[cardType].ocrOriginImg;
28482
+ }
27201
28483
  const requestImg = yield encryptImageBase64(ocrOriginImg);
27202
28484
  const report = yield this.ocrService.getReport();
27203
28485
  docInfos[cardType].docId = '';
@@ -27212,7 +28494,7 @@ class OCRModule {
27212
28494
  const _requestImg = yield encryptImageBase64(ocrImg);
27213
28495
  const resp = yield SendRequestWithRetry(() => idRecognition.recognitionEncrypt(docId, _requestImg, report, idRecognition.RecognitionFileType.FlatImage));
27214
28496
  if (resp.retry) {
27215
- yield util.asyncShowPopup(translateService.translate('verify.error.blur'), translateService.translate('verify.error.blurDescribe'), true);
28497
+ yield util.asyncShowPopup(translateService.translate('sdk.verify.error.blurRetake.title'), translateService.translate('sdk.verify.error.blurRetake.content'), true);
27216
28498
  throw 'recognition failed';
27217
28499
  }
27218
28500
  result = unionMerge(result, resp && resp.details || {});
@@ -27230,7 +28512,32 @@ class OCRModule {
27230
28512
  return false;
27231
28513
  }
27232
28514
  }),
27233
- antiFraudStart: points => __awaiter(this, void 0, void 0, function* () {
28515
+ ocrCancel: (type, cardType, imageData) => __awaiter(this, void 0, void 0, function* () {
28516
+ const docId = docInfos[cardType].docId;
28517
+ if (docId) {
28518
+ let ocrOriginImg;
28519
+ if (imageData) {
28520
+ ocrOriginImg = imageData;
28521
+ } else {
28522
+ ocrOriginImg = docInfos[cardType].ocrOriginImg;
28523
+ }
28524
+ const requestImg = yield encryptImageBase64(ocrOriginImg);
28525
+ yield this.ocrService.stop();
28526
+ const report = yield this.ocrService.getReport();
28527
+ docInfos[cardType].docId = '';
28528
+ modifyDeubgLog(getDebugLogsLength() - 1, {
28529
+ report: report
28530
+ });
28531
+ frameIndex++;
28532
+ SendRequestWithRetry(() => idRecognition.uploadFrameBase64(docId, requestImg, frameIndex, idRecognition.ResourceImageType.Recognition, report));
28533
+ frameIndex = 0;
28534
+ return true;
28535
+ } else {
28536
+ console.error('didnt find docid , retry');
28537
+ return false;
28538
+ }
28539
+ }),
28540
+ antiFraudStart: (points, setBorderType, setCardBorderColor, setBorderSuccess, scanAnimationContainer, successAnimationContainer, frameImage, frameText, faceMode) => __awaiter(this, void 0, void 0, function* () {
27234
28541
  yield this.antiFraudInstance.init();
27235
28542
  yield this.antiFraudInstance.setFrameSize(frameWidth, frameHeight);
27236
28543
  yield this.antiFraudInstance.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
@@ -27261,15 +28568,30 @@ class OCRModule {
27261
28568
  fraudResult: null
27262
28569
  };
27263
28570
  }
28571
+ const lottieSuccessSetting = {
28572
+ animationContainer: successAnimationContainer
28573
+ };
28574
+ initSuccessAnimation(lottieSuccessSetting);
28575
+ // TODO 等開始處理防偽的時候再處理
28576
+ // if (resp.scanView && resp.scanView.enable) {
28577
+ // setBorderType({
28578
+ // type: resp.scanView.type
28579
+ // })
28580
+ // setCardBorderColor(null)
28581
+ // } else {
28582
+ // setBorderType({
28583
+ // type: 'cornered',
28584
+ // })
28585
+ // }
27264
28586
  return true;
27265
28587
  }),
27266
28588
  onAntiFraudFrame: data => __awaiter(this, void 0, void 0, function* () {
27267
- var _e, _f;
28589
+ var _h, _j;
27268
28590
  const type = engine.EAuthMeCardClass.TWN_IDCard_Front;
27269
28591
  nextDebugRound(type);
27270
28592
  const antiFraudRecogitionResult = yield functionLogging(() => __awaiter(this, void 0, void 0, function* () {
27271
- var _g;
27272
- return yield (_g = this.antiFraudInstance) === null || _g === void 0 ? void 0 : _g.recognition(data);
28593
+ var _k;
28594
+ return yield (_k = this.antiFraudInstance) === null || _k === void 0 ? void 0 : _k.recognition(data);
27273
28595
  }), {
27274
28596
  runFunction: util.RUN_FUNCTION_NAME.ANTI_FARUD_RECOGNITION,
27275
28597
  isAntiFraud: true
@@ -27278,7 +28600,7 @@ class OCRModule {
27278
28600
  return antiFraudRecogitionResult;
27279
28601
  }
27280
28602
  if (this.canvas) {
27281
- const debugData = yield (_e = this.antiFraudInstance) === null || _e === void 0 ? void 0 : _e.getDebugImageData(data);
28603
+ const debugData = yield (_h = this.antiFraudInstance) === null || _h === void 0 ? void 0 : _h.getDebugImageData(data);
27282
28604
  const ctx = this.canvas.getContext('2d');
27283
28605
  this.canvas.width = frameWidth;
27284
28606
  this.canvas.height = frameHeight;
@@ -27290,7 +28612,7 @@ class OCRModule {
27290
28612
  saveDebugImage({
27291
28613
  data,
27292
28614
  type,
27293
- getDebugImageData: (_f = this.antiFraudInstance) === null || _f === void 0 ? void 0 : _f.getDebugImageData.bind(this.antiFraudInstance),
28615
+ getDebugImageData: (_j = this.antiFraudInstance) === null || _j === void 0 ? void 0 : _j.getDebugImageData.bind(this.antiFraudInstance),
27294
28616
  result,
27295
28617
  width: frameWidth,
27296
28618
  height: frameHeight
@@ -27334,27 +28656,27 @@ class OCRModule {
27334
28656
  return antiFraudStageList;
27335
28657
  },
27336
28658
  setFrameSize: (width, height, points) => __awaiter(this, void 0, void 0, function* () {
27337
- var _h, _j, _k, _l;
28659
+ var _l, _m, _o, _p;
27338
28660
  frameWidth = width;
27339
28661
  frameHeight = height;
27340
- yield (_h = this.ocrService) === null || _h === void 0 ? void 0 : _h.setFrameSize(width, height);
27341
- yield (_j = this.antiFraudInstance) === null || _j === void 0 ? void 0 : _j.setFrameSize(width, height);
28662
+ yield (_l = this.ocrService) === null || _l === void 0 ? void 0 : _l.setFrameSize(width, height);
28663
+ yield (_m = this.antiFraudInstance) === null || _m === void 0 ? void 0 : _m.setFrameSize(width, height);
27342
28664
  if (config.type === idRecognition.IdRecognitionCardType.ResidentCard) {
27343
28665
  // workaround: resident card need MRZ, refactor later.
27344
- yield (_k = this.residentCardMrzService) === null || _k === void 0 ? void 0 : _k.setFrameSize(width, height);
28666
+ yield (_o = this.residentCardMrzService) === null || _o === void 0 ? void 0 : _o.setFrameSize(width, height);
27345
28667
  }
27346
28668
  if (points) {
27347
- yield (_l = this.ocrService) === null || _l === void 0 ? void 0 : _l.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
28669
+ yield (_p = this.ocrService) === null || _p === void 0 ? void 0 : _p.setMaskPosition(points.map(([x, y]) => [Number(x.toFixed(2)), Number(y.toFixed(2))]));
27348
28670
  }
27349
28671
  }),
27350
28672
  onSuccess: () => __awaiter(this, void 0, void 0, function* () {
27351
- var _m, _o, _p;
28673
+ var _q, _r, _s;
27352
28674
  durationTime.end();
27353
28675
  const ocrIdcardResultFormat = util.Storage.getItem(util.STORAGE_KEY['OCR_IDCARD_RESULT_FORMAT']);
27354
- (_m = this.antiFraudInstance) === null || _m === void 0 ? void 0 : _m.destroy();
27355
- (_o = this.ocrService) === null || _o === void 0 ? void 0 : _o.destroy();
28676
+ (_q = this.antiFraudInstance) === null || _q === void 0 ? void 0 : _q.destroy();
28677
+ (_r = this.ocrService) === null || _r === void 0 ? void 0 : _r.destroy();
27356
28678
  // workaround: resident card need MRZ, refactor later.
27357
- (_p = this.residentCardMrzService) === null || _p === void 0 ? void 0 : _p.destroy();
28679
+ (_s = this.residentCardMrzService) === null || _s === void 0 ? void 0 : _s.destroy();
27358
28680
  if (config.type === idRecognition.IdRecognitionCardType.IDCard && ocrIdcardResultFormat === 'splitDateAndAddress') {
27359
28681
  result = util.splitResult(result);
27360
28682
  }
@@ -27365,10 +28687,10 @@ class OCRModule {
27365
28687
  };
27366
28688
  }),
27367
28689
  onDestroy: () => __awaiter(this, void 0, void 0, function* () {
27368
- var _q, _r;
28690
+ var _t, _u;
27369
28691
  durationTime.end();
27370
- yield (_q = this.ocrService) === null || _q === void 0 ? void 0 : _q.destroy();
27371
- yield (_r = this.antiFraudInstance) === null || _r === void 0 ? void 0 : _r.destroy();
28692
+ yield (_t = this.ocrService) === null || _t === void 0 ? void 0 : _t.destroy();
28693
+ yield (_u = this.antiFraudInstance) === null || _u === void 0 ? void 0 : _u.destroy();
27372
28694
  }),
27373
28695
  getCardMatchROI: () => __awaiter(this, void 0, void 0, function* () {
27374
28696
  return yield this.antiFraudInstance.getCardMatchROI();
@@ -27410,96 +28732,20 @@ function renderCardTypeAndCountryConfig(config) {
27410
28732
  setStatusEvent(core.StatusEvent.SelectCardTypeAndCountry);
27411
28733
  setStatusView$1(core.StatusView.Select);
27412
28734
  sendStatusAction(core.StatusAction.Show);
27413
- const allCardTypes = Object.values(idRecognition.IdRecognitionCardType);
27414
- config.supportCardTypes(config.defaultCountry);
27415
28735
  const translate = key => core.getTranslateInstance().translate(key);
27416
- const extraInfoWeapMap = new WeakMap();
27417
- const componentElem = _render('div', elem => elem.classList.add('authme-select-container'), [_render('div', elem => elem.classList.add('menu-header'), [_render('div', elem => elem.classList.add('menu-header-left'), [_render('i', elem => elem.classList.add('menu-header-back'))]), _render('div', elem => elem.classList.add('menu-header-title'), [_render('div', elem => {
27418
- elem.classList.add('menu-header-title-text');
27419
- })]), _render('div', elem => elem.classList.add('menu-header-right'), [_render('i', elem => elem.classList.add('menu-header-close'))])]), _render('div', elem => elem.classList.add('menu-content'), [_render('div', elem => elem.classList.add('country-select'), [_render('label', elem => {
27420
- elem.classList.add('country-select-label');
27421
- elem.innerText = translate('verify.menu.country');
27422
- }), _render('div', elem => elem.classList.add('country-select-dropdown'), [_render('div', elem => elem.classList.add('country-select-dropdown-frame'), [_render('div', elem => {
27423
- elem.classList.add('country-select-dropdown-text');
27424
- elem.innerText = translate(`verify.menu.country.${idRecognition.CountryCode.TWN}`);
27425
- }), _render('div', elem => elem.classList.add('country-select-dropdown-icon'))]), _render('div', elem => {
27426
- elem.classList.add('dropdown-country-list');
27427
- })])]), _render('div', elem => elem.classList.add('card-type-select'), [_render('label', elem => {
27428
- elem.classList.add('card-type-select-label');
27429
- elem.innerText = translate('verify.menu.card.type');
27430
- }), ...allCardTypes.map(cardType => _render('div', elem => {
27431
- elem.classList.add('card-out-frame');
27432
- elem.classList.add('card-frame');
27433
- elem.classList.add('card-frame-' + cardType.toLowerCase());
27434
- extraInfoWeapMap.set(elem, {
27435
- cardType
27436
- });
27437
- }, [_render('div', elem => elem.classList.add('card-in-frame'), [_render('label', elem => {
27438
- elem.classList.add('card-label');
27439
- elem.classList.add(cardType.toLocaleLowerCase());
27440
- elem.innerText = translate(`verify.menu.card.${cardType}`);
27441
- }), _render('i', elem => elem.classList.add('card-icon'))])]))]), _render('div', elem => elem.classList.add('space')), _render('div', elem => {
27442
- elem.classList.add('menu-content-footer');
27443
- }, [_render('div', elem => {
27444
- elem.classList.add('menu-content-footer-content');
27445
- }, [_render('div', elem => {
27446
- elem.classList.add('footer-confirm-button');
27447
- elem.classList.add('disable');
27448
- elem.innerText = translate(`liveness.continue`);
27449
- }), _render('div', elem => {
27450
- elem.classList.add('footer-statement');
27451
- elem.innerText = translate(`verify.menu.footer.content`);
27452
- })])])])]);
27453
28736
  let currentCardTypeAndCountry;
27454
- const removeAllChild = element => {
27455
- while (element.firstChild) {
27456
- element.removeChild(element.firstChild);
27457
- }
27458
- };
27459
- const reloadCardTypeSelect = currentCountry => {
27460
- const countryList = config.supportCountries;
27461
- const dropdownCountryList = componentElem.querySelector('.authme-select-container .dropdown-country-list');
27462
- removeAllChild(dropdownCountryList);
27463
- const frames = document.querySelectorAll('.card-frame');
27464
- for (let i = 0; i < frames.length; i++) {
27465
- frames[i].style.display = 'none';
27466
- }
27467
- const cardtypes = config.supportCardTypes(currentCountry);
27468
- cardtypes.forEach(cardType => {
27469
- const node = componentElem.querySelector('.card-frame-' + cardType.toLowerCase());
27470
- node.style.display = '';
27471
- });
27472
- countryList.filter(country => country !== currentCountry).forEach(country => {
27473
- const countryElem = _render('div', elem => {
27474
- elem.classList.add('dropdown-country-list-item');
27475
- extraInfoWeapMap.set(elem, {
27476
- country
27477
- });
27478
- elem.addEventListener('click', event => {
27479
- event.stopPropagation();
27480
- setCurrentCountry(country);
27481
- currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
27482
- country
27483
- });
27484
- });
27485
- }, [_render('div', elem => {
27486
- elem.classList.add('dropdown-country-list-item-frame');
27487
- }, [_render('div', elem => {
27488
- elem.classList.add('dropdown-country-list-item-text');
27489
- elem.innerText = translate(`verify.menu.country.${country}`);
27490
- })])]);
27491
- dropdownCountryList.appendChild(countryElem);
27492
- });
27493
- };
27494
28737
  const setCurrentCountry = (country, disableSwitch = false) => {
27495
- const countrySelectDropdown = componentElem.querySelector('.authme-select-container .country-select-dropdown');
28738
+ const countrySelectDropdown = containerDom.querySelector('.authme-select-container .country-select-dropdown');
27496
28739
  const countrySelectDropdownFramw = countrySelectDropdown.querySelector('.country-select-dropdown-frame');
27497
28740
  const countrySelectDropdownText = countrySelectDropdownFramw.querySelector('.country-select-dropdown-text');
27498
28741
  if (!disableSwitch) {
27499
28742
  dropdownSwitch(false);
27500
28743
  }
27501
- countrySelectDropdownText.innerText = translate(`verify.menu.country.${country}`);
27502
- reloadCardTypeSelect(country);
28744
+ currentCardTypes = config.supportCardTypes(country);
28745
+ currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
28746
+ country
28747
+ });
28748
+ countrySelectDropdownText.innerText = translate(`sdk.home.selectCountry.${country}`);
27503
28749
  };
27504
28750
  const dropdownSwitch = switchTarget => {
27505
28751
  const closeDropdown = () => {
@@ -27509,20 +28755,83 @@ function renderCardTypeAndCountryConfig(config) {
27509
28755
  countrySelectDropdown.classList.remove('closing');
27510
28756
  }, 280);
27511
28757
  };
27512
- const countrySelectDropdown = componentElem.querySelector('.authme-select-container .country-select-dropdown');
28758
+ const countrySelectDropdown = containerDom.querySelector('.authme-select-container .country-select-dropdown');
27513
28759
  if (switchTarget !== undefined) {
27514
28760
  switchTarget === false ? closeDropdown() : countrySelectDropdown.classList.add('active');
27515
28761
  return;
27516
28762
  }
27517
28763
  countrySelectDropdown.classList.contains('active') ? closeDropdown() : countrySelectDropdown.classList.add('active');
27518
28764
  };
28765
+ let currentCardTypes = config.supportCardTypes(config.defaultCountry);
28766
+ const containerDom = document.createElement('div');
28767
+ containerDom.classList.add('authme-select-container');
28768
+ containerDom.innerHTML = `
28769
+ <div class="menu-header">
28770
+ <div class="menu-header-left">
28771
+ <i class="menu-header-back"></i>
28772
+ </div>
28773
+ <div class="menu-header-title">
28774
+ <div class="menu-header-title-text"></div>
28775
+ </div>
28776
+ <div class="menu-header-right">
28777
+ <i class="menu-header-close"></i>
28778
+ </div>
28779
+ </div>
28780
+ <div class="menu-content">
28781
+ <div class="country-select">
28782
+ <label class="country-select-label">${translate('sdk.home.selectCountry')}</label>
28783
+ <div class="country-select-dropdown">
28784
+ <div class="country-select-dropdown-frame">
28785
+ <div class="country-select-dropdown-text">${translate(`sdk.home.selectCountry.${idRecognition.CountryCode.TWN}`)}</div>
28786
+ <div class="country-select-dropdown-icon"></div>
28787
+ </div>
28788
+ <div class="dropdown-country-list"></div>
28789
+ </div>
28790
+ </div>
28791
+ <div class="card-type-select">
28792
+ <label class="card-type-select-label">${translate('sdk.home.selectDocument')}</label>
28793
+ </div>
28794
+ <div class="space"></div>
28795
+ <div class="menu-content-footer">
28796
+ <div class="menu-content-footer-content">
28797
+ <div class="footer-confirm-button disable">${translate(`sdk.general.continue`)}</div>
28798
+ <div class="footer-statement">${translate(`sdk.general.footer`)}</div>
28799
+ </div>
28800
+ </div>
28801
+ </div>
28802
+ `;
28803
+ const confirmBtn = containerDom.querySelector('.footer-confirm-button');
28804
+ const initCountryList = currentCountry => {
28805
+ const countryList = config.supportCountries;
28806
+ const dropdownCountryList = containerDom.querySelector('.dropdown-country-list');
28807
+ const countries = dropdownCountryList === null || dropdownCountryList === void 0 ? void 0 : dropdownCountryList.querySelectorAll('.dropdown-country-list-item');
28808
+ for (let index = countries.length - 1; index >= 0; index--) {
28809
+ countries[index].remove();
28810
+ }
28811
+ countryList.filter(country => country !== currentCountry).forEach(country => {
28812
+ const countryDom = document.createElement('div');
28813
+ countryDom.classList.add('dropdown-country-list-item');
28814
+ countryDom.innerHTML = `
28815
+ <div class="dropdown-country-list-item-frame">
28816
+ <div class="dropdown-country-list-item-text">${translate(`sdk.home.selectCountry.${country}`)}</div>
28817
+ </div>
28818
+ `;
28819
+ countryDom.addEventListener('click', event => {
28820
+ event.stopPropagation();
28821
+ setCurrentCountry(country);
28822
+ initCardTypeList();
28823
+ initCountryList(country);
28824
+ });
28825
+ dropdownCountryList.appendChild(countryDom);
28826
+ });
28827
+ };
27519
28828
  const initCountrySelectDropdown = () => {
27520
- const countrySelectDropdown = componentElem.querySelector('.authme-select-container .country-select-dropdown');
28829
+ const countrySelectDropdown = containerDom.querySelector('.country-select-dropdown');
27521
28830
  const countryList = config.supportCountries;
27522
- setCurrentCountry(config.defaultCountry, true);
27523
28831
  currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
27524
28832
  country: config.defaultCountry
27525
28833
  });
28834
+ initCountryList(config.defaultCountry);
27526
28835
  countrySelectDropdown.addEventListener('click', () => {
27527
28836
  if (countryList.length <= 1) {
27528
28837
  return;
@@ -27530,32 +28839,55 @@ function renderCardTypeAndCountryConfig(config) {
27530
28839
  dropdownSwitch();
27531
28840
  });
27532
28841
  };
27533
- return new Promise((resolve, reject) => {
27534
- const cardTypeElems = [].slice.call(componentElem.querySelectorAll('.authme-select-container .card-out-frame'));
27535
- const confirmBtn = componentElem.querySelector('.authme-select-container .menu-content-footer .footer-confirm-button');
27536
- const frames = componentElem.querySelectorAll('.card-frame');
27537
- for (let i = 0; i < frames.length; i++) {
27538
- frames[i].style.display = 'none';
27539
- }
27540
- const cardtypes = config.supportCardTypes(config.defaultCountry);
27541
- cardtypes.forEach(cardType => {
27542
- const node = componentElem.querySelector('.card-frame-' + cardType.toLowerCase());
27543
- node.style.display = '';
28842
+ const handleCardTypeClick = e => {
28843
+ const currentTarget = e.currentTarget;
28844
+ const list = currentTarget.parentElement.querySelectorAll('.card-out-frame');
28845
+ const matchSupportCardType = JSON.parse(currentTarget.dataset.cardTypeObj);
28846
+ // const matchSupportCardType = currentCardTypes.find(
28847
+ // (item) => item.cardType === currentTarget.dataset.cardType
28848
+ // );
28849
+ const cardType = matchSupportCardType === null || matchSupportCardType === void 0 ? void 0 : matchSupportCardType.cardType;
28850
+ const config = (matchSupportCardType === null || matchSupportCardType === void 0 ? void 0 : matchSupportCardType.config) || {};
28851
+ currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
28852
+ cardType,
28853
+ config
27544
28854
  });
27545
- initCountrySelectDropdown();
27546
- cardTypeElems.map(cardTypeElem => {
27547
- cardTypeElem.addEventListener('click', () => {
27548
- cardTypeElems.forEach(ele => ele.classList.remove('active'));
27549
- cardTypeElem.classList.add('active');
27550
- const cardType = extraInfoWeapMap.get(cardTypeElem).cardType;
27551
- currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
27552
- cardType
27553
- });
27554
- confirmBtn.classList.remove('disable');
27555
- });
28855
+ list.forEach(item => {
28856
+ item.classList.remove('active');
28857
+ });
28858
+ currentTarget.classList.add('active');
28859
+ confirmBtn === null || confirmBtn === void 0 ? void 0 : confirmBtn.classList.remove('disable');
28860
+ };
28861
+ const initCardTypeList = () => {
28862
+ const cardTypeSelect = containerDom.querySelector('.card-type-select');
28863
+ const cardTypeList = cardTypeSelect === null || cardTypeSelect === void 0 ? void 0 : cardTypeSelect.querySelectorAll('.card-type-item');
28864
+ if (!cardTypeSelect || !cardTypeList) {
28865
+ return;
28866
+ }
28867
+ for (let index = cardTypeList.length - 1; index >= 0; index--) {
28868
+ const cardTypeDom = cardTypeList[index];
28869
+ cardTypeDom.removeEventListener('click', handleCardTypeClick);
28870
+ cardTypeDom.remove();
28871
+ }
28872
+ currentCardTypes.forEach(item => {
28873
+ const dom = document.createElement('div');
28874
+ dom.setAttribute('class', `card-out-frame card-frame card-type-item card-frame-${item.cardType.toLowerCase()}`);
28875
+ dom.setAttribute('data-card-type', item.cardType);
28876
+ dom.setAttribute('data-card-type-obj', JSON.stringify(item));
28877
+ dom.addEventListener('click', handleCardTypeClick);
28878
+ dom.innerHTML = `
28879
+ <div class="card-in-frame">
28880
+ <label class="card-label ${item.cardType.toLowerCase()}">${item.display}</label>
28881
+ <i class="card-icon"></i>
28882
+ </div>
28883
+ `;
28884
+ cardTypeSelect.appendChild(dom);
27556
28885
  });
27557
- confirmBtn.addEventListener('click', () => {
27558
- componentElem.remove();
28886
+ confirmBtn === null || confirmBtn === void 0 ? void 0 : confirmBtn.classList.add('disable');
28887
+ };
28888
+ return new Promise((resolve, reject) => {
28889
+ confirmBtn === null || confirmBtn === void 0 ? void 0 : confirmBtn.addEventListener('click', () => {
28890
+ containerDom.remove();
27559
28891
  const _currentCardTypeAndCountry = Object.assign(Object.assign({}, currentCardTypeAndCountry), {
27560
28892
  hasResult: true
27561
28893
  });
@@ -27563,16 +28895,18 @@ function renderCardTypeAndCountryConfig(config) {
27563
28895
  eventListenerService.stop();
27564
28896
  resolve(_currentCardTypeAndCountry);
27565
28897
  });
27566
- const menuBackElem = componentElem.querySelector('.authme-select-container .menu-header-close');
27567
- menuBackElem.addEventListener('click', () => {
27568
- componentElem.remove();
28898
+ const menuBackDom = containerDom.querySelector('.menu-header-close');
28899
+ menuBackDom.addEventListener('click', () => {
28900
+ containerDom.remove();
27569
28901
  sendStatusAction(core.StatusAction.BtnClose);
27570
28902
  eventListenerService.stop();
27571
28903
  resolve({
27572
28904
  hasResult: false
27573
28905
  });
27574
28906
  });
27575
- document.body.appendChild(componentElem);
28907
+ document.body.appendChild(containerDom);
28908
+ initCountrySelectDropdown();
28909
+ initCardTypeList();
27576
28910
  });
27577
28911
  }
27578
28912
 
@@ -27645,7 +28979,7 @@ class AuthmeIdentityVerification extends engine.AuthmeFunctionModule {
27645
28979
  yield core.getTranslateInstance().fetchSource(`${config.scriptPath}locale`);
27646
28980
  } catch (error) {
27647
28981
  if (error instanceof core.AuthmeError && error.code === core.ErrorCode.BROWSER_NOT_SUPPORT) {
27648
- alert(core.getTranslateInstance().translate('browser.error.notSupport'));
28982
+ alert(core.getTranslateInstance().translate('sdk.general.error.browser.doesntSupportCamera'));
27649
28983
  }
27650
28984
  throw error;
27651
28985
  }
@@ -27680,13 +29014,20 @@ class AuthmeIdentityVerification extends engine.AuthmeFunctionModule {
27680
29014
  getCardTypeAndCountry(userConfig) {
27681
29015
  var _a, _b;
27682
29016
  return __awaiter(this, void 0, void 0, function* () {
27683
- const defaultCountries = [idRecognition.CountryCode.TWN, idRecognition.CountryCode.TWN, idRecognition.CountryCode.JPN, idRecognition.CountryCode.ZAF, idRecognition.CountryCode.USA, idRecognition.CountryCode.CHN, idRecognition.CountryCode.PHL, idRecognition.CountryCode.GBR, idRecognition.CountryCode.KOR];
29017
+ const defaultCountries = [idRecognition.CountryCode.TWN, idRecognition.CountryCode.JPN, idRecognition.CountryCode.ZAF, idRecognition.CountryCode.USA, idRecognition.CountryCode.CHN, idRecognition.CountryCode.PHL, idRecognition.CountryCode.GBR, idRecognition.CountryCode.KOR, idRecognition.CountryCode.HKG, idRecognition.CountryCode.FRA, idRecognition.CountryCode.ESP, idRecognition.CountryCode.MEX, idRecognition.CountryCode.ITA, idRecognition.CountryCode.IND, idRecognition.CountryCode.COL, idRecognition.CountryCode.RUS, idRecognition.CountryCode.DEU, idRecognition.CountryCode.TUR, idRecognition.CountryCode.CAN, idRecognition.CountryCode.AUS, idRecognition.CountryCode.IDN, idRecognition.CountryCode.MYS, idRecognition.CountryCode.EGY, idRecognition.CountryCode.SAU, idRecognition.CountryCode.NLD, idRecognition.CountryCode.SGP];
27684
29018
  const defaultCountry = userConfig.defaultCountry !== undefined && defaultCountries.includes(userConfig.defaultCountry) ? userConfig.defaultCountry : defaultCountries[0];
27685
- return renderCardTypeAndCountryConfig({
27686
- supportCountries: (_a = userConfig.supportCountries) !== null && _a !== void 0 ? _a : defaultCountries,
27687
- defaultCountry: defaultCountry,
27688
- supportCardTypes: (_b = userConfig.supportCardTypes) !== null && _b !== void 0 ? _b : () => Object.values(idRecognition.IdRecognitionCardType)
29019
+ const supportCountries = (_a = userConfig.supportCountries) !== null && _a !== void 0 ? _a : defaultCountries;
29020
+ const supportCardTypes = (_b = userConfig.supportCardTypes) !== null && _b !== void 0 ? _b : Object.values(idRecognition.IdRecognitionCardType).map(x => {
29021
+ return {
29022
+ cardType: x
29023
+ };
27689
29024
  });
29025
+ const cardTypeAndCountryConfig = {
29026
+ defaultCountry,
29027
+ supportCountries,
29028
+ supportCardTypes
29029
+ };
29030
+ return renderCardTypeAndCountryConfig(cardTypeAndCountryConfig);
27690
29031
  });
27691
29032
  }
27692
29033
  extraDocument(userConfig = {}) {
@@ -27718,10 +29059,11 @@ class AuthmeIdentityVerification extends engine.AuthmeFunctionModule {
27718
29059
  cardSubTypes = config.cardTypes.map(idRecognition.mapCardtypeToAuthmeClass);
27719
29060
  } else {
27720
29061
  cardSubTypes = idRecognition.getCardSubTypes(config.type, config.country);
27721
- const defaultCardTypes = cardSubTypes.map(c => idRecognition.twoWayAuthmeCardClassMap.toServer(c));
27722
- config.cardTypes = defaultCardTypes;
29062
+ cardSubTypes.map(c => idRecognition.twoWayAuthmeCardClassMap.toServer(c));
29063
+ // config.cardTypes = defaultCardTypes;
29064
+ config.cardTypes = idRecognition.getCardTypes(config.type, config.country);
27723
29065
  }
27724
- return config.type === idRecognition.IdRecognitionCardType.Passport ? this.mrzModule.run(config, cardSubTypes) : this.ocrModule.run(config, config.cardTypes);
29066
+ return config.type === idRecognition.IdRecognitionCardType.Passport ? this.mrzModule.run(config, cardSubTypes) : this.ocrModule.run(config, config.cardTypes, config.cardTypeConfigs);
27725
29067
  });
27726
29068
  }
27727
29069
  confirmOCRResult(data) {
@@ -27773,8 +29115,8 @@ class AuthmeIdentityVerification extends engine.AuthmeFunctionModule {
27773
29115
  }
27774
29116
 
27775
29117
  var name = "authme/sdk";
27776
- var version$1 = "2.4.7";
27777
- var date = "2023-12-14T08:29:41+0000";
29118
+ var version$1 = "2.7.0";
29119
+ var date = "2024-05-30T14:54:23+0000";
27778
29120
  var packageInfo = {
27779
29121
  name: name,
27780
29122
  version: version$1,