From 6496cbad053a66bfdc8204548753db5f5ada4de6 Mon Sep 17 00:00:00 2001 From: nebulaliu Date: Thu, 28 Mar 2024 14:38:29 +0800 Subject: [PATCH] Auto-publish WXSDK. --- CHANGELOG.md | 7 + Editor/MiniGameConfig.asset | 74 + ...tor.pdb.meta => MiniGameConfig.asset.meta} | 5 +- Editor/PicCompressor.cs | 12 +- Editor/WXConvertCore.cs | 378 ++++- Editor/WXEditorSettingHelper.cs | 605 ++++++++ Editor/WXEditorSettingHelper.cs.meta | 11 + Editor/WXEditorWindow.cs | 540 +------ Editor/WXExtDef.cs | 4 + Editor/WXPluginVersion.cs | 2 +- Editor/wx-editor.dll | Bin 201728 -> 203264 bytes Editor/wx-editor.xml.meta | 2 +- Runtime/Plugins.meta | 2 +- Runtime/Plugins/AES.jslib | 108 ++ Runtime/Plugins/AES.jslib.meta | 21 + Runtime/Plugins/MD5.jslib | 8 + Runtime/Plugins/MD5.jslib.meta | 21 + Runtime/Plugins/SDK-Call-JS-Old.jslib | 12 +- Runtime/Plugins/crypto.jspre | 1252 +++++++++++++++++ Runtime/Plugins/crypto.jspre.meta | 21 + Runtime/Plugins/link.xml | 1 + Runtime/Plugins/wx-runtime-editor.dll | Bin 273920 -> 273920 bytes Runtime/Plugins/wx-runtime-editor.pdb.meta | 7 - Runtime/Plugins/wx-runtime-editor.xml.meta | 2 +- Runtime/Plugins/wx-runtime.dll | Bin 274944 -> 274944 bytes Runtime/Plugins/wx-runtime.pdb.meta | 7 - Runtime/Plugins/wx-runtime.xml.meta | 2 +- Runtime/WXProfileStatsScript.cs | 2 +- Runtime/WebAES.cs | 108 ++ Runtime/WebAES.cs.meta | 3 + Runtime/WebMD5.cs | 31 + Runtime/WebMD5.cs.meta | 3 + Runtime/wechat-default/game.js | 2 +- .../unity-sdk/audio/unity-audio.js | 45 +- Runtime/wechat-default/unity-sdk/fs.js | 12 +- Runtime/wechat-default/unity-sdk/utils.js | 3 + package.json | 2 +- 37 files changed, 2711 insertions(+), 604 deletions(-) create mode 100644 Editor/MiniGameConfig.asset rename Editor/{wx-editor.pdb.meta => MiniGameConfig.asset.meta} (52%) create mode 100644 Editor/WXEditorSettingHelper.cs create mode 100644 Editor/WXEditorSettingHelper.cs.meta create mode 100644 Runtime/Plugins/AES.jslib create mode 100644 Runtime/Plugins/AES.jslib.meta create mode 100644 Runtime/Plugins/MD5.jslib create mode 100644 Runtime/Plugins/MD5.jslib.meta create mode 100644 Runtime/Plugins/crypto.jspre create mode 100644 Runtime/Plugins/crypto.jspre.meta delete mode 100644 Runtime/Plugins/wx-runtime-editor.pdb.meta delete mode 100644 Runtime/Plugins/wx-runtime.pdb.meta create mode 100644 Runtime/WebAES.cs create mode 100644 Runtime/WebAES.cs.meta create mode 100644 Runtime/WebMD5.cs create mode 100644 Runtime/WebMD5.cs.meta diff --git a/CHANGELOG.md b/CHANGELOG.md index 68fac537..9f00cc36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ Removed - 删除功能/接口 Fixed - 修复问题 Others - 其他 --> +## 2024-3-28 【普通更新】 +* 普通:优化对团结版的导出支持 +### Fixed +* 普通:兼容PlayDelayed播放 +* 普通:兼容FMOD2.02版本 +* 普通:修复FState偶现报错 + ## 2024-3-5 【普通更新】 * 普通:WXAssetBundle支持切换CDN * 普通:优化VideoPlayer组件 diff --git a/Editor/MiniGameConfig.asset b/Editor/MiniGameConfig.asset new file mode 100644 index 00000000..37958bce --- /dev/null +++ b/Editor/MiniGameConfig.asset @@ -0,0 +1,74 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1795359250, guid: 1cf430f187a0b40eda7f668318d8be23, type: 3} + m_Name: MiniGameConfig + m_EditorClassIdentifier: + ProjectConf: + projectName: + Appid: + CDN: + assetLoadType: 0 + compressDataPackage: 0 + VideoUrl: + DST: + StreamCDN: + bundleHashLength: 32 + bundlePathIdentifier: StreamingAssets; + bundleExcludeExtensions: json; + AssetsUrl: + MemorySize: 256 + HideAfterCallMain: 1 + preloadFiles: + Orientation: 0 + bgImageSrc: Assets/WX-WASM-SDK-V2/Runtime/wechat-default/images/background.jpg + dataFileSubPrefix: + maxStorage: 200 + defaultReleaseSize: 31457280 + texturesHashLength: 8 + texturesPath: Assets/Textures + needCacheTextures: 1 + loadingBarWidth: 240 + needCheckUpdate: 0 + disableHighPerformanceFallback: 0 + IOSDevicePixelRatio: 0 + SDKOptions: + UseFriendRelation: 0 + UseCompressedTexture: 0 + UseMiniGameChat: 0 + PreloadWXFont: 0 + CompileOptions: + DevelopBuild: 0 + AutoProfile: 0 + ScriptOnly: 0 + Il2CppOptimizeSize: 1 + profilingFuncs: 1 + Webgl2: 0 + fbslim: 0 + DeleteStreamingAssets: 1 + ProfilingMemory: 0 + CleanBuild: 0 + CustomNodePath: + showMonitorSuggestModal: 1 + enableProfileStats: 0 + enableRenderAnalysis: 0 + iOSAutoGCInterval: 10000 + enableIOSPerformancePlus: 0 + CompressTexture: + halfSize: 0 + useDXT5: 0 + bundleSuffix: bundle + parallelWithBundle: 0 + bundleDir: + dstMinDir: + debugMode: 0 + force: 0 + PlayerPrefsKeys: [] diff --git a/Editor/wx-editor.pdb.meta b/Editor/MiniGameConfig.asset.meta similarity index 52% rename from Editor/wx-editor.pdb.meta rename to Editor/MiniGameConfig.asset.meta index ffd6f9f7..3638acb3 100644 --- a/Editor/wx-editor.pdb.meta +++ b/Editor/MiniGameConfig.asset.meta @@ -1,7 +1,8 @@ fileFormatVersion: 2 -guid: 6581700969f174df7a88b1cdb32c1ea4 -DefaultImporter: +guid: 8c9a0d25ac0fe41788d270580f6208d9 +NativeFormatImporter: externalObjects: {} + mainObjectFileID: 11400000 userData: assetBundleName: assetBundleVariant: diff --git a/Editor/PicCompressor.cs b/Editor/PicCompressor.cs index 0165b05c..4bc0b7b4 100644 --- a/Editor/PicCompressor.cs +++ b/Editor/PicCompressor.cs @@ -37,30 +37,30 @@ namespace WeChatWASM { if (Application.platform == RuntimePlatform.WindowsEditor) { - return Path.Combine(Application.dataPath, "WX-WASM-SDK-V2/Editor/TextureEditor/Node/astcenc-sse4.1.exe"); + return Path.Combine(UnityUtil.GetWxSDKRootPath(), "Editor/TextureEditor/Node/astcenc-sse4.1.exe"); } if (UnityEngine.SystemInfo.processorType.ToLower().Contains("apple")) { - return Path.Combine(Application.dataPath, "WX-WASM-SDK-V2/Editor/TextureEditor/Node/astcenc-neon"); + return Path.Combine(UnityUtil.GetWxSDKRootPath(), "Editor/TextureEditor/Node/astcenc-neon"); } - return Path.Combine(Application.dataPath, "WX-WASM-SDK-V2/Editor/TextureEditor/Node/astcenc-avx2"); + return Path.Combine(UnityUtil.GetWxSDKRootPath(), "Editor/TextureEditor/Node/astcenc-avx2"); } public static string GetPVRTCPath() { - return Path.Combine(Application.dataPath, "WX-WASM-SDK-V2/Editor/TextureEditor/Node/PVRTexToolCLI" + (Application.platform == RuntimePlatform.WindowsEditor ? ".exe" : string.Empty)); + return Path.Combine(UnityUtil.GetWxSDKRootPath(), "Editor/TextureEditor/Node/PVRTexToolCLI" + (Application.platform == RuntimePlatform.WindowsEditor ? ".exe" : string.Empty)); } public static string GetDXT5Path() { - return Path.Combine(Application.dataPath, "WX-WASM-SDK-V2/Editor/TextureEditor/Node/PVRTexToolCLI" + (Application.platform == RuntimePlatform.WindowsEditor ? ".exe" : string.Empty)); + return Path.Combine(UnityUtil.GetWxSDKRootPath(), "Editor/TextureEditor/Node/PVRTexToolCLI" + (Application.platform == RuntimePlatform.WindowsEditor ? ".exe" : string.Empty)); } public static string GetPNGPath() { - return Path.Combine(Application.dataPath, "WX-WASM-SDK-V2/Editor/TextureEditor/Node/pngquant" + (Application.platform == RuntimePlatform.WindowsEditor ? ".exe" : string.Empty)); + return Path.Combine(UnityUtil.GetWxSDKRootPath(), "Editor/TextureEditor/Node/pngquant" + (Application.platform == RuntimePlatform.WindowsEditor ? ".exe" : string.Empty)); } public static void TestASTC() diff --git a/Editor/WXConvertCore.cs b/Editor/WXConvertCore.cs index 776169ab..53a77a48 100644 --- a/Editor/WXConvertCore.cs +++ b/Editor/WXConvertCore.cs @@ -24,28 +24,16 @@ namespace WeChatWASM public static void Init() { config = UnityUtil.GetEditorConf(); - // SDKFilePath = Path.Combine(Application.dataPath, "WX-WASM-SDK-V2", "Runtime", "wechat-default", "unity-sdk", "index.js"); SDKFilePath = Path.Combine(UnityUtil.GetWxSDKRootPath(), "Runtime", "wechat-default", "unity-sdk", "index.js"); - // string templateHeader = (UnityUtil.GetSDKMode() == UnityUtil.SDKMode.Package && UnityUtil.GetEngineVersion() >= UnityUtil.EngineVersion.Tuanjie) ? "PACKAGE:com.qq.wx.minigame:" : "PROJECT:"; string templateHeader = "PROJECT:"; -#if PLATFORM_WEIXINMINIGAME +#if TUANJIE_2022_3_OR_NEWER PlayerSettings.WeixinMiniGame.threadsSupport = false; PlayerSettings.runInBackground = false; PlayerSettings.WeixinMiniGame.compressionFormat = WeixinMiniGameCompressionFormat.Disabled; -#if UNITY_2022_3_OR_NEWER PlayerSettings.WeixinMiniGame.template = $"{templateHeader}WXTemplate2022TJ"; -#elif UNITY_2020_1_OR_NEWER - PlayerSettings.WeixinMiniGame.template = $"{templateHeader}WXTemplate2020"; -#else - PlayerSettings.WeixinMiniGame.template = $"{templateHeader}WXTemplate"; -#endif PlayerSettings.WeixinMiniGame.linkerTarget = WeixinMiniGameLinkerTarget.Wasm; PlayerSettings.WeixinMiniGame.dataCaching = false; -#if UNITY_2021_2_OR_NEWER PlayerSettings.WeixinMiniGame.debugSymbolMode = WeixinMiniGameDebugSymbolMode.External; -#else - PlayerSettings.WeixinMiniGame.debugSymbols = true; -#endif #else PlayerSettings.WebGL.threadsSupport = false; PlayerSettings.runInBackground = false; @@ -79,12 +67,23 @@ namespace WeChatWASM public static string webglDir = "webgl"; // 导出的webgl目录 public static string miniGameDir = "minigame"; // 生成小游戏的目录 public static string audioDir = "Assets"; // 音频资源目录 + public static string frameworkDir = "framework"; public static string dataFileSize = string.Empty; public static string codeMd5 = string.Empty; public static string dataMd5 = string.Empty; private static string SDKFilePath = string.Empty; public static string defaultImgSrc = "Assets/WX-WASM-SDK-V2/Runtime/wechat-default/images/background.jpg"; - + public static bool UseIL2CPP + { + get + { +#if TUANJIE_2022_3_OR_NEWER + return PlayerSettings.GetScriptingBackend(BuildTargetGroup.WeixinMiniGame) == ScriptingImplementation.IL2CPP; +#else + return true; +#endif + } + } // 可以调用这个来集成 public static WXExportError DoExport(bool buildWebGL = true) { @@ -122,10 +121,26 @@ namespace WeChatWASM if (WXExtEnvDef.GETDEF("UNITY_2021_2_OR_NEWER") && !config.CompileOptions.DevelopBuild) { // 如果是2021版本,官方symbols产生有BUG,这里需要用工具将函数名提取出来 - WeChatWASM.UnityUtil.preprocessSymbols(GetWebGLSymbolPath()); + var symFile1 = ""; + if(!UseIL2CPP) + { + symFile1 = Path.Combine(config.ProjectConf.DST, webglDir, "Code", "wwwroot", "_framework", "dotnet.native.js.symbols"); + } + else + { + var rootPath = Directory.GetParent(Application.dataPath).FullName; + string webglDir = WXExtEnvDef.GETDEF("WEIXINMINIGAME") ? "WeixinMiniGame" : "WebGL"; + symFile1 = Path.Combine(rootPath, "Library", "Bee", "artifacts", webglDir, "build", "debug_WebGL_wasm", "build.js.symbols"); + } + WeChatWASM.UnityUtil.preprocessSymbols(symFile1, GetWebGLSymbolPath()); + // WeChatWASM.UnityUtil.preprocessSymbols(GetWebGLSymbolPath()); } ConvertCode(); + if (!UseIL2CPP) + { + ConvertDotnetCode(); + } string dataFilePath = GetWebGLDataPath(); string wxTextDataDir = WXAssetsTextTools.GetTextMinDataDir(); string dataFilePathBackupDir = $"{wxTextDataDir}{WXAssetsTextTools.DS}slim"; @@ -140,7 +155,7 @@ namespace WeChatWASM } File.Copy(dataFilePath, dataFilePathBackupPath); - if (config.CompileOptions.fbslim && !IsInstantGameAutoStreaming()) + if (UseIL2CPP && config.CompileOptions.fbslim && !IsInstantGameAutoStreaming()) { WXAssetsTextTools.FirstBundleSlim(dataFilePath, (result, info) => { @@ -248,15 +263,257 @@ namespace WeChatWASM return output.ToString(); } + + private static void ConvertDotnetCode() + { + CompressAssemblyBrotli(); + ConvertDotnetRuntimeCode(); + ConvertDotnetFrameworkCode(); + } + + private static void ConvertDotnetRuntimeCode() + { + var runtimePath = GetWeixinMiniGameFilePath("jsModuleRuntime")[0]; + var dotnetJs = File.ReadAllText(runtimePath, Encoding.UTF8); + + Rule[] rules = + { + new Rule() + { + old = "await *WebAssembly\\.instantiate\\(\\w*,", + newStr = $"await WebAssembly.instantiate(Module[\"wasmPath\"],", + }, + new Rule() + { + old = "['\"]Expected methodFullName if trace is instrumented['\"]\\);?", + newStr = "'Expected methodFullName if trace is instrumented'); return;", + } + }; + foreach (var rule in rules) + { + if (ShowMatchFailedWarning(dotnetJs, rule.old, "runtime") == false) { + dotnetJs = Regex.Replace(dotnetJs, rule.old, rule.newStr); + } + } + + File.WriteAllText(Path.Combine(config.ProjectConf.DST, miniGameDir, frameworkDir, Path.GetFileName(runtimePath)), dotnetJs, new UTF8Encoding(false)); + } + + private static void CompressAssemblyBrotli() + { + GetWeixinMiniGameFilePath("assembly").ToList().ForEach(assembly => UnityUtil.brotli(assembly, assembly + ".br", "8")); + } + + private static void ConvertDotnetFrameworkCode() + { + var target = "webgl.wasm.framework.unityweb.js"; + var dotnetJsPath = + Path.Combine(config.ProjectConf.DST, webglDir, "Code", "wwwroot", "_framework", "dotnet.js"); + var dotnetJs = File.ReadAllText(dotnetJsPath, Encoding.UTF8); + // todo: handle dotnet js + Rule[] rules = + { + new Rule() + { + old = "import\\.meta\\.url", + newStr = $"pathToFileURL('/{frameworkDir}/webgl.wasm.framework.unityweb.js')", + }, + new Rule() + { + old = " *(\\w*) *= *(\\w*)\\(\"js-module-runtime\"\\) *, *(\\w*) *= *(\\w*)\\(\"js-module-native\"\\)", + newStr = $" $1 = $2(\"js-module-runtime\"), $3 = $4(\"js-module-native\"); $1.resolvedUrl = \"{Path.GetFileName(GetWeixinMiniGameFilePath("jsModuleRuntime")[0])}\";$3.resolvedUrl = \"{Path.GetFileName(GetWeixinMiniGameFilePath("jsModuleNative")[0])}\";", + }, + new Rule() + { + old = "export *\\{ *(.*) *as *default *,(.*) *as *dotnet *,(.*) *as *exit *\\} *;", + newStr = "return {legacyEntrypoint: $1, dotnet: $2, exit: $3}", + }, + new Rule() + { // add symbol property for monoToBlazorAssetTypeMap + old = "\"js-module-runtime\": *\"dotnetjs\", *\"js-module-threads\": *\"dotnetjs\"", + newStr = "\"js-module-runtime\": \"dotnetjs\", \"js-module-threads\": \"dotnetjs\", \"symbols\": \"symbols\"", + }, + new Rule() + { + old = "_e *\\|\\| *\"function\" *== *typeof *globalThis.URL[\\s\\S]*asm-features\"\\);", + newStr = "" + }, + new Rule() + { + old = "if *\\(!\\(ENVIRONMENT_IS_SHELL *\\|\\| *typeof *globalThis.URL *=== *\"function\"\\)\\)[\\s\\S]*BigInt64Array *API. *Please *use *a *modern *version. *See *also *https:\\/\\/aka.ms\\/dotnet\\-wasm\\-features\"\\);", + newStr = "" + } + }; + foreach (var rule in rules) + { + if (ShowMatchFailedWarning(dotnetJs, rule.old, "dotnet") == false) { + dotnetJs = Regex.Replace(dotnetJs, rule.old, rule.newStr); + } + } + var header = @"WebAssembly.validate = () => true; +const dotnet = (function () {"; + var footer = @"})(); + +function pathToFileURL(path) { + return `file://${path}`; +} + +const wxFetchFile = async (url, config) => new Promise((resolve, reject) => { + const folderPath = `${GameGlobal.manager.PLUGIN_CACHE_PATH}/${config.hash}`; + const filePath = `${folderPath}/${config.filename}`; + const fs = wx.getFileSystemManager(); + var readFile = fs.readFile; + const readFileInfo = { + filePath: filePath, + success: async (res) => { + resolve(res.data); + }, + fail: (err) => { + reject(err); + } + } + if (config.brotli) { + readFile = fs.readCompressedFile; + readFileInfo.compressionAlgorithm = 'br'; + } + const downloadFileInfo = { + url: url, + success: (res) => { + if (res.statusCode === 200) { + try { + fs.accessSync(folderPath); + } catch (e) { + fs.mkdirSync(folderPath, true); + } + saveFile(res.tempFilePath, filePath, res.dataLength); + } else { + reject(res); + } + }, + fail: (err) => { + reject(err); + } + }; + const saveFile = (tempFilePath, filePath, dataLength, retry = 0) => { + try { + fs.saveFileSync(tempFilePath, filePath); + readFile(readFileInfo); + } catch (e) { + if (e.message === 'saveFileSync:fail exceeded the maximum size of the file storage limit') { + if (retry < 3) { + GameGlobal.manager.cleanCache(dataLength).then(() => { + saveFile(tempFilePath, filePath, dataLength, ++retry); + }); + } else { + GameGlobal.manager.cleanAllCache().then(() => { + wx.downloadFile(downloadFileInfo); + }); + } + } else { + reject(e); + } + } + }; + // if not use cache or cache not exists, download file + fs.access({ + path: filePath, + success: (res) => { + if (config.cache && res.errMsg === 'access:ok') { + readFile(readFileInfo); + } else { + wx.downloadFile(downloadFileInfo); + } + }, + fail: (err) => { + wx.downloadFile(downloadFileInfo); + } + }); +}); + +dotnet.dotnet.withResourceLoader((resourceType, assetName, url, requestHash, behavior) => { + const remoteUrl = `${GameGlobal.unityNamespace.DATA_CDN}Code/wwwroot/_framework/${assetName}`; + switch (resourceType) { + case 'dotnetjs': + return assetName; + case 'manifest': + return new Promise((resolve, reject) => { + wx.request({ + url: remoteUrl, + success: (res) => { + resolve({ + json: async () => res.data, + headers: { + get: () => undefined + } + }); + }, + fail: (err) => { + reject(err); + } + }); + }); + case 'symbols': + case 'dotnetwasm': + return new Promise((resolve, reject) => { + resolve({ + arrayBuffer: async () => undefined, + status: 200, + ok: true + }) + }); + case 'assembly': + const config = { + filename: assetName + '.br', + cache: true, + hash: requestHash, + brotli: true + }; + return wxFetchFile(remoteUrl + '.br', config).then(res => ({ + arrayBuffer: async () => res, + status: 200, + ok: true, + })); + default: + return url; + } +}); +var executed = false; +var unityFramework = function (module) { + if (executed) return; + executed = true; + module['noInitialRun'] = true; + return (dotnet.legacyEntrypoint(module)).then(() => { + module['callMain'](); + }); +}; +if (typeof exports === 'object' && typeof module === 'object') module.exports = unityFramework; +else if (typeof define === 'function' && define['amd']) define([], function () { + return unityFramework; +}); +else if (typeof exports === 'object') exports['unityFramework'] = unityFramework; +GameGlobal.unityNamespace.UnityModule = unityFramework;"; + File.WriteAllText(Path.Combine(config.ProjectConf.DST, miniGameDir, frameworkDir, target), header + dotnetJs + footer, new UTF8Encoding(false)); + } + private static void ConvertCode() { UnityEngine.Debug.LogFormat("[Converter] Starting to adapt framewor. Dst: " + config.ProjectConf.DST); UnityUtil.DelectDir(Path.Combine(config.ProjectConf.DST, miniGameDir)); string text = String.Empty; + var target = "webgl.wasm.framework.unityweb.js"; if (WXExtEnvDef.GETDEF("UNITY_2020_1_OR_NEWER")) { - text = File.ReadAllText(Path.Combine(config.ProjectConf.DST, webglDir, "Build", "webgl.framework.js"), Encoding.UTF8); + if (UseIL2CPP) + { + text = File.ReadAllText(Path.Combine(config.ProjectConf.DST, webglDir, "Build", "webgl.framework.js"), Encoding.UTF8); + } + else + { + var frameworkPath = GetWeixinMiniGameFilePath("jsModuleNative")[0]; + target = Path.GetFileName(frameworkPath); + text = File.ReadAllText(frameworkPath, Encoding.UTF8); + } } else { @@ -266,7 +523,10 @@ namespace WeChatWASM for (i = 0; i < ReplaceRules.rules.Length; i++) { var rule = ReplaceRules.rules[i]; - text = Regex.Replace(text, rule.old, rule.newStr); + // text = Regex.Replace(text, rule.old, rule.newStr); + if (ShowMatchFailedWarning(text, rule.old, "WXReplaceRules") == false) { + text = Regex.Replace(text, rule.old, rule.newStr); + } } string[] prefixs = { @@ -318,7 +578,7 @@ namespace WeChatWASM { text += ";GameGlobal.unityNamespace.UnityModule = tuanjieFramework;"; } - else + else if (UseIL2CPP) { if (text.StartsWith("(") && text.EndsWith(")")) { @@ -333,8 +593,13 @@ namespace WeChatWASM Directory.CreateDirectory(Path.Combine(config.ProjectConf.DST, miniGameDir)); } - var header = "function createWebAudio(){window.AudioContext=window.AudioContext||window.webkitAudioContext;if(window.AudioContext){return new AudioContext();}return wx.createWebAudioContext();}\n"; + if (!Directory.Exists(Path.Combine(config.ProjectConf.DST, miniGameDir, frameworkDir))) + { + Directory.CreateDirectory(Path.Combine(config.ProjectConf.DST, miniGameDir, frameworkDir)); + } + var header = "var OriginalAudioContext = window.AudioContext || window.webkitAudioContext;window.AudioContext = function() {if (this instanceof window.AudioContext) {return wx.createWebAudioContext();} else {return new OriginalAudioContext();}};"; + if (config.CompileOptions.DevelopBuild) { header = header + RenderAnalysisRules.header; @@ -346,8 +611,50 @@ namespace WeChatWASM } text = header + text; + if (!UseIL2CPP) + { + Rule[] nativeRules = + { + new Rule() + { + old = "if\\(Module\\.IsWxGame\\)return Math\\.random\\(\\)\\*256\\|0;abort\\(\"randomDevice\"\\)", + newStr = "{if(Module.IsWxGame)return Math.random()*256|0;abort(\"randomDevice\")}" + }, + new Rule() + { + old = "var *_scriptDir *= *import\\.meta\\.url;", + newStr = $"var _scriptDir = \"file:///framework/webgl.wasm.framework.unityweb.js\"", + }, + new Rule() + { + old = "import\\.meta\\.url", + newStr = "_scriptDir" + }, + new Rule() + { + old = "Module\\[['\"](HEAP[U,F,1-9]*)['\"]\\] *=", + newStr = "Module['$1'] = GameGlobal.unityNamespace.Module['$1'] =", + }, + new Rule() + { + old = "return *handleException\\(e\\);?", + newStr = "return handleException(e);} finally {if (ABORT === true) return; if (Module.calledMainCb) Module.calledMainCb(); if (GameGlobal.unityNamespace.enableProfileStats) {setTimeout(() => {SendMessage('WXSDKManagerHandler', 'OpenProfileStats');}, 10000);}" + }, + new Rule() + { + old = "function *callMain\\(args *= *\\[\\]\\)", + newStr = "Object.keys(Module).forEach(key=>{if(!(key in Object.keys(GameGlobal.unityNamespace.Module))){GameGlobal.unityNamespace.Module[key]=Module[key];}});function callMain(args = [])" + }, + }; + foreach (var rule in nativeRules) + { + if (ShowMatchFailedWarning(text, rule.old, "native") == false) { + text = Regex.Replace(text, rule.old, rule.newStr); + } + } + } - File.WriteAllText(Path.Combine(config.ProjectConf.DST, miniGameDir, "webgl.wasm.framework.unityweb.js"), text, new UTF8Encoding(false)); + File.WriteAllText(Path.Combine(config.ProjectConf.DST, miniGameDir, target), text, new UTF8Encoding(false)); UnityEngine.Debug.LogFormat("[Converter] adapt framework done! "); } @@ -358,7 +665,8 @@ namespace WeChatWASM PlayerSettings.WeixinMiniGame.emscriptenArgs = string.Empty; if (WXExtEnvDef.GETDEF("UNITY_2021_2_OR_NEWER")) { - PlayerSettings.WeixinMiniGame.emscriptenArgs += " -s EXPORTED_FUNCTIONS=_main,_sbrk,_emscripten_stack_get_base,_emscripten_stack_get_end"; + // PlayerSettings.WeixinMiniGame.emscriptenArgs += " -s EXPORTED_FUNCTIONS=_main,_sbrk,_emscripten_stack_get_base,_emscripten_stack_get_end"; + PlayerSettings.WeixinMiniGame.emscriptenArgs += " -s EXPORTED_FUNCTIONS=_sbrk,_emscripten_stack_get_base,_emscripten_stack_get_end"; } #else @@ -518,6 +826,13 @@ namespace WeChatWASM } } + private static string[] GetWeixinMiniGameFilePath(string key) + { + var bootJson = Path.Combine(config.ProjectConf.DST, webglDir, "Code", "wwwroot", "_framework", "blazor.boot.json"); + var boot = JsonMapper.ToObject(File.ReadAllText(bootJson, Encoding.UTF8)); + return boot["resources"][key].Keys.Select(file => Path.Combine(config.ProjectConf.DST, webglDir, "Code", "wwwroot", "_framework", file)).ToArray(); + } + private static void finishExport() { int code = GenerateBinFile(); @@ -692,7 +1007,14 @@ namespace WeChatWASM { if (WXExtEnvDef.GETDEF("UNITY_2020_1_OR_NEWER")) { - return Path.Combine(config.ProjectConf.DST, webglDir, "Build", "webgl.wasm"); + if (UseIL2CPP) + { + return Path.Combine(config.ProjectConf.DST, webglDir, "Build", "webgl.wasm"); + } + else + { + return GetWeixinMiniGameFilePath("wasmNative")[0]; + } } else { @@ -1073,6 +1395,7 @@ namespace WeChatWASM IsInstantGameAutoStreaming() ? "true" : "false", (config.CompileOptions.DevelopBuild && config.CompileOptions.enableRenderAnalysis) ? "true" : "false", config.ProjectConf.IOSDevicePixelRatio.ToString(), + UseIL2CPP ? "" : "/framework", }); List replaceList = new List(replaceArrayList); @@ -1238,6 +1561,15 @@ namespace WeChatWASM return ""; #endif } + + public static bool ShowMatchFailedWarning(string text, string rule, string file) + { + if (Regex.IsMatch(text, rule) == false) { + Debug.LogWarning($"UnMatched {file} rule: {rule}"); + return true; + } + return false; + } } } \ No newline at end of file diff --git a/Editor/WXEditorSettingHelper.cs b/Editor/WXEditorSettingHelper.cs new file mode 100644 index 00000000..84bf61d9 --- /dev/null +++ b/Editor/WXEditorSettingHelper.cs @@ -0,0 +1,605 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.IO; +using static WeChatWASM.WXConvertCore; +using System; +using System.Reflection; + +namespace WeChatWASM +{ + + [InitializeOnLoad] + public class WXSettingsHelperInterface + { + public static WXSettingsHelper helper = new WXSettingsHelper(); + } + + public class WXSettingsHelper + { + public WXSettingsHelper() + { + Type weixinMiniGamePackageHelpersType = Type.GetType("UnityEditor.WeixinPackageHelpers,UnityEditor"); + if (weixinMiniGamePackageHelpersType == null) + { + weixinMiniGamePackageHelpersType = Type.GetType("UnityEditor.WeixinMiniGamePackageHelpers,UnityEditor"); + } + if (weixinMiniGamePackageHelpersType != null) + { + EventInfo onSettingsGUIEvent = weixinMiniGamePackageHelpersType.GetEvent("OnPackageSettingsGUI"); + EventInfo onPackageFocusEvent = weixinMiniGamePackageHelpersType.GetEvent("OnPackageFocus"); + EventInfo onPackageLostFocusEvent = weixinMiniGamePackageHelpersType.GetEvent("OnPackageLostFocus"); + EventInfo onBuildButtonGUIEvent = weixinMiniGamePackageHelpersType.GetEvent("OnPackageBuildButtonGUI"); + + if (onPackageFocusEvent != null) + { + onPackageFocusEvent.AddEventHandler(null, new Action(OnFocus)); + } + + if (onPackageLostFocusEvent != null) + { + onPackageLostFocusEvent.AddEventHandler(null, new Action(OnLostFocus)); + } + if (onSettingsGUIEvent != null) + { + onSettingsGUIEvent.AddEventHandler(null, new Action(OnSettingsGUI)); + } + if (onBuildButtonGUIEvent != null) + { + onBuildButtonGUIEvent.AddEventHandler(null, new Action(OnBuildButtonGUI)); + } + + } + + loadData(); + foldInstantGame = WXConvertCore.IsInstantGameAutoStreaming(); + } + + private static WXEditorScriptObject config = UnityUtil.GetEditorConf(); + + + public void OnFocus() + { + loadData(); + } + + public void OnLostFocus() + { + saveData(); + } + + public void OnDisable() + { + EditorUtility.SetDirty(config); + } + + public Texture tex; + public void OnSettingsGUI(EditorWindow window) + { + scrollRoot = EditorGUILayout.BeginScrollView(scrollRoot); + + GUIStyle linkStyle = new GUIStyle(GUI.skin.label); + linkStyle.normal.textColor = Color.yellow; + linkStyle.hover.textColor = Color.yellow; + linkStyle.stretchWidth = false; + linkStyle.alignment = TextAnchor.UpperLeft; + linkStyle.wordWrap = true; + + foldBaseInfo = EditorGUILayout.Foldout(foldBaseInfo, "基本信息"); + if (foldBaseInfo) + { + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + + this.formInput("appid", "游戏AppID"); + this.formInput("cdn", "游戏资源CDN"); + this.formInput("projectName", "小游戏项目名"); + this.formIntPopup("orientation", "游戏方向", new[] { "Portrait", "Landscape", "LandscapeLeft", "LandscapeRight" }, new[] { 0, 1, 2, 3 }); + this.formInput("memorySize", "UnityHeap预留内存(?)", "单位MB,预分配内存值,超休闲游戏256/中轻度496/重度游戏768,需预估游戏最大UnityHeap值以防止内存自动扩容带来的峰值尖刺。预估方法请查看GIT文档《优化Unity WebGL的内存》"); + + GUILayout.BeginHorizontal(); + string targetDst = "dst"; + if (!formInputData.ContainsKey(targetDst)) + { + formInputData[targetDst] = ""; + } + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + GUILayout.Label("导出路径", GUILayout.Width(140)); + formInputData[targetDst] = GUILayout.TextField(formInputData[targetDst], GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 270)); + if (GUILayout.Button(new GUIContent("打开"), GUILayout.Width(40))) + { + if (!formInputData[targetDst].Trim().Equals(string.Empty)) + { + EditorUtility.RevealInFinder(formInputData[targetDst]); + } + GUIUtility.ExitGUI(); + } + if (GUILayout.Button(new GUIContent("选择"), GUILayout.Width(40))) + { + var dstPath = EditorUtility.SaveFolderPanel("选择你的游戏导出目录", string.Empty, string.Empty); + if (dstPath != string.Empty) + { + formInputData[targetDst] = dstPath; + this.saveData(); + } + GUIUtility.ExitGUI(); + } + GUILayout.EndHorizontal(); + + + EditorGUILayout.EndVertical(); + } + + foldLoadingConfig = EditorGUILayout.Foldout(foldLoadingConfig, "启动Loading配置"); + if (foldLoadingConfig) + { + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + + GUILayout.BeginHorizontal(); + string targetBg = "bgImageSrc"; + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + tex = (Texture)EditorGUILayout.ObjectField("启动背景图/视频封面", tex, typeof(Texture2D), false); + var currentBgSrc = AssetDatabase.GetAssetPath(tex); + if (!string.IsNullOrEmpty(currentBgSrc) && currentBgSrc != this.formInputData[targetBg]) + { + this.formInputData[targetBg] = currentBgSrc; + this.saveData(); + } + GUILayout.EndHorizontal(); + + this.formInput("videoUrl", "加载阶段视频URL"); + this.formIntPopup("assetLoadType", "首包资源加载方式", new[] { "CDN", "小游戏包内" }, new[] { 0, 1 }); + this.formCheckbox("compressDataPackage", "压缩首包资源(?)", "将首包资源Brotli压缩, 降低资源大小. 注意: 首次启动耗时可能会增加200ms, 仅推荐使用小游戏分包加载时节省包体大小使用"); + this.formInput("bundleExcludeExtensions", "不自动缓存文件类型(?)", "(使用;分割)当请求url包含资源'cdn+StreamingAssets'时会自动缓存,但StreamingAssets目录下不是所有文件都需缓存,此选项配置不需要自动缓存的文件拓展名。默认值json"); + this.formInput("bundleHashLength", "Bundle名称Hash长度(?)", "自定义Bundle文件名中hash部分长度,默认值32,用于缓存控制。"); + this.formInput("preloadFiles", "预下载文件列表(?)", "使用;间隔,支持模糊匹配"); + + EditorGUILayout.EndVertical(); + } + + foldSDKOptions = EditorGUILayout.Foldout(foldSDKOptions, "SDK功能选项"); + if (foldSDKOptions) + { + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + + this.formCheckbox("useFriendRelation", "使用好友关系链"); + this.formCheckbox("useMiniGameChat", "使用社交组件"); + this.formCheckbox("preloadWXFont", "预加载微信字体(?)", "在game.js执行开始时预载微信系统字体,运行期间可使用WX.GetWXFont获取微信字体"); + + EditorGUILayout.EndVertical(); + } + + foldDebugOptions = EditorGUILayout.Foldout(foldDebugOptions, "调试编译选项"); + if (foldDebugOptions) + { + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + + + this.formCheckbox("developBuild", "Development Build"); + this.formCheckbox("autoProfile", "Auto connect Profiler"); + this.formCheckbox("scriptOnly", "Scripts Only Build"); + this.formCheckbox("il2CppOptimizeSize", "Il2Cpp Optimize Size(?)", "对应于Il2CppCodeGeneration选项,勾选时使用OptimizeSize(默认推荐),生成代码小15%左右,取消勾选则使用OptimizeSpeed。游戏中大量泛型集合的高频访问建议OptimizeSpeed,在使用HybridCLR等第三方组件时只能用OptimizeSpeed。(Dotnet Runtime模式下该选项无效)", !UseIL2CPP); + this.formCheckbox("profilingFuncs", "Profiling Funcs"); + this.formCheckbox("profilingMemory", "Profiling Memory"); + this.formCheckbox("webgl2", "WebGL2.0(beta)"); + this.formCheckbox("iOSPerformancePlus", "iOSPerformancePlus(?)", "是否使用iOS高性能+渲染方案,有助于提升渲染兼容性、降低WebContent进程内存"); + this.formCheckbox("deleteStreamingAssets", "Clear Streaming Assets"); + this.formCheckbox("cleanBuild", "Clean WebGL Build"); + // this.formCheckbox("cleanCloudDev", "Clean Cloud Dev"); + this.formCheckbox("fbslim", "首包资源优化(?)", "导出时自动清理UnityEditor默认打包但游戏项目从未使用的资源,瘦身首包资源体积,建议所有游戏启用。(Dotnet Runtime模式下该选项暂不支持)", !UseIL2CPP, (res) => + { + var fbWin = EditorWindow.GetWindow(typeof(WXFbSettingWindow), false, "首包资源优化配置面板", true); + fbWin.minSize = new Vector2(680, 350); + fbWin.Show(); + }); + this.formCheckbox("showMonitorSuggestModal", "显示优化建议弹窗"); + this.formCheckbox("enableProfileStats", "显示性能面板"); + this.formCheckbox("enableRenderAnalysis", "显示渲染日志(dev only)"); + EditorGUILayout.EndVertical(); + } + +#if UNITY_INSTANTGAME + foldInstantGame = EditorGUILayout.Foldout(foldInstantGame, "Instant Game - AutoStreaming"); + if (foldInstantGame) + { + EditorGUILayout.BeginVertical("frameBox", GUILayout.ExpandWidth(true)); + this.formInput("bundlePathIdentifier", "Bundle Path Identifier"); + this.formInput("dataFileSubPrefix", "Data File Sub Prefix"); + + EditorGUI.BeginDisabledGroup(true); + this.formCheckbox("autoUploadFirstBundle", "构建后自动上传首包(?)", "仅在开启AutoStreaming生效", true); + EditorGUI.EndDisabledGroup(); + + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + GUILayout.Label(new GUIContent("清理AS配置(?)", "如需关闭AutoStreaming选用默认发布方案则需要清理AS配置项目。"), GUILayout.Width(140)); + EditorGUI.BeginDisabledGroup(WXConvertCore.IsInstantGameAutoStreaming()); + if(GUILayout.Button(new GUIContent("恢复"),GUILayout.Width(60))){ + string identifier = config.ProjectConf.bundlePathIdentifier; + string[] identifiers = identifier.Split(";"); + string idStr = ""; + foreach (string id in identifiers) + { + if (id != "AS" && id != "CUS/CustomAB") + { + idStr += id + ";"; + } + } + config.ProjectConf.bundlePathIdentifier = idStr.Trim(';'); + if (config.ProjectConf.dataFileSubPrefix == "CUS") + { + config.ProjectConf.dataFileSubPrefix = ""; + } + this.loadData(); + } + EditorGUI.EndDisabledGroup(); + GUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty); + if (GUILayout.Button(new GUIContent("了解Instant Game AutoStreaming", ""), linkStyle)) + { + Application.OpenURL("https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/InstantGameGuide.md"); + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndVertical(); + } +#endif + + EditorGUILayout.EndScrollView(); + } + + public void OnBuildButtonGUI(EditorWindow window) + { + GUIStyle linkStyle = new GUIStyle(GUI.skin.label); + linkStyle.normal.textColor = Color.yellow; + linkStyle.hover.textColor = Color.yellow; + linkStyle.stretchWidth = false; + linkStyle.alignment = TextAnchor.UpperLeft; + linkStyle.wordWrap = true; + EditorGUILayout.BeginHorizontal(); + if (GUILayout.Button(new GUIContent("更多配置项"), GUILayout.Width(100), GUILayout.Height(25))) + { + var config = AssetDatabase.LoadAssetAtPath("Assets/WX-WASM-SDK-V2/Editor/MiniGameConfig.asset"); + Selection.activeObject = config; + GUIUtility.ExitGUI(); + } + if (GUILayout.Button(new GUIContent("WebGL转小游戏(不常用)"), GUILayout.Width(150), GUILayout.Height(25))) + { + this.saveData(); + if (WXConvertCore.DoExport(false) == WXConvertCore.WXExportError.SUCCEED) + { + window.ShowNotification(new GUIContent("转换完成")); + } + + GUIUtility.ExitGUI(); + } + EditorGUILayout.LabelField(string.Empty, GUILayout.MinWidth(10)); + if (GUILayout.Button(new GUIContent("生成并转换"), GUILayout.Width(100), GUILayout.Height(25))) + { + this.saveData(); + if (WXConvertCore.DoExport() == WXConvertCore.WXExportError.SUCCEED) + { + if (!WXConvertCore.IsInstantGameAutoStreaming()) + window.ShowNotification(new GUIContent("转换完成")); + else + { +#if (UNITY_WEBGL || WEIXINMINIGAME) && UNITY_INSTANTGAME + // 上传首包资源 + if (!string.IsNullOrEmpty(WXConvertCore.FirstBundlePath) && File.Exists(WXConvertCore.FirstBundlePath)) + { + if (Unity.InstantGame.IGBuildPipeline.UploadWeChatDataFile(WXConvertCore.FirstBundlePath)) + { + Debug.Log("转换完成并成功上传首包资源"); + window.ShowNotification(new GUIContent("转换完成并成功上传")); + } + else + { + Debug.LogError("首包资源上传失败,请检查网络以及Auto Streaming配置是否正确。"); + window.ShowNotification(new GUIContent("上传失败")); + } + } + else + { + Debug.LogError("转换失败"); + window.ShowNotification(new GUIContent("转换失败")); + } +#else + window.ShowNotification(new GUIContent("转换完成")); +#endif + } + } + GUIUtility.ExitGUI(); + } + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty); + if (GUILayout.Button(new GUIContent("了解如何实现自定义构建", ""), linkStyle)) + { + Application.OpenURL("https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/DevelopmentQAList.md#13%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A5%E5%85%A5%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B"); + GUIUtility.ExitGUI(); + } + EditorGUILayout.EndHorizontal(); + } + + private Vector2 scrollRoot; + private bool foldBaseInfo = true; + private bool foldLoadingConfig = true; + private bool foldSDKOptions = true; + private bool foldDebugOptions = true; + private bool foldInstantGame = false; + private Dictionary formInputData = new Dictionary(); + private Dictionary formIntPopupData = new Dictionary(); + private Dictionary formCheckboxData = new Dictionary(); + + private string SDKFilePath; + + private void addBundlePathIdentifier(string value) + { + string identifier = config.ProjectConf.bundlePathIdentifier; + if (identifier[identifier.Length - 1] != ';') + { + identifier += ";"; + } + identifier += value; + config.ProjectConf.bundlePathIdentifier = identifier; + } + private void loadData() + { + // SDKFilePath = Path.Combine(Application.dataPath, "WX-WASM-SDK-V2", "Runtime", "wechat-default", "unity-sdk", "index.js"); + SDKFilePath = Path.Combine(UnityUtil.GetWxSDKRootPath(), "Runtime", "wechat-default", "unity-sdk", "index.js"); + config = UnityUtil.GetEditorConf(); + + // Instant Game + if (WXConvertCore.IsInstantGameAutoStreaming()) + { + config.ProjectConf.CDN = WXConvertCore.GetInstantGameAutoStreamingCDN(); + string identifier = config.ProjectConf.bundlePathIdentifier; + string[] identifiers = identifier.Split(';'); + bool AS = false; + bool CUS = false; + foreach (string id in identifiers) + { + if (id == "AS") + { + AS = true; + } + if (id == "CUS/CustomAB") + { + CUS = true; + } + } + if (!AS) + { + this.addBundlePathIdentifier("AS"); + } + if (!CUS) + { + this.addBundlePathIdentifier("CUS/CustomAB"); + } + if (config.ProjectConf.dataFileSubPrefix != "CUS") + { + config.ProjectConf.dataFileSubPrefix = "CUS"; + } + } + + this.setData("projectName", config.ProjectConf.projectName); + this.setData("appid", config.ProjectConf.Appid); + this.setData("cdn", config.ProjectConf.CDN); + this.setData("assetLoadType", config.ProjectConf.assetLoadType); + this.setData("compressDataPackage", config.ProjectConf.compressDataPackage); + this.setData("videoUrl", config.ProjectConf.VideoUrl); + this.setData("orientation", (int)config.ProjectConf.Orientation); + this.setData("dst", config.ProjectConf.DST); + this.setData("bundleHashLength", config.ProjectConf.bundleHashLength.ToString()); + this.setData("bundlePathIdentifier", config.ProjectConf.bundlePathIdentifier); + this.setData("bundleExcludeExtensions", config.ProjectConf.bundleExcludeExtensions); + this.setData("preloadFiles", config.ProjectConf.preloadFiles); + this.setData("developBuild", config.CompileOptions.DevelopBuild); + this.setData("autoProfile", config.CompileOptions.AutoProfile); + this.setData("scriptOnly", config.CompileOptions.ScriptOnly); + this.setData("il2CppOptimizeSize", config.CompileOptions.Il2CppOptimizeSize); + this.setData("profilingFuncs", config.CompileOptions.profilingFuncs); + this.setData("profilingMemory", config.CompileOptions.ProfilingMemory); + this.setData("deleteStreamingAssets", config.CompileOptions.DeleteStreamingAssets); + this.setData("cleanBuild", config.CompileOptions.CleanBuild); + this.setData("customNodePath", config.CompileOptions.CustomNodePath); + this.setData("webgl2", config.CompileOptions.Webgl2); + this.setData("iOSPerformancePlus", config.CompileOptions.enableIOSPerformancePlus); + this.setData("fbslim", config.CompileOptions.fbslim); + this.setData("useFriendRelation", config.SDKOptions.UseFriendRelation); + this.setData("useMiniGameChat", config.SDKOptions.UseMiniGameChat); + this.setData("preloadWXFont", config.SDKOptions.PreloadWXFont); + this.setData("bgImageSrc", config.ProjectConf.bgImageSrc); + tex = AssetDatabase.LoadAssetAtPath(config.ProjectConf.bgImageSrc); + this.setData("memorySize", config.ProjectConf.MemorySize.ToString()); + this.setData("hideAfterCallMain", config.ProjectConf.HideAfterCallMain); + + this.setData("dataFileSubPrefix", config.ProjectConf.dataFileSubPrefix); + this.setData("maxStorage", config.ProjectConf.maxStorage.ToString()); + this.setData("defaultReleaseSize", config.ProjectConf.defaultReleaseSize.ToString()); + this.setData("texturesHashLength", config.ProjectConf.texturesHashLength.ToString()); + this.setData("texturesPath", config.ProjectConf.texturesPath); + this.setData("needCacheTextures", config.ProjectConf.needCacheTextures); + this.setData("loadingBarWidth", config.ProjectConf.loadingBarWidth.ToString()); + this.setData("needCheckUpdate", config.ProjectConf.needCheckUpdate); + this.setData("disableHighPerformanceFallback", config.ProjectConf.disableHighPerformanceFallback); + this.setData("showMonitorSuggestModal", config.CompileOptions.showMonitorSuggestModal); + this.setData("enableProfileStats", config.CompileOptions.enableProfileStats); + this.setData("enableRenderAnalysis", config.CompileOptions.enableRenderAnalysis); + this.setData("autoUploadFirstBundle", true); + } + + private void saveData() + { + config.ProjectConf.projectName = this.getDataInput("projectName"); + config.ProjectConf.Appid = this.getDataInput("appid"); + config.ProjectConf.CDN = this.getDataInput("cdn"); + config.ProjectConf.assetLoadType = this.getDataPop("assetLoadType"); + config.ProjectConf.compressDataPackage = this.getDataCheckbox("compressDataPackage"); + config.ProjectConf.VideoUrl = this.getDataInput("videoUrl"); + config.ProjectConf.Orientation = (WXScreenOritation)this.getDataPop("orientation"); + config.ProjectConf.DST = this.getDataInput("dst"); + config.ProjectConf.bundleHashLength = int.Parse(this.getDataInput("bundleHashLength")); + config.ProjectConf.bundlePathIdentifier = this.getDataInput("bundlePathIdentifier"); + config.ProjectConf.bundleExcludeExtensions = this.getDataInput("bundleExcludeExtensions"); + config.ProjectConf.preloadFiles = this.getDataInput("preloadFiles"); + config.CompileOptions.DevelopBuild = this.getDataCheckbox("developBuild"); + config.CompileOptions.AutoProfile = this.getDataCheckbox("autoProfile"); + config.CompileOptions.ScriptOnly = this.getDataCheckbox("scriptOnly"); + config.CompileOptions.Il2CppOptimizeSize = this.getDataCheckbox("il2CppOptimizeSize"); + config.CompileOptions.profilingFuncs = this.getDataCheckbox("profilingFuncs"); + config.CompileOptions.ProfilingMemory = this.getDataCheckbox("profilingMemory"); + config.CompileOptions.DeleteStreamingAssets = this.getDataCheckbox("deleteStreamingAssets"); + config.CompileOptions.CleanBuild = this.getDataCheckbox("cleanBuild"); + config.CompileOptions.CustomNodePath = this.getDataInput("customNodePath"); + config.CompileOptions.Webgl2 = this.getDataCheckbox("webgl2"); + config.CompileOptions.enableIOSPerformancePlus = this.getDataCheckbox("iOSPerformancePlus"); + config.CompileOptions.fbslim = this.getDataCheckbox("fbslim"); + config.SDKOptions.UseFriendRelation = this.getDataCheckbox("useFriendRelation"); + config.SDKOptions.UseMiniGameChat = this.getDataCheckbox("useMiniGameChat"); + config.SDKOptions.PreloadWXFont = this.getDataCheckbox("preloadWXFont"); + config.ProjectConf.bgImageSrc = this.getDataInput("bgImageSrc"); + config.ProjectConf.MemorySize = int.Parse(this.getDataInput("memorySize")); + config.ProjectConf.HideAfterCallMain = this.getDataCheckbox("hideAfterCallMain"); + config.ProjectConf.dataFileSubPrefix = this.getDataInput("dataFileSubPrefix"); + config.ProjectConf.maxStorage = int.Parse(this.getDataInput("maxStorage")); + config.ProjectConf.defaultReleaseSize = int.Parse(this.getDataInput("defaultReleaseSize")); + config.ProjectConf.texturesHashLength = int.Parse(this.getDataInput("texturesHashLength")); + config.ProjectConf.texturesPath = this.getDataInput("texturesPath"); + config.ProjectConf.needCacheTextures = this.getDataCheckbox("needCacheTextures"); + config.ProjectConf.loadingBarWidth = int.Parse(this.getDataInput("loadingBarWidth")); + config.ProjectConf.needCheckUpdate = this.getDataCheckbox("needCheckUpdate"); + config.ProjectConf.disableHighPerformanceFallback = this.getDataCheckbox("disableHighPerformanceFallback"); + config.CompileOptions.showMonitorSuggestModal = this.getDataCheckbox("showMonitorSuggestModal"); + config.CompileOptions.enableProfileStats = this.getDataCheckbox("enableProfileStats"); + config.CompileOptions.enableRenderAnalysis = this.getDataCheckbox("enableRenderAnalysis"); + } + + private string getDataInput(string target) + { + if (this.formInputData.ContainsKey(target)) + return this.formInputData[target]; + return ""; + } + private int getDataPop(string target) + { + if (this.formIntPopupData.ContainsKey(target)) + return this.formIntPopupData[target]; + return 0; + } + private bool getDataCheckbox(string target) + { + if (this.formCheckboxData.ContainsKey(target)) + return this.formCheckboxData[target]; + return false; + } + + private void setData(string target, string value) + { + if (formInputData.ContainsKey(target)) + { + formInputData[target] = value; + } + else + { + formInputData.Add(target, value); + } + } + private void setData(string target, bool value) + { + if (formCheckboxData.ContainsKey(target)) + { + formCheckboxData[target] = value; + } + else + { + formCheckboxData.Add(target, value); + } + } + private void setData(string target, int value) + { + if (formIntPopupData.ContainsKey(target)) + { + formIntPopupData[target] = value; + } + else + { + formIntPopupData.Add(target, value); + } + } + private void formInput(string target, string label, string help = null) + { + if (!formInputData.ContainsKey(target)) + { + formInputData[target] = ""; + } + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + if (help == null) + { + GUILayout.Label(label, GUILayout.Width(140)); + } + else + { + GUILayout.Label(new GUIContent(label, help), GUILayout.Width(140)); + } + formInputData[target] = GUILayout.TextField(formInputData[target], GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 195)); + GUILayout.EndHorizontal(); + } + + private void formIntPopup(string target, string label, string[] options, int[] values) + { + if (!formIntPopupData.ContainsKey(target)) + { + formIntPopupData[target] = 0; + } + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + GUILayout.Label(label, GUILayout.Width(140)); + formIntPopupData[target] = EditorGUILayout.IntPopup(formIntPopupData[target], options, values, GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 195)); + GUILayout.EndHorizontal(); + } + + private void formCheckbox(string target, string label, string help = null, bool disable = false, Action setting = null) + { + if (!formCheckboxData.ContainsKey(target)) + { + formCheckboxData[target] = false; + } + GUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); + if (help == null) + { + GUILayout.Label(label, GUILayout.Width(140)); + } + else + { + GUILayout.Label(new GUIContent(label, help), GUILayout.Width(140)); + } + EditorGUI.BeginDisabledGroup(disable); + formCheckboxData[target] = EditorGUILayout.Toggle(disable ? false : formCheckboxData[target]); + + if (setting != null) + { + EditorGUILayout.LabelField("", GUILayout.Width(10)); + // 配置按钮 + if (GUILayout.Button(new GUIContent("设置"), GUILayout.Width(40), GUILayout.Height(18))) + { + setting?.Invoke(true); + } + EditorGUILayout.LabelField("", GUILayout.MinWidth(10)); + } + + EditorGUI.EndDisabledGroup(); + + if (setting == null) + EditorGUILayout.LabelField(string.Empty); + GUILayout.EndHorizontal(); + } + + } + + +} diff --git a/Editor/WXEditorSettingHelper.cs.meta b/Editor/WXEditorSettingHelper.cs.meta new file mode 100644 index 00000000..10943ceb --- /dev/null +++ b/Editor/WXEditorSettingHelper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6aad761bd858d8d4880b225d799ed346 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/WXEditorWindow.cs b/Editor/WXEditorWindow.cs index 0339f6c9..e4fb586f 100644 --- a/Editor/WXEditorWindow.cs +++ b/Editor/WXEditorWindow.cs @@ -1,18 +1,12 @@ -using System.Collections; -using System.Collections.Generic; using UnityEngine; using UnityEditor; -using System.IO; using static WeChatWASM.WXConvertCore; -using System; namespace WeChatWASM { public class WXEditorWin : EditorWindow { - private static WXEditorScriptObject config; - private bool fbSlimSupport = true; [MenuItem("微信小游戏 / 转换小游戏", false, 1)] public static void Open() { @@ -30,549 +24,25 @@ namespace WeChatWASM return WXConvertCore.DoExport(buildWebGL); } - // Start is called before the first frame update - void Start() - { - foldInstantGame = WXConvertCore.IsInstantGameAutoStreaming(); - } - - // Update is called once per frame - void Update() - { - - } - public void OnFocus() { - loadData(); + WXSettingsHelperInterface.helper.OnFocus(); } public void OnLostFocus() { - saveData(); + WXSettingsHelperInterface.helper.OnLostFocus(); } public void OnDisable() { - EditorUtility.SetDirty(config); + WXSettingsHelperInterface.helper.OnDisable(); } - public Texture tex; public void OnGUI() { - scrollRoot = EditorGUILayout.BeginScrollView(scrollRoot); - - GUIStyle linkStyle = new GUIStyle(GUI.skin.label); - linkStyle.normal.textColor = Color.yellow; - linkStyle.hover.textColor = Color.yellow; - linkStyle.stretchWidth = false; - linkStyle.alignment = TextAnchor.UpperLeft; - linkStyle.wordWrap = true; - - foldBaseInfo = EditorGUILayout.Foldout(foldBaseInfo, "基本信息"); - if (foldBaseInfo) - { - EditorGUILayout.BeginVertical("frameBox"); - - this.formInput("appid", "游戏AppID"); - this.formInput("cdn", "游戏资源CDN"); - this.formInput("projectName", "小游戏项目名"); - this.formIntPopup("orientation", "游戏方向", new[] { "Portrait", "Landscape", "LandscapeLeft", "LandscapeRight" }, new[] { 0, 1, 2, 3 }); - this.formInput("memorySize", "UnityHeap预留内存(?)", "单位MB,预分配内存值,超休闲游戏256/中轻度496/重度游戏768,需预估游戏最大UnityHeap值以防止内存自动扩容带来的峰值尖刺。预估方法请查看GIT文档《优化Unity WebGL的内存》"); - - GUILayout.BeginHorizontal(); - string targetDst = "dst"; - if (!formInputData.ContainsKey(targetDst)) - { - formInputData[targetDst] = ""; - } - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - GUILayout.Label("导出路径", GUILayout.Width(140)); - formInputData[targetDst] = GUILayout.TextField(formInputData[targetDst], GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 270)); - if (GUILayout.Button(new GUIContent("打开"), GUILayout.Width(40))) - { - if (!formInputData[targetDst].Trim().Equals(string.Empty)) - { - EditorUtility.RevealInFinder(formInputData[targetDst]); - } - GUIUtility.ExitGUI(); - } - if (GUILayout.Button(new GUIContent("选择"), GUILayout.Width(40))) - { - var dstPath = EditorUtility.SaveFolderPanel("选择你的游戏导出目录", string.Empty, string.Empty); - if (dstPath != string.Empty) - { - formInputData[targetDst] = dstPath; - this.saveData(); - } - GUIUtility.ExitGUI(); - } - GUILayout.EndHorizontal(); - - - EditorGUILayout.EndVertical(); - } - - foldLoadingConfig = EditorGUILayout.Foldout(foldLoadingConfig, "启动Loading配置"); - if (foldLoadingConfig) - { - EditorGUILayout.BeginVertical("frameBox"); - - GUILayout.BeginHorizontal(); - string targetBg = "bgImageSrc"; - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - tex = (Texture)EditorGUILayout.ObjectField("启动背景图/视频封面", tex, typeof(Texture2D), false); - var currentBgSrc = AssetDatabase.GetAssetPath(tex); - if (!string.IsNullOrEmpty(currentBgSrc) && currentBgSrc != this.formInputData[targetBg]) - { - this.formInputData[targetBg] = currentBgSrc; - this.saveData(); - } - GUILayout.EndHorizontal(); - - this.formInput("videoUrl", "加载阶段视频URL"); - this.formIntPopup("assetLoadType", "首包资源加载方式", new[] { "CDN", "小游戏包内" }, new[] { 0, 1 }); - this.formCheckbox("compressDataPackage", "压缩首包资源(?)", "将首包资源Brotli压缩, 降低资源大小. 注意: 首次启动耗时可能会增加200ms, 仅推荐使用小游戏分包加载时节省包体大小使用"); - this.formInput("bundleExcludeExtensions", "不自动缓存文件类型(?)", "(使用;分割)当请求url包含资源'cdn+StreamingAssets'时会自动缓存,但StreamingAssets目录下不是所有文件都需缓存,此选项配置不需要自动缓存的文件拓展名。默认值json"); - this.formInput("bundleHashLength", "Bundle名称Hash长度(?)", "自定义Bundle文件名中hash部分长度,默认值32,用于缓存控制。"); - this.formInput("preloadFiles", "预下载文件列表(?)", "使用;间隔,支持模糊匹配"); - - EditorGUILayout.EndVertical(); - } - - foldSDKOptions = EditorGUILayout.Foldout(foldSDKOptions, "SDK功能选项"); - if (foldSDKOptions) - { - EditorGUILayout.BeginVertical("frameBox"); - - this.formCheckbox("useFriendRelation", "使用好友关系链"); - this.formCheckbox("useMiniGameChat", "使用社交组件"); - this.formCheckbox("preloadWXFont", "预加载微信字体(?)", "在game.js执行开始时预载微信系统字体,运行期间可使用WX.GetWXFont获取微信字体"); - - EditorGUILayout.EndVertical(); - } - - foldDebugOptions = EditorGUILayout.Foldout(foldDebugOptions, "调试编译选项"); - if (foldDebugOptions) - { - EditorGUILayout.BeginVertical("frameBox"); - - - this.formCheckbox("developBuild", "Development Build"); - this.formCheckbox("autoProfile", "Auto connect Profiler"); - this.formCheckbox("scriptOnly", "Scripts Only Build"); - this.formCheckbox("il2CppOptimizeSize", "Il2Cpp Optimize Size(?)", "对应于Il2CppCodeGeneration选项,勾选时使用OptimizeSize(默认推荐),生成代码小15%左右,取消勾选则使用OptimizeSpeed。游戏中大量泛型集合的高频访问建议OptimizeSpeed,在使用HybridCLR等第三方组件时只能用OptimizeSpeed。"); - this.formCheckbox("profilingFuncs", "Profiling Funcs"); - this.formCheckbox("profilingMemory", "Profiling Memory"); - this.formCheckbox("webgl2", "WebGL2.0(beta)"); - this.formCheckbox("iOSPerformancePlus", "iOSPerformancePlus(?)", "是否使用iOS高性能+渲染方案,有助于提升渲染兼容性、降低WebContent进程内存"); - this.formCheckbox("deleteStreamingAssets", "Clear Streaming Assets"); - this.formCheckbox("cleanBuild", "Clean WebGL Build"); - // this.formCheckbox("cleanCloudDev", "Clean Cloud Dev"); - this.formCheckbox("fbslim", "首包资源优化(?)", "导出时自动清理UnityEditor默认打包但游戏项目从未使用的资源,瘦身首包资源体积,建议所有游戏启用。" + (this.fbSlimSupport ? "" : "(当前Unity Editor暂不支持该能力)"), !this.fbSlimSupport, (res) => - { - var fbWin = GetWindow(typeof(WXFbSettingWindow), false, "首包资源优化配置面板", true); - fbWin.minSize = new Vector2(680, 350); - fbWin.Show(); - }); - this.formCheckbox("showMonitorSuggestModal", "显示优化建议弹窗"); - this.formCheckbox("enableProfileStats", "显示性能面板"); - this.formCheckbox("enableRenderAnalysis", "显示渲染日志(dev only)"); - EditorGUILayout.EndVertical(); - } - -#if UNITY_INSTANTGAME - foldInstantGame = EditorGUILayout.Foldout(foldInstantGame, "Instant Game - AutoStreaming"); - if (foldInstantGame) - { - EditorGUILayout.BeginVertical("frameBox"); - this.formInput("bundlePathIdentifier", "Bundle Path Identifier"); - this.formInput("dataFileSubPrefix", "Data File Sub Prefix"); - - EditorGUI.BeginDisabledGroup(true); - this.formCheckbox("autoUploadFirstBundle", "构建后自动上传首包(?)", "仅在开启AutoStreaming生效", true); - EditorGUI.EndDisabledGroup(); - - GUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - GUILayout.Label(new GUIContent("清理AS配置(?)", "如需关闭AutoStreaming选用默认发布方案则需要清理AS配置项目。"), GUILayout.Width(140)); - EditorGUI.BeginDisabledGroup(WXConvertCore.IsInstantGameAutoStreaming()); - if(GUILayout.Button(new GUIContent("恢复"),GUILayout.Width(60))){ - string identifier = config.ProjectConf.bundlePathIdentifier; - string[] identifiers = identifier.Split(";"); - string idStr = ""; - foreach (string id in identifiers) - { - if (id != "AS" && id != "CUS/CustomAB") - { - idStr += id + ";"; - } - } - config.ProjectConf.bundlePathIdentifier = idStr.Trim(';'); - if (config.ProjectConf.dataFileSubPrefix == "CUS") - { - config.ProjectConf.dataFileSubPrefix = ""; - } - this.loadData(); - } - EditorGUI.EndDisabledGroup(); - GUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(string.Empty); - if (GUILayout.Button(new GUIContent("了解Instant Game AutoStreaming", ""), linkStyle)) - { - Application.OpenURL("https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/InstantGameGuide.md"); - } - EditorGUILayout.EndHorizontal(); - EditorGUILayout.EndVertical(); - } -#endif - EditorGUILayout.BeginHorizontal(); - if (GUILayout.Button(new GUIContent("更多配置项"), GUILayout.Width(100), GUILayout.Height(25))) - { - var config = AssetDatabase.LoadAssetAtPath("Assets/WX-WASM-SDK-V2/Editor/MiniGameConfig.asset"); - Selection.activeObject = config; - GUIUtility.ExitGUI(); - } - if (GUILayout.Button(new GUIContent("WebGL转小游戏(不常用)"), GUILayout.Width(150), GUILayout.Height(25))) - { - this.saveData(); - if (WXConvertCore.DoExport(false) == WXConvertCore.WXExportError.SUCCEED) - { - ShowNotification(new GUIContent("转换完成")); - } - - GUIUtility.ExitGUI(); - } - EditorGUILayout.LabelField(string.Empty, GUILayout.MinWidth(10)); - if (GUILayout.Button(new GUIContent("生成并转换"), GUILayout.Width(100), GUILayout.Height(25))) - { - this.saveData(); - if (WXConvertCore.DoExport() == WXConvertCore.WXExportError.SUCCEED) - { - if (!WXConvertCore.IsInstantGameAutoStreaming()) - ShowNotification(new GUIContent("转换完成")); - else - { -#if (UNITY_WEBGL || PLATFORM_WEIXINMINIGAME) && UNITY_INSTANTGAME - // 上传首包资源 - if (!string.IsNullOrEmpty(WXConvertCore.FirstBundlePath) && File.Exists(WXConvertCore.FirstBundlePath)) - { - if (Unity.InstantGame.IGBuildPipeline.UploadWeChatDataFile(WXConvertCore.FirstBundlePath)) - { - Debug.Log("转换完成并成功上传首包资源"); - ShowNotification(new GUIContent("转换完成并成功上传")); - } - else - { - Debug.LogError("首包资源上传失败,请检查网络以及Auto Streaming配置是否正确。"); - ShowNotification(new GUIContent("上传失败")); - } - } - else - { - Debug.LogError("转换失败"); - ShowNotification(new GUIContent("转换失败")); - } -#else - ShowNotification(new GUIContent("转换完成")); -#endif - } - } - GUIUtility.ExitGUI(); - } - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(string.Empty); - if (GUILayout.Button(new GUIContent("了解如何实现自定义构建", ""), linkStyle)) - { - Application.OpenURL("https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/DevelopmentQAList.md#13%E5%A6%82%E4%BD%95%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A5%E5%85%A5%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B"); - GUIUtility.ExitGUI(); - } - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.EndScrollView(); + WXSettingsHelperInterface.helper.OnSettingsGUI(this); + WXSettingsHelperInterface.helper.OnBuildButtonGUI(this); } - - - - private Vector2 scrollRoot; - private bool foldBaseInfo = true; - private bool foldLoadingConfig = true; - private bool foldSDKOptions = true; - private bool foldDebugOptions = true; - private bool foldInstantGame = false; - private Dictionary formInputData = new Dictionary(); - private Dictionary formIntPopupData = new Dictionary(); - private Dictionary formCheckboxData = new Dictionary(); - - private string SDKFilePath; - - - private void addBundlePathIdentifier(string value) - { - string identifier = config.ProjectConf.bundlePathIdentifier; - if (identifier[identifier.Length - 1] != ';') - { - identifier += ";"; - } - identifier += value; - config.ProjectConf.bundlePathIdentifier = identifier; - } - private void loadData() - { - // SDKFilePath = Path.Combine(Application.dataPath, "WX-WASM-SDK-V2", "Runtime", "wechat-default", "unity-sdk", "index.js"); - SDKFilePath = Path.Combine(UnityUtil.GetWxSDKRootPath(), "Runtime", "wechat-default", "unity-sdk", "index.js"); - config = UnityUtil.GetEditorConf(); - - // Instant Game - if (WXConvertCore.IsInstantGameAutoStreaming()) - { - config.ProjectConf.CDN = WXConvertCore.GetInstantGameAutoStreamingCDN(); - string identifier = config.ProjectConf.bundlePathIdentifier; - string[] identifiers = identifier.Split(';'); - bool AS = false; - bool CUS = false; - foreach (string id in identifiers) - { - if (id == "AS") - { - AS = true; - } - if (id == "CUS/CustomAB") - { - CUS = true; - } - } - if (!AS) - { - this.addBundlePathIdentifier("AS"); - } - if (!CUS) - { - this.addBundlePathIdentifier("CUS/CustomAB"); - } - if (config.ProjectConf.dataFileSubPrefix != "CUS") - { - config.ProjectConf.dataFileSubPrefix = "CUS"; - } - } - - this.setData("projectName", config.ProjectConf.projectName); - this.setData("appid", config.ProjectConf.Appid); - this.setData("cdn", config.ProjectConf.CDN); - this.setData("assetLoadType", config.ProjectConf.assetLoadType); - this.setData("compressDataPackage", config.ProjectConf.compressDataPackage); - this.setData("videoUrl", config.ProjectConf.VideoUrl); - this.setData("orientation", (int)config.ProjectConf.Orientation); - this.setData("dst", config.ProjectConf.DST); - this.setData("bundleHashLength", config.ProjectConf.bundleHashLength.ToString()); - this.setData("bundlePathIdentifier", config.ProjectConf.bundlePathIdentifier); - this.setData("bundleExcludeExtensions", config.ProjectConf.bundleExcludeExtensions); - this.setData("preloadFiles", config.ProjectConf.preloadFiles); - this.setData("developBuild", config.CompileOptions.DevelopBuild); - this.setData("autoProfile", config.CompileOptions.AutoProfile); - this.setData("scriptOnly", config.CompileOptions.ScriptOnly); - this.setData("il2CppOptimizeSize", config.CompileOptions.Il2CppOptimizeSize); - this.setData("profilingFuncs", config.CompileOptions.profilingFuncs); - this.setData("profilingMemory", config.CompileOptions.ProfilingMemory); - this.setData("deleteStreamingAssets", config.CompileOptions.DeleteStreamingAssets); - this.setData("cleanBuild", config.CompileOptions.CleanBuild); - this.setData("customNodePath", config.CompileOptions.CustomNodePath); - this.setData("webgl2", config.CompileOptions.Webgl2); - this.setData("iOSPerformancePlus", config.CompileOptions.enableIOSPerformancePlus); - this.setData("fbslim", config.CompileOptions.fbslim); - this.setData("useFriendRelation", config.SDKOptions.UseFriendRelation); - this.setData("useMiniGameChat", config.SDKOptions.UseMiniGameChat); - this.setData("preloadWXFont", config.SDKOptions.PreloadWXFont); - this.setData("bgImageSrc", config.ProjectConf.bgImageSrc); - tex = AssetDatabase.LoadAssetAtPath(config.ProjectConf.bgImageSrc); - this.setData("memorySize", config.ProjectConf.MemorySize.ToString()); - this.setData("hideAfterCallMain", config.ProjectConf.HideAfterCallMain); - - this.setData("dataFileSubPrefix", config.ProjectConf.dataFileSubPrefix); - this.setData("maxStorage", config.ProjectConf.maxStorage.ToString()); - this.setData("defaultReleaseSize", config.ProjectConf.defaultReleaseSize.ToString()); - this.setData("texturesHashLength", config.ProjectConf.texturesHashLength.ToString()); - this.setData("texturesPath", config.ProjectConf.texturesPath); - this.setData("needCacheTextures", config.ProjectConf.needCacheTextures); - this.setData("loadingBarWidth", config.ProjectConf.loadingBarWidth.ToString()); - this.setData("needCheckUpdate", config.ProjectConf.needCheckUpdate); - this.setData("disableHighPerformanceFallback", config.ProjectConf.disableHighPerformanceFallback); - this.setData("showMonitorSuggestModal", config.CompileOptions.showMonitorSuggestModal); - this.setData("enableProfileStats", config.CompileOptions.enableProfileStats); - this.setData("enableRenderAnalysis", config.CompileOptions.enableRenderAnalysis); - this.setData("autoUploadFirstBundle", true); - } - - private void saveData() - { - config.ProjectConf.projectName = this.getDataInput("projectName"); - config.ProjectConf.Appid = this.getDataInput("appid"); - config.ProjectConf.CDN = this.getDataInput("cdn"); - config.ProjectConf.assetLoadType = this.getDataPop("assetLoadType"); - config.ProjectConf.compressDataPackage = this.getDataCheckbox("compressDataPackage"); - config.ProjectConf.VideoUrl = this.getDataInput("videoUrl"); - config.ProjectConf.Orientation = (WXScreenOritation)this.getDataPop("orientation"); - config.ProjectConf.DST = this.getDataInput("dst"); - config.ProjectConf.bundleHashLength = int.Parse(this.getDataInput("bundleHashLength")); - config.ProjectConf.bundlePathIdentifier = this.getDataInput("bundlePathIdentifier"); - config.ProjectConf.bundleExcludeExtensions = this.getDataInput("bundleExcludeExtensions"); - config.ProjectConf.preloadFiles = this.getDataInput("preloadFiles"); - config.CompileOptions.DevelopBuild = this.getDataCheckbox("developBuild"); - config.CompileOptions.AutoProfile = this.getDataCheckbox("autoProfile"); - config.CompileOptions.ScriptOnly = this.getDataCheckbox("scriptOnly"); - config.CompileOptions.Il2CppOptimizeSize = this.getDataCheckbox("il2CppOptimizeSize"); - config.CompileOptions.profilingFuncs = this.getDataCheckbox("profilingFuncs"); - config.CompileOptions.ProfilingMemory = this.getDataCheckbox("profilingMemory"); - config.CompileOptions.DeleteStreamingAssets = this.getDataCheckbox("deleteStreamingAssets"); - config.CompileOptions.CleanBuild = this.getDataCheckbox("cleanBuild"); - config.CompileOptions.CustomNodePath = this.getDataInput("customNodePath"); - config.CompileOptions.Webgl2 = this.getDataCheckbox("webgl2"); - config.CompileOptions.enableIOSPerformancePlus = this.getDataCheckbox("iOSPerformancePlus"); - config.CompileOptions.fbslim = this.getDataCheckbox("fbslim"); - config.SDKOptions.UseFriendRelation = this.getDataCheckbox("useFriendRelation"); - config.SDKOptions.UseMiniGameChat = this.getDataCheckbox("useMiniGameChat"); - config.SDKOptions.PreloadWXFont = this.getDataCheckbox("preloadWXFont"); - config.ProjectConf.bgImageSrc = this.getDataInput("bgImageSrc"); - config.ProjectConf.MemorySize = int.Parse(this.getDataInput("memorySize")); - config.ProjectConf.HideAfterCallMain = this.getDataCheckbox("hideAfterCallMain"); - config.ProjectConf.dataFileSubPrefix = this.getDataInput("dataFileSubPrefix"); - config.ProjectConf.maxStorage = int.Parse(this.getDataInput("maxStorage")); - config.ProjectConf.defaultReleaseSize = int.Parse(this.getDataInput("defaultReleaseSize")); - config.ProjectConf.texturesHashLength = int.Parse(this.getDataInput("texturesHashLength")); - config.ProjectConf.texturesPath = this.getDataInput("texturesPath"); - config.ProjectConf.needCacheTextures = this.getDataCheckbox("needCacheTextures"); - config.ProjectConf.loadingBarWidth = int.Parse(this.getDataInput("loadingBarWidth")); - config.ProjectConf.needCheckUpdate = this.getDataCheckbox("needCheckUpdate"); - config.ProjectConf.disableHighPerformanceFallback = this.getDataCheckbox("disableHighPerformanceFallback"); - config.CompileOptions.showMonitorSuggestModal = this.getDataCheckbox("showMonitorSuggestModal"); - config.CompileOptions.enableProfileStats = this.getDataCheckbox("enableProfileStats"); - config.CompileOptions.enableRenderAnalysis = this.getDataCheckbox("enableRenderAnalysis"); - } - - private string getDataInput(string target) - { - if (this.formInputData.ContainsKey(target)) - return this.formInputData[target]; - return ""; - } - private int getDataPop(string target) - { - if (this.formIntPopupData.ContainsKey(target)) - return this.formIntPopupData[target]; - return 0; - } - private bool getDataCheckbox(string target) - { - if (this.formCheckboxData.ContainsKey(target)) - return this.formCheckboxData[target]; - return false; - } - - private void setData(string target, string value) - { - if (formInputData.ContainsKey(target)) - { - formInputData[target] = value; - } - else - { - formInputData.Add(target, value); - } - } - private void setData(string target, bool value) - { - if (formCheckboxData.ContainsKey(target)) - { - formCheckboxData[target] = value; - } - else - { - formCheckboxData.Add(target, value); - } - } - private void setData(string target, int value) - { - if (formIntPopupData.ContainsKey(target)) - { - formIntPopupData[target] = value; - } - else - { - formIntPopupData.Add(target, value); - } - } - private void formInput(string target, string label, string help = null) - { - if (!formInputData.ContainsKey(target)) - { - formInputData[target] = ""; - } - GUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - if (help == null) - { - GUILayout.Label(label, GUILayout.Width(140)); - } - else - { - GUILayout.Label(new GUIContent(label, help), GUILayout.Width(140)); - } - formInputData[target] = GUILayout.TextField(formInputData[target], GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 195)); - GUILayout.EndHorizontal(); - } - - private void formIntPopup(string target, string label, string[] options, int[] values) - { - if (!formIntPopupData.ContainsKey(target)) - { - formIntPopupData[target] = 0; - } - GUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - GUILayout.Label(label, GUILayout.Width(140)); - formIntPopupData[target] = EditorGUILayout.IntPopup(formIntPopupData[target], options, values, GUILayout.MaxWidth(EditorGUIUtility.currentViewWidth - 195)); - GUILayout.EndHorizontal(); - } - - private void formCheckbox(string target, string label, string help = null, bool disable = false, Action setting = null) - { - if (!formCheckboxData.ContainsKey(target)) - { - formCheckboxData[target] = false; - } - GUILayout.BeginHorizontal(); - EditorGUILayout.LabelField(string.Empty, GUILayout.Width(10)); - if (help == null) - { - GUILayout.Label(label, GUILayout.Width(140)); - } - else - { - GUILayout.Label(new GUIContent(label, help), GUILayout.Width(140)); - } - EditorGUI.BeginDisabledGroup(disable); - formCheckboxData[target] = EditorGUILayout.Toggle(formCheckboxData[target]); - - if (setting != null) - { - EditorGUILayout.LabelField("", GUILayout.Width(10)); - // 配置按钮 - if (GUILayout.Button(new GUIContent("设置"), GUILayout.Width(40), GUILayout.Height(18))) - { - setting?.Invoke(true); - } - EditorGUILayout.LabelField("", GUILayout.MinWidth(10)); - } - - EditorGUI.EndDisabledGroup(); - - EditorGUILayout.LabelField(string.Empty); - GUILayout.EndHorizontal(); - } - } } \ No newline at end of file diff --git a/Editor/WXExtDef.cs b/Editor/WXExtDef.cs index 96cad439..8dd25f71 100644 --- a/Editor/WXExtDef.cs +++ b/Editor/WXExtDef.cs @@ -105,6 +105,10 @@ namespace WeChatWASM // #endif // return null; // }); + WXExtEnvDef.RegisterAction("WXConvertCore.UseIL2CPP", (args) => + { + return WXConvertCore.UseIL2CPP; + }); } } } \ No newline at end of file diff --git a/Editor/WXPluginVersion.cs b/Editor/WXPluginVersion.cs index 063a5cc4..6b244d5b 100644 --- a/Editor/WXPluginVersion.cs +++ b/Editor/WXPluginVersion.cs @@ -2,7 +2,7 @@ { public class WXPluginVersion { - public static string pluginVersion = "202403061052"; // 这一行不要改他,导出的时候会自动替换 + public static string pluginVersion = "202403281243"; // 这一行不要改他,导出的时候会自动替换 } public class WXPluginConf diff --git a/Editor/wx-editor.dll b/Editor/wx-editor.dll index 37dcd5f3c6116922a15814860bfc9e05874fc062..048beaee0873a956ebca8a6f4ffa019df5c82cc4 100644 GIT binary patch delta 98851 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 diff --git a/Editor/wx-editor.xml.meta b/Editor/wx-editor.xml.meta index 239b5ec4..e61e2096 100644 --- a/Editor/wx-editor.xml.meta +++ b/Editor/wx-editor.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: dbb11f91282684564a2c405c5c485013 +guid: 89f24ea7e42cd084ab0d5bbd61fa1e3a TextScriptImporter: externalObjects: {} userData: diff --git a/Runtime/Plugins.meta b/Runtime/Plugins.meta index bbb8c9f0..7a15c930 100644 --- a/Runtime/Plugins.meta +++ b/Runtime/Plugins.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cbdd86a6659a24968be342c46c0eeb03 +guid: abc091d8a2f753b49a0e435c823e2c91 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Runtime/Plugins/AES.jslib b/Runtime/Plugins/AES.jslib new file mode 100644 index 00000000..2c3bb9c9 --- /dev/null +++ b/Runtime/Plugins/AES.jslib @@ -0,0 +1,108 @@ +var WebAesLibrary = { + $aesManager: { + instance: null, + mode: 0, + padding: null, + encCallback: null, + decCallback: null, + }, + + WebAesInitialize: function ( + mode, + keyBuffer, + keySize, + ivBuffer, + ivSize, + encCallback, + decCallback, + counter, + segmentSize + ) { + if (typeof window === "undefined" || !window.aesjs) { + throw new Error("Fail to initialize WebAES. window.aesjs not found."); + } + var aesjs = window.aesjs; + var key = new Uint8Array(Module.HEAPU8.buffer, keyBuffer, keySize); + var iv = new Uint8Array(Module.HEAPU8.buffer, ivBuffer, ivSize); + switch (mode) { + case 1: // CBC + aesManager.instance = new aesjs.ModeOfOperation.cbc(key, iv); + break; + case 2: // ECB + aesManager.instance = new aesjs.ModeOfOperation.ecb(key); + break; + case 3: // OFB + aesManager.instance = new aesjs.ModeOfOperation.ofb(key, iv); + break; + case 4: // CFB + aesManager.instance = new aesjs.ModeOfOperation.cfb( + key, + iv, + segmentSize + ); + break; + case 5: + break; // Reserved for CTS + case 6: // CTR, Not used by interop yet + aesManager.instance = new aesjs.ModeOfOperation.ctr(key, counter); + break; + default: + // Default to ECB + aesManager.instance = new aesjs.ModeOfOperation.ecb(key); + } + aesManager.encCallback = encCallback; + aesManager.decCallback = decCallback; + }, + WebAesFinalize: function () { + aesManager = { + instance: null, + mode: 0, + padding: null, + encCallback: null, + decCallback: null, + }; + }, + WebAesEncrypt: function (plainPtr, size, needPad) { + if (aesManager.instance === null) { + throw new Error("Must call initialize before encrypt"); + } + var key = new Uint8Array(Module.HEAPU8.buffer, plainPtr, size); + if (needPad) { + key = aesjs.padding.pkcs7.pad(key); + } + // result is Uint8Array + var result = aesManager.instance.encrypt(key); + var buffer = _malloc(result.length); + HEAPU8.set(result, buffer); + try { + if (aesManager.encCallback) { + Module.dynCall_viii(aesManager.encCallback, 1, buffer, result.length); + } + } finally { + _free(buffer); + } + }, + WebAesDecrypt: function (cipherPtr, size, needStrip) { + if (aesManager.instance === null) { + throw new Error("Must call initialize before decrypt"); + } + var key = new Uint8Array(Module.HEAPU8.buffer, cipherPtr, size); + // result is Uint8Array + var result = aesManager.instance.decrypt(key, needStrip); + if (needStrip) { + result = aesjs.padding.pkcs7.strip(result); + } + var buffer = _malloc(result.length); + HEAPU8.set(result, buffer); + try { + if (aesManager.decCallback) { + Module.dynCall_viii(aesManager.decCallback, 0, buffer, result.length); + } + } finally { + _free(buffer); + } + }, +}; + +autoAddDeps(WebAesLibrary, "$aesManager"); +mergeInto(LibraryManager.library, WebAesLibrary); diff --git a/Runtime/Plugins/AES.jslib.meta b/Runtime/Plugins/AES.jslib.meta new file mode 100644 index 00000000..58497697 --- /dev/null +++ b/Runtime/Plugins/AES.jslib.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: a8be7960d079402392e951de6e3978b7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Plugins/MD5.jslib b/Runtime/Plugins/MD5.jslib new file mode 100644 index 00000000..e3307e6e --- /dev/null +++ b/Runtime/Plugins/MD5.jslib @@ -0,0 +1,8 @@ +mergeInto(LibraryManager.library, { + _WebMD5: function(rawData, dataLength, result) { + var data = new Uint8Array(Module.HEAPU8.buffer, rawData, dataLength); + var md5Result = window.md5WASM(data, true); // Assuming this always returns a Uint8Array of 16 bytes + + Module.HEAPU8.set(md5Result, result); + } +}); diff --git a/Runtime/Plugins/MD5.jslib.meta b/Runtime/Plugins/MD5.jslib.meta new file mode 100644 index 00000000..88fed319 --- /dev/null +++ b/Runtime/Plugins/MD5.jslib.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 9250060552104a8388aaff7dc4f4dde7 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Plugins/SDK-Call-JS-Old.jslib b/Runtime/Plugins/SDK-Call-JS-Old.jslib index 85be43b0..a6a58a2a 100755 --- a/Runtime/Plugins/SDK-Call-JS-Old.jslib +++ b/Runtime/Plugins/SDK-Call-JS-Old.jslib @@ -508,7 +508,11 @@ mergeInto(LibraryManager.library, { if (typeof TOTAL_MEMORY !== "undefined") { return TOTAL_MEMORY } - return buffer.byteLength; + if (wasmMemory && wasmMemory.buffer) { + return wasmMemory.buffer.byteLength; + } + console.error('Fail to find wasmMemory.buffer, TotalMemorySize is not correct.'); + return 0; }, WXGetTotalStackSize: function() { return TOTAL_STACK; @@ -783,7 +787,11 @@ mergeInto(LibraryManager.library, { window.WXWASMSDK.WX_OperateGameRecorderVideo(_WXPointer_stringify_adaptor(option)); }, WXChatCreate: function (option) { - return window.WXWASMSDK.WXChatCreate(_WXPointer_stringify_adaptor(option)); + var returnStr = window.WXWASMSDK.WXChatCreate(_WXPointer_stringify_adaptor(option)); + var bufferSize = lengthBytesUTF8(returnStr || '') + 1; + var buffer = _malloc(bufferSize); + stringToUTF8(returnStr, buffer, bufferSize); + return buffer; }, WXChatHide: function () { window.WXWASMSDK.WXChatHide(); diff --git a/Runtime/Plugins/crypto.jspre b/Runtime/Plugins/crypto.jspre new file mode 100644 index 00000000..6b48853b --- /dev/null +++ b/Runtime/Plugins/crypto.jspre @@ -0,0 +1,1252 @@ +// Check if 'crypto' and 'crypto.getRandomValues' are available +if (typeof crypto === 'undefined' || typeof crypto.getRandomValues !== 'function') { + // Define a mock 'crypto' object if it does not exist + if (typeof crypto === 'undefined') { + globalThis.crypto = {}; + } + + // Implement 'getRandomValues' using 'Math.random' + globalThis.crypto.getRandomValues = function (typedArray) { + for (let i = 0; i < typedArray.length; i++) { + typedArray[i] = Math.floor(Math.random() * 256); + } + return typedArray; + }; +} + +/*! + * MD5 WebAssembly + * https://github.com/briantbutton/md5-wasm + * (c) 2020 Brian Todd Button + * Released under the MIT license + */ + + +// *-*=* *=*-* *-*=* *=*-* *-*=* *=*-* *-*=* *=*-* *-*=* *=*-* *-*=* *=*-* +// This contains two functions designed to achieve the same thing +// -> A WebAssembly function for larger files +// -> A JavaScript function for the others +// +(function () { + + const atb = typeof atob === "function" ? atob : typeof Buffer === "function" ? nodeATOB : identity, + wasmB64 = atb("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"), + wasm = WebAssembly && atb !== identity ? str2AB(wasmB64).buffer : false, + crypt = makeCrypt(), + biteSize = 240 * 16 * 16, + bounder = Math.floor(biteSize * 16 * 1.066666667), + upperLimit = 268435456 - 65536, + parmTypeErrStr = "Parameter must be Buffer, ArrayBuffer or Uint8Array", + tooBigErrStr = "Parameter exceeds max size of 255.9 Mbytes"; + + if (!wasm) { + console.log("WebAssembly not available or WASM module could not be decoded; md5WASM will fall back to JavaScript") + } + // ^> + if (typeof module === 'object' && module.exports) { + module.exports = md5WASM + } + if (typeof define === 'function' && define.amd) { + define('md5WASM', [], function () { return md5WASM }) + } + if (typeof window !== "undefined") { + window.md5WASM = md5WASM + } + // <^ + + return md5WASM; + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - + function md5WASM(data, asBytes) { + var mem, memView, imports, len, buff, result; + const md5JS = makeMD5JS(), + log = console.log; + + // Sift the incoming parameter and the environment + // If we are good, set buff + if (data && typeof data === "object") { + if (typeof Buffer === "function" && data.constructor === Buffer) { + buff = data; + } else { + if (data.constructor === Uint8Array || data.constructor === ArrayBuffer) { + buff = data.constructor === ArrayBuffer ? new Uint8Array(data) : data; + } else { + throw new TypeError(parmTypeErrStr); + } + } + } else { + throw new TypeError(parmTypeErrStr); + } + + if (buff) { + len = buff.length; + if (len > upperLimit) { + throw new Error(tooBigErrStr); + } + else { + result = md5JS(buff, { asBytes: asBytes }); + } + } + + return result; + } + + + function makeMD5WA() { + var loop, loops; + var getA, setA, getB, setB, getC, setC, getD, setD, getX, setX, memView; + + var md5WA = function (message) { + var m00, m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12, m13, m14, m15, aa, bb, cc, dd, m, k; + var qwerty = new Date().getTime(); + var md5Used = 0; + + var a = 1732584193, + b = -271733879, + c = -1732584194, + d = 271733878, + i = 0, + l = message.length * 8, len; + + len = bytesToWordsNewer(message, memView); + memView[l >>> 5] |= 0x80 << (l % 32); + memView[(((l + 64) >>> 9) << 4) + 14] = l; + len = (((l + 64) >>> 9) << 4) + 15; + m = memView + + // console.log("first loop took "+((new Date().getTime())-qwerty)+"ms"); + + while (i < len) { + if (len > i + bounder) { + setA(a); + setB(b); + setC(c); + setD(d); + loops(biteSize); + i = i + biteSize * 16; + a = getA(); + b = getB(); + c = getC(); + d = getD(); + md5Used++ + } else { + aa = a; + bb = b; + cc = c; + dd = d; + m00 = m[i + 0] >>> 0; + m01 = m[i + 1] >>> 0; + m02 = m[i + 2] >>> 0; + m03 = m[i + 3] >>> 0; + m04 = m[i + 4] >>> 0; + m05 = m[i + 5] >>> 0; + m06 = m[i + 6] >>> 0; + m07 = m[i + 7] >>> 0; + m08 = m[i + 8] >>> 0; + m09 = m[i + 9] >>> 0; + m10 = m[i + 10] >>> 0; + m11 = m[i + 11] >>> 0; + m12 = m[i + 12] >>> 0; + m13 = m[i + 13] >>> 0; + m14 = m[i + 14] >>> 0; + m15 = m[i + 15] >>> 0; + + a = ____(7, 25, a + (b & c | ~b & d) + m00 - 680876936) + b; + d = ____(12, 20, d + (a & b | ~a & c) + m01 - 389564586) + a; + c = ____(17, 15, c + (d & a | ~d & b) + m02 + 606105819) + d; + b = ____(22, 10, b + (c & d | ~c & a) + m03 - 1044525330) + c; + a = ____(7, 25, a + (b & c | ~b & d) + m04 - 176418897) + b; + d = ____(12, 20, d + (a & b | ~a & c) + m05 + 1200080426) + a; + c = ____(17, 15, c + (d & a | ~d & b) + m06 - 1473231341) + d; + b = ____(22, 10, b + (c & d | ~c & a) + m07 - 45705983) + c; + a = ____(7, 25, a + (b & c | ~b & d) + m08 + 1770035416) + b; + d = ____(12, 20, d + (a & b | ~a & c) + m09 - 1958414417) + a; + c = ____(17, 15, c + (d & a | ~d & b) + m10 - 42063) + d; + b = ____(22, 10, b + (c & d | ~c & a) + m11 - 1990404162) + c; + a = ____(7, 25, a + (b & c | ~b & d) + m12 + 1804603682) + b; + d = ____(12, 20, d + (a & b | ~a & c) + m13 - 40341101) + a; + c = ____(17, 15, c + (d & a | ~d & b) + m14 - 1502002290) + d; + b = ____(22, 10, b + (c & d | ~c & a) + m15 + 1236535329) + c; + + a = ____(5, 27, a + (b & d | c & ~d) + m01 - 165796510) + b; + d = ____(9, 23, d + (a & c | b & ~c) + m06 - 1069501632) + a; + c = ____(14, 18, c + (d & b | a & ~b) + m11 + 643717713) + d; + b = ____(20, 12, b + (c & a | d & ~a) + m00 - 373897302) + c; + a = ____(5, 27, a + (b & d | c & ~d) + m05 - 701558691) + b; + d = ____(9, 23, d + (a & c | b & ~c) + m10 + 38016083) + a; + c = ____(14, 18, c + (d & b | a & ~b) + m15 - 660478335) + d; + b = ____(20, 12, b + (c & a | d & ~a) + m04 - 405537848) + c; + a = ____(5, 27, a + (b & d | c & ~d) + m09 + 568446438) + b; + d = ____(9, 23, d + (a & c | b & ~c) + m14 - 1019803690) + a; + c = ____(14, 18, c + (d & b | a & ~b) + m03 - 187363961) + d; + b = ____(20, 12, b + (c & a | d & ~a) + m08 + 1163531501) + c; + a = ____(5, 27, a + (b & d | c & ~d) + m13 - 1444681467) + b; + d = ____(9, 23, d + (a & c | b & ~c) + m02 - 51403784) + a; + c = ____(14, 18, c + (d & b | a & ~b) + m07 + 1735328473) + d; + b = ____(20, 12, b + (c & a | d & ~a) + m12 - 1926607734) + c; + + a = ____(4, 28, a + (b ^ c ^ d) + m05 - 378558) + b; + d = ____(11, 21, d + (a ^ b ^ c) + m08 - 2022574463) + a; + c = ____(16, 16, c + (d ^ a ^ b) + m11 + 1839030562) + d; + b = ____(23, 9, b + (c ^ d ^ a) + m14 - 35309556) + c; + a = ____(4, 28, a + (b ^ c ^ d) + m01 - 1530992060) + b; + d = ____(11, 21, d + (a ^ b ^ c) + m04 + 1272893353) + a; + c = ____(16, 16, c + (d ^ a ^ b) + m07 - 155497632) + d; + b = ____(23, 9, b + (c ^ d ^ a) + m10 - 1094730640) + c; + a = ____(4, 28, a + (b ^ c ^ d) + m13 + 681279174) + b; + d = ____(11, 21, d + (a ^ b ^ c) + m00 - 358537222) + a; + c = ____(16, 16, c + (d ^ a ^ b) + m03 - 722521979) + d; + b = ____(23, 9, b + (c ^ d ^ a) + m06 + 76029189) + c; + a = ____(4, 28, a + (b ^ c ^ d) + m09 - 640364487) + b; + d = ____(11, 21, d + (a ^ b ^ c) + m12 - 421815835) + a; + c = ____(16, 16, c + (d ^ a ^ b) + m15 + 530742520) + d; + b = ____(23, 9, b + (c ^ d ^ a) + m02 - 995338651) + c; + + a = ____(6, 26, a + (c ^ (b | ~d)) + m00 - 198630844) + b; + d = ____(10, 22, d + (b ^ (a | ~c)) + m07 + 1126891415) + a; + c = ____(15, 17, c + (a ^ (d | ~b)) + m14 - 1416354905) + d; + b = ____(21, 11, b + (d ^ (c | ~a)) + m05 - 57434055) + c; + a = ____(6, 26, a + (c ^ (b | ~d)) + m12 + 1700485571) + b; + d = ____(10, 22, d + (b ^ (a | ~c)) + m03 - 1894986606) + a; + c = ____(15, 17, c + (a ^ (d | ~b)) + m10 - 1051523) + d; + b = ____(21, 11, b + (d ^ (c | ~a)) + m01 - 2054922799) + c; + a = ____(6, 26, a + (c ^ (b | ~d)) + m08 + 1873313359) + b; + d = ____(10, 22, d + (b ^ (a | ~c)) + m15 - 30611744) + a; + c = ____(15, 17, c + (a ^ (d | ~b)) + m06 - 1560198380) + d; + b = ____(21, 11, b + (d ^ (c | ~a)) + m13 + 1309151649) + c; + a = ____(6, 26, a + (c ^ (b | ~d)) + m04 - 145523070) + b; + d = ____(10, 22, d + (b ^ (a | ~c)) + m11 - 1120210379) + a; + c = ____(15, 17, c + (a ^ (d | ~b)) + m02 + 718787259) + d; + b = ____(21, 11, b + (d ^ (c | ~a)) + m09 - 343485551) + c; + + i = i + 16; + a = (a + aa) >>> 0; + b = (b + bb) >>> 0; + c = (c + cc) >>> 0; + d = (d + dd) >>> 0; + } + } + + // console.log("md5WA, elapsed="+((new Date().getTime())-qwerty)+(md5Used?", WebAssembly called "+md5Used+" times":", WebAssembly not called")); + + return crypt.endian([a, b, c, d]); + + function ____(s, t, n) { return ((n << s) | (n >>> t)) } + + // Convert a byte array to big-endian 32-bit words + function bytesToWordsNewer(bytes, words) { + var i = -1, + l = Math.floor((bytes.length - 1) / 4), + j = 0, b0, b1, b2, b3; + while (l - 8 > i++) { + j = i << 2; + words[i] = (bytes[j + 0]) | (bytes[j + 1] << 8) | (bytes[j + 2] << 16) | (bytes[j + 3] << 24) + } + i--; + while (l > i++) { + j = i << 2; + b0 = typeof bytes[j + 0] === "undefined" ? 0 : bytes[j + 0]; + b1 = typeof bytes[j + 1] === "undefined" ? 0 : bytes[j + 1]; + b2 = typeof bytes[j + 2] === "undefined" ? 0 : bytes[j + 2]; + b3 = typeof bytes[j + 3] === "undefined" ? 0 : bytes[j + 3]; + words[i] = b0 | b1 << 8 | b2 << 16 | b3 << 24 + } + return l + 1; + } + }; + + return function (message, exports, mView, options) { + var digestbytes; + loops = exports.loops; + loop = exports.loop; + getA = exports.getA; + getB = exports.getB; + getC = exports.getC; + getD = exports.getD; + getX = exports.getX; + setA = exports.setA; + setB = exports.setB; + setC = exports.setC; + setD = exports.setD; + setX = exports.setX; + memView = mView; + digestbytes = crypt.wordsToBytes(md5WA(message)); + return options && options.asBytes ? digestbytes : crypt.bytesToHex(digestbytes) + } + } + + function makeMD5JS() { + + var md5JS = function (message, options) { + var m00, m01, m02, m03, m04, m05, m06, m07, m08, m09, m10, m11, m12, m13, m14, m15, aa, bb, cc, dd, m; + var qwerty = new Date().getTime(); + + // console.log("md5 start"); + + var a = 1732584193, + b = -271733879, + c = -1732584194, + d = 271733878, + l = message.length * 8; + + m = crypt.bytesToWords(message); + + // Swap endian + for (var j = 0; j < m.length; j++) { + m[j] = ((m[j] << 8) | (m[j] >>> 24)) & 0x00FF00FF | ((m[j] << 24) | (m[j] >>> 8)) & 0xFF00FF00; + } + + // Padding + m[l >>> 5] |= 0x80 << (l % 32); + m[(((l + 64) >>> 9) << 4) + 14] = l; + + for (var i = 0; i < m.length; i += 16) { + aa = a; + bb = b; + cc = c; + dd = d; + m00 = m[i + 0] >>> 0; + m01 = m[i + 1] >>> 0; + m02 = m[i + 2] >>> 0; + m03 = m[i + 3] >>> 0; + m04 = m[i + 4] >>> 0; + m05 = m[i + 5] >>> 0; + m06 = m[i + 6] >>> 0; + m07 = m[i + 7] >>> 0; + m08 = m[i + 8] >>> 0; + m09 = m[i + 9] >>> 0; + m10 = m[i + 10] >>> 0; + m11 = m[i + 11] >>> 0; + m12 = m[i + 12] >>> 0; + m13 = m[i + 13] >>> 0; + m14 = m[i + 14] >>> 0; + m15 = m[i + 15] >>> 0; + + a = ____(7, 25, a + (b & c | ~b & d) + m00 - 680876936) + b; + d = ____(12, 20, d + (a & b | ~a & c) + m01 - 389564586) + a; + c = ____(17, 15, c + (d & a | ~d & b) + m02 + 606105819) + d; + b = ____(22, 10, b + (c & d | ~c & a) + m03 - 1044525330) + c; + a = ____(7, 25, a + (b & c | ~b & d) + m04 - 176418897) + b; + d = ____(12, 20, d + (a & b | ~a & c) + m05 + 1200080426) + a; + c = ____(17, 15, c + (d & a | ~d & b) + m06 - 1473231341) + d; + b = ____(22, 10, b + (c & d | ~c & a) + m07 - 45705983) + c; + a = ____(7, 25, a + (b & c | ~b & d) + m08 + 1770035416) + b; + d = ____(12, 20, d + (a & b | ~a & c) + m09 - 1958414417) + a; + c = ____(17, 15, c + (d & a | ~d & b) + m10 - 42063) + d; + b = ____(22, 10, b + (c & d | ~c & a) + m11 - 1990404162) + c; + a = ____(7, 25, a + (b & c | ~b & d) + m12 + 1804603682) + b; + d = ____(12, 20, d + (a & b | ~a & c) + m13 - 40341101) + a; + c = ____(17, 15, c + (d & a | ~d & b) + m14 - 1502002290) + d; + b = ____(22, 10, b + (c & d | ~c & a) + m15 + 1236535329) + c; + + a = ____(5, 27, a + (b & d | c & ~d) + m01 - 165796510) + b; + d = ____(9, 23, d + (a & c | b & ~c) + m06 - 1069501632) + a; + c = ____(14, 18, c + (d & b | a & ~b) + m11 + 643717713) + d; + b = ____(20, 12, b + (c & a | d & ~a) + m00 - 373897302) + c; + a = ____(5, 27, a + (b & d | c & ~d) + m05 - 701558691) + b; + d = ____(9, 23, d + (a & c | b & ~c) + m10 + 38016083) + a; + c = ____(14, 18, c + (d & b | a & ~b) + m15 - 660478335) + d; + b = ____(20, 12, b + (c & a | d & ~a) + m04 - 405537848) + c; + a = ____(5, 27, a + (b & d | c & ~d) + m09 + 568446438) + b; + d = ____(9, 23, d + (a & c | b & ~c) + m14 - 1019803690) + a; + c = ____(14, 18, c + (d & b | a & ~b) + m03 - 187363961) + d; + b = ____(20, 12, b + (c & a | d & ~a) + m08 + 1163531501) + c; + a = ____(5, 27, a + (b & d | c & ~d) + m13 - 1444681467) + b; + d = ____(9, 23, d + (a & c | b & ~c) + m02 - 51403784) + a; + c = ____(14, 18, c + (d & b | a & ~b) + m07 + 1735328473) + d; + b = ____(20, 12, b + (c & a | d & ~a) + m12 - 1926607734) + c; + + a = ____(4, 28, a + (b ^ c ^ d) + m05 - 378558) + b; + d = ____(11, 21, d + (a ^ b ^ c) + m08 - 2022574463) + a; + c = ____(16, 16, c + (d ^ a ^ b) + m11 + 1839030562) + d; + b = ____(23, 9, b + (c ^ d ^ a) + m14 - 35309556) + c; + a = ____(4, 28, a + (b ^ c ^ d) + m01 - 1530992060) + b; + d = ____(11, 21, d + (a ^ b ^ c) + m04 + 1272893353) + a; + c = ____(16, 16, c + (d ^ a ^ b) + m07 - 155497632) + d; + b = ____(23, 9, b + (c ^ d ^ a) + m10 - 1094730640) + c; + a = ____(4, 28, a + (b ^ c ^ d) + m13 + 681279174) + b; + d = ____(11, 21, d + (a ^ b ^ c) + m00 - 358537222) + a; + c = ____(16, 16, c + (d ^ a ^ b) + m03 - 722521979) + d; + b = ____(23, 9, b + (c ^ d ^ a) + m06 + 76029189) + c; + a = ____(4, 28, a + (b ^ c ^ d) + m09 - 640364487) + b; + d = ____(11, 21, d + (a ^ b ^ c) + m12 - 421815835) + a; + c = ____(16, 16, c + (d ^ a ^ b) + m15 + 530742520) + d; + b = ____(23, 9, b + (c ^ d ^ a) + m02 - 995338651) + c; + + a = ____(6, 26, a + (c ^ (b | ~d)) + m00 - 198630844) + b; + d = ____(10, 22, d + (b ^ (a | ~c)) + m07 + 1126891415) + a; + c = ____(15, 17, c + (a ^ (d | ~b)) + m14 - 1416354905) + d; + b = ____(21, 11, b + (d ^ (c | ~a)) + m05 - 57434055) + c; + a = ____(6, 26, a + (c ^ (b | ~d)) + m12 + 1700485571) + b; + d = ____(10, 22, d + (b ^ (a | ~c)) + m03 - 1894986606) + a; + c = ____(15, 17, c + (a ^ (d | ~b)) + m10 - 1051523) + d; + b = ____(21, 11, b + (d ^ (c | ~a)) + m01 - 2054922799) + c; + a = ____(6, 26, a + (c ^ (b | ~d)) + m08 + 1873313359) + b; + d = ____(10, 22, d + (b ^ (a | ~c)) + m15 - 30611744) + a; + c = ____(15, 17, c + (a ^ (d | ~b)) + m06 - 1560198380) + d; + b = ____(21, 11, b + (d ^ (c | ~a)) + m13 + 1309151649) + c; + a = ____(6, 26, a + (c ^ (b | ~d)) + m04 - 145523070) + b; + d = ____(10, 22, d + (b ^ (a | ~c)) + m11 - 1120210379) + a; + c = ____(15, 17, c + (a ^ (d | ~b)) + m02 + 718787259) + d; + b = ____(21, 11, b + (d ^ (c | ~a)) + m09 - 343485551) + c; + + a = (a + aa) >>> 0; + b = (b + bb) >>> 0; + c = (c + cc) >>> 0; + d = (d + dd) >>> 0; + } + + // console.log("md5JS, elapsed="+((new Date().getTime())-qwerty)); + + return crypt.endian([a, b, c, d]); + + function ____(s, t, n) { return ((n << s) | (n >>> t)) } + }; + + return function (message, options) { + var digestbytes = crypt.wordsToBytes(md5JS(message, options)); + return options && options.asBytes ? digestbytes : crypt.bytesToHex(digestbytes) + } + } + function str2AB(str) { + var l, buff, buffView, i = -1; + l = str.length - 1; + buff = new ArrayBuffer(str.length); + buffView = new Uint8Array(buff); + while (l > i++) { + buffView[i] = str.charCodeAt(i) + } + return buffView + } + function nodeATOB(str) { + return Buffer.from(str, "base64").toString("binary") + } + function identity(x) { + return x + } + function webAssemblyPages(len) { + return len > 32000000 ? len > 64000000 ? len > 128000000 ? 4096 : 2048 : 1024 : 512 + } + + function makeCrypt() { + var base64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + + return { + rotl: function (n, b) { + return (n << b) | (n >>> (32 - b)); + }, + + endian: function (n) { + if (n.constructor == Number) { + return crypt.rotl(n, 8) & 0x00FF00FF | crypt.rotl(n, 24) & 0xFF00FF00; + } + for (var i = 0; i < n.length; i++) + n[i] = crypt.endian(n[i]); + return n; + }, + + bytesToWords: function (bytes) { + for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8) + words[b >>> 5] |= bytes[i] << (24 - b % 32); + return words; + }, + + wordsToBytes: function (words) { + for (var bytes = [], b = 0; b < words.length * 32; b += 8) + bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF); + return bytes; + }, + + bytesToHex: function (bytes) { + for (var hex = [], i = 0; i < bytes.length; i++) { + hex.push((bytes[i] >>> 4).toString(16)); + hex.push((bytes[i] & 0xF).toString(16)); + } + return hex.join(''); + } + } + } +})(); + + +/* AES aesjs */ +/*! MIT License. Copyright 2015-2018 Richard Moore . See LICENSE.txt. */ +(function() { + function checkInt(value) { + return (parseInt(value) === value); + } + + function checkInts(arrayish) { + if (!checkInt(arrayish.length)) { return false; } + + for (var i = 0; i < arrayish.length; i++) { + if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) { + return false; + } + } + + return true; + } + + function coerceArray(arg, copy) { + + // ArrayBuffer view + if (arg.buffer && arg instanceof Uint8Array) { + if (copy) { + if (arg.slice) { + arg = arg.slice(); + } else { + arg = Array.prototype.slice.call(arg); + } + } + + return arg; + } + + // It's an array; check it is a valid representation of a byte + if (Array.isArray(arg)) { + if (!checkInts(arg)) { + throw new Error('Array contains invalid value: ' + arg); + } + + return new Uint8Array(arg); + } + + // Something else, but behaves like an array (maybe a Buffer? Arguments?) + if (checkInt(arg.length) && checkInts(arg)) { + return new Uint8Array(arg); + } + + throw new Error('unsupported array-like object'); + } + + function createArray(length) { + return new Uint8Array(length); + } + + function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) { + if (sourceStart != null || sourceEnd != null) { + if (sourceArray.slice) { + sourceArray = sourceArray.slice(sourceStart, sourceEnd); + } else { + sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd); + } + } + targetArray.set(sourceArray, targetStart); + } + + + + var convertUtf8 = (function() { + function toBytes(text) { + var result = [], i = 0; + text = encodeURI(text); + while (i < text.length) { + var c = text.charCodeAt(i++); + + // if it is a % sign, encode the following 2 bytes as a hex value + if (c === 37) { + result.push(parseInt(text.substr(i, 2), 16)) + i += 2; + + // otherwise, just the actual byte + } else { + result.push(c) + } + } + + return coerceArray(result); + } + + function fromBytes(bytes) { + var result = [], i = 0; + + while (i < bytes.length) { + var c = bytes[i]; + + if (c < 128) { + result.push(String.fromCharCode(c)); + i++; + } else if (c > 191 && c < 224) { + result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f))); + i += 2; + } else { + result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f))); + i += 3; + } + } + + return result.join(''); + } + + return { + toBytes: toBytes, + fromBytes: fromBytes, + } + })(); + + var convertHex = (function() { + function toBytes(text) { + var result = []; + for (var i = 0; i < text.length; i += 2) { + result.push(parseInt(text.substr(i, 2), 16)); + } + + return result; + } + + // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html + var Hex = '0123456789abcdef'; + + function fromBytes(bytes) { + var result = []; + for (var i = 0; i < bytes.length; i++) { + var v = bytes[i]; + result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]); + } + return result.join(''); + } + + return { + toBytes: toBytes, + fromBytes: fromBytes, + } + })(); + + + // Number of rounds by keysize + var numberOfRounds = {16: 10, 24: 12, 32: 14} + + // Round constant words + var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; + + // S-box and Inverse S-box (S is for Substitution) + var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]; + var Si =[0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; + + // Transformations for encryption + var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a]; + var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616]; + var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16]; + var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; + + // Transformations for decryption + var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742]; + var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857]; + var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8]; + var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; + + // Transformations for decryption key expansion + var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]; + var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697]; + var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46]; + var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d]; + + function convertToInt32(bytes) { + var result = []; + for (var i = 0; i < bytes.length; i += 4) { + result.push( + (bytes[i ] << 24) | + (bytes[i + 1] << 16) | + (bytes[i + 2] << 8) | + bytes[i + 3] + ); + } + return result; + } + + var AES = function(key) { + if (!(this instanceof AES)) { + throw Error('AES must be instantiated with `new`'); + } + + Object.defineProperty(this, 'key', { + value: coerceArray(key, true) + }); + + this._prepare(); + } + + + AES.prototype._prepare = function() { + + var rounds = numberOfRounds[this.key.length]; + if (rounds == null) { + throw new Error('invalid key size (must be 16, 24 or 32 bytes)'); + } + + // encryption round keys + this._Ke = []; + + // decryption round keys + this._Kd = []; + + for (var i = 0; i <= rounds; i++) { + this._Ke.push([0, 0, 0, 0]); + this._Kd.push([0, 0, 0, 0]); + } + + var roundKeyCount = (rounds + 1) * 4; + var KC = this.key.length / 4; + + // convert the key into ints + var tk = convertToInt32(this.key); + + // copy values into round key arrays + var index; + for (var i = 0; i < KC; i++) { + index = i >> 2; + this._Ke[index][i % 4] = tk[i]; + this._Kd[rounds - index][i % 4] = tk[i]; + } + + // key expansion (fips-197 section 5.2) + var rconpointer = 0; + var t = KC, tt; + while (t < roundKeyCount) { + tt = tk[KC - 1]; + tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^ + (S[(tt >> 8) & 0xFF] << 16) ^ + (S[ tt & 0xFF] << 8) ^ + S[(tt >> 24) & 0xFF] ^ + (rcon[rconpointer] << 24)); + rconpointer += 1; + + // key expansion (for non-256 bit) + if (KC != 8) { + for (var i = 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + + // key expansion for 256-bit keys is "slightly different" (fips-197) + } else { + for (var i = 1; i < (KC / 2); i++) { + tk[i] ^= tk[i - 1]; + } + tt = tk[(KC / 2) - 1]; + + tk[KC / 2] ^= (S[ tt & 0xFF] ^ + (S[(tt >> 8) & 0xFF] << 8) ^ + (S[(tt >> 16) & 0xFF] << 16) ^ + (S[(tt >> 24) & 0xFF] << 24)); + + for (var i = (KC / 2) + 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + } + + // copy values into round key arrays + var i = 0, r, c; + while (i < KC && t < roundKeyCount) { + r = t >> 2; + c = t % 4; + this._Ke[r][c] = tk[i]; + this._Kd[rounds - r][c] = tk[i++]; + t++; + } + } + + // inverse-cipher-ify the decryption round key (fips-197 section 5.3) + for (var r = 1; r < rounds; r++) { + for (var c = 0; c < 4; c++) { + tt = this._Kd[r][c]; + this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^ + U2[(tt >> 16) & 0xFF] ^ + U3[(tt >> 8) & 0xFF] ^ + U4[ tt & 0xFF]); + } + } + } + + AES.prototype.encrypt = function(plaintext) { + if (plaintext.length != 16) { + throw new Error('invalid plaintext size (must be 16 bytes)'); + } + + var rounds = this._Ke.length - 1; + var a = [0, 0, 0, 0]; + + // convert plaintext to (ints ^ key) + var t = convertToInt32(plaintext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Ke[0][i]; + } + + // apply round transforms + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = (T1[(t[ i ] >> 24) & 0xff] ^ + T2[(t[(i + 1) % 4] >> 16) & 0xff] ^ + T3[(t[(i + 2) % 4] >> 8) & 0xff] ^ + T4[ t[(i + 3) % 4] & 0xff] ^ + this._Ke[r][i]); + } + t = a.slice(); + } + + // the last round is special + var result = createArray(16), tt; + for (var i = 0; i < 4; i++) { + tt = this._Ke[rounds][i]; + result[4 * i ] = (S[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; + result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; + result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; + result[4 * i + 3] = (S[ t[(i + 3) % 4] & 0xff] ^ tt ) & 0xff; + } + + return result; + } + + AES.prototype.decrypt = function(ciphertext) { + if (ciphertext.length != 16) { + throw new Error('invalid ciphertext size (must be 16 bytes)'); + } + + var rounds = this._Kd.length - 1; + var a = [0, 0, 0, 0]; + + // convert plaintext to (ints ^ key) + var t = convertToInt32(ciphertext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Kd[0][i]; + } + + // apply round transforms + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = (T5[(t[ i ] >> 24) & 0xff] ^ + T6[(t[(i + 3) % 4] >> 16) & 0xff] ^ + T7[(t[(i + 2) % 4] >> 8) & 0xff] ^ + T8[ t[(i + 1) % 4] & 0xff] ^ + this._Kd[r][i]); + } + t = a.slice(); + } + + // the last round is special + var result = createArray(16), tt; + for (var i = 0; i < 4; i++) { + tt = this._Kd[rounds][i]; + result[4 * i ] = (Si[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; + result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; + result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; + result[4 * i + 3] = (Si[ t[(i + 1) % 4] & 0xff] ^ tt ) & 0xff; + } + + return result; + } + + + /** + * Mode Of Operation - Electonic Codebook (ECB) + */ + var ModeOfOperationECB = function(key) { + if (!(this instanceof ModeOfOperationECB)) { + throw Error('AES must be instantiated with `new`'); + } + + this.description = "Electronic Code Block"; + this.name = "ecb"; + + this._aes = new AES(key); + } + + ModeOfOperationECB.prototype.encrypt = function(plaintext) { + plaintext = coerceArray(plaintext); + + if ((plaintext.length % 16) !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } + + var ciphertext = createArray(plaintext.length); + var block = createArray(16); + + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); + block = this._aes.encrypt(block); + copyArray(block, ciphertext, i); + } + + return ciphertext; + } + + ModeOfOperationECB.prototype.decrypt = function(ciphertext) { + ciphertext = coerceArray(ciphertext); + + if ((ciphertext.length % 16) !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } + + var plaintext = createArray(ciphertext.length); + var block = createArray(16); + + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); + copyArray(block, plaintext, i); + } + return plaintext; + } + + + /** + * Mode Of Operation - Cipher Block Chaining (CBC) + */ + var ModeOfOperationCBC = function(key, iv) { + if (!(this instanceof ModeOfOperationCBC)) { + throw Error('AES must be instantiated with `new`'); + } + + this.description = "Cipher Block Chaining"; + this.name = "cbc"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialization vector size (must be 16 bytes)'); + } + + this._lastCipherblock = coerceArray(iv, true); + + this._aes = new AES(key); + } + + ModeOfOperationCBC.prototype.encrypt = function(plaintext) { + plaintext = coerceArray(plaintext); + + if ((plaintext.length % 16) !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } + + var ciphertext = createArray(plaintext.length); + var block = createArray(16); + + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); + + for (var j = 0; j < 16; j++) { + block[j] ^= this._lastCipherblock[j]; + } + + this._lastCipherblock = this._aes.encrypt(block); + copyArray(this._lastCipherblock, ciphertext, i); + } + + return ciphertext; + } + + ModeOfOperationCBC.prototype.decrypt = function(ciphertext) { + ciphertext = coerceArray(ciphertext); + + if ((ciphertext.length % 16) !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } + + var plaintext = createArray(ciphertext.length); + var block = createArray(16); + + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); + + for (var j = 0; j < 16; j++) { + plaintext[i + j] = block[j] ^ this._lastCipherblock[j]; + } + + copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16); + } + + return plaintext; + } + + + /** + * Mode Of Operation - Cipher Feedback (CFB) + */ + var ModeOfOperationCFB = function(key, iv, segmentSize) { + if (!(this instanceof ModeOfOperationCFB)) { + throw Error('AES must be instantiated with `new`'); + } + + this.description = "Cipher Feedback"; + this.name = "cfb"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialization vector size (must be 16 size)'); + } + + if (!segmentSize) { segmentSize = 1; } + + this.segmentSize = segmentSize; + + this._shiftRegister = coerceArray(iv, true); + + this._aes = new AES(key); + } + + ModeOfOperationCFB.prototype.encrypt = function(plaintext) { + if ((plaintext.length % this.segmentSize) != 0) { + throw new Error('invalid plaintext size (must be segmentSize bytes)'); + } + + var encrypted = coerceArray(plaintext, true); + + var xorSegment; + for (var i = 0; i < encrypted.length; i += this.segmentSize) { + xorSegment = this._aes.encrypt(this._shiftRegister); + for (var j = 0; j < this.segmentSize; j++) { + encrypted[i + j] ^= xorSegment[j]; + } + + // Shift the register + copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); + copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + } + + return encrypted; + } + + ModeOfOperationCFB.prototype.decrypt = function(ciphertext) { + if ((ciphertext.length % this.segmentSize) != 0) { + throw new Error('invalid ciphertext size (must be segmentSize bytes)'); + } + + var plaintext = coerceArray(ciphertext, true); + + var xorSegment; + for (var i = 0; i < plaintext.length; i += this.segmentSize) { + xorSegment = this._aes.encrypt(this._shiftRegister); + + for (var j = 0; j < this.segmentSize; j++) { + plaintext[i + j] ^= xorSegment[j]; + } + + // Shift the register + copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); + copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + } + + return plaintext; + } + + /** + * Mode Of Operation - Output Feedback (OFB) + */ + var ModeOfOperationOFB = function(key, iv) { + if (!(this instanceof ModeOfOperationOFB)) { + throw Error('AES must be instantiated with `new`'); + } + + this.description = "Output Feedback"; + this.name = "ofb"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialization vector size (must be 16 bytes)'); + } + + this._lastPrecipher = coerceArray(iv, true); + this._lastPrecipherIndex = 16; + + this._aes = new AES(key); + } + + ModeOfOperationOFB.prototype.encrypt = function(plaintext) { + var encrypted = coerceArray(plaintext, true); + + for (var i = 0; i < encrypted.length; i++) { + if (this._lastPrecipherIndex === 16) { + this._lastPrecipher = this._aes.encrypt(this._lastPrecipher); + this._lastPrecipherIndex = 0; + } + encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++]; + } + + return encrypted; + } + + // Decryption is symetric + ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt; + + + /** + * Counter object for CTR common mode of operation + */ + var Counter = function(initialValue) { + if (!(this instanceof Counter)) { + throw Error('Counter must be instantiated with `new`'); + } + + // We allow 0, but anything false-ish uses the default 1 + if (initialValue !== 0 && !initialValue) { initialValue = 1; } + + if (typeof(initialValue) === 'number') { + this._counter = createArray(16); + this.setValue(initialValue); + + } else { + this.setBytes(initialValue); + } + } + + Counter.prototype.setValue = function(value) { + if (typeof(value) !== 'number' || parseInt(value) != value) { + throw new Error('invalid counter value (must be an integer)'); + } + + // We cannot safely handle numbers beyond the safe range for integers + if (value > Number.MAX_SAFE_INTEGER) { + throw new Error('integer value out of safe range'); + } + + for (var index = 15; index >= 0; --index) { + this._counter[index] = value % 256; + value = parseInt(value / 256); + } + } + + Counter.prototype.setBytes = function(bytes) { + bytes = coerceArray(bytes, true); + + if (bytes.length != 16) { + throw new Error('invalid counter bytes size (must be 16 bytes)'); + } + + this._counter = bytes; + }; + + Counter.prototype.increment = function() { + for (var i = 15; i >= 0; i--) { + if (this._counter[i] === 255) { + this._counter[i] = 0; + } else { + this._counter[i]++; + break; + } + } + } + + + /** + * Mode Of Operation - Counter (CTR) + */ + var ModeOfOperationCTR = function(key, counter) { + if (!(this instanceof ModeOfOperationCTR)) { + throw Error('AES must be instantiated with `new`'); + } + + this.description = "Counter"; + this.name = "ctr"; + + if (!(counter instanceof Counter)) { + counter = new Counter(counter) + } + + this._counter = counter; + + this._remainingCounter = null; + this._remainingCounterIndex = 16; + + this._aes = new AES(key); + } + + ModeOfOperationCTR.prototype.encrypt = function(plaintext) { + var encrypted = coerceArray(plaintext, true); + + for (var i = 0; i < encrypted.length; i++) { + if (this._remainingCounterIndex === 16) { + this._remainingCounter = this._aes.encrypt(this._counter._counter); + this._remainingCounterIndex = 0; + this._counter.increment(); + } + encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++]; + } + + return encrypted; + } + + // Decryption is symetric + ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; + + + /////////////////////// + // Padding + + // See:https://tools.ietf.org/html/rfc2315 + function pkcs7pad(data) { + data = coerceArray(data, true); + var padder = 16 - (data.length % 16); + var result = createArray(data.length + padder); + copyArray(data, result); + for (var i = data.length; i < result.length; i++) { + result[i] = padder; + } + return result; + } + + function pkcs7strip(data) { + data = coerceArray(data, true); + if (data.length < 16) { throw new Error('PKCS#7 invalid length'); } + + var padder = data[data.length - 1]; + if (padder > 16) { throw new Error('PKCS#7 padding byte out of range'); } + + var length = data.length - padder; + for (var i = 0; i < padder; i++) { + if (data[length + i] !== padder) { + throw new Error('PKCS#7 invalid padding byte'); + } + } + + var result = createArray(length); + copyArray(data, result, 0, 0, length); + return result; + } + + /////////////////////// + // Exporting + + + // The block cipher + var aesjs = { + AES: AES, + Counter: Counter, + + ModeOfOperation: { + ecb: ModeOfOperationECB, + cbc: ModeOfOperationCBC, + cfb: ModeOfOperationCFB, + ofb: ModeOfOperationOFB, + ctr: ModeOfOperationCTR + }, + + utils: { + hex: convertHex, + utf8: convertUtf8 + }, + + padding: { + pkcs7: { + pad: pkcs7pad, + strip: pkcs7strip + } + }, + + _arrayTest: { + coerceArray: coerceArray, + createArray: createArray, + copyArray: copyArray, + } + }; + + if ( typeof window !== "undefined" ) { + window.aesjs = aesjs; + } + +})(); \ No newline at end of file diff --git a/Runtime/Plugins/crypto.jspre.meta b/Runtime/Plugins/crypto.jspre.meta new file mode 100644 index 00000000..231f01d4 --- /dev/null +++ b/Runtime/Plugins/crypto.jspre.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 71bc98cdcdfd4e059f97a9d2bd913e7f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Plugins/link.xml b/Runtime/Plugins/link.xml index 73d80a55..9ecd1a1b 100644 --- a/Runtime/Plugins/link.xml +++ b/Runtime/Plugins/link.xml @@ -1,4 +1,5 @@ + \ No newline at end of file diff --git a/Runtime/Plugins/wx-runtime-editor.dll b/Runtime/Plugins/wx-runtime-editor.dll index 935cd3610d4f0ee82eeb1798c4ba6d5257ecb59a..d7599dd25cf997c4ec16660de8bce1f95c41c828 100644 GIT binary patch delta 70428 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 delta 70406 zcmeFacUV=&_WwUKr*H&BKt)hcP*D_AH1>*$dQdoGiM=ZdRzyTB$;J|_AP5qT4NGD- z_82vGiM_={qQ(+UqDeGZVo&m2Yt67ZXp-N(zvteYe?H0cEca{PYu1!KduH}N`y7(4 zx+Yz9O`Boddi95>^f~b^Nv({m9fSY+8QC$B?pHj+kN?6CY;zNxoP4`Lx))<^?A>CF z89jdIP7Xm%Oc+MhV$6{RHp!S)w2p(qsk@4Pva2Y+{7jo0#xWo>vv%X2hdZ*haYely z*}y7Ay@zp{*5x>S0gx z|IFHAw3#g)gt>;6|5}(?nh&Pm@pFtbd`R<8U>t0U_Z zhqhlzMkPmZ6jt$01g5txgVs3(?FY~d zGwVo=IWVfIx8}&2d1Kx8%*RSJq!3l1WoGtODRkY@0Rz>Cl*4S?NbINSz1sDRdQ@X8KmR*h_G&WQ7C#72!7*>lyouCqRQKX=A{^QC1hj2uV^v~Dp-=K~?C=U@F{K%KZXLF+ zl9?^{dLHi1`d8|f?#_bZ`;T^4eWq=t7GEIi1TE{yca5e2!8X!A99l7%yTZ6&%ml~y zzbk9x)=3~a5nc3>`S8D*+_#}D900XZxB)xYfJPyor;lc0MXE)sKv5LM56{EX>n{0;Z@x zvN?(qSt`+ybfkCKT%z01`N1rcog*q{L~TC%k_#w4a4>fM`|MlNdQ&47vRg!ZsM?Fz zZK5xzGD|e}0}KmSw#0m>HFkC_2Ro-12Kw3!)+MnKHHYzxy&ge6Jb&dfwZiS{rDqF&^>msyB56YXO~ zh~^R{5t4#sRr z{uL0`y9sD}*;S=g4M*(;D@L9*+9Q1ngq}ABWAV2YT?0=O`;NJicDyap56q1yh3Fo0 z7aC@aC49h&lh~B#5i3E|gXl3UNd?v`jRihq9z@^6@G8k)0b!Ji1a4T^|kuH1)cx{fM3tmEq-qG*|ZRSQN|i3MAgAA}aEVL{8uu$0~Dw zq8p&iVpVx1qSj3QepYuS%3DXBHlaq_Ig9 zrU?%sF}!~#F@ZJX)rhRkFidk^orqCILwOCNXkQH4ngbk%&Og5qLcpQtlW-QIs{jDbbGJoy6~K9dAaoHwp8t=OIL2!mKCwM&6vrJPk&viEZR9 z2tTDu=40NHXhbg27;i`T3l)EohZ6-&!;EKn1ku4+orF6-&uv6I$@4sK zPxL|GPQrtK!6S)IOvZc{c?Y6iP?;y}E8dal0nsJiiD(v(R+@j!I}<*pnqJ{=6WO5i z%kpn{7oytK`PX?@nUT8tChtbnq$d_}i+3kF(g*1_??LoEc$Vki^PWTlyCeO~dl7AY z7b>c;hrBmoRT?Ibc^{&qL@#(>q7U)L=laG;SB4aix^BegV0S3A)3$)MRyTR6x0K$xQHRrpl3`lI}Rmkl#EnL3?rHZ z^SX(Z7Q=~5L_T5!Q5NO%6(fmyQNHq;7)4mCGiLM`u|z9jqA{^RF`8&6QLu<3Dhne4 zHZ5Wd(fle%wM9J9Thoymim^odsEDQ_fv6&!3KMHC#u2#^wGvt)Vf!EytztY;Gn%j3 zi3vmrG}t1$i(JMCITjfoof&5H*^BbXcSk4WujPh?q+> z%L}#RB8}+idr04kbfT>@kZy^2L@i;0GO_PPhFt$1QpO)eCW#-?hU$r!PxL)pPA2wT zWDymIE7!zci1&#yDCi5ZfT%0XY$oQ59 z_7*iPA+Z|GWyK6jiMG>uax*L=TKP5xEosOmvQX>249kf=qASM7u!3ke%n2suXIM$J zjONaYhE+t%0}Q$-^T8;OD_W_!aXBF&Y~MQ6jugx6_x>SowX6bKWm ziS;mSA$mj=?QPgfG?OYi$gqv53Pl-g*iJNn@(nZWAX+pTql`4{B>H$bQmo+E)o@|C>sr563wP@vD5GsQJMa9|M#ik5@8OF(!GXUq8M6oJ~w<#)I1D> zo;6%1+UbvU!ElABZ9k+-hO0zNrXXE5d_%N`PQ_KjHKHHrRNORNCwd6ghWo!;h8u(i z>bCC;H;LNNVEf7NEm0X7Y`++85!Ijq9~f>EjiCa6HGD@jj!xlI!}mmeD9Urg4@Au= z%I}6dL@!X&;8D$8!lNV_jXx6Aq>IGS_!H4NI!#55KNBsYIiZ;G9?>{zle_UgQ8HDn zr12LbR~j>(#yp~vRMFDL2SiJ0e$>2;4+%e~1);q05z#bUo0-4yF;Phh8esgDs4ayF zG(I63LhY?)d`k3!u7kS9XGGs5VU)(k=R`@QwKBdSN+B&wGrlA|MIF___=+f$7TnIp z--sU4IqYKmoye1l?_vCds3%QOy^L_{4;$7mX%gyVJ9 zQ8NqSnrWWGf_63m{_9&QBUgpu|^9~W$OGyV-cdsq)jq964^-8j7~&( z)Q6Le&O|>^Bc>UPYJ?4_^QRkKh~A=l&oUMxx<{8&s?n7wm_|an(T!*?1ujJq&dJ=So3W7)y~D8qi5p;vX43iN*uL?Y7a2 z=yN)UYmB9dvWYet%MfMKN!x7nCaObyvEArH^d&9LpBT#$g^{+~Sk6HAe`e~a{YGCB zU1&MVG5Qg8pe5(Du{_ZTT7J(PD-dm-n+)CM2Gq#-7^Lfm7p+r#vmdKX^)N7h`i}i``uWb zh*!dV%v6KOou)Ej3MNXVfoL+-MAFzZ%2>oyi^NhiE}cwo5lx|yU({5aXcV2_;-)%8 zPpD_SO?8P*Psai)n(7ffrW>%zruszJl2HpZH6VJ2sG6xEk@lPxgc_zsgh@oTOpS>? zAlLe)CPWD{Fib;JQz8c{u#u@5kq3D;F@+F4Ag!sXIZ;2VOo*uk(K^zan_3c0(Fj9L zp@bc&FIt&e5tX2fZA`6+b`V)jZHQ87RcmLm61_!L3pa%k1(9cjsV&hWBAcll(KqDT z(G*TpYzB?|uBHgWepH$6CL7Ud>WiMH_Cycf!`AmQMG|$RFnvrNh&E7VqD&o$ZVW-s zp{7nmiB$Y>Q)i;(6lH|zZK96v(fT*a)P-<7iE*Z`MAeAKnz|9Sr7+`7-HD!3@tUaz z(QLY!C!2Z_wV^RH&D4viGY#1prrtz-qOodoOnr!g2GRPLYU)eaj7ENjsUOimx=0q7 z`V+084b@W90HW$N@>iG!5{;p&dA(^6(Iy(*8%$9|-Do&(Hw`9=qI{p2h7g^=YHMt_ zDVp#XnxXcYVu;pKn+}?W67{Ev=7?z+k%OEQOv8!NXzIRb8bMUV9b0(CG?M5c&4JfU zqliXRzT2i)qS8d#9n)yS->HQ^o8pM}(mwE!X$;YB8kWDB;)&d;qEAg@iB3>=KQ|>1 znWzt6nZ^-Sr+kj)M50YJ3pks{6Zw;;t7e`+*qU6+m?si_N#tXmMDz`1EN6a)=sl{p zulZe~g)}2pG|P453e1S`c*>ka+FtUkY@SRM{0?e?<|#xA==27ewW)+*gf-05h?dht z6KsBus4Y=#b28EIMD@+ni4N27YHXe%J!wL2Zk|arl1@w;^DLqcRMBwrY@&V>@iax4 z=g4}ur$N)+oI>I)%Gk-AN_3I5uI9N!rD&1qX-*^BOhd1)Ii08sc}AJ%5nZDb8e`5N z`ifS{5#~&y9MVRc=gal49(B}Ma~6p{My%U-^ZP_L8bTAz3y5yWL1SJ>bcx3Ed*%;_ zX3}YzZC*q)n|db2yqM?(_3wQ15~9A;haZ@i%Jr`+O+p`;my!504UBc>Y@!+iu`*lC z%ZZMXw$r?V$eo7XKJ!YVdE|M>yo%^N(dXt5iPlo<&zL_V3ZiT4ym>VctbZ@46TdXC zAu*9M=9D z&*3Q1eVURQI^+-)fw>#D)()Q&*=VT>aX3cQlDfNv!*QZd$Dn6xhZ96w={ZQa!%3nW zLuu%RJDeu0MyDdeA(tqV`l5@&1EQzY!QC7l5`9b5!{HIpbUGEi9Uc=^EP|g84RZLE zXeq?}kVQGXGQfVFje*ai!&qI*O$Vf!wczaYSn?X%9oPb%wLo|CrsEvdaAdatge--*H%2@4i)0#6N#H(LyTuIy`n{Oqc(#nFNv zBYp-BC3zEzy9IA7u8qS^3{mugsI?`Sw5>x?YiF?$wX`C&w{#_{MH5X&%K)PHUJ|-wL}p$h(gx^mcc|fh@vcGh^$oLc*}>D<5GS)nSta?qmKH@g zxUB;JC8h~rbJ;%T2TS$@c+J3xpM+1tldEF-1u*>)aP{X{h!H2e5 z)yo_{;`Y3({5=@UyaqmV{3mGe&nA8m?AQJ%V+IbLUlIn-kSbmVcrBsyD6n-pi~)P5 z$OH(NGHwkVhj!QkHh0i&Lrr#_`xxC=e4rQPni7llmbhnxN{q_`Yc~7}_Eq`|uq6$@ zf$ciaWa6x%VFH8upHJqYP|r{VlFDRYYyN<`d$0|2yO=!Kk8}HiEj2d=Y-n0vcrReS zsU#G9EfFjCyeis*ekUNkMn`OMLKq$|s)EPY62E}snf`d38jtDEt71y^4763VzA$+} z`_q1dg7*cYQ}v8$W)#q#3&Rxdc@1pM7__}h)q(UFA51?x3vCLV2s3L>T|IX;9#2e1 zd)N!@6iTTy6r+_O+pctdIIi5GG1#vn8=L*``8T%paB6e22TPyZ9+E^5_JO}RZsu&2 z6_4RbFj%*?=vh1M3}kk2!~)LFs_Rg2j8*(CvJs@*iVOu?qC=?K4bCW@<9ZfF_oze(GK9aGcBY3Uh)9wW=+qjY>jOM3`Tcc>D3DxiFZuH8LUp`1)iai`2j zX%4{Y*38CGN?sfm->&p3NSQ*#$n@KTu(#xKVb6WKr)V3hFRwv9#X}!*C}pSe10@rx|pukITUHkLlRM7pwTQ zBc?dHpnVKghw(4#C1>@al`uqp3Le|1$m6CROG5EI0@2DbUlJA`Gjp7c1-Oy*j=^KE zwwQi|PG#Rw7a^MToJ`ltOn*={R<;ZZMajyu+j*=Hgzh}HJlN$4cr4RpKQ--$p}R+- zU0Dco)2D`|0EZV;AXoE*!y6jTf$!}9P zPOO6JOCPjuWzlL;Xm`V$Xoed#FGH84NijjLU6PJk(RMByZP1Xn%s^{0mQBa`qRSst{G{I1S0OW3e&mlycIBd5>4bl(9HeRaKhXMnQ=u z{Lq%RYWUB0iKB|b81{imu%BoF^(l^RZCBa=ldin9CbUPNfH@%$)D2d}{BW(y)^+HT zc10YE6{@OFdlnom)kWM|EgZ)+gqWU>C-#kZ%t_CE6XChdP@k<#;{p}2#hl|s`Cz;)W2 zHcU-B;<23*Tk2R)qPMJtya8T#euf?koA>&wym^{UGhc{Ryntw$ghCX0MI`l#L- zIn~IZa?a`&cU@Oy%X-mdwU#C>Irqu*UnoW9&A)VU++c_2_m=eRp;7S?tQ77y$}C$Z zJ5AP9R@Aa_*W^Y!ubEI5dJ0Z z!NMa$*mwS0DR?gPtAYi*sa8+H4T${$CYQ7j*g3+|Mb>~9v&Q-k!w?NADT-`H5p3}u zvPa}`1#DmS3~YDREVK>C${P=P%W)kiCAhxvHp4z$rZ_mFYQG1Z67B}QrL}DD0sq+V zPvp+TewXsl1v6hGn?%-&CYf!tydI~NP)ZSGH&RME*&s^EXpa#hXr(BbUIt2(JFBA_ z2@YjYmPL-Kgi~Ww7`AdI-4(T?<7TvH9YdQ*jnW&?#8Nd3^Ny$4kdduLTeqA{Unu6$ zkN~jX(bQ!1!4Y#|TtQhCjT$=D8Bz^w4eFv*)Zu@hxm5&K?ph++hGc&tyCnuwo>xV? zp(0w31e`Ng(6Q`;hqPwOCUq=|^FNa*v=1sLn-x#c%59FjP z)rDTIAiXoKnR0rT>Yie_quf6St>)v3|J)`hO2-%I_*Y--uGKzh(<#Nn50A6pb~Arg zSVu$e;cQF~pu7*rvo;<7LC5J-*i02C|&LQsX;AQXATSt*48yVQOzkk>|`leG*k@T0B-xUd{GJ!VU*=$=gktSKf3E zq^n>m-L4e)!}$NRDRVf47)v*uGDJa!!u}=ZVEbePE_jcHT5?hBuwPa*H&;fM69Y<6>U zFFb$9lO7VQxq>i`)+lKk#d|=CCDI#gwKzYpduZ{Mn@s6riLCTm`Wi>PE`Ibwd!#7Z zfu+!1q2ncVT+Ze!1$~AHS*ES4;XA?gQKh>`MuRirT05 zpeakXesKF>cNqWQQtf8aHQLiu2Qti$#i8Lo0xR@BS=sIr!|~Mgq;;|>yh@_>@P!JH zp=H%=@RS$&gHD`%bsZcr4pmFjul_&Zx7gQRhMrk)^H6BYlAb#}u`l=gqwVU3_S9^& z`NO;sG%qP56zrmmFtFOe1YAPu4@Uc823q@VmK@1rt6)!jNZXLj^YD0s6>UG7Vq@vv zXiqsziKdjom9{}KD@WtpAfwrD><(&$E}pL78WP(NtaPmwHyDm(=hvjkxI1;}8hVQH zqaSu}Rl1clmBZuw3ljS>zs18K!Xu8AvoAjXI@07-8xKyCN57*NoJqyVg7bsgU*%K5 zb01BmZKywF=qs;Hu6P;G0ne`V>`%@ja@CLNn=Xa6pq5Y8gKq>6x zR+Z7}MZ$T_pZku1kN@cNdNH!whub|Dy*LW5tZyj}^{d8~(1j-_+6*HOz}1u@TU?_| z!2&abj#J|=K>;5P!bMqbR=3eLeVcN9O&8n4F<49raF6&%(6^&$W^0 zxs&?u&wSd0&z=ee*L~sYb_4Z2KfCAuh2{Pr=Z?XNGcsT(9H$110^5L&Wnr`EUT#Mm zo~A$BgkjJ9+0r}_((UezG<9?IXDyfpu7#`hdP*ogu1$?k0nZz8SY7**CHH;uGctLK zOGRgarz}f8^4H{Ze);6T`B3aGd8;Kq7m%L?+)tC^Sq{TR5F#~x6s@U26zxBHM385>A2r@*`I> z`xLqGoP-as&CJjd2eMph_Zjf`0~6YB=vaQvBtI9^F0{c6(p7eNTbd^2S(mQzrb0fF z=^KTCq-x(2Rti0a?3-%A2QK-O+lq16XYXk+2jvf(RJx;+-S{o7X+G39^7AkI?St&z z{D(BxVf6g<6CRwP&eLjXKMeDaY5tdEGCv6`BvU5Q(lXzKA?(#^)XHvTr~XBY?H^yf zIbij%r9tS)bU!O^of@XzhSt29LEaI|6C_vtH`j7`Eli?5`z!VJbQu3KoZL9b5U)Gs zPcNYqIxhOh*Q!{Drr~{6u;;eY$CuY!3nr^KAKuvcYbrwndUBVa?H4E@|9t<|KH&BF zF*W`fYHPw@N$Ly zBv0$jB6#T@^mB%4&7;O>?dkbvLRd*i`iaJQYJ6EZwx7x6_?Id6$9c3*jG-rF0n~rz zX%9V-R)k^murN8a{t015*B5A{wb%6yAl?0C9%Rlc%5s9LwTUGmnl4LBG}`rxf+ zYJ37zVjVsEmht7jNIN?V&qql*XR?m=D^-3tjaobdtX#qD@B04i1`Qh{?+EfE=q-j# zDVC_xHF{l2wpD&S@MZ@4l#au&O%to2{VJm1Vmlsz%Za_GjM?r_?k}(^a%X(d@6G+s zUu1AhO^4RMS%AC<3$@9vNk1oGTji4Wr^^_Q|D!S34vhv*7Cry8FD85hhDeQnABrza z_pNG3((}wBbmG=gmqyb4!dkCC?+LkP+DDFtZ5)h$*-;@>%pkksyHLs~N|7&@J)fLKVf*BHl2x&2i~Ls#c(X{E@>fGLgQns9s?hk~UYxp1T3V3q z4PFapbQ-zJZoiSX2~zA|RFeDu{6GcQ_rH=N7dh~h_rKdAw5+upEN`xU_Ky$W>>>Fm zN^WBRzl#41%95pM@DU7*f4mLO-v!AK7c0DZ3FSbxl7;4W+2XU1p8qfbGP4Kk8 zuhJUP1X9=uTW0@ih1~yFq6bMqWbxw!Kh^;*UCvg+0~HUJ1n{)TCd=X7vV&j zR+H(&rB`v7@@+Y^l{<_s$yuiVI3G8%3FxXmI4Z-eYp>ase{Sct6ks`D12)xvE7;9^FW4*oIbiqmb6{ht zTn2lS-v*lycpoem&%hoC6rS*Yyl@6<4DtY5S@?qe$XXR_gs2U+c-y96hX^a!Z4n*8 zP8Pku?vEPm3E%%r6R`k!(G$RaB&LDA7?TQihgbmiR?G^pN5lrOXGZM=`-M0FwoJka zu-}V|VDr+ifh}UV1Ge3~hhRMoufUF)XZC^$8C=1>npYZZM?*!h!5P)TzGJ8lRtw5% z0skCg;b2!8x`4gN`hneO8VWX##e+R&dKc^vJ_GD?$9Z5E@x@>}yL|+99p4Q0egEBH zKjlZje(!$<>=m91Hm=IIU|;f|!OjYN0@hK$Szx~hI)e4nL<#t(Xi!ohTx~K8WZ6c9s|f_Hxunu-PIJY~z?IU_Tafztt02`zfmjc99_j>`4{|c7>@U*l!p{+i&U#$3A=j*t8;OWBD+! zHaE1Zc)SMxr28XmWtIP#^n~ui^E`VdBSPu4Z;5x9y#Wt`GL3_bg z6-U9YwPKNx;tU*nw7mp&sJH=kXT)8w)5JrthoWAB%@9U!&K^a(dBgZ$E6M^~iU|a} zOVkJZeM}hG&qYVD=STGd`;~|STQ*@7*t=pp*hlG8z1^6zAqA{$-aN2n3|WvKH}3!{I0?cfb_wie(-p9f7*4CFO*g=4 zD8CE#m1EB`Zfq%k1ggLLE3g~6*~g82;P2{FmkltuboF32GKzyuF?fTmpXCpBFRKoA zsi7X&Gc2Sle1t_GMciQc#?c{@mjT}Y-%GRimvhg+`~PjpegJRyd$5sY4RgnI^<#Ho z$;nq``hM~>%zXsvHHwfh_w8;TY+WkmJqCGUB7$8WezPD6($nXrcFTW%Q0^hrQvr>> zIw4m-MmM1O?{vI^4Dz|2ypfRaamXdr{!NKiu6U#QauzN~ze81Eb_+Ch$G72Ky4QrC zTf-Ogc@Wx)^v!~2ZSa-+wsicHwO_67oDC9T3z_hj$m=+T&TpAzv?F{Gw78yEn^+ z8Q54w?^F(e?;Ry68dJFzb6^V<%}%J#im+9RrX;k0UtIi5(Znz-E6Q>dmCg(YI;W^& z=G)AL-BENN9a-T(w5i~;4uT^&dWhy$GxP_HsTNGV}n59^*q9o8f8LJ>mSX6b323T1l)bub= zh!U%TYiZV75mv1R)#HCgjFlUK3C+>_9pz|%fIsaV9zF<fNm4zuzK!D#!46`hYhWap0W{>fq&$I@QEF2IJ)wHq?W}7RSgGE zEgwe%2C-0b&0@DQ9`kB!08z4KoacI=Sf#~Vegm4LlR;ExYjkpiZx|j?^tM+i@fN$G zlaHv)Ug`9R)nx%%Wvp8=+hD0D8nAGkLPSFrt5bW?h@DeZA+eWe!XE21L^NgI0WwO3 z#F3&IYfO{@?M)ZW*&L-U7`q&3vrb!qas#OUli7l?p8`Hp;zG+o(SmtbkwF()a)3f~ zx&RcXC_e6M(UMJ2G@58SQ5LHocMY_~N;~IxON6prQnS2Fydzq%b5-D5mN@NXc|I1c z+0QCtmZzhk4XaQUiqnHu&NxOJBG@4yC?A8aW$oEz62Iqz8q6|uV0lEzY_R_lLr2(qW0+*t z3#b#TsHm2EHtWn%Z3k#UL^pX3qpB&w z8KN)iRTE?0EV9J38fcIto=cue(~9gSaTtjh)CR5vlTbM8$0kXQttpWWl&@j6`?1+d z!=5S7av5qLDDBfi`F2yj4NB9T!ct5H8J&1I>(6S#cY*P2-z&Y#)L$>~f+d^{V0)Fe zG$zF~fHj9N>gEs9frWbQb&8ap(D^ZJpdK?vgI|Og$YM#%Vg`p>KnoO=srtk;s8G-- zcAqraPf-P7puL0HA5vrAM0l77>l*e`H1n)2o3zB=#-nvDhiO)*Pdg>zc#hFU?8F$> zS!qw_`I!r}B_=EUsPSZ_?SMsQsGbiycqp5tw0CSaUZ7$B4r7^0^Ny{onTP2av4e-R zl}g;@W8=fwMj|=ZN3c(&2BRdKjVRPJuhSLX^DuZmBKn?pte4G3F-slni|_fi;B2Oi zVm^e)Y+Jb$(<92TjU7{BPZxU;JAWK=hHr)AK-}(YuVDv|W06W5>9WvV5EMH&k>x5a z$9JDOk@c&GQRMnJo+S|_TaNOZY&_HKuk`VH-E!Df^LVyExswnnEIh;mHEgdU9nPfJ6n0~7%`(P0X+ zHlzZ9-gB77W)R7dpUg5PK@q);FdlST=a9@U>a-2$u}=GeO297{;JII7Lanw=sC5Q{ z^0D5vpq=qb#2E?-)LoJC$7~KvS5UmJVZH+GI0U_@v|NgkuPrfQzI@7I7r^r|dTLbs z6~KIPi3!CLjq~e`T5Td&jLkQJB6WJ;Fq6e9s^=vvbJ%{Jida(ED@7*IQdzqu7&Dof zyoy-nvKd4g)Y!ACC5`P>;#=kxmUQObRJy)p?rF(ny%gPYSi}~vct!o`9z9r1LnT+XZoordk8cTv-nH@gEvW&$m@gs-1mTZ=y=-Kf3 zmKE%XqRpVK)cYxy1+Wj<4W(rzT(Eq|7KdOFS?tr$aP|?q(Ogog;BdB@`C26f1zR20 zu+X+hlbM#oMmw%&c?y@976UDAC&e6g9;o2NTs7O%*PvO$(KDHKHGd1#S*N>>o7fj0-bmO+s2$DWDz^cRdm{>YZoj5 zY+M8B<3% zeWGh~`~%?U@Lg@PGVj=uoOZELBHS~rbNG}EQrb$#B~G8}`8Gk!-8y{@QFgOk%5(bs z&6?A0_Op(Mo%ZOipFzgG%(uNP@W4I;vGzs}(Zo2Ezv)q<_~D&=|GuZ8mwjs2|S+s;RsZwCyM4nOix z3#O$IqGVRYJlZ*jEmoQnk71v)y-F)*Np}96-B4OCyW((+!JpB9|B{)9Wr_1K=1YXr z+=tG`S%{(wmKb)NY5kPzKJ#7>7wB}-`2^dmT!%q{C)rh{)pfY&e3HFV+A3=;c8Ym- zk_E=YEO1KinJ~9-c)V3dX$#F)oX_amGFW5IvQSNlo6X-kpVh@V{^9H#>!h@m=DW`4 z3N1kA*#Oey>Tq7qmjiRcd6p^K1c87MpCUTNHlQp)*!Ai?yy6&MrVqjp_|c zPB#03?RgtX2K~Y=XgFvOd`Y9bg#yBTLIL4|TR>Qu0$O51Iz}bnf;Xk;7p!&{x&B#3 zv`;JgB@6F@MI>7i+GhbRRy5ydWznzLc125l)&d#3N>AK1Tw>meaMy5&^;3k~ja-(f z2)7%#Y_Fo@fjf(S%`O5#`;#qS1zrbC>PA6ngK?Q1Q-oWJ%j}gR+zVW0!QG{2Alw67 zW=V=F0$pKu6uAc3_*Lf913hJre#2@IVe2g}-!Ll@-2YjQ2YR?%XZ@rI&!o1n>+Bsx z_}u3@Tcrq}``lm$72$KA8|;oEd?a;~nR-&yEci(3CJR!8kEFh3VT$mP)VC~_NK3Zt zfQ+|TiV}}P##?N=qTOS+z@Ke6uju619YD_%?W(v1{)j`#Ub4WW6?XtNRx|(#{GN4J zG#U#0o+T;r9B~u=+`|${nk8t2jsL)oC~+W&ci2ruV?evZEWKqBQ$f4S{1v5uc9(@K z`qWn5~6D-8TM{K7esp{>(N=jcIs8^s_GFD80wNQ{p!fU0m+z8ZNlM zFwuu9!^|lITz=6t+~?=9QcA;pex9!37B!DmQrgvW_FAq+8S5x-h_IRnhbEx5Nw9 zD@x|$zB^oAYAjx%yKfoOOLj!j+mSn5Ua^XURePa`S8ST1Wkr#0D|%FPJ^Z1QkRj6Z zKmbxVNh~}go4sPY6yeZ&#XO_Qli_%J#k53)FWZzcfvY0C$@-1K3JL$gQ?HB^({HSs zq7Fd6vjd9S0{y{Uhf2>DK#V6Ux(s*CoF7wk9!T)uVbT+ypBQ+OrZ5Z8$nPkc=9FSG z@%qE1>qHdK6i2Ct|O(kzjBJniT6{q z9mts<8!6X6HnUQSsVFZoO1i!a&3DAB>SO0iPB zi=rjPsuc6&QHq|#{O07vrzyG{vxt@9dlmg!ra>`p{+I|iTQTtIYKb^35UE2kA08`- zo+Fm!$w;vNLB0DFE6eR~uzmRkJ!2mC<)?_yb7nDL?lgviQW!s8iU_sLVt)LAFKJL< z0IR?Qqy~R9&c-X~8cy;Rd41C0{%>2fjaSq~oaOzwRb?y*8U1x_H)O2DyD4o#l#N&7 z(L~t7%Erok6%jsSjRUF}kCl-RTtTyYrdpZLA}w8`R=h42c3n)a$!tjcN(lOiqG4ex zjRE|EqOE=_ja3R2QI+4b%U6|K#$siX8RiS*6%=WhF{n_+YP_iuvA}A)yIscWJYEsz zt5GOlFrOiB`7=%m>iibYxbSZ>t|+AKEJTH)6sG;Jdt&+d#UFcJw9^Xr zOkq0zH~B9AjfPQh{Zp+k9JDaqDio$L6>j0bNpk)B&rLi3X7NnRZ~ecU@jsML`_rNK zzpIRfPd@(sy8o|MMy`MV)gu13f&aDj?_X>Zu7Cfc>wm=)*1vzU_&3(S|8-^ljrFf^ z)$(63n&S4kTQJY3*pxGFHFYvLeeG6Dr-ndp>2x;bwp(p}R;xe@5KDoKb#$>DxYpIF z8&Ex+?m@=-I;FV%;?_W?m6e~kHPk7i@^5a9bh1`3x;HL#vYP z{f`RN*Hl@azW)6)#jE?jZ1xWopTGY7Q^hCC_3s}m-jmk9f3El`xc>cv#gByb@1HC_ zTYIDUpY67q|NW|I|NSEVwuHj>e}C)xUzwf@t$+Xf;tSpX{R74S-};w-|MyRHKCH$0 z_kaIT@&C8};r-u#s`G#So2mORwEtWG{!^X*|8MjDf9v1>{+`GF7R3Jf=RYwL{>S%! zzsnhdd6lqnYHq>(UsGN*G5_|{#+&LNI^ic-&3IXuHoC`ZF#^%nQv#A6jNJW8wUB>@y$y6WKN2yozk>)_^VLi zES%S$Br`6J>02^f&xmhnMexs*h996u=o-GH6~Rv_4PV_T(D0;1@GD9)rwlDwplyPf zHl8OnjXsCB724bWI|Of3!+-ekV=V{@A1K3r_-NL~ZM-aL_$l#}lI;t9x*W-Cla|c1 zZRKW`?8t2j*8z3n(TaW_zPw~-o=KF&o)@X+^ESVuv}VCJ-bL>VY;RW{EUzZ^mFpaz zt~^iC&YCvfP4~nh+nv{+OciCzwcDf6?umoDFOQrqwbSjj17-Vi*BKITL!0{P zuK0>+f8K4T)b6;KDA%8R&XSY_Z+8vQJ@JLpfxO>rsU0yymmA1^=SXT-$HoWgp7{D{ z6pv1kT4}GnTDd45kScL|QyU+wyW-2JLwM|5sa@^h>N|u7r%77f9KOY&d*Z99F+4F{ zYCVT{@r~j2=Sg}7O&Y3u;>)PRcv6Pc9=ose)rRqqOo?Zq_~E)MzNtEb&zLW@UpnOZ zj^NfTN#8>8BXv)FQFRngdtYj6hll!&;*kp^)rQj)t9#;WtE2gXg;Hx7KFe>k#=CtW zaZIR<$LX&47V8+Ey+~?x63+RJ;r$j%D%Z-!<8@Dbr*$k}vqWl>$5kvpmPap@RI#Ov zC+ME|g6lZGd70E^jZQ2-j%%^m5?8da@kHGf-*+9)cP&?8Vo#MH&l6Wjstf0Sg6@fL zzfR-_R!Z#$?pt9ZPg*6(0g9ibdy1d{_6|Sxq1394j<4_zpP_vuu@?k=S9kS?pc+57 zT53OwV-+->wnmbBH5*UTJy%%+*kqo&R%&;R-W4bF1?wcWfssE&_iP6-r}7)?m1c{r zIF)B_P}k_V5F4MSySlXvVDIre8>Q>w=pz;1<7+ladKcQ1tb0a5(CIwyW2wcBspLPM zZ{94ab$uJ3p?hwL2w*e$vn^5^?l-}ICf~Ic*B@8`euB=QrMqenbT)j`U%I-DKI1=| zA5fIr%*N;Fo}WbpuoQ0DDLq>ZDPJjtA5#(=7SR|&E@BSp!{TZ z5IR3icfB7Sz|y(rZs|JOc%o7|&sCHI6`iMhu7aQ$+;^|^d>mW0at6Pl=pamGnY!nN zm;g4P2keucr7Fc$p3moZY&+JkUvw@98Ty5y5}K?xrm1xk)FQMBLf!UxBTHhc>kp*xGvURPmKy-OSm;h zx=x5b6tIL_K9}SIm*`U6^E?Dy#v_kOZC|`cm1W%ZxTKABZ9H4|^hyYTU-9U6LTcZ6 z53RDCd!8iH*zJZkzCw4s4MA7(ey61Crht7_R&w9dlD>kWw@UZCpAO%D;L&HKmKE<_ z^+O(TR#GJxdLQYY4u$}>n#Z1#T4%q(Raf)i^OCglQ2ZL*HEdo0TgwwKNO5Jr?y75f z{VyafhXJ)t_w<0E>v_^esVx}H0@w49FD1X+zcoe#|4kmNXEq`^~!N3kbS}FSsnVWXt`)Exg+mN!1|cR^2la zVs7KvSEc3@-6Cik@Ar+QJ~cHP->$n>&wwvZ@HN+@Xe+)dXa|qJE~zFIzf<>|2thyL zn{P<1iRoF;Cp`A1q<*mE?9x4}W(B}+kL>zZY6iEa)js8kw6gN?~ie&@c_0up|&ew45IMba6#>~l2T^&SNMoag09(Yt-W8lUsc z4PWlEdq;@E?4qD*WdfC;0(I zx8AbxQ(S%jJstimV*oqNEl;KExstVlPxE7nCcrgvMi06Gf}Z8B&!y)tl@o){@^gxg z!p`8F?%4r$JLkFQOX)d!_`cxtJXcYB7$q0@1I-u3bhtj@>jB*NH|cuc)mZZjenZiQ zHa31y51I)ZlP`I|AJX&1{I)f}<7lK~lAtvb==jC1N3j7^cNekiJ zU)4QF!EWapZgr4aSi*o>-*5~3nOrQv5%yZw&=bo~hhKgQfWH(Q34hWS#Q~8!YhCBA zj*?D6&>MQtNw6`w$-6m8ZDYc#S~t0;v!u`9G<~akI>1bNi}!=SQi?H01Vp}di~GVK z_(b{uJa3aHln*x#5cE49T}+B)1G3)wjt9Umh@h(r?B2iEgO-J$Kk!&LsfprO-}-?E zyGzQ1#p#aj=?J@>yF3y9WG_THXDDC$F0Wrg(p2dDAEhUL|1T7R{=}2uhpy1otwMC| zpE&-Q6;cuu|Fa(SJJ{{q<1^sroluJ|zNz*-jz8XnQ~^Bi>z;ie<}W-Ae$}80DHjkM|@EHy3C+D4|q3kNo`?3J=B9HLeNJ%+ed0%vvcY^ z;{D1>8V;V1brTp?fZYm@oMOf2oD~*Q)oDCsmRZ z4l~3n-BW7-n~2}|vC2~H6rNb`H$EdkQbHpe|6O<8073uY=c-8Uee1q@fAF-bl1@NS zCSW|nf9dcGV*&6hT)BbDGs0M(iv>ZF4#9OVbk9Aw*E5J4)uhrYevC%ksUfu|Vt0L$SQ9L12u!7B-SY&*bP#zprPkNR8aRl}wIp4Jm=@jBD^?3& zMZ~kWq&UUcxDjc(g$6~%F-1Q?Oc&jg8Q}X5#e{1^>AJa(XTxIRoT9tXrLMZ`6WHyz3D3sT^V5hv z4c$bpqOCBV-F44mu#6QKzD=cPaOqVIi;EkI9>NZ)gznh^_7GZ05fCC>*Tw(Xu%x)7 zXaNNE&|S+y&{86}h4d^@I=E3Ok*BBy3{p?sa|;CZ67@r+XT#zNjl9G&MMq#)SX%e2 z2{FrPBBZr+{nlr1qcQ@X3sDExg3HNUcP$AU6CYun*Tz1=5+-R545+fYXDn1+}KZeMo3D5Gg@AEoen`Oh<-4{ zafaAt&1+mi__kO1V7pOK_pAjQ6MqpMDYZY+>o$Q~xek(+f@dY&b0;kKl|`)9QHsIy zCN-%nf;&m73a$aV>jEggib(7%wYDjTnp6?>-^qCvXnGT1{@6EnKOuZ&@vZe-e;RufkEH7TTi;96aGy$nHXh_oJ3D?UH7X$=tx zPh!yXAPlHr-E%Jlttl4tl3J(u%S~&FZoMTng(at!?pYcZythPlACBu^GJ90Xx7k~w zUtj4O2W_gYyQUNgV0FZrep2%uKDb#O5#3)Bhlm|+ zYOH&v!XBcDI2J9nuPeP9(nQRNkz|D7+*J463^ALDb3;MH`@fOnj)XK5X~U%JSQyVC zy6Y7P+Faxgmzt}aWAo->!3asoFiKkJp8FwaOL1eQ)O_bfHg74iM@h!taM63i+19GMD`JE4Z?NT0}wPqSjNjR zK^6A4h!DpVod8dp?&%6a+Y8r;(le)mXxUzzQz*IM#^h}gFj)pIGvxP{Z;LyM`oehX zqI*U_%&sDMs`MtJtcyu*{M;9WIhSy6a>J+E+x* zmfAP-6I=Bau5%=9hcntw_uL-^PfA6%6saAXx35)yUCUusHb8i$N-eidHc&d!y9imJT&KWYwO((7O6wyo3BiM#cMNeG+(ph|<6@CRYQ;A;~m$jZI&M7(o^?pwe z`UeC}7M4sIbXtl1t&??aA4HihLX|cGwCN&K(Y$)_Fjn_;5mq)+oC1y3zgfQ5ThG)* z5oCoQbG6KuMN9x~mguHv0Gx{1x~D&cnIqDaHm2kst>@_4DytQKrSg>0I)j!Xyt8D? zr!X#3r6=D1wSzEoMQ0^$axK?pt{%p%trdQUH%)0-prwf$ie|%DPuD%8Aj&-9`MxY- zw@0%!^K@-XgcW{SwX@RJf|emx5yARrgD{!8E1Y*WUtCqLLp=JnnXhY~MOopmta>hx zMRWiyOGGOQgedRpo~aOJfyh=`JrAwT0$sZwZDk9^RjFyr8^nboXrT-m3Qu}I&|OzS zm_=fc(kvsFwOOQV7hjU1nKr9*(JR5qJ`}f=xDK=rMeW5h=oWaY`H}8<8^Wv>!Yfe;`2DkWB6x``VwvClHtTdTY@U^^7sHh{8?^Oe zucD7(QQe?>dKj#1qj;>ez7hA^Y}B<85M`4HUMfon2W^u`QgpaBJpcSyclC!bo5e0A z7Axgq-K=XbAj}r=SZPl^T&!C}=rS3!F)YSgb8j_6k`p9M(OLLX;z7uhMRMq*{;Y+8~(7kBVoS5>J45R9IKZ zpe_(5M|XYVXoa7APEwl1W0UoBU0VQQj)}cWdsK3h^_Xz}P)6AdOVx4RvjZ%@Cq$^y z4m+K(o&XKkADDtyLzt5yNr|gKJSom8x&*WJDLqUkES#r>&mIG0~7RI%*hyc*O7M&GUf+&}D&$1BZikO2M z-v5nr9vOB;7ad{wy(*5WjJ-j-Dm>T8pjHU;jqVu=VXlctrLA{P4ZEgm-@)>GUCdEh z8fe$WRYhiqazlB-^UppI=B6mIUKY{Xc~jU;JKS58?jrmhPDd zQErP|r8NjU6LwqI?!)r?ohY$EmJkfucVdtvjg5tS)9-cH=@8}zu~@lk{`bRv(6viZ zR(40^Ds2>KcSPllGH5Hf$-1k1;`=^7>a+x6{wR7X&joQs+ZJf>{L{*Q62q044B}5> zk0Jxi@;~cg@I9e>I&FZU_rx#C^S7|zwguW{hS*ksCZ%d#Fdj7n2_8bOK^N5~V(tm8t5T z(6&H>=bu*gSOh513&h7FQBgVA>;0;S!MB#4==2Q)eIm{%PluB0+7@W5VG(~SZYV9U z#JaXmMet@UKK=g{cP{WvRB8V|lXFT-8z@MWi$Ot(P$-I6Zdw&Iu3Q487?5goy#%Eg zZW6g@bi71FiAW_DSnFCeD%JW567O{dx3ZvBl1_ZQOoG zm0@3(GOIN#z5fTq8V$=vKIaDA!-ubIB9;eLO7E-Sd|tzDPnYBOJA#HCNBL~3(7-uY z9z(FozzxV)YuNVmTw;xey+qFg+wX8br7K*RK9tyCs8V_zMw4~GG0Cv4?aml~z%kdb zqgOIpVb}}llg1yg9qSGBBjZ~J)-Je$GBz3Z1TuEos4F}xeF3q-P^I*q4OD2@@9eW!P1@Q^WyBtzrG{8kv2-vDY?mi}=&{Zygy=>k2QKT~8_p zs+4{inNsth|wyNTXlV%SH^?jyC=u=l7F zmdtp@eE&PAx6^CM{?F*@`_S6ACFefNs#N@LV2NN79dgEVnss!P&q&P&B?GS=y|f1PrdQ5z<(qWcM`!ctlxVAad0m!`97TWH!$WsWk8 zAKL1amnPL#VmE0;Z`n>`SYhDP4vTuf$*ARyGpP5wjM^#Qri@~fu6~QyNvfAo`(_+k z{YS)F8#A7+{Myu7x)N$r^!(4gDb~1yd*7OIM@gz$PSN?RW8;p9t zFDtcKkJ`&%IYyP_+6+BL?gk7PwO}B#h*6d!wC1D+1K%OjJujvZo#7<5Y+GpgDNrUC3U}d7?$aRIMB=bE@h33n+$u}YA)582D z+e2jzmGy>=A~uv5zWk04J#*hy8K_GdUt$U6v%@{rPEG3L$8+@?N8|X^(@)bz>ny& zYLx6})bb$}Vzl%dHH7x>Xjx^{jr0xoY}sPe!fwO6hCHIGMLyJExIzyqs&)%QO+a z^14<=zoSi%5u?tg2|Q6QH_A)RE|jZT@%O)D92XW%lJ;A=(9<*4Oem63qjEDIm~g&) z#HfAr#NH_~Vbr_yu-Oabn?^Y@9-dGv>sy`ak59Nrer;6m^a^pYqYFZ$i>AxfMlEcAPtjGf(WndBKU6eB_S&Hf9oBwh z(baOAQD0@$6b0o9qmFK0S2RoRG3qz2`l8wLf3>3ixBobEp8VFpCGGbVg=E$rb)j_` zA7?I>-He*mr?Dt3>Bcbh;`$ifF)dFw>WR#cGi`aEQJF5f^H~-dbxhjVMYqZ;jcT7( zA(qNHM%nYDEEgI1=qzjUQn|z^2mM`4RIV`U%IOoWyX0?-T60u|SS}wj>e6LTlX}9a zE9TZ0-7Tw)+F5$k6(dJD_$M^)1vlMs+|bo&KaN98S-UER+3>y5e3gbCgjxkFi-!GjampT%%@~DjTXyTpXQ7&TfVcxwb;Al9w8F4%B@{71M~Wk`Eh|xQf<4SIZ}j z%p$l(K5x`q8t&i78l!x7J#O76-#6-(Kn1wOMg@jHflP3 zKd6)yP-Pi!<~CW6$(@FMoO_>mOg0(S5V|A#aoJ+jxpao8l7V-1nf*yUVaqBbXF2Fj zVEL9&1DE$}_oO@k#h0j?C$E=j@9B)!b;`0>8$sxj6s#s5?hn?oJ<(Dc;>0+ zKPT&q8b#;1=j5mlIbSKg{IJP-US0~dM4WZ?Rp&o1Z!+o*I?FyUcN%p!odaKxVf!Op zVI_Udcv03Fm7s4j)iQ6FW{c@;{gR9r^%>nt@jF>>R41zbWjSWIcJ850Y?2jFrL^=q zL~NFu4EwCxYv*s4p^vq51UX-k>-X4N9z_-YUb-8!dYdY&kxQXU#Vop@dR4A7?6L*p zeXq(Uqn6S>+#*MPqVpBf!sQ>5JLWI+xw%!&HSEPn>(ASoWPR!4Zkv4U6Z83(ofGtJ zlhv^5CwIOk>rBS41>Mmr7yX5+C>00pnIc}7tD%;NQ;!>&{kkc%Ol&yyUSF+T4^}4b zIJL_6MzX>t`b}hq%=oKr=!T=klpSF7`CCdasHA07d6t2tN7J*wlZ9S4ENjXiuP*dDcXY}-$$X=St(>w`IzMGrCI(Qxca!-hQSa-e^D|=n z`4@D5Ii)_C@xYJ+Q$CPBhLrK6Azh|^n9Mkyeg)Yr<6uj~hpuT;cPCjl>cq#g-muq+ zeJuNbu1gscoH=!moCKvGT-G3WK-u~kt_`vUl3$t?o!TI&ZqfSwvR1|KFRPmR7sL4d zWlvB2JgNBgWq&^;-W|+^N@TU zl8j!oHZ?n`INwo8#re7>^U?EPs;zEG$QgSi6=&?3RGjgIWJb={C&@Tp-=yMv{gaCG z4T7Qjx{b1_Qq~c-<+A>nUGm>m-*UzS&l~hGt zznFSl z$Wu?xu1i$BH}7CQ^)6A3V7Jm-8*5*1iE{sqtt=;z@+Q>YE-&GQJyTx~enm)hV@)CN9a(<~<#_Yc7B}vBXMKe{*uzg*2Tre}q_)k`YNwr1n zx*(|B&AOBZdSY%+U8fax(=3&||AqgQdbV0-th_5`rxZgs3aQ^1cI85AS{viLq~@sg zhVgLEN#^5SF;`9cN>|S#IycF9SIkpQUzyLpO(*tEpO=KZE3Q#1zSbFE?Q-n2Ym$t2 z#e6mRADZ!y&QCJl6(RMUVLWP~B;#Fits3=>X$;kOEi?Z9r>oQ{6f@DU1 z#l)f%^={@OHEF*trnr-5S}LnMcd_yu(CiFHR`%j#KHl5cDW72ty(>rsNa6GEetHSb zbt+=uwVlRKyG}i&753Bh$zpgnh1Ktk^POH5q*@O(-W6e0XV{uv*G_9=yen={{%>{D z?r{RW+n?|ZN~^#f0MdSGvT_6Zbdqz`kPhMu!}lA zIql{oj2; z0b!ZyW)!~xVVMdTwKBL{L{-?R-v({^hO4$3=~(Ggcd1=QWvtA~zDwmPUFa}k%azBd z0%FV63Zp(B;8S<2bw+(PAS?TB)oj%EMLzO5({w5CEy~JXp{5x{FDtOEQZ-jgyse;A zZ8eHtEKsVtwbMQ17Yp2@ZZeAB53o|bWfZ?3Af`s7YbQU3;$F4Xs5fTal~$&jjN&Io ztWu*gw3A;*V6Rr|jN}&ttWn<>#V-i>jk>hGw(^9!Pd#T;uZgT$jN+$4+^2l>@^s!6 zCr^Bu)Ec9{J@08zuBwcxps9DiYBK7gUe^@gZ>v%CS0$Wr0?FU1bw+&^x}o?1^^H+G zNmZzeo$S=pa;=&JrC&O*RxLK_{bhE!bFDpBh(Vy=sw_)w>db0STWIjGB;_4K` zcr4;=pMQM05m%!O_y$B^CN$#KCD(4_Q8ZL#Si0Ri!UenWv!1U6+h`>U5cs@ zl}W{Kd#qIbJ94x6GXK5eN)_m6V@Sn=;_oD*fc(7vCaY3CXw?1mTV17k&ZwPWZyNOi zSc6en^ut}HI$+d}3|5`9xrQ=&>;kL)Mvd*v>a1)BfBu!xpHZ`%Vqml{tJy~V57_NS zy$kk`Q7?hLY}8e>5K*b#H|is>uZ;=~WY)QpZp=ZjL8PeuGWvy+;TQuu(zpFeb%jxm zJXSXv)fa4yQSmX%5=M;&+iq0nam+q5YC2fE&bs;y6PTUA%BJdVz%vbeX*$DVqn3k( zjM_JY*$SiLU{yx#C}FnMsEuHIjM@!$(5P3ydK|@#q4(d`&f$zhAT07Jz?K-bk8Vk*RBMe&r(et~)k{W=rMm|z)w@O=1NN0sv%orc!C2U$FW?|8>H9rr z9AnfZuq%u@iS7cRU18MqU~7yTK)>|Ut}tpj*jq-81ZyhveW6i*16yF!t6-%@1u&tWFzV|}Zp=2LR)c+FR1s#rI9gZ#s14{gGKSeb!l-A! z&Npfg*leSAg56=%9L)T_3upQjD3x|9~nm( zH4-!UBBQFn78>;)*h-^b1bfn`teITq>qfl>_E)32&!zicD(R*KUHu1u#~Jk~X8uT{ z_|}|CX`1jF?=^nr5a)s-~UpnCK|~W(yfo(BL zVRC;=e}9Pz`vHDu;3Jsb-Q1c@02^sk7o68GGKzm*u2eS|wGp%X0i*ag<4U#JDE@i3 zQtdHn1z1K;eE#Vx8vdlV#5j5wkwd)LM{jqckB`U9_Rmk(rCFk*mrK*}B>GBViN)Dm z+V~!H{-N3mafnQK9>ccIn>v=aT*D>ID?+sK&*JP(oh-3D#3Qk~1B0gaTu}cB zojOURE0b=r>C7pSE3h!IZIR3D=+%*__LTJGT6h;&qNJzI__O&OkD{q(i4F@;5QZqV z)kmtBbEP&~`=1JM32$HB7E{wxXBchUWYtMJ!wosyI$haqW81cu3~1XPPP4=z?oH#d znRy~tb9hSXoKM}>jT?^A&Yaw-lP$%C*ju`YnJ03g43tUNQ&JbPHkT_tACpw4aIV%v zOQ(!Nm$3s7y zxKE3yh}M(0YR41#m6Wqv>T$2r4~zDHG>219GCyTo@4oT$an*Y4*jnf#Qtx%Wo!ZjW z6zxeJm7lWRHg7DND=Ftq8)y5}Vb@2&J!qq@SZDsf*~a|;zpS8bsE^nIKK~yP{Fl;c z{{Mo#7j*seOZJ}D|9{cm3v>Set=gI-elkEHPT-yaUw ze>25S-7EjiigjJ){QpxbK711WlwAMHgY*BtGVu;dy~@-3@;^`662tZXG5E^;Y9Uv{ zU#1-5q?LT&4JhLjeQ4>ZziR2~Q`1uqKTZF6d=ASt9BKX^Zq+^W&{B~@98D%E=F#_A zB_`8$n(!d=;kk6mPsyuSN%qd8l5Oz^`loexOQ>jv05IviI@Efw>7xJtdh8#oEKKWL zM;e-WEzuD}1LX4bv@;a9CAuLJUE9cg{=(Dc@IK%P|&%ql7N(>zn+!$mazX^+w( zN;|O&XXy{dvq^s;(O*U8XL3ptQArtiRCIc3)SnmJXnDvd$m{gUBE^ESoJ)InVN24& z7FSQyrs`WUf0cY4t2(VIT(SP7(qFrD5vhghksEj%JKK&Lh5n_P=I*8{9pV(Muxy|i zroCVF9MPM@CjalvhGT`fB`x2=~y zg)XEr9U@Foikq?1x8I5NPhEjNDW{`suZ)IRd0`&aw# z@M-wNlz%ls#&6@Sq-XNaE#mO`{KJ$ZHG=0>>$%~n0OtSOSMyPOq{!AEUs&T4cDF0p zqrU~T7X33y3yhc}|_6QT9$L7xLsqxR^Nk3M7SQ?foi zb2`ocpR#KEpDfGD$=r?mj^%h*IYZ3(U$>MNgvq4G;5Gbi#j*9*8r_duR(p}4uv7|~sH?{}f- zEnW%C7P+Ep*>%E6Yrsn=E*Q&kbMGahz2Nu46^pg^elCi{l&mpGUyt&vE-OpLKz zN7K^SZ;A|pWzgXb4FQAe`R$Sf1Y)rSWKBGS~pX?kf^Sp zuE%bwW|*~ssvLe4M=rBSEbR8Ub%z+!ZLs5c=@n5zQqGLsLox1M zrM#%PJ5~9R@`*EJqb#3@d$%k5GOFN0t2L()cCTaO<}^k8O0juwTbk6Qr|nmsBlNS-2!oZ`p!29!Kn9J8o` z-eSNb5ki?E8*K@pEg|uQS6U&AM;JH^8U_u6hC!pCF>J@+iGjwDzM201p+b}+y&UOr zY{#)(4o^ACEEhJ<#yFDVNQ$G-YGkNJhHB7i&}z_H6S*G^nDY&o^9`8uZ(DP+yJd{F zUO)bfj7H>bhNl^xW_TJ=LaxZR%cjsFGW=+m+K= z+UIf0X$@aol;*PdU~^MnBhqDU?tM{vm$hK*MeP;s<55-)?R$=#D+eig@aMyy2Y(*< zZO*{fJ486Ucjj)Z+}%I(4)MsfgDAe*>C{Ya+-aF#P`1%T*Y*jh-PY`MJgCNt6faV|l(H=|2TrGz-lxb;QBnEQvxDWhiOvVP;t3kX{b=rfG`+hxI`={mMBX6s z+94DjLNy^26aolidoyiUTM<;*ojd^*M&>X)-5qgnr|j;IZx?mVj*>qjqoABJB%4QW z9HsLtiJ`O@w&Unz0%gW+^fivYRs&RHplX4uF@SYQuS0qr2CxCN0h7y#=t9vx#Ac*4 z>TSdpMCIV7I1%%Z;&R}<)ovu^Xn>fHSb*q3^dkBY{U-9f@zWS=SAGX}lY?hK5H#pu z8Uzi320_CPp0E)IpW-eP&)R)*dq!Z5n#je~VCKhQjXHQfM^R`LMU=x?j-uo6l*3aF zPdPkQ@KnK51zH7K1)2a&5Vg0fY7~)xDFIUgrW%-PP(%%A4QLH$Eod!h9ZIN$rxu=C zcPG=hGZUFUwdO$rkum{)+>;?9r0xwKnc)alV;qk*0fX5GyA09tEL3o1jgy0Fn z6ND!SPZ*xCw0XE9Foj_X!xV-o3R4sX#o&p;6NM)VPdPm0@WkOMho>B#a(JrXse&f~ zPZc~>67OxVf~gv&YM5$Zs)nf=1y#dS3r{UPb@0@}QwvWmJoWI@!_xpyBVs+A^>Eh1 z*-TD*l+_Gt3rx*0HN(^llTtjbl)|)9JoS{~$)yxeE~PNJ;Bmp@hQ|eu3mz9dIq>Ab zlLt=@du%HQrW}~^VakW80H%Btln+lnJRW#F@Oa_zz~h0(1CI|LA3T0|eDL_-@xc>- z#}2?0ged@10Hy#;A(%q&gy9Ln6M`oMPXwL_JW+Te@I>H=z!QTf22VLWF?eD&Ofi_^ zFvVf2f+-GD9G*Bl33w9lRKt^iCjn0ao*H;+;HibD2A&#tYT&7Zr%qx1*TYl?Qyolo zFg3u`fPxy~X@I8zo(6cD;c14a1)gSjn&D}NN2Os7rSTk6X_!4}m_2C+Z8|MDft|pv zG@fEkn4B;<(|C%x;c>&01CJXXH#}~5^5DsXCl53aG!HZ%G#|78CFGNb=6^m+`7n84 z^1$SU$%p7caUM85aQfl&!x@0b504)nKRiKrg75@EgP=js5L4R<0f&G?z#-r;GKWFK zpkdH3XaqC@8Uc-fMnI#WQP3!86f_DN1C4>&G2j?*47eP)95{}iRUwwcSq^78oC!D+ za8|=pgP4Fb0cQfvS~zRrtOczFt+j#cfa`$kfa`$kKI8Lyxrd)DP+h^@I9B{h$HR z08?89fCIn*;2>}inS-D~&>(0CGz1y~4S|M0!=Pc%2s#!;j3I{M55pgZ-!4ana%70Z zRE1a$YdNgtuqNP4z*!AX4Pq@~0{#U23Ha;auYOYf zgsBmp7I<3VX#s5kZ2?v3n2hO|jOmz+>6nb^n2exKP$#Gp)R~U&zb;@GunX7)>_TQY zs2emVou``{9ydI0c=F)MgC`%J0>nHx^We;b(*vgmPEUHVO_vfLU=Oet*bD4MW-q80 z)CcMV^?~|8eV~3&Kd2wn59$XEfCfMVpaG(Gg$Mu#frG$7;2<&wK|`P+&=6<{Gz1z3 z4TFY3!=Pc%2xtT}0vZ90Ftx2Ha1=NS90iUda||>F8Uu}i#z4zK%R%E9@N#&{;VFlw z3Z5!>sz9qit3d4pZ~{01oB&P$SA$lA)}VrFc&g#4hNl*uT6k(fYe8#4>p<&3>p<&3 z>p<&m;CkSC;CkSC;0DkJ&<4;3&<4;(&_>Wk&_>Wk&}PtP&}PtP&}PsU(3W&u|Fi(N z0Ji|E3>;1wIGi$YIA!2)%D~|S>I8LyIzgSFE>IV!3)BVb0(FDBLERac|88J6a1L+| za1Ju(faZYaf#!kcf#!kcf#!qegXV+ggXV)4fEIujfEEy?`CkC+0rmiUfIZ0U0ri4< zLA{_}P%o$t)CcMV^?~|8{h)qOKd2wn&(yX8zyaW32A^I6Fa=-=pokDWA$UTdA;2Pi>&>GNM&|1(sR9_2EEj+dG)WcH`PXj#l@YKUo z4^JaJjqo&P*gUrzfg6FFk*x($wa3Lcq6^WDn1h&yn2%V1=t1-%`Vjqy0mL9;2r-Np zX+PDb{T+pfA(kV?5vvdrh}DQSh_#4yi1mmKh>eKN?Rm+r1=}itOp`MCFF@^SBl)sx911`vaYA;d6Z6&A1(h!K<- zL77pM8AD2pQ*1Tbv8jKvHI`O#=mCk2^Ol`4zQ~~#UOk~$RAc*wJV5z=`w3;{#8bScNL*iMwMrQTqEc?x6U@z0rvY_^Xk(2A*1^)FI_E$0T7F z+Vv0(7=uP^=VKu{9}Ce1=z#|@h?UYH7GcBK4r6;X{R(heQ5=10Hj&3~v?Ed2L_ag| zn3Xts&G|cdc-1eCrsRrog~v|LwMA&bd6O4A-s?YcaxQI8rtN*SeFv?8Uox4;pngz4s2|i18bAs2#2PHM9 z1`$JuVZ4xUpCkjw9tV$L4M~PQA=AsM~E*Yq4KzGkKM_7PJ;anm~F2 z=?SDKkRHKy1nCi^xKX}4i%ZDEb{=orG>kmRd5AYVK0lToeWS+%d&sAMKtT~!&hPhGaj9e3%KgP_=~#PORATK^ZgAZ4 z>>FL=GM9bYq8I3o2RD>(+&_Thhe(MaK7f=|Pu936=_l~YZW}31TlO5qy*)VP`fi@i#GzEq!j;^t*E5(lX7cvZV|P$`X$fyXdF<6J zzB_@%F}--ZcoN5%Fg?_PxBthqyjN-9&9ag6{Nb`!7>$Ty@vUve0foA(zv$2&ggQa(eI$n*v4$=*1Fj2$=NS=)D`v zmzjU>rsr4ie=Ch%WBz^Dq`!}U6}|OW=R0U^5nRDR>wdahjedZ)9Xi2s+>d9m(5rko zogOcv)1^t5lujc`=`SGT9;qw-#QeKIT~{zDOaD98{Cj!_t0-NcL8^x_b)oc@2p zF<%tQXWttvz3o8Ht3uo=ZqYbpMSPz(AlF;J!jCbhMYZO__@P|ju<)I zvuaPR>^rMT`sv zlS_sMW84NKGa-{p?wMiap7DLJy_P*Z9>2%uzhD2Xp6}QD^$P7zRDi|jqCO_BPJ$xLm=J?p=O9k(;N{pMhmnE z$u0lICPvN@a_YXy%dC6)9JBH{W;n7@^F%g8!|k5Pp_Nt{^L>EoIiX|7MjnG4U0C;d2pc}ZV^FxDV`vg+PgGhD6yC+`L#iK? z`JRsHL#!tp?81T{YM)hzouE=ksZr=AK8BQ02pY1f6nZjsXTFi|_kzr5I+!(ebTTyBxUMWI6UEL- zHyDqe(p6qW7l694U>?fXTrrq{90fJ?s5gi~MfQpTjv)tqi54gtJ0czak_k$G$DqHj z&~j?)4IOQzeW3BY#xoK7kSD8|Y-E#BozQ|yEDitDu%Qo{g0yrwt71jBvnuU8m^Bl* z=xq#R)hf4*{ZJfo7g|(%9gahN6yj$-9tF_%-lUU$GEafw?nCh?O`*GZdcPbr4dn^C z)SJ^YTlg>@KlSF(hSs%6Z98mI1?dS z+LxHw_=}VW>vGU+^%$_BA5b{G*cXmApFUJlWp%A&O?&~&9Hq8lr5-N`%5SVl?dtw=PU&s6;$5x5}J>y z1y#1x;rXaR(5g+B&;n%IOX*KjxJic>z=1vRA!eSAJg9v6^y)a-f$33Cp|OwuKaG9- zdK5@qec@=cX%K6g(TTn!%*oF4!x4=!N=0K;N;F!Cid33sl!0!P-|;0)u)dy0k&)3K zMwv*{Tk!+kGg^Wi1zELyWt5F(tMuMz8QLr8rp+s(Z;;f7`)=C2H(HK-1?Ael zLEjqo(yT;PDurrtk%iui8xJ>GhVqfKpo;VfngSFpDB5U>W(}GtD7S5brVy10+M!v7 z)}iBq77UxMS&te74V||@vjI7K^B$6$EYcJqouHBPmTESk6mMGJpR^vHFQU$wzi2k2 z@V?BEhyEGjhqj=6A5J}c`=L@)t>YBjyRY$9)EK}h4VJx$#@o@>Ku*{&2Pm9I`H@ae zXb=l#q8EnM5HwY(*7!RnC^Nr>VHDbp+R&YT@JV{nGthWuh|ISgTAS=qGjAK)qP=Lp z&~%wDCVN#a0o$T|@YS~Uhbnfo4>X?PK}^m>UK=Kul&hI5-BzGvp$(XK)}%t!th?Ew!>EkDXG6L{ zt#vS@=7V|7`9{x7j;NWpph_jO6Ize92Bwv&_Gfon^b?%VX<)}$bg2$bYlX;+>D0^g zIFg6(nlYV%Oi!pjE7A%5jC#>p=F6pTS+k#74j`Sh)xz-3=zG&s$ee}@0L_EOLgN`8 z!i#l+uiaU-Shj^9`W3|st94A$$A0KMN})$sm8J9=Yu3=0tfO6uArDmeqe) zP@6FBV@u2*$U_iYV*WtMg4ohjjaCR^OH(zf(hGdhz0B+isu%R4`(>c~aHXiSC|yN2 z1hHl4DzX^Pwcrv)fr75iOgFfS@&%OvT|;OD&vfgd!!@Y8Lj2lt9R-X~7BqGd{MYO{ z8p~5P54xK+twqU#dS?}*TC`e_Usfqlg`gX=iqQ>pMbQ0Or9k`^E>rWTM=`pIY$BBI zHTOMAf&2y4Ld{!fT!gZqW@;Wn(OW1>h+DyU8*LV}AB?xrSwZ%TicuYUAgJr2QXun@ zybD8@Vsr<&2x{(93KTAAI&^p!B??M|{_diDAUOU^&60VS&^@$Ii0kI*@I6!`s0y_E z=(V6a(C#Cd*wbor3*>OTAVB$5R zR6%KD+@uGI0ryF3rLXag8!LJ0d8)69uPUM+UKr-G11jnC=el$xrFu-UM7xw`f z;z@!mI;I;K;r)UPfi&1oxvR}Ymr@QlZGsa7#RD1RYC*Dlx`7FHoWg6qc1t%f#VZ6k zyQUkM;TlGI=-wW%DfW%!sk^l423njgXbX@zeykAx<~GCc6=E0n9MlXqiDSMrc&7Q7 z*t5ldS_?&Mu4MAN`)0VULi$W3nf=!EGu)Sp${n%=9w~_36Su(A72f`}U0xF|RpdXV=8(X&Omr;005l&#n(zYI z5s#veAalgbk5W406(6NI;q8J9I~B;z_~S=77yR=_J{NrRBVQNXm_VaLN$UxgiAwj% zC+LR%zYuLU3_hg)S(>Fxn_%}p#^Upd7Wh9X^b>8|ClsiR1t+qm6HZYm;NmAKcRr!l zpU|hrK&F3u>P+axF!(q>O|kfYq+kanlO~KHo$)&MyEWdTG@iS7I$B;@irsLvpapFi zef-h7;dP%Be#fgAQv2b=n)-&5rdX@|4iDEXgzc3^+j+*vBkucAdH~NGsx&sAR{xYD zdFFVf@%&W#UljXE-?56l9L|BWF-e;7!#EObK<%Q*crt$mb&Dpgp)H5DQS!{>Ml`}o zhrK^J4Sn%ywWtpFRVO67Veo--x?u_&`VaIFGyy-0Dr{Q!Q#0Ar?T>#K+D|a8`>UD> z-0l0}yFz2r+7G{=HnC7sLp`CfS&^iiPV}o;yA}gfAA9l*fD@m{GK=Uk);Q8_%&=<~ zHyGNd8w^qn32OK^&6E$~sSkPh^E*F#u6o#t=O`Dh3A{?VRtoJ-*W!lbW zI1X1R6OHMu!y`T!O9U=#I+qXB%p%Pug1v}}hliAs6dsJSylfMRW9D;8@YCT@s{b+^ zOB60!z_o)e)@`G39Nh?Z?cP)#^pBX|u8)P>bmn`FC1w)#m+P?vNEUy2CYXvPg*u}zi z;3*qY!wMeE8hytu9`B{r)1YQ!4iEk{*VBF)u2{t>e1Hxos5RMxYa*6cbIm$JZ=Z;d z(`jJWno=IzwCIHW41AUru$mSHJh*6at9CPSl_3AYIy_6Q$sTcM<2Gw~=Ecbhy19Hwx<7Q-@R4nzmuKC=L5>=9%3MnmMFlnI2&^gG+fZIr2+~bZkl= zu$tl9c<@Qm0f$A{;#*GZ;V?7RnsbRQT8yK&bM5j%>kf-?8|s}1_Lv;UcwW z>LOdT5g$LnwXAkyI&FlxIR@<7vnP2_({)d$VwjstSk0Q94eZ--{dukxO@H2b zJIqb@Bp6b|MIM|weW240n43`$^lZGugQYXpIqk$1Rh-h{OS?<08B$`4c4PT>u2JLL zPP<`l?qoGht9dXisi*TEn44EvO^d5M_`YR<^FCZ9C=_b`pw`TXahBsYH9T{L!DHug zn42y$!S3)U5Bgekb2)(P1igTj_MmFt4)#OX`3BGYr^_6dLohefz^?VU#e-(WM_dlW z+}zG;de!k@+w}%rj^IW?;UPMFRIT|V)U3q*cX?*o;-D^-FgM?`n!)#Zu&?>bF2`VQ zcA5n>!yocs&Z1{sPGE~ioc;>X;h)u-kKu}N5=Yl_jgA`bdJ^X5d}fdNiwEuIt#v(x z9scIj16IY;s(msnL1%E>6RtfNantn-%*~5n*CzeLgJWBFbUO!g^DV2H(!hf~-Q(TP zW3T6&?gZ)Z1+`|bg)O>>GhT3Q&)hw37h!IO%!ZoTuXxbW;2jlz$7dCS3*4jnxf56;4$LuBl@?fgd8TTtV<~^r;A057`+V_L~ z8ZJXD08_hdv#!@*ZrUfqkoFQDJg_LD>vfo$K@jw;ka_TK)b_5mI0YVYna==*bc6kh z*h9`Vc!zltA2;OMsLZEbZ^GQ%z-pe=@L;98uG?*xo2OXKDq|jub6?u+4$d{<)CDel zciFE>&1SHM+`~1dT>G}=#cuatZraQNdtFl=d?s0XJisMdPQ@^_AFB39us_1}=3L9| zJlf+C%*{lwYa2e}!8Vq~9*<#eu4OeFEqL(PmJdAs#uY6%*}xL?g#D@vX>x=udWvOu z3T3BYl6_?Nr!Y7FW;IP)@t|()q3+LMZnl~WH7%@paQs@Q9?x-=pda8cU#KN5{& z26y7Y>n#TNl87mt3_;IuCmw7r?d)YhESxzlhPi2|*1QShG$PS1Tw4|Syq6JaLk}~1 zj4KcRAouZXLLA&U4TI~Ev1)Gsy9tSN=US8KG*1)aOq->^kdnIb;PtL2J3tKgT2Iu2k*Cx?bC|H_;RX) zFIa2UJ_PL6q)d6t$V6+~@9tww;^;WAYxnwb!-2&HUN$6&E@d?<;A3N7#qkzFUbZA< z04HOA9kx?zw%lxs?8)%}u3^`eUiKt|*0P#s2lAkM*d4F-B%3x_05z+Ec<|*WC+`j< zH<;5OL*eCwT5}Jqv>i!}@?epP+=~;vJCZ^=n%V0@xWQ?Cxpya0GL%yptcsmg`w6f+ zk@`@sO_}@7+liFX-C)-?gz@0REq;An$X#kUWsr#Kac zfJ9H_+Ot^~`vt(4LcC^k+TBZshpIIldf1{+l99}{3T=>ID9p|CtY-FH9-J~`gI^fT&DX4E zZVC@}n(@qUI0>K6Ne>^#2({*TSVJO6;R3G3FZA?}fVnw%A=pb&c`$sm-anGWq;Yx% zXMU7wPXT)rDOD}Iy{eOP#4xLqXVI_DO|!08HPGMK{b@ZAY#ZCn#M8@(RHl(nI2$< z--Kbk{|<>5?NFlzQCnO zice@!&JzNU5a;zg^GA5?a8#|*6c)QmIJ+0Ype+(9gJ=2${zRV8x2%fe2JTyJogR2x z^-YGUeS*XYZ60VR;MSvGHuPRkM?*8*v55OJTNelZLXrhtfT!$JYL#4Ax=xc_LTlUf zSm0?@TMRv%A@xFQG&>e}2G)sltaQ>wUV47>+kxlEEgHYbTEqZv4aCZ(y}*ybBB36_Oyd!=POuN2&H3xX!#Pq0Zkh z<7RF=*>u9d8j>Ms5?t`Ft7Rf#di_Z%Xd)Q3uS5#crVp$ofpjedol>{(Dm$7M54@@R zCP(<7Tckp0IiTHwTc4X?famOY&MJXmG#j3J)+slGatL$ z9(YgH4#MJfpZE*yDron~DjL5Ww&|P{!8>VW&_mU5f2I$5M5={$0klV?Bdr7jj-rp2 z!|}y!;~iCocNp{+IYe8m0PSz;vjQ~qE!X;X2^{p4gwV;LIi-u>KKs}~&(w|_^ggJ8 zhbN_A7YciR%E1~V0e&-`?STWPA=yF!27v0XPj4b10+18|O(0^6d;VAT) zBn!>0N#~EWA<)Ac7|VNBrGi@LK$RMinUXm&=#4s-mYZ2-qtO1=#D1ieC{^0fX<&za zXG>X?=pB44wMpwg%G{@9rU>nKdG|-!3D{D}#!}0wRM5AqO0~!&>s__~jpZ0R9rTto z2yN8-i$EV9sgK}b^e=&(SgW9l8;ym=Y3O%+EUgOR#lQ3+^AG3`OL0P5>i8}QOWAZc z^HtGvtSO@pps}gj#q9;jOM+$9ZfRJL4Wu^IJ{K~BsW&wGl-)ctfA$~222z=z!EoPY zAX$CSH4}JwVkl(@x&_Osk@Q5+>3%w_k)rqT%wJ*NHj#c2)DqSyW65JL*X&_UF_8)t z%F}dfF=?==)TYfoCgy2kijx3?1!Y+1fl|t!<&tfZwuDE~q8ZO13SXRjI6-HB;8mMv z*$!zcH42&pqiHHlD(BjAxJA%PRrDzsurD<$fRE>w{akBU{NoTy>6M^4Ivuu@Vh(U^ z2vo6>E(o%Rw^^+uFFFqF+N}p!N*?O$HDO2_3GR7W&HO_=ctjTy(m_4jrLb-|N;Qg> ziL%2shd8R5KP&^CBnw&#c0888WmQTlc<4~D{p~oRHAwAU|uE98aOCIzH*!6Kg za{I%=%^`iHazT5{OOcm!Qcy=YJ>JqqL2cpG^_8v(G62m-x+Ca4d{umOv^$FGUNggeNbZR3gX=v;k7RpuSKv zKzb#pBiy6~O8%9+%6BlBfl{uZ-SGG~NNNz244FYvub=ch_0mbhzCo- zg2uz~4v|I(ii2^7NMi*xAss`9N`sGapU&7VG*lWX$lbU{Xqc2JC{6RsWVn5}G8P5OmMD+IWssCFptQi=ipfV?i%A z!=7;IB_p<3>7Hq|v0jpX=G_Ot-{%)fW`e#lxE7i&wG$L!kb|-$CqX|JGV&1AI^}L? zmegO+IQScUwiGN#o2bLfq!EI;x6DD`NMjU&%}OiRmI6)|;(C2$=yEAp(78=7LUW`l zLF3a6hpm!KPx67DOSBrcTJjLIz@@{mJSkYvpU#Y81bHf2ilBB1<#N)a5CzMGI6q+<%@A^ny@ zA1HHHhy@urh)Ncxc+qba8Y0N7n+{WHq@dR`bU0rcFK9lT?gA-JPyn3nHBz#mp6g5T zT4}kUb_qFXt&}gQNS_crY^`)j;QKX|p@mYdpfwAsjW)ozkr36kJNYq9jz zX+F>w)?8gvM9?D8wn<~pFkhY~w_8v>{#MFYFcTf=whVnM z?GhA}q1SGgDg=EAD@2*(aF%x%2(&|r6O=)8_&aF@wJw77_@D@GZH~3O)HT;0-lFf8 zjtk9FzA|jLly#05bBC+#_tH^14eVO0^E`MD2Ks|^ffhhe?|6X+56^BDwqFVqG!~Yr z{b~;j7uDkf(q5rmNFE$^K&le74OYnmlJiAgWhX3Q2c-*wPQg|BkmUFq*Q($?ph8L& zQ~+!3VX3-}!1nNr_@e}WpHdbrH|YL|R7gWM!gjX?5!_|7E38u5TE$aF!a@8b)m`S) z6>1-ohW^g!Dbzl$j(%!!6gnYQ2<_q`_wW-E{9Q}ws1i>0&(ctO4m!fA^Z_(B2ZiSA zJS_Z_bXFn0WAL<8N9{L3W)}5kO%aWR#^zNuFV?s9-SFSkZa;_T+)I)xUCAnU zg2uD)Dl_DvLB6KLuc(H2$q&^?jn{awH}+SC*9a}ouC@1#;nyX9YEulwa;YaYo@Z-# zrgy8pBW_7n*Lls1xkE?XmV6arn+bDJo%EAJe7|9xRA0WVm;@1gfnM1Rk1aKSGGjXI z{Bw=?Le|uNpdLUTDtQBqRmmSHTcseN{VELux=jaeffLi91YyT&_lXf>Wavft;}-h| zt+8?wng%Jb327Z`+~@&jxNw6XQf3Ehqw%Vt1?-icASckLEYqBtl|r+Nc7n!c=xuH& z?QU)Km1#rsG)VSUR6I_h|uZ66n5C_|cepPG_9Vv1Bj{tMO{7h>Ld{us zxi(_)y@;u5O}1fsnw(AhK?=NQ9L<`ubPhAb-RFi)mU!fJ)xchF&X7&%ZkCx#&#|Tr zeZZO$YOoC+#GI+?HXu711dWqh{f8mtpt))lZ1~c6uIwwcqUP=+=gL#*O6Jqk9jsYF zPcggIV{W%Hw>Fxu+S#dFAQuTOcC)q70=Wa#eha=H)Cn5Tz`wZ9zS-)LX{wLy5L+l$ z32j%$JtG&Y8mpNukEME65}cFK<~_h(2-|kmfY(fp5oRcH1cb? zs6inO+vL7f-YE?mmxNrECu2Fc6hR6(Oluy&bzR?t$= zzLD$n0#}0gjqLV<7yZ*?ki1+D6m;JMYnRKpf@-q{$t&bCK@YRAc7^;(5ZjNwQZ|3d z4}$GSUnx%##I}yFl=ll_TgP)`yH|Ri%C>;7k`rEWVq3s-B`Ca=svM zpd$GlQ0Rwk(;H>&zbuvSE8i%$62$hE|3_?J`9`_DqVb*N8`ZDzF%*S1$sTmtcknfy zPnSaDnawj{!#~z;`Y6*D70ZP}+q|wIvRKvFL@AMX(^^*LD1FNsb85L0F56odkKRej yNAHx**qgWaSv6#1_j`kW9As~}*=OvO@?IAuc@*rX@OF~BuXNUwPj`~PG5kLU$8g#J delta 15909 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 0; + channel.setLoop(loop > 0); }, _JS_Sound_SetLoopPoints(channelInstance, loopStart, loopEnd) { if (WEBAudio.audioWebEnabled === 0) { @@ -1056,8 +1086,7 @@ export default { if (!channel.source) { return; } - channel.source.loopStart = loopStart; - channel.source.loopEnd = loopEnd; + channel.setLoopPoints(loopStart, loopEnd); }, _JS_Sound_SetPaused(channelInstance, paused) { if (WEBAudio.audioWebEnabled === 0) { diff --git a/Runtime/wechat-default/unity-sdk/fs.js b/Runtime/wechat-default/unity-sdk/fs.js index abb3db99..cc1c30e9 100644 --- a/Runtime/wechat-default/unity-sdk/fs.js +++ b/Runtime/wechat-default/unity-sdk/fs.js @@ -24,32 +24,32 @@ function runMethod(method, option, callbackId, isString = false) { cacheArrayBuffer(callbackId, res.arrayBuffer); returnRes = JSON.stringify({ bytesRead: res.bytesRead, - arrayBufferLength: res.arrayBuffer.byteLength, + arrayBufferLength: res.arrayBuffer?.byteLength ?? 0, }); } else if (method === 'readCompressedFile') { cacheArrayBuffer(callbackId, res.data); returnRes = JSON.stringify({ - arrayBufferLength: res.data.byteLength, + arrayBufferLength: res.data?.byteLength ?? 0, }); } else if (method === 'readFile') { if (config.encoding) { returnRes = JSON.stringify({ - stringData: res.data, + stringData: res.data || '', }); } else { cacheArrayBuffer(callbackId, res.data); returnRes = JSON.stringify({ - arrayBufferLength: res.data.byteLength, + arrayBufferLength: res.data?.byteLength ?? 0, }); } } else { returnRes = JSON.stringify(res); } - + // console.log(`fs.${method} success:`, res); moduleHelper.send('FileSystemManagerCallback', JSON.stringify({ callbackId, type: 'success', res: returnRes, method: isString ? `${method}_string` : method, })); @@ -400,7 +400,7 @@ export default { cacheArrayBuffer(callbackId, res.arrayBuffer); return JSON.stringify({ bytesRead: res.bytesRead, - arrayBufferLength: res.arrayBuffer.byteLength, + arrayBufferLength: res.arrayBuffer?.byteLength ?? 0, }); }, WX_FileSystemManagerFstatSync(option) { diff --git a/Runtime/wechat-default/unity-sdk/utils.js b/Runtime/wechat-default/unity-sdk/utils.js index 2ad02e5f..d02cb474 100644 --- a/Runtime/wechat-default/unity-sdk/utils.js +++ b/Runtime/wechat-default/unity-sdk/utils.js @@ -225,6 +225,9 @@ function convertBase64ToData(input) { return input; } export function cacheArrayBuffer(callbackId, data) { + if (!callbackId || !data) { + return; + } tempCacheObj[callbackId] = data; } export function setArrayBuffer(buffer, offset, callbackId) { diff --git a/package.json b/package.json index cd8aa398..5fc35e3e 100644 --- a/package.json +++ b/package.json @@ -1 +1 @@ -{"name":"com.qq.weixin.minigame","displayName":"WXSDK","description":"WeChat Mini Game Tuanjie Engine Adapter SDK Package.","version":"0.1.2","unity":"2019.4","unityRelease":"29f1","keywords":["Tuanjie","WX"],"dependencies":{}} +{"name":"com.qq.weixin.minigame","displayName":"WXSDK","description":"WeChat Mini Game Tuanjie Engine Adapter SDK Package.","version":"0.1.3","unity":"2019.4","unityRelease":"29f1","keywords":["Tuanjie","WX"],"dependencies":{}}