@shijiu/jsview 2.2.201 → 2.2.426-test.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dom/bin/DroidSansFallback.ttf +0 -0
  2. package/dom/bin/NotoColorEmoji.ttf +0 -0
  3. package/dom/bin/jsview-dom-browser-engine-core.min.js +2 -0
  4. package/dom/bin/jsview-dom-browser-engine-modules.min.js +2 -0
  5. package/dom/bin/jsview-dom-browser-forge.1385.f80e.wasm +0 -0
  6. package/dom/bin/jsview-dom-browser-forge.min.js +1 -0
  7. package/dom/bin/jsview-dom-browser-forge.worker.min.js +1 -0
  8. package/dom/bin/jsview-dom-browser.min.js +1 -1
  9. package/dom/bin/jsview-dom-native.min.js +1 -1
  10. package/dom/bin/jsview-engine-js-browser.min.js +1 -22
  11. package/dom/bin/jsview-engine-js-native.min.js +2 -0
  12. package/dom/bin/jsview-forge-define.min.js +1 -1
  13. package/dom/index.mjs +38 -14
  14. package/dom/target_core_revision.mjs +10 -5
  15. package/loader/jsv-core-api/jsview-core-api-glue.js +74 -0
  16. package/loader/jsv-core-api/wasm/backgroundtask.js +66 -0
  17. package/loader/jsv-core-api/wasm/core-api.js +206 -0
  18. package/loader/jsview-config.js +22 -0
  19. package/loader/jsview-loader.js +74 -85
  20. package/loader/jsview-main.mjs +8 -14
  21. package/loader/jsview.config.default.js +2 -2
  22. package/package.json +1 -1
  23. package/patches/node_modules/vite/dist/node/jsview-vite-extension.js +67 -6
  24. package/shijiu-jsview-0.0.0.tgz +0 -0
  25. package/tools/https-server-config/cert.pem +61 -0
  26. package/tools/https-server-config/key.pem +27 -0
  27. package/tools/https-server-config/serve.config.json +16 -0
  28. package/tools/jsview-common.mjs +87 -3
  29. package/tools/jsview-post-build.mjs +248 -70
  30. package/tools/jsview-post-install.mjs +7 -4
  31. package/tools/jsview-retrieve-sourcemap.mjs +64 -49
  32. package/tools/jsview-run-tool.mjs +53 -3
  33. package/tools/jsview-vue-devtools.mjs +2 -0
@@ -1,7 +1,11 @@
1
1
  import JsViewDefConfig from "./jsview.config.default"
2
- import { loadJsViewDomAsync } from '../dom'
2
+ import { loadJsViewDomAsync, loadEngineJs } from '../dom'
3
3
  import TargetRevision from "../dom/target_core_revision"
4
4
 
5
+ function isNoWasm() {
6
+ return (window.JsvCoreApi.Platform != "pc-wasm");
7
+ }
8
+
5
9
  const CYCLE_TIME = 10000;
6
10
  const BLOCK_CHECK_TIME = 5000; // + CYCLE_TIME, 总计15秒
7
11
  class JsThreadBlockTester {
@@ -12,7 +16,7 @@ class JsThreadBlockTester {
12
16
  const preTimestamp = JsThreadBlockTester.#timestamp;
13
17
  JsThreadBlockTester.#timestamp = Date.now();
14
18
  const gap = JsThreadBlockTester.#timestamp - preTimestamp;
15
- window.JsView?.logD?.(JsThreadBlockTester.#TAG, `check, pre: ${preTimestamp}, cur: ${JsThreadBlockTester.#timestamp}, cur-pre: ${gap}`);
19
+ window.JsvCoreApi.logD(JsThreadBlockTester.#TAG, `check, pre: ${preTimestamp}, cur: ${JsThreadBlockTester.#timestamp}, cur-pre: ${gap}`);
16
20
  if (gap > CYCLE_TIME + BLOCK_CHECK_TIME) {
17
21
  console.warn(JsThreadBlockTester.#TAG, `js thread blocked, preTime: ${preTimestamp}, curTime: ${JsThreadBlockTester.#timestamp}, curTime-preTime: ${gap}`);
18
22
  }
@@ -32,7 +36,7 @@ class JsThreadBlockTester {
32
36
 
33
37
  static init() {
34
38
  JsThreadBlockTester.#start();
35
- window.JsView?.onVisibilityChange?.(JsThreadBlockTester.#onVisibleChange);
39
+ window.JsvCoreApi.onVisibilityChange(JsThreadBlockTester.#onVisibleChange);
36
40
  }
37
41
 
38
42
  static #start() {
@@ -59,37 +63,42 @@ export default class JsViewLoader {
59
63
  return this.#config;
60
64
  }
61
65
 
62
- initForgeEnv() {
63
- if (typeof window.Forge === 'undefined') { // Browser没有默认Forge
64
- window.Forge = {};
65
- }
66
-
67
- window.Forge.DesignMap = this.#makeForgeDesignedMap.bind(this);
68
- window.Forge.RunApp = this.#runForgeApp.bind(this);
69
- }
70
-
71
66
  async initJsViewEnv(appName, onLoaded, permission) {
72
- // 加载JsView Dom
73
- const jsviewDom = await loadJsViewDomAsync(window.JsView);
67
+ let onForgeAppReady = () => {
68
+ onLoaded?.();
69
+ }
74
70
 
75
- // 加载Forge
71
+ // 加载嵌入到 dom 模块中的 EngineJs
72
+ await loadEngineJs(
73
+ isNoWasm(),
74
+ (activityManager) => {
75
+ console.log("JsView Loader: On RenderBridge ready.");
76
+ this.#forgeActivityManager = activityManager;
77
+ this.#tryStartForgeApp(onForgeAppReady);
78
+ },
79
+ this.#makeForgeDesignedMap.bind(this)
80
+ );
81
+
82
+ // 加载JsView Dom
83
+ const jsviewDom = await loadJsViewDomAsync(isNoWasm());
84
+
85
+ // 加载ForgeFront
76
86
  jsviewDom.InitEnv();
77
87
 
78
- if (window.JsView) {
79
- this.#forgeAppClass = jsviewDom.NativeForgeApp;
88
+ this.#forgeAppClass = jsviewDom.ForgeAppClass;
80
89
 
81
- // /static/js/: (可选配置)填写main.js或者bundle.js相对于index.html的相对位置,用于image/import.then的相对寻址
82
- window.JsView.Dom.JsSubPath = this.#config.jsviewConfig.jsSubPath;
83
- } else {
84
- this.#forgeAppClass = jsviewDom.BrowserForgeApp;
90
+ // /static/js/: (可选配置)填写main.js或者bundle.js相对于index.html的相对位置,
91
+ // 用于image / import.then的相对寻址
92
+ if (typeof this.#config.jsviewConfig.jsRelativeDepth == "number") {
93
+ window.location?.jsvSetRelativeDepth?.(this.#config.jsviewConfig.jsRelativeDepth)
85
94
  }
86
95
 
87
- this.#loadJsViewEnvAsync(appName, onLoaded, permission);
96
+ this.#loadJsViewEnvAsync(appName, permission);
88
97
 
89
98
  // 环境启动后,动态加载React框架和main
90
99
  this.#checkEngineVersion();
91
100
  this.#jsviewInited = true;
92
- this.#tryStartForgeApp();
101
+ this.#tryStartForgeApp(onForgeAppReady);
93
102
 
94
103
  console.log("JsView Loader: Load done. AppName=" + appName);
95
104
  }
@@ -117,74 +126,57 @@ export default class JsViewLoader {
117
126
  return target;
118
127
  }
119
128
 
120
- #loadJsViewEnvAsync(appName, onLoaded, permission) {
129
+ #loadJsViewEnvAsync(appName, permission) {
121
130
  console.log("StartApp...");
122
131
 
123
- // 运行在Native中
124
- if (window.JsView) {
125
- if (appName) {
126
- window.JsView.setMiniAppPermissionInfo?.(JSON.stringify(permission));
127
- window.JsView.notifyAppName?.(appName);
128
- }
132
+ if (appName) {
133
+ window.JsvCoreApi.setMiniAppPermissionInfo(JSON.stringify(permission));
134
+ window.JsvCoreApi.notifyAppName(appName);
135
+ }
136
+
137
+ // (可选配置)按键接受的扩展,例如将静音按键(JAVA键值为164)映射为JS键值20001,PS:注意"164"的引号
138
+ window.JsvCoreApi.addKeysMap(this.#config.vendorConfig.bindKeys);
139
+
140
+ // (可选配置)localStorage支持
141
+ let storageDomain = this.#config.jsviewConfig.localStorage.domain;
142
+ if (!storageDomain || storageDomain === "default") {
143
+ // 兼容历史版本出现的default字符串设置
144
+ storageDomain = appName; // null/default场景,不和其他应用共享localStorage, 也规避了考虑同名item问题
145
+ } else if (storageDomain === "follow-url") {
146
+ if (window.location.protocol == "file:") {
147
+ // file方式加载,使用appName
148
+ storageDomain = appName;
149
+ console.warn("Storage domain follow-url not support file://");
150
+ } else {
151
+ storageDomain = window.location.hostname;
129
152
 
130
- // (可选配置)按键接受的扩展,例如将静音按键(JAVA键值为164)映射为JS键值20001,PS:注意"164"的引号
131
- window.JsView.addKeysMap(this.#config.vendorConfig.bindKeys);
132
-
133
- // (可选配置)localStorage支持
134
- let storageDomain = this.#config.jsviewConfig.localStorage.domain;
135
- if (!storageDomain || storageDomain === "default") {
136
- // 兼容历史版本出现的default字符串设置
137
- storageDomain = appName; // null/default场景,不和其他应用共享localStorage, 也规避了考虑同名item问题
138
- } else if (storageDomain === "follow-url") {
139
- if (window.location.protocol == "file:") {
140
- // file方式加载,使用appName
153
+ const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
154
+ const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;
155
+ if (ipv4Regex.test(storageDomain) || ipv6Regex.test(storageDomain)) {
156
+ // ip形式, 不能作为合格domain, 使用appName作为domain
141
157
  storageDomain = appName;
142
- console.warn("Storage domain follow-url not support file://");
143
- } else {
144
- storageDomain = window.location.hostname;
145
-
146
- const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
147
- const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$/;
148
- if (ipv4Regex.test(storageDomain) || ipv6Regex.test(storageDomain)) {
149
- // ip形式, 不能作为合格domain, 使用appName作为domain
150
- storageDomain = appName;
151
- console.warn("Storage domain follow-url not support host with ip");
152
- }
158
+ console.warn("Storage domain follow-url not support host with ip");
153
159
  }
154
160
  }
155
- console.log(`Storage domain [${storageDomain}]`);
156
- window.JsView.setStorageDomain(storageDomain); // Domain为app包名
157
-
158
- const localStorageKeys = this.#config.jsviewConfig.localStorage.presetKeys;
159
- window.JsView.enableStorageNames(...localStorageKeys);
161
+ }
162
+ console.log(`Storage domain [${storageDomain}]`);
163
+ window.JsvCoreApi.setStorageDomain(storageDomain); // Domain为app包名
160
164
 
161
- // (可选设置)cookies的支持
162
- const cookiesDomain = this.#config.jsviewConfig.cookies?.domain;
163
- if (cookiesDomain) {
164
- console.log("Enable cookie for domain " + cookiesDomain);
165
- window.JsView.setCookieDomain?.(cookiesDomain);
166
- }
165
+ const localStorageKeys = this.#config.jsviewConfig.localStorage.presetKeys;
166
+ window.JsvCoreApi.enableStorageNames(...localStorageKeys);
167
167
 
168
- // JsView Dom相关配置
169
- window.JsView.Dom.Render = function () {
170
- onLoaded()
171
- };
172
- } else {
173
- this.#forgeAppClass.SetRender(function () {
174
- onLoaded();
175
- })
168
+ // (可选设置)cookies的支持
169
+ const cookiesDomain = this.#config.jsviewConfig.cookies?.domain;
170
+ if (cookiesDomain) {
171
+ console.log("Enable cookie for domain " + cookiesDomain);
172
+ window.JsvCoreApi.setCookieDomain(cookiesDomain);
176
173
  }
177
174
  }
178
175
 
179
176
  #checkEngineVersion() {
180
- if (!window.JsView) {
181
- return;
182
- }
183
-
184
177
  // 检查配套引擎的版本
185
- if (window.JsView.CodeRevision !== TargetRevision.CoreRevision /* Native引擎版本(由APK启动参数 CORE 决定) */
186
- || window.Forge.Version !== TargetRevision.JseRevision) {/* JS引擎版本(由APK启动参数 ENGINEJS 决定) */
187
- console.warn(`Warning: JsView Engine version miss matched, some effect will be lost or crash!! current using core=${window.JsView.CodeRevision} engine=${window.Forge.Version}(but core should be ${TargetRevision.CoreRevision}, engine should be ${TargetRevision.JseRevision} url=${TargetRevision.JseUrl})`);
178
+ if (window.JsvCoreApi.CodeRevision !== TargetRevision.CoreRevision /* Native引擎版本(由APK启动参数 CORE 决定) */) {
179
+ console.warn(`Warning: JsView Engine version miss matched, some effect will be lost or crash!! current using core=${window.JsvCoreApi.CodeRevision} (but core should be ${TargetRevision.CoreRevision})`);
188
180
  }
189
181
  }
190
182
 
@@ -220,13 +212,7 @@ export default class JsViewLoader {
220
212
  return designMap;
221
213
  }
222
214
 
223
- #runForgeApp(activityManager) {
224
- console.log("JsView Loader: Run forge app.");
225
- this.#forgeActivityManager = activityManager;
226
- this.#tryStartForgeApp();
227
- }
228
-
229
- #tryStartForgeApp() {
215
+ #tryStartForgeApp(onForgeAppReady) {
230
216
  if (!this.#forgeActivityManager ||
231
217
  this.#jsviewInited == false) {
232
218
  return;
@@ -235,6 +221,9 @@ export default class JsViewLoader {
235
221
  console.log("JsView Loader: Start forge app.");
236
222
  // eslint-disable-next-line new-cap
237
223
  this.#forgeApp = new this.#forgeAppClass(this.#forgeActivityManager);
224
+
225
+ // Forge app创建完成
226
+ onForgeAppReady();
238
227
  }
239
228
 
240
229
  #config = JsViewDefConfig;
@@ -1,31 +1,25 @@
1
+
1
2
  async function main() {
2
- const { default: appConfig } = await import("/src/appConfig/app.config.mjs");
3
- const { default: jsviewVendorConfig } = await import("/src/appConfig/jsview.config.mjs");
4
- const { PERMISSION } = await import("/src/appConfig/permission.js");
3
+ const {
4
+ appConfig,
5
+ jsviewVendorConfig,
6
+ PERMISSION,
7
+ JsViewLoader,
8
+ } = await import('./jsview-config.js');
5
9
 
6
- let JsViewLoader = null;
7
- // 根据JsViewConfig, 判断厂商是否设置了使用远程loader启动
8
- const remoteLoader = jsviewVendorConfig.jsviewConfig.remoteLoader;
9
- if (remoteLoader) {
10
- JsViewLoader = (await import(remoteLoader)).default;
11
- } else {
12
- JsViewLoader = (await import('./jsview-loader.js')).default;
13
- }
14
10
  const jsviewLoader = new JsViewLoader();
15
11
 
16
12
  // 使用vendor配置值覆盖默认配置。
17
13
  const config = jsviewLoader.mergeConfig(jsviewVendorConfig);
18
14
  console.log("JsView config: " + JSON.stringify(config));
19
15
 
20
- jsviewLoader.initForgeEnv();
21
-
22
16
  // 初始化jsview运行环境。
23
17
  const onInitJsViewEnv = async function () {
24
18
  // JsView环境加载完毕后,加载vue/react的main.js文件。
25
19
  try {
26
20
  await import('/src/main.tsx');
27
21
  } finally {
28
- window.JsView?.onMainTsDone(); // 通知Java, 此时app首次渲染执行完毕
22
+ window.JsvCoreApi.onMainTsDone(); // 通知Java, 此时app首次渲染执行完毕
29
23
  }
30
24
  };
31
25
  jsviewLoader.initJsViewEnv(appConfig.AppName, onInitJsViewEnv, PERMISSION);
@@ -25,8 +25,8 @@ export default {
25
25
  },
26
26
 
27
27
  // (可选配置)填写main.js或者bundle.js相对于index.html的相对位置,
28
- // 用于image/import.then的相对寻址, vue3默认值是/js/
29
- jsSubPath: '/js/'
28
+ // 用于image/import.then的相对寻址, vue3默认值是1
29
+ jsRelativeDepth: 1,
30
30
  },
31
31
 
32
32
  vendorConfig: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shijiu/jsview",
3
- "version": "2.2.201",
3
+ "version": "2.2.426-test.0",
4
4
  "bin": {
5
5
  "jsview-post-build": "./tools/jsview-post-build.js",
6
6
  "jsview-post-install": "./tools/jsview-post-install.js"
@@ -2,6 +2,7 @@ import { defineConfig } from 'vite'
2
2
  import fs from 'fs'
3
3
  import path from 'path'
4
4
  // import fullReload from 'vite-plugin-full-reload';
5
+ // import wasm from "vite-plugin-wasm";
5
6
 
6
7
  // https://vitejs.dev/config/
7
8
  const jsviewConfig = defineConfig({
@@ -23,10 +24,10 @@ const jsviewConfig = defineConfig({
23
24
  polyfill: false
24
25
  },
25
26
  rollupOptions: {
27
+ onwarn: onRollupWarning,
26
28
  output: {
27
- assetFileNames: (chunkInfo) => chunkInfo.name.endsWith('.css') ? 'css/[name].[hash].css' : 'assets/[name].[hash].[ext]',
28
- chunkFileNames: process.env['JSVIEW_KEEP_CHUNKNAME'] ? 'js/[name].[hash].js' : 'js/chunk.jsv.[hash].js',
29
- // chunkFileNames: 'js/[name].[hash].js',
29
+ assetFileNames: getFileName,
30
+ chunkFileNames: getFileName,
30
31
  entryFileNames: 'js/main.jsv.[hash].js',
31
32
  format: 'esm',
32
33
  manualChunks: {
@@ -42,7 +43,7 @@ const jsviewConfig = defineConfig({
42
43
  },
43
44
  plugins: [
44
45
  {
45
- name: 'remove-bangs',
46
+ name: 'vite-plugin-remove-bangs',
46
47
  renderChunk(code) { return {
47
48
  code: code.replace(/^\/\/!/g, '//').replace(/^\/\*!/g, '/*'),
48
49
  map: null,
@@ -72,9 +73,10 @@ const jsviewConfig = defineConfig({
72
73
  'jsview-vue-samples',
73
74
  ],
74
75
  },
75
- // plugins: [
76
+ plugins: [
76
77
  // fullReload('node_modules/@shijiu/**/*'),
77
- // ],
78
+ // wasm(),
79
+ ],
78
80
  resolve: {
79
81
  alias: {
80
82
  // 'jsview': path.resolve(process.cwd(), 'node_modules/@shijiu/jsview'),
@@ -87,7 +89,12 @@ const jsviewConfig = defineConfig({
87
89
  preserveSymlinks: true
88
90
  },
89
91
  server: {
92
+ headers: { // 启用浏览器SharedArrayBuffer,webassmbly的thread用
93
+ 'Cross-Origin-Opener-Policy': 'same-origin',
94
+ 'Cross-Origin-Embedder-Policy': 'require-corp',
95
+ },
90
96
  host: true,
97
+ https: process.env['JSVIEW_ENABLE_HTTPS'] ? getHttpsConfig() : false,
91
98
  open: !process.env['JSVIEW_DISABLE_OPEN_BROWSER'] && process.platform === "darwin",
92
99
  watch: {
93
100
  ignored: [
@@ -95,6 +102,16 @@ const jsviewConfig = defineConfig({
95
102
  ],
96
103
  }
97
104
  },
105
+ worker: {
106
+ format: 'esm',
107
+ rollupOptions: {
108
+ output: {
109
+ assetFileNames: getFileName,
110
+ chunkFileNames: getFileName,
111
+ entryFileNames: getFileName,
112
+ },
113
+ },
114
+ },
98
115
  });
99
116
 
100
117
  function getModuleDir() {
@@ -135,6 +152,50 @@ function ensureFramework(originConfig) {
135
152
  return framework;
136
153
  }
137
154
 
155
+ function getFileName(chunkInfo) {
156
+ if(chunkInfo.name.endsWith('.css')) {
157
+ return 'css/[name].[hash].css';
158
+ } else if(chunkInfo.name.endsWith('.ttf')) {
159
+ return 'assets/[name].ttf';
160
+ } else if(chunkInfo.name.endsWith('.wasm')) {
161
+ return 'js/[name].wasm';
162
+ } else if(chunkInfo.type == 'chunk') {
163
+ return (process.env['JSVIEW_KEEP_CHUNKNAME'] ? 'js/[name].[hash].js' : 'js/chunk.jsv2.[hash].js');
164
+ }
165
+
166
+ return 'assets/[name].[hash].[ext]'
167
+ }
168
+
169
+ function onRollupWarning(warning, defaultHandler) {
170
+ if (warning.code === 'FILE_NAME_CONFLICT') {
171
+ if(warning.message.includes('jsview-dom-browser-forge')
172
+ && warning.message.includes('.wasm')) {
173
+ console.info('\nJsView Info: Ignore warning', warning.message)
174
+ return;
175
+ }
176
+ } else if (warning.code === 'EVAL') {
177
+ if(warning.message.includes('mock.js')) {
178
+ console.info('\nJsView Info: Ignore warning', warning.message)
179
+ return;
180
+ }
181
+ }
182
+
183
+ defaultHandler(warning);
184
+ }
185
+
186
+ function getHttpsConfig() {
187
+ const configDir = path.resolve(getModuleDir(), '@shijiu/jsview/tools/https-server-config');
188
+ const certFilePath = path.resolve(configDir, 'cert.pem');
189
+ const keyFilePath = path.resolve(configDir, 'key.pem');
190
+
191
+ return {
192
+ cert: fs.readFileSync(certFilePath),
193
+ key: fs.readFileSync(keyFilePath),
194
+ maxVersion: 'TLSv1.2',
195
+ minVersion: 'TLSv1',
196
+ }
197
+ }
198
+
138
199
  function jsvCreateJsViewViteConfig(originConfig) {
139
200
  let aliasJsView;
140
201
 
Binary file
@@ -0,0 +1,61 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIF+TCCBOGgAwIBAgIQD86irWNoDq1u1raeYxf5STANBgkqhkiG9w0BAQsFADBu
3
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
4
+ d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
5
+ RFYgVExTIENBIC0gRzIwHhcNMjQxMDI0MDAwMDAwWhcNMjUwMTIxMjM1OTU5WjAU
6
+ MRIwEAYDVQQDEwlxaW5nbWEuY2MwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
7
+ AoIBAQCnub2hwc+a36hc5XwRg9GADOck0+lFRAwWPxkoTKF2hucVDASM2W75iXAk
8
+ PaOOWSkoGsbCBSpTvdW1lmQDpMwSaQPpk6caeQi3XAQr8Cm6EwFoG3KjlXJgQDYm
9
+ MRrE+CMfr4SlJ4sG+mSMPHONgFcPBDB+9hoMC9Fxqz+A8IUe+tpIVIyxaC2JkI7F
10
+ PtWLGwUZqVmx3qwnbi8do86Szp5OZKQeiBVSJfvhqDqp9q+2Q+0ktjvXy2ru6a63
11
+ V8hKA5RLO3XcpQfPryM+fX4U/0rveF9pgo0Kd9Nqvx3nVgglHJKekI1sp51uMrv+
12
+ zW4QrsuDYuWyebmTN7RaFiE3kICpAgMBAAGjggLrMIIC5zAfBgNVHSMEGDAWgBR4
13
+ 35GQX+7erPbFdevVTFVT7yRKtjAdBgNVHQ4EFgQU5/BTc9JIOxyG/HeKbZ5UV3cq
14
+ +w8wIwYDVR0RBBwwGoIJcWluZ21hLmNjgg13d3cucWluZ21hLmNjMD4GA1UdIAQ3
15
+ MDUwMwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQu
16
+ Y29tL0NQUzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
17
+ AQUFBwMCMIGABggrBgEFBQcBAQR0MHIwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3Nw
18
+ LmRpZ2ljZXJ0LmNvbTBKBggrBgEFBQcwAoY+aHR0cDovL2NhY2VydHMuZGlnaWNl
19
+ cnQuY29tL0VuY3J5cHRpb25FdmVyeXdoZXJlRFZUTFNDQS1HMi5jcnQwDAYDVR0T
20
+ AQH/BAIwADCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHYATnWjJ1yaEMM4W2zU
21
+ 3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGSvU+icAAABAMARzBFAiBJVL9R7lBz16jy
22
+ 8e0TJBdTzV3fMTWfzlRYZhG+I14puAIhANzli+hGrVk7AcsZCMMohZMcktsBKOfb
23
+ zsFZFllGlgXcAHYAfVkeEuF4KnscYWd8Xv340IdcFKBOlZ65Ay/ZDowuebgAAAGS
24
+ vU+iKwAABAMARzBFAiEA/AuFfaSAEthtIWr/xBManOf3Bz2LJPK8+YUtODolslAC
25
+ IFo7Y5E9FpWqQSNWB+Gq35rOsn/u9Chqfeu7h/LV33HPAHYA5tIxY0B3jMEQQQbX
26
+ cbnOwdJA9paEhvu6hzId/R43jlAAAAGSvU+iQAAABAMARzBFAiBhpXUJ0Ix8NI2Q
27
+ pKgzYUtz8WxSxuGTpf2bJw+xCybZeQIhAKz0p1DvF9hcp46QAfwVTlwyVPNDJCLD
28
+ OYSqdfy6xWCyMA0GCSqGSIb3DQEBCwUAA4IBAQCDQbUsMb7BOr4iCbcbZ25I7VDF
29
+ xUzk9b2n/z4CDlbbnmWn/8YtMORyspG2bBKp62sPpgt86SQC+f81aPMCAylJZjbt
30
+ gS4IGCQnnHyJsLez4ITQwA38xemjP/vbc++GVuQZFADfDYoSfjq73prEeGybtL9j
31
+ bkkkO3xC5Bba7enxu1IPlEwXOzlmfj5NxY6L69NRLYhgSeoEGl4NxMkAF5Cef6B8
32
+ wRMmeoyBtguAdLRU+y4I9Bsm5yOs+iSRb6nzTkbYj2QYvByXcHwC2bpW0wKJZYS+
33
+ KDUYTqSwJp9Jw9Jec6uSoZfsvaezKw1Gy40jtQbvsK+fr4LXFN8qi2aJWgl9
34
+ -----END CERTIFICATE-----
35
+ -----BEGIN CERTIFICATE-----
36
+ MIIEqjCCA5KgAwIBAgIQDeD/te5iy2EQn2CMnO1e0zANBgkqhkiG9w0BAQsFADBh
37
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
38
+ d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
39
+ MjAeFw0xNzExMjcxMjQ2NDBaFw0yNzExMjcxMjQ2NDBaMG4xCzAJBgNVBAYTAlVT
40
+ MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
41
+ b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
42
+ MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAO8Uf46i/nr7pkgTDqnE
43
+ eSIfCFqvPnUq3aF1tMJ5hh9MnO6Lmt5UdHfBGwC9Si+XjK12cjZgxObsL6Rg1njv
44
+ NhAMJ4JunN0JGGRJGSevbJsA3sc68nbPQzuKp5Jc8vpryp2mts38pSCXorPR+sch
45
+ QisKA7OSQ1MjcFN0d7tbrceWFNbzgL2csJVQeogOBGSe/KZEIZw6gXLKeFe7mupn
46
+ NYJROi2iC11+HuF79iAttMc32Cv6UOxixY/3ZV+LzpLnklFq98XORgwkIJL1HuvP
47
+ ha8yvb+W6JislZJL+HLFtidoxmI7Qm3ZyIV66W533DsGFimFJkz3y0GeHWuSVMbI
48
+ lfsCAwEAAaOCAU8wggFLMB0GA1UdDgQWBBR435GQX+7erPbFdevVTFVT7yRKtjAf
49
+ BgNVHSMEGDAWgBROIlQgGJXm427mD/r6uRLtBhePOTAOBgNVHQ8BAf8EBAMCAYYw
50
+ HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
51
+ AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
52
+ Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
53
+ Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
54
+ /WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
55
+ MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAoBs1eCLKakLtVRPFRjBIJ9LJ
56
+ L0s8ZWum8U8/1TMVkQMBn+CPb5xnCD0GSA6L/V0ZFrMNqBirrr5B241OesECvxIi
57
+ 98bZ90h9+q/X5eMyOD35f8YTaEMpdnQCnawIwiHx06/0BfiTj+b/XQih+mqt3ZXe
58
+ xNCJqKexdiB2IWGSKcgahPacWkk/BAQFisKIFYEqHzV974S3FAz/8LIfD58xnsEN
59
+ GfzyIDkH3JrwYZ8caPTf6ZX9M1GrISN8HnWTtdNCH2xEajRa/h9ZBXjUyFKQrGk2
60
+ n2hcLrfZSbynEC/pSw/ET7H5nWwckjmAJ1l9fcnbqkU/pf6uMQmnfl0JQjJNSg==
61
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEAp7m9ocHPmt+oXOV8EYPRgAznJNPpRUQMFj8ZKEyhdobnFQwE
3
+ jNlu+YlwJD2jjlkpKBrGwgUqU73VtZZkA6TMEmkD6ZOnGnkIt1wEK/ApuhMBaBty
4
+ o5VyYEA2JjEaxPgjH6+EpSeLBvpkjDxzjYBXDwQwfvYaDAvRcas/gPCFHvraSFSM
5
+ sWgtiZCOxT7VixsFGalZsd6sJ24vHaPOks6eTmSkHogVUiX74ag6qfavtkPtJLY7
6
+ 18tq7umut1fISgOUSzt13KUHz68jPn1+FP9K73hfaYKNCnfTar8d51YIJRySnpCN
7
+ bKedbjK7/s1uEK7Lg2Llsnm5kze0WhYhN5CAqQIDAQABAoIBADntueQjVzurYa/s
8
+ BqTZ/UKXskGS+y9UKESKuHqltOKGB0vKocuv0VdYM6Ygr9ubSc6zKNCcDhlsKGKW
9
+ NabYhS8anCJRP9ax1OPXYQ133kGJDORTDo4XMLCznMAmF5POC/uGmG6eMLNRSebx
10
+ fgtyNx9VmBZRk39zmXwD5GP5LlEbTQ70MB56DdpQPOe8UZgT3aITZTRhGxwk9Z7N
11
+ YdhJLVRyS3lufnLxBgj+VFMmqViBgWPfi/T73V1tg+6i/n+MHVPY8XprqiioO3yE
12
+ FPDe4+5AciimTg9QrlqF7ZmyRx9c0zdxs2aDewPXovp4fmyO91I81f/XbxwR4Hg+
13
+ WbHUZ60CgYEA4sHLxidVhQD6wZrbmbjY3zgHsAtpKqst+xiRD73Uo4UM5B7A3+bo
14
+ v5HJx/PX+Ax4O8PZz8ghGS+J8xXXAAHdnBetYT5YniOfkFw/XDl7y1IazY+74k5e
15
+ Wew+mdELKRJtW/3ylFDcsHMxy9aA+jNVm0m8hjMnHdhufPZhs6wdpAsCgYEAvVsR
16
+ Rizx710Hlon5/byYPgo+vjPxTHNH/5b4nLmYTNsDWzVO8LqVkPpT8XewfEAYSOpp
17
+ uAYfK2GJc36XFX/0sZJFwuChKapnuL2r2x1OLKqJjKK/f+5XUirRFh//bMpS/FsM
18
+ +0/DWnfYsw9dwgnH2JIuods1+8SL7uFWYBV5SpsCgYBoT8YxzX5lxOGVlmtW99Ws
19
+ OdYvgdBLNJveWprApw7eeiJH/m2zkkGXfrVYKjA7h2D3/UyBbQrszxWioXVaJ4GO
20
+ gMXdahTSCokom4b6Ied0zLxPu8Mug+abbzYNBEEiD7wHCXdCC0C6WwOZRX/nmR3U
21
+ ZcM36OghrqKFEcI4KQEpqQKBgQCRzus5T2io+cjbCbofwba1pyvzSIoZZXfef0FH
22
+ Zb66B7fI5v63beW38prrCFA1DSHmG+N2WfhsbjnqXmM2ogYpKkpfqptPOzGNVzhb
23
+ jHBjAprSWYv+lehVlDTWxaLpAc7vFamkZyI1qq2KDF4VCXUC9mXEKsmh6hIayxe4
24
+ +zAf2wKBgA8qx/b8IpSc/9KJATtpNwnSWkDhwzazU8rwHTE8QDsbmSurf2eBtC3e
25
+ 5Gki7XcXpVIroERRfy5jdKfZ0xb5SmBsqCxu3NTDLtwuV3PMqh5oSGi6fjzL6/dn
26
+ XNaHyu1jMd2g3AxoWVk6+41iuHEIJZ2UnJhrFXsIsWejmrni6vGT
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,16 @@
1
+ {
2
+ "headers": [
3
+ {
4
+ "source": "**/*",
5
+ "headers": [
6
+ {
7
+ "key": "Cross-Origin-Opener-Policy",
8
+ "value": "same-origin"
9
+ }, {
10
+ "key": "Cross-Origin-Embedder-Policy",
11
+ "value": "require-corp"
12
+ }
13
+ ]
14
+ }
15
+ ]
16
+ }