lgq
10 天以前 081f12a52906abe6c2d139fdc144135978681009
新增型号vf107的门禁程序代码,当前已支持人脸与指纹的组合认证
已添加2,756个文件
55571 ■■■■■ 文件已修改
vf107/.temp/dxide_debug.log 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/md5s.json 2721 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/md5snew.json 2721 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxAudio/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxBase64/2.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxChannel/1.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxCommon/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxCommonUtils/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxConfig/2.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxCryptoES/2.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxDisplay/1.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxDriver/1.1.8.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxEventBus/2.0.2.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxFacial/1.1.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxFingerMz/1.0.5.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxFingerZaz/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxGpio/1.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxGpioKey/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxHttpClient/2.0.3.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxHttpServer/1.0.3.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxLogger/2.0.3.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxMap/2.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxMqttClient/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxNetwork/1.0.3.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxNfcCard/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxNtp/2.0.2.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxOs/1.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxOta/2.0.2.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxPwm/2.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxQrRule/2.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxSqliteDB/1.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxStd/2.0.3.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxTimeZones/1.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxUart/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxVgBle/1.0.0.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxWatchdog/1.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/zipFolder/VF105_V12/dxWorkerPool/2.0.1.zip 补丁 | 查看 | 原始文档 | blame | 历史
vf107/README_CN.md 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/app.dxproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/README.md 432 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/aes.js 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/blowfish.js 446 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/cipher-core.js 883 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/core.js 800 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/enc-base64.js 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/enc-base64url.js 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/enc-utf16.js 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/evpkdf.js 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/format-hex.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/hmac.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/index.js 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/md5.js 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/mode-cfb.js 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/mode-ctr-gladman.js 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/mode-ctr.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/mode-ecb.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/mode-ofb.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/pad-ansix923.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/pad-iso10126.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/pad-iso97971.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/pad-nopadding.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/pad-zeropadding.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/pbkdf2.js 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/rabbit-legacy.js 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/rabbit.js 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/rc4.js 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/ripemd160.js 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/sha1.js 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/sha224.js 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/sha256.js 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/sha3.js 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/sha384.js 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/sha512.js 369 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/tripledes.js 766 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/crypto-es/x64-core.js 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxAudio.js 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxBase64.js 308 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxCamera.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxCapcal.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxChannel.js 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxCommon.js 754 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxCommonUtils.js 867 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxConfig.js 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxDisplay.js 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxDriver.js 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxEventBus.js 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxFacial.js 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxFacialBarcode.js 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxFingerMz.js 863 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxFingerZaz.js 706 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxGpio.js 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxGpioKey.js 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxHttp.js 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxHttpClient.js 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxHttpServer.js 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxLogger.js 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxMap.js 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxMqttClient.js 387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxNetwork.js 311 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxNfc.js 409 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxNfcCard.js 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxNtp.js 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxOs.js 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxOta.js 272 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxPwm.js 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxQrRule.js 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxSqliteDB.js 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxStd.js 606 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxTimeZones.js 761 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxUart.js 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxVgBle.js 893 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxWatchdog.js 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/dxWorkerPool.js 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libasound.so.2 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libatopology.so.2 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libpaho-mqtt3cs.so.1 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-b-dxgpio.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-b-dxpwm.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-audio_gain.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-capcal.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-capturer.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-display.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-face.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-gpio.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-memory.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-pwm.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-soc.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-tts.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-drv-watchdog.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-audio.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-capturer.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-channel.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-common.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxaudio.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxchannel.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxcommon.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxcommonutils.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxdisplay.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxfacial.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxhttpclient.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxhttpserver.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxkey.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxmap.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxmqttclient.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxnetwork.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxnfccard.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxos.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxsqlitedb.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxuart.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-dxwatchdog.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-eid.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-key.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-m-net.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libvbar-p-nfc.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/libzbar.so 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/vbar_version 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/vgUartWorker.js 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Abidjan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Accra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Addis_Ababa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Algiers 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Asmara 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Asmera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Bamako 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Bangui 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Banjul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Bissau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Blantyre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Brazzaville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Bujumbura 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Cairo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Casablanca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Ceuta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Conakry 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Dakar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Dar_es_Salaam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Djibouti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Douala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/El_Aaiun 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Freetown 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Gaborone 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Harare 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Johannesburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Juba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Kampala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Khartoum 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Kigali 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Kinshasa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Lagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Libreville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Lome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Luanda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Lubumbashi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Lusaka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Malabo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Maputo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Maseru 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Mbabane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Mogadishu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Monrovia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Nairobi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Ndjamena 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Niamey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Nouakchott 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Ouagadougou 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Porto-Novo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Sao_Tome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Timbuktu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Tripoli 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Tunis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Africa/Windhoek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Adak 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Anchorage 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Anguilla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Antigua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Araguaina 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Buenos_Aires 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Catamarca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/ComodRivadavia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Cordoba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Jujuy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/La_Rioja 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Mendoza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Rio_Gallegos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Salta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/San_Juan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/San_Luis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Tucuman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Argentina/Ushuaia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Aruba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Asuncion 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Atikokan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Atka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Bahia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Bahia_Banderas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Barbados 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Belem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Belize 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Blanc-Sablon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Boa_Vista 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Bogota 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Boise 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Buenos_Aires 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Cambridge_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Campo_Grande 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Cancun 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Caracas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Catamarca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Cayenne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Cayman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Chicago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Chihuahua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Coral_Harbour 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Cordoba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Costa_Rica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Creston 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Cuiaba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Curacao 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Danmarkshavn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Dawson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Dawson_Creek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Denver 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Detroit 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Dominica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Edmonton 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Eirunepe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/El_Salvador 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Ensenada 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Fort_Nelson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Fort_Wayne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Fortaleza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Glace_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Godthab 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Goose_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Grand_Turk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Grenada 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Guadeloupe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Guatemala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Guayaquil 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Guyana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Halifax 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Havana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Hermosillo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indiana/Indianapolis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indiana/Knox 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indiana/Marengo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indiana/Petersburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indiana/Tell_City 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indiana/Vevay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indiana/Vincennes 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indiana/Winamac 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Indianapolis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Inuvik 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Iqaluit 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Jamaica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Jujuy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Juneau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Kentucky/Louisville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Kentucky/Monticello 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Knox_IN 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Kralendijk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/La_Paz 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Lima 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Los_Angeles 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Louisville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Lower_Princes 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Maceio 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Managua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Manaus 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Marigot 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Martinique 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Matamoros 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Mazatlan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Mendoza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Menominee 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Merida 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Metlakatla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Mexico_City 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Miquelon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Moncton 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Monterrey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Montevideo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Montreal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Montserrat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Nassau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/New_York 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Nipigon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Nome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Noronha 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/North_Dakota/Beulah 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/North_Dakota/Center 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/North_Dakota/New_Salem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Nuuk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Ojinaga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Panama 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Pangnirtung 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Paramaribo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Phoenix 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Port-au-Prince 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Port_of_Spain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Porto_Acre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Porto_Velho 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Puerto_Rico 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Punta_Arenas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Rainy_River 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Rankin_Inlet 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Recife 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Regina 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Resolute 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Rio_Branco 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Rosario 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Santa_Isabel 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Santarem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Santiago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Santo_Domingo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Sao_Paulo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Scoresbysund 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Shiprock 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Sitka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/St_Barthelemy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/St_Johns 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/St_Kitts 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/St_Lucia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/St_Thomas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/St_Vincent 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Swift_Current 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Tegucigalpa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Thule 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Thunder_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Tijuana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Toronto 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Tortola 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Vancouver 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Virgin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Whitehorse 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Winnipeg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Yakutat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/America/Yellowknife 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Casey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Davis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/DumontDUrville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Macquarie 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Mawson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/McMurdo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Palmer 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Rothera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/South_Pole 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Syowa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Troll 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Antarctica/Vostok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Arctic/Longyearbyen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Aden 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Almaty 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Amman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Anadyr 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Aqtau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Aqtobe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Ashgabat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Ashkhabad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Atyrau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Baghdad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Bahrain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Baku 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Bangkok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Barnaul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Beirut 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Bishkek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Brunei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Calcutta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Chita 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Choibalsan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Chongqing 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Chungking 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Colombo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Dacca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Damascus 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Dhaka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Dili 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Dubai 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Dushanbe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Famagusta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Gaza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Harbin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Hebron 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Ho_Chi_Minh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Hong_Kong 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Hovd 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Irkutsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Istanbul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Jakarta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Jayapura 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Jerusalem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Kabul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Kamchatka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Karachi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Kashgar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Kathmandu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Katmandu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Khandyga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Kolkata 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Krasnoyarsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Kuala_Lumpur 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Kuching 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Kuwait 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Macao 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Macau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Magadan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Makassar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Manila 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Muscat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Nicosia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Novokuznetsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Novosibirsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Omsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Oral 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Phnom_Penh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Pontianak 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Pyongyang 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Qatar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Qostanay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Qyzylorda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Rangoon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Riyadh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Saigon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Sakhalin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Samarkand 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Seoul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Shanghai 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Singapore 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Srednekolymsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Taipei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Tashkent 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Tbilisi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Tehran 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Tel_Aviv 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Thimbu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Thimphu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Tokyo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Tomsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Ujung_Pandang 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Ulaanbaatar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Ulan_Bator 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Urumqi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Ust-Nera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Vientiane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Vladivostok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Yakutsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Yangon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Yekaterinburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Asia/Yerevan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Azores 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Bermuda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Canary 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Cape_Verde 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Faeroe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Faroe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Jan_Mayen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Madeira 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Reykjavik 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/South_Georgia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/St_Helena 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Atlantic/Stanley 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/ACT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Adelaide 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Brisbane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Broken_Hill 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Canberra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Currie 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Darwin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Eucla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Hobart 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/LHI 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Lindeman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Lord_Howe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Melbourne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/NSW 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/North 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Perth 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Queensland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/South 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Sydney 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Tasmania 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Victoria 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/West 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Australia/Yancowinna 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Brazil/Acre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Brazil/DeNoronha 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Brazil/East 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Brazil/West 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/CET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/CST6CDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Canada/Atlantic 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Canada/Central 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Canada/Eastern 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Canada/Mountain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Canada/Newfoundland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Canada/Pacific 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Canada/Saskatchewan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Canada/Yukon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Chile/Continental 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Chile/EasterIsland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Cuba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/EET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/EST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/EST5EDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Egypt 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Eire 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+1 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+10 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+11 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+12 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+2 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+3 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+4 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+5 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+6 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+7 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+8 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT+9 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-1 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-10 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-11 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-12 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-13 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-14 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-2 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-3 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-4 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-5 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-6 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-7 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-8 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT-9 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/GMT0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/Greenwich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/UCT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/UTC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/Universal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Etc/Zulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Amsterdam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Andorra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Astrakhan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Athens 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Belfast 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Belgrade 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Berlin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Bratislava 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Brussels 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Bucharest 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Budapest 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Busingen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Chisinau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Copenhagen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Dublin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Gibraltar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Guernsey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Helsinki 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Isle_of_Man 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Istanbul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Jersey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Kaliningrad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Kiev 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Kirov 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Lisbon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Ljubljana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/London 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Luxembourg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Madrid 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Malta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Mariehamn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Minsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Monaco 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Moscow 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Nicosia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Oslo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Paris 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Podgorica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Prague 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Riga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Rome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Samara 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/San_Marino 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Sarajevo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Saratov 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Simferopol 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Skopje 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Sofia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Stockholm 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Tallinn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Tirane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Tiraspol 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Ulyanovsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Uzhgorod 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Vaduz 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Vatican 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Vienna 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Vilnius 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Volgograd 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Warsaw 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Zagreb 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Zaporozhye 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Europe/Zurich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/GB 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/GB-Eire 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/GMT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/GMT+0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/GMT-0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/GMT0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Greenwich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/HST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Hongkong 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Iceland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Antananarivo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Chagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Christmas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Cocos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Comoro 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Kerguelen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Mahe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Maldives 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Mauritius 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Mayotte 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Indian/Reunion 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Iran 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Israel 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Jamaica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Japan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Kwajalein 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Libya 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/MET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/MST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/MST7MDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Mexico/BajaNorte 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Mexico/BajaSur 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Mexico/General 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/NZ 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/NZ-CHAT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Navajo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/PRC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/PST8PDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Apia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Auckland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Bougainville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Chatham 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Chuuk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Easter 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Efate 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Enderbury 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Fakaofo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Fiji 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Funafuti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Galapagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Gambier 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Guadalcanal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Guam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Honolulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Johnston 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Kiritimati 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Kosrae 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Kwajalein 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Majuro 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Marquesas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Midway 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Nauru 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Niue 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Norfolk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Noumea 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Pago_Pago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Palau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Pitcairn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Pohnpei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Ponape 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Port_Moresby 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Rarotonga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Saipan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Samoa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Tahiti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Tarawa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Tongatapu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Truk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Wake 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Wallis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Pacific/Yap 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Poland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Portugal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/ROC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/ROK 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Singapore 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Turkey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/UCT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Alaska 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Aleutian 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Arizona 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Central 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/East-Indiana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Eastern 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Hawaii 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Indiana-Starke 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Michigan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Mountain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Pacific 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/US/Samoa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/UTC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Universal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/W-SU 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/WET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/Zulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/iso3166.tab 274 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/leapseconds 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Abidjan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Accra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Addis_Ababa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Algiers 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Asmara 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Asmera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Bamako 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Bangui 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Banjul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Bissau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Blantyre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Brazzaville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Bujumbura 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Cairo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Casablanca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Ceuta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Conakry 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Dakar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Dar_es_Salaam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Djibouti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Douala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/El_Aaiun 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Freetown 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Gaborone 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Harare 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Johannesburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Juba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Kampala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Khartoum 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Kigali 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Kinshasa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Lagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Libreville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Lome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Luanda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Lubumbashi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Lusaka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Malabo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Maputo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Maseru 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Mbabane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Mogadishu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Monrovia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Nairobi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Ndjamena 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Niamey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Nouakchott 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Ouagadougou 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Porto-Novo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Sao_Tome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Timbuktu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Tripoli 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Tunis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Africa/Windhoek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Adak 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Anchorage 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Anguilla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Antigua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Araguaina 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Buenos_Aires 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Catamarca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/ComodRivadavia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Cordoba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Jujuy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/La_Rioja 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Mendoza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Rio_Gallegos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Salta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/San_Juan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/San_Luis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Tucuman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Argentina/Ushuaia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Aruba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Asuncion 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Atikokan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Atka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Bahia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Bahia_Banderas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Barbados 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Belem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Belize 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Blanc-Sablon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Boa_Vista 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Bogota 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Boise 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Buenos_Aires 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Cambridge_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Campo_Grande 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Cancun 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Caracas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Catamarca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Cayenne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Cayman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Chicago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Chihuahua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Coral_Harbour 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Cordoba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Costa_Rica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Creston 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Cuiaba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Curacao 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Danmarkshavn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Dawson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Dawson_Creek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Denver 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Detroit 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Dominica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Edmonton 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Eirunepe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/El_Salvador 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Ensenada 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Fort_Nelson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Fort_Wayne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Fortaleza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Glace_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Godthab 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Goose_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Grand_Turk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Grenada 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Guadeloupe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Guatemala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Guayaquil 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Guyana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Halifax 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Havana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Hermosillo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indiana/Indianapolis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indiana/Knox 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indiana/Marengo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indiana/Petersburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indiana/Tell_City 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indiana/Vevay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indiana/Vincennes 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indiana/Winamac 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Indianapolis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Inuvik 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Iqaluit 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Jamaica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Jujuy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Juneau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Kentucky/Louisville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Kentucky/Monticello 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Knox_IN 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Kralendijk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/La_Paz 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Lima 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Los_Angeles 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Louisville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Lower_Princes 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Maceio 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Managua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Manaus 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Marigot 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Martinique 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Matamoros 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Mazatlan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Mendoza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Menominee 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Merida 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Metlakatla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Mexico_City 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Miquelon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Moncton 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Monterrey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Montevideo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Montreal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Montserrat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Nassau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/New_York 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Nipigon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Nome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Noronha 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/North_Dakota/Beulah 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/North_Dakota/Center 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/North_Dakota/New_Salem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Nuuk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Ojinaga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Panama 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Pangnirtung 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Paramaribo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Phoenix 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Port-au-Prince 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Port_of_Spain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Porto_Acre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Porto_Velho 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Puerto_Rico 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Punta_Arenas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Rainy_River 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Rankin_Inlet 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Recife 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Regina 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Resolute 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Rio_Branco 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Rosario 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Santa_Isabel 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Santarem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Santiago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Santo_Domingo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Sao_Paulo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Scoresbysund 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Shiprock 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Sitka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/St_Barthelemy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/St_Johns 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/St_Kitts 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/St_Lucia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/St_Thomas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/St_Vincent 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Swift_Current 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Tegucigalpa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Thule 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Thunder_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Tijuana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Toronto 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Tortola 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Vancouver 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Virgin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Whitehorse 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Winnipeg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Yakutat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/America/Yellowknife 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Casey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Davis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/DumontDUrville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Macquarie 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Mawson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/McMurdo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Palmer 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Rothera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/South_Pole 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Syowa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Troll 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Antarctica/Vostok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Arctic/Longyearbyen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Aden 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Almaty 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Amman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Anadyr 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Aqtau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Aqtobe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Ashgabat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Ashkhabad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Atyrau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Baghdad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Bahrain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Baku 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Bangkok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Barnaul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Beirut 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Bishkek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Brunei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Calcutta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Chita 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Choibalsan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Chongqing 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Chungking 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Colombo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Dacca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Damascus 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Dhaka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Dili 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Dubai 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Dushanbe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Famagusta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Gaza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Harbin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Hebron 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Ho_Chi_Minh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Hong_Kong 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Hovd 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Irkutsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Istanbul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Jakarta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Jayapura 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Jerusalem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Kabul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Kamchatka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Karachi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Kashgar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Kathmandu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Katmandu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Khandyga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Kolkata 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Krasnoyarsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Kuala_Lumpur 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Kuching 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Kuwait 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Macao 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Macau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Magadan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Makassar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Manila 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Muscat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Nicosia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Novokuznetsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Novosibirsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Omsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Oral 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Phnom_Penh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Pontianak 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Pyongyang 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Qatar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Qostanay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Qyzylorda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Rangoon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Riyadh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Saigon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Sakhalin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Samarkand 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Seoul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Shanghai 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Singapore 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Srednekolymsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Taipei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Tashkent 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Tbilisi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Tehran 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Tel_Aviv 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Thimbu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Thimphu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Tokyo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Tomsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Ujung_Pandang 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Ulaanbaatar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Ulan_Bator 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Urumqi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Ust-Nera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Vientiane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Vladivostok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Yakutsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Yangon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Yekaterinburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Asia/Yerevan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Azores 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Bermuda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Canary 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Cape_Verde 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Faeroe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Faroe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Jan_Mayen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Madeira 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Reykjavik 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/South_Georgia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/St_Helena 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Atlantic/Stanley 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/ACT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Adelaide 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Brisbane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Broken_Hill 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Canberra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Currie 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Darwin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Eucla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Hobart 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/LHI 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Lindeman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Lord_Howe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Melbourne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/NSW 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/North 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Perth 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Queensland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/South 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Sydney 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Tasmania 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Victoria 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/West 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Australia/Yancowinna 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Brazil/Acre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Brazil/DeNoronha 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Brazil/East 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Brazil/West 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/CET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/CST6CDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Canada/Atlantic 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Canada/Central 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Canada/Eastern 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Canada/Mountain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Canada/Newfoundland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Canada/Pacific 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Canada/Saskatchewan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Canada/Yukon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Chile/Continental 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Chile/EasterIsland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Cuba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/EET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/EST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/EST5EDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Egypt 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Eire 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+1 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+10 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+11 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+12 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+2 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+3 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+4 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+5 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+6 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+7 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+8 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT+9 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-1 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-10 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-11 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-12 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-13 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-14 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-2 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-3 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-4 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-5 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-6 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-7 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-8 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT-9 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/GMT0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/Greenwich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/UCT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/UTC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/Universal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Etc/Zulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Amsterdam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Andorra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Astrakhan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Athens 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Belfast 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Belgrade 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Berlin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Bratislava 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Brussels 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Bucharest 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Budapest 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Busingen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Chisinau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Copenhagen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Dublin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Gibraltar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Guernsey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Helsinki 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Isle_of_Man 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Istanbul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Jersey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Kaliningrad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Kiev 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Kirov 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Lisbon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Ljubljana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/London 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Luxembourg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Madrid 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Malta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Mariehamn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Minsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Monaco 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Moscow 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Nicosia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Oslo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Paris 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Podgorica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Prague 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Riga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Rome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Samara 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/San_Marino 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Sarajevo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Saratov 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Simferopol 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Skopje 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Sofia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Stockholm 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Tallinn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Tirane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Tiraspol 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Ulyanovsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Uzhgorod 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Vaduz 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Vatican 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Vienna 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Vilnius 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Volgograd 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Warsaw 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Zagreb 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Zaporozhye 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Europe/Zurich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/GB 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/GB-Eire 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/GMT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/GMT+0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/GMT-0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/GMT0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Greenwich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/HST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Hongkong 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Iceland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Antananarivo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Chagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Christmas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Cocos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Comoro 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Kerguelen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Mahe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Maldives 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Mauritius 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Mayotte 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Indian/Reunion 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Iran 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Israel 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Jamaica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Japan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Kwajalein 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Libya 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/MET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/MST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/MST7MDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Mexico/BajaNorte 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Mexico/BajaSur 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Mexico/General 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/NZ 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/NZ-CHAT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Navajo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/PRC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/PST8PDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Apia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Auckland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Bougainville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Chatham 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Chuuk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Easter 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Efate 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Enderbury 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Fakaofo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Fiji 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Funafuti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Galapagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Gambier 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Guadalcanal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Guam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Honolulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Johnston 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Kiritimati 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Kosrae 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Kwajalein 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Majuro 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Marquesas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Midway 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Nauru 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Niue 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Norfolk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Noumea 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Pago_Pago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Palau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Pitcairn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Pohnpei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Ponape 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Port_Moresby 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Rarotonga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Saipan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Samoa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Tahiti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Tarawa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Tongatapu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Truk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Wake 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Wallis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Pacific/Yap 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Poland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Portugal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/ROC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/ROK 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Singapore 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Turkey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/UCT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Alaska 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Aleutian 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Arizona 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Central 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/East-Indiana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Eastern 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Hawaii 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Indiana-Starke 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Michigan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Mountain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Pacific 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/US/Samoa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/UTC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Universal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/W-SU 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/WET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posix/Zulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/posixrules 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Abidjan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Accra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Addis_Ababa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Algiers 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Asmara 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Asmera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Bamako 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Bangui 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Banjul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Bissau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Blantyre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Brazzaville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Bujumbura 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Cairo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Casablanca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Ceuta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Conakry 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Dakar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Dar_es_Salaam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Djibouti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Douala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/El_Aaiun 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Freetown 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Gaborone 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Harare 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Johannesburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Juba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Kampala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Khartoum 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Kigali 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Kinshasa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Lagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Libreville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Lome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Luanda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Lubumbashi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Lusaka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Malabo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Maputo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Maseru 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Mbabane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Mogadishu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Monrovia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Nairobi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Ndjamena 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Niamey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Nouakchott 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Ouagadougou 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Porto-Novo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Sao_Tome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Timbuktu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Tripoli 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Tunis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Africa/Windhoek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Adak 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Anchorage 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Anguilla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Antigua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Araguaina 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Buenos_Aires 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Catamarca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/ComodRivadavia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Cordoba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Jujuy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/La_Rioja 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Mendoza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Rio_Gallegos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Salta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/San_Juan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/San_Luis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Tucuman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Argentina/Ushuaia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Aruba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Asuncion 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Atikokan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Atka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Bahia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Bahia_Banderas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Barbados 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Belem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Belize 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Blanc-Sablon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Boa_Vista 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Bogota 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Boise 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Buenos_Aires 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Cambridge_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Campo_Grande 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Cancun 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Caracas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Catamarca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Cayenne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Cayman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Chicago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Chihuahua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Coral_Harbour 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Cordoba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Costa_Rica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Creston 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Cuiaba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Curacao 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Danmarkshavn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Dawson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Dawson_Creek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Denver 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Detroit 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Dominica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Edmonton 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Eirunepe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/El_Salvador 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Ensenada 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Fort_Nelson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Fort_Wayne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Fortaleza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Glace_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Godthab 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Goose_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Grand_Turk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Grenada 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Guadeloupe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Guatemala 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Guayaquil 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Guyana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Halifax 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Havana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Hermosillo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indiana/Indianapolis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indiana/Knox 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indiana/Marengo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indiana/Petersburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indiana/Tell_City 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indiana/Vevay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indiana/Vincennes 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indiana/Winamac 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Indianapolis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Inuvik 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Iqaluit 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Jamaica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Jujuy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Juneau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Kentucky/Louisville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Kentucky/Monticello 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Knox_IN 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Kralendijk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/La_Paz 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Lima 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Los_Angeles 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Louisville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Lower_Princes 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Maceio 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Managua 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Manaus 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Marigot 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Martinique 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Matamoros 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Mazatlan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Mendoza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Menominee 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Merida 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Metlakatla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Mexico_City 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Miquelon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Moncton 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Monterrey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Montevideo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Montreal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Montserrat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Nassau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/New_York 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Nipigon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Nome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Noronha 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/North_Dakota/Beulah 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/North_Dakota/Center 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/North_Dakota/New_Salem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Nuuk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Ojinaga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Panama 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Pangnirtung 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Paramaribo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Phoenix 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Port-au-Prince 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Port_of_Spain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Porto_Acre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Porto_Velho 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Puerto_Rico 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Punta_Arenas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Rainy_River 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Rankin_Inlet 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Recife 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Regina 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Resolute 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Rio_Branco 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Rosario 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Santa_Isabel 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Santarem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Santiago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Santo_Domingo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Sao_Paulo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Scoresbysund 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Shiprock 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Sitka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/St_Barthelemy 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/St_Johns 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/St_Kitts 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/St_Lucia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/St_Thomas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/St_Vincent 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Swift_Current 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Tegucigalpa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Thule 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Thunder_Bay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Tijuana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Toronto 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Tortola 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Vancouver 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Virgin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Whitehorse 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Winnipeg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Yakutat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/America/Yellowknife 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Casey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Davis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/DumontDUrville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Macquarie 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Mawson 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/McMurdo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Palmer 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Rothera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/South_Pole 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Syowa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Troll 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Antarctica/Vostok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Arctic/Longyearbyen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Aden 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Almaty 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Amman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Anadyr 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Aqtau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Aqtobe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Ashgabat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Ashkhabad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Atyrau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Baghdad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Bahrain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Baku 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Bangkok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Barnaul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Beirut 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Bishkek 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Brunei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Calcutta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Chita 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Choibalsan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Chongqing 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Chungking 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Colombo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Dacca 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Damascus 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Dhaka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Dili 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Dubai 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Dushanbe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Famagusta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Gaza 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Harbin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Hebron 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Ho_Chi_Minh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Hong_Kong 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Hovd 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Irkutsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Istanbul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Jakarta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Jayapura 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Jerusalem 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Kabul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Kamchatka 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Karachi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Kashgar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Kathmandu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Katmandu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Khandyga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Kolkata 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Krasnoyarsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Kuala_Lumpur 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Kuching 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Kuwait 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Macao 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Macau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Magadan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Makassar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Manila 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Muscat 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Nicosia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Novokuznetsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Novosibirsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Omsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Oral 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Phnom_Penh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Pontianak 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Pyongyang 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Qatar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Qostanay 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Qyzylorda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Rangoon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Riyadh 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Saigon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Sakhalin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Samarkand 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Seoul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Shanghai 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Singapore 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Srednekolymsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Taipei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Tashkent 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Tbilisi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Tehran 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Tel_Aviv 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Thimbu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Thimphu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Tokyo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Tomsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Ujung_Pandang 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Ulaanbaatar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Ulan_Bator 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Urumqi 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Ust-Nera 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Vientiane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Vladivostok 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Yakutsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Yangon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Yekaterinburg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Asia/Yerevan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Azores 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Bermuda 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Canary 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Cape_Verde 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Faeroe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Faroe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Jan_Mayen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Madeira 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Reykjavik 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/South_Georgia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/St_Helena 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Atlantic/Stanley 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/ACT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Adelaide 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Brisbane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Broken_Hill 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Canberra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Currie 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Darwin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Eucla 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Hobart 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/LHI 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Lindeman 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Lord_Howe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Melbourne 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/NSW 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/North 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Perth 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Queensland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/South 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Sydney 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Tasmania 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Victoria 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/West 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Australia/Yancowinna 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Brazil/Acre 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Brazil/DeNoronha 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Brazil/East 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Brazil/West 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/CET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/CST6CDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Canada/Atlantic 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Canada/Central 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Canada/Eastern 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Canada/Mountain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Canada/Newfoundland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Canada/Pacific 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Canada/Saskatchewan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Canada/Yukon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Chile/Continental 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Chile/EasterIsland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Cuba 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/EET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/EST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/EST5EDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Egypt 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Eire 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+1 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+10 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+11 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+12 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+2 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+3 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+4 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+5 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+6 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+7 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+8 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT+9 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-1 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-10 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-11 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-12 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-13 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-14 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-2 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-3 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-4 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-5 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-6 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-7 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-8 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT-9 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/GMT0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/Greenwich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/UCT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/UTC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/Universal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Etc/Zulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Amsterdam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Andorra 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Astrakhan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Athens 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Belfast 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Belgrade 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Berlin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Bratislava 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Brussels 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Bucharest 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Budapest 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Busingen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Chisinau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Copenhagen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Dublin 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Gibraltar 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Guernsey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Helsinki 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Isle_of_Man 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Istanbul 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Jersey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Kaliningrad 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Kiev 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Kirov 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Lisbon 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Ljubljana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/London 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Luxembourg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Madrid 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Malta 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Mariehamn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Minsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Monaco 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Moscow 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Nicosia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Oslo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Paris 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Podgorica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Prague 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Riga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Rome 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Samara 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/San_Marino 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Sarajevo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Saratov 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Simferopol 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Skopje 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Sofia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Stockholm 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Tallinn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Tirane 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Tiraspol 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Ulyanovsk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Uzhgorod 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Vaduz 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Vatican 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Vienna 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Vilnius 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Volgograd 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Warsaw 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Zagreb 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Zaporozhye 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Europe/Zurich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/GB 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/GB-Eire 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/GMT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/GMT+0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/GMT-0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/GMT0 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Greenwich 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/HST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Hongkong 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Iceland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Antananarivo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Chagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Christmas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Cocos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Comoro 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Kerguelen 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Mahe 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Maldives 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Mauritius 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Mayotte 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Indian/Reunion 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Iran 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Israel 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Jamaica 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Japan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Kwajalein 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Libya 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/MET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/MST 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/MST7MDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Mexico/BajaNorte 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Mexico/BajaSur 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Mexico/General 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/NZ 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/NZ-CHAT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Navajo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/PRC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/PST8PDT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Apia 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Auckland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Bougainville 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Chatham 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Chuuk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Easter 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Efate 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Enderbury 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Fakaofo 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Fiji 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Funafuti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Galapagos 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Gambier 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Guadalcanal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Guam 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Honolulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Johnston 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Kiritimati 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Kosrae 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Kwajalein 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Majuro 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Marquesas 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Midway 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Nauru 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Niue 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Norfolk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Noumea 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Pago_Pago 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Palau 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Pitcairn 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Pohnpei 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Ponape 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Port_Moresby 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Rarotonga 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Saipan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Samoa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Tahiti 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Tarawa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Tongatapu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Truk 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Wake 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Wallis 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Pacific/Yap 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Poland 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Portugal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/ROC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/ROK 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Singapore 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Turkey 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/UCT 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Alaska 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Aleutian 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Arizona 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Central 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/East-Indiana 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Eastern 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Hawaii 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Indiana-Starke 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Michigan 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Mountain 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Pacific 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/US/Samoa 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/UTC 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Universal 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/W-SU 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/WET 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/right/Zulu 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/tzdata.zi 4457 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/zone.tab 451 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/dxmodules/zoneinfo/zone1970.tab 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/access_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/access_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn11.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn12.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn13.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn21.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn22.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn23.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn31.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn32.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/btn33.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/control_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/door_close.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/door_open.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/emergency.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/emergency_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/emergency_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/failed.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/light_close.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/light_open.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/network.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/user2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/user2_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify_10x_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify_10x_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify_200_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify_200_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify_300_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify_300_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify_400_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/CN/wav/verify_400_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/network.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify_10x_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify_10x_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify_200_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify_200_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify_300_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify_300_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify_400_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/EN/wav/verify_400_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/font/AlibabaPuHuiTi-3-65-Medium.ttf 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/font/Arabic.ttf 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/font/Korean.ttf 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/i18n/CN.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/i18n/EN.json 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/4g.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/4g_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/accessCtrl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/add.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/advance.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/app_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/app_qrcode.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/arrow_right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/back.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/back_2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/background.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/backspace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/basic.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/black_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/card.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/close.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/close_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/cloudCert.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/co2_f.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/co2_s.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/commMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/config_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/delete.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/delete_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/devInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/deviceInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/doorControl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/down.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/emergencyOpen.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/empty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/enter.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/enter_b.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/eth_disable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/eth_enable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/ethernet.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/ethernet_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/eye-fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/eye-off.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/eye_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/eye_fill_show.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/face.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/faceAdd.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/faceEmpty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/faceError.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/faceRec.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/faceRec2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/factoryTest.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/failBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/grey_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/help.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/idleImage.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/input_bg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/light_close.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/light_open.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/localUser.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/lock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/menu_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/mini_app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/mini_background.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/mini_config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/mini_password.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/mqtt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/mqtt_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/mqtt_enable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/network.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/networkSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/network_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/o2_f.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/o2_s.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/ph3_f.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/ph3_s.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/pwd_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/qrcode_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/recQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/recordQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/rectangle.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/register.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/select_arrow.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/setting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/setting32.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/space.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/successBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/success_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/sysSettings.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/sys_info.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/systemSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/title_bg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/trackFace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/unlock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/user.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/userGuide.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/userMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/user_1.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/user_f.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/user_s.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/user_w.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/4g.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/4g_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/accessCtrl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/add.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/advance.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/app_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/app_qrcode.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/arrow_right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/back.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/back_2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/background.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/backspace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/basic.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/black_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/card.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/close.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/close_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/cloudCert.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/commMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/config_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/delete.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/delete_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/devInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/developer.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/deviceInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/doorControl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/down.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/empty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/enter.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/enter_b.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/eth_disable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/eth_enable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/ethernet.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/ethernet_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/eye-fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/eye-off.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/eye_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/eye_fill_show.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/face.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/faceAdd.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/faceEmpty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/faceError.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/faceRec.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/faceRec2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/factoryTest.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/failBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/fingerBoxF.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/fingerBoxS.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/fingerRe0.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/fingerRe1.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/fingerRe2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/fingerRe3.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/grey_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/help.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/idleImage.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/idleImage.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/localUser.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/lock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/menu_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/mini_app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/mini_background.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/mini_config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/mini_password.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/mqtt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/mqtt_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/network.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/networkSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/network_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/pwd_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/qrcode_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/recQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/recordQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/rectangle.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/register.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/select_arrow.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/setting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/setting32.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/space.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/successBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/success_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/sysSettings.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/sys_info.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/systemSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/trackFace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/unlock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/user.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/userGuide.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/userMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/vip.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/voiceBroadcast.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/wechat.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/wifi.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf105/wifi_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/4g.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/4g_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/accessCtrl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/add.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/advance.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/app_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/app_qrcode.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/arrow_right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/back.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/back_2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/background.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/backspace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/basic.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/black_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/card.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/close.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/close_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/cloudCert.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/commMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/config_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/delete.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/delete_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/devInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/developer.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/deviceInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/doorControl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/down.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/empty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/enter.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/enter_b.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/eth_disable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/eth_enable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/ethernet.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/ethernet_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/eye-fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/eye-off.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/eye_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/eye_fill_show.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/face.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/faceAdd.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/faceEmpty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/faceError.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/faceRec.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/faceRec2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/factoryTest.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/failBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/fingerBoxF.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/fingerBoxS.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/fingerRe0.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/fingerRe1.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/fingerRe2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/fingerRe3.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/grey_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/help.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/idleImage.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/idleImage.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/localUser.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/lock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/menu_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/mini_app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/mini_background.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/mini_config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/mini_password.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/mqtt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/mqtt_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/network.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/networkSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/network_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/pwd_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/qrcode_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/recQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/recordQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/rectangle.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/register.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/select_arrow.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/setting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/setting32.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/space.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/successBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/success_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/sysSettings.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/sys_info.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/systemSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/trackFace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/unlock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/user.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/userGuide.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/userMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/vip.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/voiceBroadcast.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/wechat.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/wifi.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf114/wifi_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/4g.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/4g_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/accessCtrl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/add.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/advance.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/app_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/app_qrcode.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/arrow_right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/back.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/back_2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/background.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/backspace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/basic.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/black_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/card.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/close.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/close_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/cloudCert.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/commMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/config_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/delete.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/delete_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/devInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/developer.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/deviceInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/doorControl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/down.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/empty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/enter.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/enter_b.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/eth_disable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/eth_enable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/ethernet.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/ethernet_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/eye-fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/eye-off.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/eye_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/eye_fill_show.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/face.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/faceAdd.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/faceEmpty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/faceError.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/faceRec.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/faceRec2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/factoryTest.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/failBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/grey_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/help.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/idleImage.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/idleImage.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/localUser.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/lock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/menu_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/mini_app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/mini_background.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/mini_config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/mini_password.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/mqtt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/mqtt_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/network.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/networkSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/network_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/pwd_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/qrcode_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/recQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/recordQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/rectangle.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/register.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/select_arrow.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/setting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/setting32.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/space.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/successBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/success_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/sysSettings.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/sys_info.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/systemSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/tip_card.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/trackFace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/unlock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/user.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/userGuide.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/userMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/vip.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/voiceBroadcast.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/wechat.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/wifi.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf202/wifi_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/4g.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/4g_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/accessCtrl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/add.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/advance.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/app_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/app_qrcode.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/arrow_right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/back.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/back_2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/background.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/backspace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/basic.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/black_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/card.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/close.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/close_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/cloudCert.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/commMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/config_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/delete.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/delete_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/devInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/developer.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/deviceInfo.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/doorControl.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/down.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/empty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/enter.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/enter_b.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/eth_disable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/eth_enable.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/ethernet.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/ethernet_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/eye-fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/eye-off.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/eye_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/eye_fill_show.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/face.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/faceAdd.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/faceEmpty.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/faceError.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/faceRec.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/faceRec2.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/factoryTest.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/failBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/grey_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/help.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/idleImage.jpg 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/idleImage.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/localUser.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/lock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/menu_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/mini_app.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/mini_background.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/mini_config.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/mini_password.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/mqtt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/mqtt_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/network.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/networkSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/network_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/pwd_btn.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/qrcode_small.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/recQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/recordQuery.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/rectangle.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/register.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/right.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/select_arrow.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/setting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/setting32.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/space.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/successBg.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/success_fill.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/sysSettings.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/sys_info.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/systemSetting.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/trackFace.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/unlock.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/user.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/userGuide.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/userMgmt.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/vip.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/voiceBroadcast.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/wechat.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/wifi.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vf203/wifi_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/view_f.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/view_s.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/vip.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/voiceBroadcast.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/wifi.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/image/wifi_dark.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/langPack.js 3578 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/AR/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/CN/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/DE/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/EN/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/ES/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/FR/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/.DS_Store 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/KO/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/PT/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/calibration_1s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/calibration_2s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/calibration_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/fingerF.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/fingerInput1.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/fingerInput2.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/fingerInput3.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/fingerR.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/fingerS.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/fingerT.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/read.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/recg_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/recg_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/recognition.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/recognition_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/register.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/stranger.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/verify.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/verify_f.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/RU/verify_s.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/alarm.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/success.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/wav/tamper.wav 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/config.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/css/app.7043d6da.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/css/chunk-vendors.6b92dc4c.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/fonts/element-icons.535877f5.woff 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/fonts/element-icons.732389de.ttf 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/img/bg.a32161db.png 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/img/iconfont.675b1cb4.svg 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/index.css 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/index.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/js/app.da6752e9.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/js/app.da6752e9.js.map 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/js/chunk-vendors.303b1624.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/resource/web/js/chunk-vendors.303b1624.js.map 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/common/consts/configConst.js 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/common/utils/codeUtils.js 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/common/utils/netUtils.js 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/common/utils/stringUtils.js 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/common/utils/tokenUtil.js 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/common/utils/utils.js 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/config.json 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/controller.js 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/driver.js 845 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/main.js 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/screen.js 1318 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/accessService.js 805 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/api.js 1333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/codeService.js 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/configService.js 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/faceService.js 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/fingerService.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/gpiokeyService.js 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/grainService.js 681 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/httpService.js 1046 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/mqttService.js 495 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/nfcService.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/sqliteService.js 630 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/uartBleService.js 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/uartCodeService.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/service/weComService.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/services.js 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/appView.js 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/configView.js 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/identityVerificationView.js 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/cloudCertView.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/developer/capcalView.js 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/developerView.js 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/deviceInfo/dataCapacityInfoView.js 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/deviceInfo/systemInfoView.js 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/deviceInfoView.js 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/doorControlView.js 265 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/helpView.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/localUser/faceEnterView.js 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/localUser/fingerApplyView.js 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/localUser/fingerEnterView.js 405 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/localUser/localUserAddView.js 832 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/localUserView.js 335 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/networkSettingView.js 664 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/recordQuery/recordQueryDetailView.js 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/recordQueryView.js 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/systemSetting/displaySettingView.js 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/systemSetting/faceRecognitionSettingView.js 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/systemSetting/passLogSettingView.js 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/systemSetting/passwordManagementView.js 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/systemSetting/passwordOpenDoorSettingView.js 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/systemSetting/swipeCardRecognitionSettingView.js 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/systemSetting/timeSettingView.js 990 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/systemSettingView.js 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/menu/voiceBroadcastView.js 202 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/config/newPwdView.js 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/emergencyPwdView.js 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/gasDetailView.js 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/i18n.js 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/idleView.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/mainView.js 1644 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/pinyin/dict.js 410 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/pinyin/pinyin.js 1050 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/pwdView.js 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/topView.js 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/viewUtils.js 691 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/wechatBindView.js 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/wechatFaceView.js 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/view/wechatNetView.js 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/worker/mqttWorker.js 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/worker/netWorker.js 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/worker/passRecordWorker.js 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/src/worker/screenWorker.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vf107/.temp/dxide_debug.log
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
[2026/4/11 13:35:44] --- Start runUsb ---
[2026/4/11 13:35:44] Platform: win32
[2026/4/11 13:35:44] Kill command defined: wmic process where "name='node.exe' and commandline like '%device_manager.js%'" delete || powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'node.exe' -and $_.CommandLine -like '*device_manager.js*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }"
[2026/4/11 13:35:44] Node.js check passed
[2026/4/11 13:35:45] Process exited with code: 0, signal: null
[2026/4/11 13:35:45] Kill stdout: É¾ï¿½ï¿½Êµï¿½ï¿½ \\ACER-LGQ\ROOT\CIMV2:Win32_Process.Handle="31720"
ʵ��ɾ���ɹ���
[2026/4/11 13:35:45] Manager script path: c:\Users\lgq10\.vscode\extensions\dxide.dxide-1.0.41\src\device\device_manager.js
[2026/4/11 13:35:45] Spawning child process...
[2026/4/11 13:35:45] Sending connect command: {"cmd":"connect","lang":"zh","model":"VF105_V12"}
vf107/.temp/md5s.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2721 @@
{
  "app.dxproj": "0029df84b57cdffbbc22d546e0e41eed",
  "dxmodules\\crypto-es\\aes.js": "f5051ae3e240e86f1462fa124c91e34d",
  "dxmodules\\crypto-es\\blowfish.js": "a6a17efb551cdd4dea32a0248c7301eb",
  "dxmodules\\crypto-es\\cipher-core.js": "e7c981251689145cfd8e1cd8fc706530",
  "dxmodules\\crypto-es\\core.js": "aff6ed577b1afec6b04d68e7dce1d71a",
  "dxmodules\\crypto-es\\enc-base64.js": "017d46c5dad13cade58c2cac1d6f5edf",
  "dxmodules\\crypto-es\\enc-base64url.js": "02a7c1b1bfa56f15696ad4cade9efcac",
  "dxmodules\\crypto-es\\enc-utf16.js": "6175f56d0133cb3c253fc33d37943496",
  "dxmodules\\crypto-es\\evpkdf.js": "b3dd824edce293775623ec11d698934c",
  "dxmodules\\crypto-es\\format-hex.js": "192580e6589e2f9e5e6d2421ef970228",
  "dxmodules\\crypto-es\\hmac.js": "b3e954bba3c4d3758c556eabb9f07a4f",
  "dxmodules\\crypto-es\\index.js": "1ab9991ea80626fc1f48b8d20d91146a",
  "dxmodules\\crypto-es\\md5.js": "22b9bf748f4874efced6f24843d9717d",
  "dxmodules\\crypto-es\\mode-cfb.js": "dc945b79189a16a04fb8809cb1ac63ae",
  "dxmodules\\crypto-es\\mode-ctr-gladman.js": "985134d79f545e9090b832dd8790bdcb",
  "dxmodules\\crypto-es\\mode-ctr.js": "8aaf3891ab740c008923c8f6a1a404cc",
  "dxmodules\\crypto-es\\mode-ecb.js": "0c6483c6b907719823c2a20168555654",
  "dxmodules\\crypto-es\\mode-ofb.js": "60db86b4aa9f698949093c6c234b9584",
  "dxmodules\\crypto-es\\pad-ansix923.js": "eafdac5e3d4c90c273f1c34ee39f5f95",
  "dxmodules\\crypto-es\\pad-iso10126.js": "80893798281a09346db1ffebd9550da0",
  "dxmodules\\crypto-es\\pad-iso97971.js": "50bb9404565dcdd2e7007b8a226d2d05",
  "dxmodules\\crypto-es\\pad-nopadding.js": "8a873480d9df86d8a04d382ddbe31b3a",
  "dxmodules\\crypto-es\\pad-zeropadding.js": "2a2ad73f1e17617337c3e498c3b1b145",
  "dxmodules\\crypto-es\\pbkdf2.js": "effcee485c8753470be8737e6e86e203",
  "dxmodules\\crypto-es\\rabbit-legacy.js": "580adab56a5e75aa7fa71ce7a79baeca",
  "dxmodules\\crypto-es\\rabbit.js": "79323a58e0aa1df18d3c6920ea2bff94",
  "dxmodules\\crypto-es\\rc4.js": "c76f35711e13d143f36b3c3032926aba",
  "dxmodules\\crypto-es\\README.md": "f7f10d1eb7ac11ab28105200455e9dc8",
  "dxmodules\\crypto-es\\ripemd160.js": "8321142c9245a95ff86519b0564e04c9",
  "dxmodules\\crypto-es\\sha1.js": "20f5f5895e00141cbba984369cc85677",
  "dxmodules\\crypto-es\\sha224.js": "a022faef3a3261f2ef46aad689868663",
  "dxmodules\\crypto-es\\sha256.js": "b56fc502be36fd7748191ef2ab848aa1",
  "dxmodules\\crypto-es\\sha3.js": "1e8ad2a56cf2900bcb2f92ae118a8f10",
  "dxmodules\\crypto-es\\sha384.js": "761d6fdde71581343ac4ea0b15ebc95d",
  "dxmodules\\crypto-es\\sha512.js": "1b90fae85bb88280ddc0603be4c9ff9a",
  "dxmodules\\crypto-es\\tripledes.js": "90b881b6a598aab6861b2537c147b3f7",
  "dxmodules\\crypto-es\\x64-core.js": "9cb085fad93878dd85edaaa37aa1e4b5",
  "dxmodules\\dxAudio.js": "13780dfd75bbf177bf1f242196f671df",
  "dxmodules\\dxBase64.js": "7cb517ecd99830dde0ec13a501e831ea",
  "dxmodules\\dxCamera.js": "2e74003e95eb396effb2426fc5db9e04",
  "dxmodules\\dxCapcal.js": "c56a3ef1feda15e9da6e39d8f0fdb528",
  "dxmodules\\dxChannel.js": "f6939b18d179587910904dc37a3b88e6",
  "dxmodules\\dxCommon.js": "7face5a0721bd302d666b12c30a17166",
  "dxmodules\\dxCommonUtils.js": "9d408cedb29cce9838c10ae5d1a8c2aa",
  "dxmodules\\dxConfig.js": "24072559b3cb1ec5c206cb358eaaaaae",
  "dxmodules\\dxDisplay.js": "5c80ee7de62e3f7b08eed6e3e0a8b3c1",
  "dxmodules\\dxDriver.js": "1e27304f7ecc691ac66293cd065e6a14",
  "dxmodules\\dxEventBus.js": "075ac9f2d465c92a9446ea07a6e2bfe6",
  "dxmodules\\dxFacial.js": "08f40369fd06cb3f5f69cd035d4ecab2",
  "dxmodules\\dxFacialBarcode.js": "67508897203cf7382f4bb20c4044dc17",
  "dxmodules\\dxFingerMz.js": "4e2d6794d3a5c38dfcf80f24b4d9f8e6",
  "dxmodules\\dxFingerZaz.js": "47463d6c6ee81f2373df95fe3638ab9c",
  "dxmodules\\dxGpio.js": "30c34469e2dc8d80026fc5eac5bfd1f7",
  "dxmodules\\dxGpioKey.js": "3877f16ccf0987cd491adbf2f8f97f2e",
  "dxmodules\\dxHttp.js": "fa75a0a2951399fb5af7618d7ab4c6f1",
  "dxmodules\\dxHttpClient.js": "0f81691b2405d87e8fa230e1223f7b78",
  "dxmodules\\dxHttpServer.js": "bd66e578dcbe66934548c2a52aa56ab0",
  "dxmodules\\dxLogger.js": "be5516b1419e1e6c98947196cd4c5df1",
  "dxmodules\\dxMap.js": "61c9b76b7e05e4e8bebeccd1dfaaa963",
  "dxmodules\\dxMqttClient.js": "d18248384c1ecee412c1f1ba86c233ac",
  "dxmodules\\dxNetwork.js": "e377baf713245bf54012d56ea15b48d2",
  "dxmodules\\dxNfc.js": "feb5bc21d4b13ab9736de1941290312d",
  "dxmodules\\dxNfcCard.js": "689161d840c1ee82107e55b3e43da5c3",
  "dxmodules\\dxNtp.js": "54a83064faa67f8f4991e1da56a3caf4",
  "dxmodules\\dxOs.js": "8171120055734e75dd6c878862ae965a",
  "dxmodules\\dxOta.js": "a4bf84aaead7298c5da10161644f2b1f",
  "dxmodules\\dxPwm.js": "d8238b43ef7c0d77a33108290394e12c",
  "dxmodules\\dxQrRule.js": "bfa9e2b4725c4fa358a2988f63c67210",
  "dxmodules\\dxSqliteDB.js": "4762a29fb74d837d43d1d19415f77536",
  "dxmodules\\dxStd.js": "322e8885cd0c7d2d9137b47fec8c8b00",
  "dxmodules\\dxTimeZones.js": "c05c66e1fc1dfea0aca722f148190148",
  "dxmodules\\dxUart.js": "0cb032a9f73a894b601ff7fef1c648e7",
  "dxmodules\\dxVgBle.js": "348e4999a1c77d85bfc962c6fbdcc742",
  "dxmodules\\dxWatchdog.js": "4833387ea9787b18a8c75a4ffc57b35e",
  "dxmodules\\dxWorkerPool.js": "77ec46afea15eac3ff99c41fb23f43ff",
  "dxmodules\\libasound.so.2": "c2cf01ef989d7e237b1d6fbc7e8dd864",
  "dxmodules\\libatopology.so.2": "f8ea786abf596b37cf4546aa451a6c46",
  "dxmodules\\libpaho-mqtt3cs.so.1": "87713197d248b22ee3dffe89f166d472",
  "dxmodules\\libvbar-b-dxgpio.so": "ca009351ab7d9719a71cd6105e9acba6",
  "dxmodules\\libvbar-b-dxpwm.so": "6d90f8d1171b16aa583a0c7fcc4f43a1",
  "dxmodules\\libvbar-drv-audio_gain.so": "2eec6e720acaee6c4328cb75f5ae11d1",
  "dxmodules\\libvbar-drv-capcal.so": "6236c6a52401d47047b4f34ad55f7e3d",
  "dxmodules\\libvbar-drv-capturer.so": "92a4e62761f88eaaa185782f790d0e43",
  "dxmodules\\libvbar-drv-display.so": "29349e3c7335720975018beb02401b79",
  "dxmodules\\libvbar-drv-face.so": "ed17b2951e8a72aced9a144bd90e3e89",
  "dxmodules\\libvbar-drv-gpio.so": "3f0abbaee2f972c4ed88fb0a6964e532",
  "dxmodules\\libvbar-drv-memory.so": "0ed48486e154f24d6681a0195a7525ad",
  "dxmodules\\libvbar-drv-pwm.so": "975d6cbb5529c3ddd2514653b4fbe4af",
  "dxmodules\\libvbar-drv-soc.so": "73e4b6657af4bcff0affaacf55702096",
  "dxmodules\\libvbar-drv-tts.so": "1b3893d2efb58a1ffbfb0fa42915e3c7",
  "dxmodules\\libvbar-drv-watchdog.so": "6226d1373d012eadeab2d0b895dd4367",
  "dxmodules\\libvbar-m-audio.so": "000a366ffd92abe7dfe0b8b656b7b8a9",
  "dxmodules\\libvbar-m-capturer.so": "8f0b6383db39494904294c3f60c5f013",
  "dxmodules\\libvbar-m-channel.so": "bcb6746b5325793eca68a29b63aa1217",
  "dxmodules\\libvbar-m-common.so": "b3821e6a3cb54a3afb3029ab1a7e68d6",
  "dxmodules\\libvbar-m-dxaudio.so": "3d4f148f8293a48e03d64320e511520b",
  "dxmodules\\libvbar-m-dxchannel.so": "3ba10035946cff6fbdffac07ef9df9cc",
  "dxmodules\\libvbar-m-dxcommon.so": "538dec5814f2e8f030813cd88bb0703f",
  "dxmodules\\libvbar-m-dxcommonutils.so": "c72011e82a558a4e84819645700ec879",
  "dxmodules\\libvbar-m-dxdisplay.so": "4de71b250645bcf8e63da84015976196",
  "dxmodules\\libvbar-m-dxfacial.so": "a401e8e0460a881d748bba0cf235a5a9",
  "dxmodules\\libvbar-m-dxhttpclient.so": "9d2ce48027e5afcb1e85b5703a5f1f53",
  "dxmodules\\libvbar-m-dxhttpserver.so": "7238d45c439402b79b696067b3eb2ec8",
  "dxmodules\\libvbar-m-dxkey.so": "e9efc4894bcd538c2a59d048ca57c70a",
  "dxmodules\\libvbar-m-dxmap.so": "d692e8e4ed4b1198f0a7f2f3eefd7865",
  "dxmodules\\libvbar-m-dxmqttclient.so": "9b7e75398a0f3d2bf138deead9221c46",
  "dxmodules\\libvbar-m-dxnetwork.so": "e4d4f8b955b9f871cf913607f0dd406a",
  "dxmodules\\libvbar-m-dxnfccard.so": "d7f14dddded1ffd89475f18a092c8530",
  "dxmodules\\libvbar-m-dxos.so": "b46dd08ab1769f5c246c284f83311294",
  "dxmodules\\libvbar-m-dxsqlitedb.so": "7581e5d8a56f6d9c23885e4ceb57e4a2",
  "dxmodules\\libvbar-m-dxuart.so": "e59a58bddafa0d7fa8d13387feb59946",
  "dxmodules\\libvbar-m-dxwatchdog.so": "9854b627923ad943b2b34250ba717505",
  "dxmodules\\libvbar-m-eid.so": "a4d1b2fa880f6d67e805dfca07f26523",
  "dxmodules\\libvbar-m-key.so": "a51d6ce68a66e21865a47cf5a350ce80",
  "dxmodules\\libvbar-m-net.so": "e058b3e454d27044d6544dbfe13a3254",
  "dxmodules\\libvbar-p-nfc.so": "1b3af2b46962720f8f13a7c275576049",
  "dxmodules\\libzbar.so": "dc72c4323c8b5616037b8ebf32740665",
  "dxmodules\\vbar_version": "ecaec8f34eac0b8b086a1638030427bc",
  "dxmodules\\vgUartWorker.js": "fc3e9e0051836d5063c0eecf555d9521",
  "dxmodules\\zoneinfo\\Africa\\Abidjan": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Accra": "6cb97bef390f7c65022c2e8c7eec45e0",
  "dxmodules\\zoneinfo\\Africa\\Addis_Ababa": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Algiers": "3342407b34291d264175caaf37813938",
  "dxmodules\\zoneinfo\\Africa\\Asmara": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Asmera": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Bamako": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Bangui": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Banjul": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Bissau": "af82ce73e5877a3dfd5c9dc93e869fa9",
  "dxmodules\\zoneinfo\\Africa\\Blantyre": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Brazzaville": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Bujumbura": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Cairo": "b9bb9d8c3cddc72252f4aa2082af4213",
  "dxmodules\\zoneinfo\\Africa\\Casablanca": "565d702c341dd4239a7e76208653c18c",
  "dxmodules\\zoneinfo\\Africa\\Ceuta": "5c2bf01f3f9fadcfa9a188e594f232e9",
  "dxmodules\\zoneinfo\\Africa\\Conakry": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Dakar": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Dar_es_Salaam": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Djibouti": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Douala": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\El_Aaiun": "b5acb6aaf433bd0dfe09d90fcc30c7e3",
  "dxmodules\\zoneinfo\\Africa\\Freetown": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Gaborone": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Harare": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Johannesburg": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\Africa\\Juba": "659ed8d529baf6f5043db708c1d17bee",
  "dxmodules\\zoneinfo\\Africa\\Kampala": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Khartoum": "021e36c906192435e0cb9c09440173a3",
  "dxmodules\\zoneinfo\\Africa\\Kigali": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Kinshasa": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Lagos": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Libreville": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Lome": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Luanda": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Lubumbashi": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Lusaka": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Malabo": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Maputo": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Maseru": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\Africa\\Mbabane": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\Africa\\Mogadishu": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Monrovia": "896a875aafa39c10b614c9803d1f2673",
  "dxmodules\\zoneinfo\\Africa\\Nairobi": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Ndjamena": "a0aad5ca661653e362b8afc808dc85c1",
  "dxmodules\\zoneinfo\\Africa\\Niamey": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Nouakchott": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Ouagadougou": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Porto-Novo": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Sao_Tome": "06142521165cb91ddc40c1d9000c7038",
  "dxmodules\\zoneinfo\\Africa\\Timbuktu": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Tripoli": "edec79f292e5b8c0d32b521af1f118bd",
  "dxmodules\\zoneinfo\\Africa\\Tunis": "4f1b4fe95a2512916e20c6f6e26d8e3c",
  "dxmodules\\zoneinfo\\Africa\\Windhoek": "6e9276508be4c6bfa224b9dddfefa61e",
  "dxmodules\\zoneinfo\\America\\Adak": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\America\\Anchorage": "596428a3a840d568656088bd48e608f1",
  "dxmodules\\zoneinfo\\America\\Anguilla": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Antigua": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Araguaina": "f41ab2d0a7a5b7fa0e3d3ac456b6bc97",
  "dxmodules\\zoneinfo\\America\\Argentina\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49",
  "dxmodules\\zoneinfo\\America\\Argentina\\Catamarca": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\America\\Argentina\\ComodRivadavia": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\America\\Argentina\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\America\\Argentina\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11",
  "dxmodules\\zoneinfo\\America\\Argentina\\La_Rioja": "00095a6391dda3fdca483ec5847abf2b",
  "dxmodules\\zoneinfo\\America\\Argentina\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870",
  "dxmodules\\zoneinfo\\America\\Argentina\\Rio_Gallegos": "b97bc475f57e6b72c5ef969ed629e144",
  "dxmodules\\zoneinfo\\America\\Argentina\\Salta": "ed7e059362f3ae6381c2390798b0d524",
  "dxmodules\\zoneinfo\\America\\Argentina\\San_Juan": "7c35305a9821e159720fae50b96790ca",
  "dxmodules\\zoneinfo\\America\\Argentina\\San_Luis": "3e91f210d3eedf4543a4b716a5ba504c",
  "dxmodules\\zoneinfo\\America\\Argentina\\Tucuman": "b58092fe8d0461c10f5c3153ad9ed653",
  "dxmodules\\zoneinfo\\America\\Argentina\\Ushuaia": "b1d065d0cd8358933796fe3f034d799a",
  "dxmodules\\zoneinfo\\America\\Aruba": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\America\\Asuncion": "09a3f0569913d138c4f5d8c0c97c055c",
  "dxmodules\\zoneinfo\\America\\Atikokan": "6b028d3f8073ba06f9467133f6a1a0dd",
  "dxmodules\\zoneinfo\\America\\Atka": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\America\\Bahia": "2f5dd75c9ee116e4ca290849dfff7a9f",
  "dxmodules\\zoneinfo\\America\\Bahia_Banderas": "6d24d30bc671042918ba397a15e6114c",
  "dxmodules\\zoneinfo\\America\\Barbados": "92550378b8952475d3bffe20b1168820",
  "dxmodules\\zoneinfo\\America\\Belem": "432beed5d93041f2b551051332d7d72e",
  "dxmodules\\zoneinfo\\America\\Belize": "da3145d79cba5f541dd261434e449173",
  "dxmodules\\zoneinfo\\America\\Blanc-Sablon": "4169ae15c5a1477cfe281fa7702bcc14",
  "dxmodules\\zoneinfo\\America\\Boa_Vista": "a98b8a6d614366047943d78bc1896acb",
  "dxmodules\\zoneinfo\\America\\Bogota": "cb5574ae9b01614c9e8c082039fe8147",
  "dxmodules\\zoneinfo\\America\\Boise": "45dce4d7ef2491d2450d16565f878b02",
  "dxmodules\\zoneinfo\\America\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49",
  "dxmodules\\zoneinfo\\America\\Cambridge_Bay": "048d33fc74c19008a5a440b8b226cb45",
  "dxmodules\\zoneinfo\\America\\Campo_Grande": "6e2912b5b855c5e6d39eeb1bcf19aea5",
  "dxmodules\\zoneinfo\\America\\Cancun": "a2fe4da50cfb1afe8a46d6f55b805afa",
  "dxmodules\\zoneinfo\\America\\Caracas": "a5bf9cdb87d451a4aabad61d4ce91a2b",
  "dxmodules\\zoneinfo\\America\\Catamarca": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\America\\Cayenne": "e9f3bdd863a3cf2127077a21e918b057",
  "dxmodules\\zoneinfo\\America\\Cayman": "843b6eadcdd7838269e2195df886ebf1",
  "dxmodules\\zoneinfo\\America\\Chicago": "d0f076c9f390e7d8a933cc7cc1ad2e90",
  "dxmodules\\zoneinfo\\America\\Chihuahua": "75c741bb811f4ee563ce05eb976e53a1",
  "dxmodules\\zoneinfo\\America\\Coral_Harbour": "6b028d3f8073ba06f9467133f6a1a0dd",
  "dxmodules\\zoneinfo\\America\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\America\\Costa_Rica": "2dec281340a45276b0799a3bec48b76b",
  "dxmodules\\zoneinfo\\America\\Creston": "dbf874c388dc236612025d145b46d868",
  "dxmodules\\zoneinfo\\America\\Cuiaba": "71d500778aa9de635b9438695cf8b61e",
  "dxmodules\\zoneinfo\\America\\Curacao": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\America\\Danmarkshavn": "20e68f0a941140b269efb3af346b1e34",
  "dxmodules\\zoneinfo\\America\\Dawson": "9c8e92765ad27141e3a56f6a31599c99",
  "dxmodules\\zoneinfo\\America\\Dawson_Creek": "f7955656cccdf253d996deb5bb4176ef",
  "dxmodules\\zoneinfo\\America\\Denver": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\America\\Detroit": "ae3ba6ed8738ceda9eef109c6c586736",
  "dxmodules\\zoneinfo\\America\\Dominica": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Edmonton": "1f23503189b8ce70677b2dcbb4a57e8c",
  "dxmodules\\zoneinfo\\America\\Eirunepe": "236e0fa8dd250599b2146a7a203a6ae4",
  "dxmodules\\zoneinfo\\America\\El_Salvador": "b77c5f52b45573ae0f5673ac0ca1b086",
  "dxmodules\\zoneinfo\\America\\Ensenada": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\America\\Fortaleza": "2e202e859552b09ad60cdc408de47c94",
  "dxmodules\\zoneinfo\\America\\Fort_Nelson": "8853bd10553d7ca5eb5f0b9c7af5a047",
  "dxmodules\\zoneinfo\\America\\Fort_Wayne": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\America\\Glace_Bay": "6ba1b7da532cefb6e32d083377b71303",
  "dxmodules\\zoneinfo\\America\\Godthab": "4a1f3fd710057cfeaf3e7ac964a18466",
  "dxmodules\\zoneinfo\\America\\Goose_Bay": "18a9d1af32911f30273fabcc694d9654",
  "dxmodules\\zoneinfo\\America\\Grand_Turk": "539dcee68a715238ef8aa5642a9b5214",
  "dxmodules\\zoneinfo\\America\\Grenada": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Guadeloupe": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Guatemala": "097638f469fdba70e9637561cffefd91",
  "dxmodules\\zoneinfo\\America\\Guayaquil": "bbe67886e74ffd7d1ed09a3481b5120c",
  "dxmodules\\zoneinfo\\America\\Guyana": "7fb63c484765baf41049bd41cfca0184",
  "dxmodules\\zoneinfo\\America\\Halifax": "820f35f23d49a527ffe813e2d96c5da7",
  "dxmodules\\zoneinfo\\America\\Havana": "1877fc45317e144ea206ddc622cebba2",
  "dxmodules\\zoneinfo\\America\\Hermosillo": "7bdce7a211e50eff3b5b8de21a46d581",
  "dxmodules\\zoneinfo\\America\\Indiana\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\America\\Indiana\\Knox": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\America\\Indiana\\Marengo": "541539f004b1b1722ac96e897d06ac45",
  "dxmodules\\zoneinfo\\America\\Indiana\\Petersburg": "82b5d3f05f88ac02cb5a4c3fb08fa191",
  "dxmodules\\zoneinfo\\America\\Indiana\\Tell_City": "dfe557585c608ee9e34e9b75fbe72617",
  "dxmodules\\zoneinfo\\America\\Indiana\\Vevay": "d0f3d93603268abdfeb402bbe0c3c0b3",
  "dxmodules\\zoneinfo\\America\\Indiana\\Vincennes": "d13258dc61c8a747a914396a56e4218c",
  "dxmodules\\zoneinfo\\America\\Indiana\\Winamac": "e6b915ae1c01b71fd7b42b00b4664029",
  "dxmodules\\zoneinfo\\America\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\America\\Inuvik": "4ea2c19a83f810220c7302c9914e4ee4",
  "dxmodules\\zoneinfo\\America\\Iqaluit": "4142e0b137ac6cf3fdad0fce11560ca1",
  "dxmodules\\zoneinfo\\America\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af",
  "dxmodules\\zoneinfo\\America\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11",
  "dxmodules\\zoneinfo\\America\\Juneau": "6276c692ca4f68dcb846d7e918ee23dd",
  "dxmodules\\zoneinfo\\America\\Kentucky\\Louisville": "99545115e4f688d7f573d38d667194d9",
  "dxmodules\\zoneinfo\\America\\Kentucky\\Monticello": "4041c24d41fbbd407e4d398824225d50",
  "dxmodules\\zoneinfo\\America\\Knox_IN": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\America\\Kralendijk": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\America\\La_Paz": "962d2f2486d3c16a6095390156e322b3",
  "dxmodules\\zoneinfo\\America\\Lima": "cc24c83127c28793afc54e43fe5766e4",
  "dxmodules\\zoneinfo\\America\\Los_Angeles": "9323ff44ce205ce1a1bad7e2dca39939",
  "dxmodules\\zoneinfo\\America\\Louisville": "99545115e4f688d7f573d38d667194d9",
  "dxmodules\\zoneinfo\\America\\Lower_Princes": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\America\\Maceio": "378a3e07cabc7773b6078025e9981793",
  "dxmodules\\zoneinfo\\America\\Managua": "4667d4aa7d530f1f61f5b116258eb84d",
  "dxmodules\\zoneinfo\\America\\Manaus": "585a0b598d406e6c0d710182bbdba35e",
  "dxmodules\\zoneinfo\\America\\Marigot": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Martinique": "ecdf79bbd2c17670a4637d06b01d7819",
  "dxmodules\\zoneinfo\\America\\Matamoros": "9ba17635ae8f44fa50c4565328433383",
  "dxmodules\\zoneinfo\\America\\Mazatlan": "2a157b818df8ab296baf6de38cd7d32b",
  "dxmodules\\zoneinfo\\America\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870",
  "dxmodules\\zoneinfo\\America\\Menominee": "c720185d11deb83ad58b22b118830261",
  "dxmodules\\zoneinfo\\America\\Merida": "91ebe16317802987c2cd9c567b6e4c2a",
  "dxmodules\\zoneinfo\\America\\Metlakatla": "02b06c27e6b6de8398ac263055a2d280",
  "dxmodules\\zoneinfo\\America\\Mexico_City": "cff58c6976849e1e8f94d4288b07b9d2",
  "dxmodules\\zoneinfo\\America\\Miquelon": "ac08a2e10dea976318846a7f7b254f26",
  "dxmodules\\zoneinfo\\America\\Moncton": "2fa9e016bc7e55f51d036a158a40e0e9",
  "dxmodules\\zoneinfo\\America\\Monterrey": "f77b22ac5e4f995ef8d4839835a54faa",
  "dxmodules\\zoneinfo\\America\\Montevideo": "51fb8d4c68e90f30d5eb1dd503bf202e",
  "dxmodules\\zoneinfo\\America\\Montreal": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\America\\Montserrat": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Nassau": "1444a5132c9a26f350ebe705760215c7",
  "dxmodules\\zoneinfo\\America\\New_York": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\America\\Nipigon": "365984faa12e0762dac780bf71204633",
  "dxmodules\\zoneinfo\\America\\Nome": "f9cb8bbe99e6143a75b2797ddf94f234",
  "dxmodules\\zoneinfo\\America\\Noronha": "a8562cc7d0e4555968ad7744dceb9d43",
  "dxmodules\\zoneinfo\\America\\North_Dakota\\Beulah": "59406487459534f8844f828b8356d083",
  "dxmodules\\zoneinfo\\America\\North_Dakota\\Center": "6964f42dc925648abaa448f18b330d46",
  "dxmodules\\zoneinfo\\America\\North_Dakota\\New_Salem": "c14a42a9b8d8571354c8ced6fa931eac",
  "dxmodules\\zoneinfo\\America\\Nuuk": "4a1f3fd710057cfeaf3e7ac964a18466",
  "dxmodules\\zoneinfo\\America\\Ojinaga": "95e6bee1cb146689410010d58e6ee974",
  "dxmodules\\zoneinfo\\America\\Panama": "843b6eadcdd7838269e2195df886ebf1",
  "dxmodules\\zoneinfo\\America\\Pangnirtung": "b71f8c6f5a9b289c981af0cdbf80f7e1",
  "dxmodules\\zoneinfo\\America\\Paramaribo": "2d11461cf62c48496eb9a866b3eb1712",
  "dxmodules\\zoneinfo\\America\\Phoenix": "c697bb02e057325a74547912f631a3a7",
  "dxmodules\\zoneinfo\\America\\Port-au-Prince": "27e4cb1b082cd694df8c1b2f27838f85",
  "dxmodules\\zoneinfo\\America\\Porto_Acre": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\America\\Porto_Velho": "63160b0eb1d694ae0f97644160eea68a",
  "dxmodules\\zoneinfo\\America\\Port_of_Spain": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Puerto_Rico": "b3feb20144b4070d5eff32dab8c8a160",
  "dxmodules\\zoneinfo\\America\\Punta_Arenas": "9c43769cae1008f7fd054e807960a9cd",
  "dxmodules\\zoneinfo\\America\\Rainy_River": "4bdb5a197d174ac4834b4e738340fdf6",
  "dxmodules\\zoneinfo\\America\\Rankin_Inlet": "902bc59be5586a60cf0c67188027f7c4",
  "dxmodules\\zoneinfo\\America\\Recife": "a9b9203d577c57c1cbf0873327336ac1",
  "dxmodules\\zoneinfo\\America\\Regina": "cec6491b350dfbdb74732df745eb37d3",
  "dxmodules\\zoneinfo\\America\\Resolute": "e272bb16aa765ea5439726dde6f283eb",
  "dxmodules\\zoneinfo\\America\\Rio_Branco": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\America\\Rosario": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\America\\Santarem": "31689ae81ac7aea65cc5784da4560e73",
  "dxmodules\\zoneinfo\\America\\Santa_Isabel": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\America\\Santiago": "b8db6707d0c4f0dfc7a12be81d35df8f",
  "dxmodules\\zoneinfo\\America\\Santo_Domingo": "7edb49f18d76f116c5578c3dcd279ade",
  "dxmodules\\zoneinfo\\America\\Sao_Paulo": "339ff8dbd88e39f59b2fd4ee57b1fdb1",
  "dxmodules\\zoneinfo\\America\\Scoresbysund": "1a5f6775efbfe9befc36df0a3d19c594",
  "dxmodules\\zoneinfo\\America\\Shiprock": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\America\\Sitka": "efa4e4969d3d0423dc3429a756921244",
  "dxmodules\\zoneinfo\\America\\St_Barthelemy": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\St_Johns": "79d938b80bf215c8e13d2cb4727343d8",
  "dxmodules\\zoneinfo\\America\\St_Kitts": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\St_Lucia": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\St_Thomas": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\St_Vincent": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Swift_Current": "c74726e554d359f38a26870282725f04",
  "dxmodules\\zoneinfo\\America\\Tegucigalpa": "963e88d190d129470f37774310dd20e4",
  "dxmodules\\zoneinfo\\America\\Thule": "32b5bb9f1f25d306246bd96a0ef317c4",
  "dxmodules\\zoneinfo\\America\\Thunder_Bay": "aa82e0d2a447d3610f4c2eea10c2a7b8",
  "dxmodules\\zoneinfo\\America\\Tijuana": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\America\\Toronto": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\America\\Tortola": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Vancouver": "9d48c60fed12ae8a6f5b139bf0b254b5",
  "dxmodules\\zoneinfo\\America\\Virgin": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Whitehorse": "3b82b92569a6900dadc0aa62c7cb6f36",
  "dxmodules\\zoneinfo\\America\\Winnipeg": "f0683580a6116b3c744cb6b3d63aa0b1",
  "dxmodules\\zoneinfo\\America\\Yakutat": "ee0f462df87e663c328908c5e81260d0",
  "dxmodules\\zoneinfo\\America\\Yellowknife": "b5087ae9a8ccc013470ebf44bc635281",
  "dxmodules\\zoneinfo\\Antarctica\\Casey": "f6d44d9ea6501a60287aeff26715bef0",
  "dxmodules\\zoneinfo\\Antarctica\\Davis": "80a08215623fd38f21aa72861fdf54cd",
  "dxmodules\\zoneinfo\\Antarctica\\DumontDUrville": "e3f2c24ea8bfb0c5bea7a209cfd1baae",
  "dxmodules\\zoneinfo\\Antarctica\\Macquarie": "7c8809733d07903666654c0e67aeaec5",
  "dxmodules\\zoneinfo\\Antarctica\\Mawson": "d285e96947e86928c647ab2b2cf185b5",
  "dxmodules\\zoneinfo\\Antarctica\\McMurdo": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\Antarctica\\Palmer": "3a6a847fb145840a4941337c2ae86d96",
  "dxmodules\\zoneinfo\\Antarctica\\Rothera": "70e1309683f8a4afa2f0d752bf97b46c",
  "dxmodules\\zoneinfo\\Antarctica\\South_Pole": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\Antarctica\\Syowa": "553ede0b9071e1364892b1ed27a7f1a6",
  "dxmodules\\zoneinfo\\Antarctica\\Troll": "f13b257391af38577970477597e9d499",
  "dxmodules\\zoneinfo\\Antarctica\\Vostok": "4bb37b331311a0867117d218adf10610",
  "dxmodules\\zoneinfo\\Arctic\\Longyearbyen": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\Asia\\Aden": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\Asia\\Almaty": "938c35fa2fdc23ae382ad9b2278c6f58",
  "dxmodules\\zoneinfo\\Asia\\Amman": "63694da35da6a976fb37a62debd191a4",
  "dxmodules\\zoneinfo\\Asia\\Anadyr": "5648ae758f6447668653221263b5ea9d",
  "dxmodules\\zoneinfo\\Asia\\Aqtau": "d020e6bedcd22c98f021e7c1c3ed8ee4",
  "dxmodules\\zoneinfo\\Asia\\Aqtobe": "486c6c79d56174ee29d05fc6efd9e18e",
  "dxmodules\\zoneinfo\\Asia\\Ashgabat": "235b16a54519989a51679188703ca5ac",
  "dxmodules\\zoneinfo\\Asia\\Ashkhabad": "235b16a54519989a51679188703ca5ac",
  "dxmodules\\zoneinfo\\Asia\\Atyrau": "5fbe4e89da1f20229c0c3747017557c0",
  "dxmodules\\zoneinfo\\Asia\\Baghdad": "af9423b28aad58ffc1790d29244309b8",
  "dxmodules\\zoneinfo\\Asia\\Bahrain": "fc5a2c1c087d56e4b7323259ab62bef6",
  "dxmodules\\zoneinfo\\Asia\\Baku": "27e366b2523ae3dfd1e648ecdf54bc15",
  "dxmodules\\zoneinfo\\Asia\\Bangkok": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\Asia\\Barnaul": "cfefaae119b421f5b3c990ef4948ebf7",
  "dxmodules\\zoneinfo\\Asia\\Beirut": "785117e925db8afec6b0c761163b002c",
  "dxmodules\\zoneinfo\\Asia\\Bishkek": "5dec7f8d19f19560c2fd59b16f2a2214",
  "dxmodules\\zoneinfo\\Asia\\Brunei": "3db4e51993e234a73f7054160abf663d",
  "dxmodules\\zoneinfo\\Asia\\Calcutta": "569f373970581e6488a24b5c70326d49",
  "dxmodules\\zoneinfo\\Asia\\Chita": "6b2c484a3c93d7523cd09ec0d13b53fe",
  "dxmodules\\zoneinfo\\Asia\\Choibalsan": "8ca46182ff4884d5b45c3c41e777783a",
  "dxmodules\\zoneinfo\\Asia\\Chongqing": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\Asia\\Chungking": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\Asia\\Colombo": "12c255c649eaa1ade0387c30596825d9",
  "dxmodules\\zoneinfo\\Asia\\Dacca": "ea255e2dada4541d25ad34139c18419f",
  "dxmodules\\zoneinfo\\Asia\\Damascus": "07b6153d721b5d7d93d78f2591201ffa",
  "dxmodules\\zoneinfo\\Asia\\Dhaka": "ea255e2dada4541d25ad34139c18419f",
  "dxmodules\\zoneinfo\\Asia\\Dili": "5c7fb0d932343cc330df273a5bb9308b",
  "dxmodules\\zoneinfo\\Asia\\Dubai": "e17583385b056a775970e7bcd9a6b7dd",
  "dxmodules\\zoneinfo\\Asia\\Dushanbe": "29a7b7661ea6575cd7f8ba1435b78f1d",
  "dxmodules\\zoneinfo\\Asia\\Famagusta": "14a69e4234b2f2c02a3d3a46d0ecffbb",
  "dxmodules\\zoneinfo\\Asia\\Gaza": "798a2fa999dfbd3d557b0afeedc99562",
  "dxmodules\\zoneinfo\\Asia\\Harbin": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\Asia\\Hebron": "f600ca83e00a4c2d046dbd5ae0461018",
  "dxmodules\\zoneinfo\\Asia\\Hong_Kong": "1f5267f14578c917d94c972e46fc8e0e",
  "dxmodules\\zoneinfo\\Asia\\Hovd": "585f478cf864b0065bd07587e6b1e41f",
  "dxmodules\\zoneinfo\\Asia\\Ho_Chi_Minh": "104047aa22a3824e08e4fffeccc80d19",
  "dxmodules\\zoneinfo\\Asia\\Irkutsk": "8a84642c58ed64282884014698df2f7d",
  "dxmodules\\zoneinfo\\Asia\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\Asia\\Jakarta": "c280819a288b0aea09db4fd1fd017546",
  "dxmodules\\zoneinfo\\Asia\\Jayapura": "75c2120efce23b61989c6a15635d115f",
  "dxmodules\\zoneinfo\\Asia\\Jerusalem": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\Asia\\Kabul": "47a295d1de026d2e443c132316ed4533",
  "dxmodules\\zoneinfo\\Asia\\Kamchatka": "da5950adc8bcdb823cff01b81d2d1ec9",
  "dxmodules\\zoneinfo\\Asia\\Karachi": "b1afc0a7ce4118813cdc8679e8b20d8a",
  "dxmodules\\zoneinfo\\Asia\\Kashgar": "a43f32e98fa40e6601db5cca019a01a8",
  "dxmodules\\zoneinfo\\Asia\\Kathmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1",
  "dxmodules\\zoneinfo\\Asia\\Katmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1",
  "dxmodules\\zoneinfo\\Asia\\Khandyga": "d8845dc2bfed88c1aef353c99c332d8e",
  "dxmodules\\zoneinfo\\Asia\\Kolkata": "569f373970581e6488a24b5c70326d49",
  "dxmodules\\zoneinfo\\Asia\\Krasnoyarsk": "6459a2dc5df86eecb3d8d881e285fbc5",
  "dxmodules\\zoneinfo\\Asia\\Kuala_Lumpur": "8a0970a2f6db03aa6317757fe59d24e5",
  "dxmodules\\zoneinfo\\Asia\\Kuching": "941bf864c5cd1bcbcba5bf386815338d",
  "dxmodules\\zoneinfo\\Asia\\Kuwait": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\Asia\\Macao": "f61abab83b519b307988b2c9e1c13037",
  "dxmodules\\zoneinfo\\Asia\\Macau": "f61abab83b519b307988b2c9e1c13037",
  "dxmodules\\zoneinfo\\Asia\\Magadan": "7d44faf13ac5b3facbd83ff3857a0e1e",
  "dxmodules\\zoneinfo\\Asia\\Makassar": "13cba3c3bb605214bf3464922974ca13",
  "dxmodules\\zoneinfo\\Asia\\Manila": "7edfd09b1ebe5e5a152a03a7a705f5bc",
  "dxmodules\\zoneinfo\\Asia\\Muscat": "e17583385b056a775970e7bcd9a6b7dd",
  "dxmodules\\zoneinfo\\Asia\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a",
  "dxmodules\\zoneinfo\\Asia\\Novokuznetsk": "d5f8acb7b4e7d664a04dd154980eda1f",
  "dxmodules\\zoneinfo\\Asia\\Novosibirsk": "b6434f1e22bf4098c2a8c5371dc301fe",
  "dxmodules\\zoneinfo\\Asia\\Omsk": "e789f5c5cce168d524f5a8c2486b62ba",
  "dxmodules\\zoneinfo\\Asia\\Oral": "2586cc76cb792e5a3e56f5c130892c93",
  "dxmodules\\zoneinfo\\Asia\\Phnom_Penh": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\Asia\\Pontianak": "75dbcd818e883badda4d6df52f07c9ae",
  "dxmodules\\zoneinfo\\Asia\\Pyongyang": "55ccc2dfaf651c7452baf53f3c0bcaa1",
  "dxmodules\\zoneinfo\\Asia\\Qatar": "fc5a2c1c087d56e4b7323259ab62bef6",
  "dxmodules\\zoneinfo\\Asia\\Qostanay": "6f2759a853ade2f4c50fddc156e833c6",
  "dxmodules\\zoneinfo\\Asia\\Qyzylorda": "2794eeaae5075fae6c902660beae2141",
  "dxmodules\\zoneinfo\\Asia\\Rangoon": "facd5e2823e744613e5d83384b53b17f",
  "dxmodules\\zoneinfo\\Asia\\Riyadh": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\Asia\\Saigon": "104047aa22a3824e08e4fffeccc80d19",
  "dxmodules\\zoneinfo\\Asia\\Sakhalin": "d065dcba4d1f2f8df4862ea639caf3f3",
  "dxmodules\\zoneinfo\\Asia\\Samarkand": "7c0752cecdf1b32c7618128577045bcc",
  "dxmodules\\zoneinfo\\Asia\\Seoul": "f7a6e371bd709b3c2f64ce6f67f39f29",
  "dxmodules\\zoneinfo\\Asia\\Shanghai": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\Asia\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3",
  "dxmodules\\zoneinfo\\Asia\\Srednekolymsk": "9e7e46bbc5dad40e5f90e797d941d22e",
  "dxmodules\\zoneinfo\\Asia\\Taipei": "2e67467e3c050e8b3a4022eb9e20300e",
  "dxmodules\\zoneinfo\\Asia\\Tashkent": "3e47dbc84c7895e2cb890776d3ad119b",
  "dxmodules\\zoneinfo\\Asia\\Tbilisi": "da70a44f47a6a309eff8c9302fecf559",
  "dxmodules\\zoneinfo\\Asia\\Tehran": "d2cb514595346f1168c2f1167409ec7c",
  "dxmodules\\zoneinfo\\Asia\\Tel_Aviv": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\Asia\\Thimbu": "97be2e1f7789978b407476a8094d5ee1",
  "dxmodules\\zoneinfo\\Asia\\Thimphu": "97be2e1f7789978b407476a8094d5ee1",
  "dxmodules\\zoneinfo\\Asia\\Tokyo": "478afb8b1f182b2ff53caa2e6cc8ffd9",
  "dxmodules\\zoneinfo\\Asia\\Tomsk": "903e9bdc80298a4433a48219a071d4af",
  "dxmodules\\zoneinfo\\Asia\\Ujung_Pandang": "13cba3c3bb605214bf3464922974ca13",
  "dxmodules\\zoneinfo\\Asia\\Ulaanbaatar": "3f0446e3735c9dd93089eeae31a37c1b",
  "dxmodules\\zoneinfo\\Asia\\Ulan_Bator": "3f0446e3735c9dd93089eeae31a37c1b",
  "dxmodules\\zoneinfo\\Asia\\Urumqi": "a43f32e98fa40e6601db5cca019a01a8",
  "dxmodules\\zoneinfo\\Asia\\Ust-Nera": "4d04e65ff5d8c7b407d6cb8dedbe33a4",
  "dxmodules\\zoneinfo\\Asia\\Vientiane": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\Asia\\Vladivostok": "cecab70411f0df191ef4a2cb747bdb08",
  "dxmodules\\zoneinfo\\Asia\\Yakutsk": "bfef1f6f86fa7080259fd26f7668bc84",
  "dxmodules\\zoneinfo\\Asia\\Yangon": "facd5e2823e744613e5d83384b53b17f",
  "dxmodules\\zoneinfo\\Asia\\Yekaterinburg": "807931acd2f4fa27806b8208de988391",
  "dxmodules\\zoneinfo\\Asia\\Yerevan": "e196b792aab3b785a957682c74f574e7",
  "dxmodules\\zoneinfo\\Atlantic\\Azores": "5433c796c8a770b6b06fe812ae08527f",
  "dxmodules\\zoneinfo\\Atlantic\\Bermuda": "659000f311b0ab5c90442cb81278c62c",
  "dxmodules\\zoneinfo\\Atlantic\\Canary": "167a786aa74ba2a9dd68c470746aa0ac",
  "dxmodules\\zoneinfo\\Atlantic\\Cape_Verde": "b3795953b76fb3cc553fdbb4d825cb93",
  "dxmodules\\zoneinfo\\Atlantic\\Faeroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b",
  "dxmodules\\zoneinfo\\Atlantic\\Faroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b",
  "dxmodules\\zoneinfo\\Atlantic\\Jan_Mayen": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\Atlantic\\Madeira": "2e4a8509560836b8341ec2e612627005",
  "dxmodules\\zoneinfo\\Atlantic\\Reykjavik": "d5e2f791bed996743c667784bb8c52ea",
  "dxmodules\\zoneinfo\\Atlantic\\South_Georgia": "f0b2aeeddf3200b6a5839d86f35879e6",
  "dxmodules\\zoneinfo\\Atlantic\\Stanley": "5a5247cc12a456fee6716540c14e55ad",
  "dxmodules\\zoneinfo\\Atlantic\\St_Helena": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Australia\\ACT": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\Australia\\Adelaide": "a3ec822dc0c8fd04e431b3316d1166ca",
  "dxmodules\\zoneinfo\\Australia\\Brisbane": "0c8a54dfc42c9a987fff25d5d72096fa",
  "dxmodules\\zoneinfo\\Australia\\Broken_Hill": "c0a218c9fe25b535b4a1a6b70dad3af2",
  "dxmodules\\zoneinfo\\Australia\\Canberra": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\Australia\\Currie": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\Australia\\Darwin": "cbb2b15b2c2034c2584f801cec184e2b",
  "dxmodules\\zoneinfo\\Australia\\Eucla": "1459b57ff3474bbe12013908f4bed8aa",
  "dxmodules\\zoneinfo\\Australia\\Hobart": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\Australia\\LHI": "b664b61c1949c1beea8838facf6c1d8b",
  "dxmodules\\zoneinfo\\Australia\\Lindeman": "4d125f1a5ec84cf6f62607152dedf324",
  "dxmodules\\zoneinfo\\Australia\\Lord_Howe": "b664b61c1949c1beea8838facf6c1d8b",
  "dxmodules\\zoneinfo\\Australia\\Melbourne": "5f06e3a482d43ee4018736ac792b1129",
  "dxmodules\\zoneinfo\\Australia\\North": "cbb2b15b2c2034c2584f801cec184e2b",
  "dxmodules\\zoneinfo\\Australia\\NSW": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\Australia\\Perth": "a54a9120fddca3a9bb951ac9d8bce260",
  "dxmodules\\zoneinfo\\Australia\\Queensland": "0c8a54dfc42c9a987fff25d5d72096fa",
  "dxmodules\\zoneinfo\\Australia\\South": "a3ec822dc0c8fd04e431b3316d1166ca",
  "dxmodules\\zoneinfo\\Australia\\Sydney": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\Australia\\Tasmania": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\Australia\\Victoria": "5f06e3a482d43ee4018736ac792b1129",
  "dxmodules\\zoneinfo\\Australia\\West": "a54a9120fddca3a9bb951ac9d8bce260",
  "dxmodules\\zoneinfo\\Australia\\Yancowinna": "c0a218c9fe25b535b4a1a6b70dad3af2",
  "dxmodules\\zoneinfo\\Brazil\\Acre": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\Brazil\\DeNoronha": "a8562cc7d0e4555968ad7744dceb9d43",
  "dxmodules\\zoneinfo\\Brazil\\East": "339ff8dbd88e39f59b2fd4ee57b1fdb1",
  "dxmodules\\zoneinfo\\Brazil\\West": "585a0b598d406e6c0d710182bbdba35e",
  "dxmodules\\zoneinfo\\Canada\\Atlantic": "820f35f23d49a527ffe813e2d96c5da7",
  "dxmodules\\zoneinfo\\Canada\\Central": "f0683580a6116b3c744cb6b3d63aa0b1",
  "dxmodules\\zoneinfo\\Canada\\Eastern": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\Canada\\Mountain": "1f23503189b8ce70677b2dcbb4a57e8c",
  "dxmodules\\zoneinfo\\Canada\\Newfoundland": "79d938b80bf215c8e13d2cb4727343d8",
  "dxmodules\\zoneinfo\\Canada\\Pacific": "9d48c60fed12ae8a6f5b139bf0b254b5",
  "dxmodules\\zoneinfo\\Canada\\Saskatchewan": "cec6491b350dfbdb74732df745eb37d3",
  "dxmodules\\zoneinfo\\Canada\\Yukon": "3b82b92569a6900dadc0aa62c7cb6f36",
  "dxmodules\\zoneinfo\\CET": "3f166816639388adb3d3567e28ef2145",
  "dxmodules\\zoneinfo\\Chile\\Continental": "b8db6707d0c4f0dfc7a12be81d35df8f",
  "dxmodules\\zoneinfo\\Chile\\EasterIsland": "ea76f04afd1b377b869cd7532b35457c",
  "dxmodules\\zoneinfo\\CST6CDT": "8396c3e49c717f9ba736b4d4d1b24b8b",
  "dxmodules\\zoneinfo\\Cuba": "1877fc45317e144ea206ddc622cebba2",
  "dxmodules\\zoneinfo\\EET": "16b84f2a83840fd4132c2e3fbff3b758",
  "dxmodules\\zoneinfo\\Egypt": "b9bb9d8c3cddc72252f4aa2082af4213",
  "dxmodules\\zoneinfo\\Eire": "0e226ce4b36682f2c9c2fa1146809778",
  "dxmodules\\zoneinfo\\EST": "d0f150b6acc4dc78b8ada8abb1079af6",
  "dxmodules\\zoneinfo\\EST5EDT": "e7a28a1315bcd4deedaaac6d1c3cd3e2",
  "dxmodules\\zoneinfo\\Etc\\GMT": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\GMT+0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\GMT+1": "169210c55520d3a8efc1362a5d89e402",
  "dxmodules\\zoneinfo\\Etc\\GMT+10": "03d40b4007e96680e56f10372148cf51",
  "dxmodules\\zoneinfo\\Etc\\GMT+11": "bb030b7fea0da0987217737e22a9cbe0",
  "dxmodules\\zoneinfo\\Etc\\GMT+12": "66046646734491458066327a04705b0c",
  "dxmodules\\zoneinfo\\Etc\\GMT+2": "0a97351084a016afb88b8b698ea922d8",
  "dxmodules\\zoneinfo\\Etc\\GMT+3": "73897f3686a7bca3e2719cfa59f83b6b",
  "dxmodules\\zoneinfo\\Etc\\GMT+4": "e943df1168ea3d597ec62c8933a11a9c",
  "dxmodules\\zoneinfo\\Etc\\GMT+5": "a9d53018097b6bcca5e6a4e55211e80b",
  "dxmodules\\zoneinfo\\Etc\\GMT+6": "0a8c24c796c1473250ff564fce59e937",
  "dxmodules\\zoneinfo\\Etc\\GMT+7": "d87007923e671b8b78552d613299ac8a",
  "dxmodules\\zoneinfo\\Etc\\GMT+8": "e99240e190c8a4ccf3cc0a26618fb09b",
  "dxmodules\\zoneinfo\\Etc\\GMT+9": "e77b0b4911d483289610c4efcd599d7d",
  "dxmodules\\zoneinfo\\Etc\\GMT-0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\GMT-1": "a3c457b6cc2c3be7f34da00d84ec229e",
  "dxmodules\\zoneinfo\\Etc\\GMT-10": "8ed77c9096196e97be5f0807bf939bac",
  "dxmodules\\zoneinfo\\Etc\\GMT-11": "dcdc4caf8194fa9d29ceccdc225a5048",
  "dxmodules\\zoneinfo\\Etc\\GMT-12": "fe87b6111ce93c3d10fe152ca715a715",
  "dxmodules\\zoneinfo\\Etc\\GMT-13": "0fd6f7e68d38e1cef98efdc6ecedae80",
  "dxmodules\\zoneinfo\\Etc\\GMT-14": "155f8eb5a5dd22c81eef6986c8c5317c",
  "dxmodules\\zoneinfo\\Etc\\GMT-2": "a9eafb629b4070ca0ff8f99631390031",
  "dxmodules\\zoneinfo\\Etc\\GMT-3": "b73ddab7b5ca9128a8b2925fad5b11f0",
  "dxmodules\\zoneinfo\\Etc\\GMT-4": "0c08dc6b2974b3207bf6293544a236b0",
  "dxmodules\\zoneinfo\\Etc\\GMT-5": "57ca1133eeeb09c7c30c04850d49d4e5",
  "dxmodules\\zoneinfo\\Etc\\GMT-6": "642170284ddc2575f5e077d7ea33dcdc",
  "dxmodules\\zoneinfo\\Etc\\GMT-7": "2f4d1ba17adf0c86acb4cc6258f8a0cb",
  "dxmodules\\zoneinfo\\Etc\\GMT-8": "f4d3b2b664698da9268d3f244fec9232",
  "dxmodules\\zoneinfo\\Etc\\GMT-9": "02963228a1537cc2c8bdf22e99178893",
  "dxmodules\\zoneinfo\\Etc\\GMT0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\Greenwich": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\UCT": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Etc\\Universal": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Etc\\UTC": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Etc\\Zulu": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Europe\\Amsterdam": "e3b0d618da0bd60d894183dd0d53923e",
  "dxmodules\\zoneinfo\\Europe\\Andorra": "8bfff3a580b4b0db3dff30d1d7385ac4",
  "dxmodules\\zoneinfo\\Europe\\Astrakhan": "ba197918d51925f1e0b771923ce3a19f",
  "dxmodules\\zoneinfo\\Europe\\Athens": "75d641576f8d4376045ba8f16db4063a",
  "dxmodules\\zoneinfo\\Europe\\Belfast": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Belgrade": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Berlin": "4790e83465681cefbf852aed265354bf",
  "dxmodules\\zoneinfo\\Europe\\Bratislava": "eab2cea5cb5bf0374f6bf891b9102844",
  "dxmodules\\zoneinfo\\Europe\\Brussels": "3d5d93412e485bac12e0587239835fd9",
  "dxmodules\\zoneinfo\\Europe\\Bucharest": "751205baadb94c5f41dadbcc97ab23db",
  "dxmodules\\zoneinfo\\Europe\\Budapest": "f76d3a5131d6910f5c2a34fbe35c265e",
  "dxmodules\\zoneinfo\\Europe\\Busingen": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\Europe\\Chisinau": "717476d2fe0213c40e31f52573c05356",
  "dxmodules\\zoneinfo\\Europe\\Copenhagen": "96039e70388d843950bcbef21328bba6",
  "dxmodules\\zoneinfo\\Europe\\Dublin": "0e226ce4b36682f2c9c2fa1146809778",
  "dxmodules\\zoneinfo\\Europe\\Gibraltar": "77fe14fec44142c1435dcc4eac003df4",
  "dxmodules\\zoneinfo\\Europe\\Guernsey": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Helsinki": "3eaa8467ffb21b15bd75200ff2c0a3db",
  "dxmodules\\zoneinfo\\Europe\\Isle_of_Man": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\Europe\\Jersey": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Kaliningrad": "7dc8e4aecf6dcf214b52938e289c9831",
  "dxmodules\\zoneinfo\\Europe\\Kiev": "f957769855be8b9d5983e51c033975d8",
  "dxmodules\\zoneinfo\\Europe\\Kirov": "6467d1d15049cb0015bbd56c92b18814",
  "dxmodules\\zoneinfo\\Europe\\Lisbon": "b9ba38decf09fe0728f81ebeabf29cfe",
  "dxmodules\\zoneinfo\\Europe\\Ljubljana": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\London": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Luxembourg": "3242615a805f051357309a89874633f3",
  "dxmodules\\zoneinfo\\Europe\\Madrid": "3ecb0fe1a9207bc3f77e793315ce0e5d",
  "dxmodules\\zoneinfo\\Europe\\Malta": "b6e707a0d755cfd038a7c4ecc44845e7",
  "dxmodules\\zoneinfo\\Europe\\Mariehamn": "3eaa8467ffb21b15bd75200ff2c0a3db",
  "dxmodules\\zoneinfo\\Europe\\Minsk": "07aeb33b58212d75e92b8eb157cc1624",
  "dxmodules\\zoneinfo\\Europe\\Monaco": "89271b78b389e6180385b96e7af94e7a",
  "dxmodules\\zoneinfo\\Europe\\Moscow": "223bbf37352a9d4807919132f360535e",
  "dxmodules\\zoneinfo\\Europe\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a",
  "dxmodules\\zoneinfo\\Europe\\Oslo": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\Europe\\Paris": "fe22373ca65df6ba6b254f5c4304fae8",
  "dxmodules\\zoneinfo\\Europe\\Podgorica": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Prague": "eab2cea5cb5bf0374f6bf891b9102844",
  "dxmodules\\zoneinfo\\Europe\\Riga": "b4541699f68b4aba0daa45df63e596a4",
  "dxmodules\\zoneinfo\\Europe\\Rome": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\Europe\\Samara": "d390934cf2dc01f033ffda93394c85d7",
  "dxmodules\\zoneinfo\\Europe\\San_Marino": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\Europe\\Sarajevo": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Saratov": "756b361dc39b978b78eaf6df78a7ad0e",
  "dxmodules\\zoneinfo\\Europe\\Simferopol": "9b2ddc8ca9d5c792d09f37ca58104afa",
  "dxmodules\\zoneinfo\\Europe\\Skopje": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Sofia": "68e6be692f44b3ed696fd2e6ef806927",
  "dxmodules\\zoneinfo\\Europe\\Stockholm": "1b9ed89af7331c6141249d181b42c621",
  "dxmodules\\zoneinfo\\Europe\\Tallinn": "46abec9f16a148333139ff5b0b6d1115",
  "dxmodules\\zoneinfo\\Europe\\Tirane": "d5977bad592e33b2e4058a242d735927",
  "dxmodules\\zoneinfo\\Europe\\Tiraspol": "717476d2fe0213c40e31f52573c05356",
  "dxmodules\\zoneinfo\\Europe\\Ulyanovsk": "ff8f50dd006548eb8751802c600f2299",
  "dxmodules\\zoneinfo\\Europe\\Uzhgorod": "0b4761ce9ee17b7b8bfb0d12063803c6",
  "dxmodules\\zoneinfo\\Europe\\Vaduz": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\Europe\\Vatican": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\Europe\\Vienna": "cb0f39744833718fbd602c54e0425157",
  "dxmodules\\zoneinfo\\Europe\\Vilnius": "524d360c5369c1abcb59e8140b59acda",
  "dxmodules\\zoneinfo\\Europe\\Volgograd": "442a047745c83ebebc180c67f6798fc2",
  "dxmodules\\zoneinfo\\Europe\\Warsaw": "2ed881ef7e09c844c009673ded84c798",
  "dxmodules\\zoneinfo\\Europe\\Zagreb": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Zaporozhye": "69430a5e3e93bd0ed6e2e604ddf6e903",
  "dxmodules\\zoneinfo\\Europe\\Zurich": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\GB": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\GB-Eire": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\GMT": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\GMT+0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\GMT-0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\GMT0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Greenwich": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Hongkong": "1f5267f14578c917d94c972e46fc8e0e",
  "dxmodules\\zoneinfo\\HST": "fd4ae9e0296519fb47b4b036ea4af025",
  "dxmodules\\zoneinfo\\Iceland": "d5e2f791bed996743c667784bb8c52ea",
  "dxmodules\\zoneinfo\\Indian\\Antananarivo": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Indian\\Chagos": "dfb323eb6037596036669f4b4505544c",
  "dxmodules\\zoneinfo\\Indian\\Christmas": "02b16169f8f47de904f3f05cb7f72583",
  "dxmodules\\zoneinfo\\Indian\\Cocos": "d9ffcdd40666dcb76225bdfb4654c0cf",
  "dxmodules\\zoneinfo\\Indian\\Comoro": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Indian\\Kerguelen": "749273edab499ed254e32606a9e5579e",
  "dxmodules\\zoneinfo\\Indian\\Mahe": "0df488f823d924b336f01d53d270af73",
  "dxmodules\\zoneinfo\\Indian\\Maldives": "89a066bf0512071db2a9eb425df46341",
  "dxmodules\\zoneinfo\\Indian\\Mauritius": "8f06c0fc457b6a12c0bbc4946e2dfb05",
  "dxmodules\\zoneinfo\\Indian\\Mayotte": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Indian\\Reunion": "817b0a2e45ae9c1e566499a4b068295e",
  "dxmodules\\zoneinfo\\Iran": "d2cb514595346f1168c2f1167409ec7c",
  "dxmodules\\zoneinfo\\iso3166.tab": "22b35b3817db585e12c4e2db934c9680",
  "dxmodules\\zoneinfo\\Israel": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af",
  "dxmodules\\zoneinfo\\Japan": "478afb8b1f182b2ff53caa2e6cc8ffd9",
  "dxmodules\\zoneinfo\\Kwajalein": "6d9261ff9442c0cf69446e362202d691",
  "dxmodules\\zoneinfo\\leapseconds": "cf361cfd45c2547a044f48855d7e5d5c",
  "dxmodules\\zoneinfo\\Libya": "edec79f292e5b8c0d32b521af1f118bd",
  "dxmodules\\zoneinfo\\MET": "3b07c8cc8c1fed960246da4e3791a73c",
  "dxmodules\\zoneinfo\\Mexico\\BajaNorte": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\Mexico\\BajaSur": "2a157b818df8ab296baf6de38cd7d32b",
  "dxmodules\\zoneinfo\\Mexico\\General": "cff58c6976849e1e8f94d4288b07b9d2",
  "dxmodules\\zoneinfo\\MST": "04da8453f31d6971b7fa4f3f8fb26654",
  "dxmodules\\zoneinfo\\MST7MDT": "76be6718eb3cf4ac468387b5d13ffafb",
  "dxmodules\\zoneinfo\\Navajo": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\NZ": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\NZ-CHAT": "0e76ddb8bb10f4b8f2ee092f731b6452",
  "dxmodules\\zoneinfo\\Pacific\\Apia": "6b2ba3b8fc50b635cdc0c1f117243439",
  "dxmodules\\zoneinfo\\Pacific\\Auckland": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\Pacific\\Bougainville": "e2da4052206976c32cd533f22f0bcf15",
  "dxmodules\\zoneinfo\\Pacific\\Chatham": "0e76ddb8bb10f4b8f2ee092f731b6452",
  "dxmodules\\zoneinfo\\Pacific\\Chuuk": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\Pacific\\Easter": "ea76f04afd1b377b869cd7532b35457c",
  "dxmodules\\zoneinfo\\Pacific\\Efate": "25c51b2838decef2f9d90c15e4ef7d3c",
  "dxmodules\\zoneinfo\\Pacific\\Enderbury": "6356a41b8b79885979b2b6613abecb73",
  "dxmodules\\zoneinfo\\Pacific\\Fakaofo": "de7a32503bd8fdc5baec11e6b9aad69b",
  "dxmodules\\zoneinfo\\Pacific\\Fiji": "7133b1eaf825848a26c6fe35f2601908",
  "dxmodules\\zoneinfo\\Pacific\\Funafuti": "eb33daa3195c75c1a5b54b14fe461b73",
  "dxmodules\\zoneinfo\\Pacific\\Galapagos": "684faae885b8ab403c2a54b9f1eecea9",
  "dxmodules\\zoneinfo\\Pacific\\Gambier": "921dd1aee0026d9b376f293ce4f246bc",
  "dxmodules\\zoneinfo\\Pacific\\Guadalcanal": "1de7b39a3bcdce97e8c93d336157dd8b",
  "dxmodules\\zoneinfo\\Pacific\\Guam": "af8e7d6ffe7865cc595b49479e53d408",
  "dxmodules\\zoneinfo\\Pacific\\Honolulu": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\Pacific\\Johnston": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\Pacific\\Kiritimati": "f5876d683bfa2f0339c3c048224e430f",
  "dxmodules\\zoneinfo\\Pacific\\Kosrae": "ef22d34dcb3734017a59ecc62ab84713",
  "dxmodules\\zoneinfo\\Pacific\\Kwajalein": "6d9261ff9442c0cf69446e362202d691",
  "dxmodules\\zoneinfo\\Pacific\\Majuro": "86a054fd15bfbd9fe15156ba7f4155fd",
  "dxmodules\\zoneinfo\\Pacific\\Marquesas": "e05efeb2e72d3a51e6019499841b509c",
  "dxmodules\\zoneinfo\\Pacific\\Midway": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\Pacific\\Nauru": "4f7dd62a8207d60009300c99c1773846",
  "dxmodules\\zoneinfo\\Pacific\\Niue": "2d69ed1a3e4496ecd16c94846675a0f3",
  "dxmodules\\zoneinfo\\Pacific\\Norfolk": "0ba7dc541ce5ad91b2d0aa81589ee205",
  "dxmodules\\zoneinfo\\Pacific\\Noumea": "48f634aa56c4cfee3f6afd37b28b66b2",
  "dxmodules\\zoneinfo\\Pacific\\Pago_Pago": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\Pacific\\Palau": "3ffa839dec8323e475526d5cd38fa82a",
  "dxmodules\\zoneinfo\\Pacific\\Pitcairn": "42e5aa28598d96efb16eb6734f31fda6",
  "dxmodules\\zoneinfo\\Pacific\\Pohnpei": "45f293ec35daa27a60c7e0c90b58012d",
  "dxmodules\\zoneinfo\\Pacific\\Ponape": "45f293ec35daa27a60c7e0c90b58012d",
  "dxmodules\\zoneinfo\\Pacific\\Port_Moresby": "c43a5f332114d2a9cd1d6c9f259c71f3",
  "dxmodules\\zoneinfo\\Pacific\\Rarotonga": "770947b4fd41633dc1d9cecc1ee972d2",
  "dxmodules\\zoneinfo\\Pacific\\Saipan": "af8e7d6ffe7865cc595b49479e53d408",
  "dxmodules\\zoneinfo\\Pacific\\Samoa": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\Pacific\\Tahiti": "cdbc49403d1d7684e83fdfc258106885",
  "dxmodules\\zoneinfo\\Pacific\\Tarawa": "b2564fba66250ab89502eec6d72c0c5e",
  "dxmodules\\zoneinfo\\Pacific\\Tongatapu": "db7a5ceed05b395c4660be082a4377da",
  "dxmodules\\zoneinfo\\Pacific\\Truk": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\Pacific\\Wake": "5763840e0d743d0555d9f0813404da80",
  "dxmodules\\zoneinfo\\Pacific\\Wallis": "36b100715cbee093d7c6056eaf60aeeb",
  "dxmodules\\zoneinfo\\Pacific\\Yap": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\Poland": "2ed881ef7e09c844c009673ded84c798",
  "dxmodules\\zoneinfo\\Portugal": "b9ba38decf09fe0728f81ebeabf29cfe",
  "dxmodules\\zoneinfo\\posix\\Africa\\Abidjan": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Accra": "6cb97bef390f7c65022c2e8c7eec45e0",
  "dxmodules\\zoneinfo\\posix\\Africa\\Addis_Ababa": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Algiers": "3342407b34291d264175caaf37813938",
  "dxmodules\\zoneinfo\\posix\\Africa\\Asmara": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Asmera": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Bamako": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Bangui": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Banjul": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Bissau": "af82ce73e5877a3dfd5c9dc93e869fa9",
  "dxmodules\\zoneinfo\\posix\\Africa\\Blantyre": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Brazzaville": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Bujumbura": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Cairo": "b9bb9d8c3cddc72252f4aa2082af4213",
  "dxmodules\\zoneinfo\\posix\\Africa\\Casablanca": "565d702c341dd4239a7e76208653c18c",
  "dxmodules\\zoneinfo\\posix\\Africa\\Ceuta": "5c2bf01f3f9fadcfa9a188e594f232e9",
  "dxmodules\\zoneinfo\\posix\\Africa\\Conakry": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Dakar": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Dar_es_Salaam": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Djibouti": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Douala": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\El_Aaiun": "b5acb6aaf433bd0dfe09d90fcc30c7e3",
  "dxmodules\\zoneinfo\\posix\\Africa\\Freetown": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Gaborone": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Harare": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Johannesburg": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\posix\\Africa\\Juba": "659ed8d529baf6f5043db708c1d17bee",
  "dxmodules\\zoneinfo\\posix\\Africa\\Kampala": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Khartoum": "021e36c906192435e0cb9c09440173a3",
  "dxmodules\\zoneinfo\\posix\\Africa\\Kigali": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Kinshasa": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Lagos": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Libreville": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Lome": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Luanda": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Lubumbashi": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Lusaka": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Malabo": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Maputo": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Maseru": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\posix\\Africa\\Mbabane": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\posix\\Africa\\Mogadishu": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Monrovia": "896a875aafa39c10b614c9803d1f2673",
  "dxmodules\\zoneinfo\\posix\\Africa\\Nairobi": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Ndjamena": "a0aad5ca661653e362b8afc808dc85c1",
  "dxmodules\\zoneinfo\\posix\\Africa\\Niamey": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Nouakchott": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Ouagadougou": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Porto-Novo": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Sao_Tome": "06142521165cb91ddc40c1d9000c7038",
  "dxmodules\\zoneinfo\\posix\\Africa\\Timbuktu": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Tripoli": "edec79f292e5b8c0d32b521af1f118bd",
  "dxmodules\\zoneinfo\\posix\\Africa\\Tunis": "4f1b4fe95a2512916e20c6f6e26d8e3c",
  "dxmodules\\zoneinfo\\posix\\Africa\\Windhoek": "6e9276508be4c6bfa224b9dddfefa61e",
  "dxmodules\\zoneinfo\\posix\\America\\Adak": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\posix\\America\\Anchorage": "596428a3a840d568656088bd48e608f1",
  "dxmodules\\zoneinfo\\posix\\America\\Anguilla": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Antigua": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Araguaina": "f41ab2d0a7a5b7fa0e3d3ac456b6bc97",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Catamarca": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\ComodRivadavia": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\La_Rioja": "00095a6391dda3fdca483ec5847abf2b",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Rio_Gallegos": "b97bc475f57e6b72c5ef969ed629e144",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Salta": "ed7e059362f3ae6381c2390798b0d524",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\San_Juan": "7c35305a9821e159720fae50b96790ca",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\San_Luis": "3e91f210d3eedf4543a4b716a5ba504c",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Tucuman": "b58092fe8d0461c10f5c3153ad9ed653",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Ushuaia": "b1d065d0cd8358933796fe3f034d799a",
  "dxmodules\\zoneinfo\\posix\\America\\Aruba": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\posix\\America\\Asuncion": "09a3f0569913d138c4f5d8c0c97c055c",
  "dxmodules\\zoneinfo\\posix\\America\\Atikokan": "6b028d3f8073ba06f9467133f6a1a0dd",
  "dxmodules\\zoneinfo\\posix\\America\\Atka": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\posix\\America\\Bahia": "2f5dd75c9ee116e4ca290849dfff7a9f",
  "dxmodules\\zoneinfo\\posix\\America\\Bahia_Banderas": "6d24d30bc671042918ba397a15e6114c",
  "dxmodules\\zoneinfo\\posix\\America\\Barbados": "92550378b8952475d3bffe20b1168820",
  "dxmodules\\zoneinfo\\posix\\America\\Belem": "432beed5d93041f2b551051332d7d72e",
  "dxmodules\\zoneinfo\\posix\\America\\Belize": "da3145d79cba5f541dd261434e449173",
  "dxmodules\\zoneinfo\\posix\\America\\Blanc-Sablon": "4169ae15c5a1477cfe281fa7702bcc14",
  "dxmodules\\zoneinfo\\posix\\America\\Boa_Vista": "a98b8a6d614366047943d78bc1896acb",
  "dxmodules\\zoneinfo\\posix\\America\\Bogota": "cb5574ae9b01614c9e8c082039fe8147",
  "dxmodules\\zoneinfo\\posix\\America\\Boise": "45dce4d7ef2491d2450d16565f878b02",
  "dxmodules\\zoneinfo\\posix\\America\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49",
  "dxmodules\\zoneinfo\\posix\\America\\Cambridge_Bay": "048d33fc74c19008a5a440b8b226cb45",
  "dxmodules\\zoneinfo\\posix\\America\\Campo_Grande": "6e2912b5b855c5e6d39eeb1bcf19aea5",
  "dxmodules\\zoneinfo\\posix\\America\\Cancun": "a2fe4da50cfb1afe8a46d6f55b805afa",
  "dxmodules\\zoneinfo\\posix\\America\\Caracas": "a5bf9cdb87d451a4aabad61d4ce91a2b",
  "dxmodules\\zoneinfo\\posix\\America\\Catamarca": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\posix\\America\\Cayenne": "e9f3bdd863a3cf2127077a21e918b057",
  "dxmodules\\zoneinfo\\posix\\America\\Cayman": "843b6eadcdd7838269e2195df886ebf1",
  "dxmodules\\zoneinfo\\posix\\America\\Chicago": "d0f076c9f390e7d8a933cc7cc1ad2e90",
  "dxmodules\\zoneinfo\\posix\\America\\Chihuahua": "75c741bb811f4ee563ce05eb976e53a1",
  "dxmodules\\zoneinfo\\posix\\America\\Coral_Harbour": "6b028d3f8073ba06f9467133f6a1a0dd",
  "dxmodules\\zoneinfo\\posix\\America\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\posix\\America\\Costa_Rica": "2dec281340a45276b0799a3bec48b76b",
  "dxmodules\\zoneinfo\\posix\\America\\Creston": "dbf874c388dc236612025d145b46d868",
  "dxmodules\\zoneinfo\\posix\\America\\Cuiaba": "71d500778aa9de635b9438695cf8b61e",
  "dxmodules\\zoneinfo\\posix\\America\\Curacao": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\posix\\America\\Danmarkshavn": "20e68f0a941140b269efb3af346b1e34",
  "dxmodules\\zoneinfo\\posix\\America\\Dawson": "9c8e92765ad27141e3a56f6a31599c99",
  "dxmodules\\zoneinfo\\posix\\America\\Dawson_Creek": "f7955656cccdf253d996deb5bb4176ef",
  "dxmodules\\zoneinfo\\posix\\America\\Denver": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\posix\\America\\Detroit": "ae3ba6ed8738ceda9eef109c6c586736",
  "dxmodules\\zoneinfo\\posix\\America\\Dominica": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Edmonton": "1f23503189b8ce70677b2dcbb4a57e8c",
  "dxmodules\\zoneinfo\\posix\\America\\Eirunepe": "236e0fa8dd250599b2146a7a203a6ae4",
  "dxmodules\\zoneinfo\\posix\\America\\El_Salvador": "b77c5f52b45573ae0f5673ac0ca1b086",
  "dxmodules\\zoneinfo\\posix\\America\\Ensenada": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\posix\\America\\Fortaleza": "2e202e859552b09ad60cdc408de47c94",
  "dxmodules\\zoneinfo\\posix\\America\\Fort_Nelson": "8853bd10553d7ca5eb5f0b9c7af5a047",
  "dxmodules\\zoneinfo\\posix\\America\\Fort_Wayne": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\posix\\America\\Glace_Bay": "6ba1b7da532cefb6e32d083377b71303",
  "dxmodules\\zoneinfo\\posix\\America\\Godthab": "4a1f3fd710057cfeaf3e7ac964a18466",
  "dxmodules\\zoneinfo\\posix\\America\\Goose_Bay": "18a9d1af32911f30273fabcc694d9654",
  "dxmodules\\zoneinfo\\posix\\America\\Grand_Turk": "539dcee68a715238ef8aa5642a9b5214",
  "dxmodules\\zoneinfo\\posix\\America\\Grenada": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Guadeloupe": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Guatemala": "097638f469fdba70e9637561cffefd91",
  "dxmodules\\zoneinfo\\posix\\America\\Guayaquil": "bbe67886e74ffd7d1ed09a3481b5120c",
  "dxmodules\\zoneinfo\\posix\\America\\Guyana": "7fb63c484765baf41049bd41cfca0184",
  "dxmodules\\zoneinfo\\posix\\America\\Halifax": "820f35f23d49a527ffe813e2d96c5da7",
  "dxmodules\\zoneinfo\\posix\\America\\Havana": "1877fc45317e144ea206ddc622cebba2",
  "dxmodules\\zoneinfo\\posix\\America\\Hermosillo": "7bdce7a211e50eff3b5b8de21a46d581",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Knox": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Marengo": "541539f004b1b1722ac96e897d06ac45",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Petersburg": "82b5d3f05f88ac02cb5a4c3fb08fa191",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Tell_City": "dfe557585c608ee9e34e9b75fbe72617",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Vevay": "d0f3d93603268abdfeb402bbe0c3c0b3",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Vincennes": "d13258dc61c8a747a914396a56e4218c",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Winamac": "e6b915ae1c01b71fd7b42b00b4664029",
  "dxmodules\\zoneinfo\\posix\\America\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\posix\\America\\Inuvik": "4ea2c19a83f810220c7302c9914e4ee4",
  "dxmodules\\zoneinfo\\posix\\America\\Iqaluit": "4142e0b137ac6cf3fdad0fce11560ca1",
  "dxmodules\\zoneinfo\\posix\\America\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af",
  "dxmodules\\zoneinfo\\posix\\America\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11",
  "dxmodules\\zoneinfo\\posix\\America\\Juneau": "6276c692ca4f68dcb846d7e918ee23dd",
  "dxmodules\\zoneinfo\\posix\\America\\Kentucky\\Louisville": "99545115e4f688d7f573d38d667194d9",
  "dxmodules\\zoneinfo\\posix\\America\\Kentucky\\Monticello": "4041c24d41fbbd407e4d398824225d50",
  "dxmodules\\zoneinfo\\posix\\America\\Knox_IN": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\posix\\America\\Kralendijk": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\posix\\America\\La_Paz": "962d2f2486d3c16a6095390156e322b3",
  "dxmodules\\zoneinfo\\posix\\America\\Lima": "cc24c83127c28793afc54e43fe5766e4",
  "dxmodules\\zoneinfo\\posix\\America\\Los_Angeles": "9323ff44ce205ce1a1bad7e2dca39939",
  "dxmodules\\zoneinfo\\posix\\America\\Louisville": "99545115e4f688d7f573d38d667194d9",
  "dxmodules\\zoneinfo\\posix\\America\\Lower_Princes": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\posix\\America\\Maceio": "378a3e07cabc7773b6078025e9981793",
  "dxmodules\\zoneinfo\\posix\\America\\Managua": "4667d4aa7d530f1f61f5b116258eb84d",
  "dxmodules\\zoneinfo\\posix\\America\\Manaus": "585a0b598d406e6c0d710182bbdba35e",
  "dxmodules\\zoneinfo\\posix\\America\\Marigot": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Martinique": "ecdf79bbd2c17670a4637d06b01d7819",
  "dxmodules\\zoneinfo\\posix\\America\\Matamoros": "9ba17635ae8f44fa50c4565328433383",
  "dxmodules\\zoneinfo\\posix\\America\\Mazatlan": "2a157b818df8ab296baf6de38cd7d32b",
  "dxmodules\\zoneinfo\\posix\\America\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870",
  "dxmodules\\zoneinfo\\posix\\America\\Menominee": "c720185d11deb83ad58b22b118830261",
  "dxmodules\\zoneinfo\\posix\\America\\Merida": "91ebe16317802987c2cd9c567b6e4c2a",
  "dxmodules\\zoneinfo\\posix\\America\\Metlakatla": "02b06c27e6b6de8398ac263055a2d280",
  "dxmodules\\zoneinfo\\posix\\America\\Mexico_City": "cff58c6976849e1e8f94d4288b07b9d2",
  "dxmodules\\zoneinfo\\posix\\America\\Miquelon": "ac08a2e10dea976318846a7f7b254f26",
  "dxmodules\\zoneinfo\\posix\\America\\Moncton": "2fa9e016bc7e55f51d036a158a40e0e9",
  "dxmodules\\zoneinfo\\posix\\America\\Monterrey": "f77b22ac5e4f995ef8d4839835a54faa",
  "dxmodules\\zoneinfo\\posix\\America\\Montevideo": "51fb8d4c68e90f30d5eb1dd503bf202e",
  "dxmodules\\zoneinfo\\posix\\America\\Montreal": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\posix\\America\\Montserrat": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Nassau": "1444a5132c9a26f350ebe705760215c7",
  "dxmodules\\zoneinfo\\posix\\America\\New_York": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\posix\\America\\Nipigon": "365984faa12e0762dac780bf71204633",
  "dxmodules\\zoneinfo\\posix\\America\\Nome": "f9cb8bbe99e6143a75b2797ddf94f234",
  "dxmodules\\zoneinfo\\posix\\America\\Noronha": "a8562cc7d0e4555968ad7744dceb9d43",
  "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\Beulah": "59406487459534f8844f828b8356d083",
  "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\Center": "6964f42dc925648abaa448f18b330d46",
  "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\New_Salem": "c14a42a9b8d8571354c8ced6fa931eac",
  "dxmodules\\zoneinfo\\posix\\America\\Nuuk": "4a1f3fd710057cfeaf3e7ac964a18466",
  "dxmodules\\zoneinfo\\posix\\America\\Ojinaga": "95e6bee1cb146689410010d58e6ee974",
  "dxmodules\\zoneinfo\\posix\\America\\Panama": "843b6eadcdd7838269e2195df886ebf1",
  "dxmodules\\zoneinfo\\posix\\America\\Pangnirtung": "b71f8c6f5a9b289c981af0cdbf80f7e1",
  "dxmodules\\zoneinfo\\posix\\America\\Paramaribo": "2d11461cf62c48496eb9a866b3eb1712",
  "dxmodules\\zoneinfo\\posix\\America\\Phoenix": "c697bb02e057325a74547912f631a3a7",
  "dxmodules\\zoneinfo\\posix\\America\\Port-au-Prince": "27e4cb1b082cd694df8c1b2f27838f85",
  "dxmodules\\zoneinfo\\posix\\America\\Porto_Acre": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\posix\\America\\Porto_Velho": "63160b0eb1d694ae0f97644160eea68a",
  "dxmodules\\zoneinfo\\posix\\America\\Port_of_Spain": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Puerto_Rico": "b3feb20144b4070d5eff32dab8c8a160",
  "dxmodules\\zoneinfo\\posix\\America\\Punta_Arenas": "9c43769cae1008f7fd054e807960a9cd",
  "dxmodules\\zoneinfo\\posix\\America\\Rainy_River": "4bdb5a197d174ac4834b4e738340fdf6",
  "dxmodules\\zoneinfo\\posix\\America\\Rankin_Inlet": "902bc59be5586a60cf0c67188027f7c4",
  "dxmodules\\zoneinfo\\posix\\America\\Recife": "a9b9203d577c57c1cbf0873327336ac1",
  "dxmodules\\zoneinfo\\posix\\America\\Regina": "cec6491b350dfbdb74732df745eb37d3",
  "dxmodules\\zoneinfo\\posix\\America\\Resolute": "e272bb16aa765ea5439726dde6f283eb",
  "dxmodules\\zoneinfo\\posix\\America\\Rio_Branco": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\posix\\America\\Rosario": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\posix\\America\\Santarem": "31689ae81ac7aea65cc5784da4560e73",
  "dxmodules\\zoneinfo\\posix\\America\\Santa_Isabel": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\posix\\America\\Santiago": "b8db6707d0c4f0dfc7a12be81d35df8f",
  "dxmodules\\zoneinfo\\posix\\America\\Santo_Domingo": "7edb49f18d76f116c5578c3dcd279ade",
  "dxmodules\\zoneinfo\\posix\\America\\Sao_Paulo": "339ff8dbd88e39f59b2fd4ee57b1fdb1",
  "dxmodules\\zoneinfo\\posix\\America\\Scoresbysund": "1a5f6775efbfe9befc36df0a3d19c594",
  "dxmodules\\zoneinfo\\posix\\America\\Shiprock": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\posix\\America\\Sitka": "efa4e4969d3d0423dc3429a756921244",
  "dxmodules\\zoneinfo\\posix\\America\\St_Barthelemy": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\St_Johns": "79d938b80bf215c8e13d2cb4727343d8",
  "dxmodules\\zoneinfo\\posix\\America\\St_Kitts": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\St_Lucia": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\St_Thomas": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\St_Vincent": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Swift_Current": "c74726e554d359f38a26870282725f04",
  "dxmodules\\zoneinfo\\posix\\America\\Tegucigalpa": "963e88d190d129470f37774310dd20e4",
  "dxmodules\\zoneinfo\\posix\\America\\Thule": "32b5bb9f1f25d306246bd96a0ef317c4",
  "dxmodules\\zoneinfo\\posix\\America\\Thunder_Bay": "aa82e0d2a447d3610f4c2eea10c2a7b8",
  "dxmodules\\zoneinfo\\posix\\America\\Tijuana": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\posix\\America\\Toronto": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\posix\\America\\Tortola": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Vancouver": "9d48c60fed12ae8a6f5b139bf0b254b5",
  "dxmodules\\zoneinfo\\posix\\America\\Virgin": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Whitehorse": "3b82b92569a6900dadc0aa62c7cb6f36",
  "dxmodules\\zoneinfo\\posix\\America\\Winnipeg": "f0683580a6116b3c744cb6b3d63aa0b1",
  "dxmodules\\zoneinfo\\posix\\America\\Yakutat": "ee0f462df87e663c328908c5e81260d0",
  "dxmodules\\zoneinfo\\posix\\America\\Yellowknife": "b5087ae9a8ccc013470ebf44bc635281",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Casey": "f6d44d9ea6501a60287aeff26715bef0",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Davis": "80a08215623fd38f21aa72861fdf54cd",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\DumontDUrville": "e3f2c24ea8bfb0c5bea7a209cfd1baae",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Macquarie": "7c8809733d07903666654c0e67aeaec5",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Mawson": "d285e96947e86928c647ab2b2cf185b5",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\McMurdo": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Palmer": "3a6a847fb145840a4941337c2ae86d96",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Rothera": "70e1309683f8a4afa2f0d752bf97b46c",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\South_Pole": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Syowa": "553ede0b9071e1364892b1ed27a7f1a6",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Troll": "f13b257391af38577970477597e9d499",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Vostok": "4bb37b331311a0867117d218adf10610",
  "dxmodules\\zoneinfo\\posix\\Arctic\\Longyearbyen": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\posix\\Asia\\Aden": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Almaty": "938c35fa2fdc23ae382ad9b2278c6f58",
  "dxmodules\\zoneinfo\\posix\\Asia\\Amman": "63694da35da6a976fb37a62debd191a4",
  "dxmodules\\zoneinfo\\posix\\Asia\\Anadyr": "5648ae758f6447668653221263b5ea9d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Aqtau": "d020e6bedcd22c98f021e7c1c3ed8ee4",
  "dxmodules\\zoneinfo\\posix\\Asia\\Aqtobe": "486c6c79d56174ee29d05fc6efd9e18e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ashgabat": "235b16a54519989a51679188703ca5ac",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ashkhabad": "235b16a54519989a51679188703ca5ac",
  "dxmodules\\zoneinfo\\posix\\Asia\\Atyrau": "5fbe4e89da1f20229c0c3747017557c0",
  "dxmodules\\zoneinfo\\posix\\Asia\\Baghdad": "af9423b28aad58ffc1790d29244309b8",
  "dxmodules\\zoneinfo\\posix\\Asia\\Bahrain": "fc5a2c1c087d56e4b7323259ab62bef6",
  "dxmodules\\zoneinfo\\posix\\Asia\\Baku": "27e366b2523ae3dfd1e648ecdf54bc15",
  "dxmodules\\zoneinfo\\posix\\Asia\\Bangkok": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\posix\\Asia\\Barnaul": "cfefaae119b421f5b3c990ef4948ebf7",
  "dxmodules\\zoneinfo\\posix\\Asia\\Beirut": "785117e925db8afec6b0c761163b002c",
  "dxmodules\\zoneinfo\\posix\\Asia\\Bishkek": "5dec7f8d19f19560c2fd59b16f2a2214",
  "dxmodules\\zoneinfo\\posix\\Asia\\Brunei": "3db4e51993e234a73f7054160abf663d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Calcutta": "569f373970581e6488a24b5c70326d49",
  "dxmodules\\zoneinfo\\posix\\Asia\\Chita": "6b2c484a3c93d7523cd09ec0d13b53fe",
  "dxmodules\\zoneinfo\\posix\\Asia\\Choibalsan": "8ca46182ff4884d5b45c3c41e777783a",
  "dxmodules\\zoneinfo\\posix\\Asia\\Chongqing": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Chungking": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Colombo": "12c255c649eaa1ade0387c30596825d9",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dacca": "ea255e2dada4541d25ad34139c18419f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Damascus": "07b6153d721b5d7d93d78f2591201ffa",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dhaka": "ea255e2dada4541d25ad34139c18419f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dili": "5c7fb0d932343cc330df273a5bb9308b",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dubai": "e17583385b056a775970e7bcd9a6b7dd",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dushanbe": "29a7b7661ea6575cd7f8ba1435b78f1d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Famagusta": "14a69e4234b2f2c02a3d3a46d0ecffbb",
  "dxmodules\\zoneinfo\\posix\\Asia\\Gaza": "798a2fa999dfbd3d557b0afeedc99562",
  "dxmodules\\zoneinfo\\posix\\Asia\\Harbin": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Hebron": "f600ca83e00a4c2d046dbd5ae0461018",
  "dxmodules\\zoneinfo\\posix\\Asia\\Hong_Kong": "1f5267f14578c917d94c972e46fc8e0e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Hovd": "585f478cf864b0065bd07587e6b1e41f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ho_Chi_Minh": "104047aa22a3824e08e4fffeccc80d19",
  "dxmodules\\zoneinfo\\posix\\Asia\\Irkutsk": "8a84642c58ed64282884014698df2f7d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\posix\\Asia\\Jakarta": "c280819a288b0aea09db4fd1fd017546",
  "dxmodules\\zoneinfo\\posix\\Asia\\Jayapura": "75c2120efce23b61989c6a15635d115f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Jerusalem": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kabul": "47a295d1de026d2e443c132316ed4533",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kamchatka": "da5950adc8bcdb823cff01b81d2d1ec9",
  "dxmodules\\zoneinfo\\posix\\Asia\\Karachi": "b1afc0a7ce4118813cdc8679e8b20d8a",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kashgar": "a43f32e98fa40e6601db5cca019a01a8",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kathmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Katmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Khandyga": "d8845dc2bfed88c1aef353c99c332d8e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kolkata": "569f373970581e6488a24b5c70326d49",
  "dxmodules\\zoneinfo\\posix\\Asia\\Krasnoyarsk": "6459a2dc5df86eecb3d8d881e285fbc5",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kuala_Lumpur": "8a0970a2f6db03aa6317757fe59d24e5",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kuching": "941bf864c5cd1bcbcba5bf386815338d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kuwait": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Macao": "f61abab83b519b307988b2c9e1c13037",
  "dxmodules\\zoneinfo\\posix\\Asia\\Macau": "f61abab83b519b307988b2c9e1c13037",
  "dxmodules\\zoneinfo\\posix\\Asia\\Magadan": "7d44faf13ac5b3facbd83ff3857a0e1e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Makassar": "13cba3c3bb605214bf3464922974ca13",
  "dxmodules\\zoneinfo\\posix\\Asia\\Manila": "7edfd09b1ebe5e5a152a03a7a705f5bc",
  "dxmodules\\zoneinfo\\posix\\Asia\\Muscat": "e17583385b056a775970e7bcd9a6b7dd",
  "dxmodules\\zoneinfo\\posix\\Asia\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a",
  "dxmodules\\zoneinfo\\posix\\Asia\\Novokuznetsk": "d5f8acb7b4e7d664a04dd154980eda1f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Novosibirsk": "b6434f1e22bf4098c2a8c5371dc301fe",
  "dxmodules\\zoneinfo\\posix\\Asia\\Omsk": "e789f5c5cce168d524f5a8c2486b62ba",
  "dxmodules\\zoneinfo\\posix\\Asia\\Oral": "2586cc76cb792e5a3e56f5c130892c93",
  "dxmodules\\zoneinfo\\posix\\Asia\\Phnom_Penh": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\posix\\Asia\\Pontianak": "75dbcd818e883badda4d6df52f07c9ae",
  "dxmodules\\zoneinfo\\posix\\Asia\\Pyongyang": "55ccc2dfaf651c7452baf53f3c0bcaa1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Qatar": "fc5a2c1c087d56e4b7323259ab62bef6",
  "dxmodules\\zoneinfo\\posix\\Asia\\Qostanay": "6f2759a853ade2f4c50fddc156e833c6",
  "dxmodules\\zoneinfo\\posix\\Asia\\Qyzylorda": "2794eeaae5075fae6c902660beae2141",
  "dxmodules\\zoneinfo\\posix\\Asia\\Rangoon": "facd5e2823e744613e5d83384b53b17f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Riyadh": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Saigon": "104047aa22a3824e08e4fffeccc80d19",
  "dxmodules\\zoneinfo\\posix\\Asia\\Sakhalin": "d065dcba4d1f2f8df4862ea639caf3f3",
  "dxmodules\\zoneinfo\\posix\\Asia\\Samarkand": "7c0752cecdf1b32c7618128577045bcc",
  "dxmodules\\zoneinfo\\posix\\Asia\\Seoul": "f7a6e371bd709b3c2f64ce6f67f39f29",
  "dxmodules\\zoneinfo\\posix\\Asia\\Shanghai": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3",
  "dxmodules\\zoneinfo\\posix\\Asia\\Srednekolymsk": "9e7e46bbc5dad40e5f90e797d941d22e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Taipei": "2e67467e3c050e8b3a4022eb9e20300e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tashkent": "3e47dbc84c7895e2cb890776d3ad119b",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tbilisi": "da70a44f47a6a309eff8c9302fecf559",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tehran": "d2cb514595346f1168c2f1167409ec7c",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tel_Aviv": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\posix\\Asia\\Thimbu": "97be2e1f7789978b407476a8094d5ee1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Thimphu": "97be2e1f7789978b407476a8094d5ee1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tokyo": "478afb8b1f182b2ff53caa2e6cc8ffd9",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tomsk": "903e9bdc80298a4433a48219a071d4af",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ujung_Pandang": "13cba3c3bb605214bf3464922974ca13",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ulaanbaatar": "3f0446e3735c9dd93089eeae31a37c1b",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ulan_Bator": "3f0446e3735c9dd93089eeae31a37c1b",
  "dxmodules\\zoneinfo\\posix\\Asia\\Urumqi": "a43f32e98fa40e6601db5cca019a01a8",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ust-Nera": "4d04e65ff5d8c7b407d6cb8dedbe33a4",
  "dxmodules\\zoneinfo\\posix\\Asia\\Vientiane": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\posix\\Asia\\Vladivostok": "cecab70411f0df191ef4a2cb747bdb08",
  "dxmodules\\zoneinfo\\posix\\Asia\\Yakutsk": "bfef1f6f86fa7080259fd26f7668bc84",
  "dxmodules\\zoneinfo\\posix\\Asia\\Yangon": "facd5e2823e744613e5d83384b53b17f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Yekaterinburg": "807931acd2f4fa27806b8208de988391",
  "dxmodules\\zoneinfo\\posix\\Asia\\Yerevan": "e196b792aab3b785a957682c74f574e7",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Azores": "5433c796c8a770b6b06fe812ae08527f",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Bermuda": "659000f311b0ab5c90442cb81278c62c",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Canary": "167a786aa74ba2a9dd68c470746aa0ac",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Cape_Verde": "b3795953b76fb3cc553fdbb4d825cb93",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Faeroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Faroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Jan_Mayen": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Madeira": "2e4a8509560836b8341ec2e612627005",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Reykjavik": "d5e2f791bed996743c667784bb8c52ea",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\South_Georgia": "f0b2aeeddf3200b6a5839d86f35879e6",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Stanley": "5a5247cc12a456fee6716540c14e55ad",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\St_Helena": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Australia\\ACT": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\posix\\Australia\\Adelaide": "a3ec822dc0c8fd04e431b3316d1166ca",
  "dxmodules\\zoneinfo\\posix\\Australia\\Brisbane": "0c8a54dfc42c9a987fff25d5d72096fa",
  "dxmodules\\zoneinfo\\posix\\Australia\\Broken_Hill": "c0a218c9fe25b535b4a1a6b70dad3af2",
  "dxmodules\\zoneinfo\\posix\\Australia\\Canberra": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\posix\\Australia\\Currie": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\posix\\Australia\\Darwin": "cbb2b15b2c2034c2584f801cec184e2b",
  "dxmodules\\zoneinfo\\posix\\Australia\\Eucla": "1459b57ff3474bbe12013908f4bed8aa",
  "dxmodules\\zoneinfo\\posix\\Australia\\Hobart": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\posix\\Australia\\LHI": "b664b61c1949c1beea8838facf6c1d8b",
  "dxmodules\\zoneinfo\\posix\\Australia\\Lindeman": "4d125f1a5ec84cf6f62607152dedf324",
  "dxmodules\\zoneinfo\\posix\\Australia\\Lord_Howe": "b664b61c1949c1beea8838facf6c1d8b",
  "dxmodules\\zoneinfo\\posix\\Australia\\Melbourne": "5f06e3a482d43ee4018736ac792b1129",
  "dxmodules\\zoneinfo\\posix\\Australia\\North": "cbb2b15b2c2034c2584f801cec184e2b",
  "dxmodules\\zoneinfo\\posix\\Australia\\NSW": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\posix\\Australia\\Perth": "a54a9120fddca3a9bb951ac9d8bce260",
  "dxmodules\\zoneinfo\\posix\\Australia\\Queensland": "0c8a54dfc42c9a987fff25d5d72096fa",
  "dxmodules\\zoneinfo\\posix\\Australia\\South": "a3ec822dc0c8fd04e431b3316d1166ca",
  "dxmodules\\zoneinfo\\posix\\Australia\\Sydney": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\posix\\Australia\\Tasmania": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\posix\\Australia\\Victoria": "5f06e3a482d43ee4018736ac792b1129",
  "dxmodules\\zoneinfo\\posix\\Australia\\West": "a54a9120fddca3a9bb951ac9d8bce260",
  "dxmodules\\zoneinfo\\posix\\Australia\\Yancowinna": "c0a218c9fe25b535b4a1a6b70dad3af2",
  "dxmodules\\zoneinfo\\posix\\Brazil\\Acre": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\posix\\Brazil\\DeNoronha": "a8562cc7d0e4555968ad7744dceb9d43",
  "dxmodules\\zoneinfo\\posix\\Brazil\\East": "339ff8dbd88e39f59b2fd4ee57b1fdb1",
  "dxmodules\\zoneinfo\\posix\\Brazil\\West": "585a0b598d406e6c0d710182bbdba35e",
  "dxmodules\\zoneinfo\\posix\\Canada\\Atlantic": "820f35f23d49a527ffe813e2d96c5da7",
  "dxmodules\\zoneinfo\\posix\\Canada\\Central": "f0683580a6116b3c744cb6b3d63aa0b1",
  "dxmodules\\zoneinfo\\posix\\Canada\\Eastern": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\posix\\Canada\\Mountain": "1f23503189b8ce70677b2dcbb4a57e8c",
  "dxmodules\\zoneinfo\\posix\\Canada\\Newfoundland": "79d938b80bf215c8e13d2cb4727343d8",
  "dxmodules\\zoneinfo\\posix\\Canada\\Pacific": "9d48c60fed12ae8a6f5b139bf0b254b5",
  "dxmodules\\zoneinfo\\posix\\Canada\\Saskatchewan": "cec6491b350dfbdb74732df745eb37d3",
  "dxmodules\\zoneinfo\\posix\\Canada\\Yukon": "3b82b92569a6900dadc0aa62c7cb6f36",
  "dxmodules\\zoneinfo\\posix\\CET": "3f166816639388adb3d3567e28ef2145",
  "dxmodules\\zoneinfo\\posix\\Chile\\Continental": "b8db6707d0c4f0dfc7a12be81d35df8f",
  "dxmodules\\zoneinfo\\posix\\Chile\\EasterIsland": "ea76f04afd1b377b869cd7532b35457c",
  "dxmodules\\zoneinfo\\posix\\CST6CDT": "8396c3e49c717f9ba736b4d4d1b24b8b",
  "dxmodules\\zoneinfo\\posix\\Cuba": "1877fc45317e144ea206ddc622cebba2",
  "dxmodules\\zoneinfo\\posix\\EET": "16b84f2a83840fd4132c2e3fbff3b758",
  "dxmodules\\zoneinfo\\posix\\Egypt": "b9bb9d8c3cddc72252f4aa2082af4213",
  "dxmodules\\zoneinfo\\posix\\Eire": "0e226ce4b36682f2c9c2fa1146809778",
  "dxmodules\\zoneinfo\\posix\\EST": "d0f150b6acc4dc78b8ada8abb1079af6",
  "dxmodules\\zoneinfo\\posix\\EST5EDT": "e7a28a1315bcd4deedaaac6d1c3cd3e2",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+1": "169210c55520d3a8efc1362a5d89e402",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+10": "03d40b4007e96680e56f10372148cf51",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+11": "bb030b7fea0da0987217737e22a9cbe0",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+12": "66046646734491458066327a04705b0c",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+2": "0a97351084a016afb88b8b698ea922d8",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+3": "73897f3686a7bca3e2719cfa59f83b6b",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+4": "e943df1168ea3d597ec62c8933a11a9c",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+5": "a9d53018097b6bcca5e6a4e55211e80b",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+6": "0a8c24c796c1473250ff564fce59e937",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+7": "d87007923e671b8b78552d613299ac8a",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+8": "e99240e190c8a4ccf3cc0a26618fb09b",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+9": "e77b0b4911d483289610c4efcd599d7d",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-1": "a3c457b6cc2c3be7f34da00d84ec229e",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-10": "8ed77c9096196e97be5f0807bf939bac",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-11": "dcdc4caf8194fa9d29ceccdc225a5048",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-12": "fe87b6111ce93c3d10fe152ca715a715",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-13": "0fd6f7e68d38e1cef98efdc6ecedae80",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-14": "155f8eb5a5dd22c81eef6986c8c5317c",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-2": "a9eafb629b4070ca0ff8f99631390031",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-3": "b73ddab7b5ca9128a8b2925fad5b11f0",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-4": "0c08dc6b2974b3207bf6293544a236b0",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-5": "57ca1133eeeb09c7c30c04850d49d4e5",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-6": "642170284ddc2575f5e077d7ea33dcdc",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-7": "2f4d1ba17adf0c86acb4cc6258f8a0cb",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-8": "f4d3b2b664698da9268d3f244fec9232",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-9": "02963228a1537cc2c8bdf22e99178893",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\Greenwich": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\UCT": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Etc\\Universal": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Etc\\UTC": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Etc\\Zulu": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Europe\\Amsterdam": "e3b0d618da0bd60d894183dd0d53923e",
  "dxmodules\\zoneinfo\\posix\\Europe\\Andorra": "8bfff3a580b4b0db3dff30d1d7385ac4",
  "dxmodules\\zoneinfo\\posix\\Europe\\Astrakhan": "ba197918d51925f1e0b771923ce3a19f",
  "dxmodules\\zoneinfo\\posix\\Europe\\Athens": "75d641576f8d4376045ba8f16db4063a",
  "dxmodules\\zoneinfo\\posix\\Europe\\Belfast": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Belgrade": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Berlin": "4790e83465681cefbf852aed265354bf",
  "dxmodules\\zoneinfo\\posix\\Europe\\Bratislava": "eab2cea5cb5bf0374f6bf891b9102844",
  "dxmodules\\zoneinfo\\posix\\Europe\\Brussels": "3d5d93412e485bac12e0587239835fd9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Bucharest": "751205baadb94c5f41dadbcc97ab23db",
  "dxmodules\\zoneinfo\\posix\\Europe\\Budapest": "f76d3a5131d6910f5c2a34fbe35c265e",
  "dxmodules\\zoneinfo\\posix\\Europe\\Busingen": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\posix\\Europe\\Chisinau": "717476d2fe0213c40e31f52573c05356",
  "dxmodules\\zoneinfo\\posix\\Europe\\Copenhagen": "96039e70388d843950bcbef21328bba6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Dublin": "0e226ce4b36682f2c9c2fa1146809778",
  "dxmodules\\zoneinfo\\posix\\Europe\\Gibraltar": "77fe14fec44142c1435dcc4eac003df4",
  "dxmodules\\zoneinfo\\posix\\Europe\\Guernsey": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Helsinki": "3eaa8467ffb21b15bd75200ff2c0a3db",
  "dxmodules\\zoneinfo\\posix\\Europe\\Isle_of_Man": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\posix\\Europe\\Jersey": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Kaliningrad": "7dc8e4aecf6dcf214b52938e289c9831",
  "dxmodules\\zoneinfo\\posix\\Europe\\Kiev": "f957769855be8b9d5983e51c033975d8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Kirov": "6467d1d15049cb0015bbd56c92b18814",
  "dxmodules\\zoneinfo\\posix\\Europe\\Lisbon": "b9ba38decf09fe0728f81ebeabf29cfe",
  "dxmodules\\zoneinfo\\posix\\Europe\\Ljubljana": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\London": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Luxembourg": "3242615a805f051357309a89874633f3",
  "dxmodules\\zoneinfo\\posix\\Europe\\Madrid": "3ecb0fe1a9207bc3f77e793315ce0e5d",
  "dxmodules\\zoneinfo\\posix\\Europe\\Malta": "b6e707a0d755cfd038a7c4ecc44845e7",
  "dxmodules\\zoneinfo\\posix\\Europe\\Mariehamn": "3eaa8467ffb21b15bd75200ff2c0a3db",
  "dxmodules\\zoneinfo\\posix\\Europe\\Minsk": "07aeb33b58212d75e92b8eb157cc1624",
  "dxmodules\\zoneinfo\\posix\\Europe\\Monaco": "89271b78b389e6180385b96e7af94e7a",
  "dxmodules\\zoneinfo\\posix\\Europe\\Moscow": "223bbf37352a9d4807919132f360535e",
  "dxmodules\\zoneinfo\\posix\\Europe\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a",
  "dxmodules\\zoneinfo\\posix\\Europe\\Oslo": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\posix\\Europe\\Paris": "fe22373ca65df6ba6b254f5c4304fae8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Podgorica": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Prague": "eab2cea5cb5bf0374f6bf891b9102844",
  "dxmodules\\zoneinfo\\posix\\Europe\\Riga": "b4541699f68b4aba0daa45df63e596a4",
  "dxmodules\\zoneinfo\\posix\\Europe\\Rome": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Samara": "d390934cf2dc01f033ffda93394c85d7",
  "dxmodules\\zoneinfo\\posix\\Europe\\San_Marino": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Sarajevo": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Saratov": "756b361dc39b978b78eaf6df78a7ad0e",
  "dxmodules\\zoneinfo\\posix\\Europe\\Simferopol": "9b2ddc8ca9d5c792d09f37ca58104afa",
  "dxmodules\\zoneinfo\\posix\\Europe\\Skopje": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Sofia": "68e6be692f44b3ed696fd2e6ef806927",
  "dxmodules\\zoneinfo\\posix\\Europe\\Stockholm": "1b9ed89af7331c6141249d181b42c621",
  "dxmodules\\zoneinfo\\posix\\Europe\\Tallinn": "46abec9f16a148333139ff5b0b6d1115",
  "dxmodules\\zoneinfo\\posix\\Europe\\Tirane": "d5977bad592e33b2e4058a242d735927",
  "dxmodules\\zoneinfo\\posix\\Europe\\Tiraspol": "717476d2fe0213c40e31f52573c05356",
  "dxmodules\\zoneinfo\\posix\\Europe\\Ulyanovsk": "ff8f50dd006548eb8751802c600f2299",
  "dxmodules\\zoneinfo\\posix\\Europe\\Uzhgorod": "0b4761ce9ee17b7b8bfb0d12063803c6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Vaduz": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\posix\\Europe\\Vatican": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Vienna": "cb0f39744833718fbd602c54e0425157",
  "dxmodules\\zoneinfo\\posix\\Europe\\Vilnius": "524d360c5369c1abcb59e8140b59acda",
  "dxmodules\\zoneinfo\\posix\\Europe\\Volgograd": "442a047745c83ebebc180c67f6798fc2",
  "dxmodules\\zoneinfo\\posix\\Europe\\Warsaw": "2ed881ef7e09c844c009673ded84c798",
  "dxmodules\\zoneinfo\\posix\\Europe\\Zagreb": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Zaporozhye": "69430a5e3e93bd0ed6e2e604ddf6e903",
  "dxmodules\\zoneinfo\\posix\\Europe\\Zurich": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\posix\\GB": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\GB-Eire": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\GMT": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\GMT+0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\GMT-0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\GMT0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Greenwich": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Hongkong": "1f5267f14578c917d94c972e46fc8e0e",
  "dxmodules\\zoneinfo\\posix\\HST": "fd4ae9e0296519fb47b4b036ea4af025",
  "dxmodules\\zoneinfo\\posix\\Iceland": "d5e2f791bed996743c667784bb8c52ea",
  "dxmodules\\zoneinfo\\posix\\Indian\\Antananarivo": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Indian\\Chagos": "dfb323eb6037596036669f4b4505544c",
  "dxmodules\\zoneinfo\\posix\\Indian\\Christmas": "02b16169f8f47de904f3f05cb7f72583",
  "dxmodules\\zoneinfo\\posix\\Indian\\Cocos": "d9ffcdd40666dcb76225bdfb4654c0cf",
  "dxmodules\\zoneinfo\\posix\\Indian\\Comoro": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Indian\\Kerguelen": "749273edab499ed254e32606a9e5579e",
  "dxmodules\\zoneinfo\\posix\\Indian\\Mahe": "0df488f823d924b336f01d53d270af73",
  "dxmodules\\zoneinfo\\posix\\Indian\\Maldives": "89a066bf0512071db2a9eb425df46341",
  "dxmodules\\zoneinfo\\posix\\Indian\\Mauritius": "8f06c0fc457b6a12c0bbc4946e2dfb05",
  "dxmodules\\zoneinfo\\posix\\Indian\\Mayotte": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Indian\\Reunion": "817b0a2e45ae9c1e566499a4b068295e",
  "dxmodules\\zoneinfo\\posix\\Iran": "d2cb514595346f1168c2f1167409ec7c",
  "dxmodules\\zoneinfo\\posix\\Israel": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\posix\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af",
  "dxmodules\\zoneinfo\\posix\\Japan": "478afb8b1f182b2ff53caa2e6cc8ffd9",
  "dxmodules\\zoneinfo\\posix\\Kwajalein": "6d9261ff9442c0cf69446e362202d691",
  "dxmodules\\zoneinfo\\posix\\Libya": "edec79f292e5b8c0d32b521af1f118bd",
  "dxmodules\\zoneinfo\\posix\\MET": "3b07c8cc8c1fed960246da4e3791a73c",
  "dxmodules\\zoneinfo\\posix\\Mexico\\BajaNorte": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\posix\\Mexico\\BajaSur": "2a157b818df8ab296baf6de38cd7d32b",
  "dxmodules\\zoneinfo\\posix\\Mexico\\General": "cff58c6976849e1e8f94d4288b07b9d2",
  "dxmodules\\zoneinfo\\posix\\MST": "04da8453f31d6971b7fa4f3f8fb26654",
  "dxmodules\\zoneinfo\\posix\\MST7MDT": "76be6718eb3cf4ac468387b5d13ffafb",
  "dxmodules\\zoneinfo\\posix\\Navajo": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\posix\\NZ": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\posix\\NZ-CHAT": "0e76ddb8bb10f4b8f2ee092f731b6452",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Apia": "6b2ba3b8fc50b635cdc0c1f117243439",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Auckland": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Bougainville": "e2da4052206976c32cd533f22f0bcf15",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Chatham": "0e76ddb8bb10f4b8f2ee092f731b6452",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Chuuk": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Easter": "ea76f04afd1b377b869cd7532b35457c",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Efate": "25c51b2838decef2f9d90c15e4ef7d3c",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Enderbury": "6356a41b8b79885979b2b6613abecb73",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Fakaofo": "de7a32503bd8fdc5baec11e6b9aad69b",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Fiji": "7133b1eaf825848a26c6fe35f2601908",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Funafuti": "eb33daa3195c75c1a5b54b14fe461b73",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Galapagos": "684faae885b8ab403c2a54b9f1eecea9",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Gambier": "921dd1aee0026d9b376f293ce4f246bc",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Guadalcanal": "1de7b39a3bcdce97e8c93d336157dd8b",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Guam": "af8e7d6ffe7865cc595b49479e53d408",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Honolulu": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Johnston": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Kiritimati": "f5876d683bfa2f0339c3c048224e430f",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Kosrae": "ef22d34dcb3734017a59ecc62ab84713",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Kwajalein": "6d9261ff9442c0cf69446e362202d691",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Majuro": "86a054fd15bfbd9fe15156ba7f4155fd",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Marquesas": "e05efeb2e72d3a51e6019499841b509c",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Midway": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Nauru": "4f7dd62a8207d60009300c99c1773846",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Niue": "2d69ed1a3e4496ecd16c94846675a0f3",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Norfolk": "0ba7dc541ce5ad91b2d0aa81589ee205",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Noumea": "48f634aa56c4cfee3f6afd37b28b66b2",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Pago_Pago": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Palau": "3ffa839dec8323e475526d5cd38fa82a",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Pitcairn": "42e5aa28598d96efb16eb6734f31fda6",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Pohnpei": "45f293ec35daa27a60c7e0c90b58012d",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Ponape": "45f293ec35daa27a60c7e0c90b58012d",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Port_Moresby": "c43a5f332114d2a9cd1d6c9f259c71f3",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Rarotonga": "770947b4fd41633dc1d9cecc1ee972d2",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Saipan": "af8e7d6ffe7865cc595b49479e53d408",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Samoa": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Tahiti": "cdbc49403d1d7684e83fdfc258106885",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Tarawa": "b2564fba66250ab89502eec6d72c0c5e",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Tongatapu": "db7a5ceed05b395c4660be082a4377da",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Truk": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Wake": "5763840e0d743d0555d9f0813404da80",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Wallis": "36b100715cbee093d7c6056eaf60aeeb",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Yap": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\posix\\Poland": "2ed881ef7e09c844c009673ded84c798",
  "dxmodules\\zoneinfo\\posix\\Portugal": "b9ba38decf09fe0728f81ebeabf29cfe",
  "dxmodules\\zoneinfo\\posix\\PRC": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\PST8PDT": "c9452f6b9e08d83c6815c38600798964",
  "dxmodules\\zoneinfo\\posix\\ROC": "2e67467e3c050e8b3a4022eb9e20300e",
  "dxmodules\\zoneinfo\\posix\\ROK": "f7a6e371bd709b3c2f64ce6f67f39f29",
  "dxmodules\\zoneinfo\\posix\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3",
  "dxmodules\\zoneinfo\\posix\\Turkey": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\posix\\UCT": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Universal": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\US\\Alaska": "596428a3a840d568656088bd48e608f1",
  "dxmodules\\zoneinfo\\posix\\US\\Aleutian": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\posix\\US\\Arizona": "c697bb02e057325a74547912f631a3a7",
  "dxmodules\\zoneinfo\\posix\\US\\Central": "d0f076c9f390e7d8a933cc7cc1ad2e90",
  "dxmodules\\zoneinfo\\posix\\US\\East-Indiana": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\posix\\US\\Eastern": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\posix\\US\\Hawaii": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\posix\\US\\Indiana-Starke": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\posix\\US\\Michigan": "ae3ba6ed8738ceda9eef109c6c586736",
  "dxmodules\\zoneinfo\\posix\\US\\Mountain": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\posix\\US\\Pacific": "9323ff44ce205ce1a1bad7e2dca39939",
  "dxmodules\\zoneinfo\\posix\\US\\Samoa": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\posix\\UTC": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\W-SU": "223bbf37352a9d4807919132f360535e",
  "dxmodules\\zoneinfo\\posix\\WET": "92388453e62ec1a69fbf12685ad247c7",
  "dxmodules\\zoneinfo\\posix\\Zulu": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posixrules": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\PRC": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\PST8PDT": "c9452f6b9e08d83c6815c38600798964",
  "dxmodules\\zoneinfo\\right\\Africa\\Abidjan": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Accra": "255520b3cb5f796d992bd52bdc839d56",
  "dxmodules\\zoneinfo\\right\\Africa\\Addis_Ababa": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Algiers": "dc7f41bae1e1b345035837c6906d2f1c",
  "dxmodules\\zoneinfo\\right\\Africa\\Asmara": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Asmera": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Bamako": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Bangui": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Banjul": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Bissau": "f9a1ce1e51007b314f4dbb27844724c7",
  "dxmodules\\zoneinfo\\right\\Africa\\Blantyre": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Brazzaville": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Bujumbura": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Cairo": "c0216212a93d68f21decbbc1f0675104",
  "dxmodules\\zoneinfo\\right\\Africa\\Casablanca": "ce60e1f9ec1b5a9b18c628d3dc8a0cc4",
  "dxmodules\\zoneinfo\\right\\Africa\\Ceuta": "92a85bb65bee16f54ff4f05b7a335dd2",
  "dxmodules\\zoneinfo\\right\\Africa\\Conakry": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Dakar": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Dar_es_Salaam": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Djibouti": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Douala": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\El_Aaiun": "f10771f58dd1f28f45157eda123196e1",
  "dxmodules\\zoneinfo\\right\\Africa\\Freetown": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Gaborone": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Harare": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Johannesburg": "5280e94d5521939f68b5550d5f6c24d6",
  "dxmodules\\zoneinfo\\right\\Africa\\Juba": "894503e89177c5ac997b405e476f0b90",
  "dxmodules\\zoneinfo\\right\\Africa\\Kampala": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Khartoum": "30901eba0d53204dc8eaa9c9299893f8",
  "dxmodules\\zoneinfo\\right\\Africa\\Kigali": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Kinshasa": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Lagos": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Libreville": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Lome": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Luanda": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Lubumbashi": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Lusaka": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Malabo": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Maputo": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Maseru": "5280e94d5521939f68b5550d5f6c24d6",
  "dxmodules\\zoneinfo\\right\\Africa\\Mbabane": "5280e94d5521939f68b5550d5f6c24d6",
  "dxmodules\\zoneinfo\\right\\Africa\\Mogadishu": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Monrovia": "86cab61bd646f40aa46cd5c1ee80a2fc",
  "dxmodules\\zoneinfo\\right\\Africa\\Nairobi": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Ndjamena": "eab0671bca010ceb9da03005e6fc6880",
  "dxmodules\\zoneinfo\\right\\Africa\\Niamey": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Nouakchott": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Ouagadougou": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Porto-Novo": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Sao_Tome": "1793151a4454db88070f6caf62c2d45f",
  "dxmodules\\zoneinfo\\right\\Africa\\Timbuktu": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Tripoli": "140c8538c93832c7c7ae0e40d592dd33",
  "dxmodules\\zoneinfo\\right\\Africa\\Tunis": "38ccd67fb776c5af2edf8e925c10f956",
  "dxmodules\\zoneinfo\\right\\Africa\\Windhoek": "760491921188579dd193bb89f2650a38",
  "dxmodules\\zoneinfo\\right\\America\\Adak": "282e70d388dfd3923238b8ca86244246",
  "dxmodules\\zoneinfo\\right\\America\\Anchorage": "be6e5ef83221831fd57a032e03246920",
  "dxmodules\\zoneinfo\\right\\America\\Anguilla": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Antigua": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Araguaina": "4c90a3a30f8a255daccba781fa8b119e",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Buenos_Aires": "7f85ebd305bc1f7a173caf79f56e77aa",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Catamarca": "e4215654b35cc84b7de145a99ba2a8d4",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\ComodRivadavia": "e4215654b35cc84b7de145a99ba2a8d4",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Cordoba": "790e6c0ccdc0a17b0087bb7301434648",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Jujuy": "068eec3da9e503286b7c90c971573616",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\La_Rioja": "71958e1b5b3be0f35981845e14efef81",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Mendoza": "b95d8152904b0fdf042c6f5167ff90ab",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Rio_Gallegos": "629f976661deb50db7be073b3855b1f7",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Salta": "af0b9512b0dcc379b6f8ba6ddd7d369d",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\San_Juan": "f2fb8b1669d16992662ec824a2e14cb2",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\San_Luis": "08bbc43d6dabe797db33e439d7bce790",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Tucuman": "36d861157f9c70e9dda84b82a34a3ea0",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Ushuaia": "c75191b4db13d1b265b118754debe666",
  "dxmodules\\zoneinfo\\right\\America\\Aruba": "a3dd71a0d51b6cd76218b8d299ba7a93",
  "dxmodules\\zoneinfo\\right\\America\\Asuncion": "33de989fafc47189f03da27c62698373",
  "dxmodules\\zoneinfo\\right\\America\\Atikokan": "b73584d3158e258d8c2b8a43795e2fc9",
  "dxmodules\\zoneinfo\\right\\America\\Atka": "282e70d388dfd3923238b8ca86244246",
  "dxmodules\\zoneinfo\\right\\America\\Bahia": "e4e5ec529a25a5e1c5d0de9080e0b80c",
  "dxmodules\\zoneinfo\\right\\America\\Bahia_Banderas": "c4d9dbbd094173ced5c98e67415078d2",
  "dxmodules\\zoneinfo\\right\\America\\Barbados": "167070d16fcfd7709c995c5f08804df9",
  "dxmodules\\zoneinfo\\right\\America\\Belem": "3ffce1c62895f47fac4097dea33c0100",
  "dxmodules\\zoneinfo\\right\\America\\Belize": "a6f600d246de9f362ce80412e50e703c",
  "dxmodules\\zoneinfo\\right\\America\\Blanc-Sablon": "2637c152f56e58d0978deab40e3fb7af",
  "dxmodules\\zoneinfo\\right\\America\\Boa_Vista": "a2142636ddbbf1a9ef329cd6187f3a7f",
  "dxmodules\\zoneinfo\\right\\America\\Bogota": "da0ff1f7f9dd392ffa9939ab4548bce9",
  "dxmodules\\zoneinfo\\right\\America\\Boise": "ece4d700b42901dd8e70c2ae78feafe8",
  "dxmodules\\zoneinfo\\right\\America\\Buenos_Aires": "7f85ebd305bc1f7a173caf79f56e77aa",
  "dxmodules\\zoneinfo\\right\\America\\Cambridge_Bay": "5ba6299259dca6c49bd37d55b0a23547",
  "dxmodules\\zoneinfo\\right\\America\\Campo_Grande": "ee14c0299e6e91649c3629942385173f",
  "dxmodules\\zoneinfo\\right\\America\\Cancun": "63af9c5ca1e21df45291d378868bfcf3",
  "dxmodules\\zoneinfo\\right\\America\\Caracas": "9f18da7625c6014ac20d61dadce08109",
  "dxmodules\\zoneinfo\\right\\America\\Catamarca": "e4215654b35cc84b7de145a99ba2a8d4",
  "dxmodules\\zoneinfo\\right\\America\\Cayenne": "9f8f2cb60fe8096e11d2ade69bf11a35",
  "dxmodules\\zoneinfo\\right\\America\\Cayman": "dbb2a11343300a2c631a6c4b7a3cafac",
  "dxmodules\\zoneinfo\\right\\America\\Chicago": "9e0de2483877c5197b136801aa179825",
  "dxmodules\\zoneinfo\\right\\America\\Chihuahua": "33a79cc0ff099fde13feeb3853c3a751",
  "dxmodules\\zoneinfo\\right\\America\\Coral_Harbour": "b73584d3158e258d8c2b8a43795e2fc9",
  "dxmodules\\zoneinfo\\right\\America\\Cordoba": "790e6c0ccdc0a17b0087bb7301434648",
  "dxmodules\\zoneinfo\\right\\America\\Costa_Rica": "36385e27a28e5a44cc3e0379cc203d33",
  "dxmodules\\zoneinfo\\right\\America\\Creston": "28eecb163abd15d8373177be150d09c8",
  "dxmodules\\zoneinfo\\right\\America\\Cuiaba": "9cbde1280ec1e7841e72f6480f3a9e25",
  "dxmodules\\zoneinfo\\right\\America\\Curacao": "a3dd71a0d51b6cd76218b8d299ba7a93",
  "dxmodules\\zoneinfo\\right\\America\\Danmarkshavn": "1790826b85dedc3851db28dd0e220497",
  "dxmodules\\zoneinfo\\right\\America\\Dawson": "c1f9e0a66ac60a0adb572b8dbb15c6fd",
  "dxmodules\\zoneinfo\\right\\America\\Dawson_Creek": "91bdb9ec7c7faaa5f5fcea3d32ef5816",
  "dxmodules\\zoneinfo\\right\\America\\Denver": "a04f44b808f1e82a194885aa0528e6ce",
  "dxmodules\\zoneinfo\\right\\America\\Detroit": "c7e43a31c24443dcc5a10b94194d77b9",
  "dxmodules\\zoneinfo\\right\\America\\Dominica": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Edmonton": "8a4c9e63fdbeaf36632157a97751f2a6",
  "dxmodules\\zoneinfo\\right\\America\\Eirunepe": "302b93102906666bd37f06475e830e5f",
  "dxmodules\\zoneinfo\\right\\America\\El_Salvador": "0e5b3b1aee31e8b3764c85507d67ca05",
  "dxmodules\\zoneinfo\\right\\America\\Ensenada": "4a5aba6b91f6832078382d3f52fd391d",
  "dxmodules\\zoneinfo\\right\\America\\Fortaleza": "7b3782d2bdd4ffe39f16e901227dbf52",
  "dxmodules\\zoneinfo\\right\\America\\Fort_Nelson": "97edfbbc575258ef1141d09612c03f29",
  "dxmodules\\zoneinfo\\right\\America\\Fort_Wayne": "aee84cbeb49b67cf69ab388c16ee8bdb",
  "dxmodules\\zoneinfo\\right\\America\\Glace_Bay": "619356a2105ad4806faf3e0e6bb55de4",
  "dxmodules\\zoneinfo\\right\\America\\Godthab": "610a757eed1026677433258d80198461",
  "dxmodules\\zoneinfo\\right\\America\\Goose_Bay": "321d549f59669036366d42f88a64fbcb",
  "dxmodules\\zoneinfo\\right\\America\\Grand_Turk": "97a0ab9ba0d288e45eef032be8e2e3f2",
  "dxmodules\\zoneinfo\\right\\America\\Grenada": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Guadeloupe": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Guatemala": "fcf1a91ff1bd3861f6bafee15b34bb29",
  "dxmodules\\zoneinfo\\right\\America\\Guayaquil": "821825cf4a6e5d691de018004a5b6cc2",
  "dxmodules\\zoneinfo\\right\\America\\Guyana": "8c4403bcd4ab8dd738cac26d695e06d9",
  "dxmodules\\zoneinfo\\right\\America\\Halifax": "cf585454a2b0677c20dac5e7da2f1220",
  "dxmodules\\zoneinfo\\right\\America\\Havana": "c84c293edbe480ea115abcdf96f1c499",
  "dxmodules\\zoneinfo\\right\\America\\Hermosillo": "0d7e7c94e0f93d6a3d0f7828923f71a7",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Indianapolis": "aee84cbeb49b67cf69ab388c16ee8bdb",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Knox": "a4c0cd6601d2974d0d4d331285637042",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Marengo": "5d9df0d965feb22a56a929b7613c9f03",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Petersburg": "743c8227b7bd283ce0433e18d5a2f353",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Tell_City": "4ba7cc16e819553cef1801ac62588f26",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Vevay": "394e9f77e455be15e967a99801c73d63",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Vincennes": "db6628fda4b1727179f7612321616526",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Winamac": "d9776c230a2fbe0821766ab8f9eeb92d",
  "dxmodules\\zoneinfo\\right\\America\\Indianapolis": "aee84cbeb49b67cf69ab388c16ee8bdb",
  "dxmodules\\zoneinfo\\right\\America\\Inuvik": "4610d997061651f8c1d87590ce6c6d48",
  "dxmodules\\zoneinfo\\right\\America\\Iqaluit": "54608782aaa5eea3bc3f826c194f86da",
  "dxmodules\\zoneinfo\\right\\America\\Jamaica": "bdf8b2720941180acbbd1404c63f5451",
  "dxmodules\\zoneinfo\\right\\America\\Jujuy": "068eec3da9e503286b7c90c971573616",
  "dxmodules\\zoneinfo\\right\\America\\Juneau": "cf88eba298e22fda671fa79332f5b433",
  "dxmodules\\zoneinfo\\right\\America\\Kentucky\\Louisville": "97e994707ab30ad515214f8be3f51b54",
  "dxmodules\\zoneinfo\\right\\America\\Kentucky\\Monticello": "8853e2c10605fab7539dc797b7909ab9",
  "dxmodules\\zoneinfo\\right\\America\\Knox_IN": "a4c0cd6601d2974d0d4d331285637042",
  "dxmodules\\zoneinfo\\right\\America\\Kralendijk": "a3dd71a0d51b6cd76218b8d299ba7a93",
  "dxmodules\\zoneinfo\\right\\America\\La_Paz": "a51b556e863e357dc307e9dd60c8c1bd",
  "dxmodules\\zoneinfo\\right\\America\\Lima": "6d54c069c8dd341c783de76e7559ec9d",
  "dxmodules\\zoneinfo\\right\\America\\Los_Angeles": "24885c31a23d629863272538b997f87f",
  "dxmodules\\zoneinfo\\right\\America\\Louisville": "97e994707ab30ad515214f8be3f51b54",
  "dxmodules\\zoneinfo\\right\\America\\Lower_Princes": "a3dd71a0d51b6cd76218b8d299ba7a93",
  "dxmodules\\zoneinfo\\right\\America\\Maceio": "6e90d06bd13956adada999198e8b03b1",
  "dxmodules\\zoneinfo\\right\\America\\Managua": "78f94cdc6037f2664b8bcdc2f76beceb",
  "dxmodules\\zoneinfo\\right\\America\\Manaus": "362317d9e24808cca7dfd43119fba293",
  "dxmodules\\zoneinfo\\right\\America\\Marigot": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Martinique": "08b0afa4a3679ec32bd97dd42a2d5e65",
  "dxmodules\\zoneinfo\\right\\America\\Matamoros": "00b0a1fee9df01734ec34c14112254d3",
  "dxmodules\\zoneinfo\\right\\America\\Mazatlan": "c366dd821b732f958ecc81707eecc297",
  "dxmodules\\zoneinfo\\right\\America\\Mendoza": "b95d8152904b0fdf042c6f5167ff90ab",
  "dxmodules\\zoneinfo\\right\\America\\Menominee": "312103138547f25d87854e7335909792",
  "dxmodules\\zoneinfo\\right\\America\\Merida": "a55e8a1f3630c03f89edadaf4680ec25",
  "dxmodules\\zoneinfo\\right\\America\\Metlakatla": "d342ef14d6184402e7b8ef06e05e7a0e",
  "dxmodules\\zoneinfo\\right\\America\\Mexico_City": "9a5c52d9e60891e2b51c17610e75d11f",
  "dxmodules\\zoneinfo\\right\\America\\Miquelon": "2db4fc96974a34db4e86c2c8501400da",
  "dxmodules\\zoneinfo\\right\\America\\Moncton": "fe0d305f26fb8f81d5cb95fa80d4e4bc",
  "dxmodules\\zoneinfo\\right\\America\\Monterrey": "d1560b82e96ac594927f7652ca277d16",
  "dxmodules\\zoneinfo\\right\\America\\Montevideo": "a7be914a9c0d90f855fd6f5555788996",
  "dxmodules\\zoneinfo\\right\\America\\Montreal": "541dd79e6726de72a7b31476c8d9a8ff",
  "dxmodules\\zoneinfo\\right\\America\\Montserrat": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Nassau": "73ec388017abd0e22f37d88a0b8e8a97",
  "dxmodules\\zoneinfo\\right\\America\\New_York": "7b602715824f47ba6028f0075b3ea7dc",
  "dxmodules\\zoneinfo\\right\\America\\Nipigon": "152d6acbfae9d604319acc2947000c9e",
  "dxmodules\\zoneinfo\\right\\America\\Nome": "ff654dddf7473e79e85d1109a433036d",
  "dxmodules\\zoneinfo\\right\\America\\Noronha": "72b7085c49fead430e7a2dd06590b224",
  "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\Beulah": "7dae7b69dfbde952510327d4049133f9",
  "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\Center": "3df021012c8eb85b4a732df260ca46fc",
  "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\New_Salem": "d85974b0e5491f9676676010d6b8a5eb",
  "dxmodules\\zoneinfo\\right\\America\\Nuuk": "610a757eed1026677433258d80198461",
  "dxmodules\\zoneinfo\\right\\America\\Ojinaga": "9c60152b7b11563719f61bb0f52e9e9e",
  "dxmodules\\zoneinfo\\right\\America\\Panama": "dbb2a11343300a2c631a6c4b7a3cafac",
  "dxmodules\\zoneinfo\\right\\America\\Pangnirtung": "8409ed8281ca17daf9c87560426b7c02",
  "dxmodules\\zoneinfo\\right\\America\\Paramaribo": "c3b09c0d420c43da423799e52b93f6e4",
  "dxmodules\\zoneinfo\\right\\America\\Phoenix": "5adc29642d304ff453993c2b4395505d",
  "dxmodules\\zoneinfo\\right\\America\\Port-au-Prince": "8df9214442b5652478760d8ea7af38b7",
  "dxmodules\\zoneinfo\\right\\America\\Porto_Acre": "30bb03697d8aba618afd831bfc83a9a3",
  "dxmodules\\zoneinfo\\right\\America\\Porto_Velho": "34a694f0e37d4fc37e9ac49e37a5de1c",
  "dxmodules\\zoneinfo\\right\\America\\Port_of_Spain": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Puerto_Rico": "f03c81ed80547f70a80a01c94dc85ab9",
  "dxmodules\\zoneinfo\\right\\America\\Punta_Arenas": "f70175b387bb3327bbec390a86d21455",
  "dxmodules\\zoneinfo\\right\\America\\Rainy_River": "23dbcf1cd24e67cc24648c25eb298ba0",
  "dxmodules\\zoneinfo\\right\\America\\Rankin_Inlet": "d6a6ce35fb5ca3d134fe3d7ce1b7468b",
  "dxmodules\\zoneinfo\\right\\America\\Recife": "07264d0df9168584cd65dca59efdcd0b",
  "dxmodules\\zoneinfo\\right\\America\\Regina": "49b33e71c4d5d99090e25929482b9820",
  "dxmodules\\zoneinfo\\right\\America\\Resolute": "37e1fe49d7b779172f4193f908fa02b5",
  "dxmodules\\zoneinfo\\right\\America\\Rio_Branco": "30bb03697d8aba618afd831bfc83a9a3",
  "dxmodules\\zoneinfo\\right\\America\\Rosario": "790e6c0ccdc0a17b0087bb7301434648",
  "dxmodules\\zoneinfo\\right\\America\\Santarem": "9baa062bb495b0f959fdfd859e262d40",
  "dxmodules\\zoneinfo\\right\\America\\Santa_Isabel": "4a5aba6b91f6832078382d3f52fd391d",
  "dxmodules\\zoneinfo\\right\\America\\Santiago": "b77df3a65e22297b42228afa2929584f",
  "dxmodules\\zoneinfo\\right\\America\\Santo_Domingo": "059582246c0bb5af0c12326bfcf86019",
  "dxmodules\\zoneinfo\\right\\America\\Sao_Paulo": "81339e51f13782b28042f92786116ee3",
  "dxmodules\\zoneinfo\\right\\America\\Scoresbysund": "e26dc30e3bfb3562a24a9267cff7c283",
  "dxmodules\\zoneinfo\\right\\America\\Shiprock": "a04f44b808f1e82a194885aa0528e6ce",
  "dxmodules\\zoneinfo\\right\\America\\Sitka": "c1a683fe328612597c6da3179763ee4c",
  "dxmodules\\zoneinfo\\right\\America\\St_Barthelemy": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\St_Johns": "5f670ecdff8ed7f414f51b4ff0c3300c",
  "dxmodules\\zoneinfo\\right\\America\\St_Kitts": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\St_Lucia": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\St_Thomas": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\St_Vincent": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Swift_Current": "ec2feb211b495fb642849e26cfa1fac4",
  "dxmodules\\zoneinfo\\right\\America\\Tegucigalpa": "dfd6bb815ab1c7c942efd30bd72220d4",
  "dxmodules\\zoneinfo\\right\\America\\Thule": "4b1a8f5b8395dbee7ff1977cb5500e48",
  "dxmodules\\zoneinfo\\right\\America\\Thunder_Bay": "5f3b82b19c7ca9e8144b64d1e595c475",
  "dxmodules\\zoneinfo\\right\\America\\Tijuana": "4a5aba6b91f6832078382d3f52fd391d",
  "dxmodules\\zoneinfo\\right\\America\\Toronto": "541dd79e6726de72a7b31476c8d9a8ff",
  "dxmodules\\zoneinfo\\right\\America\\Tortola": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Vancouver": "813c4030632e8d4b89dfeea68deca975",
  "dxmodules\\zoneinfo\\right\\America\\Virgin": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Whitehorse": "8751f4da107a273bcc9060790bd9460b",
  "dxmodules\\zoneinfo\\right\\America\\Winnipeg": "387856cd57cd5f8898ad0e66acbbf27e",
  "dxmodules\\zoneinfo\\right\\America\\Yakutat": "729d277e238d7320e9c505e0e2f6cb7e",
  "dxmodules\\zoneinfo\\right\\America\\Yellowknife": "1ad33e12252975f4a164863f7b347834",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Casey": "3b466e0683793f6433a74e7c79b00782",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Davis": "eaf9670244da968a46f0042f98250702",
  "dxmodules\\zoneinfo\\right\\Antarctica\\DumontDUrville": "6e986536bd542e2209819737c97e847d",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Macquarie": "bc2f8c209b76c37bc97baafe71d49c4c",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Mawson": "7829c411c82e902894831e718e8790f1",
  "dxmodules\\zoneinfo\\right\\Antarctica\\McMurdo": "82b0518985a7fc92949ed0f6f26ff413",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Palmer": "8c3e3369c7685369c36fdd5eb3eaed96",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Rothera": "b0ee319a72f04eaa17795ba5e57a908b",
  "dxmodules\\zoneinfo\\right\\Antarctica\\South_Pole": "82b0518985a7fc92949ed0f6f26ff413",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Syowa": "1da7fe0d4a3413fc84ab4b2769090608",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Troll": "a335c40b4c451315ca42c3e54c1905d8",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Vostok": "0cafcb51dca9ed5d72d03f4aed483489",
  "dxmodules\\zoneinfo\\right\\Arctic\\Longyearbyen": "e4dc442993a2b2784b8b7dbd7160eec4",
  "dxmodules\\zoneinfo\\right\\Asia\\Aden": "9c257d575e96015f3fbed54d87f8bc50",
  "dxmodules\\zoneinfo\\right\\Asia\\Almaty": "1810c448a8354615683abca84d527bfe",
  "dxmodules\\zoneinfo\\right\\Asia\\Amman": "ee2c93bf5727fd8420f2b749d7428efb",
  "dxmodules\\zoneinfo\\right\\Asia\\Anadyr": "a9cc54432e82d7032c7def8468a089d0",
  "dxmodules\\zoneinfo\\right\\Asia\\Aqtau": "e2007ee6f3e74a8019391ac1f0aec4dc",
  "dxmodules\\zoneinfo\\right\\Asia\\Aqtobe": "663580fb15202c6df3d9b9bf5ebf522f",
  "dxmodules\\zoneinfo\\right\\Asia\\Ashgabat": "4eacdff5fe2196cd19a342d8b39b0ca8",
  "dxmodules\\zoneinfo\\right\\Asia\\Ashkhabad": "4eacdff5fe2196cd19a342d8b39b0ca8",
  "dxmodules\\zoneinfo\\right\\Asia\\Atyrau": "c7ff154fd4ea56ecf3bfc0b934c5cd22",
  "dxmodules\\zoneinfo\\right\\Asia\\Baghdad": "bb9b7e0ac51f666dfa71ab3a1a6fca45",
  "dxmodules\\zoneinfo\\right\\Asia\\Bahrain": "435d4f3daf5c15caa49fbe664a2c1684",
  "dxmodules\\zoneinfo\\right\\Asia\\Baku": "1652d1e2640b9106a8fb3523ab7112ae",
  "dxmodules\\zoneinfo\\right\\Asia\\Bangkok": "eaa810414de8de8a06c0eb1c700afd0a",
  "dxmodules\\zoneinfo\\right\\Asia\\Barnaul": "4d4df10cbd37b44eb42b9d19eb4f7c33",
  "dxmodules\\zoneinfo\\right\\Asia\\Beirut": "784e4b8ee1013ead6843993b38bf7dcf",
  "dxmodules\\zoneinfo\\right\\Asia\\Bishkek": "576e721428ae8b35565251b8580322fc",
  "dxmodules\\zoneinfo\\right\\Asia\\Brunei": "c88f7e5336c048f58831ca0e922cb883",
  "dxmodules\\zoneinfo\\right\\Asia\\Calcutta": "2e0eb1e900fb8859c72a5d9412f95dba",
  "dxmodules\\zoneinfo\\right\\Asia\\Chita": "67f7e1fbed85796b3f266f642742c1aa",
  "dxmodules\\zoneinfo\\right\\Asia\\Choibalsan": "f95f3247720172902bd68d5b559efbf7",
  "dxmodules\\zoneinfo\\right\\Asia\\Chongqing": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\Asia\\Chungking": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\Asia\\Colombo": "0e141adc9705e2bb75c8cc2635adbd95",
  "dxmodules\\zoneinfo\\right\\Asia\\Dacca": "e35ecddcb5d5139a9200291f723231a8",
  "dxmodules\\zoneinfo\\right\\Asia\\Damascus": "1f2c159804ad4460e814c7e4e06a1c81",
  "dxmodules\\zoneinfo\\right\\Asia\\Dhaka": "e35ecddcb5d5139a9200291f723231a8",
  "dxmodules\\zoneinfo\\right\\Asia\\Dili": "2ff451580ef93c763ea5d159420f5d11",
  "dxmodules\\zoneinfo\\right\\Asia\\Dubai": "72e2ef10fde1f8fcabbc5a21d5d9a856",
  "dxmodules\\zoneinfo\\right\\Asia\\Dushanbe": "6c0f6914cb140fbd7601bb4ce5da1d50",
  "dxmodules\\zoneinfo\\right\\Asia\\Famagusta": "cf108cc298788103758b0132fba32a57",
  "dxmodules\\zoneinfo\\right\\Asia\\Gaza": "9d26fe2afd426828d5da3c22b5bfdd83",
  "dxmodules\\zoneinfo\\right\\Asia\\Harbin": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\Asia\\Hebron": "06834d169792c0c58cd69baaee42e92c",
  "dxmodules\\zoneinfo\\right\\Asia\\Hong_Kong": "ac812a20a17a6221694038b62ac77ff0",
  "dxmodules\\zoneinfo\\right\\Asia\\Hovd": "b0fcc3ae79e32a173e4db193a76ccc0e",
  "dxmodules\\zoneinfo\\right\\Asia\\Ho_Chi_Minh": "7420517dd4ad95118f1e7d88e2430163",
  "dxmodules\\zoneinfo\\right\\Asia\\Irkutsk": "db926d9012302148e205b89a6e449967",
  "dxmodules\\zoneinfo\\right\\Asia\\Istanbul": "3f72cd0fb7e26b0dc8d7833327f035db",
  "dxmodules\\zoneinfo\\right\\Asia\\Jakarta": "3c216e1d6bed7b8b4d3f5295a10f02ac",
  "dxmodules\\zoneinfo\\right\\Asia\\Jayapura": "7e3faf3974a4a2f1a6172bc80c4e91df",
  "dxmodules\\zoneinfo\\right\\Asia\\Jerusalem": "6fa25ac8d4a8f5e7c03de4434c5cc6b8",
  "dxmodules\\zoneinfo\\right\\Asia\\Kabul": "0cacb17b331b880fea6a3c03a056c024",
  "dxmodules\\zoneinfo\\right\\Asia\\Kamchatka": "307d5eec76955cf8ae4c87b1ae514387",
  "dxmodules\\zoneinfo\\right\\Asia\\Karachi": "4038cb8adc007467f1297aa72557863f",
  "dxmodules\\zoneinfo\\right\\Asia\\Kashgar": "5ce95bd9a706925bc86863eb692c862c",
  "dxmodules\\zoneinfo\\right\\Asia\\Kathmandu": "c4549d6c756ada9f9dbfce26ea69a210",
  "dxmodules\\zoneinfo\\right\\Asia\\Katmandu": "c4549d6c756ada9f9dbfce26ea69a210",
  "dxmodules\\zoneinfo\\right\\Asia\\Khandyga": "78c9936524b6cae7bf4335cd38e4d09b",
  "dxmodules\\zoneinfo\\right\\Asia\\Kolkata": "2e0eb1e900fb8859c72a5d9412f95dba",
  "dxmodules\\zoneinfo\\right\\Asia\\Krasnoyarsk": "dd9dc5be8bfe0fcf767c0d1006b694c3",
  "dxmodules\\zoneinfo\\right\\Asia\\Kuala_Lumpur": "fce33beb3d31d52349a77dc45114937a",
  "dxmodules\\zoneinfo\\right\\Asia\\Kuching": "f3da8074fccd8144590e2533384313cf",
  "dxmodules\\zoneinfo\\right\\Asia\\Kuwait": "9c257d575e96015f3fbed54d87f8bc50",
  "dxmodules\\zoneinfo\\right\\Asia\\Macao": "dd42c3ea58c64c46070051f16626a0b0",
  "dxmodules\\zoneinfo\\right\\Asia\\Macau": "dd42c3ea58c64c46070051f16626a0b0",
  "dxmodules\\zoneinfo\\right\\Asia\\Magadan": "74537315aad0bc57f1dbbc77f838c193",
  "dxmodules\\zoneinfo\\right\\Asia\\Makassar": "20db83c594a3c11f74ab275542d59aa4",
  "dxmodules\\zoneinfo\\right\\Asia\\Manila": "f8c658820eb89da38eda688ddfc48606",
  "dxmodules\\zoneinfo\\right\\Asia\\Muscat": "72e2ef10fde1f8fcabbc5a21d5d9a856",
  "dxmodules\\zoneinfo\\right\\Asia\\Nicosia": "2f833febb7eee0222af785894a47d5a8",
  "dxmodules\\zoneinfo\\right\\Asia\\Novokuznetsk": "0aba150238505be93a22b0b4ddf47312",
  "dxmodules\\zoneinfo\\right\\Asia\\Novosibirsk": "7040261c320043d7f3122b2604635284",
  "dxmodules\\zoneinfo\\right\\Asia\\Omsk": "040c540fb238f31ea69249b753ef0ef7",
  "dxmodules\\zoneinfo\\right\\Asia\\Oral": "0fda7755065f5eaa92c21eb716aa56b5",
  "dxmodules\\zoneinfo\\right\\Asia\\Phnom_Penh": "eaa810414de8de8a06c0eb1c700afd0a",
  "dxmodules\\zoneinfo\\right\\Asia\\Pontianak": "55fb83fe4f7872c919ce934a0b70a651",
  "dxmodules\\zoneinfo\\right\\Asia\\Pyongyang": "cb4953e8661526fba1d6ed8f738e895f",
  "dxmodules\\zoneinfo\\right\\Asia\\Qatar": "435d4f3daf5c15caa49fbe664a2c1684",
  "dxmodules\\zoneinfo\\right\\Asia\\Qostanay": "34cfcbb0d35f54e00b2784c11fabf5a2",
  "dxmodules\\zoneinfo\\right\\Asia\\Qyzylorda": "d0b30771ffbee9e46794adbfe8acc33c",
  "dxmodules\\zoneinfo\\right\\Asia\\Rangoon": "4ab2c8e9530b82eff44f4a64776faa99",
  "dxmodules\\zoneinfo\\right\\Asia\\Riyadh": "9c257d575e96015f3fbed54d87f8bc50",
  "dxmodules\\zoneinfo\\right\\Asia\\Saigon": "7420517dd4ad95118f1e7d88e2430163",
  "dxmodules\\zoneinfo\\right\\Asia\\Sakhalin": "5da56bcd444fcef1275c92aabd8cb8e6",
  "dxmodules\\zoneinfo\\right\\Asia\\Samarkand": "e72a66455d6dc27dce4e3f3a1a5e7177",
  "dxmodules\\zoneinfo\\right\\Asia\\Seoul": "e73238fa6c85ea037bf4dcc235113fe9",
  "dxmodules\\zoneinfo\\right\\Asia\\Shanghai": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\Asia\\Singapore": "72be432785863c8a11d83d6f3849f6a1",
  "dxmodules\\zoneinfo\\right\\Asia\\Srednekolymsk": "2b062b872cebf7f3a35de885144a46a8",
  "dxmodules\\zoneinfo\\right\\Asia\\Taipei": "8f3da0ea2509c2fe35c6bb244f84d2e2",
  "dxmodules\\zoneinfo\\right\\Asia\\Tashkent": "88e80b0efe0b23c657d37e68ff5c3ecf",
  "dxmodules\\zoneinfo\\right\\Asia\\Tbilisi": "351bbf0c6e2e8d38f5eec8c04aa4d6d3",
  "dxmodules\\zoneinfo\\right\\Asia\\Tehran": "c3a0c2539fccc3d3f8081b4218c0eb20",
  "dxmodules\\zoneinfo\\right\\Asia\\Tel_Aviv": "6fa25ac8d4a8f5e7c03de4434c5cc6b8",
  "dxmodules\\zoneinfo\\right\\Asia\\Thimbu": "e18d256eca7ba79605a1fe408157624a",
  "dxmodules\\zoneinfo\\right\\Asia\\Thimphu": "e18d256eca7ba79605a1fe408157624a",
  "dxmodules\\zoneinfo\\right\\Asia\\Tokyo": "e40de6c7fb9ce735aeff885394a727d2",
  "dxmodules\\zoneinfo\\right\\Asia\\Tomsk": "d5844b6b75a8c2bfa61c735627349854",
  "dxmodules\\zoneinfo\\right\\Asia\\Ujung_Pandang": "20db83c594a3c11f74ab275542d59aa4",
  "dxmodules\\zoneinfo\\right\\Asia\\Ulaanbaatar": "ffe40602251f6104563a95d5a6201755",
  "dxmodules\\zoneinfo\\right\\Asia\\Ulan_Bator": "ffe40602251f6104563a95d5a6201755",
  "dxmodules\\zoneinfo\\right\\Asia\\Urumqi": "5ce95bd9a706925bc86863eb692c862c",
  "dxmodules\\zoneinfo\\right\\Asia\\Ust-Nera": "3052b62f431959f55e69a42da2a4367f",
  "dxmodules\\zoneinfo\\right\\Asia\\Vientiane": "eaa810414de8de8a06c0eb1c700afd0a",
  "dxmodules\\zoneinfo\\right\\Asia\\Vladivostok": "3a665f9e10006d046da39a389e2d4de6",
  "dxmodules\\zoneinfo\\right\\Asia\\Yakutsk": "909fefe03904758645a9e688099adb74",
  "dxmodules\\zoneinfo\\right\\Asia\\Yangon": "4ab2c8e9530b82eff44f4a64776faa99",
  "dxmodules\\zoneinfo\\right\\Asia\\Yekaterinburg": "17b849bae102efb9cb3f1761a951528a",
  "dxmodules\\zoneinfo\\right\\Asia\\Yerevan": "8c67b19d3e6eb4b74d85bce71832e379",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Azores": "6782096c0c0016381184311eccf7e79b",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Bermuda": "cd84da3d7c53c2facfad094b6a63a6a1",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Canary": "59557b15427f688dd2f6730c1461aa94",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Cape_Verde": "a51b284fc44efbbacabd8edf369b3937",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Faeroe": "91920c175797f2fee4628b758df58d61",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Faroe": "91920c175797f2fee4628b758df58d61",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Jan_Mayen": "e4dc442993a2b2784b8b7dbd7160eec4",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Madeira": "4259292f99911b4275ed87264edb7666",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Reykjavik": "4cbcb014d0b6e243af59821c0c384948",
  "dxmodules\\zoneinfo\\right\\Atlantic\\South_Georgia": "94b903dd1e41634f0a57917c82c4a86e",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Stanley": "cd95a853a4b676c8afb1b7f003d525b5",
  "dxmodules\\zoneinfo\\right\\Atlantic\\St_Helena": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Australia\\ACT": "cb021aa4d7a0d3d4717a896c093cd59c",
  "dxmodules\\zoneinfo\\right\\Australia\\Adelaide": "3bd3b9a49709c2662be4cb2b14a61387",
  "dxmodules\\zoneinfo\\right\\Australia\\Brisbane": "b63c9e16e5df9ee561be859ebfab9e4f",
  "dxmodules\\zoneinfo\\right\\Australia\\Broken_Hill": "25dcfe77e4c8bc1baa8d54ac88daa98d",
  "dxmodules\\zoneinfo\\right\\Australia\\Canberra": "cb021aa4d7a0d3d4717a896c093cd59c",
  "dxmodules\\zoneinfo\\right\\Australia\\Currie": "1b2240d848becc1dfcbee0dbcfa17bdf",
  "dxmodules\\zoneinfo\\right\\Australia\\Darwin": "abd6799885314c1d86458b5164642ac1",
  "dxmodules\\zoneinfo\\right\\Australia\\Eucla": "1a12dadcc17e599cb35bde71a032dc55",
  "dxmodules\\zoneinfo\\right\\Australia\\Hobart": "1b2240d848becc1dfcbee0dbcfa17bdf",
  "dxmodules\\zoneinfo\\right\\Australia\\LHI": "74cd4736a6c2c6c92bf73d1125384b5d",
  "dxmodules\\zoneinfo\\right\\Australia\\Lindeman": "1ad460f55e6a27574ecb7292ecff49b3",
  "dxmodules\\zoneinfo\\right\\Australia\\Lord_Howe": "74cd4736a6c2c6c92bf73d1125384b5d",
  "dxmodules\\zoneinfo\\right\\Australia\\Melbourne": "110415758f3860609f5fb34978117b2f",
  "dxmodules\\zoneinfo\\right\\Australia\\North": "abd6799885314c1d86458b5164642ac1",
  "dxmodules\\zoneinfo\\right\\Australia\\NSW": "cb021aa4d7a0d3d4717a896c093cd59c",
  "dxmodules\\zoneinfo\\right\\Australia\\Perth": "80cea3a163beeb09331e60663144ca34",
  "dxmodules\\zoneinfo\\right\\Australia\\Queensland": "b63c9e16e5df9ee561be859ebfab9e4f",
  "dxmodules\\zoneinfo\\right\\Australia\\South": "3bd3b9a49709c2662be4cb2b14a61387",
  "dxmodules\\zoneinfo\\right\\Australia\\Sydney": "cb021aa4d7a0d3d4717a896c093cd59c",
  "dxmodules\\zoneinfo\\right\\Australia\\Tasmania": "1b2240d848becc1dfcbee0dbcfa17bdf",
  "dxmodules\\zoneinfo\\right\\Australia\\Victoria": "110415758f3860609f5fb34978117b2f",
  "dxmodules\\zoneinfo\\right\\Australia\\West": "80cea3a163beeb09331e60663144ca34",
  "dxmodules\\zoneinfo\\right\\Australia\\Yancowinna": "25dcfe77e4c8bc1baa8d54ac88daa98d",
  "dxmodules\\zoneinfo\\right\\Brazil\\Acre": "30bb03697d8aba618afd831bfc83a9a3",
  "dxmodules\\zoneinfo\\right\\Brazil\\DeNoronha": "72b7085c49fead430e7a2dd06590b224",
  "dxmodules\\zoneinfo\\right\\Brazil\\East": "81339e51f13782b28042f92786116ee3",
  "dxmodules\\zoneinfo\\right\\Brazil\\West": "362317d9e24808cca7dfd43119fba293",
  "dxmodules\\zoneinfo\\right\\Canada\\Atlantic": "cf585454a2b0677c20dac5e7da2f1220",
  "dxmodules\\zoneinfo\\right\\Canada\\Central": "387856cd57cd5f8898ad0e66acbbf27e",
  "dxmodules\\zoneinfo\\right\\Canada\\Eastern": "541dd79e6726de72a7b31476c8d9a8ff",
  "dxmodules\\zoneinfo\\right\\Canada\\Mountain": "8a4c9e63fdbeaf36632157a97751f2a6",
  "dxmodules\\zoneinfo\\right\\Canada\\Newfoundland": "5f670ecdff8ed7f414f51b4ff0c3300c",
  "dxmodules\\zoneinfo\\right\\Canada\\Pacific": "813c4030632e8d4b89dfeea68deca975",
  "dxmodules\\zoneinfo\\right\\Canada\\Saskatchewan": "49b33e71c4d5d99090e25929482b9820",
  "dxmodules\\zoneinfo\\right\\Canada\\Yukon": "8751f4da107a273bcc9060790bd9460b",
  "dxmodules\\zoneinfo\\right\\CET": "326f99da17d68d4cfee53cf8d0aa7204",
  "dxmodules\\zoneinfo\\right\\Chile\\Continental": "b77df3a65e22297b42228afa2929584f",
  "dxmodules\\zoneinfo\\right\\Chile\\EasterIsland": "4dfc6403a5adf1616fb68203f03bf30e",
  "dxmodules\\zoneinfo\\right\\CST6CDT": "169a8197b636d243e7c004a8e7fba824",
  "dxmodules\\zoneinfo\\right\\Cuba": "c84c293edbe480ea115abcdf96f1c499",
  "dxmodules\\zoneinfo\\right\\EET": "6816fac705bb26c7b7255b2783f0a970",
  "dxmodules\\zoneinfo\\right\\Egypt": "c0216212a93d68f21decbbc1f0675104",
  "dxmodules\\zoneinfo\\right\\Eire": "fa14bdeed6096bf8faebc5fedc011cdc",
  "dxmodules\\zoneinfo\\right\\EST": "1888b614cef3c1a33820f2ea2b3b7b3f",
  "dxmodules\\zoneinfo\\right\\EST5EDT": "dddda24b1babea1d79989f4e38faae26",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+1": "44ac89638b691ebce09448dad59e536e",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+10": "b42c0dab5f49eb25e21920c0b22f54a2",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+11": "5dcac640065e3fb5b799e2c0a6df1d2f",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+12": "4fae182c01b8355025d83b4acbfada68",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+2": "8a6d714494a35f050b117b592b40bcd8",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+3": "733b613bf354c20c0d3b3465435c9cc9",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+4": "088c840877ba64a21a9edc90ef942671",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+5": "04aefa0c42f095280b700db4d1a30d6e",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+6": "8ceb55f06163274ace7c942c0199ff90",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+7": "172c592ca91950907dd7b1924c4f3d06",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+8": "05ba396e91ef7b3445aff2aaf23ede98",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+9": "819b92c43b3741d65b3676cc0f5d33a2",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-1": "c79b1c43563ac924fe564ee658820b57",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-10": "b4a6988ab9c89ada1e5593dff9eeabf4",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-11": "5fa302adca1e4c397c7a860211e864b8",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-12": "c250ec4b2d85f3696b182af7f7dc7fb1",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-13": "d275f6c033dec2c0babfbd3ac01655f6",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-14": "ce6effbe9cc3a96f6d196aff4fb71af9",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-2": "cf76c5d0e5c517917500a34c8771ddab",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-3": "2f737a03e95cd1a3cf6a35eb25d33b0c",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-4": "5a6b49c6fdcb2144d7e0cd7388e7838c",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-5": "ab06ee74ab85a30e8adf0b69de519c82",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-6": "0510dc5e9d0b6b6ec42190d5d3ea6cdb",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-7": "f78c916860aca5b070021182c4779d18",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-8": "00b5994c24a396764b490ae18ab9a599",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-9": "936c9e724d32db15be2477ea4b408b1d",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\Greenwich": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\UCT": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Etc\\Universal": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Etc\\UTC": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Etc\\Zulu": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Europe\\Amsterdam": "9c9b6e69b6805f0c4dbe28b68e8c3376",
  "dxmodules\\zoneinfo\\right\\Europe\\Andorra": "8f9ed78972f8047376bbcca787297bba",
  "dxmodules\\zoneinfo\\right\\Europe\\Astrakhan": "144a16fbf22ba65c2aec4a868c93f1f8",
  "dxmodules\\zoneinfo\\right\\Europe\\Athens": "9cfb86a10147b0d4add4e9c81a524dc1",
  "dxmodules\\zoneinfo\\right\\Europe\\Belfast": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Belgrade": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Berlin": "5d9f8ec5a71ff774a799eb7a6fbde2bb",
  "dxmodules\\zoneinfo\\right\\Europe\\Bratislava": "8cca872478ba5c4443e357a3eb155afd",
  "dxmodules\\zoneinfo\\right\\Europe\\Brussels": "feffc38f8d6d4951f1a5bcfe3512b54a",
  "dxmodules\\zoneinfo\\right\\Europe\\Bucharest": "ea1e49ce1f0883770bdd67baac18be47",
  "dxmodules\\zoneinfo\\right\\Europe\\Budapest": "0ef953b4cdd6aa5fc6c05c806ef855a8",
  "dxmodules\\zoneinfo\\right\\Europe\\Busingen": "1e716194b428d38f654955cc74308f66",
  "dxmodules\\zoneinfo\\right\\Europe\\Chisinau": "1a8a06d7addd111a3c3a6062cb62890d",
  "dxmodules\\zoneinfo\\right\\Europe\\Copenhagen": "85ff23778461ff94dc34930a683397c9",
  "dxmodules\\zoneinfo\\right\\Europe\\Dublin": "fa14bdeed6096bf8faebc5fedc011cdc",
  "dxmodules\\zoneinfo\\right\\Europe\\Gibraltar": "1e5adb0d08c0e55ceef8aee44c7d6d24",
  "dxmodules\\zoneinfo\\right\\Europe\\Guernsey": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Helsinki": "5449e97f865215aad28e8ea273482016",
  "dxmodules\\zoneinfo\\right\\Europe\\Isle_of_Man": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Istanbul": "3f72cd0fb7e26b0dc8d7833327f035db",
  "dxmodules\\zoneinfo\\right\\Europe\\Jersey": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Kaliningrad": "829ea9e23f1ccfc7760bb26ba9b544d4",
  "dxmodules\\zoneinfo\\right\\Europe\\Kiev": "b1849500983d6e866fe6a9559ed6799c",
  "dxmodules\\zoneinfo\\right\\Europe\\Kirov": "ec7954a2d2c6b2f071d4ceefe04ef8c1",
  "dxmodules\\zoneinfo\\right\\Europe\\Lisbon": "4ad34a3a04aee31ee75cbbbe2d1bd17c",
  "dxmodules\\zoneinfo\\right\\Europe\\Ljubljana": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\London": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Luxembourg": "7bbbe6a6b7b9cb4bf346284de85a3309",
  "dxmodules\\zoneinfo\\right\\Europe\\Madrid": "5b1ddafe484b5a19b108489dc08c18b2",
  "dxmodules\\zoneinfo\\right\\Europe\\Malta": "69f5e652e0a30cfabd18421114661a61",
  "dxmodules\\zoneinfo\\right\\Europe\\Mariehamn": "5449e97f865215aad28e8ea273482016",
  "dxmodules\\zoneinfo\\right\\Europe\\Minsk": "aceeb3176221fa68458c66484343958b",
  "dxmodules\\zoneinfo\\right\\Europe\\Monaco": "6e5200d2c0717b4a4b36ad0373581e5e",
  "dxmodules\\zoneinfo\\right\\Europe\\Moscow": "1a3b8b78c50ba48197e1d2fa2f3b4b23",
  "dxmodules\\zoneinfo\\right\\Europe\\Nicosia": "2f833febb7eee0222af785894a47d5a8",
  "dxmodules\\zoneinfo\\right\\Europe\\Oslo": "e4dc442993a2b2784b8b7dbd7160eec4",
  "dxmodules\\zoneinfo\\right\\Europe\\Paris": "303279bb72826189bcfeb2c8aa98c66f",
  "dxmodules\\zoneinfo\\right\\Europe\\Podgorica": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Prague": "8cca872478ba5c4443e357a3eb155afd",
  "dxmodules\\zoneinfo\\right\\Europe\\Riga": "76bf464b939efe723c1ccf72873e44e3",
  "dxmodules\\zoneinfo\\right\\Europe\\Rome": "e540b9cb4bf053e9d8511725272cdf5b",
  "dxmodules\\zoneinfo\\right\\Europe\\Samara": "37128ba2e90a9999239fd86519a62eb0",
  "dxmodules\\zoneinfo\\right\\Europe\\San_Marino": "e540b9cb4bf053e9d8511725272cdf5b",
  "dxmodules\\zoneinfo\\right\\Europe\\Sarajevo": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Saratov": "e4f53774f2ef10a94be981221b099ac6",
  "dxmodules\\zoneinfo\\right\\Europe\\Simferopol": "c8a8d124342e44f3eefc263f59a5dd48",
  "dxmodules\\zoneinfo\\right\\Europe\\Skopje": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Sofia": "458a54a31208222a2c5445708bae28e0",
  "dxmodules\\zoneinfo\\right\\Europe\\Stockholm": "80f1f38ebf4384271a53183343a66975",
  "dxmodules\\zoneinfo\\right\\Europe\\Tallinn": "df5ddb83f7e5387846f5841f0518d0c5",
  "dxmodules\\zoneinfo\\right\\Europe\\Tirane": "2b5278f6502eb243455557a3a211282a",
  "dxmodules\\zoneinfo\\right\\Europe\\Tiraspol": "1a8a06d7addd111a3c3a6062cb62890d",
  "dxmodules\\zoneinfo\\right\\Europe\\Ulyanovsk": "cee2b943281f2225c621bf96786fd7a7",
  "dxmodules\\zoneinfo\\right\\Europe\\Uzhgorod": "10025f95c80284615561b410964fb264",
  "dxmodules\\zoneinfo\\right\\Europe\\Vaduz": "1e716194b428d38f654955cc74308f66",
  "dxmodules\\zoneinfo\\right\\Europe\\Vatican": "e540b9cb4bf053e9d8511725272cdf5b",
  "dxmodules\\zoneinfo\\right\\Europe\\Vienna": "955182f26f6aea388d4a583df74adaa7",
  "dxmodules\\zoneinfo\\right\\Europe\\Vilnius": "d28049e44c7514397233af6e474430ad",
  "dxmodules\\zoneinfo\\right\\Europe\\Volgograd": "f39a8e18a68ed983e5422cdd92247936",
  "dxmodules\\zoneinfo\\right\\Europe\\Warsaw": "2e719e7f3a3f27ae2fe160a8a71c5adc",
  "dxmodules\\zoneinfo\\right\\Europe\\Zagreb": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Zaporozhye": "5146398eb6c7013f023928bdf865dd69",
  "dxmodules\\zoneinfo\\right\\Europe\\Zurich": "1e716194b428d38f654955cc74308f66",
  "dxmodules\\zoneinfo\\right\\GB": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\GB-Eire": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\GMT": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\GMT+0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\GMT-0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\GMT0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Greenwich": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Hongkong": "ac812a20a17a6221694038b62ac77ff0",
  "dxmodules\\zoneinfo\\right\\HST": "704400f39808fde5ab87bcca534c957d",
  "dxmodules\\zoneinfo\\right\\Iceland": "4cbcb014d0b6e243af59821c0c384948",
  "dxmodules\\zoneinfo\\right\\Indian\\Antananarivo": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Indian\\Chagos": "a4d08c5e820b85cb1caa8ef9eb22813f",
  "dxmodules\\zoneinfo\\right\\Indian\\Christmas": "f0970ef1981829970d8acbf71af3172f",
  "dxmodules\\zoneinfo\\right\\Indian\\Cocos": "6c238b2fd09e4630a6df4b1b463d4c73",
  "dxmodules\\zoneinfo\\right\\Indian\\Comoro": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Indian\\Kerguelen": "a70e3e41f1c77f539ae8395fff564397",
  "dxmodules\\zoneinfo\\right\\Indian\\Mahe": "3564352984fa37e355be931b944efee9",
  "dxmodules\\zoneinfo\\right\\Indian\\Maldives": "1528d9c478ca032641e3c6a7e258f49f",
  "dxmodules\\zoneinfo\\right\\Indian\\Mauritius": "8f0a9bacf3a5f672a9f012772b77b17e",
  "dxmodules\\zoneinfo\\right\\Indian\\Mayotte": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Indian\\Reunion": "054a3a19a8120a110f71d23ca04307ca",
  "dxmodules\\zoneinfo\\right\\Iran": "c3a0c2539fccc3d3f8081b4218c0eb20",
  "dxmodules\\zoneinfo\\right\\Israel": "6fa25ac8d4a8f5e7c03de4434c5cc6b8",
  "dxmodules\\zoneinfo\\right\\Jamaica": "bdf8b2720941180acbbd1404c63f5451",
  "dxmodules\\zoneinfo\\right\\Japan": "e40de6c7fb9ce735aeff885394a727d2",
  "dxmodules\\zoneinfo\\right\\Kwajalein": "11e6875e86cf9f056be3f6dc4b5f9945",
  "dxmodules\\zoneinfo\\right\\Libya": "140c8538c93832c7c7ae0e40d592dd33",
  "dxmodules\\zoneinfo\\right\\MET": "553ea71b74d03c717e719edafac08447",
  "dxmodules\\zoneinfo\\right\\Mexico\\BajaNorte": "4a5aba6b91f6832078382d3f52fd391d",
  "dxmodules\\zoneinfo\\right\\Mexico\\BajaSur": "c366dd821b732f958ecc81707eecc297",
  "dxmodules\\zoneinfo\\right\\Mexico\\General": "9a5c52d9e60891e2b51c17610e75d11f",
  "dxmodules\\zoneinfo\\right\\MST": "eb8570ce4a109cb5f39ae339449435a2",
  "dxmodules\\zoneinfo\\right\\MST7MDT": "0ac5e09fecc392c1825926ea3addb2dd",
  "dxmodules\\zoneinfo\\right\\Navajo": "a04f44b808f1e82a194885aa0528e6ce",
  "dxmodules\\zoneinfo\\right\\NZ": "82b0518985a7fc92949ed0f6f26ff413",
  "dxmodules\\zoneinfo\\right\\NZ-CHAT": "037f7cdaa548a8bb0ed6f906972c87f6",
  "dxmodules\\zoneinfo\\right\\Pacific\\Apia": "87dd16cbe46e5afc0171dd29e0961fe9",
  "dxmodules\\zoneinfo\\right\\Pacific\\Auckland": "82b0518985a7fc92949ed0f6f26ff413",
  "dxmodules\\zoneinfo\\right\\Pacific\\Bougainville": "43d1bca50fc4b42c880e2e1d3b6745e4",
  "dxmodules\\zoneinfo\\right\\Pacific\\Chatham": "037f7cdaa548a8bb0ed6f906972c87f6",
  "dxmodules\\zoneinfo\\right\\Pacific\\Chuuk": "90ac2179ed963cbd44f031d797ab5cea",
  "dxmodules\\zoneinfo\\right\\Pacific\\Easter": "4dfc6403a5adf1616fb68203f03bf30e",
  "dxmodules\\zoneinfo\\right\\Pacific\\Efate": "18abb66b7aa9eca73e343cac55d66f24",
  "dxmodules\\zoneinfo\\right\\Pacific\\Enderbury": "87bf251369c2dfc68c7738e0b82d54ba",
  "dxmodules\\zoneinfo\\right\\Pacific\\Fakaofo": "231d2a10cf0411401a431366984e2a06",
  "dxmodules\\zoneinfo\\right\\Pacific\\Fiji": "9860735dadf3f3d4c9e464e595525cc8",
  "dxmodules\\zoneinfo\\right\\Pacific\\Funafuti": "a68d87ac4ad319e17b93f08249728242",
  "dxmodules\\zoneinfo\\right\\Pacific\\Galapagos": "890a615f425dbba4064293c1a946c7c2",
  "dxmodules\\zoneinfo\\right\\Pacific\\Gambier": "10b8f639b1500971337f57d49f6a6253",
  "dxmodules\\zoneinfo\\right\\Pacific\\Guadalcanal": "4d90ac24eb4f59d4c6a6bd58d779cc91",
  "dxmodules\\zoneinfo\\right\\Pacific\\Guam": "e2a0ac2f20ee3bb3c4324676115aff33",
  "dxmodules\\zoneinfo\\right\\Pacific\\Honolulu": "8388fd415f4c8a2a30a7357da5c8b7a5",
  "dxmodules\\zoneinfo\\right\\Pacific\\Johnston": "8388fd415f4c8a2a30a7357da5c8b7a5",
  "dxmodules\\zoneinfo\\right\\Pacific\\Kiritimati": "5b9795133f270e2aba9484f1f71bb049",
  "dxmodules\\zoneinfo\\right\\Pacific\\Kosrae": "fa011f144e058aa5184d6b53a15061f1",
  "dxmodules\\zoneinfo\\right\\Pacific\\Kwajalein": "11e6875e86cf9f056be3f6dc4b5f9945",
  "dxmodules\\zoneinfo\\right\\Pacific\\Majuro": "2a91ede5e92cb49bb3f0f387e84c8ddf",
  "dxmodules\\zoneinfo\\right\\Pacific\\Marquesas": "34a88ad280b7cb93e02d617121337d4b",
  "dxmodules\\zoneinfo\\right\\Pacific\\Midway": "77931d9a150d72054deaf73ea1af39dc",
  "dxmodules\\zoneinfo\\right\\Pacific\\Nauru": "49b4493e5dc16b8b96db9097b40684be",
  "dxmodules\\zoneinfo\\right\\Pacific\\Niue": "2cdf947862d9d3529e2a8a9e34cc3a72",
  "dxmodules\\zoneinfo\\right\\Pacific\\Norfolk": "c8c9b74862de9c5b6a922ceea4a518ec",
  "dxmodules\\zoneinfo\\right\\Pacific\\Noumea": "0511ee78de0dd4d2e5e1ad2486d4d15a",
  "dxmodules\\zoneinfo\\right\\Pacific\\Pago_Pago": "77931d9a150d72054deaf73ea1af39dc",
  "dxmodules\\zoneinfo\\right\\Pacific\\Palau": "7c8e4928f42b47884c73837fc95b91c4",
  "dxmodules\\zoneinfo\\right\\Pacific\\Pitcairn": "a75b2a9013f723970ceae201335f736f",
  "dxmodules\\zoneinfo\\right\\Pacific\\Pohnpei": "47b2894646c6d9e8773ed8720d851121",
  "dxmodules\\zoneinfo\\right\\Pacific\\Ponape": "47b2894646c6d9e8773ed8720d851121",
  "dxmodules\\zoneinfo\\right\\Pacific\\Port_Moresby": "470ebd903539f82cb2fed9ab0f960ee4",
  "dxmodules\\zoneinfo\\right\\Pacific\\Rarotonga": "45029b877e70bd0df13b50ab015d49fc",
  "dxmodules\\zoneinfo\\right\\Pacific\\Saipan": "e2a0ac2f20ee3bb3c4324676115aff33",
  "dxmodules\\zoneinfo\\right\\Pacific\\Samoa": "77931d9a150d72054deaf73ea1af39dc",
  "dxmodules\\zoneinfo\\right\\Pacific\\Tahiti": "6ea49c35b2399f4a8f36d5a5a5377bb9",
  "dxmodules\\zoneinfo\\right\\Pacific\\Tarawa": "d31390f2de53b92e266ba9d8e5b94398",
  "dxmodules\\zoneinfo\\right\\Pacific\\Tongatapu": "74dfc4d2ae719db55b2afdb6710a3d51",
  "dxmodules\\zoneinfo\\right\\Pacific\\Truk": "90ac2179ed963cbd44f031d797ab5cea",
  "dxmodules\\zoneinfo\\right\\Pacific\\Wake": "a3e7ed5df57910e74754f6236266417d",
  "dxmodules\\zoneinfo\\right\\Pacific\\Wallis": "4cffb736eadc485f07015943ad212f7b",
  "dxmodules\\zoneinfo\\right\\Pacific\\Yap": "90ac2179ed963cbd44f031d797ab5cea",
  "dxmodules\\zoneinfo\\right\\Poland": "2e719e7f3a3f27ae2fe160a8a71c5adc",
  "dxmodules\\zoneinfo\\right\\Portugal": "4ad34a3a04aee31ee75cbbbe2d1bd17c",
  "dxmodules\\zoneinfo\\right\\PRC": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\PST8PDT": "78287f21c770bec0e27c5d2031b24786",
  "dxmodules\\zoneinfo\\right\\ROC": "8f3da0ea2509c2fe35c6bb244f84d2e2",
  "dxmodules\\zoneinfo\\right\\ROK": "e73238fa6c85ea037bf4dcc235113fe9",
  "dxmodules\\zoneinfo\\right\\Singapore": "72be432785863c8a11d83d6f3849f6a1",
  "dxmodules\\zoneinfo\\right\\Turkey": "3f72cd0fb7e26b0dc8d7833327f035db",
  "dxmodules\\zoneinfo\\right\\UCT": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Universal": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\US\\Alaska": "be6e5ef83221831fd57a032e03246920",
  "dxmodules\\zoneinfo\\right\\US\\Aleutian": "282e70d388dfd3923238b8ca86244246",
  "dxmodules\\zoneinfo\\right\\US\\Arizona": "5adc29642d304ff453993c2b4395505d",
  "dxmodules\\zoneinfo\\right\\US\\Central": "9e0de2483877c5197b136801aa179825",
  "dxmodules\\zoneinfo\\right\\US\\East-Indiana": "aee84cbeb49b67cf69ab388c16ee8bdb",
  "dxmodules\\zoneinfo\\right\\US\\Eastern": "7b602715824f47ba6028f0075b3ea7dc",
  "dxmodules\\zoneinfo\\right\\US\\Hawaii": "8388fd415f4c8a2a30a7357da5c8b7a5",
  "dxmodules\\zoneinfo\\right\\US\\Indiana-Starke": "a4c0cd6601d2974d0d4d331285637042",
  "dxmodules\\zoneinfo\\right\\US\\Michigan": "c7e43a31c24443dcc5a10b94194d77b9",
  "dxmodules\\zoneinfo\\right\\US\\Mountain": "a04f44b808f1e82a194885aa0528e6ce",
  "dxmodules\\zoneinfo\\right\\US\\Pacific": "24885c31a23d629863272538b997f87f",
  "dxmodules\\zoneinfo\\right\\US\\Samoa": "77931d9a150d72054deaf73ea1af39dc",
  "dxmodules\\zoneinfo\\right\\UTC": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\W-SU": "1a3b8b78c50ba48197e1d2fa2f3b4b23",
  "dxmodules\\zoneinfo\\right\\WET": "17c38eb83369fc8dc351e115cd619911",
  "dxmodules\\zoneinfo\\right\\Zulu": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\ROC": "2e67467e3c050e8b3a4022eb9e20300e",
  "dxmodules\\zoneinfo\\ROK": "f7a6e371bd709b3c2f64ce6f67f39f29",
  "dxmodules\\zoneinfo\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3",
  "dxmodules\\zoneinfo\\Turkey": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\tzdata.zi": "4c99a0629d76991746913273d2467669",
  "dxmodules\\zoneinfo\\UCT": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Universal": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\US\\Alaska": "596428a3a840d568656088bd48e608f1",
  "dxmodules\\zoneinfo\\US\\Aleutian": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\US\\Arizona": "c697bb02e057325a74547912f631a3a7",
  "dxmodules\\zoneinfo\\US\\Central": "d0f076c9f390e7d8a933cc7cc1ad2e90",
  "dxmodules\\zoneinfo\\US\\East-Indiana": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\US\\Eastern": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\US\\Hawaii": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\US\\Indiana-Starke": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\US\\Michigan": "ae3ba6ed8738ceda9eef109c6c586736",
  "dxmodules\\zoneinfo\\US\\Mountain": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\US\\Pacific": "9323ff44ce205ce1a1bad7e2dca39939",
  "dxmodules\\zoneinfo\\US\\Samoa": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\UTC": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\W-SU": "223bbf37352a9d4807919132f360535e",
  "dxmodules\\zoneinfo\\WET": "92388453e62ec1a69fbf12685ad247c7",
  "dxmodules\\zoneinfo\\zone.tab": "02dddc33edc3a0eeb783555dc2ce1156",
  "dxmodules\\zoneinfo\\zone1970.tab": "2b7b091f4b1c41d6384b254f55654299",
  "dxmodules\\zoneinfo\\Zulu": "c79354b8dbee09e62bbc3fb544853283",
  "README_CN.md": "bbcb5da83f48849dbfe5388e965c2b99",
  "resource\\CN\\wav\\access_f.wav": "f951f3cc1f03aaa794231413fd4efcc6",
  "resource\\CN\\wav\\access_s.wav": "6d1b31bdcaaa13ba719e3223b55d5235",
  "resource\\CN\\wav\\btn11.wav": "a623797305d7b0e6b8cb6b2ab3d43591",
  "resource\\CN\\wav\\btn12.wav": "26bbfc3eed36211713dca9afb423e168",
  "resource\\CN\\wav\\btn13.wav": "67d6fe32693cb2e7653c2ff2141ce873",
  "resource\\CN\\wav\\btn21.wav": "53071472fce6128fdd2ed304e4d78406",
  "resource\\CN\\wav\\btn22.wav": "e35c87d370695099d3b6d7f512496395",
  "resource\\CN\\wav\\btn23.wav": "f25db5592331f1e6deb67beecb3c1131",
  "resource\\CN\\wav\\btn31.wav": "054a4f36ebda08fadca3162d955560bf",
  "resource\\CN\\wav\\btn32.wav": "64eb5fef123eafd7b52108ebcd6bace9",
  "resource\\CN\\wav\\btn33.wav": "67d6fe32693cb2e7653c2ff2141ce873",
  "resource\\CN\\wav\\calibration_s.wav": "d2ff1f1f4a40bf4166130dc079939079",
  "resource\\CN\\wav\\control_f.wav": "4dbaca7e4d227a720620b846544b469a",
  "resource\\CN\\wav\\door_close.wav": "325ca8082f8e9fceb2c7eeeb78d8645b",
  "resource\\CN\\wav\\door_open.wav": "f3b5291fc8babaffd32107198cdd5afa",
  "resource\\CN\\wav\\emergency.wav": "a1855c22f3ef2f69d5c84d3a2852ae1f",
  "resource\\CN\\wav\\emergency_f.wav": "946ac86e74b849ad8f1bec3615cf9b39",
  "resource\\CN\\wav\\emergency_s.wav": "a717e3417891ff306225ac075ba28082",
  "resource\\CN\\wav\\failed.wav": "891194e741b0bc8f6332f78eb607cc85",
  "resource\\CN\\wav\\light_close.wav": "b1ac09e91ac4ce3825614ad1654a3f58",
  "resource\\CN\\wav\\light_open.wav": "16b7b6b8c6eb469645a15e4a54a3e014",
  "resource\\CN\\wav\\network.wav": "7bbc6d740918a20acfb5ef75df685bdb",
  "resource\\CN\\wav\\read.wav": "c83edd035dc15f7a716644319e849215",
  "resource\\CN\\wav\\recg_f.wav": "5cd4d88db4e3f8332b9e73fe05222c83",
  "resource\\CN\\wav\\recg_s.wav": "4afadeb018b08518d5d3dd1cfc5e0d64",
  "resource\\CN\\wav\\recognition.wav": "da00dd97d1e8ca0ed20dc43eb4daafc8",
  "resource\\CN\\wav\\recognition_s.wav": "df9916d6fe3d285894668e63d1aeeb1d",
  "resource\\CN\\wav\\register.wav": "a91d6ebb846dc834816a954168da1352",
  "resource\\CN\\wav\\stranger.wav": "2e6690d7ddcd3609ca3e6d6717b61a9c",
  "resource\\CN\\wav\\user2.wav": "868a9b15aac20b62457f98c955f4e5e0",
  "resource\\CN\\wav\\user2_s.wav": "98904054df059be8cd69e08c302317e7",
  "resource\\CN\\wav\\verify.wav": "2bc2b96e0ca05052985fda98fb552ef9",
  "resource\\CN\\wav\\verify_10x_f.wav": "bf26ce11bbd801f5efeff8c9250f219f",
  "resource\\CN\\wav\\verify_10x_s.wav": "2d04b22277844d9c35e08e4e2c67c11c",
  "resource\\CN\\wav\\verify_200_f.wav": "393036b5fc28a3c04580593d59e26e7e",
  "resource\\CN\\wav\\verify_200_s.wav": "585267371d37f3f45e3826ec7dcafbd3",
  "resource\\CN\\wav\\verify_300_f.wav": "e44977e8b6dcac8adbf304894afd24e0",
  "resource\\CN\\wav\\verify_300_s.wav": "d8e23a91e4999b2d77454aab824bd611",
  "resource\\CN\\wav\\verify_400_f.wav": "05752c8c9c2bf4334943999842529d8b",
  "resource\\CN\\wav\\verify_400_s.wav": "740a63ffe907dda0f2d0e14cb9a83f74",
  "resource\\EN\\wav\\calibration_s.wav": "b5497547d9e7e6fb5b28ee307b27752b",
  "resource\\EN\\wav\\network.wav": "1e8ccfd03ca83976fefdba1edcf1b194",
  "resource\\EN\\wav\\read.wav": "8c1f6ee62c7bf74db5ecab28d3988eeb",
  "resource\\EN\\wav\\recg_f.wav": "e303563b867dd6eaebac18679ca760df",
  "resource\\EN\\wav\\recg_s.wav": "183a843b668aa919311a6d352af80f35",
  "resource\\EN\\wav\\recognition.wav": "1c9e06bc338c49c120aa101b1fac8de0",
  "resource\\EN\\wav\\recognition_s.wav": "f887f2b1615121bbe815fef7f64d3b92",
  "resource\\EN\\wav\\register.wav": "de5d0048f840243fdd1392c09d9ac164",
  "resource\\EN\\wav\\stranger.wav": "31775350903916827fdec25b9c65dd94",
  "resource\\EN\\wav\\verify.wav": "2e77ec2c754e1dea329988d4e462aa2f",
  "resource\\EN\\wav\\verify_10x_f.wav": "7ccc23490436b9f1de32200230953a62",
  "resource\\EN\\wav\\verify_10x_s.wav": "0630e0410fca3c7fd7e701c69e8ea4bc",
  "resource\\EN\\wav\\verify_200_f.wav": "64ce473b0f560cc1613469ab94197ce6",
  "resource\\EN\\wav\\verify_200_s.wav": "e3d28c408cc3bef5461620c75b15abdf",
  "resource\\EN\\wav\\verify_300_f.wav": "7fa0d7bf85d040b72a89cfb9e2f06bcf",
  "resource\\EN\\wav\\verify_300_s.wav": "3e69fd763477d6cc30543d838f33d718",
  "resource\\EN\\wav\\verify_400_f.wav": "d074b8f6e4e968b6d1984b123ed4d387",
  "resource\\EN\\wav\\verify_400_s.wav": "9141136d3310a5fac5917d3f6056249f",
  "resource\\font\\AlibabaPuHuiTi-3-65-Medium.ttf": "c8015ba2be3b6bb5fd991e9435ec1f8d",
  "resource\\font\\Arabic.ttf": "3f00fe80780beb16682239db77e1aa80",
  "resource\\font\\Korean.ttf": "470e4a7b27f9944288feb9fa3883b4fb",
  "resource\\i18n\\CN.json": "bc0fd0baf44a41fa1e1ae92b4061a792",
  "resource\\i18n\\EN.json": "bc0fd0baf44a41fa1e1ae92b4061a792",
  "resource\\image\\4g.png": "e5b27ed5a596cb16c7ab695d82fe3014",
  "resource\\image\\4g_dark.png": "414b3a9fcefd8ea6909158b51038d4d8",
  "resource\\image\\accessCtrl.png": "6be30c8f648ec7153ae2c39a15884181",
  "resource\\image\\add.png": "498480ce68e4d6047eb74d3aa5229f56",
  "resource\\image\\advance.png": "d98aeb99a04163bce23b6c2638cd705a",
  "resource\\image\\app.png": "7640c7358a3f5dba1f887b8413b93a9d",
  "resource\\image\\app_btn.png": "aa325cea46fd3918c86d76bf009b1663",
  "resource\\image\\app_qrcode.png": "0a20655d02ff0e473106bf41f7c9687b",
  "resource\\image\\arrow_right.png": "edc6876d6fa1e2d0be2e606c73e0f2ec",
  "resource\\image\\back.png": "aa5869ff78051dbdc5f688f1805064da",
  "resource\\image\\background.jpg": "90d464f4221f62132ebf74e69446b6d7",
  "resource\\image\\backspace.png": "26302e37dd8618e92c3a47d68039d0ec",
  "resource\\image\\back_2.png": "b3f16ab01606d85c2c70124d50b3af1b",
  "resource\\image\\basic.png": "84eedd84efdc5fdb54138dd29cf6fc41",
  "resource\\image\\black_btn.png": "13ee1720aff247ba3f8e22e00f89a316",
  "resource\\image\\card.png": "c05047d2ad6549db001d08790cb5d9ff",
  "resource\\image\\close.png": "a5353c231df804fcc4577672ab3a4302",
  "resource\\image\\close_small.png": "7d6cddddc38ce8d4950789169213add4",
  "resource\\image\\cloudCert.png": "4481cfb9c2d1f44f0a0dd0489cb6fc2b",
  "resource\\image\\co2_f.png": "7e6f00c03b71a4dbe439491083ca731c",
  "resource\\image\\co2_s.png": "4fb691286b8856f1ed25ef8bacdb6099",
  "resource\\image\\commMgmt.png": "5cd157e1b8c82fdf9ddba1f6d5047b9b",
  "resource\\image\\config.png": "50d2091b9f7fba5915dbed0aa0dcf918",
  "resource\\image\\config_btn.png": "e54cbc27d30e7c6480b83107a631e7ef",
  "resource\\image\\delete.png": "014bad6d9a94a133c58ef350e198101e",
  "resource\\image\\delete_fill.png": "947fc08278354a1151d5599382c2c5f3",
  "resource\\image\\deviceInfo.png": "3e40246e01c1f7eede4d76fcbba33825",
  "resource\\image\\devInfo.png": "1a80aba6780a45f8775bdfdcff4df23a",
  "resource\\image\\doorControl.png": "68993ef92bb8c6b2d0dab2c75cc7533d",
  "resource\\image\\down.png": "c4d5c1883db4694ccedb7c1140d89da9",
  "resource\\image\\emergencyOpen.png": "890877dee840dabe60487f8ce57b41f6",
  "resource\\image\\empty.png": "8283ac78099d9c13ef4b552ce86f5c38",
  "resource\\image\\enter.png": "787e076256c8a47e07f2091a57585fb5",
  "resource\\image\\enter_b.png": "02cb6c84fec128a639e3cf0828a6ee5f",
  "resource\\image\\ethernet.png": "f3abb111d96a11a56f7ed77b21abab4c",
  "resource\\image\\ethernet_dark.png": "10656303a6d22e204014f55ed0fb3efb",
  "resource\\image\\eth_disable.png": "7017f5cc2c9b4f802f082f6c0f5bb581",
  "resource\\image\\eth_enable.png": "84d1334e524ac669c3b79e8a69b41eb1",
  "resource\\image\\eye-fill.png": "9ae71914bd47423be04d0a22eb4f3995",
  "resource\\image\\eye-off.png": "295c3e8255ced50cf2667ecda524e11e",
  "resource\\image\\eye_fill.png": "d0ac0d07f13e02e5fae7a12a0858ec49",
  "resource\\image\\eye_fill_show.png": "265cf669797b94a138982c01c29d0bd9",
  "resource\\image\\face.png": "d695a5f29dbf051fc0c6e0d4e177f5c5",
  "resource\\image\\faceAdd.png": "5e0e3d4eb3f034a179a8eef5c08d4c63",
  "resource\\image\\faceEmpty.png": "9ef3bd1d776183e203e69d5c91e4b129",
  "resource\\image\\faceError.png": "19841af9136d4483642a254ab1a6f57c",
  "resource\\image\\faceRec.png": "f1bfcb61f4642c6c1bbc04856fb57905",
  "resource\\image\\faceRec2.png": "580c72783b4cfc64ec0a9593e77c456a",
  "resource\\image\\factoryTest.png": "4bdb36420046870efcabd4a040e31913",
  "resource\\image\\failBg.png": "5d6dca3cc98032a10ef4bc0658f7e546",
  "resource\\image\\grey_btn.png": "b0ca6e44c0e01a17d0bdda5f7e057cc2",
  "resource\\image\\help.png": "7d75da0510ca74870858a639882dc2ef",
  "resource\\image\\idleImage.jpg": "90d464f4221f62132ebf74e69446b6d7",
  "resource\\image\\input_bg.png": "8a8f5c43f1118869a7679ccbaaf47de2",
  "resource\\image\\light_close.png": "607b38280bb5321327cacce5bd6c3fe9",
  "resource\\image\\light_open.png": "1a8df3753b6f0df9e7abb5b53dabd72e",
  "resource\\image\\localUser.png": "6429f43f7fee002d66d50a3d92a087da",
  "resource\\image\\lock.png": "c1419aa2a9c9da4b7dbf3529a1af37f3",
  "resource\\image\\logo.png": "5768b9344bedc53096d2227bee5d52d4",
  "resource\\image\\menu_btn.png": "df98739cd4804d08b23eaf33bb92e1bc",
  "resource\\image\\mini_app.png": "82ee9005b5d162a6fbb0d32764088da4",
  "resource\\image\\mini_background.png": "620bf06dbfffe37f717b91fb3ed8ef40",
  "resource\\image\\mini_config.png": "6bf78553fb53673a89e80613cfbee4c1",
  "resource\\image\\mini_password.png": "6892385a457e084953bcf9acb2ae9957",
  "resource\\image\\mqtt.png": "542ebc6bdbb66ea0f25cf29aeb9d264c",
  "resource\\image\\mqtt_dark.png": "d4aab5adc128846c47a3b8bb015c757b",
  "resource\\image\\mqtt_enable.png": "fc766f5fcbb95eca648ee10d421cc8fe",
  "resource\\image\\network.png": "0a0119e3d5fce101b28575a4e44aaf7e",
  "resource\\image\\networkSetting.png": "3e83d354e8293ed112fe7cc405b94187",
  "resource\\image\\network_dark.png": "3c5f8ce5732e95ad613cdd41dc5adbc0",
  "resource\\image\\o2_f.png": "b787951eba880b3ae82b42594b4e30df",
  "resource\\image\\o2_s.png": "50564fb865bb7f5ed0352e43ea17d853",
  "resource\\image\\ph3_f.png": "e95a348c887298dc4ed0555c577ea5bb",
  "resource\\image\\ph3_s.png": "96e68d741b75fcd6938a6909014cccb0",
  "resource\\image\\pwd_btn.png": "8764458bee98bff728445837e126231e",
  "resource\\image\\qrcode_small.png": "285bbe7e8f968c8bf4506a563dffcac2",
  "resource\\image\\recordQuery.png": "d340255a0c2342382bff6f8c57f6376b",
  "resource\\image\\recQuery.png": "1b8c58663a6e61f4f885e784ee4e87d4",
  "resource\\image\\rectangle.png": "394e2e483120908674f6de7fb879bfcf",
  "resource\\image\\register.png": "7fa975d92007703532ba8011f2a0109f",
  "resource\\image\\right.png": "a6f6bc770ad7a8220effcc96e750aaaa",
  "resource\\image\\select_arrow.png": "9d82daa1092375abc413d581f36aaf2d",
  "resource\\image\\setting.png": "92365fd93f2cfa63c7901ce3d8900a42",
  "resource\\image\\setting32.png": "e531bf8a9ce7f6cf93a8ea9baf95377c",
  "resource\\image\\space.png": "de9816e31308bd7ce187fe03ab634a37",
  "resource\\image\\successBg.png": "1ef294bd7e1688bba47c2337906b1d1d",
  "resource\\image\\success_fill.png": "09166b0cd4da44b76b4f6cdc2c550103",
  "resource\\image\\sysSettings.png": "0a84bbe887481a1cce1ca562f83d5b89",
  "resource\\image\\systemSetting.png": "9aee20d073df321250a5bbc57d16d5f1",
  "resource\\image\\sys_info.png": "20dc23c019d07cd2c3ce32a160b7b63f",
  "resource\\image\\title_bg.png": "82fbdcc4133899d03072dcd57a92f203",
  "resource\\image\\trackFace.png": "e90f92eb629563ede01aadca2b719de9",
  "resource\\image\\unlock.png": "7b97b659c36d3ba4f435f44792b90a80",
  "resource\\image\\user.png": "6429f43f7fee002d66d50a3d92a087da",
  "resource\\image\\userGuide.png": "3227210f670f66cd6c29641e1212b0b8",
  "resource\\image\\userMgmt.png": "5dad96f344513f970c2b582d7feb537d",
  "resource\\image\\user_1.png": "36ab26e22dc39ea28c03f05f4ab891ce",
  "resource\\image\\user_f.png": "d82d235224deccd2235ab15dbf1fda26",
  "resource\\image\\user_s.png": "709953f3695cae9ac1bb50533f1a96ba",
  "resource\\image\\user_w.png": "bc2ca556f37181815c0093d802f2f24f",
  "resource\\image\\vf105\\4g.png": "deebc58c4b7c81d3628c6bfe3d833917",
  "resource\\image\\vf105\\4g_dark.png": "5cfe44ac267d0a1dfbfb896caa5dfe42",
  "resource\\image\\vf105\\accessCtrl.png": "0561dac85eb4b325fdc377c63a1d1f52",
  "resource\\image\\vf105\\add.png": "5ae43bc20471a91c6891d9a7cbe1e960",
  "resource\\image\\vf105\\advance.png": "cb19e041703481ec6b0936074d3ff9d0",
  "resource\\image\\vf105\\app.png": "2aa76ac48dcd1e35789f4031e2c90d76",
  "resource\\image\\vf105\\app_btn.png": "9e8242d16657897b531a57bad52a0b20",
  "resource\\image\\vf105\\app_qrcode.png": "919faf258376df92efc42a27ba5f42ea",
  "resource\\image\\vf105\\arrow_right.png": "c01c64cf2d2f257917e6b733d2dc61ee",
  "resource\\image\\vf105\\back.png": "be4dce7a5996ed70af1207a1f3e1ffbf",
  "resource\\image\\vf105\\background.jpg": "1327b8fbd25c1a38da1a14c6b23fd381",
  "resource\\image\\vf105\\backspace.png": "4f3eebd143aa2abc2c4f058d311a108d",
  "resource\\image\\vf105\\back_2.png": "1d4bd817afe4cb46769c9a478305c823",
  "resource\\image\\vf105\\basic.png": "1917055452e69999d6160255283bd5fe",
  "resource\\image\\vf105\\black_btn.png": "da8f9db1ef40edace91552ae2a89357a",
  "resource\\image\\vf105\\card.png": "59af350406e053f432e558f8ae3787d5",
  "resource\\image\\vf105\\close.png": "cc269b704bc8c998f1f0b4eaae921469",
  "resource\\image\\vf105\\close_small.png": "e5e5c5a54b90cda627c6c03675cdf56b",
  "resource\\image\\vf105\\cloudCert.png": "5e56e48322f2bcef31ba844c8bebc393",
  "resource\\image\\vf105\\commMgmt.png": "81b9d03c23f75ad877df64de06911c44",
  "resource\\image\\vf105\\config.png": "648480dea71675fbb8a838a96b861f4c",
  "resource\\image\\vf105\\config_btn.png": "2a581106bd12c67da3205b613bc10122",
  "resource\\image\\vf105\\delete.png": "2ad0310904b10885096fba14965244f2",
  "resource\\image\\vf105\\delete_fill.png": "29d3a8d714b6a0f0bd73dd8ef5947df6",
  "resource\\image\\vf105\\developer.png": "e71e5ac6071eb821e86b44a91b59c838",
  "resource\\image\\vf105\\deviceInfo.png": "deb7e25ebba6ac92b86bf0e740fdba12",
  "resource\\image\\vf105\\devInfo.png": "fc661d4864cae401050ffd3fb61c19ac",
  "resource\\image\\vf105\\doorControl.png": "e9e1e2400a3bc2b8a566757a7e73b104",
  "resource\\image\\vf105\\down.png": "4fb09683bd3472015d5ae857b902e5f8",
  "resource\\image\\vf105\\empty.png": "1ace2c58eefdbb660ebda558bbf971ff",
  "resource\\image\\vf105\\enter.png": "4fdefe7a74ee80fb788fe44cbae40939",
  "resource\\image\\vf105\\enter_b.png": "a17ddca038c8e48961421e42dadef12c",
  "resource\\image\\vf105\\ethernet.png": "bd6ff1bd4635626409ae1368ea819190",
  "resource\\image\\vf105\\ethernet_dark.png": "b620fb06a520673227b24fe875bc8c04",
  "resource\\image\\vf105\\eth_disable.png": "fb715be89aae2b189cef1a93796a2bbd",
  "resource\\image\\vf105\\eth_enable.png": "11366418b487b814ad63be2a11fad9a3",
  "resource\\image\\vf105\\eye-fill.png": "8cbf389b92610178808283930cf2c29e",
  "resource\\image\\vf105\\eye-off.png": "fb636053be988b443f9d52901dd773a1",
  "resource\\image\\vf105\\eye_fill.png": "4b7ef420f57d10e271c745587a9c5692",
  "resource\\image\\vf105\\eye_fill_show.png": "9677930e55cbe5766a75554d527ab3f1",
  "resource\\image\\vf105\\face.png": "dc94fe6a6c31259ae386b6a84f41884a",
  "resource\\image\\vf105\\faceAdd.png": "2e02cea502f061c31537bff3281d8d93",
  "resource\\image\\vf105\\faceEmpty.png": "4e766bd9e4150be9a1149a7c072a9787",
  "resource\\image\\vf105\\faceError.png": "0be5992ee5364f99589217b1199ad7db",
  "resource\\image\\vf105\\faceRec.png": "9c6573c2861d9e136ba789ad748af684",
  "resource\\image\\vf105\\faceRec2.png": "62ceecccb4888209192f7000f307bb70",
  "resource\\image\\vf105\\factoryTest.png": "f0324fe73098bb08a2208e44f6ef3d6d",
  "resource\\image\\vf105\\failBg.png": "358ad8e1f0312efbafdb077b504c165e",
  "resource\\image\\vf105\\fingerBoxF.png": "125df8fa37905599d62ff47bbbd83aaf",
  "resource\\image\\vf105\\fingerBoxS.png": "db2154eb4d4bd3d83b5230c04444477e",
  "resource\\image\\vf105\\fingerRe0.png": "031e35a4b855732d72e64097ec9d01f6",
  "resource\\image\\vf105\\fingerRe1.png": "0056ca579917f7d4fc9da9eebf848107",
  "resource\\image\\vf105\\fingerRe2.png": "5f76290d264c5be03cf87367ccff6b98",
  "resource\\image\\vf105\\fingerRe3.png": "f8cd749690744cffceff1ccd2d82e3fd",
  "resource\\image\\vf105\\grey_btn.png": "76a60991c1e633ddbf6fd62c9f620d25",
  "resource\\image\\vf105\\help.png": "ca3028f1bea2dbb14ffb86c2e779a038",
  "resource\\image\\vf105\\idleImage.jpg": "44bfe1382c2e7055a1955b924acea44a",
  "resource\\image\\vf105\\idleImage.png": "3ae637d7958e135f2164f4e9577f493f",
  "resource\\image\\vf105\\localUser.png": "46e92a28978bbd8da82d8eb7d3168aa4",
  "resource\\image\\vf105\\lock.png": "6ce2803f6feb5dd8e1b015fd774c497d",
  "resource\\image\\vf105\\menu_btn.png": "1e7fc164bce121b3f06e50af62c51e25",
  "resource\\image\\vf105\\mini_app.png": "973d67e3375260e7001ae01e0cac2d38",
  "resource\\image\\vf105\\mini_background.png": "f6ea6c8747055632dfc26c4dd2223549",
  "resource\\image\\vf105\\mini_config.png": "0c77094b492d84314afbdd24ee57c09d",
  "resource\\image\\vf105\\mini_password.png": "17481fb43930feaa36c882db1186748a",
  "resource\\image\\vf105\\mqtt.png": "ee92d53c5c6982b7c0418a5ec6821f59",
  "resource\\image\\vf105\\mqtt_dark.png": "a4571c52ac1208ca9de4279cafcfeea8",
  "resource\\image\\vf105\\network.png": "e067a6a31b3b3f8e6cacd96cc77c5216",
  "resource\\image\\vf105\\networkSetting.png": "61b2477bcb70865b7c166df7f777f416",
  "resource\\image\\vf105\\network_dark.png": "d142406315dcfa2a1277f9aacf03cffa",
  "resource\\image\\vf105\\pwd_btn.png": "c3fed4b5d9c6288bf1207ca5d92d619c",
  "resource\\image\\vf105\\qrcode_small.png": "cc962f51b5404db51bbc2868c4d6af77",
  "resource\\image\\vf105\\recordQuery.png": "7503152bdf3aafded5295fa321d93654",
  "resource\\image\\vf105\\recQuery.png": "1de029b697e42affb3103ddba57382f1",
  "resource\\image\\vf105\\rectangle.png": "b64428c942dfa899df37b9cf0d3f43f8",
  "resource\\image\\vf105\\register.png": "f4b081b7aef4dc6d1ba1ce6e99056734",
  "resource\\image\\vf105\\right.png": "cb0cbed9eb5970784965d8e89f82478f",
  "resource\\image\\vf105\\select_arrow.png": "da3020499f41c8b7f6f2ea5f4336db4b",
  "resource\\image\\vf105\\setting.png": "a65d388b9aab8be38c636823a63946a4",
  "resource\\image\\vf105\\setting32.png": "23524292f4f233b55c9f418a5e2e25b7",
  "resource\\image\\vf105\\space.png": "e86fb40094372f10671b013ce07b7eb6",
  "resource\\image\\vf105\\successBg.png": "fbf2cd4b5878d02d9c3583a444d02467",
  "resource\\image\\vf105\\success_fill.png": "1299222da2acb2f5209dc754cc0e3677",
  "resource\\image\\vf105\\sysSettings.png": "e2f48df59e6624717dd0c6ca35ff91ca",
  "resource\\image\\vf105\\systemSetting.png": "8ebd576b41be069d1db5e1919b95bd52",
  "resource\\image\\vf105\\sys_info.png": "374377d37b88c5be8678dd8314f443d0",
  "resource\\image\\vf105\\trackFace.png": "efc48bdabbc21e49cb3d20e4e43b63c0",
  "resource\\image\\vf105\\unlock.png": "5efdc71f5f45a431e0e8b0d74faa91a2",
  "resource\\image\\vf105\\user.png": "7e8ef656c544c3432f015c655421ff8f",
  "resource\\image\\vf105\\userGuide.png": "cbfac61db886f390c07d2a98161ef802",
  "resource\\image\\vf105\\userMgmt.png": "5cc57923cb18f394673cea498132daa2",
  "resource\\image\\vf105\\vip.png": "921e0753528bf63d031b73473549db9f",
  "resource\\image\\vf105\\voiceBroadcast.png": "9a0e56e9e8d878559f9dad0138c3c1d9",
  "resource\\image\\vf105\\wechat.png": "bf6b8466a1a8d84d869b06efd3540d46",
  "resource\\image\\vf105\\wifi.png": "fb46272231389474003cd2f5191ea353",
  "resource\\image\\vf105\\wifi_dark.png": "a167e7e06f3ed5740e3336b7f8123c8b",
  "resource\\image\\vf114\\4g.png": "bdd7c97e50e4b092673b29bbe88bd8b8",
  "resource\\image\\vf114\\4g_dark.png": "3539b8fc025cb50b04db91d632952548",
  "resource\\image\\vf114\\accessCtrl.png": "9dfb072e0137274eec201845ad555665",
  "resource\\image\\vf114\\add.png": "95fdd8fc16b07b45a6ec87cd737e5071",
  "resource\\image\\vf114\\advance.png": "ad39f26cd248c761944c588396617b75",
  "resource\\image\\vf114\\app.png": "702301a70e1a69b8dc07ae08ee0b3c9a",
  "resource\\image\\vf114\\app_btn.png": "0173d42cca268ee3162e1d4877655af4",
  "resource\\image\\vf114\\app_qrcode.png": "e03e3a48337ca68e4f6639bb814a3cd4",
  "resource\\image\\vf114\\arrow_right.png": "76e59179fee9109776b2d6c3178de0d0",
  "resource\\image\\vf114\\back.png": "974667f9572bd57b221c95da25ae5343",
  "resource\\image\\vf114\\background.jpg": "ad3dd883a8878f3cd8b6d9d9b1726c05",
  "resource\\image\\vf114\\backspace.png": "63458547fb5c95ea53cf92a2204b04a9",
  "resource\\image\\vf114\\back_2.png": "d166678290cae0616dcb2053294eca28",
  "resource\\image\\vf114\\basic.png": "6885a5790b032eda507250b01411eda8",
  "resource\\image\\vf114\\black_btn.png": "2c69fa32fd710cd0544b19a2b3630fc3",
  "resource\\image\\vf114\\card.png": "a7700c9f983f73747ab519b74a9a35b1",
  "resource\\image\\vf114\\close.png": "324b84b237288f7cde0b08ad12d1d577",
  "resource\\image\\vf114\\close_small.png": "b88b06ecb81f18c9b70ba6c4b4052169",
  "resource\\image\\vf114\\cloudCert.png": "e1f01a5bcc0e0f40afb8ad3ae8a1d77b",
  "resource\\image\\vf114\\commMgmt.png": "33c350ead16aa52ec41b0e68d5a28684",
  "resource\\image\\vf114\\config.png": "fd5f1336f72193f7c15698941a208509",
  "resource\\image\\vf114\\config_btn.png": "8ed325539cc83b73d915e9ccda9e2e43",
  "resource\\image\\vf114\\delete.png": "3cce3c9fafb55aac0402255f0631f436",
  "resource\\image\\vf114\\delete_fill.png": "b08f9411e7522b9e7cafab4d40c5311e",
  "resource\\image\\vf114\\developer.png": "44a015510d4b1aabfa4959afb94a433b",
  "resource\\image\\vf114\\deviceInfo.png": "d4f02a866605b683f135ab7dbba549b9",
  "resource\\image\\vf114\\devInfo.png": "faed670572922bda527fc8255412e548",
  "resource\\image\\vf114\\doorControl.png": "7be9d2b7b3b3432176e9bb2fdaf49f5e",
  "resource\\image\\vf114\\down.png": "5a6689a7adc59c87a6ed2d565875c99d",
  "resource\\image\\vf114\\empty.png": "0c4645c8c569b84b22b84ef471a256fb",
  "resource\\image\\vf114\\enter.png": "cfdde3f3e9127940c95ba141a3ed9b9a",
  "resource\\image\\vf114\\enter_b.png": "1604cad02b5a9daa13e5d813b113ab54",
  "resource\\image\\vf114\\ethernet.png": "fad299febb1021bb8c11d2b5bffe44bb",
  "resource\\image\\vf114\\ethernet_dark.png": "693e0fdda1c57c85fe39231915ce3cbc",
  "resource\\image\\vf114\\eth_disable.png": "6cf5c960b556abf16fea7c42687baa5b",
  "resource\\image\\vf114\\eth_enable.png": "a7ff6da3b332f5fbaf0a56e77f2760d2",
  "resource\\image\\vf114\\eye-fill.png": "e9fafd51f0d641f0c8adc683374d6c05",
  "resource\\image\\vf114\\eye-off.png": "a501181551682e1408f723fdbe63b9de",
  "resource\\image\\vf114\\eye_fill.png": "eda7423b7a833faf1b795fe592ae5aa4",
  "resource\\image\\vf114\\eye_fill_show.png": "0974c798b074126a70924b61456b44ea",
  "resource\\image\\vf114\\face.png": "06b7afd104e793f5352d04d34df91c05",
  "resource\\image\\vf114\\faceAdd.png": "0b5ad2c4bd3e8c5fbf139495310574be",
  "resource\\image\\vf114\\faceEmpty.png": "3c72971bf874c4ab54793944f65a2275",
  "resource\\image\\vf114\\faceError.png": "1f53a4b110495ef1685c87776af5eedf",
  "resource\\image\\vf114\\faceRec.png": "862e02eb3cf55fe786aafea089df57c4",
  "resource\\image\\vf114\\faceRec2.png": "a0fee4f4e7662b1ad9f6a51f1dddc35f",
  "resource\\image\\vf114\\factoryTest.png": "b8490aa1a9f613bc1cbd6b96d8214dc0",
  "resource\\image\\vf114\\failBg.png": "5527c1808e8443f945cd2c72d4794d83",
  "resource\\image\\vf114\\fingerBoxF.png": "125df8fa37905599d62ff47bbbd83aaf",
  "resource\\image\\vf114\\fingerBoxS.png": "db2154eb4d4bd3d83b5230c04444477e",
  "resource\\image\\vf114\\fingerRe0.png": "031e35a4b855732d72e64097ec9d01f6",
  "resource\\image\\vf114\\fingerRe1.png": "0056ca579917f7d4fc9da9eebf848107",
  "resource\\image\\vf114\\fingerRe2.png": "5f76290d264c5be03cf87367ccff6b98",
  "resource\\image\\vf114\\fingerRe3.png": "f8cd749690744cffceff1ccd2d82e3fd",
  "resource\\image\\vf114\\grey_btn.png": "5c9d4c08a43153dfdc1302e37f4c1634",
  "resource\\image\\vf114\\help.png": "a5b6c8c6931e00bc77804e42aeae011f",
  "resource\\image\\vf114\\idleImage.jpg": "ad3dd883a8878f3cd8b6d9d9b1726c05",
  "resource\\image\\vf114\\idleImage.png": "67b21ca8b9dfffb56ca1461c16b55afc",
  "resource\\image\\vf114\\localUser.png": "af0d5ded90865acac93e68870f910cd9",
  "resource\\image\\vf114\\lock.png": "54ae7cc3b5d50ec68939bd5bc8309ef2",
  "resource\\image\\vf114\\menu_btn.png": "fd5f1336f72193f7c15698941a208509",
  "resource\\image\\vf114\\mini_app.png": "638cdf3c7fbd1f86c69927dde9a214fe",
  "resource\\image\\vf114\\mini_background.png": "11134c0d4ac0097232618ed1a62883e4",
  "resource\\image\\vf114\\mini_config.png": "69f3f7a33cf1617ec08fb8d228facb0a",
  "resource\\image\\vf114\\mini_password.png": "be1e0d36d21e9f70262243e63ac11fe8",
  "resource\\image\\vf114\\mqtt.png": "e1a62521c2273ec0cef41144854acea9",
  "resource\\image\\vf114\\mqtt_dark.png": "51ab6bb9a073752697b1f7241f5ad6f2",
  "resource\\image\\vf114\\network.png": "d0460d1844015a805a1f52d8432001f5",
  "resource\\image\\vf114\\networkSetting.png": "d1e5477b9ddf2da94e637876530481dd",
  "resource\\image\\vf114\\network_dark.png": "60f7b54297f927126f52302de8b4b18f",
  "resource\\image\\vf114\\pwd_btn.png": "a8f19a82bfe03b629ac3e0a3964135fc",
  "resource\\image\\vf114\\qrcode_small.png": "12ba5e07703c3bf32c6ef4ff7750242e",
  "resource\\image\\vf114\\recordQuery.png": "a4ad2ada5f8bf9c13d5a58bf70e40cac",
  "resource\\image\\vf114\\recQuery.png": "98a6a81d624137dea96dcc0e8780902f",
  "resource\\image\\vf114\\rectangle.png": "9482162a7b2744f313041be02c2c7c35",
  "resource\\image\\vf114\\register.png": "35b0032b10158b850ebab52c1b89fc2b",
  "resource\\image\\vf114\\right.png": "55fb9deeabf97b30da9749dd51aea5ea",
  "resource\\image\\vf114\\select_arrow.png": "db66347b510537a4314da045c526cb0e",
  "resource\\image\\vf114\\setting.png": "ecf2ed928f51c830176a6ae4f503034c",
  "resource\\image\\vf114\\setting32.png": "8412dcd0fa26cb8bb812d76d2c257e9b",
  "resource\\image\\vf114\\space.png": "65eac6437c86617b7be146390b34e12a",
  "resource\\image\\vf114\\successBg.png": "a3ca0ce6acf62f57e4fcf25f5a073c13",
  "resource\\image\\vf114\\success_fill.png": "589b3bd7fbcf7880c5f2b23accdd36e1",
  "resource\\image\\vf114\\sysSettings.png": "946f8967e9b323b34f27242f0990d137",
  "resource\\image\\vf114\\systemSetting.png": "19f0225379041aec6b16e1cf5af54962",
  "resource\\image\\vf114\\sys_info.png": "5725825e5d4364dc578ad47754f92270",
  "resource\\image\\vf114\\trackFace.png": "1b2e2ddf116119b5d39cbc37bf5011ed",
  "resource\\image\\vf114\\unlock.png": "fb4defefea714489b8ed7b7002270f38",
  "resource\\image\\vf114\\user.png": "af0d5ded90865acac93e68870f910cd9",
  "resource\\image\\vf114\\userGuide.png": "89831ab4360b20a5b4c99e0ea48f5ac7",
  "resource\\image\\vf114\\userMgmt.png": "0e3e47b6fe33cb209bc0c350917945e2",
  "resource\\image\\vf114\\vip.png": "936afbfc08e7d30831805407a3d73f24",
  "resource\\image\\vf114\\voiceBroadcast.png": "eb3ed0a4728e47e3ee684637fa0862ce",
  "resource\\image\\vf114\\wechat.png": "78a3125fc2c9b62d5fb83b5f9a255a4f",
  "resource\\image\\vf114\\wifi.png": "f966bbd23a878842cc6927cf2232eb26",
  "resource\\image\\vf114\\wifi_dark.png": "aa8fd7b0f6920c47c18e3a4c731c1279",
  "resource\\image\\vf202\\4g.png": "dac9a45fe25163789ea513e2fcf76c2f",
  "resource\\image\\vf202\\4g_dark.png": "0e91379860cc3f29cb10e941ea1cf445",
  "resource\\image\\vf202\\accessCtrl.png": "252dfe563aa14ed13f6335c66819e88e",
  "resource\\image\\vf202\\add.png": "37f570778a63000e2fe13693a837e50c",
  "resource\\image\\vf202\\advance.png": "6890b0ea472a8d2534982a338bb212e6",
  "resource\\image\\vf202\\app.png": "778a7f45f1c61545c444b35ac1bb636c",
  "resource\\image\\vf202\\app_btn.png": "1a7beb9c843dac5bfe8cb516ae85e578",
  "resource\\image\\vf202\\app_qrcode.png": "24f2dd26efc016c829afd1ad9ec10021",
  "resource\\image\\vf202\\arrow_right.png": "44bd3be59aa1e6a3d55e1932ee139a41",
  "resource\\image\\vf202\\back.png": "576a3ac118a18df9e5c19371b51cd0b7",
  "resource\\image\\vf202\\background.jpg": "e261f9d11ba192b9a318855198a82a72",
  "resource\\image\\vf202\\backspace.png": "83a1bf7837d546548d4cc224ac0b95f2",
  "resource\\image\\vf202\\back_2.png": "2f4178d75fa6e2811745b790763dfd22",
  "resource\\image\\vf202\\basic.png": "19f16388b948bb3c62d8177060dcd0a6",
  "resource\\image\\vf202\\black_btn.png": "b15f6df11a49a205289eb2471da39ae6",
  "resource\\image\\vf202\\card.png": "9f9b02e484e6621f0929289daa32ab31",
  "resource\\image\\vf202\\close.png": "9d61811afdf59012d7bb482487b49edb",
  "resource\\image\\vf202\\close_small.png": "9956b2ae6ed2874af7c1fc631f34a423",
  "resource\\image\\vf202\\cloudCert.png": "245c00f50c46be8da93960416f47cfff",
  "resource\\image\\vf202\\commMgmt.png": "58ad847a1a506b66f92adcad635e0f12",
  "resource\\image\\vf202\\config.png": "5bf26f61a5105bc20c9885679754ce1c",
  "resource\\image\\vf202\\config_btn.png": "8d16e5ca4e08e31e9e22422ed21d6478",
  "resource\\image\\vf202\\delete.png": "46e9b381a1bc45e950f1b332ecf54940",
  "resource\\image\\vf202\\delete_fill.png": "4a215805b88677ede12627c4ac9e3a17",
  "resource\\image\\vf202\\developer.png": "3314b8f50d20c7939bf17806622f2180",
  "resource\\image\\vf202\\deviceInfo.png": "4710af6ceceaab1cdfc0032223144a64",
  "resource\\image\\vf202\\devInfo.png": "ca529fac38bf272fab9c0fa93d651ce5",
  "resource\\image\\vf202\\doorControl.png": "5ba35b3c1e45572f306fcc223e2c864f",
  "resource\\image\\vf202\\down.png": "2a176c857ace4437068c182e7b175619",
  "resource\\image\\vf202\\empty.png": "e36fc80c084639da27bee183eeaadba0",
  "resource\\image\\vf202\\enter.png": "43b728abb252831b9309bd655a6ade86",
  "resource\\image\\vf202\\enter_b.png": "d15c73e1c6d60bc4e74f501c0eb00ff4",
  "resource\\image\\vf202\\ethernet.png": "7a6a8557200fe9ea9405fb5701797366",
  "resource\\image\\vf202\\ethernet_dark.png": "21febf0b45887830c68938fbc756a6b2",
  "resource\\image\\vf202\\eth_disable.png": "46def5850282186289fedcf3e1090ec1",
  "resource\\image\\vf202\\eth_enable.png": "c7e2883cdca3c31dfa5ce7b59a38dd95",
  "resource\\image\\vf202\\eye-fill.png": "f759a1d079b83215b7fdf8bde65ca6a9",
  "resource\\image\\vf202\\eye-off.png": "08232a8b9562ac218e5364bc1702635d",
  "resource\\image\\vf202\\eye_fill.png": "d40a644a0ecf10d29a5c3255e584729e",
  "resource\\image\\vf202\\eye_fill_show.png": "a9c69cb678a2face9eb5c6d74ea3e819",
  "resource\\image\\vf202\\face.png": "3ace44209c5a0972f0577fea245cc1f4",
  "resource\\image\\vf202\\faceAdd.png": "0d9521169bdf6134a77f0efe20a4f923",
  "resource\\image\\vf202\\faceEmpty.png": "0e7656faefc150c0a978dfac8e498c8d",
  "resource\\image\\vf202\\faceError.png": "5d8036a7cae3615be4dcb2087f63e626",
  "resource\\image\\vf202\\faceRec.png": "103012d8e17f980f91f37a00c246eae3",
  "resource\\image\\vf202\\faceRec2.png": "300f0aa222a85398f67c7e28273ef501",
  "resource\\image\\vf202\\factoryTest.png": "b3e8ae285f5f45675d3fa6f61446b01a",
  "resource\\image\\vf202\\failBg.png": "a1d3e65aa14f159f468ba8835639c131",
  "resource\\image\\vf202\\grey_btn.png": "1646b5420adf33ad1689af68c3062402",
  "resource\\image\\vf202\\help.png": "6728c869776d883015eba1fffcf90613",
  "resource\\image\\vf202\\idleImage.jpg": "e261f9d11ba192b9a318855198a82a72",
  "resource\\image\\vf202\\idleImage.png": "6642f66bb0278150beac1b7b9fd7cd73",
  "resource\\image\\vf202\\localUser.png": "46e06778952856e8805c39139128a3aa",
  "resource\\image\\vf202\\lock.png": "d845e9bb5e35713e514b40c79dd8df94",
  "resource\\image\\vf202\\menu_btn.png": "5bf26f61a5105bc20c9885679754ce1c",
  "resource\\image\\vf202\\mini_app.png": "1ca5b55edcdcc5a3fd63f6ca4c977648",
  "resource\\image\\vf202\\mini_background.png": "f7fa498fee57c3711d6824423665d6c3",
  "resource\\image\\vf202\\mini_config.png": "a0978038a399d5d12a08f8886c3925bc",
  "resource\\image\\vf202\\mini_password.png": "ab932304364b69d12884d019a178fe6a",
  "resource\\image\\vf202\\mqtt.png": "8ae57eb8159a7e262ff69e7f1a394d53",
  "resource\\image\\vf202\\mqtt_dark.png": "825ee7221785793dc3d70d685587bf8d",
  "resource\\image\\vf202\\network.png": "95f44b690704e449e8575950954e3d6f",
  "resource\\image\\vf202\\networkSetting.png": "f35618eddfc8409171159bdb0c0094f9",
  "resource\\image\\vf202\\network_dark.png": "6458359eb6eede7a43750a562c0c4ea2",
  "resource\\image\\vf202\\pwd_btn.png": "abee92156861b29fc866e9d4b73a5c42",
  "resource\\image\\vf202\\qrcode_small.png": "6d00a50369b5002f9c1e0b2f63419169",
  "resource\\image\\vf202\\recordQuery.png": "a51176f07c88fc740ca262c051fc31f6",
  "resource\\image\\vf202\\recQuery.png": "9667e8dff1cbd45c47fd179a390e8464",
  "resource\\image\\vf202\\rectangle.png": "0ad638ea5e599eba928210127349f72f",
  "resource\\image\\vf202\\register.png": "c3e3895f3eb275b924c682b12e1f4858",
  "resource\\image\\vf202\\right.png": "a0cf4963f9225509668bb4f4547fe1f2",
  "resource\\image\\vf202\\select_arrow.png": "f99d4833326933fc5979d1bef6ab13a3",
  "resource\\image\\vf202\\setting.png": "6d936d9331f9a16106f0956d63a43d9b",
  "resource\\image\\vf202\\setting32.png": "76b9637f7aece12d2ebb14684fe9a0c7",
  "resource\\image\\vf202\\space.png": "bdf92f0846c70e068872a62e64198a95",
  "resource\\image\\vf202\\successBg.png": "9b1cf2d0410a6c5b10802b0645d664bf",
  "resource\\image\\vf202\\success_fill.png": "7d95368d99dcd7bb86d26f9c488fc51c",
  "resource\\image\\vf202\\sysSettings.png": "cbd0b4362afbfb2f65df290e9fd5e0dd",
  "resource\\image\\vf202\\systemSetting.png": "ebffe5062a323f123cdb3ed61d0beae3",
  "resource\\image\\vf202\\sys_info.png": "9a22244032b537e10aefce4d751bf7a1",
  "resource\\image\\vf202\\tip_card.png": "3d2870619abcb67b3665c28bad20f68c",
  "resource\\image\\vf202\\trackFace.png": "ef2f257efcaeda212e148e7e74e88dae",
  "resource\\image\\vf202\\unlock.png": "221c28aa8d6ee43ac1fecb62ef59554d",
  "resource\\image\\vf202\\user.png": "46e06778952856e8805c39139128a3aa",
  "resource\\image\\vf202\\userGuide.png": "e1237d22454a3b32b47382eaea2ea3f6",
  "resource\\image\\vf202\\userMgmt.png": "8498f8a520f70a758c5f34f2b21d276d",
  "resource\\image\\vf202\\vip.png": "f41ac8a61926ee0cc7ce66a0ffae9d4f",
  "resource\\image\\vf202\\voiceBroadcast.png": "edf212a156202cbc40fb34f194a0d417",
  "resource\\image\\vf202\\wechat.png": "d02d045138c3ae125888acf01ef50642",
  "resource\\image\\vf202\\wifi.png": "cd0b8b70a30d25278896064e3ce20a79",
  "resource\\image\\vf202\\wifi_dark.png": "520131d4f1423fb6be242a7c193d952b",
  "resource\\image\\vf203\\4g.png": "e5b27ed5a596cb16c7ab695d82fe3014",
  "resource\\image\\vf203\\4g_dark.png": "414b3a9fcefd8ea6909158b51038d4d8",
  "resource\\image\\vf203\\accessCtrl.png": "6be30c8f648ec7153ae2c39a15884181",
  "resource\\image\\vf203\\add.png": "498480ce68e4d6047eb74d3aa5229f56",
  "resource\\image\\vf203\\advance.png": "d98aeb99a04163bce23b6c2638cd705a",
  "resource\\image\\vf203\\app.png": "b356136ee80e638afc0bd63b5fe058c8",
  "resource\\image\\vf203\\app_btn.png": "0630aeda9d5f294c1a8b4d5a4404e43d",
  "resource\\image\\vf203\\app_qrcode.png": "162225bafe2c27282b0f6330b05959f6",
  "resource\\image\\vf203\\arrow_right.png": "edc6876d6fa1e2d0be2e606c73e0f2ec",
  "resource\\image\\vf203\\back.png": "aa5869ff78051dbdc5f688f1805064da",
  "resource\\image\\vf203\\background.jpg": "75768189315c907532dda963d31b9ba0",
  "resource\\image\\vf203\\backspace.png": "26302e37dd8618e92c3a47d68039d0ec",
  "resource\\image\\vf203\\back_2.png": "b3f16ab01606d85c2c70124d50b3af1b",
  "resource\\image\\vf203\\basic.png": "84eedd84efdc5fdb54138dd29cf6fc41",
  "resource\\image\\vf203\\black_btn.png": "c66efd82b546bf991b1e231f89b71e9b",
  "resource\\image\\vf203\\card.png": "c05047d2ad6549db001d08790cb5d9ff",
  "resource\\image\\vf203\\close.png": "a5353c231df804fcc4577672ab3a4302",
  "resource\\image\\vf203\\close_small.png": "7d6cddddc38ce8d4950789169213add4",
  "resource\\image\\vf203\\cloudCert.png": "4481cfb9c2d1f44f0a0dd0489cb6fc2b",
  "resource\\image\\vf203\\commMgmt.png": "5cd157e1b8c82fdf9ddba1f6d5047b9b",
  "resource\\image\\vf203\\config.png": "feeed86aa53ad897dc851845f75ffc3e",
  "resource\\image\\vf203\\config_btn.png": "537ce58e033cdc5c42c85c431f7a16ff",
  "resource\\image\\vf203\\delete.png": "014bad6d9a94a133c58ef350e198101e",
  "resource\\image\\vf203\\delete_fill.png": "947fc08278354a1151d5599382c2c5f3",
  "resource\\image\\vf203\\developer.png": "07c619643647945294449fdfed486218",
  "resource\\image\\vf203\\deviceInfo.png": "3e40246e01c1f7eede4d76fcbba33825",
  "resource\\image\\vf203\\devInfo.png": "1a80aba6780a45f8775bdfdcff4df23a",
  "resource\\image\\vf203\\doorControl.png": "68993ef92bb8c6b2d0dab2c75cc7533d",
  "resource\\image\\vf203\\down.png": "c4d5c1883db4694ccedb7c1140d89da9",
  "resource\\image\\vf203\\empty.png": "91882cb65ac01e63f52e63a7e8a35cbb",
  "resource\\image\\vf203\\enter.png": "787e076256c8a47e07f2091a57585fb5",
  "resource\\image\\vf203\\enter_b.png": "02cb6c84fec128a639e3cf0828a6ee5f",
  "resource\\image\\vf203\\ethernet.png": "f3abb111d96a11a56f7ed77b21abab4c",
  "resource\\image\\vf203\\ethernet_dark.png": "10656303a6d22e204014f55ed0fb3efb",
  "resource\\image\\vf203\\eth_disable.png": "7017f5cc2c9b4f802f082f6c0f5bb581",
  "resource\\image\\vf203\\eth_enable.png": "84d1334e524ac669c3b79e8a69b41eb1",
  "resource\\image\\vf203\\eye-fill.png": "9ae71914bd47423be04d0a22eb4f3995",
  "resource\\image\\vf203\\eye-off.png": "295c3e8255ced50cf2667ecda524e11e",
  "resource\\image\\vf203\\eye_fill.png": "d0ac0d07f13e02e5fae7a12a0858ec49",
  "resource\\image\\vf203\\eye_fill_show.png": "265cf669797b94a138982c01c29d0bd9",
  "resource\\image\\vf203\\face.png": "4a3cab29dab637adc68625d143fe976d",
  "resource\\image\\vf203\\faceAdd.png": "573d86de2713d8ae420bc0a20ba859a4",
  "resource\\image\\vf203\\faceEmpty.png": "9ef3bd1d776183e203e69d5c91e4b129",
  "resource\\image\\vf203\\faceError.png": "972e08c5d3d83a85f14d5ccd3907569a",
  "resource\\image\\vf203\\faceRec.png": "f1bfcb61f4642c6c1bbc04856fb57905",
  "resource\\image\\vf203\\faceRec2.png": "cdadd31ad335195cbb67e05e698f3b31",
  "resource\\image\\vf203\\factoryTest.png": "4bdb36420046870efcabd4a040e31913",
  "resource\\image\\vf203\\failBg.png": "b448125e6a812a5dea92f873e5157407",
  "resource\\image\\vf203\\grey_btn.png": "b0ca6e44c0e01a17d0bdda5f7e057cc2",
  "resource\\image\\vf203\\help.png": "7d75da0510ca74870858a639882dc2ef",
  "resource\\image\\vf203\\idleImage.jpg": "75768189315c907532dda963d31b9ba0",
  "resource\\image\\vf203\\idleImage.png": "4292e1d6db684081b4a94fbb59bd8388",
  "resource\\image\\vf203\\localUser.png": "6429f43f7fee002d66d50a3d92a087da",
  "resource\\image\\vf203\\lock.png": "c1419aa2a9c9da4b7dbf3529a1af37f3",
  "resource\\image\\vf203\\menu_btn.png": "feeed86aa53ad897dc851845f75ffc3e",
  "resource\\image\\vf203\\mini_app.png": "33f0225311e7a4463e9d86c6eab3efdc",
  "resource\\image\\vf203\\mini_background.png": "620bf06dbfffe37f717b91fb3ed8ef40",
  "resource\\image\\vf203\\mini_config.png": "1b2be1c6686f627e86dd49abb0b32a14",
  "resource\\image\\vf203\\mini_password.png": "9a5013cd8f152d388a9b60e6ad2fdc12",
  "resource\\image\\vf203\\mqtt.png": "542ebc6bdbb66ea0f25cf29aeb9d264c",
  "resource\\image\\vf203\\mqtt_dark.png": "d4aab5adc128846c47a3b8bb015c757b",
  "resource\\image\\vf203\\network.png": "0a0119e3d5fce101b28575a4e44aaf7e",
  "resource\\image\\vf203\\networkSetting.png": "3e83d354e8293ed112fe7cc405b94187",
  "resource\\image\\vf203\\network_dark.png": "3c5f8ce5732e95ad613cdd41dc5adbc0",
  "resource\\image\\vf203\\pwd_btn.png": "c05557e93d0b23642cd506d82be8411a",
  "resource\\image\\vf203\\qrcode_small.png": "285bbe7e8f968c8bf4506a563dffcac2",
  "resource\\image\\vf203\\recordQuery.png": "d340255a0c2342382bff6f8c57f6376b",
  "resource\\image\\vf203\\recQuery.png": "1b8c58663a6e61f4f885e784ee4e87d4",
  "resource\\image\\vf203\\rectangle.png": "aad07a3c98dbc044765be57b7a95b2b9",
  "resource\\image\\vf203\\register.png": "7fa975d92007703532ba8011f2a0109f",
  "resource\\image\\vf203\\right.png": "a6f6bc770ad7a8220effcc96e750aaaa",
  "resource\\image\\vf203\\select_arrow.png": "9d82daa1092375abc413d581f36aaf2d",
  "resource\\image\\vf203\\setting.png": "92365fd93f2cfa63c7901ce3d8900a42",
  "resource\\image\\vf203\\setting32.png": "e531bf8a9ce7f6cf93a8ea9baf95377c",
  "resource\\image\\vf203\\space.png": "de9816e31308bd7ce187fe03ab634a37",
  "resource\\image\\vf203\\successBg.png": "dcdf9bc63a89fff478bdf6a2ded56d8d",
  "resource\\image\\vf203\\success_fill.png": "09166b0cd4da44b76b4f6cdc2c550103",
  "resource\\image\\vf203\\sysSettings.png": "2607627249cd1c60619918793b3dd04f",
  "resource\\image\\vf203\\systemSetting.png": "9aee20d073df321250a5bbc57d16d5f1",
  "resource\\image\\vf203\\sys_info.png": "20dc23c019d07cd2c3ce32a160b7b63f",
  "resource\\image\\vf203\\trackFace.png": "5b60294444dab3fec931a2bf80bd1ebc",
  "resource\\image\\vf203\\unlock.png": "7b97b659c36d3ba4f435f44792b90a80",
  "resource\\image\\vf203\\user.png": "6429f43f7fee002d66d50a3d92a087da",
  "resource\\image\\vf203\\userGuide.png": "567e69e478c9470881f45bafbeb5e8de",
  "resource\\image\\vf203\\userMgmt.png": "5dad96f344513f970c2b582d7feb537d",
  "resource\\image\\vf203\\vip.png": "0e816b4860ee87ed1169154e3f0fc524",
  "resource\\image\\vf203\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106",
  "resource\\image\\vf203\\wechat.png": "55eac1cc3b6398113293b7025e25c450",
  "resource\\image\\vf203\\wifi.png": "fd668b648ac984ed92fad8e40e151283",
  "resource\\image\\vf203\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740",
  "resource\\image\\view_f.png": "4fbdda957ef2966bc4938990725d0246",
  "resource\\image\\view_s.png": "93ddad11d282c5a8f56233682290b38c",
  "resource\\image\\vip.png": "0e816b4860ee87ed1169154e3f0fc524",
  "resource\\image\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106",
  "resource\\image\\wifi.png": "fd668b648ac984ed92fad8e40e151283",
  "resource\\image\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740",
  "resource\\langPack.js": "956b0d902f723e4817319436ee7df117",
  "resource\\wav\\alarm.wav": "fe9d43cfb930f873973cc31fd6e8c132",
  "resource\\wav\\AR\\calibration_1s.wav": "a5ed7bdf10f5c0bec1f964cbaf8d7c59",
  "resource\\wav\\AR\\calibration_2s.wav": "1a533e06dd209b7b87d48947357a0ca0",
  "resource\\wav\\AR\\calibration_s.wav": "40ecad9f2eba8373c6d9060e0e04e2ed",
  "resource\\wav\\AR\\fingerF.wav": "1a8dabdb7bd80af25331217c5cb2a2f5",
  "resource\\wav\\AR\\fingerInput1.wav": "a66c8d4329462cf4d69f386f9c9f9739",
  "resource\\wav\\AR\\fingerInput2.wav": "2ee652221b5f1d1537b76347615d02b4",
  "resource\\wav\\AR\\fingerInput3.wav": "e68e282f25963ae83451c19fe4075958",
  "resource\\wav\\AR\\fingerR.wav": "564096e2700986fb5d284b550dc1849e",
  "resource\\wav\\AR\\fingerS.wav": "d39c8e14ec9518a8f29df1934b4a87b8",
  "resource\\wav\\AR\\fingerT.wav": "e741678c6bc7cb4a475ce16dafef4ffe",
  "resource\\wav\\AR\\read.wav": "3a053015f4a30814b33dc900d7f48f33",
  "resource\\wav\\AR\\recg_f.wav": "21dfe28f19a6be1c2a93f89f67d764f1",
  "resource\\wav\\AR\\recg_s.wav": "44759af10d2fba0fef6675c029bfb15e",
  "resource\\wav\\AR\\recognition.wav": "10b7198c357752c2f71093ece81def67",
  "resource\\wav\\AR\\recognition_s.wav": "4ef357ffe8d6ead5dde8e1a1b46f174d",
  "resource\\wav\\AR\\register.wav": "7a52494f55ef4ac161e24b35653bfa63",
  "resource\\wav\\AR\\stranger.wav": "f5e4baa2f88c81ab03783631f64798b7",
  "resource\\wav\\AR\\verify.wav": "7c8d730412feda278f5255ea2d504f41",
  "resource\\wav\\AR\\verify_f.wav": "8a75cb02a71a12c27db4aeeae26ea6fa",
  "resource\\wav\\AR\\verify_s.wav": "cb9c12b27047bcdcb7ac89c37a71ad9d",
  "resource\\wav\\CN\\calibration_1s.wav": "95be0f4e70b3e3ed788933a6adaac48c",
  "resource\\wav\\CN\\calibration_2s.wav": "dbd379708c7b4ee310ff8e5629c11e18",
  "resource\\wav\\CN\\calibration_s.wav": "41fd2b04f2320aec19139c70e321795f",
  "resource\\wav\\CN\\fingerF.wav": "932ad149b0290538c49f8208961e7bdb",
  "resource\\wav\\CN\\fingerInput1.wav": "4bcae26fdfef53f4f9a2c0223deb56ae",
  "resource\\wav\\CN\\fingerInput2.wav": "c0251f592f4c2570d1b760bde6c34b2a",
  "resource\\wav\\CN\\fingerInput3.wav": "88f54eca8add2ef122583fed9df4bab0",
  "resource\\wav\\CN\\fingerR.wav": "d597f3f0f968b868a896917354373922",
  "resource\\wav\\CN\\fingerS.wav": "4163dbe6607e35f1d12061c5edf4f9f4",
  "resource\\wav\\CN\\fingerT.wav": "428bea9dd8508f9321276eaeaa80a2ca",
  "resource\\wav\\CN\\read.wav": "d0e959a98c294882ac5ddd63762b32d9",
  "resource\\wav\\CN\\recg_f.wav": "9ec07057fa7deb60859ef1937f515df2",
  "resource\\wav\\CN\\recg_s.wav": "c0b3486c9eb370d259a5d1b188b9d481",
  "resource\\wav\\CN\\recognition.wav": "1adb5d50dd1f61d4e2e15ee859f1a838",
  "resource\\wav\\CN\\recognition_s.wav": "16ea2454fa95d57c5bad0bdb6fcd5386",
  "resource\\wav\\CN\\register.wav": "a811322b30389c915b3461f214958389",
  "resource\\wav\\CN\\stranger.wav": "3961f3192cbbd85c356037610726d9cb",
  "resource\\wav\\CN\\verify.wav": "36202c8c9f111fea718b536526098d4c",
  "resource\\wav\\CN\\verify_f.wav": "f0429d7fb4a04c4c797a8b7bcbe45577",
  "resource\\wav\\CN\\verify_s.wav": "cabb8f2b1cb7be25a18222e7b108f208",
  "resource\\wav\\DE\\calibration_1s.wav": "52e28bd12e4376a0de8f2f8dfeeb3f8a",
  "resource\\wav\\DE\\calibration_2s.wav": "121458873a5ea7999e6e859ca705a90e",
  "resource\\wav\\DE\\calibration_s.wav": "5fa56f1ac0df95c5fa21d3c97283dee2",
  "resource\\wav\\DE\\fingerF.wav": "c7fdcf59eaf7e2eb1f7e0983c604a7af",
  "resource\\wav\\DE\\fingerInput1.wav": "9519473165bf28c615f9b68bb4613909",
  "resource\\wav\\DE\\fingerInput2.wav": "b127650142eed76f25df1b2802803b47",
  "resource\\wav\\DE\\fingerInput3.wav": "318e963b18d9d69e7de60e87536d7544",
  "resource\\wav\\DE\\fingerR.wav": "238541066f5a5e269ec3bdfeae70ca18",
  "resource\\wav\\DE\\fingerS.wav": "a616ec675a53124438592cdcaaf6bb9d",
  "resource\\wav\\DE\\fingerT.wav": "9717d2422c6233b901fecba0f3b6f219",
  "resource\\wav\\DE\\read.wav": "411c8189b9317faf448d1ff74e5c8029",
  "resource\\wav\\DE\\recg_f.wav": "6055910c9079ddcd6ce9b94940729bcb",
  "resource\\wav\\DE\\recg_s.wav": "15b60814216d9786606dec148a683227",
  "resource\\wav\\DE\\recognition.wav": "0ef18cb9387fbd7ad2a2a17e4c39a4c6",
  "resource\\wav\\DE\\recognition_s.wav": "d604c7898d99292bc0880611ea790876",
  "resource\\wav\\DE\\register.wav": "dd310e24cfb6de7396f4c5ac1f97e9a0",
  "resource\\wav\\DE\\stranger.wav": "bee4570c4eab0604302469a0b458f6ee",
  "resource\\wav\\DE\\verify.wav": "345845ebd135af196e50c476eaeed831",
  "resource\\wav\\DE\\verify_f.wav": "6a565e48d9369dd20ca2a29d548a4ade",
  "resource\\wav\\DE\\verify_s.wav": "8ac44273c3c639b2f0a9abb14599664a",
  "resource\\wav\\EN\\calibration_1s.wav": "921ee406cb5069069ba3e03d9d9b948d",
  "resource\\wav\\EN\\calibration_2s.wav": "06d4447bacec83ae524d544e64b269a6",
  "resource\\wav\\EN\\calibration_s.wav": "c0dcf35be40779f8925e332b3b8efc85",
  "resource\\wav\\EN\\fingerF.wav": "510d14814a14e2cd331d0065423f5785",
  "resource\\wav\\EN\\fingerInput1.wav": "5c41614ad862b0b4b5d4719d2031521f",
  "resource\\wav\\EN\\fingerInput2.wav": "ea037a1332343280f87cfc66536a20ee",
  "resource\\wav\\EN\\fingerInput3.wav": "058ab61627bc6886346d0e8de043525a",
  "resource\\wav\\EN\\fingerR.wav": "11fe3281d28422191402630ea9d654f8",
  "resource\\wav\\EN\\fingerS.wav": "16398aadc67ff3977262c15f83c16612",
  "resource\\wav\\EN\\fingerT.wav": "72cd4670c8d86c1cab5d03706e98bd49",
  "resource\\wav\\EN\\read.wav": "8d29d22febaf903ff3177f6844def6bf",
  "resource\\wav\\EN\\recg_f.wav": "01ba9b3bb6216c28da18dd61e0f9488e",
  "resource\\wav\\EN\\recg_s.wav": "bb83312e643dfc896395f0d64dd71c68",
  "resource\\wav\\EN\\recognition.wav": "9e2d1c15eb5eb95f55864a2ddd9af4f6",
  "resource\\wav\\EN\\recognition_s.wav": "6edb8d0669ba7d82bf6e14c0490cfdd3",
  "resource\\wav\\EN\\register.wav": "4534ee5193306a8f75be48fdd9a42edc",
  "resource\\wav\\EN\\stranger.wav": "0e902f86cb3fe443eac4b756b4c1b1c5",
  "resource\\wav\\EN\\verify.wav": "e7f04238d896a0c7c2a3de8aad65beeb",
  "resource\\wav\\EN\\verify_f.wav": "abf0d48629397aba9a97109f9fedd087",
  "resource\\wav\\EN\\verify_s.wav": "935e88563857e8cade71bf558256842e",
  "resource\\wav\\ES\\calibration_1s.wav": "7bdabdb4dbee796cc2bb7aa9b071c859",
  "resource\\wav\\ES\\calibration_2s.wav": "c4262a41b7272816e49080d3616645ec",
  "resource\\wav\\ES\\calibration_s.wav": "0ed429d1bcedf413d77ba5b7770068cc",
  "resource\\wav\\ES\\fingerF.wav": "c4c938fea144e8def6798b1e487b7182",
  "resource\\wav\\ES\\fingerInput1.wav": "7c7f92d28442dd9d3d7161ab06da56a5",
  "resource\\wav\\ES\\fingerInput2.wav": "deef2ff30eddeefe95865db356e272ce",
  "resource\\wav\\ES\\fingerInput3.wav": "7c7f92d28442dd9d3d7161ab06da56a5",
  "resource\\wav\\ES\\fingerR.wav": "5d7bb888025f715db6683df774d3b6f9",
  "resource\\wav\\ES\\fingerS.wav": "92ed0560df2d4ea38919241501011ef8",
  "resource\\wav\\ES\\fingerT.wav": "d2f50e99b38d142dec28f6efc5989ed3",
  "resource\\wav\\ES\\read.wav": "6c0f153f8a95fc9053f25d8cff92ea2a",
  "resource\\wav\\ES\\recg_f.wav": "99536dea254832007f9b66461be00fc5",
  "resource\\wav\\ES\\recg_s.wav": "3b7fe279b7d99b8f15cb8b4e12d5e06f",
  "resource\\wav\\ES\\recognition.wav": "97e6ba9a65302ebed0561bed4ac7d0e1",
  "resource\\wav\\ES\\recognition_s.wav": "879a7e5721996f7c49deb0f479fcec79",
  "resource\\wav\\ES\\register.wav": "9e8e5c169b4417e0f070667cf6d6fd47",
  "resource\\wav\\ES\\stranger.wav": "d26faf4f830cc418cdb4bcd2344c9763",
  "resource\\wav\\ES\\verify.wav": "a5c501f02b699d7681537d33f913f007",
  "resource\\wav\\ES\\verify_f.wav": "deef2ff30eddeefe95865db356e272ce",
  "resource\\wav\\ES\\verify_s.wav": "c7d2f541fe970aec1515607ee1d71c05",
  "resource\\wav\\FR\\calibration_1s.wav": "90bc4bcc25cd05d00e01bc33bc25e044",
  "resource\\wav\\FR\\calibration_2s.wav": "822c2d270484e7330dcb3da58ab52479",
  "resource\\wav\\FR\\calibration_s.wav": "569513acc17ea14570c33144d02d88fa",
  "resource\\wav\\FR\\fingerF.wav": "2bbbf80c5343687aebfaa838bc38c381",
  "resource\\wav\\FR\\fingerInput1.wav": "18db34e42be799d8ef63ecd4ee880434",
  "resource\\wav\\FR\\fingerInput2.wav": "91ee1f94fdedf6797865f070346f6778",
  "resource\\wav\\FR\\fingerInput3.wav": "8e2e87765ae0389566d4319a22a4826d",
  "resource\\wav\\FR\\fingerR.wav": "1ecfd9d1c72a4eae2644306e0bd25aff",
  "resource\\wav\\FR\\fingerS.wav": "da70743ef141747fedde637c70ce93ec",
  "resource\\wav\\FR\\fingerT.wav": "4e01419987fa49b88a79a36aec7ec312",
  "resource\\wav\\FR\\read.wav": "77eb8c0ffe8b1e278bdb59f5f22c386f",
  "resource\\wav\\FR\\recg_f.wav": "a4e0c3cf167fa4db3e5eacf08ab0e287",
  "resource\\wav\\FR\\recg_s.wav": "56a17208c5af5f9cd82d0c4762c12c54",
  "resource\\wav\\FR\\recognition.wav": "d7961442cd6d0a233227be08df97014c",
  "resource\\wav\\FR\\recognition_s.wav": "6f41689362369dd66a5d91dae1df11a9",
  "resource\\wav\\FR\\register.wav": "64a3b9782abffd3264e0a42a59aed4c2",
  "resource\\wav\\FR\\stranger.wav": "c5bdaee5595fd3f2fb7b43b64854965c",
  "resource\\wav\\FR\\verify.wav": "98f91f55b0e363a4ff5147a38ec7a142",
  "resource\\wav\\FR\\verify_f.wav": "2dd839c1fce3797a94488fd04b0a6b6d",
  "resource\\wav\\FR\\verify_s.wav": "670eac29b52aa9648c04ec00a4bdc53a",
  "resource\\wav\\KO\\.DS_Store": "194577a7e20bdcc7afbb718f502c134c",
  "resource\\wav\\KO\\calibration_1s.wav": "7402d18dab54f254b7fc632fa39fd975",
  "resource\\wav\\KO\\calibration_2s.wav": "ea767fb11a3ea7c5e4979645ea1b290f",
  "resource\\wav\\KO\\calibration_s.wav": "376e3a44b29864d1ced354796e1780d2",
  "resource\\wav\\KO\\fingerF.wav": "d22570bfe2b6f7da61db3814347da015",
  "resource\\wav\\KO\\fingerInput1.wav": "a0f3beaaf7da75825ebf96e3e63ff6a2",
  "resource\\wav\\KO\\fingerInput2.wav": "0e1f0069f6bea232d0b808bf68220a5f",
  "resource\\wav\\KO\\fingerInput3.wav": "af87f04def1fbe6fa2202a1c476ac38a",
  "resource\\wav\\KO\\fingerR.wav": "a2270f58b171bc065bd26a43df22ab19",
  "resource\\wav\\KO\\fingerS.wav": "4351453d76fd352be3771a425d13bbb8",
  "resource\\wav\\KO\\fingerT.wav": "6ebeba178719d5e0f50d3b09f047f383",
  "resource\\wav\\KO\\read.wav": "b6bc10805b392d0310a79eea741e3b3f",
  "resource\\wav\\KO\\recg_f.wav": "681345dd730860770e22689191f1d96a",
  "resource\\wav\\KO\\recg_s.wav": "88b56cc7c059666edbdb0ce81b8c3c04",
  "resource\\wav\\KO\\recognition.wav": "9454b2d82ad2d3513dafb355edc025f2",
  "resource\\wav\\KO\\recognition_s.wav": "9398a4b31d5d2d1e3b10f04620a30dae",
  "resource\\wav\\KO\\register.wav": "58cb13509719da302a3d431a59a68f5c",
  "resource\\wav\\KO\\stranger.wav": "523d5eae87864b41350bf39829c53e76",
  "resource\\wav\\KO\\verify.wav": "68c67283487bed689fb7d8567d5485e3",
  "resource\\wav\\KO\\verify_f.wav": "e3de3c0fa0cfe2484e4b38c8269920cc",
  "resource\\wav\\KO\\verify_s.wav": "8f6c8a4ecebd44941260a08ad3a4dd72",
  "resource\\wav\\PT\\calibration_1s.wav": "da58062f0e45ebd7bbecb126b2d453ce",
  "resource\\wav\\PT\\calibration_2s.wav": "5a92af498230aa4ba882fee5857cc73f",
  "resource\\wav\\PT\\calibration_s.wav": "b926e31a78516b46d1dcf7a1f62c6cf8",
  "resource\\wav\\PT\\fingerF.wav": "9d6f7c11fd9393547cb1feb72b8f06a7",
  "resource\\wav\\PT\\fingerInput1.wav": "b2d2e38d58c4b86f4b2537647aabe446",
  "resource\\wav\\PT\\fingerInput2.wav": "75f1d97cd779f2cb890efda812254dd3",
  "resource\\wav\\PT\\fingerInput3.wav": "d446e2f562b509d806f1b8862d1d9b55",
  "resource\\wav\\PT\\fingerR.wav": "f1786c3dc3a0683aeef6d26062f12ed1",
  "resource\\wav\\PT\\fingerS.wav": "6c6ad480079a51836c06cbcad0306289",
  "resource\\wav\\PT\\fingerT.wav": "15b6fc875a46ef3a81facda5b225510a",
  "resource\\wav\\PT\\read.wav": "dd63196f7cb81caf949d1c46db597e9e",
  "resource\\wav\\PT\\recg_f.wav": "92746b018b29bcfd7cb2caf841d32025",
  "resource\\wav\\PT\\recg_s.wav": "0244bd357d573aabae6e3143e4093b52",
  "resource\\wav\\PT\\recognition.wav": "02887b41858dd3ad6872ef666cda6b21",
  "resource\\wav\\PT\\recognition_s.wav": "de2f118f324fb6754442233cc7bd9163",
  "resource\\wav\\PT\\register.wav": "a821a9a578db5bc0a21c9d508f05154a",
  "resource\\wav\\PT\\stranger.wav": "0d94a14857ddbbb9ec2f49da4308ce3e",
  "resource\\wav\\PT\\verify.wav": "5d30cc1dfb9f198e3e35b969728e3370",
  "resource\\wav\\PT\\verify_f.wav": "eb745523f398a46a6bb6e7bd61ae0fbb",
  "resource\\wav\\PT\\verify_s.wav": "cce663087a3a629b6e57f1e70f8d7965",
  "resource\\wav\\RU\\calibration_1s.wav": "345845ebd135af196e50c476eaeed831",
  "resource\\wav\\RU\\calibration_2s.wav": "70e991ab0ac7b41f3307beda62326154",
  "resource\\wav\\RU\\calibration_s.wav": "00b75e1fcffec26c49b5b7c7a24f4c43",
  "resource\\wav\\RU\\fingerF.wav": "0b73f3a06b522b76ec6ef7ee76395813",
  "resource\\wav\\RU\\fingerInput1.wav": "077b12f4ddabc15ecfad1e5d8802414b",
  "resource\\wav\\RU\\fingerInput2.wav": "1da2108ea08bbc05af7a785ef58fd664",
  "resource\\wav\\RU\\fingerInput3.wav": "7ba5db75cb9542f03eda5095d7a23572",
  "resource\\wav\\RU\\fingerR.wav": "9758966564082624bce1d39433ed3f7a",
  "resource\\wav\\RU\\fingerS.wav": "f1146d690c62e8a8b890fe88f443f082",
  "resource\\wav\\RU\\fingerT.wav": "1a61470775f82c3d11868d260fe89a24",
  "resource\\wav\\RU\\read.wav": "73f492713c7b86645be69f31d1a20ed3",
  "resource\\wav\\RU\\recg_f.wav": "1e16e083ba2b7ed7bd21939c7999346a",
  "resource\\wav\\RU\\recg_s.wav": "7f279071d927beb26abe377ac82a8287",
  "resource\\wav\\RU\\recognition.wav": "8ad03ac16ae29e541aa75a8c73fe89c3",
  "resource\\wav\\RU\\recognition_s.wav": "f7ea28dab9f7b655cb12e82611432619",
  "resource\\wav\\RU\\register.wav": "61ad2813fd80f3e96f919df598660260",
  "resource\\wav\\RU\\stranger.wav": "b2cc134c9efa67d19b614fa79a1f9d08",
  "resource\\wav\\RU\\verify.wav": "7065f2418c31d521d57ca1a257227036",
  "resource\\wav\\RU\\verify_f.wav": "1da2108ea08bbc05af7a785ef58fd664",
  "resource\\wav\\RU\\verify_s.wav": "5f327d4e695ffec7c3d372a35b7c2c6d",
  "resource\\wav\\success.wav": "1e9b06bd363e891ad7ed19c74edcd2ce",
  "resource\\wav\\tamper.wav": "5be9a5cebd6bb26b6b3020b461600fde",
  "resource\\web\\config.js": "3d7861b269daebe064e3173ad305ae23",
  "resource\\web\\css\\app.7043d6da.css": "999a87106e2755763dd81279b6025992",
  "resource\\web\\css\\chunk-vendors.6b92dc4c.css": "e1ec7b3d258707dfa59963f29e6f8e75",
  "resource\\web\\favicon.ico": "1ba2ae710d927f13d483fd5d1e548c9b",
  "resource\\web\\fonts\\element-icons.535877f5.woff": "535877f50039c0cb49a6196a5b7517cd",
  "resource\\web\\fonts\\element-icons.732389de.ttf": "732389ded34cb9c52dd88271f1345af9",
  "resource\\web\\img\\bg.a32161db.png": "a32161dbd9d76983f1abc8e6de118629",
  "resource\\web\\img\\iconfont.675b1cb4.svg": "675b1cb40e0ad004e651cbf410d8c9b9",
  "resource\\web\\index.css": "00f3e0e219f286a00a28b72e0f398238",
  "resource\\web\\index.html": "1edc8246781c3c3bc7f200446d94817c",
  "resource\\web\\js\\app.da6752e9.js": "fce7a868ce64badaf7742f7cfe6bd6b8",
  "resource\\web\\js\\app.da6752e9.js.map": "10ba9093ac4c8ad8f829906bf188230c",
  "resource\\web\\js\\chunk-vendors.303b1624.js": "3f495d9202748c1e070016b1af602295",
  "resource\\web\\js\\chunk-vendors.303b1624.js.map": "1b58852183ab5b6ba073c10171483108",
  "src\\common\\consts\\configConst.js": "54c90a4a5470745f5505b6b283ab8746",
  "src\\common\\utils\\codeUtils.js": "749f60e6b75b7dfa7be62b4ed9c873b5",
  "src\\common\\utils\\netUtils.js": "34da771eb84bbb2d0f7085a1af85d132",
  "src\\common\\utils\\stringUtils.js": "425d9cd0390ab8a60f1507544c2cb00a",
  "src\\common\\utils\\tokenUtil.js": "b7abd3698644aadb7d3e936fb6f7fc8b",
  "src\\common\\utils\\utils.js": "bbee074a060e962a570dddc4d586504d",
  "src\\config.json": "6619f6367ac0230030de3131160a2178",
  "src\\controller.js": "3ca7b098eaf218df5e911fea64113d11",
  "src\\driver.js": "94ef548d913eb6ba832e87e1748f2bc2",
  "src\\main.js": "e5958b02098ba5d92c159970c2e9bd63",
  "src\\screen.js": "b8a256f4f3ba51b4c1e49fcb69e06b28",
  "src\\service\\accessService.js": "304718a9a06ded28947373c3d9a21295",
  "src\\service\\api.js": "def5b52441ccc827913a73478cc7c32a",
  "src\\service\\codeService.js": "e3f53b983c37a91d85a3de95fab7745d",
  "src\\service\\configService.js": "d1c3c533c1d451c2eaf46758b4efeb19",
  "src\\service\\faceService.js": "cfc3cf7d510f2ba6d6fcedb1251e0795",
  "src\\service\\fingerService.js": "0fee47e46ded411c2da21eb508d8f9ba",
  "src\\service\\gpiokeyService.js": "7aeb81b1577df935f147f3817a0a144b",
  "src\\service\\grainService.js": "3ec28482d55059fd09d091145fad041c",
  "src\\service\\httpService.js": "567d6f52d5392e3d95a54264e631944e",
  "src\\service\\mqttService.js": "eafd4b82b1d5a7d02b32d046bf492ac9",
  "src\\service\\nfcService.js": "fff19d7f08d3a499455ed93a5376c0fd",
  "src\\service\\sqliteService.js": "9dd93a7afd36b50e6be015e950aaff83",
  "src\\service\\uartBleService.js": "f8816894598283c7114b4d8708bb65aa",
  "src\\service\\uartCodeService.js": "ed1952645c055885c78bc6c02699906f",
  "src\\service\\weComService.js": "14896c15403107f7225fce6db9b8a049",
  "src\\services.js": "426d898a09de0fcc61d6fc644052b51e",
  "src\\view\\appView.js": "6bab5f16cbafe492d277948b144529ba",
  "src\\view\\config\\configView.js": "9f89bd5efb5060c2dea799e684c8a460",
  "src\\view\\config\\identityVerificationView.js": "6f4eece1b8021b0beb7ff9ac4315efff",
  "src\\view\\config\\menu\\cloudCertView.js": "089fda3f32cc72c07ffc1f76fa98ac06",
  "src\\view\\config\\menu\\developer\\capcalView.js": "eb3a2b6b8f4546b71471ae06fbf32741",
  "src\\view\\config\\menu\\developerView.js": "a6ae2941432970908f887bd20807f1ff",
  "src\\view\\config\\menu\\deviceInfo\\dataCapacityInfoView.js": "81fbf258e0ba70c126f850658981469e",
  "src\\view\\config\\menu\\deviceInfo\\systemInfoView.js": "95a96c6d8586410be1fe085dfa61db9f",
  "src\\view\\config\\menu\\deviceInfoView.js": "b703a2f9053c1b089294b3dffdf6a449",
  "src\\view\\config\\menu\\doorControlView.js": "2b29eff26537ab92171a40110b8e8c0e",
  "src\\view\\config\\menu\\helpView.js": "b3cf2078efe3a274740276b550b68b63",
  "src\\view\\config\\menu\\localUser\\faceEnterView.js": "f6dc4e020a4eddba902820d4b2444ee3",
  "src\\view\\config\\menu\\localUser\\fingerApplyView.js": "b2b5a46109f7ac768ae6d18131a33fbe",
  "src\\view\\config\\menu\\localUser\\fingerEnterView.js": "46dd45fe0e8d06410a5f2bcbeb7be5ad",
  "src\\view\\config\\menu\\localUser\\localUserAddView.js": "8266626bf9cadde968e2b439ef9073b0",
  "src\\view\\config\\menu\\localUserView.js": "f7881e4a47fe06648d0934f286d59775",
  "src\\view\\config\\menu\\networkSettingView.js": "7cb7b7ef6c1d49f819f509de43e49a56",
  "src\\view\\config\\menu\\recordQuery\\recordQueryDetailView.js": "79e15d726de5146bab15a3dba533a82b",
  "src\\view\\config\\menu\\recordQueryView.js": "f640c2f2d560213c44633d7ea36c6960",
  "src\\view\\config\\menu\\systemSetting\\displaySettingView.js": "1a376eaccd07b12bd80773be83e080fc",
  "src\\view\\config\\menu\\systemSetting\\faceRecognitionSettingView.js": "8ac866907bd817d51cde8d757e33b852",
  "src\\view\\config\\menu\\systemSetting\\passLogSettingView.js": "b3fb57b54b5079075c331aceab74a052",
  "src\\view\\config\\menu\\systemSetting\\passwordManagementView.js": "720e32768be124d5591cc0914c9ba340",
  "src\\view\\config\\menu\\systemSetting\\passwordOpenDoorSettingView.js": "a56728c84d37129fbae06c3a23b01092",
  "src\\view\\config\\menu\\systemSetting\\swipeCardRecognitionSettingView.js": "d23ab8015ac4dc7f316fc7ca4b852f6f",
  "src\\view\\config\\menu\\systemSetting\\timeSettingView.js": "7c5744868ad7e40b3d9ce0708e3f7b85",
  "src\\view\\config\\menu\\systemSettingView.js": "91aa4b58c5da0ba01e7a56ee348fee11",
  "src\\view\\config\\menu\\voiceBroadcastView.js": "b985213b271e8e8019d3a5697f2a402c",
  "src\\view\\config\\newPwdView.js": "9313a7399dcab5eff76b26dad4dbab99",
  "src\\view\\emergencyPwdView.js": "db0fc9252e9e897fce33dbe3314963d0",
  "src\\view\\gasDetailView.js": "e7f705f9b89459726064e51d57ed9d7c",
  "src\\view\\i18n.js": "94f43798d35026189125bf2534d1bffd",
  "src\\view\\idleView.js": "a1a6f9fb0ec44c59330a7461298aec46",
  "src\\view\\mainView.js": "0c49e5905a87a5cfd33062df8531e421",
  "src\\view\\pinyin\\dict.js": "a7812c30b956099fd248271ad6fd5ac9",
  "src\\view\\pinyin\\pinyin.js": "84e7c2ac116f5c22cf07b563ba230c68",
  "src\\view\\pwdView.js": "e46813353af5b4cd9f9b776328aa1987",
  "src\\view\\topView.js": "de69270ae02a9893902b453f184eb070",
  "src\\view\\viewUtils.js": "3d99a33880bd45247740e528f3bc8610",
  "src\\view\\wechatBindView.js": "6d0239d71de3c1cf4c2e0817cd65ce3f",
  "src\\view\\wechatFaceView.js": "65f5edfbe0ef402c66bd62bd3eebec49",
  "src\\view\\wechatNetView.js": "84d8dd397ed6483a25ab99174e652362",
  "src\\worker\\mqttWorker.js": "2dda93d129f1edd9f8a52aceddb0079d",
  "src\\worker\\netWorker.js": "e38b00c21c77dc5b98425f12068f85ff",
  "src\\worker\\passRecordWorker.js": "ad27fa58b7de2b8155bb3517e601bef4",
  "src\\worker\\screenWorker.js": "57a6f54f05c57e186e44892c97e36647"
}
vf107/.temp/md5snew.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2721 @@
{
  "app.dxproj": "0029df84b57cdffbbc22d546e0e41eed",
  "dxmodules\\crypto-es\\aes.js": "f5051ae3e240e86f1462fa124c91e34d",
  "dxmodules\\crypto-es\\blowfish.js": "a6a17efb551cdd4dea32a0248c7301eb",
  "dxmodules\\crypto-es\\cipher-core.js": "e7c981251689145cfd8e1cd8fc706530",
  "dxmodules\\crypto-es\\core.js": "aff6ed577b1afec6b04d68e7dce1d71a",
  "dxmodules\\crypto-es\\enc-base64.js": "017d46c5dad13cade58c2cac1d6f5edf",
  "dxmodules\\crypto-es\\enc-base64url.js": "02a7c1b1bfa56f15696ad4cade9efcac",
  "dxmodules\\crypto-es\\enc-utf16.js": "6175f56d0133cb3c253fc33d37943496",
  "dxmodules\\crypto-es\\evpkdf.js": "b3dd824edce293775623ec11d698934c",
  "dxmodules\\crypto-es\\format-hex.js": "192580e6589e2f9e5e6d2421ef970228",
  "dxmodules\\crypto-es\\hmac.js": "b3e954bba3c4d3758c556eabb9f07a4f",
  "dxmodules\\crypto-es\\index.js": "1ab9991ea80626fc1f48b8d20d91146a",
  "dxmodules\\crypto-es\\md5.js": "22b9bf748f4874efced6f24843d9717d",
  "dxmodules\\crypto-es\\mode-cfb.js": "dc945b79189a16a04fb8809cb1ac63ae",
  "dxmodules\\crypto-es\\mode-ctr-gladman.js": "985134d79f545e9090b832dd8790bdcb",
  "dxmodules\\crypto-es\\mode-ctr.js": "8aaf3891ab740c008923c8f6a1a404cc",
  "dxmodules\\crypto-es\\mode-ecb.js": "0c6483c6b907719823c2a20168555654",
  "dxmodules\\crypto-es\\mode-ofb.js": "60db86b4aa9f698949093c6c234b9584",
  "dxmodules\\crypto-es\\pad-ansix923.js": "eafdac5e3d4c90c273f1c34ee39f5f95",
  "dxmodules\\crypto-es\\pad-iso10126.js": "80893798281a09346db1ffebd9550da0",
  "dxmodules\\crypto-es\\pad-iso97971.js": "50bb9404565dcdd2e7007b8a226d2d05",
  "dxmodules\\crypto-es\\pad-nopadding.js": "8a873480d9df86d8a04d382ddbe31b3a",
  "dxmodules\\crypto-es\\pad-zeropadding.js": "2a2ad73f1e17617337c3e498c3b1b145",
  "dxmodules\\crypto-es\\pbkdf2.js": "effcee485c8753470be8737e6e86e203",
  "dxmodules\\crypto-es\\rabbit-legacy.js": "580adab56a5e75aa7fa71ce7a79baeca",
  "dxmodules\\crypto-es\\rabbit.js": "79323a58e0aa1df18d3c6920ea2bff94",
  "dxmodules\\crypto-es\\rc4.js": "c76f35711e13d143f36b3c3032926aba",
  "dxmodules\\crypto-es\\README.md": "f7f10d1eb7ac11ab28105200455e9dc8",
  "dxmodules\\crypto-es\\ripemd160.js": "8321142c9245a95ff86519b0564e04c9",
  "dxmodules\\crypto-es\\sha1.js": "20f5f5895e00141cbba984369cc85677",
  "dxmodules\\crypto-es\\sha224.js": "a022faef3a3261f2ef46aad689868663",
  "dxmodules\\crypto-es\\sha256.js": "b56fc502be36fd7748191ef2ab848aa1",
  "dxmodules\\crypto-es\\sha3.js": "1e8ad2a56cf2900bcb2f92ae118a8f10",
  "dxmodules\\crypto-es\\sha384.js": "761d6fdde71581343ac4ea0b15ebc95d",
  "dxmodules\\crypto-es\\sha512.js": "1b90fae85bb88280ddc0603be4c9ff9a",
  "dxmodules\\crypto-es\\tripledes.js": "90b881b6a598aab6861b2537c147b3f7",
  "dxmodules\\crypto-es\\x64-core.js": "9cb085fad93878dd85edaaa37aa1e4b5",
  "dxmodules\\dxAudio.js": "13780dfd75bbf177bf1f242196f671df",
  "dxmodules\\dxBase64.js": "7cb517ecd99830dde0ec13a501e831ea",
  "dxmodules\\dxCamera.js": "2e74003e95eb396effb2426fc5db9e04",
  "dxmodules\\dxCapcal.js": "c56a3ef1feda15e9da6e39d8f0fdb528",
  "dxmodules\\dxChannel.js": "f6939b18d179587910904dc37a3b88e6",
  "dxmodules\\dxCommon.js": "7face5a0721bd302d666b12c30a17166",
  "dxmodules\\dxCommonUtils.js": "9d408cedb29cce9838c10ae5d1a8c2aa",
  "dxmodules\\dxConfig.js": "24072559b3cb1ec5c206cb358eaaaaae",
  "dxmodules\\dxDisplay.js": "5c80ee7de62e3f7b08eed6e3e0a8b3c1",
  "dxmodules\\dxDriver.js": "1e27304f7ecc691ac66293cd065e6a14",
  "dxmodules\\dxEventBus.js": "075ac9f2d465c92a9446ea07a6e2bfe6",
  "dxmodules\\dxFacial.js": "08f40369fd06cb3f5f69cd035d4ecab2",
  "dxmodules\\dxFacialBarcode.js": "67508897203cf7382f4bb20c4044dc17",
  "dxmodules\\dxFingerMz.js": "4e2d6794d3a5c38dfcf80f24b4d9f8e6",
  "dxmodules\\dxFingerZaz.js": "47463d6c6ee81f2373df95fe3638ab9c",
  "dxmodules\\dxGpio.js": "30c34469e2dc8d80026fc5eac5bfd1f7",
  "dxmodules\\dxGpioKey.js": "3877f16ccf0987cd491adbf2f8f97f2e",
  "dxmodules\\dxHttp.js": "fa75a0a2951399fb5af7618d7ab4c6f1",
  "dxmodules\\dxHttpClient.js": "0f81691b2405d87e8fa230e1223f7b78",
  "dxmodules\\dxHttpServer.js": "bd66e578dcbe66934548c2a52aa56ab0",
  "dxmodules\\dxLogger.js": "be5516b1419e1e6c98947196cd4c5df1",
  "dxmodules\\dxMap.js": "61c9b76b7e05e4e8bebeccd1dfaaa963",
  "dxmodules\\dxMqttClient.js": "d18248384c1ecee412c1f1ba86c233ac",
  "dxmodules\\dxNetwork.js": "e377baf713245bf54012d56ea15b48d2",
  "dxmodules\\dxNfc.js": "feb5bc21d4b13ab9736de1941290312d",
  "dxmodules\\dxNfcCard.js": "689161d840c1ee82107e55b3e43da5c3",
  "dxmodules\\dxNtp.js": "54a83064faa67f8f4991e1da56a3caf4",
  "dxmodules\\dxOs.js": "8171120055734e75dd6c878862ae965a",
  "dxmodules\\dxOta.js": "a4bf84aaead7298c5da10161644f2b1f",
  "dxmodules\\dxPwm.js": "d8238b43ef7c0d77a33108290394e12c",
  "dxmodules\\dxQrRule.js": "bfa9e2b4725c4fa358a2988f63c67210",
  "dxmodules\\dxSqliteDB.js": "4762a29fb74d837d43d1d19415f77536",
  "dxmodules\\dxStd.js": "322e8885cd0c7d2d9137b47fec8c8b00",
  "dxmodules\\dxTimeZones.js": "c05c66e1fc1dfea0aca722f148190148",
  "dxmodules\\dxUart.js": "0cb032a9f73a894b601ff7fef1c648e7",
  "dxmodules\\dxVgBle.js": "348e4999a1c77d85bfc962c6fbdcc742",
  "dxmodules\\dxWatchdog.js": "4833387ea9787b18a8c75a4ffc57b35e",
  "dxmodules\\dxWorkerPool.js": "77ec46afea15eac3ff99c41fb23f43ff",
  "dxmodules\\libasound.so.2": "c2cf01ef989d7e237b1d6fbc7e8dd864",
  "dxmodules\\libatopology.so.2": "f8ea786abf596b37cf4546aa451a6c46",
  "dxmodules\\libpaho-mqtt3cs.so.1": "87713197d248b22ee3dffe89f166d472",
  "dxmodules\\libvbar-b-dxgpio.so": "ca009351ab7d9719a71cd6105e9acba6",
  "dxmodules\\libvbar-b-dxpwm.so": "6d90f8d1171b16aa583a0c7fcc4f43a1",
  "dxmodules\\libvbar-drv-audio_gain.so": "2eec6e720acaee6c4328cb75f5ae11d1",
  "dxmodules\\libvbar-drv-capcal.so": "6236c6a52401d47047b4f34ad55f7e3d",
  "dxmodules\\libvbar-drv-capturer.so": "92a4e62761f88eaaa185782f790d0e43",
  "dxmodules\\libvbar-drv-display.so": "29349e3c7335720975018beb02401b79",
  "dxmodules\\libvbar-drv-face.so": "ed17b2951e8a72aced9a144bd90e3e89",
  "dxmodules\\libvbar-drv-gpio.so": "3f0abbaee2f972c4ed88fb0a6964e532",
  "dxmodules\\libvbar-drv-memory.so": "0ed48486e154f24d6681a0195a7525ad",
  "dxmodules\\libvbar-drv-pwm.so": "975d6cbb5529c3ddd2514653b4fbe4af",
  "dxmodules\\libvbar-drv-soc.so": "73e4b6657af4bcff0affaacf55702096",
  "dxmodules\\libvbar-drv-tts.so": "1b3893d2efb58a1ffbfb0fa42915e3c7",
  "dxmodules\\libvbar-drv-watchdog.so": "6226d1373d012eadeab2d0b895dd4367",
  "dxmodules\\libvbar-m-audio.so": "000a366ffd92abe7dfe0b8b656b7b8a9",
  "dxmodules\\libvbar-m-capturer.so": "8f0b6383db39494904294c3f60c5f013",
  "dxmodules\\libvbar-m-channel.so": "bcb6746b5325793eca68a29b63aa1217",
  "dxmodules\\libvbar-m-common.so": "b3821e6a3cb54a3afb3029ab1a7e68d6",
  "dxmodules\\libvbar-m-dxaudio.so": "3d4f148f8293a48e03d64320e511520b",
  "dxmodules\\libvbar-m-dxchannel.so": "3ba10035946cff6fbdffac07ef9df9cc",
  "dxmodules\\libvbar-m-dxcommon.so": "538dec5814f2e8f030813cd88bb0703f",
  "dxmodules\\libvbar-m-dxcommonutils.so": "c72011e82a558a4e84819645700ec879",
  "dxmodules\\libvbar-m-dxdisplay.so": "4de71b250645bcf8e63da84015976196",
  "dxmodules\\libvbar-m-dxfacial.so": "a401e8e0460a881d748bba0cf235a5a9",
  "dxmodules\\libvbar-m-dxhttpclient.so": "9d2ce48027e5afcb1e85b5703a5f1f53",
  "dxmodules\\libvbar-m-dxhttpserver.so": "7238d45c439402b79b696067b3eb2ec8",
  "dxmodules\\libvbar-m-dxkey.so": "e9efc4894bcd538c2a59d048ca57c70a",
  "dxmodules\\libvbar-m-dxmap.so": "d692e8e4ed4b1198f0a7f2f3eefd7865",
  "dxmodules\\libvbar-m-dxmqttclient.so": "9b7e75398a0f3d2bf138deead9221c46",
  "dxmodules\\libvbar-m-dxnetwork.so": "e4d4f8b955b9f871cf913607f0dd406a",
  "dxmodules\\libvbar-m-dxnfccard.so": "d7f14dddded1ffd89475f18a092c8530",
  "dxmodules\\libvbar-m-dxos.so": "b46dd08ab1769f5c246c284f83311294",
  "dxmodules\\libvbar-m-dxsqlitedb.so": "7581e5d8a56f6d9c23885e4ceb57e4a2",
  "dxmodules\\libvbar-m-dxuart.so": "e59a58bddafa0d7fa8d13387feb59946",
  "dxmodules\\libvbar-m-dxwatchdog.so": "9854b627923ad943b2b34250ba717505",
  "dxmodules\\libvbar-m-eid.so": "a4d1b2fa880f6d67e805dfca07f26523",
  "dxmodules\\libvbar-m-key.so": "a51d6ce68a66e21865a47cf5a350ce80",
  "dxmodules\\libvbar-m-net.so": "e058b3e454d27044d6544dbfe13a3254",
  "dxmodules\\libvbar-p-nfc.so": "1b3af2b46962720f8f13a7c275576049",
  "dxmodules\\libzbar.so": "dc72c4323c8b5616037b8ebf32740665",
  "dxmodules\\vbar_version": "ecaec8f34eac0b8b086a1638030427bc",
  "dxmodules\\vgUartWorker.js": "fc3e9e0051836d5063c0eecf555d9521",
  "dxmodules\\zoneinfo\\Africa\\Abidjan": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Accra": "6cb97bef390f7c65022c2e8c7eec45e0",
  "dxmodules\\zoneinfo\\Africa\\Addis_Ababa": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Algiers": "3342407b34291d264175caaf37813938",
  "dxmodules\\zoneinfo\\Africa\\Asmara": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Asmera": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Bamako": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Bangui": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Banjul": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Bissau": "af82ce73e5877a3dfd5c9dc93e869fa9",
  "dxmodules\\zoneinfo\\Africa\\Blantyre": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Brazzaville": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Bujumbura": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Cairo": "b9bb9d8c3cddc72252f4aa2082af4213",
  "dxmodules\\zoneinfo\\Africa\\Casablanca": "565d702c341dd4239a7e76208653c18c",
  "dxmodules\\zoneinfo\\Africa\\Ceuta": "5c2bf01f3f9fadcfa9a188e594f232e9",
  "dxmodules\\zoneinfo\\Africa\\Conakry": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Dakar": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Dar_es_Salaam": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Djibouti": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Douala": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\El_Aaiun": "b5acb6aaf433bd0dfe09d90fcc30c7e3",
  "dxmodules\\zoneinfo\\Africa\\Freetown": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Gaborone": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Harare": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Johannesburg": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\Africa\\Juba": "659ed8d529baf6f5043db708c1d17bee",
  "dxmodules\\zoneinfo\\Africa\\Kampala": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Khartoum": "021e36c906192435e0cb9c09440173a3",
  "dxmodules\\zoneinfo\\Africa\\Kigali": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Kinshasa": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Lagos": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Libreville": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Lome": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Luanda": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Lubumbashi": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Lusaka": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Malabo": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Maputo": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\Africa\\Maseru": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\Africa\\Mbabane": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\Africa\\Mogadishu": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Monrovia": "896a875aafa39c10b614c9803d1f2673",
  "dxmodules\\zoneinfo\\Africa\\Nairobi": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Africa\\Ndjamena": "a0aad5ca661653e362b8afc808dc85c1",
  "dxmodules\\zoneinfo\\Africa\\Niamey": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Nouakchott": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Ouagadougou": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Porto-Novo": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\Africa\\Sao_Tome": "06142521165cb91ddc40c1d9000c7038",
  "dxmodules\\zoneinfo\\Africa\\Timbuktu": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Africa\\Tripoli": "edec79f292e5b8c0d32b521af1f118bd",
  "dxmodules\\zoneinfo\\Africa\\Tunis": "4f1b4fe95a2512916e20c6f6e26d8e3c",
  "dxmodules\\zoneinfo\\Africa\\Windhoek": "6e9276508be4c6bfa224b9dddfefa61e",
  "dxmodules\\zoneinfo\\America\\Adak": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\America\\Anchorage": "596428a3a840d568656088bd48e608f1",
  "dxmodules\\zoneinfo\\America\\Anguilla": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Antigua": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Araguaina": "f41ab2d0a7a5b7fa0e3d3ac456b6bc97",
  "dxmodules\\zoneinfo\\America\\Argentina\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49",
  "dxmodules\\zoneinfo\\America\\Argentina\\Catamarca": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\America\\Argentina\\ComodRivadavia": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\America\\Argentina\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\America\\Argentina\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11",
  "dxmodules\\zoneinfo\\America\\Argentina\\La_Rioja": "00095a6391dda3fdca483ec5847abf2b",
  "dxmodules\\zoneinfo\\America\\Argentina\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870",
  "dxmodules\\zoneinfo\\America\\Argentina\\Rio_Gallegos": "b97bc475f57e6b72c5ef969ed629e144",
  "dxmodules\\zoneinfo\\America\\Argentina\\Salta": "ed7e059362f3ae6381c2390798b0d524",
  "dxmodules\\zoneinfo\\America\\Argentina\\San_Juan": "7c35305a9821e159720fae50b96790ca",
  "dxmodules\\zoneinfo\\America\\Argentina\\San_Luis": "3e91f210d3eedf4543a4b716a5ba504c",
  "dxmodules\\zoneinfo\\America\\Argentina\\Tucuman": "b58092fe8d0461c10f5c3153ad9ed653",
  "dxmodules\\zoneinfo\\America\\Argentina\\Ushuaia": "b1d065d0cd8358933796fe3f034d799a",
  "dxmodules\\zoneinfo\\America\\Aruba": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\America\\Asuncion": "09a3f0569913d138c4f5d8c0c97c055c",
  "dxmodules\\zoneinfo\\America\\Atikokan": "6b028d3f8073ba06f9467133f6a1a0dd",
  "dxmodules\\zoneinfo\\America\\Atka": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\America\\Bahia": "2f5dd75c9ee116e4ca290849dfff7a9f",
  "dxmodules\\zoneinfo\\America\\Bahia_Banderas": "6d24d30bc671042918ba397a15e6114c",
  "dxmodules\\zoneinfo\\America\\Barbados": "92550378b8952475d3bffe20b1168820",
  "dxmodules\\zoneinfo\\America\\Belem": "432beed5d93041f2b551051332d7d72e",
  "dxmodules\\zoneinfo\\America\\Belize": "da3145d79cba5f541dd261434e449173",
  "dxmodules\\zoneinfo\\America\\Blanc-Sablon": "4169ae15c5a1477cfe281fa7702bcc14",
  "dxmodules\\zoneinfo\\America\\Boa_Vista": "a98b8a6d614366047943d78bc1896acb",
  "dxmodules\\zoneinfo\\America\\Bogota": "cb5574ae9b01614c9e8c082039fe8147",
  "dxmodules\\zoneinfo\\America\\Boise": "45dce4d7ef2491d2450d16565f878b02",
  "dxmodules\\zoneinfo\\America\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49",
  "dxmodules\\zoneinfo\\America\\Cambridge_Bay": "048d33fc74c19008a5a440b8b226cb45",
  "dxmodules\\zoneinfo\\America\\Campo_Grande": "6e2912b5b855c5e6d39eeb1bcf19aea5",
  "dxmodules\\zoneinfo\\America\\Cancun": "a2fe4da50cfb1afe8a46d6f55b805afa",
  "dxmodules\\zoneinfo\\America\\Caracas": "a5bf9cdb87d451a4aabad61d4ce91a2b",
  "dxmodules\\zoneinfo\\America\\Catamarca": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\America\\Cayenne": "e9f3bdd863a3cf2127077a21e918b057",
  "dxmodules\\zoneinfo\\America\\Cayman": "843b6eadcdd7838269e2195df886ebf1",
  "dxmodules\\zoneinfo\\America\\Chicago": "d0f076c9f390e7d8a933cc7cc1ad2e90",
  "dxmodules\\zoneinfo\\America\\Chihuahua": "75c741bb811f4ee563ce05eb976e53a1",
  "dxmodules\\zoneinfo\\America\\Coral_Harbour": "6b028d3f8073ba06f9467133f6a1a0dd",
  "dxmodules\\zoneinfo\\America\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\America\\Costa_Rica": "2dec281340a45276b0799a3bec48b76b",
  "dxmodules\\zoneinfo\\America\\Creston": "dbf874c388dc236612025d145b46d868",
  "dxmodules\\zoneinfo\\America\\Cuiaba": "71d500778aa9de635b9438695cf8b61e",
  "dxmodules\\zoneinfo\\America\\Curacao": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\America\\Danmarkshavn": "20e68f0a941140b269efb3af346b1e34",
  "dxmodules\\zoneinfo\\America\\Dawson": "9c8e92765ad27141e3a56f6a31599c99",
  "dxmodules\\zoneinfo\\America\\Dawson_Creek": "f7955656cccdf253d996deb5bb4176ef",
  "dxmodules\\zoneinfo\\America\\Denver": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\America\\Detroit": "ae3ba6ed8738ceda9eef109c6c586736",
  "dxmodules\\zoneinfo\\America\\Dominica": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Edmonton": "1f23503189b8ce70677b2dcbb4a57e8c",
  "dxmodules\\zoneinfo\\America\\Eirunepe": "236e0fa8dd250599b2146a7a203a6ae4",
  "dxmodules\\zoneinfo\\America\\El_Salvador": "b77c5f52b45573ae0f5673ac0ca1b086",
  "dxmodules\\zoneinfo\\America\\Ensenada": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\America\\Fortaleza": "2e202e859552b09ad60cdc408de47c94",
  "dxmodules\\zoneinfo\\America\\Fort_Nelson": "8853bd10553d7ca5eb5f0b9c7af5a047",
  "dxmodules\\zoneinfo\\America\\Fort_Wayne": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\America\\Glace_Bay": "6ba1b7da532cefb6e32d083377b71303",
  "dxmodules\\zoneinfo\\America\\Godthab": "4a1f3fd710057cfeaf3e7ac964a18466",
  "dxmodules\\zoneinfo\\America\\Goose_Bay": "18a9d1af32911f30273fabcc694d9654",
  "dxmodules\\zoneinfo\\America\\Grand_Turk": "539dcee68a715238ef8aa5642a9b5214",
  "dxmodules\\zoneinfo\\America\\Grenada": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Guadeloupe": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Guatemala": "097638f469fdba70e9637561cffefd91",
  "dxmodules\\zoneinfo\\America\\Guayaquil": "bbe67886e74ffd7d1ed09a3481b5120c",
  "dxmodules\\zoneinfo\\America\\Guyana": "7fb63c484765baf41049bd41cfca0184",
  "dxmodules\\zoneinfo\\America\\Halifax": "820f35f23d49a527ffe813e2d96c5da7",
  "dxmodules\\zoneinfo\\America\\Havana": "1877fc45317e144ea206ddc622cebba2",
  "dxmodules\\zoneinfo\\America\\Hermosillo": "7bdce7a211e50eff3b5b8de21a46d581",
  "dxmodules\\zoneinfo\\America\\Indiana\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\America\\Indiana\\Knox": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\America\\Indiana\\Marengo": "541539f004b1b1722ac96e897d06ac45",
  "dxmodules\\zoneinfo\\America\\Indiana\\Petersburg": "82b5d3f05f88ac02cb5a4c3fb08fa191",
  "dxmodules\\zoneinfo\\America\\Indiana\\Tell_City": "dfe557585c608ee9e34e9b75fbe72617",
  "dxmodules\\zoneinfo\\America\\Indiana\\Vevay": "d0f3d93603268abdfeb402bbe0c3c0b3",
  "dxmodules\\zoneinfo\\America\\Indiana\\Vincennes": "d13258dc61c8a747a914396a56e4218c",
  "dxmodules\\zoneinfo\\America\\Indiana\\Winamac": "e6b915ae1c01b71fd7b42b00b4664029",
  "dxmodules\\zoneinfo\\America\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\America\\Inuvik": "4ea2c19a83f810220c7302c9914e4ee4",
  "dxmodules\\zoneinfo\\America\\Iqaluit": "4142e0b137ac6cf3fdad0fce11560ca1",
  "dxmodules\\zoneinfo\\America\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af",
  "dxmodules\\zoneinfo\\America\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11",
  "dxmodules\\zoneinfo\\America\\Juneau": "6276c692ca4f68dcb846d7e918ee23dd",
  "dxmodules\\zoneinfo\\America\\Kentucky\\Louisville": "99545115e4f688d7f573d38d667194d9",
  "dxmodules\\zoneinfo\\America\\Kentucky\\Monticello": "4041c24d41fbbd407e4d398824225d50",
  "dxmodules\\zoneinfo\\America\\Knox_IN": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\America\\Kralendijk": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\America\\La_Paz": "962d2f2486d3c16a6095390156e322b3",
  "dxmodules\\zoneinfo\\America\\Lima": "cc24c83127c28793afc54e43fe5766e4",
  "dxmodules\\zoneinfo\\America\\Los_Angeles": "9323ff44ce205ce1a1bad7e2dca39939",
  "dxmodules\\zoneinfo\\America\\Louisville": "99545115e4f688d7f573d38d667194d9",
  "dxmodules\\zoneinfo\\America\\Lower_Princes": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\America\\Maceio": "378a3e07cabc7773b6078025e9981793",
  "dxmodules\\zoneinfo\\America\\Managua": "4667d4aa7d530f1f61f5b116258eb84d",
  "dxmodules\\zoneinfo\\America\\Manaus": "585a0b598d406e6c0d710182bbdba35e",
  "dxmodules\\zoneinfo\\America\\Marigot": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Martinique": "ecdf79bbd2c17670a4637d06b01d7819",
  "dxmodules\\zoneinfo\\America\\Matamoros": "9ba17635ae8f44fa50c4565328433383",
  "dxmodules\\zoneinfo\\America\\Mazatlan": "2a157b818df8ab296baf6de38cd7d32b",
  "dxmodules\\zoneinfo\\America\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870",
  "dxmodules\\zoneinfo\\America\\Menominee": "c720185d11deb83ad58b22b118830261",
  "dxmodules\\zoneinfo\\America\\Merida": "91ebe16317802987c2cd9c567b6e4c2a",
  "dxmodules\\zoneinfo\\America\\Metlakatla": "02b06c27e6b6de8398ac263055a2d280",
  "dxmodules\\zoneinfo\\America\\Mexico_City": "cff58c6976849e1e8f94d4288b07b9d2",
  "dxmodules\\zoneinfo\\America\\Miquelon": "ac08a2e10dea976318846a7f7b254f26",
  "dxmodules\\zoneinfo\\America\\Moncton": "2fa9e016bc7e55f51d036a158a40e0e9",
  "dxmodules\\zoneinfo\\America\\Monterrey": "f77b22ac5e4f995ef8d4839835a54faa",
  "dxmodules\\zoneinfo\\America\\Montevideo": "51fb8d4c68e90f30d5eb1dd503bf202e",
  "dxmodules\\zoneinfo\\America\\Montreal": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\America\\Montserrat": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Nassau": "1444a5132c9a26f350ebe705760215c7",
  "dxmodules\\zoneinfo\\America\\New_York": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\America\\Nipigon": "365984faa12e0762dac780bf71204633",
  "dxmodules\\zoneinfo\\America\\Nome": "f9cb8bbe99e6143a75b2797ddf94f234",
  "dxmodules\\zoneinfo\\America\\Noronha": "a8562cc7d0e4555968ad7744dceb9d43",
  "dxmodules\\zoneinfo\\America\\North_Dakota\\Beulah": "59406487459534f8844f828b8356d083",
  "dxmodules\\zoneinfo\\America\\North_Dakota\\Center": "6964f42dc925648abaa448f18b330d46",
  "dxmodules\\zoneinfo\\America\\North_Dakota\\New_Salem": "c14a42a9b8d8571354c8ced6fa931eac",
  "dxmodules\\zoneinfo\\America\\Nuuk": "4a1f3fd710057cfeaf3e7ac964a18466",
  "dxmodules\\zoneinfo\\America\\Ojinaga": "95e6bee1cb146689410010d58e6ee974",
  "dxmodules\\zoneinfo\\America\\Panama": "843b6eadcdd7838269e2195df886ebf1",
  "dxmodules\\zoneinfo\\America\\Pangnirtung": "b71f8c6f5a9b289c981af0cdbf80f7e1",
  "dxmodules\\zoneinfo\\America\\Paramaribo": "2d11461cf62c48496eb9a866b3eb1712",
  "dxmodules\\zoneinfo\\America\\Phoenix": "c697bb02e057325a74547912f631a3a7",
  "dxmodules\\zoneinfo\\America\\Port-au-Prince": "27e4cb1b082cd694df8c1b2f27838f85",
  "dxmodules\\zoneinfo\\America\\Porto_Acre": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\America\\Porto_Velho": "63160b0eb1d694ae0f97644160eea68a",
  "dxmodules\\zoneinfo\\America\\Port_of_Spain": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Puerto_Rico": "b3feb20144b4070d5eff32dab8c8a160",
  "dxmodules\\zoneinfo\\America\\Punta_Arenas": "9c43769cae1008f7fd054e807960a9cd",
  "dxmodules\\zoneinfo\\America\\Rainy_River": "4bdb5a197d174ac4834b4e738340fdf6",
  "dxmodules\\zoneinfo\\America\\Rankin_Inlet": "902bc59be5586a60cf0c67188027f7c4",
  "dxmodules\\zoneinfo\\America\\Recife": "a9b9203d577c57c1cbf0873327336ac1",
  "dxmodules\\zoneinfo\\America\\Regina": "cec6491b350dfbdb74732df745eb37d3",
  "dxmodules\\zoneinfo\\America\\Resolute": "e272bb16aa765ea5439726dde6f283eb",
  "dxmodules\\zoneinfo\\America\\Rio_Branco": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\America\\Rosario": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\America\\Santarem": "31689ae81ac7aea65cc5784da4560e73",
  "dxmodules\\zoneinfo\\America\\Santa_Isabel": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\America\\Santiago": "b8db6707d0c4f0dfc7a12be81d35df8f",
  "dxmodules\\zoneinfo\\America\\Santo_Domingo": "7edb49f18d76f116c5578c3dcd279ade",
  "dxmodules\\zoneinfo\\America\\Sao_Paulo": "339ff8dbd88e39f59b2fd4ee57b1fdb1",
  "dxmodules\\zoneinfo\\America\\Scoresbysund": "1a5f6775efbfe9befc36df0a3d19c594",
  "dxmodules\\zoneinfo\\America\\Shiprock": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\America\\Sitka": "efa4e4969d3d0423dc3429a756921244",
  "dxmodules\\zoneinfo\\America\\St_Barthelemy": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\St_Johns": "79d938b80bf215c8e13d2cb4727343d8",
  "dxmodules\\zoneinfo\\America\\St_Kitts": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\St_Lucia": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\St_Thomas": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\St_Vincent": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Swift_Current": "c74726e554d359f38a26870282725f04",
  "dxmodules\\zoneinfo\\America\\Tegucigalpa": "963e88d190d129470f37774310dd20e4",
  "dxmodules\\zoneinfo\\America\\Thule": "32b5bb9f1f25d306246bd96a0ef317c4",
  "dxmodules\\zoneinfo\\America\\Thunder_Bay": "aa82e0d2a447d3610f4c2eea10c2a7b8",
  "dxmodules\\zoneinfo\\America\\Tijuana": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\America\\Toronto": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\America\\Tortola": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Vancouver": "9d48c60fed12ae8a6f5b139bf0b254b5",
  "dxmodules\\zoneinfo\\America\\Virgin": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\America\\Whitehorse": "3b82b92569a6900dadc0aa62c7cb6f36",
  "dxmodules\\zoneinfo\\America\\Winnipeg": "f0683580a6116b3c744cb6b3d63aa0b1",
  "dxmodules\\zoneinfo\\America\\Yakutat": "ee0f462df87e663c328908c5e81260d0",
  "dxmodules\\zoneinfo\\America\\Yellowknife": "b5087ae9a8ccc013470ebf44bc635281",
  "dxmodules\\zoneinfo\\Antarctica\\Casey": "f6d44d9ea6501a60287aeff26715bef0",
  "dxmodules\\zoneinfo\\Antarctica\\Davis": "80a08215623fd38f21aa72861fdf54cd",
  "dxmodules\\zoneinfo\\Antarctica\\DumontDUrville": "e3f2c24ea8bfb0c5bea7a209cfd1baae",
  "dxmodules\\zoneinfo\\Antarctica\\Macquarie": "7c8809733d07903666654c0e67aeaec5",
  "dxmodules\\zoneinfo\\Antarctica\\Mawson": "d285e96947e86928c647ab2b2cf185b5",
  "dxmodules\\zoneinfo\\Antarctica\\McMurdo": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\Antarctica\\Palmer": "3a6a847fb145840a4941337c2ae86d96",
  "dxmodules\\zoneinfo\\Antarctica\\Rothera": "70e1309683f8a4afa2f0d752bf97b46c",
  "dxmodules\\zoneinfo\\Antarctica\\South_Pole": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\Antarctica\\Syowa": "553ede0b9071e1364892b1ed27a7f1a6",
  "dxmodules\\zoneinfo\\Antarctica\\Troll": "f13b257391af38577970477597e9d499",
  "dxmodules\\zoneinfo\\Antarctica\\Vostok": "4bb37b331311a0867117d218adf10610",
  "dxmodules\\zoneinfo\\Arctic\\Longyearbyen": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\Asia\\Aden": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\Asia\\Almaty": "938c35fa2fdc23ae382ad9b2278c6f58",
  "dxmodules\\zoneinfo\\Asia\\Amman": "63694da35da6a976fb37a62debd191a4",
  "dxmodules\\zoneinfo\\Asia\\Anadyr": "5648ae758f6447668653221263b5ea9d",
  "dxmodules\\zoneinfo\\Asia\\Aqtau": "d020e6bedcd22c98f021e7c1c3ed8ee4",
  "dxmodules\\zoneinfo\\Asia\\Aqtobe": "486c6c79d56174ee29d05fc6efd9e18e",
  "dxmodules\\zoneinfo\\Asia\\Ashgabat": "235b16a54519989a51679188703ca5ac",
  "dxmodules\\zoneinfo\\Asia\\Ashkhabad": "235b16a54519989a51679188703ca5ac",
  "dxmodules\\zoneinfo\\Asia\\Atyrau": "5fbe4e89da1f20229c0c3747017557c0",
  "dxmodules\\zoneinfo\\Asia\\Baghdad": "af9423b28aad58ffc1790d29244309b8",
  "dxmodules\\zoneinfo\\Asia\\Bahrain": "fc5a2c1c087d56e4b7323259ab62bef6",
  "dxmodules\\zoneinfo\\Asia\\Baku": "27e366b2523ae3dfd1e648ecdf54bc15",
  "dxmodules\\zoneinfo\\Asia\\Bangkok": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\Asia\\Barnaul": "cfefaae119b421f5b3c990ef4948ebf7",
  "dxmodules\\zoneinfo\\Asia\\Beirut": "785117e925db8afec6b0c761163b002c",
  "dxmodules\\zoneinfo\\Asia\\Bishkek": "5dec7f8d19f19560c2fd59b16f2a2214",
  "dxmodules\\zoneinfo\\Asia\\Brunei": "3db4e51993e234a73f7054160abf663d",
  "dxmodules\\zoneinfo\\Asia\\Calcutta": "569f373970581e6488a24b5c70326d49",
  "dxmodules\\zoneinfo\\Asia\\Chita": "6b2c484a3c93d7523cd09ec0d13b53fe",
  "dxmodules\\zoneinfo\\Asia\\Choibalsan": "8ca46182ff4884d5b45c3c41e777783a",
  "dxmodules\\zoneinfo\\Asia\\Chongqing": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\Asia\\Chungking": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\Asia\\Colombo": "12c255c649eaa1ade0387c30596825d9",
  "dxmodules\\zoneinfo\\Asia\\Dacca": "ea255e2dada4541d25ad34139c18419f",
  "dxmodules\\zoneinfo\\Asia\\Damascus": "07b6153d721b5d7d93d78f2591201ffa",
  "dxmodules\\zoneinfo\\Asia\\Dhaka": "ea255e2dada4541d25ad34139c18419f",
  "dxmodules\\zoneinfo\\Asia\\Dili": "5c7fb0d932343cc330df273a5bb9308b",
  "dxmodules\\zoneinfo\\Asia\\Dubai": "e17583385b056a775970e7bcd9a6b7dd",
  "dxmodules\\zoneinfo\\Asia\\Dushanbe": "29a7b7661ea6575cd7f8ba1435b78f1d",
  "dxmodules\\zoneinfo\\Asia\\Famagusta": "14a69e4234b2f2c02a3d3a46d0ecffbb",
  "dxmodules\\zoneinfo\\Asia\\Gaza": "798a2fa999dfbd3d557b0afeedc99562",
  "dxmodules\\zoneinfo\\Asia\\Harbin": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\Asia\\Hebron": "f600ca83e00a4c2d046dbd5ae0461018",
  "dxmodules\\zoneinfo\\Asia\\Hong_Kong": "1f5267f14578c917d94c972e46fc8e0e",
  "dxmodules\\zoneinfo\\Asia\\Hovd": "585f478cf864b0065bd07587e6b1e41f",
  "dxmodules\\zoneinfo\\Asia\\Ho_Chi_Minh": "104047aa22a3824e08e4fffeccc80d19",
  "dxmodules\\zoneinfo\\Asia\\Irkutsk": "8a84642c58ed64282884014698df2f7d",
  "dxmodules\\zoneinfo\\Asia\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\Asia\\Jakarta": "c280819a288b0aea09db4fd1fd017546",
  "dxmodules\\zoneinfo\\Asia\\Jayapura": "75c2120efce23b61989c6a15635d115f",
  "dxmodules\\zoneinfo\\Asia\\Jerusalem": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\Asia\\Kabul": "47a295d1de026d2e443c132316ed4533",
  "dxmodules\\zoneinfo\\Asia\\Kamchatka": "da5950adc8bcdb823cff01b81d2d1ec9",
  "dxmodules\\zoneinfo\\Asia\\Karachi": "b1afc0a7ce4118813cdc8679e8b20d8a",
  "dxmodules\\zoneinfo\\Asia\\Kashgar": "a43f32e98fa40e6601db5cca019a01a8",
  "dxmodules\\zoneinfo\\Asia\\Kathmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1",
  "dxmodules\\zoneinfo\\Asia\\Katmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1",
  "dxmodules\\zoneinfo\\Asia\\Khandyga": "d8845dc2bfed88c1aef353c99c332d8e",
  "dxmodules\\zoneinfo\\Asia\\Kolkata": "569f373970581e6488a24b5c70326d49",
  "dxmodules\\zoneinfo\\Asia\\Krasnoyarsk": "6459a2dc5df86eecb3d8d881e285fbc5",
  "dxmodules\\zoneinfo\\Asia\\Kuala_Lumpur": "8a0970a2f6db03aa6317757fe59d24e5",
  "dxmodules\\zoneinfo\\Asia\\Kuching": "941bf864c5cd1bcbcba5bf386815338d",
  "dxmodules\\zoneinfo\\Asia\\Kuwait": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\Asia\\Macao": "f61abab83b519b307988b2c9e1c13037",
  "dxmodules\\zoneinfo\\Asia\\Macau": "f61abab83b519b307988b2c9e1c13037",
  "dxmodules\\zoneinfo\\Asia\\Magadan": "7d44faf13ac5b3facbd83ff3857a0e1e",
  "dxmodules\\zoneinfo\\Asia\\Makassar": "13cba3c3bb605214bf3464922974ca13",
  "dxmodules\\zoneinfo\\Asia\\Manila": "7edfd09b1ebe5e5a152a03a7a705f5bc",
  "dxmodules\\zoneinfo\\Asia\\Muscat": "e17583385b056a775970e7bcd9a6b7dd",
  "dxmodules\\zoneinfo\\Asia\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a",
  "dxmodules\\zoneinfo\\Asia\\Novokuznetsk": "d5f8acb7b4e7d664a04dd154980eda1f",
  "dxmodules\\zoneinfo\\Asia\\Novosibirsk": "b6434f1e22bf4098c2a8c5371dc301fe",
  "dxmodules\\zoneinfo\\Asia\\Omsk": "e789f5c5cce168d524f5a8c2486b62ba",
  "dxmodules\\zoneinfo\\Asia\\Oral": "2586cc76cb792e5a3e56f5c130892c93",
  "dxmodules\\zoneinfo\\Asia\\Phnom_Penh": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\Asia\\Pontianak": "75dbcd818e883badda4d6df52f07c9ae",
  "dxmodules\\zoneinfo\\Asia\\Pyongyang": "55ccc2dfaf651c7452baf53f3c0bcaa1",
  "dxmodules\\zoneinfo\\Asia\\Qatar": "fc5a2c1c087d56e4b7323259ab62bef6",
  "dxmodules\\zoneinfo\\Asia\\Qostanay": "6f2759a853ade2f4c50fddc156e833c6",
  "dxmodules\\zoneinfo\\Asia\\Qyzylorda": "2794eeaae5075fae6c902660beae2141",
  "dxmodules\\zoneinfo\\Asia\\Rangoon": "facd5e2823e744613e5d83384b53b17f",
  "dxmodules\\zoneinfo\\Asia\\Riyadh": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\Asia\\Saigon": "104047aa22a3824e08e4fffeccc80d19",
  "dxmodules\\zoneinfo\\Asia\\Sakhalin": "d065dcba4d1f2f8df4862ea639caf3f3",
  "dxmodules\\zoneinfo\\Asia\\Samarkand": "7c0752cecdf1b32c7618128577045bcc",
  "dxmodules\\zoneinfo\\Asia\\Seoul": "f7a6e371bd709b3c2f64ce6f67f39f29",
  "dxmodules\\zoneinfo\\Asia\\Shanghai": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\Asia\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3",
  "dxmodules\\zoneinfo\\Asia\\Srednekolymsk": "9e7e46bbc5dad40e5f90e797d941d22e",
  "dxmodules\\zoneinfo\\Asia\\Taipei": "2e67467e3c050e8b3a4022eb9e20300e",
  "dxmodules\\zoneinfo\\Asia\\Tashkent": "3e47dbc84c7895e2cb890776d3ad119b",
  "dxmodules\\zoneinfo\\Asia\\Tbilisi": "da70a44f47a6a309eff8c9302fecf559",
  "dxmodules\\zoneinfo\\Asia\\Tehran": "d2cb514595346f1168c2f1167409ec7c",
  "dxmodules\\zoneinfo\\Asia\\Tel_Aviv": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\Asia\\Thimbu": "97be2e1f7789978b407476a8094d5ee1",
  "dxmodules\\zoneinfo\\Asia\\Thimphu": "97be2e1f7789978b407476a8094d5ee1",
  "dxmodules\\zoneinfo\\Asia\\Tokyo": "478afb8b1f182b2ff53caa2e6cc8ffd9",
  "dxmodules\\zoneinfo\\Asia\\Tomsk": "903e9bdc80298a4433a48219a071d4af",
  "dxmodules\\zoneinfo\\Asia\\Ujung_Pandang": "13cba3c3bb605214bf3464922974ca13",
  "dxmodules\\zoneinfo\\Asia\\Ulaanbaatar": "3f0446e3735c9dd93089eeae31a37c1b",
  "dxmodules\\zoneinfo\\Asia\\Ulan_Bator": "3f0446e3735c9dd93089eeae31a37c1b",
  "dxmodules\\zoneinfo\\Asia\\Urumqi": "a43f32e98fa40e6601db5cca019a01a8",
  "dxmodules\\zoneinfo\\Asia\\Ust-Nera": "4d04e65ff5d8c7b407d6cb8dedbe33a4",
  "dxmodules\\zoneinfo\\Asia\\Vientiane": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\Asia\\Vladivostok": "cecab70411f0df191ef4a2cb747bdb08",
  "dxmodules\\zoneinfo\\Asia\\Yakutsk": "bfef1f6f86fa7080259fd26f7668bc84",
  "dxmodules\\zoneinfo\\Asia\\Yangon": "facd5e2823e744613e5d83384b53b17f",
  "dxmodules\\zoneinfo\\Asia\\Yekaterinburg": "807931acd2f4fa27806b8208de988391",
  "dxmodules\\zoneinfo\\Asia\\Yerevan": "e196b792aab3b785a957682c74f574e7",
  "dxmodules\\zoneinfo\\Atlantic\\Azores": "5433c796c8a770b6b06fe812ae08527f",
  "dxmodules\\zoneinfo\\Atlantic\\Bermuda": "659000f311b0ab5c90442cb81278c62c",
  "dxmodules\\zoneinfo\\Atlantic\\Canary": "167a786aa74ba2a9dd68c470746aa0ac",
  "dxmodules\\zoneinfo\\Atlantic\\Cape_Verde": "b3795953b76fb3cc553fdbb4d825cb93",
  "dxmodules\\zoneinfo\\Atlantic\\Faeroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b",
  "dxmodules\\zoneinfo\\Atlantic\\Faroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b",
  "dxmodules\\zoneinfo\\Atlantic\\Jan_Mayen": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\Atlantic\\Madeira": "2e4a8509560836b8341ec2e612627005",
  "dxmodules\\zoneinfo\\Atlantic\\Reykjavik": "d5e2f791bed996743c667784bb8c52ea",
  "dxmodules\\zoneinfo\\Atlantic\\South_Georgia": "f0b2aeeddf3200b6a5839d86f35879e6",
  "dxmodules\\zoneinfo\\Atlantic\\Stanley": "5a5247cc12a456fee6716540c14e55ad",
  "dxmodules\\zoneinfo\\Atlantic\\St_Helena": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\Australia\\ACT": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\Australia\\Adelaide": "a3ec822dc0c8fd04e431b3316d1166ca",
  "dxmodules\\zoneinfo\\Australia\\Brisbane": "0c8a54dfc42c9a987fff25d5d72096fa",
  "dxmodules\\zoneinfo\\Australia\\Broken_Hill": "c0a218c9fe25b535b4a1a6b70dad3af2",
  "dxmodules\\zoneinfo\\Australia\\Canberra": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\Australia\\Currie": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\Australia\\Darwin": "cbb2b15b2c2034c2584f801cec184e2b",
  "dxmodules\\zoneinfo\\Australia\\Eucla": "1459b57ff3474bbe12013908f4bed8aa",
  "dxmodules\\zoneinfo\\Australia\\Hobart": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\Australia\\LHI": "b664b61c1949c1beea8838facf6c1d8b",
  "dxmodules\\zoneinfo\\Australia\\Lindeman": "4d125f1a5ec84cf6f62607152dedf324",
  "dxmodules\\zoneinfo\\Australia\\Lord_Howe": "b664b61c1949c1beea8838facf6c1d8b",
  "dxmodules\\zoneinfo\\Australia\\Melbourne": "5f06e3a482d43ee4018736ac792b1129",
  "dxmodules\\zoneinfo\\Australia\\North": "cbb2b15b2c2034c2584f801cec184e2b",
  "dxmodules\\zoneinfo\\Australia\\NSW": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\Australia\\Perth": "a54a9120fddca3a9bb951ac9d8bce260",
  "dxmodules\\zoneinfo\\Australia\\Queensland": "0c8a54dfc42c9a987fff25d5d72096fa",
  "dxmodules\\zoneinfo\\Australia\\South": "a3ec822dc0c8fd04e431b3316d1166ca",
  "dxmodules\\zoneinfo\\Australia\\Sydney": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\Australia\\Tasmania": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\Australia\\Victoria": "5f06e3a482d43ee4018736ac792b1129",
  "dxmodules\\zoneinfo\\Australia\\West": "a54a9120fddca3a9bb951ac9d8bce260",
  "dxmodules\\zoneinfo\\Australia\\Yancowinna": "c0a218c9fe25b535b4a1a6b70dad3af2",
  "dxmodules\\zoneinfo\\Brazil\\Acre": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\Brazil\\DeNoronha": "a8562cc7d0e4555968ad7744dceb9d43",
  "dxmodules\\zoneinfo\\Brazil\\East": "339ff8dbd88e39f59b2fd4ee57b1fdb1",
  "dxmodules\\zoneinfo\\Brazil\\West": "585a0b598d406e6c0d710182bbdba35e",
  "dxmodules\\zoneinfo\\Canada\\Atlantic": "820f35f23d49a527ffe813e2d96c5da7",
  "dxmodules\\zoneinfo\\Canada\\Central": "f0683580a6116b3c744cb6b3d63aa0b1",
  "dxmodules\\zoneinfo\\Canada\\Eastern": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\Canada\\Mountain": "1f23503189b8ce70677b2dcbb4a57e8c",
  "dxmodules\\zoneinfo\\Canada\\Newfoundland": "79d938b80bf215c8e13d2cb4727343d8",
  "dxmodules\\zoneinfo\\Canada\\Pacific": "9d48c60fed12ae8a6f5b139bf0b254b5",
  "dxmodules\\zoneinfo\\Canada\\Saskatchewan": "cec6491b350dfbdb74732df745eb37d3",
  "dxmodules\\zoneinfo\\Canada\\Yukon": "3b82b92569a6900dadc0aa62c7cb6f36",
  "dxmodules\\zoneinfo\\CET": "3f166816639388adb3d3567e28ef2145",
  "dxmodules\\zoneinfo\\Chile\\Continental": "b8db6707d0c4f0dfc7a12be81d35df8f",
  "dxmodules\\zoneinfo\\Chile\\EasterIsland": "ea76f04afd1b377b869cd7532b35457c",
  "dxmodules\\zoneinfo\\CST6CDT": "8396c3e49c717f9ba736b4d4d1b24b8b",
  "dxmodules\\zoneinfo\\Cuba": "1877fc45317e144ea206ddc622cebba2",
  "dxmodules\\zoneinfo\\EET": "16b84f2a83840fd4132c2e3fbff3b758",
  "dxmodules\\zoneinfo\\Egypt": "b9bb9d8c3cddc72252f4aa2082af4213",
  "dxmodules\\zoneinfo\\Eire": "0e226ce4b36682f2c9c2fa1146809778",
  "dxmodules\\zoneinfo\\EST": "d0f150b6acc4dc78b8ada8abb1079af6",
  "dxmodules\\zoneinfo\\EST5EDT": "e7a28a1315bcd4deedaaac6d1c3cd3e2",
  "dxmodules\\zoneinfo\\Etc\\GMT": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\GMT+0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\GMT+1": "169210c55520d3a8efc1362a5d89e402",
  "dxmodules\\zoneinfo\\Etc\\GMT+10": "03d40b4007e96680e56f10372148cf51",
  "dxmodules\\zoneinfo\\Etc\\GMT+11": "bb030b7fea0da0987217737e22a9cbe0",
  "dxmodules\\zoneinfo\\Etc\\GMT+12": "66046646734491458066327a04705b0c",
  "dxmodules\\zoneinfo\\Etc\\GMT+2": "0a97351084a016afb88b8b698ea922d8",
  "dxmodules\\zoneinfo\\Etc\\GMT+3": "73897f3686a7bca3e2719cfa59f83b6b",
  "dxmodules\\zoneinfo\\Etc\\GMT+4": "e943df1168ea3d597ec62c8933a11a9c",
  "dxmodules\\zoneinfo\\Etc\\GMT+5": "a9d53018097b6bcca5e6a4e55211e80b",
  "dxmodules\\zoneinfo\\Etc\\GMT+6": "0a8c24c796c1473250ff564fce59e937",
  "dxmodules\\zoneinfo\\Etc\\GMT+7": "d87007923e671b8b78552d613299ac8a",
  "dxmodules\\zoneinfo\\Etc\\GMT+8": "e99240e190c8a4ccf3cc0a26618fb09b",
  "dxmodules\\zoneinfo\\Etc\\GMT+9": "e77b0b4911d483289610c4efcd599d7d",
  "dxmodules\\zoneinfo\\Etc\\GMT-0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\GMT-1": "a3c457b6cc2c3be7f34da00d84ec229e",
  "dxmodules\\zoneinfo\\Etc\\GMT-10": "8ed77c9096196e97be5f0807bf939bac",
  "dxmodules\\zoneinfo\\Etc\\GMT-11": "dcdc4caf8194fa9d29ceccdc225a5048",
  "dxmodules\\zoneinfo\\Etc\\GMT-12": "fe87b6111ce93c3d10fe152ca715a715",
  "dxmodules\\zoneinfo\\Etc\\GMT-13": "0fd6f7e68d38e1cef98efdc6ecedae80",
  "dxmodules\\zoneinfo\\Etc\\GMT-14": "155f8eb5a5dd22c81eef6986c8c5317c",
  "dxmodules\\zoneinfo\\Etc\\GMT-2": "a9eafb629b4070ca0ff8f99631390031",
  "dxmodules\\zoneinfo\\Etc\\GMT-3": "b73ddab7b5ca9128a8b2925fad5b11f0",
  "dxmodules\\zoneinfo\\Etc\\GMT-4": "0c08dc6b2974b3207bf6293544a236b0",
  "dxmodules\\zoneinfo\\Etc\\GMT-5": "57ca1133eeeb09c7c30c04850d49d4e5",
  "dxmodules\\zoneinfo\\Etc\\GMT-6": "642170284ddc2575f5e077d7ea33dcdc",
  "dxmodules\\zoneinfo\\Etc\\GMT-7": "2f4d1ba17adf0c86acb4cc6258f8a0cb",
  "dxmodules\\zoneinfo\\Etc\\GMT-8": "f4d3b2b664698da9268d3f244fec9232",
  "dxmodules\\zoneinfo\\Etc\\GMT-9": "02963228a1537cc2c8bdf22e99178893",
  "dxmodules\\zoneinfo\\Etc\\GMT0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\Greenwich": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Etc\\UCT": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Etc\\Universal": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Etc\\UTC": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Etc\\Zulu": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Europe\\Amsterdam": "e3b0d618da0bd60d894183dd0d53923e",
  "dxmodules\\zoneinfo\\Europe\\Andorra": "8bfff3a580b4b0db3dff30d1d7385ac4",
  "dxmodules\\zoneinfo\\Europe\\Astrakhan": "ba197918d51925f1e0b771923ce3a19f",
  "dxmodules\\zoneinfo\\Europe\\Athens": "75d641576f8d4376045ba8f16db4063a",
  "dxmodules\\zoneinfo\\Europe\\Belfast": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Belgrade": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Berlin": "4790e83465681cefbf852aed265354bf",
  "dxmodules\\zoneinfo\\Europe\\Bratislava": "eab2cea5cb5bf0374f6bf891b9102844",
  "dxmodules\\zoneinfo\\Europe\\Brussels": "3d5d93412e485bac12e0587239835fd9",
  "dxmodules\\zoneinfo\\Europe\\Bucharest": "751205baadb94c5f41dadbcc97ab23db",
  "dxmodules\\zoneinfo\\Europe\\Budapest": "f76d3a5131d6910f5c2a34fbe35c265e",
  "dxmodules\\zoneinfo\\Europe\\Busingen": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\Europe\\Chisinau": "717476d2fe0213c40e31f52573c05356",
  "dxmodules\\zoneinfo\\Europe\\Copenhagen": "96039e70388d843950bcbef21328bba6",
  "dxmodules\\zoneinfo\\Europe\\Dublin": "0e226ce4b36682f2c9c2fa1146809778",
  "dxmodules\\zoneinfo\\Europe\\Gibraltar": "77fe14fec44142c1435dcc4eac003df4",
  "dxmodules\\zoneinfo\\Europe\\Guernsey": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Helsinki": "3eaa8467ffb21b15bd75200ff2c0a3db",
  "dxmodules\\zoneinfo\\Europe\\Isle_of_Man": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\Europe\\Jersey": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Kaliningrad": "7dc8e4aecf6dcf214b52938e289c9831",
  "dxmodules\\zoneinfo\\Europe\\Kiev": "f957769855be8b9d5983e51c033975d8",
  "dxmodules\\zoneinfo\\Europe\\Kirov": "6467d1d15049cb0015bbd56c92b18814",
  "dxmodules\\zoneinfo\\Europe\\Lisbon": "b9ba38decf09fe0728f81ebeabf29cfe",
  "dxmodules\\zoneinfo\\Europe\\Ljubljana": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\London": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\Europe\\Luxembourg": "3242615a805f051357309a89874633f3",
  "dxmodules\\zoneinfo\\Europe\\Madrid": "3ecb0fe1a9207bc3f77e793315ce0e5d",
  "dxmodules\\zoneinfo\\Europe\\Malta": "b6e707a0d755cfd038a7c4ecc44845e7",
  "dxmodules\\zoneinfo\\Europe\\Mariehamn": "3eaa8467ffb21b15bd75200ff2c0a3db",
  "dxmodules\\zoneinfo\\Europe\\Minsk": "07aeb33b58212d75e92b8eb157cc1624",
  "dxmodules\\zoneinfo\\Europe\\Monaco": "89271b78b389e6180385b96e7af94e7a",
  "dxmodules\\zoneinfo\\Europe\\Moscow": "223bbf37352a9d4807919132f360535e",
  "dxmodules\\zoneinfo\\Europe\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a",
  "dxmodules\\zoneinfo\\Europe\\Oslo": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\Europe\\Paris": "fe22373ca65df6ba6b254f5c4304fae8",
  "dxmodules\\zoneinfo\\Europe\\Podgorica": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Prague": "eab2cea5cb5bf0374f6bf891b9102844",
  "dxmodules\\zoneinfo\\Europe\\Riga": "b4541699f68b4aba0daa45df63e596a4",
  "dxmodules\\zoneinfo\\Europe\\Rome": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\Europe\\Samara": "d390934cf2dc01f033ffda93394c85d7",
  "dxmodules\\zoneinfo\\Europe\\San_Marino": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\Europe\\Sarajevo": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Saratov": "756b361dc39b978b78eaf6df78a7ad0e",
  "dxmodules\\zoneinfo\\Europe\\Simferopol": "9b2ddc8ca9d5c792d09f37ca58104afa",
  "dxmodules\\zoneinfo\\Europe\\Skopje": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Sofia": "68e6be692f44b3ed696fd2e6ef806927",
  "dxmodules\\zoneinfo\\Europe\\Stockholm": "1b9ed89af7331c6141249d181b42c621",
  "dxmodules\\zoneinfo\\Europe\\Tallinn": "46abec9f16a148333139ff5b0b6d1115",
  "dxmodules\\zoneinfo\\Europe\\Tirane": "d5977bad592e33b2e4058a242d735927",
  "dxmodules\\zoneinfo\\Europe\\Tiraspol": "717476d2fe0213c40e31f52573c05356",
  "dxmodules\\zoneinfo\\Europe\\Ulyanovsk": "ff8f50dd006548eb8751802c600f2299",
  "dxmodules\\zoneinfo\\Europe\\Uzhgorod": "0b4761ce9ee17b7b8bfb0d12063803c6",
  "dxmodules\\zoneinfo\\Europe\\Vaduz": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\Europe\\Vatican": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\Europe\\Vienna": "cb0f39744833718fbd602c54e0425157",
  "dxmodules\\zoneinfo\\Europe\\Vilnius": "524d360c5369c1abcb59e8140b59acda",
  "dxmodules\\zoneinfo\\Europe\\Volgograd": "442a047745c83ebebc180c67f6798fc2",
  "dxmodules\\zoneinfo\\Europe\\Warsaw": "2ed881ef7e09c844c009673ded84c798",
  "dxmodules\\zoneinfo\\Europe\\Zagreb": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\Europe\\Zaporozhye": "69430a5e3e93bd0ed6e2e604ddf6e903",
  "dxmodules\\zoneinfo\\Europe\\Zurich": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\GB": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\GB-Eire": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\GMT": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\GMT+0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\GMT-0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\GMT0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Greenwich": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\Hongkong": "1f5267f14578c917d94c972e46fc8e0e",
  "dxmodules\\zoneinfo\\HST": "fd4ae9e0296519fb47b4b036ea4af025",
  "dxmodules\\zoneinfo\\Iceland": "d5e2f791bed996743c667784bb8c52ea",
  "dxmodules\\zoneinfo\\Indian\\Antananarivo": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Indian\\Chagos": "dfb323eb6037596036669f4b4505544c",
  "dxmodules\\zoneinfo\\Indian\\Christmas": "02b16169f8f47de904f3f05cb7f72583",
  "dxmodules\\zoneinfo\\Indian\\Cocos": "d9ffcdd40666dcb76225bdfb4654c0cf",
  "dxmodules\\zoneinfo\\Indian\\Comoro": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Indian\\Kerguelen": "749273edab499ed254e32606a9e5579e",
  "dxmodules\\zoneinfo\\Indian\\Mahe": "0df488f823d924b336f01d53d270af73",
  "dxmodules\\zoneinfo\\Indian\\Maldives": "89a066bf0512071db2a9eb425df46341",
  "dxmodules\\zoneinfo\\Indian\\Mauritius": "8f06c0fc457b6a12c0bbc4946e2dfb05",
  "dxmodules\\zoneinfo\\Indian\\Mayotte": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\Indian\\Reunion": "817b0a2e45ae9c1e566499a4b068295e",
  "dxmodules\\zoneinfo\\Iran": "d2cb514595346f1168c2f1167409ec7c",
  "dxmodules\\zoneinfo\\iso3166.tab": "22b35b3817db585e12c4e2db934c9680",
  "dxmodules\\zoneinfo\\Israel": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af",
  "dxmodules\\zoneinfo\\Japan": "478afb8b1f182b2ff53caa2e6cc8ffd9",
  "dxmodules\\zoneinfo\\Kwajalein": "6d9261ff9442c0cf69446e362202d691",
  "dxmodules\\zoneinfo\\leapseconds": "cf361cfd45c2547a044f48855d7e5d5c",
  "dxmodules\\zoneinfo\\Libya": "edec79f292e5b8c0d32b521af1f118bd",
  "dxmodules\\zoneinfo\\MET": "3b07c8cc8c1fed960246da4e3791a73c",
  "dxmodules\\zoneinfo\\Mexico\\BajaNorte": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\Mexico\\BajaSur": "2a157b818df8ab296baf6de38cd7d32b",
  "dxmodules\\zoneinfo\\Mexico\\General": "cff58c6976849e1e8f94d4288b07b9d2",
  "dxmodules\\zoneinfo\\MST": "04da8453f31d6971b7fa4f3f8fb26654",
  "dxmodules\\zoneinfo\\MST7MDT": "76be6718eb3cf4ac468387b5d13ffafb",
  "dxmodules\\zoneinfo\\Navajo": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\NZ": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\NZ-CHAT": "0e76ddb8bb10f4b8f2ee092f731b6452",
  "dxmodules\\zoneinfo\\Pacific\\Apia": "6b2ba3b8fc50b635cdc0c1f117243439",
  "dxmodules\\zoneinfo\\Pacific\\Auckland": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\Pacific\\Bougainville": "e2da4052206976c32cd533f22f0bcf15",
  "dxmodules\\zoneinfo\\Pacific\\Chatham": "0e76ddb8bb10f4b8f2ee092f731b6452",
  "dxmodules\\zoneinfo\\Pacific\\Chuuk": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\Pacific\\Easter": "ea76f04afd1b377b869cd7532b35457c",
  "dxmodules\\zoneinfo\\Pacific\\Efate": "25c51b2838decef2f9d90c15e4ef7d3c",
  "dxmodules\\zoneinfo\\Pacific\\Enderbury": "6356a41b8b79885979b2b6613abecb73",
  "dxmodules\\zoneinfo\\Pacific\\Fakaofo": "de7a32503bd8fdc5baec11e6b9aad69b",
  "dxmodules\\zoneinfo\\Pacific\\Fiji": "7133b1eaf825848a26c6fe35f2601908",
  "dxmodules\\zoneinfo\\Pacific\\Funafuti": "eb33daa3195c75c1a5b54b14fe461b73",
  "dxmodules\\zoneinfo\\Pacific\\Galapagos": "684faae885b8ab403c2a54b9f1eecea9",
  "dxmodules\\zoneinfo\\Pacific\\Gambier": "921dd1aee0026d9b376f293ce4f246bc",
  "dxmodules\\zoneinfo\\Pacific\\Guadalcanal": "1de7b39a3bcdce97e8c93d336157dd8b",
  "dxmodules\\zoneinfo\\Pacific\\Guam": "af8e7d6ffe7865cc595b49479e53d408",
  "dxmodules\\zoneinfo\\Pacific\\Honolulu": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\Pacific\\Johnston": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\Pacific\\Kiritimati": "f5876d683bfa2f0339c3c048224e430f",
  "dxmodules\\zoneinfo\\Pacific\\Kosrae": "ef22d34dcb3734017a59ecc62ab84713",
  "dxmodules\\zoneinfo\\Pacific\\Kwajalein": "6d9261ff9442c0cf69446e362202d691",
  "dxmodules\\zoneinfo\\Pacific\\Majuro": "86a054fd15bfbd9fe15156ba7f4155fd",
  "dxmodules\\zoneinfo\\Pacific\\Marquesas": "e05efeb2e72d3a51e6019499841b509c",
  "dxmodules\\zoneinfo\\Pacific\\Midway": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\Pacific\\Nauru": "4f7dd62a8207d60009300c99c1773846",
  "dxmodules\\zoneinfo\\Pacific\\Niue": "2d69ed1a3e4496ecd16c94846675a0f3",
  "dxmodules\\zoneinfo\\Pacific\\Norfolk": "0ba7dc541ce5ad91b2d0aa81589ee205",
  "dxmodules\\zoneinfo\\Pacific\\Noumea": "48f634aa56c4cfee3f6afd37b28b66b2",
  "dxmodules\\zoneinfo\\Pacific\\Pago_Pago": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\Pacific\\Palau": "3ffa839dec8323e475526d5cd38fa82a",
  "dxmodules\\zoneinfo\\Pacific\\Pitcairn": "42e5aa28598d96efb16eb6734f31fda6",
  "dxmodules\\zoneinfo\\Pacific\\Pohnpei": "45f293ec35daa27a60c7e0c90b58012d",
  "dxmodules\\zoneinfo\\Pacific\\Ponape": "45f293ec35daa27a60c7e0c90b58012d",
  "dxmodules\\zoneinfo\\Pacific\\Port_Moresby": "c43a5f332114d2a9cd1d6c9f259c71f3",
  "dxmodules\\zoneinfo\\Pacific\\Rarotonga": "770947b4fd41633dc1d9cecc1ee972d2",
  "dxmodules\\zoneinfo\\Pacific\\Saipan": "af8e7d6ffe7865cc595b49479e53d408",
  "dxmodules\\zoneinfo\\Pacific\\Samoa": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\Pacific\\Tahiti": "cdbc49403d1d7684e83fdfc258106885",
  "dxmodules\\zoneinfo\\Pacific\\Tarawa": "b2564fba66250ab89502eec6d72c0c5e",
  "dxmodules\\zoneinfo\\Pacific\\Tongatapu": "db7a5ceed05b395c4660be082a4377da",
  "dxmodules\\zoneinfo\\Pacific\\Truk": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\Pacific\\Wake": "5763840e0d743d0555d9f0813404da80",
  "dxmodules\\zoneinfo\\Pacific\\Wallis": "36b100715cbee093d7c6056eaf60aeeb",
  "dxmodules\\zoneinfo\\Pacific\\Yap": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\Poland": "2ed881ef7e09c844c009673ded84c798",
  "dxmodules\\zoneinfo\\Portugal": "b9ba38decf09fe0728f81ebeabf29cfe",
  "dxmodules\\zoneinfo\\posix\\Africa\\Abidjan": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Accra": "6cb97bef390f7c65022c2e8c7eec45e0",
  "dxmodules\\zoneinfo\\posix\\Africa\\Addis_Ababa": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Algiers": "3342407b34291d264175caaf37813938",
  "dxmodules\\zoneinfo\\posix\\Africa\\Asmara": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Asmera": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Bamako": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Bangui": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Banjul": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Bissau": "af82ce73e5877a3dfd5c9dc93e869fa9",
  "dxmodules\\zoneinfo\\posix\\Africa\\Blantyre": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Brazzaville": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Bujumbura": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Cairo": "b9bb9d8c3cddc72252f4aa2082af4213",
  "dxmodules\\zoneinfo\\posix\\Africa\\Casablanca": "565d702c341dd4239a7e76208653c18c",
  "dxmodules\\zoneinfo\\posix\\Africa\\Ceuta": "5c2bf01f3f9fadcfa9a188e594f232e9",
  "dxmodules\\zoneinfo\\posix\\Africa\\Conakry": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Dakar": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Dar_es_Salaam": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Djibouti": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Douala": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\El_Aaiun": "b5acb6aaf433bd0dfe09d90fcc30c7e3",
  "dxmodules\\zoneinfo\\posix\\Africa\\Freetown": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Gaborone": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Harare": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Johannesburg": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\posix\\Africa\\Juba": "659ed8d529baf6f5043db708c1d17bee",
  "dxmodules\\zoneinfo\\posix\\Africa\\Kampala": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Khartoum": "021e36c906192435e0cb9c09440173a3",
  "dxmodules\\zoneinfo\\posix\\Africa\\Kigali": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Kinshasa": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Lagos": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Libreville": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Lome": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Luanda": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Lubumbashi": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Lusaka": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Malabo": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Maputo": "b5f4fb3c09aa7751a710e6fd5dd15d95",
  "dxmodules\\zoneinfo\\posix\\Africa\\Maseru": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\posix\\Africa\\Mbabane": "cee12167324950cf0d21256df7848887",
  "dxmodules\\zoneinfo\\posix\\Africa\\Mogadishu": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Monrovia": "896a875aafa39c10b614c9803d1f2673",
  "dxmodules\\zoneinfo\\posix\\Africa\\Nairobi": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Africa\\Ndjamena": "a0aad5ca661653e362b8afc808dc85c1",
  "dxmodules\\zoneinfo\\posix\\Africa\\Niamey": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Nouakchott": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Ouagadougou": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Porto-Novo": "cbf77594f31a10b4e5a6d635638f8aa6",
  "dxmodules\\zoneinfo\\posix\\Africa\\Sao_Tome": "06142521165cb91ddc40c1d9000c7038",
  "dxmodules\\zoneinfo\\posix\\Africa\\Timbuktu": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Africa\\Tripoli": "edec79f292e5b8c0d32b521af1f118bd",
  "dxmodules\\zoneinfo\\posix\\Africa\\Tunis": "4f1b4fe95a2512916e20c6f6e26d8e3c",
  "dxmodules\\zoneinfo\\posix\\Africa\\Windhoek": "6e9276508be4c6bfa224b9dddfefa61e",
  "dxmodules\\zoneinfo\\posix\\America\\Adak": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\posix\\America\\Anchorage": "596428a3a840d568656088bd48e608f1",
  "dxmodules\\zoneinfo\\posix\\America\\Anguilla": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Antigua": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Araguaina": "f41ab2d0a7a5b7fa0e3d3ac456b6bc97",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Catamarca": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\ComodRivadavia": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\La_Rioja": "00095a6391dda3fdca483ec5847abf2b",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Rio_Gallegos": "b97bc475f57e6b72c5ef969ed629e144",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Salta": "ed7e059362f3ae6381c2390798b0d524",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\San_Juan": "7c35305a9821e159720fae50b96790ca",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\San_Luis": "3e91f210d3eedf4543a4b716a5ba504c",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Tucuman": "b58092fe8d0461c10f5c3153ad9ed653",
  "dxmodules\\zoneinfo\\posix\\America\\Argentina\\Ushuaia": "b1d065d0cd8358933796fe3f034d799a",
  "dxmodules\\zoneinfo\\posix\\America\\Aruba": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\posix\\America\\Asuncion": "09a3f0569913d138c4f5d8c0c97c055c",
  "dxmodules\\zoneinfo\\posix\\America\\Atikokan": "6b028d3f8073ba06f9467133f6a1a0dd",
  "dxmodules\\zoneinfo\\posix\\America\\Atka": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\posix\\America\\Bahia": "2f5dd75c9ee116e4ca290849dfff7a9f",
  "dxmodules\\zoneinfo\\posix\\America\\Bahia_Banderas": "6d24d30bc671042918ba397a15e6114c",
  "dxmodules\\zoneinfo\\posix\\America\\Barbados": "92550378b8952475d3bffe20b1168820",
  "dxmodules\\zoneinfo\\posix\\America\\Belem": "432beed5d93041f2b551051332d7d72e",
  "dxmodules\\zoneinfo\\posix\\America\\Belize": "da3145d79cba5f541dd261434e449173",
  "dxmodules\\zoneinfo\\posix\\America\\Blanc-Sablon": "4169ae15c5a1477cfe281fa7702bcc14",
  "dxmodules\\zoneinfo\\posix\\America\\Boa_Vista": "a98b8a6d614366047943d78bc1896acb",
  "dxmodules\\zoneinfo\\posix\\America\\Bogota": "cb5574ae9b01614c9e8c082039fe8147",
  "dxmodules\\zoneinfo\\posix\\America\\Boise": "45dce4d7ef2491d2450d16565f878b02",
  "dxmodules\\zoneinfo\\posix\\America\\Buenos_Aires": "7294bfbfed91ed6e6666c924ff320e49",
  "dxmodules\\zoneinfo\\posix\\America\\Cambridge_Bay": "048d33fc74c19008a5a440b8b226cb45",
  "dxmodules\\zoneinfo\\posix\\America\\Campo_Grande": "6e2912b5b855c5e6d39eeb1bcf19aea5",
  "dxmodules\\zoneinfo\\posix\\America\\Cancun": "a2fe4da50cfb1afe8a46d6f55b805afa",
  "dxmodules\\zoneinfo\\posix\\America\\Caracas": "a5bf9cdb87d451a4aabad61d4ce91a2b",
  "dxmodules\\zoneinfo\\posix\\America\\Catamarca": "ba971af9e1d8a0c07587f35626684928",
  "dxmodules\\zoneinfo\\posix\\America\\Cayenne": "e9f3bdd863a3cf2127077a21e918b057",
  "dxmodules\\zoneinfo\\posix\\America\\Cayman": "843b6eadcdd7838269e2195df886ebf1",
  "dxmodules\\zoneinfo\\posix\\America\\Chicago": "d0f076c9f390e7d8a933cc7cc1ad2e90",
  "dxmodules\\zoneinfo\\posix\\America\\Chihuahua": "75c741bb811f4ee563ce05eb976e53a1",
  "dxmodules\\zoneinfo\\posix\\America\\Coral_Harbour": "6b028d3f8073ba06f9467133f6a1a0dd",
  "dxmodules\\zoneinfo\\posix\\America\\Cordoba": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\posix\\America\\Costa_Rica": "2dec281340a45276b0799a3bec48b76b",
  "dxmodules\\zoneinfo\\posix\\America\\Creston": "dbf874c388dc236612025d145b46d868",
  "dxmodules\\zoneinfo\\posix\\America\\Cuiaba": "71d500778aa9de635b9438695cf8b61e",
  "dxmodules\\zoneinfo\\posix\\America\\Curacao": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\posix\\America\\Danmarkshavn": "20e68f0a941140b269efb3af346b1e34",
  "dxmodules\\zoneinfo\\posix\\America\\Dawson": "9c8e92765ad27141e3a56f6a31599c99",
  "dxmodules\\zoneinfo\\posix\\America\\Dawson_Creek": "f7955656cccdf253d996deb5bb4176ef",
  "dxmodules\\zoneinfo\\posix\\America\\Denver": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\posix\\America\\Detroit": "ae3ba6ed8738ceda9eef109c6c586736",
  "dxmodules\\zoneinfo\\posix\\America\\Dominica": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Edmonton": "1f23503189b8ce70677b2dcbb4a57e8c",
  "dxmodules\\zoneinfo\\posix\\America\\Eirunepe": "236e0fa8dd250599b2146a7a203a6ae4",
  "dxmodules\\zoneinfo\\posix\\America\\El_Salvador": "b77c5f52b45573ae0f5673ac0ca1b086",
  "dxmodules\\zoneinfo\\posix\\America\\Ensenada": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\posix\\America\\Fortaleza": "2e202e859552b09ad60cdc408de47c94",
  "dxmodules\\zoneinfo\\posix\\America\\Fort_Nelson": "8853bd10553d7ca5eb5f0b9c7af5a047",
  "dxmodules\\zoneinfo\\posix\\America\\Fort_Wayne": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\posix\\America\\Glace_Bay": "6ba1b7da532cefb6e32d083377b71303",
  "dxmodules\\zoneinfo\\posix\\America\\Godthab": "4a1f3fd710057cfeaf3e7ac964a18466",
  "dxmodules\\zoneinfo\\posix\\America\\Goose_Bay": "18a9d1af32911f30273fabcc694d9654",
  "dxmodules\\zoneinfo\\posix\\America\\Grand_Turk": "539dcee68a715238ef8aa5642a9b5214",
  "dxmodules\\zoneinfo\\posix\\America\\Grenada": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Guadeloupe": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Guatemala": "097638f469fdba70e9637561cffefd91",
  "dxmodules\\zoneinfo\\posix\\America\\Guayaquil": "bbe67886e74ffd7d1ed09a3481b5120c",
  "dxmodules\\zoneinfo\\posix\\America\\Guyana": "7fb63c484765baf41049bd41cfca0184",
  "dxmodules\\zoneinfo\\posix\\America\\Halifax": "820f35f23d49a527ffe813e2d96c5da7",
  "dxmodules\\zoneinfo\\posix\\America\\Havana": "1877fc45317e144ea206ddc622cebba2",
  "dxmodules\\zoneinfo\\posix\\America\\Hermosillo": "7bdce7a211e50eff3b5b8de21a46d581",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Knox": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Marengo": "541539f004b1b1722ac96e897d06ac45",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Petersburg": "82b5d3f05f88ac02cb5a4c3fb08fa191",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Tell_City": "dfe557585c608ee9e34e9b75fbe72617",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Vevay": "d0f3d93603268abdfeb402bbe0c3c0b3",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Vincennes": "d13258dc61c8a747a914396a56e4218c",
  "dxmodules\\zoneinfo\\posix\\America\\Indiana\\Winamac": "e6b915ae1c01b71fd7b42b00b4664029",
  "dxmodules\\zoneinfo\\posix\\America\\Indianapolis": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\posix\\America\\Inuvik": "4ea2c19a83f810220c7302c9914e4ee4",
  "dxmodules\\zoneinfo\\posix\\America\\Iqaluit": "4142e0b137ac6cf3fdad0fce11560ca1",
  "dxmodules\\zoneinfo\\posix\\America\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af",
  "dxmodules\\zoneinfo\\posix\\America\\Jujuy": "0bc85ce1c3ee3f47ed53b12d36e9fe11",
  "dxmodules\\zoneinfo\\posix\\America\\Juneau": "6276c692ca4f68dcb846d7e918ee23dd",
  "dxmodules\\zoneinfo\\posix\\America\\Kentucky\\Louisville": "99545115e4f688d7f573d38d667194d9",
  "dxmodules\\zoneinfo\\posix\\America\\Kentucky\\Monticello": "4041c24d41fbbd407e4d398824225d50",
  "dxmodules\\zoneinfo\\posix\\America\\Knox_IN": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\posix\\America\\Kralendijk": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\posix\\America\\La_Paz": "962d2f2486d3c16a6095390156e322b3",
  "dxmodules\\zoneinfo\\posix\\America\\Lima": "cc24c83127c28793afc54e43fe5766e4",
  "dxmodules\\zoneinfo\\posix\\America\\Los_Angeles": "9323ff44ce205ce1a1bad7e2dca39939",
  "dxmodules\\zoneinfo\\posix\\America\\Louisville": "99545115e4f688d7f573d38d667194d9",
  "dxmodules\\zoneinfo\\posix\\America\\Lower_Princes": "ec6b184bca638f7aabed9c8bca9aa84c",
  "dxmodules\\zoneinfo\\posix\\America\\Maceio": "378a3e07cabc7773b6078025e9981793",
  "dxmodules\\zoneinfo\\posix\\America\\Managua": "4667d4aa7d530f1f61f5b116258eb84d",
  "dxmodules\\zoneinfo\\posix\\America\\Manaus": "585a0b598d406e6c0d710182bbdba35e",
  "dxmodules\\zoneinfo\\posix\\America\\Marigot": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Martinique": "ecdf79bbd2c17670a4637d06b01d7819",
  "dxmodules\\zoneinfo\\posix\\America\\Matamoros": "9ba17635ae8f44fa50c4565328433383",
  "dxmodules\\zoneinfo\\posix\\America\\Mazatlan": "2a157b818df8ab296baf6de38cd7d32b",
  "dxmodules\\zoneinfo\\posix\\America\\Mendoza": "99ae1ec6995a7866d5b2d1e9478b5870",
  "dxmodules\\zoneinfo\\posix\\America\\Menominee": "c720185d11deb83ad58b22b118830261",
  "dxmodules\\zoneinfo\\posix\\America\\Merida": "91ebe16317802987c2cd9c567b6e4c2a",
  "dxmodules\\zoneinfo\\posix\\America\\Metlakatla": "02b06c27e6b6de8398ac263055a2d280",
  "dxmodules\\zoneinfo\\posix\\America\\Mexico_City": "cff58c6976849e1e8f94d4288b07b9d2",
  "dxmodules\\zoneinfo\\posix\\America\\Miquelon": "ac08a2e10dea976318846a7f7b254f26",
  "dxmodules\\zoneinfo\\posix\\America\\Moncton": "2fa9e016bc7e55f51d036a158a40e0e9",
  "dxmodules\\zoneinfo\\posix\\America\\Monterrey": "f77b22ac5e4f995ef8d4839835a54faa",
  "dxmodules\\zoneinfo\\posix\\America\\Montevideo": "51fb8d4c68e90f30d5eb1dd503bf202e",
  "dxmodules\\zoneinfo\\posix\\America\\Montreal": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\posix\\America\\Montserrat": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Nassau": "1444a5132c9a26f350ebe705760215c7",
  "dxmodules\\zoneinfo\\posix\\America\\New_York": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\posix\\America\\Nipigon": "365984faa12e0762dac780bf71204633",
  "dxmodules\\zoneinfo\\posix\\America\\Nome": "f9cb8bbe99e6143a75b2797ddf94f234",
  "dxmodules\\zoneinfo\\posix\\America\\Noronha": "a8562cc7d0e4555968ad7744dceb9d43",
  "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\Beulah": "59406487459534f8844f828b8356d083",
  "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\Center": "6964f42dc925648abaa448f18b330d46",
  "dxmodules\\zoneinfo\\posix\\America\\North_Dakota\\New_Salem": "c14a42a9b8d8571354c8ced6fa931eac",
  "dxmodules\\zoneinfo\\posix\\America\\Nuuk": "4a1f3fd710057cfeaf3e7ac964a18466",
  "dxmodules\\zoneinfo\\posix\\America\\Ojinaga": "95e6bee1cb146689410010d58e6ee974",
  "dxmodules\\zoneinfo\\posix\\America\\Panama": "843b6eadcdd7838269e2195df886ebf1",
  "dxmodules\\zoneinfo\\posix\\America\\Pangnirtung": "b71f8c6f5a9b289c981af0cdbf80f7e1",
  "dxmodules\\zoneinfo\\posix\\America\\Paramaribo": "2d11461cf62c48496eb9a866b3eb1712",
  "dxmodules\\zoneinfo\\posix\\America\\Phoenix": "c697bb02e057325a74547912f631a3a7",
  "dxmodules\\zoneinfo\\posix\\America\\Port-au-Prince": "27e4cb1b082cd694df8c1b2f27838f85",
  "dxmodules\\zoneinfo\\posix\\America\\Porto_Acre": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\posix\\America\\Porto_Velho": "63160b0eb1d694ae0f97644160eea68a",
  "dxmodules\\zoneinfo\\posix\\America\\Port_of_Spain": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Puerto_Rico": "b3feb20144b4070d5eff32dab8c8a160",
  "dxmodules\\zoneinfo\\posix\\America\\Punta_Arenas": "9c43769cae1008f7fd054e807960a9cd",
  "dxmodules\\zoneinfo\\posix\\America\\Rainy_River": "4bdb5a197d174ac4834b4e738340fdf6",
  "dxmodules\\zoneinfo\\posix\\America\\Rankin_Inlet": "902bc59be5586a60cf0c67188027f7c4",
  "dxmodules\\zoneinfo\\posix\\America\\Recife": "a9b9203d577c57c1cbf0873327336ac1",
  "dxmodules\\zoneinfo\\posix\\America\\Regina": "cec6491b350dfbdb74732df745eb37d3",
  "dxmodules\\zoneinfo\\posix\\America\\Resolute": "e272bb16aa765ea5439726dde6f283eb",
  "dxmodules\\zoneinfo\\posix\\America\\Rio_Branco": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\posix\\America\\Rosario": "7b404b9cb52ed64b6fdecd3a623f828b",
  "dxmodules\\zoneinfo\\posix\\America\\Santarem": "31689ae81ac7aea65cc5784da4560e73",
  "dxmodules\\zoneinfo\\posix\\America\\Santa_Isabel": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\posix\\America\\Santiago": "b8db6707d0c4f0dfc7a12be81d35df8f",
  "dxmodules\\zoneinfo\\posix\\America\\Santo_Domingo": "7edb49f18d76f116c5578c3dcd279ade",
  "dxmodules\\zoneinfo\\posix\\America\\Sao_Paulo": "339ff8dbd88e39f59b2fd4ee57b1fdb1",
  "dxmodules\\zoneinfo\\posix\\America\\Scoresbysund": "1a5f6775efbfe9befc36df0a3d19c594",
  "dxmodules\\zoneinfo\\posix\\America\\Shiprock": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\posix\\America\\Sitka": "efa4e4969d3d0423dc3429a756921244",
  "dxmodules\\zoneinfo\\posix\\America\\St_Barthelemy": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\St_Johns": "79d938b80bf215c8e13d2cb4727343d8",
  "dxmodules\\zoneinfo\\posix\\America\\St_Kitts": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\St_Lucia": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\St_Thomas": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\St_Vincent": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Swift_Current": "c74726e554d359f38a26870282725f04",
  "dxmodules\\zoneinfo\\posix\\America\\Tegucigalpa": "963e88d190d129470f37774310dd20e4",
  "dxmodules\\zoneinfo\\posix\\America\\Thule": "32b5bb9f1f25d306246bd96a0ef317c4",
  "dxmodules\\zoneinfo\\posix\\America\\Thunder_Bay": "aa82e0d2a447d3610f4c2eea10c2a7b8",
  "dxmodules\\zoneinfo\\posix\\America\\Tijuana": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\posix\\America\\Toronto": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\posix\\America\\Tortola": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Vancouver": "9d48c60fed12ae8a6f5b139bf0b254b5",
  "dxmodules\\zoneinfo\\posix\\America\\Virgin": "6764b4898d885ffe98315abf798540ec",
  "dxmodules\\zoneinfo\\posix\\America\\Whitehorse": "3b82b92569a6900dadc0aa62c7cb6f36",
  "dxmodules\\zoneinfo\\posix\\America\\Winnipeg": "f0683580a6116b3c744cb6b3d63aa0b1",
  "dxmodules\\zoneinfo\\posix\\America\\Yakutat": "ee0f462df87e663c328908c5e81260d0",
  "dxmodules\\zoneinfo\\posix\\America\\Yellowknife": "b5087ae9a8ccc013470ebf44bc635281",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Casey": "f6d44d9ea6501a60287aeff26715bef0",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Davis": "80a08215623fd38f21aa72861fdf54cd",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\DumontDUrville": "e3f2c24ea8bfb0c5bea7a209cfd1baae",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Macquarie": "7c8809733d07903666654c0e67aeaec5",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Mawson": "d285e96947e86928c647ab2b2cf185b5",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\McMurdo": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Palmer": "3a6a847fb145840a4941337c2ae86d96",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Rothera": "70e1309683f8a4afa2f0d752bf97b46c",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\South_Pole": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Syowa": "553ede0b9071e1364892b1ed27a7f1a6",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Troll": "f13b257391af38577970477597e9d499",
  "dxmodules\\zoneinfo\\posix\\Antarctica\\Vostok": "4bb37b331311a0867117d218adf10610",
  "dxmodules\\zoneinfo\\posix\\Arctic\\Longyearbyen": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\posix\\Asia\\Aden": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Almaty": "938c35fa2fdc23ae382ad9b2278c6f58",
  "dxmodules\\zoneinfo\\posix\\Asia\\Amman": "63694da35da6a976fb37a62debd191a4",
  "dxmodules\\zoneinfo\\posix\\Asia\\Anadyr": "5648ae758f6447668653221263b5ea9d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Aqtau": "d020e6bedcd22c98f021e7c1c3ed8ee4",
  "dxmodules\\zoneinfo\\posix\\Asia\\Aqtobe": "486c6c79d56174ee29d05fc6efd9e18e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ashgabat": "235b16a54519989a51679188703ca5ac",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ashkhabad": "235b16a54519989a51679188703ca5ac",
  "dxmodules\\zoneinfo\\posix\\Asia\\Atyrau": "5fbe4e89da1f20229c0c3747017557c0",
  "dxmodules\\zoneinfo\\posix\\Asia\\Baghdad": "af9423b28aad58ffc1790d29244309b8",
  "dxmodules\\zoneinfo\\posix\\Asia\\Bahrain": "fc5a2c1c087d56e4b7323259ab62bef6",
  "dxmodules\\zoneinfo\\posix\\Asia\\Baku": "27e366b2523ae3dfd1e648ecdf54bc15",
  "dxmodules\\zoneinfo\\posix\\Asia\\Bangkok": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\posix\\Asia\\Barnaul": "cfefaae119b421f5b3c990ef4948ebf7",
  "dxmodules\\zoneinfo\\posix\\Asia\\Beirut": "785117e925db8afec6b0c761163b002c",
  "dxmodules\\zoneinfo\\posix\\Asia\\Bishkek": "5dec7f8d19f19560c2fd59b16f2a2214",
  "dxmodules\\zoneinfo\\posix\\Asia\\Brunei": "3db4e51993e234a73f7054160abf663d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Calcutta": "569f373970581e6488a24b5c70326d49",
  "dxmodules\\zoneinfo\\posix\\Asia\\Chita": "6b2c484a3c93d7523cd09ec0d13b53fe",
  "dxmodules\\zoneinfo\\posix\\Asia\\Choibalsan": "8ca46182ff4884d5b45c3c41e777783a",
  "dxmodules\\zoneinfo\\posix\\Asia\\Chongqing": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Chungking": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Colombo": "12c255c649eaa1ade0387c30596825d9",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dacca": "ea255e2dada4541d25ad34139c18419f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Damascus": "07b6153d721b5d7d93d78f2591201ffa",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dhaka": "ea255e2dada4541d25ad34139c18419f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dili": "5c7fb0d932343cc330df273a5bb9308b",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dubai": "e17583385b056a775970e7bcd9a6b7dd",
  "dxmodules\\zoneinfo\\posix\\Asia\\Dushanbe": "29a7b7661ea6575cd7f8ba1435b78f1d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Famagusta": "14a69e4234b2f2c02a3d3a46d0ecffbb",
  "dxmodules\\zoneinfo\\posix\\Asia\\Gaza": "798a2fa999dfbd3d557b0afeedc99562",
  "dxmodules\\zoneinfo\\posix\\Asia\\Harbin": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Hebron": "f600ca83e00a4c2d046dbd5ae0461018",
  "dxmodules\\zoneinfo\\posix\\Asia\\Hong_Kong": "1f5267f14578c917d94c972e46fc8e0e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Hovd": "585f478cf864b0065bd07587e6b1e41f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ho_Chi_Minh": "104047aa22a3824e08e4fffeccc80d19",
  "dxmodules\\zoneinfo\\posix\\Asia\\Irkutsk": "8a84642c58ed64282884014698df2f7d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\posix\\Asia\\Jakarta": "c280819a288b0aea09db4fd1fd017546",
  "dxmodules\\zoneinfo\\posix\\Asia\\Jayapura": "75c2120efce23b61989c6a15635d115f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Jerusalem": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kabul": "47a295d1de026d2e443c132316ed4533",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kamchatka": "da5950adc8bcdb823cff01b81d2d1ec9",
  "dxmodules\\zoneinfo\\posix\\Asia\\Karachi": "b1afc0a7ce4118813cdc8679e8b20d8a",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kashgar": "a43f32e98fa40e6601db5cca019a01a8",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kathmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Katmandu": "2b7951dfdb7b8c4056d0d48d89f0d5b1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Khandyga": "d8845dc2bfed88c1aef353c99c332d8e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kolkata": "569f373970581e6488a24b5c70326d49",
  "dxmodules\\zoneinfo\\posix\\Asia\\Krasnoyarsk": "6459a2dc5df86eecb3d8d881e285fbc5",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kuala_Lumpur": "8a0970a2f6db03aa6317757fe59d24e5",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kuching": "941bf864c5cd1bcbcba5bf386815338d",
  "dxmodules\\zoneinfo\\posix\\Asia\\Kuwait": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Macao": "f61abab83b519b307988b2c9e1c13037",
  "dxmodules\\zoneinfo\\posix\\Asia\\Macau": "f61abab83b519b307988b2c9e1c13037",
  "dxmodules\\zoneinfo\\posix\\Asia\\Magadan": "7d44faf13ac5b3facbd83ff3857a0e1e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Makassar": "13cba3c3bb605214bf3464922974ca13",
  "dxmodules\\zoneinfo\\posix\\Asia\\Manila": "7edfd09b1ebe5e5a152a03a7a705f5bc",
  "dxmodules\\zoneinfo\\posix\\Asia\\Muscat": "e17583385b056a775970e7bcd9a6b7dd",
  "dxmodules\\zoneinfo\\posix\\Asia\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a",
  "dxmodules\\zoneinfo\\posix\\Asia\\Novokuznetsk": "d5f8acb7b4e7d664a04dd154980eda1f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Novosibirsk": "b6434f1e22bf4098c2a8c5371dc301fe",
  "dxmodules\\zoneinfo\\posix\\Asia\\Omsk": "e789f5c5cce168d524f5a8c2486b62ba",
  "dxmodules\\zoneinfo\\posix\\Asia\\Oral": "2586cc76cb792e5a3e56f5c130892c93",
  "dxmodules\\zoneinfo\\posix\\Asia\\Phnom_Penh": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\posix\\Asia\\Pontianak": "75dbcd818e883badda4d6df52f07c9ae",
  "dxmodules\\zoneinfo\\posix\\Asia\\Pyongyang": "55ccc2dfaf651c7452baf53f3c0bcaa1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Qatar": "fc5a2c1c087d56e4b7323259ab62bef6",
  "dxmodules\\zoneinfo\\posix\\Asia\\Qostanay": "6f2759a853ade2f4c50fddc156e833c6",
  "dxmodules\\zoneinfo\\posix\\Asia\\Qyzylorda": "2794eeaae5075fae6c902660beae2141",
  "dxmodules\\zoneinfo\\posix\\Asia\\Rangoon": "facd5e2823e744613e5d83384b53b17f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Riyadh": "129654b1aa89b1c15adfb645ecf0909f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Saigon": "104047aa22a3824e08e4fffeccc80d19",
  "dxmodules\\zoneinfo\\posix\\Asia\\Sakhalin": "d065dcba4d1f2f8df4862ea639caf3f3",
  "dxmodules\\zoneinfo\\posix\\Asia\\Samarkand": "7c0752cecdf1b32c7618128577045bcc",
  "dxmodules\\zoneinfo\\posix\\Asia\\Seoul": "f7a6e371bd709b3c2f64ce6f67f39f29",
  "dxmodules\\zoneinfo\\posix\\Asia\\Shanghai": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3",
  "dxmodules\\zoneinfo\\posix\\Asia\\Srednekolymsk": "9e7e46bbc5dad40e5f90e797d941d22e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Taipei": "2e67467e3c050e8b3a4022eb9e20300e",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tashkent": "3e47dbc84c7895e2cb890776d3ad119b",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tbilisi": "da70a44f47a6a309eff8c9302fecf559",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tehran": "d2cb514595346f1168c2f1167409ec7c",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tel_Aviv": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\posix\\Asia\\Thimbu": "97be2e1f7789978b407476a8094d5ee1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Thimphu": "97be2e1f7789978b407476a8094d5ee1",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tokyo": "478afb8b1f182b2ff53caa2e6cc8ffd9",
  "dxmodules\\zoneinfo\\posix\\Asia\\Tomsk": "903e9bdc80298a4433a48219a071d4af",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ujung_Pandang": "13cba3c3bb605214bf3464922974ca13",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ulaanbaatar": "3f0446e3735c9dd93089eeae31a37c1b",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ulan_Bator": "3f0446e3735c9dd93089eeae31a37c1b",
  "dxmodules\\zoneinfo\\posix\\Asia\\Urumqi": "a43f32e98fa40e6601db5cca019a01a8",
  "dxmodules\\zoneinfo\\posix\\Asia\\Ust-Nera": "4d04e65ff5d8c7b407d6cb8dedbe33a4",
  "dxmodules\\zoneinfo\\posix\\Asia\\Vientiane": "a8fc525118cfe44167208f386928b338",
  "dxmodules\\zoneinfo\\posix\\Asia\\Vladivostok": "cecab70411f0df191ef4a2cb747bdb08",
  "dxmodules\\zoneinfo\\posix\\Asia\\Yakutsk": "bfef1f6f86fa7080259fd26f7668bc84",
  "dxmodules\\zoneinfo\\posix\\Asia\\Yangon": "facd5e2823e744613e5d83384b53b17f",
  "dxmodules\\zoneinfo\\posix\\Asia\\Yekaterinburg": "807931acd2f4fa27806b8208de988391",
  "dxmodules\\zoneinfo\\posix\\Asia\\Yerevan": "e196b792aab3b785a957682c74f574e7",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Azores": "5433c796c8a770b6b06fe812ae08527f",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Bermuda": "659000f311b0ab5c90442cb81278c62c",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Canary": "167a786aa74ba2a9dd68c470746aa0ac",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Cape_Verde": "b3795953b76fb3cc553fdbb4d825cb93",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Faeroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Faroe": "28ce2d6ea684cfbcc27a1fd9dc2be28b",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Jan_Mayen": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Madeira": "2e4a8509560836b8341ec2e612627005",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Reykjavik": "d5e2f791bed996743c667784bb8c52ea",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\South_Georgia": "f0b2aeeddf3200b6a5839d86f35879e6",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\Stanley": "5a5247cc12a456fee6716540c14e55ad",
  "dxmodules\\zoneinfo\\posix\\Atlantic\\St_Helena": "74c6fb9ae4ea68d0012c1f6ad42b5848",
  "dxmodules\\zoneinfo\\posix\\Australia\\ACT": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\posix\\Australia\\Adelaide": "a3ec822dc0c8fd04e431b3316d1166ca",
  "dxmodules\\zoneinfo\\posix\\Australia\\Brisbane": "0c8a54dfc42c9a987fff25d5d72096fa",
  "dxmodules\\zoneinfo\\posix\\Australia\\Broken_Hill": "c0a218c9fe25b535b4a1a6b70dad3af2",
  "dxmodules\\zoneinfo\\posix\\Australia\\Canberra": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\posix\\Australia\\Currie": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\posix\\Australia\\Darwin": "cbb2b15b2c2034c2584f801cec184e2b",
  "dxmodules\\zoneinfo\\posix\\Australia\\Eucla": "1459b57ff3474bbe12013908f4bed8aa",
  "dxmodules\\zoneinfo\\posix\\Australia\\Hobart": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\posix\\Australia\\LHI": "b664b61c1949c1beea8838facf6c1d8b",
  "dxmodules\\zoneinfo\\posix\\Australia\\Lindeman": "4d125f1a5ec84cf6f62607152dedf324",
  "dxmodules\\zoneinfo\\posix\\Australia\\Lord_Howe": "b664b61c1949c1beea8838facf6c1d8b",
  "dxmodules\\zoneinfo\\posix\\Australia\\Melbourne": "5f06e3a482d43ee4018736ac792b1129",
  "dxmodules\\zoneinfo\\posix\\Australia\\North": "cbb2b15b2c2034c2584f801cec184e2b",
  "dxmodules\\zoneinfo\\posix\\Australia\\NSW": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\posix\\Australia\\Perth": "a54a9120fddca3a9bb951ac9d8bce260",
  "dxmodules\\zoneinfo\\posix\\Australia\\Queensland": "0c8a54dfc42c9a987fff25d5d72096fa",
  "dxmodules\\zoneinfo\\posix\\Australia\\South": "a3ec822dc0c8fd04e431b3316d1166ca",
  "dxmodules\\zoneinfo\\posix\\Australia\\Sydney": "b5966da18e9c1c7f416acf99aa06eee6",
  "dxmodules\\zoneinfo\\posix\\Australia\\Tasmania": "4f9453d5757b8d950509849eca148f75",
  "dxmodules\\zoneinfo\\posix\\Australia\\Victoria": "5f06e3a482d43ee4018736ac792b1129",
  "dxmodules\\zoneinfo\\posix\\Australia\\West": "a54a9120fddca3a9bb951ac9d8bce260",
  "dxmodules\\zoneinfo\\posix\\Australia\\Yancowinna": "c0a218c9fe25b535b4a1a6b70dad3af2",
  "dxmodules\\zoneinfo\\posix\\Brazil\\Acre": "2dd6a364634c61cacdefec7874cea115",
  "dxmodules\\zoneinfo\\posix\\Brazil\\DeNoronha": "a8562cc7d0e4555968ad7744dceb9d43",
  "dxmodules\\zoneinfo\\posix\\Brazil\\East": "339ff8dbd88e39f59b2fd4ee57b1fdb1",
  "dxmodules\\zoneinfo\\posix\\Brazil\\West": "585a0b598d406e6c0d710182bbdba35e",
  "dxmodules\\zoneinfo\\posix\\Canada\\Atlantic": "820f35f23d49a527ffe813e2d96c5da7",
  "dxmodules\\zoneinfo\\posix\\Canada\\Central": "f0683580a6116b3c744cb6b3d63aa0b1",
  "dxmodules\\zoneinfo\\posix\\Canada\\Eastern": "cac1d4298f3576d2d10e9fa1c0da3b54",
  "dxmodules\\zoneinfo\\posix\\Canada\\Mountain": "1f23503189b8ce70677b2dcbb4a57e8c",
  "dxmodules\\zoneinfo\\posix\\Canada\\Newfoundland": "79d938b80bf215c8e13d2cb4727343d8",
  "dxmodules\\zoneinfo\\posix\\Canada\\Pacific": "9d48c60fed12ae8a6f5b139bf0b254b5",
  "dxmodules\\zoneinfo\\posix\\Canada\\Saskatchewan": "cec6491b350dfbdb74732df745eb37d3",
  "dxmodules\\zoneinfo\\posix\\Canada\\Yukon": "3b82b92569a6900dadc0aa62c7cb6f36",
  "dxmodules\\zoneinfo\\posix\\CET": "3f166816639388adb3d3567e28ef2145",
  "dxmodules\\zoneinfo\\posix\\Chile\\Continental": "b8db6707d0c4f0dfc7a12be81d35df8f",
  "dxmodules\\zoneinfo\\posix\\Chile\\EasterIsland": "ea76f04afd1b377b869cd7532b35457c",
  "dxmodules\\zoneinfo\\posix\\CST6CDT": "8396c3e49c717f9ba736b4d4d1b24b8b",
  "dxmodules\\zoneinfo\\posix\\Cuba": "1877fc45317e144ea206ddc622cebba2",
  "dxmodules\\zoneinfo\\posix\\EET": "16b84f2a83840fd4132c2e3fbff3b758",
  "dxmodules\\zoneinfo\\posix\\Egypt": "b9bb9d8c3cddc72252f4aa2082af4213",
  "dxmodules\\zoneinfo\\posix\\Eire": "0e226ce4b36682f2c9c2fa1146809778",
  "dxmodules\\zoneinfo\\posix\\EST": "d0f150b6acc4dc78b8ada8abb1079af6",
  "dxmodules\\zoneinfo\\posix\\EST5EDT": "e7a28a1315bcd4deedaaac6d1c3cd3e2",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+1": "169210c55520d3a8efc1362a5d89e402",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+10": "03d40b4007e96680e56f10372148cf51",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+11": "bb030b7fea0da0987217737e22a9cbe0",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+12": "66046646734491458066327a04705b0c",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+2": "0a97351084a016afb88b8b698ea922d8",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+3": "73897f3686a7bca3e2719cfa59f83b6b",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+4": "e943df1168ea3d597ec62c8933a11a9c",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+5": "a9d53018097b6bcca5e6a4e55211e80b",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+6": "0a8c24c796c1473250ff564fce59e937",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+7": "d87007923e671b8b78552d613299ac8a",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+8": "e99240e190c8a4ccf3cc0a26618fb09b",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT+9": "e77b0b4911d483289610c4efcd599d7d",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-1": "a3c457b6cc2c3be7f34da00d84ec229e",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-10": "8ed77c9096196e97be5f0807bf939bac",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-11": "dcdc4caf8194fa9d29ceccdc225a5048",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-12": "fe87b6111ce93c3d10fe152ca715a715",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-13": "0fd6f7e68d38e1cef98efdc6ecedae80",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-14": "155f8eb5a5dd22c81eef6986c8c5317c",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-2": "a9eafb629b4070ca0ff8f99631390031",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-3": "b73ddab7b5ca9128a8b2925fad5b11f0",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-4": "0c08dc6b2974b3207bf6293544a236b0",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-5": "57ca1133eeeb09c7c30c04850d49d4e5",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-6": "642170284ddc2575f5e077d7ea33dcdc",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-7": "2f4d1ba17adf0c86acb4cc6258f8a0cb",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-8": "f4d3b2b664698da9268d3f244fec9232",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT-9": "02963228a1537cc2c8bdf22e99178893",
  "dxmodules\\zoneinfo\\posix\\Etc\\GMT0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\Greenwich": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Etc\\UCT": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Etc\\Universal": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Etc\\UTC": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Etc\\Zulu": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Europe\\Amsterdam": "e3b0d618da0bd60d894183dd0d53923e",
  "dxmodules\\zoneinfo\\posix\\Europe\\Andorra": "8bfff3a580b4b0db3dff30d1d7385ac4",
  "dxmodules\\zoneinfo\\posix\\Europe\\Astrakhan": "ba197918d51925f1e0b771923ce3a19f",
  "dxmodules\\zoneinfo\\posix\\Europe\\Athens": "75d641576f8d4376045ba8f16db4063a",
  "dxmodules\\zoneinfo\\posix\\Europe\\Belfast": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Belgrade": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Berlin": "4790e83465681cefbf852aed265354bf",
  "dxmodules\\zoneinfo\\posix\\Europe\\Bratislava": "eab2cea5cb5bf0374f6bf891b9102844",
  "dxmodules\\zoneinfo\\posix\\Europe\\Brussels": "3d5d93412e485bac12e0587239835fd9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Bucharest": "751205baadb94c5f41dadbcc97ab23db",
  "dxmodules\\zoneinfo\\posix\\Europe\\Budapest": "f76d3a5131d6910f5c2a34fbe35c265e",
  "dxmodules\\zoneinfo\\posix\\Europe\\Busingen": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\posix\\Europe\\Chisinau": "717476d2fe0213c40e31f52573c05356",
  "dxmodules\\zoneinfo\\posix\\Europe\\Copenhagen": "96039e70388d843950bcbef21328bba6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Dublin": "0e226ce4b36682f2c9c2fa1146809778",
  "dxmodules\\zoneinfo\\posix\\Europe\\Gibraltar": "77fe14fec44142c1435dcc4eac003df4",
  "dxmodules\\zoneinfo\\posix\\Europe\\Guernsey": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Helsinki": "3eaa8467ffb21b15bd75200ff2c0a3db",
  "dxmodules\\zoneinfo\\posix\\Europe\\Isle_of_Man": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Istanbul": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\posix\\Europe\\Jersey": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Kaliningrad": "7dc8e4aecf6dcf214b52938e289c9831",
  "dxmodules\\zoneinfo\\posix\\Europe\\Kiev": "f957769855be8b9d5983e51c033975d8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Kirov": "6467d1d15049cb0015bbd56c92b18814",
  "dxmodules\\zoneinfo\\posix\\Europe\\Lisbon": "b9ba38decf09fe0728f81ebeabf29cfe",
  "dxmodules\\zoneinfo\\posix\\Europe\\Ljubljana": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\London": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Luxembourg": "3242615a805f051357309a89874633f3",
  "dxmodules\\zoneinfo\\posix\\Europe\\Madrid": "3ecb0fe1a9207bc3f77e793315ce0e5d",
  "dxmodules\\zoneinfo\\posix\\Europe\\Malta": "b6e707a0d755cfd038a7c4ecc44845e7",
  "dxmodules\\zoneinfo\\posix\\Europe\\Mariehamn": "3eaa8467ffb21b15bd75200ff2c0a3db",
  "dxmodules\\zoneinfo\\posix\\Europe\\Minsk": "07aeb33b58212d75e92b8eb157cc1624",
  "dxmodules\\zoneinfo\\posix\\Europe\\Monaco": "89271b78b389e6180385b96e7af94e7a",
  "dxmodules\\zoneinfo\\posix\\Europe\\Moscow": "223bbf37352a9d4807919132f360535e",
  "dxmodules\\zoneinfo\\posix\\Europe\\Nicosia": "dc4ea7e37ba20ea164845151f1d2966a",
  "dxmodules\\zoneinfo\\posix\\Europe\\Oslo": "bf4f10e6703e5142a7c4d23dc4cd7ef0",
  "dxmodules\\zoneinfo\\posix\\Europe\\Paris": "fe22373ca65df6ba6b254f5c4304fae8",
  "dxmodules\\zoneinfo\\posix\\Europe\\Podgorica": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Prague": "eab2cea5cb5bf0374f6bf891b9102844",
  "dxmodules\\zoneinfo\\posix\\Europe\\Riga": "b4541699f68b4aba0daa45df63e596a4",
  "dxmodules\\zoneinfo\\posix\\Europe\\Rome": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Samara": "d390934cf2dc01f033ffda93394c85d7",
  "dxmodules\\zoneinfo\\posix\\Europe\\San_Marino": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Sarajevo": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Saratov": "756b361dc39b978b78eaf6df78a7ad0e",
  "dxmodules\\zoneinfo\\posix\\Europe\\Simferopol": "9b2ddc8ca9d5c792d09f37ca58104afa",
  "dxmodules\\zoneinfo\\posix\\Europe\\Skopje": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Sofia": "68e6be692f44b3ed696fd2e6ef806927",
  "dxmodules\\zoneinfo\\posix\\Europe\\Stockholm": "1b9ed89af7331c6141249d181b42c621",
  "dxmodules\\zoneinfo\\posix\\Europe\\Tallinn": "46abec9f16a148333139ff5b0b6d1115",
  "dxmodules\\zoneinfo\\posix\\Europe\\Tirane": "d5977bad592e33b2e4058a242d735927",
  "dxmodules\\zoneinfo\\posix\\Europe\\Tiraspol": "717476d2fe0213c40e31f52573c05356",
  "dxmodules\\zoneinfo\\posix\\Europe\\Ulyanovsk": "ff8f50dd006548eb8751802c600f2299",
  "dxmodules\\zoneinfo\\posix\\Europe\\Uzhgorod": "0b4761ce9ee17b7b8bfb0d12063803c6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Vaduz": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\posix\\Europe\\Vatican": "1c1a2a92e0bacf58566a499c272371a6",
  "dxmodules\\zoneinfo\\posix\\Europe\\Vienna": "cb0f39744833718fbd602c54e0425157",
  "dxmodules\\zoneinfo\\posix\\Europe\\Vilnius": "524d360c5369c1abcb59e8140b59acda",
  "dxmodules\\zoneinfo\\posix\\Europe\\Volgograd": "442a047745c83ebebc180c67f6798fc2",
  "dxmodules\\zoneinfo\\posix\\Europe\\Warsaw": "2ed881ef7e09c844c009673ded84c798",
  "dxmodules\\zoneinfo\\posix\\Europe\\Zagreb": "226ad0c2724b4674d6a9206a43661ff9",
  "dxmodules\\zoneinfo\\posix\\Europe\\Zaporozhye": "69430a5e3e93bd0ed6e2e604ddf6e903",
  "dxmodules\\zoneinfo\\posix\\Europe\\Zurich": "b54a7b1f6e77f2fbdccce79bb64fb32d",
  "dxmodules\\zoneinfo\\posix\\GB": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\GB-Eire": "410c65079e6d14f4eedf50c19bd073f8",
  "dxmodules\\zoneinfo\\posix\\GMT": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\GMT+0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\GMT-0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\GMT0": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Greenwich": "fcccbcf95c718cf2fdee557763e460be",
  "dxmodules\\zoneinfo\\posix\\Hongkong": "1f5267f14578c917d94c972e46fc8e0e",
  "dxmodules\\zoneinfo\\posix\\HST": "fd4ae9e0296519fb47b4b036ea4af025",
  "dxmodules\\zoneinfo\\posix\\Iceland": "d5e2f791bed996743c667784bb8c52ea",
  "dxmodules\\zoneinfo\\posix\\Indian\\Antananarivo": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Indian\\Chagos": "dfb323eb6037596036669f4b4505544c",
  "dxmodules\\zoneinfo\\posix\\Indian\\Christmas": "02b16169f8f47de904f3f05cb7f72583",
  "dxmodules\\zoneinfo\\posix\\Indian\\Cocos": "d9ffcdd40666dcb76225bdfb4654c0cf",
  "dxmodules\\zoneinfo\\posix\\Indian\\Comoro": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Indian\\Kerguelen": "749273edab499ed254e32606a9e5579e",
  "dxmodules\\zoneinfo\\posix\\Indian\\Mahe": "0df488f823d924b336f01d53d270af73",
  "dxmodules\\zoneinfo\\posix\\Indian\\Maldives": "89a066bf0512071db2a9eb425df46341",
  "dxmodules\\zoneinfo\\posix\\Indian\\Mauritius": "8f06c0fc457b6a12c0bbc4946e2dfb05",
  "dxmodules\\zoneinfo\\posix\\Indian\\Mayotte": "d25adca22556aa3ce379975a2c017ddf",
  "dxmodules\\zoneinfo\\posix\\Indian\\Reunion": "817b0a2e45ae9c1e566499a4b068295e",
  "dxmodules\\zoneinfo\\posix\\Iran": "d2cb514595346f1168c2f1167409ec7c",
  "dxmodules\\zoneinfo\\posix\\Israel": "9976080898f0f1603a45672ff90e0795",
  "dxmodules\\zoneinfo\\posix\\Jamaica": "9a25d93df3a5f1eeaebee8259357d3af",
  "dxmodules\\zoneinfo\\posix\\Japan": "478afb8b1f182b2ff53caa2e6cc8ffd9",
  "dxmodules\\zoneinfo\\posix\\Kwajalein": "6d9261ff9442c0cf69446e362202d691",
  "dxmodules\\zoneinfo\\posix\\Libya": "edec79f292e5b8c0d32b521af1f118bd",
  "dxmodules\\zoneinfo\\posix\\MET": "3b07c8cc8c1fed960246da4e3791a73c",
  "dxmodules\\zoneinfo\\posix\\Mexico\\BajaNorte": "f62f2b82ca05aafdbf7df7dca812df80",
  "dxmodules\\zoneinfo\\posix\\Mexico\\BajaSur": "2a157b818df8ab296baf6de38cd7d32b",
  "dxmodules\\zoneinfo\\posix\\Mexico\\General": "cff58c6976849e1e8f94d4288b07b9d2",
  "dxmodules\\zoneinfo\\posix\\MST": "04da8453f31d6971b7fa4f3f8fb26654",
  "dxmodules\\zoneinfo\\posix\\MST7MDT": "76be6718eb3cf4ac468387b5d13ffafb",
  "dxmodules\\zoneinfo\\posix\\Navajo": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\posix\\NZ": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\posix\\NZ-CHAT": "0e76ddb8bb10f4b8f2ee092f731b6452",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Apia": "6b2ba3b8fc50b635cdc0c1f117243439",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Auckland": "2bcf2f33917bed5122c58a4f208066a9",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Bougainville": "e2da4052206976c32cd533f22f0bcf15",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Chatham": "0e76ddb8bb10f4b8f2ee092f731b6452",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Chuuk": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Easter": "ea76f04afd1b377b869cd7532b35457c",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Efate": "25c51b2838decef2f9d90c15e4ef7d3c",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Enderbury": "6356a41b8b79885979b2b6613abecb73",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Fakaofo": "de7a32503bd8fdc5baec11e6b9aad69b",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Fiji": "7133b1eaf825848a26c6fe35f2601908",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Funafuti": "eb33daa3195c75c1a5b54b14fe461b73",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Galapagos": "684faae885b8ab403c2a54b9f1eecea9",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Gambier": "921dd1aee0026d9b376f293ce4f246bc",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Guadalcanal": "1de7b39a3bcdce97e8c93d336157dd8b",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Guam": "af8e7d6ffe7865cc595b49479e53d408",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Honolulu": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Johnston": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Kiritimati": "f5876d683bfa2f0339c3c048224e430f",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Kosrae": "ef22d34dcb3734017a59ecc62ab84713",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Kwajalein": "6d9261ff9442c0cf69446e362202d691",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Majuro": "86a054fd15bfbd9fe15156ba7f4155fd",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Marquesas": "e05efeb2e72d3a51e6019499841b509c",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Midway": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Nauru": "4f7dd62a8207d60009300c99c1773846",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Niue": "2d69ed1a3e4496ecd16c94846675a0f3",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Norfolk": "0ba7dc541ce5ad91b2d0aa81589ee205",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Noumea": "48f634aa56c4cfee3f6afd37b28b66b2",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Pago_Pago": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Palau": "3ffa839dec8323e475526d5cd38fa82a",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Pitcairn": "42e5aa28598d96efb16eb6734f31fda6",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Pohnpei": "45f293ec35daa27a60c7e0c90b58012d",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Ponape": "45f293ec35daa27a60c7e0c90b58012d",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Port_Moresby": "c43a5f332114d2a9cd1d6c9f259c71f3",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Rarotonga": "770947b4fd41633dc1d9cecc1ee972d2",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Saipan": "af8e7d6ffe7865cc595b49479e53d408",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Samoa": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Tahiti": "cdbc49403d1d7684e83fdfc258106885",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Tarawa": "b2564fba66250ab89502eec6d72c0c5e",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Tongatapu": "db7a5ceed05b395c4660be082a4377da",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Truk": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Wake": "5763840e0d743d0555d9f0813404da80",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Wallis": "36b100715cbee093d7c6056eaf60aeeb",
  "dxmodules\\zoneinfo\\posix\\Pacific\\Yap": "dcfd7e5eb42ee9d9f462407ae6603d95",
  "dxmodules\\zoneinfo\\posix\\Poland": "2ed881ef7e09c844c009673ded84c798",
  "dxmodules\\zoneinfo\\posix\\Portugal": "b9ba38decf09fe0728f81ebeabf29cfe",
  "dxmodules\\zoneinfo\\posix\\PRC": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\posix\\PST8PDT": "c9452f6b9e08d83c6815c38600798964",
  "dxmodules\\zoneinfo\\posix\\ROC": "2e67467e3c050e8b3a4022eb9e20300e",
  "dxmodules\\zoneinfo\\posix\\ROK": "f7a6e371bd709b3c2f64ce6f67f39f29",
  "dxmodules\\zoneinfo\\posix\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3",
  "dxmodules\\zoneinfo\\posix\\Turkey": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\posix\\UCT": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\Universal": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\US\\Alaska": "596428a3a840d568656088bd48e608f1",
  "dxmodules\\zoneinfo\\posix\\US\\Aleutian": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\posix\\US\\Arizona": "c697bb02e057325a74547912f631a3a7",
  "dxmodules\\zoneinfo\\posix\\US\\Central": "d0f076c9f390e7d8a933cc7cc1ad2e90",
  "dxmodules\\zoneinfo\\posix\\US\\East-Indiana": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\posix\\US\\Eastern": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\posix\\US\\Hawaii": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\posix\\US\\Indiana-Starke": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\posix\\US\\Michigan": "ae3ba6ed8738ceda9eef109c6c586736",
  "dxmodules\\zoneinfo\\posix\\US\\Mountain": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\posix\\US\\Pacific": "9323ff44ce205ce1a1bad7e2dca39939",
  "dxmodules\\zoneinfo\\posix\\US\\Samoa": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\posix\\UTC": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posix\\W-SU": "223bbf37352a9d4807919132f360535e",
  "dxmodules\\zoneinfo\\posix\\WET": "92388453e62ec1a69fbf12685ad247c7",
  "dxmodules\\zoneinfo\\posix\\Zulu": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\posixrules": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\PRC": "8e579768533a9aff0c73ab48a41be20f",
  "dxmodules\\zoneinfo\\PST8PDT": "c9452f6b9e08d83c6815c38600798964",
  "dxmodules\\zoneinfo\\right\\Africa\\Abidjan": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Accra": "255520b3cb5f796d992bd52bdc839d56",
  "dxmodules\\zoneinfo\\right\\Africa\\Addis_Ababa": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Algiers": "dc7f41bae1e1b345035837c6906d2f1c",
  "dxmodules\\zoneinfo\\right\\Africa\\Asmara": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Asmera": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Bamako": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Bangui": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Banjul": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Bissau": "f9a1ce1e51007b314f4dbb27844724c7",
  "dxmodules\\zoneinfo\\right\\Africa\\Blantyre": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Brazzaville": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Bujumbura": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Cairo": "c0216212a93d68f21decbbc1f0675104",
  "dxmodules\\zoneinfo\\right\\Africa\\Casablanca": "ce60e1f9ec1b5a9b18c628d3dc8a0cc4",
  "dxmodules\\zoneinfo\\right\\Africa\\Ceuta": "92a85bb65bee16f54ff4f05b7a335dd2",
  "dxmodules\\zoneinfo\\right\\Africa\\Conakry": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Dakar": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Dar_es_Salaam": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Djibouti": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Douala": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\El_Aaiun": "f10771f58dd1f28f45157eda123196e1",
  "dxmodules\\zoneinfo\\right\\Africa\\Freetown": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Gaborone": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Harare": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Johannesburg": "5280e94d5521939f68b5550d5f6c24d6",
  "dxmodules\\zoneinfo\\right\\Africa\\Juba": "894503e89177c5ac997b405e476f0b90",
  "dxmodules\\zoneinfo\\right\\Africa\\Kampala": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Khartoum": "30901eba0d53204dc8eaa9c9299893f8",
  "dxmodules\\zoneinfo\\right\\Africa\\Kigali": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Kinshasa": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Lagos": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Libreville": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Lome": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Luanda": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Lubumbashi": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Lusaka": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Malabo": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Maputo": "1c10fa1b37a4a62fc7dc0f8f2ba461ae",
  "dxmodules\\zoneinfo\\right\\Africa\\Maseru": "5280e94d5521939f68b5550d5f6c24d6",
  "dxmodules\\zoneinfo\\right\\Africa\\Mbabane": "5280e94d5521939f68b5550d5f6c24d6",
  "dxmodules\\zoneinfo\\right\\Africa\\Mogadishu": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Monrovia": "86cab61bd646f40aa46cd5c1ee80a2fc",
  "dxmodules\\zoneinfo\\right\\Africa\\Nairobi": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Africa\\Ndjamena": "eab0671bca010ceb9da03005e6fc6880",
  "dxmodules\\zoneinfo\\right\\Africa\\Niamey": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Nouakchott": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Ouagadougou": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Porto-Novo": "fdd731ea652a9ed57cf66dd46690842e",
  "dxmodules\\zoneinfo\\right\\Africa\\Sao_Tome": "1793151a4454db88070f6caf62c2d45f",
  "dxmodules\\zoneinfo\\right\\Africa\\Timbuktu": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Africa\\Tripoli": "140c8538c93832c7c7ae0e40d592dd33",
  "dxmodules\\zoneinfo\\right\\Africa\\Tunis": "38ccd67fb776c5af2edf8e925c10f956",
  "dxmodules\\zoneinfo\\right\\Africa\\Windhoek": "760491921188579dd193bb89f2650a38",
  "dxmodules\\zoneinfo\\right\\America\\Adak": "282e70d388dfd3923238b8ca86244246",
  "dxmodules\\zoneinfo\\right\\America\\Anchorage": "be6e5ef83221831fd57a032e03246920",
  "dxmodules\\zoneinfo\\right\\America\\Anguilla": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Antigua": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Araguaina": "4c90a3a30f8a255daccba781fa8b119e",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Buenos_Aires": "7f85ebd305bc1f7a173caf79f56e77aa",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Catamarca": "e4215654b35cc84b7de145a99ba2a8d4",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\ComodRivadavia": "e4215654b35cc84b7de145a99ba2a8d4",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Cordoba": "790e6c0ccdc0a17b0087bb7301434648",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Jujuy": "068eec3da9e503286b7c90c971573616",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\La_Rioja": "71958e1b5b3be0f35981845e14efef81",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Mendoza": "b95d8152904b0fdf042c6f5167ff90ab",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Rio_Gallegos": "629f976661deb50db7be073b3855b1f7",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Salta": "af0b9512b0dcc379b6f8ba6ddd7d369d",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\San_Juan": "f2fb8b1669d16992662ec824a2e14cb2",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\San_Luis": "08bbc43d6dabe797db33e439d7bce790",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Tucuman": "36d861157f9c70e9dda84b82a34a3ea0",
  "dxmodules\\zoneinfo\\right\\America\\Argentina\\Ushuaia": "c75191b4db13d1b265b118754debe666",
  "dxmodules\\zoneinfo\\right\\America\\Aruba": "a3dd71a0d51b6cd76218b8d299ba7a93",
  "dxmodules\\zoneinfo\\right\\America\\Asuncion": "33de989fafc47189f03da27c62698373",
  "dxmodules\\zoneinfo\\right\\America\\Atikokan": "b73584d3158e258d8c2b8a43795e2fc9",
  "dxmodules\\zoneinfo\\right\\America\\Atka": "282e70d388dfd3923238b8ca86244246",
  "dxmodules\\zoneinfo\\right\\America\\Bahia": "e4e5ec529a25a5e1c5d0de9080e0b80c",
  "dxmodules\\zoneinfo\\right\\America\\Bahia_Banderas": "c4d9dbbd094173ced5c98e67415078d2",
  "dxmodules\\zoneinfo\\right\\America\\Barbados": "167070d16fcfd7709c995c5f08804df9",
  "dxmodules\\zoneinfo\\right\\America\\Belem": "3ffce1c62895f47fac4097dea33c0100",
  "dxmodules\\zoneinfo\\right\\America\\Belize": "a6f600d246de9f362ce80412e50e703c",
  "dxmodules\\zoneinfo\\right\\America\\Blanc-Sablon": "2637c152f56e58d0978deab40e3fb7af",
  "dxmodules\\zoneinfo\\right\\America\\Boa_Vista": "a2142636ddbbf1a9ef329cd6187f3a7f",
  "dxmodules\\zoneinfo\\right\\America\\Bogota": "da0ff1f7f9dd392ffa9939ab4548bce9",
  "dxmodules\\zoneinfo\\right\\America\\Boise": "ece4d700b42901dd8e70c2ae78feafe8",
  "dxmodules\\zoneinfo\\right\\America\\Buenos_Aires": "7f85ebd305bc1f7a173caf79f56e77aa",
  "dxmodules\\zoneinfo\\right\\America\\Cambridge_Bay": "5ba6299259dca6c49bd37d55b0a23547",
  "dxmodules\\zoneinfo\\right\\America\\Campo_Grande": "ee14c0299e6e91649c3629942385173f",
  "dxmodules\\zoneinfo\\right\\America\\Cancun": "63af9c5ca1e21df45291d378868bfcf3",
  "dxmodules\\zoneinfo\\right\\America\\Caracas": "9f18da7625c6014ac20d61dadce08109",
  "dxmodules\\zoneinfo\\right\\America\\Catamarca": "e4215654b35cc84b7de145a99ba2a8d4",
  "dxmodules\\zoneinfo\\right\\America\\Cayenne": "9f8f2cb60fe8096e11d2ade69bf11a35",
  "dxmodules\\zoneinfo\\right\\America\\Cayman": "dbb2a11343300a2c631a6c4b7a3cafac",
  "dxmodules\\zoneinfo\\right\\America\\Chicago": "9e0de2483877c5197b136801aa179825",
  "dxmodules\\zoneinfo\\right\\America\\Chihuahua": "33a79cc0ff099fde13feeb3853c3a751",
  "dxmodules\\zoneinfo\\right\\America\\Coral_Harbour": "b73584d3158e258d8c2b8a43795e2fc9",
  "dxmodules\\zoneinfo\\right\\America\\Cordoba": "790e6c0ccdc0a17b0087bb7301434648",
  "dxmodules\\zoneinfo\\right\\America\\Costa_Rica": "36385e27a28e5a44cc3e0379cc203d33",
  "dxmodules\\zoneinfo\\right\\America\\Creston": "28eecb163abd15d8373177be150d09c8",
  "dxmodules\\zoneinfo\\right\\America\\Cuiaba": "9cbde1280ec1e7841e72f6480f3a9e25",
  "dxmodules\\zoneinfo\\right\\America\\Curacao": "a3dd71a0d51b6cd76218b8d299ba7a93",
  "dxmodules\\zoneinfo\\right\\America\\Danmarkshavn": "1790826b85dedc3851db28dd0e220497",
  "dxmodules\\zoneinfo\\right\\America\\Dawson": "c1f9e0a66ac60a0adb572b8dbb15c6fd",
  "dxmodules\\zoneinfo\\right\\America\\Dawson_Creek": "91bdb9ec7c7faaa5f5fcea3d32ef5816",
  "dxmodules\\zoneinfo\\right\\America\\Denver": "a04f44b808f1e82a194885aa0528e6ce",
  "dxmodules\\zoneinfo\\right\\America\\Detroit": "c7e43a31c24443dcc5a10b94194d77b9",
  "dxmodules\\zoneinfo\\right\\America\\Dominica": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Edmonton": "8a4c9e63fdbeaf36632157a97751f2a6",
  "dxmodules\\zoneinfo\\right\\America\\Eirunepe": "302b93102906666bd37f06475e830e5f",
  "dxmodules\\zoneinfo\\right\\America\\El_Salvador": "0e5b3b1aee31e8b3764c85507d67ca05",
  "dxmodules\\zoneinfo\\right\\America\\Ensenada": "4a5aba6b91f6832078382d3f52fd391d",
  "dxmodules\\zoneinfo\\right\\America\\Fortaleza": "7b3782d2bdd4ffe39f16e901227dbf52",
  "dxmodules\\zoneinfo\\right\\America\\Fort_Nelson": "97edfbbc575258ef1141d09612c03f29",
  "dxmodules\\zoneinfo\\right\\America\\Fort_Wayne": "aee84cbeb49b67cf69ab388c16ee8bdb",
  "dxmodules\\zoneinfo\\right\\America\\Glace_Bay": "619356a2105ad4806faf3e0e6bb55de4",
  "dxmodules\\zoneinfo\\right\\America\\Godthab": "610a757eed1026677433258d80198461",
  "dxmodules\\zoneinfo\\right\\America\\Goose_Bay": "321d549f59669036366d42f88a64fbcb",
  "dxmodules\\zoneinfo\\right\\America\\Grand_Turk": "97a0ab9ba0d288e45eef032be8e2e3f2",
  "dxmodules\\zoneinfo\\right\\America\\Grenada": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Guadeloupe": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Guatemala": "fcf1a91ff1bd3861f6bafee15b34bb29",
  "dxmodules\\zoneinfo\\right\\America\\Guayaquil": "821825cf4a6e5d691de018004a5b6cc2",
  "dxmodules\\zoneinfo\\right\\America\\Guyana": "8c4403bcd4ab8dd738cac26d695e06d9",
  "dxmodules\\zoneinfo\\right\\America\\Halifax": "cf585454a2b0677c20dac5e7da2f1220",
  "dxmodules\\zoneinfo\\right\\America\\Havana": "c84c293edbe480ea115abcdf96f1c499",
  "dxmodules\\zoneinfo\\right\\America\\Hermosillo": "0d7e7c94e0f93d6a3d0f7828923f71a7",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Indianapolis": "aee84cbeb49b67cf69ab388c16ee8bdb",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Knox": "a4c0cd6601d2974d0d4d331285637042",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Marengo": "5d9df0d965feb22a56a929b7613c9f03",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Petersburg": "743c8227b7bd283ce0433e18d5a2f353",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Tell_City": "4ba7cc16e819553cef1801ac62588f26",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Vevay": "394e9f77e455be15e967a99801c73d63",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Vincennes": "db6628fda4b1727179f7612321616526",
  "dxmodules\\zoneinfo\\right\\America\\Indiana\\Winamac": "d9776c230a2fbe0821766ab8f9eeb92d",
  "dxmodules\\zoneinfo\\right\\America\\Indianapolis": "aee84cbeb49b67cf69ab388c16ee8bdb",
  "dxmodules\\zoneinfo\\right\\America\\Inuvik": "4610d997061651f8c1d87590ce6c6d48",
  "dxmodules\\zoneinfo\\right\\America\\Iqaluit": "54608782aaa5eea3bc3f826c194f86da",
  "dxmodules\\zoneinfo\\right\\America\\Jamaica": "bdf8b2720941180acbbd1404c63f5451",
  "dxmodules\\zoneinfo\\right\\America\\Jujuy": "068eec3da9e503286b7c90c971573616",
  "dxmodules\\zoneinfo\\right\\America\\Juneau": "cf88eba298e22fda671fa79332f5b433",
  "dxmodules\\zoneinfo\\right\\America\\Kentucky\\Louisville": "97e994707ab30ad515214f8be3f51b54",
  "dxmodules\\zoneinfo\\right\\America\\Kentucky\\Monticello": "8853e2c10605fab7539dc797b7909ab9",
  "dxmodules\\zoneinfo\\right\\America\\Knox_IN": "a4c0cd6601d2974d0d4d331285637042",
  "dxmodules\\zoneinfo\\right\\America\\Kralendijk": "a3dd71a0d51b6cd76218b8d299ba7a93",
  "dxmodules\\zoneinfo\\right\\America\\La_Paz": "a51b556e863e357dc307e9dd60c8c1bd",
  "dxmodules\\zoneinfo\\right\\America\\Lima": "6d54c069c8dd341c783de76e7559ec9d",
  "dxmodules\\zoneinfo\\right\\America\\Los_Angeles": "24885c31a23d629863272538b997f87f",
  "dxmodules\\zoneinfo\\right\\America\\Louisville": "97e994707ab30ad515214f8be3f51b54",
  "dxmodules\\zoneinfo\\right\\America\\Lower_Princes": "a3dd71a0d51b6cd76218b8d299ba7a93",
  "dxmodules\\zoneinfo\\right\\America\\Maceio": "6e90d06bd13956adada999198e8b03b1",
  "dxmodules\\zoneinfo\\right\\America\\Managua": "78f94cdc6037f2664b8bcdc2f76beceb",
  "dxmodules\\zoneinfo\\right\\America\\Manaus": "362317d9e24808cca7dfd43119fba293",
  "dxmodules\\zoneinfo\\right\\America\\Marigot": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Martinique": "08b0afa4a3679ec32bd97dd42a2d5e65",
  "dxmodules\\zoneinfo\\right\\America\\Matamoros": "00b0a1fee9df01734ec34c14112254d3",
  "dxmodules\\zoneinfo\\right\\America\\Mazatlan": "c366dd821b732f958ecc81707eecc297",
  "dxmodules\\zoneinfo\\right\\America\\Mendoza": "b95d8152904b0fdf042c6f5167ff90ab",
  "dxmodules\\zoneinfo\\right\\America\\Menominee": "312103138547f25d87854e7335909792",
  "dxmodules\\zoneinfo\\right\\America\\Merida": "a55e8a1f3630c03f89edadaf4680ec25",
  "dxmodules\\zoneinfo\\right\\America\\Metlakatla": "d342ef14d6184402e7b8ef06e05e7a0e",
  "dxmodules\\zoneinfo\\right\\America\\Mexico_City": "9a5c52d9e60891e2b51c17610e75d11f",
  "dxmodules\\zoneinfo\\right\\America\\Miquelon": "2db4fc96974a34db4e86c2c8501400da",
  "dxmodules\\zoneinfo\\right\\America\\Moncton": "fe0d305f26fb8f81d5cb95fa80d4e4bc",
  "dxmodules\\zoneinfo\\right\\America\\Monterrey": "d1560b82e96ac594927f7652ca277d16",
  "dxmodules\\zoneinfo\\right\\America\\Montevideo": "a7be914a9c0d90f855fd6f5555788996",
  "dxmodules\\zoneinfo\\right\\America\\Montreal": "541dd79e6726de72a7b31476c8d9a8ff",
  "dxmodules\\zoneinfo\\right\\America\\Montserrat": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Nassau": "73ec388017abd0e22f37d88a0b8e8a97",
  "dxmodules\\zoneinfo\\right\\America\\New_York": "7b602715824f47ba6028f0075b3ea7dc",
  "dxmodules\\zoneinfo\\right\\America\\Nipigon": "152d6acbfae9d604319acc2947000c9e",
  "dxmodules\\zoneinfo\\right\\America\\Nome": "ff654dddf7473e79e85d1109a433036d",
  "dxmodules\\zoneinfo\\right\\America\\Noronha": "72b7085c49fead430e7a2dd06590b224",
  "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\Beulah": "7dae7b69dfbde952510327d4049133f9",
  "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\Center": "3df021012c8eb85b4a732df260ca46fc",
  "dxmodules\\zoneinfo\\right\\America\\North_Dakota\\New_Salem": "d85974b0e5491f9676676010d6b8a5eb",
  "dxmodules\\zoneinfo\\right\\America\\Nuuk": "610a757eed1026677433258d80198461",
  "dxmodules\\zoneinfo\\right\\America\\Ojinaga": "9c60152b7b11563719f61bb0f52e9e9e",
  "dxmodules\\zoneinfo\\right\\America\\Panama": "dbb2a11343300a2c631a6c4b7a3cafac",
  "dxmodules\\zoneinfo\\right\\America\\Pangnirtung": "8409ed8281ca17daf9c87560426b7c02",
  "dxmodules\\zoneinfo\\right\\America\\Paramaribo": "c3b09c0d420c43da423799e52b93f6e4",
  "dxmodules\\zoneinfo\\right\\America\\Phoenix": "5adc29642d304ff453993c2b4395505d",
  "dxmodules\\zoneinfo\\right\\America\\Port-au-Prince": "8df9214442b5652478760d8ea7af38b7",
  "dxmodules\\zoneinfo\\right\\America\\Porto_Acre": "30bb03697d8aba618afd831bfc83a9a3",
  "dxmodules\\zoneinfo\\right\\America\\Porto_Velho": "34a694f0e37d4fc37e9ac49e37a5de1c",
  "dxmodules\\zoneinfo\\right\\America\\Port_of_Spain": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Puerto_Rico": "f03c81ed80547f70a80a01c94dc85ab9",
  "dxmodules\\zoneinfo\\right\\America\\Punta_Arenas": "f70175b387bb3327bbec390a86d21455",
  "dxmodules\\zoneinfo\\right\\America\\Rainy_River": "23dbcf1cd24e67cc24648c25eb298ba0",
  "dxmodules\\zoneinfo\\right\\America\\Rankin_Inlet": "d6a6ce35fb5ca3d134fe3d7ce1b7468b",
  "dxmodules\\zoneinfo\\right\\America\\Recife": "07264d0df9168584cd65dca59efdcd0b",
  "dxmodules\\zoneinfo\\right\\America\\Regina": "49b33e71c4d5d99090e25929482b9820",
  "dxmodules\\zoneinfo\\right\\America\\Resolute": "37e1fe49d7b779172f4193f908fa02b5",
  "dxmodules\\zoneinfo\\right\\America\\Rio_Branco": "30bb03697d8aba618afd831bfc83a9a3",
  "dxmodules\\zoneinfo\\right\\America\\Rosario": "790e6c0ccdc0a17b0087bb7301434648",
  "dxmodules\\zoneinfo\\right\\America\\Santarem": "9baa062bb495b0f959fdfd859e262d40",
  "dxmodules\\zoneinfo\\right\\America\\Santa_Isabel": "4a5aba6b91f6832078382d3f52fd391d",
  "dxmodules\\zoneinfo\\right\\America\\Santiago": "b77df3a65e22297b42228afa2929584f",
  "dxmodules\\zoneinfo\\right\\America\\Santo_Domingo": "059582246c0bb5af0c12326bfcf86019",
  "dxmodules\\zoneinfo\\right\\America\\Sao_Paulo": "81339e51f13782b28042f92786116ee3",
  "dxmodules\\zoneinfo\\right\\America\\Scoresbysund": "e26dc30e3bfb3562a24a9267cff7c283",
  "dxmodules\\zoneinfo\\right\\America\\Shiprock": "a04f44b808f1e82a194885aa0528e6ce",
  "dxmodules\\zoneinfo\\right\\America\\Sitka": "c1a683fe328612597c6da3179763ee4c",
  "dxmodules\\zoneinfo\\right\\America\\St_Barthelemy": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\St_Johns": "5f670ecdff8ed7f414f51b4ff0c3300c",
  "dxmodules\\zoneinfo\\right\\America\\St_Kitts": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\St_Lucia": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\St_Thomas": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\St_Vincent": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Swift_Current": "ec2feb211b495fb642849e26cfa1fac4",
  "dxmodules\\zoneinfo\\right\\America\\Tegucigalpa": "dfd6bb815ab1c7c942efd30bd72220d4",
  "dxmodules\\zoneinfo\\right\\America\\Thule": "4b1a8f5b8395dbee7ff1977cb5500e48",
  "dxmodules\\zoneinfo\\right\\America\\Thunder_Bay": "5f3b82b19c7ca9e8144b64d1e595c475",
  "dxmodules\\zoneinfo\\right\\America\\Tijuana": "4a5aba6b91f6832078382d3f52fd391d",
  "dxmodules\\zoneinfo\\right\\America\\Toronto": "541dd79e6726de72a7b31476c8d9a8ff",
  "dxmodules\\zoneinfo\\right\\America\\Tortola": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Vancouver": "813c4030632e8d4b89dfeea68deca975",
  "dxmodules\\zoneinfo\\right\\America\\Virgin": "33c17627a9963f70271c9a193e9eb32c",
  "dxmodules\\zoneinfo\\right\\America\\Whitehorse": "8751f4da107a273bcc9060790bd9460b",
  "dxmodules\\zoneinfo\\right\\America\\Winnipeg": "387856cd57cd5f8898ad0e66acbbf27e",
  "dxmodules\\zoneinfo\\right\\America\\Yakutat": "729d277e238d7320e9c505e0e2f6cb7e",
  "dxmodules\\zoneinfo\\right\\America\\Yellowknife": "1ad33e12252975f4a164863f7b347834",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Casey": "3b466e0683793f6433a74e7c79b00782",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Davis": "eaf9670244da968a46f0042f98250702",
  "dxmodules\\zoneinfo\\right\\Antarctica\\DumontDUrville": "6e986536bd542e2209819737c97e847d",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Macquarie": "bc2f8c209b76c37bc97baafe71d49c4c",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Mawson": "7829c411c82e902894831e718e8790f1",
  "dxmodules\\zoneinfo\\right\\Antarctica\\McMurdo": "82b0518985a7fc92949ed0f6f26ff413",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Palmer": "8c3e3369c7685369c36fdd5eb3eaed96",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Rothera": "b0ee319a72f04eaa17795ba5e57a908b",
  "dxmodules\\zoneinfo\\right\\Antarctica\\South_Pole": "82b0518985a7fc92949ed0f6f26ff413",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Syowa": "1da7fe0d4a3413fc84ab4b2769090608",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Troll": "a335c40b4c451315ca42c3e54c1905d8",
  "dxmodules\\zoneinfo\\right\\Antarctica\\Vostok": "0cafcb51dca9ed5d72d03f4aed483489",
  "dxmodules\\zoneinfo\\right\\Arctic\\Longyearbyen": "e4dc442993a2b2784b8b7dbd7160eec4",
  "dxmodules\\zoneinfo\\right\\Asia\\Aden": "9c257d575e96015f3fbed54d87f8bc50",
  "dxmodules\\zoneinfo\\right\\Asia\\Almaty": "1810c448a8354615683abca84d527bfe",
  "dxmodules\\zoneinfo\\right\\Asia\\Amman": "ee2c93bf5727fd8420f2b749d7428efb",
  "dxmodules\\zoneinfo\\right\\Asia\\Anadyr": "a9cc54432e82d7032c7def8468a089d0",
  "dxmodules\\zoneinfo\\right\\Asia\\Aqtau": "e2007ee6f3e74a8019391ac1f0aec4dc",
  "dxmodules\\zoneinfo\\right\\Asia\\Aqtobe": "663580fb15202c6df3d9b9bf5ebf522f",
  "dxmodules\\zoneinfo\\right\\Asia\\Ashgabat": "4eacdff5fe2196cd19a342d8b39b0ca8",
  "dxmodules\\zoneinfo\\right\\Asia\\Ashkhabad": "4eacdff5fe2196cd19a342d8b39b0ca8",
  "dxmodules\\zoneinfo\\right\\Asia\\Atyrau": "c7ff154fd4ea56ecf3bfc0b934c5cd22",
  "dxmodules\\zoneinfo\\right\\Asia\\Baghdad": "bb9b7e0ac51f666dfa71ab3a1a6fca45",
  "dxmodules\\zoneinfo\\right\\Asia\\Bahrain": "435d4f3daf5c15caa49fbe664a2c1684",
  "dxmodules\\zoneinfo\\right\\Asia\\Baku": "1652d1e2640b9106a8fb3523ab7112ae",
  "dxmodules\\zoneinfo\\right\\Asia\\Bangkok": "eaa810414de8de8a06c0eb1c700afd0a",
  "dxmodules\\zoneinfo\\right\\Asia\\Barnaul": "4d4df10cbd37b44eb42b9d19eb4f7c33",
  "dxmodules\\zoneinfo\\right\\Asia\\Beirut": "784e4b8ee1013ead6843993b38bf7dcf",
  "dxmodules\\zoneinfo\\right\\Asia\\Bishkek": "576e721428ae8b35565251b8580322fc",
  "dxmodules\\zoneinfo\\right\\Asia\\Brunei": "c88f7e5336c048f58831ca0e922cb883",
  "dxmodules\\zoneinfo\\right\\Asia\\Calcutta": "2e0eb1e900fb8859c72a5d9412f95dba",
  "dxmodules\\zoneinfo\\right\\Asia\\Chita": "67f7e1fbed85796b3f266f642742c1aa",
  "dxmodules\\zoneinfo\\right\\Asia\\Choibalsan": "f95f3247720172902bd68d5b559efbf7",
  "dxmodules\\zoneinfo\\right\\Asia\\Chongqing": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\Asia\\Chungking": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\Asia\\Colombo": "0e141adc9705e2bb75c8cc2635adbd95",
  "dxmodules\\zoneinfo\\right\\Asia\\Dacca": "e35ecddcb5d5139a9200291f723231a8",
  "dxmodules\\zoneinfo\\right\\Asia\\Damascus": "1f2c159804ad4460e814c7e4e06a1c81",
  "dxmodules\\zoneinfo\\right\\Asia\\Dhaka": "e35ecddcb5d5139a9200291f723231a8",
  "dxmodules\\zoneinfo\\right\\Asia\\Dili": "2ff451580ef93c763ea5d159420f5d11",
  "dxmodules\\zoneinfo\\right\\Asia\\Dubai": "72e2ef10fde1f8fcabbc5a21d5d9a856",
  "dxmodules\\zoneinfo\\right\\Asia\\Dushanbe": "6c0f6914cb140fbd7601bb4ce5da1d50",
  "dxmodules\\zoneinfo\\right\\Asia\\Famagusta": "cf108cc298788103758b0132fba32a57",
  "dxmodules\\zoneinfo\\right\\Asia\\Gaza": "9d26fe2afd426828d5da3c22b5bfdd83",
  "dxmodules\\zoneinfo\\right\\Asia\\Harbin": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\Asia\\Hebron": "06834d169792c0c58cd69baaee42e92c",
  "dxmodules\\zoneinfo\\right\\Asia\\Hong_Kong": "ac812a20a17a6221694038b62ac77ff0",
  "dxmodules\\zoneinfo\\right\\Asia\\Hovd": "b0fcc3ae79e32a173e4db193a76ccc0e",
  "dxmodules\\zoneinfo\\right\\Asia\\Ho_Chi_Minh": "7420517dd4ad95118f1e7d88e2430163",
  "dxmodules\\zoneinfo\\right\\Asia\\Irkutsk": "db926d9012302148e205b89a6e449967",
  "dxmodules\\zoneinfo\\right\\Asia\\Istanbul": "3f72cd0fb7e26b0dc8d7833327f035db",
  "dxmodules\\zoneinfo\\right\\Asia\\Jakarta": "3c216e1d6bed7b8b4d3f5295a10f02ac",
  "dxmodules\\zoneinfo\\right\\Asia\\Jayapura": "7e3faf3974a4a2f1a6172bc80c4e91df",
  "dxmodules\\zoneinfo\\right\\Asia\\Jerusalem": "6fa25ac8d4a8f5e7c03de4434c5cc6b8",
  "dxmodules\\zoneinfo\\right\\Asia\\Kabul": "0cacb17b331b880fea6a3c03a056c024",
  "dxmodules\\zoneinfo\\right\\Asia\\Kamchatka": "307d5eec76955cf8ae4c87b1ae514387",
  "dxmodules\\zoneinfo\\right\\Asia\\Karachi": "4038cb8adc007467f1297aa72557863f",
  "dxmodules\\zoneinfo\\right\\Asia\\Kashgar": "5ce95bd9a706925bc86863eb692c862c",
  "dxmodules\\zoneinfo\\right\\Asia\\Kathmandu": "c4549d6c756ada9f9dbfce26ea69a210",
  "dxmodules\\zoneinfo\\right\\Asia\\Katmandu": "c4549d6c756ada9f9dbfce26ea69a210",
  "dxmodules\\zoneinfo\\right\\Asia\\Khandyga": "78c9936524b6cae7bf4335cd38e4d09b",
  "dxmodules\\zoneinfo\\right\\Asia\\Kolkata": "2e0eb1e900fb8859c72a5d9412f95dba",
  "dxmodules\\zoneinfo\\right\\Asia\\Krasnoyarsk": "dd9dc5be8bfe0fcf767c0d1006b694c3",
  "dxmodules\\zoneinfo\\right\\Asia\\Kuala_Lumpur": "fce33beb3d31d52349a77dc45114937a",
  "dxmodules\\zoneinfo\\right\\Asia\\Kuching": "f3da8074fccd8144590e2533384313cf",
  "dxmodules\\zoneinfo\\right\\Asia\\Kuwait": "9c257d575e96015f3fbed54d87f8bc50",
  "dxmodules\\zoneinfo\\right\\Asia\\Macao": "dd42c3ea58c64c46070051f16626a0b0",
  "dxmodules\\zoneinfo\\right\\Asia\\Macau": "dd42c3ea58c64c46070051f16626a0b0",
  "dxmodules\\zoneinfo\\right\\Asia\\Magadan": "74537315aad0bc57f1dbbc77f838c193",
  "dxmodules\\zoneinfo\\right\\Asia\\Makassar": "20db83c594a3c11f74ab275542d59aa4",
  "dxmodules\\zoneinfo\\right\\Asia\\Manila": "f8c658820eb89da38eda688ddfc48606",
  "dxmodules\\zoneinfo\\right\\Asia\\Muscat": "72e2ef10fde1f8fcabbc5a21d5d9a856",
  "dxmodules\\zoneinfo\\right\\Asia\\Nicosia": "2f833febb7eee0222af785894a47d5a8",
  "dxmodules\\zoneinfo\\right\\Asia\\Novokuznetsk": "0aba150238505be93a22b0b4ddf47312",
  "dxmodules\\zoneinfo\\right\\Asia\\Novosibirsk": "7040261c320043d7f3122b2604635284",
  "dxmodules\\zoneinfo\\right\\Asia\\Omsk": "040c540fb238f31ea69249b753ef0ef7",
  "dxmodules\\zoneinfo\\right\\Asia\\Oral": "0fda7755065f5eaa92c21eb716aa56b5",
  "dxmodules\\zoneinfo\\right\\Asia\\Phnom_Penh": "eaa810414de8de8a06c0eb1c700afd0a",
  "dxmodules\\zoneinfo\\right\\Asia\\Pontianak": "55fb83fe4f7872c919ce934a0b70a651",
  "dxmodules\\zoneinfo\\right\\Asia\\Pyongyang": "cb4953e8661526fba1d6ed8f738e895f",
  "dxmodules\\zoneinfo\\right\\Asia\\Qatar": "435d4f3daf5c15caa49fbe664a2c1684",
  "dxmodules\\zoneinfo\\right\\Asia\\Qostanay": "34cfcbb0d35f54e00b2784c11fabf5a2",
  "dxmodules\\zoneinfo\\right\\Asia\\Qyzylorda": "d0b30771ffbee9e46794adbfe8acc33c",
  "dxmodules\\zoneinfo\\right\\Asia\\Rangoon": "4ab2c8e9530b82eff44f4a64776faa99",
  "dxmodules\\zoneinfo\\right\\Asia\\Riyadh": "9c257d575e96015f3fbed54d87f8bc50",
  "dxmodules\\zoneinfo\\right\\Asia\\Saigon": "7420517dd4ad95118f1e7d88e2430163",
  "dxmodules\\zoneinfo\\right\\Asia\\Sakhalin": "5da56bcd444fcef1275c92aabd8cb8e6",
  "dxmodules\\zoneinfo\\right\\Asia\\Samarkand": "e72a66455d6dc27dce4e3f3a1a5e7177",
  "dxmodules\\zoneinfo\\right\\Asia\\Seoul": "e73238fa6c85ea037bf4dcc235113fe9",
  "dxmodules\\zoneinfo\\right\\Asia\\Shanghai": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\Asia\\Singapore": "72be432785863c8a11d83d6f3849f6a1",
  "dxmodules\\zoneinfo\\right\\Asia\\Srednekolymsk": "2b062b872cebf7f3a35de885144a46a8",
  "dxmodules\\zoneinfo\\right\\Asia\\Taipei": "8f3da0ea2509c2fe35c6bb244f84d2e2",
  "dxmodules\\zoneinfo\\right\\Asia\\Tashkent": "88e80b0efe0b23c657d37e68ff5c3ecf",
  "dxmodules\\zoneinfo\\right\\Asia\\Tbilisi": "351bbf0c6e2e8d38f5eec8c04aa4d6d3",
  "dxmodules\\zoneinfo\\right\\Asia\\Tehran": "c3a0c2539fccc3d3f8081b4218c0eb20",
  "dxmodules\\zoneinfo\\right\\Asia\\Tel_Aviv": "6fa25ac8d4a8f5e7c03de4434c5cc6b8",
  "dxmodules\\zoneinfo\\right\\Asia\\Thimbu": "e18d256eca7ba79605a1fe408157624a",
  "dxmodules\\zoneinfo\\right\\Asia\\Thimphu": "e18d256eca7ba79605a1fe408157624a",
  "dxmodules\\zoneinfo\\right\\Asia\\Tokyo": "e40de6c7fb9ce735aeff885394a727d2",
  "dxmodules\\zoneinfo\\right\\Asia\\Tomsk": "d5844b6b75a8c2bfa61c735627349854",
  "dxmodules\\zoneinfo\\right\\Asia\\Ujung_Pandang": "20db83c594a3c11f74ab275542d59aa4",
  "dxmodules\\zoneinfo\\right\\Asia\\Ulaanbaatar": "ffe40602251f6104563a95d5a6201755",
  "dxmodules\\zoneinfo\\right\\Asia\\Ulan_Bator": "ffe40602251f6104563a95d5a6201755",
  "dxmodules\\zoneinfo\\right\\Asia\\Urumqi": "5ce95bd9a706925bc86863eb692c862c",
  "dxmodules\\zoneinfo\\right\\Asia\\Ust-Nera": "3052b62f431959f55e69a42da2a4367f",
  "dxmodules\\zoneinfo\\right\\Asia\\Vientiane": "eaa810414de8de8a06c0eb1c700afd0a",
  "dxmodules\\zoneinfo\\right\\Asia\\Vladivostok": "3a665f9e10006d046da39a389e2d4de6",
  "dxmodules\\zoneinfo\\right\\Asia\\Yakutsk": "909fefe03904758645a9e688099adb74",
  "dxmodules\\zoneinfo\\right\\Asia\\Yangon": "4ab2c8e9530b82eff44f4a64776faa99",
  "dxmodules\\zoneinfo\\right\\Asia\\Yekaterinburg": "17b849bae102efb9cb3f1761a951528a",
  "dxmodules\\zoneinfo\\right\\Asia\\Yerevan": "8c67b19d3e6eb4b74d85bce71832e379",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Azores": "6782096c0c0016381184311eccf7e79b",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Bermuda": "cd84da3d7c53c2facfad094b6a63a6a1",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Canary": "59557b15427f688dd2f6730c1461aa94",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Cape_Verde": "a51b284fc44efbbacabd8edf369b3937",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Faeroe": "91920c175797f2fee4628b758df58d61",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Faroe": "91920c175797f2fee4628b758df58d61",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Jan_Mayen": "e4dc442993a2b2784b8b7dbd7160eec4",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Madeira": "4259292f99911b4275ed87264edb7666",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Reykjavik": "4cbcb014d0b6e243af59821c0c384948",
  "dxmodules\\zoneinfo\\right\\Atlantic\\South_Georgia": "94b903dd1e41634f0a57917c82c4a86e",
  "dxmodules\\zoneinfo\\right\\Atlantic\\Stanley": "cd95a853a4b676c8afb1b7f003d525b5",
  "dxmodules\\zoneinfo\\right\\Atlantic\\St_Helena": "2ece5b26b492408992aab88850fbd816",
  "dxmodules\\zoneinfo\\right\\Australia\\ACT": "cb021aa4d7a0d3d4717a896c093cd59c",
  "dxmodules\\zoneinfo\\right\\Australia\\Adelaide": "3bd3b9a49709c2662be4cb2b14a61387",
  "dxmodules\\zoneinfo\\right\\Australia\\Brisbane": "b63c9e16e5df9ee561be859ebfab9e4f",
  "dxmodules\\zoneinfo\\right\\Australia\\Broken_Hill": "25dcfe77e4c8bc1baa8d54ac88daa98d",
  "dxmodules\\zoneinfo\\right\\Australia\\Canberra": "cb021aa4d7a0d3d4717a896c093cd59c",
  "dxmodules\\zoneinfo\\right\\Australia\\Currie": "1b2240d848becc1dfcbee0dbcfa17bdf",
  "dxmodules\\zoneinfo\\right\\Australia\\Darwin": "abd6799885314c1d86458b5164642ac1",
  "dxmodules\\zoneinfo\\right\\Australia\\Eucla": "1a12dadcc17e599cb35bde71a032dc55",
  "dxmodules\\zoneinfo\\right\\Australia\\Hobart": "1b2240d848becc1dfcbee0dbcfa17bdf",
  "dxmodules\\zoneinfo\\right\\Australia\\LHI": "74cd4736a6c2c6c92bf73d1125384b5d",
  "dxmodules\\zoneinfo\\right\\Australia\\Lindeman": "1ad460f55e6a27574ecb7292ecff49b3",
  "dxmodules\\zoneinfo\\right\\Australia\\Lord_Howe": "74cd4736a6c2c6c92bf73d1125384b5d",
  "dxmodules\\zoneinfo\\right\\Australia\\Melbourne": "110415758f3860609f5fb34978117b2f",
  "dxmodules\\zoneinfo\\right\\Australia\\North": "abd6799885314c1d86458b5164642ac1",
  "dxmodules\\zoneinfo\\right\\Australia\\NSW": "cb021aa4d7a0d3d4717a896c093cd59c",
  "dxmodules\\zoneinfo\\right\\Australia\\Perth": "80cea3a163beeb09331e60663144ca34",
  "dxmodules\\zoneinfo\\right\\Australia\\Queensland": "b63c9e16e5df9ee561be859ebfab9e4f",
  "dxmodules\\zoneinfo\\right\\Australia\\South": "3bd3b9a49709c2662be4cb2b14a61387",
  "dxmodules\\zoneinfo\\right\\Australia\\Sydney": "cb021aa4d7a0d3d4717a896c093cd59c",
  "dxmodules\\zoneinfo\\right\\Australia\\Tasmania": "1b2240d848becc1dfcbee0dbcfa17bdf",
  "dxmodules\\zoneinfo\\right\\Australia\\Victoria": "110415758f3860609f5fb34978117b2f",
  "dxmodules\\zoneinfo\\right\\Australia\\West": "80cea3a163beeb09331e60663144ca34",
  "dxmodules\\zoneinfo\\right\\Australia\\Yancowinna": "25dcfe77e4c8bc1baa8d54ac88daa98d",
  "dxmodules\\zoneinfo\\right\\Brazil\\Acre": "30bb03697d8aba618afd831bfc83a9a3",
  "dxmodules\\zoneinfo\\right\\Brazil\\DeNoronha": "72b7085c49fead430e7a2dd06590b224",
  "dxmodules\\zoneinfo\\right\\Brazil\\East": "81339e51f13782b28042f92786116ee3",
  "dxmodules\\zoneinfo\\right\\Brazil\\West": "362317d9e24808cca7dfd43119fba293",
  "dxmodules\\zoneinfo\\right\\Canada\\Atlantic": "cf585454a2b0677c20dac5e7da2f1220",
  "dxmodules\\zoneinfo\\right\\Canada\\Central": "387856cd57cd5f8898ad0e66acbbf27e",
  "dxmodules\\zoneinfo\\right\\Canada\\Eastern": "541dd79e6726de72a7b31476c8d9a8ff",
  "dxmodules\\zoneinfo\\right\\Canada\\Mountain": "8a4c9e63fdbeaf36632157a97751f2a6",
  "dxmodules\\zoneinfo\\right\\Canada\\Newfoundland": "5f670ecdff8ed7f414f51b4ff0c3300c",
  "dxmodules\\zoneinfo\\right\\Canada\\Pacific": "813c4030632e8d4b89dfeea68deca975",
  "dxmodules\\zoneinfo\\right\\Canada\\Saskatchewan": "49b33e71c4d5d99090e25929482b9820",
  "dxmodules\\zoneinfo\\right\\Canada\\Yukon": "8751f4da107a273bcc9060790bd9460b",
  "dxmodules\\zoneinfo\\right\\CET": "326f99da17d68d4cfee53cf8d0aa7204",
  "dxmodules\\zoneinfo\\right\\Chile\\Continental": "b77df3a65e22297b42228afa2929584f",
  "dxmodules\\zoneinfo\\right\\Chile\\EasterIsland": "4dfc6403a5adf1616fb68203f03bf30e",
  "dxmodules\\zoneinfo\\right\\CST6CDT": "169a8197b636d243e7c004a8e7fba824",
  "dxmodules\\zoneinfo\\right\\Cuba": "c84c293edbe480ea115abcdf96f1c499",
  "dxmodules\\zoneinfo\\right\\EET": "6816fac705bb26c7b7255b2783f0a970",
  "dxmodules\\zoneinfo\\right\\Egypt": "c0216212a93d68f21decbbc1f0675104",
  "dxmodules\\zoneinfo\\right\\Eire": "fa14bdeed6096bf8faebc5fedc011cdc",
  "dxmodules\\zoneinfo\\right\\EST": "1888b614cef3c1a33820f2ea2b3b7b3f",
  "dxmodules\\zoneinfo\\right\\EST5EDT": "dddda24b1babea1d79989f4e38faae26",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+1": "44ac89638b691ebce09448dad59e536e",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+10": "b42c0dab5f49eb25e21920c0b22f54a2",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+11": "5dcac640065e3fb5b799e2c0a6df1d2f",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+12": "4fae182c01b8355025d83b4acbfada68",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+2": "8a6d714494a35f050b117b592b40bcd8",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+3": "733b613bf354c20c0d3b3465435c9cc9",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+4": "088c840877ba64a21a9edc90ef942671",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+5": "04aefa0c42f095280b700db4d1a30d6e",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+6": "8ceb55f06163274ace7c942c0199ff90",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+7": "172c592ca91950907dd7b1924c4f3d06",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+8": "05ba396e91ef7b3445aff2aaf23ede98",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT+9": "819b92c43b3741d65b3676cc0f5d33a2",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-1": "c79b1c43563ac924fe564ee658820b57",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-10": "b4a6988ab9c89ada1e5593dff9eeabf4",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-11": "5fa302adca1e4c397c7a860211e864b8",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-12": "c250ec4b2d85f3696b182af7f7dc7fb1",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-13": "d275f6c033dec2c0babfbd3ac01655f6",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-14": "ce6effbe9cc3a96f6d196aff4fb71af9",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-2": "cf76c5d0e5c517917500a34c8771ddab",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-3": "2f737a03e95cd1a3cf6a35eb25d33b0c",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-4": "5a6b49c6fdcb2144d7e0cd7388e7838c",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-5": "ab06ee74ab85a30e8adf0b69de519c82",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-6": "0510dc5e9d0b6b6ec42190d5d3ea6cdb",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-7": "f78c916860aca5b070021182c4779d18",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-8": "00b5994c24a396764b490ae18ab9a599",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT-9": "936c9e724d32db15be2477ea4b408b1d",
  "dxmodules\\zoneinfo\\right\\Etc\\GMT0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\Greenwich": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Etc\\UCT": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Etc\\Universal": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Etc\\UTC": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Etc\\Zulu": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Europe\\Amsterdam": "9c9b6e69b6805f0c4dbe28b68e8c3376",
  "dxmodules\\zoneinfo\\right\\Europe\\Andorra": "8f9ed78972f8047376bbcca787297bba",
  "dxmodules\\zoneinfo\\right\\Europe\\Astrakhan": "144a16fbf22ba65c2aec4a868c93f1f8",
  "dxmodules\\zoneinfo\\right\\Europe\\Athens": "9cfb86a10147b0d4add4e9c81a524dc1",
  "dxmodules\\zoneinfo\\right\\Europe\\Belfast": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Belgrade": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Berlin": "5d9f8ec5a71ff774a799eb7a6fbde2bb",
  "dxmodules\\zoneinfo\\right\\Europe\\Bratislava": "8cca872478ba5c4443e357a3eb155afd",
  "dxmodules\\zoneinfo\\right\\Europe\\Brussels": "feffc38f8d6d4951f1a5bcfe3512b54a",
  "dxmodules\\zoneinfo\\right\\Europe\\Bucharest": "ea1e49ce1f0883770bdd67baac18be47",
  "dxmodules\\zoneinfo\\right\\Europe\\Budapest": "0ef953b4cdd6aa5fc6c05c806ef855a8",
  "dxmodules\\zoneinfo\\right\\Europe\\Busingen": "1e716194b428d38f654955cc74308f66",
  "dxmodules\\zoneinfo\\right\\Europe\\Chisinau": "1a8a06d7addd111a3c3a6062cb62890d",
  "dxmodules\\zoneinfo\\right\\Europe\\Copenhagen": "85ff23778461ff94dc34930a683397c9",
  "dxmodules\\zoneinfo\\right\\Europe\\Dublin": "fa14bdeed6096bf8faebc5fedc011cdc",
  "dxmodules\\zoneinfo\\right\\Europe\\Gibraltar": "1e5adb0d08c0e55ceef8aee44c7d6d24",
  "dxmodules\\zoneinfo\\right\\Europe\\Guernsey": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Helsinki": "5449e97f865215aad28e8ea273482016",
  "dxmodules\\zoneinfo\\right\\Europe\\Isle_of_Man": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Istanbul": "3f72cd0fb7e26b0dc8d7833327f035db",
  "dxmodules\\zoneinfo\\right\\Europe\\Jersey": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Kaliningrad": "829ea9e23f1ccfc7760bb26ba9b544d4",
  "dxmodules\\zoneinfo\\right\\Europe\\Kiev": "b1849500983d6e866fe6a9559ed6799c",
  "dxmodules\\zoneinfo\\right\\Europe\\Kirov": "ec7954a2d2c6b2f071d4ceefe04ef8c1",
  "dxmodules\\zoneinfo\\right\\Europe\\Lisbon": "4ad34a3a04aee31ee75cbbbe2d1bd17c",
  "dxmodules\\zoneinfo\\right\\Europe\\Ljubljana": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\London": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\Europe\\Luxembourg": "7bbbe6a6b7b9cb4bf346284de85a3309",
  "dxmodules\\zoneinfo\\right\\Europe\\Madrid": "5b1ddafe484b5a19b108489dc08c18b2",
  "dxmodules\\zoneinfo\\right\\Europe\\Malta": "69f5e652e0a30cfabd18421114661a61",
  "dxmodules\\zoneinfo\\right\\Europe\\Mariehamn": "5449e97f865215aad28e8ea273482016",
  "dxmodules\\zoneinfo\\right\\Europe\\Minsk": "aceeb3176221fa68458c66484343958b",
  "dxmodules\\zoneinfo\\right\\Europe\\Monaco": "6e5200d2c0717b4a4b36ad0373581e5e",
  "dxmodules\\zoneinfo\\right\\Europe\\Moscow": "1a3b8b78c50ba48197e1d2fa2f3b4b23",
  "dxmodules\\zoneinfo\\right\\Europe\\Nicosia": "2f833febb7eee0222af785894a47d5a8",
  "dxmodules\\zoneinfo\\right\\Europe\\Oslo": "e4dc442993a2b2784b8b7dbd7160eec4",
  "dxmodules\\zoneinfo\\right\\Europe\\Paris": "303279bb72826189bcfeb2c8aa98c66f",
  "dxmodules\\zoneinfo\\right\\Europe\\Podgorica": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Prague": "8cca872478ba5c4443e357a3eb155afd",
  "dxmodules\\zoneinfo\\right\\Europe\\Riga": "76bf464b939efe723c1ccf72873e44e3",
  "dxmodules\\zoneinfo\\right\\Europe\\Rome": "e540b9cb4bf053e9d8511725272cdf5b",
  "dxmodules\\zoneinfo\\right\\Europe\\Samara": "37128ba2e90a9999239fd86519a62eb0",
  "dxmodules\\zoneinfo\\right\\Europe\\San_Marino": "e540b9cb4bf053e9d8511725272cdf5b",
  "dxmodules\\zoneinfo\\right\\Europe\\Sarajevo": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Saratov": "e4f53774f2ef10a94be981221b099ac6",
  "dxmodules\\zoneinfo\\right\\Europe\\Simferopol": "c8a8d124342e44f3eefc263f59a5dd48",
  "dxmodules\\zoneinfo\\right\\Europe\\Skopje": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Sofia": "458a54a31208222a2c5445708bae28e0",
  "dxmodules\\zoneinfo\\right\\Europe\\Stockholm": "80f1f38ebf4384271a53183343a66975",
  "dxmodules\\zoneinfo\\right\\Europe\\Tallinn": "df5ddb83f7e5387846f5841f0518d0c5",
  "dxmodules\\zoneinfo\\right\\Europe\\Tirane": "2b5278f6502eb243455557a3a211282a",
  "dxmodules\\zoneinfo\\right\\Europe\\Tiraspol": "1a8a06d7addd111a3c3a6062cb62890d",
  "dxmodules\\zoneinfo\\right\\Europe\\Ulyanovsk": "cee2b943281f2225c621bf96786fd7a7",
  "dxmodules\\zoneinfo\\right\\Europe\\Uzhgorod": "10025f95c80284615561b410964fb264",
  "dxmodules\\zoneinfo\\right\\Europe\\Vaduz": "1e716194b428d38f654955cc74308f66",
  "dxmodules\\zoneinfo\\right\\Europe\\Vatican": "e540b9cb4bf053e9d8511725272cdf5b",
  "dxmodules\\zoneinfo\\right\\Europe\\Vienna": "955182f26f6aea388d4a583df74adaa7",
  "dxmodules\\zoneinfo\\right\\Europe\\Vilnius": "d28049e44c7514397233af6e474430ad",
  "dxmodules\\zoneinfo\\right\\Europe\\Volgograd": "f39a8e18a68ed983e5422cdd92247936",
  "dxmodules\\zoneinfo\\right\\Europe\\Warsaw": "2e719e7f3a3f27ae2fe160a8a71c5adc",
  "dxmodules\\zoneinfo\\right\\Europe\\Zagreb": "f7968fe2a968e13508724ac3e05c3990",
  "dxmodules\\zoneinfo\\right\\Europe\\Zaporozhye": "5146398eb6c7013f023928bdf865dd69",
  "dxmodules\\zoneinfo\\right\\Europe\\Zurich": "1e716194b428d38f654955cc74308f66",
  "dxmodules\\zoneinfo\\right\\GB": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\GB-Eire": "6276eb5b4b1e8a15b9d09b22d7d6b50a",
  "dxmodules\\zoneinfo\\right\\GMT": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\GMT+0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\GMT-0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\GMT0": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Greenwich": "35f72054ad6662aeee550ec58dc4a586",
  "dxmodules\\zoneinfo\\right\\Hongkong": "ac812a20a17a6221694038b62ac77ff0",
  "dxmodules\\zoneinfo\\right\\HST": "704400f39808fde5ab87bcca534c957d",
  "dxmodules\\zoneinfo\\right\\Iceland": "4cbcb014d0b6e243af59821c0c384948",
  "dxmodules\\zoneinfo\\right\\Indian\\Antananarivo": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Indian\\Chagos": "a4d08c5e820b85cb1caa8ef9eb22813f",
  "dxmodules\\zoneinfo\\right\\Indian\\Christmas": "f0970ef1981829970d8acbf71af3172f",
  "dxmodules\\zoneinfo\\right\\Indian\\Cocos": "6c238b2fd09e4630a6df4b1b463d4c73",
  "dxmodules\\zoneinfo\\right\\Indian\\Comoro": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Indian\\Kerguelen": "a70e3e41f1c77f539ae8395fff564397",
  "dxmodules\\zoneinfo\\right\\Indian\\Mahe": "3564352984fa37e355be931b944efee9",
  "dxmodules\\zoneinfo\\right\\Indian\\Maldives": "1528d9c478ca032641e3c6a7e258f49f",
  "dxmodules\\zoneinfo\\right\\Indian\\Mauritius": "8f0a9bacf3a5f672a9f012772b77b17e",
  "dxmodules\\zoneinfo\\right\\Indian\\Mayotte": "abc9b7d75108f4008fe6d6343789d4f1",
  "dxmodules\\zoneinfo\\right\\Indian\\Reunion": "054a3a19a8120a110f71d23ca04307ca",
  "dxmodules\\zoneinfo\\right\\Iran": "c3a0c2539fccc3d3f8081b4218c0eb20",
  "dxmodules\\zoneinfo\\right\\Israel": "6fa25ac8d4a8f5e7c03de4434c5cc6b8",
  "dxmodules\\zoneinfo\\right\\Jamaica": "bdf8b2720941180acbbd1404c63f5451",
  "dxmodules\\zoneinfo\\right\\Japan": "e40de6c7fb9ce735aeff885394a727d2",
  "dxmodules\\zoneinfo\\right\\Kwajalein": "11e6875e86cf9f056be3f6dc4b5f9945",
  "dxmodules\\zoneinfo\\right\\Libya": "140c8538c93832c7c7ae0e40d592dd33",
  "dxmodules\\zoneinfo\\right\\MET": "553ea71b74d03c717e719edafac08447",
  "dxmodules\\zoneinfo\\right\\Mexico\\BajaNorte": "4a5aba6b91f6832078382d3f52fd391d",
  "dxmodules\\zoneinfo\\right\\Mexico\\BajaSur": "c366dd821b732f958ecc81707eecc297",
  "dxmodules\\zoneinfo\\right\\Mexico\\General": "9a5c52d9e60891e2b51c17610e75d11f",
  "dxmodules\\zoneinfo\\right\\MST": "eb8570ce4a109cb5f39ae339449435a2",
  "dxmodules\\zoneinfo\\right\\MST7MDT": "0ac5e09fecc392c1825926ea3addb2dd",
  "dxmodules\\zoneinfo\\right\\Navajo": "a04f44b808f1e82a194885aa0528e6ce",
  "dxmodules\\zoneinfo\\right\\NZ": "82b0518985a7fc92949ed0f6f26ff413",
  "dxmodules\\zoneinfo\\right\\NZ-CHAT": "037f7cdaa548a8bb0ed6f906972c87f6",
  "dxmodules\\zoneinfo\\right\\Pacific\\Apia": "87dd16cbe46e5afc0171dd29e0961fe9",
  "dxmodules\\zoneinfo\\right\\Pacific\\Auckland": "82b0518985a7fc92949ed0f6f26ff413",
  "dxmodules\\zoneinfo\\right\\Pacific\\Bougainville": "43d1bca50fc4b42c880e2e1d3b6745e4",
  "dxmodules\\zoneinfo\\right\\Pacific\\Chatham": "037f7cdaa548a8bb0ed6f906972c87f6",
  "dxmodules\\zoneinfo\\right\\Pacific\\Chuuk": "90ac2179ed963cbd44f031d797ab5cea",
  "dxmodules\\zoneinfo\\right\\Pacific\\Easter": "4dfc6403a5adf1616fb68203f03bf30e",
  "dxmodules\\zoneinfo\\right\\Pacific\\Efate": "18abb66b7aa9eca73e343cac55d66f24",
  "dxmodules\\zoneinfo\\right\\Pacific\\Enderbury": "87bf251369c2dfc68c7738e0b82d54ba",
  "dxmodules\\zoneinfo\\right\\Pacific\\Fakaofo": "231d2a10cf0411401a431366984e2a06",
  "dxmodules\\zoneinfo\\right\\Pacific\\Fiji": "9860735dadf3f3d4c9e464e595525cc8",
  "dxmodules\\zoneinfo\\right\\Pacific\\Funafuti": "a68d87ac4ad319e17b93f08249728242",
  "dxmodules\\zoneinfo\\right\\Pacific\\Galapagos": "890a615f425dbba4064293c1a946c7c2",
  "dxmodules\\zoneinfo\\right\\Pacific\\Gambier": "10b8f639b1500971337f57d49f6a6253",
  "dxmodules\\zoneinfo\\right\\Pacific\\Guadalcanal": "4d90ac24eb4f59d4c6a6bd58d779cc91",
  "dxmodules\\zoneinfo\\right\\Pacific\\Guam": "e2a0ac2f20ee3bb3c4324676115aff33",
  "dxmodules\\zoneinfo\\right\\Pacific\\Honolulu": "8388fd415f4c8a2a30a7357da5c8b7a5",
  "dxmodules\\zoneinfo\\right\\Pacific\\Johnston": "8388fd415f4c8a2a30a7357da5c8b7a5",
  "dxmodules\\zoneinfo\\right\\Pacific\\Kiritimati": "5b9795133f270e2aba9484f1f71bb049",
  "dxmodules\\zoneinfo\\right\\Pacific\\Kosrae": "fa011f144e058aa5184d6b53a15061f1",
  "dxmodules\\zoneinfo\\right\\Pacific\\Kwajalein": "11e6875e86cf9f056be3f6dc4b5f9945",
  "dxmodules\\zoneinfo\\right\\Pacific\\Majuro": "2a91ede5e92cb49bb3f0f387e84c8ddf",
  "dxmodules\\zoneinfo\\right\\Pacific\\Marquesas": "34a88ad280b7cb93e02d617121337d4b",
  "dxmodules\\zoneinfo\\right\\Pacific\\Midway": "77931d9a150d72054deaf73ea1af39dc",
  "dxmodules\\zoneinfo\\right\\Pacific\\Nauru": "49b4493e5dc16b8b96db9097b40684be",
  "dxmodules\\zoneinfo\\right\\Pacific\\Niue": "2cdf947862d9d3529e2a8a9e34cc3a72",
  "dxmodules\\zoneinfo\\right\\Pacific\\Norfolk": "c8c9b74862de9c5b6a922ceea4a518ec",
  "dxmodules\\zoneinfo\\right\\Pacific\\Noumea": "0511ee78de0dd4d2e5e1ad2486d4d15a",
  "dxmodules\\zoneinfo\\right\\Pacific\\Pago_Pago": "77931d9a150d72054deaf73ea1af39dc",
  "dxmodules\\zoneinfo\\right\\Pacific\\Palau": "7c8e4928f42b47884c73837fc95b91c4",
  "dxmodules\\zoneinfo\\right\\Pacific\\Pitcairn": "a75b2a9013f723970ceae201335f736f",
  "dxmodules\\zoneinfo\\right\\Pacific\\Pohnpei": "47b2894646c6d9e8773ed8720d851121",
  "dxmodules\\zoneinfo\\right\\Pacific\\Ponape": "47b2894646c6d9e8773ed8720d851121",
  "dxmodules\\zoneinfo\\right\\Pacific\\Port_Moresby": "470ebd903539f82cb2fed9ab0f960ee4",
  "dxmodules\\zoneinfo\\right\\Pacific\\Rarotonga": "45029b877e70bd0df13b50ab015d49fc",
  "dxmodules\\zoneinfo\\right\\Pacific\\Saipan": "e2a0ac2f20ee3bb3c4324676115aff33",
  "dxmodules\\zoneinfo\\right\\Pacific\\Samoa": "77931d9a150d72054deaf73ea1af39dc",
  "dxmodules\\zoneinfo\\right\\Pacific\\Tahiti": "6ea49c35b2399f4a8f36d5a5a5377bb9",
  "dxmodules\\zoneinfo\\right\\Pacific\\Tarawa": "d31390f2de53b92e266ba9d8e5b94398",
  "dxmodules\\zoneinfo\\right\\Pacific\\Tongatapu": "74dfc4d2ae719db55b2afdb6710a3d51",
  "dxmodules\\zoneinfo\\right\\Pacific\\Truk": "90ac2179ed963cbd44f031d797ab5cea",
  "dxmodules\\zoneinfo\\right\\Pacific\\Wake": "a3e7ed5df57910e74754f6236266417d",
  "dxmodules\\zoneinfo\\right\\Pacific\\Wallis": "4cffb736eadc485f07015943ad212f7b",
  "dxmodules\\zoneinfo\\right\\Pacific\\Yap": "90ac2179ed963cbd44f031d797ab5cea",
  "dxmodules\\zoneinfo\\right\\Poland": "2e719e7f3a3f27ae2fe160a8a71c5adc",
  "dxmodules\\zoneinfo\\right\\Portugal": "4ad34a3a04aee31ee75cbbbe2d1bd17c",
  "dxmodules\\zoneinfo\\right\\PRC": "06fb988f003b033771d03ba8888480b1",
  "dxmodules\\zoneinfo\\right\\PST8PDT": "78287f21c770bec0e27c5d2031b24786",
  "dxmodules\\zoneinfo\\right\\ROC": "8f3da0ea2509c2fe35c6bb244f84d2e2",
  "dxmodules\\zoneinfo\\right\\ROK": "e73238fa6c85ea037bf4dcc235113fe9",
  "dxmodules\\zoneinfo\\right\\Singapore": "72be432785863c8a11d83d6f3849f6a1",
  "dxmodules\\zoneinfo\\right\\Turkey": "3f72cd0fb7e26b0dc8d7833327f035db",
  "dxmodules\\zoneinfo\\right\\UCT": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\Universal": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\US\\Alaska": "be6e5ef83221831fd57a032e03246920",
  "dxmodules\\zoneinfo\\right\\US\\Aleutian": "282e70d388dfd3923238b8ca86244246",
  "dxmodules\\zoneinfo\\right\\US\\Arizona": "5adc29642d304ff453993c2b4395505d",
  "dxmodules\\zoneinfo\\right\\US\\Central": "9e0de2483877c5197b136801aa179825",
  "dxmodules\\zoneinfo\\right\\US\\East-Indiana": "aee84cbeb49b67cf69ab388c16ee8bdb",
  "dxmodules\\zoneinfo\\right\\US\\Eastern": "7b602715824f47ba6028f0075b3ea7dc",
  "dxmodules\\zoneinfo\\right\\US\\Hawaii": "8388fd415f4c8a2a30a7357da5c8b7a5",
  "dxmodules\\zoneinfo\\right\\US\\Indiana-Starke": "a4c0cd6601d2974d0d4d331285637042",
  "dxmodules\\zoneinfo\\right\\US\\Michigan": "c7e43a31c24443dcc5a10b94194d77b9",
  "dxmodules\\zoneinfo\\right\\US\\Mountain": "a04f44b808f1e82a194885aa0528e6ce",
  "dxmodules\\zoneinfo\\right\\US\\Pacific": "24885c31a23d629863272538b997f87f",
  "dxmodules\\zoneinfo\\right\\US\\Samoa": "77931d9a150d72054deaf73ea1af39dc",
  "dxmodules\\zoneinfo\\right\\UTC": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\right\\W-SU": "1a3b8b78c50ba48197e1d2fa2f3b4b23",
  "dxmodules\\zoneinfo\\right\\WET": "17c38eb83369fc8dc351e115cd619911",
  "dxmodules\\zoneinfo\\right\\Zulu": "da8c158569d2320293ec1bdb8197b372",
  "dxmodules\\zoneinfo\\ROC": "2e67467e3c050e8b3a4022eb9e20300e",
  "dxmodules\\zoneinfo\\ROK": "f7a6e371bd709b3c2f64ce6f67f39f29",
  "dxmodules\\zoneinfo\\Singapore": "17ef573e0a0badabe0b1bd8768126ef3",
  "dxmodules\\zoneinfo\\Turkey": "e69bdcf9a164fd9a0bc8684663b79219",
  "dxmodules\\zoneinfo\\tzdata.zi": "4c99a0629d76991746913273d2467669",
  "dxmodules\\zoneinfo\\UCT": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\Universal": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\US\\Alaska": "596428a3a840d568656088bd48e608f1",
  "dxmodules\\zoneinfo\\US\\Aleutian": "ad0f12068a0f5376059b7e84df8f0c31",
  "dxmodules\\zoneinfo\\US\\Arizona": "c697bb02e057325a74547912f631a3a7",
  "dxmodules\\zoneinfo\\US\\Central": "d0f076c9f390e7d8a933cc7cc1ad2e90",
  "dxmodules\\zoneinfo\\US\\East-Indiana": "660e305e3bb438c0ae8819055ed9352f",
  "dxmodules\\zoneinfo\\US\\Eastern": "e4ca381035a34b7a852184cc0dd89baa",
  "dxmodules\\zoneinfo\\US\\Hawaii": "d6e1b69b9769f6f79b38da0ba1cd6442",
  "dxmodules\\zoneinfo\\US\\Indiana-Starke": "408adad4b7daacbef77099ba24b1c535",
  "dxmodules\\zoneinfo\\US\\Michigan": "ae3ba6ed8738ceda9eef109c6c586736",
  "dxmodules\\zoneinfo\\US\\Mountain": "02b73b0cf0d96e2f75cae56b178bf58e",
  "dxmodules\\zoneinfo\\US\\Pacific": "9323ff44ce205ce1a1bad7e2dca39939",
  "dxmodules\\zoneinfo\\US\\Samoa": "01c22dcbd90c92cf6076c67523d5da54",
  "dxmodules\\zoneinfo\\UTC": "c79354b8dbee09e62bbc3fb544853283",
  "dxmodules\\zoneinfo\\W-SU": "223bbf37352a9d4807919132f360535e",
  "dxmodules\\zoneinfo\\WET": "92388453e62ec1a69fbf12685ad247c7",
  "dxmodules\\zoneinfo\\zone.tab": "02dddc33edc3a0eeb783555dc2ce1156",
  "dxmodules\\zoneinfo\\zone1970.tab": "2b7b091f4b1c41d6384b254f55654299",
  "dxmodules\\zoneinfo\\Zulu": "c79354b8dbee09e62bbc3fb544853283",
  "README_CN.md": "bbcb5da83f48849dbfe5388e965c2b99",
  "resource\\CN\\wav\\access_f.wav": "f951f3cc1f03aaa794231413fd4efcc6",
  "resource\\CN\\wav\\access_s.wav": "6d1b31bdcaaa13ba719e3223b55d5235",
  "resource\\CN\\wav\\btn11.wav": "a623797305d7b0e6b8cb6b2ab3d43591",
  "resource\\CN\\wav\\btn12.wav": "26bbfc3eed36211713dca9afb423e168",
  "resource\\CN\\wav\\btn13.wav": "67d6fe32693cb2e7653c2ff2141ce873",
  "resource\\CN\\wav\\btn21.wav": "53071472fce6128fdd2ed304e4d78406",
  "resource\\CN\\wav\\btn22.wav": "e35c87d370695099d3b6d7f512496395",
  "resource\\CN\\wav\\btn23.wav": "f25db5592331f1e6deb67beecb3c1131",
  "resource\\CN\\wav\\btn31.wav": "054a4f36ebda08fadca3162d955560bf",
  "resource\\CN\\wav\\btn32.wav": "64eb5fef123eafd7b52108ebcd6bace9",
  "resource\\CN\\wav\\btn33.wav": "67d6fe32693cb2e7653c2ff2141ce873",
  "resource\\CN\\wav\\calibration_s.wav": "d2ff1f1f4a40bf4166130dc079939079",
  "resource\\CN\\wav\\control_f.wav": "4dbaca7e4d227a720620b846544b469a",
  "resource\\CN\\wav\\door_close.wav": "325ca8082f8e9fceb2c7eeeb78d8645b",
  "resource\\CN\\wav\\door_open.wav": "f3b5291fc8babaffd32107198cdd5afa",
  "resource\\CN\\wav\\emergency.wav": "a1855c22f3ef2f69d5c84d3a2852ae1f",
  "resource\\CN\\wav\\emergency_f.wav": "946ac86e74b849ad8f1bec3615cf9b39",
  "resource\\CN\\wav\\emergency_s.wav": "a717e3417891ff306225ac075ba28082",
  "resource\\CN\\wav\\failed.wav": "891194e741b0bc8f6332f78eb607cc85",
  "resource\\CN\\wav\\light_close.wav": "b1ac09e91ac4ce3825614ad1654a3f58",
  "resource\\CN\\wav\\light_open.wav": "16b7b6b8c6eb469645a15e4a54a3e014",
  "resource\\CN\\wav\\network.wav": "7bbc6d740918a20acfb5ef75df685bdb",
  "resource\\CN\\wav\\read.wav": "c83edd035dc15f7a716644319e849215",
  "resource\\CN\\wav\\recg_f.wav": "5cd4d88db4e3f8332b9e73fe05222c83",
  "resource\\CN\\wav\\recg_s.wav": "4afadeb018b08518d5d3dd1cfc5e0d64",
  "resource\\CN\\wav\\recognition.wav": "da00dd97d1e8ca0ed20dc43eb4daafc8",
  "resource\\CN\\wav\\recognition_s.wav": "df9916d6fe3d285894668e63d1aeeb1d",
  "resource\\CN\\wav\\register.wav": "a91d6ebb846dc834816a954168da1352",
  "resource\\CN\\wav\\stranger.wav": "2e6690d7ddcd3609ca3e6d6717b61a9c",
  "resource\\CN\\wav\\user2.wav": "868a9b15aac20b62457f98c955f4e5e0",
  "resource\\CN\\wav\\user2_s.wav": "98904054df059be8cd69e08c302317e7",
  "resource\\CN\\wav\\verify.wav": "2bc2b96e0ca05052985fda98fb552ef9",
  "resource\\CN\\wav\\verify_10x_f.wav": "bf26ce11bbd801f5efeff8c9250f219f",
  "resource\\CN\\wav\\verify_10x_s.wav": "2d04b22277844d9c35e08e4e2c67c11c",
  "resource\\CN\\wav\\verify_200_f.wav": "393036b5fc28a3c04580593d59e26e7e",
  "resource\\CN\\wav\\verify_200_s.wav": "585267371d37f3f45e3826ec7dcafbd3",
  "resource\\CN\\wav\\verify_300_f.wav": "e44977e8b6dcac8adbf304894afd24e0",
  "resource\\CN\\wav\\verify_300_s.wav": "d8e23a91e4999b2d77454aab824bd611",
  "resource\\CN\\wav\\verify_400_f.wav": "05752c8c9c2bf4334943999842529d8b",
  "resource\\CN\\wav\\verify_400_s.wav": "740a63ffe907dda0f2d0e14cb9a83f74",
  "resource\\EN\\wav\\calibration_s.wav": "b5497547d9e7e6fb5b28ee307b27752b",
  "resource\\EN\\wav\\network.wav": "1e8ccfd03ca83976fefdba1edcf1b194",
  "resource\\EN\\wav\\read.wav": "8c1f6ee62c7bf74db5ecab28d3988eeb",
  "resource\\EN\\wav\\recg_f.wav": "e303563b867dd6eaebac18679ca760df",
  "resource\\EN\\wav\\recg_s.wav": "183a843b668aa919311a6d352af80f35",
  "resource\\EN\\wav\\recognition.wav": "1c9e06bc338c49c120aa101b1fac8de0",
  "resource\\EN\\wav\\recognition_s.wav": "f887f2b1615121bbe815fef7f64d3b92",
  "resource\\EN\\wav\\register.wav": "de5d0048f840243fdd1392c09d9ac164",
  "resource\\EN\\wav\\stranger.wav": "31775350903916827fdec25b9c65dd94",
  "resource\\EN\\wav\\verify.wav": "2e77ec2c754e1dea329988d4e462aa2f",
  "resource\\EN\\wav\\verify_10x_f.wav": "7ccc23490436b9f1de32200230953a62",
  "resource\\EN\\wav\\verify_10x_s.wav": "0630e0410fca3c7fd7e701c69e8ea4bc",
  "resource\\EN\\wav\\verify_200_f.wav": "64ce473b0f560cc1613469ab94197ce6",
  "resource\\EN\\wav\\verify_200_s.wav": "e3d28c408cc3bef5461620c75b15abdf",
  "resource\\EN\\wav\\verify_300_f.wav": "7fa0d7bf85d040b72a89cfb9e2f06bcf",
  "resource\\EN\\wav\\verify_300_s.wav": "3e69fd763477d6cc30543d838f33d718",
  "resource\\EN\\wav\\verify_400_f.wav": "d074b8f6e4e968b6d1984b123ed4d387",
  "resource\\EN\\wav\\verify_400_s.wav": "9141136d3310a5fac5917d3f6056249f",
  "resource\\font\\AlibabaPuHuiTi-3-65-Medium.ttf": "c8015ba2be3b6bb5fd991e9435ec1f8d",
  "resource\\font\\Arabic.ttf": "3f00fe80780beb16682239db77e1aa80",
  "resource\\font\\Korean.ttf": "470e4a7b27f9944288feb9fa3883b4fb",
  "resource\\i18n\\CN.json": "bc0fd0baf44a41fa1e1ae92b4061a792",
  "resource\\i18n\\EN.json": "bc0fd0baf44a41fa1e1ae92b4061a792",
  "resource\\image\\4g.png": "e5b27ed5a596cb16c7ab695d82fe3014",
  "resource\\image\\4g_dark.png": "414b3a9fcefd8ea6909158b51038d4d8",
  "resource\\image\\accessCtrl.png": "6be30c8f648ec7153ae2c39a15884181",
  "resource\\image\\add.png": "498480ce68e4d6047eb74d3aa5229f56",
  "resource\\image\\advance.png": "d98aeb99a04163bce23b6c2638cd705a",
  "resource\\image\\app.png": "7640c7358a3f5dba1f887b8413b93a9d",
  "resource\\image\\app_btn.png": "aa325cea46fd3918c86d76bf009b1663",
  "resource\\image\\app_qrcode.png": "0a20655d02ff0e473106bf41f7c9687b",
  "resource\\image\\arrow_right.png": "edc6876d6fa1e2d0be2e606c73e0f2ec",
  "resource\\image\\back.png": "aa5869ff78051dbdc5f688f1805064da",
  "resource\\image\\background.jpg": "90d464f4221f62132ebf74e69446b6d7",
  "resource\\image\\backspace.png": "26302e37dd8618e92c3a47d68039d0ec",
  "resource\\image\\back_2.png": "b3f16ab01606d85c2c70124d50b3af1b",
  "resource\\image\\basic.png": "84eedd84efdc5fdb54138dd29cf6fc41",
  "resource\\image\\black_btn.png": "13ee1720aff247ba3f8e22e00f89a316",
  "resource\\image\\card.png": "c05047d2ad6549db001d08790cb5d9ff",
  "resource\\image\\close.png": "a5353c231df804fcc4577672ab3a4302",
  "resource\\image\\close_small.png": "7d6cddddc38ce8d4950789169213add4",
  "resource\\image\\cloudCert.png": "4481cfb9c2d1f44f0a0dd0489cb6fc2b",
  "resource\\image\\co2_f.png": "7e6f00c03b71a4dbe439491083ca731c",
  "resource\\image\\co2_s.png": "4fb691286b8856f1ed25ef8bacdb6099",
  "resource\\image\\commMgmt.png": "5cd157e1b8c82fdf9ddba1f6d5047b9b",
  "resource\\image\\config.png": "50d2091b9f7fba5915dbed0aa0dcf918",
  "resource\\image\\config_btn.png": "e54cbc27d30e7c6480b83107a631e7ef",
  "resource\\image\\delete.png": "014bad6d9a94a133c58ef350e198101e",
  "resource\\image\\delete_fill.png": "947fc08278354a1151d5599382c2c5f3",
  "resource\\image\\deviceInfo.png": "3e40246e01c1f7eede4d76fcbba33825",
  "resource\\image\\devInfo.png": "1a80aba6780a45f8775bdfdcff4df23a",
  "resource\\image\\doorControl.png": "68993ef92bb8c6b2d0dab2c75cc7533d",
  "resource\\image\\down.png": "c4d5c1883db4694ccedb7c1140d89da9",
  "resource\\image\\emergencyOpen.png": "890877dee840dabe60487f8ce57b41f6",
  "resource\\image\\empty.png": "8283ac78099d9c13ef4b552ce86f5c38",
  "resource\\image\\enter.png": "787e076256c8a47e07f2091a57585fb5",
  "resource\\image\\enter_b.png": "02cb6c84fec128a639e3cf0828a6ee5f",
  "resource\\image\\ethernet.png": "f3abb111d96a11a56f7ed77b21abab4c",
  "resource\\image\\ethernet_dark.png": "10656303a6d22e204014f55ed0fb3efb",
  "resource\\image\\eth_disable.png": "7017f5cc2c9b4f802f082f6c0f5bb581",
  "resource\\image\\eth_enable.png": "84d1334e524ac669c3b79e8a69b41eb1",
  "resource\\image\\eye-fill.png": "9ae71914bd47423be04d0a22eb4f3995",
  "resource\\image\\eye-off.png": "295c3e8255ced50cf2667ecda524e11e",
  "resource\\image\\eye_fill.png": "d0ac0d07f13e02e5fae7a12a0858ec49",
  "resource\\image\\eye_fill_show.png": "265cf669797b94a138982c01c29d0bd9",
  "resource\\image\\face.png": "d695a5f29dbf051fc0c6e0d4e177f5c5",
  "resource\\image\\faceAdd.png": "5e0e3d4eb3f034a179a8eef5c08d4c63",
  "resource\\image\\faceEmpty.png": "9ef3bd1d776183e203e69d5c91e4b129",
  "resource\\image\\faceError.png": "19841af9136d4483642a254ab1a6f57c",
  "resource\\image\\faceRec.png": "f1bfcb61f4642c6c1bbc04856fb57905",
  "resource\\image\\faceRec2.png": "580c72783b4cfc64ec0a9593e77c456a",
  "resource\\image\\factoryTest.png": "4bdb36420046870efcabd4a040e31913",
  "resource\\image\\failBg.png": "5d6dca3cc98032a10ef4bc0658f7e546",
  "resource\\image\\grey_btn.png": "b0ca6e44c0e01a17d0bdda5f7e057cc2",
  "resource\\image\\help.png": "7d75da0510ca74870858a639882dc2ef",
  "resource\\image\\idleImage.jpg": "90d464f4221f62132ebf74e69446b6d7",
  "resource\\image\\input_bg.png": "8a8f5c43f1118869a7679ccbaaf47de2",
  "resource\\image\\light_close.png": "607b38280bb5321327cacce5bd6c3fe9",
  "resource\\image\\light_open.png": "1a8df3753b6f0df9e7abb5b53dabd72e",
  "resource\\image\\localUser.png": "6429f43f7fee002d66d50a3d92a087da",
  "resource\\image\\lock.png": "c1419aa2a9c9da4b7dbf3529a1af37f3",
  "resource\\image\\logo.png": "5768b9344bedc53096d2227bee5d52d4",
  "resource\\image\\menu_btn.png": "df98739cd4804d08b23eaf33bb92e1bc",
  "resource\\image\\mini_app.png": "82ee9005b5d162a6fbb0d32764088da4",
  "resource\\image\\mini_background.png": "620bf06dbfffe37f717b91fb3ed8ef40",
  "resource\\image\\mini_config.png": "6bf78553fb53673a89e80613cfbee4c1",
  "resource\\image\\mini_password.png": "6892385a457e084953bcf9acb2ae9957",
  "resource\\image\\mqtt.png": "542ebc6bdbb66ea0f25cf29aeb9d264c",
  "resource\\image\\mqtt_dark.png": "d4aab5adc128846c47a3b8bb015c757b",
  "resource\\image\\mqtt_enable.png": "fc766f5fcbb95eca648ee10d421cc8fe",
  "resource\\image\\network.png": "0a0119e3d5fce101b28575a4e44aaf7e",
  "resource\\image\\networkSetting.png": "3e83d354e8293ed112fe7cc405b94187",
  "resource\\image\\network_dark.png": "3c5f8ce5732e95ad613cdd41dc5adbc0",
  "resource\\image\\o2_f.png": "b787951eba880b3ae82b42594b4e30df",
  "resource\\image\\o2_s.png": "50564fb865bb7f5ed0352e43ea17d853",
  "resource\\image\\ph3_f.png": "e95a348c887298dc4ed0555c577ea5bb",
  "resource\\image\\ph3_s.png": "96e68d741b75fcd6938a6909014cccb0",
  "resource\\image\\pwd_btn.png": "8764458bee98bff728445837e126231e",
  "resource\\image\\qrcode_small.png": "285bbe7e8f968c8bf4506a563dffcac2",
  "resource\\image\\recordQuery.png": "d340255a0c2342382bff6f8c57f6376b",
  "resource\\image\\recQuery.png": "1b8c58663a6e61f4f885e784ee4e87d4",
  "resource\\image\\rectangle.png": "394e2e483120908674f6de7fb879bfcf",
  "resource\\image\\register.png": "7fa975d92007703532ba8011f2a0109f",
  "resource\\image\\right.png": "a6f6bc770ad7a8220effcc96e750aaaa",
  "resource\\image\\select_arrow.png": "9d82daa1092375abc413d581f36aaf2d",
  "resource\\image\\setting.png": "92365fd93f2cfa63c7901ce3d8900a42",
  "resource\\image\\setting32.png": "e531bf8a9ce7f6cf93a8ea9baf95377c",
  "resource\\image\\space.png": "de9816e31308bd7ce187fe03ab634a37",
  "resource\\image\\successBg.png": "1ef294bd7e1688bba47c2337906b1d1d",
  "resource\\image\\success_fill.png": "09166b0cd4da44b76b4f6cdc2c550103",
  "resource\\image\\sysSettings.png": "0a84bbe887481a1cce1ca562f83d5b89",
  "resource\\image\\systemSetting.png": "9aee20d073df321250a5bbc57d16d5f1",
  "resource\\image\\sys_info.png": "20dc23c019d07cd2c3ce32a160b7b63f",
  "resource\\image\\title_bg.png": "82fbdcc4133899d03072dcd57a92f203",
  "resource\\image\\trackFace.png": "e90f92eb629563ede01aadca2b719de9",
  "resource\\image\\unlock.png": "7b97b659c36d3ba4f435f44792b90a80",
  "resource\\image\\user.png": "6429f43f7fee002d66d50a3d92a087da",
  "resource\\image\\userGuide.png": "3227210f670f66cd6c29641e1212b0b8",
  "resource\\image\\userMgmt.png": "5dad96f344513f970c2b582d7feb537d",
  "resource\\image\\user_1.png": "36ab26e22dc39ea28c03f05f4ab891ce",
  "resource\\image\\user_f.png": "d82d235224deccd2235ab15dbf1fda26",
  "resource\\image\\user_s.png": "709953f3695cae9ac1bb50533f1a96ba",
  "resource\\image\\user_w.png": "bc2ca556f37181815c0093d802f2f24f",
  "resource\\image\\vf105\\4g.png": "deebc58c4b7c81d3628c6bfe3d833917",
  "resource\\image\\vf105\\4g_dark.png": "5cfe44ac267d0a1dfbfb896caa5dfe42",
  "resource\\image\\vf105\\accessCtrl.png": "0561dac85eb4b325fdc377c63a1d1f52",
  "resource\\image\\vf105\\add.png": "5ae43bc20471a91c6891d9a7cbe1e960",
  "resource\\image\\vf105\\advance.png": "cb19e041703481ec6b0936074d3ff9d0",
  "resource\\image\\vf105\\app.png": "2aa76ac48dcd1e35789f4031e2c90d76",
  "resource\\image\\vf105\\app_btn.png": "9e8242d16657897b531a57bad52a0b20",
  "resource\\image\\vf105\\app_qrcode.png": "919faf258376df92efc42a27ba5f42ea",
  "resource\\image\\vf105\\arrow_right.png": "c01c64cf2d2f257917e6b733d2dc61ee",
  "resource\\image\\vf105\\back.png": "be4dce7a5996ed70af1207a1f3e1ffbf",
  "resource\\image\\vf105\\background.jpg": "1327b8fbd25c1a38da1a14c6b23fd381",
  "resource\\image\\vf105\\backspace.png": "4f3eebd143aa2abc2c4f058d311a108d",
  "resource\\image\\vf105\\back_2.png": "1d4bd817afe4cb46769c9a478305c823",
  "resource\\image\\vf105\\basic.png": "1917055452e69999d6160255283bd5fe",
  "resource\\image\\vf105\\black_btn.png": "da8f9db1ef40edace91552ae2a89357a",
  "resource\\image\\vf105\\card.png": "59af350406e053f432e558f8ae3787d5",
  "resource\\image\\vf105\\close.png": "cc269b704bc8c998f1f0b4eaae921469",
  "resource\\image\\vf105\\close_small.png": "e5e5c5a54b90cda627c6c03675cdf56b",
  "resource\\image\\vf105\\cloudCert.png": "5e56e48322f2bcef31ba844c8bebc393",
  "resource\\image\\vf105\\commMgmt.png": "81b9d03c23f75ad877df64de06911c44",
  "resource\\image\\vf105\\config.png": "648480dea71675fbb8a838a96b861f4c",
  "resource\\image\\vf105\\config_btn.png": "2a581106bd12c67da3205b613bc10122",
  "resource\\image\\vf105\\delete.png": "2ad0310904b10885096fba14965244f2",
  "resource\\image\\vf105\\delete_fill.png": "29d3a8d714b6a0f0bd73dd8ef5947df6",
  "resource\\image\\vf105\\developer.png": "e71e5ac6071eb821e86b44a91b59c838",
  "resource\\image\\vf105\\deviceInfo.png": "deb7e25ebba6ac92b86bf0e740fdba12",
  "resource\\image\\vf105\\devInfo.png": "fc661d4864cae401050ffd3fb61c19ac",
  "resource\\image\\vf105\\doorControl.png": "e9e1e2400a3bc2b8a566757a7e73b104",
  "resource\\image\\vf105\\down.png": "4fb09683bd3472015d5ae857b902e5f8",
  "resource\\image\\vf105\\empty.png": "1ace2c58eefdbb660ebda558bbf971ff",
  "resource\\image\\vf105\\enter.png": "4fdefe7a74ee80fb788fe44cbae40939",
  "resource\\image\\vf105\\enter_b.png": "a17ddca038c8e48961421e42dadef12c",
  "resource\\image\\vf105\\ethernet.png": "bd6ff1bd4635626409ae1368ea819190",
  "resource\\image\\vf105\\ethernet_dark.png": "b620fb06a520673227b24fe875bc8c04",
  "resource\\image\\vf105\\eth_disable.png": "fb715be89aae2b189cef1a93796a2bbd",
  "resource\\image\\vf105\\eth_enable.png": "11366418b487b814ad63be2a11fad9a3",
  "resource\\image\\vf105\\eye-fill.png": "8cbf389b92610178808283930cf2c29e",
  "resource\\image\\vf105\\eye-off.png": "fb636053be988b443f9d52901dd773a1",
  "resource\\image\\vf105\\eye_fill.png": "4b7ef420f57d10e271c745587a9c5692",
  "resource\\image\\vf105\\eye_fill_show.png": "9677930e55cbe5766a75554d527ab3f1",
  "resource\\image\\vf105\\face.png": "dc94fe6a6c31259ae386b6a84f41884a",
  "resource\\image\\vf105\\faceAdd.png": "2e02cea502f061c31537bff3281d8d93",
  "resource\\image\\vf105\\faceEmpty.png": "4e766bd9e4150be9a1149a7c072a9787",
  "resource\\image\\vf105\\faceError.png": "0be5992ee5364f99589217b1199ad7db",
  "resource\\image\\vf105\\faceRec.png": "9c6573c2861d9e136ba789ad748af684",
  "resource\\image\\vf105\\faceRec2.png": "62ceecccb4888209192f7000f307bb70",
  "resource\\image\\vf105\\factoryTest.png": "f0324fe73098bb08a2208e44f6ef3d6d",
  "resource\\image\\vf105\\failBg.png": "358ad8e1f0312efbafdb077b504c165e",
  "resource\\image\\vf105\\fingerBoxF.png": "125df8fa37905599d62ff47bbbd83aaf",
  "resource\\image\\vf105\\fingerBoxS.png": "db2154eb4d4bd3d83b5230c04444477e",
  "resource\\image\\vf105\\fingerRe0.png": "031e35a4b855732d72e64097ec9d01f6",
  "resource\\image\\vf105\\fingerRe1.png": "0056ca579917f7d4fc9da9eebf848107",
  "resource\\image\\vf105\\fingerRe2.png": "5f76290d264c5be03cf87367ccff6b98",
  "resource\\image\\vf105\\fingerRe3.png": "f8cd749690744cffceff1ccd2d82e3fd",
  "resource\\image\\vf105\\grey_btn.png": "76a60991c1e633ddbf6fd62c9f620d25",
  "resource\\image\\vf105\\help.png": "ca3028f1bea2dbb14ffb86c2e779a038",
  "resource\\image\\vf105\\idleImage.jpg": "44bfe1382c2e7055a1955b924acea44a",
  "resource\\image\\vf105\\idleImage.png": "3ae637d7958e135f2164f4e9577f493f",
  "resource\\image\\vf105\\localUser.png": "46e92a28978bbd8da82d8eb7d3168aa4",
  "resource\\image\\vf105\\lock.png": "6ce2803f6feb5dd8e1b015fd774c497d",
  "resource\\image\\vf105\\menu_btn.png": "1e7fc164bce121b3f06e50af62c51e25",
  "resource\\image\\vf105\\mini_app.png": "973d67e3375260e7001ae01e0cac2d38",
  "resource\\image\\vf105\\mini_background.png": "f6ea6c8747055632dfc26c4dd2223549",
  "resource\\image\\vf105\\mini_config.png": "0c77094b492d84314afbdd24ee57c09d",
  "resource\\image\\vf105\\mini_password.png": "17481fb43930feaa36c882db1186748a",
  "resource\\image\\vf105\\mqtt.png": "ee92d53c5c6982b7c0418a5ec6821f59",
  "resource\\image\\vf105\\mqtt_dark.png": "a4571c52ac1208ca9de4279cafcfeea8",
  "resource\\image\\vf105\\network.png": "e067a6a31b3b3f8e6cacd96cc77c5216",
  "resource\\image\\vf105\\networkSetting.png": "61b2477bcb70865b7c166df7f777f416",
  "resource\\image\\vf105\\network_dark.png": "d142406315dcfa2a1277f9aacf03cffa",
  "resource\\image\\vf105\\pwd_btn.png": "c3fed4b5d9c6288bf1207ca5d92d619c",
  "resource\\image\\vf105\\qrcode_small.png": "cc962f51b5404db51bbc2868c4d6af77",
  "resource\\image\\vf105\\recordQuery.png": "7503152bdf3aafded5295fa321d93654",
  "resource\\image\\vf105\\recQuery.png": "1de029b697e42affb3103ddba57382f1",
  "resource\\image\\vf105\\rectangle.png": "b64428c942dfa899df37b9cf0d3f43f8",
  "resource\\image\\vf105\\register.png": "f4b081b7aef4dc6d1ba1ce6e99056734",
  "resource\\image\\vf105\\right.png": "cb0cbed9eb5970784965d8e89f82478f",
  "resource\\image\\vf105\\select_arrow.png": "da3020499f41c8b7f6f2ea5f4336db4b",
  "resource\\image\\vf105\\setting.png": "a65d388b9aab8be38c636823a63946a4",
  "resource\\image\\vf105\\setting32.png": "23524292f4f233b55c9f418a5e2e25b7",
  "resource\\image\\vf105\\space.png": "e86fb40094372f10671b013ce07b7eb6",
  "resource\\image\\vf105\\successBg.png": "fbf2cd4b5878d02d9c3583a444d02467",
  "resource\\image\\vf105\\success_fill.png": "1299222da2acb2f5209dc754cc0e3677",
  "resource\\image\\vf105\\sysSettings.png": "e2f48df59e6624717dd0c6ca35ff91ca",
  "resource\\image\\vf105\\systemSetting.png": "8ebd576b41be069d1db5e1919b95bd52",
  "resource\\image\\vf105\\sys_info.png": "374377d37b88c5be8678dd8314f443d0",
  "resource\\image\\vf105\\trackFace.png": "efc48bdabbc21e49cb3d20e4e43b63c0",
  "resource\\image\\vf105\\unlock.png": "5efdc71f5f45a431e0e8b0d74faa91a2",
  "resource\\image\\vf105\\user.png": "7e8ef656c544c3432f015c655421ff8f",
  "resource\\image\\vf105\\userGuide.png": "cbfac61db886f390c07d2a98161ef802",
  "resource\\image\\vf105\\userMgmt.png": "5cc57923cb18f394673cea498132daa2",
  "resource\\image\\vf105\\vip.png": "921e0753528bf63d031b73473549db9f",
  "resource\\image\\vf105\\voiceBroadcast.png": "9a0e56e9e8d878559f9dad0138c3c1d9",
  "resource\\image\\vf105\\wechat.png": "bf6b8466a1a8d84d869b06efd3540d46",
  "resource\\image\\vf105\\wifi.png": "fb46272231389474003cd2f5191ea353",
  "resource\\image\\vf105\\wifi_dark.png": "a167e7e06f3ed5740e3336b7f8123c8b",
  "resource\\image\\vf114\\4g.png": "bdd7c97e50e4b092673b29bbe88bd8b8",
  "resource\\image\\vf114\\4g_dark.png": "3539b8fc025cb50b04db91d632952548",
  "resource\\image\\vf114\\accessCtrl.png": "9dfb072e0137274eec201845ad555665",
  "resource\\image\\vf114\\add.png": "95fdd8fc16b07b45a6ec87cd737e5071",
  "resource\\image\\vf114\\advance.png": "ad39f26cd248c761944c588396617b75",
  "resource\\image\\vf114\\app.png": "702301a70e1a69b8dc07ae08ee0b3c9a",
  "resource\\image\\vf114\\app_btn.png": "0173d42cca268ee3162e1d4877655af4",
  "resource\\image\\vf114\\app_qrcode.png": "e03e3a48337ca68e4f6639bb814a3cd4",
  "resource\\image\\vf114\\arrow_right.png": "76e59179fee9109776b2d6c3178de0d0",
  "resource\\image\\vf114\\back.png": "974667f9572bd57b221c95da25ae5343",
  "resource\\image\\vf114\\background.jpg": "ad3dd883a8878f3cd8b6d9d9b1726c05",
  "resource\\image\\vf114\\backspace.png": "63458547fb5c95ea53cf92a2204b04a9",
  "resource\\image\\vf114\\back_2.png": "d166678290cae0616dcb2053294eca28",
  "resource\\image\\vf114\\basic.png": "6885a5790b032eda507250b01411eda8",
  "resource\\image\\vf114\\black_btn.png": "2c69fa32fd710cd0544b19a2b3630fc3",
  "resource\\image\\vf114\\card.png": "a7700c9f983f73747ab519b74a9a35b1",
  "resource\\image\\vf114\\close.png": "324b84b237288f7cde0b08ad12d1d577",
  "resource\\image\\vf114\\close_small.png": "b88b06ecb81f18c9b70ba6c4b4052169",
  "resource\\image\\vf114\\cloudCert.png": "e1f01a5bcc0e0f40afb8ad3ae8a1d77b",
  "resource\\image\\vf114\\commMgmt.png": "33c350ead16aa52ec41b0e68d5a28684",
  "resource\\image\\vf114\\config.png": "fd5f1336f72193f7c15698941a208509",
  "resource\\image\\vf114\\config_btn.png": "8ed325539cc83b73d915e9ccda9e2e43",
  "resource\\image\\vf114\\delete.png": "3cce3c9fafb55aac0402255f0631f436",
  "resource\\image\\vf114\\delete_fill.png": "b08f9411e7522b9e7cafab4d40c5311e",
  "resource\\image\\vf114\\developer.png": "44a015510d4b1aabfa4959afb94a433b",
  "resource\\image\\vf114\\deviceInfo.png": "d4f02a866605b683f135ab7dbba549b9",
  "resource\\image\\vf114\\devInfo.png": "faed670572922bda527fc8255412e548",
  "resource\\image\\vf114\\doorControl.png": "7be9d2b7b3b3432176e9bb2fdaf49f5e",
  "resource\\image\\vf114\\down.png": "5a6689a7adc59c87a6ed2d565875c99d",
  "resource\\image\\vf114\\empty.png": "0c4645c8c569b84b22b84ef471a256fb",
  "resource\\image\\vf114\\enter.png": "cfdde3f3e9127940c95ba141a3ed9b9a",
  "resource\\image\\vf114\\enter_b.png": "1604cad02b5a9daa13e5d813b113ab54",
  "resource\\image\\vf114\\ethernet.png": "fad299febb1021bb8c11d2b5bffe44bb",
  "resource\\image\\vf114\\ethernet_dark.png": "693e0fdda1c57c85fe39231915ce3cbc",
  "resource\\image\\vf114\\eth_disable.png": "6cf5c960b556abf16fea7c42687baa5b",
  "resource\\image\\vf114\\eth_enable.png": "a7ff6da3b332f5fbaf0a56e77f2760d2",
  "resource\\image\\vf114\\eye-fill.png": "e9fafd51f0d641f0c8adc683374d6c05",
  "resource\\image\\vf114\\eye-off.png": "a501181551682e1408f723fdbe63b9de",
  "resource\\image\\vf114\\eye_fill.png": "eda7423b7a833faf1b795fe592ae5aa4",
  "resource\\image\\vf114\\eye_fill_show.png": "0974c798b074126a70924b61456b44ea",
  "resource\\image\\vf114\\face.png": "06b7afd104e793f5352d04d34df91c05",
  "resource\\image\\vf114\\faceAdd.png": "0b5ad2c4bd3e8c5fbf139495310574be",
  "resource\\image\\vf114\\faceEmpty.png": "3c72971bf874c4ab54793944f65a2275",
  "resource\\image\\vf114\\faceError.png": "1f53a4b110495ef1685c87776af5eedf",
  "resource\\image\\vf114\\faceRec.png": "862e02eb3cf55fe786aafea089df57c4",
  "resource\\image\\vf114\\faceRec2.png": "a0fee4f4e7662b1ad9f6a51f1dddc35f",
  "resource\\image\\vf114\\factoryTest.png": "b8490aa1a9f613bc1cbd6b96d8214dc0",
  "resource\\image\\vf114\\failBg.png": "5527c1808e8443f945cd2c72d4794d83",
  "resource\\image\\vf114\\fingerBoxF.png": "125df8fa37905599d62ff47bbbd83aaf",
  "resource\\image\\vf114\\fingerBoxS.png": "db2154eb4d4bd3d83b5230c04444477e",
  "resource\\image\\vf114\\fingerRe0.png": "031e35a4b855732d72e64097ec9d01f6",
  "resource\\image\\vf114\\fingerRe1.png": "0056ca579917f7d4fc9da9eebf848107",
  "resource\\image\\vf114\\fingerRe2.png": "5f76290d264c5be03cf87367ccff6b98",
  "resource\\image\\vf114\\fingerRe3.png": "f8cd749690744cffceff1ccd2d82e3fd",
  "resource\\image\\vf114\\grey_btn.png": "5c9d4c08a43153dfdc1302e37f4c1634",
  "resource\\image\\vf114\\help.png": "a5b6c8c6931e00bc77804e42aeae011f",
  "resource\\image\\vf114\\idleImage.jpg": "ad3dd883a8878f3cd8b6d9d9b1726c05",
  "resource\\image\\vf114\\idleImage.png": "67b21ca8b9dfffb56ca1461c16b55afc",
  "resource\\image\\vf114\\localUser.png": "af0d5ded90865acac93e68870f910cd9",
  "resource\\image\\vf114\\lock.png": "54ae7cc3b5d50ec68939bd5bc8309ef2",
  "resource\\image\\vf114\\menu_btn.png": "fd5f1336f72193f7c15698941a208509",
  "resource\\image\\vf114\\mini_app.png": "638cdf3c7fbd1f86c69927dde9a214fe",
  "resource\\image\\vf114\\mini_background.png": "11134c0d4ac0097232618ed1a62883e4",
  "resource\\image\\vf114\\mini_config.png": "69f3f7a33cf1617ec08fb8d228facb0a",
  "resource\\image\\vf114\\mini_password.png": "be1e0d36d21e9f70262243e63ac11fe8",
  "resource\\image\\vf114\\mqtt.png": "e1a62521c2273ec0cef41144854acea9",
  "resource\\image\\vf114\\mqtt_dark.png": "51ab6bb9a073752697b1f7241f5ad6f2",
  "resource\\image\\vf114\\network.png": "d0460d1844015a805a1f52d8432001f5",
  "resource\\image\\vf114\\networkSetting.png": "d1e5477b9ddf2da94e637876530481dd",
  "resource\\image\\vf114\\network_dark.png": "60f7b54297f927126f52302de8b4b18f",
  "resource\\image\\vf114\\pwd_btn.png": "a8f19a82bfe03b629ac3e0a3964135fc",
  "resource\\image\\vf114\\qrcode_small.png": "12ba5e07703c3bf32c6ef4ff7750242e",
  "resource\\image\\vf114\\recordQuery.png": "a4ad2ada5f8bf9c13d5a58bf70e40cac",
  "resource\\image\\vf114\\recQuery.png": "98a6a81d624137dea96dcc0e8780902f",
  "resource\\image\\vf114\\rectangle.png": "9482162a7b2744f313041be02c2c7c35",
  "resource\\image\\vf114\\register.png": "35b0032b10158b850ebab52c1b89fc2b",
  "resource\\image\\vf114\\right.png": "55fb9deeabf97b30da9749dd51aea5ea",
  "resource\\image\\vf114\\select_arrow.png": "db66347b510537a4314da045c526cb0e",
  "resource\\image\\vf114\\setting.png": "ecf2ed928f51c830176a6ae4f503034c",
  "resource\\image\\vf114\\setting32.png": "8412dcd0fa26cb8bb812d76d2c257e9b",
  "resource\\image\\vf114\\space.png": "65eac6437c86617b7be146390b34e12a",
  "resource\\image\\vf114\\successBg.png": "a3ca0ce6acf62f57e4fcf25f5a073c13",
  "resource\\image\\vf114\\success_fill.png": "589b3bd7fbcf7880c5f2b23accdd36e1",
  "resource\\image\\vf114\\sysSettings.png": "946f8967e9b323b34f27242f0990d137",
  "resource\\image\\vf114\\systemSetting.png": "19f0225379041aec6b16e1cf5af54962",
  "resource\\image\\vf114\\sys_info.png": "5725825e5d4364dc578ad47754f92270",
  "resource\\image\\vf114\\trackFace.png": "1b2e2ddf116119b5d39cbc37bf5011ed",
  "resource\\image\\vf114\\unlock.png": "fb4defefea714489b8ed7b7002270f38",
  "resource\\image\\vf114\\user.png": "af0d5ded90865acac93e68870f910cd9",
  "resource\\image\\vf114\\userGuide.png": "89831ab4360b20a5b4c99e0ea48f5ac7",
  "resource\\image\\vf114\\userMgmt.png": "0e3e47b6fe33cb209bc0c350917945e2",
  "resource\\image\\vf114\\vip.png": "936afbfc08e7d30831805407a3d73f24",
  "resource\\image\\vf114\\voiceBroadcast.png": "eb3ed0a4728e47e3ee684637fa0862ce",
  "resource\\image\\vf114\\wechat.png": "78a3125fc2c9b62d5fb83b5f9a255a4f",
  "resource\\image\\vf114\\wifi.png": "f966bbd23a878842cc6927cf2232eb26",
  "resource\\image\\vf114\\wifi_dark.png": "aa8fd7b0f6920c47c18e3a4c731c1279",
  "resource\\image\\vf202\\4g.png": "dac9a45fe25163789ea513e2fcf76c2f",
  "resource\\image\\vf202\\4g_dark.png": "0e91379860cc3f29cb10e941ea1cf445",
  "resource\\image\\vf202\\accessCtrl.png": "252dfe563aa14ed13f6335c66819e88e",
  "resource\\image\\vf202\\add.png": "37f570778a63000e2fe13693a837e50c",
  "resource\\image\\vf202\\advance.png": "6890b0ea472a8d2534982a338bb212e6",
  "resource\\image\\vf202\\app.png": "778a7f45f1c61545c444b35ac1bb636c",
  "resource\\image\\vf202\\app_btn.png": "1a7beb9c843dac5bfe8cb516ae85e578",
  "resource\\image\\vf202\\app_qrcode.png": "24f2dd26efc016c829afd1ad9ec10021",
  "resource\\image\\vf202\\arrow_right.png": "44bd3be59aa1e6a3d55e1932ee139a41",
  "resource\\image\\vf202\\back.png": "576a3ac118a18df9e5c19371b51cd0b7",
  "resource\\image\\vf202\\background.jpg": "e261f9d11ba192b9a318855198a82a72",
  "resource\\image\\vf202\\backspace.png": "83a1bf7837d546548d4cc224ac0b95f2",
  "resource\\image\\vf202\\back_2.png": "2f4178d75fa6e2811745b790763dfd22",
  "resource\\image\\vf202\\basic.png": "19f16388b948bb3c62d8177060dcd0a6",
  "resource\\image\\vf202\\black_btn.png": "b15f6df11a49a205289eb2471da39ae6",
  "resource\\image\\vf202\\card.png": "9f9b02e484e6621f0929289daa32ab31",
  "resource\\image\\vf202\\close.png": "9d61811afdf59012d7bb482487b49edb",
  "resource\\image\\vf202\\close_small.png": "9956b2ae6ed2874af7c1fc631f34a423",
  "resource\\image\\vf202\\cloudCert.png": "245c00f50c46be8da93960416f47cfff",
  "resource\\image\\vf202\\commMgmt.png": "58ad847a1a506b66f92adcad635e0f12",
  "resource\\image\\vf202\\config.png": "5bf26f61a5105bc20c9885679754ce1c",
  "resource\\image\\vf202\\config_btn.png": "8d16e5ca4e08e31e9e22422ed21d6478",
  "resource\\image\\vf202\\delete.png": "46e9b381a1bc45e950f1b332ecf54940",
  "resource\\image\\vf202\\delete_fill.png": "4a215805b88677ede12627c4ac9e3a17",
  "resource\\image\\vf202\\developer.png": "3314b8f50d20c7939bf17806622f2180",
  "resource\\image\\vf202\\deviceInfo.png": "4710af6ceceaab1cdfc0032223144a64",
  "resource\\image\\vf202\\devInfo.png": "ca529fac38bf272fab9c0fa93d651ce5",
  "resource\\image\\vf202\\doorControl.png": "5ba35b3c1e45572f306fcc223e2c864f",
  "resource\\image\\vf202\\down.png": "2a176c857ace4437068c182e7b175619",
  "resource\\image\\vf202\\empty.png": "e36fc80c084639da27bee183eeaadba0",
  "resource\\image\\vf202\\enter.png": "43b728abb252831b9309bd655a6ade86",
  "resource\\image\\vf202\\enter_b.png": "d15c73e1c6d60bc4e74f501c0eb00ff4",
  "resource\\image\\vf202\\ethernet.png": "7a6a8557200fe9ea9405fb5701797366",
  "resource\\image\\vf202\\ethernet_dark.png": "21febf0b45887830c68938fbc756a6b2",
  "resource\\image\\vf202\\eth_disable.png": "46def5850282186289fedcf3e1090ec1",
  "resource\\image\\vf202\\eth_enable.png": "c7e2883cdca3c31dfa5ce7b59a38dd95",
  "resource\\image\\vf202\\eye-fill.png": "f759a1d079b83215b7fdf8bde65ca6a9",
  "resource\\image\\vf202\\eye-off.png": "08232a8b9562ac218e5364bc1702635d",
  "resource\\image\\vf202\\eye_fill.png": "d40a644a0ecf10d29a5c3255e584729e",
  "resource\\image\\vf202\\eye_fill_show.png": "a9c69cb678a2face9eb5c6d74ea3e819",
  "resource\\image\\vf202\\face.png": "3ace44209c5a0972f0577fea245cc1f4",
  "resource\\image\\vf202\\faceAdd.png": "0d9521169bdf6134a77f0efe20a4f923",
  "resource\\image\\vf202\\faceEmpty.png": "0e7656faefc150c0a978dfac8e498c8d",
  "resource\\image\\vf202\\faceError.png": "5d8036a7cae3615be4dcb2087f63e626",
  "resource\\image\\vf202\\faceRec.png": "103012d8e17f980f91f37a00c246eae3",
  "resource\\image\\vf202\\faceRec2.png": "300f0aa222a85398f67c7e28273ef501",
  "resource\\image\\vf202\\factoryTest.png": "b3e8ae285f5f45675d3fa6f61446b01a",
  "resource\\image\\vf202\\failBg.png": "a1d3e65aa14f159f468ba8835639c131",
  "resource\\image\\vf202\\grey_btn.png": "1646b5420adf33ad1689af68c3062402",
  "resource\\image\\vf202\\help.png": "6728c869776d883015eba1fffcf90613",
  "resource\\image\\vf202\\idleImage.jpg": "e261f9d11ba192b9a318855198a82a72",
  "resource\\image\\vf202\\idleImage.png": "6642f66bb0278150beac1b7b9fd7cd73",
  "resource\\image\\vf202\\localUser.png": "46e06778952856e8805c39139128a3aa",
  "resource\\image\\vf202\\lock.png": "d845e9bb5e35713e514b40c79dd8df94",
  "resource\\image\\vf202\\menu_btn.png": "5bf26f61a5105bc20c9885679754ce1c",
  "resource\\image\\vf202\\mini_app.png": "1ca5b55edcdcc5a3fd63f6ca4c977648",
  "resource\\image\\vf202\\mini_background.png": "f7fa498fee57c3711d6824423665d6c3",
  "resource\\image\\vf202\\mini_config.png": "a0978038a399d5d12a08f8886c3925bc",
  "resource\\image\\vf202\\mini_password.png": "ab932304364b69d12884d019a178fe6a",
  "resource\\image\\vf202\\mqtt.png": "8ae57eb8159a7e262ff69e7f1a394d53",
  "resource\\image\\vf202\\mqtt_dark.png": "825ee7221785793dc3d70d685587bf8d",
  "resource\\image\\vf202\\network.png": "95f44b690704e449e8575950954e3d6f",
  "resource\\image\\vf202\\networkSetting.png": "f35618eddfc8409171159bdb0c0094f9",
  "resource\\image\\vf202\\network_dark.png": "6458359eb6eede7a43750a562c0c4ea2",
  "resource\\image\\vf202\\pwd_btn.png": "abee92156861b29fc866e9d4b73a5c42",
  "resource\\image\\vf202\\qrcode_small.png": "6d00a50369b5002f9c1e0b2f63419169",
  "resource\\image\\vf202\\recordQuery.png": "a51176f07c88fc740ca262c051fc31f6",
  "resource\\image\\vf202\\recQuery.png": "9667e8dff1cbd45c47fd179a390e8464",
  "resource\\image\\vf202\\rectangle.png": "0ad638ea5e599eba928210127349f72f",
  "resource\\image\\vf202\\register.png": "c3e3895f3eb275b924c682b12e1f4858",
  "resource\\image\\vf202\\right.png": "a0cf4963f9225509668bb4f4547fe1f2",
  "resource\\image\\vf202\\select_arrow.png": "f99d4833326933fc5979d1bef6ab13a3",
  "resource\\image\\vf202\\setting.png": "6d936d9331f9a16106f0956d63a43d9b",
  "resource\\image\\vf202\\setting32.png": "76b9637f7aece12d2ebb14684fe9a0c7",
  "resource\\image\\vf202\\space.png": "bdf92f0846c70e068872a62e64198a95",
  "resource\\image\\vf202\\successBg.png": "9b1cf2d0410a6c5b10802b0645d664bf",
  "resource\\image\\vf202\\success_fill.png": "7d95368d99dcd7bb86d26f9c488fc51c",
  "resource\\image\\vf202\\sysSettings.png": "cbd0b4362afbfb2f65df290e9fd5e0dd",
  "resource\\image\\vf202\\systemSetting.png": "ebffe5062a323f123cdb3ed61d0beae3",
  "resource\\image\\vf202\\sys_info.png": "9a22244032b537e10aefce4d751bf7a1",
  "resource\\image\\vf202\\tip_card.png": "3d2870619abcb67b3665c28bad20f68c",
  "resource\\image\\vf202\\trackFace.png": "ef2f257efcaeda212e148e7e74e88dae",
  "resource\\image\\vf202\\unlock.png": "221c28aa8d6ee43ac1fecb62ef59554d",
  "resource\\image\\vf202\\user.png": "46e06778952856e8805c39139128a3aa",
  "resource\\image\\vf202\\userGuide.png": "e1237d22454a3b32b47382eaea2ea3f6",
  "resource\\image\\vf202\\userMgmt.png": "8498f8a520f70a758c5f34f2b21d276d",
  "resource\\image\\vf202\\vip.png": "f41ac8a61926ee0cc7ce66a0ffae9d4f",
  "resource\\image\\vf202\\voiceBroadcast.png": "edf212a156202cbc40fb34f194a0d417",
  "resource\\image\\vf202\\wechat.png": "d02d045138c3ae125888acf01ef50642",
  "resource\\image\\vf202\\wifi.png": "cd0b8b70a30d25278896064e3ce20a79",
  "resource\\image\\vf202\\wifi_dark.png": "520131d4f1423fb6be242a7c193d952b",
  "resource\\image\\vf203\\4g.png": "e5b27ed5a596cb16c7ab695d82fe3014",
  "resource\\image\\vf203\\4g_dark.png": "414b3a9fcefd8ea6909158b51038d4d8",
  "resource\\image\\vf203\\accessCtrl.png": "6be30c8f648ec7153ae2c39a15884181",
  "resource\\image\\vf203\\add.png": "498480ce68e4d6047eb74d3aa5229f56",
  "resource\\image\\vf203\\advance.png": "d98aeb99a04163bce23b6c2638cd705a",
  "resource\\image\\vf203\\app.png": "b356136ee80e638afc0bd63b5fe058c8",
  "resource\\image\\vf203\\app_btn.png": "0630aeda9d5f294c1a8b4d5a4404e43d",
  "resource\\image\\vf203\\app_qrcode.png": "162225bafe2c27282b0f6330b05959f6",
  "resource\\image\\vf203\\arrow_right.png": "edc6876d6fa1e2d0be2e606c73e0f2ec",
  "resource\\image\\vf203\\back.png": "aa5869ff78051dbdc5f688f1805064da",
  "resource\\image\\vf203\\background.jpg": "75768189315c907532dda963d31b9ba0",
  "resource\\image\\vf203\\backspace.png": "26302e37dd8618e92c3a47d68039d0ec",
  "resource\\image\\vf203\\back_2.png": "b3f16ab01606d85c2c70124d50b3af1b",
  "resource\\image\\vf203\\basic.png": "84eedd84efdc5fdb54138dd29cf6fc41",
  "resource\\image\\vf203\\black_btn.png": "c66efd82b546bf991b1e231f89b71e9b",
  "resource\\image\\vf203\\card.png": "c05047d2ad6549db001d08790cb5d9ff",
  "resource\\image\\vf203\\close.png": "a5353c231df804fcc4577672ab3a4302",
  "resource\\image\\vf203\\close_small.png": "7d6cddddc38ce8d4950789169213add4",
  "resource\\image\\vf203\\cloudCert.png": "4481cfb9c2d1f44f0a0dd0489cb6fc2b",
  "resource\\image\\vf203\\commMgmt.png": "5cd157e1b8c82fdf9ddba1f6d5047b9b",
  "resource\\image\\vf203\\config.png": "feeed86aa53ad897dc851845f75ffc3e",
  "resource\\image\\vf203\\config_btn.png": "537ce58e033cdc5c42c85c431f7a16ff",
  "resource\\image\\vf203\\delete.png": "014bad6d9a94a133c58ef350e198101e",
  "resource\\image\\vf203\\delete_fill.png": "947fc08278354a1151d5599382c2c5f3",
  "resource\\image\\vf203\\developer.png": "07c619643647945294449fdfed486218",
  "resource\\image\\vf203\\deviceInfo.png": "3e40246e01c1f7eede4d76fcbba33825",
  "resource\\image\\vf203\\devInfo.png": "1a80aba6780a45f8775bdfdcff4df23a",
  "resource\\image\\vf203\\doorControl.png": "68993ef92bb8c6b2d0dab2c75cc7533d",
  "resource\\image\\vf203\\down.png": "c4d5c1883db4694ccedb7c1140d89da9",
  "resource\\image\\vf203\\empty.png": "91882cb65ac01e63f52e63a7e8a35cbb",
  "resource\\image\\vf203\\enter.png": "787e076256c8a47e07f2091a57585fb5",
  "resource\\image\\vf203\\enter_b.png": "02cb6c84fec128a639e3cf0828a6ee5f",
  "resource\\image\\vf203\\ethernet.png": "f3abb111d96a11a56f7ed77b21abab4c",
  "resource\\image\\vf203\\ethernet_dark.png": "10656303a6d22e204014f55ed0fb3efb",
  "resource\\image\\vf203\\eth_disable.png": "7017f5cc2c9b4f802f082f6c0f5bb581",
  "resource\\image\\vf203\\eth_enable.png": "84d1334e524ac669c3b79e8a69b41eb1",
  "resource\\image\\vf203\\eye-fill.png": "9ae71914bd47423be04d0a22eb4f3995",
  "resource\\image\\vf203\\eye-off.png": "295c3e8255ced50cf2667ecda524e11e",
  "resource\\image\\vf203\\eye_fill.png": "d0ac0d07f13e02e5fae7a12a0858ec49",
  "resource\\image\\vf203\\eye_fill_show.png": "265cf669797b94a138982c01c29d0bd9",
  "resource\\image\\vf203\\face.png": "4a3cab29dab637adc68625d143fe976d",
  "resource\\image\\vf203\\faceAdd.png": "573d86de2713d8ae420bc0a20ba859a4",
  "resource\\image\\vf203\\faceEmpty.png": "9ef3bd1d776183e203e69d5c91e4b129",
  "resource\\image\\vf203\\faceError.png": "972e08c5d3d83a85f14d5ccd3907569a",
  "resource\\image\\vf203\\faceRec.png": "f1bfcb61f4642c6c1bbc04856fb57905",
  "resource\\image\\vf203\\faceRec2.png": "cdadd31ad335195cbb67e05e698f3b31",
  "resource\\image\\vf203\\factoryTest.png": "4bdb36420046870efcabd4a040e31913",
  "resource\\image\\vf203\\failBg.png": "b448125e6a812a5dea92f873e5157407",
  "resource\\image\\vf203\\grey_btn.png": "b0ca6e44c0e01a17d0bdda5f7e057cc2",
  "resource\\image\\vf203\\help.png": "7d75da0510ca74870858a639882dc2ef",
  "resource\\image\\vf203\\idleImage.jpg": "75768189315c907532dda963d31b9ba0",
  "resource\\image\\vf203\\idleImage.png": "4292e1d6db684081b4a94fbb59bd8388",
  "resource\\image\\vf203\\localUser.png": "6429f43f7fee002d66d50a3d92a087da",
  "resource\\image\\vf203\\lock.png": "c1419aa2a9c9da4b7dbf3529a1af37f3",
  "resource\\image\\vf203\\menu_btn.png": "feeed86aa53ad897dc851845f75ffc3e",
  "resource\\image\\vf203\\mini_app.png": "33f0225311e7a4463e9d86c6eab3efdc",
  "resource\\image\\vf203\\mini_background.png": "620bf06dbfffe37f717b91fb3ed8ef40",
  "resource\\image\\vf203\\mini_config.png": "1b2be1c6686f627e86dd49abb0b32a14",
  "resource\\image\\vf203\\mini_password.png": "9a5013cd8f152d388a9b60e6ad2fdc12",
  "resource\\image\\vf203\\mqtt.png": "542ebc6bdbb66ea0f25cf29aeb9d264c",
  "resource\\image\\vf203\\mqtt_dark.png": "d4aab5adc128846c47a3b8bb015c757b",
  "resource\\image\\vf203\\network.png": "0a0119e3d5fce101b28575a4e44aaf7e",
  "resource\\image\\vf203\\networkSetting.png": "3e83d354e8293ed112fe7cc405b94187",
  "resource\\image\\vf203\\network_dark.png": "3c5f8ce5732e95ad613cdd41dc5adbc0",
  "resource\\image\\vf203\\pwd_btn.png": "c05557e93d0b23642cd506d82be8411a",
  "resource\\image\\vf203\\qrcode_small.png": "285bbe7e8f968c8bf4506a563dffcac2",
  "resource\\image\\vf203\\recordQuery.png": "d340255a0c2342382bff6f8c57f6376b",
  "resource\\image\\vf203\\recQuery.png": "1b8c58663a6e61f4f885e784ee4e87d4",
  "resource\\image\\vf203\\rectangle.png": "aad07a3c98dbc044765be57b7a95b2b9",
  "resource\\image\\vf203\\register.png": "7fa975d92007703532ba8011f2a0109f",
  "resource\\image\\vf203\\right.png": "a6f6bc770ad7a8220effcc96e750aaaa",
  "resource\\image\\vf203\\select_arrow.png": "9d82daa1092375abc413d581f36aaf2d",
  "resource\\image\\vf203\\setting.png": "92365fd93f2cfa63c7901ce3d8900a42",
  "resource\\image\\vf203\\setting32.png": "e531bf8a9ce7f6cf93a8ea9baf95377c",
  "resource\\image\\vf203\\space.png": "de9816e31308bd7ce187fe03ab634a37",
  "resource\\image\\vf203\\successBg.png": "dcdf9bc63a89fff478bdf6a2ded56d8d",
  "resource\\image\\vf203\\success_fill.png": "09166b0cd4da44b76b4f6cdc2c550103",
  "resource\\image\\vf203\\sysSettings.png": "2607627249cd1c60619918793b3dd04f",
  "resource\\image\\vf203\\systemSetting.png": "9aee20d073df321250a5bbc57d16d5f1",
  "resource\\image\\vf203\\sys_info.png": "20dc23c019d07cd2c3ce32a160b7b63f",
  "resource\\image\\vf203\\trackFace.png": "5b60294444dab3fec931a2bf80bd1ebc",
  "resource\\image\\vf203\\unlock.png": "7b97b659c36d3ba4f435f44792b90a80",
  "resource\\image\\vf203\\user.png": "6429f43f7fee002d66d50a3d92a087da",
  "resource\\image\\vf203\\userGuide.png": "567e69e478c9470881f45bafbeb5e8de",
  "resource\\image\\vf203\\userMgmt.png": "5dad96f344513f970c2b582d7feb537d",
  "resource\\image\\vf203\\vip.png": "0e816b4860ee87ed1169154e3f0fc524",
  "resource\\image\\vf203\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106",
  "resource\\image\\vf203\\wechat.png": "55eac1cc3b6398113293b7025e25c450",
  "resource\\image\\vf203\\wifi.png": "fd668b648ac984ed92fad8e40e151283",
  "resource\\image\\vf203\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740",
  "resource\\image\\view_f.png": "4fbdda957ef2966bc4938990725d0246",
  "resource\\image\\view_s.png": "93ddad11d282c5a8f56233682290b38c",
  "resource\\image\\vip.png": "0e816b4860ee87ed1169154e3f0fc524",
  "resource\\image\\voiceBroadcast.png": "e6f1a31ba7159962d18b77deef71c106",
  "resource\\image\\wifi.png": "fd668b648ac984ed92fad8e40e151283",
  "resource\\image\\wifi_dark.png": "37505f892ac6a43cb8dc5ea685de9740",
  "resource\\langPack.js": "956b0d902f723e4817319436ee7df117",
  "resource\\wav\\alarm.wav": "fe9d43cfb930f873973cc31fd6e8c132",
  "resource\\wav\\AR\\calibration_1s.wav": "a5ed7bdf10f5c0bec1f964cbaf8d7c59",
  "resource\\wav\\AR\\calibration_2s.wav": "1a533e06dd209b7b87d48947357a0ca0",
  "resource\\wav\\AR\\calibration_s.wav": "40ecad9f2eba8373c6d9060e0e04e2ed",
  "resource\\wav\\AR\\fingerF.wav": "1a8dabdb7bd80af25331217c5cb2a2f5",
  "resource\\wav\\AR\\fingerInput1.wav": "a66c8d4329462cf4d69f386f9c9f9739",
  "resource\\wav\\AR\\fingerInput2.wav": "2ee652221b5f1d1537b76347615d02b4",
  "resource\\wav\\AR\\fingerInput3.wav": "e68e282f25963ae83451c19fe4075958",
  "resource\\wav\\AR\\fingerR.wav": "564096e2700986fb5d284b550dc1849e",
  "resource\\wav\\AR\\fingerS.wav": "d39c8e14ec9518a8f29df1934b4a87b8",
  "resource\\wav\\AR\\fingerT.wav": "e741678c6bc7cb4a475ce16dafef4ffe",
  "resource\\wav\\AR\\read.wav": "3a053015f4a30814b33dc900d7f48f33",
  "resource\\wav\\AR\\recg_f.wav": "21dfe28f19a6be1c2a93f89f67d764f1",
  "resource\\wav\\AR\\recg_s.wav": "44759af10d2fba0fef6675c029bfb15e",
  "resource\\wav\\AR\\recognition.wav": "10b7198c357752c2f71093ece81def67",
  "resource\\wav\\AR\\recognition_s.wav": "4ef357ffe8d6ead5dde8e1a1b46f174d",
  "resource\\wav\\AR\\register.wav": "7a52494f55ef4ac161e24b35653bfa63",
  "resource\\wav\\AR\\stranger.wav": "f5e4baa2f88c81ab03783631f64798b7",
  "resource\\wav\\AR\\verify.wav": "7c8d730412feda278f5255ea2d504f41",
  "resource\\wav\\AR\\verify_f.wav": "8a75cb02a71a12c27db4aeeae26ea6fa",
  "resource\\wav\\AR\\verify_s.wav": "cb9c12b27047bcdcb7ac89c37a71ad9d",
  "resource\\wav\\CN\\calibration_1s.wav": "95be0f4e70b3e3ed788933a6adaac48c",
  "resource\\wav\\CN\\calibration_2s.wav": "dbd379708c7b4ee310ff8e5629c11e18",
  "resource\\wav\\CN\\calibration_s.wav": "41fd2b04f2320aec19139c70e321795f",
  "resource\\wav\\CN\\fingerF.wav": "932ad149b0290538c49f8208961e7bdb",
  "resource\\wav\\CN\\fingerInput1.wav": "4bcae26fdfef53f4f9a2c0223deb56ae",
  "resource\\wav\\CN\\fingerInput2.wav": "c0251f592f4c2570d1b760bde6c34b2a",
  "resource\\wav\\CN\\fingerInput3.wav": "88f54eca8add2ef122583fed9df4bab0",
  "resource\\wav\\CN\\fingerR.wav": "d597f3f0f968b868a896917354373922",
  "resource\\wav\\CN\\fingerS.wav": "4163dbe6607e35f1d12061c5edf4f9f4",
  "resource\\wav\\CN\\fingerT.wav": "428bea9dd8508f9321276eaeaa80a2ca",
  "resource\\wav\\CN\\read.wav": "d0e959a98c294882ac5ddd63762b32d9",
  "resource\\wav\\CN\\recg_f.wav": "9ec07057fa7deb60859ef1937f515df2",
  "resource\\wav\\CN\\recg_s.wav": "c0b3486c9eb370d259a5d1b188b9d481",
  "resource\\wav\\CN\\recognition.wav": "1adb5d50dd1f61d4e2e15ee859f1a838",
  "resource\\wav\\CN\\recognition_s.wav": "16ea2454fa95d57c5bad0bdb6fcd5386",
  "resource\\wav\\CN\\register.wav": "a811322b30389c915b3461f214958389",
  "resource\\wav\\CN\\stranger.wav": "3961f3192cbbd85c356037610726d9cb",
  "resource\\wav\\CN\\verify.wav": "36202c8c9f111fea718b536526098d4c",
  "resource\\wav\\CN\\verify_f.wav": "f0429d7fb4a04c4c797a8b7bcbe45577",
  "resource\\wav\\CN\\verify_s.wav": "cabb8f2b1cb7be25a18222e7b108f208",
  "resource\\wav\\DE\\calibration_1s.wav": "52e28bd12e4376a0de8f2f8dfeeb3f8a",
  "resource\\wav\\DE\\calibration_2s.wav": "121458873a5ea7999e6e859ca705a90e",
  "resource\\wav\\DE\\calibration_s.wav": "5fa56f1ac0df95c5fa21d3c97283dee2",
  "resource\\wav\\DE\\fingerF.wav": "c7fdcf59eaf7e2eb1f7e0983c604a7af",
  "resource\\wav\\DE\\fingerInput1.wav": "9519473165bf28c615f9b68bb4613909",
  "resource\\wav\\DE\\fingerInput2.wav": "b127650142eed76f25df1b2802803b47",
  "resource\\wav\\DE\\fingerInput3.wav": "318e963b18d9d69e7de60e87536d7544",
  "resource\\wav\\DE\\fingerR.wav": "238541066f5a5e269ec3bdfeae70ca18",
  "resource\\wav\\DE\\fingerS.wav": "a616ec675a53124438592cdcaaf6bb9d",
  "resource\\wav\\DE\\fingerT.wav": "9717d2422c6233b901fecba0f3b6f219",
  "resource\\wav\\DE\\read.wav": "411c8189b9317faf448d1ff74e5c8029",
  "resource\\wav\\DE\\recg_f.wav": "6055910c9079ddcd6ce9b94940729bcb",
  "resource\\wav\\DE\\recg_s.wav": "15b60814216d9786606dec148a683227",
  "resource\\wav\\DE\\recognition.wav": "0ef18cb9387fbd7ad2a2a17e4c39a4c6",
  "resource\\wav\\DE\\recognition_s.wav": "d604c7898d99292bc0880611ea790876",
  "resource\\wav\\DE\\register.wav": "dd310e24cfb6de7396f4c5ac1f97e9a0",
  "resource\\wav\\DE\\stranger.wav": "bee4570c4eab0604302469a0b458f6ee",
  "resource\\wav\\DE\\verify.wav": "345845ebd135af196e50c476eaeed831",
  "resource\\wav\\DE\\verify_f.wav": "6a565e48d9369dd20ca2a29d548a4ade",
  "resource\\wav\\DE\\verify_s.wav": "8ac44273c3c639b2f0a9abb14599664a",
  "resource\\wav\\EN\\calibration_1s.wav": "921ee406cb5069069ba3e03d9d9b948d",
  "resource\\wav\\EN\\calibration_2s.wav": "06d4447bacec83ae524d544e64b269a6",
  "resource\\wav\\EN\\calibration_s.wav": "c0dcf35be40779f8925e332b3b8efc85",
  "resource\\wav\\EN\\fingerF.wav": "510d14814a14e2cd331d0065423f5785",
  "resource\\wav\\EN\\fingerInput1.wav": "5c41614ad862b0b4b5d4719d2031521f",
  "resource\\wav\\EN\\fingerInput2.wav": "ea037a1332343280f87cfc66536a20ee",
  "resource\\wav\\EN\\fingerInput3.wav": "058ab61627bc6886346d0e8de043525a",
  "resource\\wav\\EN\\fingerR.wav": "11fe3281d28422191402630ea9d654f8",
  "resource\\wav\\EN\\fingerS.wav": "16398aadc67ff3977262c15f83c16612",
  "resource\\wav\\EN\\fingerT.wav": "72cd4670c8d86c1cab5d03706e98bd49",
  "resource\\wav\\EN\\read.wav": "8d29d22febaf903ff3177f6844def6bf",
  "resource\\wav\\EN\\recg_f.wav": "01ba9b3bb6216c28da18dd61e0f9488e",
  "resource\\wav\\EN\\recg_s.wav": "bb83312e643dfc896395f0d64dd71c68",
  "resource\\wav\\EN\\recognition.wav": "9e2d1c15eb5eb95f55864a2ddd9af4f6",
  "resource\\wav\\EN\\recognition_s.wav": "6edb8d0669ba7d82bf6e14c0490cfdd3",
  "resource\\wav\\EN\\register.wav": "4534ee5193306a8f75be48fdd9a42edc",
  "resource\\wav\\EN\\stranger.wav": "0e902f86cb3fe443eac4b756b4c1b1c5",
  "resource\\wav\\EN\\verify.wav": "e7f04238d896a0c7c2a3de8aad65beeb",
  "resource\\wav\\EN\\verify_f.wav": "abf0d48629397aba9a97109f9fedd087",
  "resource\\wav\\EN\\verify_s.wav": "935e88563857e8cade71bf558256842e",
  "resource\\wav\\ES\\calibration_1s.wav": "7bdabdb4dbee796cc2bb7aa9b071c859",
  "resource\\wav\\ES\\calibration_2s.wav": "c4262a41b7272816e49080d3616645ec",
  "resource\\wav\\ES\\calibration_s.wav": "0ed429d1bcedf413d77ba5b7770068cc",
  "resource\\wav\\ES\\fingerF.wav": "c4c938fea144e8def6798b1e487b7182",
  "resource\\wav\\ES\\fingerInput1.wav": "7c7f92d28442dd9d3d7161ab06da56a5",
  "resource\\wav\\ES\\fingerInput2.wav": "deef2ff30eddeefe95865db356e272ce",
  "resource\\wav\\ES\\fingerInput3.wav": "7c7f92d28442dd9d3d7161ab06da56a5",
  "resource\\wav\\ES\\fingerR.wav": "5d7bb888025f715db6683df774d3b6f9",
  "resource\\wav\\ES\\fingerS.wav": "92ed0560df2d4ea38919241501011ef8",
  "resource\\wav\\ES\\fingerT.wav": "d2f50e99b38d142dec28f6efc5989ed3",
  "resource\\wav\\ES\\read.wav": "6c0f153f8a95fc9053f25d8cff92ea2a",
  "resource\\wav\\ES\\recg_f.wav": "99536dea254832007f9b66461be00fc5",
  "resource\\wav\\ES\\recg_s.wav": "3b7fe279b7d99b8f15cb8b4e12d5e06f",
  "resource\\wav\\ES\\recognition.wav": "97e6ba9a65302ebed0561bed4ac7d0e1",
  "resource\\wav\\ES\\recognition_s.wav": "879a7e5721996f7c49deb0f479fcec79",
  "resource\\wav\\ES\\register.wav": "9e8e5c169b4417e0f070667cf6d6fd47",
  "resource\\wav\\ES\\stranger.wav": "d26faf4f830cc418cdb4bcd2344c9763",
  "resource\\wav\\ES\\verify.wav": "a5c501f02b699d7681537d33f913f007",
  "resource\\wav\\ES\\verify_f.wav": "deef2ff30eddeefe95865db356e272ce",
  "resource\\wav\\ES\\verify_s.wav": "c7d2f541fe970aec1515607ee1d71c05",
  "resource\\wav\\FR\\calibration_1s.wav": "90bc4bcc25cd05d00e01bc33bc25e044",
  "resource\\wav\\FR\\calibration_2s.wav": "822c2d270484e7330dcb3da58ab52479",
  "resource\\wav\\FR\\calibration_s.wav": "569513acc17ea14570c33144d02d88fa",
  "resource\\wav\\FR\\fingerF.wav": "2bbbf80c5343687aebfaa838bc38c381",
  "resource\\wav\\FR\\fingerInput1.wav": "18db34e42be799d8ef63ecd4ee880434",
  "resource\\wav\\FR\\fingerInput2.wav": "91ee1f94fdedf6797865f070346f6778",
  "resource\\wav\\FR\\fingerInput3.wav": "8e2e87765ae0389566d4319a22a4826d",
  "resource\\wav\\FR\\fingerR.wav": "1ecfd9d1c72a4eae2644306e0bd25aff",
  "resource\\wav\\FR\\fingerS.wav": "da70743ef141747fedde637c70ce93ec",
  "resource\\wav\\FR\\fingerT.wav": "4e01419987fa49b88a79a36aec7ec312",
  "resource\\wav\\FR\\read.wav": "77eb8c0ffe8b1e278bdb59f5f22c386f",
  "resource\\wav\\FR\\recg_f.wav": "a4e0c3cf167fa4db3e5eacf08ab0e287",
  "resource\\wav\\FR\\recg_s.wav": "56a17208c5af5f9cd82d0c4762c12c54",
  "resource\\wav\\FR\\recognition.wav": "d7961442cd6d0a233227be08df97014c",
  "resource\\wav\\FR\\recognition_s.wav": "6f41689362369dd66a5d91dae1df11a9",
  "resource\\wav\\FR\\register.wav": "64a3b9782abffd3264e0a42a59aed4c2",
  "resource\\wav\\FR\\stranger.wav": "c5bdaee5595fd3f2fb7b43b64854965c",
  "resource\\wav\\FR\\verify.wav": "98f91f55b0e363a4ff5147a38ec7a142",
  "resource\\wav\\FR\\verify_f.wav": "2dd839c1fce3797a94488fd04b0a6b6d",
  "resource\\wav\\FR\\verify_s.wav": "670eac29b52aa9648c04ec00a4bdc53a",
  "resource\\wav\\KO\\.DS_Store": "194577a7e20bdcc7afbb718f502c134c",
  "resource\\wav\\KO\\calibration_1s.wav": "7402d18dab54f254b7fc632fa39fd975",
  "resource\\wav\\KO\\calibration_2s.wav": "ea767fb11a3ea7c5e4979645ea1b290f",
  "resource\\wav\\KO\\calibration_s.wav": "376e3a44b29864d1ced354796e1780d2",
  "resource\\wav\\KO\\fingerF.wav": "d22570bfe2b6f7da61db3814347da015",
  "resource\\wav\\KO\\fingerInput1.wav": "a0f3beaaf7da75825ebf96e3e63ff6a2",
  "resource\\wav\\KO\\fingerInput2.wav": "0e1f0069f6bea232d0b808bf68220a5f",
  "resource\\wav\\KO\\fingerInput3.wav": "af87f04def1fbe6fa2202a1c476ac38a",
  "resource\\wav\\KO\\fingerR.wav": "a2270f58b171bc065bd26a43df22ab19",
  "resource\\wav\\KO\\fingerS.wav": "4351453d76fd352be3771a425d13bbb8",
  "resource\\wav\\KO\\fingerT.wav": "6ebeba178719d5e0f50d3b09f047f383",
  "resource\\wav\\KO\\read.wav": "b6bc10805b392d0310a79eea741e3b3f",
  "resource\\wav\\KO\\recg_f.wav": "681345dd730860770e22689191f1d96a",
  "resource\\wav\\KO\\recg_s.wav": "88b56cc7c059666edbdb0ce81b8c3c04",
  "resource\\wav\\KO\\recognition.wav": "9454b2d82ad2d3513dafb355edc025f2",
  "resource\\wav\\KO\\recognition_s.wav": "9398a4b31d5d2d1e3b10f04620a30dae",
  "resource\\wav\\KO\\register.wav": "58cb13509719da302a3d431a59a68f5c",
  "resource\\wav\\KO\\stranger.wav": "523d5eae87864b41350bf39829c53e76",
  "resource\\wav\\KO\\verify.wav": "68c67283487bed689fb7d8567d5485e3",
  "resource\\wav\\KO\\verify_f.wav": "e3de3c0fa0cfe2484e4b38c8269920cc",
  "resource\\wav\\KO\\verify_s.wav": "8f6c8a4ecebd44941260a08ad3a4dd72",
  "resource\\wav\\PT\\calibration_1s.wav": "da58062f0e45ebd7bbecb126b2d453ce",
  "resource\\wav\\PT\\calibration_2s.wav": "5a92af498230aa4ba882fee5857cc73f",
  "resource\\wav\\PT\\calibration_s.wav": "b926e31a78516b46d1dcf7a1f62c6cf8",
  "resource\\wav\\PT\\fingerF.wav": "9d6f7c11fd9393547cb1feb72b8f06a7",
  "resource\\wav\\PT\\fingerInput1.wav": "b2d2e38d58c4b86f4b2537647aabe446",
  "resource\\wav\\PT\\fingerInput2.wav": "75f1d97cd779f2cb890efda812254dd3",
  "resource\\wav\\PT\\fingerInput3.wav": "d446e2f562b509d806f1b8862d1d9b55",
  "resource\\wav\\PT\\fingerR.wav": "f1786c3dc3a0683aeef6d26062f12ed1",
  "resource\\wav\\PT\\fingerS.wav": "6c6ad480079a51836c06cbcad0306289",
  "resource\\wav\\PT\\fingerT.wav": "15b6fc875a46ef3a81facda5b225510a",
  "resource\\wav\\PT\\read.wav": "dd63196f7cb81caf949d1c46db597e9e",
  "resource\\wav\\PT\\recg_f.wav": "92746b018b29bcfd7cb2caf841d32025",
  "resource\\wav\\PT\\recg_s.wav": "0244bd357d573aabae6e3143e4093b52",
  "resource\\wav\\PT\\recognition.wav": "02887b41858dd3ad6872ef666cda6b21",
  "resource\\wav\\PT\\recognition_s.wav": "de2f118f324fb6754442233cc7bd9163",
  "resource\\wav\\PT\\register.wav": "a821a9a578db5bc0a21c9d508f05154a",
  "resource\\wav\\PT\\stranger.wav": "0d94a14857ddbbb9ec2f49da4308ce3e",
  "resource\\wav\\PT\\verify.wav": "5d30cc1dfb9f198e3e35b969728e3370",
  "resource\\wav\\PT\\verify_f.wav": "eb745523f398a46a6bb6e7bd61ae0fbb",
  "resource\\wav\\PT\\verify_s.wav": "cce663087a3a629b6e57f1e70f8d7965",
  "resource\\wav\\RU\\calibration_1s.wav": "345845ebd135af196e50c476eaeed831",
  "resource\\wav\\RU\\calibration_2s.wav": "70e991ab0ac7b41f3307beda62326154",
  "resource\\wav\\RU\\calibration_s.wav": "00b75e1fcffec26c49b5b7c7a24f4c43",
  "resource\\wav\\RU\\fingerF.wav": "0b73f3a06b522b76ec6ef7ee76395813",
  "resource\\wav\\RU\\fingerInput1.wav": "077b12f4ddabc15ecfad1e5d8802414b",
  "resource\\wav\\RU\\fingerInput2.wav": "1da2108ea08bbc05af7a785ef58fd664",
  "resource\\wav\\RU\\fingerInput3.wav": "7ba5db75cb9542f03eda5095d7a23572",
  "resource\\wav\\RU\\fingerR.wav": "9758966564082624bce1d39433ed3f7a",
  "resource\\wav\\RU\\fingerS.wav": "f1146d690c62e8a8b890fe88f443f082",
  "resource\\wav\\RU\\fingerT.wav": "1a61470775f82c3d11868d260fe89a24",
  "resource\\wav\\RU\\read.wav": "73f492713c7b86645be69f31d1a20ed3",
  "resource\\wav\\RU\\recg_f.wav": "1e16e083ba2b7ed7bd21939c7999346a",
  "resource\\wav\\RU\\recg_s.wav": "7f279071d927beb26abe377ac82a8287",
  "resource\\wav\\RU\\recognition.wav": "8ad03ac16ae29e541aa75a8c73fe89c3",
  "resource\\wav\\RU\\recognition_s.wav": "f7ea28dab9f7b655cb12e82611432619",
  "resource\\wav\\RU\\register.wav": "61ad2813fd80f3e96f919df598660260",
  "resource\\wav\\RU\\stranger.wav": "b2cc134c9efa67d19b614fa79a1f9d08",
  "resource\\wav\\RU\\verify.wav": "7065f2418c31d521d57ca1a257227036",
  "resource\\wav\\RU\\verify_f.wav": "1da2108ea08bbc05af7a785ef58fd664",
  "resource\\wav\\RU\\verify_s.wav": "5f327d4e695ffec7c3d372a35b7c2c6d",
  "resource\\wav\\success.wav": "1e9b06bd363e891ad7ed19c74edcd2ce",
  "resource\\wav\\tamper.wav": "5be9a5cebd6bb26b6b3020b461600fde",
  "resource\\web\\config.js": "3d7861b269daebe064e3173ad305ae23",
  "resource\\web\\css\\app.7043d6da.css": "999a87106e2755763dd81279b6025992",
  "resource\\web\\css\\chunk-vendors.6b92dc4c.css": "e1ec7b3d258707dfa59963f29e6f8e75",
  "resource\\web\\favicon.ico": "1ba2ae710d927f13d483fd5d1e548c9b",
  "resource\\web\\fonts\\element-icons.535877f5.woff": "535877f50039c0cb49a6196a5b7517cd",
  "resource\\web\\fonts\\element-icons.732389de.ttf": "732389ded34cb9c52dd88271f1345af9",
  "resource\\web\\img\\bg.a32161db.png": "a32161dbd9d76983f1abc8e6de118629",
  "resource\\web\\img\\iconfont.675b1cb4.svg": "675b1cb40e0ad004e651cbf410d8c9b9",
  "resource\\web\\index.css": "00f3e0e219f286a00a28b72e0f398238",
  "resource\\web\\index.html": "1edc8246781c3c3bc7f200446d94817c",
  "resource\\web\\js\\app.da6752e9.js": "fce7a868ce64badaf7742f7cfe6bd6b8",
  "resource\\web\\js\\app.da6752e9.js.map": "10ba9093ac4c8ad8f829906bf188230c",
  "resource\\web\\js\\chunk-vendors.303b1624.js": "3f495d9202748c1e070016b1af602295",
  "resource\\web\\js\\chunk-vendors.303b1624.js.map": "1b58852183ab5b6ba073c10171483108",
  "src\\common\\consts\\configConst.js": "54c90a4a5470745f5505b6b283ab8746",
  "src\\common\\utils\\codeUtils.js": "749f60e6b75b7dfa7be62b4ed9c873b5",
  "src\\common\\utils\\netUtils.js": "34da771eb84bbb2d0f7085a1af85d132",
  "src\\common\\utils\\stringUtils.js": "425d9cd0390ab8a60f1507544c2cb00a",
  "src\\common\\utils\\tokenUtil.js": "b7abd3698644aadb7d3e936fb6f7fc8b",
  "src\\common\\utils\\utils.js": "bbee074a060e962a570dddc4d586504d",
  "src\\config.json": "6619f6367ac0230030de3131160a2178",
  "src\\controller.js": "3ca7b098eaf218df5e911fea64113d11",
  "src\\driver.js": "94ef548d913eb6ba832e87e1748f2bc2",
  "src\\main.js": "e5958b02098ba5d92c159970c2e9bd63",
  "src\\screen.js": "b8a256f4f3ba51b4c1e49fcb69e06b28",
  "src\\service\\accessService.js": "304718a9a06ded28947373c3d9a21295",
  "src\\service\\api.js": "def5b52441ccc827913a73478cc7c32a",
  "src\\service\\codeService.js": "e3f53b983c37a91d85a3de95fab7745d",
  "src\\service\\configService.js": "d1c3c533c1d451c2eaf46758b4efeb19",
  "src\\service\\faceService.js": "cfc3cf7d510f2ba6d6fcedb1251e0795",
  "src\\service\\fingerService.js": "0fee47e46ded411c2da21eb508d8f9ba",
  "src\\service\\gpiokeyService.js": "7aeb81b1577df935f147f3817a0a144b",
  "src\\service\\grainService.js": "3ec28482d55059fd09d091145fad041c",
  "src\\service\\httpService.js": "567d6f52d5392e3d95a54264e631944e",
  "src\\service\\mqttService.js": "eafd4b82b1d5a7d02b32d046bf492ac9",
  "src\\service\\nfcService.js": "fff19d7f08d3a499455ed93a5376c0fd",
  "src\\service\\sqliteService.js": "9dd93a7afd36b50e6be015e950aaff83",
  "src\\service\\uartBleService.js": "f8816894598283c7114b4d8708bb65aa",
  "src\\service\\uartCodeService.js": "ed1952645c055885c78bc6c02699906f",
  "src\\service\\weComService.js": "14896c15403107f7225fce6db9b8a049",
  "src\\services.js": "426d898a09de0fcc61d6fc644052b51e",
  "src\\view\\appView.js": "6bab5f16cbafe492d277948b144529ba",
  "src\\view\\config\\configView.js": "9f89bd5efb5060c2dea799e684c8a460",
  "src\\view\\config\\identityVerificationView.js": "6f4eece1b8021b0beb7ff9ac4315efff",
  "src\\view\\config\\menu\\cloudCertView.js": "089fda3f32cc72c07ffc1f76fa98ac06",
  "src\\view\\config\\menu\\developer\\capcalView.js": "eb3a2b6b8f4546b71471ae06fbf32741",
  "src\\view\\config\\menu\\developerView.js": "a6ae2941432970908f887bd20807f1ff",
  "src\\view\\config\\menu\\deviceInfo\\dataCapacityInfoView.js": "81fbf258e0ba70c126f850658981469e",
  "src\\view\\config\\menu\\deviceInfo\\systemInfoView.js": "95a96c6d8586410be1fe085dfa61db9f",
  "src\\view\\config\\menu\\deviceInfoView.js": "b703a2f9053c1b089294b3dffdf6a449",
  "src\\view\\config\\menu\\doorControlView.js": "2b29eff26537ab92171a40110b8e8c0e",
  "src\\view\\config\\menu\\helpView.js": "b3cf2078efe3a274740276b550b68b63",
  "src\\view\\config\\menu\\localUser\\faceEnterView.js": "f6dc4e020a4eddba902820d4b2444ee3",
  "src\\view\\config\\menu\\localUser\\fingerApplyView.js": "b2b5a46109f7ac768ae6d18131a33fbe",
  "src\\view\\config\\menu\\localUser\\fingerEnterView.js": "46dd45fe0e8d06410a5f2bcbeb7be5ad",
  "src\\view\\config\\menu\\localUser\\localUserAddView.js": "8266626bf9cadde968e2b439ef9073b0",
  "src\\view\\config\\menu\\localUserView.js": "f7881e4a47fe06648d0934f286d59775",
  "src\\view\\config\\menu\\networkSettingView.js": "7cb7b7ef6c1d49f819f509de43e49a56",
  "src\\view\\config\\menu\\recordQuery\\recordQueryDetailView.js": "79e15d726de5146bab15a3dba533a82b",
  "src\\view\\config\\menu\\recordQueryView.js": "f640c2f2d560213c44633d7ea36c6960",
  "src\\view\\config\\menu\\systemSetting\\displaySettingView.js": "1a376eaccd07b12bd80773be83e080fc",
  "src\\view\\config\\menu\\systemSetting\\faceRecognitionSettingView.js": "8ac866907bd817d51cde8d757e33b852",
  "src\\view\\config\\menu\\systemSetting\\passLogSettingView.js": "b3fb57b54b5079075c331aceab74a052",
  "src\\view\\config\\menu\\systemSetting\\passwordManagementView.js": "720e32768be124d5591cc0914c9ba340",
  "src\\view\\config\\menu\\systemSetting\\passwordOpenDoorSettingView.js": "a56728c84d37129fbae06c3a23b01092",
  "src\\view\\config\\menu\\systemSetting\\swipeCardRecognitionSettingView.js": "d23ab8015ac4dc7f316fc7ca4b852f6f",
  "src\\view\\config\\menu\\systemSetting\\timeSettingView.js": "7c5744868ad7e40b3d9ce0708e3f7b85",
  "src\\view\\config\\menu\\systemSettingView.js": "91aa4b58c5da0ba01e7a56ee348fee11",
  "src\\view\\config\\menu\\voiceBroadcastView.js": "b985213b271e8e8019d3a5697f2a402c",
  "src\\view\\config\\newPwdView.js": "9313a7399dcab5eff76b26dad4dbab99",
  "src\\view\\emergencyPwdView.js": "db0fc9252e9e897fce33dbe3314963d0",
  "src\\view\\gasDetailView.js": "e7f705f9b89459726064e51d57ed9d7c",
  "src\\view\\i18n.js": "94f43798d35026189125bf2534d1bffd",
  "src\\view\\idleView.js": "a1a6f9fb0ec44c59330a7461298aec46",
  "src\\view\\mainView.js": "0c49e5905a87a5cfd33062df8531e421",
  "src\\view\\pinyin\\dict.js": "a7812c30b956099fd248271ad6fd5ac9",
  "src\\view\\pinyin\\pinyin.js": "84e7c2ac116f5c22cf07b563ba230c68",
  "src\\view\\pwdView.js": "e46813353af5b4cd9f9b776328aa1987",
  "src\\view\\topView.js": "de69270ae02a9893902b453f184eb070",
  "src\\view\\viewUtils.js": "3d99a33880bd45247740e528f3bc8610",
  "src\\view\\wechatBindView.js": "6d0239d71de3c1cf4c2e0817cd65ce3f",
  "src\\view\\wechatFaceView.js": "65f5edfbe0ef402c66bd62bd3eebec49",
  "src\\view\\wechatNetView.js": "84d8dd397ed6483a25ab99174e652362",
  "src\\worker\\mqttWorker.js": "2dda93d129f1edd9f8a52aceddb0079d",
  "src\\worker\\netWorker.js": "e38b00c21c77dc5b98425f12068f85ff",
  "src\\worker\\passRecordWorker.js": "ad27fa58b7de2b8155bb3517e601bef4",
  "src\\worker\\screenWorker.js": "57a6f54f05c57e186e44892c97e36647"
}
vf107/.temp/zipFolder/VF105_V12/dxAudio/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxBase64/2.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxChannel/1.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxCommon/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxCommonUtils/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxConfig/2.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxCryptoES/2.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxDisplay/1.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxDriver/1.1.8.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxEventBus/2.0.2.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxFacial/1.1.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxFingerMz/1.0.5.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxFingerZaz/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxGpio/1.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxGpioKey/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxHttpClient/2.0.3.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxHttpServer/1.0.3.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxLogger/2.0.3.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxMap/2.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxMqttClient/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxNetwork/1.0.3.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxNfcCard/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxNtp/2.0.2.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxOs/1.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxOta/2.0.2.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxPwm/2.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxQrRule/2.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxSqliteDB/1.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxStd/2.0.3.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxTimeZones/1.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxUart/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxVgBle/1.0.0.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxWatchdog/1.0.1.zip
Binary files differ
vf107/.temp/zipFolder/VF105_V12/dxWorkerPool/2.0.1.zip
Binary files differ
vf107/README_CN.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
# vf105_v12_access_new é—¨ç¦åº”用源码
此目录包含 `vf105_v12_access_new` é—¨ç¦åº”用的 JavaScript æºç ã€‚
**重要说明:**
本项目的 JavaScript æºç ä¸Ž `vf203_v12_access_new` é¡¹ç›®ï¼ˆè·¯å¾„:`../../vf203_v12/vf203_v12_access_new`)使用的是完全相同的一套源码。
两个项目唯一的差别在于底层的原生共享库(`.so`)文件。具体使用哪个版本的 `.so` æ–‡ä»¶ï¼Œæ˜¯é€šè¿‡ `app.dxproj` é¡¹ç›®æ–‡ä»¶æ¥åŒºåˆ†å’Œé…ç½®çš„。
---
当前项目已修改模组文件-dxmodules/dxEventBus.js,使事件总线支持多个事件处理函数:
1. ä¿®æ”¹ bus.on å‡½æ•° ï¼šå°†å•个事件处理函数改为存储为数组,支持多个处理函数
2. ä¿®æ”¹ bus.fire å‡½æ•° ï¼šæ‰§è¡Œæ‰€æœ‰æ³¨å†Œçš„事件处理函数,而不仅仅是最后一个
3. æ·»åŠ é”™è¯¯å¤„ç† ï¼šç¡®ä¿ä¸€ä¸ªäº‹ä»¶å¤„理函数出错时不会影响其他处理函数的执行
---
测试结果:
1. ç¬¬ä¸€ç”¨æˆ·æŒ‡çº¹éªŒè¯é€šè¿‡-用户1UI更新-等待第二用户;
2. ç¬¬äºŒç”¨æˆ·äººè„¸éªŒè¯é€šè¿‡-用户1UI更新-等待第二用户;
3. ç¬¬ä¸‰ç”¨æˆ·æŒ‡çº¹éªŒè¯é€šè¿‡-用户2UI更新-用户1UI更新为第一用户;
4. ä¸€æ®µæ—¶é—´åŽæç¤ºåŒäººè®¤è¯è¶…æ—¶
所以当前指纹认证和人脸认证是两个互不相干的认证流程,能否优化代码使得一次双人认证流程中支持人脸和指纹的组合认证(即指纹指纹、人脸指纹、指纹人脸、人脸人脸)
vf107/app.dxproj
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
{"name":"vf107_v12_access_","model":"VF105_V12","components":[{"component":"dxAudio","version":"1.0.1"},{"component":"dxBase64","version":"2.0.0"},{"component":"dxCommon","version":"1.0.1"},{"component":"dxConfig","version":"2.0.0"},{"component":"dxCommonUtils","version":"1.0.1"},{"component":"dxCryptoES","version":"2.0.0"},{"component":"dxChannel","version":"1.0.0"},{"component":"dxDisplay","version":"1.0.0"},{"component":"dxDriver","version":"1.1.8"},{"component":"dxEventBus","version":"2.0.2"},{"component":"dxFacial","version":"1.1.0"},{"component":"dxFingerMz","version":"1.0.5"},{"component":"dxFingerZaz","version":"1.0.1"},{"component":"dxGpio","version":"1.0.0"},{"component":"dxGpioKey","version":"1.0.1"},{"component":"dxHttpClient","version":"2.0.3"},{"component":"dxHttpServer","version":"1.0.3"},{"component":"dxLogger","version":"2.0.3"},{"component":"dxMap","version":"2.0.1"},{"component":"dxMqttClient","version":"1.0.1"},{"component":"dxNtp","version":"2.0.2"},{"component":"dxNetwork","version":"1.0.3"},{"component":"dxNfcCard","version":"1.0.1"},{"component":"dxOta","version":"2.0.2"},{"component":"dxOs","version":"1.0.0"},{"component":"dxPwm","version":"2.0.1"},{"component":"dxQrRule","version":"2.0.0"},{"component":"dxStd","version":"2.0.3"},{"component":"dxSqliteDB","version":"1.0.0"},{"component":"dxTimeZones","version":"1.0.0"},{"component":"dxUi","version":"2.0.0"},{"component":"dxUart","version":"1.0.1"},{"component":"dxVgBle","version":"1.0.0"},{"component":"dxWorkerPool","version":"2.0.1"},{"component":"dxWatchdog","version":"1.0.1"}],"ignore":{"folder":".temp,.git","file":"md5s.json,md5snew.json"},"folder":".temp,.git","file":"md5s.json,md5snew.json","version":"2.0.2"}
vf107/dxmodules/crypto-es/README.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,432 @@
# CryptoES
*A cryptography algorithms library compatible with ES6 and TypeScript*
- Inspired by and has the same API with [CryptoJS](https://code.google.com/archive/p/crypto-js/)
- With types for TypeScript usage
- Witten in latest ECMAScript Standard
- Support ES6 module import and partially import
## Usage
Then you can import CryptoES:
```
import CryptoES from '../dxmodules/crypto-es/index.js';
const rst = CryptoES.MD5("Message").toString();
```
Or partially import the function to reduce the package weight:
```
import { MD5 } from 'crypto-es/lib/md5.js';
const rst = MD5("Message").toString();
```
## TypeScript Usage
Every file in this library has its own .d.ts file now, so it is available to partially import single algorithm files in TypeScript projects.
## Guide
> Just the same as [CryptoJS](https://code.google.com/archive/p/crypto-js/)
---
- [Hashers](###Hashers)
- [HMAC](#HMAC)
- [Ciphers](#Ciphers)
- [Encoders](#Encoders)
- [ArrayBuffer and TypedArray](#ArrayBuffer-and-TypedArray)
---
### Hashers
#### The Hasher Algorithms
**MD5**
MD5 is a widely used hash function. It's been used in a variety of security applications and is also commonly used to check the integrity of files. Though, MD5 is not collision resistant, and it isn't suitable for applications like SSL certificates or digital signatures that rely on this property.
```
const hash = CryptoES.MD5("Message");
```
**SHA-1**
The SHA hash functions were designed by the National Security Agency (NSA). SHA-1 is the most established of the existing SHA hash functions, and it's used in a variety of security applications and protocols. Though, SHA-1's collision resistance has been weakening as new attacks are discovered or improved.
```
const hash = CryptoES.SHA1("Message");
```
**SHA-2**
SHA-256 is one of the four variants in the SHA-2 set. It isn't as widely used as SHA-1, though it appears to provide much better security.
```
const hash = CryptoES.SHA256("Message");
```
SHA-512 is largely identical to SHA-256 but operates on 64-bit words rather than 32.
```
const hash = CryptoES.SHA512("Message");
```
CryptoES also supports SHA-224 and SHA-384, which are largely identical but truncated versions of SHA-256 and SHA-512 respectively.
**SHA-3**
SHA-3 is the winner of a five-year competition to select a new cryptographic hash algorithm where 64 competing designs were evaluated.
**NOTE:** I made a mistake when I named this implementation SHA-3. It should be named Keccak[c=2d]. Each of the SHA-3 functions is based on an instance of the Keccak algorithm, which NIST selected as the winner of the SHA-3 competition, but those SHA-3 functions won't produce hashes identical to Keccak.
```
const hash = CryptoES.SHA3("Message");
```
SHA-3 can be configured to output hash lengths of one of 224, 256, 384, or 512 bits. The default is 512 bits.
```
const hash = CryptoES.SHA3("Message", { outputLength: 512 });
const hash = CryptoES.SHA3("Message", { outputLength: 384 });
const hash = CryptoES.SHA3("Message", { outputLength: 256 });
const hash = CryptoES.SHA3("Message", { outputLength: 224 });
```
**RIPEMD-160**
```
const hash = CryptoES.RIPEMD160("Message");
```
#### The Hasher Input
The hash algorithms accept either strings or instances of CryptoES.lib.WordArray. A WordArray object represents an array of 32-bit words. When you pass a string, it's automatically converted to a WordArray encoded as UTF-8.
#### The Hasher Output
The hash you get back isn't a string yet. It's a WordArray object. When you use a WordArray object in a string context, it's automatically converted to a hex string.
```
const hash = CryptoES.SHA256("Message");
alert(typeof hash); // object
alert(hash); // 2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91
```
You can convert a WordArray object to other formats by explicitly calling the toString method and passing an encoder.
```
const hash = CryptoES.SHA256("Message");
alert(hash.toString(CryptoES.enc.Base64)); // L3dmip37+NWEi57rSnFFypTG7ZI25Kdz9tyvpRMrL5E= alert(hash.toString(CryptoES.enc.Latin1)); // /wf��ûøÕ���ëJqEÊ�Æí�6ä§söܯ¥+/�
alert(hash.toString(CryptoES.enc.Hex)); // 2f77668a9dfbf8d5848b9eeb4a7145ca94c6ed9236e4a773f6dcafa5132b2f91
```
#### Progressive Hashing
```
const sha256 = CryptoES.algo.SHA256.create();
sha256.update("Message Part 1");
sha256.update("Message Part 2");
sha256.update("Message Part 3");
const hash = sha256.finalize();
```
### HMAC
Keyed-hash message authentication codes (HMAC) is a mechanism for message authentication using cryptographic hash functions.
HMAC can be used in combination with any iterated cryptographic hash function.
```
const hash = CryptoES.HmacMD5("Message", "Secret Passphrase");
const hash = CryptoES.HmacSHA1("Message", "Secret Passphrase");
const hash = CryptoES.HmacSHA256("Message", "Secret Passphrase");
const hash = CryptoES.HmacSHA512("Message", "Secret Passphrase");
```
#### Progressive HMAC Hashing
```
const hmac = CryptoES.algo.HMAC.create(CryptoES.algo.SHA256, "Secret Passphrase");
hmac.update("Message Part 1");
hmac.update("Message Part 2");
hmac.update("Message Part 3");
const hash = hmac.finalize();
```
### PBKDF2
PBKDF2 is a password-based key derivation function. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.
A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.
```
const salt = CryptoES.lib.WordArray.random(128/8);
const key128Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 128/32 });
const key256Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 256/32 });
const key512Bits = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 512/32 });
const key512Bits1000Iterations = CryptoES.PBKDF2("Secret Passphrase", salt, { keySize: 512/32, iterations: 1000 });
```
### Ciphers
#### The Cipher Algorithms
**AES**
The Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.
```
const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.AES.decrypt(encrypted, "Secret Passphrase");
```
CryptoES supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.
**DES, Triple DES**
DES is a previously dominant algorithm for encryption, and was published as an official Federal Information Processing Standard (FIPS). DES is now considered to be insecure due to the small key size.
```
const encrypted = CryptoES.DES.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.DES.decrypt(encrypted, "Secret Passphrase");
```
Triple DES applies DES three times to each block to increase the key size. The algorithm is believed to be secure in this form.
```
const encrypted = CryptoES.TripleDES.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.TripleDES.decrypt(encrypted, "Secret Passphrase");
```
**Rabbit**
Rabbit is a high-performance stream cipher and a finalist in the eSTREAM Portfolio. It is one of the four designs selected after a 3 1/2-year process where 22 designs were evaluated.
```
const encrypted = CryptoES.Rabbit.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.Rabbit.decrypt(encrypted, "Secret Passphrase");
```
**RC4, RC4Drop**
RC4 is a widely-used stream cipher. It's used in popular protocols such as SSL and WEP. Although remarkable for its simplicity and speed, the algorithm's history doesn't inspire confidence in its security.
```
const encrypted = CryptoES.RC4.encrypt("Message", "Secret Passphrase");
const decrypted = CryptoES.RC4.decrypt(encrypted, "Secret Passphrase");
```
It was discovered that the first few bytes of keystream are strongly non-random and leak information about the key. We can defend against this attack by discarding the initial portion of the keystream. This modified algorithm is traditionally called RC4-drop.
By default, 192 words (768 bytes) are dropped, but you can configure the algorithm to drop any number of words.
```
const encrypted = CryptoES.RC4Drop.encrypt("Message", "Secret Passphrase");
const encrypted = CryptoES.RC4Drop.encrypt("Message", "Secret Passphrase", { drop: 3072/4 });
const decrypted = CryptoES.RC4Drop.decrypt(encrypted, "Secret Passphrase", { drop: 3072/4 });
```
**Blowfish**
Blowfish is a symmetric-key block cipher, designed in 1993 by Bruce Schneier and included in many cipher suites and encryption products. Blowfish provides a good encryption rate in software, and no effective cryptanalysis of it has been found to date. However, the Advanced Encryption Standard (AES) now receives more attention, and Schneier recommends Twofish for modern applications.
Schneier designed Blowfish as a general-purpose algorithm, intended as an alternative to the aging DES and free of the problems and constraints associated with other algorithms. At the time Blowfish was released, many other designs were proprietary, encumbered by patents, or were commercial or government secrets. Schneier has stated that "Blowfish is unpatented, and will remain so in all countries. The algorithm is hereby placed in the public domain, and can be freely used by anyone."
Notable features of the design include key-dependent S-boxes and a highly complex key schedule.
```
const ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg);
const plaintext  = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg);
```
#### Custom Key and IV
```
const key = CryptoES.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
const iv = CryptoES.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
const encrypted = CryptoES.AES.encrypt("Message", key, { iv: iv });
```
#### Block Modes and Padding
```
const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase", { mode: CryptoES.mode.CFB, padding: CryptoES.pad.AnsiX923 });
```
CryptoES supports the following modes:
- CBC (the default)
- CFB
- CTR
- OFB
- ECB
And CryptoES supports the following padding schemes:
- Pkcs7 (the default)
- Iso97971
- AnsiX923
- Iso10126
- ZeroPadding
- NoPadding
#### The Cipher Input
For the plaintext message, the cipher algorithms accept either strings or instances of CryptoES.lib.WordArray.
For the key, when you pass a string, it's treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key. If you pass the actual key, you must also pass the actual IV.
For the ciphertext, the cipher algorithms accept either strings or instances of CryptoES.lib.CipherParams. A CipherParams object represents a collection of parameters such as the IV, a salt, and the raw ciphertext itself. When you pass a string, it's automatically converted to a CipherParams object according to a configurable format strategy.
#### The Cipher Output
The plaintext you get back after decryption is a WordArray object. See Hashers' Output for more detail.
The ciphertext you get back after encryption isn't a string yet. It's a CipherParams object. A CipherParams object gives you access to all the parameters used during encryption. When you use a CipherParams object in a string context, it's automatically converted to a string according to a format strategy. The default is an OpenSSL-compatible format.
```
const encrypted = CryptoES.AES.encrypt("Message", "Secret Passphrase"); alert(encrypted.key); // 74eb593087a982e2a6f5dded54ecd96d1fd0f3d44a58728cdcd40c55227522223
alert(encrypted.iv); // 7781157e2629b094f0e3dd48c4d786115
alert(encrypted.salt); // 7a25f9132ec6a8b34
alert(encrypted.ciphertext); // 73e54154a15d1beeb509d9e12f1e462a0
alert(encrypted); // U2FsdGVkX1+iX5Ey7GqLND5UFUoV0b7rUJ2eEvHkYqA=
```
You can define your own formats in order to be compatible with other crypto implementations. A format is an object with two methods—stringify and parse—that converts between CipherParams objects and ciphertext strings.
Here's how you might write a JSON formatter:
```
const JsonFormatter = {
  stringify: function (cipherParams) { // create json object with ciphertext
    const jsonObj = { ct: cipherParams.ciphertext.toString(CryptoES.enc.Base64) }; // optionally add iv and salt
    if (cipherParams.iv) {
      jsonObj.iv = cipherParams.iv.toString();
    }
    if (cipherParams.salt) {
      jsonObj.s = cipherParams.salt.toString();
    }
    // stringify json object
    return JSON.stringify(jsonObj);
  },
  parse: function (jsonStr) { // parse json string
    const jsonObj = JSON.parse(jsonStr); // extract ciphertext from json object, and create cipher params object
    const cipherParams = CryptoES.lib.CipherParams.create(
      { ciphertext: CryptoES.enc.Base64.parse(jsonObj.ct) },
    ); // optionally extract iv and salt
    if (jsonObj.iv) {
      cipherParams.iv = CryptoES.enc.Hex.parse(jsonObj.iv)
    }
    if (jsonObj.s) {
      cipherParams.salt = CryptoES.enc.Hex.parse(jsonObj.s)
    }
    return cipherParams;
  },
};
const encrypted = CryptoES.AES.encrypt(
  "Message",
  "Secret Passphrase",
  { format: JsonFormatter },
);
alert(encrypted); // {"ct":"tZ4MsEnfbcDOwqau68aOrQ==","iv":"8a8c8fd8fe33743d3638737ea4a00698","s":"ba06373c8f57179c"}
const decrypted = CryptoES.AES.decrypt(
  encrypted,
  "Secret Passphrase",
  { format: JsonFormatter },
);
alert(decrypted.toString(CryptoES.enc.Utf8)); // Message
```
#### Progressive Ciphering
```
const key = CryptoES.enc.Hex.parse('000102030405060708090a0b0c0d0e0f');
const iv = CryptoES.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');
const aesEncryptor = CryptoES.algo.AES.createEncryptor(key, { iv: iv });
const ciphertextPart1 = aesEncryptor.process("Message Part 1");
const ciphertextPart2 = aesEncryptor.process("Message Part 2");
const ciphertextPart3 = aesEncryptor.process("Message Part 3");
const ciphertextPart4 = aesEncryptor.finalize();
const aesDecryptor = CryptoES.algo.AES.createDecryptor(key, { iv: iv });
const plaintextPart1 = aesDecryptor.process(ciphertextPart1);
const plaintextPart2 = aesDecryptor.process(ciphertextPart2);
const plaintextPart3 = aesDecryptor.process(ciphertextPart3);
const plaintextPart4 = aesDecryptor.process(ciphertextPart4);
const plaintextPart5 = aesDecryptor.finalize();
```
#### Interoperability
With OpenSSL
Encrypt with OpenSSL:
```
openssl enc -aes-256-cbc -in infile -out outfile -pass pass:"Secret Passphrase" -e -base64
```
Decrypt with CryptoES:
```
const decrypted = CryptoES.AES.decrypt(openSSLEncrypted, "Secret Passphrase");
```
### Encoders
CryptoES can convert from encoding formats such as Base64, Latin1 or Hex to WordArray objects and vica versa.
```
const words = CryptoES.enc.Base64.parse('SGVsbG8sIFdvcmxkIQ==');
const base64 = CryptoES.enc.Base64.stringify(words);
const words = CryptoES.enc.Base64url.parse('SGVsbG8sIFdvcmxkIQ==');
const base64url = CryptoES.enc.Base64.stringify(words);
const words = CryptoES.enc.Latin1.parse('Hello, World!');
const latin1 = CryptoES.enc.Latin1.stringify(words);
const words = CryptoES.enc.Hex.parse('48656c6c6f2c20576f726c6421');
const hex = CryptoES.enc.Hex.stringify(words);
const words = CryptoES.enc.Utf8.parse('𤭢');
const utf8 = CryptoES.enc.Utf8.stringify(words);
const words = CryptoES.enc.Utf16.parse('Hello, World!');
const utf16 = CryptoES.enc.Utf16.stringify(words);
const words = CryptoES.enc.Utf16LE.parse('Hello, World!');
const utf16 = CryptoES.enc.Utf16LE.stringify(words);
```
### ArrayBuffer and TypedArray
WordArray creator could recive an ArrayBuffer or TypedArray so that CryptoES algorisms could apply to them:
```
const words = CryptoES.lib.WordArray.create(new ArrayBuffer(8));
const rst = CryptoES.AES.encrypt(words, 'Secret Passphrase')
```
**NOTE**: ArrayBuffer could not directly passed to algorisms, you should change them to WordArray first.
With this, encrypting files would be easier:
```
const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function () {
  const arrayBuffer = reader.result;
  const words = CryptoES.lib.WordArray.create(arrayBuffer);
  const rst = CryptoES.AES.encrypt(words, 'Secret Passphrase')
  ...
};
```
## Change Log
[Change Log](https://github.com/entronad/crypto-es/blob/master/CHANGELOG.md)
## Blogs
[Refactoring CryptoJS in Modern ECMAScript](https://medium.com/front-end-weekly/refactoring-cryptojs-in-modern-ecmascript-1d4e1837c272)
vf107/dxmodules/crypto-es/aes.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,278 @@
import {
  BlockCipher,
} from './cipher-core.js';
// Lookup tables
const _SBOX = [];
const INV_SBOX = [];
const _SUB_MIX_0 = [];
const _SUB_MIX_1 = [];
const _SUB_MIX_2 = [];
const _SUB_MIX_3 = [];
const INV_SUB_MIX_0 = [];
const INV_SUB_MIX_1 = [];
const INV_SUB_MIX_2 = [];
const INV_SUB_MIX_3 = [];
// Compute lookup tables
// Compute double table
const d = [];
for (let i = 0; i < 256; i += 1) {
  if (i < 128) {
    d[i] = i << 1;
  } else {
    d[i] = (i << 1) ^ 0x11b;
  }
}
// Walk GF(2^8)
let x = 0;
let xi = 0;
for (let i = 0; i < 256; i += 1) {
  // Compute sbox
  let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
  sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
  _SBOX[x] = sx;
  INV_SBOX[sx] = x;
  // Compute multiplication
  const x2 = d[x];
  const x4 = d[x2];
  const x8 = d[x4];
  // Compute sub bytes, mix columns tables
  let t = (d[sx] * 0x101) ^ (sx * 0x1010100);
  _SUB_MIX_0[x] = (t << 24) | (t >>> 8);
  _SUB_MIX_1[x] = (t << 16) | (t >>> 16);
  _SUB_MIX_2[x] = (t << 8) | (t >>> 24);
  _SUB_MIX_3[x] = t;
  // Compute inv sub bytes, inv mix columns tables
  t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
  INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
  INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
  INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);
  INV_SUB_MIX_3[sx] = t;
  // Compute next counter
  if (!x) {
    xi = 1;
    x = xi;
  } else {
    x = x2 ^ d[d[d[x8 ^ x2]]];
    xi ^= d[d[xi]];
  }
}
// Precomputed Rcon lookup
const RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
/**
 * AES block cipher algorithm.
 */
export class AESAlgo extends BlockCipher {
  _doReset() {
    let t;
    // Skip reset of nRounds has been set before and key did not change
    if (this._nRounds && this._keyPriorReset === this._key) {
      return;
    }
    // Shortcuts
    this._keyPriorReset = this._key;
    const key = this._keyPriorReset;
    const keyWords = key.words;
    const keySize = key.sigBytes / 4;
    // Compute number of rounds
    this._nRounds = keySize + 6;
    const nRounds = this._nRounds;
    // Compute number of key schedule rows
    const ksRows = (nRounds + 1) * 4;
    // Compute key schedule
    this._keySchedule = [];
    const keySchedule = this._keySchedule;
    for (let ksRow = 0; ksRow < ksRows; ksRow += 1) {
      if (ksRow < keySize) {
        keySchedule[ksRow] = keyWords[ksRow];
      } else {
        t = keySchedule[ksRow - 1];
        if (!(ksRow % keySize)) {
          // Rot word
          t = (t << 8) | (t >>> 24);
          // Sub word
          t = (_SBOX[t >>> 24] << 24)
            | (_SBOX[(t >>> 16) & 0xff] << 16)
            | (_SBOX[(t >>> 8) & 0xff] << 8)
            | _SBOX[t & 0xff];
          // Mix Rcon
          t ^= RCON[(ksRow / keySize) | 0] << 24;
        } else if (keySize > 6 && ksRow % keySize === 4) {
          // Sub word
          t = (_SBOX[t >>> 24] << 24)
            | (_SBOX[(t >>> 16) & 0xff] << 16)
            | (_SBOX[(t >>> 8) & 0xff] << 8)
            | _SBOX[t & 0xff];
        }
        keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
      }
    }
    // Compute inv key schedule
    this._invKeySchedule = [];
    const invKeySchedule = this._invKeySchedule;
    for (let invKsRow = 0; invKsRow < ksRows; invKsRow += 1) {
      const ksRow = ksRows - invKsRow;
      if (invKsRow % 4) {
        t = keySchedule[ksRow];
      } else {
        t = keySchedule[ksRow - 4];
      }
      if (invKsRow < 4 || ksRow <= 4) {
        invKeySchedule[invKsRow] = t;
      } else {
        invKeySchedule[invKsRow] = INV_SUB_MIX_0[_SBOX[t >>> 24]]
          ^ INV_SUB_MIX_1[_SBOX[(t >>> 16) & 0xff]]
          ^ INV_SUB_MIX_2[_SBOX[(t >>> 8) & 0xff]]
          ^ INV_SUB_MIX_3[_SBOX[t & 0xff]];
      }
    }
  }
  encryptBlock(M, offset) {
    this._doCryptBlock(
      M, offset, this._keySchedule, _SUB_MIX_0, _SUB_MIX_1, _SUB_MIX_2, _SUB_MIX_3, _SBOX,
    );
  }
  decryptBlock(M, offset) {
    const _M = M;
    // Swap 2nd and 4th rows
    let t = _M[offset + 1];
    _M[offset + 1] = _M[offset + 3];
    _M[offset + 3] = t;
    this._doCryptBlock(
      _M,
      offset,
      this._invKeySchedule,
      INV_SUB_MIX_0,
      INV_SUB_MIX_1,
      INV_SUB_MIX_2,
      INV_SUB_MIX_3,
      INV_SBOX,
    );
    // Inv swap 2nd and 4th rows
    t = _M[offset + 1];
    _M[offset + 1] = _M[offset + 3];
    _M[offset + 3] = t;
  }
  _doCryptBlock(M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
    const _M = M;
    // Shortcut
    const nRounds = this._nRounds;
    // Get input, add round key
    let s0 = _M[offset] ^ keySchedule[0];
    let s1 = _M[offset + 1] ^ keySchedule[1];
    let s2 = _M[offset + 2] ^ keySchedule[2];
    let s3 = _M[offset + 3] ^ keySchedule[3];
    // Key schedule row counter
    let ksRow = 4;
    // Rounds
    for (let round = 1; round < nRounds; round += 1) {
      // Shift rows, sub bytes, mix columns, add round key
      const t0 = SUB_MIX_0[s0 >>> 24]
        ^ SUB_MIX_1[(s1 >>> 16) & 0xff]
        ^ SUB_MIX_2[(s2 >>> 8) & 0xff]
        ^ SUB_MIX_3[s3 & 0xff]
        ^ keySchedule[ksRow];
      ksRow += 1;
      const t1 = SUB_MIX_0[s1 >>> 24]
        ^ SUB_MIX_1[(s2 >>> 16) & 0xff]
        ^ SUB_MIX_2[(s3 >>> 8) & 0xff]
        ^ SUB_MIX_3[s0 & 0xff]
        ^ keySchedule[ksRow];
      ksRow += 1;
      const t2 = SUB_MIX_0[s2 >>> 24]
        ^ SUB_MIX_1[(s3 >>> 16) & 0xff]
        ^ SUB_MIX_2[(s0 >>> 8) & 0xff]
        ^ SUB_MIX_3[s1 & 0xff]
        ^ keySchedule[ksRow];
      ksRow += 1;
      const t3 = SUB_MIX_0[s3 >>> 24]
        ^ SUB_MIX_1[(s0 >>> 16) & 0xff]
        ^ SUB_MIX_2[(s1 >>> 8) & 0xff]
        ^ SUB_MIX_3[s2 & 0xff]
        ^ keySchedule[ksRow];
      ksRow += 1;
      // Update state
      s0 = t0;
      s1 = t1;
      s2 = t2;
      s3 = t3;
    }
    // Shift rows, sub bytes, add round key
    const t0 = (
      (SBOX[s0 >>> 24] << 24)
        | (SBOX[(s1 >>> 16) & 0xff] << 16)
        | (SBOX[(s2 >>> 8) & 0xff] << 8)
        | SBOX[s3 & 0xff]
    ) ^ keySchedule[ksRow];
    ksRow += 1;
    const t1 = (
      (SBOX[s1 >>> 24] << 24)
        | (SBOX[(s2 >>> 16) & 0xff] << 16)
        | (SBOX[(s3 >>> 8) & 0xff] << 8)
        | SBOX[s0 & 0xff]
    ) ^ keySchedule[ksRow];
    ksRow += 1;
    const t2 = (
      (SBOX[s2 >>> 24] << 24)
        | (SBOX[(s3 >>> 16) & 0xff] << 16)
        | (SBOX[(s0 >>> 8) & 0xff] << 8)
        | SBOX[s1 & 0xff]
    ) ^ keySchedule[ksRow];
    ksRow += 1;
    const t3 = (
      (SBOX[s3 >>> 24] << 24)
        | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]
    ) ^ keySchedule[ksRow];
    ksRow += 1;
    // Set output
    _M[offset] = t0;
    _M[offset + 1] = t1;
    _M[offset + 2] = t2;
    _M[offset + 3] = t3;
  }
}
AESAlgo.keySize = 256 / 32;
/**
 * Shortcut functions to the cipher's object interface.
 *
 * @example
 *
 *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
 *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
 */
export const AES = BlockCipher._createHelper(AESAlgo);
vf107/dxmodules/crypto-es/blowfish.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,446 @@
import {
  WordArray,
} from './core.js';
import {
  BlockCipher,
} from './cipher-core.js';
const N = 16;
//Origin pbox and sbox, derived from PI
const ORIG_P = [
  0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
  0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
  0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
  0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
  0x9216D5D9, 0x8979FB1B,
];
const ORIG_S = [
  [0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
  0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
  0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
  0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
  0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
  0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
  0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
  0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
  0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
  0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
  0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
  0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
  0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
  0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
  0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
  0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
  0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
  0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
  0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
  0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
  0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
  0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
  0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
  0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
  0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
  0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
  0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
  0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
  0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
  0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
  0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
  0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
  0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
  0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
  0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
  0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
  0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
  0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
  0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
  0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
  0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
  0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
  0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
  0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
  0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
  0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
  0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
  0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
  0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
  0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
  0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
  0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
  0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
  0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
  0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
  0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
  0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
  0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
  0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
  0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
  0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
  0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
  0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
  0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A,],
  [0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
  0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
  0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
  0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
  0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
  0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
  0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
  0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
  0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
  0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
  0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
  0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
  0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
  0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
  0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
  0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
  0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
  0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
  0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
  0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
  0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
  0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
  0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
  0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
  0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
  0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
  0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
  0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
  0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
  0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
  0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
  0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
  0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
  0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
  0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
  0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
  0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
  0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
  0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
  0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
  0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
  0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
  0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
  0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
  0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
  0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
  0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
  0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
  0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
  0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
  0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
  0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
  0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
  0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
  0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
  0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
  0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
  0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
  0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
  0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
  0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
  0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
  0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
  0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7,],
  [0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
  0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
  0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
  0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
  0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
  0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
  0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
  0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
  0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
  0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
  0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
  0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
  0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
  0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
  0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
  0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
  0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
  0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
  0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
  0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
  0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
  0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
  0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
  0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
  0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
  0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
  0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
  0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
  0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
  0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
  0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
  0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
  0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
  0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
  0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
  0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
  0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
  0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
  0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
  0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
  0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
  0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
  0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
  0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
  0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
  0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
  0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
  0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
  0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
  0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
  0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
  0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
  0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
  0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
  0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
  0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
  0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
  0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
  0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
  0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
  0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
  0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
  0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
  0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0,],
  [0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
  0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
  0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
  0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
  0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
  0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
  0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
  0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
  0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
  0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
  0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
  0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
  0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
  0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
  0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
  0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
  0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
  0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
  0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
  0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
  0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
  0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
  0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
  0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
  0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
  0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
  0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
  0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
  0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
  0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
  0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
  0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
  0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
  0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
  0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
  0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
  0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
  0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
  0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
  0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
  0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
  0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
  0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
  0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
  0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
  0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
  0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
  0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
  0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
  0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
  0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
  0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
  0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
  0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
  0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
  0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
  0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
  0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
  0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
  0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
  0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
  0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
  0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
  0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6,],
];
const blowfishCtx = {
  pbox: [],
  sbox: [],
};
function f(ctx, x) {
  const a = (x >> 24) & 0xFF;
  const b = (x >> 16) & 0xFF;
  const c = (x >> 8) & 0xFF;
  const d = x & 0xFF;
  let y = ctx.sbox[0][a] + ctx.sbox[1][b];
  y = y ^ ctx.sbox[2][c];
  y = y + ctx.sbox[3][d];
  return y;
}
function blowfishEncrypt(ctx, left, right) {
  let Xl = left;
  let Xr = right;
  let temp;
  for(let i = 0; i < N; ++i){
      Xl = Xl ^ ctx.pbox[i];
      Xr = f(ctx, Xl) ^ Xr;
      temp = Xl;
      Xl = Xr;
      Xr = temp;
  }
  temp = Xl;
  Xl = Xr;
  Xr = temp;
  Xr = Xr ^ ctx.pbox[N];
  Xl = Xl ^ ctx.pbox[N + 1];
  return {left: Xl, right: Xr};
}
function blowfishDecrypt(ctx, left, right) {
  let Xl = left;
  let Xr = right;
  let temp;
  for(let i = N + 1; i > 1; --i){
      Xl = Xl ^ ctx.pbox[i];
      Xr = f(ctx, Xl) ^ Xr;
      temp = Xl;
      Xl = Xr;
      Xr = temp;
  }
  temp = Xl;
  Xl = Xr;
  Xr = temp;
  Xr = Xr ^ ctx.pbox[1];
  Xl = Xl ^ ctx.pbox[0];
  return {left: Xl, right: Xr};
}
/**
* Initialization ctx's pbox and sbox.
*
* @param {Object} ctx The object has pbox and sbox.
* @param {Array} key An array of 32-bit words.
* @param {int} keysize The length of the key.
*
* @example
*
*     blowfishInit(BLOWFISH_CTX, key, 128/32);
*/
function blowfishInit(ctx, key, keysize) {
  for (let Row = 0; Row < 4; Row++) {
    ctx.sbox[Row] = [];
    for (let Col = 0; Col < 256; Col++) {
      ctx.sbox[Row][Col] = ORIG_S[Row][Col];
    }
  }
  let keyIndex = 0;
  for (let index = 0; index < N + 2; index++) {
    ctx.pbox[index] = ORIG_P[index] ^ key[keyIndex];
    keyIndex++;
    if (keyIndex >= keysize) {
      keyIndex = 0;
    }
  }
  let data1 = 0;
  let data2 = 0;
  let res = 0;
  for (let i = 0; i < N + 2; i += 2) {
    res = blowfishEncrypt(ctx, data1, data2);
    data1 = res.left;
    data2 = res.right;
    ctx.pbox[i] = data1;
    ctx.pbox[i + 1] = data2;
  }
  for (let i = 0; i < 4; i++) {
    for (let j = 0; j < 256; j += 2) {
      res = blowfishEncrypt(ctx, data1, data2);
      data1 = res.left;
      data2 = res.right;
      ctx.sbox[i][j] = data1;
      ctx.sbox[i][j + 1] = data2;
    }
  }
  return true;
}
/**
 * Blowfish block cipher algorithm.
 */
export class BlowfishAlgo extends BlockCipher {
  constructor(xformMode, key, cfg) {
    super(xformMode, key, cfg);
    // blickSize is an instance field and should set in constructor.
    this.blockSize = 64 / 32;
  }
  _doReset() {
    // Skip reset of nRounds has been set before and key did not change
    if (this._keyPriorReset === this._key) {
      return;
    }
    // Shortcuts
    const key = this._keyPriorReset = this._key;
    const keyWords = key.words;
    const keySize = key.sigBytes / 4;
    //Initialization pbox and sbox
    blowfishInit(blowfishCtx, keyWords, keySize);
  }
  encryptBlock(M, offset) {
    const res = blowfishEncrypt(blowfishCtx, M[offset], M[offset + 1]);
    M[offset] = res.left;
    M[offset + 1] = res.right;
  }
  decryptBlock(M, offset) {
    const res = blowfishDecrypt(blowfishCtx, M[offset], M[offset + 1]);
    M[offset] = res.left;
    M[offset + 1] = res.right;
  }
}
BlowfishAlgo.keySize = 128 / 32;
BlowfishAlgo.ivSize = 64 / 32;
// blickSize is an instance field and should set in constructor.
/**
 * Shortcut functions to the cipher's object interface.
 *
 * @example
 *
 *     var ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg);
 *     var plaintext  = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg);
 */
export const Blowfish = BlockCipher._createHelper(BlowfishAlgo);
vf107/dxmodules/crypto-es/cipher-core.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,883 @@
/* eslint-disable no-use-before-define */
import {
  Base,
  WordArray,
  BufferedBlockAlgorithm,
} from './core.js';
import { Base64 } from './enc-base64.js';
import { EvpKDFAlgo } from './evpkdf.js';
/**
 * Abstract base cipher template.
 *
 * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
 * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
 * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
 * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
 */
export class Cipher extends BufferedBlockAlgorithm {
  /**
   * Initializes a newly created cipher.
   *
   * @param {number} xformMode Either the encryption or decryption transormation mode constant.
   * @param {WordArray} key The key.
   * @param {Object} cfg (Optional) The configuration options to use for this operation.
   *
   * @example
   *
   *     const cipher = CryptoJS.algo.AES.create(
   *       CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }
   *     );
   */
  constructor(xformMode, key, cfg) {
    super();
    /**
     * Configuration options.
     *
     * @property {WordArray} iv The IV to use for this operation.
     */
    this.cfg = Object.assign(new Base(), cfg);
    // Store transform mode and key
    this._xformMode = xformMode;
    this._key = key;
    // Set initial values
    this.reset();
  }
  /**
   * Creates this cipher in encryption mode.
   *
   * @param {WordArray} key The key.
   * @param {Object} cfg (Optional) The configuration options to use for this operation.
   *
   * @return {Cipher} A cipher instance.
   *
   * @static
   *
   * @example
   *
   *     const cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
   */
  static createEncryptor(key, cfg) {
    return this.create(this._ENC_XFORM_MODE, key, cfg);
  }
  /**
   * Creates this cipher in decryption mode.
   *
   * @param {WordArray} key The key.
   * @param {Object} cfg (Optional) The configuration options to use for this operation.
   *
   * @return {Cipher} A cipher instance.
   *
   * @static
   *
   * @example
   *
   *     const cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
   */
  static createDecryptor(key, cfg) {
    return this.create(this._DEC_XFORM_MODE, key, cfg);
  }
  /**
   * Creates shortcut functions to a cipher's object interface.
   *
   * @param {Cipher} cipher The cipher to create a helper for.
   *
   * @return {Object} An object with encrypt and decrypt shortcut functions.
   *
   * @static
   *
   * @example
   *
   *     const AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
   */
  static _createHelper(SubCipher) {
    const selectCipherStrategy = (key) => {
      if (typeof key === 'string') {
        return PasswordBasedCipher;
      }
      return SerializableCipher;
    };
    return {
      encrypt(message, key, cfg) {
        return selectCipherStrategy(key).encrypt(SubCipher, message, key, cfg);
      },
      decrypt(ciphertext, key, cfg) {
        return selectCipherStrategy(key).decrypt(SubCipher, ciphertext, key, cfg);
      },
    };
  }
  /**
   * Resets this cipher to its initial state.
   *
   * @example
   *
   *     cipher.reset();
   */
  reset() {
    // Reset data buffer
    super.reset.call(this);
    // Perform concrete-cipher logic
    this._doReset();
  }
  /**
   * Adds data to be encrypted or decrypted.
   *
   * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
   *
   * @return {WordArray} The data after processing.
   *
   * @example
   *
   *     const encrypted = cipher.process('data');
   *     const encrypted = cipher.process(wordArray);
   */
  process(dataUpdate) {
    // Append
    this._append(dataUpdate);
    // Process available blocks
    return this._process();
  }
  /**
   * Finalizes the encryption or decryption process.
   * Note that the finalize operation is effectively a destructive, read-once operation.
   *
   * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
   *
   * @return {WordArray} The data after final processing.
   *
   * @example
   *
   *     const encrypted = cipher.finalize();
   *     const encrypted = cipher.finalize('data');
   *     const encrypted = cipher.finalize(wordArray);
   */
  finalize(dataUpdate) {
    // Final data update
    if (dataUpdate) {
      this._append(dataUpdate);
    }
    // Perform concrete-cipher logic
    const finalProcessedData = this._doFinalize();
    return finalProcessedData;
  }
}
Cipher._ENC_XFORM_MODE = 1;
Cipher._DEC_XFORM_MODE = 2;
Cipher.keySize = 128 / 32;
Cipher.ivSize = 128 / 32;
/**
 * Abstract base stream cipher template.
 *
 * @property {number} blockSize
 *
 *     The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
 */
export class StreamCipher extends Cipher {
  constructor(...args) {
    super(...args);
    this.blockSize = 1;
  }
  _doFinalize() {
    // Process partial blocks
    const finalProcessedBlocks = this._process(!!'flush');
    return finalProcessedBlocks;
  }
}
/**
 * Abstract base block cipher mode template.
 */
export class BlockCipherMode extends Base {
  /**
   * Initializes a newly created mode.
   *
   * @param {Cipher} cipher A block cipher instance.
   * @param {Array} iv The IV words.
   *
   * @example
   *
   *     const mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
   */
  constructor(cipher, iv) {
    super();
    this._cipher = cipher;
    this._iv = iv;
  }
  /**
   * Creates this mode for encryption.
   *
   * @param {Cipher} cipher A block cipher instance.
   * @param {Array} iv The IV words.
   *
   * @static
   *
   * @example
   *
   *     const mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
   */
  static createEncryptor(cipher, iv) {
    return this.Encryptor.create(cipher, iv);
  }
  /**
   * Creates this mode for decryption.
   *
   * @param {Cipher} cipher A block cipher instance.
   * @param {Array} iv The IV words.
   *
   * @static
   *
   * @example
   *
   *     const mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
   */
  static createDecryptor(cipher, iv) {
    return this.Decryptor.create(cipher, iv);
  }
}
function xorBlock(words, offset, blockSize) {
  const _words = words;
  let block;
  // Shortcut
  const iv = this._iv;
  // Choose mixing block
  if (iv) {
    block = iv;
    // Remove IV for subsequent blocks
    this._iv = undefined;
  } else {
    block = this._prevBlock;
  }
  // XOR blocks
  for (let i = 0; i < blockSize; i += 1) {
    _words[offset + i] ^= block[i];
  }
}
/**
 * Cipher Block Chaining mode.
 */
/**
 * Abstract base CBC mode.
 */
export class CBC extends BlockCipherMode {
}
/**
 * CBC encryptor.
 */
CBC.Encryptor = class extends CBC {
  /**
   * Processes the data block at offset.
   *
   * @param {Array} words The data words to operate on.
   * @param {number} offset The offset where the block starts.
   *
   * @example
   *
   *     mode.processBlock(data.words, offset);
   */
  processBlock(words, offset) {
    // Shortcuts
    const cipher = this._cipher;
    const { blockSize } = cipher;
    // XOR and encrypt
    xorBlock.call(this, words, offset, blockSize);
    cipher.encryptBlock(words, offset);
    // Remember this block to use with next block
    this._prevBlock = words.slice(offset, offset + blockSize);
  }
};
/**
 * CBC decryptor.
 */
CBC.Decryptor = class extends CBC {
  /**
   * Processes the data block at offset.
   *
   * @param {Array} words The data words to operate on.
   * @param {number} offset The offset where the block starts.
   *
   * @example
   *
   *     mode.processBlock(data.words, offset);
   */
  processBlock(words, offset) {
    // Shortcuts
    const cipher = this._cipher;
    const { blockSize } = cipher;
    // Remember this block to use with next block
    const thisBlock = words.slice(offset, offset + blockSize);
    // Decrypt and XOR
    cipher.decryptBlock(words, offset);
    xorBlock.call(this, words, offset, blockSize);
    // This block becomes the previous block
    this._prevBlock = thisBlock;
  }
};
/**
 * PKCS #5/7 padding strategy.
 */
export const Pkcs7 = {
  /**
   * Pads data using the algorithm defined in PKCS #5/7.
   *
   * @param {WordArray} data The data to pad.
   * @param {number} blockSize The multiple that the data should be padded to.
   *
   * @static
   *
   * @example
   *
   *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);
   */
  pad(data, blockSize) {
    // Shortcut
    const blockSizeBytes = blockSize * 4;
    // Count padding bytes
    const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);
    // Create padding word
    const paddingWord = (nPaddingBytes << 24)
      | (nPaddingBytes << 16)
      | (nPaddingBytes << 8)
      | nPaddingBytes;
    // Create padding
    const paddingWords = [];
    for (let i = 0; i < nPaddingBytes; i += 4) {
      paddingWords.push(paddingWord);
    }
    const padding = WordArray.create(paddingWords, nPaddingBytes);
    // Add padding
    data.concat(padding);
  },
  /**
   * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
   *
   * @param {WordArray} data The data to unpad.
   *
   * @static
   *
   * @example
   *
   *     CryptoJS.pad.Pkcs7.unpad(wordArray);
   */
  unpad(data) {
    const _data = data;
    // Get number of padding bytes from last byte
    const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;
    // Remove padding
    _data.sigBytes -= nPaddingBytes;
  },
};
/**
 * Abstract base block cipher template.
 *
 * @property {number} blockSize
 *
 *    The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
 */
export class BlockCipher extends Cipher {
  constructor(xformMode, key, cfg) {
    /**
     * Configuration options.
     *
     * @property {Mode} mode The block mode to use. Default: CBC
     * @property {Padding} padding The padding strategy to use. Default: Pkcs7
     */
    super(xformMode, key, Object.assign(
      {
        mode: CBC,
        padding: Pkcs7,
      },
      cfg,
    ));
    this.blockSize = 128 / 32;
  }
  reset() {
    let modeCreator;
    // Reset cipher
    super.reset.call(this);
    // Shortcuts
    const { cfg } = this;
    const { iv, mode } = cfg;
    // Reset block mode
    if (this._xformMode === this.constructor._ENC_XFORM_MODE) {
      modeCreator = mode.createEncryptor;
    } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
      modeCreator = mode.createDecryptor;
      // Keep at least one block in the buffer for unpadding
      this._minBufferSize = 1;
    }
    this._mode = modeCreator.call(mode, this, iv && iv.words);
    this._mode.__creator = modeCreator;
  }
  _doProcessBlock(words, offset) {
    this._mode.processBlock(words, offset);
  }
  _doFinalize() {
    let finalProcessedBlocks;
    // Shortcut
    const { padding } = this.cfg;
    // Finalize
    if (this._xformMode === this.constructor._ENC_XFORM_MODE) {
      // Pad data
      padding.pad(this._data, this.blockSize);
      // Process final blocks
      finalProcessedBlocks = this._process(!!'flush');
    } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
      // Process final blocks
      finalProcessedBlocks = this._process(!!'flush');
      // Unpad data
      padding.unpad(finalProcessedBlocks);
    }
    return finalProcessedBlocks;
  }
}
/**
 * A collection of cipher parameters.
 *
 * @property {WordArray} ciphertext The raw ciphertext.
 * @property {WordArray} key The key to this ciphertext.
 * @property {WordArray} iv The IV used in the ciphering operation.
 * @property {WordArray} salt The salt used with a key derivation function.
 * @property {Cipher} algorithm The cipher algorithm.
 * @property {Mode} mode The block mode used in the ciphering operation.
 * @property {Padding} padding The padding scheme used in the ciphering operation.
 * @property {number} blockSize The block size of the cipher.
 * @property {Format} formatter
 *    The default formatting strategy to convert this cipher params object to a string.
 */
export class CipherParams extends Base {
  /**
   * Initializes a newly created cipher params object.
   *
   * @param {Object} cipherParams An object with any of the possible cipher parameters.
   *
   * @example
   *
   *     var cipherParams = CryptoJS.lib.CipherParams.create({
   *         ciphertext: ciphertextWordArray,
   *         key: keyWordArray,
   *         iv: ivWordArray,
   *         salt: saltWordArray,
   *         algorithm: CryptoJS.algo.AES,
   *         mode: CryptoJS.mode.CBC,
   *         padding: CryptoJS.pad.PKCS7,
   *         blockSize: 4,
   *         formatter: CryptoJS.format.OpenSSL
   *     });
   */
  constructor(cipherParams) {
    super();
    this.mixIn(cipherParams);
  }
  /**
   * Converts this cipher params object to a string.
   *
   * @param {Format} formatter (Optional) The formatting strategy to use.
   *
   * @return {string} The stringified cipher params.
   *
   * @throws Error If neither the formatter nor the default formatter is set.
   *
   * @example
   *
   *     var string = cipherParams + '';
   *     var string = cipherParams.toString();
   *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);
   */
  toString(formatter) {
    return (formatter || this.formatter).stringify(this);
  }
}
/**
 * OpenSSL formatting strategy.
 */
export const OpenSSLFormatter = {
  /**
   * Converts a cipher params object to an OpenSSL-compatible string.
   *
   * @param {CipherParams} cipherParams The cipher params object.
   *
   * @return {string} The OpenSSL-compatible string.
   *
   * @static
   *
   * @example
   *
   *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
   */
  stringify(cipherParams) {
    let wordArray;
    // Shortcuts
    const { ciphertext, salt } = cipherParams;
    // Format
    if (salt) {
      wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
    } else {
      wordArray = ciphertext;
    }
    return wordArray.toString(Base64);
  },
  /**
   * Converts an OpenSSL-compatible string to a cipher params object.
   *
   * @param {string} openSSLStr The OpenSSL-compatible string.
   *
   * @return {CipherParams} The cipher params object.
   *
   * @static
   *
   * @example
   *
   *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
   */
  parse(openSSLStr) {
    let salt;
    // Parse base64
    const ciphertext = Base64.parse(openSSLStr);
    // Shortcut
    const ciphertextWords = ciphertext.words;
    // Test for salt
    if (ciphertextWords[0] === 0x53616c74 && ciphertextWords[1] === 0x65645f5f) {
      // Extract salt
      salt = WordArray.create(ciphertextWords.slice(2, 4));
      // Remove salt from ciphertext
      ciphertextWords.splice(0, 4);
      ciphertext.sigBytes -= 16;
    }
    return CipherParams.create({ ciphertext, salt });
  },
};
/**
 * A cipher wrapper that returns ciphertext as a serializable cipher params object.
 */
export class SerializableCipher extends Base {
  /**
   * Encrypts a message.
   *
   * @param {Cipher} cipher The cipher algorithm to use.
   * @param {WordArray|string} message The message to encrypt.
   * @param {WordArray} key The key.
   * @param {Object} cfg (Optional) The configuration options to use for this operation.
   *
   * @return {CipherParams} A cipher params object.
   *
   * @static
   *
   * @example
   *
   *     var ciphertextParams = CryptoJS.lib.SerializableCipher
   *       .encrypt(CryptoJS.algo.AES, message, key);
   *     var ciphertextParams = CryptoJS.lib.SerializableCipher
   *       .encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
   *     var ciphertextParams = CryptoJS.lib.SerializableCipher
   *       .encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
   */
  static encrypt(cipher, message, key, cfg) {
    // Apply config defaults
    const _cfg = Object.assign(new Base(), this.cfg, cfg);
    // Encrypt
    const encryptor = cipher.createEncryptor(key, _cfg);
    const ciphertext = encryptor.finalize(message);
    // Shortcut
    const cipherCfg = encryptor.cfg;
    // Create and return serializable cipher params
    return CipherParams.create({
      ciphertext,
      key,
      iv: cipherCfg.iv,
      algorithm: cipher,
      mode: cipherCfg.mode,
      padding: cipherCfg.padding,
      blockSize: encryptor.blockSize,
      formatter: _cfg.format,
    });
  }
  /**
   * Decrypts serialized ciphertext.
   *
   * @param {Cipher} cipher The cipher algorithm to use.
   * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
   * @param {WordArray} key The key.
   * @param {Object} cfg (Optional) The configuration options to use for this operation.
   *
   * @return {WordArray} The plaintext.
   *
   * @static
   *
   * @example
   *
   *     var plaintext = CryptoJS.lib.SerializableCipher
   *       .decrypt(CryptoJS.algo.AES, formattedCiphertext, key,
   *         { iv: iv, format: CryptoJS.format.OpenSSL });
   *     var plaintext = CryptoJS.lib.SerializableCipher
   *       .decrypt(CryptoJS.algo.AES, ciphertextParams, key,
   *         { iv: iv, format: CryptoJS.format.OpenSSL });
   */
  static decrypt(cipher, ciphertext, key, cfg) {
    let _ciphertext = ciphertext;
    // Apply config defaults
    const _cfg = Object.assign(new Base(), this.cfg, cfg);
    // Convert string to CipherParams
    _ciphertext = this._parse(_ciphertext, _cfg.format);
    // Decrypt
    const plaintext = cipher.createDecryptor(key, _cfg).finalize(_ciphertext.ciphertext);
    return plaintext;
  }
  /**
   * Converts serialized ciphertext to CipherParams,
   * else assumed CipherParams already and returns ciphertext unchanged.
   *
   * @param {CipherParams|string} ciphertext The ciphertext.
   * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
   *
   * @return {CipherParams} The unserialized ciphertext.
   *
   * @static
   *
   * @example
   *
   *     var ciphertextParams = CryptoJS.lib.SerializableCipher
   *       ._parse(ciphertextStringOrParams, format);
   */
  static _parse(ciphertext, format) {
    if (typeof ciphertext === 'string') {
      return format.parse(ciphertext, this);
    }
    return ciphertext;
  }
}
/**
 * Configuration options.
 *
 * @property {Formatter} format
 *
 *    The formatting strategy to convert cipher param objects to and from a string.
 *    Default: OpenSSL
 */
SerializableCipher.cfg = Object.assign(
  new Base(),
  { format: OpenSSLFormatter },
);
/**
 * OpenSSL key derivation function.
 */
export const OpenSSLKdf = {
  /**
   * Derives a key and IV from a password.
   *
   * @param {string} password The password to derive from.
   * @param {number} keySize The size in words of the key to generate.
   * @param {number} ivSize The size in words of the IV to generate.
   * @param {WordArray|string} salt
   *     (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
   *
   * @return {CipherParams} A cipher params object with the key, IV, and salt.
   *
   * @static
   *
   * @example
   *
   *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
   *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
   */
  execute(password, keySize, ivSize, salt, hasher) {
    let _salt = salt;
    // Generate random salt
    if (!_salt) {
      _salt = WordArray.random(64 / 8);
    }
    // Derive key and IV
    let key;
    if (!hasher) {
      key = EvpKDFAlgo.create({ keySize: keySize + ivSize }).compute(password, _salt);
    } else {
      key = EvpKDFAlgo.create({ keySize: keySize + ivSize, hasher }).compute(password, _salt);
    }
    // Separate key and IV
    const iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
    key.sigBytes = keySize * 4;
    // Return params
    return CipherParams.create({ key, iv, salt: _salt });
  },
};
/**
 * A serializable cipher wrapper that derives the key from a password,
 * and returns ciphertext as a serializable cipher params object.
 */
export class PasswordBasedCipher extends SerializableCipher {
  /**
   * Encrypts a message using a password.
   *
   * @param {Cipher} cipher The cipher algorithm to use.
   * @param {WordArray|string} message The message to encrypt.
   * @param {string} password The password.
   * @param {Object} cfg (Optional) The configuration options to use for this operation.
   *
   * @return {CipherParams} A cipher params object.
   *
   * @static
   *
   * @example
   *
   *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher
   *       .encrypt(CryptoJS.algo.AES, message, 'password');
   *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher
   *       .encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
   */
  static encrypt(cipher, message, password, cfg) {
    // Apply config defaults
    const _cfg = Object.assign(new Base(), this.cfg, cfg);
    // Derive key and other params
    const derivedParams = _cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, _cfg.salt, _cfg.hasher);
    // Add IV to config
    _cfg.iv = derivedParams.iv;
    // Encrypt
    const ciphertext = SerializableCipher.encrypt
      .call(this, cipher, message, derivedParams.key, _cfg);
    // Mix in derived params
    ciphertext.mixIn(derivedParams);
    return ciphertext;
  }
  /**
   * Decrypts serialized ciphertext using a password.
   *
   * @param {Cipher} cipher The cipher algorithm to use.
   * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
   * @param {string} password The password.
   * @param {Object} cfg (Optional) The configuration options to use for this operation.
   *
   * @return {WordArray} The plaintext.
   *
   * @static
   *
   * @example
   *
   *     var plaintext = CryptoJS.lib.PasswordBasedCipher
   *       .decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password',
   *         { format: CryptoJS.format.OpenSSL });
   *     var plaintext = CryptoJS.lib.PasswordBasedCipher
   *       .decrypt(CryptoJS.algo.AES, ciphertextParams, 'password',
   *         { format: CryptoJS.format.OpenSSL });
   */
  static decrypt(cipher, ciphertext, password, cfg) {
    let _ciphertext = ciphertext;
    // Apply config defaults
    const _cfg = Object.assign(new Base(), this.cfg, cfg);
    // Convert string to CipherParams
    _ciphertext = this._parse(_ciphertext, _cfg.format);
    // Derive key and other params
    const derivedParams = _cfg.kdf
      .execute(password, cipher.keySize, cipher.ivSize, _ciphertext.salt, _cfg.hasher);
    // Add IV to config
    _cfg.iv = derivedParams.iv;
    // Decrypt
    const plaintext = SerializableCipher.decrypt
      .call(this, cipher, _ciphertext, derivedParams.key, _cfg);
    return plaintext;
  }
}
/**
 * Configuration options.
 *
 * @property {KDF} kdf
 *     The key derivation function to use to generate a key and IV from a password.
 *     Default: OpenSSL
 */
PasswordBasedCipher.cfg = Object.assign(SerializableCipher.cfg, { kdf: OpenSSLKdf });
vf107/dxmodules/crypto-es/core.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,800 @@
/* eslint-disable no-use-before-define */
const crypto =
  (typeof globalThis != 'undefined' ? globalThis : void 0)?.crypto ||
  (typeof global != 'undefined' ? global : void 0)?.crypto ||
  (typeof window != 'undefined' ? window : void 0)?.crypto ||
  (typeof self != 'undefined' ? self : void 0)?.crypto ||
  (typeof frames != 'undefined' ? frames : void 0)?.[0]?.crypto;
let randomWordArray;
if (crypto) {
  randomWordArray = (nBytes) => {
    const words = [];
    for (let i = 0, rcache; i < nBytes; i += 4) {
      words.push(crypto.getRandomValues(new Uint32Array(1))[0]);
    }
    return new WordArray(words, nBytes);
  }
} else {
  // Because there is no global crypto property in this context, cryptographically unsafe Math.random() is used.
  randomWordArray = (nBytes) => {
    const words = [];
    const r = (m_w) => {
      let _m_w = m_w;
      let _m_z = 0x3ade68b1;
      const mask = 0xffffffff;
      return () => {
        _m_z = (0x9069 * (_m_z & 0xFFFF) + (_m_z >> 0x10)) & mask;
        _m_w = (0x4650 * (_m_w & 0xFFFF) + (_m_w >> 0x10)) & mask;
        let result = ((_m_z << 0x10) + _m_w) & mask;
        result /= 0x100000000;
        result += 0.5;
        return result * (Math.random() > 0.5 ? 1 : -1);
      };
    };
    for (let i = 0, rcache; i < nBytes; i += 4) {
      const _r = r((rcache || Math.random()) * 0x100000000);
      rcache = _r() * 0x3ade67b7;
      words.push((_r() * 0x100000000) | 0);
    }
    return new WordArray(words, nBytes);
  }
}
/**
 * Base class for inheritance.
 */
export class Base {
  /**
   * Extends this object and runs the init method.
   * Arguments to create() will be passed to init().
   *
   * @return {Object} The new object.
   *
   * @static
   *
   * @example
   *
   *     var instance = MyType.create();
   */
  static create(...args) {
    return new this(...args);
  }
  /**
   * Copies properties into this object.
   *
   * @param {Object} properties The properties to mix in.
   *
   * @example
   *
   *     MyType.mixIn({
   *         field: 'value'
   *     });
   */
  mixIn(properties) {
    return Object.assign(this, properties);
  }
  /**
   * Creates a copy of this object.
   *
   * @return {Object} The clone.
   *
   * @example
   *
   *     var clone = instance.clone();
   */
  clone() {
    const clone = new this.constructor();
    Object.assign(clone, this);
    return clone;
  }
}
/**
 * An array of 32-bit words.
 *
 * @property {Array} words The array of 32-bit words.
 * @property {number} sigBytes The number of significant bytes in this word array.
 */
export class WordArray extends Base {
  /**
   * Initializes a newly created word array.
   *
   * @param {Array} words (Optional) An array of 32-bit words.
   * @param {number} sigBytes (Optional) The number of significant bytes in the words.
   *
   * @example
   *
   *     var wordArray = CryptoJS.lib.WordArray.create();
   *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
   *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
   */
  constructor(words = [], sigBytes = words.length * 4) {
    super();
    let typedArray = words;
    // Convert buffers to uint8
    if (typedArray instanceof ArrayBuffer) {
      typedArray = new Uint8Array(typedArray);
    }
    // Convert other array views to uint8
    if (
      typedArray instanceof Int8Array
      || typedArray instanceof Uint8ClampedArray
      || typedArray instanceof Int16Array
      || typedArray instanceof Uint16Array
      || typedArray instanceof Int32Array
      || typedArray instanceof Uint32Array
      || typedArray instanceof Float32Array
      || typedArray instanceof Float64Array
    ) {
      typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
    }
    // Handle Uint8Array
    if (typedArray instanceof Uint8Array) {
      // Shortcut
      const typedArrayByteLength = typedArray.byteLength;
      // Extract bytes
      const _words = [];
      for (let i = 0; i < typedArrayByteLength; i += 1) {
        _words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
      }
      // Initialize this word array
      this.words = _words;
      this.sigBytes = typedArrayByteLength;
    } else {
      // Else call normal init
      this.words = words;
      this.sigBytes = sigBytes;
    }
  }
  /**
   * Creates a word array filled with random bytes.
   *
   * @param {number} nBytes The number of random bytes to generate.
   *
   * @return {WordArray} The random word array.
   *
   * @static
   *
   * @example
   *
   *     var wordArray = CryptoJS.lib.WordArray.random(16);
   */
  static random = randomWordArray;
  /**
   * Converts this word array to a string.
   *
   * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
   *
   * @return {string} The stringified word array.
   *
   * @example
   *
   *     var string = wordArray + '';
   *     var string = wordArray.toString();
   *     var string = wordArray.toString(CryptoJS.enc.Utf8);
   */
  toString(encoder = Hex) {
    return encoder.stringify(this);
  }
  /**
   * Concatenates a word array to this word array.
   *
   * @param {WordArray} wordArray The word array to append.
   *
   * @return {WordArray} This word array.
   *
   * @example
   *
   *     wordArray1.concat(wordArray2);
   */
  concat(wordArray) {
    // Shortcuts
    const thisWords = this.words;
    const thatWords = wordArray.words;
    const thisSigBytes = this.sigBytes;
    const thatSigBytes = wordArray.sigBytes;
    // Clamp excess bits
    this.clamp();
    // Concat
    if (thisSigBytes % 4) {
      // Copy one byte at a time
      for (let i = 0; i < thatSigBytes; i += 1) {
        const thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
        thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
      }
    } else {
      // Copy one word at a time
      for (let i = 0; i < thatSigBytes; i += 4) {
        thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
      }
    }
    this.sigBytes += thatSigBytes;
    // Chainable
    return this;
  }
  /**
   * Removes insignificant bits.
   *
   * @example
   *
   *     wordArray.clamp();
   */
  clamp() {
    // Shortcuts
    const { words, sigBytes } = this;
    // Clamp
    words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
    words.length = Math.ceil(sigBytes / 4);
  }
  /**
   * Creates a copy of this word array.
   *
   * @return {WordArray} The clone.
   *
   * @example
   *
   *     var clone = wordArray.clone();
   */
  clone() {
    const clone = super.clone.call(this);
    clone.words = this.words.slice(0);
    return clone;
  }
}
/**
 * Hex encoding strategy.
 */
export const Hex = {
  /**
   * Converts a word array to a hex string.
   *
   * @param {WordArray} wordArray The word array.
   *
   * @return {string} The hex string.
   *
   * @static
   *
   * @example
   *
   *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
   */
  stringify(wordArray) {
    // Shortcuts
    const { words, sigBytes } = wordArray;
    // Convert
    const hexChars = [];
    for (let i = 0; i < sigBytes; i += 1) {
      const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
      hexChars.push((bite >>> 4).toString(16));
      hexChars.push((bite & 0x0f).toString(16));
    }
    return hexChars.join('');
  },
  /**
   * Converts a hex string to a word array.
   *
   * @param {string} hexStr The hex string.
   *
   * @return {WordArray} The word array.
   *
   * @static
   *
   * @example
   *
   *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
   */
  parse(hexStr) {
    // Shortcut
    const hexStrLength = hexStr.length;
    // Convert
    const words = [];
    for (let i = 0; i < hexStrLength; i += 2) {
      words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
    }
    return new WordArray(words, hexStrLength / 2);
  },
};
/**
 * Latin1 encoding strategy.
 */
export const Latin1 = {
  /**
   * Converts a word array to a Latin1 string.
   *
   * @param {WordArray} wordArray The word array.
   *
   * @return {string} The Latin1 string.
   *
   * @static
   *
   * @example
   *
   *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
   */
  stringify(wordArray) {
    // Shortcuts
    const { words, sigBytes } = wordArray;
    // Convert
    const latin1Chars = [];
    for (let i = 0; i < sigBytes; i += 1) {
      const bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
      latin1Chars.push(String.fromCharCode(bite));
    }
    return latin1Chars.join('');
  },
  /**
   * Converts a Latin1 string to a word array.
   *
   * @param {string} latin1Str The Latin1 string.
   *
   * @return {WordArray} The word array.
   *
   * @static
   *
   * @example
   *
   *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
   */
  parse(latin1Str) {
    // Shortcut
    const latin1StrLength = latin1Str.length;
    // Convert
    const words = [];
    for (let i = 0; i < latin1StrLength; i += 1) {
      words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
    }
    return new WordArray(words, latin1StrLength);
  },
};
/**
 * UTF-8 encoding strategy.
 */
export const Utf8 = {
  /**
   * Converts a word array to a UTF-8 string.
   *
   * @param {WordArray} wordArray The word array.
   *
   * @return {string} The UTF-8 string.
   *
   * @static
   *
   * @example
   *
   *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
   */
  stringify(wordArray) {
    try {
      return decodeURIComponent(escape(Latin1.stringify(wordArray)));
    } catch (e) {
      throw new Error('Malformed UTF-8 data');
    }
  },
  /**
   * Converts a UTF-8 string to a word array.
   *
   * @param {string} utf8Str The UTF-8 string.
   *
   * @return {WordArray} The word array.
   *
   * @static
   *
   * @example
   *
   *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
   */
  parse(utf8Str) {
    return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
  },
};
/**
 * Abstract buffered block algorithm template.
 *
 * The property blockSize must be implemented in a concrete subtype.
 *
 * @property {number} _minBufferSize
 *
 *     The number of blocks that should be kept unprocessed in the buffer. Default: 0
 */
export class BufferedBlockAlgorithm extends Base {
  constructor() {
    super();
    this._minBufferSize = 0;
  }
  /**
   * Resets this block algorithm's data buffer to its initial state.
   *
   * @example
   *
   *     bufferedBlockAlgorithm.reset();
   */
  reset() {
    // Initial values
    this._data = new WordArray();
    this._nDataBytes = 0;
  }
  /**
   * Adds new data to this block algorithm's buffer.
   *
   * @param {WordArray|string} data
   *
   *     The data to append. Strings are converted to a WordArray using UTF-8.
   *
   * @example
   *
   *     bufferedBlockAlgorithm._append('data');
   *     bufferedBlockAlgorithm._append(wordArray);
   */
  _append(data) {
    let m_data = data;
    // Convert string to WordArray, else assume WordArray already
    if (typeof m_data === 'string') {
      m_data = Utf8.parse(m_data);
    }
    // Append
    this._data.concat(m_data);
    this._nDataBytes += m_data.sigBytes;
  }
  /**
   * Processes available data blocks.
   *
   * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
   *
   * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
   *
   * @return {WordArray} The processed data.
   *
   * @example
   *
   *     var processedData = bufferedBlockAlgorithm._process();
   *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
   */
  _process(doFlush) {
    let processedWords;
    // Shortcuts
    const { _data: data, blockSize } = this;
    const dataWords = data.words;
    const dataSigBytes = data.sigBytes;
    const blockSizeBytes = blockSize * 4;
    // Count blocks ready
    let nBlocksReady = dataSigBytes / blockSizeBytes;
    if (doFlush) {
      // Round up to include partial blocks
      nBlocksReady = Math.ceil(nBlocksReady);
    } else {
      // Round down to include only full blocks,
      // less the number of blocks that must remain in the buffer
      nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
    }
    // Count words ready
    const nWordsReady = nBlocksReady * blockSize;
    // Count bytes ready
    const nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
    // Process blocks
    if (nWordsReady) {
      for (let offset = 0; offset < nWordsReady; offset += blockSize) {
        // Perform concrete-algorithm logic
        this._doProcessBlock(dataWords, offset);
      }
      // Remove processed words
      processedWords = dataWords.splice(0, nWordsReady);
      data.sigBytes -= nBytesReady;
    }
    // Return processed words
    return new WordArray(processedWords, nBytesReady);
  }
  /**
   * Creates a copy of this object.
   *
   * @return {Object} The clone.
   *
   * @example
   *
   *     var clone = bufferedBlockAlgorithm.clone();
   */
  clone() {
    const clone = super.clone.call(this);
    clone._data = this._data.clone();
    return clone;
  }
}
/**
 * Abstract hasher template.
 *
 * @property {number} blockSize
 *
 *     The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
 */
export class Hasher extends BufferedBlockAlgorithm {
  constructor(cfg) {
    super();
    this.blockSize = 512 / 32;
    /**
     * Configuration options.
     */
    this.cfg = Object.assign(new Base(), cfg);
    // Set initial values
    this.reset();
  }
  /**
   * Creates a shortcut function to a hasher's object interface.
   *
   * @param {Hasher} SubHasher The hasher to create a helper for.
   *
   * @return {Function} The shortcut function.
   *
   * @static
   *
   * @example
   *
   *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
   */
  static _createHelper(SubHasher) {
    return (message, cfg) => new SubHasher(cfg).finalize(message);
  }
  /**
   * Creates a shortcut function to the HMAC's object interface.
   *
   * @param {Hasher} SubHasher The hasher to use in this HMAC helper.
   *
   * @return {Function} The shortcut function.
   *
   * @static
   *
   * @example
   *
   *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
   */
  static _createHmacHelper(SubHasher) {
    return (message, key) => new HMAC(SubHasher, key).finalize(message);
  }
  /**
   * Resets this hasher to its initial state.
   *
   * @example
   *
   *     hasher.reset();
   */
  reset() {
    // Reset data buffer
    super.reset.call(this);
    // Perform concrete-hasher logic
    this._doReset();
  }
  /**
   * Updates this hasher with a message.
   *
   * @param {WordArray|string} messageUpdate The message to append.
   *
   * @return {Hasher} This hasher.
   *
   * @example
   *
   *     hasher.update('message');
   *     hasher.update(wordArray);
   */
  update(messageUpdate) {
    // Append
    this._append(messageUpdate);
    // Update the hash
    this._process();
    // Chainable
    return this;
  }
  /**
   * Finalizes the hash computation.
   * Note that the finalize operation is effectively a destructive, read-once operation.
   *
   * @param {WordArray|string} messageUpdate (Optional) A final message update.
   *
   * @return {WordArray} The hash.
   *
   * @example
   *
   *     var hash = hasher.finalize();
   *     var hash = hasher.finalize('message');
   *     var hash = hasher.finalize(wordArray);
   */
  finalize(messageUpdate) {
    // Final message update
    if (messageUpdate) {
      this._append(messageUpdate);
    }
    // Perform concrete-hasher logic
    const hash = this._doFinalize();
    return hash;
  }
}
/**
 * HMAC algorithm.
 */
export class HMAC extends Base {
  /**
   * Initializes a newly created HMAC.
   *
   * @param {Hasher} SubHasher The hash algorithm to use.
   * @param {WordArray|string} key The secret key.
   *
   * @example
   *
   *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
   */
  constructor(SubHasher, key) {
    super();
    const hasher = new SubHasher();
    this._hasher = hasher;
    // Convert string to WordArray, else assume WordArray already
    let _key = key;
    if (typeof _key === 'string') {
      _key = Utf8.parse(_key);
    }
    // Shortcuts
    const hasherBlockSize = hasher.blockSize;
    const hasherBlockSizeBytes = hasherBlockSize * 4;
    // Allow arbitrary length keys
    if (_key.sigBytes > hasherBlockSizeBytes) {
      _key = hasher.finalize(key);
    }
    // Clamp excess bits
    _key.clamp();
    // Clone key for inner and outer pads
    const oKey = _key.clone();
    this._oKey = oKey;
    const iKey = _key.clone();
    this._iKey = iKey;
    // Shortcuts
    const oKeyWords = oKey.words;
    const iKeyWords = iKey.words;
    // XOR keys with pad constants
    for (let i = 0; i < hasherBlockSize; i += 1) {
      oKeyWords[i] ^= 0x5c5c5c5c;
      iKeyWords[i] ^= 0x36363636;
    }
    oKey.sigBytes = hasherBlockSizeBytes;
    iKey.sigBytes = hasherBlockSizeBytes;
    // Set initial values
    this.reset();
  }
  /**
   * Resets this HMAC to its initial state.
   *
   * @example
   *
   *     hmacHasher.reset();
   */
  reset() {
    // Shortcut
    const hasher = this._hasher;
    // Reset
    hasher.reset();
    hasher.update(this._iKey);
  }
  /**
   * Updates this HMAC with a message.
   *
   * @param {WordArray|string} messageUpdate The message to append.
   *
   * @return {HMAC} This HMAC instance.
   *
   * @example
   *
   *     hmacHasher.update('message');
   *     hmacHasher.update(wordArray);
   */
  update(messageUpdate) {
    this._hasher.update(messageUpdate);
    // Chainable
    return this;
  }
  /**
   * Finalizes the HMAC computation.
   * Note that the finalize operation is effectively a destructive, read-once operation.
   *
   * @param {WordArray|string} messageUpdate (Optional) A final message update.
   *
   * @return {WordArray} The HMAC.
   *
   * @example
   *
   *     var hmac = hmacHasher.finalize();
   *     var hmac = hmacHasher.finalize('message');
   *     var hmac = hmacHasher.finalize(wordArray);
   */
  finalize(messageUpdate) {
    // Shortcut
    const hasher = this._hasher;
    // Compute HMAC
    const innerHash = hasher.finalize(messageUpdate);
    hasher.reset();
    const hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
    return hmac;
  }
}
vf107/dxmodules/crypto-es/enc-base64.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
import {
  WordArray,
} from './core.js';
export const parseLoop = (base64Str, base64StrLength, reverseMap) => {
  const words = [];
  let nBytes = 0;
  for (let i = 0; i < base64StrLength; i += 1) {
    if (i % 4) {
      const bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
      const bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
      const bitsCombined = bits1 | bits2;
      words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
      nBytes += 1;
    }
  }
  return WordArray.create(words, nBytes);
};
/**
 * Base64 encoding strategy.
 */
export const Base64 = {
  /**
   * Converts a word array to a Base64 string.
   *
   * @param {WordArray} wordArray The word array.
   *
   * @return {string} The Base64 string.
   *
   * @static
   *
   * @example
   *
   *     const base64String = CryptoJS.enc.Base64.stringify(wordArray);
   */
  stringify(wordArray) {
    // Shortcuts
    const { words, sigBytes } = wordArray;
    const map = this._map;
    // Clamp excess bits
    wordArray.clamp();
    // Convert
    const base64Chars = [];
    for (let i = 0; i < sigBytes; i += 3) {
      const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
      const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
      const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
      const triplet = (byte1 << 16) | (byte2 << 8) | byte3;
      for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) {
        base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
      }
    }
    // Add padding
    const paddingChar = map.charAt(64);
    if (paddingChar) {
      while (base64Chars.length % 4) {
        base64Chars.push(paddingChar);
      }
    }
    return base64Chars.join('');
  },
  /**
   * Converts a Base64 string to a word array.
   *
   * @param {string} base64Str The Base64 string.
   *
   * @return {WordArray} The word array.
   *
   * @static
   *
   * @example
   *
   *     const wordArray = CryptoJS.enc.Base64.parse(base64String);
   */
  parse(base64Str) {
    // Shortcuts
    let base64StrLength = base64Str.length;
    const map = this._map;
    let reverseMap = this._reverseMap;
    if (!reverseMap) {
      this._reverseMap = [];
      reverseMap = this._reverseMap;
      for (let j = 0; j < map.length; j += 1) {
        reverseMap[map.charCodeAt(j)] = j;
      }
    }
    // Ignore padding
    const paddingChar = map.charAt(64);
    if (paddingChar) {
      const paddingIndex = base64Str.indexOf(paddingChar);
      if (paddingIndex !== -1) {
        base64StrLength = paddingIndex;
      }
    }
    // Convert
    return parseLoop(base64Str, base64StrLength, reverseMap);
  },
  _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
};
vf107/dxmodules/crypto-es/enc-base64url.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
import {
  WordArray,
} from './core.js';
import {
  parseLoop,
} from './enc-base64.js'
/**
 * Base64url encoding strategy.
 */
export const Base64url = {
  /**
   * Converts a word array to a Base64url string.
   *
   * @param {WordArray} wordArray The word array.
   *
   * @param {boolean} urlSafe Whether to use url safe.
   *
   * @return {string} The Base64url string.
   *
   * @static
   *
   * @example
   *
   *     const base64String = CryptoJS.enc.Base64.stringify(wordArray);
   */
  stringify(wordArray, urlSafe = true) {
    // Shortcuts
    const { words, sigBytes } = wordArray;
    const map = urlSafe ? this._safeMap : this._map;
    // Clamp excess bits
    wordArray.clamp();
    // Convert
    const base64Chars = [];
    for (let i = 0; i < sigBytes; i += 3) {
      const byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
      const byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
      const byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
      const triplet = (byte1 << 16) | (byte2 << 8) | byte3;
      for (let j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j += 1) {
        base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
      }
    }
    // Add padding
    const paddingChar = map.charAt(64);
    if (paddingChar) {
      while (base64Chars.length % 4) {
        base64Chars.push(paddingChar);
      }
    }
    return base64Chars.join('');
  },
  /**
   * Converts a Base64url string to a word array.
   *
   * @param {string} base64Str The Base64url string.
   *
   * @param {boolean} urlSafe Whether to use url safe.
   *
   * @return {WordArray} The word array.
   *
   * @static
   *
   * @example
   *
   *     const wordArray = CryptoJS.enc.Base64.parse(base64String);
   */
  parse(base64Str, urlSafe = true) {
    // Shortcuts
    let base64StrLength = base64Str.length;
    const map = urlSafe ? this._safeMap : this._map;
    let reverseMap = this._reverseMap;
    if (!reverseMap) {
      this._reverseMap = [];
      reverseMap = this._reverseMap;
      for (let j = 0; j < map.length; j += 1) {
        reverseMap[map.charCodeAt(j)] = j;
      }
    }
    // Ignore padding
    const paddingChar = map.charAt(64);
    if (paddingChar) {
      const paddingIndex = base64Str.indexOf(paddingChar);
      if (paddingIndex !== -1) {
        base64StrLength = paddingIndex;
      }
    }
    // Convert
    return parseLoop(base64Str, base64StrLength, reverseMap);
  },
  _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
  _safeMap: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
};
vf107/dxmodules/crypto-es/enc-utf16.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
import {
  WordArray,
} from './core.js';
const swapEndian = word => ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
/**
 * UTF-16 BE encoding strategy.
 */
export const Utf16BE = {
  /**
   * Converts a word array to a UTF-16 BE string.
   *
   * @param {WordArray} wordArray The word array.
   *
   * @return {string} The UTF-16 BE string.
   *
   * @static
   *
   * @example
   *
   *     const utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
   */
  stringify(wordArray) {
    // Shortcuts
    const { words, sigBytes } = wordArray;
    // Convert
    const utf16Chars = [];
    for (let i = 0; i < sigBytes; i += 2) {
      const codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
      utf16Chars.push(String.fromCharCode(codePoint));
    }
    return utf16Chars.join('');
  },
  /**
   * Converts a UTF-16 BE string to a word array.
   *
   * @param {string} utf16Str The UTF-16 BE string.
   *
   * @return {WordArray} The word array.
   *
   * @static
   *
   * @example
   *
   *     const wordArray = CryptoJS.enc.Utf16.parse(utf16String);
   */
  parse(utf16Str) {
    // Shortcut
    const utf16StrLength = utf16Str.length;
    // Convert
    const words = [];
    for (let i = 0; i < utf16StrLength; i += 1) {
      words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
    }
    return WordArray.create(words, utf16StrLength * 2);
  },
};
export const Utf16 = Utf16BE;
/**
 * UTF-16 LE encoding strategy.
 */
export const Utf16LE = {
  /**
   * Converts a word array to a UTF-16 LE string.
   *
   * @param {WordArray} wordArray The word array.
   *
   * @return {string} The UTF-16 LE string.
   *
   * @static
   *
   * @example
   *
   *     const utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
   */
  stringify(wordArray) {
    // Shortcuts
    const { words, sigBytes } = wordArray;
    // Convert
    const utf16Chars = [];
    for (let i = 0; i < sigBytes; i += 2) {
      const codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
      utf16Chars.push(String.fromCharCode(codePoint));
    }
    return utf16Chars.join('');
  },
  /**
   * Converts a UTF-16 LE string to a word array.
   *
   * @param {string} utf16Str The UTF-16 LE string.
   *
   * @return {WordArray} The word array.
   *
   * @static
   *
   * @example
   *
   *     const wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
   */
  parse(utf16Str) {
    // Shortcut
    const utf16StrLength = utf16Str.length;
    // Convert
    const words = [];
    for (let i = 0; i < utf16StrLength; i += 1) {
      words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
    }
    return WordArray.create(words, utf16StrLength * 2);
  },
};
vf107/dxmodules/crypto-es/evpkdf.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
import {
  Base,
  WordArray,
} from './core.js';
import { MD5Algo } from './md5.js';
/**
 * This key derivation function is meant to conform with EVP_BytesToKey.
 * www.openssl.org/docs/crypto/EVP_BytesToKey.html
 */
export class EvpKDFAlgo extends Base {
  /**
   * Initializes a newly created key derivation function.
   *
   * @param {Object} cfg (Optional) The configuration options to use for the derivation.
   *
   * @example
   *
   *     const kdf = CryptoJS.algo.EvpKDF.create();
   *     const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
   *     const kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
   */
  constructor(cfg) {
    super();
    /**
     * Configuration options.
     *
     * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
     * @property {Hasher} hasher The hash algorithm to use. Default: MD5
     * @property {number} iterations The number of iterations to perform. Default: 1
     */
    this.cfg = Object.assign(
      new Base(),
      {
        keySize: 128 / 32,
        hasher: MD5Algo,
        iterations: 1,
      },
      cfg,
    );
  }
  /**
   * Derives a key from a password.
   *
   * @param {WordArray|string} password The password.
   * @param {WordArray|string} salt A salt.
   *
   * @return {WordArray} The derived key.
   *
   * @example
   *
   *     const key = kdf.compute(password, salt);
   */
  compute(password, salt) {
    let block;
    // Shortcut
    const { cfg } = this;
    // Init hasher
    const hasher = cfg.hasher.create();
    // Initial values
    const derivedKey = WordArray.create();
    // Shortcuts
    const derivedKeyWords = derivedKey.words;
    const { keySize, iterations } = cfg;
    // Generate key
    while (derivedKeyWords.length < keySize) {
      if (block) {
        hasher.update(block);
      }
      block = hasher.update(password).finalize(salt);
      hasher.reset();
      // Iterations
      for (let i = 1; i < iterations; i += 1) {
        block = hasher.finalize(block);
        hasher.reset();
      }
      derivedKey.concat(block);
    }
    derivedKey.sigBytes = keySize * 4;
    return derivedKey;
  }
}
/**
 * Derives a key from a password.
 *
 * @param {WordArray|string} password The password.
 * @param {WordArray|string} salt A salt.
 * @param {Object} cfg (Optional) The configuration options to use for this computation.
 *
 * @return {WordArray} The derived key.
 *
 * @static
 *
 * @example
 *
 *     var key = CryptoJS.EvpKDF(password, salt);
 *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
 *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
 */
export const EvpKDF = (password, salt, cfg) => EvpKDFAlgo.create(cfg).compute(password, salt);
vf107/dxmodules/crypto-es/format-hex.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
import {
  CipherParams,
} from './cipher-core.js';
import {
  Hex,
} from './core.js';
export const HexFormatter = {
  /**
   * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
   *
   * @param {CipherParams} cipherParams The cipher params object.
   *
   * @return {string} The hexadecimally encoded string.
   *
   * @static
   *
   * @example
   *
   *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);
   */
  stringify(cipherParams) {
    return cipherParams.ciphertext.toString(Hex);
  },
  /**
   * Converts a hexadecimally encoded ciphertext string to a cipher params object.
   *
   * @param {string} input The hexadecimally encoded string.
   *
   * @return {CipherParams} The cipher params object.
   *
   * @static
   *
   * @example
   *
   *     var cipherParams = CryptoJS.format.Hex.parse(hexString);
   */
  parse(input) {
    const ciphertext = Hex.parse(input);
    return CipherParams.create({ ciphertext });
  },
};
vf107/dxmodules/crypto-es/hmac.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
export {
  HMAC,
} from './core.js';
vf107/dxmodules/crypto-es/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,180 @@
import {
  Base,
  WordArray,
  Hex,
  Latin1,
  Utf8,
  BufferedBlockAlgorithm,
  Hasher,
} from './core.js';
import {
  X64Word,
  X64WordArray,
} from './x64-core.js';
import {
  Cipher,
  StreamCipher,
  BlockCipherMode,
  CBC,
  Pkcs7,
  BlockCipher,
  CipherParams,
  OpenSSLFormatter,
  SerializableCipher,
  OpenSSLKdf,
  PasswordBasedCipher,
} from './cipher-core.js';
import { Utf16, Utf16BE, Utf16LE } from './enc-utf16.js';
import { Base64 } from './enc-base64.js';
import { Base64url } from './enc-base64url.js';
import { HMAC } from './hmac.js';
import { MD5Algo, MD5, HmacMD5 } from './md5.js';
import { SHA1Algo, SHA1, HmacSHA1 } from './sha1.js';
import { SHA224Algo, SHA224, HmacSHA224 } from './sha224.js';
import { SHA256Algo, SHA256, HmacSHA256 } from './sha256.js';
import { SHA384Algo, SHA384, HmacSHA384 } from './sha384.js';
import { SHA512Algo, SHA512, HmacSHA512 } from './sha512.js';
import { SHA3Algo, SHA3, HmacSHA3 } from './sha3.js';
import { RIPEMD160Algo, RIPEMD160, HmacRIPEMD160 } from './ripemd160.js';
import { PBKDF2Algo, PBKDF2 } from './pbkdf2.js';
import { EvpKDFAlgo, EvpKDF } from './evpkdf.js';
import { AESAlgo, AES } from './aes.js';
import {
  DESAlgo,
  DES,
  TripleDESAlgo,
  TripleDES,
} from './tripledes.js';
import { RabbitAlgo, Rabbit } from './rabbit.js';
import { RabbitLegacyAlgo, RabbitLegacy } from './rabbit-legacy.js';
import {
  RC4Algo,
  RC4,
  RC4DropAlgo,
  RC4Drop,
} from './rc4.js';
import { BlowfishAlgo, Blowfish } from './blowfish.js';
import { CFB } from './mode-cfb.js';
import { CTR } from './mode-ctr.js';
import { CTRGladman } from './mode-ctr-gladman.js';
import { ECB } from './mode-ecb.js';
import { OFB } from './mode-ofb.js';
import { AnsiX923 } from './pad-ansix923.js';
import { Iso10126 } from './pad-iso10126.js';
import { Iso97971 } from './pad-iso97971.js';
import { NoPadding } from './pad-nopadding.js';
import { ZeroPadding } from './pad-zeropadding.js';
import { HexFormatter } from './format-hex.js';
export default {
  lib: {
    Base,
    WordArray,
    BufferedBlockAlgorithm,
    Hasher,
    Cipher,
    StreamCipher,
    BlockCipherMode,
    BlockCipher,
    CipherParams,
    SerializableCipher,
    PasswordBasedCipher,
  },
  x64: {
    Word: X64Word,
    WordArray: X64WordArray,
  },
  enc: {
    Hex,
    Latin1,
    Utf8,
    Utf16,
    Utf16BE,
    Utf16LE,
    Base64,
    Base64url,
  },
  algo: {
    HMAC,
    MD5: MD5Algo,
    SHA1: SHA1Algo,
    SHA224: SHA224Algo,
    SHA256: SHA256Algo,
    SHA384: SHA384Algo,
    SHA512: SHA512Algo,
    SHA3: SHA3Algo,
    RIPEMD160: RIPEMD160Algo,
    PBKDF2: PBKDF2Algo,
    EvpKDF: EvpKDFAlgo,
    AES: AESAlgo,
    DES: DESAlgo,
    TripleDES: TripleDESAlgo,
    Rabbit: RabbitAlgo,
    RabbitLegacy: RabbitLegacyAlgo,
    RC4: RC4Algo,
    RC4Drop: RC4DropAlgo,
    Blowfish: BlowfishAlgo,
  },
  mode: {
    CBC,
    CFB,
    CTR,
    CTRGladman,
    ECB,
    OFB,
  },
  pad: {
    Pkcs7,
    AnsiX923,
    Iso10126,
    Iso97971,
    NoPadding,
    ZeroPadding,
  },
  format: {
    OpenSSL: OpenSSLFormatter,
    Hex: HexFormatter,
  },
  kdf: {
    OpenSSL: OpenSSLKdf,
  },
  MD5,
  HmacMD5,
  SHA1,
  HmacSHA1,
  SHA224,
  HmacSHA224,
  SHA256,
  HmacSHA256,
  SHA384,
  HmacSHA384,
  SHA512,
  HmacSHA512,
  SHA3,
  HmacSHA3,
  RIPEMD160,
  HmacRIPEMD160,
  PBKDF2,
  EvpKDF,
  AES,
  DES,
  TripleDES,
  Rabbit,
  RabbitLegacy,
  RC4,
  RC4Drop,
  Blowfish,
};
vf107/dxmodules/crypto-es/md5.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,247 @@
import {
  WordArray,
  Hasher,
} from './core.js';
// Constants table
const T = [];
// Compute constants
for (let i = 0; i < 64; i += 1) {
  T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
}
const FF = (a, b, c, d, x, s, t) => {
  const n = a + ((b & c) | (~b & d)) + x + t;
  return ((n << s) | (n >>> (32 - s))) + b;
};
const GG = (a, b, c, d, x, s, t) => {
  const n = a + ((b & d) | (c & ~d)) + x + t;
  return ((n << s) | (n >>> (32 - s))) + b;
};
const HH = (a, b, c, d, x, s, t) => {
  const n = a + (b ^ c ^ d) + x + t;
  return ((n << s) | (n >>> (32 - s))) + b;
};
const II = (a, b, c, d, x, s, t) => {
  const n = a + (c ^ (b | ~d)) + x + t;
  return ((n << s) | (n >>> (32 - s))) + b;
};
/**
 * MD5 hash algorithm.
 */
export class MD5Algo extends Hasher {
  _doReset() {
    this._hash = new WordArray([
      0x67452301,
      0xefcdab89,
      0x98badcfe,
      0x10325476,
    ]);
  }
  _doProcessBlock(M, offset) {
    const _M = M;
    // Swap endian
    for (let i = 0; i < 16; i += 1) {
      // Shortcuts
      const offset_i = offset + i;
      const M_offset_i = M[offset_i];
      _M[offset_i] = (
        (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff)
          | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
      );
    }
    // Shortcuts
    const H = this._hash.words;
    const M_offset_0 = _M[offset + 0];
    const M_offset_1 = _M[offset + 1];
    const M_offset_2 = _M[offset + 2];
    const M_offset_3 = _M[offset + 3];
    const M_offset_4 = _M[offset + 4];
    const M_offset_5 = _M[offset + 5];
    const M_offset_6 = _M[offset + 6];
    const M_offset_7 = _M[offset + 7];
    const M_offset_8 = _M[offset + 8];
    const M_offset_9 = _M[offset + 9];
    const M_offset_10 = _M[offset + 10];
    const M_offset_11 = _M[offset + 11];
    const M_offset_12 = _M[offset + 12];
    const M_offset_13 = _M[offset + 13];
    const M_offset_14 = _M[offset + 14];
    const M_offset_15 = _M[offset + 15];
    // Working varialbes
    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    // Computation
    a = FF(a, b, c, d, M_offset_0, 7, T[0]);
    d = FF(d, a, b, c, M_offset_1, 12, T[1]);
    c = FF(c, d, a, b, M_offset_2, 17, T[2]);
    b = FF(b, c, d, a, M_offset_3, 22, T[3]);
    a = FF(a, b, c, d, M_offset_4, 7, T[4]);
    d = FF(d, a, b, c, M_offset_5, 12, T[5]);
    c = FF(c, d, a, b, M_offset_6, 17, T[6]);
    b = FF(b, c, d, a, M_offset_7, 22, T[7]);
    a = FF(a, b, c, d, M_offset_8, 7, T[8]);
    d = FF(d, a, b, c, M_offset_9, 12, T[9]);
    c = FF(c, d, a, b, M_offset_10, 17, T[10]);
    b = FF(b, c, d, a, M_offset_11, 22, T[11]);
    a = FF(a, b, c, d, M_offset_12, 7, T[12]);
    d = FF(d, a, b, c, M_offset_13, 12, T[13]);
    c = FF(c, d, a, b, M_offset_14, 17, T[14]);
    b = FF(b, c, d, a, M_offset_15, 22, T[15]);
    a = GG(a, b, c, d, M_offset_1, 5, T[16]);
    d = GG(d, a, b, c, M_offset_6, 9, T[17]);
    c = GG(c, d, a, b, M_offset_11, 14, T[18]);
    b = GG(b, c, d, a, M_offset_0, 20, T[19]);
    a = GG(a, b, c, d, M_offset_5, 5, T[20]);
    d = GG(d, a, b, c, M_offset_10, 9, T[21]);
    c = GG(c, d, a, b, M_offset_15, 14, T[22]);
    b = GG(b, c, d, a, M_offset_4, 20, T[23]);
    a = GG(a, b, c, d, M_offset_9, 5, T[24]);
    d = GG(d, a, b, c, M_offset_14, 9, T[25]);
    c = GG(c, d, a, b, M_offset_3, 14, T[26]);
    b = GG(b, c, d, a, M_offset_8, 20, T[27]);
    a = GG(a, b, c, d, M_offset_13, 5, T[28]);
    d = GG(d, a, b, c, M_offset_2, 9, T[29]);
    c = GG(c, d, a, b, M_offset_7, 14, T[30]);
    b = GG(b, c, d, a, M_offset_12, 20, T[31]);
    a = HH(a, b, c, d, M_offset_5, 4, T[32]);
    d = HH(d, a, b, c, M_offset_8, 11, T[33]);
    c = HH(c, d, a, b, M_offset_11, 16, T[34]);
    b = HH(b, c, d, a, M_offset_14, 23, T[35]);
    a = HH(a, b, c, d, M_offset_1, 4, T[36]);
    d = HH(d, a, b, c, M_offset_4, 11, T[37]);
    c = HH(c, d, a, b, M_offset_7, 16, T[38]);
    b = HH(b, c, d, a, M_offset_10, 23, T[39]);
    a = HH(a, b, c, d, M_offset_13, 4, T[40]);
    d = HH(d, a, b, c, M_offset_0, 11, T[41]);
    c = HH(c, d, a, b, M_offset_3, 16, T[42]);
    b = HH(b, c, d, a, M_offset_6, 23, T[43]);
    a = HH(a, b, c, d, M_offset_9, 4, T[44]);
    d = HH(d, a, b, c, M_offset_12, 11, T[45]);
    c = HH(c, d, a, b, M_offset_15, 16, T[46]);
    b = HH(b, c, d, a, M_offset_2, 23, T[47]);
    a = II(a, b, c, d, M_offset_0, 6, T[48]);
    d = II(d, a, b, c, M_offset_7, 10, T[49]);
    c = II(c, d, a, b, M_offset_14, 15, T[50]);
    b = II(b, c, d, a, M_offset_5, 21, T[51]);
    a = II(a, b, c, d, M_offset_12, 6, T[52]);
    d = II(d, a, b, c, M_offset_3, 10, T[53]);
    c = II(c, d, a, b, M_offset_10, 15, T[54]);
    b = II(b, c, d, a, M_offset_1, 21, T[55]);
    a = II(a, b, c, d, M_offset_8, 6, T[56]);
    d = II(d, a, b, c, M_offset_15, 10, T[57]);
    c = II(c, d, a, b, M_offset_6, 15, T[58]);
    b = II(b, c, d, a, M_offset_13, 21, T[59]);
    a = II(a, b, c, d, M_offset_4, 6, T[60]);
    d = II(d, a, b, c, M_offset_11, 10, T[61]);
    c = II(c, d, a, b, M_offset_2, 15, T[62]);
    b = II(b, c, d, a, M_offset_9, 21, T[63]);
    // Intermediate hash value
    H[0] = (H[0] + a) | 0;
    H[1] = (H[1] + b) | 0;
    H[2] = (H[2] + c) | 0;
    H[3] = (H[3] + d) | 0;
  }
  /* eslint-ensable no-param-reassign */
  _doFinalize() {
    // Shortcuts
    const data = this._data;
    const dataWords = data.words;
    const nBitsTotal = this._nDataBytes * 8;
    const nBitsLeft = data.sigBytes * 8;
    // Add padding
    dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));
    const nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
    const nBitsTotalL = nBitsTotal;
    dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
      (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff)
        | (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
    );
    dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
      (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff)
        | (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
    );
    data.sigBytes = (dataWords.length + 1) * 4;
    // Hash final blocks
    this._process();
    // Shortcuts
    const hash = this._hash;
    const H = hash.words;
    // Swap endian
    for (let i = 0; i < 4; i += 1) {
      // Shortcut
      const H_i = H[i];
      H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff)
        | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
    }
    // Return final computed hash
    return hash;
  }
  clone() {
    const clone = super.clone.call(this);
    clone._hash = this._hash.clone();
    return clone;
  }
}
/**
 * Shortcut function to the hasher's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 *
 * @return {WordArray} The hash.
 *
 * @static
 *
 * @example
 *
 *     var hash = CryptoJS.MD5('message');
 *     var hash = CryptoJS.MD5(wordArray);
 */
export const MD5 = Hasher._createHelper(MD5Algo);
/**
 * Shortcut function to the HMAC's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 * @param {WordArray|string} key The secret key.
 *
 * @return {WordArray} The HMAC.
 *
 * @static
 *
 * @example
 *
 *     var hmac = CryptoJS.HmacMD5(message, key);
 */
export const HmacMD5 = Hasher._createHmacHelper(MD5Algo);
vf107/dxmodules/crypto-es/mode-cfb.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
import {
  BlockCipherMode,
} from './cipher-core.js';
function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
  const _words = words;
  let keystream;
  // Shortcut
  const iv = this._iv;
  // Generate keystream
  if (iv) {
    keystream = iv.slice(0);
    // Remove IV for subsequent blocks
    this._iv = undefined;
  } else {
    keystream = this._prevBlock;
  }
  cipher.encryptBlock(keystream, 0);
  // Encrypt
  for (let i = 0; i < blockSize; i += 1) {
    _words[offset + i] ^= keystream[i];
  }
}
/**
 * Cipher Feedback block mode.
 */
export class CFB extends BlockCipherMode {
}
CFB.Encryptor = class extends CFB {
  processBlock(words, offset) {
    // Shortcuts
    const cipher = this._cipher;
    const { blockSize } = cipher;
    generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
    // Remember this block to use with next block
    this._prevBlock = words.slice(offset, offset + blockSize);
  }
};
CFB.Decryptor = class extends CFB {
  processBlock(words, offset) {
    // Shortcuts
    const cipher = this._cipher;
    const { blockSize } = cipher;
    // Remember this block to use with next block
    const thisBlock = words.slice(offset, offset + blockSize);
    generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
    // This block becomes the previous block
    this._prevBlock = thisBlock;
  }
};
vf107/dxmodules/crypto-es/mode-ctr-gladman.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
import {
  BlockCipherMode,
} from './cipher-core.js';
const incWord = (word) => {
  let _word = word;
  if (((word >> 24) & 0xff) === 0xff) { // overflow
    let b1 = (word >> 16) & 0xff;
    let b2 = (word >> 8) & 0xff;
    let b3 = word & 0xff;
    if (b1 === 0xff) { // overflow b1
      b1 = 0;
      if (b2 === 0xff) {
        b2 = 0;
        if (b3 === 0xff) {
          b3 = 0;
        } else {
          b3 += 1;
        }
      } else {
        b2 += 1;
      }
    } else {
      b1 += 1;
    }
    _word = 0;
    _word += (b1 << 16);
    _word += (b2 << 8);
    _word += b3;
  } else {
    _word += (0x01 << 24);
  }
  return _word;
};
const incCounter = (counter) => {
  const _counter = counter;
  _counter[0] = incWord(_counter[0]);
  if (_counter[0] === 0) {
    // encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8
    _counter[1] = incWord(_counter[1]);
  }
  return _counter;
};
/** @preserve
 * Counter block mode compatible with  Dr Brian Gladman fileenc.c
 * derived from CryptoJS.mode.CTR
 * Jan Hruby jhruby.web@gmail.com
 */
export class CTRGladman extends BlockCipherMode {
}
CTRGladman.Encryptor = class extends CTRGladman {
  processBlock(words, offset) {
    const _words = words;
    // Shortcuts
    const cipher = this._cipher;
    const { blockSize } = cipher;
    const iv = this._iv;
    let counter = this._counter;
    // Generate keystream
    if (iv) {
      this._counter = iv.slice(0);
      counter = this._counter;
      // Remove IV for subsequent blocks
      this._iv = undefined;
    }
    incCounter(counter);
    const keystream = counter.slice(0);
    cipher.encryptBlock(keystream, 0);
    // Encrypt
    for (let i = 0; i < blockSize; i += 1) {
      _words[offset + i] ^= keystream[i];
    }
  }
};
CTRGladman.Decryptor = CTRGladman.Encryptor;
vf107/dxmodules/crypto-es/mode-ctr.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
import {
  BlockCipherMode,
} from './cipher-core.js';
/**
 * Counter block mode.
 */
export class CTR extends BlockCipherMode {
}
CTR.Encryptor = class extends CTR {
  processBlock(words, offset) {
    const _words = words;
    // Shortcuts
    const cipher = this._cipher;
    const { blockSize } = cipher;
    const iv = this._iv;
    let counter = this._counter;
    // Generate keystream
    if (iv) {
      this._counter = iv.slice(0);
      counter = this._counter;
      // Remove IV for subsequent blocks
      this._iv = undefined;
    }
    const keystream = counter.slice(0);
    cipher.encryptBlock(keystream, 0);
    // Increment counter
    counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0;
    // Encrypt
    for (let i = 0; i < blockSize; i += 1) {
      _words[offset + i] ^= keystream[i];
    }
  }
};
CTR.Decryptor = CTR.Encryptor;
vf107/dxmodules/crypto-es/mode-ecb.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
import {
  BlockCipherMode,
} from './cipher-core.js';
/**
 * Electronic Codebook block mode.
 */
export class ECB extends BlockCipherMode {
}
ECB.Encryptor = class extends ECB {
  processBlock(words, offset) {
    this._cipher.encryptBlock(words, offset);
  }
};
ECB.Decryptor = class extends ECB {
  processBlock(words, offset) {
    this._cipher.decryptBlock(words, offset);
  }
};
vf107/dxmodules/crypto-es/mode-ofb.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
import {
  BlockCipherMode,
} from './cipher-core.js';
/**
 * Output Feedback block mode.
 */
export class OFB extends BlockCipherMode {
}
OFB.Encryptor = class extends OFB {
  processBlock(words, offset) {
    const _words = words;
    // Shortcuts
    const cipher = this._cipher;
    const { blockSize } = cipher;
    const iv = this._iv;
    let keystream = this._keystream;
    // Generate keystream
    if (iv) {
      this._keystream = iv.slice(0);
      keystream = this._keystream;
      // Remove IV for subsequent blocks
      this._iv = undefined;
    }
    cipher.encryptBlock(keystream, 0);
    // Encrypt
    for (let i = 0; i < blockSize; i += 1) {
      _words[offset + i] ^= keystream[i];
    }
  }
};
OFB.Decryptor = OFB.Encryptor;
vf107/dxmodules/crypto-es/pad-ansix923.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
/**
 * ANSI X.923 padding strategy.
 */
export const AnsiX923 = {
  pad(data, blockSize) {
    const _data = data;
    // Shortcuts
    const dataSigBytes = _data.sigBytes;
    const blockSizeBytes = blockSize * 4;
    // Count padding bytes
    const nPaddingBytes = blockSizeBytes - (dataSigBytes % blockSizeBytes);
    // Compute last byte position
    const lastBytePos = dataSigBytes + nPaddingBytes - 1;
    // Pad
    _data.clamp();
    _data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
    _data.sigBytes += nPaddingBytes;
  },
  unpad(data) {
    const _data = data;
    // Get number of padding bytes from last byte
    const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;
    // Remove padding
    _data.sigBytes -= nPaddingBytes;
  },
};
vf107/dxmodules/crypto-es/pad-iso10126.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
import {
  WordArray,
} from './core.js';
/**
 * ISO 10126 padding strategy.
 */
export const Iso10126 = {
  pad(data, blockSize) {
    // Shortcut
    const blockSizeBytes = blockSize * 4;
    // Count padding bytes
    const nPaddingBytes = blockSizeBytes - (data.sigBytes % blockSizeBytes);
    // Pad
    data
      .concat(WordArray.random(nPaddingBytes - 1))
      .concat(WordArray.create([nPaddingBytes << 24], 1));
  },
  unpad(data) {
    const _data = data;
    // Get number of padding bytes from last byte
    const nPaddingBytes = _data.words[(_data.sigBytes - 1) >>> 2] & 0xff;
    // Remove padding
    _data.sigBytes -= nPaddingBytes;
  },
};
vf107/dxmodules/crypto-es/pad-iso97971.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
import {
  WordArray,
} from './core.js';
import {
  ZeroPadding,
} from './pad-zeropadding.js';
/**
 * ISO/IEC 9797-1 Padding Method 2.
 */
export const Iso97971 = {
  pad(data, blockSize) {
    // Add 0x80 byte
    data.concat(WordArray.create([0x80000000], 1));
    // Zero pad the rest
    ZeroPadding.pad(data, blockSize);
  },
  unpad(data) {
    const _data = data;
    // Remove zero padding
    ZeroPadding.unpad(_data);
    // Remove one more byte -- the 0x80 byte
    _data.sigBytes -= 1;
  },
};
vf107/dxmodules/crypto-es/pad-nopadding.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
/**
 * A noop padding strategy.
 */
export const NoPadding = {
  pad() {
  },
  unpad() {
  },
};
vf107/dxmodules/crypto-es/pad-zeropadding.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
/**
 * Zero padding strategy.
 */
export const ZeroPadding = {
  pad(data, blockSize) {
    const _data = data;
    // Shortcut
    const blockSizeBytes = blockSize * 4;
    // Pad
    _data.clamp();
    _data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
  },
  unpad(data) {
    const _data = data;
    // Shortcut
    const dataWords = _data.words;
    // Unpad
    for (let i = _data.sigBytes - 1; i >= 0; i -= 1) {
      if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
        _data.sigBytes = i + 1;
        break;
      }
    }
  },
};
vf107/dxmodules/crypto-es/pbkdf2.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
import {
  Base,
  WordArray,
} from './core.js';
import { SHA256Algo } from './sha256.js';
import { HMAC } from './hmac.js';
/**
 * Password-Based Key Derivation Function 2 algorithm.
 */
export class PBKDF2Algo extends Base {
  /**
   * Initializes a newly created key derivation function.
   *
   * @param {Object} cfg (Optional) The configuration options to use for the derivation.
   *
   * @example
   *
   *     const kdf = CryptoJS.algo.PBKDF2.create();
   *     const kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
   *     const kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
   */
  constructor(cfg) {
    super();
    /**
     * Configuration options.
     *
     * The default `hasher` and `interations` is different from CryptoJs to enhance security:
     * https://github.com/entronad/crypto-es/security/advisories/GHSA-mpj8-q39x-wq5h
     *
     * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
     * @property {Hasher} hasher The hasher to use. Default: SHA256
     * @property {number} iterations The number of iterations to perform. Default: 250000
     */
    this.cfg = Object.assign(
      new Base(),
      {
        keySize: 128 / 32,
        hasher: SHA256Algo,
        iterations: 250000,
      },
      cfg,
    );
  }
  /**
   * Computes the Password-Based Key Derivation Function 2.
   *
   * @param {WordArray|string} password The password.
   * @param {WordArray|string} salt A salt.
   *
   * @return {WordArray} The derived key.
   *
   * @example
   *
   *     const key = kdf.compute(password, salt);
   */
  compute(password, salt) {
    // Shortcut
    const { cfg } = this;
    // Init HMAC
    const hmac = HMAC.create(cfg.hasher, password);
    // Initial values
    const derivedKey = WordArray.create();
    const blockIndex = WordArray.create([0x00000001]);
    // Shortcuts
    const derivedKeyWords = derivedKey.words;
    const blockIndexWords = blockIndex.words;
    const { keySize, iterations } = cfg;
    // Generate key
    while (derivedKeyWords.length < keySize) {
      const block = hmac.update(salt).finalize(blockIndex);
      hmac.reset();
      // Shortcuts
      const blockWords = block.words;
      const blockWordsLength = blockWords.length;
      // Iterations
      let intermediate = block;
      for (let i = 1; i < iterations; i += 1) {
        intermediate = hmac.finalize(intermediate);
        hmac.reset();
        // Shortcut
        const intermediateWords = intermediate.words;
        // XOR intermediate with block
        for (let j = 0; j < blockWordsLength; j += 1) {
          blockWords[j] ^= intermediateWords[j];
        }
      }
      derivedKey.concat(block);
      blockIndexWords[0] += 1;
    }
    derivedKey.sigBytes = keySize * 4;
    return derivedKey;
  }
}
/**
 * Computes the Password-Based Key Derivation Function 2.
 *
 * @param {WordArray|string} password The password.
 * @param {WordArray|string} salt A salt.
 * @param {Object} cfg (Optional) The configuration options to use for this computation.
 *
 * @return {WordArray} The derived key.
 *
 * @static
 *
 * @example
 *
 *     var key = CryptoJS.PBKDF2(password, salt);
 *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
 *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
 */
export const PBKDF2 = (password, salt, cfg) => PBKDF2Algo.create(cfg).compute(password, salt);
vf107/dxmodules/crypto-es/rabbit-legacy.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,175 @@
import {
  StreamCipher,
} from './cipher-core.js';
// Reusable objects
const S = [];
const C_ = [];
const G = [];
function nextState() {
  // Shortcuts
  const X = this._X;
  const C = this._C;
  // Save old counter values
  for (let i = 0; i < 8; i += 1) {
    C_[i] = C[i];
  }
  // Calculate new counter values
  C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
  C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
  C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
  C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
  C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
  C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
  C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
  C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
  this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
  // Calculate the g-values
  for (let i = 0; i < 8; i += 1) {
    const gx = X[i] + C[i];
    // Construct high and low argument for squaring
    const ga = gx & 0xffff;
    const gb = gx >>> 16;
    // Calculate high and low result of squaring
    const gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
    const gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
    // High XOR low
    G[i] = gh ^ gl;
  }
  // Calculate new state values
  X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
  X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
  X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
  X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
  X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
  X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
  X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
  X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
}
/**
 * Rabbit stream cipher algorithm.
 *
 * This is a legacy version that neglected to convert the key to little-endian.
 * This error doesn't affect the cipher's security,
 * but it does affect its compatibility with other implementations.
 */
export class RabbitLegacyAlgo extends StreamCipher {
  constructor(...args) {
    super(...args);
    this.blockSize = 128 / 32;
    this.ivSize = 64 / 32;
  }
  _doReset() {
    // Shortcuts
    const K = this._key.words;
    const { iv } = this.cfg;
    // Generate initial state values
    this._X = [
      K[0], (K[3] << 16) | (K[2] >>> 16),
      K[1], (K[0] << 16) | (K[3] >>> 16),
      K[2], (K[1] << 16) | (K[0] >>> 16),
      K[3], (K[2] << 16) | (K[1] >>> 16),
    ];
    const X = this._X;
    // Generate initial counter values
    this._C = [
      (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
      (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
      (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
      (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff),
    ];
    const C = this._C;
    // Carry bit
    this._b = 0;
    // Iterate the system four times
    for (let i = 0; i < 4; i += 1) {
      nextState.call(this);
    }
    // Modify the counters
    for (let i = 0; i < 8; i += 1) {
      C[i] ^= X[(i + 4) & 7];
    }
    // IV setup
    if (iv) {
      // Shortcuts
      const IV = iv.words;
      const IV_0 = IV[0];
      const IV_1 = IV[1];
      // Generate four subvectors
      const i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff)
        | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
      const i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff)
        | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
      const i1 = (i0 >>> 16) | (i2 & 0xffff0000);
      const i3 = (i2 << 16) | (i0 & 0x0000ffff);
      // Modify counter values
      C[0] ^= i0;
      C[1] ^= i1;
      C[2] ^= i2;
      C[3] ^= i3;
      C[4] ^= i0;
      C[5] ^= i1;
      C[6] ^= i2;
      C[7] ^= i3;
      // Iterate the system four times
      for (let i = 0; i < 4; i += 1) {
        nextState.call(this);
      }
    }
  }
  _doProcessBlock(M, offset) {
    const _M = M;
    // Shortcut
    const X = this._X;
    // Iterate the system
    nextState.call(this);
    // Generate four keystream words
    S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
    S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
    S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
    S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
    for (let i = 0; i < 4; i += 1) {
      // Swap endian
      S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff)
        | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
      // Encrypt
      _M[offset + i] ^= S[i];
    }
  }
}
/**
 * Shortcut functions to the cipher's object interface.
 *
 * @example
 *
 *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
 *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
 */
export const RabbitLegacy = StreamCipher._createHelper(RabbitLegacyAlgo);
vf107/dxmodules/crypto-es/rabbit.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,177 @@
import {
  StreamCipher,
} from './cipher-core.js';
// Reusable objects
const S = [];
const C_ = [];
const G = [];
function nextState() {
  // Shortcuts
  const X = this._X;
  const C = this._C;
  // Save old counter values
  for (let i = 0; i < 8; i += 1) {
    C_[i] = C[i];
  }
  // Calculate new counter values
  C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
  C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
  C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
  C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
  C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
  C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
  C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
  C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
  this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
  // Calculate the g-values
  for (let i = 0; i < 8; i += 1) {
    const gx = X[i] + C[i];
    // Construct high and low argument for squaring
    const ga = gx & 0xffff;
    const gb = gx >>> 16;
    // Calculate high and low result of squaring
    const gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
    const gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
    // High XOR low
    G[i] = gh ^ gl;
  }
  // Calculate new state values
  X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
  X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
  X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
  X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
  X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
  X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
  X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
  X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
}
/**
 * Rabbit stream cipher algorithm
 */
export class RabbitAlgo extends StreamCipher {
  constructor(...args) {
    super(...args);
    this.blockSize = 128 / 32;
    this.ivSize = 64 / 32;
  }
  _doReset() {
    // Shortcuts
    const K = this._key.words;
    const { iv } = this.cfg;
    // Swap endian
    for (let i = 0; i < 4; i += 1) {
      K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff)
        | (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);
    }
    // Generate initial state values
    this._X = [
      K[0], (K[3] << 16) | (K[2] >>> 16),
      K[1], (K[0] << 16) | (K[3] >>> 16),
      K[2], (K[1] << 16) | (K[0] >>> 16),
      K[3], (K[2] << 16) | (K[1] >>> 16),
    ];
    const X = this._X;
    // Generate initial counter values
    this._C = [
      (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
      (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
      (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
      (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff),
    ];
    const C = this._C;
    // Carry bit
    this._b = 0;
    // Iterate the system four times
    for (let i = 0; i < 4; i += 1) {
      nextState.call(this);
    }
    // Modify the counters
    for (let i = 0; i < 8; i += 1) {
      C[i] ^= X[(i + 4) & 7];
    }
    // IV setup
    if (iv) {
      // Shortcuts
      const IV = iv.words;
      const IV_0 = IV[0];
      const IV_1 = IV[1];
      // Generate four subvectors
      const i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff)
        | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
      const i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff)
        | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
      const i1 = (i0 >>> 16) | (i2 & 0xffff0000);
      const i3 = (i2 << 16) | (i0 & 0x0000ffff);
      // Modify counter values
      C[0] ^= i0;
      C[1] ^= i1;
      C[2] ^= i2;
      C[3] ^= i3;
      C[4] ^= i0;
      C[5] ^= i1;
      C[6] ^= i2;
      C[7] ^= i3;
      // Iterate the system four times
      for (let i = 0; i < 4; i += 1) {
        nextState.call(this);
      }
    }
  }
  _doProcessBlock(M, offset) {
    const _M = M;
    // Shortcut
    const X = this._X;
    // Iterate the system
    nextState.call(this);
    // Generate four keystream words
    S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
    S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
    S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
    S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
    for (let i = 0; i < 4; i += 1) {
      // Swap endian
      S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff)
        | (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
      // Encrypt
      _M[offset + i] ^= S[i];
    }
  }
}
/**
 * Shortcut functions to the cipher's object interface.
 *
 * @example
 *
 *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
 *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
 */
export const Rabbit = StreamCipher._createHelper(RabbitAlgo);
vf107/dxmodules/crypto-es/rc4.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
import {
  StreamCipher,
} from './cipher-core.js';
function generateKeystreamWord() {
  // Shortcuts
  const S = this._S;
  let i = this._i;
  let j = this._j;
  // Generate keystream word
  let keystreamWord = 0;
  for (let n = 0; n < 4; n += 1) {
    i = (i + 1) % 256;
    j = (j + S[i]) % 256;
    // Swap
    const t = S[i];
    S[i] = S[j];
    S[j] = t;
    keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
  }
  // Update counters
  this._i = i;
  this._j = j;
  return keystreamWord;
}
/**
 * RC4 stream cipher algorithm.
 */
export class RC4Algo extends StreamCipher {
  _doReset() {
    // Shortcuts
    const key = this._key;
    const keyWords = key.words;
    const keySigBytes = key.sigBytes;
    // Init sbox
    this._S = [];
    const S = this._S;
    for (let i = 0; i < 256; i += 1) {
      S[i] = i;
    }
    // Key setup
    for (let i = 0, j = 0; i < 256; i += 1) {
      const keyByteIndex = i % keySigBytes;
      const keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
      j = (j + S[i] + keyByte) % 256;
      // Swap
      const t = S[i];
      S[i] = S[j];
      S[j] = t;
    }
    // Counters
    this._j = 0;
    this._i = this._j;
  }
  _doProcessBlock(M, offset) {
    const _M = M;
    _M[offset] ^= generateKeystreamWord.call(this);
  }
}
RC4Algo.keySize = 256 / 32;
RC4Algo.ivSize = 0;
/**
 * Shortcut functions to the cipher's object interface.
 *
 * @example
 *
 *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
 *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
 */
export const RC4 = StreamCipher._createHelper(RC4Algo);
/**
 * Modified RC4 stream cipher algorithm.
 */
export class RC4DropAlgo extends RC4Algo {
  constructor(...args) {
    super(...args);
    /**
     * Configuration options.
     *
     * @property {number} drop The number of keystream words to drop. Default 192
     */
    Object.assign(this.cfg, { drop: 192 });
  }
  _doReset() {
    super._doReset.call(this);
    // Drop
    for (let i = this.cfg.drop; i > 0; i -= 1) {
      generateKeystreamWord.call(this);
    }
  }
}
/**
 * Shortcut functions to the cipher's object interface.
 *
 * @example
 *
 *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
 *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
 */
export const RC4Drop = StreamCipher._createHelper(RC4DropAlgo);
vf107/dxmodules/crypto-es/ripemd160.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,242 @@
/** @preserve
(c) 2012 by Cédric Mesnil. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted
provided that the following conditions are met:
    - Redistributions of source code must retain the above copyright notice, this list of
    conditions and the following disclaimer.
    - Redistributions in binary form must reproduce the above copyright notice, this list
    of conditions and the following disclaimer in the documentation and/or other materials
    provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import {
  WordArray,
  Hasher,
} from './core.js';
// Constants table
const _zl = WordArray.create([
  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
  3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
  1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
  4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
const _zr = WordArray.create([
  5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
  6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
  15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
  8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
  12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
const _sl = WordArray.create([
  11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
  7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
  11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
  11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
  9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]);
const _sr = WordArray.create([
  8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
  9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
  9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
  15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
  8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]);
const _hl = WordArray.create([0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
const _hr = WordArray.create([0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
const f1 = (x, y, z) => (x) ^ (y) ^ (z);
const f2 = (x, y, z) => ((x) & (y)) | ((~x) & (z));
const f3 = (x, y, z) => ((x) | (~(y))) ^ (z);
const f4 = (x, y, z) => ((x) & (z)) | ((y) & (~(z)));
const f5 = (x, y, z) => (x) ^ ((y) | (~(z)));
const rotl = (x, n) => (x << n) | (x >>> (32 - n));
/**
 * RIPEMD160 hash algorithm.
 */
export class RIPEMD160Algo extends Hasher {
  _doReset() {
    this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
  }
  _doProcessBlock(M, offset) {
    const _M = M;
    // Swap endian
    for (let i = 0; i < 16; i += 1) {
      // Shortcuts
      const offset_i = offset + i;
      const M_offset_i = _M[offset_i];
      // Swap
      _M[offset_i] = (
        (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff)
          | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
      );
    }
    // Shortcut
    const H = this._hash.words;
    const hl = _hl.words;
    const hr = _hr.words;
    const zl = _zl.words;
    const zr = _zr.words;
    const sl = _sl.words;
    const sr = _sr.words;
    // Working variables
    let al = H[0];
    let bl = H[1];
    let cl = H[2];
    let dl = H[3];
    let el = H[4];
    let ar = H[0];
    let br = H[1];
    let cr = H[2];
    let dr = H[3];
    let er = H[4];
    // Computation
    let t;
    for (let i = 0; i < 80; i += 1) {
      t = (al + _M[offset + zl[i]]) | 0;
      if (i < 16) {
        t += f1(bl, cl, dl) + hl[0];
      } else if (i < 32) {
        t += f2(bl, cl, dl) + hl[1];
      } else if (i < 48) {
        t += f3(bl, cl, dl) + hl[2];
      } else if (i < 64) {
        t += f4(bl, cl, dl) + hl[3];
      } else { // if (i<80) {
        t += f5(bl, cl, dl) + hl[4];
      }
      t |= 0;
      t = rotl(t, sl[i]);
      t = (t + el) | 0;
      al = el;
      el = dl;
      dl = rotl(cl, 10);
      cl = bl;
      bl = t;
      t = (ar + _M[offset + zr[i]]) | 0;
      if (i < 16) {
        t += f5(br, cr, dr) + hr[0];
      } else if (i < 32) {
        t += f4(br, cr, dr) + hr[1];
      } else if (i < 48) {
        t += f3(br, cr, dr) + hr[2];
      } else if (i < 64) {
        t += f2(br, cr, dr) + hr[3];
      } else { // if (i<80) {
        t += f1(br, cr, dr) + hr[4];
      }
      t |= 0;
      t = rotl(t, sr[i]);
      t = (t + er) | 0;
      ar = er;
      er = dr;
      dr = rotl(cr, 10);
      cr = br;
      br = t;
    }
    // Intermediate hash value
    t = (H[1] + cl + dr) | 0;
    H[1] = (H[2] + dl + er) | 0;
    H[2] = (H[3] + el + ar) | 0;
    H[3] = (H[4] + al + br) | 0;
    H[4] = (H[0] + bl + cr) | 0;
    H[0] = t;
  }
  _doFinalize() {
    // Shortcuts
    const data = this._data;
    const dataWords = data.words;
    const nBitsTotal = this._nDataBytes * 8;
    const nBitsLeft = data.sigBytes * 8;
    // Add padding
    dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));
    dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
      (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff)
        | (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)
    );
    data.sigBytes = (dataWords.length + 1) * 4;
    // Hash final blocks
    this._process();
    // Shortcuts
    const hash = this._hash;
    const H = hash.words;
    // Swap endian
    for (let i = 0; i < 5; i += 1) {
      // Shortcut
      const H_i = H[i];
      // Swap
      H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff)
        | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
    }
    // Return final computed hash
    return hash;
  }
  clone() {
    const clone = super.clone.call(this);
    clone._hash = this._hash.clone();
    return clone;
  }
}
/**
 * Shortcut function to the hasher's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 *
 * @return {WordArray} The hash.
 *
 * @static
 *
 * @example
 *
 *     var hash = CryptoJS.RIPEMD160('message');
 *     var hash = CryptoJS.RIPEMD160(wordArray);
 */
export const RIPEMD160 = Hasher._createHelper(RIPEMD160Algo);
/**
 * Shortcut function to the HMAC's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 * @param {WordArray|string} key The secret key.
 *
 * @return {WordArray} The HMAC.
 *
 * @static
 *
 * @example
 *
 *     var hmac = CryptoJS.HmacRIPEMD160(message, key);
 */
export const HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160Algo);
vf107/dxmodules/crypto-es/sha1.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
import {
  WordArray,
  Hasher,
} from './core.js';
// Reusable object
const W = [];
/**
 * SHA-1 hash algorithm.
 */
export class SHA1Algo extends Hasher {
  _doReset() {
    this._hash = new WordArray([
      0x67452301,
      0xefcdab89,
      0x98badcfe,
      0x10325476,
      0xc3d2e1f0,
    ]);
  }
  _doProcessBlock(M, offset) {
    // Shortcut
    const H = this._hash.words;
    // Working variables
    let a = H[0];
    let b = H[1];
    let c = H[2];
    let d = H[3];
    let e = H[4];
    // Computation
    for (let i = 0; i < 80; i += 1) {
      if (i < 16) {
        W[i] = M[offset + i] | 0;
      } else {
        const n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
        W[i] = (n << 1) | (n >>> 31);
      }
      let t = ((a << 5) | (a >>> 27)) + e + W[i];
      if (i < 20) {
        t += ((b & c) | (~b & d)) + 0x5a827999;
      } else if (i < 40) {
        t += (b ^ c ^ d) + 0x6ed9eba1;
      } else if (i < 60) {
        t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
      } else /* if (i < 80) */ {
        t += (b ^ c ^ d) - 0x359d3e2a;
      }
      e = d;
      d = c;
      c = (b << 30) | (b >>> 2);
      b = a;
      a = t;
    }
    // Intermediate hash value
    H[0] = (H[0] + a) | 0;
    H[1] = (H[1] + b) | 0;
    H[2] = (H[2] + c) | 0;
    H[3] = (H[3] + d) | 0;
    H[4] = (H[4] + e) | 0;
  }
  _doFinalize() {
    // Shortcuts
    const data = this._data;
    const dataWords = data.words;
    const nBitsTotal = this._nDataBytes * 8;
    const nBitsLeft = data.sigBytes * 8;
    // Add padding
    dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));
    dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
    dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
    data.sigBytes = dataWords.length * 4;
    // Hash final blocks
    this._process();
    // Return final computed hash
    return this._hash;
  }
  clone() {
    const clone = super.clone.call(this);
    clone._hash = this._hash.clone();
    return clone;
  }
}
/**
 * Shortcut function to the hasher's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 *
 * @return {WordArray} The hash.
 *
 * @static
 *
 * @example
 *
 *     var hash = CryptoJS.SHA1('message');
 *     var hash = CryptoJS.SHA1(wordArray);
 */
export const SHA1 = Hasher._createHelper(SHA1Algo);
/**
 * Shortcut function to the HMAC's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 * @param {WordArray|string} key The secret key.
 *
 * @return {WordArray} The HMAC.
 *
 * @static
 *
 * @example
 *
 *     var hmac = CryptoJS.HmacSHA1(message, key);
 */
export const HmacSHA1 = Hasher._createHmacHelper(SHA1Algo);
vf107/dxmodules/crypto-es/sha224.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
import { WordArray } from './core.js';
import { SHA256Algo } from './sha256.js';
/**
 * SHA-224 hash algorithm.
 */
export class SHA224Algo extends SHA256Algo {
  _doReset() {
    this._hash = new WordArray([
      0xc1059ed8,
      0x367cd507,
      0x3070dd17,
      0xf70e5939,
      0xffc00b31,
      0x68581511,
      0x64f98fa7,
      0xbefa4fa4,
    ]);
  }
  _doFinalize() {
    const hash = super._doFinalize.call(this);
    hash.sigBytes -= 4;
    return hash;
  }
}
/**
 * Shortcut function to the hasher's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 *
 * @return {WordArray} The hash.
 *
 * @static
 *
 * @example
 *
 *     var hash = CryptoJS.SHA224('message');
 *     var hash = CryptoJS.SHA224(wordArray);
 */
export const SHA224 = SHA256Algo._createHelper(SHA224Algo);
/**
 * Shortcut function to the HMAC's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 * @param {WordArray|string} key The secret key.
 *
 * @return {WordArray} The HMAC.
 *
 * @static
 *
 * @example
 *
 *     var hmac = CryptoJS.HmacSHA224(message, key);
 */
export const HmacSHA224 = SHA256Algo._createHmacHelper(SHA224Algo);
vf107/dxmodules/crypto-es/sha256.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
import {
  WordArray,
  Hasher,
} from './core.js';
// Initialization and round constants tables
const H = [];
const K = [];
// Compute constants
const isPrime = (n) => {
  const sqrtN = Math.sqrt(n);
  for (let factor = 2; factor <= sqrtN; factor += 1) {
    if (!(n % factor)) {
      return false;
    }
  }
  return true;
};
const getFractionalBits = n => ((n - (n | 0)) * 0x100000000) | 0;
let n = 2;
let nPrime = 0;
while (nPrime < 64) {
  if (isPrime(n)) {
    if (nPrime < 8) {
      H[nPrime] = getFractionalBits(n ** (1 / 2));
    }
    K[nPrime] = getFractionalBits(n ** (1 / 3));
    nPrime += 1;
  }
  n += 1;
}
// Reusable object
const W = [];
/**
 * SHA-256 hash algorithm.
 */
export class SHA256Algo extends Hasher {
  _doReset() {
    this._hash = new WordArray(H.slice(0));
  }
  _doProcessBlock(M, offset) {
    // Shortcut
    const _H = this._hash.words;
    // Working variables
    let a = _H[0];
    let b = _H[1];
    let c = _H[2];
    let d = _H[3];
    let e = _H[4];
    let f = _H[5];
    let g = _H[6];
    let h = _H[7];
    // Computation
    for (let i = 0; i < 64; i += 1) {
      if (i < 16) {
        W[i] = M[offset + i] | 0;
      } else {
        const gamma0x = W[i - 15];
        const gamma0 = ((gamma0x << 25) | (gamma0x >>> 7))
          ^ ((gamma0x << 14) | (gamma0x >>> 18))
          ^ (gamma0x >>> 3);
        const gamma1x = W[i - 2];
        const gamma1 = ((gamma1x << 15) | (gamma1x >>> 17))
          ^ ((gamma1x << 13) | (gamma1x >>> 19))
          ^ (gamma1x >>> 10);
        W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
      }
      const ch = (e & f) ^ (~e & g);
      const maj = (a & b) ^ (a & c) ^ (b & c);
      const sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
      const sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
      const t1 = h + sigma1 + ch + K[i] + W[i];
      const t2 = sigma0 + maj;
      h = g;
      g = f;
      f = e;
      e = (d + t1) | 0;
      d = c;
      c = b;
      b = a;
      a = (t1 + t2) | 0;
    }
    // Intermediate hash value
    _H[0] = (_H[0] + a) | 0;
    _H[1] = (_H[1] + b) | 0;
    _H[2] = (_H[2] + c) | 0;
    _H[3] = (_H[3] + d) | 0;
    _H[4] = (_H[4] + e) | 0;
    _H[5] = (_H[5] + f) | 0;
    _H[6] = (_H[6] + g) | 0;
    _H[7] = (_H[7] + h) | 0;
  }
  _doFinalize() {
    // Shortcuts
    const data = this._data;
    const dataWords = data.words;
    const nBitsTotal = this._nDataBytes * 8;
    const nBitsLeft = data.sigBytes * 8;
    // Add padding
    dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));
    dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
    dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
    data.sigBytes = dataWords.length * 4;
    // Hash final blocks
    this._process();
    // Return final computed hash
    return this._hash;
  }
  clone() {
    const clone = super.clone.call(this);
    clone._hash = this._hash.clone();
    return clone;
  }
}
/**
 * Shortcut function to the hasher's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 *
 * @return {WordArray} The hash.
 *
 * @static
 *
 * @example
 *
 *     var hash = CryptoJS.SHA256('message');
 *     var hash = CryptoJS.SHA256(wordArray);
 */
export const SHA256 = Hasher._createHelper(SHA256Algo);
/**
 * Shortcut function to the HMAC's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 * @param {WordArray|string} key The secret key.
 *
 * @return {WordArray} The HMAC.
 *
 * @static
 *
 * @example
 *
 *     var hmac = CryptoJS.HmacSHA256(message, key);
 */
export const HmacSHA256 = Hasher._createHmacHelper(SHA256Algo);
vf107/dxmodules/crypto-es/sha3.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,295 @@
import {
  WordArray,
  Hasher,
} from './core.js';
import { X64Word } from './x64-core.js';
// Constants tables
const RHO_OFFSETS = [];
const PI_INDEXES = [];
const ROUND_CONSTANTS = [];
// Compute Constants
// Compute rho offset constants
let _x = 1;
let _y = 0;
for (let t = 0; t < 24; t += 1) {
  RHO_OFFSETS[_x + 5 * _y] = ((t + 1) * (t + 2) / 2) % 64;
  const newX = _y % 5;
  const newY = (2 * _x + 3 * _y) % 5;
  _x = newX;
  _y = newY;
}
// Compute pi index constants
for (let x = 0; x < 5; x += 1) {
  for (let y = 0; y < 5; y += 1) {
    PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
  }
}
// Compute round constants
let LFSR = 0x01;
for (let i = 0; i < 24; i += 1) {
  let roundConstantMsw = 0;
  let roundConstantLsw = 0;
  for (let j = 0; j < 7; j += 1) {
    if (LFSR & 0x01) {
      const bitPosition = (1 << j) - 1;
      if (bitPosition < 32) {
        roundConstantLsw ^= 1 << bitPosition;
      } else /* if (bitPosition >= 32) */ {
        roundConstantMsw ^= 1 << (bitPosition - 32);
      }
    }
    // Compute next LFSR
    if (LFSR & 0x80) {
      // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
      LFSR = (LFSR << 1) ^ 0x71;
    } else {
      LFSR <<= 1;
    }
  }
  ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
}
// Reusable objects for temporary values
const T = [];
for (let i = 0; i < 25; i += 1) {
  T[i] = X64Word.create();
}
/**
 * SHA-3 hash algorithm.
 */
export class SHA3Algo extends Hasher {
  constructor(cfg) {
    /**
     * Configuration options.
     *
     * @property {number} outputLength
     *   The desired number of bits in the output hash.
     *   Only values permitted are: 224, 256, 384, 512.
     *   Default: 512
     */
    super(Object.assign(
      { outputLength: 512 },
      cfg,
    ));
  }
  _doReset() {
    this._state = [];
    const state = this._state;
    for (let i = 0; i < 25; i += 1) {
      state[i] = new X64Word();
    }
    this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
  }
  _doProcessBlock(M, offset) {
    // Shortcuts
    const state = this._state;
    const nBlockSizeLanes = this.blockSize / 2;
    // Absorb
    for (let i = 0; i < nBlockSizeLanes; i += 1) {
      // Shortcuts
      let M2i = M[offset + 2 * i];
      let M2i1 = M[offset + 2 * i + 1];
      // Swap endian
      M2i = (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff)
        | (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00);
      M2i1 = (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff)
        | (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00);
      // Absorb message into state
      const lane = state[i];
      lane.high ^= M2i1;
      lane.low ^= M2i;
    }
    // Rounds
    for (let round = 0; round < 24; round += 1) {
      // Theta
      for (let x = 0; x < 5; x += 1) {
        // Mix column lanes
        let tMsw = 0;
        let tLsw = 0;
        for (let y = 0; y < 5; y += 1) {
          const lane = state[x + 5 * y];
          tMsw ^= lane.high;
          tLsw ^= lane.low;
        }
        // Temporary values
        const Tx = T[x];
        Tx.high = tMsw;
        Tx.low = tLsw;
      }
      for (let x = 0; x < 5; x += 1) {
        // Shortcuts
        const Tx4 = T[(x + 4) % 5];
        const Tx1 = T[(x + 1) % 5];
        const Tx1Msw = Tx1.high;
        const Tx1Lsw = Tx1.low;
        // Mix surrounding columns
        const tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
        const tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
        for (let y = 0; y < 5; y += 1) {
          const lane = state[x + 5 * y];
          lane.high ^= tMsw;
          lane.low ^= tLsw;
        }
      }
      // Rho Pi
      for (let laneIndex = 1; laneIndex < 25; laneIndex += 1) {
        let tMsw;
        let tLsw;
        // Shortcuts
        const lane = state[laneIndex];
        const laneMsw = lane.high;
        const laneLsw = lane.low;
        const rhoOffset = RHO_OFFSETS[laneIndex];
        // Rotate lanes
        if (rhoOffset < 32) {
          tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
          tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
        } else /* if (rhoOffset >= 32) */ {
          tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
          tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
        }
        // Transpose lanes
        const TPiLane = T[PI_INDEXES[laneIndex]];
        TPiLane.high = tMsw;
        TPiLane.low = tLsw;
      }
      // Rho pi at x = y = 0
      const T0 = T[0];
      const state0 = state[0];
      T0.high = state0.high;
      T0.low = state0.low;
      // Chi
      for (let x = 0; x < 5; x += 1) {
        for (let y = 0; y < 5; y += 1) {
          // Shortcuts
          const laneIndex = x + 5 * y;
          const lane = state[laneIndex];
          const TLane = T[laneIndex];
          const Tx1Lane = T[((x + 1) % 5) + 5 * y];
          const Tx2Lane = T[((x + 2) % 5) + 5 * y];
          // Mix rows
          lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
          lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
        }
      }
      // Iota
      const lane = state[0];
      const roundConstant = ROUND_CONSTANTS[round];
      lane.high ^= roundConstant.high;
      lane.low ^= roundConstant.low;
    }
  }
  _doFinalize() {
    // Shortcuts
    const data = this._data;
    const dataWords = data.words;
    const nBitsLeft = data.sigBytes * 8;
    const blockSizeBits = this.blockSize * 32;
    // Add padding
    dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - (nBitsLeft % 32));
    dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
    data.sigBytes = dataWords.length * 4;
    // Hash final blocks
    this._process();
    // Shortcuts
    const state = this._state;
    const outputLengthBytes = this.cfg.outputLength / 8;
    const outputLengthLanes = outputLengthBytes / 8;
    // Squeeze
    const hashWords = [];
    for (let i = 0; i < outputLengthLanes; i += 1) {
      // Shortcuts
      const lane = state[i];
      let laneMsw = lane.high;
      let laneLsw = lane.low;
      // Swap endian
      laneMsw = (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff)
        | (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00);
      laneLsw = (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff)
        | (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00);
      // Squeeze state to retrieve hash
      hashWords.push(laneLsw);
      hashWords.push(laneMsw);
    }
    // Return final computed hash
    return new WordArray(hashWords, outputLengthBytes);
  }
  clone() {
    const clone = super.clone.call(this);
    clone._state = this._state.slice(0);
    const state = clone._state;
    for (let i = 0; i < 25; i += 1) {
      state[i] = state[i].clone();
    }
    return clone;
  }
}
/**
 * Shortcut function to the hasher's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 *
 * @return {WordArray} The hash.
 *
 * @static
 *
 * @example
 *
 *     var hash = CryptoJS.SHA3('message');
 *     var hash = CryptoJS.SHA3(wordArray);
 */
export const SHA3 = Hasher._createHelper(SHA3Algo);
/**
 * Shortcut function to the HMAC's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 * @param {WordArray|string} key The secret key.
 *
 * @return {WordArray} The HMAC.
 *
 * @static
 *
 * @example
 *
 *     var hmac = CryptoJS.HmacSHA3(message, key);
 */
export const HmacSHA3 = Hasher._createHmacHelper(SHA3Algo);
vf107/dxmodules/crypto-es/sha384.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
import {
  X64Word,
  X64WordArray,
} from './x64-core.js';
import { SHA512Algo } from './sha512.js';
/**
 * SHA-384 hash algorithm.
 */
export class SHA384Algo extends SHA512Algo {
  _doReset() {
    this._hash = new X64WordArray([
      new X64Word(0xcbbb9d5d, 0xc1059ed8),
      new X64Word(0x629a292a, 0x367cd507),
      new X64Word(0x9159015a, 0x3070dd17),
      new X64Word(0x152fecd8, 0xf70e5939),
      new X64Word(0x67332667, 0xffc00b31),
      new X64Word(0x8eb44a87, 0x68581511),
      new X64Word(0xdb0c2e0d, 0x64f98fa7),
      new X64Word(0x47b5481d, 0xbefa4fa4),
    ]);
  }
  _doFinalize() {
    const hash = super._doFinalize.call(this);
    hash.sigBytes -= 16;
    return hash;
  }
}
/**
 * Shortcut function to the hasher's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 *
 * @return {WordArray} The hash.
 *
 * @static
 *
 * @example
 *
 *     var hash = CryptoJS.SHA384('message');
 *     var hash = CryptoJS.SHA384(wordArray);
 */
export const SHA384 = SHA512Algo._createHelper(SHA384Algo);
/**
 * Shortcut function to the HMAC's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 * @param {WordArray|string} key The secret key.
 *
 * @return {WordArray} The HMAC.
 *
 * @static
 *
 * @example
 *
 *     var hmac = CryptoJS.HmacSHA384(message, key);
 */
export const HmacSHA384 = SHA512Algo._createHmacHelper(SHA384Algo);
vf107/dxmodules/crypto-es/sha512.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,369 @@
import { Hasher } from './core.js';
import {
  X64Word,
  X64WordArray,
} from './x64-core.js';
// Constants
const K = [
  new X64Word(0x428a2f98, 0xd728ae22),
  new X64Word(0x71374491, 0x23ef65cd),
  new X64Word(0xb5c0fbcf, 0xec4d3b2f),
  new X64Word(0xe9b5dba5, 0x8189dbbc),
  new X64Word(0x3956c25b, 0xf348b538),
  new X64Word(0x59f111f1, 0xb605d019),
  new X64Word(0x923f82a4, 0xaf194f9b),
  new X64Word(0xab1c5ed5, 0xda6d8118),
  new X64Word(0xd807aa98, 0xa3030242),
  new X64Word(0x12835b01, 0x45706fbe),
  new X64Word(0x243185be, 0x4ee4b28c),
  new X64Word(0x550c7dc3, 0xd5ffb4e2),
  new X64Word(0x72be5d74, 0xf27b896f),
  new X64Word(0x80deb1fe, 0x3b1696b1),
  new X64Word(0x9bdc06a7, 0x25c71235),
  new X64Word(0xc19bf174, 0xcf692694),
  new X64Word(0xe49b69c1, 0x9ef14ad2),
  new X64Word(0xefbe4786, 0x384f25e3),
  new X64Word(0x0fc19dc6, 0x8b8cd5b5),
  new X64Word(0x240ca1cc, 0x77ac9c65),
  new X64Word(0x2de92c6f, 0x592b0275),
  new X64Word(0x4a7484aa, 0x6ea6e483),
  new X64Word(0x5cb0a9dc, 0xbd41fbd4),
  new X64Word(0x76f988da, 0x831153b5),
  new X64Word(0x983e5152, 0xee66dfab),
  new X64Word(0xa831c66d, 0x2db43210),
  new X64Word(0xb00327c8, 0x98fb213f),
  new X64Word(0xbf597fc7, 0xbeef0ee4),
  new X64Word(0xc6e00bf3, 0x3da88fc2),
  new X64Word(0xd5a79147, 0x930aa725),
  new X64Word(0x06ca6351, 0xe003826f),
  new X64Word(0x14292967, 0x0a0e6e70),
  new X64Word(0x27b70a85, 0x46d22ffc),
  new X64Word(0x2e1b2138, 0x5c26c926),
  new X64Word(0x4d2c6dfc, 0x5ac42aed),
  new X64Word(0x53380d13, 0x9d95b3df),
  new X64Word(0x650a7354, 0x8baf63de),
  new X64Word(0x766a0abb, 0x3c77b2a8),
  new X64Word(0x81c2c92e, 0x47edaee6),
  new X64Word(0x92722c85, 0x1482353b),
  new X64Word(0xa2bfe8a1, 0x4cf10364),
  new X64Word(0xa81a664b, 0xbc423001),
  new X64Word(0xc24b8b70, 0xd0f89791),
  new X64Word(0xc76c51a3, 0x0654be30),
  new X64Word(0xd192e819, 0xd6ef5218),
  new X64Word(0xd6990624, 0x5565a910),
  new X64Word(0xf40e3585, 0x5771202a),
  new X64Word(0x106aa070, 0x32bbd1b8),
  new X64Word(0x19a4c116, 0xb8d2d0c8),
  new X64Word(0x1e376c08, 0x5141ab53),
  new X64Word(0x2748774c, 0xdf8eeb99),
  new X64Word(0x34b0bcb5, 0xe19b48a8),
  new X64Word(0x391c0cb3, 0xc5c95a63),
  new X64Word(0x4ed8aa4a, 0xe3418acb),
  new X64Word(0x5b9cca4f, 0x7763e373),
  new X64Word(0x682e6ff3, 0xd6b2b8a3),
  new X64Word(0x748f82ee, 0x5defb2fc),
  new X64Word(0x78a5636f, 0x43172f60),
  new X64Word(0x84c87814, 0xa1f0ab72),
  new X64Word(0x8cc70208, 0x1a6439ec),
  new X64Word(0x90befffa, 0x23631e28),
  new X64Word(0xa4506ceb, 0xde82bde9),
  new X64Word(0xbef9a3f7, 0xb2c67915),
  new X64Word(0xc67178f2, 0xe372532b),
  new X64Word(0xca273ece, 0xea26619c),
  new X64Word(0xd186b8c7, 0x21c0c207),
  new X64Word(0xeada7dd6, 0xcde0eb1e),
  new X64Word(0xf57d4f7f, 0xee6ed178),
  new X64Word(0x06f067aa, 0x72176fba),
  new X64Word(0x0a637dc5, 0xa2c898a6),
  new X64Word(0x113f9804, 0xbef90dae),
  new X64Word(0x1b710b35, 0x131c471b),
  new X64Word(0x28db77f5, 0x23047d84),
  new X64Word(0x32caab7b, 0x40c72493),
  new X64Word(0x3c9ebe0a, 0x15c9bebc),
  new X64Word(0x431d67c4, 0x9c100d4c),
  new X64Word(0x4cc5d4be, 0xcb3e42b6),
  new X64Word(0x597f299c, 0xfc657e2a),
  new X64Word(0x5fcb6fab, 0x3ad6faec),
  new X64Word(0x6c44198c, 0x4a475817),
];
// Reusable objects
const W = [];
for (let i = 0; i < 80; i += 1) {
  W[i] = new X64Word();
}
/**
 * SHA-512 hash algorithm.
 */
export class SHA512Algo extends Hasher {
  constructor() {
    super();
    this.blockSize = 1024 / 32;
  }
  _doReset() {
    this._hash = new X64WordArray([
      new X64Word(0x6a09e667, 0xf3bcc908),
      new X64Word(0xbb67ae85, 0x84caa73b),
      new X64Word(0x3c6ef372, 0xfe94f82b),
      new X64Word(0xa54ff53a, 0x5f1d36f1),
      new X64Word(0x510e527f, 0xade682d1),
      new X64Word(0x9b05688c, 0x2b3e6c1f),
      new X64Word(0x1f83d9ab, 0xfb41bd6b),
      new X64Word(0x5be0cd19, 0x137e2179),
    ]);
  }
  _doProcessBlock(M, offset) {
    // Shortcuts
    const H = this._hash.words;
    const H0 = H[0];
    const H1 = H[1];
    const H2 = H[2];
    const H3 = H[3];
    const H4 = H[4];
    const H5 = H[5];
    const H6 = H[6];
    const H7 = H[7];
    const H0h = H0.high;
    let H0l = H0.low;
    const H1h = H1.high;
    let H1l = H1.low;
    const H2h = H2.high;
    let H2l = H2.low;
    const H3h = H3.high;
    let H3l = H3.low;
    const H4h = H4.high;
    let H4l = H4.low;
    const H5h = H5.high;
    let H5l = H5.low;
    const H6h = H6.high;
    let H6l = H6.low;
    const H7h = H7.high;
    let H7l = H7.low;
    // Working variables
    let ah = H0h;
    let al = H0l;
    let bh = H1h;
    let bl = H1l;
    let ch = H2h;
    let cl = H2l;
    let dh = H3h;
    let dl = H3l;
    let eh = H4h;
    let el = H4l;
    let fh = H5h;
    let fl = H5l;
    let gh = H6h;
    let gl = H6l;
    let hh = H7h;
    let hl = H7l;
    // Rounds
    for (let i = 0; i < 80; i += 1) {
      let Wil;
      let Wih;
      // Shortcut
      const Wi = W[i];
      // Extend message
      if (i < 16) {
        Wi.high = M[offset + i * 2] | 0;
        Wih = Wi.high;
        Wi.low = M[offset + i * 2 + 1] | 0;
        Wil = Wi.low;
      } else {
        // Gamma0
        const gamma0x = W[i - 15];
        const gamma0xh = gamma0x.high;
        const gamma0xl = gamma0x.low;
        const gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31))
          ^ ((gamma0xh >>> 8) | (gamma0xl << 24))
          ^ (gamma0xh >>> 7);
        const gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31))
          ^ ((gamma0xl >>> 8) | (gamma0xh << 24))
          ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
        // Gamma1
        const gamma1x = W[i - 2];
        const gamma1xh = gamma1x.high;
        const gamma1xl = gamma1x.low;
        const gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13))
          ^ ((gamma1xh << 3) | (gamma1xl >>> 29))
          ^ (gamma1xh >>> 6);
        const gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13))
          ^ ((gamma1xl << 3) | (gamma1xh >>> 29))
          ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
        // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
        const Wi7 = W[i - 7];
        const Wi7h = Wi7.high;
        const Wi7l = Wi7.low;
        const Wi16 = W[i - 16];
        const Wi16h = Wi16.high;
        const Wi16l = Wi16.low;
        Wil = gamma0l + Wi7l;
        Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
        Wil += gamma1l;
        Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
        Wil += Wi16l;
        Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
        Wi.high = Wih;
        Wi.low = Wil;
      }
      const chh = (eh & fh) ^ (~eh & gh);
      const chl = (el & fl) ^ (~el & gl);
      const majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
      const majl = (al & bl) ^ (al & cl) ^ (bl & cl);
      const sigma0h = ((ah >>> 28) | (al << 4))
        ^ ((ah << 30) | (al >>> 2))
        ^ ((ah << 25) | (al >>> 7));
      const sigma0l = ((al >>> 28) | (ah << 4))
        ^ ((al << 30) | (ah >>> 2))
        ^ ((al << 25) | (ah >>> 7));
      const sigma1h = ((eh >>> 14) | (el << 18))
        ^ ((eh >>> 18) | (el << 14))
        ^ ((eh << 23) | (el >>> 9));
      const sigma1l = ((el >>> 14) | (eh << 18))
        ^ ((el >>> 18) | (eh << 14))
        ^ ((el << 23) | (eh >>> 9));
      // t1 = h + sigma1 + ch + K[i] + W[i]
      const Ki = K[i];
      const Kih = Ki.high;
      const Kil = Ki.low;
      let t1l = hl + sigma1l;
      let t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
      t1l += chl;
      t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
      t1l += Kil;
      t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
      t1l += Wil;
      t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
      // t2 = sigma0 + maj
      const t2l = sigma0l + majl;
      const t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
      // Update working variables
      hh = gh;
      hl = gl;
      gh = fh;
      gl = fl;
      fh = eh;
      fl = el;
      el = (dl + t1l) | 0;
      eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
      dh = ch;
      dl = cl;
      ch = bh;
      cl = bl;
      bh = ah;
      bl = al;
      al = (t1l + t2l) | 0;
      ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
    }
    // Intermediate hash value
    H0.low = (H0l + al);
    H0l = H0.low;
    H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
    H1.low = (H1l + bl);
    H1l = H1.low;
    H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
    H2.low = (H2l + cl);
    H2l = H2.low;
    H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
    H3.low = (H3l + dl);
    H3l = H3.low;
    H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
    H4.low = (H4l + el);
    H4l = H4.low;
    H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
    H5.low = (H5l + fl);
    H5l = H5.low;
    H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
    H6.low = (H6l + gl);
    H6l = H6.low;
    H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
    H7.low = (H7l + hl);
    H7l = H7.low;
    H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
  }
  _doFinalize() {
    // Shortcuts
    const data = this._data;
    const dataWords = data.words;
    const nBitsTotal = this._nDataBytes * 8;
    const nBitsLeft = data.sigBytes * 8;
    // Add padding
    dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - (nBitsLeft % 32));
    dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
    dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
    data.sigBytes = dataWords.length * 4;
    // Hash final blocks
    this._process();
    // Convert hash to 32-bit word array before returning
    const hash = this._hash.toX32();
    // Return final computed hash
    return hash;
  }
  clone() {
    const clone = super.clone.call(this);
    clone._hash = this._hash.clone();
    return clone;
  }
}
/**
 * Shortcut function to the hasher's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 *
 * @return {WordArray} The hash.
 *
 * @static
 *
 * @example
 *
 *     var hash = CryptoJS.SHA512('message');
 *     var hash = CryptoJS.SHA512(wordArray);
 */
export const SHA512 = Hasher._createHelper(SHA512Algo);
/**
 * Shortcut function to the HMAC's object interface.
 *
 * @param {WordArray|string} message The message to hash.
 * @param {WordArray|string} key The secret key.
 *
 * @return {WordArray} The HMAC.
 *
 * @static
 *
 * @example
 *
 *     var hmac = CryptoJS.HmacSHA512(message, key);
 */
export const HmacSHA512 = Hasher._createHmacHelper(SHA512Algo);
vf107/dxmodules/crypto-es/tripledes.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,766 @@
import {
  WordArray,
} from './core.js';
import {
  BlockCipher,
} from './cipher-core.js';
// Permuted Choice 1 constants
const PC1 = [
  57, 49, 41, 33, 25, 17, 9, 1,
  58, 50, 42, 34, 26, 18, 10, 2,
  59, 51, 43, 35, 27, 19, 11, 3,
  60, 52, 44, 36, 63, 55, 47, 39,
  31, 23, 15, 7, 62, 54, 46, 38,
  30, 22, 14, 6, 61, 53, 45, 37,
  29, 21, 13, 5, 28, 20, 12, 4,
];
// Permuted Choice 2 constants
const PC2 = [
  14, 17, 11, 24, 1, 5,
  3, 28, 15, 6, 21, 10,
  23, 19, 12, 4, 26, 8,
  16, 7, 27, 20, 13, 2,
  41, 52, 31, 37, 47, 55,
  30, 40, 51, 45, 33, 48,
  44, 49, 39, 56, 34, 53,
  46, 42, 50, 36, 29, 32,
];
// Cumulative bit shift constants
const BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
// SBOXes and round permutation constants
const SBOX_P = [
  {
    0x0: 0x808200,
    0x10000000: 0x8000,
    0x20000000: 0x808002,
    0x30000000: 0x2,
    0x40000000: 0x200,
    0x50000000: 0x808202,
    0x60000000: 0x800202,
    0x70000000: 0x800000,
    0x80000000: 0x202,
    0x90000000: 0x800200,
    0xa0000000: 0x8200,
    0xb0000000: 0x808000,
    0xc0000000: 0x8002,
    0xd0000000: 0x800002,
    0xe0000000: 0x0,
    0xf0000000: 0x8202,
    0x8000000: 0x0,
    0x18000000: 0x808202,
    0x28000000: 0x8202,
    0x38000000: 0x8000,
    0x48000000: 0x808200,
    0x58000000: 0x200,
    0x68000000: 0x808002,
    0x78000000: 0x2,
    0x88000000: 0x800200,
    0x98000000: 0x8200,
    0xa8000000: 0x808000,
    0xb8000000: 0x800202,
    0xc8000000: 0x800002,
    0xd8000000: 0x8002,
    0xe8000000: 0x202,
    0xf8000000: 0x800000,
    0x1: 0x8000,
    0x10000001: 0x2,
    0x20000001: 0x808200,
    0x30000001: 0x800000,
    0x40000001: 0x808002,
    0x50000001: 0x8200,
    0x60000001: 0x200,
    0x70000001: 0x800202,
    0x80000001: 0x808202,
    0x90000001: 0x808000,
    0xa0000001: 0x800002,
    0xb0000001: 0x8202,
    0xc0000001: 0x202,
    0xd0000001: 0x800200,
    0xe0000001: 0x8002,
    0xf0000001: 0x0,
    0x8000001: 0x808202,
    0x18000001: 0x808000,
    0x28000001: 0x800000,
    0x38000001: 0x200,
    0x48000001: 0x8000,
    0x58000001: 0x800002,
    0x68000001: 0x2,
    0x78000001: 0x8202,
    0x88000001: 0x8002,
    0x98000001: 0x800202,
    0xa8000001: 0x202,
    0xb8000001: 0x808200,
    0xc8000001: 0x800200,
    0xd8000001: 0x0,
    0xe8000001: 0x8200,
    0xf8000001: 0x808002,
  },
  {
    0x0: 0x40084010,
    0x1000000: 0x4000,
    0x2000000: 0x80000,
    0x3000000: 0x40080010,
    0x4000000: 0x40000010,
    0x5000000: 0x40084000,
    0x6000000: 0x40004000,
    0x7000000: 0x10,
    0x8000000: 0x84000,
    0x9000000: 0x40004010,
    0xa000000: 0x40000000,
    0xb000000: 0x84010,
    0xc000000: 0x80010,
    0xd000000: 0x0,
    0xe000000: 0x4010,
    0xf000000: 0x40080000,
    0x800000: 0x40004000,
    0x1800000: 0x84010,
    0x2800000: 0x10,
    0x3800000: 0x40004010,
    0x4800000: 0x40084010,
    0x5800000: 0x40000000,
    0x6800000: 0x80000,
    0x7800000: 0x40080010,
    0x8800000: 0x80010,
    0x9800000: 0x0,
    0xa800000: 0x4000,
    0xb800000: 0x40080000,
    0xc800000: 0x40000010,
    0xd800000: 0x84000,
    0xe800000: 0x40084000,
    0xf800000: 0x4010,
    0x10000000: 0x0,
    0x11000000: 0x40080010,
    0x12000000: 0x40004010,
    0x13000000: 0x40084000,
    0x14000000: 0x40080000,
    0x15000000: 0x10,
    0x16000000: 0x84010,
    0x17000000: 0x4000,
    0x18000000: 0x4010,
    0x19000000: 0x80000,
    0x1a000000: 0x80010,
    0x1b000000: 0x40000010,
    0x1c000000: 0x84000,
    0x1d000000: 0x40004000,
    0x1e000000: 0x40000000,
    0x1f000000: 0x40084010,
    0x10800000: 0x84010,
    0x11800000: 0x80000,
    0x12800000: 0x40080000,
    0x13800000: 0x4000,
    0x14800000: 0x40004000,
    0x15800000: 0x40084010,
    0x16800000: 0x10,
    0x17800000: 0x40000000,
    0x18800000: 0x40084000,
    0x19800000: 0x40000010,
    0x1a800000: 0x40004010,
    0x1b800000: 0x80010,
    0x1c800000: 0x0,
    0x1d800000: 0x4010,
    0x1e800000: 0x40080010,
    0x1f800000: 0x84000,
  },
  {
    0x0: 0x104,
    0x100000: 0x0,
    0x200000: 0x4000100,
    0x300000: 0x10104,
    0x400000: 0x10004,
    0x500000: 0x4000004,
    0x600000: 0x4010104,
    0x700000: 0x4010000,
    0x800000: 0x4000000,
    0x900000: 0x4010100,
    0xa00000: 0x10100,
    0xb00000: 0x4010004,
    0xc00000: 0x4000104,
    0xd00000: 0x10000,
    0xe00000: 0x4,
    0xf00000: 0x100,
    0x80000: 0x4010100,
    0x180000: 0x4010004,
    0x280000: 0x0,
    0x380000: 0x4000100,
    0x480000: 0x4000004,
    0x580000: 0x10000,
    0x680000: 0x10004,
    0x780000: 0x104,
    0x880000: 0x4,
    0x980000: 0x100,
    0xa80000: 0x4010000,
    0xb80000: 0x10104,
    0xc80000: 0x10100,
    0xd80000: 0x4000104,
    0xe80000: 0x4010104,
    0xf80000: 0x4000000,
    0x1000000: 0x4010100,
    0x1100000: 0x10004,
    0x1200000: 0x10000,
    0x1300000: 0x4000100,
    0x1400000: 0x100,
    0x1500000: 0x4010104,
    0x1600000: 0x4000004,
    0x1700000: 0x0,
    0x1800000: 0x4000104,
    0x1900000: 0x4000000,
    0x1a00000: 0x4,
    0x1b00000: 0x10100,
    0x1c00000: 0x4010000,
    0x1d00000: 0x104,
    0x1e00000: 0x10104,
    0x1f00000: 0x4010004,
    0x1080000: 0x4000000,
    0x1180000: 0x104,
    0x1280000: 0x4010100,
    0x1380000: 0x0,
    0x1480000: 0x10004,
    0x1580000: 0x4000100,
    0x1680000: 0x100,
    0x1780000: 0x4010004,
    0x1880000: 0x10000,
    0x1980000: 0x4010104,
    0x1a80000: 0x10104,
    0x1b80000: 0x4000004,
    0x1c80000: 0x4000104,
    0x1d80000: 0x4010000,
    0x1e80000: 0x4,
    0x1f80000: 0x10100,
  },
  {
    0x0: 0x80401000,
    0x10000: 0x80001040,
    0x20000: 0x401040,
    0x30000: 0x80400000,
    0x40000: 0x0,
    0x50000: 0x401000,
    0x60000: 0x80000040,
    0x70000: 0x400040,
    0x80000: 0x80000000,
    0x90000: 0x400000,
    0xa0000: 0x40,
    0xb0000: 0x80001000,
    0xc0000: 0x80400040,
    0xd0000: 0x1040,
    0xe0000: 0x1000,
    0xf0000: 0x80401040,
    0x8000: 0x80001040,
    0x18000: 0x40,
    0x28000: 0x80400040,
    0x38000: 0x80001000,
    0x48000: 0x401000,
    0x58000: 0x80401040,
    0x68000: 0x0,
    0x78000: 0x80400000,
    0x88000: 0x1000,
    0x98000: 0x80401000,
    0xa8000: 0x400000,
    0xb8000: 0x1040,
    0xc8000: 0x80000000,
    0xd8000: 0x400040,
    0xe8000: 0x401040,
    0xf8000: 0x80000040,
    0x100000: 0x400040,
    0x110000: 0x401000,
    0x120000: 0x80000040,
    0x130000: 0x0,
    0x140000: 0x1040,
    0x150000: 0x80400040,
    0x160000: 0x80401000,
    0x170000: 0x80001040,
    0x180000: 0x80401040,
    0x190000: 0x80000000,
    0x1a0000: 0x80400000,
    0x1b0000: 0x401040,
    0x1c0000: 0x80001000,
    0x1d0000: 0x400000,
    0x1e0000: 0x40,
    0x1f0000: 0x1000,
    0x108000: 0x80400000,
    0x118000: 0x80401040,
    0x128000: 0x0,
    0x138000: 0x401000,
    0x148000: 0x400040,
    0x158000: 0x80000000,
    0x168000: 0x80001040,
    0x178000: 0x40,
    0x188000: 0x80000040,
    0x198000: 0x1000,
    0x1a8000: 0x80001000,
    0x1b8000: 0x80400040,
    0x1c8000: 0x1040,
    0x1d8000: 0x80401000,
    0x1e8000: 0x400000,
    0x1f8000: 0x401040,
  },
  {
    0x0: 0x80,
    0x1000: 0x1040000,
    0x2000: 0x40000,
    0x3000: 0x20000000,
    0x4000: 0x20040080,
    0x5000: 0x1000080,
    0x6000: 0x21000080,
    0x7000: 0x40080,
    0x8000: 0x1000000,
    0x9000: 0x20040000,
    0xa000: 0x20000080,
    0xb000: 0x21040080,
    0xc000: 0x21040000,
    0xd000: 0x0,
    0xe000: 0x1040080,
    0xf000: 0x21000000,
    0x800: 0x1040080,
    0x1800: 0x21000080,
    0x2800: 0x80,
    0x3800: 0x1040000,
    0x4800: 0x40000,
    0x5800: 0x20040080,
    0x6800: 0x21040000,
    0x7800: 0x20000000,
    0x8800: 0x20040000,
    0x9800: 0x0,
    0xa800: 0x21040080,
    0xb800: 0x1000080,
    0xc800: 0x20000080,
    0xd800: 0x21000000,
    0xe800: 0x1000000,
    0xf800: 0x40080,
    0x10000: 0x40000,
    0x11000: 0x80,
    0x12000: 0x20000000,
    0x13000: 0x21000080,
    0x14000: 0x1000080,
    0x15000: 0x21040000,
    0x16000: 0x20040080,
    0x17000: 0x1000000,
    0x18000: 0x21040080,
    0x19000: 0x21000000,
    0x1a000: 0x1040000,
    0x1b000: 0x20040000,
    0x1c000: 0x40080,
    0x1d000: 0x20000080,
    0x1e000: 0x0,
    0x1f000: 0x1040080,
    0x10800: 0x21000080,
    0x11800: 0x1000000,
    0x12800: 0x1040000,
    0x13800: 0x20040080,
    0x14800: 0x20000000,
    0x15800: 0x1040080,
    0x16800: 0x80,
    0x17800: 0x21040000,
    0x18800: 0x40080,
    0x19800: 0x21040080,
    0x1a800: 0x0,
    0x1b800: 0x21000000,
    0x1c800: 0x1000080,
    0x1d800: 0x40000,
    0x1e800: 0x20040000,
    0x1f800: 0x20000080,
  },
  {
    0x0: 0x10000008,
    0x100: 0x2000,
    0x200: 0x10200000,
    0x300: 0x10202008,
    0x400: 0x10002000,
    0x500: 0x200000,
    0x600: 0x200008,
    0x700: 0x10000000,
    0x800: 0x0,
    0x900: 0x10002008,
    0xa00: 0x202000,
    0xb00: 0x8,
    0xc00: 0x10200008,
    0xd00: 0x202008,
    0xe00: 0x2008,
    0xf00: 0x10202000,
    0x80: 0x10200000,
    0x180: 0x10202008,
    0x280: 0x8,
    0x380: 0x200000,
    0x480: 0x202008,
    0x580: 0x10000008,
    0x680: 0x10002000,
    0x780: 0x2008,
    0x880: 0x200008,
    0x980: 0x2000,
    0xa80: 0x10002008,
    0xb80: 0x10200008,
    0xc80: 0x0,
    0xd80: 0x10202000,
    0xe80: 0x202000,
    0xf80: 0x10000000,
    0x1000: 0x10002000,
    0x1100: 0x10200008,
    0x1200: 0x10202008,
    0x1300: 0x2008,
    0x1400: 0x200000,
    0x1500: 0x10000000,
    0x1600: 0x10000008,
    0x1700: 0x202000,
    0x1800: 0x202008,
    0x1900: 0x0,
    0x1a00: 0x8,
    0x1b00: 0x10200000,
    0x1c00: 0x2000,
    0x1d00: 0x10002008,
    0x1e00: 0x10202000,
    0x1f00: 0x200008,
    0x1080: 0x8,
    0x1180: 0x202000,
    0x1280: 0x200000,
    0x1380: 0x10000008,
    0x1480: 0x10002000,
    0x1580: 0x2008,
    0x1680: 0x10202008,
    0x1780: 0x10200000,
    0x1880: 0x10202000,
    0x1980: 0x10200008,
    0x1a80: 0x2000,
    0x1b80: 0x202008,
    0x1c80: 0x200008,
    0x1d80: 0x0,
    0x1e80: 0x10000000,
    0x1f80: 0x10002008,
  },
  {
    0x0: 0x100000,
    0x10: 0x2000401,
    0x20: 0x400,
    0x30: 0x100401,
    0x40: 0x2100401,
    0x50: 0x0,
    0x60: 0x1,
    0x70: 0x2100001,
    0x80: 0x2000400,
    0x90: 0x100001,
    0xa0: 0x2000001,
    0xb0: 0x2100400,
    0xc0: 0x2100000,
    0xd0: 0x401,
    0xe0: 0x100400,
    0xf0: 0x2000000,
    0x8: 0x2100001,
    0x18: 0x0,
    0x28: 0x2000401,
    0x38: 0x2100400,
    0x48: 0x100000,
    0x58: 0x2000001,
    0x68: 0x2000000,
    0x78: 0x401,
    0x88: 0x100401,
    0x98: 0x2000400,
    0xa8: 0x2100000,
    0xb8: 0x100001,
    0xc8: 0x400,
    0xd8: 0x2100401,
    0xe8: 0x1,
    0xf8: 0x100400,
    0x100: 0x2000000,
    0x110: 0x100000,
    0x120: 0x2000401,
    0x130: 0x2100001,
    0x140: 0x100001,
    0x150: 0x2000400,
    0x160: 0x2100400,
    0x170: 0x100401,
    0x180: 0x401,
    0x190: 0x2100401,
    0x1a0: 0x100400,
    0x1b0: 0x1,
    0x1c0: 0x0,
    0x1d0: 0x2100000,
    0x1e0: 0x2000001,
    0x1f0: 0x400,
    0x108: 0x100400,
    0x118: 0x2000401,
    0x128: 0x2100001,
    0x138: 0x1,
    0x148: 0x2000000,
    0x158: 0x100000,
    0x168: 0x401,
    0x178: 0x2100400,
    0x188: 0x2000001,
    0x198: 0x2100000,
    0x1a8: 0x0,
    0x1b8: 0x2100401,
    0x1c8: 0x100401,
    0x1d8: 0x400,
    0x1e8: 0x2000400,
    0x1f8: 0x100001,
  },
  {
    0x0: 0x8000820,
    0x1: 0x20000,
    0x2: 0x8000000,
    0x3: 0x20,
    0x4: 0x20020,
    0x5: 0x8020820,
    0x6: 0x8020800,
    0x7: 0x800,
    0x8: 0x8020000,
    0x9: 0x8000800,
    0xa: 0x20800,
    0xb: 0x8020020,
    0xc: 0x820,
    0xd: 0x0,
    0xe: 0x8000020,
    0xf: 0x20820,
    0x80000000: 0x800,
    0x80000001: 0x8020820,
    0x80000002: 0x8000820,
    0x80000003: 0x8000000,
    0x80000004: 0x8020000,
    0x80000005: 0x20800,
    0x80000006: 0x20820,
    0x80000007: 0x20,
    0x80000008: 0x8000020,
    0x80000009: 0x820,
    0x8000000a: 0x20020,
    0x8000000b: 0x8020800,
    0x8000000c: 0x0,
    0x8000000d: 0x8020020,
    0x8000000e: 0x8000800,
    0x8000000f: 0x20000,
    0x10: 0x20820,
    0x11: 0x8020800,
    0x12: 0x20,
    0x13: 0x800,
    0x14: 0x8000800,
    0x15: 0x8000020,
    0x16: 0x8020020,
    0x17: 0x20000,
    0x18: 0x0,
    0x19: 0x20020,
    0x1a: 0x8020000,
    0x1b: 0x8000820,
    0x1c: 0x8020820,
    0x1d: 0x20800,
    0x1e: 0x820,
    0x1f: 0x8000000,
    0x80000010: 0x20000,
    0x80000011: 0x800,
    0x80000012: 0x8020020,
    0x80000013: 0x20820,
    0x80000014: 0x20,
    0x80000015: 0x8020000,
    0x80000016: 0x8000000,
    0x80000017: 0x8000820,
    0x80000018: 0x8020820,
    0x80000019: 0x8000020,
    0x8000001a: 0x8000800,
    0x8000001b: 0x0,
    0x8000001c: 0x20800,
    0x8000001d: 0x820,
    0x8000001e: 0x20020,
    0x8000001f: 0x8020800,
  },
];
// Masks that select the SBOX input
const SBOX_MASK = [
  0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
  0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f,
];
// Swap bits across the left and right words
function exchangeLR(offset, mask) {
  const t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
  this._rBlock ^= t;
  this._lBlock ^= t << offset;
}
function exchangeRL(offset, mask) {
  const t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
  this._lBlock ^= t;
  this._rBlock ^= t << offset;
}
/**
 * DES block cipher algorithm.
 */
export class DESAlgo extends BlockCipher {
  constructor(xformMode, key, cfg) {
    super(xformMode, key, cfg);
    // blickSize is an instance field and should set in constructor.
    // Both DESAlgo and TripleDESAlgo.
    this.blockSize = 64 / 32;
  }
  _doReset() {
    // Shortcuts
    const key = this._key;
    const keyWords = key.words;
    // Select 56 bits according to PC1
    const keyBits = [];
    for (let i = 0; i < 56; i += 1) {
      const keyBitPos = PC1[i] - 1;
      keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - (keyBitPos % 32))) & 1;
    }
    // Assemble 16 subkeys
    this._subKeys = [];
    const subKeys = this._subKeys;
    for (let nSubKey = 0; nSubKey < 16; nSubKey += 1) {
      // Create subkey
      subKeys[nSubKey] = [];
      const subKey = subKeys[nSubKey];
      // Shortcut
      const bitShift = BIT_SHIFTS[nSubKey];
      // Select 48 bits according to PC2
      for (let i = 0; i < 24; i += 1) {
        // Select from the left 28 key bits
        subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - (i % 6));
        // Select from the right 28 key bits
        subKey[4 + ((i / 6) | 0)]
          |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)]
          << (31 - (i % 6));
      }
      // Since each subkey is applied to an expanded 32-bit input,
      // the subkey can be broken into 8 values scaled to 32-bits,
      // which allows the key to be used without expansion
      subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
      for (let i = 1; i < 7; i += 1) {
        subKey[i] >>>= ((i - 1) * 4 + 3);
      }
      subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
    }
    // Compute inverse subkeys
    this._invSubKeys = [];
    const invSubKeys = this._invSubKeys;
    for (let i = 0; i < 16; i += 1) {
      invSubKeys[i] = subKeys[15 - i];
    }
  }
  encryptBlock(M, offset) {
    this._doCryptBlock(M, offset, this._subKeys);
  }
  decryptBlock(M, offset) {
    this._doCryptBlock(M, offset, this._invSubKeys);
  }
  _doCryptBlock(M, offset, subKeys) {
    const _M = M;
    // Get input
    this._lBlock = M[offset];
    this._rBlock = M[offset + 1];
    // Initial permutation
    exchangeLR.call(this, 4, 0x0f0f0f0f);
    exchangeLR.call(this, 16, 0x0000ffff);
    exchangeRL.call(this, 2, 0x33333333);
    exchangeRL.call(this, 8, 0x00ff00ff);
    exchangeLR.call(this, 1, 0x55555555);
    // Rounds
    for (let round = 0; round < 16; round += 1) {
      // Shortcuts
      const subKey = subKeys[round];
      const lBlock = this._lBlock;
      const rBlock = this._rBlock;
      // Feistel function
      let f = 0;
      for (let i = 0; i < 8; i += 1) {
        f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
      }
      this._lBlock = rBlock;
      this._rBlock = lBlock ^ f;
    }
    // Undo swap from last round
    const t = this._lBlock;
    this._lBlock = this._rBlock;
    this._rBlock = t;
    // Final permutation
    exchangeLR.call(this, 1, 0x55555555);
    exchangeRL.call(this, 8, 0x00ff00ff);
    exchangeRL.call(this, 2, 0x33333333);
    exchangeLR.call(this, 16, 0x0000ffff);
    exchangeLR.call(this, 4, 0x0f0f0f0f);
    // Set output
    _M[offset] = this._lBlock;
    _M[offset + 1] = this._rBlock;
  }
}
DESAlgo.keySize = 64 / 32;
DESAlgo.ivSize = 64 / 32;
// blickSize is an instance field and should set in constructor.
/**
 * Shortcut functions to the cipher's object interface.
 *
 * @example
 *
 *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
 *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);
 */
export const DES = BlockCipher._createHelper(DESAlgo);
/**
 * Triple-DES block cipher algorithm.
 */
export class TripleDESAlgo extends BlockCipher {
  _doReset() {
    // Shortcuts
    const key = this._key;
    const keyWords = key.words;
    // Make sure the key length is valid (64, 128 or >= 192 bit)
    if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {
      throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');
    }
    // Extend the key according to the keying options defined in 3DES standard
    const key1 = keyWords.slice(0, 2);
    const key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);
    const key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);
    // Create DES instances
    this._des1 = DESAlgo.createEncryptor(WordArray.create(key1));
    this._des2 = DESAlgo.createEncryptor(WordArray.create(key2));
    this._des3 = DESAlgo.createEncryptor(WordArray.create(key3));
  }
  encryptBlock(M, offset) {
    this._des1.encryptBlock(M, offset);
    this._des2.decryptBlock(M, offset);
    this._des3.encryptBlock(M, offset);
  }
  decryptBlock(M, offset) {
    this._des3.decryptBlock(M, offset);
    this._des2.encryptBlock(M, offset);
    this._des1.decryptBlock(M, offset);
  }
}
TripleDESAlgo.keySize = 192 / 32;
TripleDESAlgo.ivSize = 64 / 32;
// blickSize is an instance field and should set in constructor.
/**
 * Shortcut functions to the cipher's object interface.
 *
 * @example
 *
 *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
 *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
 */
export const TripleDES = BlockCipher._createHelper(TripleDESAlgo);
vf107/dxmodules/crypto-es/x64-core.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,113 @@
import {
  Base,
  WordArray,
} from './core.js';
const X32WordArray = WordArray;
/**
 * A 64-bit word.
 */
export class X64Word extends Base {
  /**
   * Initializes a newly created 64-bit word.
   *
   * @param {number} high The high 32 bits.
   * @param {number} low The low 32 bits.
   *
   * @example
   *
   *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
   */
  constructor(high, low) {
    super();
    this.high = high;
    this.low = low;
  }
}
/**
 * An array of 64-bit words.
 *
 * @property {Array} words The array of CryptoJS.x64.Word objects.
 * @property {number} sigBytes The number of significant bytes in this word array.
 */
export class X64WordArray extends Base {
  /**
   * Initializes a newly created word array.
   *
   * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
   * @param {number} sigBytes (Optional) The number of significant bytes in the words.
   *
   * @example
   *
   *     var wordArray = CryptoJS.x64.WordArray.create();
   *
   *     var wordArray = CryptoJS.x64.WordArray.create([
   *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
   *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
   *     ]);
   *
   *     var wordArray = CryptoJS.x64.WordArray.create([
   *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
   *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
   *     ], 10);
   */
  constructor(words = [], sigBytes = words.length * 8) {
    super();
    this.words = words;
    this.sigBytes = sigBytes;
  }
  /**
   * Converts this 64-bit word array to a 32-bit word array.
   *
   * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
   *
   * @example
   *
   *     var x32WordArray = x64WordArray.toX32();
   */
  toX32() {
    // Shortcuts
    const x64Words = this.words;
    const x64WordsLength = x64Words.length;
    // Convert
    const x32Words = [];
    for (let i = 0; i < x64WordsLength; i += 1) {
      const x64Word = x64Words[i];
      x32Words.push(x64Word.high);
      x32Words.push(x64Word.low);
    }
    return X32WordArray.create(x32Words, this.sigBytes);
  }
  /**
   * Creates a copy of this word array.
   *
   * @return {X64WordArray} The clone.
   *
   * @example
   *
   *     var clone = x64WordArray.clone();
   */
  clone() {
    const clone = super.clone.call(this);
    // Clone "words" array
    clone.words = this.words.slice(0);
    const { words } = clone;
    // Clone each X64Word object
    const wordsLength = words.length;
    for (let i = 0; i < wordsLength; i += 1) {
      words[i] = words[i].clone();
    }
    return clone;
  }
}
vf107/dxmodules/dxAudio.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,209 @@
/**
 * Audio Module - Audio playback and management system
 *
 * Features:
 * - Audio playback with WAV files - Support for standard WAV audio format
 * - Audio streaming playback - Real-time audio stream processing
 * - Text-to-speech playback - TTS functionality for text conversion
 * - Volume control and range management - Precise volume control with range validation
 * - Playback interruption and cache management - Advanced playback control and resource management
 *
 * Usage:
 * - Audio playback service - Background music, sound effects, notifications
 * - TTS service - Voice announcements, accessibility features (not all devices support)
 * - Volume management - System-wide volume control with user-friendly interface
 * - Support cross-thread audio playback
 * - The WAV format should be Channels : 1, Sample Rate : approximately 24000, Precision : 16-bit, other formats need to be converted to this format
 *
 * Doc/Demo : https://github.com/DejaOS/DejaOS
 */
import { audioClass } from './libvbar-m-dxaudio.so'
// Create audio object instance for native operations
const audioObj = new audioClass();
// Export audio module interface
const audio = {}
// Playback status code constants
audio.PLAY_CODE = {
    SUCCESS: 0,        // Playback completed successfully
    FAILED: -1,        // Playback operation failed
    QUEUE_IS_FULL: -2  // Playback queue is full, cannot add more audio
}
// Language type constants for TTS functionality
audio.PLAY_TYPE = {
    CHINESE_DATA: 0,     /** Chinese language TTS data */
    ENGLISH_DATA: 1,     /** English language TTS data */
}
/**
 * Audio system initialization
 * @param {number} [volume=5] Volume level (0-10) - User-friendly volume range (0 means mute), default 5
 * @param {number} [periodSize=512] Period size in samples - Audio processing granularity, default 512
 * @param {number} [bufferSize=2048] Buffer size in samples - Audio buffer capacity, default 2048
 * @throws {Error} If initialization fails - Throws error when audio system cannot be initialized
 *
 * Technical Details:
 * - periodSize: Controls audio processing latency. Smaller values (256,512) provide lower latency
 *   but higher CPU usage. Larger values (1024,2048) reduce CPU usage but increase latency.
 * - bufferSize: Determines audio smoothness. Smaller values (1024,2048) use less memory but may
 *   cause audio stuttering. Larger values (4096,8192) provide smoother playback but use more memory.
 * - Recommended configurations:
 *   * Low latency: (256, 1024) - For real-time communication
 *   * High quality: (1024, 4096) - For music playback
 *   * Balanced: (512, 2048) - For general applications
 */
audio.init = function (volume = 5, periodSize = 512, bufferSize = 2048) {
    // Parameter validation
    validateNumber(volume, 'volume');
    validateNumber(periodSize, 'periodSize');
    validateNumber(bufferSize, 'bufferSize');
    // Validate volume range (0-10 for user-friendly interface; 0 means mute)
    if (volume < 0 || volume > 10) {
        throw new Error("audio.init: 'volume' must be between 0 and 10");
    }
    // Initialize audio system with specified parameters
    audioObj.audioInit(volume, periodSize, bufferSize)
}
/**
 * Audio system deinitialization
 * @returns {boolean} true if deinitialization successful, false otherwise
 *
 * Note: This function releases all audio resources and should be called
 * when the audio system is no longer needed to prevent resource leaks.
 */
audio.deinit = function () {
    return audioObj.audioDeinit()
}
/**
 * Get current audio volume level
 * @returns {number} Current volume level (0-10) - Mapped from hardware volume to user-friendly range (0 means mute)
 *
 * The returned value is automatically mapped from the hardware volume range
 * to the user-friendly 1-10 range for consistent interface experience.
 */
audio.getVolume = function () {
    return audioObj.audioGetVolume()
}
/**
 * Set audio volume level
 * @param {number} volume Volume level (0-10), required parameter (0 means mute)
 * @returns {boolean} true if volume set successfully, false otherwise
 *
 * Volume levels outside the valid range (1-10) will be automatically clamped
 * to the nearest valid value. The function maps user volume to hardware volume
 * internally for optimal audio quality.
 */
audio.setVolume = function (volume) {
    if (volume == undefined || volume == null) {
        throw new Error("audio.setVolume: 'volume' parameter should not be null")
    }
    if (volume < 0 || volume > 10) {
        throw new Error("audio.setVolume: 'volume' must be between 0 and 10")
    }
    return audioObj.audioSetVolume(volume)
}
/**
 * Play WAV audio file from file path
 * @param {string} path Absolute path to WAV file, required parameter
 * @returns {number} Playback status code (see audio.PLAY_CODE constants)
 *
 * File path should start with '/app/code/' and typically placed in the project's
 * resource directory (same level as src directory). Supports standard WAV format.
 *
 * Return values:
 * - 0: Playback started successfully
 * - -1: Playback failed
 * - -2: Playback queue is full
 */
audio.play = function (path) {
    if (!path) {
        throw new Error("audio.play: 'path' parameter should not be null")
    }
    return audioObj.audioPlayWav(path)
}
/**
 * Play audio from ArrayBuffer data (streaming audio)
 * @param {ArrayBuffer} buffer Audio data buffer, required parameter
 * @returns {number} Playback status code (see audio.PLAY_CODE constants)
 *
 * This function is useful for playing audio streams, real-time audio data,
 * or audio data received from network sources. The buffer should contain
 * valid WAV format audio data.
 */
audio.playWavData = function (buffer) {
    if (!buffer) {
        throw new Error("audio.playWavData: 'buffer' parameter should not be null")
    }
    return audioObj.audioPlayWavData(buffer)
}
/**
 * Play text using Text-to-Speech (TTS) functionality
 * @param {string} txt Text to be converted to speech, required parameter
 * @param {number} type Language type, required parameter (0: Chinese, 1: English)
 * @returns {number} Playback status code (see audio.PLAY_CODE constants)
 *
 * TTS functionality may not be supported on all devices. The function converts
 * the provided text to speech in the specified language and plays it through
 * the audio system.
 *
 * Language types:
 * - 0: Chinese (中文)
 * - 1: English (English)
 */
audio.playTxt = function (txt, type) {
    if (!txt) {
        throw new Error("audio.playTxt: 'txt' parameter should not be null")
    }
    if (typeof type !== 'number' || isNaN(type)) {
        throw new Error("audio.playTxt: 'type' parameter should not be null")
    }
    return audioObj.audioPlayTxt(txt, type)
}
/**
 * Interrupt currently playing audio
 * @returns {boolean} true if interruption successful, false otherwise
 *
 * This function immediately stops the currently playing audio without affecting
 * the playback queue. It's useful for emergency stops or when switching
 * between different audio sources.
 */
audio.interrupt = function () {
    return audioObj.audioPlayingInterrupt()
}
/**
 * Clear audio playback cache and queue
 * @returns {boolean} true if cache cleared successfully, false otherwise
 *
 * This function removes all pending audio from the playback queue and clears
 * the audio cache. It should be used when you want to completely reset the
 * audio playback state or free up memory resources.
 *
 * Note: This operation is mutually exclusive with playback functions and
 * should not be called while audio is actively playing.
 */
audio.clearCache = function () {
    return audioObj.audioClearPlayCache()
}
function validateNumber(value, name) {
    if (typeof value !== 'number' || isNaN(value)) {
        throw new TypeError(`${name} must be a valid number`);
    }
}
// Export audio module as default export
export default audio;
vf107/dxmodules/dxBase64.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,308 @@
//build:20240308
//Base64编解码工具
//依赖组件:无
//基本包括以下函数:
/**
 * 1. encode(str): å­—符串转base64字符串,比如Base64.encode("aa的健康aab")得到YWHnmoTlgaXlurdhYWI=
 * 2. decode(b64): base64字符串转原字符串
 * 3. fromUint8Array(arr): byte数组转base64字符串
 * 4. toUnit8Array(b64):base64字符串转byte数组
 * 5. fromHexString(hex):16进制字符串(小写,无空格)转base64字符串
 * 6. toHexString(b64):base64字符串转16进制字符串(小写,无空格
 */
/**
 *  base64.ts
 *
 *  Licensed under the BSD 3-Clause License.
 *    http://opensource.org/licenses/BSD-3-Clause
 *
 *  References:
 *    http://en.wikipedia.org/wiki/Base64
 *
 * @author Dan Kogai (https://github.com/dankogai)
 */
let version = '3.7.7';
/**
 * @deprecated use lowercase `version`.
 */
let VERSION = version;
let _hasBuffer = typeof Buffer === 'function';
let _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined;
let _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined;
let b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
let b64chs = Array.prototype.slice.call(b64ch);
let b64tab = (function (a) {
    let tab = {};
    a.forEach(function (c, i) { return tab[c] = i; });
    return tab;
})(b64chs);
let b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
let _fromCC = String.fromCharCode.bind(String);
let _U8Afrom = typeof Uint8Array.from === 'function'
    ? Uint8Array.from.bind(Uint8Array)
    : function (it) { return new Uint8Array(Array.prototype.slice.call(it, 0)); };
let _mkUriSafe = function (src) {
    return src
        .replace(/=/g, '').replace(/[+\/]/g, function (m0) { return m0 == '+' ? '-' : '_'; });
};
let _tidyB64 = function (s) { return s.replace(/[^A-Za-z0-9\+\/]/g, ''); };
/**
 * polyfill version of `btoa`
 */
let btoaPolyfill = function (bin) {
    // console.log('polyfilled');
    let u32, c0, c1, c2, asc = '';
    let pad = bin.length % 3;
    for (let i = 0; i < bin.length;) {
        if ((c0 = bin.charCodeAt(i++)) > 255 ||
            (c1 = bin.charCodeAt(i++)) > 255 ||
            (c2 = bin.charCodeAt(i++)) > 255)
            throw new TypeError('invalid character found');
        u32 = (c0 << 16) | (c1 << 8) | c2;
        asc += b64chs[u32 >> 18 & 63]
            + b64chs[u32 >> 12 & 63]
            + b64chs[u32 >> 6 & 63]
            + b64chs[u32 & 63];
    }
    return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc;
};
/**
 * does what `window.btoa` of web browsers do.
 * @param {String} bin binary string
 * @returns {string} Base64-encoded string
 */
let _btoa = typeof btoa === 'function' ? function (bin) { return btoa(bin); }
    : _hasBuffer ? function (bin) { return Buffer.from(bin, 'binary').toString('base64'); }
        : btoaPolyfill;
let _fromUint8Array = _hasBuffer
    ? function (u8a) { return Buffer.from(u8a).toString('base64'); }
    : function (u8a) {
        // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326
        let maxargs = 0x1000;
        let strs = [];
        for (let i = 0, l = u8a.length; i < l; i += maxargs) {
            strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs)));
        }
        return _btoa(strs.join(''));
    };
/**
 * converts a Uint8Array to a Base64 string.
 * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 Â§5
 * @returns {string} Base64 string
 */
let fromUint8Array = function (u8a, urlsafe) {
    if (urlsafe === void 0) { urlsafe = false; }
    return urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a);
};
let fromHexString = function (hexString) {
    let byteString = hexString.match(/.{1,2}/g);
    let byteArray = byteString.map(function (byte) {
        return parseInt(byte, 16);
    });
    let buffer = new Uint8Array(byteArray);
    return fromUint8Array(buffer)
}
// This trick is found broken https://github.com/dankogai/js-base64/issues/130
// const utob = (src: string) => unescape(encodeURIComponent(src));
// reverting good old fationed regexp
let cb_utob = function (c) {
    if (c.length < 2) {
        let cc = c.charCodeAt(0);
        return cc < 0x80 ? c
            : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6))
                + _fromCC(0x80 | (cc & 0x3f)))
                : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f))
                    + _fromCC(0x80 | ((cc >>> 6) & 0x3f))
                    + _fromCC(0x80 | (cc & 0x3f)));
    }
    else {
        let cc = 0x10000
            + (c.charCodeAt(0) - 0xD800) * 0x400
            + (c.charCodeAt(1) - 0xDC00);
        return (_fromCC(0xf0 | ((cc >>> 18) & 0x07))
            + _fromCC(0x80 | ((cc >>> 12) & 0x3f))
            + _fromCC(0x80 | ((cc >>> 6) & 0x3f))
            + _fromCC(0x80 | (cc & 0x3f)));
    }
};
let re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
/**
 * @deprecated should have been internal use only.
 * @param {string} src UTF-8 string
 * @returns {string} UTF-16 string
 */
let utob = function (u) { return u.replace(re_utob, cb_utob); };
//
let _encode = _hasBuffer
    ? function (s) { return Buffer.from(s, 'utf8').toString('base64'); }
    : _TE
        ? function (s) { return _fromUint8Array(_TE.encode(s)); }
        : function (s) { return _btoa(utob(s)); };
/**
 * converts a UTF-8-encoded string to a Base64 string.
 * @param {boolean} [urlsafe] if `true` make the result URL-safe
 * @returns {string} Base64 string
 */
let encode = function (src, urlsafe) {
    if (urlsafe === void 0) { urlsafe = false; }
    return urlsafe
        ? _mkUriSafe(_encode(src))
        : _encode(src);
};
/**
 * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 Â§5.
 * @returns {string} Base64 string
 */
let encodeURI = function (src) { return encode(src, true); };
// This trick is found broken https://github.com/dankogai/js-base64/issues/130
// const btou = (src: string) => decodeURIComponent(escape(src));
// reverting good old fationed regexp
let re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g;
let cb_btou = function (cccc) {
    switch (cccc.length) {
        case 4:
            let cp = ((0x07 & cccc.charCodeAt(0)) << 18)
                | ((0x3f & cccc.charCodeAt(1)) << 12)
                | ((0x3f & cccc.charCodeAt(2)) << 6)
                | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000;
            return (_fromCC((offset >>> 10) + 0xD800)
                + _fromCC((offset & 0x3FF) + 0xDC00));
        case 3:
            return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12)
                | ((0x3f & cccc.charCodeAt(1)) << 6)
                | (0x3f & cccc.charCodeAt(2)));
        default:
            return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6)
                | (0x3f & cccc.charCodeAt(1)));
    }
};
/**
 * @deprecated should have been internal use only.
 * @param {string} src UTF-16 string
 * @returns {string} UTF-8 string
 */
let btou = function (b) { return b.replace(re_btou, cb_btou); };
/**
 * polyfill version of `atob`
 */
let atobPolyfill = function (asc) {
    // console.log('polyfilled');
    asc = asc.replace(/\s+/g, '');
    if (!b64re.test(asc))
        throw new TypeError('malformed base64.');
    asc += '=='.slice(2 - (asc.length & 3));
    let u24, bin = '', r1, r2;
    for (let i = 0; i < asc.length;) {
        u24 = b64tab[asc.charAt(i++)] << 18
            | b64tab[asc.charAt(i++)] << 12
            | (r1 = b64tab[asc.charAt(i++)]) << 6
            | (r2 = b64tab[asc.charAt(i++)]);
        bin += r1 === 64 ? _fromCC(u24 >> 16 & 255)
            : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255)
                : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255);
    }
    return bin;
};
/**
 * does what `window.atob` of web browsers do.
 * @param {String} asc Base64-encoded string
 * @returns {string} binary string
 */
let _atob = typeof atob === 'function' ? function (asc) { return atob(_tidyB64(asc)); }
    : _hasBuffer ? function (asc) { return Buffer.from(asc, 'base64').toString('binary'); }
        : atobPolyfill;
//
let _toUint8Array = _hasBuffer
    ? function (a) { return _U8Afrom(Buffer.from(a, 'base64')); }
    : function (a) { return _U8Afrom(_atob(a).split('').map(function (c) { return c.charCodeAt(0); })); };
/**
 * converts a Base64 string to a Uint8Array.
 */
let toUint8Array = function (a) { return _toUint8Array(_unURI(a)); };
//
let toHexString = function (a) {
    let uint8 = toUint8Array(a)
    return Array.from(uint8)
        .map((i) => i.toString(16).padStart(2, '0'))
        .join('');;
}
let _decode = _hasBuffer
    ? function (a) { return Buffer.from(a, 'base64').toString('utf8'); }
    : _TD
        ? function (a) { return _TD.decode(_toUint8Array(a)); }
        : function (a) { return btou(_atob(a)); };
let _unURI = function (a) { return _tidyB64(a.replace(/[-_]/g, function (m0) { return m0 == '-' ? '+' : '/'; })); };
/**
 * converts a Base64 string to a UTF-8 string.
 * @param {String} src Base64 string.  Both normal and URL-safe are supported
 * @returns {string} UTF-8 string
 */
let decode = function (src) { return _decode(_unURI(src)); };
/**
 * check if a value is a valid Base64 string
 * @param {String} src a value to check
  */
let isValid = function (src) {
    if (typeof src !== 'string')
        return false;
    let s = src.replace(/\s+/g, '').replace(/={0,2}$/, '');
    return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s);
};
//
let _noEnum = function (v) {
    return {
        value: v, enumerable: false, writable: true, configurable: true
    };
};
/**
 * extend String.prototype with relevant methods
 */
let extendString = function () {
    let _add = function (name, body) { return Object.defineProperty(String.prototype, name, _noEnum(body)); };
    _add('fromBase64', function () { return decode(this); });
    _add('toBase64', function (urlsafe) { return encode(this, urlsafe); });
    _add('toBase64URI', function () { return encode(this, true); });
    _add('toBase64URL', function () { return encode(this, true); });
    _add('toUint8Array', function () { return toUint8Array(this); });
};
/**
 * extend Uint8Array.prototype with relevant methods
 */
let extendUint8Array = function () {
    let _add = function (name, body) { return Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); };
    _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); });
    _add('toBase64URI', function () { return fromUint8Array(this, true); });
    _add('toBase64URL', function () { return fromUint8Array(this, true); });
};
/**
 * extend Builtin prototypes with relevant methods
 */
let extendBuiltins = function () {
    extendString();
    extendUint8Array();
};
let gBase64 = {
    version: version,
    VERSION: VERSION,
    atob: _atob,
    atobPolyfill: atobPolyfill,
    btoa: _btoa,
    btoaPolyfill: btoaPolyfill,
    fromBase64: decode,
    toBase64: encode,
    encode: encode,
    encodeURI: encodeURI,
    encodeURL: encodeURI,
    utob: utob,
    btou: btou,
    decode: decode,
    isValid: isValid,
    fromUint8Array: fromUint8Array,
    toUint8Array: toUint8Array,
    fromHexString: fromHexString,
    toHexString: toHexString,
    extendString: extendString,
    extendUint8Array: extendUint8Array,
    extendBuiltins: extendBuiltins
};
export default gBase64
vf107/dxmodules/dxCamera.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
import { Facial } from './libvbar-m-dxfacial.so'; // Placeholder for native module import
const dxCamera = {};
// --- Constants & Enums ---
// Instantiate the native object immediately.
// Thanks to ES module caching, this will only run once.
const _native = new Facial();
// --- Public API ---
/**
 * Set camera preview enable/disable
 * @param {number} channel - Camera channel (0: RGB, 1: NIR)
 * @param {number} enable - Switch state (0: disable, 1: enable)
 */
dxCamera.capPreviewEnable = function (channel, enable) {
    _native.capPreviewEnable(channel, enable); // Throws on error
};
/**
 * Capture and save a screenshot from the camera.
 * @param {string} savePath - The file path where the screenshot will be saved. If not provided, a default path will be used.
 * Throws an error if the operation fails.
 */
dxCamera.capPrintscreen = function (savePath = "/test.jpg") {
    _native.capPrintscreen(savePath);
};
export default dxCamera;
vf107/dxmodules/dxCapcal.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
import { Facial } from './libvbar-m-dxfacial.so'; // Placeholder for native module import
const dxCapcal = {};
// --- Constants & Enums ---
// Instantiate the native object immediately.
// Thanks to ES module caching, this will only run once.
const _native = new Facial();
// --- Public API ---
dxCapcal.init = function () {
    _native.initCapcal(); // Throws on error
};
dxCapcal.deinit = function () {
    _native.deinitCapcal();
};
dxCapcal.calculate = function (cnt) {
    return _native.calculateCapcal(cnt);
};
dxCapcal.getBox = function (cnt) {
    return _native.getBoxCapcal(cnt);
};
/**
 * Gets the native module instance.
 * @returns {object|null}
 */
dxCapcal.getNative = function () {
    return _native;
};
export default dxCapcal;
vf107/dxmodules/dxChannel.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,277 @@
/**
 * @file dxChannel.js
 * @module dxChannel
 * @description
 * Data communication channel module based on the native dxChannel C library.
 * This module provides a direct, handle-based interface for various communication channels,
 * including Serial Port (UART), USB (HID, Keyboard Wedge), and Wiegand.
 *
 * It is designed for high-performance, multi-threaded environments, allowing different
 * channels to be operated in parallel safely.
 *
 * @usage
 * // 1. Import the module
 * import channel from 'dxChannel.js';
 *
 * // 2. Open a channel (e.g., a serial port) and get its handle
 * let uart_handle = null;
 * try {
 *   uart_handle = channel.open(channel.TYPE.UART, "/dev/ttyS2");
 * } catch (e) {
 *   console.error("Failed to open UART:", e);
 * }
 *
 * if (uart_handle !== null) {
 *   try {
 *     // 3. Configure the channel
 *     channel.setUartParam(uart_handle, 9600, 8, 'N', 1);
 *
 *     // 4. Send data
 *     const dataToSend = new Uint8Array([0x01, 0x02, 0x03, 0x04]).buffer;
 *     const success = channel.send(uart_handle, dataToSend);
 *     dxLogger.info("Send successful:", success);
 *
 *     // 5. Receive data (this is a blocking call)
 *     const receivedData = channel.receive(uart_handle, 4, 1000); // Wait for 4 bytes for up to 1000ms
 *     if (receivedData) {
 *       dxLogger.info("Received data:", receivedData);
 *     }
 *   } catch (e) {
 *     console.error("Channel operation failed:", e);
 *   } finally {
 *     // 6. Close the handle when done
 *     channel.close(uart_handle);
 *   }
 * }
 */
import { channel as nativeChannel } from './libvbar-m-dxchannel.so'
const channel = {}
/**
 * @readonly
 * @enum {number}
 * Channel type enumeration.
 */
channel.TYPE = Object.freeze({
    USBKBW: 1,  // USB Keyboard Wedge
    USBHID: 2,  // USB Human Interface Device
    UART: 3,    // Serial Port (UART)
    WIEGAND: 4  // Wiegand interface
});
/**
 * @readonly
 * @enum {number}
 * IO Control command enumeration for `channel.ioctl`.
 */
channel.IOC_SET_CMD = Object.freeze({
    /** Set KBW channel configuration parameters */
    CHANNEL_IOC_SET_KBW_CONFIG: 1,
    /** Set KBW channel upper computer parameters */
    CHANNEL_IOC_SET_KBW_UPPER: 2,
    /** Set KBW online time */
    CHANNEL_IOC_SET_KBW_UPTIME: 3,
    /** Set KBW offline time */
    CHANNEL_IOC_SET_KBW_DOWNTIME: 4,
    /** Set HID channel report length */
    CHANNEL_IOC_SET_HID_REPORT_LEN: 5,
    /** Set UART channel parameters */
    CHANNEL_IOC_SET_UART_PARAM: 6,
    /** Set Wiegand channel working mode */
    CHANNEL_IOC_SET_WIEGAND_MODE: 7,
    /** Set Wiegand channel GPIO configuration */
    CHANNEL_IOC_SET_WIEGAND_GPIO: 8,
    /** Set Wiegand channel delay time */
    CHANNEL_IOC_SET_WIEGAND_DELAY: 9,
    /** Set Wiegand channel logging function */
    CHANNEL_IOC_SET_WIEGAND_LOG: 10
});
/**
 * @readonly
 * @enum {number}
 * Wiegand channel working modes.
 */
channel.WIEGAND_MODE = Object.freeze({
    /** Initial value for Wiegand mode */
    WIEGAND_MODE_INIT: 0,
    /** Wiegand 26-bit mode */
    WIEGAND_MODE_26: 1,
    /** Wiegand 34-bit mode */
    WIEGAND_MODE_34: 2,
    /** Wiegand 128-bit mode */
    WIEGAND_MODE_128: 3,
    /** Wiegand 256-bit mode */
    WIEGAND_MODE_256: 4,
    /** Wiegand 2048-bit mode */
    WIEGAND_MODE_2048: 5,
    /** Custom Wiegand mode, max 6400 bits */
    WIEGAND_MODE_CUSTOM: 6
});
/**
 * Opens a communication channel and returns its handle.
 * @param {number} type - The channel type, from `channel.TYPE` enum.
 * @param {string} path - The channel device path, e.g., "/dev/ttyS2". Note: The path may vary on different hardware. Please refer to `dxDriver.js` for device-specific constants.
 * @returns {number} The numeric handle for the opened channel, used in all subsequent operations.
 * @throws {Error} If the channel fails to open or if parameters are invalid.
 */
channel.open = function (type, path) {
    if (type === undefined || type === null) {
        throw new Error("channel.open: 'type' parameter is required.")
    }
    // Validate that the provided type is a valid value from the enum
    if (!Object.values(channel.TYPE).includes(type)) {
        throw new Error(`channel.open: invalid 'type' parameter. Please use a value from channel.TYPE.`);
    }
    if (path === undefined || path === null) {
        throw new Error("channel.open: 'path' parameter is required.")
    }
    try {
        const handle_id = nativeChannel.open(type, path);
        return handle_id;
    } catch (e) {
        // The C layer throws an exception on failure. We catch it and re-throw a more user-friendly JS error.
        throw new Error(`channel.open: failed to open channel with type ${type} and path '${path}'. Reason: ${e.message}`);
    }
}
/**
 * Sends data to a specified channel.
 * @param {number} handle_id - The channel handle returned by `open()`.
 * @param {ArrayBuffer} buffer - The binary data to send.
 * @returns {number} The number of bytes successfully sent, or a negative value on failure.
 *                   Note: A successful return only indicates data has been sent from the local buffer,
 *                   not that it has been received by the remote end.
 */
channel.send = function (handle_id, buffer) {
    if (handle_id === undefined || handle_id === null) {
        throw new Error("channel.send: 'handle_id' parameter is required.")
    }
    if (buffer === undefined || buffer === null) {
        throw new Error("channel.send: 'buffer' parameter is required.")
    }
    return nativeChannel.send(handle_id, buffer);
}
/**
 * Receives data from a specified channel. This is a blocking call.
 * @param {number} handle_id - The channel handle returned by `open()`.
 * @param {number} size - The number of bytes to receive.
 * @param {number} [timeout=10] - The maximum time to wait in milliseconds. Defaults to 10.
 * @returns {Uint8Array|null} A `Uint8Array` containing the received data, or `null` if the operation timed out with no data.
 */
channel.receive = function (handle_id, size, timeout) {
    if (handle_id === undefined || handle_id === null) {
        throw new Error("channel.receive: 'handle_id' parameter is required.")
    }
    if (size === undefined || size === null) {
        throw new Error("channel.receive: 'size' parameter is required.")
    }
    if (timeout === undefined || timeout === null) {
        timeout = 10
    }
    const res = nativeChannel.receive(handle_id, size, timeout)
    if (res === null) {
        return null
    }
    return new Uint8Array(res)
}
/**
 * Performs a special I/O control operation on a specified channel.
 * @param {number} handle_id - The channel handle returned by `open()`.
 * @param {number} request - The control command code, from `channel.IOC_SET_CMD` enum.
 * @param {*} arg - The argument for the request, which can be a number, string, or object.
 * @returns {boolean} True on success, false on failure.
 */
channel.ioctl = function (handle_id, request, arg) {
    if (handle_id === undefined || handle_id === null) {
        throw new Error("channel.ioctl: 'handle_id' parameter is required.")
    }
    // Validate that the provided request is a valid value from the enum
    if (!Object.values(channel.IOC_SET_CMD).includes(request)) {
        throw new Error(`channel.ioctl: invalid 'request' parameter. Please use a value from channel.IOC_SET_CMD.`);
    }
    return nativeChannel.ioctl(handle_id, request, arg)
}
/**
 * Closes a communication channel.
 * @param {number} handle_id - The channel handle returned by `open()`.
 * @returns {boolean} Always returns true on success.
 * @throws {Error} If the handle_id is invalid.
 */
channel.close = function (handle_id) {
    if (handle_id === undefined || handle_id === null) {
        throw new Error("channel.close: 'handle_id' parameter is required.")
    }
    return nativeChannel.close(handle_id)
}
/**
 * Flushes (clears) the input/output buffers of a specified channel.
 * @param {number} handle_id - The channel handle returned by `open()`.
 * @param {number} queue_selector - Which queue to flush. 0: Input, 1: Output, 2: Both.
 * @returns {boolean} True on success, false on failure.
 */
channel.flush = function (handle_id, queue_selector) {
    if (handle_id === undefined || handle_id === null) {
        throw new Error("channel.flush: 'handle_id' parameter is required.")
    }
    if (queue_selector === undefined || queue_selector === null) {
        throw new Error("channel.flush: 'queue_selector' parameter is required.")
    }
    return nativeChannel.flush(handle_id, queue_selector);
}
/**
 * Sets the communication parameters for a UART (serial) channel.
 * @param {number} handle_id - The channel handle returned by `open()`.
 * @param {number} baudrate - The baud rate, e.g., 9600, 115200.
 * @param {number} [databits=8] - The number of data bits.
 * @param {string} [parity='N'] - The parity: 'N' (None), 'O' (Odd), 'E' (Even).
 * @param {number} [stopbits=1] - The number of stop bits.
 * @returns {boolean} True on success, false on failure.
 */
channel.setUartParam = function (handle_id, baudrate, databits, parity, stopbits) {
    if (baudrate === undefined || baudrate === null) {
        throw new Error("channel.setUartParam: 'baudrate' parameter is required.");
    }
    // Set default values for optional parameters
    const final_databits = (databits === undefined || databits === null) ? 8 : databits;
    const final_parity = (parity === undefined || parity === null) ? 'N' : parity;
    const final_stopbits = (stopbits === undefined || stopbits === null) ? 1 : stopbits;
    const param_string = `${baudrate}-${final_databits}-${final_parity}-${final_stopbits}`;
    return channel.ioctl(handle_id, channel.IOC_SET_CMD.CHANNEL_IOC_SET_UART_PARAM, param_string);
}
/**
 * @typedef {object} WiegandGpioConfig
 * @property {number} [busy_time] - Busy time (in microseconds). Defaults to 50 in the C layer.
 * @property {number} [free_time] - Free time (in microseconds). Defaults to 100 in the C layer.
 * @property {number} [mode] - Working mode, see `channel.WIEGAND_MODE`. Defaults to 2 (34-bit) in the C layer.
 * @property {number} [log_level] - Log level. Defaults to 1 in the C layer.
 * @property {number} [wiegand_d0] - GPIO pin number for D0 data line. Defaults to 4 in the C layer.
 * @property {number} [wiegand_d1] - GPIO pin number for D1 data line. Defaults to 5 in the C layer.
 */
/**
 * Sets the GPIO pins and working parameters for a Wiegand channel.
 * @param {number} handle_id - The channel handle returned by `open()`.
 * @param {WiegandGpioConfig} config - Wiegand configuration object.
 * @returns {boolean} True on success, false on failure.
 */
channel.setWiegandGpio = function (handle_id, config) {
    if (config === undefined || config === null) {
        throw new Error("channel.setWiegandGpio: 'config' object is required.");
    }
    // The C layer provides default values, so passing a partial or empty object is safe.
    return channel.ioctl(handle_id, channel.IOC_SET_CMD.CHANNEL_IOC_SET_WIEGAND_GPIO, config);
}
export default channel;
vf107/dxmodules/dxCommon.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,754 @@
//build: 20240617
// ç³»ç»Ÿçš„一些基本操作、还有一些常用的工具函数,基本上每个项目都需要依赖这个组件,另外dxLogger也依赖这个组件
// ä¾èµ–组件:dxDriver,dxMap
import { commonClass } from './libvbar-m-dxcommon.so'
import dxMap from './dxMap.js'
import * as std from 'std';
import * as os from "os"
const commonObj = new commonClass();
const common = {}
/**
 * èŽ·å–ç³»ç»Ÿå¯åŠ¨çš„è¿è¡Œæ—¶é—´(单位是秒)
 * @returns
 */
common.getUptime = function () {
    return commonObj.getUptime();
}
/**
 * èŽ·å–ç³»ç»Ÿçš„æ€»å†…å­˜(单位是字节)
 * @returns
 */
common.getTotalmem = function () {
    return commonObj.getTotalmem();
}
/**
 * èŽ·å–ç³»ç»Ÿå‰©ä½™å†…å­˜(单位是字节)
 * @returns
 */
common.getFreemem = function () {
    return commonObj.getFreemem();
}
/**
 * Deprcated, Please use `common.logMemory` instead.
 */
common.logMem = function (logger, interval = 10) {
    if (logger) {
        logger.debug("Deprcated, Please use `common.logMemory` instead.")
    }
}
/**
 * Logs the current memory usage at regular intervals for debugging and monitoring purposes.
 * @param {object} logger The dxLogger module object.
 * @param {number} interval The logging interval in seconds, defaulting to 10 seconds.
 */
common.logMemory = function (logger, interval = 10) {
    if (!logger) return;
    let first = new Date().getTime();
    let min = common.getFreemem() / 1024;
    let max = min;
    const _logmemory = () => {
        try {
            const now = new Date().getTime();
            const pass = (now - first) / 1000;
            const free = common.getFreemem() / 1024;
            min = Math.min(min, free);
            max = Math.max(max, free);
            // Format time
            let passStr;
            if (pass > 1700000000) {
                first = now;
                passStr = 'time synced, 0s';
            } else if (pass >= 3600) {
                const hours = Math.floor(pass / 3600);
                const minutes = Math.floor((pass % 3600) / 60);
                const seconds = Math.floor(pass % 60);
                passStr = `${hours}h ${minutes}m ${seconds}s`;
            } else if (pass >= 60) {
                const minutes = Math.floor(pass / 60);
                const seconds = Math.floor(pass % 60);
                passStr = `${minutes}m ${seconds}s`;
            } else {
                passStr = `${Math.floor(pass)}s`;
            }
            const log = `------ ${passStr} passed, free memory (k): ${free}, min free memory (k): ${min}, max free memory (k): ${max} ------`;
            logger.info(log);
        } catch (err) {
            logger.error('Error in logMemory:', err);
        } finally {
            os.setTimeout(_logmemory, interval * 1000);
        }
    };
    os.setTimeout(_logmemory, interval * 1000);
};
/**
 * The principle of converting asynchronous to synchronous is as follows:
 * the `request` function periodically checks a designated variable in memory for a value.
 * If the value is found within the timeout period, the result is returned; otherwise,
 * it is considered a timeout. The `response` function is responsible for storing the result
 *  in the designated variable once the asynchronous request is completed.
 */
common.sync = {
    /**
     * Block and wait for data
     * Usage:
        common.sync.request(topic, 200)
        .then((data) => {
            log.info("Received data:", data);
        })
        .catch((err) => {
            log.error("Request failed:", err.message);
        });
     * @param {string} topic The unique identifier for each request
     * @param {int} timeout waitting timeout(microsecond),default is 200 ms
     * @returns
     */
    request: function (topic, timeout = 200) {
        return new Promise((resolve, reject) => {
            let map = dxMap.get("SYNC");
            let startTime = Date.now();
            const checkData = () => {
                let data = map.get(topic);
                if (data) {
                    map.del(topic); //del data in map
                    resolve(data); //return data
                } else if (Date.now() - startTime >= timeout) {
                    map.del(topic); // del data in map with timeout
                    reject(new Error(`Timeout exceeded for topic: ${topic}`));
                } else {
                    os.setTimeout(checkData, 10); //every 10 ms to check
                }
            };
            os.setTimeout(checkData, 10); // first check
        });
    },
    /**
     * notify data to requester
     * @param {string} topic The unique identifier for each request
     * @param {*} data
     * @returns
     */
    response: function (topic, data) {
        let map = dxMap.get("SYNC");
        map.put(topic, data); // save data in map
    }
};
/**
 * èŽ·å–ç³»ç»Ÿå¯ç”¨ç£ç›˜æ€»é‡(单位是字节)
 * @param {string} path ä¸åŒçš„磁盘分区名称(不是目录名),非必填,缺省是'/'
 */
common.getTotaldisk = function (path) {
    return commonObj.getTotaldisk(!path ? "/" : path);
}
/**
 * èŽ·å–ç³»ç»Ÿç£ç›˜å‰©ä½™å¯ç”¨é‡(单位是字节)
 * @param {string} path ä¸åŒçš„磁盘分区名称(不是目录名),非必填,缺省是'/'
 * @returns
 */
common.getFreedisk = function (path) {
    return commonObj.getFreedisk(!path ? "/" : path);
}
/**
 * èŽ·å–CPU ID
 * @param {number} len éžå¿…填,缺省长度是33位长
 * @returns
 */
common.getCpuid = function () {
    return commonObj.getCpuid(33);
}
/**
 * èŽ·å–è®¾å¤‡uuid(字符串)
 * @returns
 */
common.getUuid = function () {
    return commonObj.getUuid(19);
}
/**
 * èŽ·å–è®¾å¤‡å”¯ä¸€æ ‡è¯†
 * @returns
 */
common.getSn = function () {
    let sn = std.loadFile('/etc/.sn')
    if (sn) {
        return sn
    } else {
        return commonObj.getUuid(19);
    }
}
/**
 * èŽ·å–é€šè¿‡uuid计算的mac地址,这个可以用来初始化网卡的时候用
 * @returns æ ¼å¼ç±»ä¼¼ï¼šb2:a1:63:3f:99:b6
 */
common.getUuid2mac = function () {
    return commonObj.getUuid2mac(19);
}
/**
 * èŽ·å–cpu占用率(不大于100的数字)
 * @returns
 */
common.getFreecpu = function () {
    return commonObj.getFreecpu();
}
/**
 * RSA è§£å¯† ï¼ˆç§é’¥åŠ å¯†å…¬é’¥è§£å¯†ï¼‰
 * æ¯”如公钥是
 * @param {ArrayBuffer} data è¦è§£å¯†çš„æ•°æ®ï¼Œå¿…å¡«
 * @param {string} publicKey å…¬é’¥ï¼Œå¿…å¡«
 * @returns
 */
common.arrayBufferRsaDecrypt = function (data, publicKey) {
    if (data === undefined || data === null) {
        throw new Error("dxCommon.arrayBufferRsaDecrypt:'data' parameter should not be null or empty")
    }
    if (publicKey === undefined || publicKey === null || publicKey.length < 1) {
        throw new Error("dxCommon.arrayBufferRsaDecrypt:'publicKey' parameter should not be null or empty")
    }
    return commonObj.arrayBufferRsaDecrypt(data, publicKey)
}
/**
 * @brief   Stirng aes åР坆
 */
common.aes128EcbEncrypt = function (input, key) {
    return commonObj.aes128EcbEncrypt(input, key)
}
/**
 * @brief   Stirng aes è§£å¯†
 */
common.aes128EcbDecrypt = function (input, key) {
    return commonObj.aes128EcbDecrypt(input, key)
}
/**
 * arraybuffer ecb 128bit Pkcs5Padding aes åР坆
 * @param {ArrayBuffer} input æ˜Žæ–‡
 * @param {ArrayBuffer} key å¯†é’¥
 * @returns ArrayBuffer å¯†æ–‡
 */
common.aes128EcbPkcs5PaddingEncode = function (input, key) {
    return commonObj.aes128Pkcs7PaddingEncode(input, key)
}
/**
 * arraybuffer ecb 128bit Pkcs5Padding aes è§£å¯†
 *
 * @param {ArrayBuffer} input å¯†æ–‡
 * @param {ArrayBuffer} key å¯†é’¥
 * @returns ArrayBuffer æ˜Žæ–‡
 */
common.aesEcb128Pkcs5PaddingDecode = function (input, key) {
    return commonObj.aes128Pkcs7PaddingDecode(input, key)
}
/**
 * aes ECB Pkcs5Padding 128 åР坆
 * ç¤ºä¾‹ï¼šcommon.aes128EcbPkcs5PaddingEncrypt("stamp=202008文&tic", "1234567890123456")
 * ç»“果:ef7c3cff9df57b3bcb0951938c574f969e13ffdcc1eadad298ddbd1fb1a4d2f7
 * å‚考 https://www.devglan.com/online-tools/aes-encryption-decryption
 * @param {string} input  æ˜Žæ–‡æ•°æ®
 * @param {string} key     å¯†é’¥ 16字节字符串
 * @return å¯†æ–‡ 16进制字符串
 */
common.aes128EcbPkcs5PaddingEncrypt = function (input, key) {
    let data = common.hexStringToArrayBuffer(common.strToUtf8Hex(input))
    key = common.hexStringToArrayBuffer(common.strToUtf8Hex(key))
    // åР坆
    let hex = common.arrayBufferToHexString(common.aes128EcbPkcs5PaddingEncode(data, key))
    return hex
}
/**
   * aes ECB Pkcs5Padding 128 è§£å¯†
   * @param {string} input å¯†æ–‡ 16进制字符串
   * @param {string} key   å¯†é’¥ 16字节字符串
   * @return æ˜Žæ–‡
   */
common.aes128EcbPkcs5PaddingDecrypt = function (input, key) {
    key = common.hexStringToArrayBuffer(common.strToUtf8Hex(key))
    let res = common.aesEcb128Pkcs5PaddingDecode(common.hexStringToArrayBuffer(input), key)
    return common.utf8HexToStr(common.arrayBufferToHexString(res))
}
/**
 * @brief   Stirng aes gcm åР坆
 * @param {string} plainText æ˜Žæ–‡
 * @param {string} key å¯†é’¥
 * @returns {object} {cipherData: ArrayBuffer, key: String, iv: ArrayBuffer, tag: ArrayBuffer}
 */
common.aes128GcmEncrypt = function (plainText, key) {
    return commonObj.aes128GcmEncrypt(plainText, key)
}
/**
 * @brief   Stirng aes gcm è§£å¯†
 * @param {ArrayBuffer} cipherData å¯†æ–‡
 * @param {string} key å¯†é’¥
 * @param {ArrayBuffer} iv  iv
 * @param {ArrayBuffer} tag tag
 */
common.aes128GcmDecrypt = function (chiperData, key, iv, tag) {
    return commonObj.aes128GcmDecrypt(chiperData, key, iv, tag)
}
/**
 * æ‰§è¡Œæ“ä½œç³»ç»Ÿçš„命令
 * @param {*} cmd å‘½ä»¤
 * @returns
 */
common.system = function (cmd) {
    return commonObj.system(cmd)
}
/**
 * æ‰§è¡Œæ“ä½œç³»ç»Ÿçš„命令
 * @param {*} cmd å‘½ä»¤ æ“ä½œç³»ç»Ÿå¸¸ç”¨æŒ‡ä»¤(linux绝大部分指令都支持),必填
 * @returns
 */
common.systemBrief = function (cmd) {
    return commonObj.systemBrief(cmd)
}
/**
 * æ‰§è¡Œæ“ä½œç³»ç»Ÿçš„命令并返回结果
 * @param {*} cmd å‘½ä»¤ æ“ä½œç³»ç»Ÿå¸¸ç”¨æŒ‡ä»¤(linux绝大部分指令都支持),必填
 * @param {*} resLen æŽ¥æ”¶æ•°æ®é•¿åº¦ æœ‰æ—¶å€™è¿”回的数据很大,可以通过这个值来返回固定长度的数据,必填
 * @returns
 */
common.systemWithRes = function (cmd, resLen) {
    return commonObj.systemWithRes(cmd, resLen)
}
/**
 * æ‰§è¡Œæ“ä½œç³»ç»Ÿçš„命令阻塞执行
 * @param {*} cmd å‘½ä»¤  æ“ä½œç³»ç»Ÿå¸¸ç”¨æŒ‡ä»¤(linux绝大部分指令都支持),必填
 * @returns
 */
common.systemBlocked = function (cmd) {
    return commonObj.systemBlocked(cmd)
}
/**
 * å¼‚步延迟重启
 * @param {*} delay_s å»¶è¿Ÿæ—¶é—´
 * @returns
 */
common.asyncReboot = function (delay_s) {
    return commonObj.asyncReboot(delay_s)
}
/**
 * bcc校验
 * @param {array} data eg:[49,50,51,52,53,54]对应的值是7
 * @returns æ ¡éªŒè®¡ç®—结果
 */
common.calculateBcc = function (data) {
    return commonObj.calculateBcc(data)
}
/**
 * crc校验 æ¯”如字符串'123456'校验计算的结果是数字 158520161
 * @param {string} content è¦æ ¡éªŒçš„字符串数据,
 * @returns
 */
common.crc32 = function (content) {
    if (content === undefined || content === null || typeof (content) != "string" || content.length < 1) {
        throw new Error("dxCommon.crc32:'content' paramter should not be empty")
    }
    return commonObj.crc32(content)
}
/**
 * è®¡ç®—MD5哈希,比如'123456'对应的数字数组是[49,50,51,52,53,54] å¯¹åº”çš„md5是'e10adc3949ba59abbe56e057f20f883e',
 * ä½†æ˜¯è¿”回的不是16进制字符串,是数字数组,可以使用arrToHex函数转换
 * @param {array} arr æ•°å­—数组
 * @returns æ•°å­—数组
 */
common.md5Hash = function (arr) {
    return commonObj.md5Hash(arr)
}
/**
 * æ–‡ä»¶è®¡ç®—MD5哈希,比如文件里的内容是'123456',对应的md5是'e10adc3949ba59abbe56e057f20f883e'
 * ä½†æ˜¯è¿”回的不是16进制字符串,是数字数组,可以使用arrToHex函数转换
 * @param {string} æ–‡ä»¶è·¯å¾„,绝对路径,必填,通常是以/app/code开头
 * @returns æ•°å­—数组
 */
common.md5HashFile = function (filePath) {
    if (filePath === undefined || filePath === null || typeof (filePath) != "string") {
        return null
    }
    return commonObj.md5HashFile(filePath)
}
/**
 * è®¡ç®—HMAC MD5加密,比如加密的数据是'123456',密钥是'654321',对应的结果是'357cbe6d81a8ec770799879dc8629a53'
 * ä½†æ˜¯å‚数和返回的值都是ArrayBuffer
 * @param {ArrayBuffer} data éœ€è¦åŠ å¯†çš„å†…å®¹,必填
 * @param {ArrayBuffer} key å¯†é’¥ ,必填
 * @returns ArrayBuffer
 */
common.hmacMd5Hash = function (data, key) {
    return commonObj.hmacMd5Hash(data, key)
}
/**
 * è®¡ç®—HMAC MD5加密,比如加密的数据是'123456',密钥是'654321',对应的结果是'357cbe6d81a8ec770799879dc8629a53'
 * @param {string} data éœ€è¦åŠ å¯†çš„å†…å®¹,必填
 * @param {string} key å¯†é’¥ ,必填
 * @returns ArrayBuffer
 */
common.hmac = function (data, key) {
    return commonObj.hmac(data, key)
}
/**
 * æ–‡ä»¶è®¡ç®—HMAC MD5加密,比如文件里的内容是'123456',密钥是'654321',对应的结果是'357cbe6d81a8ec770799879dc8629a53'
 * @param {string} filePath éœ€è¦åŠ å¯†çš„å†…å®¹å­˜å‚¨çš„æ–‡ä»¶è·¯å¾„ï¼Œç»å¯¹è·¯å¾„ï¼Œå¿…å¡«ï¼Œé€šå¸¸æ˜¯ä»¥/app/code开头
 * @param {array} key å¯†é’¥ ,数字数组,必填
 * @returns æ•°å­—数组
 */
common.hmacMd5HashFile = function (filePath, key) {
    return commonObj.hmacMd5HashFile(filePath, key)
}
/**
 * base64转bin文件
 * @param {string} file_path æ–‡ä»¶è·¯å¾„,必填
 * @param {string} base64Data base64数据,必填
 * @returns
 */
common.base64_2binfile = function (file_path, base64Data) {
    return commonObj.base64_2binfile(file_path, base64Data);
}
/**
 * bin文件转base64
 * @param {string} file_path æ–‡ä»¶è·¯å¾„,必填
 * @returns base64Data base64数据,必填
 */
common.binfile_2base64 = function (file_path) {
    return commonObj.binfile_2base64(file_path);
}
/**
 * åˆ‡æ¢è®¾å¤‡æ¨¡å¼
 * @description æ¨¡å¼åˆ‡æ¢åŽä¼šé‡å¯è®¾å¤‡ï¼Œè¿›å…¥æŒ‡å®šæ¨¡å¼ï¼Œä½¿ç”¨æ–¹æ³•时需完整维护相互切换的逻辑,切换为业务模式后不能使用IDE功能
 * @param {number} mode æ³¨æ„ï¼šæ—§ç‰ˆæœ¬æ¨¡å¼åˆ‡æ¢ä½¿ç”¨ï¼ˆ1、2、3),新版本模式切换使用(dev、test、prod、safe)
 * @returns true false
 */
common.setMode = function (mode) {
    // æ³¨æ„ï¼šæ—§ç‰ˆæœ¬æ¨¡å¼åˆ‡æ¢ä½¿ç”¨ï¼ˆ1、2、3)
    if (mode == 1) {
        //生产模式
        commonObj.systemWithRes(`echo 'app' > /etc/.mode`, 2)
        // 1.0版本切换为其他模式后删除工厂检测(后续版本可能会调整)
        commonObj.systemWithRes(`rm -rf /test`, 2)
    } else if (mode == 2) {
        //调试模式
        commonObj.systemWithRes(`echo 'debug' > /etc/.mode`, 2)
        // 1.0版本切换为其他模式后删除工厂检测(后续版本可能会调整)
        commonObj.systemWithRes(`rm -rf /test`, 2)
    } else if (mode == 3) {
        //试产模式
        commonObj.systemWithRes(`echo 'pp' > /etc/.mode`, 2)
    }
    // æ³¨æ„ï¼šæ–°ç‰ˆæœ¬æ¨¡å¼åˆ‡æ¢ä½¿ç”¨ï¼ˆdev、test、prod、safe)
    else if (mode == "dev") {
        //开发模式
        commonObj.systemWithRes(`echo 'dev' > /etc/.mode_v1`, 2)
    } else if (mode == "test") {
        //测试模式(试产模式)
        commonObj.systemWithRes(`echo 'test' > /etc/.mode_v1`, 2)
    } else if (mode == "prod") {
        //生产模式
        commonObj.systemWithRes(`echo 'prod' > /etc/.mode_v1`, 2)
    } else if (mode == "safe") {
        //安全模式
        commonObj.systemWithRes(`echo 'safe' > /etc/.mode_v1`, 2)
    } else {
        return false
    }
    commonObj.systemWithRes(`sync`, 2)
    commonObj.asyncReboot(2)
    return true
}
/**
 * æŸ¥è¯¢è®¾å¤‡æ¨¡å¼
 * @description èŽ·å–è®¾å¤‡å½“å‰æ¨¡å¼
 * @returns ä¸šåŠ¡æ¨¡å¼ï¼š1,开发模式:2,工厂模式:28, å¼‚常模式:-1
 */
common.getMode = function () {
    let ret = commonObj.systemWithRes(`test -e "/etc/.mode" && echo "OK" || echo "NO"`, 2)
    if (ret.includes('NO')) {
        return 28
    }
    let mode = commonObj.systemWithRes(`cat "/etc/.mode"`, 10)
    if (mode.includes('app')) {
        return 1
    } else if (mode.includes('debug')) {
        return 2
    } else {
        return -1
    }
}
/**
 * åå…­è¿›åˆ¶è½¬å­—节数组 eg:313233616263->[49,50,51,97,98,99]
 * @param {string} str 16进制字符串 å°å†™ä¸”中间无空隔的十六进制字符串
 * @returns æ•°å­—æ•°å­—
 */
common.hexToArr = function (str) {
    if (str === undefined || str === null || (typeof str) != 'string' || str.length < 1) {
        throw new Error("dxCommon.hexToArr:'str' parameter should not be empty")
    }
    let regex = /.{2}/g;
    let arr = str.match(regex);
    return arr.map(item => parseInt(item, 16));
}
/**
 * å­—节数组转十六进制 eg:[49,50,51,97,98,99]->313233616263
 * @param {array}numbers æ•°å­—数组
 * @returns str 16进制字符串 å°å†™ä¸”中间无空隔的十六进制字符串
 */
common.arrToHex = function (numbers) {
    const hexArray = numbers.map(num => num.toString(16).padStart(2, '0').toLowerCase());
    const hexString = hexArray.join('');
    return hexString;
}
/**
 * åå…­è¿›åˆ¶è½¬å­—符串 eg:313233616263->123abc
 * æ³¨æ„å¦‚æžœ16进制字符串是由中文转过去的,再转回中文字符串会有乱码,因为是一个一个字节的转换
 * @param {string} str è¦è½¬çš„16进制字符串
 * @returns
 */
common.hexToString = function (str) {
    let regex = /.{2}/g;
    let arr = str.match(regex);
    arr = arr.map(item => String.fromCharCode(parseInt(item, 16)));
    return arr.join("");
}
// å°†å­—符串转换为 UTF-8 ç¼–码的16进制字符串
common.strToUtf8Hex = function (str) {
    const bytes = [];
    for (let i = 0; i < str.length; i++) {
        let code = str.charCodeAt(i);
        if (code < 0x80) {
            bytes.push(code);
        } else if (code < 0x800) {
            bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
        } else if (code < 0xd800 || code >= 0xe000) {
            bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
        } else {
            // å¤„理 Unicode ç¼–码
            i++;
            code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));
            bytes.push(
                0xf0 | (code >> 18),
                0x80 | ((code >> 12) & 0x3f),
                0x80 | ((code >> 6) & 0x3f),
                0x80 | (code & 0x3f)
            );
        }
    }
    return this.arrToHex(bytes);
}
/**
 * ä¼ é€’过来的utf-8的16进制字符串转换成字符串
 * @param {string} hex
 * @returns
 */
common.utf8HexToStr = function (hex) {
    let array = this.hexToArr(hex)
    var out, i, len, c;
    var char2, char3;
    out = "";
    len = array.length;
    i = 0;
    while (i < len) {
        c = array[i++];
        switch (c >> 4) {
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                // 0xxxxxxx
                out += String.fromCharCode(c);
                break;
            case 12: case 13:
                // 110x xxxx   10xx xxxx
                char2 = array[i++];
                out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                break;
            case 14:
                // 1110 xxxx  10xx xxxx  10xx xxxx
                char2 = array[i++];
                char3 = array[i++];
                out += String.fromCharCode(((c & 0x0F) << 12) |
                    ((char2 & 0x3F) << 6) |
                    ((char3 & 0x3F) << 0));
                break;
        }
    }
    return out;
}
/**
 * å­—符串转十六进制 eg:123abc->313233616263
 * @param {string} str è¦è½¬çš„字符串
 * @returns
 */
common.stringToHex = function (str) {
    if (str === undefined || str === null || typeof (str) != "string") {
        return null
    }
    let val = "";
    for (let i = 0; i < str.length; i++) {
        val += str.charCodeAt(i).toString(16)
    }
    return val
}
/**
 * å°ç«¯æ ¼å¼è½¬åè¿›åˆ¶æ•° eg:001001->69632
 * @param {string} hexString 16进制字符串 å°å†™ä¸”中间无空隔的十六进制字符串
 * @returns æ•°å­—
 */
common.littleEndianToDecimal = function (hexString) {
    // å°†å°ç«¯æ ¼å¼çš„十六进制字符串进行反转
    let reversedHexString = hexString
        .match(/.{2}/g)  // æ¯ä¸¤ä¸ªå­—符分隔
        .reverse()  // åè½¬æ•°ç»„
        .join("");  // åˆå¹¶ä¸ºå­—符串
    // å°†åè½¬åŽçš„十六进制字符串转换为十进制数
    let decimal = parseInt(reversedHexString, 16);
    return decimal;
}
/**
 * åè¿›åˆ¶æ•°è½¬æ¢ä¸º16进制小端格式字符串
 * eg:300->2c01
 * eg:230->e600
 * @param {number} decimalNumber åè¿›åˆ¶æ•°å­—,必填
 * @param {number} byteSize ç”Ÿæˆä½æ•° å­—节的个数,如果超出实际字节个数,会在右边补0,低于会截取,非必填,缺省是2
 * @returns
 */
common.decimalToLittleEndianHex = function (decimalNumber, byteSize) {
    if (decimalNumber === undefined || decimalNumber === null || (typeof decimalNumber) != 'number') {
        throw new Error("dxCommon.decimalToLittleEndianHex:'decimalNumber' parameter should be number")
    }
    if (byteSize === undefined || byteSize === null || (typeof byteSize) != 'number' || byteSize <= 0) {
        byteSize = 2
    }
    const littleEndianBytes = [];
    for (let i = 0; i < byteSize; i++) {
        littleEndianBytes.push(decimalNumber & 0xFF);
        decimalNumber >>= 8;//相当于除以256
    }
    const littleEndianHex = littleEndianBytes
        .map((byte) => byte.toString(16).padStart(2, '0'))
        .join('');
    return littleEndianHex;
}
/**
 * å°†16进制字符串转换为ArrayBuffer
 * @param {*} hexString è¦è½¬æ¢çš„16进制字符串
 * @returns
 */
common.hexStringToArrayBuffer = function (hexString) {
    return this.hexStringToUint8Array(hexString).buffer;
}
/**
 * å°†16进制字符串转换为Uint8Array
 * @param {string} hexString è¦è½¬æ¢çš„16进制字符串,小写且中间无空隔的十六进制字符串
 * @returns Uint8Array对象
 */
common.hexStringToUint8Array = function (hexString) {
    if (hexString === undefined || hexString === null || (typeof hexString) != 'string' || hexString.length <= 0) {
        throw new Error("dxCommon.hexStringToUint8Array:'hexString' parameter should not be empty")
    }
    let byteString = hexString.match(/.{1,2}/g);
    let byteArray = byteString.map(function (byte) {
        return parseInt(byte, 16);
    });
    let buffer = new Uint8Array(byteArray);
    return buffer;
}
/**
 * å°† ArrayBuffer è½¬æ¢ä¸ºåå…­è¿›åˆ¶å­—符串格式
 * @param {ArrayBuffer} buffer
 * @returns å°å†™ä¸”中间无空隔的十六进制字符串
 */
common.arrayBufferToHexString = function (buffer) {
    return this.uint8ArrayToHexString(new Uint8Array(buffer))
}
/**
 * å°† Uint8Array è½¬æ¢ä¸ºåå…­è¿›åˆ¶å­—符串格式
 * @param {Uint8Array} array
 * @returns å°å†™ä¸”中间无空隔的十六进制字符串
 */
common.uint8ArrayToHexString = function (array) {
    let hexString = '';
    for (let i = 0; i < array.length; i++) {
        const byte = array[i].toString(16).padStart(2, '0');
        hexString += byte;
    }
    return hexString
}
/**
 * è®¾ç½®/获取组件句柄id通用方法
 * @param {string} name ç»„件名,必填
 * @param {string} id å¥æŸ„id,非必填
 * @param {number} pointer å¥æŸ„指针数字,非必填
 * @returns
 */
common.handleId = function (name, id, pointer) {
    // ç»„件名不能为空
    if (name === undefined || name === null || name === "" || typeof name !== 'string') {
        return
    }
    let map = dxMap.get('handleIds')
    // å¥æŸ„id
    if (id === undefined || id === null || id === "" || typeof id !== 'string') {
        id = "__" + name + "_default"
    }
    if (pointer === undefined || pointer === null || typeof pointer !== 'number') {
        // pointer为空则为获取
        return map.get(id)
    } else {
        // pointer不为空则为设置
        let isExist = map.get(id)
        if (isExist) {
            // å¥æŸ„已存在
            return
        }
        map.put(id, pointer)
    }
}
export default common
vf107/dxmodules/dxCommonUtils.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,867 @@
/**
 * Common Utils Module based on the native common_utils_bridge C library.
 *
 * This module provides a collection of common utilities organized into namespaces.
 * It is designed as a stateless, singleton-like utility library.
 *
 * Features:
 * - `crypto`: Hashing (MD5, HMAC-MD5), symmetric encryption (AES),
 *             and asymmetric encryption (RSA).
 * - `fs`: File system operations, such as converting files to/from Base64.
 * - `codec`: Data encoding and decoding functions (Hex, Base64, UTF-8, etc.).
 * - `random`: Generation of cryptographically secure random bytes and simple
 *           random strings.
 *
 * Usage:
 * import dxCommonUtils from './dxCommonUtils.js';
 * const md5Hash = dxCommonUtils.crypto.md5('hello');
 *
 * Doc/Demo: https://github.com/DejaOS/DejaOS
 */
import { commonUtilsClass } from './libvbar-m-dxcommonutils.so'
const dxCommonUtils = {};
// ----------- Constants & Enums -------------------
dxCommonUtils.AES_MODE = {
    ECB: 'ECB',
    CBC: 'CBC',
    CFB: 'CFB',
    OFB: 'OFB',
    CTR: 'CTR'
};
dxCommonUtils.AES_KEY_SIZE = {
    BITS_128: 128,
    BITS_192: 192,
    BITS_256: 256
};
dxCommonUtils.AES_PADDING = {
    PKCS7: 'PKCS7',
    NONE: 'NoPadding'
};
dxCommonUtils.RSA_KEY_SIZE = {
    BITS_1024: 1024,
    BITS_2048: 2048,
    BITS_4096: 4096
};
const utils = new commonUtilsClass();
// ----------- Crypto Namespace -------------------
dxCommonUtils.crypto = {};
dxCommonUtils.crypto.aes = {};
dxCommonUtils.crypto.rsa = {};
/**
 * Calculates MD5 hash of the input string.
 * @param {string|ArrayBuffer|Uint8Array} data - The data to hash. If a string is provided, it will be treated as UTF-8.
 * @returns {string} MD5 hash in hexadecimal format.
 */
dxCommonUtils.crypto.md5 = function (data) {
    const buffer = _normalizeDataToBuffer(data, false, 'Data');
    return utils.md5(buffer);
}
/**
 * Calculates HMAC-MD5 hash using the provided key.
 * @param {string|ArrayBuffer|Uint8Array} data - The data to hash. If a string is provided, it will be treated as UTF-8.
 * @param {string|ArrayBuffer|Uint8Array} key - The secret key for HMAC. If a string is provided, it will be treated as UTF-8.
 * @returns {string} HMAC-MD5 hash in hexadecimal format.
 */
dxCommonUtils.crypto.hmacMd5 = function (data, key) {
    const dataBuffer = _normalizeDataToBuffer(data, false, 'Data');
    const keyBuffer = _normalizeDataToBuffer(key, false, 'Key');
    return utils.hmacMd5(dataBuffer, keyBuffer);
}
/**
 * Calculates a hash of the input data using the specified algorithm.
 * @param {string|ArrayBuffer|Uint8Array} data - The data to hash. If a string is provided, it will be treated as UTF-8.
 * @param {string} [hashAlgorithm='SHA-256'] - The hash algorithm to use (e.g., 'SHA-256', 'MD5', 'SHA1', 'SHA-384', 'SHA-512').
 * @returns {string} The hash in hexadecimal format.
 */
dxCommonUtils.crypto.hash = function (data, hashAlgorithm = 'SHA-256') {
    const buffer = _normalizeDataToBuffer(data, false, 'Data');
    return utils.hash(buffer, hashAlgorithm);
}
/**
 * Encrypts data using AES encryption.
 * @param {string|ArrayBuffer|Uint8Array} data - The data to encrypt. If a string is provided, it will be treated as UTF-8.
 * @param {string|ArrayBuffer|Uint8Array} key - The encryption key. Can be a hex string, an ArrayBuffer, or a Uint8Array.
 * @param {object} options - Encryption options.
 * @param {string} [options.mode='CBC'] - The AES mode, from dxCommonUtils.AES_MODE.
 * @param {number} [options.keySize=256] - The key size in bits (128, 192, or 256), from dxCommonUtils.AES_KEY_SIZE.
 * @param {string|ArrayBuffer|Uint8Array} [options.iv] - The initialization vector (required for non-ECB modes). This is ignored if useSalt is true.
 * @param {string} [options.padding='PKCS7'] - The padding scheme, from dxCommonUtils.AES_PADDING. Defaults to PKCS7.
 * @param {boolean} [options.useSalt=false] - If true, generates an OpenSSL-compatible salted ciphertext. The provided 'key' is used as a password (UTF-8 string) to derive the actual key and IV.
 * @returns {string} The encrypted data as a Base64 string.
 */
dxCommonUtils.crypto.aes.encrypt = function (data, key, options = {}) {
    // Set default options, including PKCS7 padding by default
    const finalOptions = Object.assign({
        mode: dxCommonUtils.AES_MODE.CBC,
        keySize: 256,
        padding: dxCommonUtils.AES_PADDING.PKCS7,
        useSalt: false // Default to false for backward compatibility
    }, options);
    let keyBuffer;
    if (finalOptions.useSalt) {
        // In salted mode, a string key is treated as a password (UTF-8).
        keyBuffer = _normalizeDataToBuffer(key, false, 'Key');
    } else {
        // In non-salted mode, a string key is treated as a raw key in hex format.
        keyBuffer = _normalizeHexInput(key, 'Key');
        // Key length must be validated for non-salted keys.
        const expectedKeyLength = finalOptions.keySize / 8;
        if (keyBuffer.byteLength !== expectedKeyLength) {
            throw new Error(`Key length must be ${expectedKeyLength} bytes for ${finalOptions.keySize}-bit AES`);
        }
    }
    // Validate mode and keySize
    if (!Object.values(dxCommonUtils.AES_MODE).includes(finalOptions.mode)) {
        throw new Error("options.mode must be one of dxCommonUtils.AES_MODE values");
    }
    if (!Object.values(dxCommonUtils.AES_KEY_SIZE).includes(finalOptions.keySize)) {
        throw new Error("options.keySize must be one of dxCommonUtils.AES_KEY_SIZE values");
    }
    // Validate padding
    if (finalOptions.padding !== undefined) {
        if (typeof finalOptions.padding !== 'string' || !Object.values(dxCommonUtils.AES_PADDING).includes(finalOptions.padding)) {
            throw new Error("options.padding must be one of dxCommonUtils.AES_PADDING values");
        }
        if (finalOptions.padding === dxCommonUtils.AES_PADDING.NONE) {
            const dataBuffer = _normalizeDataToBuffer(data, false, 'Data');
            if (dataBuffer.byteLength % 16 !== 0) {
                throw new Error("Data length must be a multiple of 16 bytes when using NoPadding");
            }
        }
    }
    const ivBuffer = (finalOptions.iv && !finalOptions.useSalt) ? _normalizeHexInput(finalOptions.iv) : null;
    const dataBuffer = _normalizeDataToBuffer(data, false, 'Data');
    const encrypted = utils.aesEncrypt(dataBuffer, keyBuffer, { ...finalOptions, iv: ivBuffer });
    if (encrypted === null) {
        throw new Error("AES encryption failed. Check parameters.");
    }
    return dxCommonUtils.codec.arrayBufferToBase64(encrypted);
};
/**
 * Decrypts data using AES encryption.
 * Note: This function automatically handles OpenSSL's "Salted__" format if present in the encrypted data.
 * @param {string|ArrayBuffer|Uint8Array} encryptedData - The encrypted data. If a string, it is assumed to be Base64.
 * @param {string|ArrayBuffer|Uint8Array} key - The decryption key. If a string, it will be treated as a password (UTF-8) for salted data, or as a hex string for non-salted data.
 * @param {object} options - Decryption options.
 * @param {string} [options.mode='CBC'] - The AES mode, from dxCommonUtils.AES_MODE.
 * @param {number} [options.keySize=256] - The key size in bits (128, 192, or 256), from dxCommonUtils.AES_KEY_SIZE. This is also used for key derivation in "Salted__" format.
 * @param {string|ArrayBuffer|Uint8Array} [options.iv] - The initialization vector (required for non-ECB modes and non-salted data). If a string, it must be Hex.
 * @param {string} [options.padding='PKCS7'] - The padding scheme, from dxCommonUtils.AES_PADDING. Defaults to PKCS7.
 * @returns {ArrayBuffer|null} The decrypted data as an ArrayBuffer. Returns null on decryption failure (e.g., bad key or padding).
 */
dxCommonUtils.crypto.aes.decrypt = function (encryptedData, key, options = {}) {
    // Set default options, including PKCS7 padding by default
    const finalOptions = Object.assign({
        mode: dxCommonUtils.AES_MODE.CBC,
        keySize: 256,
        padding: dxCommonUtils.AES_PADDING.PKCS7
    }, options);
    // Validate mode and keySize
    if (!Object.values(dxCommonUtils.AES_MODE).includes(finalOptions.mode)) {
        throw new Error("options.mode must be one of dxCommonUtils.AES_MODE values");
    }
    if (!Object.values(dxCommonUtils.AES_KEY_SIZE).includes(finalOptions.keySize)) {
        throw new Error("options.keySize must be one of dxCommonUtils.AES_KEY_SIZE values");
    }
    // Validate padding
    if (finalOptions.padding !== undefined) {
        if (typeof finalOptions.padding !== 'string' || !Object.values(dxCommonUtils.AES_PADDING).includes(finalOptions.padding)) {
            throw new Error("options.padding must be one of dxCommonUtils.AES_PADDING values");
        }
    }
    const encryptedDataBuffer = _normalizeDataToBuffer(encryptedData, true); // true for base64
    // Auto-detect if the data is in OpenSSL's "Salted__" format
    let isSalted = false;
    if (encryptedDataBuffer.byteLength >= 16) {
        const header = new Uint8Array(encryptedDataBuffer, 0, 8);
        // "Salted__" in ASCII: 83 97 108 116 101 100 95 95
        const saltedHeader = new Uint8Array([83, 97, 108, 116, 101, 100, 95, 95]);
        isSalted = header.every((value, index) => value === saltedHeader[index]);
    }
    let keyBuffer;
    if (isSalted) {
        // If data is salted, a string key is treated as a password (UTF-8).
        keyBuffer = _normalizeDataToBuffer(key, false, 'Key');
    } else {
        // If data is not salted, a string key is treated as a raw key in hex format.
        keyBuffer = _normalizeHexInput(key, 'Key');
        // Key length must be validated for non-salted keys.
        const expectedKeyLength = finalOptions.keySize / 8;
        if (keyBuffer.byteLength !== expectedKeyLength) {
            throw new Error(`Key length must be ${expectedKeyLength} bytes for ${finalOptions.keySize}-bit AES`);
        }
    }
    const ivBuffer = finalOptions.iv ? _normalizeHexInput(finalOptions.iv) : null;
    return utils.aesDecrypt(encryptedDataBuffer, keyBuffer, { ...finalOptions, iv: ivBuffer });
};
/**
 * Convenience method for AES-256-CBC encryption with automatic IV generation.
 * The key is treated as a Hex string. The plaintext data is treated as a UTF-8 string.
 * @param {string} data - The UTF-8 data to encrypt.
 * @param {string|ArrayBuffer|Uint8Array} key - The encryption key (32 bytes). If a string, it must be Hex.
 * @returns {{encrypted: string, iv: string}} Object containing Base64 encrypted data and the generated IV as a hex string.
 */
dxCommonUtils.crypto.aes.encryptWithRandomIV = function (data, key) {
    if (typeof data !== 'string') {
        throw new Error('Data must be a UTF-8 string for this convenience function.');
    }
    const keyBuffer = _normalizeHexInput(key, 'Key');
    if (keyBuffer.byteLength !== 32) {
        throw new Error('Key must be 32 bytes for AES-256');
    }
    // 1. Generate 16 random bytes, returned directly as a hex string.
    const ivHex = dxCommonUtils.random.getBytes(16);
    // 2. Encrypt using the main AES function.
    const encrypted = dxCommonUtils.crypto.aes.encrypt(data, keyBuffer, {
        mode: 'CBC',
        keySize: 256,
        iv: ivHex
    });
    // 3. Return the encrypted data and the hex-encoded IV.
    return {
        encrypted: encrypted,
        iv: ivHex
    };
}
/**
 * Generates a new RSA key pair.
 * @param {number} [bits=2048] - Key size in bits: 1024, 2048, or 4096.
 * @returns {object} Object containing privateKey and publicKey in PEM format.
 */
dxCommonUtils.crypto.rsa.generateKeyPair = function (bits = 2048) {
    if (![1024, 2048, 4096].includes(bits)) {
        throw new Error('RSA key size must be 1024, 2048, or 4096 bits');
    }
    return utils.generateRsaKeyPair(bits);
}
/**
 * Encrypts data using RSA public key.
 * @param {string|ArrayBuffer|Uint8Array} data - The data to encrypt. If a string is provided, it will be treated as UTF-8.
 * @param {string} publicKey - PEM formatted RSA public key.
 * @returns {string} Base64 encoded encrypted data.
 */
dxCommonUtils.crypto.rsa.encrypt = function (data, publicKey) {
    const dataBuffer = _normalizeDataToBuffer(data, false, 'Data');
    if (typeof publicKey !== 'string') {
        throw new Error('Public key must be a PEM string');
    }
    if (!publicKey.includes('-----BEGIN PUBLIC KEY-----')) {
        throw new Error('Public key must be in PEM format');
    }
    return utils.rsaEncrypt(dataBuffer, publicKey);
}
/**
 * Decrypts RSA encrypted data using private key.
 * @param {string} encryptedData - Base64 encoded encrypted data.
 * @param {string} privateKey - PEM formatted RSA private key.
 * @returns {ArrayBuffer|null} The decrypted data as an ArrayBuffer. Returns null on decryption failure.
 */
dxCommonUtils.crypto.rsa.decrypt = function (encryptedData, privateKey) {
    if (typeof encryptedData !== 'string') {
        throw new Error('Encrypted data must be a Base64 string');
    }
    if (typeof privateKey !== 'string') {
        throw new Error('Private key must be a PEM string');
    }
    if (!privateKey.includes('-----BEGIN PRIVATE KEY-----')) {
        throw new Error('Private key must be in PEM format');
    }
    // Decode the Base64 input to an ArrayBuffer before passing to native code.
    const encryptedBuffer = dxCommonUtils.codec.base64ToArrayBuffer(encryptedData);
    // Pass the privateKey string directly, as the C layer expects a PEM string.
    const decryptedBuffer = utils.rsaDecrypt(encryptedBuffer, privateKey);
    if (!decryptedBuffer) {
        // Return null instead of throwing to match AES behavior
        return null;
    }
    return decryptedBuffer; // Return the raw ArrayBuffer
};
/**
 * Creates a digital signature for data using an RSA private key.
 * This is the core function needed for standards like JWT (RS256/RS384/RS512).
 * @param {string|ArrayBuffer|Uint8Array} data - The data to sign. If a string, it will be treated as UTF-8.
 * @param {string} privateKey - The PEM formatted RSA private key.
 * @param {string} [hashAlgorithm='SHA-256'] - The hash algorithm to use (e.g., 'SHA-256', 'SHA-384', 'SHA-512').
 * @returns {string} The signature as a Base64 encoded string.
 */
dxCommonUtils.crypto.rsa.sign = function (data, privateKey, hashAlgorithm = 'SHA-256') {
    const dataBuffer = _normalizeDataToBuffer(data, false, 'Data');
    if (typeof privateKey !== 'string' || !privateKey.includes('-----BEGIN PRIVATE KEY-----')) {
        throw new Error('Private key must be a PEM string');
    }
    return utils.rsaSign(dataBuffer, privateKey, hashAlgorithm);
};
/**
 * Verifies a digital signature using an RSA public key.
 * This is the counterpart to `rsa.sign` and is used to validate signatures like those in JWT.
 * @param {string|ArrayBuffer|Uint8Array} data - The original, unsigned data.
 * @param {string|ArrayBuffer|Uint8Array} signature - The signature to verify. If a string, it must be Base64 encoded.
 * @param {string} publicKey - The PEM formatted RSA public key.
 * @param {string} [hashAlgorithm='SHA-256'] - The hash algorithm used for signing (e.g., 'SHA-256', 'SHA-384', 'SHA-512').
 * @returns {boolean} True if the signature is valid, otherwise false.
 */
dxCommonUtils.crypto.rsa.verify = function (data, signature, publicKey, hashAlgorithm = 'SHA-256') {
    const dataBuffer = _normalizeDataToBuffer(data, false, 'Data');
    // The C layer expects a raw ArrayBuffer, so we decode the Base64 signature here in JS.
    const signatureBuffer = _normalizeDataToBuffer(signature, true, 'Signature');
    if (typeof publicKey !== 'string' || !publicKey.includes('-----BEGIN PUBLIC KEY-----')) {
        throw new Error('Public key must be a PEM string');
    }
    return utils.rsaVerify(dataBuffer, signatureBuffer, publicKey, hashAlgorithm);
};
/**
 * Parses a PEM formatted X.509 certificate and returns its details.
 * @param {string} pemString - The certificate content in PEM format.
 * @returns {object} An object containing certificate details:
 *                   - serialNumber (string)
 *                   - issuer (string)
 *                   - subject (string)
 *                   - validFrom (string)
 *                   - validTo (string)
 *                   - publicKey (string, in PEM format)
 */
dxCommonUtils.crypto.parsePEM = function (pemString) {
    if (typeof pemString !== 'string' || !pemString.includes('-----BEGIN CERTIFICATE-----')) {
        throw new Error('Input must be a PEM formatted certificate string');
    }
    return utils.parsePEMCertificate(pemString);
};
/**
 * Verifies if a certificate was signed by a given Certificate Authority (CA).
 * @param {string} certPEM - The certificate to verify, in PEM format.
 * @param {string} caCertPEM - The CA's certificate, in PEM format.
 * @returns {boolean} True if the certificate is signed by the CA.
 * @throws {Error} If the native verification fails due to parsing errors or signature mismatch.
 */
dxCommonUtils.crypto.verifyCertificate = function (certPEM, caCertPEM) {
    if (typeof certPEM !== 'string' || !certPEM.includes('-----BEGIN CERTIFICATE-----')) {
        throw new Error('Input certPEM must be a PEM formatted certificate string');
    }
    if (typeof caCertPEM !== 'string' || !caCertPEM.includes('-----BEGIN CERTIFICATE-----')) {
        throw new Error('Input caCertPEM must be a PEM formatted certificate string');
    }
    return utils.verifyCertificate(certPEM, caCertPEM);
};
// =====================================================================================
// == FS (File System) Namespace =====================================================
// =====================================================================================
dxCommonUtils.fs = {};
/**
 * Reads the entire content of a file and returns it as a Base64 encoded string.
 * @memberof dxCommonUtils.fs
 * @param {string} filePath - The path to the file.
 * @returns {string} The Base64 encoded content of the file.
 */
dxCommonUtils.fs.fileToBase64 = function (filePath) {
    if (typeof filePath !== 'string' || filePath.length === 0) {
        throw new Error("filePath must be a non-empty string.");
    }
    return utils.fileToBase64(filePath);
}
/**
 * Decodes a Base64 string and writes the binary data to a file.
 * This will overwrite the file if it already exists.
 * @memberof dxCommonUtils.fs
 * @param {string} filePath - The path to the file to be written.
 * @param {string} base64String - The Base64 encoded data.
 * @returns {boolean} Returns true on success.
 */
dxCommonUtils.fs.base64ToFile = function (filePath, base64String) {
    if (typeof filePath !== 'string' || filePath.length === 0) {
        throw new Error("filePath must be a non-empty string.");
    }
    if (typeof base64String !== 'string') {
        throw new Error("base64String must be a string.");
    }
    return utils.base64ToFile(filePath, base64String);
}
// =====================================================================================
// == Random Namespace ===============================================================
// =====================================================================================
dxCommonUtils.random = {};
/**
 * Generates cryptographically secure random bytes.
 * @param {number} length - Number of bytes to generate.
 * @returns {string} Random bytes as a hex string.
 */
dxCommonUtils.random.getBytes = function (length) {
    if (typeof length !== 'number' || length <= 0) {
        throw new Error('Length must be a positive number');
    }
    return utils.generateRandomBytes(length);
}
/**
 * Generates a non-cryptographically secure random string from a given charset.
 * @param {number} length - The length of the string to generate.
 * @param {string} [charset] - The set of characters to use. Defaults to alphanumeric.
 * @returns {string} The generated random string.
 */
dxCommonUtils.random.getStr = function (length, charset) {
    if (typeof length !== 'number' || length <= 0) {
        throw new Error('Length must be a positive number');
    }
    const charSet = charset || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let result = '';
    const charSetLength = charSet.length;
    for (let i = 0; i < length; i++) {
        result += charSet.charAt(Math.floor(Math.random() * charSetLength));
    }
    return result;
}
// ----------- Codec Namespace -------------------
dxCommonUtils.codec = {};
/**
 * Hexadecimal to byte array eg: 313233616263->[49,50,51,97,98,99]
 * @param {string} str A hexadecimal string in lowercase with no space in between
 * @returns {number[]} Digital numbers
 */
dxCommonUtils.codec.hexToBytes = function (str) {
    if (str === undefined || str === null || (typeof str) != 'string' || str.length < 1) {
        throw new Error("dxCommonUtils.codec.hexToBytes:'str' parameter should not be empty")
    }
    if (!/^[0-9a-fA-F]+$/.test(str) || str.length % 2 !== 0) {
        throw new Error("dxCommonUtils.codec.hexToBytes: 'str' parameter must be a valid hex string with an even length");
    }
    let regex = /.{2}/g;
    let arr = str.match(regex);
    return arr.map(item => parseInt(item, 16));
}
/**
 * Byte array to hexadecimal eg: [49,50,51,97,98,99] ->313233616263
 * @param {number[]} numbers Numeric array
 * @returns {string} A hexadecimal string in lowercase with no space in between
 */
dxCommonUtils.codec.bytesToHex = function (numbers) {
    const hexArray = numbers.map(num => num.toString(16).padStart(2, '0').toLowerCase());
    const hexString = hexArray.join('');
    return hexString;
}
/**
 * Hexadecimal to string conversion eg: 313233616263->123abc
 * @description WARNING: This function only works for single-byte character sets (like ASCII).
 * For multi-byte characters (like Chinese), please use `codec.utf8HexToStr`.
 * @param {string} str The hexadecimal string to be converted
 * @returns {string} The real string
 */
dxCommonUtils.codec.hexToStr = function (str) {
    let regex = /.{2}/g;
    let arr = str.match(regex);
    arr = arr.map(item => String.fromCharCode(parseInt(item, 16)));
    return arr.join("");
}
/**
 * Convert a string to a UTF-8 encoded hexadecimal string
 * @param {string} str
 * @returns {string}
 */
dxCommonUtils.codec.strToUtf8Hex = function (str) {
    const bytes = [];
    for (let i = 0; i < str.length; i++) {
        let code = str.charCodeAt(i);
        if (code < 0x80) {
            bytes.push(code);
        } else if (code < 0x800) {
            bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
        } else if (code < 0xd800 || code >= 0xe000) {
            bytes.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));
        } else {
            i++;
            code = 0x10000 + (((code & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));
            bytes.push(
                0xf0 | (code >> 18),
                0x80 | ((code >> 12) & 0x3f),
                0x80 | ((code >> 6) & 0x3f),
                0x80 | (code & 0x3f)
            );
        }
    }
    return dxCommonUtils.codec.bytesToHex(bytes);
}
/**
 * Convert the hexadecimal string of utf-8 passed over to a string
 * @param {string} hex Hexadecimal string
 * @returns {string} The real string
 */
dxCommonUtils.codec.utf8HexToStr = function (hex) {
    let array = dxCommonUtils.codec.hexToBytes(hex)
    var out, i, len, c;
    var char2, char3;
    out = "";
    len = array.length;
    i = 0;
    while (i < len) {
        c = array[i++];
        switch (c >> 4) {
            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
                out += String.fromCharCode(c);
                break;
            case 12: case 13:
                char2 = array[i++];
                out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
                break;
            case 14:
                char2 = array[i++];
                char3 = array[i++];
                out += String.fromCharCode(((c & 0x0F) << 12) |
                    ((char2 & 0x3F) << 6) |
                    ((char3 & 0x3F) << 0));
                break;
        }
    }
    return out;
}
/**
 * Convert string to hexadecimal eg: 123abc ->313233616263
 * @description WARNING: This function only works for single-byte character sets (like ASCII).
 * For multi-byte characters (like Chinese), please use `codec.strToUtf8Hex`.
 * @param {string} str The string to be converted
 * @returns {string} Hexadecimal string
 */
dxCommonUtils.codec.strToHex = function (str) {
    if (str === undefined || str === null || typeof (str) != "string") {
        return null
    }
    let val = "";
    for (let i = 0; i < str.length; i++) {
        val += str.charCodeAt(i).toString(16).padStart(2, '0');
    }
    return val
}
/**
 * Convert small format to decimal eg: 001001->69632
 * @param {string} hexString A hexadecimal string in lowercase with no space in between
 * @returns {number} Decimal number
 */
dxCommonUtils.codec.leToDecimal = function (hexString) {
    let reversedHexString = hexString
        .match(/.{2}/g)
        .reverse()
        .join("");
    let decimal = parseInt(reversedHexString, 16);
    return decimal;
}
/**
 * Convert decimal numbers to hexadecimal small format strings
 * @param {number} decimalNumber Decimal digit
 * @param {number} byteSize Generate the number of bytes, defaults to 2
 * @returns {string} Hexadecimal small format string
 */
dxCommonUtils.codec.decimalToLeHex = function (decimalNumber, byteSize) {
    if (decimalNumber === undefined || decimalNumber === null || (typeof decimalNumber) != 'number') {
        throw new Error("dxCommonUtils.codec.decimalToLeHex:'decimalNumber' parameter should be number")
    }
    if (byteSize === undefined || byteSize === null || (typeof byteSize) != 'number' || byteSize <= 0) {
        byteSize = 2
    }
    const littleEndianBytes = [];
    for (let i = 0; i < byteSize; i++) {
        littleEndianBytes.push(decimalNumber & 0xFF);
        decimalNumber >>= 8;
    }
    const littleEndianHex = littleEndianBytes
        .map((byte) => byte.toString(16).padStart(2, '0'))
        .join('');
    return littleEndianHex;
}
/**
 * Convert a hexadecimal string to an ArrayBuffer
 * @param {string} hexString The hexadecimal string to be converted
 * @returns {ArrayBuffer} Converted ArrayBuffer
 */
dxCommonUtils.codec.hexToArrayBuffer = function (hexString) {
    return dxCommonUtils.codec.hexToUint8Array(hexString).buffer;
}
/**
 * Convert hexadecimal string to Uint8Array
 * @param {string} hexString The hexadecimal string to be converted
 * @returns {Uint8Array} Uint8Array object
 */
dxCommonUtils.codec.hexToUint8Array = function (hexString) {
    if (hexString === undefined || hexString === null || (typeof hexString) != 'string' || hexString.length <= 0) {
        throw new Error("dxCommonUtils.codec.hexToUint8Array:'hexString' parameter should not be empty")
    }
    if (!/^[0-9a-fA-F]+$/.test(hexString) || hexString.length % 2 !== 0) {
        throw new Error("dxCommonUtils.codec.hexToUint8Array: 'hexString' parameter must be a valid hex string with an even length");
    }
    let byteString = hexString.match(/.{1,2}/g);
    let byteArray = byteString.map(function (byte) {
        return parseInt(byte, 16);
    });
    let buffer = new Uint8Array(byteArray);
    return buffer;
}
/**
 * Convert ArrayBuffer to hexadecimal string format
 * @param {ArrayBuffer} buffer
 * @returns {string} A hexadecimal string in lowercase with no space in between
 */
dxCommonUtils.codec.arrayBufferToHex = function (buffer) {
    return dxCommonUtils.codec.uint8ArrayToHex(new Uint8Array(buffer))
}
/**
 * Convert Uint8Array to hexadecimal string format
 * @param {Uint8Array} array
 * @returns {string} A hexadecimal string in lowercase with no space in between
 */
dxCommonUtils.codec.uint8ArrayToHex = function (array) {
    let hexString = '';
    for (let i = 0; i < array.length; i++) {
        const byte = array[i].toString(16).padStart(2, '0');
        hexString += byte;
    }
    return hexString
}
/**
 * Decodes a Base64 string into an ArrayBuffer.
 * This implementation is robust and handles padding correctly.
 * @memberof dxCommonUtils.codec
 * @param {string} b64 - The Base64 encoded string.
 * @returns {ArrayBuffer} The decoded data as an ArrayBuffer.
 */
dxCommonUtils.codec.base64ToArrayBuffer = function (b64) {
    if (typeof b64 !== 'string') {
        throw new Error("Input must be a Base64 string.");
    }
    // First, clean up any whitespace from the input string.
    const b64_clean = b64.replace(/\s+/g, "");
    // Regex inspired by the js-base64 library to validate the structure of the string.
    // This provides a fast failure for malformed strings.
    const b64re = /^(?:[A-Za-z0-9+/]{4})*?(?:[A-Za-z0-9+/]{2}(?:==)?|[A-Za-z0-9+/]{3}=?)?$/;
    if (!b64re.test(b64_clean)) {
        throw new Error("Input is not a valid Base64 string (malformed).");
    }
    const B64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    const len = b64_clean.length;
    // This calculation correctly determines the output byte length
    let byte_len = len * 3 / 4;
    if (b64_clean.slice(-2) === '==') {
        byte_len -= 2;
    } else if (b64_clean.slice(-1) === '=') {
        byte_len -= 1;
    }
    const arr = new Uint8Array(byte_len);
    let j = 0;
    for (let i = 0; i < len; i += 4) {
        // Get the index of each base64 character.
        // It will be -1 for '=' or any other invalid character.
        const c1 = B64_MAP.indexOf(b64_clean[i]);
        const c2 = B64_MAP.indexOf(b64_clean[i + 1]);
        const c3 = B64_MAP.indexOf(b64_clean[i + 2]);
        const c4 = B64_MAP.indexOf(b64_clean[i + 3]);
        // Reconstruct the original 3 bytes from the 4 base64 character indices.
        const b1 = (c1 << 2) | (c2 >> 4);
        const b2 = ((c2 & 15) << 4) | (c3 >> 2);
        const b3 = ((c3 & 3) << 6) | c4;
        // Write the first byte, which is always present.
        arr[j++] = b1;
        // Write the second byte if the third base64 character was not a padding character.
        if (c3 !== -1) {
            arr[j++] = b2;
        }
        // Write the third byte if the fourth base64 character was not a padding character.
        if (c4 !== -1) {
            arr[j++] = b3;
        }
    }
    return arr.buffer;
}
/**
 * Encodes an ArrayBuffer into a Base64 string.
 * This implementation is robust and handles padding correctly.
 * @memberof dxCommonUtils.codec
 * @param {ArrayBuffer} buffer - The ArrayBuffer to encode.
 * @returns {string} The Base64 encoded string.
 */
dxCommonUtils.codec.arrayBufferToBase64 = function (buffer) {
    const B64_MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    const bytes = new Uint8Array(buffer);
    const len = bytes.byteLength;
    let b64 = "";
    for (let i = 0; i < len; i += 3) {
        const b1 = bytes[i];
        const b2 = bytes[i + 1];
        const b3 = bytes[i + 2];
        const c1 = b1 >> 2;
        const c2 = ((b1 & 3) << 4) | (b2 >> 4);
        const c3 = ((b2 & 15) << 2) | (b3 >> 6);
        const c4 = b3 & 63;
        b64 += B64_MAP[c1];
        b64 += B64_MAP[c2];
        if (i + 1 >= len) {
            b64 += "==";
        } else {
            b64 += B64_MAP[c3];
            if (i + 2 >= len) {
                b64 += "=";
            } else {
                b64 += B64_MAP[c4];
            }
        }
    }
    return b64;
}
/**
 * Calculates the BCC (Block Check Character / XOR Checksum) of the input data.
 * @memberof dxCommonUtils.codec
 * @param {string|ArrayBuffer|Uint8Array} data - The data to calculate the checksum for. If a string, it will be treated as UTF-8.
 * @returns {number} The calculated 8-bit BCC value (0-255).
 */
dxCommonUtils.codec.bcc = function (data) {
    const buffer = _normalizeDataToBuffer(data, false, 'Data');
    return utils.calculateBcc(buffer);
}
/**
 * Get disk space usage
 * @returns {object}
 *          -total: The total disk space in MB.
 *          -used: The used disk space in MB.
 *          -free: The available disk space in MB.
 */
dxCommonUtils.getDiskStats = function () {
    return utils.getDiskStats();
}
/**
 * @private
 * Internal helper to normalize various data inputs into an ArrayBuffer.
 * This function is crucial for ensuring that the native C layer receives data in a consistent format.
 * @param {string|ArrayBuffer|Uint8Array} data The input data.
 * @param {boolean} [isBase64=false] - If the input is a string, specifies if it's Base64 encoded. Defaults to false (UTF-8).
 * @param {string} [paramName='Input'] - The name of the parameter for error messages.
 * @returns {ArrayBuffer}
 */
function _normalizeDataToBuffer(data, isBase64 = false, paramName = 'Input') {
    if (typeof data === 'string') {
        if (isBase64) {
            return dxCommonUtils.codec.base64ToArrayBuffer(data);
        } else {
            // Treat as a UTF-8 string by converting to hex and then to ArrayBuffer.
            return dxCommonUtils.codec.hexToArrayBuffer(dxCommonUtils.codec.strToUtf8Hex(data));
        }
    } else if (data instanceof ArrayBuffer) {
        return data;
    } else if (data instanceof Uint8Array) {
        // Correctly handle views on larger ArrayBuffers by creating a copy of the viewed section.
        // If it's not a view, slice() will create a copy of the buffer.
        return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
    } else {
        throw new Error(`${paramName} must be a string, ArrayBuffer, or Uint8Array`);
    }
}
/**
 * @private
 * Internal helper to normalize crypto inputs, converting Hex strings to ArrayBuffer.
 * @param {string|ArrayBuffer|Uint8Array} data The input data.
 * @param {string} paramName The name of the parameter for error messages.
 * @returns {ArrayBuffer}
 */
function _normalizeHexInput(data, paramName = 'Input') {
    if (typeof data === 'string') {
        return dxCommonUtils.codec.hexToArrayBuffer(data);
    } else if (data instanceof ArrayBuffer) {
        return data;
    } else if (data instanceof Uint8Array) {
        return data.buffer;
    } else {
        throw new Error(`${paramName} must be a hex string, ArrayBuffer, or Uint8Array`);
    }
}
/**
 * Internal helper to convert an ArrayBuffer to a UTF-8 string.
 * This is a workaround for environments that lack a built-in TextDecoder.
 * @param {ArrayBuffer} buffer - The ArrayBuffer to convert.
 * @returns {string} The UTF-8 string.
 */
function _arrayBufferToUtf8String(buffer) {
    if (!buffer || buffer.byteLength === 0) {
        return "";
    }
    // Use the existing, environment-safe codec functions
    const hex = dxCommonUtils.codec.arrayBufferToHex(buffer);
    return dxCommonUtils.codec.utf8HexToStr(hex);
}
/**
 * Gets the native common utils client object.
 * @returns {Object} The native client object.
 */
dxCommonUtils.getNative = function () {
    return utils;
}
export default dxCommonUtils;
vf107/dxmodules/dxConfig.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,140 @@
/**
 * å®žçŽ°å¯¹åº”ç”¨æ‰€æœ‰é…ç½®é¡¹ï¼ˆkey/value)的管理:
 * 1. ç”¨æˆ·éœ€è¦æŠŠåˆå§‹çš„配置项保存在项目的 src/config.json ï¼Œé…ç½®æ–‡ä»¶çš„æ ¼å¼è¯·ä¿ç•™key/value格式(支持注释),value只能是字符串和数字类型,例如:
 * {
 *      //mqtt相关配置
 *      "mqtt.ip":"192.168.2.3",
 *      "mqtt.port":6199,
 * }
 * 2. ä¹Ÿæ”¯æŒè‡ªå®šä¹‰é…ç½®æ–‡ä»¶ï¼Œåˆå§‹åŒ–可以传递自定义配置文件的路径和标识,后续读写数据都需要传递这个标识
 * 3. ç”¨æˆ·åœ¨åº”用中第一次使用这个组件,需要先初始化 init,初始化会把 config.json çš„æ•°æ®ä¿å­˜åˆ°å†…存里,以后每次获取都是从内存获取
 * 4. ç”¨æˆ·å¯ä»¥åœ¨ä»»ä½•地方都可以通过 get å’Œ set æ¥è¯»å†™é…ç½®
 * 5. å¦‚果修改配置项的 value åŒæ—¶éœ€è¦ä¿å­˜åˆ°é…ç½®æ–‡ä»¶ï¼ˆä¿è¯é‡å¯åŽæ–°é…ç½®ç”Ÿæ•ˆï¼‰ï¼Œä½¿ç”¨ setAndSave
 * 6. å¦‚果需要恢复所有默认配置,使用 reset
 */
import * as os from 'os';
import dxMap from './dxMap.js'
import common from './dxCommon.js'
import logger from './dxLogger.js'
import std from './dxStd.js'
const map = dxMap.get("default")
const config = {}
const DEFALUT_OPTIONS = { path: '/app/code/src/config.json', savePath: '/app/data/config/config.json', flag: '___config.' }
/**
 * åˆå§‹åŒ–会把 config.json æˆ–自定义的配置文件的数据保存到内存里,以后每次获取都是从内存获取
 * @param {object} custom éžå¿…填,自定义的配置文件
 *          @param {string} custom.path è‡ªå®šä¹‰çš„配置文件完整路径
 *          @param {string} custom.flag è‡ªå®šä¹‰é…ç½®æ–‡ä»¶çš„æ ‡è¯†ï¼Œæ³¨æ„å¦‚果有多个自定义配置文件,这个标识不要重复
 */
config.init = function (custom) {
    if (custom) {
        if (!custom.path || !custom.flag) {
            throw new Error('The path and flag for the custom configuration file cannot be empty.')
        }
    }
    let flag = custom ? DEFALUT_OPTIONS.flag + custom.flag + '.' : DEFALUT_OPTIONS.flag;
    const isInited = map.get('___inited' + flag)
    if (isInited) {//只初始化一次
        return
    }
    let path = custom ? custom.path : DEFALUT_OPTIONS.path
    let savePath = custom ? '/app/data/config/config' + custom.flag + '.json' : DEFALUT_OPTIONS.savePath
    if (!std.exist(path)) {
        throw new Error('The config file not existed:' + path)
    }
    let existed = std.exist(savePath)
    let content = existed ? std.parseExtJSON(std.loadFile(savePath)) : std.parseExtJSON(std.loadFile(path))
    if (!existed) {
        std.saveFile(savePath, JSON.stringify(content))
    }
    for (let [key, value] of Object.entries(content)) {
        map.put(flag + key, value)
    }
    map.put('___inited' + flag, 'ok')
}
/**
 * èŽ·å–æ‰€æœ‰é…ç½®é¡¹
 * @param {string} flag è‡ªå®šä¹‰çš„配置文件标识,可以为空,为空则返回缺省config.json里所有内容
 * @returns json对象
 */
config.getAll = function (flag) {
    let _flag = _getFlag(flag)
    let configInfo = {}
    let keys = map.keys().filter(k => k.startsWith(_flag))
    keys.forEach(k => {
        let key = k.substring(_flag.length)
        let val = map.get(k)
        configInfo[key] = val
    })
    return configInfo
}
/**
 * èŽ·å–é…ç½®ï¼Œåªä»Žmap获取
 * å¦‚果配置项为空,返回所有所有数据;
 * @param {string} key é…ç½®é¡¹
 * @param {string} flag è‡ªå®šä¹‰çš„配置文件标识,可以为空,为空则返回缺省config.json里的配置值
 * @returns
 */
config.get = function (key, flag) {
    if (!key) {
        return this.getAll(flag);
    }
    let _flag = _getFlag(flag)
    return map.get(_flag + key)
}
/**
 * æ›´æ–°é…ç½®ï¼Œåªä¿®æ”¹map
 * @param {string} key é…ç½®é¡¹
 * @param {string} value é…ç½®å€¼
 * @param {string} flag è‡ªå®šä¹‰çš„配置文件标识,可以为空,为空则指向缺省config.json里的配置值
 */
config.set = function (key, value, flag) {
    if (!key || value == null || value == undefined) {
        throw new Error("key or value should not be empty")
    }
    let _flag = _getFlag(flag)
    map.put(_flag + key, value)
}
/**
 * å°†map中的数据持久化到本地
 * @param {string} flag è‡ªå®šä¹‰çš„配置文件标识,可以为空,为空则指向缺省config.json里的配置值
 */
config.save = function (flag) {
    //保存
    std.saveFile(_getSavePath(flag), JSON.stringify(this.getAll(flag)))
}
/**
 * æ›´æ–°é…ç½®ï¼Œä¿®æ”¹map且持久化本地
 * @param {string} key é…ç½®é¡¹
 * @param {string} value é…ç½®å€¼
 * @param {string} flag è‡ªå®šä¹‰çš„配置文件标识,可以为空,为空则指向缺省config.json里的配置值
 */
config.setAndSave = function (key, value, flag) {
    this.set(key, value, flag)
    //保存
    std.saveFile(_getSavePath(flag), JSON.stringify(this.getAll(flag)))
}
/**
 * é‡ç½®ï¼Œé‡ç½®åŽè¯·é‡å¯åŠ¨è®¾å¤‡
 * @param {string} flag è‡ªå®šä¹‰çš„配置文件标识,可以为空,为空则指向缺省config.json里的配置值
 */
config.reset = function (flag) {
    common.systemBrief('rm -rf ' + _getSavePath(flag))
}
//-------------------private-------------------------------
function _getFlag(flag) {
    return flag ? DEFALUT_OPTIONS.flag + flag + '.' : DEFALUT_OPTIONS.flag
}
function _getSavePath(flag) {
    return flag ? '/app/data/config/config' + flag + '.json' : DEFALUT_OPTIONS.savePath
}
export default config;
vf107/dxmodules/dxDisplay.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
import { displayClass } from './libvbar-m-dxdisplay.so'
const dxDisplay = {};
// Create a singleton instance of the native displayClass.
// This is executed only once when the module is first imported due to the nature of ES modules.
const displayObj = new displayClass();
/**
 * Get the current display backlight brightness.
 * @returns {number} Backlight brightness value (0-100).
 * @throws {Error} If failed to get backlight.
 */
dxDisplay.getBacklight = function () {
    return displayObj.getBacklight();
}
/**
 * Set the display backlight brightness.
 * @param {number} brightness - The brightness value to set (0-100).
 * @throws {Error} If failed to set backlight.
 */
dxDisplay.setBacklight = function (brightness) {
    if (brightness === undefined || brightness === null) {
        throw new Error("dxDisplay.setBacklight: 'brightness' parameter is required");
    }
    if (typeof brightness !== 'number' || brightness < 0 || brightness > 100) {
        throw new Error("dxDisplay.setBacklight: 'brightness' must be a number between 0 and 100");
    }
    displayObj.setBacklight(brightness);
}
/**
 * Get the screen enable status.
 * @returns {boolean} 1 if enabled, 0 if disabled.
 * @throws {Error} If failed to get enable status.
 */
dxDisplay.getEnableStatus = function () {
    return displayObj.getEnableStatus();
}
/**
 * Set the screen enable status.
 * @param {boolean|number} enable - true/1 to enable screen, false/0 to disable.
 * @throws {Error} If failed to set enable status.
 */
dxDisplay.setEnableStatus = function (enable) {
    if (enable === undefined || enable === null) {
        throw new Error("dxDisplay.setEnableStatus: 'enable' parameter is required");
    }
    displayObj.setEnableStatus(enable);
}
/**
 * Get the current display power mode.
 * @returns {number} Power mode value:
 *   - 0: VBAR_DRV_DISPLAY_POWER_MODE_NORMAL (Normal mode)
 *   - 1: VBAR_DRV_DISPLAY_POWER_MODE_STANDBY (Standby mode)
 * @throws {Error} If failed to get power mode.
 */
dxDisplay.getPowerMode = function () {
    return displayObj.getPowerMode();
}
/**
 * Set the display power mode.
 * @param {number} mode - The power mode to set:
 *   - 0: VBAR_DRV_DISPLAY_POWER_MODE_NORMAL (Normal mode)
 *   - 1: VBAR_DRV_DISPLAY_POWER_MODE_STANDBY (Standby mode)
 * @throws {Error} If failed to set power mode.
 */
dxDisplay.setPowerMode = function (mode) {
    if (mode === undefined || mode === null) {
        throw new Error("dxDisplay.setPowerMode: 'mode' parameter is required");
    }
    if (mode !== 0 && mode !== 1) {
        throw new Error("dxDisplay.setPowerMode: 'mode' must be 0 (NORMAL) or 1 (STANDBY)");
    }
    displayObj.setPowerMode(mode);
}
export default dxDisplay;
vf107/dxmodules/dxDriver.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
const dxDriver = {}
/*************************************Device Resource Enumeration*************************************/
/**
 * Device info
 */
dxDriver.DRIVER = {
    // Driver model
    MODEL:         "vf105"
}
/**
 * Display info
 */
dxDriver.DISPLAY = {
    // Display width
    WIDTH:         800,
    // Display height
    HEIGHT:         1280,
    // Display dpi
    DPI:         177,
    // Display rotation
    ROTATION:       0
}
/**
 * PWM channel
 */
dxDriver.PWM = {
    // White fill light
    WHITE_SUPPLEMENT_CHANNEL:         0,
    // Nir fill light
    NIR_SUPPLEMENT_CHANNEL:           1
}
/**
 * GPIO device pins
 */
dxDriver.GPIO = {
    // Relay
    RELAY0:         44,
}
/**
 * Channel communication
 */
dxDriver.CHANNEL = {
    // 485
    UART_PATH:      "/dev/ttySLB2",
    // USBHID
    USBHID_PATH:    "/dev/hidg1",
}
/**
 * Camera related parameters
 */
dxDriver.CAPTURER = {
    // Camera image width
    RGB_WIDTH:  1280,
    // Camera image height
    RGB_HEIGHT:    800,
    // Camera device files
    RGB_PATH:  "/dev/video3",
    // Camera image width
    NIR_WIDTH:  800,
    // Camera image height
    NIR_HEIGHT:    600,
    // Camera device files
    NIR_PATH:  "/dev/video0"
}
/**
 * GPIO pin function enumeration
 */
dxDriver.GPIO_FUNC = {
    GPIO_FUNC_3:    0x03,  //0011, GPIO as function 3 / device 3
    GPIO_OUTPUT0:   0x04,  //0100, GPIO output low  level
    GPIO_OUTPUT1:   0x05  //0101, GPIO output high level
};
export default dxDriver
vf107/dxmodules/dxEventBus.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,208 @@
/**
 * dxEventBus - Multi-threaded Event Bus for DejaOS.
 *
 * This module provides a multi-threaded event bus for communication between the main thread
 * and workers in the QuickJS environment. It uses the main thread as a message relay,
 * enabling full-duplex event notifications across all threads.
 *
 * Features:
 * - Communication between workers via the main thread.
 * - Main-to-worker, worker-to-main, and main-to-main communication.
 * - Dynamic creation and termination of event-aware workers.
 *
 * Usage:
 * // In main thread
 * import dxEventBus from './dxmodules/dxEventBus.js';
 * dxEventBus.newWorker('my_worker', '/app/code/src/worker.js');
 * dxEventBus.fire('some_topic', { data: 123 });
 *
 * // In worker.js
 * import dxEventBus from './dxmodules/dxEventBus.js';
 * dxEventBus.on('some_topic', (data) => { console.log(data); });
 */
import std from './dxStd.js'
import * as os from "os";
const bus = {}
const all = {}
const subs = {}
const isMain = (os.Worker.parent === undefined)
bus.id = isMain ? '__main' : null
/**
 * Creates and registers a new worker on the event bus. Must be called from the main thread.
 * @param {string} id - A unique identifier for the worker. Cannot be empty or duplicated.
 * @param {string} file - The absolute path to the worker's script file.
 * @throws {Error} If id is invalid, the file doesn't exist, or not called from the main thread.
 */
bus.newWorker = function (id, file) {
    if (!id) {
        throw new Error("eventbus newWorker:'id' should not be empty")
    } if (!file) {
        throw new Error("eventbus newWorker:'file' should not be empty")
    }
    if (!isMain) {
        throw new Error("evnetbus newWorker should be invoke in main thread")
    }
    if (!std.exist(file)) {
        throw new Error("eventbus newWorker: file not found:" + file)
    }
    if (all[id]) {
        throw new Error("eventbus newWorker: worker already exists:" + id)
    }
    let content = std.loadFile(file) + '\n' + `
import __bus from '/app/code/dxmodules/dxEventBus.js'
import __std from '/app/code/dxmodules/dxStd.js'
__bus.id='${id}'
Object.keys(__bus.handlers).forEach(key => {
    __bus.os.Worker.parent.postMessage({ __sub: key, id: __bus.id })
})
__bus.os.Worker.parent.onmessage = function (e) {
    if(!e.data){
        return
    }
    e = e.data
    if (!e || !e.topic) {
        return
    }
    let fun = __bus.handlers[e.topic]
    if (fun) {
        try {
            fun(e.data)
        } catch (err) {
            __std.err.puts(\`[dxEventBus] Error in worker '${id}' event handler for topic \${e.topic}: \${err.message || err}\\n\`);
            __std.err.flush();
        }
    }
}
    `
    let newfile = file + '_' + id + '.js'
    std.saveFile(newfile, content)
    let worker = new os.Worker(newfile)
    all[id] = worker
    worker.onmessage = function (data) {
        if (data.data) {
            if (data.data.__sub) {
                sub(data.data.__sub, data.data.id)
                return
            }
            //worker发送过来的数据再调用一次主线程的fire,要么主线程自己消费,要么转发到其它worker
            bus.fire(data.data.topic, data.data.data)
        }
    }
}
/**
 * Terminates a worker and cleans up all its resources from the event bus.
 * This removes the worker instance and all of its event subscriptions.
 * @param {string} id - The unique identifier of the worker to terminate.
 */
bus.delWorker = function (id) {
    if (!id || !all[id]) {
        return;
    }
    delete all[id];
    for (const topic in subs) {
        if (subs.hasOwnProperty(topic)) {
            const subscribers = subs[topic];
            for (let i = subscribers.length - 1; i >= 0; i--) {
                if (subscribers[i] === id) {
                    subscribers.splice(i, 1);
                }
            }
            if (subscribers.length === 0) {
                delete subs[topic];
            }
        }
    }
}
/**
 * Fires an event to notify all subscribers for a given topic.
 *
 * This is a fire-and-forget operation. Callbacks for subscribers in the main thread are
 * executed synchronously and sequentially. For subscribers in workers, the event is sent
 * asynchronously via `postMessage`.
 *
 * @param {string} topic - The event topic to fire.
 * @param {*} data - The data to pass to the event subscribers.
 */
bus.fire = function (topic, data) {
    if (!topic || (typeof topic) != 'string') {
        throw new Error("eventbus :'topic' should not be null");
    }
    if (isMain) {
        if (subs[topic] && subs[topic].length > 0) {
            for (let i = 0; i < subs[topic].length; i++) {
                const id = subs[topic][i]
                if (id === '__main' && bus.handlers[topic]) {
                    try {
                        bus.handlers[topic](data)
                    } catch (e) {
                        std.err.puts(`[dxEventBus] Error in main thread event handler for topic '${topic}': ${e.message || e}\n`);
                        std.err.flush();
                    }
                } else {
                    const worker = all[id]
                    if (worker) {
                        try {
                            worker.postMessage({ topic: topic, data: data })
                        } catch (e) {
                            std.err.puts(`[dxEventBus] Error posting message to worker '${id}' for topic '${topic}': ${e.message || e}\n`);
                            std.err.flush();
                        }
                    }
                }
            }
        }
    } else {
        try {
            os.Worker.parent.postMessage({ topic: topic, data: data })
        } catch (e) {
            std.err.puts(`[dxEventBus] Error in worker '${bus.id}' posting message for topic '${topic}': ${e.message || e}\n`);
            std.err.flush();
        }
    }
}
bus.handlers = {}
/**
 * Subscribes to an event topic.
 * @param {string} topic - The event topic to subscribe to.
 * @param {function} callback - The function to execute when the event is fired. It receives event data as its only argument.
 */
bus.on = function (topic, callback) {
    if (!topic || (typeof topic) != 'string') {
        throw new Error("The 'topic' should not be null");
    }
    if (!callback || (typeof callback) != 'function') {
        throw new Error("The 'callback' should be a function");
    }
    sub(topic, bus.id)
    this.handlers[topic] = callback
}
/**
 * Returns the ID of the current thread (either '__main' or the worker's assigned ID).
 * @returns {string|null} The ID of the current thread.
 * @note In a worker, if this function is called at the top level of the script before the
 * event bus has fully initialized, it may return `null`. It is reliable within event handlers.
 */
bus.getId = function () {
    return bus.id
}
function sub(topic, id) {
    if (isMain) {
        if (!subs[topic]) {
            subs[topic] = []
        }
        if (!subs[topic].includes(id)) {
            subs[topic].push(id)
        }
    } else {
        if (id != null) {
            os.Worker.parent.postMessage({ __sub: topic, id: id })
        }
    }
}
bus.os = os
export default bus
vf107/dxmodules/dxFacial.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,270 @@
/**
 * dxFacial - JavaScript wrapper for the native facial recognition module.
 *
 * This module provides a singleton-like interface to the underlying C++ facial
 * recognition functionality. It is designed to be consistent with the style of
 * other native module wrappers like dxNetwork.
 *
 * Features:
 * - Initialize/deinitialize the face engine and cameras.
 * - Retrieve recognition events and high-frequency detection data separately.
 * - Configure operational modes (e.g., liveness, recognition, compare).
 * - Manage the face feature database (register, delete, query).
 * - Control the engine's runtime state (pause/resume) and get status info.
 *
 * Usage:
 * - Call `init()` once with a configuration object.
 * - Periodically call `getRecognitionEvent()` to process important results.
 * - Periodically call `getDetectionData()` in your UI loop to draw tracking boxes.
 * - Use other methods like `registerFeature`, `setMode`, etc., as needed.
 */
import { Facial } from './libvbar-m-dxfacial.so'; // Placeholder for native module import
import logger from './dxLogger.js';
const dxFacial = {};
// --- Constants & Enums ---
// Instantiate the native object immediately.
// Thanks to ES module caching, this will only run once.
const _native = new Facial();
let _callbacks = {};
// --- Public API ---
/**
 * Initializes the facial recognition module. Must be called before any other function.
 * @param {object} [config={}] - Configuration object.
 * @param {object} [config.rgb] - Configuration for the RGB camera.
 * @param {object} [config.nir] - Configuration for the NIR (infrared) camera.
 * @param {number} [config.db_max] - Max number of faces in the database.
 * @param {string} [config.db_path] - Path to the face database file.
 * @param {string} [config.det_max] - Maximum number of faces to detect.
 * @param {string} [config.det_min_distance_cm] - Minimum distance in centimeters for detection.
 * @param {string} [config.det_max_distance_cm] - Maximum distance in centimeters for detection.
 * @param {string} [config.det_timeout_ms] - Timeout in milliseconds for detection.
 * @param {string} [config.liv_enable] - Live detection switch
 * @param {string} [config.liv_threshold] - Threshold for living score.
 * @param {string} [config.com_enable] - Face comparison switch
 * @param {string} [config.com_threshold] - Threshold for compare score.
 * @param {string} [config.rec_timeout_ms] - Timeout in milliseconds for recognition.
 * @param {string} [config.x_map] - X axis coordinate mapping parameters.
 * @param {string} [config.y_map] - Y axis coordinate mapping parameters.
 * @param {number} [config.pose_score_threshold] - Pose score threshold.
 */
dxFacial.init = function (config = {}) {
    _native.init(config); // Throws on error
    logger.info("DxFacial initialized successfully.");
};
/**
 * Deinitializes the module, releasing all resources.
 */
dxFacial.deinit = function () {
    _native.deinit();
    logger.info("DxFacial deinitialized.");
};
/**
 * Sets callback handlers for facial recognition events.
 * @param {object} callbacks - An object containing callback functions.
 * @param {function(event:object)} [callbacks.onRecognition] - Called when a recognition event occurs.
 * The event object contains details like `userId`, `feature`, `isRecognition`, etc.
 */
dxFacial.setCallbacks = function (callbacks) {
    _callbacks = callbacks || {};
};
/**
 * Processes the recognition event queue. Should be called periodically in a loop (e.g., setInterval).
 * If a recognition event is available, the `onRecognition` callback will be triggered.
 * @example
 * dxFacial.setCallbacks({
 *   onRecognition: (event) => {
 *     logger.info('Recognition Event:', event);
 *     event.id  // face id
 *     event.rect  // face bounding box coordinates
 *     event.is_rec  // whether to recognize
 *     event.picPath  // face picture path
 *     event.isCompare  // whether to compare
 *     event.compareScore  // compare score
 *     event.userId  // user id
 *     event.feature  // face feature
 *   }
 * });
 * setInterval(() => dxFacial.loop(), 50);
 */
dxFacial.loop = function () {
    const event = _native.getRecognitionEvent();
    if (event && typeof _callbacks.onRecognition === 'function') {
        _callbacks.onRecognition(event);
    }
};
/**
 * Retrieves the latest face detection data for UI purposes (e.g., drawing bounding boxes).
 * @return {array} [data] - Array of detected face objects.
 * @return {number} [data.id] - Face id.
 * @return {number} [data.status] - Face status. 0:detect pass、1:live pass、2:compare pass、3:compare fail
 * @return {array} [data.rect] - Face bounding box coordinates.
 * @return {number} [data.qualityScore] - Face quality score.
 * @return {number} [data.livingScore] - Face living score.
 */
dxFacial.getDetectionData = function () {
    return _native.getDetectionData();
};
/**
 * Sets the engine status (running or paused).
 * @param {boolean} isRunning - `true` to run, `false` to pause.
 */
dxFacial.setStatus = function (isRunning) {
    _native.setStatus(isRunning);
};
/**
 * Gets the estimated environment brightness.
 * @returns {number} Brightness level.
 */
dxFacial.getEnvBrightness = function () {
    return _native.getEnvBrightness();
};
/**
 * Gets the number of people detected by the NIR camera.
 * @returns {number} Number of people detected.
 */
dxFacial.getNirPersonCount = function () {
    return _native.getNirPersonCount();
};
/**
 * Gets the current engine configuration.
 * @returns {object} Configuration parameters.
 * @return {number} [config.db_max] - Max number of faces in the database.
 * @return {string} [config.db_path] - Path to the face database file.
 * @return {string} [config.det_max] - Maximum number of faces to detect.
 * @return {string} [config.det_min_distance_cm] - Minimum distance in centimeters for detection.
 * @return {string} [config.det_max_distance_cm] - Maximum distance in centimeters for detection.
 * @return {string} [config.det_timeout_ms] - Timeout in milliseconds for detection.
 * @return {string} [config.liv_enable] - Live detection switch
 * @return {string} [config.liv_threshold] - Threshold for living score.
 * @return {string} [config.com_enable] - Face comparison switch
 * @return {string} [config.com_threshold] - Threshold for compare score.
 * @return {string} [config.rec_timeout_ms] - Timeout in milliseconds for recognition.
 * @return {string} [config.x_map] - X axis coordinate mapping parameters.
 * @return {string} [config.y_map] - Y axis coordinate mapping parameters.
 */
dxFacial.getConfig = function () {
    return _native.getConfig();
};
/**
 * Sets or updates the engine configuration.
 * @param {object} [config={}] - Configuration object.
 * @param {number} [config.db_max] - Max number of faces in the database.
 * @param {string} [config.db_path] - Path to the face database file.
 * @param {string} [config.det_max] - Maximum number of faces to detect.
 * @param {string} [config.det_min_distance_cm] - Minimum distance in centimeters for detection.
 * @param {string} [config.det_max_distance_cm] - Maximum distance in centimeters for detection.
 * @param {string} [config.det_timeout_ms] - Timeout in milliseconds for detection.
 * @param {string} [config.liv_enable] - Live detection switch
 * @param {string} [config.liv_threshold] - Threshold for living score.
 * @param {string} [config.com_enable] - Face comparison switch
 * @param {string} [config.com_threshold] - Threshold for compare score.
 * @param {string} [config.rec_timeout_ms] - Timeout in milliseconds for recognition.
 * @param {string} [config.x_map] - X axis coordinate mapping parameters.
 * @param {string} [config.y_map] - Y axis coordinate mapping parameters.
 * @param {number} [config.pose_score_threshold] - Pose score threshold.
 */
dxFacial.setConfig = function (config) {
    _native.setConfig(config);
};
/**
 * Obtain the facial feature values of the camera
 * @param {number} timeout - The timeout in milliseconds.
 * @return {object} - Configuration object.
 * @return {number} - qualityScore.
 * @return {string} - picPath.
 * @return {object} - rect: {x, y, w, h}.
 * @return {string} - feature.
 */
dxFacial.getFeaByCap = function (timeout) {
    return _native.getFeaByCap(timeout);
};
/**
 * Obtain the facial feature values of the file
 * @param {number} timeout - The timeout in milliseconds.
 * @param {string} filePath - The file path.
 * @returns {object} - The result object.
 * @returns {number} - qualityScore.
 * @returns {object} - rect: {x, y, w, h}.
 * @returns {string} - feature.
 */
dxFacial.getFeaByFile = function (filePath) {
    return _native.getFeaByFile(filePath);
};
/**
 * compare a face feature with the database.
 * @param {string} featureBase64 - The base64-encoded feature string.
 * @returns {object} - The result object.
 * @return {number} score.
 * @return {string} userId.
 */
dxFacial.compareFea = function (featureBase64) {
    return _native.compareFea(featureBase64);
};
/**
 * add a face feature into the database.
 * @param {string} userId - The user ID to associate with the feature.
 * @param {string} featureBase64 - The base64-encoded feature string.
 * @returns {number} Result code.
 */
dxFacial.addFea = function (userId, featureBase64) {
    return _native.addFea(userId, featureBase64);
};
/**
 * updata a face feature into the database.
 * @param {string} userId - The user ID to associate with the feature.
 * @param {string} featureBase64 - The base64-encoded feature string.
 * @returns {number} Result code.
 */
dxFacial.updateFea = function (userId, featureBase64) {
    return _native.updateFea(userId, featureBase64);
};
/**
 * Deletes a user from the feature database.
 * @param {string} userId - The user ID to delete.
 * @returns {number} Result code.
 */
dxFacial.deleteFea = function (userId) {
    return _native.deleteFea(userId);
};
/**
 * Clears all features from the database.
 * @returns {number} Result code.
 */
dxFacial.cleanFea = function () {
    return _native.cleanFea();
};
/**
 * Gets the native module instance.
 * @returns {object|null}
 */
dxFacial.getNative = function () {
    return _native;
};
export default dxFacial;
vf107/dxmodules/dxFacialBarcode.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
import { Facial } from './libvbar-m-dxfacial.so';
import log from './dxLogger.js'
const dxFacialBarcode = {};
const _native = new Facial();
let _callbacks = {};
/**
 * Initializes the barcode client. Must be called before any other operation.
 * @param {object} config - The configuration object.
 * @param {number} config.scanInterval - The interval between scans in milliseconds.
 * @param {number} config.scanTimeout - The timeout for a scan in milliseconds.
 * @param {number} config.roiX - The x-coordinate of the ROI.
 * @param {number} config.roiY - The y-coordinate of the ROI.
 * @example
 * dxFacialBarcode.init();
 */
dxFacialBarcode.init = function () {
    _native.initBarCode();
};
/**
 * Deinitializes the barcode client and releases resources.
 * @returns {void}
 * @example
 * dxFacialBarcode.deinit();
 */
dxFacialBarcode.deinit = function () {
    _native.deinitBarCode();
};
/**
 * Sets the callback function for barcode events.
 * @param {object} callbacks - The callback functions.
 * @param {function(object)} [callbacks.onEvent] - The callback function to handle barcode event.
 * @returns {void}
 * @example
 * dxFacialBarcode.setCallbacks({
 *   onEvent: function(event) {
 *     logger.info('Barcode event:', event);
 *   }
 * });
 */
dxFacialBarcode.setCallbacks = function (callbacks) {
    if (!callbacks || !callbacks.onEvent) {
        throw new Error('Callbacks must be an object with onEvent function');
    }
    _callbacks = callbacks;
};
/**
 * Sets the configuration for the barcode scanner.
 * @param {object} config - The configuration object.
 * @param {number} config.scanInterval - The interval between scans in milliseconds.
 * @param {number} config.scanTimeout - The timeout for a scan in milliseconds.
 * @param {number} config.roiX - The x-coordinate of the ROI.
 * @param {number} config.roiY - The y-coordinate of the ROI.
 */
dxFacialBarcode.setConfig = function (config) {
    _native.setConfigBarCode(config);
};
/**
 * Gets the configuration for the barcode scanner.
 * @returns {object} The configuration object.
 */
dxFacialBarcode.getConfig = function () {
    return _native.getConfigBarCode();
};
/**
 * Sets the status of the barcode scanner.
 * @param {boolean} status - The status of the barcode scanner.
 */
dxFacialBarcode.setStatus = function (status) {
    _native.setStatusBarCode(status);
};
/**
 * Processes events from the barcode event queue. Should be called periodically (e.g. in setInterval).
 * Handles barcode events and calls the registered callback function.
 *
 * @example
 * setInterval(() => {
 *   dxFacialBarcode.loop();
 * }, 10); // Process events every 10ms
 */
dxFacialBarcode.loop = function () {
    try {
        let event = _native.getBarCodeEvent();
        if (event && _callbacks.onEvent) {
            _callbacks.onEvent(event);
        }
    } catch (e) {
        log.error('Error in barcode loop:', e);
    }
};
/**
 * Gets the native barcode client object.
 * @returns {Object|null} The native client object, or null if not initialized.
 */
dxFacialBarcode.getNative = function () {
    return _native;
};
export default dxFacialBarcode;
vf107/dxmodules/dxFingerMz.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,863 @@
/**
 * Fingerprint MZ Module
 *
 * This module provides an interface for communicating with the MZ fingerprint module via UART.
 * It supports operations like image capture, fingerprint registration, matching, and storage management.
 *
 * Features:
 * - `Image Capture`: Capture fingerprint images for enrollment or verification.
 * - `Registration`: Generate and store fingerprint templates.
 * - `Matching`: One-to-one (1:1) and one-to-many (1:N) fingerprint matching.
 * - `Storage`: Manage fingerprint templates in the module's flash storage.
 * - `System`: Configure module parameters and read system status.
 *
 * Usage:
 * import dxFingerMz from './dxFingerMz.js';
 * dxFingerMz.init({ id: 'fingerUart', path: '/dev/ttySLB0' });
 * const result = dxFingerMz.getImage();
 */
import std from '../dxmodules/dxStd.js'
import dxUart from '../dxmodules/dxUart.js'
import common from '../dxmodules/dxCommon.js'
import log from '../dxmodules/dxLogger.js'
import * as os from "os"
const dxFingerMz = {}
// Packet Header
const HEADER = new Uint8Array([0xEF, 0x01])
// Device Address
let ADDRESS = new Uint8Array([0xFF, 0xFF, 0xFF, 0xFF])
// Packet Flags
const FLAG = {
    "COMMAND": 0x01,     // Command packet
    "DATA": 0x02,        // Data packet
    "DATA_END": 0x08,    // End of data packet
    "COMMAND_END": 0x07, // Response packet
}
// LED Color
dxFingerMz.LED_COLOR = {
    "NONE": 0,
    "BLUE": 1,
    "GREEN": 2,
    "RED": 4,
}
// Function Code
dxFingerMz.LED_FUNCTION_CODE = {
    "NORMAL_BREATH": 1,    // Common Breathing Light
    "NORMAL_FLASH": 2,     // Common Flashing Light
    "CONSTANT_ON": 3,      // Constant On Light
    "CONSTANT_OFF": 4,     // Constant Off Light
    "GRADUAL_ON": 5,       // Gradual On Light
    "GRADUAL_OFF": 6,      // Gradual Off Light
}
// Command Set
const CMD_MAP = {
    /* General Commands */
    "GET_IMAGE": 0x01,          // Get image for verification
    "GET_CHAR": 0x02,           // Generate character file from image
    "MATCH": 0x03,              // Precise match
    "SEARCH": 0x04,             // Search fingerprint
    "REG_MODEL": 0x05,          // Combine character files (generate template)
    "STORD_CHAR": 0x06,         // Store template
    "LOAD_CHAR": 0x07,          // Load template
    "UP_CHAR": 0x08,            // Upload template
    "DOWN_CHAR": 0x09,          // Download template
    "DEL_CHAR": 0x0C,           // Delete template
    "CLEAR_CHAR": 0x0D,         // Clear fingerprint library
    "WRITE_REG": 0x0E,          // Write system register
    "READ_SYS_PARA": 0x0F,      // Read system parameters
    "READ_INF_PAGE": 0x16,      // Read information page
    "BURN_CODE": 0x1a,          // Burn code (Erase code)
    "VALID_TEMPLETE_NUM": 0x1d, // Read valid template count
    "READ_INDEX_TABLE": 0x1f,   // Read index table
    "GET_ENROLL_IMAGE": 0x29,   // Get image for enrollment
    "SLEEP": 0x33,              // Sleep command
    /* Module Commands */
    "CANCEL": 0x30,             // Cancel command
    "AUTO_ENROLL": 0x31,        // Auto enroll template
    "AUTO_IDENTIFY": 0x32,      // Auto identify fingerprint
    /* Maintenance Commands */
    "UP_IMAGE": 0x0A,           // Upload image
    "DOWN_IMAGE": 0x0B,         // Download image
    "GET_CHIP_SN": 0x34,        // Get chip serial number
    "HAND_SHAKE": 0x35,         // Handshake
    "CHECK_SENSOR": 0x36,       // Check sensor
    "REST_SETTING": 0x3B,       // Restore factory settings
    /* Custom Commands */
    "SET_PWD": 0x12,            // Set password
    "VFY_PWD": 0x13,            // Verify password
    "GET_RANDOM_CODE": 0x14,    // Get random code
    "SET_CHIP_ADDR": 0x15,      // Set chip address
    "WRITE_NOTEPAD": 0x18,      // Write notepad
    "READ_NOTEPAD": 0x19,       // Read notepad
    "CONTROL_BLN": 0x3C,        // Control LED light
    "GET_IMAGE_INFO": 0x3D,     // Get image info
    "SEARCH_NOW": 0x3E,         // Search current fingerprint
}
let options = {
    id: 'fingerUart',
    total: 5000,
    timeout: 500,
    type: '3',
    path: '/dev/ttySLB0',
    baudrate: '57600-8-N-2'
}
/**
 * Get Image (Verification) - Detects finger and stores the fingerprint image in the image buffer.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.getImage = function () {
    let resp = execCmd(CMD_MAP.GET_IMAGE)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Generate Character File - Generates a fingerprint character file from the image in the image buffer and stores it in the character buffer.
 * @param {number} bufferId - Buffer ID (1 or 2).
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.genChar = function (bufferId) {
    let resp = execCmd(CMD_MAP.GET_CHAR, [bufferId])
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Precise Match - Compares the character file or template in the buffer.
 * @returns {object|null} An object containing the result code and match score, or null on failure.
 *                        - code: Confirmation code.
 *                        - score: Match score.
 */
dxFingerMz.match = function () {
    let resp = execCmd(CMD_MAP.MATCH)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return { code: resp.data[0], score: fromEndianHexExtended(resp.data.subarray(1, 3), 2, false) }
    } else {
        return null
    }
}
/**
 * Search Fingerprint - Searches the fingerprint library (whole or partial) using the character file in the buffer.
 * If found, returns the page number.
 * @param {number} bufferId - Character buffer ID (default is 1).
 * @param {number} startPage - Start page number.
 * @param {number} pageNum - Number of pages to search.
 * @returns {object|null} An object containing the result code, page index, and score, or null on failure.
 *                        - code: Confirmation code.
 *                        - pageIndex: Index of the found page.
 *                        - score: Match score.
 */
dxFingerMz.search = function (bufferId, startPage, pageNum) {
    let data = new Uint8Array([bufferId, ...toEndianHexExtended(startPage, 2, false), ...toEndianHexExtended(pageNum, 2, false)])
    let resp = execCmd(CMD_MAP.SEARCH, data)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return { code: resp.data[0], pageIndex: fromEndianHexExtended(resp.data.subarray(1, 3), 2, false), score: fromEndianHexExtended(resp.data.subarray(3, 5), 2, false) }
    } else {
        return null
    }
}
/**
 * Register Model (Combine Characters) - Combines character files to generate a template and stores it in the character buffer.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.regModel = function () {
    let resp = execCmd(CMD_MAP.REG_MODEL)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Store Template - Stores the template file from the buffer to the flash database at the specified page index.
 * @param {number} bufferId - Character buffer ID (default is 1).
 * @param {number} pageIndex - Fingerprint library location index.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.storeChar = function (bufferId, pageIndex) {
    let data = new Uint8Array([bufferId, ...toEndianHexExtended(pageIndex, 2, false)])
    let resp = execCmd(CMD_MAP.STORD_CHAR, data)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Load Template - Reads the fingerprint template from the flash database at the specified page index into the buffer.
 * @param {number} bufferId - Character buffer ID (default is 2).
 * @param {number} pageIndex - Fingerprint library location index.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.loadChar = function (bufferId, pageIndex) {
    let data = new Uint8Array([bufferId, ...toEndianHexExtended(pageIndex, 2, false)])
    let resp = execCmd(CMD_MAP.LOAD_CHAR, data)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Upload Template - Uploads the template file from the buffer to the Host.
 * @param {number} bufferId - Character buffer ID (default is 2).
 * @returns {ArrayBuffer|null} Template data, or null on failure.
 */
dxFingerMz.upChar = function (bufferId) {
    let resp = execCmd(CMD_MAP.UP_CHAR, [bufferId])
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        let data = recvDataPkt({ header: HEADER, addr: ADDRESS, flag: FLAG.DATA })
        return data
    } else {
        return null
    }
}
/**
 * Download Template - Downloads a template from the Host to the module's buffer.
 * @param {number} bufferId - Character buffer ID (default is 1).
 * @param {ArrayBuffer} char - Template data.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.downChar = function (bufferId, char) {
    let resp = execCmd(CMD_MAP.DOWN_CHAR, [bufferId])
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        sendData({
            header: HEADER, addr: ADDRESS, flag: new Uint8Array([FLAG.DATA]), len: new Uint8Array(toEndianHexExtended(2, 2, false)), cmd: new Uint8Array([CMD_MAP.DOWN_CHAR]),
            data: char
        })
        return resp.data
    } else {
        return -1
    }
}
/**
 * Delete Template - Deletes N fingerprint templates starting from the specified page index in the flash database.
 * @param {number} pageIndex - Starting index in the fingerprint library.
 * @param {number} num - Number of templates to delete.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.deletChar = function (pageIndex, num) {
    let data = new Uint8Array([...toEndianHexExtended(pageIndex, 2, false), ...toEndianHexExtended(num, 2, false)])
    let resp = execCmd(CMD_MAP.DEL_CHAR, data)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Clear Library (PS_Empty) - Deletes all fingerprint templates in the flash database.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.clearChar = function () {
    let resp = execCmd(CMD_MAP.CLEAR_CHAR)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Write System Register - Writes to a module register.
 * @param {number} regId - Register ID.
 * @param {number} context - Content to write.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.writeReg = function (regId, context) {
    let resp = execCmd(CMD_MAP.WRITE_REG, [regId, context])
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Read System Parameters - Reads the module's basic parameters (baud rate, packet size, etc.).
 * @returns {object|null} An object containing the result code and parameter data, or null on failure.
 *                        - code: Confirmation code.
 *                        - data: System parameters.
 */
dxFingerMz.readSysPara = function () {
    let resp = execCmd(CMD_MAP.READ_SYS_PARA)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return { code: resp.data[resp.data.length - 1], data: resp.data.subarray(0, resp.data.length - 1) }
    } else {
        return null
    }
}
/**
 * Get Valid Template Count - Reads the number of valid templates.
 * @returns {object|null} An object containing the result code and valid count, or null on failure.
 *                        - code: Confirmation code.
 *                        - validNum: Number of valid templates.
 */
dxFingerMz.getValidTemplateNum = function () {
    let resp = execCmd(CMD_MAP.VALID_TEMPLETE_NUM)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return { code: resp.data[0], validNum: resp.data[1] }
    } else {
        return null
    }
}
/**
 * Read Index Table - Reads the index table of enrolled templates.
 * @param {number} indexPage - Index table page number (0, 1, 2, 3...). Each page corresponds to a range of templates (0-255, 256-511, etc.).
 *                             Each bit represents a template: 1 means enrolled, 0 means not enrolled.
 * @returns {object|null} An object containing the result code and index table, or null on failure.
 *                        - code: Confirmation code.
 *                        - indexTable: The index table data.
 */
dxFingerMz.readIndexTable = function (indexPage) {
    let resp = execCmd(CMD_MAP.READ_INDEX_TABLE, [indexPage])
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return { code: resp.data[0], indexTable: resp.data.subarray(1) }
    } else {
        return null
    }
}
/**
 * Get Enroll Image - Detects finger and stores the fingerprint image in the buffer (for registration).
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.getEnrollImage = function () {
    let resp = execCmd(CMD_MAP.GET_ENROLL_IMAGE)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Sleep - Sets the sensor to sleep mode.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.sleep = function () {
    let resp = execCmd(CMD_MAP.SLEEP)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Cancel - Cancels auto-registration or auto-verification operations.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.cancel = function () {
    let resp = execCmd(CMD_MAP.CANCEL)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Auto Register - One-stop fingerprint registration. Includes capture, feature generation, template merging, and storage.
 * @param {number} pageIndex - Page index.
 * @param {number} count - Number of finger presses required.
 * @param {number} [timeout=60] - Timeout in seconds.
 * @param {number} [config=0] - Configuration flags.
 * @returns {ArrayBuffer|null} Result data, or null on failure/timeout.
 */
dxFingerMz.autoRegister = function (pageIndex, count, timeout = 60, config = 0) {
    let param = {
        header: HEADER, addr: ADDRESS, flag: new Uint8Array([FLAG.COMMAND]), len: new Uint8Array(toEndianHexExtended(8, 2, false)), cmd: new Uint8Array([CMD_MAP.AUTO_ENROLL])
        , data: new Uint8Array([...toEndianHexExtended(pageIndex, 2, false), count, ...toEndianHexExtended(config, 2, false)])
    }
    // Send command
    send(param)
    // For each press, there will be multiple responses (status, merge result, duplicate check, store result).
    let startTime = Date.now()
    while (Date.now() - startTime < timeout * 1000) {
        let resp = recvCmdPkt({ addr: ADDRESS })
        if (resp && resp.flag[0] == FLAG.COMMAND_END && resp.data[0] == 0x00 && resp.data[1] == 0x06 && resp.data[2] == 0xf2) {
            return resp.data
        }
        os.sleep(50)
    }
    return null
}
/**
 * Auto Compare - Automatic fingerprint verification. Includes image capture, feature generation, and search.
 * @param {number} pageIndex - Template index for 1:1 match, or 0xFFFF for 1:N search.
 * @param {number} scoreLevel - Security level (1-5, default is 3).
 * @param {number} config - Configuration flags.
 * @returns {object|null} An object containing the result code, index, and score, or null on failure.
 *                        - code: Confirmation code.
 *                        - index: Matched index.
 *                        - score: Match score.
 */
dxFingerMz.autoCompare = function (pageIndex, scoreLevel, config) {
    let param = {
        header: HEADER, addr: ADDRESS, flag: new Uint8Array([FLAG.COMMAND]), len: new Uint8Array(toEndianHexExtended(8, 2, false)), cmd: new Uint8Array([CMD_MAP.AUTO_IDENTIFY])
        , data: new Uint8Array([scoreLevel, ...toEndianHexExtended(pageIndex, 2, false), ...toEndianHexExtended(config, 2, false)])
    }
    // Send command
    send(param)
    // Expect 3 responses: 1. Command validity, 2. Image result, 3. Search result.
    for (let i = 0; i < 3; i++) {
        let resp = recvCmdPkt({ addr: ADDRESS })
        if (resp && resp.flag[0] == FLAG.COMMAND_END && resp.data[0] == 0 && resp.data[1] == 0x05) {
            return { code: resp.data[0], index: fromEndianHexExtended(resp.data.subarray(2, 4), 2, false), score: fromEndianHexExtended(resp.data.subarray(4, 6), 2, false) }
        }
    }
    return null
}
/**
 * Get Chip SN - Retrieves the unique serial number of the chip.
 * @returns {object|null} An object containing the result code and serial number, or null on failure.
 *                        - code: Confirmation code.
 *                        - sn: Serial number string/buffer.
 */
dxFingerMz.getChipSN = function () {
    let resp = execCmd(CMD_MAP.GET_CHIP_SN, [0x00])
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return { code: resp.data[0], sn: resp.data.subarray(1) }
    } else {
        return null
    }
}
/**
 * Search Now - Searches the library using the most recently extracted feature in the character buffer.
 * @param {number} startPage - Start page index.
 * @param {number} pageNum - Number of pages to search.
 * @returns {object|null} An object containing the result code, page index, and score, or null on failure.
 *                        - code: Confirmation code.
 *                        - pageIndex: Found page index.
 *                        - score: Match score.
 */
dxFingerMz.searchNow = function (startPage, pageNum) {
    let data = new Uint8Array([...toEndianHexExtended(startPage, 2, false), ...toEndianHexExtended(pageNum, 2, false)])
    let resp = execCmd(CMD_MAP.SEARCH_NOW, data)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return { code: resp.data[0], pageIndex: fromEndianHexExtended(resp.data.subarray(1, 3), 2, false), score: fromEndianHexExtended(resp.data.subarray(3, 5), 2, false) }
    } else {
        return null
    }
}
/**
 * Restore Factory Settings - Clears internal data (if enrolled) and deletes internal keys.
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.restSetting = function () {
    let resp = execCmd(CMD_MAP.REST_SETTING)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Control LED - Controls the LED color and brightness.
 * @param {number} startColor - Start color(dxFingerMz.LED_COLOR.BLUE, dxFingerMz.LED_COLOR.GREEN, dxFingerMz.LED_COLOR.RED).
 * @param {number} functionCode - Function code.
 * @param {number} endColor - End color (default is dxFingerMz.LED_COLOR.RED).
 * @param {number} loopCount - Loop count (default is 0).
 * @returns {number} Confirmation code (0 for success, others for failure).
 */
dxFingerMz.controlLed = function (startColor, functionCode = dxFingerMz.LED_FUNCTION_CODE.CONSTANT_ON, endColor = dxFingerMz.LED_COLOR.RED, loopCount = 0) {
    let data = new Uint8Array([functionCode, startColor, endColor, loopCount])
    let resp = execCmd(CMD_MAP.CONTROL_BLN, data)
    if (resp && resp.flag[0] == FLAG.COMMAND_END) {
        return resp.data
    } else {
        return -1
    }
}
/**
 * Retrieve the first unused index from the fingerprint database
 * @returns {number} Return the first unused index, returning -1 indicates retrieval failure
 */
dxFingerMz.getIndex = function () {
    // The fingerprint database has four page numbers, 0-3. Traverse and search these four page numbers
    for(let i = 0; i < 4; i++){
        let inx = dxFingerMz.readIndexTable(i)
        if(inx && inx.code == 0){
            let ret = findFreeFingerIndex(inx.indexTable, i)
            if(ret != -1){
                return ret
            }
        }
    }
    return -1
}
/**
 * Set Device Address - Sets the device address (default is 0xFFFFFFFF).
 * @param {number} startId - Start ID.
 * @param {number} endId - End ID.
 * @returns {number} The available fingerprint ID, or false on failure.
 */
dxFingerMz.setChipAddr = function (startId, endId) {
}
/**
 * Initialize Fingerprint Module.
 * @param {Object} params - Initialization parameters.
 * @param {string} [params.type='3'] - UART type.
 * @param {string} [params.path='/dev/ttySLB1'] - UART path.
 * @param {string} [params.baudrate='115200-8-N-1'] - Baud rate configuration.
 * @param {string} [params.id='fingerUart'] - Connection ID.
 * @param {number} [params.total=5000] - Total fingerprint capacity.
 * @param {number} [params.timeout=500] - Timeout in milliseconds.
 */
dxFingerMz.init = function (params) {
    options.id = params.id ? params.id : options.id
    options.timeout = params.timeout ? params.timeout : options.timeout
    options.total = params.total ? params.total : options.total
    options.type = params.type ? params.type : options.type
    options.path = params.path ? params.path : options.path
    options.baudrate = params.baudrate ? params.baudrate : options.baudrate
    dxUart.open(options.type, options.path, options.id)
    dxUart.ioctl(6, options.baudrate, options.id)
}
/** *****************************private******************************* */
/**
 * Execute Command - Sends a command and receives the response.
 * @private
 * @param {number} cmd - The command to execute.
 * @param {Uint8Array|Array} [data] - Optional data payload.
 * @returns {Object|null} The response packet, or null on failure.
 */
function execCmd(cmd, data) {
    let len = 3 // cmd(1) + checksum(2)
    let cmdData = data
    if (data) {
        if (Array.isArray(data)) {
            cmdData = new Uint8Array(data)
        }
        len += cmdData.length
    }
    let param = {
        header: HEADER,
        addr: ADDRESS,
        flag: new Uint8Array([FLAG.COMMAND]),
        len: new Uint8Array(toEndianHexExtended(len, 2, false)),
        cmd: new Uint8Array([cmd])
    }
    if (cmdData) {
        param.data = cmdData
    }
    // Send command
    send(param)
    return recvCmdPkt({ addr: ADDRESS })
}
/**
 * Send Packet
 * @private
 * @param {Object} params - Packet parameters.
 * @param {number} params.header - Packet header.
 * @param {number} params.addr - Device address.
 * @param {number} params.flag - Packet flag.
 * @param {number} params.len - Packet length.
 * @param {number} params.cmd - Command byte (optional).
 * @param {string} params.data - Data payload (optional).
 */
function send(params) {
    if (!params || typeof params !== 'object') {
        throw new Error("Parameters should be an object containing prefix, cmd and data");
    }
    const { header, addr, flag, len, cmd, data } = params;
    // Build packet
    let packet = concatUint8Arrays(header, addr, flag, len, cmd, data, new Uint8Array([0x00, 0x00]));
    // Calculate checksum
    let checksum = 0;
    for (let i = 6; i < packet.length; i++) {
        checksum += packet[i];
    }
    checksum = Math.min(checksum, 0xFFFF);
    // Set checksum
    packet.set(new Uint8Array(toEndianHexExtended(checksum, 2, false)), packet.length - 2);
    // Send packet via UART
    let ret = dxUart.send(packet.buffer, options.id);
    if (!ret) {
        throw new Error("dxFingerMz.send fail")
    }
}
/**
 * Send Data Packet - Splits data into chunks and sends them.
 * @private
 * @param {Object} params - Parameters.
 * @param {string|Uint8Array} params.data - Data to send.
 */
function sendData(param) {
    let dataLen = param.data.length
    let transNum = Math.ceil(dataLen / 128)
    for (let i = 0; i < transNum; i++) {
        let data = param.data.subarray(i * 128, (i + 1) * 128 > dataLen ? dataLen : (i + 1) * 128)
        let childParam = {
            header: HEADER, addr: ADDRESS, flag: new Uint8Array([FLAG.DATA]), len: new Uint8Array(toEndianHexExtended(2, 2, false))
            , data: data
        }
        childParam.len = new Uint8Array(toEndianHexExtended(data.length + 2, 2, false))
        if (i == transNum - 1) {
            childParam.flag = new Uint8Array([FLAG.DATA_END])
        } else {
            childParam.flag = new Uint8Array([FLAG.DATA])
        }
        send(childParam)
        os.sleep(100)
    }
}
/**
 * Receive Packet - Reads a single packet from UART.
 * @private
 * @param {Object} param - Parameters.
 * @param {Uint8Array} param.addr - Expected address.
 * @returns {Object|null} Received packet object, or null if invalid/timeout.
 */
function receive(param) {
    const header1 = dxUart.receive(1, options.timeout, options.id);
    if (!header1 || header1[0] !== 0xEF) {
        std.sleep(50)
        return null
    }
    const header2 = dxUart.receive(1, options.timeout, options.id);
    if (!header2 || header2[0] !== 0x01) {
        std.sleep(50)
        return null
    }
    // Receive addr
    const addr = dxUart.receive(4, options.timeout, options.id);
    if (common.arrayBufferToHexString(addr) != common.arrayBufferToHexString(param.addr)) {
        return null
    }
    // Receive flag
    const flag = dxUart.receive(1, options.timeout, options.id);
    // Receive len
    const len = dxUart.receive(2, options.timeout, options.id);
    // Receive data
    const data = dxUart.receive((fromEndianHexExtended(len, 2, false)) - 2, options.timeout, options.id);
    // Receive checksum
    const checksumPkt = dxUart.receive(2, options.timeout, options.id);
    // Verify checksum
    let checksum = 0;
    let packet = concatUint8Arrays(flag, len, data);
    for (let i = 0; i < packet.length; i++) {
        checksum += packet[i];
    }
    checksum = Math.min(checksum, 0xFFFF);
    if (checksum != fromEndianHexExtended(checksumPkt, 2, false)) {
        return null
    }
    let allPack = concatUint8Arrays(new Uint8Array([header1, header2]), addr, flag, len, data, checksumPkt);
    return {
        header: new Uint8Array([header1, header2]),
        addr: addr,
        flag: flag,
        len: len,
        data: data,
        checksum: checksum
    };
}
/**
 * Receive Data Packet - Receives a multi-packet data stream.
 * @private
 * @param {Object} param - Parameters.
 * @returns {Uint8Array} The complete data buffer.
 */
function recvDataPkt(param) {
    let chunks = [];  // Collect all chunks
    let totalLength = 0;
    let deadlineTime = Date.now() + 2000;
    while (Date.now() < deadlineTime) {
        const data = receive(param);
        if (data) {
            chunks.push(data.data);
            totalLength += data.data.length;
        } else {
            break;
        }
        os.sleep(10);
    }
    // Merge all chunks
    const packet = new Uint8Array(totalLength);
    let offset = 0;
    for (const chunk of chunks) {
        packet.set(chunk, offset);
        offset += chunk.length;
    }
    return packet;
}
/**
 * Receive Command Packet - Attempts to receive a command response multiple times.
 * @private
 * @param {Object} param - Parameters.
 * @returns {Object|null} Response packet, or null on failure.
 */
function recvCmdPkt(param) {
    for (let i = 0; i < 5; i++) {
        const packet = receive(param);
        if (packet) {
            return packet
        }
        os.sleep(10)
    }
    return null
}
/**
 * Convert number to little-endian (default) hex byte array.
 * @private
 * @param {number} number - The number to convert.
 * @param {number} bytes - Number of bytes.
 * @param {boolean} isLittleEndian - Little endian flag.
 * @returns {Uint8Array} The byte array.
 */
function toEndianHexExtended(number, bytes, isLittleEndian = true) {
    const buffer = new Uint8Array(bytes);
    for (let i = 0; i < bytes; i++) {
        // Bitwise operation, taking 8 bits at a time
        buffer[i] = (number >> (i * 8)) & 0xFF;
    }
    // If big endian, reverse the array
    if (!isLittleEndian) {
        buffer.reverse();
    }
    return buffer;
}
/**
 * Convert byte array to number (supports little/big endian).
 * @private
 * @param {Uint8Array|number[]} bytesArray - The byte array.
 * @param {number} bytes - Number of bytes.
 * @param {boolean} isLittleEndian - Little endian flag.
 * @returns {number} The converted number.
 */
function fromEndianHexExtended(bytesArray, bytes, isLittleEndian = true) {
    // Parameter validation
    if (!bytesArray || bytesArray.length !== bytes) {
        throw new Error(`Invalid bytes array. Expected length: ${bytes}`);
    }
    let result = 0;
    if (isLittleEndian) {
        // Little endian: least significant byte first
        for (let i = 0; i < bytes; i++) {
            result |= (bytesArray[i] << (i * 8));
        }
    } else {
        // Big endian: most significant byte first
        for (let i = 0; i < bytes; i++) {
            result = (result << 8) | bytesArray[i];
        }
    }
    // Return as unsigned integer
    return result >>> 0;
}
/**
 * Concatenate multiple Uint8Arrays.
 * @private
 * @param {...Uint8Array} arrays - Arrays to concatenate.
 * @returns {Uint8Array} The concatenated array.
 */
function concatUint8Arrays(...arrays) {
    const validArrays = arrays.filter(arr => arr && arr.length > 0);
    const totalLength = validArrays.reduce((acc, arr) => acc + arr.length, 0);
    const result = new Uint8Array(totalLength);
    let offset = 0;
    validArrays.forEach(arr => {
        result.set(arr, offset);
        offset += arr.length;
    });
    return result
}
/**
 * Find the earliest (smallest) unused template index in the fingerprint module
 *
 * @param {Uint8Array} buf The element is a 32-byte Uint8Array
 * @returns {number} Return the available template number (0~1023). Returning -1 indicates no empty space.
 */
function findFreeFingerIndex(buf, page) {
    // Traverse 32 bytes â†’ 256 bits
    for (let byteIndex = 0; byteIndex < 32; byteIndex++) {
        let byte = buf[byteIndex];
        // byte == 0xFF means all 8 bits are occupied, skip
        if (byte === 0xFF) continue;
        // Find which bit in byte is 0
        for (let bit = 0; bit < 8; bit++) {
            let used = (byte >> bit) & 1;
            if (used === 0) {
                // Global index = page offset + bit position
                let globalIndex = page * 256 + byteIndex * 8 + bit;
                return globalIndex;
            }
        }
    }
    return -1; // No empty space
}
export default dxFingerMz;
vf107/dxmodules/dxFingerZaz.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,706 @@
import std from './dxStd.js'
import dxUart from './dxUart.js'
import dxCommon from './dxCommon.js'
import log from './dxLogger.js'
const dxFingerZaz = {}
let options = {
    id : 'fingerUart',
    total: 5000,
    timeout : 500,
    type : '3',
    path : '/dev/ttySLB1',
    baudrate : '115200-8-N-1'
}
/**
 * æµ‹è¯•指纹模块命令
 * @returns {boolean} è¿”回true表示测试成功,返回false表示测试失败
 */
dxFingerZaz.test = function () {
    send({prefix: 0x55AA, cmd: 0x0100, data: ''})
    let resp = receive({prefix: 0xAA55, cmd: 0x0100})
    if(resp && resp.ret == 0x00){
        return true
    } else {
        log.error("dxFingerZaz.test:", resp)
        return false
    }
}
/**
 * èŽ·å–æŒ‡å®šç¼–å·èŒƒå›´å†…å¯æ³¨å†Œçš„é¦–ä¸ªç¼–å·
 * @param {number} startId - èµ·å§‹ç¼–号
 * @param {number} endId - ç»“束编号
 * @returns {number} è¿”回空闲的指纹编号,返回false表示获取失败(失败原因可参考ret)
 */
dxFingerZaz.getEmptyId = function (startId, endId) {
    if(startId === undefined || startId === null || startId < 1 || startId > options.total){
        throw new Error("dxFingerZaz.getEmptyId: 'startId' parameter should be between 1 and " + options.total)
    }
    if(endId === undefined || endId === null || endId < 1 || endId > options.total){
        throw new Error("dxFingerZaz.getEmptyId: 'endId' parameter should be between 1 and " + options.total)
    }
    let data = toEndianHexExtended(startId, 2) + toEndianHexExtended(endId, 2)
    send({prefix: 0x55AA, cmd: 0x4500, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x4500})
    if(resp && resp.ret == 0x00){
        return fromEndianHexExtended(resp.data, 2)
    } else {
        log.error("dxFingerZaz.getEmptyId:", resp)
        return false
    }
}
/**
 * èŽ·å–æŒ‡å®šç¼–å·çš„æ¨¡æ¿æ³¨å†ŒçŠ¶æ€
 * @param {number} keyId - æŒ‡çº¹ç¼–号
 * @returns {number} è¿”回0表示未注册,返回1表示已注册,返回false表示获取失败
 */
dxFingerZaz.getStatus = function (keyId) {
    if (keyId === undefined || keyId === null) {
        throw new Error("dxFingerZaz.getStatus: 'keyId' parameter should not be null or empty")
    }
    send({prefix: 0x55AA, cmd: 0x4600, data: toEndianHexExtended(keyId, 2)})
    let resp = receive({prefix: 0xAA55, cmd: 0x4600})
    if(resp && resp.ret == 0x00){
        return fromEndianHexExtended(resp.data, 1)
    } else {
        log.error("dxFingerZaz.getStatus:", resp)
        return false
    }
}
/**
 * é‡‡é›†æŒ‡çº¹å›¾åƒ
 * @returns {boolean} è¿”回true表示采集成功,返回false表示采集失败(失败原因可参考ret)
 */
dxFingerZaz.getImage = function () {
    send({prefix: 0x55AA, cmd: 0x2000, data: ""})
    let resp = receive({prefix: 0xAA55, cmd: 0x2000})
    if(resp && resp.ret == 0x00){
        return true
    } else {
        // log.error("dxFingerZaz.getImage:", resp)
        return false
    }
}
/**
 * ä»Žæš‚存在ImageBuffer中的指纹图像产生模板
 * @param {number} bufferNum - æŒ‡çº¹æ¨¡æ¿ç¼–号(0-2)
 * @returns {boolean} è¿”回true表示生成成功,返回false表示生成失败(失败原因可参考ret)
 */
dxFingerZaz.generate = function (bufferNum) {
    if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){
        throw new Error("dxFingerZaz.generate: 'bufferNum' parameter should be between 0 and 3")
    }
    send({prefix: 0x55AA, cmd: 0x6000, data: toEndianHexExtended(bufferNum, 2)})
    let resp = receive({prefix: 0xAA55, cmd: 0x6000})
    if(resp && resp.ret == 0x00){
        return true
    } else {
        log.error("dxFingerZaz.generate:", resp)
        return false
    }
}
/**
 * åˆå¹¶æŒ‡çº¹æ¨¡æ¿
 * @param {number} mergeCount - åˆå¹¶æ¨¡æ¿æ•°é‡ï¼ˆ2|3) 2:合成 Ram Buffer0 å’Œ Ram Buffer1,3:合成 Ram Buffer0、Ram Buffer1 å’Œ Ram Buffer2
 * @param {number} bufferNum - æŒ‡çº¹åˆå¹¶åŽæ¨¡æ¿ç¼–号(0-2)
 * @returns {boolean} è¿”回true表示合并成功,返回false表示合并失败
 */
dxFingerZaz.merge = function (mergeCount, bufferNum) {
    if(mergeCount === undefined || mergeCount === null || mergeCount < 2 || mergeCount > 3){
        throw new Error("dxFingerZaz.merge: 'mergeCount' parameter should be between 2 and 3")
    }
    if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){
        throw new Error("dxFingerZaz.merge: 'bufferNum' parameter should be between 0 and 3")
    }
    let data = toEndianHexExtended(bufferNum, 2) + toEndianHexExtended(mergeCount, 1)
    send({prefix: 0x55AA, cmd: 0x6100, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x6100})
    if(resp && resp.ret == 0x00){
        return true
    } else {
        log.error("dxFingerZaz.merge:", resp)
        return false
    }
}
/**
 * ä¿å­˜æŒ‡çº¹æ¨¡æ¿æ•°æ®åˆ°æ¨¡å—指纹库
 * @param {number} keyId - æŒ‡çº¹ç¼–号
 * @param {number} bufferNum - æŒ‡çº¹æ¨¡æ¿ç¼–号(0-2)
 * @param {boolean} [overwrite=false] - æ˜¯å¦è¦†ç›–已存在的指纹
 * @returns {boolean} è¿”回true表示存储成功,返回false表示存储失败
 */
dxFingerZaz.storeChar = function (keyId, bufferNum, overwrite = false) {
    if(keyId === undefined || keyId === null){
        throw new Error("dxFingerZaz.storeChar: 'keyId' parameter should be between 0 and 255")
    }
    if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){
        throw new Error("dxFingerZaz.storeChar: 'bufferNum' parameter should be between 0 and 3")
    }
    if (overwrite) {
        const delRet = dxFingerZaz.delChar(keyId, keyId)
        if (!delRet) {
            log.error("dxFingerZaz.storeChar: failed to delete existing fingerprint for keyId", keyId)
            return false
        }
    }
    let data = toEndianHexExtended(keyId, 2) + toEndianHexExtended(bufferNum, 2)
    send({prefix: 0x55AA, cmd: 0x4000, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x4000})
    if(resp && resp.ret == 0x00){
        return true
    } else {
        log.error("dxFingerZaz.storeChar:", resp)
        return false
    }
}
/**
 * è¯»å–模块中的指纹并暂存在RamBuffer中
 * @param {number} keyId - æŒ‡çº¹ç¼–号
 * @param {number} bufferNum - æŒ‡çº¹æ¨¡æ¿ç¼–号(0-2)
 * @returns {boolean} è¿”回true表示存储成功,返回false表示存储失败
 */
dxFingerZaz.loadChar = function (keyId, bufferNum) {
    if(keyId === undefined || keyId === null){
        throw new Error("dxFingerZaz.loadChar: 'keyId' parameter should be between 0 and 255")
    }
    if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){
        throw new Error("dxFingerZaz.loadChar: 'bufferNum' parameter should be between 0 and 3")
    }
    let data = toEndianHexExtended(keyId, 2) + toEndianHexExtended(bufferNum, 2)
    send({prefix: 0x55AA, cmd: 0x4100, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x4100})
    if(resp && resp.ret == 0x00){
        return true
    } else {
        log.error("dxFingerZaz.loadChar:", resp)
        return false
    }
}
/**
 * å°†ä¿å­˜äºŽæŒ‡å®šç¼–号的Ram Buffer ä¸­çš„ Template ä¸Šä¼ è‡³HOST
 * @param {number} bufferNum - æŒ‡çº¹æ¨¡æ¿ç¼–号(0-2)
 * @returns {string} è¿”回设备信息,返回false表示获取失败
 */
dxFingerZaz.upChar = function (bufferNum) {
    if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){
        throw new Error("dxFingerZaz.upChar: 'bufferNum' parameter should be between 0 and 3")
    }
    let data = toEndianHexExtended(bufferNum, 2)
    send({prefix: 0x55AA, cmd: 0x4200, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x4200})
    if(resp && resp.ret == 0x00){
        log.info("resp.data:", fromEndianHexExtended(resp.data, 2))
        resp = receive({prefix: 0xA55A, cmd: 0x4200, len: fromEndianHexExtended(resp.data, 2)})
        if(resp && resp.ret == 0x00){
            return dxCommon.uint8ArrayToHexString(resp.data)
        } else {
            log.error("dxFingerZaz.upChar:", resp)
            return false
        }
    } else {
        log.error("dxFingerZaz.upChar:", resp)
        return false
    }
}
/**
 * ä»ŽHOST下载 Template到模块指定编号的 Ram Buffer
 * @param {number} bufferNum - æŒ‡çº¹æ¨¡æ¿ç¼–号(0-2)
 * @param {string} template - æŒ‡çº¹æ¨¡æ¿æ•°æ®
 * @returns {string} è¿”回设备信息,返回false表示获取失败
 */
dxFingerZaz.downChar = function (bufferNum, template) {
    if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){
        throw new Error("dxFingerZaz.downChar: 'bufferNum' parameter should be between 0 and 3")
    }
    if(template === undefined || template === null){
        throw new Error("dxFingerZaz.downChar: 'template' parameter should not be null or empty")
    }
    let data = toEndianHexExtended(bufferNum, 2) + template
    log.info("template.length:", toEndianHexExtended(data.length / 2, 2))
    send({prefix: 0x55AA, cmd: 0x4300, data: toEndianHexExtended(data.length / 2, 2)})
    let resp = receive({prefix: 0xAA55, cmd: 0x4300})
    if(resp && resp.ret == 0x00){
        send({prefix: 0x5AA5, cmd: 0x4300, data: data})
        resp = receive({prefix: 0xA55A, cmd: 0x4300})
        if(resp && resp.ret == 0x00){
            return true
        } else {
            log.error("dxFingerZaz.downChar:", resp)
            return false
        }
    } else {
        log.error("dxFingerZaz.downChar:", resp)
        return false
    }
}
/**
 * èŽ·å–æŒ‡çº¹æ¨¡å—è®¾å¤‡ä¿¡æ¯
 * @returns {string} è¿”回设备信息,返回false表示获取失败
 */
dxFingerZaz.getEnrolledIdList = function () {
    send({prefix: 0x55AA, cmd: 0x4900, data: ""})
    let resp = receive({prefix: 0xAA55, cmd: 0x4900})
    if(resp && resp.ret == 0x00){
        resp = receive({prefix: 0xA55A, cmd: 0x4900, len: fromEndianHexExtended(resp.data, 2)})
        if(resp && resp.ret == 0x00){
            return resp.data
        } else {
            log.error("dxFingerZaz.getDeviceInfo:", resp)
            return false
        }
    } else {
        log.error("dxFingerZaz.getDeviceInfo:", resp)
        return false
    }
}
/**
 * æœç´¢æŒ‡çº¹æ¨¡æ¿
 * @param {number} bufferNum - æŒ‡çº¹æ¨¡æ¿ç¼–号(0-2)
 * @param {number} startId - æœç´¢èµ·å§‹ç¼–号
 * @param {number} endId - æœç´¢ç»“束编号
 * @returns {number} è¿”回搜索到的指纹编号,返回false表示搜索失败
 */
dxFingerZaz.search = function (bufferNum, startId, endId) {
    if(bufferNum === undefined || bufferNum === null || bufferNum < 0 || bufferNum > 2){
        throw new Error("dxFingerZaz.search: 'bufferNum' parameter should be between 0 and 3")
    }
    if(startId === undefined || startId === null || startId < 1 || startId > options.total){
        throw new Error("dxFingerZaz.search: 'startId' parameter should be between 1 and " + options.total)
    }
    if(endId === undefined || endId === null || endId < 1 || endId > options.total){
        throw new Error("dxFingerZaz.search: 'endId' parameter should be between 1 and " + options.total)
    }
    let data = toEndianHexExtended(bufferNum, 2) + toEndianHexExtended(startId, 2) + toEndianHexExtended(endId, 2)
    send({prefix: 0x55AA, cmd: 0x6300, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x6300})
    if(resp && resp.ret == 0x00){
        return fromEndianHexExtended(resp.data.slice(0, 2), 2)
    } else {
        log.error("dxFingerZaz.search:", resp)
        return false
    }
}
/**
 * èŽ·å–æŒ‡çº¹æ¨¡å—å‚æ•°
 * @param {number} paramType - å‚数类型(0-4)[0: è®¾å¤‡Id, 1: å®‰å…¨ç­‰çº§, 2: é‡å¤æ£€æŸ¥, 3: æ³¢ç‰¹çއ, 4: è‡ªåЍ学习]
 * @returns {number} è¿”回参数值,返回false表示获取失败
 *
 * è®¾å¤‡Id:[1-255]
 * å®‰å…¨ç­‰çº§ï¼š[1-5]
 * é‡å¤æ ¡éªŒï¼š[0/1]
 * æ³¢ç‰¹çŽ‡ï¼š[1:9600, 2:19200, 3:38400, 4:57600, 5:115200, 6:230400, 7:460800, 8:921600]
 * è‡ªåŠ¨å­¦ä¹ ï¼š[0/1]
 */
dxFingerZaz.getParam = function (paramType) {
    if(paramType === undefined || paramType === null || paramType < 0 || paramType > 4){
        throw new Error("dxFingerZaz.getParam: 'paramType' parameter should be between 0 and 4")
    }
    let data = toEndianHexExtended(paramType, 2)
    send({prefix: 0x55AA, cmd: 0x0300, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x0300})
    if(resp && resp.ret == 0x00){
        return fromEndianHexExtended(resp.data, 4)
    } else {
        log.error("dxFingerZaz.getParam:", resp)
        return false
    }
}
/**
 * è®¾ç½®æŒ‡çº¹æ¨¡å—参数
 * @param {number} paramType - å‚数类型(0-4)[0: è®¾å¤‡Id, 1: å®‰å…¨ç­‰çº§, 2: é‡å¤æ£€æŸ¥, 3: æ³¢ç‰¹çއ, 4: è‡ªåЍ学习]
 * @param {number} paramValue - å‚数值
 * @returns {boolean} è¿”回true表示设置成功,返回false表示设置失败
 *
 * è®¾å¤‡Id:[1-255]
 * å®‰å…¨ç­‰çº§ï¼š[1-5]
 * é‡å¤æ ¡éªŒï¼š[0/1]
 * æ³¢ç‰¹çŽ‡ï¼š[1:9600, 2:19200, 3:38400, 4:57600, 5:115200, 6:230400, 7:460800, 8:921600]
 * è‡ªåŠ¨å­¦ä¹ ï¼š[0/1]
 */
dxFingerZaz.setParam = function (paramType, paramValue) {
    if(paramType === undefined || paramType === null || paramType < 0 || paramType > 4){
        throw new Error("dxFingerZaz.setParam: 'paramType' parameter should be between 0 and 4")
    }
    if(paramValue === undefined || paramValue === null || paramValue < 0 || paramValue > 255){
        throw new Error("dxFingerZaz.setParam: 'paramValue' parameter should be between 0 and 255")
    }
    let data = toEndianHexExtended(paramType, 1) + toEndianHexExtended(paramValue, 4)
    send({prefix: 0x55AA, cmd: 0x0200, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x0200})
    if(resp && resp.ret == 0x00){
        return true
    } else {
        log.error("dxFingerZaz.setParam:", resp)
        return false
    }
}
/**
 * èŽ·å–æŒ‡çº¹æ¨¡å—è®¾å¤‡ä¿¡æ¯
 * @returns {string} è¿”回设备信息,返回false表示获取失败
 */
dxFingerZaz.getDeviceInfo = function () {
    send({prefix: 0x55AA, cmd: 0x0400, data: ""})
    let resp = receive({prefix: 0xAA55, cmd: 0x0400})
    if(resp && resp.ret == 0x00){
        resp = receive({prefix: 0xA55A, cmd: 0x0400, len: fromEndianHexExtended(resp.data, 2)})
        if(resp && resp.ret == 0x00){
            return dxCommon.utf8HexToStr(dxCommon.uint8ArrayToHexString(resp.data.slice(0, resp.length - 3)))
        } else {
            log.error("dxFingerZaz.getDeviceInfo:", resp)
            return false
        }
    } else {
        log.error("dxFingerZaz.getDeviceInfo:", resp)
        return false
    }
}
/**
 * æŒ‡çº¹æ£€æµ‹
 * @returns {number} è¿”回1:有指纹输入,0:无指纹输入,返回false表示检测失败
 */
dxFingerZaz.fingerDetect = function () {
    send({prefix: 0x55AA, cmd: 0x2100, data: ""})
    let resp = receive({prefix: 0xAA55, cmd: 0x2100})
    if(resp && resp.ret == 0x00){
        return fromEndianHexExtended(resp.data, 1)
    } else {
        log.error("dxFingerZaz.fingerDetect:", resp)
        return false
    }
}
/**
 * åˆ é™¤æŒ‡çº¹æ¨¡æ¿
 * @param {number} startId - åˆ é™¤èµ·å§‹ç¼–号
 * @param {number} endId - åˆ é™¤ç»“束编号
 * @returns {boolean} è¿”回true表示删除成功,返回false表示删除失败
 */
dxFingerZaz.delChar = function (startId, endId) {
    if(startId === undefined || startId === null || startId < 1 || startId > options.total){
        throw new Error("dxFingerZaz.delChar: 'startId' parameter should be between 1 and " + options.total)
    }
    if(endId === undefined || endId === null || endId < 1 || endId > options.total){
        throw new Error("dxFingerZaz.delChar: 'endId' parameter should be between 1 and " + options.total)
    }
    let data = toEndianHexExtended(startId, 2) + toEndianHexExtended(endId, 2)
    send({prefix: 0x55AA, cmd: 0x4400, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x4400})
    if(resp && resp.ret == 0x00){
        return true
    } else {
        log.error("dxFingerZaz.delChar:", resp)
        return false
    }
}
/**
 * èŽ·å–æŒ‡å®šç¼–å·èŒƒå›´å†…å·²æ³¨å†Œçš„æŒ‡çº¹æ€»æ•°
 * @param {number} startId - èµ·å§‹ç¼–号
 * @param {number} endId - ç»“束编号
 * @returns {number} è¿”回指定编号范围内已注册的指纹总数,返回false表示获取失败
 */
dxFingerZaz.getEnrollCount = function (startId, endId) {
    if(startId === undefined || startId === null || startId < 1 || startId > options.total){
        throw new Error("dxFingerZaz.getEnrollCount: 'startId' parameter should be between 1 and " + options.total)
    }
    if(endId === undefined || endId === null || endId < 1 || endId > options.total){
        throw new Error("dxFingerZaz.getEnrollCount: 'endId' parameter should be between 1 and " + options.total)
    }
    let data = toEndianHexExtended(startId, 2) + toEndianHexExtended(endId, 2)
    send({prefix: 0x55AA, cmd: 0x4800, data: data})
    let resp = receive({prefix: 0xAA55, cmd: 0x4800})
    if(resp && resp.ret == 0x00){
        return fromEndianHexExtended(resp.data, 2)
    } else {
        log.error("dxFingerZaz.getEnrollCount:", resp)
        return false
    }
}
/**
 * åˆå§‹åŒ–指纹模块
 * @param {Object} params
 * @param {string} params.type - ä¸²å£ç±»åž‹ï¼ˆé»˜è®¤ 3)
 * @param {string} params.path - ä¸²å£è·¯å¾„(默认 '/dev/ttySLB1')
 * @param {number} params.baudrate - æ³¢ç‰¹çŽ‡ï¼ˆé»˜è®¤ '115200-8-N-1')
 * @param {number} params.id - id(默认 'fingerUart')
 * @param {number} params.total - æŒ‡çº¹æ€»æ•°ï¼ˆé»˜è®¤ 5000)
 * @param {number} params.timeout - è¶…时时间(默认 500)
 */
dxFingerZaz.init = function (params) {
    options.id = params.id ? params.id : options.id
    options.timeout = params.timeout ? params.timeout : options.timeout
    options.total = params.total ? params.total : options.total
    options.type = params.type ? params.type : options.type
    options.path = params.path ? params.path : options.path
    options.baudrate = params.baudrate ? params.baudrate : options.baudrate
    dxUart.open(options.type, options.path, options.id)
    dxUart.ioctl(6, options.baudrate, options.id)
}
/**
 * å°†æ•°å­—转换为指定字节数的十六进制字符串
 * @param {number} number - è¦è½¬æ¢çš„æ•°å­—
 * @param {number} bytes - å­—节数(默认2字节)
 * @param {boolean} isLittleEndian - æ˜¯å¦å°ç«¯åºï¼ˆé»˜è®¤true)
 * @returns {string} è½¬æ¢åŽçš„十六进制字符串
 */
function toEndianHexExtended(number, bytes, isLittleEndian = true) {
    // è®¡ç®—所需的十六进制位数(每个字节占2位)
    const hexLength = bytes * 2;
    let hexStr = number.toString(16).padStart(hexLength, '0');
    // åˆ†å‰²ä¸ºå­—节数组
    const bytesArray = [];
    for (let i = 0; i < hexLength; i += 2) {
        bytesArray.push(hexStr.substr(i, 2));
    }
    // æ ¹æ®å­—节序反转数组
    if (isLittleEndian) bytesArray.reverse();
    return bytesArray.join('');
}
/**
 * å°†å­—节数组转换为数字(支持大小端序)
 * @param {Uint8Array|number[]} bytesArray - å­—节数组(如 Uint8Array æˆ–普通数组)
 * @param {number} bytes - å­—节数(必须与实际数据长度一致)
 * @param {boolean} isLittleEndian - æ˜¯å¦å°ç«¯åºï¼ˆé»˜è®¤true)
 * @returns {number} è½¬æ¢åŽçš„æ•°å­—
 */
function fromEndianHexExtended(bytesArray, bytes, isLittleEndian = true) {
    // å‚数校验
    if (!bytesArray || bytesArray.length !== bytes) {
        throw new Error(`Invalid bytes array. Expected length: ${bytes}`);
    }
    // å¤„理小端序:反转字节顺序
    const adjustedBytes = isLittleEndian
        ? Array.from(bytesArray).reverse()
        : Array.from(bytesArray);
    // è½¬æ¢ä¸ºåå…­è¿›åˆ¶å­—符串
    const hexStr = adjustedBytes
        .map(byte => byte.toString(16).padStart(2, "0"))
        .join("");
    // è½¬æ¢ä¸ºæ•°å­—(支持大整数)
    return parseInt(hexStr, 16);
}
/**
 * å‘送数据
 * @param {Object} params
 * @param {number} params.prefix
 * @param {number} params.cmd
 * @param {string} params.data
 */
function send(params) {
    if (!params || typeof params !== 'object') {
        throw new Error("Parameters should be an object containing prefix, cmd and data");
    }
    const { prefix, cmd, data } = params;
    const sid = 0x00;   // é»˜è®¤æºåœ°å€ 0x00
    const did = 0x00;   // é»˜è®¤ç›®æ ‡åœ°å€ 0x00
    const hexParts = data.match(/[\da-f]{2}/gi) || [];
    const bytes = new Uint8Array(hexParts.map(h => parseInt(h, 16)));
    let dataBytes
    if (prefix === 0x55AA) {
        dataBytes = new Uint8Array(16);
        dataBytes.set(bytes.subarray(0, 16), 0);
    } else if (prefix === 0x5AA5) {
        dataBytes = new Uint8Array(500);
        dataBytes.set(bytes.subarray(0, 500), 0);
    }
    // æž„造基础数据包
    const packet = new Uint8Array(8 + dataBytes.length + 2); // åŒ…头(8) + æ•°æ® + æ ¡éªŒ(2)
    const view = new DataView(packet.buffer);
    // å¡«å……包头
    view.setUint16(0, prefix, false);      // å¤§ç«¯åº PREFIX (2 bytes)
    packet[2] = sid;                       // SID (1 byte)
    packet[3] = did;                       // DID (1 byte)
    view.setUint16(4, cmd, false);         // å¤§ç«¯åº CMD (2 bytes)
    view.setUint16(6, hexParts.length, true); // å¤§ç«¯åº LEN (2 bytes)
    // å¡«å……数据
    packet.set(dataBytes, 8);
    // è®¡ç®—校验和
    let checksum = 0;
    for (let i = 0; i < 8 + dataBytes.length; i++) {
        checksum += packet[i];
    }
    checksum &= 0xFFFF; // å–低 16 ä½
    // å¡«å……校验和(大端序)
    packet[8 + dataBytes.length] = checksum & 0xFF;
    packet[8 + dataBytes.length + 1] = (checksum >> 8) & 0xFF;
    // // TODO ä¸´æ—¶æ—¥å¿—打印 start
    // let str = ''
    // for (let i = 0; i < packet.length; i++) {
    //     str += packet[i].toString(16).padStart(2, '0') + ' '
    // }
    // log.info("send:", str)
    // // TODO ä¸´æ—¶æ—¥å¿—打印 end
    // å‘送数据
    let ret = dxUart.send(packet.buffer, options.id);
    if(!ret){
        throw new Error("fingerZazUart.send fail")
    }
}
/**
 * æŽ¥æ”¶æ•°æ®
 * @param {Object} params
 * @param {number} params.prefix
 * @param {number} params.cmd
 * @param {number} params.len
 * @returns {Object} è¿”回数据
 */
function receive(params) {
    // é‡è¯•5次, é¿å…è¯»å–太快模组未响应
    for(let i = 0; i < 5; i++){
        const prefix1 = dxUart.receive(1, options.timeout, options.id);
        if (!prefix1 || (prefix1[0] !== 0xAA && prefix1[0] !== 0xA5)) {
            std.sleep(50)
            continue
        }
        const prefix2 = dxUart.receive(1, options.timeout, options.id);
        if (!prefix2 || (prefix2[0] !== 0x55 && prefix2[0] !== 0x5A)) {
            std.sleep(50)
            continue
        }
        // å®šä¹‰é€šç”¨å­—段
        let prefix, sid, did, cmd, len, ret, data, checksum;
        prefix = (prefix1[0] << 8) | prefix2[0];
        const value1 = dxUart.receive(6, options.timeout, options.id);
        sid = value1[0];
        did = value1[1];
        cmd = (value1[2] << 8) | value1[3];
        len = (value1[5] << 8) | value1[4];
        let value2 = dxUart.receive(len, options.timeout, options.id)
        if(value2 && value2.length === len){
            ret = value2[1] << 8 | value2[0];
            data = value2.subarray(2, len)
        } else {
            throw new Error("fingerZazUart.receive fail: data length mismatch")
        }
        let value3
        if(prefix1[0] === 0xAA && prefix2[0] === 0x55){
            // æ ¡éªŒå­—在最后
            value3 = dxUart.receive((26 - 2 - 8 - len + 2), options.timeout, options.id)
            checksum = value3[value3.length - 2] | (value3[value3.length - 1] << 8);
        } else {
            // æ ¡éªŒå­—在前面
            value3 = dxUart.receive(2, options.timeout, options.id)
            checksum = value3[0] | (value3[1] << 8);
        }
        // è®¡ç®—校验和(从prefix到data)
        let sum = prefix1[0];
        sum += prefix2[0];
        for (let i=0; i < value1.length; i++) sum += value1[i];
        for (let i=0; i < value2.length; i++) sum += value2[i];
        if ((sum & 0xFFFF) !== checksum) throw "Response Packet Checksum mismatch";
        // // TODO ä¸´æ—¶æ—¥å¿—打印 start
        // let str = prefix1[0].toString(16).padStart(2, '0') + ' ' + prefix2[0].toString(16).padStart(2, '0') + ' '
        // for (let i = 0; i < value1.length; i++) str += value1[i].toString(16).padStart(2, '0') + ' '
        // for (let i = 0; i < value2.length; i++) str += value2[i].toString(16).padStart(2, '0') + ' '
        // for (let i = 0; i < value3.length; i++) str += value3[i].toString(16).padStart(2, '0') + ' '
        // log.info("receive:", str)
        // // TODO ä¸´æ—¶æ—¥å¿—打印 end
        if (params.prefix == prefix && params.cmd == cmd) {
            return {
                prefix: prefix,
                sid,
                did,
                command: cmd,
                length: len,
                ret: ret,
                data: Array.from(data),
                cks: true
            };
        } else {
            throw new Error("fingerZazUart.receive fail:")
        }
    }
}
export default dxFingerZaz;
vf107/dxmodules/dxGpio.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,123 @@
// build : 20240524
// gpio è¾“出,只能输出2种状态,高电平/低电平,如果接入继电器,则高电平是开,低电平是关
import { gpioClass } from './libvbar-b-dxgpio.so'
const gpioObj = new gpioClass();
const gpio = {}
/**
 * åˆå§‹åŒ–,只需要执行一次即可
 * @returns true/false
 */
gpio.init = function () {
    return gpioObj.init();
}
/**
 * é‡Šæ”¾gpio资源
 * @returns true/false
 */
gpio.deinit = function () {
    return gpioObj.exit();
}
/**
 * ç”³è¯·gpio,每个gpio只需要申请一次
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @returns true/false
 */
gpio.request = function (gpio_) {
    let res = gpioObj.request(gpio_)
    if (!res) {
        return res
    }
    gpioObj.setFunc(gpio_, 0x04);
    return true
}
/**
 * é‡Šæ”¾æŒ‡å®šgpio
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @returns true/false
 */
gpio.free = function (gpio_) {
    return gpioObj.free(gpio_);
}
/**
 * æŒ‡å®šgpio输出高/低电平
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @param {number} value åªèƒ½æ˜¯1和0,1表示高电平,0表示低电平,缺省是高电平,必填
 * @returns true/false
 */
gpio.setValue = function (gpio_, value) {
    return gpioObj.setValue(gpio_, value);
}
/**
 * èŽ·å–æŒ‡å®šgpio当前的输出 ï¼šé«˜/低电平
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @returns 1和0,1表示高电平,0表示低电平
 */
gpio.getValue = function (gpio_) {
    return gpioObj.getValue(gpio_);
}
/**
 * ç”³è¯·gpio,每个gpio只需要申请一次
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @returns true/false
 */
gpio.requestGpio = function (gpio_) {
    let res = gpioObj.request(gpio_)
    return res
}
/**
 * è®¾ç½®gpio功能
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @param {number} gpio功能属性,不同的设备不同的功能属性,必填
 * @returns true/false
 */
gpio.setFuncGpio = function (gpio_, func) {
    let res = gpioObj.setFunc(gpio_, func)
    return res
}
/**
 * è®¾ç½®æŒ‡å®šgpio上拉状态
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @param {number} state ä¸Šæ‹‰çŠ¶æ€ï¼Œå¿…å¡«
 * @returns true/false
 */
gpio.setPullState = function (gpio_, state) {
    return gpioObj.setPullState(gpio_, state);
}
/**
 * èŽ·å–æŒ‡å®šgpio上拉状态
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @returns ä¸Šæ‹‰çŠ¶æ€(int)
 */
gpio.getPullState = function (gpio_) {
    return gpioObj.getPullState(gpio_);
}
/**
 * è®¾ç½®æŒ‡å®šgpio的驱动能力
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @param {number} strength èƒ½åŠ›ï¼Œå¿…å¡«
 * @returns true/false
 */
gpio.setDriveStrength = function (gpio_, strength) {
    return gpioObj.setDriveStrength(gpio_, strength);
}
/**
 * èŽ·å–æŒ‡å®šgpio的驱动能力
 * @param {number} gpio的标识,不同的设备不同的标识,必填
 * @returns èƒ½åŠ›(int)
 */
gpio.getDriveStrength = function (gpio_) {
    return gpioObj.getDriveStrength(gpio_);
}
export default gpio;
vf107/dxmodules/dxGpioKey.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
/**
 * GPIO Key Module based on native gpio_key C library.
 * This module provides a singleton interface to GPIO key management.
 * Can be used across threads, but callback registration and loop functions need to be called in the same thread.
 * Features:
 * - Initialize/deinitialize GPIO key monitoring
 * - Query gpiokey status by code
 * - Register gpiokey event callbacks for gpiokey events
 * - Process gpiokey events through event loop
 *
 * Usage:
 * - Call `init()` once to initialize.
 * - Use `getStatus(code)` to query gpiokey status.
 * - Use `setCallbacks()` to register gpiokey event handlers.
 * - Call `loop()` periodically to process events (e.g. in setInterval).
 *
 * Doc/Demo: https://github.com/DejaOS/DejaOS
 */
import { gpioKeyClass } from './libvbar-m-dxkey.so'
const dxGpioKey = {};
const gpiokey = new gpioKeyClass();
let _callbacks = {};
/**
 * GPIO key/input event type constant (corresponding to Linux input_ event. type)
 * Used to distinguish the categories of events, such as buttons, coordinates, synchronization, etc.
 *
 * Reference:<Linux/input-event-codes. h>
 */
dxGpioKey.GPIO_KEY_TYPE = {
    SYN: 0x00, // Synchronization event (end of event grouping flag)
    KEY: 0x01, // Key event (keyboard, GPIO key, gamepad button)
    REL: 0x02, // Relative position event (mouse, scroll wheel)
    ABS: 0x03, // Absolute position event (touchscreen, joystick)
    MSC: 0x04, // Miscellaneous event (scan code, raw code, etc.)
    SW:  0x05, // Switch event (lid switch, plug/unplug, seat sensor, etc.)
    LED: 0x11, // LED status (e.g. keyboard caps lock indicator)
    SND: 0x12  // Sound event (beeper, etc.)
};
/**
 * Initializes the GPIO key monitoring system.
 * @returns {boolean} True if successful, false otherwise.
 * @example
 * const success = dxGpioKey.init();
 * if (success) {
 *   logger.info('GPIO key initialized successfully');
 * }
 */
dxGpioKey.init = function () {
    return gpiokey.init();
}
/**
 * Deinitializes the GPIO key monitoring system and releases resources.
 * @returns {boolean} True if successful, false otherwise.
 */
dxGpioKey.deinit = function () {
    return gpiokey.deinit();
}
/**
 * Gets the current status of a specific GPIO key.
 * @param {number} code - GPIO key code to query.
 * @returns {KeyEvent} Key status object containing code, type, and value.
 * @typedef {object} KeyEvent
 * @property {number} code - GPIO key code.
 * @property {number} srcCode - GPIO key source code.
 * @property {number} type - Event type (in dxGpioKey.GPIO_KEY_TYPE, e.g. dxGpioKey.GPIO_KEY_TYPE.KEY for key press).
 * @property {number} value - Event value (e.g., 1 for pressed, 0 for released).
 * @example
 * const status = dxGpioKey.getStatus(3) // code in 0-x, is the number of gpiokey hardware interfaces on the device;
 * logger.info(JSON.stringify(status))
 * // Output: { code: 3, srcCode: 33, type: 1, value: 1 }
 */
dxGpioKey.getStatus = function (code) {
    return gpiokey.getStatus(code);
}
/**
 * Sets callback handlers for GPIO key events.
 * @param {object} callbacks - Callback functions.
 * @param {function(KeyEvent)} [callbacks.onKeyEvent] - Called when a key event occurs.
 * @example
 * dxGpioKey.setCallbacks({
 *   onKeyEvent: function(event) {
 *     logger.info('Key event:', JSON.stringify(event));
 *     // Output: Key event: {"code":3,"srcCode":33,"type":1,"value":1}
 *   }
 * });
 * @returns {void}
 */
dxGpioKey.setCallbacks = function (callbacks) {
    _callbacks = callbacks;
}
/**
 * Processes events from the GPIO key event queue. Should be called periodically (e.g. in setInterval).
 * Handles key press/release events and triggers registered callbacks.
 * @example
 * setInterval(() => {
 *   try {
 *     dxGpioKey.loop();
 *   } catch (e) {
 *     logger.error('Error in GPIO key loop:', e);
 *   }
 * }, 50); // Process events every 50ms
 * @returns {void}
 */
dxGpioKey.loop = function () {
    let ev = gpiokey.getEvent();
    if (ev && _callbacks.onKeyEvent) {
        _callbacks.onKeyEvent(ev);
    }
}
/**
 * Gets the native GPIO key object.
 * @returns {Object|null} The native GPIO key object, or null if not initialized.
 */
dxGpioKey.getNative = function () {
    return gpiokey;
}
export default dxGpioKey;
vf107/dxmodules/dxHttp.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,155 @@
// http客户端组件
import { httpClass } from './libvbar-m-dxhttp.so'
const httpObj = new httpClass();
const http = {
    HTTP_METHOD : {
        GET: "GET",
        POST: "POST",
        PUT: "PUT",
        DELETE: "DELETE",
        HEAD: "HEAD",
        OPTIONS: "OPTIONS",
        PATCH: "PATCH"
    },
    HTTP_FORMAT : {
        JSON: "JSON",
        FORM: "FORM",
        URLENCODE: "URLENCODE"
    },
    HTTP_FORM_TYPE : {
        STRING: "STRING",
        FILE: "FILE"
    },
    /**
     * get请求
     * @param {string} url
     * @param {array} headers éžå¿…填,会有默认填充 request headers
     * @param {number} timeout éžå¿…填, è¶…æ—¶æ—¶é—´
     * @returns
     */
    get: function (url, headers, timeout) {
        if (!url) {
            throw new Error("url should not be null or empty")
        }
        return httpObj.request({ method: 0, url: url, headers: headers, timeout: timeout})
    },
    /**
     * post请求,data为json/form表单数组格式
     * @param {string} url
     * @param {array} data
     * @param {array} headers éžå¿…填,会有默认填充 request headers
     * @param {number} timeout éžå¿…填, è¶…æ—¶æ—¶é—´
     * @returns
     */
    post: function (url, data, headers, timeout, format = "JSON") {
        if (!url) {
            throw new Error("url should not be null or empty")
        }
        if (!data) {
            throw new Error("data should not be null or empty")
        }
        if (typeof data != 'string' && format != "FORM") {
            data = JSON.stringify(data)
        }
        if(format == "JSON"){
            return httpObj.request({ method: 1, url: url, data: data, headers: headers, timeout: timeout})
        }else{
            return httpObj.request({ method: 1, url: url, formData: data, headers: headers, timeout: timeout})
        }
    },
    /**
     * put请求,data为json/form表单数组格式
     * @param {string} url
     * @param {array} data
     * @param {array} headers éžå¿…填,会有默认填充 request headers
     * @param {number} timeout éžå¿…填, è¶…æ—¶æ—¶é—´
     * @returns
     */
    put: function (url, data, headers, timeout, format = "JSON") {
        if (!url) {
            throw new Error("url should not be null or empty")
        }
        if (!data) {
            throw new Error("data should not be null or empty")
        }
        if (typeof data != 'string' && format != "FORM") {
            data = JSON.stringify(data)
        }
        if(format == "JSON"){
            return httpObj.request({ method: 2, url: url, data: data, headers: headers, timeout: timeout})
        }else{
            return httpObj.request({ method: 2, url: url, formData: data, headers: headers, timeout: timeout})
        }
    },
    /**
     * delete请求
     * @param {string} url
     * @param {array} headers éžå¿…填,会有默认填充 request headers
     * @param {number} timeout éžå¿…填, è¶…æ—¶æ—¶é—´
     * @returns
     */
    delete: function (url, headers, timeout) {
        if (!url) {
            throw new Error("url should not be null or empty")
        }
        return httpObj.request({ method: 3, url: url, headers: headers, timeout: timeout})
    },
    /**
     * ä¸‹è½½æ–‡ä»¶ï¼Œæœ¬è´¨æ˜¯get请求
     * @param {string} url
     * @param {string} path ç›®æ ‡è·¯å¾„(绝对路径)
     * @param {array} headers éžå¿…填,会有默认填充 request headers
     * @param {number} timeout éžå¿…填, è¶…æ—¶æ—¶é—´
     * @returns ä¸‹è½½æ–‡ä»¶æœ‰å¯èƒ½è¿”回null,但是下载是成功的
     */
    download: function (url, path, headers, timeout) {
        if (!url) {
            throw new Error("url should not be null or empty")
        }
        if (!path) {
            throw new Error("path should not be null or empty")
        }
        return httpObj.request({ method: 0, url: url, headers: headers, download: path, timeout: timeout })
    },
    /**
     * ä¸Šä¼ æ–‡ä»¶ï¼Œæœ¬è´¨æ˜¯post请求
     * @param {string} url
     * @param {string} path æºè·¯å¾„(绝对路径)
     * @returns
     */
    upload: function (url, path) {
        if (!url) {
            throw new Error("url should not be null or empty")
        }
        if (!path) {
            throw new Error("path should not be null or empty")
        }
        return httpObj.request({
            method: 1,
            url: url,
            headers: ["application/x-www-form-urlencoded; charset=UTF-8"],
            upload: path
        })
    },
    /**
     * åŽŸç”Ÿæ–¹å¼
     * å¿…填参数:method(0:get请求,1:post请求)、url
     * å¯é€‰å‚数:headers(字符串数组,覆盖默认header)、download(文件下载地址)、data(请求报文,post请求必填)、timeout(超时时间/ms,缺省:5000)、dns(缺省:"114.114.114.114,8.8.8.8")、upload
     * é»˜è®¤header:Accept-Charset:utf-8、Content-Type:application/json;charset=utf-8、Connection:close
     * @param {object} param json
     *  å¦‚:let param={
                method:0,
                url:"http://192.168.10.122:8000/DW200_1_0.zip",
                download:"/testNet/aaa"
            }
     * @returns
     */
    request: function (param) {
        return httpObj.request(param)
    }
}
export default http;
vf107/dxmodules/dxHttpClient.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,228 @@
/**
 * HTTP Client Module
 * This module provides a stateless, function-based API for making HTTP requests.
 * Each request function (get, post, request, etc.) creates an isolated,
 * short-lived native client instance, ensuring thread-safety and preventing state conflicts.
 *
 * Features:
 * - GET/POST/PUT/PATCH/DELETE requests
 * - File upload/download with progress
 * - HTTPS with certificate verification options (disabled by default)
 * - Fully configurable via an options object per request
 *
 * Usage:
 * - Simple requests: `httpclient.get(url, { timeout: 3000 })`
 * - Complex requests: `httpclient.request({ url, method, headers: { 'Content-Type': 'application/json' }, body, ... })`
 *
 * Doc/Demo : https://github.com/DejaOS/DejaOS
 */
import * as native from './libvbar-m-dxhttpclient.so'
const httpclient = {}
/**
 * The core request function. Each call invokes the native stateless request function.
 * @param {object} options - Request options.
 * @param {string} options.url - The request URL. (Required)
 * @param {string} [options.method='GET'] - The request method (GET, POST, etc.).
 * @param {object<string, string>|string[]} [options.headers] - Request headers as a key-value object (recommended) or an array of strings for backward compatibility.
 * @param {string|object} [options.body] - The request body. JS objects will be stringified to JSON.
 * @param {number} [options.timeout=5000] - Timeout in milliseconds.
 * @param {Function} [options.onProgress] - Progress callback function.
 * @param {number} [options.verifyPeer] - Certificate verification (0: disable, 1: enable). Default: 0 (disabled for convenience in IoT).
 * @param {number} [options.verifyHost] - Hostname verification (0: disable, 2: enable). Default: 0 (disabled for convenience in IoT).
 * @param {string} [options.caFile] - Path to CA certificate file.
 * @returns {object} Response result { code, status, message, data }.
 * @throws {Error} Throws error on invalid input.
 */
httpclient.request = function (options) {
    if (!options || typeof options !== 'object') {
        throw new Error("Request options object is required");
    }
    if (!options.url) {
        throw new Error("options.url is required");
    }
    const optsToSet = { ...options };
    // Default method to GET
    if (!optsToSet.method) {
        optsToSet.method = 'GET';
    }
    // Default timeout
    if (optsToSet.timeout === undefined) {
        optsToSet.timeout = 5000;
    }
    // Convert headers object to array of strings for C layer BEFORE further processing
    if (optsToSet.headers && typeof optsToSet.headers === 'object' && !Array.isArray(optsToSet.headers)) {
        optsToSet.headers = Object.entries(optsToSet.headers).map(([key, value]) => `${key}: ${value}`);
    }
    if (!optsToSet.headers) {
        optsToSet.headers = [];
    }
    // Auto-stringify JSON body and set Content-Type header
    if (optsToSet.body && typeof optsToSet.body === 'object') {
        optsToSet.body = JSON.stringify(optsToSet.body);
        // Add header only if not already present
        if (!optsToSet.headers.some(h => h.toLowerCase().startsWith('content-type:'))) {
            optsToSet.headers.push('Content-Type: application/json');
        }
    }
    return native.request(optsToSet);
}
/**
 * Send GET request.
 * @param {string} url - Request URL.
 * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility.
 * @param {object} [options] - Additional request options (headers, etc.).
 * @returns {object} Response result.
 */
httpclient.get = function (url, timeout = 5000, options = {}) {
    return httpclient.request({ ...options, url: url, method: 'GET', timeout: timeout });
}
/**
 * Send POST request with a body.
 * @param {string} url - Request URL.
 * @param {string|object} data - Request body. JS objects will be stringified as JSON.
 * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility.
 * @param {object} [options] - Additional request options (headers, timeout, etc.).
 * @returns {object} Response result.
 */
httpclient.post = function (url, data, timeout = 5000, options = {}) {
    return httpclient.request({ ...options, url: url, method: 'POST', body: data, timeout: timeout });
}
/**
 * Send PUT request with a body.
 * @param {string} url - Request URL.
 * @param {string|object} data - Request body. JS objects will be stringified as JSON.
 * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility.
 * @param {object} [options] - Additional request options.
 * @returns {object} Response result.
 */
httpclient.put = function (url, data, timeout = 5000, options = {}) {
    return httpclient.request({ ...options, url: url, method: 'PUT', body: data, timeout: timeout });
}
/**
 * Send PATCH request with a body.
 * @param {string} url - Request URL.
 * @param {string|object} data - Request body. JS objects will be stringified as JSON.
 * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility.
 * @param {object} [options] - Additional request options.
 * @returns {object} Response result.
 */
httpclient.patch = function (url, data, timeout = 5000, options = {}) {
    return httpclient.request({ ...options, url: url, method: 'PATCH', body: data, timeout: timeout });
}
/**
 * Send DELETE request.
 * @param {string} url - Request URL.
 * @param {number} [timeout=5000] - Timeout in milliseconds. For backward compatibility.
 * @param {object} [options] - Additional request options.
 * @returns {object} Response result.
 */
httpclient.delete = function (url, timeout = 5000, options = {}) {
    return httpclient.request({ ...options, url: url, method: 'DELETE', timeout: timeout });
}
/**
 * Download a file.
 * @param {string} url - Request URL.
 * @param {string} localPath - Local path to save the file.
 * @param {number} [timeout=30000] - Timeout in milliseconds. For backward compatibility.
 * @param {object} [options] - Additional request options.
 * @returns {object} Response result (without data field).
 */
httpclient.download = function (url, localPath, timeout = 30000, options = {}) {
    if (!url) throw new Error("URL is required");
    if (!localPath) throw new Error("Local path is required");
    const optsToSet = {
        ...options,
        timeout: timeout, // Longer default timeout for downloads
        url: url,
        method: 'GET'
    };
    // Convert headers object to array of strings for C layer
    if (optsToSet.headers && typeof optsToSet.headers === 'object' && !Array.isArray(optsToSet.headers)) {
        optsToSet.headers = Object.entries(optsToSet.headers).map(([key, value]) => `${key}: ${value}`);
    }
    return native.download(localPath, optsToSet);
}
/**
 * Upload a file.
 * @param {string} url - Request URL.
 * @param {string} localPath - Local path of the file to upload.
 * @param {number} [timeout=30000] - Timeout in milliseconds. For backward compatibility.
 * @param {object} [options] - Additional request options.
 * @returns {object} Response result.
 */
httpclient.upload = function (url, localPath, timeout = 30000, options = {}) {
    if (!url) throw new Error("URL is required");
    if (!localPath) throw new Error("Local path is required");
    const optsToSet = {
        ...options,
        timeout: timeout, // Longer default timeout for uploads
        url: url,
        method: 'POST'
    };
    // Convert headers object to array of strings for C layer
    if (optsToSet.headers && typeof optsToSet.headers === 'object' && !Array.isArray(optsToSet.headers)) {
        optsToSet.headers = Object.entries(optsToSet.headers).map(([key, value]) => `${key}: ${value}`);
    }
    return native.upload(localPath, optsToSet);
}
// #region Deprecated Functions
// The following functions are deprecated and will be removed in a future version.
// They are kept for backward compatibility to guide users to the new stateless API.
const DEPRECATION_ERROR_MSG = "The stateful API (init, deinit, setOpt, reset) is deprecated. Please use the new stateless, function-based API by passing all options in a single object to methods like request(), get(), post(), etc.";
/**
 * @deprecated Use the new stateless API.
 */
httpclient.init = function () {
    // This function is now a no-op, but we don't throw an error
    // to allow old code to run without crashing, though it's discouraged.
}
/**
 * @deprecated Use the new stateless API.
 */
httpclient.deinit = function () {
    // This function is now a no-op.
}
/**
 * @deprecated Use the new stateless API by passing options to request() or other methods.
 */
httpclient.setOpt = function () {
    throw new Error(DEPRECATION_ERROR_MSG);
}
/**
 * @deprecated Use the new stateless API. Each call is already isolated.
 */
httpclient.reset = function () {
    throw new Error(DEPRECATION_ERROR_MSG);
}
// #endregion
export default httpclient;
vf107/dxmodules/dxHttpServer.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
/**
 * HTTP Server Module
 * Features:
 * - Supports GET/POST requests
 * - Supports file upload via raw body ('application/octet-stream') and multipart form data ('multipart/form-data').
 * - Supports file download
 * - Supports static html file service
 * - Multi-threading not supported, all functions should run in a single thread. For cross-thread communication, use dxEventbus to pass data
 *
 * Usage:
 * - Simple WebServer
 * - Simple Web API Service
 *
 * Doc/Demo : https://github.com/DejaOS/DejaOS
 */
import { httpserverClass } from './libvbar-m-dxhttpserver.so'
let server = null;
const httpserver = {}
httpserver.init = function () {
    if (!server) {
        server = new httpserverClass();
    }
}
/**
 * Route the HTTP request. A maximum of 100 routes can be registered.
 * @param {string} path - The path to route the request. Should start with '/'.
 *                        Supports wildcard matching by ending with '/*'.
 * @param {function} callback - The callback function to handle the request
 * @param {object} callback.req - The request object
 * @param {string} callback.req.method - The HTTP method (GET, POST, etc.)
 * @param {string} callback.req.url - The request URL
 * @param {string} callback.req.query - The query string (e.g. "a=1&b=2")
 * @param {object} callback.req.headers - The request headers
 * @param {string} [callback.req.body] - The request body (only for specific Content-Type)
 * @param {function(string): boolean} callback.req.saveFile - Function to save uploaded file from raw request body. Returns true on success.
 * @param {function(string): object} callback.req.saveMultipartFile - Function to handle 'multipart/form-data' upload. It saves the file part to the specified path and returns other fields as an object.
 * @param {object} callback.res - The response object
 * @param {function} callback.res.send - Send response with body and headers,the header should be a object and the size should be < 512
 * @param {function} callback.res.sendFile - Send file as response
 *
 * @example
 * // Basic usage
 * httpserver.route('/hello', function(req, res) {
 *   res.send('Hello World', {'Content-Type': 'text/plain'});
 * });
 *
 * @example
 * // Wildcard route to handle all requests under /api/
 * httpserver.route('/api/*', function(req, res) {
 *   // req.url will be the full URL, e.g., "/api/users/123"
 *   if (req.url.startsWith('/api/users/')) {
 *     const userId = req.url.substring(11);
 *     res.send(`User ID is ${userId}`);
 *   } else {
 *     res.send('Welcome to the API!');
 *   }
 * });
 *
 * @example
 * // Handle file upload (raw body). Client should POST the file content directly.
 * // Example with curl:
 * // curl -X POST --data-binary "@/path/to/your/file.txt" \
 * //   -H "Content-Type: application/octet-stream" \
 * //   http://127.0.0.1:8080/upload
 * httpserver.route('/upload', function(req, res) {
 *   req.saveFile('/app/code/data/file_saved.txt');
 *   res.send('File saved');
 * });
 *
 * @example
 * // Handle multipart/form-data upload.
 * // This saves the file part to the specified path and returns other form fields.
 * // Example with curl:
 * // curl -X POST -F "file1=@/path/to/your/file.bin" \
 * //   -F "user=JohnDoe" \
 * //   -F "timestamp=1678886400" \
 * //   http://127.0.0.1:8080/form-upload
 * httpserver.route('/form-upload', function(req, res) {
 *   const fields = req.saveMultipartFile('/app/code/data/uploaded_file.bin');
 *   // fields will be: { user: "JohnDoe", timestamp: "1678886400" }
 *   res.send(`File saved, user was ${fields.user}`);
 * });
 *
 * @example
 * // Handle file download
 * httpserver.route('/download', function(req, res) {
 *   res.sendFile('/app/code/data/file.txt');
 * });
 */
httpserver.route = function (path, callback) {
    httpserver.init();
    // Wrap the user's callback in a try...catch block to handle uncaught exceptions
    const wrappedCallback = (req, res) => {
        try {
            callback(req, res);
        } catch (e) {
            try {
                res.send(JSON.stringify({
                    error: "Internal Server Error",
                    message: String(e)+"\n"+e.stack
                }), { "Content-Type": "application/json" });
            } catch (resError) {
            }
        }
    };
    server.route(path, wrappedCallback);
};
/**
 * Starts the HTTP server listening for connections.
 * @param {number} port
 */
httpserver.listen = function (port) {
    httpserver.init();
    server.listen(port);
}
/**
 * Loop the HTTP server
 */
httpserver.loop = function () {
    httpserver.init();
    server.loop();
}
/**
 * Serve static files
 * @param {string} path  The path to serve static files,should be start with '/'
 * @param {string} dir  The directory to serve static files,should be a absolute path start with '/app'
 */
httpserver.serveStatic = function (path, dir) {
    httpserver.init();
    if (!path) {
        path = '/';
    }
    if (!path.startsWith('/')) {
        path = '/' + path;
    }
    if (!path.endsWith('/')) {
        path = path + '/';
    }
    //path should be start with '/' and end with '/',or '/'
    server.serveStatic(path, dir);
}
/**
 * Deinitialize the server
 */
httpserver.deinit = function () {
    if (server) {
        server = null;
    }
}
/**
 * Get the native server object
 * @returns {Object} Native server object
 */
httpserver.getNative = function () {
    httpserver.init();
    return server;
}
export default httpserver;
vf107/dxmodules/dxLogger.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,142 @@
/**
 * dxLogger module.
 * A simple, static logger that replaces `console.log`.
 * It provides multi-level logging and can be viewed in the corresponding VSCode plugin during debugging.
 *
 * Features:
 * - Three log levels: DEBUG, INFO, ERROR. All levels are always enabled.
 * - Supports logging various JavaScript data types, including objects and errors.
 * - Non-blocking log output to avoid performance impact.
 *
 * Usage:
 * - Import the logger: `import log from './dxLogger.js'`
 * - Use the logging methods: `log.info('Application started');`, `log.error('An error occurred:', new Error('test'));`
 *
 * Doc/Demo: https://github.com/DejaOS/DejaOS
 */
const logger = {}
// The maximum length of the log message. In special cases, too long content can cause application crashes.
logger.max_length = 1024
import * as std from "std"
import dxMap from './dxMap.js'
let loggerMap = dxMap.get('__logger__')
/**
 * Enables or disables the debug mode for the logger.
 * When debug mode is enabled, output is flushed immediately after each log.
 * This is essential for seeing logs in real-time when the output is redirected
 * to a pipe (e.g., during VS Code debugging), but can impact performance and stability
 * on physical serial ports.
 *
 * @param {boolean} [isdebug=true] - Whether to enable or disable debug mode.
 * @example
 * // Enable debug mode for real-time logging
 * logger.setDebug(true);
 *
 * // Disable debug mode for production/stability testing
 * logger.setDebug(false);
 */
logger.setDebug = function (isdebug = true) {
    if (isdebug) {
        loggerMap.put('isdebug', true)
    } else {
        loggerMap.put('isdebug', false)
    }
}
/**
 * Logs a message at the DEBUG level.
 * @param {...*} data - The data to log. Can be multiple arguments of any type.
 * @example
 * logger.debug('User logged in:', { userId: 123 });
 */
logger.debug = function (...data) {
    log("DEBUG", data)
}
/**
 * Logs a message at the INFO level.
 * @param {...*} data - The data to log. Can be multiple arguments of any type.
 * @example
 * logger.info('Server started on port', 8080);
 */
logger.info = function (...data) {
    log("INFO", data)
}
/**
 * Logs a message at the ERROR level.
 * @param {...*} data - The data to log. Can be multiple arguments of any type.
 * @example
 * try {
 *   // ... some code that might fail
 * } catch (e) {
 *   logger.error('Operation failed:', e);
 * }
 */
logger.error = function (...data) {
    log("ERROR", data)
}
//-----------------------------------private----------------------
// Formats and prints the log message to standard output.
function log(level, messages) {
    let message = messages.map(msg => getContent(msg)).join(' ');
    //multi \n will cause vscode to not see the subsequent logs
    if (message.includes('\n\n')) {
        message = message.replace(/\n{2,}/g, '\n');
    }
    const content = `[${level} ${getTime()}]: ${message}`.trimEnd();
    try {
        if (content.length > logger.max_length) {
            std.puts(content.slice(0, logger.max_length - 3) + '...\n');
        } else {
            std.puts(content + '\n');
        }
        // The default behavior is to flush, which is suitable for real-time debugging (VSCode).
        // To disable flushing for stability testing on serial ports (MobaXterm),
        // explicitly call logger.setDebug(false).
        if (loggerMap.get('isdebug') !== false) {
            std.out.flush();
        }
    } catch (e) {
        // If even the fallback fails, there's nothing more we can do.
    }
}
// Converts any JavaScript value to a string for logging.
function getContent(message) {
    if (message === undefined) {
        return 'undefined'
    } else if (message === null) {
        return 'null'
    }
    if (typeof message === 'object') {
        if (Object.prototype.toString.call(message) === '[object Error]') {
            let errorString = message.message || 'Error';
            if (message.stack) {
                errorString += '\n' + message.stack;
            }
            return errorString;
        }
        return JSON.stringify(message)
    }
    return String(message);
}
// Generates a timestamp string in 'YYYY-MM-DD HH:mm:ss.ms' format.
function getTime() {
    const now = new Date();
    const year = now.getFullYear();
    const month = String(now.getMonth() + 1).padStart(2, '0');
    const day = String(now.getDate()).padStart(2, '0');
    const hours = String(now.getHours()).padStart(2, '0');
    const minutes = String(now.getMinutes()).padStart(2, '0');
    const seconds = String(now.getSeconds()).padStart(2, '0');
    const milliseconds = String(now.getMilliseconds()).padStart(3, '0');
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
}
if (globalThis && globalThis.console) {
    globalThis.console.log = logger.info
    globalThis.console.debug = logger.debug
    globalThis.console.error = logger.error
}
export default logger
vf107/dxmodules/dxMap.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,192 @@
import { mapClass } from './libvbar-m-dxmap.so'
/**
 * In-memory Key-Value Store Module (dxMap)
 *
 * Features:
 * - Provides a topic-based, in-memory key-value storage.
 * - Thread-safe: Data can be safely accessed and modified from multiple JavaScript threads.
 * - Supports storing various data types (string, number, boolean, object, array) by automatically serializing/deserializing them.
 *
 * Usage:
 * - First, get a map instance for a specific topic using `map.get('myTopic')`.
 * - Then, use the instance's methods (`put`, `get`, `has`, `del`, etc.) to manage data within that topic.
 *
 * @example
 * import map from 'dxMap';
 *
 * // Get an instance for the 'user' topic
 * const userMap = map.get('user');
 *
 * // Put some data
 * userMap.put('name', 'John Doe');
 * userMap.put('age', 30);
 * userMap.put('isActive', true);
 * userMap.put('roles', ['admin', 'editor']);
 *
 * // Get data
 * const name = userMap.get('name'); // "John Doe"
 *
 * // Check if a key exists
 * const hasAge = userMap.has('age'); // true
 *
 * // Delete a key
 * userMap.del('isActive');
 *
 * // Get all keys for the topic
 * const allKeys = userMap.keys(); // ['name', 'age', 'roles']
 *
 * Doc/Demo: https://github.com/DejaOS/DejaOS
 */
const mapObj = new mapClass();
const map = {
    /**
     * Gets a map instance for a given topic name.
     * Each topic is a separate namespace for keys.
     * @param {string} name - The name of the topic. Must not be null or empty.
     * @returns {{keys: (function(): string[]), get: (function(string): *), has: (function(string): boolean), put: (function(string, *): boolean), del: (function(string): boolean), destroy: (function(): boolean)}} An object with methods to interact with the map for the specified topic.
     * @throws {Error} If the name is null or empty.
     */
    get: function (name) {
        if (!name || name.length == 0) {
            throw new Error("dxMap.get:name should not be null or empty")
        }
        //第一次put会自动创建实例
        return {
            /**
             * Retrieves all keys within the current topic.
             * @returns {string[]} An array of all keys for the topic. Returns an empty array if the topic is empty or does not exist.
             */
            keys: function () {
                let all = mapObj.keys(name)
                return all == null ? [] : all
            },
            /**
             * Retrieves the value associated with a key within the current topic.
             * The returned value will be deserialized to its original type (number, boolean, object, array, or string).
             * @param {string} key - The key to retrieve. Must not be null or empty.
             * @returns {*} The value associated with the key, or `undefined` if the key does not exist.
             * @throws {Error} If the key is null or empty.
             */
            get: function (key) {
                if (!key || key.length < 1) {
                    throw new Error("The 'key' parameter cannot be null or empty")
                }
                // put空字符串,get会是null
                let value = mapObj.get(name, key)
                // C layer returns null if not found. JS layer should propagate this.
                if (value === null) {
                    return undefined; // Return undefined for non-existent keys, a common JS pattern.
                }
                return _parseString(value)
            },
            /**
             * Checks if a key exists within the current topic.
             * @param {string} key - The key to check. Must not be null or empty.
             * @returns {boolean} `true` if the key exists, `false` otherwise.
             * @throws {Error} If the key is null or empty.
             */
            has: function (key) {
                if (!key || key.length < 1) {
                    throw new Error("The 'key' parameter cannot be null or empty")
                }
                return mapObj.has(name, key)
            },
            /**
             * Inserts or updates a key-value pair within the current topic.
             * The value will be automatically serialized.
             * If `value` is `null` or `undefined`, the key will be deleted.
             * @param {string} key - The key to set. Must not be null or empty.
             * @param {*} value - The value to associate with the key. Supported types: string, number, boolean, object, array. Functions are not supported.
             * @returns {boolean} Returns `true` on success.
             * @throws {Error} If the key is null or empty, or if the value is a function.
             */
            put: function (key, value) {
                if (!key || key.length < 1) {
                    throw new Error("The 'key' parameter cannot be null or empty")
                }
                // Implement "set null/undefined to delete" logic.
                if (value === null || value === undefined) {
                    return mapObj.delete(name, key);
                }
                return mapObj.insert(name, key, _stringifyValue(value))
            },
            /**
             * Deletes a key-value pair from the current topic.
             * @param {string} key - The key to delete. Must not be null or empty.
             * @returns {boolean} `true` if the key was found and deleted, `false` otherwise.
             * @throws {Error} If the key is null or empty.
             */
            del: function (key) {
                if (!key || key.length < 1) {
                    throw new Error("The 'key' parameter cannot be null or empty")
                }
                return mapObj.delete(name, key)
            },
            /**
             * Destroys the entire topic, deleting all its keys and freeing associated memory.
             * After calling destroy, the instance should not be used anymore.
             * @returns {boolean} Returns `true` on success.
             */
            destroy: function () {
                return mapObj.destroy(name)
            },
        }
    }
}
/**
 * Serializes a value into a string with a type prefix.
 * @private
 * @param {*} value - The value to serialize.
 * @returns {string} The serialized string.
 */
function _stringifyValue(value) {
    const type = typeof value
    if (type === 'string') {
        return value
    }
    if (type === 'number') {
        return '#n#' + value
    }
    if (type === 'boolean') {
        return '#b#' + value
    }
    if (type === 'object') {
        // å¦‚果是对象,进一步判断是否为数组
        if (Array.isArray(value)) {
            return '#a#' + JSON.stringify(value);
        }// else if (value === null) { å‰é¢å·²ç»è§„避了null的情况
        return '#o#' + JSON.stringify(value)
    }
    if (type === 'function') {
        throw new Error("The 'value' parameter should not be function")
    }
}
/**
 * Deserializes a string with a type prefix back to its original value.
 * @private
 * @param {string} str - The string to deserialize.
 * @returns {*} The deserialized value.
 */
function _parseString(str) {
    if (str.startsWith('#n#')) {
        // è§£æžæ•°å­—
        const numberStr = str.substring(3);
        return numberStr.includes('.') ? parseFloat(numberStr) : parseInt(numberStr, 10);
    } else if (str.startsWith('#b#')) {
        // è§£æžå¸ƒå°”值
        return str.substring(3) === 'true';
    } else if (str.startsWith('#a#')) {
        // è§£æžæ•°ç»„
        return JSON.parse(str.substring(3));
    } else if (str.startsWith('#o#')) {
        // è§£æžå¯¹è±¡
        return JSON.parse(str.substring(3));
    } else {
        // é»˜è®¤æƒ…况下,将字符串返回
        return str;
    }
}
export default map;
vf107/dxmodules/dxMqttClient.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,387 @@
/**
 * MQTT Client Module based on Eclipse Paho MQTT C library.
 * This module provides a singleton interface to an MQTT client.
 *
 * Features:
 * - Connect/disconnect to an MQTT broker.
 * - Publish messages and subscribe to topics.
 * - Supports MQTTS (MQTT over SSL/TLS).
 * - Handles connection loss and message delivery callbacks.
 *
 * Usage:
 * - Initialize once with `init()`.
 * - Use the methods to interact with the broker.
 *
 * Doc/Demo: https://github.com/DejaOS/DejaOS
 */
import { mqttclientClass } from './libvbar-m-dxmqttclient.so';
import log from './dxLogger.js'
let client = null;
const dxmqttclient = {};
function checkClientInitialized() {
    if (!client) {
        throw new Error('MQTT client is not initialized. Call init(serverURI, clientId) first.');
    }
}
/**
 * Validates QoS level
 * @param {number} qos QoS level to validate
 * @param {string} context Context for error message
 */
function validateQoS(qos, context = 'QoS') {
    if (typeof qos !== 'number' || !Number.isInteger(qos) || qos < 0 || qos > 2) {
        throw new Error(`${context} must be an integer between 0 and 2, got: ${qos}`);
    }
}
/**
 * Validates MQTT topic format
 * @param {string} topic Topic to validate
 * @param {string} context Context for error message
 */
function validateTopic(topic, context = 'Topic') {
    if (typeof topic !== 'string' || topic.length === 0) {
        throw new Error(`${context} must be a non-empty string`);
    }
    if (topic.length > 65535) {
        throw new Error(`${context} must be less than 65535 characters`);
    }
    // Check for invalid characters (null character)
    if (topic.includes('\0')) {
        throw new Error(`${context} cannot contain null characters`);
    }
}
/**
 * Validates server URI format
 * @param {string} serverURI Server URI to validate
 */
function validateServerURI(serverURI) {
    if (typeof serverURI !== 'string' || serverURI.length === 0) {
        throw new Error('Server URI must be a non-empty string');
    }
    const validProtocols = ['tcp://', 'ssl://', 'mqtt://', 'mqtts://'];
    if (!validProtocols.some(protocol => serverURI.startsWith(protocol))) {
        throw new Error(`Server URI must start with one of: ${validProtocols.join(', ')}`);
    }
}
/**
 * Validates client ID
 * @param {string} clientId Client ID to validate
 */
function validateClientId(clientId) {
    if (typeof clientId !== 'string') {
        throw new Error('Client ID must be a string');
    }
    if (clientId.length > 23) {
        // MQTT 3.1.1 spec limits to 23 chars, but many modern brokers accept longer IDs
        log.info('Client ID is longer than 23 characters, which is not recommended by the MQTT spec.');
    }
}
/**
 * Validates connection options
 * @param {object} options Connection options to validate
 */
function validateConnectOptions(options) {
    if (options && typeof options !== 'object') {
        throw new Error('Connection options must be an object');
    }
    if (options) {
        // Validate keepAlive
        if (options.keepAlive !== undefined) {
            if (typeof options.keepAlive !== 'number' || options.keepAlive < 0 || options.keepAlive > 65535) {
                throw new Error('keepAlive must be a number between 0 and 65535');
            }
        }
        // Validate cleanSession
        if (options.cleanSession !== undefined && typeof options.cleanSession !== 'boolean') {
            throw new Error('cleanSession must be a boolean');
        }
        // Validate username and password
        if (options.username !== undefined && typeof options.username !== 'string') {
            throw new Error('username must be a string');
        }
        if (options.password !== undefined && typeof options.password !== 'string') {
            throw new Error('password must be a string');
        }
        // Validate will options
        if (options.will !== undefined) {
            if (typeof options.will !== 'object') {
                throw new Error('will options must be an object');
            }
            if (!options.will.topic || typeof options.will.topic !== 'string') {
                throw new Error('will.topic must be a non-empty string');
            }
            validateTopic(options.will.topic, 'will.topic');
            if (options.will.payload !== undefined && typeof options.will.payload !== 'string') {
                throw new Error('will.payload must be a string');
            }
            if (options.will.qos !== undefined) {
                validateQoS(options.will.qos, 'will.qos');
            }
            if (options.will.retained !== undefined && typeof options.will.retained !== 'boolean') {
                throw new Error('will.retained must be a boolean');
            }
        }
        // Validate SSL options
        if (options.ssl !== undefined) {
            if (typeof options.ssl !== 'object') {
                throw new Error('SSL options must be an object');
            }
            const sslStringFields = ['caFile', 'certFile', 'keyFile', 'keyPassword'];
            sslStringFields.forEach(field => {
                if (options.ssl[field] !== undefined && typeof options.ssl[field] !== 'string') {
                    throw new Error(`ssl.${field} must be a string`);
                }
            });
            if (options.ssl.enableServerCertAuth !== undefined && typeof options.ssl.enableServerCertAuth !== 'boolean') {
                throw new Error('ssl.enableServerCertAuth must be a boolean');
            }
        }
    }
}
/**
 * Validates publish options
 * @param {object} options Publish options to validate
 */
function validatePublishOptions(options) {
    if (options && typeof options !== 'object') {
        throw new Error('Publish options must be an object');
    }
    if (options) {
        if (options.qos !== undefined) {
            validateQoS(options.qos, 'publish qos');
        }
        if (options.retained !== undefined && typeof options.retained !== 'boolean') {
            throw new Error('retained must be a boolean');
        }
    }
}
/**
 * Validates subscribe options
 * @param {object} options Subscribe options to validate
 */
function validateSubscribeOptions(options) {
    if (options && typeof options !== 'object') {
        throw new Error('Subscribe options must be an object');
    }
    if (options && options.qos !== undefined) {
        validateQoS(options.qos, 'subscribe qos');
    }
}
/**
 * Initializes the MQTT client. This must be called once before any other operations.
 * @param {string} serverURI The URI of the MQTT broker. Examples: "tcp://localhost:1883", "ssl://test.mosquitto.org:8883".
 * @param {string} clientId A unique identifier for this client.
 * @example
 * dxmqttclient.init('tcp://test.mosquitto.org:1883', 'my-device-123');
 */
dxmqttclient.init = function (serverURI, clientId) {
    if (client) {
        log.info('MQTT client already initialized.');
        return;
    }
    validateServerURI(serverURI);
    validateClientId(clientId);
    client = new mqttclientClass(serverURI, clientId);
};
/**
 * Connects the client to the MQTT broker.
 * @param {object} [options] Connection options.
 * @param {string} [options.username] The username for authentication.
 * @param {string} [options.password] The password for authentication.
 * @param {number} [options.keepAlive=60] The keep-alive interval in seconds.
 * @param {boolean} [options.cleanSession=true] Whether to establish a clean session.
 * @param {object} [options.will] The "will" message (last will and testament) to be sent if the client disconnects unexpectedly.
 * @param {string} options.will.topic The topic for the will message.
 * @param {string} options.will.payload The payload of the will message.
 * @param {number} [options.will.qos=0] The Quality of Service level for the will message.
 * @param {boolean} [options.will.retained=false] Whether the will message should be retained.
 * @param {object} [options.ssl] SSL/TLS options, required for 'ssl://' or 'mqtts://' URIs.
 * @param {string} [options.ssl.caFile] Path to the CA certificate file for server verification.
 * @param {string} [options.ssl.certFile] Path to the client's certificate file.
 * @param {string} [options.ssl.keyFile] Path to the client's private key file.
 * @param {string} [options.ssl.keyPassword] Password for the client's private key.
 * @returns {void}
 * @example
 * dxmqttclient.connect({
 *   username: 'user',
 *   password: 'password',
 *   will: {
 *     topic: 'client/status',
 *     payload: 'offline',
 *     qos: 1,
 *     retained: true
 *   }
 * });
 */
dxmqttclient.connect = function (options) {
    checkClientInitialized();
    validateConnectOptions(options);
    client.connect(options || {});
};
/**
 * Disconnects the client from the MQTT broker.
 * @param {number} [timeout=1000] Timeout in milliseconds to wait for disconnection to complete.
 * @returns {void}
 */
dxmqttclient.disconnect = function (timeout) {
    checkClientInitialized();
    if (timeout !== undefined) {
        if (typeof timeout !== 'number' || timeout < 0) {
            throw new Error('Disconnect timeout must be a non-negative number');
        }
    }
    client.disconnect(timeout || 1000);
};
/**
 * Publishes a message to a topic.
 * @param {string} topic The topic to publish the message to.
 * @param {string|ArrayBuffer} payload The message payload.
 * @param {object} [options] Publishing options.
 * @param {number} [options.qos=0] The Quality of Service (QoS) level (0, 1, or 2).
 * @param {boolean} [options.retained=false] Whether the message should be retained by the broker.
 * @returns {number} The delivery token for tracking message delivery (for QoS > 0).
 * @example
 * dxmqttclient.publish('device/status', 'online', { qos: 1 });
 */
dxmqttclient.publish = function (topic, payload, options) {
    checkClientInitialized();
    validateTopic(topic, 'Publish topic');
    if (payload === undefined || payload === null) {
        throw new Error('Payload cannot be undefined or null');
    }
    if (typeof payload !== 'string' && !(payload instanceof ArrayBuffer)) {
        throw new Error('Payload must be a string or ArrayBuffer');
    }
    validatePublishOptions(options);
    return client.publish(topic, payload, options || {});
};
/**
 * Subscribes to a topic.
 * @param {string} topic The topic filter to subscribe to.
 * @param {object} [options] Subscription options.
 * @param {number} [options.qos=0] The maximum QoS level at which to receive messages.
 * @returns {void}
 * @example
 * dxmqttclient.subscribe('commands/light', { qos: 1 });
 */
dxmqttclient.subscribe = function (topic, options) {
    checkClientInitialized();
    validateTopic(topic, 'Subscribe topic');
    validateSubscribeOptions(options);
    const qos = (options && options.qos) || 0;
    client.subscribe(topic, qos);
};
/**
 * Unsubscribes from a topic.
 * @param {string} topic The topic filter to unsubscribe from.
 * @returns {void}
 */
dxmqttclient.unsubscribe = function (topic) {
    checkClientInitialized();
    validateTopic(topic, 'Unsubscribe topic');
    client.unsubscribe(topic);
};
/**
 * Sets the callback handlers for MQTT events.
 * @param {object} callbacks An object containing the callback functions.
 * @param {function()} [callbacks.onConnectSuccess] Fired when the client successfully connects to the broker.
 * @param {function(string, string, number, boolean)} [callbacks.onMessage] Fired when a message is received.
 * @param {function(number)} [callbacks.onDelivery] Fired when a published message has been delivered (for QoS > 0).
 * @param {function(string)} [callbacks.onConnectionLost] Fired when the connection to the broker is lost.
 */
dxmqttclient.setCallbacks = function (callbacks) {
    checkClientInitialized();
    if (!callbacks || typeof callbacks !== 'object') {
        throw new Error('Callbacks must be an object');
    }
    const callbackNames = ['onConnectSuccess', 'onMessage', 'onDelivery', 'onConnectionLost'];
    callbackNames.forEach(name => {
        if (callbacks[name] !== undefined && typeof callbacks[name] !== 'function') {
            throw new Error(`${name} must be a function`);
        }
    });
    client.setCallbacks(callbacks);
};
/**
 * Processes events from the MQTT event queue.
 * This should be called periodically to handle message arrivals,
 * delivery confirmations, and connection loss events.
 * It's recommended to use this with `setInterval`.
 * @example
 * // In your application thread loop:
 * setInterval(() => {
 *   dxmqttclient.loop();
 * },50); // Process events every 50ms
 */
dxmqttclient.loop = function () {
    try {
        checkClientInitialized();
        client.loop();
    } catch (e) {
        log.error('Error in MQTT loop:', e);
    }
};
/**
 * Checks if the client is currently connected to the broker.
 * @returns {boolean} `true` if connected, `false` otherwise.
 */
dxmqttclient.isConnected = function () {
    checkClientInitialized();
    return client.isConnected();
};
/**
 * Deinitializes the client instance, allowing for re-initialization.
 */
dxmqttclient.deinit = function () {
    if (client) {
        // The C++ finalizer handles disconnection and resource cleanup.
        // Setting client to null allows the garbage collector to reclaim it.
        client = null;
    }
};
/**
 * Get the native client object.
 * @returns {Object|null} The native client object, or null if not initialized.
 */
dxmqttclient.getNative = function () {
    return client;
};
export default dxmqttclient;
vf107/dxmodules/dxNetwork.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,311 @@
/**
 * Network Module based on native network_bridge C library.
 * This module provides a singleton interface to network management.
 * Can be used across threads, but `on` and `loop` functions need to be called in the same thread.
 * Features:
 * - Initialize/deinitialize network stack
 * - Connect/disconnect to Ethernet/WiFi/4G
 * - Query network status, local IP, RSSI
 * - Scan WiFi hotspots
 * - Register event callbacks (status change, WiFi scan complete)
 *
 * Usage:
 * - Call `init()` once to initialize.
 * - Use connect/disconnect/getStatus/isConnected/getLocalIP/getRSSI/scanWifi as needed.
 * - Use `on` to register event handlers.
 * - Call loop() periodically to process events (e.g. in setInterval).
 *
 * Doc/Demo: https://github.com/DejaOS/DejaOS
 */
import { netClass } from './libvbar-m-dxnetwork.so'
/**
 * @typedef {object} NetOption
 * @property {string} ip - Static IP address.
 * @property {string} gateway - Static gateway address.
 * @property {string} netmask - Static netmask.
 * @property {string} [dns] - Static DNS server address.
 */
const dxnetwork = {};
// å¸¸é‡ä¸Žæžšä¸¾
dxnetwork.NET_TYPE = { ETH: 1, WIFI: 2, MODEM: 4 }; // 4 = 4G Modem
dxnetwork.IP_MODE = { DHCP: 0, STATIC: 1 };
const net = new netClass();
let _callbacks = {};
/**
 * Initializes the network.
 * @returns {void}
 */
dxnetwork.init = function () {
    net.init();
}
/**
 * Deinitializes the network stack and releases resources.
 * @returns {void}
 */
dxnetwork.deinit = function () {
    net.deinit();
}
/**
 * Connects to a network (Ethernet/WiFi/4G).
 * @param {object} options - Connection options.
 * @param {number} options.netType - Network type:
 *   1 = Ethernet,
 *   2 = WiFi,
 *   4 = 4G Modem.
 * @param {number} [options.ipMode] - IP mode: 0 = DHCP, 1 = Static.
 * @param {string} [options.ssid] - WiFi SSID (for WiFi only).
 * @param {string} [options.psk] - WiFi password (for WiFi only).
 * @param {string} [options.apn] - APN for 4G connection.
 * @param {string} [options.user] - Username for 4G APN.
 * @param {string} [options.password] - Password for 4G APN.
 * @param {string} [options.ip] - Static IP address (for static mode).
 * @param {string} [options.gateway] - Static gateway (for static mode).
 * @param {string} [options.netmask] - Static netmask (for static mode).
 * @param {string} [options.dns] - Static DNS (for static mode).
 * @param {string} [options.macaddr] - Custom MAC address (for Ethernet only).
 * @returns {void}
 * @example
 * dxnetwork.connect({ netType: 2, ssid: 'MyWiFi', psk: 'password' });
 */
dxnetwork.connect = function (options) {
    return net.connect(options);
}
/**
 * Connects to Ethernet with DHCP.
 * @param {string} [macaddr] - Optional custom MAC address.Usually not needed.
 * @returns {void}
 * @example
 * dxnetwork.connectEthWithDHCP();
 * dxnetwork.connectEthWithDHCP('00:11:22:33:44:55');
 */
dxnetwork.connectEthWithDHCP = function (macaddr) {
    const options = {
        netType: 1, // Ethernet
        ipMode: 0   // DHCP
    };
    if (macaddr) {
        options.macaddr = macaddr;
    }
    return net.connect(options);
};
/**
 * Connects to Ethernet with a static IP configuration.
 * @param {NetOption} netOption - The static IP configuration.
 * @param {string} [macaddr] - Optional custom MAC address. Usually not needed.
 * @returns {void}
 * @example
 * dxnetwork.connectEth({
 *   ip: '192.168.1.100',
 *   gateway: '192.168.1.1',
 *   netmask: '255.255.255.0',
 *   dns: '8.8.8.8'
 * });
 */
dxnetwork.connectEth = function (netOption, macaddr) {
    if (!netOption || !netOption.ip || !netOption.gateway || !netOption.netmask) {
        throw new Error('Static IP configuration (ip, gateway, netmask) is required for connectEth.');
    }
    const options = {
        netType: 1, // Ethernet
        ipMode: 1,  // Static
        ip: netOption.ip,
        gateway: netOption.gateway,
        netmask: netOption.netmask,
        dns: netOption.dns
    };
    if (macaddr) {
        options.macaddr = macaddr;
    }
    return net.connect(options);
};
/**
 * Connects to a WiFi network with DHCP.
 * @param {string} ssid - The SSID of the WiFi network.
 * @param {string} psk - The password (Pre-Shared Key) of the WiFi network.
 * @returns {void}
 * @example
 * dxnetwork.connectWifiWithDHCP('MyWiFi', 'MyPassword');
 */
dxnetwork.connectWifiWithDHCP = function (ssid, psk) {
    if (!ssid) {
        throw new Error('SSID is required for connectWifiWithDHCP.');
    }
    const options = {
        netType: 2, // WiFi
        ipMode: 0,  // DHCP
        ssid: ssid,
        psk: psk
    };
    return net.connect(options);
};
/**
 * Connects to a WiFi network with a static IP configuration.
 * @param {string} ssid - The SSID of the WiFi network.
 * @param {string} psk - The password (Pre-Shared Key) of the WiFi network.
 * @param {NetOption} netOption - The static IP configuration.
 * @returns {void}
 * @example
 * dxnetwork.connectWifi('MyWiFi', 'MyPassword', {
 *   ip: '192.168.1.101',
 *   gateway: '192.168.1.1',
 *   netmask: '255.255.255.0'
 * });
 */
dxnetwork.connectWifi = function (ssid, psk, netOption) {
    if (!netOption || !netOption.ip || !netOption.gateway || !netOption.netmask) {
        throw new Error('Static IP configuration (ip, gateway, netmask) is required for connectWifi with static IP.');
    }
    if (!ssid) {
        throw new Error('SSID is required for connectWifi with static IP.');
    }
    const options = {
        netType: 2, // WiFi
        ipMode: 1,  // Static
        ssid: ssid,
        psk: psk,
        ip: netOption.ip,
        gateway: netOption.gateway,
        netmask: netOption.netmask,
        dns: netOption.dns
    };
    return net.connect(options);
};
/**
 * Connects to a 4G mobile network with default settings.
 * @returns {void}
 * @example
 * dxnetwork.connect4G();
 */
dxnetwork.connect4G = function () {
    const options = {
        netType: 4, // 4G Modem
    };
    return net.connect(options);
};
/**
 * Disconnects from the current network.
 * @returns {void}
 */
dxnetwork.disconnect = function () {
    net.disconnect();
}
/**
 * Gets the current network status.
 * @returns {number} Network status code.
 */
dxnetwork.getStatus = function () {
    return net.getStatus();
}
/**
 * Gets the current network type
 * @returns {number} Network type code.
 */
dxnetwork.getType = function () {
    return net.getType();
}
/**
 * Checks if the network is currently connected.
 * @returns {boolean} True if connected, false otherwise.
 */
dxnetwork.isConnected = function () {
    return net.isConnected();
}
/**
 * Gets the local IP address.
 * @returns {string} ip address.
 * @returns {string} gateway address.
 * @returns {string} netmask address.
 * @returns {string} dns address.
 */
dxnetwork.getNetParam = function () {
    return net.getNetParam();
}
/**
 * Gets the current signal strength (RSSI).
 * @returns {number} RSSI value.
 */
dxnetwork.getRSSI = function () {
    return net.getRSSI();
}
/**
 * Gets the current network MAC address.
 * @returns {string} MAC address.
 */
dxnetwork.getNetMac = function () {
    return net.getNetMac();
}
/**
 * Scans for available WiFi hotspots.
 * @param {number} [timeout=2500] - Timeout in milliseconds.
 * @param {number} [interval=100] - Scan interval in milliseconds.
 * @returns {Array} List of WiFi hotspots.
 */
dxnetwork.scanWifi = function (timeout, interval) {
    return net.scanWifi(timeout, interval);
};
/**
 * Sets callback handlers for network events.
 * Current only support status change event.
 * @param {object} callbacks - Callback functions.
 * @param {function(netType:number, status:number)} [callbacks.onStatusChange] - Called when network status changes.
 * @example
 * dxnetwork.setCallbacks({
 *   onStatusChange: function(netType, status) {
 *   }
 * });
 * @returns {void}
 */
dxnetwork.setCallbacks = function (callbacks) {
    _callbacks = callbacks;
}
/**
 * Processes events from the network event queue. Should be called periodically (e.g. in setInterval).
 * Handles status change event.
 * @example
 * setInterval(() => {
 *   try{
 *     dxnetwork.loop();
 *   } catch (e) {
 *     log.error('Error in network loop:', e);
 *   }
 * }, 50); // Process events every 50ms
 */
dxnetwork.loop = function () {
    let ev = net.getEvent()
    if (ev && ev.type === 0 && _callbacks.onStatusChange) {
        _callbacks.onStatusChange(ev.netType, ev.netStatus);
    }
}
/**
 * Gets the native network client object.
 * @returns {Object|null} The native client object, or null if not initialized.
 */
dxnetwork.getNative = function () {
    return net;
}
export default dxnetwork;
vf107/dxmodules/dxNfc.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,409 @@
//build:20240715
//通过这个组件来读取卡,包括M1卡,psam卡之类的
//依赖组件: dxDriver,dxMap,dxLogger,dxDriver,dxCommon,dxEventBus
import { nfcClass } from './libvbar-p-dxnfc.so'
import dxCommon from './dxCommon.js'
import bus from './dxEventBus.js'
import dxMap from './dxMap.js'
const nfcObj = new nfcClass();
const map = dxMap.get("default")
const nfc = {}
/**
 * NFC åˆå§‹åŒ–
 * @param {number} useEid éžå¿…填,是否使用云证 0不使用 1使用
 */
nfc.init = function (useEid = 0) {
    let pointer = nfcObj.init(useEid)
    if (pointer === undefined || pointer === null) {
        throw new Error("nfc.init: init failed")
    }
    dxCommon.handleId("nfc", 'nfcid', pointer)
}
/**
 * NFC æ™®é€šå¡æ³¨å†Œå›žè°ƒ
 */
nfc.cbRegister = function (callback) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    return nfcObj.cbRegister(pointer, "nfc_cb", 1, callback)
}
/**
 * NFC PSAM卡注册回调
 */
nfc.psamCbRegister = function (callback) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    return nfcObj.nfcPsamCheckVgcardCallback(pointer, callback)
}
/**
 * NFC å–消初始化
 */
nfc.deinit = function () {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    let ret = nfcObj.cbUnregister(pointer, "nfc_cb")
    if (ret === false) {
        throw new Error("nfc.cbUnregister: cbUnregister failed")
    }
    return nfcObj.deinit(pointer)
}
/**
 * NFC å¡ä¿¡æ¯åˆ›å»º
 * @param {number} cardType å¡èŠ¯ç‰‡ç±»åž‹(原厂定义)
 * @param {ArrayBuffer} cardId å¡å·
 * @param {number} type å¡ç±»åž‹(我们自己定义的)
 * @returns cardInfo(pointer)
 */
nfc.cardInfoCreate = function (cardType, cardId, type) {
    if (!cardType) {
        throw new Error("cardInfoCreate:cardType should not be null or empty")
    }
    if (!cardId) {
        throw new Error("cardInfoCreate:cardId should not be null or empty")
    }
    if (!type) {
        throw new Error("cardInfoCreate:type should not be null or empty")
    }
    return nfcObj.cardInfoCreate(cardType, cardId, type);
}
/**
 * NFC å¡ä¿¡æ¯é”€æ¯
 * @param {pointer} cardInfo å¡ä¿¡æ¯
 * @returns
 */
nfc.cardInfoDestory = function (cardInfo) {
    if (!cardInfo) {
        throw new Error("cardInfoDestory:cardInfo should not be null or empty")
    }
    return nfcObj.cardInfoDestory(cardInfo);
}
/**
 * NFC å¡ä¿¡æ¯å¤åˆ¶
 * @param {pointer} cardInfo å¡ä¿¡æ¯
 * @returns cardInfo(pointer)
 */
nfc.cardInfoCopy = function (cardInfo) {
    if (cardInfo == null) {
        throw new Error("cardInfoCopy:cardInfo should not be null or empty")
    }
    return nfcObj.cardInfoCopy(cardInfo);
}
/**
 * NFC åˆ¤æ–­æ˜¯å¦æœ‰å¡
 * @returns bool
 */
nfc.isCardIn = function () {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    return nfcObj.isCardIn(pointer);
}
/**
 * NFC è¯»M1卡扇区
 * @param {number} taskFlg ä»»åŠ¡æ ‡å¿—ï¼š
 *                    0x00->AUTO å‘ŠçŸ¥æ‰«ç å™¨è¯¥æŒ‡ä»¤å¯å•独执行,无指令间的依赖关系。
 *                    0x01->START å‘ŠçŸ¥æ‰«ç å™¨å¼€å§‹å¯¹å¡æ“ä½œæˆ–对卡操作尚未结束,且指令间可能存在依赖关系。
 *                    0x02->FINISH å‘ŠçŸ¥æ‰«ç å™¨æœ¬æ¡æŒ‡ä»¤æ˜¯æ“ä½œå¡çš„æœ€åŽä¸€æ¡æŒ‡ä»¤ï¼Œå°†å¡ç‰‡æ“ä½œçŽ¯å¢ƒæ¢å¤åˆ°é»˜æ€ã€‚
 * @param {number} secNum æ‰‡åŒºå·
 * @param {number} logicBlkNum å—号(在扇区内的逻辑号0~3)
 * @param {number} blkNums å—æ•°
 * @param {array} key å¯†é’¥, é•¿åº¦6bytes
 * @param {number} keyType å¯†é’¥ç±»åž‹: A:0x60 B:0x61
 * @returns Array è¯»å–结果 undefined:失败
 */
nfc.m1cardReadSector = function (taskFlg, secNum, logicBlkNum, blkNums, key, keyType) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    _validate('m1cardReadSector', taskFlg, secNum, logicBlkNum, blkNums, key, keyType, ' ')
    return nfcObj.m1cardReadSector(pointer, taskFlg, secNum, logicBlkNum, blkNums, key, keyType);
}
/**
 * NFC è¯»M1卡扇区
 * @param {number} taskFlg ä»»åŠ¡æ ‡å¿—ï¼š
 *                    0x00->AUTO å‘ŠçŸ¥æ‰«ç å™¨è¯¥æŒ‡ä»¤å¯å•独执行,无指令间的依赖关系。
 *                    0x01->START å‘ŠçŸ¥æ‰«ç å™¨å¼€å§‹å¯¹å¡æ“ä½œæˆ–对卡操作尚未结束,且指令间可能存在依赖关系。
 *                    0x02->FINISH å‘ŠçŸ¥æ‰«ç å™¨æœ¬æ¡æŒ‡ä»¤æ˜¯æ“ä½œå¡çš„æœ€åŽä¸€æ¡æŒ‡ä»¤ï¼Œå°†å¡ç‰‡æ“ä½œçŽ¯å¢ƒæ¢å¤åˆ°é»˜æ€ã€‚
 * @param {number} secNum æ‰‡åŒºå·
 * @param {number} logicBlkNum å—号(在扇区内的逻辑号0~3)
 * @param {number} blkNums å—æ•°
 * @param {array} key å¯†é’¥, é•¿åº¦6bytes
 * @param {number} keyType å¯†é’¥ç±»åž‹: A:0x60 B:0x61
 * @param {array} data å†™å…¥æ•°æ®
 * @returns int å†™å…¥é•¿åº¦ -1:错误
 */
nfc.m1cardWriteSector = function (taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    _validate('m1cardWriteSector', taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data)
    return nfcObj.m1cardWriteSector(pointer, taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data);
}
/**
 *
 * @param {number} taskFlg ä»»åŠ¡æ ‡å¿—ï¼š
 *                    0x00->AUTO å‘ŠçŸ¥æ‰«ç å™¨è¯¥æŒ‡ä»¤å¯å•独执行,无指令间的依赖关系。
 *                    0x01->START å‘ŠçŸ¥æ‰«ç å™¨å¼€å§‹å¯¹å¡æ“ä½œæˆ–对卡操作尚未结束,且指令间可能存在依赖关系。
 *                    0x02->FINISH å‘ŠçŸ¥æ‰«ç å™¨æœ¬æ¡æŒ‡ä»¤æ˜¯æ“ä½œå¡çš„æœ€åŽä¸€æ¡æŒ‡ä»¤ï¼Œå°†å¡ç‰‡æ“ä½œçŽ¯å¢ƒæ¢å¤åˆ°é»˜æ€ã€‚
 * @param {number} blkNums å—号
 * @param {array} key å¯†é’¥, é•¿åº¦6bytes
 * @param {number} keyType å¯†é’¥ç±»åž‹: A:0x60 B:0x61
 * @returns Array è¯»å–结果 undefined:失败
 */
nfc.m1cardReadBlk = function (taskFlg, blkNum, key, keyType) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    _validate('m1cardReadBlk', taskFlg, 1, 0, blkNum, key, keyType, ' ')
    return nfcObj.m1cardReadBlk(pointer, taskFlg, blkNum, key, keyType);
}
/**
 *
 * @param {number} taskFlg ä»»åŠ¡æ ‡å¿—ï¼š
 *                    0x00->AUTO å‘ŠçŸ¥æ‰«ç å™¨è¯¥æŒ‡ä»¤å¯å•独执行,无指令间的依赖关系。
 *                    0x01->START å‘ŠçŸ¥æ‰«ç å™¨å¼€å§‹å¯¹å¡æ“ä½œæˆ–对卡操作尚未结束,且指令间可能存在依赖关系。
 *                    0x02->FINISH å‘ŠçŸ¥æ‰«ç å™¨æœ¬æ¡æŒ‡ä»¤æ˜¯æ“ä½œå¡çš„æœ€åŽä¸€æ¡æŒ‡ä»¤ï¼Œå°†å¡ç‰‡æ“ä½œçŽ¯å¢ƒæ¢å¤åˆ°é»˜æ€ã€‚
 * @param {number} blkNums å—号
 * @param {array} key å¯†é’¥, é•¿åº¦6bytes
 * @param {number} keyType å¯†é’¥ç±»åž‹: A:0x60 B:0x61
 * @param {array} data å†™å…¥æ•°æ®
 * @returns int å†™å…¥é•¿åº¦ -1:错误
 */
nfc.m1cardWriteBlk = function (taskFlg, blkNum, key, keyType, data) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    _validate('m1cardWriteBlk', taskFlg, 1, 0, blkNum, key, keyType, data)
    return nfcObj.m1cardWriteBlk(pointer, taskFlg, blkNum, key, keyType, data);
}
/**
 * ATS检测
 */
nfc.nfc_iso14443_type_a_get_ats = function () {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    return nfcObj.nfc_iso14443_type_a_get_ats(pointer)
}
/**
 *
 * @param {number} taskFlg ä»»åŠ¡æ ‡å¿—ï¼š
 *                    0x00->AUTO å‘ŠçŸ¥æ‰«ç å™¨è¯¥æŒ‡ä»¤å¯å•独执行,无指令间的依赖关系。
 *                    0x01->START å‘ŠçŸ¥æ‰«ç å™¨å¼€å§‹å¯¹å¡æ“ä½œæˆ–对卡操作尚未结束,且指令间可能存在依赖关系。
 *                    0x02->FINISH å‘ŠçŸ¥æ‰«ç å™¨æœ¬æ¡æŒ‡ä»¤æ˜¯æ“ä½œå¡çš„æœ€åŽä¸€æ¡æŒ‡ä»¤ï¼Œå°†å¡ç‰‡æ“ä½œçŽ¯å¢ƒæ¢å¤åˆ°é»˜æ€ã€‚
 * @param {ArrayBuffer} buffer     è¦å‘送的数据
 * @param {number} bufferLen     è¦å‘送的数据长度
 * @returns buffer
 */
nfc.iso14443Apdu = function (taskFlg, buffer, bufferLen) {
    let pointer = dxCommon.handleId("nfc", "nfcid")
    return nfcObj.iso14443Apdu(pointer, taskFlg, buffer, bufferLen);
}
/**
 * PSAM卡断电
 */
nfc.nfcPsamPowerDown = function () {
    let pointer = dxCommon.handleId("nfc", "nfcid")
    return nfcObj.nfcPsamPowerDown(pointer);
}
/**
 * NFC æ”¹å˜çŠ¶æ€
 */
nfc.nfcPsamChangeBaud = function () {
    let pointer = dxCommon.handleId("nfc", "nfcid")
    return nfcObj.nfcPsamChangeBaud(pointer);
}
/**
 * PSAM卡重置
 */
nfc.nfcPsamCardReset = function (force) {
    let pointer = dxCommon.handleId("nfc", "nfcid")
    return nfcObj.nfcPsamCardReset(pointer, force);
}
/**
 * å‘送PSAM APDU指令
 */
nfc.nfcPsamCardApdu = function (buffer) {
    let pointer = dxCommon.handleId("nfc", "nfcid")
    return nfcObj.nfcPsamCardApdu(pointer, buffer);
}
/**
 * EID æ›´æ–°äº‘证配置
 * @param {object} eidConfig äº‘证配置
 *         @param {string} eidConfig.appid å¹³å°åˆ†é…ç»™åº”用的appid
 *         @param {number} eidConfig.read_len; // å•次读卡长度,默认0x80
 *         @param {number} eidConfig.declevel; // æ˜¯å¦è¯»å–照片,1为不读取,2为读取
 *         @param {number} eidConfig.loglevel; //日志级别,支持0,1,2
 *         @param {number} eidConfig.model; // æ˜¯å¦ç›´æŽ¥æŸ¥å‡ºä¿¡æ¯ 0是  1否 ï¼ˆå³0是原路返回,返回身份信息,1是转发,返回reqid)
 *         @param {number} eidConfig.type; // å¡ç‰‡ç±»åž‹ï¼š0 èº«ä»½è¯ 1电子证照
 *         @param {number} eidConfig.pic_type; // ç…§ç‰‡è§£ç æ•°æ®ç±»åž‹ 0 wlt 1 jpg
 *         @param {number} eidConfig.envCode; // çŽ¯å¢ƒè¯†åˆ«ç 
 *         @param {string} eidConfig.sn[128]; // è®¾å¤‡åºåˆ—号
 *         @param {string} eidConfig.device_model[128]; // è®¾å¤‡åž‹å·
 *         @param {number} eidConfig.info_type; // ä¿¡æ¯è¿”回类型,0 èº«ä»½ä¿¡æ¯ç»“构体 ï¼Œ1原始数据 char
 */
nfc.eidUpdateConfig = function (eidConfig) {
    if (eidConfig == null) {
        throw new Error("eidUpdateConfig:eidConfig should not be null or empty")
    }
    return nfcObj.eidUpdateConfig(eidConfig);
}
/**
 * è¯»NTAG版本号
 *     @param {number}         hdl                   nfc句柄
 *     @returns {ArrayBuffer} buffer
 */
nfc.nfcNtagReadVersion = function () {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    return nfcObj.nfcNtagReadVersion(pointer);
}
/**
 * è¯»NTAG页内容 å›ºå®šè¯»å–4页共16字节
 *     @param {number}         hdl                   nfc句柄
 *     @param {number}         pageNum               èµ·å§‹é¡µåœ°å€ï¼š
 *                                                     æ¯æ¬¡è¯»å–四个页
 *                                                     å¦‚果地址(Addr)是04h,则返回页04h、05h、06h、07h内容
 *     @returns {ArrayBuffer} buffer
 */
nfc.nfcNtagReadPage = function (pageNum) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    if (pageNum == null) {
        throw new Error("nfcNtagReadPage:pageNum should not be null or empty")
    }
    return nfcObj.nfcNtagReadPage(pointer, pageNum);
}
/**
 * è¯»NTAG多页内容 è¯»å–数据的buffer,最小为 é¡µæ•°*4;要读取的数据长度 é¡µæ•°*4
 *     @param {number}         hdl                   nfc句柄
*     @param {number}         start_addr          èµ·å§‹é¡µåœ°å€
 *     @param {number}         end_addr            ç»“束页地址
 *     @returns {ArrayBuffer} buffer
 */
nfc.nfcNtagFastReadPage = function (start_page, end_page) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    if (start_page == null) {
        throw new Error("nfcNtagFastReadPage:start_page should not be null or empty")
    }
    if (end_page == null) {
        throw new Error("nfcNtagFastReadPage:end_page should not be null or empty")
    }
    return nfcObj.nfcNtagFastReadPage(pointer, start_page, end_page);
}
/**
 * å†™NTAG页内容
 *     @param {number}         hdl                   nfc句柄
 *     @param {number}         pageNum               å†™å…¥çš„页号 ï¼šæœ‰æ•ˆAddr参数
 *                                              å¯¹äºŽNTAG213,页地址02h至2Ch
 *                                              å¯¹äºŽNTAG215,页地址02h至86h
 *                                              å¯¹äºŽNTAG216,页地址02h至E6h
 *     @param {ArrayBuffer}     pageData             å†™å…¥é¡µçš„内容:四字节
 *     @returns {boolean} ture/false
 */
nfc.nfcNtagWritePage = function (pageNum, pageData) {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    if (pageNum == null) {
        throw new Error("nfcNtagWritePage:pageNum should not be null or empty")
    }
    if (!pageData) {
        throw new Error("nfcNtagWritePage:pageData should not be null or empty")
    }
    return nfcObj.nfcNtagWritePage(pointer, pageNum, pageData);
}
/**
 * åˆ¤æ–­nfc消息队列是否为空
 * @returns bool
 */
nfc.msgIsEmpty = function () {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    return nfcObj.msgIsEmpty(pointer)
}
/**
 * ä»Žnfc消息队列中读取数据
 * @returns json消息对象
 */
nfc.msgReceive = function () {
    let pointer = dxCommon.handleId("nfc", 'nfcid')
    let msg = nfcObj.msgReceive(pointer)
    return JSON.parse(msg);
}
function _validate(fun, taskFlg, secNum, logicBlkNum, blkNums, key, keyType, data) {
    if (![0x00, 0x01, 0x02].includes(taskFlg)) {
        throw new Error(fun, ":taskFlg error")
    }
    if (!(secNum >= 0)) {
        throw new Error(fun, ":secNum error")
    }
    if (logicBlkNum == null || logicBlkNum == undefined || logicBlkNum < 0 || logicBlkNum > 3) {
        throw new Error(fun, ":logicBlkNum error")
    }
    if (blkNums == null || blkNums == undefined || blkNums < 0 || blkNums > 59) {
        throw new Error(fun, ":blkNums error")
    }
    if (key == null || key === undefined || key.length < 0) {
        throw new Error(fun, ":key error")
    }
    if (![0x60, 0x61].includes(keyType)) {
        throw new Error(fun, ":keyType error")
    }
    if (data === null || data === undefined) {
        throw new Error(fun, ":data error")
    }
}
nfc.RECEIVE_MSG = '__nfc__MsgReceive'
/**
 * ç®€åŒ–NFC组件的使用,无需轮询去获取网络状态,网络的状态会通过eventcenter发送出去
 * run åªä¼šæ‰§è¡Œä¸€æ¬¡ï¼Œæ‰§è¡Œä¹‹åŽç½‘络基本配置不能修改
 * å¦‚果需要实时获取刷卡数据,可以订阅 eventCenter的事件,事件的topic是nfc.CARD,事件的内容是类似
 * {id:'卡id',card_type:卡芯片类型,id_len:卡号长度,type:卡类型,timestamp:'刷卡时间戳',monotonic_timestamp:'相对开机的时间'}
 * @param {*} options
 *         @param {boolean} options.m1 éžå¿…填,普通卡回调开关
 *         @param {boolean} options.psam éžå¿…填,psam卡回调开关
 */
nfc.run = function (options) {
    if (options === undefined || options.length === 0) {
        throw new Error("dxnfc.run:'options' parameter should not be null or empty")
    }
    let init = map.get("__nfc__run_init")
    if (!init) {//确保只初始化一次
        map.put("__nfc__run_init", options)
        bus.newWorker("__nfc", '/app/code/dxmodules/nfcWorker.js')
    }
}
/**
 * å¦‚æžœnfc单独一个线程,可以直接使用run函数,会自动启动一个线程,
 * å¦‚果想加入到其他已有的线程,可以使用以下封装的函数
 */
nfc.worker = {
    //在while循环前
    beforeLoop: function (options) {
        nfc.init(options.useEid)
        // PSAM和普通卡回调
        if (options.m1) {
            nfc.cbRegister()
        }
        if (options.psam) {
            nfc.psamCbRegister()
        }
    },
    //在while循环里
    loop: function () {
        if (!nfc.msgIsEmpty()) {
            let res = nfc.msgReceive();
            bus.fire(nfc.RECEIVE_MSG, res)
        }
    }
}
export default nfc;
vf107/dxmodules/dxNfcCard.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,364 @@
/**
 * @file dxNfcCard.js
 * @module dxNfcCard
 * @description
 * NFC module based on the native nfc_bridge C library.
 * This module provides a singleton interface for interacting with NFC cards.
 * It supports detecting, reading, and writing various basic NFC card types,
 * including M1, CPU, and NTAG cards.
 *
 * Additionally, the module integrates eID (Chinese 2nd Generation ID card) reading functionality.
 * **Note**: The eID feature requires a network connection and currently only supports Chinese 2nd Generation ID cards.
 *
 * @usage
 * // 1. Import the module
 * import { dxNfcCard } from 'dxNfcCard.js';
 *
 * // 2. Initialize
 * dxNfcCard.init();
 *
 * // 3. (Optional) Initialize eID functionality
 * dxNfcCard.eidInit({
 *   config: {
 *     device_model: "your_device_model"
 *   }
 * });
 *
 * // 4. Set callbacks
 * dxNfcCard.setCallbacks({
 *   onCardDetected: (cardInfo) => { console.log('NFC Card:', cardInfo); },
 *   onEidDetected: (eidInfo) => { console.log('eID Card:', eidInfo); }
 * });
 *
 * // 5. Poll for events in a timer
 * setInterval(dxNfcCard.loop, 100);
 *
 * // 6. Call specific operations, e.g., read M1 block
 * // const data = dxNfcCard.m1ReadBlock(...);
 */
import { nfc } from './libvbar-m-dxnfccard.so';
const dxNfcCard = {};
let _callbacks = {};
/**
 * Initializes the NFC module. Must be called before any other operations.
 * @returns {void}
 */
dxNfcCard.init = function () {
    nfc.init();
};
/**
 * Deinitializes the NFC module and releases all resources.
 * @returns {void}
 */
dxNfcCard.deinit = function () {
    nfc.deinit();
};
/**
 * @typedef {object} NfcConfig
 * @property {boolean} afi_enable - Enable Application Family Identifier.
 * @property {number} afi - Application Family Identifier value.
 * @property {number} card_protocol - Bitmask for card protocols to support.
 * @property {boolean} identity_card_enable - Enable reading of identity cards.
 * @property {number} read_timeout_ms - Read timeout in milliseconds.
 * @property {number} braud_tx - TX baud rate.
 * @property {number} braud_rx - RX baud rate.
 * @property {boolean} i14443p4_switch - Enable ISO14443-4 protocol.
 * @property {number} felica_braud - FeliCa baud rate.
 * @property {number} nfc_sak28 - SAK value handling for specific cards.
 * @property {number} felica_syscode - FeliCa system code.
 * @property {number} felica_request_code - FeliCa request code.
 */
/**
 * Retrieves the current NFC configuration.
 * @returns {NfcConfig} The current configuration object.
 */
dxNfcCard.getConfig = function () {
    return nfc.getConfig();
};
/**
 * Updates the NFC configuration.
 * Not neccecary to modify, use default values unless special requirements.
 * @param {Partial<NfcConfig>} config - A configuration object with properties to update.
 * @returns {void}
 */
dxNfcCard.updateConfig = function (config) {
    return nfc.updateConfig(config);
};
/**
 * Checks if a card is currently present in the NFC field.
 * @returns {boolean} True if a card is present, false otherwise.
 */
dxNfcCard.isCardIn = function () {
    return nfc.isCardIn();
};
/**
 * Reads a 16-byte block from an M1 card.
 * @param {number} blockNumber - The block number to read (0-63 for 1K, 0-255 for 4K).
 * @param {ArrayBuffer} key - A 6-byte ArrayBuffer containing the key (A or B).
 * @param {number} keyType - The key type: 0x60 for Key A, 0x61 for Key B.
 * @param {number} [taskFlag=0] - Optional task flag for card selection (0: AUTO, 1: ACTIVE, 2: IDLE).
 * @returns {ArrayBuffer} A 16-byte ArrayBuffer containing the block data.
 */
dxNfcCard.m1ReadBlock = function (blockNumber, key, keyType, taskFlag = 0x00) {
    return nfc.m1ReadBlock(blockNumber, key, keyType, taskFlag);
};
/**
 * Writes a 16-byte block to an M1 card.
 * @param {number} blockNumber - The block number to write.
 * @param {ArrayBuffer} data - A 16-byte ArrayBuffer containing the data to write.
 * @param {ArrayBuffer} key - A 6-byte ArrayBuffer containing the key (A or B).
 * @param {number} keyType - The key type: 0x60 for Key A, 0x61 for Key B.
 * @param {number} [taskFlag=0] - Optional task flag for card selection.
 * @returns {number} 0 on success.
 */
dxNfcCard.m1WriteBlock = function (blockNumber, data, key, keyType, taskFlag = 0x00) {
    return nfc.m1WriteBlock(blockNumber, data, key, keyType, taskFlag);
};
/**
 * Reads one or more blocks from a sector of an M1 card.
 * @param {number} sectorNum - The sector number to read from (0-39).
 * @param {number} logicBlkNum - The starting block number within the sector (0-3 for small sectors, 0-15 for large sectors).
 * @param {number} blkCount - The number of blocks to read.
 * @param {ArrayBuffer} key - A 6-byte ArrayBuffer for authentication.
 * @param {number} keyType - The key type (0x60 for Key A, 0x61 for Key B).
 * @param {number} [taskFlag=0] - Optional task flag for card selection.
 * @returns {ArrayBuffer} An ArrayBuffer containing the data read from the sector.
 */
dxNfcCard.m1ReadSector = function (sectorNum, logicBlkNum, blkCount, key, keyType, taskFlag = 0x00) {
    return nfc.m1ReadSector(sectorNum, logicBlkNum, blkCount, key, keyType, taskFlag);
};
/**
 * Writes one or more blocks to a sector of an M1 card.
 * @param {number} sectorNum - The sector number to write to (0-39).
 * @param {number} logicBlkNum - The starting block number within the sector.
 * @param {ArrayBuffer} data - Data to write. The length must be a multiple of 16. The number of blocks to write is determined by data.length / 16.
 * @param {ArrayBuffer} key - A 6-byte ArrayBuffer for authentication.
 * @param {number} keyType - The key type (0x60 for Key A, 0x61 for Key B).
 * @param {number} [taskFlag=0] - Optional task flag for card selection.
 * @returns {number} The number of bytes written on success.
 */
dxNfcCard.m1WriteSector = function (sectorNum, logicBlkNum, data, key, keyType, taskFlag = 0x00) {
    return nfc.m1WriteSector(sectorNum, logicBlkNum, data, key, keyType, taskFlag);
};
/**
 * Reads the version information from an NTAG card.
 * @returns {ArrayBuffer} An ArrayBuffer containing the version data.
 */
dxNfcCard.ntagReadVersion = function () {
    return nfc.ntagReadVersion();
};
/**
 * Reads 4 pages (16 bytes) from an NTAG card, starting at the specified page number.
 * @param {number} pageNum - The starting page number to read from.
 * @returns {ArrayBuffer} A 16-byte ArrayBuffer containing the data from 4 pages.
 */
dxNfcCard.ntagReadPage = function (pageNum) {
    return nfc.ntagReadPage(pageNum);
};
/**
 * Writes one page (4 bytes) to an NTAG card.
 * @param {number} pageNum - The page number to write to.
 * @param {ArrayBuffer} data - A 4-byte ArrayBuffer containing the data to write.
 * @returns {void}
 */
dxNfcCard.ntagWritePage = function (pageNum, data) {
    return nfc.ntagWritePage(pageNum, data);
};
/**
 * Reads a range of pages from an NTAG card quickly.
 * @param {number} startPage - The starting page number.
 * @param {number} endPage - The ending page number.
 * @returns {ArrayBuffer} An ArrayBuffer containing the data from the specified page range.
 */
dxNfcCard.ntagFastReadPage = function (startPage, endPage) {
    return nfc.ntagFastReadPage(startPage, endPage);
};
/**
 * Sends an ISO14443-A APDU command to the card.
 * @param {ArrayBuffer} command - The APDU command to send.
 * @param {number} [taskFlag=0] - Optional task flag for card selection.
 * @returns {ArrayBuffer} An ArrayBuffer containing the APDU response from the card.
 */
dxNfcCard.iso14443Apdu = function (command, taskFlag = 0x00) {
    return nfc.iso14443Apdu(command, taskFlag);
};
/**
 * Initializes the eID (electronic ID) reading functionality.
 * After calling this, swiping a supported ID card will trigger the `onEidDetected` callback.
 * This function requires an active network connection.
 * @param {object} [options] - Configuration for the eID service. Can be omitted to use default values.
 * @param {string} [options.ip="deviceid.dxiot.com"] - The IP address of the eID server.
 * @param {number} [options.port=9889] - The port of the eID server.
 * @param {object} options.config - Advanced eID parameters.
 * @param {number} [options.config.read_len=54] - Read length per transaction, default is 0x36 (54).
 * @param {number} [options.config.declevel=2] - Whether to read the photo (1: no, 2: yes).
 * @param {number} [options.config.loglevel] - Log level (0, 1, or 2).
 * @param {number} [options.config.model=0] - 0: return ID info, 1: return reqid for forwarding.
 * @param {number} [options.config.type=0] - Card type (0: ID card, 1: e-license).
 * @param {number} [options.config.pic_type=1] - Photo data type (0: wlt, 1: jpg).
 * @param {number} [options.config.envCode=52302] - Environment code.
 * @param {string} options.config.device_model - Device model.
 * @param {number} [options.config.info_type=0] - Return type (0: struct, 1: raw data).
 * @returns {void}
 * @throws {Error} If required config properties are missing.
 */
dxNfcCard.eidInit = function (options = { ip: "deviceid.dxiot.com", port: 9889 }) {
    if (!options.config ||
        typeof options.config.device_model !== 'string') {
        throw new Error("eidInit requires options.config with string properties: device_model.");
    }
    return nfc.eidInit(options);
}
/**
 * Activates the eID module using an activation code and device information.
 * This is typically done once to bind the device to the eID service.
 * This function requires an active network connection.
 * @param {object} options - Activation options.
 * @param {string} options.codeMsg - The activation code message.
 * @param {string} options.version - Firmware version.
 * @param {string} options.macAddr - Device MAC address.
 * @returns {number} 0 on success, negative value on failure.
 * @throws {Error} If any of the required options are missing or invalid.
 */
dxNfcCard.eidActive = function (options) {
    if (!options ||
        typeof options.codeMsg !== 'string' ||
        typeof options.version !== 'string' ||
        typeof options.macAddr !== 'string') {
        throw new Error("eidActive requires an object with string properties: codeMsg, version, and macAddr.");
    }
    return nfc.eidActive(options);
}
/**
 * Deinitializes the eID functionality.
 * @returns {void}
 */
dxNfcCard.eidDeinit = function () {
    return nfc.eidDeinit();
}
/**
 * Sets callback handlers for NFC events.
 * @typedef {object} CardInfo
 * @property {number} card_type - The type of the card.
 * @property {string} id - The card's unique identifier as a hex string.
 * @property {number} id_len - The length of the card's ID in bytes.
 * @property {number} type - Detailed card type.
 * @property {number} sak - SAK value (Select Acknowledge).
 * @property {number} timestamp - The timestamp of the event (system time).
 * @property {number} monotonic_timestamp - The monotonic timestamp of the event.
 *
 * @typedef {object} EidInfo
 * @property {string} name - Full name.
 * @property {string} sex - Sex / Gender.
 * @property {string} nation - Ethnic group.
 * @property {string} birthday - Date of birth (Format: YYYYMMDD).
 * @property {string} address - Residential address.
 * @property {string} idCardNo - Citizen identification number.
 * @property {string} grantDept - Issuing authority.
 * @property {string} userLifeBegin - Valid from date (Format: YYYYMMDD).
 * @property {string} userLifeEnd - Valid until date (Format: YYYYMMDD or "长期" for long-term).
 * @property {string} picture - Base64 encoded string of the ID photo.
 *
 * @param {object} callbacks - An object containing callback functions.
 * @param {function(cardInfo: CardInfo)} [callbacks.onCardDetected] - Called when a standard NFC card is detected.
 * @param {function(eidInfo: EidInfo)} [callbacks.onEidDetected] - Called when an eID (ID card) is successfully read.
 * @returns {void}
 */
dxNfcCard.setCallbacks = function (callbacks) {
    _callbacks = callbacks;
};
/**
 * Processes events from the NFC event queue. Should be called periodically (e.g., in setInterval).
 * @example
 * setInterval(() => {
 *   try {
 *     dxNfcCard.loop();
 *   } catch (e) {
 *     logger.error('Error in NFC loop:', e);
 *   }
 * }, 50); // Process events every 50ms
 */
dxNfcCard.loop = function () {
    // Process regular card events
    let card_ev = nfc.getEvent();
    if (card_ev && _callbacks.onCardDetected) {
        _callbacks.onCardDetected(card_ev);
    }
    // Process eID events
    let eid_ev_str = nfc.getEidEvent();
    if (eid_ev_str && _callbacks.onEidDetected) {
        const eid_info = JSON.parse(eid_ev_str);
        _callbacks.onEidDetected(eid_info);
    }
};
/**
 * Gets the native NFC client object.
 * @returns {object} The native client object.
 */
dxNfcCard.getNative = function () {
    return nfc;
};
/**
 * @readonly
 * @enum {number}
 * Enum for card types.
 */
dxNfcCard.CARD_TYPE = Object.freeze({
    /** Unspecified Type A protocol card */
    TYPE_A: 64,
    /** Mifare Ultralight card */
    MIFARE_ULTRALIGHT: 65,
    /** Mifare Classic EV1 1K (4-byte UID) */
    MIFARE_CLASSIC_1K_4B: 66,
    /** Mifare Classic EV1 4K */
    MIFARE_CLASSIC_4K: 67,
    /** CPU card (Type A protocol) */
    CPU_A: 68,
    /** Mifare Desfire series */
    MIFARE_DESFIRE: 69,
    /** Physical ID card (Type B protocol) */
    IDENTITY_CARD: 70,
    /** ISO15693 protocol card (long-range IC card) */
    ISO15693: 71,
    /** Unspecified Type B protocol card */
    TYPE_B: 74,
    /** CPU card (Type B protocol) */
    CPU_B: 75,
    /** Generic M1 card (sometimes synonymous with 66) */
    M1: 76,
    /** Japanese Felica card (Sony standard) */
    FELICA: 77,
    /** Mifare Plus series */
    MIFARE_PLUS: 78,
    /** Also an ID card (sometimes an IDCard type read by the logical layer or CPU) */
    IDCARD: 97,
    /** Unsupported or unrecognized card */
    NOT_SUPPORT: 127,
});
export default dxNfcCard;
在上述文件截断后对比
vf107/dxmodules/dxNtp.js vf107/dxmodules/dxOs.js vf107/dxmodules/dxOta.js vf107/dxmodules/dxPwm.js vf107/dxmodules/dxQrRule.js vf107/dxmodules/dxSqliteDB.js vf107/dxmodules/dxStd.js vf107/dxmodules/dxTimeZones.js vf107/dxmodules/dxUart.js vf107/dxmodules/dxVgBle.js vf107/dxmodules/dxWatchdog.js vf107/dxmodules/dxWorkerPool.js vf107/dxmodules/libasound.so.2 vf107/dxmodules/libatopology.so.2 vf107/dxmodules/libpaho-mqtt3cs.so.1 vf107/dxmodules/libvbar-b-dxgpio.so vf107/dxmodules/libvbar-b-dxpwm.so vf107/dxmodules/libvbar-drv-audio_gain.so vf107/dxmodules/libvbar-drv-capcal.so vf107/dxmodules/libvbar-drv-capturer.so vf107/dxmodules/libvbar-drv-display.so vf107/dxmodules/libvbar-drv-face.so vf107/dxmodules/libvbar-drv-gpio.so vf107/dxmodules/libvbar-drv-memory.so vf107/dxmodules/libvbar-drv-pwm.so vf107/dxmodules/libvbar-drv-soc.so vf107/dxmodules/libvbar-drv-tts.so vf107/dxmodules/libvbar-drv-watchdog.so vf107/dxmodules/libvbar-m-audio.so vf107/dxmodules/libvbar-m-capturer.so vf107/dxmodules/libvbar-m-channel.so vf107/dxmodules/libvbar-m-common.so vf107/dxmodules/libvbar-m-dxaudio.so vf107/dxmodules/libvbar-m-dxchannel.so vf107/dxmodules/libvbar-m-dxcommon.so vf107/dxmodules/libvbar-m-dxcommonutils.so vf107/dxmodules/libvbar-m-dxdisplay.so vf107/dxmodules/libvbar-m-dxfacial.so vf107/dxmodules/libvbar-m-dxhttpclient.so vf107/dxmodules/libvbar-m-dxhttpserver.so vf107/dxmodules/libvbar-m-dxkey.so vf107/dxmodules/libvbar-m-dxmap.so vf107/dxmodules/libvbar-m-dxmqttclient.so vf107/dxmodules/libvbar-m-dxnetwork.so vf107/dxmodules/libvbar-m-dxnfccard.so vf107/dxmodules/libvbar-m-dxos.so vf107/dxmodules/libvbar-m-dxsqlitedb.so vf107/dxmodules/libvbar-m-dxuart.so vf107/dxmodules/libvbar-m-dxwatchdog.so vf107/dxmodules/libvbar-m-eid.so vf107/dxmodules/libvbar-m-key.so vf107/dxmodules/libvbar-m-net.so vf107/dxmodules/libvbar-p-nfc.so vf107/dxmodules/libzbar.so vf107/dxmodules/vbar_version vf107/dxmodules/vgUartWorker.js vf107/dxmodules/zoneinfo/Africa/Abidjan vf107/dxmodules/zoneinfo/Africa/Accra vf107/dxmodules/zoneinfo/Africa/Addis_Ababa vf107/dxmodules/zoneinfo/Africa/Algiers vf107/dxmodules/zoneinfo/Africa/Asmara vf107/dxmodules/zoneinfo/Africa/Asmera vf107/dxmodules/zoneinfo/Africa/Bamako vf107/dxmodules/zoneinfo/Africa/Bangui vf107/dxmodules/zoneinfo/Africa/Banjul vf107/dxmodules/zoneinfo/Africa/Bissau vf107/dxmodules/zoneinfo/Africa/Blantyre vf107/dxmodules/zoneinfo/Africa/Brazzaville vf107/dxmodules/zoneinfo/Africa/Bujumbura vf107/dxmodules/zoneinfo/Africa/Cairo vf107/dxmodules/zoneinfo/Africa/Casablanca vf107/dxmodules/zoneinfo/Africa/Ceuta vf107/dxmodules/zoneinfo/Africa/Conakry vf107/dxmodules/zoneinfo/Africa/Dakar vf107/dxmodules/zoneinfo/Africa/Dar_es_Salaam vf107/dxmodules/zoneinfo/Africa/Djibouti vf107/dxmodules/zoneinfo/Africa/Douala vf107/dxmodules/zoneinfo/Africa/El_Aaiun vf107/dxmodules/zoneinfo/Africa/Freetown vf107/dxmodules/zoneinfo/Africa/Gaborone vf107/dxmodules/zoneinfo/Africa/Harare vf107/dxmodules/zoneinfo/Africa/Johannesburg vf107/dxmodules/zoneinfo/Africa/Juba vf107/dxmodules/zoneinfo/Africa/Kampala vf107/dxmodules/zoneinfo/Africa/Khartoum vf107/dxmodules/zoneinfo/Africa/Kigali vf107/dxmodules/zoneinfo/Africa/Kinshasa vf107/dxmodules/zoneinfo/Africa/Lagos vf107/dxmodules/zoneinfo/Africa/Libreville vf107/dxmodules/zoneinfo/Africa/Lome vf107/dxmodules/zoneinfo/Africa/Luanda vf107/dxmodules/zoneinfo/Africa/Lubumbashi vf107/dxmodules/zoneinfo/Africa/Lusaka vf107/dxmodules/zoneinfo/Africa/Malabo vf107/dxmodules/zoneinfo/Africa/Maputo vf107/dxmodules/zoneinfo/Africa/Maseru vf107/dxmodules/zoneinfo/Africa/Mbabane vf107/dxmodules/zoneinfo/Africa/Mogadishu vf107/dxmodules/zoneinfo/Africa/Monrovia vf107/dxmodules/zoneinfo/Africa/Nairobi vf107/dxmodules/zoneinfo/Africa/Ndjamena vf107/dxmodules/zoneinfo/Africa/Niamey vf107/dxmodules/zoneinfo/Africa/Nouakchott vf107/dxmodules/zoneinfo/Africa/Ouagadougou vf107/dxmodules/zoneinfo/Africa/Porto-Novo vf107/dxmodules/zoneinfo/Africa/Sao_Tome vf107/dxmodules/zoneinfo/Africa/Timbuktu vf107/dxmodules/zoneinfo/Africa/Tripoli vf107/dxmodules/zoneinfo/Africa/Tunis vf107/dxmodules/zoneinfo/Africa/Windhoek vf107/dxmodules/zoneinfo/America/Adak vf107/dxmodules/zoneinfo/America/Anchorage vf107/dxmodules/zoneinfo/America/Anguilla vf107/dxmodules/zoneinfo/America/Antigua vf107/dxmodules/zoneinfo/America/Araguaina vf107/dxmodules/zoneinfo/America/Argentina/Buenos_Aires vf107/dxmodules/zoneinfo/America/Argentina/Catamarca vf107/dxmodules/zoneinfo/America/Argentina/ComodRivadavia vf107/dxmodules/zoneinfo/America/Argentina/Cordoba vf107/dxmodules/zoneinfo/America/Argentina/Jujuy vf107/dxmodules/zoneinfo/America/Argentina/La_Rioja vf107/dxmodules/zoneinfo/America/Argentina/Mendoza vf107/dxmodules/zoneinfo/America/Argentina/Rio_Gallegos vf107/dxmodules/zoneinfo/America/Argentina/Salta vf107/dxmodules/zoneinfo/America/Argentina/San_Juan vf107/dxmodules/zoneinfo/America/Argentina/San_Luis vf107/dxmodules/zoneinfo/America/Argentina/Tucuman vf107/dxmodules/zoneinfo/America/Argentina/Ushuaia vf107/dxmodules/zoneinfo/America/Aruba vf107/dxmodules/zoneinfo/America/Asuncion vf107/dxmodules/zoneinfo/America/Atikokan vf107/dxmodules/zoneinfo/America/Atka vf107/dxmodules/zoneinfo/America/Bahia vf107/dxmodules/zoneinfo/America/Bahia_Banderas vf107/dxmodules/zoneinfo/America/Barbados vf107/dxmodules/zoneinfo/America/Belem vf107/dxmodules/zoneinfo/America/Belize vf107/dxmodules/zoneinfo/America/Blanc-Sablon vf107/dxmodules/zoneinfo/America/Boa_Vista vf107/dxmodules/zoneinfo/America/Bogota vf107/dxmodules/zoneinfo/America/Boise vf107/dxmodules/zoneinfo/America/Buenos_Aires vf107/dxmodules/zoneinfo/America/Cambridge_Bay vf107/dxmodules/zoneinfo/America/Campo_Grande vf107/dxmodules/zoneinfo/America/Cancun vf107/dxmodules/zoneinfo/America/Caracas vf107/dxmodules/zoneinfo/America/Catamarca vf107/dxmodules/zoneinfo/America/Cayenne vf107/dxmodules/zoneinfo/America/Cayman vf107/dxmodules/zoneinfo/America/Chicago vf107/dxmodules/zoneinfo/America/Chihuahua vf107/dxmodules/zoneinfo/America/Coral_Harbour vf107/dxmodules/zoneinfo/America/Cordoba vf107/dxmodules/zoneinfo/America/Costa_Rica vf107/dxmodules/zoneinfo/America/Creston vf107/dxmodules/zoneinfo/America/Cuiaba vf107/dxmodules/zoneinfo/America/Curacao vf107/dxmodules/zoneinfo/America/Danmarkshavn vf107/dxmodules/zoneinfo/America/Dawson vf107/dxmodules/zoneinfo/America/Dawson_Creek vf107/dxmodules/zoneinfo/America/Denver vf107/dxmodules/zoneinfo/America/Detroit vf107/dxmodules/zoneinfo/America/Dominica vf107/dxmodules/zoneinfo/America/Edmonton vf107/dxmodules/zoneinfo/America/Eirunepe vf107/dxmodules/zoneinfo/America/El_Salvador vf107/dxmodules/zoneinfo/America/Ensenada vf107/dxmodules/zoneinfo/America/Fort_Nelson vf107/dxmodules/zoneinfo/America/Fort_Wayne vf107/dxmodules/zoneinfo/America/Fortaleza vf107/dxmodules/zoneinfo/America/Glace_Bay vf107/dxmodules/zoneinfo/America/Godthab vf107/dxmodules/zoneinfo/America/Goose_Bay vf107/dxmodules/zoneinfo/America/Grand_Turk vf107/dxmodules/zoneinfo/America/Grenada vf107/dxmodules/zoneinfo/America/Guadeloupe vf107/dxmodules/zoneinfo/America/Guatemala vf107/dxmodules/zoneinfo/America/Guayaquil vf107/dxmodules/zoneinfo/America/Guyana vf107/dxmodules/zoneinfo/America/Halifax vf107/dxmodules/zoneinfo/America/Havana vf107/dxmodules/zoneinfo/America/Hermosillo vf107/dxmodules/zoneinfo/America/Indiana/Indianapolis vf107/dxmodules/zoneinfo/America/Indiana/Knox vf107/dxmodules/zoneinfo/America/Indiana/Marengo vf107/dxmodules/zoneinfo/America/Indiana/Petersburg vf107/dxmodules/zoneinfo/America/Indiana/Tell_City vf107/dxmodules/zoneinfo/America/Indiana/Vevay vf107/dxmodules/zoneinfo/America/Indiana/Vincennes vf107/dxmodules/zoneinfo/America/Indiana/Winamac vf107/dxmodules/zoneinfo/America/Indianapolis vf107/dxmodules/zoneinfo/America/Inuvik vf107/dxmodules/zoneinfo/America/Iqaluit vf107/dxmodules/zoneinfo/America/Jamaica vf107/dxmodules/zoneinfo/America/Jujuy vf107/dxmodules/zoneinfo/America/Juneau vf107/dxmodules/zoneinfo/America/Kentucky/Louisville vf107/dxmodules/zoneinfo/America/Kentucky/Monticello vf107/dxmodules/zoneinfo/America/Knox_IN vf107/dxmodules/zoneinfo/America/Kralendijk vf107/dxmodules/zoneinfo/America/La_Paz vf107/dxmodules/zoneinfo/America/Lima vf107/dxmodules/zoneinfo/America/Los_Angeles vf107/dxmodules/zoneinfo/America/Louisville vf107/dxmodules/zoneinfo/America/Lower_Princes vf107/dxmodules/zoneinfo/America/Maceio vf107/dxmodules/zoneinfo/America/Managua vf107/dxmodules/zoneinfo/America/Manaus vf107/dxmodules/zoneinfo/America/Marigot vf107/dxmodules/zoneinfo/America/Martinique vf107/dxmodules/zoneinfo/America/Matamoros vf107/dxmodules/zoneinfo/America/Mazatlan vf107/dxmodules/zoneinfo/America/Mendoza vf107/dxmodules/zoneinfo/America/Menominee vf107/dxmodules/zoneinfo/America/Merida vf107/dxmodules/zoneinfo/America/Metlakatla vf107/dxmodules/zoneinfo/America/Mexico_City vf107/dxmodules/zoneinfo/America/Miquelon vf107/dxmodules/zoneinfo/America/Moncton vf107/dxmodules/zoneinfo/America/Monterrey vf107/dxmodules/zoneinfo/America/Montevideo vf107/dxmodules/zoneinfo/America/Montreal vf107/dxmodules/zoneinfo/America/Montserrat vf107/dxmodules/zoneinfo/America/Nassau vf107/dxmodules/zoneinfo/America/New_York vf107/dxmodules/zoneinfo/America/Nipigon vf107/dxmodules/zoneinfo/America/Nome vf107/dxmodules/zoneinfo/America/Noronha vf107/dxmodules/zoneinfo/America/North_Dakota/Beulah vf107/dxmodules/zoneinfo/America/North_Dakota/Center vf107/dxmodules/zoneinfo/America/North_Dakota/New_Salem vf107/dxmodules/zoneinfo/America/Nuuk vf107/dxmodules/zoneinfo/America/Ojinaga vf107/dxmodules/zoneinfo/America/Panama vf107/dxmodules/zoneinfo/America/Pangnirtung vf107/dxmodules/zoneinfo/America/Paramaribo vf107/dxmodules/zoneinfo/America/Phoenix vf107/dxmodules/zoneinfo/America/Port-au-Prince vf107/dxmodules/zoneinfo/America/Port_of_Spain vf107/dxmodules/zoneinfo/America/Porto_Acre vf107/dxmodules/zoneinfo/America/Porto_Velho vf107/dxmodules/zoneinfo/America/Puerto_Rico vf107/dxmodules/zoneinfo/America/Punta_Arenas vf107/dxmodules/zoneinfo/America/Rainy_River vf107/dxmodules/zoneinfo/America/Rankin_Inlet vf107/dxmodules/zoneinfo/America/Recife vf107/dxmodules/zoneinfo/America/Regina vf107/dxmodules/zoneinfo/America/Resolute vf107/dxmodules/zoneinfo/America/Rio_Branco vf107/dxmodules/zoneinfo/America/Rosario vf107/dxmodules/zoneinfo/America/Santa_Isabel vf107/dxmodules/zoneinfo/America/Santarem vf107/dxmodules/zoneinfo/America/Santiago vf107/dxmodules/zoneinfo/America/Santo_Domingo vf107/dxmodules/zoneinfo/America/Sao_Paulo vf107/dxmodules/zoneinfo/America/Scoresbysund vf107/dxmodules/zoneinfo/America/Shiprock vf107/dxmodules/zoneinfo/America/Sitka vf107/dxmodules/zoneinfo/America/St_Barthelemy vf107/dxmodules/zoneinfo/America/St_Johns vf107/dxmodules/zoneinfo/America/St_Kitts vf107/dxmodules/zoneinfo/America/St_Lucia vf107/dxmodules/zoneinfo/America/St_Thomas vf107/dxmodules/zoneinfo/America/St_Vincent vf107/dxmodules/zoneinfo/America/Swift_Current vf107/dxmodules/zoneinfo/America/Tegucigalpa vf107/dxmodules/zoneinfo/America/Thule vf107/dxmodules/zoneinfo/America/Thunder_Bay vf107/dxmodules/zoneinfo/America/Tijuana vf107/dxmodules/zoneinfo/America/Toronto vf107/dxmodules/zoneinfo/America/Tortola vf107/dxmodules/zoneinfo/America/Vancouver vf107/dxmodules/zoneinfo/America/Virgin vf107/dxmodules/zoneinfo/America/Whitehorse vf107/dxmodules/zoneinfo/America/Winnipeg vf107/dxmodules/zoneinfo/America/Yakutat vf107/dxmodules/zoneinfo/America/Yellowknife vf107/dxmodules/zoneinfo/Antarctica/Casey vf107/dxmodules/zoneinfo/Antarctica/Davis vf107/dxmodules/zoneinfo/Antarctica/DumontDUrville vf107/dxmodules/zoneinfo/Antarctica/Macquarie vf107/dxmodules/zoneinfo/Antarctica/Mawson vf107/dxmodules/zoneinfo/Antarctica/McMurdo vf107/dxmodules/zoneinfo/Antarctica/Palmer vf107/dxmodules/zoneinfo/Antarctica/Rothera vf107/dxmodules/zoneinfo/Antarctica/South_Pole vf107/dxmodules/zoneinfo/Antarctica/Syowa vf107/dxmodules/zoneinfo/Antarctica/Troll vf107/dxmodules/zoneinfo/Antarctica/Vostok vf107/dxmodules/zoneinfo/Arctic/Longyearbyen vf107/dxmodules/zoneinfo/Asia/Aden vf107/dxmodules/zoneinfo/Asia/Almaty vf107/dxmodules/zoneinfo/Asia/Amman vf107/dxmodules/zoneinfo/Asia/Anadyr vf107/dxmodules/zoneinfo/Asia/Aqtau vf107/dxmodules/zoneinfo/Asia/Aqtobe vf107/dxmodules/zoneinfo/Asia/Ashgabat vf107/dxmodules/zoneinfo/Asia/Ashkhabad vf107/dxmodules/zoneinfo/Asia/Atyrau vf107/dxmodules/zoneinfo/Asia/Baghdad vf107/dxmodules/zoneinfo/Asia/Bahrain vf107/dxmodules/zoneinfo/Asia/Baku vf107/dxmodules/zoneinfo/Asia/Bangkok vf107/dxmodules/zoneinfo/Asia/Barnaul vf107/dxmodules/zoneinfo/Asia/Beirut vf107/dxmodules/zoneinfo/Asia/Bishkek vf107/dxmodules/zoneinfo/Asia/Brunei vf107/dxmodules/zoneinfo/Asia/Calcutta vf107/dxmodules/zoneinfo/Asia/Chita vf107/dxmodules/zoneinfo/Asia/Choibalsan vf107/dxmodules/zoneinfo/Asia/Chongqing vf107/dxmodules/zoneinfo/Asia/Chungking vf107/dxmodules/zoneinfo/Asia/Colombo vf107/dxmodules/zoneinfo/Asia/Dacca vf107/dxmodules/zoneinfo/Asia/Damascus vf107/dxmodules/zoneinfo/Asia/Dhaka vf107/dxmodules/zoneinfo/Asia/Dili vf107/dxmodules/zoneinfo/Asia/Dubai vf107/dxmodules/zoneinfo/Asia/Dushanbe vf107/dxmodules/zoneinfo/Asia/Famagusta vf107/dxmodules/zoneinfo/Asia/Gaza vf107/dxmodules/zoneinfo/Asia/Harbin vf107/dxmodules/zoneinfo/Asia/Hebron vf107/dxmodules/zoneinfo/Asia/Ho_Chi_Minh vf107/dxmodules/zoneinfo/Asia/Hong_Kong vf107/dxmodules/zoneinfo/Asia/Hovd vf107/dxmodules/zoneinfo/Asia/Irkutsk vf107/dxmodules/zoneinfo/Asia/Istanbul vf107/dxmodules/zoneinfo/Asia/Jakarta vf107/dxmodules/zoneinfo/Asia/Jayapura vf107/dxmodules/zoneinfo/Asia/Jerusalem vf107/dxmodules/zoneinfo/Asia/Kabul vf107/dxmodules/zoneinfo/Asia/Kamchatka vf107/dxmodules/zoneinfo/Asia/Karachi vf107/dxmodules/zoneinfo/Asia/Kashgar vf107/dxmodules/zoneinfo/Asia/Kathmandu vf107/dxmodules/zoneinfo/Asia/Katmandu vf107/dxmodules/zoneinfo/Asia/Khandyga vf107/dxmodules/zoneinfo/Asia/Kolkata vf107/dxmodules/zoneinfo/Asia/Krasnoyarsk vf107/dxmodules/zoneinfo/Asia/Kuala_Lumpur vf107/dxmodules/zoneinfo/Asia/Kuching vf107/dxmodules/zoneinfo/Asia/Kuwait vf107/dxmodules/zoneinfo/Asia/Macao vf107/dxmodules/zoneinfo/Asia/Macau vf107/dxmodules/zoneinfo/Asia/Magadan vf107/dxmodules/zoneinfo/Asia/Makassar vf107/dxmodules/zoneinfo/Asia/Manila vf107/dxmodules/zoneinfo/Asia/Muscat vf107/dxmodules/zoneinfo/Asia/Nicosia vf107/dxmodules/zoneinfo/Asia/Novokuznetsk vf107/dxmodules/zoneinfo/Asia/Novosibirsk vf107/dxmodules/zoneinfo/Asia/Omsk vf107/dxmodules/zoneinfo/Asia/Oral vf107/dxmodules/zoneinfo/Asia/Phnom_Penh vf107/dxmodules/zoneinfo/Asia/Pontianak vf107/dxmodules/zoneinfo/Asia/Pyongyang vf107/dxmodules/zoneinfo/Asia/Qatar vf107/dxmodules/zoneinfo/Asia/Qostanay vf107/dxmodules/zoneinfo/Asia/Qyzylorda vf107/dxmodules/zoneinfo/Asia/Rangoon vf107/dxmodules/zoneinfo/Asia/Riyadh vf107/dxmodules/zoneinfo/Asia/Saigon vf107/dxmodules/zoneinfo/Asia/Sakhalin vf107/dxmodules/zoneinfo/Asia/Samarkand vf107/dxmodules/zoneinfo/Asia/Seoul vf107/dxmodules/zoneinfo/Asia/Shanghai vf107/dxmodules/zoneinfo/Asia/Singapore vf107/dxmodules/zoneinfo/Asia/Srednekolymsk vf107/dxmodules/zoneinfo/Asia/Taipei vf107/dxmodules/zoneinfo/Asia/Tashkent vf107/dxmodules/zoneinfo/Asia/Tbilisi vf107/dxmodules/zoneinfo/Asia/Tehran vf107/dxmodules/zoneinfo/Asia/Tel_Aviv vf107/dxmodules/zoneinfo/Asia/Thimbu vf107/dxmodules/zoneinfo/Asia/Thimphu vf107/dxmodules/zoneinfo/Asia/Tokyo vf107/dxmodules/zoneinfo/Asia/Tomsk vf107/dxmodules/zoneinfo/Asia/Ujung_Pandang vf107/dxmodules/zoneinfo/Asia/Ulaanbaatar vf107/dxmodules/zoneinfo/Asia/Ulan_Bator vf107/dxmodules/zoneinfo/Asia/Urumqi vf107/dxmodules/zoneinfo/Asia/Ust-Nera vf107/dxmodules/zoneinfo/Asia/Vientiane vf107/dxmodules/zoneinfo/Asia/Vladivostok vf107/dxmodules/zoneinfo/Asia/Yakutsk vf107/dxmodules/zoneinfo/Asia/Yangon vf107/dxmodules/zoneinfo/Asia/Yekaterinburg vf107/dxmodules/zoneinfo/Asia/Yerevan vf107/dxmodules/zoneinfo/Atlantic/Azores vf107/dxmodules/zoneinfo/Atlantic/Bermuda vf107/dxmodules/zoneinfo/Atlantic/Canary vf107/dxmodules/zoneinfo/Atlantic/Cape_Verde vf107/dxmodules/zoneinfo/Atlantic/Faeroe vf107/dxmodules/zoneinfo/Atlantic/Faroe vf107/dxmodules/zoneinfo/Atlantic/Jan_Mayen vf107/dxmodules/zoneinfo/Atlantic/Madeira vf107/dxmodules/zoneinfo/Atlantic/Reykjavik vf107/dxmodules/zoneinfo/Atlantic/South_Georgia vf107/dxmodules/zoneinfo/Atlantic/St_Helena vf107/dxmodules/zoneinfo/Atlantic/Stanley vf107/dxmodules/zoneinfo/Australia/ACT vf107/dxmodules/zoneinfo/Australia/Adelaide vf107/dxmodules/zoneinfo/Australia/Brisbane vf107/dxmodules/zoneinfo/Australia/Broken_Hill vf107/dxmodules/zoneinfo/Australia/Canberra vf107/dxmodules/zoneinfo/Australia/Currie vf107/dxmodules/zoneinfo/Australia/Darwin vf107/dxmodules/zoneinfo/Australia/Eucla vf107/dxmodules/zoneinfo/Australia/Hobart vf107/dxmodules/zoneinfo/Australia/LHI vf107/dxmodules/zoneinfo/Australia/Lindeman vf107/dxmodules/zoneinfo/Australia/Lord_Howe vf107/dxmodules/zoneinfo/Australia/Melbourne vf107/dxmodules/zoneinfo/Australia/NSW vf107/dxmodules/zoneinfo/Australia/North vf107/dxmodules/zoneinfo/Australia/Perth vf107/dxmodules/zoneinfo/Australia/Queensland vf107/dxmodules/zoneinfo/Australia/South vf107/dxmodules/zoneinfo/Australia/Sydney vf107/dxmodules/zoneinfo/Australia/Tasmania vf107/dxmodules/zoneinfo/Australia/Victoria vf107/dxmodules/zoneinfo/Australia/West vf107/dxmodules/zoneinfo/Australia/Yancowinna vf107/dxmodules/zoneinfo/Brazil/Acre vf107/dxmodules/zoneinfo/Brazil/DeNoronha vf107/dxmodules/zoneinfo/Brazil/East vf107/dxmodules/zoneinfo/Brazil/West vf107/dxmodules/zoneinfo/CET vf107/dxmodules/zoneinfo/CST6CDT vf107/dxmodules/zoneinfo/Canada/Atlantic vf107/dxmodules/zoneinfo/Canada/Central vf107/dxmodules/zoneinfo/Canada/Eastern vf107/dxmodules/zoneinfo/Canada/Mountain vf107/dxmodules/zoneinfo/Canada/Newfoundland vf107/dxmodules/zoneinfo/Canada/Pacific vf107/dxmodules/zoneinfo/Canada/Saskatchewan vf107/dxmodules/zoneinfo/Canada/Yukon vf107/dxmodules/zoneinfo/Chile/Continental vf107/dxmodules/zoneinfo/Chile/EasterIsland vf107/dxmodules/zoneinfo/Cuba vf107/dxmodules/zoneinfo/EET vf107/dxmodules/zoneinfo/EST vf107/dxmodules/zoneinfo/EST5EDT vf107/dxmodules/zoneinfo/Egypt vf107/dxmodules/zoneinfo/Eire vf107/dxmodules/zoneinfo/Etc/GMT vf107/dxmodules/zoneinfo/Etc/GMT+0 vf107/dxmodules/zoneinfo/Etc/GMT+1 vf107/dxmodules/zoneinfo/Etc/GMT+10 vf107/dxmodules/zoneinfo/Etc/GMT+11 vf107/dxmodules/zoneinfo/Etc/GMT+12 vf107/dxmodules/zoneinfo/Etc/GMT+2 vf107/dxmodules/zoneinfo/Etc/GMT+3 vf107/dxmodules/zoneinfo/Etc/GMT+4 vf107/dxmodules/zoneinfo/Etc/GMT+5 vf107/dxmodules/zoneinfo/Etc/GMT+6 vf107/dxmodules/zoneinfo/Etc/GMT+7 vf107/dxmodules/zoneinfo/Etc/GMT+8 vf107/dxmodules/zoneinfo/Etc/GMT+9 vf107/dxmodules/zoneinfo/Etc/GMT-0 vf107/dxmodules/zoneinfo/Etc/GMT-1 vf107/dxmodules/zoneinfo/Etc/GMT-10 vf107/dxmodules/zoneinfo/Etc/GMT-11 vf107/dxmodules/zoneinfo/Etc/GMT-12 vf107/dxmodules/zoneinfo/Etc/GMT-13 vf107/dxmodules/zoneinfo/Etc/GMT-14 vf107/dxmodules/zoneinfo/Etc/GMT-2 vf107/dxmodules/zoneinfo/Etc/GMT-3 vf107/dxmodules/zoneinfo/Etc/GMT-4 vf107/dxmodules/zoneinfo/Etc/GMT-5 vf107/dxmodules/zoneinfo/Etc/GMT-6 vf107/dxmodules/zoneinfo/Etc/GMT-7 vf107/dxmodules/zoneinfo/Etc/GMT-8 vf107/dxmodules/zoneinfo/Etc/GMT-9 vf107/dxmodules/zoneinfo/Etc/GMT0 vf107/dxmodules/zoneinfo/Etc/Greenwich vf107/dxmodules/zoneinfo/Etc/UCT vf107/dxmodules/zoneinfo/Etc/UTC vf107/dxmodules/zoneinfo/Etc/Universal vf107/dxmodules/zoneinfo/Etc/Zulu vf107/dxmodules/zoneinfo/Europe/Amsterdam vf107/dxmodules/zoneinfo/Europe/Andorra vf107/dxmodules/zoneinfo/Europe/Astrakhan vf107/dxmodules/zoneinfo/Europe/Athens vf107/dxmodules/zoneinfo/Europe/Belfast vf107/dxmodules/zoneinfo/Europe/Belgrade vf107/dxmodules/zoneinfo/Europe/Berlin vf107/dxmodules/zoneinfo/Europe/Bratislava vf107/dxmodules/zoneinfo/Europe/Brussels vf107/dxmodules/zoneinfo/Europe/Bucharest vf107/dxmodules/zoneinfo/Europe/Budapest vf107/dxmodules/zoneinfo/Europe/Busingen vf107/dxmodules/zoneinfo/Europe/Chisinau vf107/dxmodules/zoneinfo/Europe/Copenhagen vf107/dxmodules/zoneinfo/Europe/Dublin vf107/dxmodules/zoneinfo/Europe/Gibraltar vf107/dxmodules/zoneinfo/Europe/Guernsey vf107/dxmodules/zoneinfo/Europe/Helsinki vf107/dxmodules/zoneinfo/Europe/Isle_of_Man vf107/dxmodules/zoneinfo/Europe/Istanbul vf107/dxmodules/zoneinfo/Europe/Jersey vf107/dxmodules/zoneinfo/Europe/Kaliningrad vf107/dxmodules/zoneinfo/Europe/Kiev vf107/dxmodules/zoneinfo/Europe/Kirov vf107/dxmodules/zoneinfo/Europe/Lisbon vf107/dxmodules/zoneinfo/Europe/Ljubljana vf107/dxmodules/zoneinfo/Europe/London vf107/dxmodules/zoneinfo/Europe/Luxembourg vf107/dxmodules/zoneinfo/Europe/Madrid vf107/dxmodules/zoneinfo/Europe/Malta vf107/dxmodules/zoneinfo/Europe/Mariehamn vf107/dxmodules/zoneinfo/Europe/Minsk vf107/dxmodules/zoneinfo/Europe/Monaco vf107/dxmodules/zoneinfo/Europe/Moscow vf107/dxmodules/zoneinfo/Europe/Nicosia vf107/dxmodules/zoneinfo/Europe/Oslo vf107/dxmodules/zoneinfo/Europe/Paris vf107/dxmodules/zoneinfo/Europe/Podgorica vf107/dxmodules/zoneinfo/Europe/Prague vf107/dxmodules/zoneinfo/Europe/Riga vf107/dxmodules/zoneinfo/Europe/Rome vf107/dxmodules/zoneinfo/Europe/Samara vf107/dxmodules/zoneinfo/Europe/San_Marino vf107/dxmodules/zoneinfo/Europe/Sarajevo vf107/dxmodules/zoneinfo/Europe/Saratov vf107/dxmodules/zoneinfo/Europe/Simferopol vf107/dxmodules/zoneinfo/Europe/Skopje vf107/dxmodules/zoneinfo/Europe/Sofia vf107/dxmodules/zoneinfo/Europe/Stockholm vf107/dxmodules/zoneinfo/Europe/Tallinn vf107/dxmodules/zoneinfo/Europe/Tirane vf107/dxmodules/zoneinfo/Europe/Tiraspol vf107/dxmodules/zoneinfo/Europe/Ulyanovsk vf107/dxmodules/zoneinfo/Europe/Uzhgorod vf107/dxmodules/zoneinfo/Europe/Vaduz vf107/dxmodules/zoneinfo/Europe/Vatican vf107/dxmodules/zoneinfo/Europe/Vienna vf107/dxmodules/zoneinfo/Europe/Vilnius vf107/dxmodules/zoneinfo/Europe/Volgograd vf107/dxmodules/zoneinfo/Europe/Warsaw vf107/dxmodules/zoneinfo/Europe/Zagreb vf107/dxmodules/zoneinfo/Europe/Zaporozhye vf107/dxmodules/zoneinfo/Europe/Zurich vf107/dxmodules/zoneinfo/GB vf107/dxmodules/zoneinfo/GB-Eire vf107/dxmodules/zoneinfo/GMT vf107/dxmodules/zoneinfo/GMT+0 vf107/dxmodules/zoneinfo/GMT-0 vf107/dxmodules/zoneinfo/GMT0 vf107/dxmodules/zoneinfo/Greenwich vf107/dxmodules/zoneinfo/HST vf107/dxmodules/zoneinfo/Hongkong vf107/dxmodules/zoneinfo/Iceland vf107/dxmodules/zoneinfo/Indian/Antananarivo vf107/dxmodules/zoneinfo/Indian/Chagos vf107/dxmodules/zoneinfo/Indian/Christmas vf107/dxmodules/zoneinfo/Indian/Cocos vf107/dxmodules/zoneinfo/Indian/Comoro vf107/dxmodules/zoneinfo/Indian/Kerguelen vf107/dxmodules/zoneinfo/Indian/Mahe vf107/dxmodules/zoneinfo/Indian/Maldives vf107/dxmodules/zoneinfo/Indian/Mauritius vf107/dxmodules/zoneinfo/Indian/Mayotte vf107/dxmodules/zoneinfo/Indian/Reunion vf107/dxmodules/zoneinfo/Iran vf107/dxmodules/zoneinfo/Israel vf107/dxmodules/zoneinfo/Jamaica vf107/dxmodules/zoneinfo/Japan vf107/dxmodules/zoneinfo/Kwajalein vf107/dxmodules/zoneinfo/Libya vf107/dxmodules/zoneinfo/MET vf107/dxmodules/zoneinfo/MST vf107/dxmodules/zoneinfo/MST7MDT vf107/dxmodules/zoneinfo/Mexico/BajaNorte vf107/dxmodules/zoneinfo/Mexico/BajaSur vf107/dxmodules/zoneinfo/Mexico/General vf107/dxmodules/zoneinfo/NZ vf107/dxmodules/zoneinfo/NZ-CHAT vf107/dxmodules/zoneinfo/Navajo vf107/dxmodules/zoneinfo/PRC vf107/dxmodules/zoneinfo/PST8PDT vf107/dxmodules/zoneinfo/Pacific/Apia vf107/dxmodules/zoneinfo/Pacific/Auckland vf107/dxmodules/zoneinfo/Pacific/Bougainville vf107/dxmodules/zoneinfo/Pacific/Chatham vf107/dxmodules/zoneinfo/Pacific/Chuuk vf107/dxmodules/zoneinfo/Pacific/Easter vf107/dxmodules/zoneinfo/Pacific/Efate vf107/dxmodules/zoneinfo/Pacific/Enderbury vf107/dxmodules/zoneinfo/Pacific/Fakaofo vf107/dxmodules/zoneinfo/Pacific/Fiji vf107/dxmodules/zoneinfo/Pacific/Funafuti vf107/dxmodules/zoneinfo/Pacific/Galapagos vf107/dxmodules/zoneinfo/Pacific/Gambier vf107/dxmodules/zoneinfo/Pacific/Guadalcanal vf107/dxmodules/zoneinfo/Pacific/Guam vf107/dxmodules/zoneinfo/Pacific/Honolulu vf107/dxmodules/zoneinfo/Pacific/Johnston vf107/dxmodules/zoneinfo/Pacific/Kiritimati vf107/dxmodules/zoneinfo/Pacific/Kosrae vf107/dxmodules/zoneinfo/Pacific/Kwajalein vf107/dxmodules/zoneinfo/Pacific/Majuro vf107/dxmodules/zoneinfo/Pacific/Marquesas vf107/dxmodules/zoneinfo/Pacific/Midway vf107/dxmodules/zoneinfo/Pacific/Nauru vf107/dxmodules/zoneinfo/Pacific/Niue vf107/dxmodules/zoneinfo/Pacific/Norfolk vf107/dxmodules/zoneinfo/Pacific/Noumea vf107/dxmodules/zoneinfo/Pacific/Pago_Pago vf107/dxmodules/zoneinfo/Pacific/Palau vf107/dxmodules/zoneinfo/Pacific/Pitcairn vf107/dxmodules/zoneinfo/Pacific/Pohnpei vf107/dxmodules/zoneinfo/Pacific/Ponape vf107/dxmodules/zoneinfo/Pacific/Port_Moresby vf107/dxmodules/zoneinfo/Pacific/Rarotonga vf107/dxmodules/zoneinfo/Pacific/Saipan vf107/dxmodules/zoneinfo/Pacific/Samoa vf107/dxmodules/zoneinfo/Pacific/Tahiti vf107/dxmodules/zoneinfo/Pacific/Tarawa vf107/dxmodules/zoneinfo/Pacific/Tongatapu vf107/dxmodules/zoneinfo/Pacific/Truk vf107/dxmodules/zoneinfo/Pacific/Wake vf107/dxmodules/zoneinfo/Pacific/Wallis vf107/dxmodules/zoneinfo/Pacific/Yap vf107/dxmodules/zoneinfo/Poland vf107/dxmodules/zoneinfo/Portugal vf107/dxmodules/zoneinfo/ROC vf107/dxmodules/zoneinfo/ROK vf107/dxmodules/zoneinfo/Singapore vf107/dxmodules/zoneinfo/Turkey vf107/dxmodules/zoneinfo/UCT vf107/dxmodules/zoneinfo/US/Alaska vf107/dxmodules/zoneinfo/US/Aleutian vf107/dxmodules/zoneinfo/US/Arizona vf107/dxmodules/zoneinfo/US/Central vf107/dxmodules/zoneinfo/US/East-Indiana vf107/dxmodules/zoneinfo/US/Eastern vf107/dxmodules/zoneinfo/US/Hawaii vf107/dxmodules/zoneinfo/US/Indiana-Starke vf107/dxmodules/zoneinfo/US/Michigan vf107/dxmodules/zoneinfo/US/Mountain vf107/dxmodules/zoneinfo/US/Pacific vf107/dxmodules/zoneinfo/US/Samoa vf107/dxmodules/zoneinfo/UTC vf107/dxmodules/zoneinfo/Universal vf107/dxmodules/zoneinfo/W-SU vf107/dxmodules/zoneinfo/WET vf107/dxmodules/zoneinfo/Zulu vf107/dxmodules/zoneinfo/iso3166.tab vf107/dxmodules/zoneinfo/leapseconds vf107/dxmodules/zoneinfo/posix/Africa/Abidjan vf107/dxmodules/zoneinfo/posix/Africa/Accra vf107/dxmodules/zoneinfo/posix/Africa/Addis_Ababa vf107/dxmodules/zoneinfo/posix/Africa/Algiers vf107/dxmodules/zoneinfo/posix/Africa/Asmara vf107/dxmodules/zoneinfo/posix/Africa/Asmera vf107/dxmodules/zoneinfo/posix/Africa/Bamako vf107/dxmodules/zoneinfo/posix/Africa/Bangui vf107/dxmodules/zoneinfo/posix/Africa/Banjul vf107/dxmodules/zoneinfo/posix/Africa/Bissau vf107/dxmodules/zoneinfo/posix/Africa/Blantyre vf107/dxmodules/zoneinfo/posix/Africa/Brazzaville vf107/dxmodules/zoneinfo/posix/Africa/Bujumbura vf107/dxmodules/zoneinfo/posix/Africa/Cairo vf107/dxmodules/zoneinfo/posix/Africa/Casablanca vf107/dxmodules/zoneinfo/posix/Africa/Ceuta vf107/dxmodules/zoneinfo/posix/Africa/Conakry vf107/dxmodules/zoneinfo/posix/Africa/Dakar vf107/dxmodules/zoneinfo/posix/Africa/Dar_es_Salaam vf107/dxmodules/zoneinfo/posix/Africa/Djibouti vf107/dxmodules/zoneinfo/posix/Africa/Douala vf107/dxmodules/zoneinfo/posix/Africa/El_Aaiun vf107/dxmodules/zoneinfo/posix/Africa/Freetown vf107/dxmodules/zoneinfo/posix/Africa/Gaborone vf107/dxmodules/zoneinfo/posix/Africa/Harare vf107/dxmodules/zoneinfo/posix/Africa/Johannesburg vf107/dxmodules/zoneinfo/posix/Africa/Juba vf107/dxmodules/zoneinfo/posix/Africa/Kampala vf107/dxmodules/zoneinfo/posix/Africa/Khartoum vf107/dxmodules/zoneinfo/posix/Africa/Kigali vf107/dxmodules/zoneinfo/posix/Africa/Kinshasa vf107/dxmodules/zoneinfo/posix/Africa/Lagos vf107/dxmodules/zoneinfo/posix/Africa/Libreville vf107/dxmodules/zoneinfo/posix/Africa/Lome vf107/dxmodules/zoneinfo/posix/Africa/Luanda vf107/dxmodules/zoneinfo/posix/Africa/Lubumbashi vf107/dxmodules/zoneinfo/posix/Africa/Lusaka vf107/dxmodules/zoneinfo/posix/Africa/Malabo vf107/dxmodules/zoneinfo/posix/Africa/Maputo vf107/dxmodules/zoneinfo/posix/Africa/Maseru vf107/dxmodules/zoneinfo/posix/Africa/Mbabane vf107/dxmodules/zoneinfo/posix/Africa/Mogadishu vf107/dxmodules/zoneinfo/posix/Africa/Monrovia vf107/dxmodules/zoneinfo/posix/Africa/Nairobi vf107/dxmodules/zoneinfo/posix/Africa/Ndjamena vf107/dxmodules/zoneinfo/posix/Africa/Niamey vf107/dxmodules/zoneinfo/posix/Africa/Nouakchott vf107/dxmodules/zoneinfo/posix/Africa/Ouagadougou vf107/dxmodules/zoneinfo/posix/Africa/Porto-Novo vf107/dxmodules/zoneinfo/posix/Africa/Sao_Tome vf107/dxmodules/zoneinfo/posix/Africa/Timbuktu vf107/dxmodules/zoneinfo/posix/Africa/Tripoli vf107/dxmodules/zoneinfo/posix/Africa/Tunis vf107/dxmodules/zoneinfo/posix/Africa/Windhoek vf107/dxmodules/zoneinfo/posix/America/Adak vf107/dxmodules/zoneinfo/posix/America/Anchorage vf107/dxmodules/zoneinfo/posix/America/Anguilla vf107/dxmodules/zoneinfo/posix/America/Antigua vf107/dxmodules/zoneinfo/posix/America/Araguaina vf107/dxmodules/zoneinfo/posix/America/Argentina/Buenos_Aires vf107/dxmodules/zoneinfo/posix/America/Argentina/Catamarca vf107/dxmodules/zoneinfo/posix/America/Argentina/ComodRivadavia vf107/dxmodules/zoneinfo/posix/America/Argentina/Cordoba vf107/dxmodules/zoneinfo/posix/America/Argentina/Jujuy vf107/dxmodules/zoneinfo/posix/America/Argentina/La_Rioja vf107/dxmodules/zoneinfo/posix/America/Argentina/Mendoza vf107/dxmodules/zoneinfo/posix/America/Argentina/Rio_Gallegos vf107/dxmodules/zoneinfo/posix/America/Argentina/Salta vf107/dxmodules/zoneinfo/posix/America/Argentina/San_Juan vf107/dxmodules/zoneinfo/posix/America/Argentina/San_Luis vf107/dxmodules/zoneinfo/posix/America/Argentina/Tucuman vf107/dxmodules/zoneinfo/posix/America/Argentina/Ushuaia vf107/dxmodules/zoneinfo/posix/America/Aruba vf107/dxmodules/zoneinfo/posix/America/Asuncion vf107/dxmodules/zoneinfo/posix/America/Atikokan vf107/dxmodules/zoneinfo/posix/America/Atka vf107/dxmodules/zoneinfo/posix/America/Bahia vf107/dxmodules/zoneinfo/posix/America/Bahia_Banderas vf107/dxmodules/zoneinfo/posix/America/Barbados vf107/dxmodules/zoneinfo/posix/America/Belem vf107/dxmodules/zoneinfo/posix/America/Belize vf107/dxmodules/zoneinfo/posix/America/Blanc-Sablon vf107/dxmodules/zoneinfo/posix/America/Boa_Vista vf107/dxmodules/zoneinfo/posix/America/Bogota vf107/dxmodules/zoneinfo/posix/America/Boise vf107/dxmodules/zoneinfo/posix/America/Buenos_Aires vf107/dxmodules/zoneinfo/posix/America/Cambridge_Bay vf107/dxmodules/zoneinfo/posix/America/Campo_Grande vf107/dxmodules/zoneinfo/posix/America/Cancun vf107/dxmodules/zoneinfo/posix/America/Caracas vf107/dxmodules/zoneinfo/posix/America/Catamarca vf107/dxmodules/zoneinfo/posix/America/Cayenne vf107/dxmodules/zoneinfo/posix/America/Cayman vf107/dxmodules/zoneinfo/posix/America/Chicago vf107/dxmodules/zoneinfo/posix/America/Chihuahua vf107/dxmodules/zoneinfo/posix/America/Coral_Harbour vf107/dxmodules/zoneinfo/posix/America/Cordoba vf107/dxmodules/zoneinfo/posix/America/Costa_Rica vf107/dxmodules/zoneinfo/posix/America/Creston vf107/dxmodules/zoneinfo/posix/America/Cuiaba vf107/dxmodules/zoneinfo/posix/America/Curacao vf107/dxmodules/zoneinfo/posix/America/Danmarkshavn vf107/dxmodules/zoneinfo/posix/America/Dawson vf107/dxmodules/zoneinfo/posix/America/Dawson_Creek vf107/dxmodules/zoneinfo/posix/America/Denver vf107/dxmodules/zoneinfo/posix/America/Detroit vf107/dxmodules/zoneinfo/posix/America/Dominica vf107/dxmodules/zoneinfo/posix/America/Edmonton vf107/dxmodules/zoneinfo/posix/America/Eirunepe vf107/dxmodules/zoneinfo/posix/America/El_Salvador vf107/dxmodules/zoneinfo/posix/America/Ensenada vf107/dxmodules/zoneinfo/posix/America/Fort_Nelson vf107/dxmodules/zoneinfo/posix/America/Fort_Wayne vf107/dxmodules/zoneinfo/posix/America/Fortaleza vf107/dxmodules/zoneinfo/posix/America/Glace_Bay vf107/dxmodules/zoneinfo/posix/America/Godthab vf107/dxmodules/zoneinfo/posix/America/Goose_Bay vf107/dxmodules/zoneinfo/posix/America/Grand_Turk vf107/dxmodules/zoneinfo/posix/America/Grenada vf107/dxmodules/zoneinfo/posix/America/Guadeloupe vf107/dxmodules/zoneinfo/posix/America/Guatemala vf107/dxmodules/zoneinfo/posix/America/Guayaquil vf107/dxmodules/zoneinfo/posix/America/Guyana vf107/dxmodules/zoneinfo/posix/America/Halifax vf107/dxmodules/zoneinfo/posix/America/Havana vf107/dxmodules/zoneinfo/posix/America/Hermosillo vf107/dxmodules/zoneinfo/posix/America/Indiana/Indianapolis vf107/dxmodules/zoneinfo/posix/America/Indiana/Knox vf107/dxmodules/zoneinfo/posix/America/Indiana/Marengo vf107/dxmodules/zoneinfo/posix/America/Indiana/Petersburg vf107/dxmodules/zoneinfo/posix/America/Indiana/Tell_City vf107/dxmodules/zoneinfo/posix/America/Indiana/Vevay vf107/dxmodules/zoneinfo/posix/America/Indiana/Vincennes vf107/dxmodules/zoneinfo/posix/America/Indiana/Winamac vf107/dxmodules/zoneinfo/posix/America/Indianapolis vf107/dxmodules/zoneinfo/posix/America/Inuvik vf107/dxmodules/zoneinfo/posix/America/Iqaluit vf107/dxmodules/zoneinfo/posix/America/Jamaica vf107/dxmodules/zoneinfo/posix/America/Jujuy vf107/dxmodules/zoneinfo/posix/America/Juneau vf107/dxmodules/zoneinfo/posix/America/Kentucky/Louisville vf107/dxmodules/zoneinfo/posix/America/Kentucky/Monticello vf107/dxmodules/zoneinfo/posix/America/Knox_IN vf107/dxmodules/zoneinfo/posix/America/Kralendijk vf107/dxmodules/zoneinfo/posix/America/La_Paz vf107/dxmodules/zoneinfo/posix/America/Lima vf107/dxmodules/zoneinfo/posix/America/Los_Angeles vf107/dxmodules/zoneinfo/posix/America/Louisville vf107/dxmodules/zoneinfo/posix/America/Lower_Princes vf107/dxmodules/zoneinfo/posix/America/Maceio vf107/dxmodules/zoneinfo/posix/America/Managua vf107/dxmodules/zoneinfo/posix/America/Manaus vf107/dxmodules/zoneinfo/posix/America/Marigot vf107/dxmodules/zoneinfo/posix/America/Martinique vf107/dxmodules/zoneinfo/posix/America/Matamoros vf107/dxmodules/zoneinfo/posix/America/Mazatlan vf107/dxmodules/zoneinfo/posix/America/Mendoza vf107/dxmodules/zoneinfo/posix/America/Menominee vf107/dxmodules/zoneinfo/posix/America/Merida vf107/dxmodules/zoneinfo/posix/America/Metlakatla vf107/dxmodules/zoneinfo/posix/America/Mexico_City vf107/dxmodules/zoneinfo/posix/America/Miquelon vf107/dxmodules/zoneinfo/posix/America/Moncton vf107/dxmodules/zoneinfo/posix/America/Monterrey vf107/dxmodules/zoneinfo/posix/America/Montevideo vf107/dxmodules/zoneinfo/posix/America/Montreal vf107/dxmodules/zoneinfo/posix/America/Montserrat vf107/dxmodules/zoneinfo/posix/America/Nassau vf107/dxmodules/zoneinfo/posix/America/New_York vf107/dxmodules/zoneinfo/posix/America/Nipigon vf107/dxmodules/zoneinfo/posix/America/Nome vf107/dxmodules/zoneinfo/posix/America/Noronha vf107/dxmodules/zoneinfo/posix/America/North_Dakota/Beulah vf107/dxmodules/zoneinfo/posix/America/North_Dakota/Center vf107/dxmodules/zoneinfo/posix/America/North_Dakota/New_Salem vf107/dxmodules/zoneinfo/posix/America/Nuuk vf107/dxmodules/zoneinfo/posix/America/Ojinaga vf107/dxmodules/zoneinfo/posix/America/Panama vf107/dxmodules/zoneinfo/posix/America/Pangnirtung vf107/dxmodules/zoneinfo/posix/America/Paramaribo vf107/dxmodules/zoneinfo/posix/America/Phoenix vf107/dxmodules/zoneinfo/posix/America/Port-au-Prince vf107/dxmodules/zoneinfo/posix/America/Port_of_Spain vf107/dxmodules/zoneinfo/posix/America/Porto_Acre vf107/dxmodules/zoneinfo/posix/America/Porto_Velho vf107/dxmodules/zoneinfo/posix/America/Puerto_Rico vf107/dxmodules/zoneinfo/posix/America/Punta_Arenas vf107/dxmodules/zoneinfo/posix/America/Rainy_River vf107/dxmodules/zoneinfo/posix/America/Rankin_Inlet vf107/dxmodules/zoneinfo/posix/America/Recife vf107/dxmodules/zoneinfo/posix/America/Regina vf107/dxmodules/zoneinfo/posix/America/Resolute vf107/dxmodules/zoneinfo/posix/America/Rio_Branco vf107/dxmodules/zoneinfo/posix/America/Rosario vf107/dxmodules/zoneinfo/posix/America/Santa_Isabel vf107/dxmodules/zoneinfo/posix/America/Santarem vf107/dxmodules/zoneinfo/posix/America/Santiago vf107/dxmodules/zoneinfo/posix/America/Santo_Domingo vf107/dxmodules/zoneinfo/posix/America/Sao_Paulo vf107/dxmodules/zoneinfo/posix/America/Scoresbysund vf107/dxmodules/zoneinfo/posix/America/Shiprock vf107/dxmodules/zoneinfo/posix/America/Sitka vf107/dxmodules/zoneinfo/posix/America/St_Barthelemy vf107/dxmodules/zoneinfo/posix/America/St_Johns vf107/dxmodules/zoneinfo/posix/America/St_Kitts vf107/dxmodules/zoneinfo/posix/America/St_Lucia vf107/dxmodules/zoneinfo/posix/America/St_Thomas vf107/dxmodules/zoneinfo/posix/America/St_Vincent vf107/dxmodules/zoneinfo/posix/America/Swift_Current vf107/dxmodules/zoneinfo/posix/America/Tegucigalpa vf107/dxmodules/zoneinfo/posix/America/Thule vf107/dxmodules/zoneinfo/posix/America/Thunder_Bay vf107/dxmodules/zoneinfo/posix/America/Tijuana vf107/dxmodules/zoneinfo/posix/America/Toronto vf107/dxmodules/zoneinfo/posix/America/Tortola vf107/dxmodules/zoneinfo/posix/America/Vancouver vf107/dxmodules/zoneinfo/posix/America/Virgin vf107/dxmodules/zoneinfo/posix/America/Whitehorse vf107/dxmodules/zoneinfo/posix/America/Winnipeg vf107/dxmodules/zoneinfo/posix/America/Yakutat vf107/dxmodules/zoneinfo/posix/America/Yellowknife vf107/dxmodules/zoneinfo/posix/Antarctica/Casey vf107/dxmodules/zoneinfo/posix/Antarctica/Davis vf107/dxmodules/zoneinfo/posix/Antarctica/DumontDUrville vf107/dxmodules/zoneinfo/posix/Antarctica/Macquarie vf107/dxmodules/zoneinfo/posix/Antarctica/Mawson vf107/dxmodules/zoneinfo/posix/Antarctica/McMurdo vf107/dxmodules/zoneinfo/posix/Antarctica/Palmer vf107/dxmodules/zoneinfo/posix/Antarctica/Rothera vf107/dxmodules/zoneinfo/posix/Antarctica/South_Pole vf107/dxmodules/zoneinfo/posix/Antarctica/Syowa vf107/dxmodules/zoneinfo/posix/Antarctica/Troll vf107/dxmodules/zoneinfo/posix/Antarctica/Vostok vf107/dxmodules/zoneinfo/posix/Arctic/Longyearbyen vf107/dxmodules/zoneinfo/posix/Asia/Aden vf107/dxmodules/zoneinfo/posix/Asia/Almaty vf107/dxmodules/zoneinfo/posix/Asia/Amman vf107/dxmodules/zoneinfo/posix/Asia/Anadyr vf107/dxmodules/zoneinfo/posix/Asia/Aqtau vf107/dxmodules/zoneinfo/posix/Asia/Aqtobe vf107/dxmodules/zoneinfo/posix/Asia/Ashgabat vf107/dxmodules/zoneinfo/posix/Asia/Ashkhabad vf107/dxmodules/zoneinfo/posix/Asia/Atyrau vf107/dxmodules/zoneinfo/posix/Asia/Baghdad vf107/dxmodules/zoneinfo/posix/Asia/Bahrain vf107/dxmodules/zoneinfo/posix/Asia/Baku vf107/dxmodules/zoneinfo/posix/Asia/Bangkok vf107/dxmodules/zoneinfo/posix/Asia/Barnaul vf107/dxmodules/zoneinfo/posix/Asia/Beirut vf107/dxmodules/zoneinfo/posix/Asia/Bishkek vf107/dxmodules/zoneinfo/posix/Asia/Brunei vf107/dxmodules/zoneinfo/posix/Asia/Calcutta vf107/dxmodules/zoneinfo/posix/Asia/Chita vf107/dxmodules/zoneinfo/posix/Asia/Choibalsan vf107/dxmodules/zoneinfo/posix/Asia/Chongqing vf107/dxmodules/zoneinfo/posix/Asia/Chungking vf107/dxmodules/zoneinfo/posix/Asia/Colombo vf107/dxmodules/zoneinfo/posix/Asia/Dacca vf107/dxmodules/zoneinfo/posix/Asia/Damascus vf107/dxmodules/zoneinfo/posix/Asia/Dhaka vf107/dxmodules/zoneinfo/posix/Asia/Dili vf107/dxmodules/zoneinfo/posix/Asia/Dubai vf107/dxmodules/zoneinfo/posix/Asia/Dushanbe vf107/dxmodules/zoneinfo/posix/Asia/Famagusta vf107/dxmodules/zoneinfo/posix/Asia/Gaza vf107/dxmodules/zoneinfo/posix/Asia/Harbin vf107/dxmodules/zoneinfo/posix/Asia/Hebron vf107/dxmodules/zoneinfo/posix/Asia/Ho_Chi_Minh vf107/dxmodules/zoneinfo/posix/Asia/Hong_Kong vf107/dxmodules/zoneinfo/posix/Asia/Hovd vf107/dxmodules/zoneinfo/posix/Asia/Irkutsk vf107/dxmodules/zoneinfo/posix/Asia/Istanbul vf107/dxmodules/zoneinfo/posix/Asia/Jakarta vf107/dxmodules/zoneinfo/posix/Asia/Jayapura vf107/dxmodules/zoneinfo/posix/Asia/Jerusalem vf107/dxmodules/zoneinfo/posix/Asia/Kabul vf107/dxmodules/zoneinfo/posix/Asia/Kamchatka vf107/dxmodules/zoneinfo/posix/Asia/Karachi vf107/dxmodules/zoneinfo/posix/Asia/Kashgar vf107/dxmodules/zoneinfo/posix/Asia/Kathmandu vf107/dxmodules/zoneinfo/posix/Asia/Katmandu vf107/dxmodules/zoneinfo/posix/Asia/Khandyga vf107/dxmodules/zoneinfo/posix/Asia/Kolkata vf107/dxmodules/zoneinfo/posix/Asia/Krasnoyarsk vf107/dxmodules/zoneinfo/posix/Asia/Kuala_Lumpur vf107/dxmodules/zoneinfo/posix/Asia/Kuching vf107/dxmodules/zoneinfo/posix/Asia/Kuwait vf107/dxmodules/zoneinfo/posix/Asia/Macao vf107/dxmodules/zoneinfo/posix/Asia/Macau vf107/dxmodules/zoneinfo/posix/Asia/Magadan vf107/dxmodules/zoneinfo/posix/Asia/Makassar vf107/dxmodules/zoneinfo/posix/Asia/Manila vf107/dxmodules/zoneinfo/posix/Asia/Muscat vf107/dxmodules/zoneinfo/posix/Asia/Nicosia vf107/dxmodules/zoneinfo/posix/Asia/Novokuznetsk vf107/dxmodules/zoneinfo/posix/Asia/Novosibirsk vf107/dxmodules/zoneinfo/posix/Asia/Omsk vf107/dxmodules/zoneinfo/posix/Asia/Oral vf107/dxmodules/zoneinfo/posix/Asia/Phnom_Penh vf107/dxmodules/zoneinfo/posix/Asia/Pontianak vf107/dxmodules/zoneinfo/posix/Asia/Pyongyang vf107/dxmodules/zoneinfo/posix/Asia/Qatar vf107/dxmodules/zoneinfo/posix/Asia/Qostanay vf107/dxmodules/zoneinfo/posix/Asia/Qyzylorda vf107/dxmodules/zoneinfo/posix/Asia/Rangoon vf107/dxmodules/zoneinfo/posix/Asia/Riyadh vf107/dxmodules/zoneinfo/posix/Asia/Saigon vf107/dxmodules/zoneinfo/posix/Asia/Sakhalin vf107/dxmodules/zoneinfo/posix/Asia/Samarkand vf107/dxmodules/zoneinfo/posix/Asia/Seoul vf107/dxmodules/zoneinfo/posix/Asia/Shanghai vf107/dxmodules/zoneinfo/posix/Asia/Singapore vf107/dxmodules/zoneinfo/posix/Asia/Srednekolymsk vf107/dxmodules/zoneinfo/posix/Asia/Taipei vf107/dxmodules/zoneinfo/posix/Asia/Tashkent vf107/dxmodules/zoneinfo/posix/Asia/Tbilisi vf107/dxmodules/zoneinfo/posix/Asia/Tehran vf107/dxmodules/zoneinfo/posix/Asia/Tel_Aviv vf107/dxmodules/zoneinfo/posix/Asia/Thimbu vf107/dxmodules/zoneinfo/posix/Asia/Thimphu vf107/dxmodules/zoneinfo/posix/Asia/Tokyo vf107/dxmodules/zoneinfo/posix/Asia/Tomsk vf107/dxmodules/zoneinfo/posix/Asia/Ujung_Pandang vf107/dxmodules/zoneinfo/posix/Asia/Ulaanbaatar vf107/dxmodules/zoneinfo/posix/Asia/Ulan_Bator vf107/dxmodules/zoneinfo/posix/Asia/Urumqi vf107/dxmodules/zoneinfo/posix/Asia/Ust-Nera vf107/dxmodules/zoneinfo/posix/Asia/Vientiane vf107/dxmodules/zoneinfo/posix/Asia/Vladivostok vf107/dxmodules/zoneinfo/posix/Asia/Yakutsk vf107/dxmodules/zoneinfo/posix/Asia/Yangon vf107/dxmodules/zoneinfo/posix/Asia/Yekaterinburg vf107/dxmodules/zoneinfo/posix/Asia/Yerevan vf107/dxmodules/zoneinfo/posix/Atlantic/Azores vf107/dxmodules/zoneinfo/posix/Atlantic/Bermuda vf107/dxmodules/zoneinfo/posix/Atlantic/Canary vf107/dxmodules/zoneinfo/posix/Atlantic/Cape_Verde vf107/dxmodules/zoneinfo/posix/Atlantic/Faeroe vf107/dxmodules/zoneinfo/posix/Atlantic/Faroe vf107/dxmodules/zoneinfo/posix/Atlantic/Jan_Mayen vf107/dxmodules/zoneinfo/posix/Atlantic/Madeira vf107/dxmodules/zoneinfo/posix/Atlantic/Reykjavik vf107/dxmodules/zoneinfo/posix/Atlantic/South_Georgia vf107/dxmodules/zoneinfo/posix/Atlantic/St_Helena vf107/dxmodules/zoneinfo/posix/Atlantic/Stanley vf107/dxmodules/zoneinfo/posix/Australia/ACT vf107/dxmodules/zoneinfo/posix/Australia/Adelaide vf107/dxmodules/zoneinfo/posix/Australia/Brisbane vf107/dxmodules/zoneinfo/posix/Australia/Broken_Hill vf107/dxmodules/zoneinfo/posix/Australia/Canberra vf107/dxmodules/zoneinfo/posix/Australia/Currie vf107/dxmodules/zoneinfo/posix/Australia/Darwin vf107/dxmodules/zoneinfo/posix/Australia/Eucla vf107/dxmodules/zoneinfo/posix/Australia/Hobart vf107/dxmodules/zoneinfo/posix/Australia/LHI vf107/dxmodules/zoneinfo/posix/Australia/Lindeman vf107/dxmodules/zoneinfo/posix/Australia/Lord_Howe vf107/dxmodules/zoneinfo/posix/Australia/Melbourne vf107/dxmodules/zoneinfo/posix/Australia/NSW vf107/dxmodules/zoneinfo/posix/Australia/North vf107/dxmodules/zoneinfo/posix/Australia/Perth vf107/dxmodules/zoneinfo/posix/Australia/Queensland vf107/dxmodules/zoneinfo/posix/Australia/South vf107/dxmodules/zoneinfo/posix/Australia/Sydney vf107/dxmodules/zoneinfo/posix/Australia/Tasmania vf107/dxmodules/zoneinfo/posix/Australia/Victoria vf107/dxmodules/zoneinfo/posix/Australia/West vf107/dxmodules/zoneinfo/posix/Australia/Yancowinna vf107/dxmodules/zoneinfo/posix/Brazil/Acre vf107/dxmodules/zoneinfo/posix/Brazil/DeNoronha vf107/dxmodules/zoneinfo/posix/Brazil/East vf107/dxmodules/zoneinfo/posix/Brazil/West vf107/dxmodules/zoneinfo/posix/CET vf107/dxmodules/zoneinfo/posix/CST6CDT vf107/dxmodules/zoneinfo/posix/Canada/Atlantic vf107/dxmodules/zoneinfo/posix/Canada/Central vf107/dxmodules/zoneinfo/posix/Canada/Eastern vf107/dxmodules/zoneinfo/posix/Canada/Mountain vf107/dxmodules/zoneinfo/posix/Canada/Newfoundland vf107/dxmodules/zoneinfo/posix/Canada/Pacific vf107/dxmodules/zoneinfo/posix/Canada/Saskatchewan vf107/dxmodules/zoneinfo/posix/Canada/Yukon vf107/dxmodules/zoneinfo/posix/Chile/Continental vf107/dxmodules/zoneinfo/posix/Chile/EasterIsland vf107/dxmodules/zoneinfo/posix/Cuba vf107/dxmodules/zoneinfo/posix/EET vf107/dxmodules/zoneinfo/posix/EST vf107/dxmodules/zoneinfo/posix/EST5EDT vf107/dxmodules/zoneinfo/posix/Egypt vf107/dxmodules/zoneinfo/posix/Eire vf107/dxmodules/zoneinfo/posix/Etc/GMT vf107/dxmodules/zoneinfo/posix/Etc/GMT+0 vf107/dxmodules/zoneinfo/posix/Etc/GMT+1 vf107/dxmodules/zoneinfo/posix/Etc/GMT+10 vf107/dxmodules/zoneinfo/posix/Etc/GMT+11 vf107/dxmodules/zoneinfo/posix/Etc/GMT+12 vf107/dxmodules/zoneinfo/posix/Etc/GMT+2 vf107/dxmodules/zoneinfo/posix/Etc/GMT+3 vf107/dxmodules/zoneinfo/posix/Etc/GMT+4 vf107/dxmodules/zoneinfo/posix/Etc/GMT+5 vf107/dxmodules/zoneinfo/posix/Etc/GMT+6 vf107/dxmodules/zoneinfo/posix/Etc/GMT+7 vf107/dxmodules/zoneinfo/posix/Etc/GMT+8 vf107/dxmodules/zoneinfo/posix/Etc/GMT+9 vf107/dxmodules/zoneinfo/posix/Etc/GMT-0 vf107/dxmodules/zoneinfo/posix/Etc/GMT-1 vf107/dxmodules/zoneinfo/posix/Etc/GMT-10 vf107/dxmodules/zoneinfo/posix/Etc/GMT-11 vf107/dxmodules/zoneinfo/posix/Etc/GMT-12 vf107/dxmodules/zoneinfo/posix/Etc/GMT-13 vf107/dxmodules/zoneinfo/posix/Etc/GMT-14 vf107/dxmodules/zoneinfo/posix/Etc/GMT-2 vf107/dxmodules/zoneinfo/posix/Etc/GMT-3 vf107/dxmodules/zoneinfo/posix/Etc/GMT-4 vf107/dxmodules/zoneinfo/posix/Etc/GMT-5 vf107/dxmodules/zoneinfo/posix/Etc/GMT-6 vf107/dxmodules/zoneinfo/posix/Etc/GMT-7 vf107/dxmodules/zoneinfo/posix/Etc/GMT-8 vf107/dxmodules/zoneinfo/posix/Etc/GMT-9 vf107/dxmodules/zoneinfo/posix/Etc/GMT0 vf107/dxmodules/zoneinfo/posix/Etc/Greenwich vf107/dxmodules/zoneinfo/posix/Etc/UCT vf107/dxmodules/zoneinfo/posix/Etc/UTC vf107/dxmodules/zoneinfo/posix/Etc/Universal vf107/dxmodules/zoneinfo/posix/Etc/Zulu vf107/dxmodules/zoneinfo/posix/Europe/Amsterdam vf107/dxmodules/zoneinfo/posix/Europe/Andorra vf107/dxmodules/zoneinfo/posix/Europe/Astrakhan vf107/dxmodules/zoneinfo/posix/Europe/Athens vf107/dxmodules/zoneinfo/posix/Europe/Belfast vf107/dxmodules/zoneinfo/posix/Europe/Belgrade vf107/dxmodules/zoneinfo/posix/Europe/Berlin vf107/dxmodules/zoneinfo/posix/Europe/Bratislava vf107/dxmodules/zoneinfo/posix/Europe/Brussels vf107/dxmodules/zoneinfo/posix/Europe/Bucharest vf107/dxmodules/zoneinfo/posix/Europe/Budapest vf107/dxmodules/zoneinfo/posix/Europe/Busingen vf107/dxmodules/zoneinfo/posix/Europe/Chisinau vf107/dxmodules/zoneinfo/posix/Europe/Copenhagen vf107/dxmodules/zoneinfo/posix/Europe/Dublin vf107/dxmodules/zoneinfo/posix/Europe/Gibraltar vf107/dxmodules/zoneinfo/posix/Europe/Guernsey vf107/dxmodules/zoneinfo/posix/Europe/Helsinki vf107/dxmodules/zoneinfo/posix/Europe/Isle_of_Man vf107/dxmodules/zoneinfo/posix/Europe/Istanbul vf107/dxmodules/zoneinfo/posix/Europe/Jersey vf107/dxmodules/zoneinfo/posix/Europe/Kaliningrad vf107/dxmodules/zoneinfo/posix/Europe/Kiev vf107/dxmodules/zoneinfo/posix/Europe/Kirov vf107/dxmodules/zoneinfo/posix/Europe/Lisbon vf107/dxmodules/zoneinfo/posix/Europe/Ljubljana vf107/dxmodules/zoneinfo/posix/Europe/London vf107/dxmodules/zoneinfo/posix/Europe/Luxembourg vf107/dxmodules/zoneinfo/posix/Europe/Madrid vf107/dxmodules/zoneinfo/posix/Europe/Malta vf107/dxmodules/zoneinfo/posix/Europe/Mariehamn vf107/dxmodules/zoneinfo/posix/Europe/Minsk vf107/dxmodules/zoneinfo/posix/Europe/Monaco vf107/dxmodules/zoneinfo/posix/Europe/Moscow vf107/dxmodules/zoneinfo/posix/Europe/Nicosia vf107/dxmodules/zoneinfo/posix/Europe/Oslo vf107/dxmodules/zoneinfo/posix/Europe/Paris vf107/dxmodules/zoneinfo/posix/Europe/Podgorica vf107/dxmodules/zoneinfo/posix/Europe/Prague vf107/dxmodules/zoneinfo/posix/Europe/Riga vf107/dxmodules/zoneinfo/posix/Europe/Rome vf107/dxmodules/zoneinfo/posix/Europe/Samara vf107/dxmodules/zoneinfo/posix/Europe/San_Marino vf107/dxmodules/zoneinfo/posix/Europe/Sarajevo vf107/dxmodules/zoneinfo/posix/Europe/Saratov vf107/dxmodules/zoneinfo/posix/Europe/Simferopol vf107/dxmodules/zoneinfo/posix/Europe/Skopje vf107/dxmodules/zoneinfo/posix/Europe/Sofia vf107/dxmodules/zoneinfo/posix/Europe/Stockholm vf107/dxmodules/zoneinfo/posix/Europe/Tallinn vf107/dxmodules/zoneinfo/posix/Europe/Tirane vf107/dxmodules/zoneinfo/posix/Europe/Tiraspol vf107/dxmodules/zoneinfo/posix/Europe/Ulyanovsk vf107/dxmodules/zoneinfo/posix/Europe/Uzhgorod vf107/dxmodules/zoneinfo/posix/Europe/Vaduz vf107/dxmodules/zoneinfo/posix/Europe/Vatican vf107/dxmodules/zoneinfo/posix/Europe/Vienna vf107/dxmodules/zoneinfo/posix/Europe/Vilnius vf107/dxmodules/zoneinfo/posix/Europe/Volgograd vf107/dxmodules/zoneinfo/posix/Europe/Warsaw vf107/dxmodules/zoneinfo/posix/Europe/Zagreb vf107/dxmodules/zoneinfo/posix/Europe/Zaporozhye vf107/dxmodules/zoneinfo/posix/Europe/Zurich vf107/dxmodules/zoneinfo/posix/GB vf107/dxmodules/zoneinfo/posix/GB-Eire vf107/dxmodules/zoneinfo/posix/GMT vf107/dxmodules/zoneinfo/posix/GMT+0 vf107/dxmodules/zoneinfo/posix/GMT-0 vf107/dxmodules/zoneinfo/posix/GMT0 vf107/dxmodules/zoneinfo/posix/Greenwich vf107/dxmodules/zoneinfo/posix/HST vf107/dxmodules/zoneinfo/posix/Hongkong vf107/dxmodules/zoneinfo/posix/Iceland vf107/dxmodules/zoneinfo/posix/Indian/Antananarivo vf107/dxmodules/zoneinfo/posix/Indian/Chagos vf107/dxmodules/zoneinfo/posix/Indian/Christmas vf107/dxmodules/zoneinfo/posix/Indian/Cocos vf107/dxmodules/zoneinfo/posix/Indian/Comoro vf107/dxmodules/zoneinfo/posix/Indian/Kerguelen vf107/dxmodules/zoneinfo/posix/Indian/Mahe vf107/dxmodules/zoneinfo/posix/Indian/Maldives vf107/dxmodules/zoneinfo/posix/Indian/Mauritius vf107/dxmodules/zoneinfo/posix/Indian/Mayotte vf107/dxmodules/zoneinfo/posix/Indian/Reunion vf107/dxmodules/zoneinfo/posix/Iran vf107/dxmodules/zoneinfo/posix/Israel vf107/dxmodules/zoneinfo/posix/Jamaica vf107/dxmodules/zoneinfo/posix/Japan vf107/dxmodules/zoneinfo/posix/Kwajalein vf107/dxmodules/zoneinfo/posix/Libya vf107/dxmodules/zoneinfo/posix/MET vf107/dxmodules/zoneinfo/posix/MST vf107/dxmodules/zoneinfo/posix/MST7MDT vf107/dxmodules/zoneinfo/posix/Mexico/BajaNorte vf107/dxmodules/zoneinfo/posix/Mexico/BajaSur vf107/dxmodules/zoneinfo/posix/Mexico/General vf107/dxmodules/zoneinfo/posix/NZ vf107/dxmodules/zoneinfo/posix/NZ-CHAT vf107/dxmodules/zoneinfo/posix/Navajo vf107/dxmodules/zoneinfo/posix/PRC vf107/dxmodules/zoneinfo/posix/PST8PDT vf107/dxmodules/zoneinfo/posix/Pacific/Apia vf107/dxmodules/zoneinfo/posix/Pacific/Auckland vf107/dxmodules/zoneinfo/posix/Pacific/Bougainville vf107/dxmodules/zoneinfo/posix/Pacific/Chatham vf107/dxmodules/zoneinfo/posix/Pacific/Chuuk vf107/dxmodules/zoneinfo/posix/Pacific/Easter vf107/dxmodules/zoneinfo/posix/Pacific/Efate vf107/dxmodules/zoneinfo/posix/Pacific/Enderbury vf107/dxmodules/zoneinfo/posix/Pacific/Fakaofo vf107/dxmodules/zoneinfo/posix/Pacific/Fiji vf107/dxmodules/zoneinfo/posix/Pacific/Funafuti vf107/dxmodules/zoneinfo/posix/Pacific/Galapagos vf107/dxmodules/zoneinfo/posix/Pacific/Gambier vf107/dxmodules/zoneinfo/posix/Pacific/Guadalcanal vf107/dxmodules/zoneinfo/posix/Pacific/Guam vf107/dxmodules/zoneinfo/posix/Pacific/Honolulu vf107/dxmodules/zoneinfo/posix/Pacific/Johnston vf107/dxmodules/zoneinfo/posix/Pacific/Kiritimati vf107/dxmodules/zoneinfo/posix/Pacific/Kosrae vf107/dxmodules/zoneinfo/posix/Pacific/Kwajalein vf107/dxmodules/zoneinfo/posix/Pacific/Majuro vf107/dxmodules/zoneinfo/posix/Pacific/Marquesas vf107/dxmodules/zoneinfo/posix/Pacific/Midway vf107/dxmodules/zoneinfo/posix/Pacific/Nauru vf107/dxmodules/zoneinfo/posix/Pacific/Niue vf107/dxmodules/zoneinfo/posix/Pacific/Norfolk vf107/dxmodules/zoneinfo/posix/Pacific/Noumea vf107/dxmodules/zoneinfo/posix/Pacific/Pago_Pago vf107/dxmodules/zoneinfo/posix/Pacific/Palau vf107/dxmodules/zoneinfo/posix/Pacific/Pitcairn vf107/dxmodules/zoneinfo/posix/Pacific/Pohnpei vf107/dxmodules/zoneinfo/posix/Pacific/Ponape vf107/dxmodules/zoneinfo/posix/Pacific/Port_Moresby vf107/dxmodules/zoneinfo/posix/Pacific/Rarotonga vf107/dxmodules/zoneinfo/posix/Pacific/Saipan vf107/dxmodules/zoneinfo/posix/Pacific/Samoa vf107/dxmodules/zoneinfo/posix/Pacific/Tahiti vf107/dxmodules/zoneinfo/posix/Pacific/Tarawa vf107/dxmodules/zoneinfo/posix/Pacific/Tongatapu vf107/dxmodules/zoneinfo/posix/Pacific/Truk vf107/dxmodules/zoneinfo/posix/Pacific/Wake vf107/dxmodules/zoneinfo/posix/Pacific/Wallis vf107/dxmodules/zoneinfo/posix/Pacific/Yap vf107/dxmodules/zoneinfo/posix/Poland vf107/dxmodules/zoneinfo/posix/Portugal vf107/dxmodules/zoneinfo/posix/ROC vf107/dxmodules/zoneinfo/posix/ROK vf107/dxmodules/zoneinfo/posix/Singapore vf107/dxmodules/zoneinfo/posix/Turkey vf107/dxmodules/zoneinfo/posix/UCT vf107/dxmodules/zoneinfo/posix/US/Alaska vf107/dxmodules/zoneinfo/posix/US/Aleutian vf107/dxmodules/zoneinfo/posix/US/Arizona vf107/dxmodules/zoneinfo/posix/US/Central vf107/dxmodules/zoneinfo/posix/US/East-Indiana vf107/dxmodules/zoneinfo/posix/US/Eastern vf107/dxmodules/zoneinfo/posix/US/Hawaii vf107/dxmodules/zoneinfo/posix/US/Indiana-Starke vf107/dxmodules/zoneinfo/posix/US/Michigan vf107/dxmodules/zoneinfo/posix/US/Mountain vf107/dxmodules/zoneinfo/posix/US/Pacific vf107/dxmodules/zoneinfo/posix/US/Samoa vf107/dxmodules/zoneinfo/posix/UTC vf107/dxmodules/zoneinfo/posix/Universal vf107/dxmodules/zoneinfo/posix/W-SU vf107/dxmodules/zoneinfo/posix/WET vf107/dxmodules/zoneinfo/posix/Zulu vf107/dxmodules/zoneinfo/posixrules vf107/dxmodules/zoneinfo/right/Africa/Abidjan vf107/dxmodules/zoneinfo/right/Africa/Accra vf107/dxmodules/zoneinfo/right/Africa/Addis_Ababa vf107/dxmodules/zoneinfo/right/Africa/Algiers vf107/dxmodules/zoneinfo/right/Africa/Asmara vf107/dxmodules/zoneinfo/right/Africa/Asmera vf107/dxmodules/zoneinfo/right/Africa/Bamako vf107/dxmodules/zoneinfo/right/Africa/Bangui vf107/dxmodules/zoneinfo/right/Africa/Banjul vf107/dxmodules/zoneinfo/right/Africa/Bissau vf107/dxmodules/zoneinfo/right/Africa/Blantyre vf107/dxmodules/zoneinfo/right/Africa/Brazzaville vf107/dxmodules/zoneinfo/right/Africa/Bujumbura vf107/dxmodules/zoneinfo/right/Africa/Cairo vf107/dxmodules/zoneinfo/right/Africa/Casablanca vf107/dxmodules/zoneinfo/right/Africa/Ceuta vf107/dxmodules/zoneinfo/right/Africa/Conakry vf107/dxmodules/zoneinfo/right/Africa/Dakar vf107/dxmodules/zoneinfo/right/Africa/Dar_es_Salaam vf107/dxmodules/zoneinfo/right/Africa/Djibouti vf107/dxmodules/zoneinfo/right/Africa/Douala vf107/dxmodules/zoneinfo/right/Africa/El_Aaiun vf107/dxmodules/zoneinfo/right/Africa/Freetown vf107/dxmodules/zoneinfo/right/Africa/Gaborone vf107/dxmodules/zoneinfo/right/Africa/Harare vf107/dxmodules/zoneinfo/right/Africa/Johannesburg vf107/dxmodules/zoneinfo/right/Africa/Juba vf107/dxmodules/zoneinfo/right/Africa/Kampala vf107/dxmodules/zoneinfo/right/Africa/Khartoum vf107/dxmodules/zoneinfo/right/Africa/Kigali vf107/dxmodules/zoneinfo/right/Africa/Kinshasa vf107/dxmodules/zoneinfo/right/Africa/Lagos vf107/dxmodules/zoneinfo/right/Africa/Libreville vf107/dxmodules/zoneinfo/right/Africa/Lome vf107/dxmodules/zoneinfo/right/Africa/Luanda vf107/dxmodules/zoneinfo/right/Africa/Lubumbashi vf107/dxmodules/zoneinfo/right/Africa/Lusaka vf107/dxmodules/zoneinfo/right/Africa/Malabo vf107/dxmodules/zoneinfo/right/Africa/Maputo vf107/dxmodules/zoneinfo/right/Africa/Maseru vf107/dxmodules/zoneinfo/right/Africa/Mbabane vf107/dxmodules/zoneinfo/right/Africa/Mogadishu vf107/dxmodules/zoneinfo/right/Africa/Monrovia vf107/dxmodules/zoneinfo/right/Africa/Nairobi vf107/dxmodules/zoneinfo/right/Africa/Ndjamena vf107/dxmodules/zoneinfo/right/Africa/Niamey vf107/dxmodules/zoneinfo/right/Africa/Nouakchott vf107/dxmodules/zoneinfo/right/Africa/Ouagadougou vf107/dxmodules/zoneinfo/right/Africa/Porto-Novo vf107/dxmodules/zoneinfo/right/Africa/Sao_Tome vf107/dxmodules/zoneinfo/right/Africa/Timbuktu vf107/dxmodules/zoneinfo/right/Africa/Tripoli vf107/dxmodules/zoneinfo/right/Africa/Tunis vf107/dxmodules/zoneinfo/right/Africa/Windhoek vf107/dxmodules/zoneinfo/right/America/Adak vf107/dxmodules/zoneinfo/right/America/Anchorage vf107/dxmodules/zoneinfo/right/America/Anguilla vf107/dxmodules/zoneinfo/right/America/Antigua vf107/dxmodules/zoneinfo/right/America/Araguaina vf107/dxmodules/zoneinfo/right/America/Argentina/Buenos_Aires vf107/dxmodules/zoneinfo/right/America/Argentina/Catamarca vf107/dxmodules/zoneinfo/right/America/Argentina/ComodRivadavia vf107/dxmodules/zoneinfo/right/America/Argentina/Cordoba vf107/dxmodules/zoneinfo/right/America/Argentina/Jujuy vf107/dxmodules/zoneinfo/right/America/Argentina/La_Rioja vf107/dxmodules/zoneinfo/right/America/Argentina/Mendoza vf107/dxmodules/zoneinfo/right/America/Argentina/Rio_Gallegos vf107/dxmodules/zoneinfo/right/America/Argentina/Salta vf107/dxmodules/zoneinfo/right/America/Argentina/San_Juan vf107/dxmodules/zoneinfo/right/America/Argentina/San_Luis vf107/dxmodules/zoneinfo/right/America/Argentina/Tucuman vf107/dxmodules/zoneinfo/right/America/Argentina/Ushuaia vf107/dxmodules/zoneinfo/right/America/Aruba vf107/dxmodules/zoneinfo/right/America/Asuncion vf107/dxmodules/zoneinfo/right/America/Atikokan vf107/dxmodules/zoneinfo/right/America/Atka vf107/dxmodules/zoneinfo/right/America/Bahia vf107/dxmodules/zoneinfo/right/America/Bahia_Banderas vf107/dxmodules/zoneinfo/right/America/Barbados vf107/dxmodules/zoneinfo/right/America/Belem vf107/dxmodules/zoneinfo/right/America/Belize vf107/dxmodules/zoneinfo/right/America/Blanc-Sablon vf107/dxmodules/zoneinfo/right/America/Boa_Vista vf107/dxmodules/zoneinfo/right/America/Bogota vf107/dxmodules/zoneinfo/right/America/Boise vf107/dxmodules/zoneinfo/right/America/Buenos_Aires vf107/dxmodules/zoneinfo/right/America/Cambridge_Bay vf107/dxmodules/zoneinfo/right/America/Campo_Grande vf107/dxmodules/zoneinfo/right/America/Cancun vf107/dxmodules/zoneinfo/right/America/Caracas vf107/dxmodules/zoneinfo/right/America/Catamarca vf107/dxmodules/zoneinfo/right/America/Cayenne vf107/dxmodules/zoneinfo/right/America/Cayman vf107/dxmodules/zoneinfo/right/America/Chicago vf107/dxmodules/zoneinfo/right/America/Chihuahua vf107/dxmodules/zoneinfo/right/America/Coral_Harbour vf107/dxmodules/zoneinfo/right/America/Cordoba vf107/dxmodules/zoneinfo/right/America/Costa_Rica vf107/dxmodules/zoneinfo/right/America/Creston vf107/dxmodules/zoneinfo/right/America/Cuiaba vf107/dxmodules/zoneinfo/right/America/Curacao vf107/dxmodules/zoneinfo/right/America/Danmarkshavn vf107/dxmodules/zoneinfo/right/America/Dawson vf107/dxmodules/zoneinfo/right/America/Dawson_Creek vf107/dxmodules/zoneinfo/right/America/Denver vf107/dxmodules/zoneinfo/right/America/Detroit vf107/dxmodules/zoneinfo/right/America/Dominica vf107/dxmodules/zoneinfo/right/America/Edmonton vf107/dxmodules/zoneinfo/right/America/Eirunepe vf107/dxmodules/zoneinfo/right/America/El_Salvador vf107/dxmodules/zoneinfo/right/America/Ensenada vf107/dxmodules/zoneinfo/right/America/Fort_Nelson vf107/dxmodules/zoneinfo/right/America/Fort_Wayne vf107/dxmodules/zoneinfo/right/America/Fortaleza vf107/dxmodules/zoneinfo/right/America/Glace_Bay vf107/dxmodules/zoneinfo/right/America/Godthab vf107/dxmodules/zoneinfo/right/America/Goose_Bay vf107/dxmodules/zoneinfo/right/America/Grand_Turk vf107/dxmodules/zoneinfo/right/America/Grenada vf107/dxmodules/zoneinfo/right/America/Guadeloupe vf107/dxmodules/zoneinfo/right/America/Guatemala vf107/dxmodules/zoneinfo/right/America/Guayaquil vf107/dxmodules/zoneinfo/right/America/Guyana vf107/dxmodules/zoneinfo/right/America/Halifax vf107/dxmodules/zoneinfo/right/America/Havana vf107/dxmodules/zoneinfo/right/America/Hermosillo vf107/dxmodules/zoneinfo/right/America/Indiana/Indianapolis vf107/dxmodules/zoneinfo/right/America/Indiana/Knox vf107/dxmodules/zoneinfo/right/America/Indiana/Marengo vf107/dxmodules/zoneinfo/right/America/Indiana/Petersburg vf107/dxmodules/zoneinfo/right/America/Indiana/Tell_City vf107/dxmodules/zoneinfo/right/America/Indiana/Vevay vf107/dxmodules/zoneinfo/right/America/Indiana/Vincennes vf107/dxmodules/zoneinfo/right/America/Indiana/Winamac vf107/dxmodules/zoneinfo/right/America/Indianapolis vf107/dxmodules/zoneinfo/right/America/Inuvik vf107/dxmodules/zoneinfo/right/America/Iqaluit vf107/dxmodules/zoneinfo/right/America/Jamaica vf107/dxmodules/zoneinfo/right/America/Jujuy vf107/dxmodules/zoneinfo/right/America/Juneau vf107/dxmodules/zoneinfo/right/America/Kentucky/Louisville vf107/dxmodules/zoneinfo/right/America/Kentucky/Monticello vf107/dxmodules/zoneinfo/right/America/Knox_IN vf107/dxmodules/zoneinfo/right/America/Kralendijk vf107/dxmodules/zoneinfo/right/America/La_Paz vf107/dxmodules/zoneinfo/right/America/Lima vf107/dxmodules/zoneinfo/right/America/Los_Angeles vf107/dxmodules/zoneinfo/right/America/Louisville vf107/dxmodules/zoneinfo/right/America/Lower_Princes vf107/dxmodules/zoneinfo/right/America/Maceio vf107/dxmodules/zoneinfo/right/America/Managua vf107/dxmodules/zoneinfo/right/America/Manaus vf107/dxmodules/zoneinfo/right/America/Marigot vf107/dxmodules/zoneinfo/right/America/Martinique vf107/dxmodules/zoneinfo/right/America/Matamoros vf107/dxmodules/zoneinfo/right/America/Mazatlan vf107/dxmodules/zoneinfo/right/America/Mendoza vf107/dxmodules/zoneinfo/right/America/Menominee vf107/dxmodules/zoneinfo/right/America/Merida vf107/dxmodules/zoneinfo/right/America/Metlakatla vf107/dxmodules/zoneinfo/right/America/Mexico_City vf107/dxmodules/zoneinfo/right/America/Miquelon vf107/dxmodules/zoneinfo/right/America/Moncton vf107/dxmodules/zoneinfo/right/America/Monterrey vf107/dxmodules/zoneinfo/right/America/Montevideo vf107/dxmodules/zoneinfo/right/America/Montreal vf107/dxmodules/zoneinfo/right/America/Montserrat vf107/dxmodules/zoneinfo/right/America/Nassau vf107/dxmodules/zoneinfo/right/America/New_York vf107/dxmodules/zoneinfo/right/America/Nipigon vf107/dxmodules/zoneinfo/right/America/Nome vf107/dxmodules/zoneinfo/right/America/Noronha vf107/dxmodules/zoneinfo/right/America/North_Dakota/Beulah vf107/dxmodules/zoneinfo/right/America/North_Dakota/Center vf107/dxmodules/zoneinfo/right/America/North_Dakota/New_Salem vf107/dxmodules/zoneinfo/right/America/Nuuk vf107/dxmodules/zoneinfo/right/America/Ojinaga vf107/dxmodules/zoneinfo/right/America/Panama vf107/dxmodules/zoneinfo/right/America/Pangnirtung vf107/dxmodules/zoneinfo/right/America/Paramaribo vf107/dxmodules/zoneinfo/right/America/Phoenix vf107/dxmodules/zoneinfo/right/America/Port-au-Prince vf107/dxmodules/zoneinfo/right/America/Port_of_Spain vf107/dxmodules/zoneinfo/right/America/Porto_Acre vf107/dxmodules/zoneinfo/right/America/Porto_Velho vf107/dxmodules/zoneinfo/right/America/Puerto_Rico vf107/dxmodules/zoneinfo/right/America/Punta_Arenas vf107/dxmodules/zoneinfo/right/America/Rainy_River vf107/dxmodules/zoneinfo/right/America/Rankin_Inlet vf107/dxmodules/zoneinfo/right/America/Recife vf107/dxmodules/zoneinfo/right/America/Regina vf107/dxmodules/zoneinfo/right/America/Resolute vf107/dxmodules/zoneinfo/right/America/Rio_Branco vf107/dxmodules/zoneinfo/right/America/Rosario vf107/dxmodules/zoneinfo/right/America/Santa_Isabel vf107/dxmodules/zoneinfo/right/America/Santarem vf107/dxmodules/zoneinfo/right/America/Santiago vf107/dxmodules/zoneinfo/right/America/Santo_Domingo vf107/dxmodules/zoneinfo/right/America/Sao_Paulo vf107/dxmodules/zoneinfo/right/America/Scoresbysund vf107/dxmodules/zoneinfo/right/America/Shiprock vf107/dxmodules/zoneinfo/right/America/Sitka vf107/dxmodules/zoneinfo/right/America/St_Barthelemy vf107/dxmodules/zoneinfo/right/America/St_Johns vf107/dxmodules/zoneinfo/right/America/St_Kitts vf107/dxmodules/zoneinfo/right/America/St_Lucia vf107/dxmodules/zoneinfo/right/America/St_Thomas vf107/dxmodules/zoneinfo/right/America/St_Vincent vf107/dxmodules/zoneinfo/right/America/Swift_Current vf107/dxmodules/zoneinfo/right/America/Tegucigalpa vf107/dxmodules/zoneinfo/right/America/Thule vf107/dxmodules/zoneinfo/right/America/Thunder_Bay vf107/dxmodules/zoneinfo/right/America/Tijuana vf107/dxmodules/zoneinfo/right/America/Toronto vf107/dxmodules/zoneinfo/right/America/Tortola vf107/dxmodules/zoneinfo/right/America/Vancouver vf107/dxmodules/zoneinfo/right/America/Virgin vf107/dxmodules/zoneinfo/right/America/Whitehorse vf107/dxmodules/zoneinfo/right/America/Winnipeg vf107/dxmodules/zoneinfo/right/America/Yakutat vf107/dxmodules/zoneinfo/right/America/Yellowknife vf107/dxmodules/zoneinfo/right/Antarctica/Casey vf107/dxmodules/zoneinfo/right/Antarctica/Davis vf107/dxmodules/zoneinfo/right/Antarctica/DumontDUrville vf107/dxmodules/zoneinfo/right/Antarctica/Macquarie vf107/dxmodules/zoneinfo/right/Antarctica/Mawson vf107/dxmodules/zoneinfo/right/Antarctica/McMurdo vf107/dxmodules/zoneinfo/right/Antarctica/Palmer vf107/dxmodules/zoneinfo/right/Antarctica/Rothera vf107/dxmodules/zoneinfo/right/Antarctica/South_Pole vf107/dxmodules/zoneinfo/right/Antarctica/Syowa vf107/dxmodules/zoneinfo/right/Antarctica/Troll vf107/dxmodules/zoneinfo/right/Antarctica/Vostok vf107/dxmodules/zoneinfo/right/Arctic/Longyearbyen vf107/dxmodules/zoneinfo/right/Asia/Aden vf107/dxmodules/zoneinfo/right/Asia/Almaty vf107/dxmodules/zoneinfo/right/Asia/Amman vf107/dxmodules/zoneinfo/right/Asia/Anadyr vf107/dxmodules/zoneinfo/right/Asia/Aqtau vf107/dxmodules/zoneinfo/right/Asia/Aqtobe vf107/dxmodules/zoneinfo/right/Asia/Ashgabat vf107/dxmodules/zoneinfo/right/Asia/Ashkhabad vf107/dxmodules/zoneinfo/right/Asia/Atyrau vf107/dxmodules/zoneinfo/right/Asia/Baghdad vf107/dxmodules/zoneinfo/right/Asia/Bahrain vf107/dxmodules/zoneinfo/right/Asia/Baku vf107/dxmodules/zoneinfo/right/Asia/Bangkok vf107/dxmodules/zoneinfo/right/Asia/Barnaul vf107/dxmodules/zoneinfo/right/Asia/Beirut vf107/dxmodules/zoneinfo/right/Asia/Bishkek vf107/dxmodules/zoneinfo/right/Asia/Brunei vf107/dxmodules/zoneinfo/right/Asia/Calcutta vf107/dxmodules/zoneinfo/right/Asia/Chita vf107/dxmodules/zoneinfo/right/Asia/Choibalsan vf107/dxmodules/zoneinfo/right/Asia/Chongqing vf107/dxmodules/zoneinfo/right/Asia/Chungking vf107/dxmodules/zoneinfo/right/Asia/Colombo vf107/dxmodules/zoneinfo/right/Asia/Dacca vf107/dxmodules/zoneinfo/right/Asia/Damascus vf107/dxmodules/zoneinfo/right/Asia/Dhaka vf107/dxmodules/zoneinfo/right/Asia/Dili vf107/dxmodules/zoneinfo/right/Asia/Dubai vf107/dxmodules/zoneinfo/right/Asia/Dushanbe vf107/dxmodules/zoneinfo/right/Asia/Famagusta vf107/dxmodules/zoneinfo/right/Asia/Gaza vf107/dxmodules/zoneinfo/right/Asia/Harbin vf107/dxmodules/zoneinfo/right/Asia/Hebron vf107/dxmodules/zoneinfo/right/Asia/Ho_Chi_Minh vf107/dxmodules/zoneinfo/right/Asia/Hong_Kong vf107/dxmodules/zoneinfo/right/Asia/Hovd vf107/dxmodules/zoneinfo/right/Asia/Irkutsk vf107/dxmodules/zoneinfo/right/Asia/Istanbul vf107/dxmodules/zoneinfo/right/Asia/Jakarta vf107/dxmodules/zoneinfo/right/Asia/Jayapura vf107/dxmodules/zoneinfo/right/Asia/Jerusalem vf107/dxmodules/zoneinfo/right/Asia/Kabul vf107/dxmodules/zoneinfo/right/Asia/Kamchatka vf107/dxmodules/zoneinfo/right/Asia/Karachi vf107/dxmodules/zoneinfo/right/Asia/Kashgar vf107/dxmodules/zoneinfo/right/Asia/Kathmandu vf107/dxmodules/zoneinfo/right/Asia/Katmandu vf107/dxmodules/zoneinfo/right/Asia/Khandyga vf107/dxmodules/zoneinfo/right/Asia/Kolkata vf107/dxmodules/zoneinfo/right/Asia/Krasnoyarsk vf107/dxmodules/zoneinfo/right/Asia/Kuala_Lumpur vf107/dxmodules/zoneinfo/right/Asia/Kuching vf107/dxmodules/zoneinfo/right/Asia/Kuwait vf107/dxmodules/zoneinfo/right/Asia/Macao vf107/dxmodules/zoneinfo/right/Asia/Macau vf107/dxmodules/zoneinfo/right/Asia/Magadan vf107/dxmodules/zoneinfo/right/Asia/Makassar vf107/dxmodules/zoneinfo/right/Asia/Manila vf107/dxmodules/zoneinfo/right/Asia/Muscat vf107/dxmodules/zoneinfo/right/Asia/Nicosia vf107/dxmodules/zoneinfo/right/Asia/Novokuznetsk vf107/dxmodules/zoneinfo/right/Asia/Novosibirsk vf107/dxmodules/zoneinfo/right/Asia/Omsk vf107/dxmodules/zoneinfo/right/Asia/Oral vf107/dxmodules/zoneinfo/right/Asia/Phnom_Penh vf107/dxmodules/zoneinfo/right/Asia/Pontianak vf107/dxmodules/zoneinfo/right/Asia/Pyongyang vf107/dxmodules/zoneinfo/right/Asia/Qatar vf107/dxmodules/zoneinfo/right/Asia/Qostanay vf107/dxmodules/zoneinfo/right/Asia/Qyzylorda vf107/dxmodules/zoneinfo/right/Asia/Rangoon vf107/dxmodules/zoneinfo/right/Asia/Riyadh vf107/dxmodules/zoneinfo/right/Asia/Saigon vf107/dxmodules/zoneinfo/right/Asia/Sakhalin vf107/dxmodules/zoneinfo/right/Asia/Samarkand vf107/dxmodules/zoneinfo/right/Asia/Seoul vf107/dxmodules/zoneinfo/right/Asia/Shanghai vf107/dxmodules/zoneinfo/right/Asia/Singapore vf107/dxmodules/zoneinfo/right/Asia/Srednekolymsk vf107/dxmodules/zoneinfo/right/Asia/Taipei vf107/dxmodules/zoneinfo/right/Asia/Tashkent vf107/dxmodules/zoneinfo/right/Asia/Tbilisi vf107/dxmodules/zoneinfo/right/Asia/Tehran vf107/dxmodules/zoneinfo/right/Asia/Tel_Aviv vf107/dxmodules/zoneinfo/right/Asia/Thimbu vf107/dxmodules/zoneinfo/right/Asia/Thimphu vf107/dxmodules/zoneinfo/right/Asia/Tokyo vf107/dxmodules/zoneinfo/right/Asia/Tomsk vf107/dxmodules/zoneinfo/right/Asia/Ujung_Pandang vf107/dxmodules/zoneinfo/right/Asia/Ulaanbaatar vf107/dxmodules/zoneinfo/right/Asia/Ulan_Bator vf107/dxmodules/zoneinfo/right/Asia/Urumqi vf107/dxmodules/zoneinfo/right/Asia/Ust-Nera vf107/dxmodules/zoneinfo/right/Asia/Vientiane vf107/dxmodules/zoneinfo/right/Asia/Vladivostok vf107/dxmodules/zoneinfo/right/Asia/Yakutsk vf107/dxmodules/zoneinfo/right/Asia/Yangon vf107/dxmodules/zoneinfo/right/Asia/Yekaterinburg vf107/dxmodules/zoneinfo/right/Asia/Yerevan vf107/dxmodules/zoneinfo/right/Atlantic/Azores vf107/dxmodules/zoneinfo/right/Atlantic/Bermuda vf107/dxmodules/zoneinfo/right/Atlantic/Canary vf107/dxmodules/zoneinfo/right/Atlantic/Cape_Verde vf107/dxmodules/zoneinfo/right/Atlantic/Faeroe vf107/dxmodules/zoneinfo/right/Atlantic/Faroe vf107/dxmodules/zoneinfo/right/Atlantic/Jan_Mayen vf107/dxmodules/zoneinfo/right/Atlantic/Madeira vf107/dxmodules/zoneinfo/right/Atlantic/Reykjavik vf107/dxmodules/zoneinfo/right/Atlantic/South_Georgia vf107/dxmodules/zoneinfo/right/Atlantic/St_Helena vf107/dxmodules/zoneinfo/right/Atlantic/Stanley vf107/dxmodules/zoneinfo/right/Australia/ACT vf107/dxmodules/zoneinfo/right/Australia/Adelaide vf107/dxmodules/zoneinfo/right/Australia/Brisbane vf107/dxmodules/zoneinfo/right/Australia/Broken_Hill vf107/dxmodules/zoneinfo/right/Australia/Canberra vf107/dxmodules/zoneinfo/right/Australia/Currie vf107/dxmodules/zoneinfo/right/Australia/Darwin vf107/dxmodules/zoneinfo/right/Australia/Eucla vf107/dxmodules/zoneinfo/right/Australia/Hobart vf107/dxmodules/zoneinfo/right/Australia/LHI vf107/dxmodules/zoneinfo/right/Australia/Lindeman vf107/dxmodules/zoneinfo/right/Australia/Lord_Howe vf107/dxmodules/zoneinfo/right/Australia/Melbourne vf107/dxmodules/zoneinfo/right/Australia/NSW vf107/dxmodules/zoneinfo/right/Australia/North vf107/dxmodules/zoneinfo/right/Australia/Perth vf107/dxmodules/zoneinfo/right/Australia/Queensland vf107/dxmodules/zoneinfo/right/Australia/South vf107/dxmodules/zoneinfo/right/Australia/Sydney vf107/dxmodules/zoneinfo/right/Australia/Tasmania vf107/dxmodules/zoneinfo/right/Australia/Victoria vf107/dxmodules/zoneinfo/right/Australia/West vf107/dxmodules/zoneinfo/right/Australia/Yancowinna vf107/dxmodules/zoneinfo/right/Brazil/Acre vf107/dxmodules/zoneinfo/right/Brazil/DeNoronha vf107/dxmodules/zoneinfo/right/Brazil/East vf107/dxmodules/zoneinfo/right/Brazil/West vf107/dxmodules/zoneinfo/right/CET vf107/dxmodules/zoneinfo/right/CST6CDT vf107/dxmodules/zoneinfo/right/Canada/Atlantic vf107/dxmodules/zoneinfo/right/Canada/Central vf107/dxmodules/zoneinfo/right/Canada/Eastern vf107/dxmodules/zoneinfo/right/Canada/Mountain vf107/dxmodules/zoneinfo/right/Canada/Newfoundland vf107/dxmodules/zoneinfo/right/Canada/Pacific vf107/dxmodules/zoneinfo/right/Canada/Saskatchewan vf107/dxmodules/zoneinfo/right/Canada/Yukon vf107/dxmodules/zoneinfo/right/Chile/Continental vf107/dxmodules/zoneinfo/right/Chile/EasterIsland vf107/dxmodules/zoneinfo/right/Cuba vf107/dxmodules/zoneinfo/right/EET vf107/dxmodules/zoneinfo/right/EST vf107/dxmodules/zoneinfo/right/EST5EDT vf107/dxmodules/zoneinfo/right/Egypt vf107/dxmodules/zoneinfo/right/Eire vf107/dxmodules/zoneinfo/right/Etc/GMT vf107/dxmodules/zoneinfo/right/Etc/GMT+0 vf107/dxmodules/zoneinfo/right/Etc/GMT+1 vf107/dxmodules/zoneinfo/right/Etc/GMT+10 vf107/dxmodules/zoneinfo/right/Etc/GMT+11 vf107/dxmodules/zoneinfo/right/Etc/GMT+12 vf107/dxmodules/zoneinfo/right/Etc/GMT+2 vf107/dxmodules/zoneinfo/right/Etc/GMT+3 vf107/dxmodules/zoneinfo/right/Etc/GMT+4 vf107/dxmodules/zoneinfo/right/Etc/GMT+5 vf107/dxmodules/zoneinfo/right/Etc/GMT+6 vf107/dxmodules/zoneinfo/right/Etc/GMT+7 vf107/dxmodules/zoneinfo/right/Etc/GMT+8 vf107/dxmodules/zoneinfo/right/Etc/GMT+9 vf107/dxmodules/zoneinfo/right/Etc/GMT-0 vf107/dxmodules/zoneinfo/right/Etc/GMT-1 vf107/dxmodules/zoneinfo/right/Etc/GMT-10 vf107/dxmodules/zoneinfo/right/Etc/GMT-11 vf107/dxmodules/zoneinfo/right/Etc/GMT-12 vf107/dxmodules/zoneinfo/right/Etc/GMT-13 vf107/dxmodules/zoneinfo/right/Etc/GMT-14 vf107/dxmodules/zoneinfo/right/Etc/GMT-2 vf107/dxmodules/zoneinfo/right/Etc/GMT-3 vf107/dxmodules/zoneinfo/right/Etc/GMT-4 vf107/dxmodules/zoneinfo/right/Etc/GMT-5 vf107/dxmodules/zoneinfo/right/Etc/GMT-6 vf107/dxmodules/zoneinfo/right/Etc/GMT-7 vf107/dxmodules/zoneinfo/right/Etc/GMT-8 vf107/dxmodules/zoneinfo/right/Etc/GMT-9 vf107/dxmodules/zoneinfo/right/Etc/GMT0 vf107/dxmodules/zoneinfo/right/Etc/Greenwich vf107/dxmodules/zoneinfo/right/Etc/UCT vf107/dxmodules/zoneinfo/right/Etc/UTC vf107/dxmodules/zoneinfo/right/Etc/Universal vf107/dxmodules/zoneinfo/right/Etc/Zulu vf107/dxmodules/zoneinfo/right/Europe/Amsterdam vf107/dxmodules/zoneinfo/right/Europe/Andorra vf107/dxmodules/zoneinfo/right/Europe/Astrakhan vf107/dxmodules/zoneinfo/right/Europe/Athens vf107/dxmodules/zoneinfo/right/Europe/Belfast vf107/dxmodules/zoneinfo/right/Europe/Belgrade vf107/dxmodules/zoneinfo/right/Europe/Berlin vf107/dxmodules/zoneinfo/right/Europe/Bratislava vf107/dxmodules/zoneinfo/right/Europe/Brussels vf107/dxmodules/zoneinfo/right/Europe/Bucharest vf107/dxmodules/zoneinfo/right/Europe/Budapest vf107/dxmodules/zoneinfo/right/Europe/Busingen vf107/dxmodules/zoneinfo/right/Europe/Chisinau vf107/dxmodules/zoneinfo/right/Europe/Copenhagen vf107/dxmodules/zoneinfo/right/Europe/Dublin vf107/dxmodules/zoneinfo/right/Europe/Gibraltar vf107/dxmodules/zoneinfo/right/Europe/Guernsey vf107/dxmodules/zoneinfo/right/Europe/Helsinki vf107/dxmodules/zoneinfo/right/Europe/Isle_of_Man vf107/dxmodules/zoneinfo/right/Europe/Istanbul vf107/dxmodules/zoneinfo/right/Europe/Jersey vf107/dxmodules/zoneinfo/right/Europe/Kaliningrad vf107/dxmodules/zoneinfo/right/Europe/Kiev vf107/dxmodules/zoneinfo/right/Europe/Kirov vf107/dxmodules/zoneinfo/right/Europe/Lisbon vf107/dxmodules/zoneinfo/right/Europe/Ljubljana vf107/dxmodules/zoneinfo/right/Europe/London vf107/dxmodules/zoneinfo/right/Europe/Luxembourg vf107/dxmodules/zoneinfo/right/Europe/Madrid vf107/dxmodules/zoneinfo/right/Europe/Malta vf107/dxmodules/zoneinfo/right/Europe/Mariehamn vf107/dxmodules/zoneinfo/right/Europe/Minsk vf107/dxmodules/zoneinfo/right/Europe/Monaco vf107/dxmodules/zoneinfo/right/Europe/Moscow vf107/dxmodules/zoneinfo/right/Europe/Nicosia vf107/dxmodules/zoneinfo/right/Europe/Oslo vf107/dxmodules/zoneinfo/right/Europe/Paris vf107/dxmodules/zoneinfo/right/Europe/Podgorica vf107/dxmodules/zoneinfo/right/Europe/Prague vf107/dxmodules/zoneinfo/right/Europe/Riga vf107/dxmodules/zoneinfo/right/Europe/Rome vf107/dxmodules/zoneinfo/right/Europe/Samara vf107/dxmodules/zoneinfo/right/Europe/San_Marino vf107/dxmodules/zoneinfo/right/Europe/Sarajevo vf107/dxmodules/zoneinfo/right/Europe/Saratov vf107/dxmodules/zoneinfo/right/Europe/Simferopol vf107/dxmodules/zoneinfo/right/Europe/Skopje vf107/dxmodules/zoneinfo/right/Europe/Sofia vf107/dxmodules/zoneinfo/right/Europe/Stockholm vf107/dxmodules/zoneinfo/right/Europe/Tallinn vf107/dxmodules/zoneinfo/right/Europe/Tirane vf107/dxmodules/zoneinfo/right/Europe/Tiraspol vf107/dxmodules/zoneinfo/right/Europe/Ulyanovsk vf107/dxmodules/zoneinfo/right/Europe/Uzhgorod vf107/dxmodules/zoneinfo/right/Europe/Vaduz vf107/dxmodules/zoneinfo/right/Europe/Vatican vf107/dxmodules/zoneinfo/right/Europe/Vienna vf107/dxmodules/zoneinfo/right/Europe/Vilnius vf107/dxmodules/zoneinfo/right/Europe/Volgograd vf107/dxmodules/zoneinfo/right/Europe/Warsaw vf107/dxmodules/zoneinfo/right/Europe/Zagreb vf107/dxmodules/zoneinfo/right/Europe/Zaporozhye vf107/dxmodules/zoneinfo/right/Europe/Zurich vf107/dxmodules/zoneinfo/right/GB vf107/dxmodules/zoneinfo/right/GB-Eire vf107/dxmodules/zoneinfo/right/GMT vf107/dxmodules/zoneinfo/right/GMT+0 vf107/dxmodules/zoneinfo/right/GMT-0 vf107/dxmodules/zoneinfo/right/GMT0 vf107/dxmodules/zoneinfo/right/Greenwich vf107/dxmodules/zoneinfo/right/HST vf107/dxmodules/zoneinfo/right/Hongkong vf107/dxmodules/zoneinfo/right/Iceland vf107/dxmodules/zoneinfo/right/Indian/Antananarivo vf107/dxmodules/zoneinfo/right/Indian/Chagos vf107/dxmodules/zoneinfo/right/Indian/Christmas vf107/dxmodules/zoneinfo/right/Indian/Cocos vf107/dxmodules/zoneinfo/right/Indian/Comoro vf107/dxmodules/zoneinfo/right/Indian/Kerguelen vf107/dxmodules/zoneinfo/right/Indian/Mahe vf107/dxmodules/zoneinfo/right/Indian/Maldives vf107/dxmodules/zoneinfo/right/Indian/Mauritius vf107/dxmodules/zoneinfo/right/Indian/Mayotte vf107/dxmodules/zoneinfo/right/Indian/Reunion vf107/dxmodules/zoneinfo/right/Iran vf107/dxmodules/zoneinfo/right/Israel vf107/dxmodules/zoneinfo/right/Jamaica vf107/dxmodules/zoneinfo/right/Japan vf107/dxmodules/zoneinfo/right/Kwajalein vf107/dxmodules/zoneinfo/right/Libya vf107/dxmodules/zoneinfo/right/MET vf107/dxmodules/zoneinfo/right/MST vf107/dxmodules/zoneinfo/right/MST7MDT vf107/dxmodules/zoneinfo/right/Mexico/BajaNorte vf107/dxmodules/zoneinfo/right/Mexico/BajaSur vf107/dxmodules/zoneinfo/right/Mexico/General vf107/dxmodules/zoneinfo/right/NZ vf107/dxmodules/zoneinfo/right/NZ-CHAT vf107/dxmodules/zoneinfo/right/Navajo vf107/dxmodules/zoneinfo/right/PRC vf107/dxmodules/zoneinfo/right/PST8PDT vf107/dxmodules/zoneinfo/right/Pacific/Apia vf107/dxmodules/zoneinfo/right/Pacific/Auckland vf107/dxmodules/zoneinfo/right/Pacific/Bougainville vf107/dxmodules/zoneinfo/right/Pacific/Chatham vf107/dxmodules/zoneinfo/right/Pacific/Chuuk vf107/dxmodules/zoneinfo/right/Pacific/Easter vf107/dxmodules/zoneinfo/right/Pacific/Efate vf107/dxmodules/zoneinfo/right/Pacific/Enderbury vf107/dxmodules/zoneinfo/right/Pacific/Fakaofo vf107/dxmodules/zoneinfo/right/Pacific/Fiji vf107/dxmodules/zoneinfo/right/Pacific/Funafuti vf107/dxmodules/zoneinfo/right/Pacific/Galapagos vf107/dxmodules/zoneinfo/right/Pacific/Gambier vf107/dxmodules/zoneinfo/right/Pacific/Guadalcanal vf107/dxmodules/zoneinfo/right/Pacific/Guam vf107/dxmodules/zoneinfo/right/Pacific/Honolulu vf107/dxmodules/zoneinfo/right/Pacific/Johnston vf107/dxmodules/zoneinfo/right/Pacific/Kiritimati vf107/dxmodules/zoneinfo/right/Pacific/Kosrae vf107/dxmodules/zoneinfo/right/Pacific/Kwajalein vf107/dxmodules/zoneinfo/right/Pacific/Majuro vf107/dxmodules/zoneinfo/right/Pacific/Marquesas vf107/dxmodules/zoneinfo/right/Pacific/Midway vf107/dxmodules/zoneinfo/right/Pacific/Nauru vf107/dxmodules/zoneinfo/right/Pacific/Niue vf107/dxmodules/zoneinfo/right/Pacific/Norfolk vf107/dxmodules/zoneinfo/right/Pacific/Noumea vf107/dxmodules/zoneinfo/right/Pacific/Pago_Pago vf107/dxmodules/zoneinfo/right/Pacific/Palau vf107/dxmodules/zoneinfo/right/Pacific/Pitcairn vf107/dxmodules/zoneinfo/right/Pacific/Pohnpei vf107/dxmodules/zoneinfo/right/Pacific/Ponape vf107/dxmodules/zoneinfo/right/Pacific/Port_Moresby vf107/dxmodules/zoneinfo/right/Pacific/Rarotonga vf107/dxmodules/zoneinfo/right/Pacific/Saipan vf107/dxmodules/zoneinfo/right/Pacific/Samoa vf107/dxmodules/zoneinfo/right/Pacific/Tahiti vf107/dxmodules/zoneinfo/right/Pacific/Tarawa vf107/dxmodules/zoneinfo/right/Pacific/Tongatapu vf107/dxmodules/zoneinfo/right/Pacific/Truk vf107/dxmodules/zoneinfo/right/Pacific/Wake vf107/dxmodules/zoneinfo/right/Pacific/Wallis vf107/dxmodules/zoneinfo/right/Pacific/Yap vf107/dxmodules/zoneinfo/right/Poland vf107/dxmodules/zoneinfo/right/Portugal vf107/dxmodules/zoneinfo/right/ROC vf107/dxmodules/zoneinfo/right/ROK vf107/dxmodules/zoneinfo/right/Singapore vf107/dxmodules/zoneinfo/right/Turkey vf107/dxmodules/zoneinfo/right/UCT vf107/dxmodules/zoneinfo/right/US/Alaska vf107/dxmodules/zoneinfo/right/US/Aleutian vf107/dxmodules/zoneinfo/right/US/Arizona vf107/dxmodules/zoneinfo/right/US/Central vf107/dxmodules/zoneinfo/right/US/East-Indiana vf107/dxmodules/zoneinfo/right/US/Eastern vf107/dxmodules/zoneinfo/right/US/Hawaii vf107/dxmodules/zoneinfo/right/US/Indiana-Starke vf107/dxmodules/zoneinfo/right/US/Michigan vf107/dxmodules/zoneinfo/right/US/Mountain vf107/dxmodules/zoneinfo/right/US/Pacific vf107/dxmodules/zoneinfo/right/US/Samoa vf107/dxmodules/zoneinfo/right/UTC vf107/dxmodules/zoneinfo/right/Universal vf107/dxmodules/zoneinfo/right/W-SU vf107/dxmodules/zoneinfo/right/WET vf107/dxmodules/zoneinfo/right/Zulu vf107/dxmodules/zoneinfo/tzdata.zi vf107/dxmodules/zoneinfo/zone.tab vf107/dxmodules/zoneinfo/zone1970.tab vf107/resource/CN/wav/access_f.wav vf107/resource/CN/wav/access_s.wav vf107/resource/CN/wav/btn11.wav vf107/resource/CN/wav/btn12.wav vf107/resource/CN/wav/btn13.wav vf107/resource/CN/wav/btn21.wav vf107/resource/CN/wav/btn22.wav vf107/resource/CN/wav/btn23.wav vf107/resource/CN/wav/btn31.wav vf107/resource/CN/wav/btn32.wav vf107/resource/CN/wav/btn33.wav vf107/resource/CN/wav/calibration_s.wav vf107/resource/CN/wav/control_f.wav vf107/resource/CN/wav/door_close.wav vf107/resource/CN/wav/door_open.wav vf107/resource/CN/wav/emergency.wav vf107/resource/CN/wav/emergency_f.wav vf107/resource/CN/wav/emergency_s.wav vf107/resource/CN/wav/failed.wav vf107/resource/CN/wav/light_close.wav vf107/resource/CN/wav/light_open.wav vf107/resource/CN/wav/network.wav vf107/resource/CN/wav/read.wav vf107/resource/CN/wav/recg_f.wav vf107/resource/CN/wav/recg_s.wav vf107/resource/CN/wav/recognition.wav vf107/resource/CN/wav/recognition_s.wav vf107/resource/CN/wav/register.wav vf107/resource/CN/wav/stranger.wav vf107/resource/CN/wav/user2.wav vf107/resource/CN/wav/user2_s.wav vf107/resource/CN/wav/verify.wav vf107/resource/CN/wav/verify_10x_f.wav vf107/resource/CN/wav/verify_10x_s.wav vf107/resource/CN/wav/verify_200_f.wav vf107/resource/CN/wav/verify_200_s.wav vf107/resource/CN/wav/verify_300_f.wav vf107/resource/CN/wav/verify_300_s.wav vf107/resource/CN/wav/verify_400_f.wav vf107/resource/CN/wav/verify_400_s.wav vf107/resource/EN/wav/calibration_s.wav vf107/resource/EN/wav/network.wav vf107/resource/EN/wav/read.wav vf107/resource/EN/wav/recg_f.wav vf107/resource/EN/wav/recg_s.wav vf107/resource/EN/wav/recognition.wav vf107/resource/EN/wav/recognition_s.wav vf107/resource/EN/wav/register.wav vf107/resource/EN/wav/stranger.wav vf107/resource/EN/wav/verify.wav vf107/resource/EN/wav/verify_10x_f.wav vf107/resource/EN/wav/verify_10x_s.wav vf107/resource/EN/wav/verify_200_f.wav vf107/resource/EN/wav/verify_200_s.wav vf107/resource/EN/wav/verify_300_f.wav vf107/resource/EN/wav/verify_300_s.wav vf107/resource/EN/wav/verify_400_f.wav vf107/resource/EN/wav/verify_400_s.wav vf107/resource/font/AlibabaPuHuiTi-3-65-Medium.ttf vf107/resource/font/Arabic.ttf vf107/resource/font/Korean.ttf vf107/resource/i18n/CN.json vf107/resource/i18n/EN.json vf107/resource/image/4g.png vf107/resource/image/4g_dark.png vf107/resource/image/accessCtrl.png vf107/resource/image/add.png vf107/resource/image/advance.png vf107/resource/image/app.png vf107/resource/image/app_btn.png vf107/resource/image/app_qrcode.png vf107/resource/image/arrow_right.png vf107/resource/image/back.png vf107/resource/image/back_2.png vf107/resource/image/background.jpg vf107/resource/image/backspace.png vf107/resource/image/basic.png vf107/resource/image/black_btn.png vf107/resource/image/card.png vf107/resource/image/close.png vf107/resource/image/close_small.png vf107/resource/image/cloudCert.png vf107/resource/image/co2_f.png vf107/resource/image/co2_s.png vf107/resource/image/commMgmt.png vf107/resource/image/config.png vf107/resource/image/config_btn.png vf107/resource/image/delete.png vf107/resource/image/delete_fill.png vf107/resource/image/devInfo.png vf107/resource/image/deviceInfo.png vf107/resource/image/doorControl.png vf107/resource/image/down.png vf107/resource/image/emergencyOpen.png vf107/resource/image/empty.png vf107/resource/image/enter.png vf107/resource/image/enter_b.png vf107/resource/image/eth_disable.png vf107/resource/image/eth_enable.png vf107/resource/image/ethernet.png vf107/resource/image/ethernet_dark.png vf107/resource/image/eye-fill.png vf107/resource/image/eye-off.png vf107/resource/image/eye_fill.png vf107/resource/image/eye_fill_show.png vf107/resource/image/face.png vf107/resource/image/faceAdd.png vf107/resource/image/faceEmpty.png vf107/resource/image/faceError.png vf107/resource/image/faceRec.png vf107/resource/image/faceRec2.png vf107/resource/image/factoryTest.png vf107/resource/image/failBg.png vf107/resource/image/grey_btn.png vf107/resource/image/help.png vf107/resource/image/idleImage.jpg vf107/resource/image/input_bg.png vf107/resource/image/light_close.png vf107/resource/image/light_open.png vf107/resource/image/localUser.png vf107/resource/image/lock.png vf107/resource/image/logo.png vf107/resource/image/menu_btn.png vf107/resource/image/mini_app.png vf107/resource/image/mini_background.png vf107/resource/image/mini_config.png vf107/resource/image/mini_password.png vf107/resource/image/mqtt.png vf107/resource/image/mqtt_dark.png vf107/resource/image/mqtt_enable.png vf107/resource/image/network.png vf107/resource/image/networkSetting.png vf107/resource/image/network_dark.png vf107/resource/image/o2_f.png vf107/resource/image/o2_s.png vf107/resource/image/ph3_f.png vf107/resource/image/ph3_s.png vf107/resource/image/pwd_btn.png vf107/resource/image/qrcode_small.png vf107/resource/image/recQuery.png vf107/resource/image/recordQuery.png vf107/resource/image/rectangle.png vf107/resource/image/register.png vf107/resource/image/right.png vf107/resource/image/select_arrow.png vf107/resource/image/setting.png vf107/resource/image/setting32.png vf107/resource/image/space.png vf107/resource/image/successBg.png vf107/resource/image/success_fill.png vf107/resource/image/sysSettings.png vf107/resource/image/sys_info.png vf107/resource/image/systemSetting.png vf107/resource/image/title_bg.png vf107/resource/image/trackFace.png vf107/resource/image/unlock.png vf107/resource/image/user.png vf107/resource/image/userGuide.png vf107/resource/image/userMgmt.png vf107/resource/image/user_1.png vf107/resource/image/user_f.png vf107/resource/image/user_s.png vf107/resource/image/user_w.png vf107/resource/image/vf105/4g.png vf107/resource/image/vf105/4g_dark.png vf107/resource/image/vf105/accessCtrl.png vf107/resource/image/vf105/add.png vf107/resource/image/vf105/advance.png vf107/resource/image/vf105/app.png vf107/resource/image/vf105/app_btn.png vf107/resource/image/vf105/app_qrcode.png vf107/resource/image/vf105/arrow_right.png vf107/resource/image/vf105/back.png vf107/resource/image/vf105/back_2.png vf107/resource/image/vf105/background.jpg vf107/resource/image/vf105/backspace.png vf107/resource/image/vf105/basic.png vf107/resource/image/vf105/black_btn.png vf107/resource/image/vf105/card.png vf107/resource/image/vf105/close.png vf107/resource/image/vf105/close_small.png vf107/resource/image/vf105/cloudCert.png vf107/resource/image/vf105/commMgmt.png vf107/resource/image/vf105/config.png vf107/resource/image/vf105/config_btn.png vf107/resource/image/vf105/delete.png vf107/resource/image/vf105/delete_fill.png vf107/resource/image/vf105/devInfo.png vf107/resource/image/vf105/developer.png vf107/resource/image/vf105/deviceInfo.png vf107/resource/image/vf105/doorControl.png vf107/resource/image/vf105/down.png vf107/resource/image/vf105/empty.png vf107/resource/image/vf105/enter.png vf107/resource/image/vf105/enter_b.png vf107/resource/image/vf105/eth_disable.png vf107/resource/image/vf105/eth_enable.png vf107/resource/image/vf105/ethernet.png vf107/resource/image/vf105/ethernet_dark.png vf107/resource/image/vf105/eye-fill.png vf107/resource/image/vf105/eye-off.png vf107/resource/image/vf105/eye_fill.png vf107/resource/image/vf105/eye_fill_show.png vf107/resource/image/vf105/face.png vf107/resource/image/vf105/faceAdd.png vf107/resource/image/vf105/faceEmpty.png vf107/resource/image/vf105/faceError.png vf107/resource/image/vf105/faceRec.png vf107/resource/image/vf105/faceRec2.png vf107/resource/image/vf105/factoryTest.png vf107/resource/image/vf105/failBg.png vf107/resource/image/vf105/fingerBoxF.png vf107/resource/image/vf105/fingerBoxS.png vf107/resource/image/vf105/fingerRe0.png vf107/resource/image/vf105/fingerRe1.png vf107/resource/image/vf105/fingerRe2.png vf107/resource/image/vf105/fingerRe3.png vf107/resource/image/vf105/grey_btn.png vf107/resource/image/vf105/help.png vf107/resource/image/vf105/idleImage.jpg vf107/resource/image/vf105/idleImage.png vf107/resource/image/vf105/localUser.png vf107/resource/image/vf105/lock.png vf107/resource/image/vf105/menu_btn.png vf107/resource/image/vf105/mini_app.png vf107/resource/image/vf105/mini_background.png vf107/resource/image/vf105/mini_config.png vf107/resource/image/vf105/mini_password.png vf107/resource/image/vf105/mqtt.png vf107/resource/image/vf105/mqtt_dark.png vf107/resource/image/vf105/network.png vf107/resource/image/vf105/networkSetting.png vf107/resource/image/vf105/network_dark.png vf107/resource/image/vf105/pwd_btn.png vf107/resource/image/vf105/qrcode_small.png vf107/resource/image/vf105/recQuery.png vf107/resource/image/vf105/recordQuery.png vf107/resource/image/vf105/rectangle.png vf107/resource/image/vf105/register.png vf107/resource/image/vf105/right.png vf107/resource/image/vf105/select_arrow.png vf107/resource/image/vf105/setting.png vf107/resource/image/vf105/setting32.png vf107/resource/image/vf105/space.png vf107/resource/image/vf105/successBg.png vf107/resource/image/vf105/success_fill.png vf107/resource/image/vf105/sysSettings.png vf107/resource/image/vf105/sys_info.png vf107/resource/image/vf105/systemSetting.png vf107/resource/image/vf105/trackFace.png vf107/resource/image/vf105/unlock.png vf107/resource/image/vf105/user.png vf107/resource/image/vf105/userGuide.png vf107/resource/image/vf105/userMgmt.png vf107/resource/image/vf105/vip.png vf107/resource/image/vf105/voiceBroadcast.png vf107/resource/image/vf105/wechat.png vf107/resource/image/vf105/wifi.png vf107/resource/image/vf105/wifi_dark.png vf107/resource/image/vf114/4g.png vf107/resource/image/vf114/4g_dark.png vf107/resource/image/vf114/accessCtrl.png vf107/resource/image/vf114/add.png vf107/resource/image/vf114/advance.png vf107/resource/image/vf114/app.png vf107/resource/image/vf114/app_btn.png vf107/resource/image/vf114/app_qrcode.png vf107/resource/image/vf114/arrow_right.png vf107/resource/image/vf114/back.png vf107/resource/image/vf114/back_2.png vf107/resource/image/vf114/background.jpg vf107/resource/image/vf114/backspace.png vf107/resource/image/vf114/basic.png vf107/resource/image/vf114/black_btn.png vf107/resource/image/vf114/card.png vf107/resource/image/vf114/close.png vf107/resource/image/vf114/close_small.png vf107/resource/image/vf114/cloudCert.png vf107/resource/image/vf114/commMgmt.png vf107/resource/image/vf114/config.png vf107/resource/image/vf114/config_btn.png vf107/resource/image/vf114/delete.png vf107/resource/image/vf114/delete_fill.png vf107/resource/image/vf114/devInfo.png vf107/resource/image/vf114/developer.png vf107/resource/image/vf114/deviceInfo.png vf107/resource/image/vf114/doorControl.png vf107/resource/image/vf114/down.png vf107/resource/image/vf114/empty.png vf107/resource/image/vf114/enter.png vf107/resource/image/vf114/enter_b.png vf107/resource/image/vf114/eth_disable.png vf107/resource/image/vf114/eth_enable.png vf107/resource/image/vf114/ethernet.png vf107/resource/image/vf114/ethernet_dark.png vf107/resource/image/vf114/eye-fill.png vf107/resource/image/vf114/eye-off.png vf107/resource/image/vf114/eye_fill.png vf107/resource/image/vf114/eye_fill_show.png vf107/resource/image/vf114/face.png vf107/resource/image/vf114/faceAdd.png vf107/resource/image/vf114/faceEmpty.png vf107/resource/image/vf114/faceError.png vf107/resource/image/vf114/faceRec.png vf107/resource/image/vf114/faceRec2.png vf107/resource/image/vf114/factoryTest.png vf107/resource/image/vf114/failBg.png vf107/resource/image/vf114/fingerBoxF.png vf107/resource/image/vf114/fingerBoxS.png vf107/resource/image/vf114/fingerRe0.png vf107/resource/image/vf114/fingerRe1.png vf107/resource/image/vf114/fingerRe2.png vf107/resource/image/vf114/fingerRe3.png vf107/resource/image/vf114/grey_btn.png vf107/resource/image/vf114/help.png vf107/resource/image/vf114/idleImage.jpg vf107/resource/image/vf114/idleImage.png vf107/resource/image/vf114/localUser.png vf107/resource/image/vf114/lock.png vf107/resource/image/vf114/menu_btn.png vf107/resource/image/vf114/mini_app.png vf107/resource/image/vf114/mini_background.png vf107/resource/image/vf114/mini_config.png vf107/resource/image/vf114/mini_password.png vf107/resource/image/vf114/mqtt.png vf107/resource/image/vf114/mqtt_dark.png vf107/resource/image/vf114/network.png vf107/resource/image/vf114/networkSetting.png vf107/resource/image/vf114/network_dark.png vf107/resource/image/vf114/pwd_btn.png vf107/resource/image/vf114/qrcode_small.png vf107/resource/image/vf114/recQuery.png vf107/resource/image/vf114/recordQuery.png vf107/resource/image/vf114/rectangle.png vf107/resource/image/vf114/register.png vf107/resource/image/vf114/right.png vf107/resource/image/vf114/select_arrow.png vf107/resource/image/vf114/setting.png vf107/resource/image/vf114/setting32.png vf107/resource/image/vf114/space.png vf107/resource/image/vf114/successBg.png vf107/resource/image/vf114/success_fill.png vf107/resource/image/vf114/sysSettings.png vf107/resource/image/vf114/sys_info.png vf107/resource/image/vf114/systemSetting.png vf107/resource/image/vf114/trackFace.png vf107/resource/image/vf114/unlock.png vf107/resource/image/vf114/user.png vf107/resource/image/vf114/userGuide.png vf107/resource/image/vf114/userMgmt.png vf107/resource/image/vf114/vip.png vf107/resource/image/vf114/voiceBroadcast.png vf107/resource/image/vf114/wechat.png vf107/resource/image/vf114/wifi.png vf107/resource/image/vf114/wifi_dark.png vf107/resource/image/vf202/4g.png vf107/resource/image/vf202/4g_dark.png vf107/resource/image/vf202/accessCtrl.png vf107/resource/image/vf202/add.png vf107/resource/image/vf202/advance.png vf107/resource/image/vf202/app.png vf107/resource/image/vf202/app_btn.png vf107/resource/image/vf202/app_qrcode.png vf107/resource/image/vf202/arrow_right.png vf107/resource/image/vf202/back.png vf107/resource/image/vf202/back_2.png vf107/resource/image/vf202/background.jpg vf107/resource/image/vf202/backspace.png vf107/resource/image/vf202/basic.png vf107/resource/image/vf202/black_btn.png vf107/resource/image/vf202/card.png vf107/resource/image/vf202/close.png vf107/resource/image/vf202/close_small.png vf107/resource/image/vf202/cloudCert.png vf107/resource/image/vf202/commMgmt.png vf107/resource/image/vf202/config.png vf107/resource/image/vf202/config_btn.png vf107/resource/image/vf202/delete.png vf107/resource/image/vf202/delete_fill.png vf107/resource/image/vf202/devInfo.png vf107/resource/image/vf202/developer.png vf107/resource/image/vf202/deviceInfo.png vf107/resource/image/vf202/doorControl.png vf107/resource/image/vf202/down.png vf107/resource/image/vf202/empty.png vf107/resource/image/vf202/enter.png vf107/resource/image/vf202/enter_b.png vf107/resource/image/vf202/eth_disable.png vf107/resource/image/vf202/eth_enable.png vf107/resource/image/vf202/ethernet.png vf107/resource/image/vf202/ethernet_dark.png vf107/resource/image/vf202/eye-fill.png vf107/resource/image/vf202/eye-off.png vf107/resource/image/vf202/eye_fill.png vf107/resource/image/vf202/eye_fill_show.png vf107/resource/image/vf202/face.png vf107/resource/image/vf202/faceAdd.png vf107/resource/image/vf202/faceEmpty.png vf107/resource/image/vf202/faceError.png vf107/resource/image/vf202/faceRec.png vf107/resource/image/vf202/faceRec2.png vf107/resource/image/vf202/factoryTest.png vf107/resource/image/vf202/failBg.png vf107/resource/image/vf202/grey_btn.png vf107/resource/image/vf202/help.png vf107/resource/image/vf202/idleImage.jpg vf107/resource/image/vf202/idleImage.png vf107/resource/image/vf202/localUser.png vf107/resource/image/vf202/lock.png vf107/resource/image/vf202/menu_btn.png vf107/resource/image/vf202/mini_app.png vf107/resource/image/vf202/mini_background.png vf107/resource/image/vf202/mini_config.png vf107/resource/image/vf202/mini_password.png vf107/resource/image/vf202/mqtt.png vf107/resource/image/vf202/mqtt_dark.png vf107/resource/image/vf202/network.png vf107/resource/image/vf202/networkSetting.png vf107/resource/image/vf202/network_dark.png vf107/resource/image/vf202/pwd_btn.png vf107/resource/image/vf202/qrcode_small.png vf107/resource/image/vf202/recQuery.png vf107/resource/image/vf202/recordQuery.png vf107/resource/image/vf202/rectangle.png vf107/resource/image/vf202/register.png vf107/resource/image/vf202/right.png vf107/resource/image/vf202/select_arrow.png vf107/resource/image/vf202/setting.png vf107/resource/image/vf202/setting32.png vf107/resource/image/vf202/space.png vf107/resource/image/vf202/successBg.png vf107/resource/image/vf202/success_fill.png vf107/resource/image/vf202/sysSettings.png vf107/resource/image/vf202/sys_info.png vf107/resource/image/vf202/systemSetting.png vf107/resource/image/vf202/tip_card.png vf107/resource/image/vf202/trackFace.png vf107/resource/image/vf202/unlock.png vf107/resource/image/vf202/user.png vf107/resource/image/vf202/userGuide.png vf107/resource/image/vf202/userMgmt.png vf107/resource/image/vf202/vip.png vf107/resource/image/vf202/voiceBroadcast.png vf107/resource/image/vf202/wechat.png vf107/resource/image/vf202/wifi.png vf107/resource/image/vf202/wifi_dark.png vf107/resource/image/vf203/4g.png vf107/resource/image/vf203/4g_dark.png vf107/resource/image/vf203/accessCtrl.png vf107/resource/image/vf203/add.png vf107/resource/image/vf203/advance.png vf107/resource/image/vf203/app.png vf107/resource/image/vf203/app_btn.png vf107/resource/image/vf203/app_qrcode.png vf107/resource/image/vf203/arrow_right.png vf107/resource/image/vf203/back.png vf107/resource/image/vf203/back_2.png vf107/resource/image/vf203/background.jpg vf107/resource/image/vf203/backspace.png vf107/resource/image/vf203/basic.png vf107/resource/image/vf203/black_btn.png vf107/resource/image/vf203/card.png vf107/resource/image/vf203/close.png vf107/resource/image/vf203/close_small.png vf107/resource/image/vf203/cloudCert.png vf107/resource/image/vf203/commMgmt.png vf107/resource/image/vf203/config.png vf107/resource/image/vf203/config_btn.png vf107/resource/image/vf203/delete.png vf107/resource/image/vf203/delete_fill.png vf107/resource/image/vf203/devInfo.png vf107/resource/image/vf203/developer.png vf107/resource/image/vf203/deviceInfo.png vf107/resource/image/vf203/doorControl.png vf107/resource/image/vf203/down.png vf107/resource/image/vf203/empty.png vf107/resource/image/vf203/enter.png vf107/resource/image/vf203/enter_b.png vf107/resource/image/vf203/eth_disable.png vf107/resource/image/vf203/eth_enable.png vf107/resource/image/vf203/ethernet.png vf107/resource/image/vf203/ethernet_dark.png vf107/resource/image/vf203/eye-fill.png vf107/resource/image/vf203/eye-off.png vf107/resource/image/vf203/eye_fill.png vf107/resource/image/vf203/eye_fill_show.png vf107/resource/image/vf203/face.png vf107/resource/image/vf203/faceAdd.png vf107/resource/image/vf203/faceEmpty.png vf107/resource/image/vf203/faceError.png vf107/resource/image/vf203/faceRec.png vf107/resource/image/vf203/faceRec2.png vf107/resource/image/vf203/factoryTest.png vf107/resource/image/vf203/failBg.png vf107/resource/image/vf203/grey_btn.png vf107/resource/image/vf203/help.png vf107/resource/image/vf203/idleImage.jpg vf107/resource/image/vf203/idleImage.png vf107/resource/image/vf203/localUser.png vf107/resource/image/vf203/lock.png vf107/resource/image/vf203/menu_btn.png vf107/resource/image/vf203/mini_app.png vf107/resource/image/vf203/mini_background.png vf107/resource/image/vf203/mini_config.png vf107/resource/image/vf203/mini_password.png vf107/resource/image/vf203/mqtt.png vf107/resource/image/vf203/mqtt_dark.png vf107/resource/image/vf203/network.png vf107/resource/image/vf203/networkSetting.png vf107/resource/image/vf203/network_dark.png vf107/resource/image/vf203/pwd_btn.png vf107/resource/image/vf203/qrcode_small.png vf107/resource/image/vf203/recQuery.png vf107/resource/image/vf203/recordQuery.png vf107/resource/image/vf203/rectangle.png vf107/resource/image/vf203/register.png vf107/resource/image/vf203/right.png vf107/resource/image/vf203/select_arrow.png vf107/resource/image/vf203/setting.png vf107/resource/image/vf203/setting32.png vf107/resource/image/vf203/space.png vf107/resource/image/vf203/successBg.png vf107/resource/image/vf203/success_fill.png vf107/resource/image/vf203/sysSettings.png vf107/resource/image/vf203/sys_info.png vf107/resource/image/vf203/systemSetting.png vf107/resource/image/vf203/trackFace.png vf107/resource/image/vf203/unlock.png vf107/resource/image/vf203/user.png vf107/resource/image/vf203/userGuide.png vf107/resource/image/vf203/userMgmt.png vf107/resource/image/vf203/vip.png vf107/resource/image/vf203/voiceBroadcast.png vf107/resource/image/vf203/wechat.png vf107/resource/image/vf203/wifi.png vf107/resource/image/vf203/wifi_dark.png vf107/resource/image/view_f.png vf107/resource/image/view_s.png vf107/resource/image/vip.png vf107/resource/image/voiceBroadcast.png vf107/resource/image/wifi.png vf107/resource/image/wifi_dark.png vf107/resource/langPack.js vf107/resource/wav/AR/calibration_1s.wav vf107/resource/wav/AR/calibration_2s.wav vf107/resource/wav/AR/calibration_s.wav vf107/resource/wav/AR/fingerF.wav vf107/resource/wav/AR/fingerInput1.wav vf107/resource/wav/AR/fingerInput2.wav vf107/resource/wav/AR/fingerInput3.wav vf107/resource/wav/AR/fingerR.wav vf107/resource/wav/AR/fingerS.wav vf107/resource/wav/AR/fingerT.wav vf107/resource/wav/AR/read.wav vf107/resource/wav/AR/recg_f.wav vf107/resource/wav/AR/recg_s.wav vf107/resource/wav/AR/recognition.wav vf107/resource/wav/AR/recognition_s.wav vf107/resource/wav/AR/register.wav vf107/resource/wav/AR/stranger.wav vf107/resource/wav/AR/verify.wav vf107/resource/wav/AR/verify_f.wav vf107/resource/wav/AR/verify_s.wav vf107/resource/wav/CN/calibration_1s.wav vf107/resource/wav/CN/calibration_2s.wav vf107/resource/wav/CN/calibration_s.wav vf107/resource/wav/CN/fingerF.wav vf107/resource/wav/CN/fingerInput1.wav vf107/resource/wav/CN/fingerInput2.wav vf107/resource/wav/CN/fingerInput3.wav vf107/resource/wav/CN/fingerR.wav vf107/resource/wav/CN/fingerS.wav vf107/resource/wav/CN/fingerT.wav vf107/resource/wav/CN/read.wav vf107/resource/wav/CN/recg_f.wav vf107/resource/wav/CN/recg_s.wav vf107/resource/wav/CN/recognition.wav vf107/resource/wav/CN/recognition_s.wav vf107/resource/wav/CN/register.wav vf107/resource/wav/CN/stranger.wav vf107/resource/wav/CN/verify.wav vf107/resource/wav/CN/verify_f.wav vf107/resource/wav/CN/verify_s.wav vf107/resource/wav/DE/calibration_1s.wav vf107/resource/wav/DE/calibration_2s.wav vf107/resource/wav/DE/calibration_s.wav vf107/resource/wav/DE/fingerF.wav vf107/resource/wav/DE/fingerInput1.wav vf107/resource/wav/DE/fingerInput2.wav vf107/resource/wav/DE/fingerInput3.wav vf107/resource/wav/DE/fingerR.wav vf107/resource/wav/DE/fingerS.wav vf107/resource/wav/DE/fingerT.wav vf107/resource/wav/DE/read.wav vf107/resource/wav/DE/recg_f.wav vf107/resource/wav/DE/recg_s.wav vf107/resource/wav/DE/recognition.wav vf107/resource/wav/DE/recognition_s.wav vf107/resource/wav/DE/register.wav vf107/resource/wav/DE/stranger.wav vf107/resource/wav/DE/verify.wav vf107/resource/wav/DE/verify_f.wav vf107/resource/wav/DE/verify_s.wav vf107/resource/wav/EN/calibration_1s.wav vf107/resource/wav/EN/calibration_2s.wav vf107/resource/wav/EN/calibration_s.wav vf107/resource/wav/EN/fingerF.wav vf107/resource/wav/EN/fingerInput1.wav vf107/resource/wav/EN/fingerInput2.wav vf107/resource/wav/EN/fingerInput3.wav vf107/resource/wav/EN/fingerR.wav vf107/resource/wav/EN/fingerS.wav vf107/resource/wav/EN/fingerT.wav vf107/resource/wav/EN/read.wav vf107/resource/wav/EN/recg_f.wav vf107/resource/wav/EN/recg_s.wav vf107/resource/wav/EN/recognition.wav vf107/resource/wav/EN/recognition_s.wav vf107/resource/wav/EN/register.wav vf107/resource/wav/EN/stranger.wav vf107/resource/wav/EN/verify.wav vf107/resource/wav/EN/verify_f.wav vf107/resource/wav/EN/verify_s.wav vf107/resource/wav/ES/calibration_1s.wav vf107/resource/wav/ES/calibration_2s.wav vf107/resource/wav/ES/calibration_s.wav vf107/resource/wav/ES/fingerF.wav vf107/resource/wav/ES/fingerInput1.wav vf107/resource/wav/ES/fingerInput2.wav vf107/resource/wav/ES/fingerInput3.wav vf107/resource/wav/ES/fingerR.wav vf107/resource/wav/ES/fingerS.wav vf107/resource/wav/ES/fingerT.wav vf107/resource/wav/ES/read.wav vf107/resource/wav/ES/recg_f.wav vf107/resource/wav/ES/recg_s.wav vf107/resource/wav/ES/recognition.wav vf107/resource/wav/ES/recognition_s.wav vf107/resource/wav/ES/register.wav vf107/resource/wav/ES/stranger.wav vf107/resource/wav/ES/verify.wav vf107/resource/wav/ES/verify_f.wav vf107/resource/wav/ES/verify_s.wav vf107/resource/wav/FR/calibration_1s.wav vf107/resource/wav/FR/calibration_2s.wav vf107/resource/wav/FR/calibration_s.wav vf107/resource/wav/FR/fingerF.wav vf107/resource/wav/FR/fingerInput1.wav vf107/resource/wav/FR/fingerInput2.wav vf107/resource/wav/FR/fingerInput3.wav vf107/resource/wav/FR/fingerR.wav vf107/resource/wav/FR/fingerS.wav vf107/resource/wav/FR/fingerT.wav vf107/resource/wav/FR/read.wav vf107/resource/wav/FR/recg_f.wav vf107/resource/wav/FR/recg_s.wav vf107/resource/wav/FR/recognition.wav vf107/resource/wav/FR/recognition_s.wav vf107/resource/wav/FR/register.wav vf107/resource/wav/FR/stranger.wav vf107/resource/wav/FR/verify.wav vf107/resource/wav/FR/verify_f.wav vf107/resource/wav/FR/verify_s.wav vf107/resource/wav/KO/.DS_Store vf107/resource/wav/KO/calibration_1s.wav vf107/resource/wav/KO/calibration_2s.wav vf107/resource/wav/KO/calibration_s.wav vf107/resource/wav/KO/fingerF.wav vf107/resource/wav/KO/fingerInput1.wav vf107/resource/wav/KO/fingerInput2.wav vf107/resource/wav/KO/fingerInput3.wav vf107/resource/wav/KO/fingerR.wav vf107/resource/wav/KO/fingerS.wav vf107/resource/wav/KO/fingerT.wav vf107/resource/wav/KO/read.wav vf107/resource/wav/KO/recg_f.wav vf107/resource/wav/KO/recg_s.wav vf107/resource/wav/KO/recognition.wav vf107/resource/wav/KO/recognition_s.wav vf107/resource/wav/KO/register.wav vf107/resource/wav/KO/stranger.wav vf107/resource/wav/KO/verify.wav vf107/resource/wav/KO/verify_f.wav vf107/resource/wav/KO/verify_s.wav vf107/resource/wav/PT/calibration_1s.wav vf107/resource/wav/PT/calibration_2s.wav vf107/resource/wav/PT/calibration_s.wav vf107/resource/wav/PT/fingerF.wav vf107/resource/wav/PT/fingerInput1.wav vf107/resource/wav/PT/fingerInput2.wav vf107/resource/wav/PT/fingerInput3.wav vf107/resource/wav/PT/fingerR.wav vf107/resource/wav/PT/fingerS.wav vf107/resource/wav/PT/fingerT.wav vf107/resource/wav/PT/read.wav vf107/resource/wav/PT/recg_f.wav vf107/resource/wav/PT/recg_s.wav vf107/resource/wav/PT/recognition.wav vf107/resource/wav/PT/recognition_s.wav vf107/resource/wav/PT/register.wav vf107/resource/wav/PT/stranger.wav vf107/resource/wav/PT/verify.wav vf107/resource/wav/PT/verify_f.wav vf107/resource/wav/PT/verify_s.wav vf107/resource/wav/RU/calibration_1s.wav vf107/resource/wav/RU/calibration_2s.wav vf107/resource/wav/RU/calibration_s.wav vf107/resource/wav/RU/fingerF.wav vf107/resource/wav/RU/fingerInput1.wav vf107/resource/wav/RU/fingerInput2.wav vf107/resource/wav/RU/fingerInput3.wav vf107/resource/wav/RU/fingerR.wav vf107/resource/wav/RU/fingerS.wav vf107/resource/wav/RU/fingerT.wav vf107/resource/wav/RU/read.wav vf107/resource/wav/RU/recg_f.wav vf107/resource/wav/RU/recg_s.wav vf107/resource/wav/RU/recognition.wav vf107/resource/wav/RU/recognition_s.wav vf107/resource/wav/RU/register.wav vf107/resource/wav/RU/stranger.wav vf107/resource/wav/RU/verify.wav vf107/resource/wav/RU/verify_f.wav vf107/resource/wav/RU/verify_s.wav vf107/resource/wav/alarm.wav vf107/resource/wav/success.wav vf107/resource/wav/tamper.wav vf107/resource/web/config.js vf107/resource/web/css/app.7043d6da.css vf107/resource/web/css/chunk-vendors.6b92dc4c.css vf107/resource/web/favicon.ico vf107/resource/web/fonts/element-icons.535877f5.woff vf107/resource/web/fonts/element-icons.732389de.ttf vf107/resource/web/img/bg.a32161db.png vf107/resource/web/img/iconfont.675b1cb4.svg vf107/resource/web/index.css vf107/resource/web/index.html vf107/resource/web/js/app.da6752e9.js vf107/resource/web/js/app.da6752e9.js.map vf107/resource/web/js/chunk-vendors.303b1624.js vf107/resource/web/js/chunk-vendors.303b1624.js.map vf107/src/common/consts/configConst.js vf107/src/common/utils/codeUtils.js vf107/src/common/utils/netUtils.js vf107/src/common/utils/stringUtils.js vf107/src/common/utils/tokenUtil.js vf107/src/common/utils/utils.js vf107/src/config.json vf107/src/controller.js vf107/src/driver.js vf107/src/main.js vf107/src/screen.js vf107/src/service/accessService.js vf107/src/service/api.js vf107/src/service/codeService.js vf107/src/service/configService.js vf107/src/service/faceService.js vf107/src/service/fingerService.js vf107/src/service/gpiokeyService.js vf107/src/service/grainService.js vf107/src/service/httpService.js vf107/src/service/mqttService.js vf107/src/service/nfcService.js vf107/src/service/sqliteService.js vf107/src/service/uartBleService.js vf107/src/service/uartCodeService.js vf107/src/service/weComService.js vf107/src/services.js vf107/src/view/appView.js vf107/src/view/config/configView.js vf107/src/view/config/identityVerificationView.js vf107/src/view/config/menu/cloudCertView.js vf107/src/view/config/menu/developer/capcalView.js vf107/src/view/config/menu/developerView.js vf107/src/view/config/menu/deviceInfo/dataCapacityInfoView.js vf107/src/view/config/menu/deviceInfo/systemInfoView.js vf107/src/view/config/menu/deviceInfoView.js vf107/src/view/config/menu/doorControlView.js vf107/src/view/config/menu/helpView.js vf107/src/view/config/menu/localUser/faceEnterView.js vf107/src/view/config/menu/localUser/fingerApplyView.js vf107/src/view/config/menu/localUser/fingerEnterView.js vf107/src/view/config/menu/localUser/localUserAddView.js vf107/src/view/config/menu/localUserView.js vf107/src/view/config/menu/networkSettingView.js vf107/src/view/config/menu/recordQuery/recordQueryDetailView.js vf107/src/view/config/menu/recordQueryView.js vf107/src/view/config/menu/systemSetting/displaySettingView.js vf107/src/view/config/menu/systemSetting/faceRecognitionSettingView.js vf107/src/view/config/menu/systemSetting/passLogSettingView.js vf107/src/view/config/menu/systemSetting/passwordManagementView.js vf107/src/view/config/menu/systemSetting/passwordOpenDoorSettingView.js vf107/src/view/config/menu/systemSetting/swipeCardRecognitionSettingView.js vf107/src/view/config/menu/systemSetting/timeSettingView.js vf107/src/view/config/menu/systemSettingView.js vf107/src/view/config/menu/voiceBroadcastView.js vf107/src/view/config/newPwdView.js vf107/src/view/emergencyPwdView.js vf107/src/view/gasDetailView.js vf107/src/view/i18n.js vf107/src/view/idleView.js vf107/src/view/mainView.js vf107/src/view/pinyin/dict.js vf107/src/view/pinyin/pinyin.js vf107/src/view/pwdView.js vf107/src/view/topView.js vf107/src/view/viewUtils.js vf107/src/view/wechatBindView.js vf107/src/view/wechatFaceView.js vf107/src/view/wechatNetView.js vf107/src/worker/mqttWorker.js vf107/src/worker/netWorker.js vf107/src/worker/passRecordWorker.js vf107/src/worker/screenWorker.js