@yqg/permission 1.3.0-alpha.0 → 1.3.0-alpha.10

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.
@@ -0,0 +1,292 @@
1
+ // vite.config.ts
2
+ import vue from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/@vitejs+plugin-vue@5.2.1_vite@5.4.14_@types+node@22.9.1__vue@3.5.13_typescript@5.5.4_/node_modules/@vitejs/plugin-vue/dist/index.mjs";
3
+ import { defineConfig } from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/vite@5.4.14_@types+node@22.9.1/node_modules/vite/dist/node/index.js";
4
+ import cssInjectedByJsPlugin from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/vite-plugin-css-injected-by-js@3.5.2_vite@5.4.14_@types+node@22.9.1_/node_modules/vite-plugin-css-injected-by-js/dist/esm/index.js";
5
+
6
+ // plugins/alioss.ts
7
+ import CdnClient, {
8
+ PushObjectCacheRequest,
9
+ RefreshObjectCachesRequest
10
+ } from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/@alicloud+cdn20180510@3.1.2/node_modules/@alicloud/cdn20180510/dist/client.js";
11
+ import { Config } from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/@alicloud+openapi-client@0.4.12/node_modules/@alicloud/openapi-client/dist/client.js";
12
+ import OSS from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/ali-oss@6.17.1/node_modules/ali-oss/lib/client.js";
13
+ import { join } from "path";
14
+ import { URL } from "url";
15
+ import { lodash as _, logger, ora } from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/@yqg+max-utils@1.0.2/node_modules/@yqg/max-utils/dist/index.js";
16
+ import chalk from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/chalk@5.3.0/node_modules/chalk/source/index.js";
17
+ function viteAliossPlugin(options) {
18
+ let viteConfig;
19
+ let filterFields = [];
20
+ const aliyunBucketMap = Object.fromEntries(
21
+ Object.entries({
22
+ feat: [
23
+ "fintopia-web",
24
+ "https://static-ali.yangqianguan.com",
25
+ "oss-cn-beijing"
26
+ ],
27
+ prod: [
28
+ "fintopia-web",
29
+ "https://static-ali.yangqianguan.com",
30
+ "oss-cn-beijing"
31
+ ],
32
+ test: [
33
+ "fintopia-web-test",
34
+ "https://static-ali-test.yangqianguan.com",
35
+ "oss-cn-beijing"
36
+ ]
37
+ }).map(([stage, [name, origin, region, endpoint]]) => [
38
+ stage,
39
+ { name, origin, region, endpoint }
40
+ ])
41
+ );
42
+ return {
43
+ name: "vite-plugin-alioss",
44
+ enforce: "post",
45
+ apply: "build",
46
+ // 配置解析钩子
47
+ config() {
48
+ const STAGE = process.env.STAGE;
49
+ if (!STAGE) {
50
+ console.warn(chalk.yellow("\u7F3A\u5C11\u73AF\u5883\u53D8\u91CF STAGE\uFF0C\u5C06\u8DF3\u8FC7\u963F\u91CC\u4E91 CDN \u4E0A\u4F20"));
51
+ return;
52
+ }
53
+ const bucket = aliyunBucketMap[STAGE];
54
+ if (bucket && options?.cdnDir) {
55
+ return {
56
+ base: `${bucket.origin}/${options.cdnDir}`
57
+ };
58
+ }
59
+ },
60
+ // 获取解析后的 Vite 配置
61
+ configResolved(config) {
62
+ viteConfig = config;
63
+ },
64
+ generateBundle(_2, bundle) {
65
+ if (_2.format === "umd") {
66
+ filterFields = Object.keys(bundle);
67
+ }
68
+ },
69
+ // 构建完成钩子
70
+ async closeBundle() {
71
+ const STAGE = process.env.STAGE;
72
+ if (!STAGE || options?.cdnRetry) {
73
+ console.log(chalk.yellow("\u8DF3\u8FC7\u963F\u91CC\u4E91 CDN \u4E0A\u4F20"));
74
+ return;
75
+ }
76
+ const { cdnDir } = options || {
77
+ cdnDir: ""
78
+ };
79
+ if (cdnDir) {
80
+ if (cdnDir.startsWith("/")) {
81
+ console.log(chalk.yellow("cdnDir\u7981\u6B62\u4EE5/\u5F00\u5934"));
82
+ process.exit(1);
83
+ }
84
+ if (!cdnDir.endsWith("/")) {
85
+ console.log(chalk.yellow("cdnDir\u5FC5\u987B\u4EE5/\u7ED3\u5C3E"));
86
+ process.exit(1);
87
+ }
88
+ }
89
+ const aliyunAccessKeyId = process.env.aliyunAccessKeyId || "LTAI5tLcBNEBRLkfak9nRA1M";
90
+ const aliyunAccessKeySecret = process.env.aliyunAccessKeySecret || "wxIkk2dd56IsibD6bBCeEma7QFqdi1";
91
+ const aliyunBucket = aliyunBucketMap[STAGE];
92
+ if (!aliyunBucket) {
93
+ console.log(chalk.yellow(
94
+ `\u963F\u91CC\u4E91Bucket\u914D\u7F6E\u4E0D\u5B58\u5728, \u5F53\u524D\u73AF\u5883\u662F${STAGE} \u76EE\u524D\u652F\u6301\u7684stage\u6709: ${Object.keys(
95
+ aliyunBucketMap
96
+ ).join(", ")}`
97
+ ));
98
+ process.exit(1);
99
+ }
100
+ const { region, origin: cdnOrigin, endpoint } = aliyunBucket;
101
+ const aliossConfig = {
102
+ region,
103
+ accessKeyId: aliyunAccessKeyId,
104
+ accessKeySecret: aliyunAccessKeySecret,
105
+ bucket: aliyunBucket.name,
106
+ secure: true,
107
+ timeout: 18e5,
108
+ endpoint
109
+ };
110
+ const outDir = viteConfig.build.outDir;
111
+ console.log(outDir, "OutDir");
112
+ const outputPath = join(process.cwd(), outDir);
113
+ const maxRetries = 3;
114
+ logger.info("alioss", "\u5F00\u59CB\u4E0A\u4F20cdn\u8D44\u6E90", "\u{1F680}");
115
+ const putBatchSize = 50;
116
+ const fileChunks = _.chunk(filterFields, putBatchSize);
117
+ logger.info(`\u4E0A\u4F20\u914D\u7F6E\u4FE1\u606F: ${JSON.stringify(aliossConfig, null, 2)}`);
118
+ logger.info(`\u4E0A\u4F20\u6587\u4EF6\u6570\u91CF: ${filterFields.length}`);
119
+ logger.info(`\u4E0A\u4F20\u6587\u4EF6\u5206\u6279\u6570\u91CF: ${fileChunks.length}`);
120
+ logger.info(`\u4E0A\u4F20\u6587\u4EF6\u5206\u6279\u5927\u5C0F: ${putBatchSize}`);
121
+ logger.info(`\u4E0A\u4F20\u6587\u4EF6\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${maxRetries}`);
122
+ const spinner = ora({
123
+ prefixText: "alioss.upload",
124
+ spinner: "aesthetic"
125
+ }).start("\u5F00\u59CB\u4E0A\u4F20cdn\u8D44\u6E90");
126
+ async function uploadFileWithRetry(client, filename, retries = maxRetries) {
127
+ const key = join(cdnDir, filename);
128
+ const localFile = join(outputPath, filename);
129
+ console.log(localFile, "localFile");
130
+ for (let attempt = 1; attempt <= retries; attempt++) {
131
+ const attemptText = attempt === 1 ? "" : ` (\u91CD\u8BD5 ${attempt})`;
132
+ try {
133
+ logger.info(`\u4E0A\u4F20\u4E2D ${filename} ${attemptText}...`);
134
+ await client.put(key, localFile);
135
+ logger.info(`\u4E0A\u4F20\u5B8C\u6210 ${filename} ${attemptText}`);
136
+ return;
137
+ } catch (error) {
138
+ logger.info(`\u4E0A\u4F20\u5931\u8D25 ${filename} ${attemptText}`);
139
+ if (attempt === retries) {
140
+ logger.error(`\u6700\u5927\u91CD\u8BD5\u6B21\u6570\u540E\u963F\u91CC\u4E91\u4E0A\u4F20\u5931\u8D25 ${filename}`);
141
+ process.exit(1);
142
+ }
143
+ logger.info(`\u91CD\u8BD5\u4E0A\u4F20 ${filename} ${attemptText}...`);
144
+ }
145
+ }
146
+ }
147
+ for (const key in fileChunks) {
148
+ if (Object.prototype.hasOwnProperty.call(fileChunks, key)) {
149
+ const chunk = fileChunks[key];
150
+ spinner.info(
151
+ `\u7B2C${+key + 1}/${fileChunks.length}\u6279\u4E0A\u4F20 - ${chunk.length} \u4E2A\u6587\u4EF6`
152
+ );
153
+ const client = new OSS(aliossConfig);
154
+ await Promise.all(
155
+ chunk.map((filename) => uploadFileWithRetry(client, filename))
156
+ );
157
+ spinner.info(`\u7B2C${+key + 1}/${fileChunks.length}\u6279\u4E0A\u4F20\u5B8C\u6210`);
158
+ }
159
+ }
160
+ spinner.succeed("\u4E0A\u4F20cdn\u8D44\u6E90\u5B8C\u6210");
161
+ const cdnClient = new CdnClient.default(new Config({
162
+ accessKeyId: aliyunAccessKeyId,
163
+ accessKeySecret: aliyunAccessKeySecret,
164
+ regionId: region
165
+ }));
166
+ const validAssetUrls = filterFields.map(
167
+ (filename) => `${cdnOrigin}/${cdnDir}${filename}`
168
+ );
169
+ const cdnHostname = new URL(cdnOrigin).hostname;
170
+ const batchSize = 100;
171
+ let start = 0;
172
+ while (start < validAssetUrls.length) {
173
+ const cdnUrls = validAssetUrls.slice(start, start + batchSize);
174
+ const cdnUrlPaths = cdnUrls.map(
175
+ (assetPath) => join(cdnHostname, cdnDir, assetPath)
176
+ );
177
+ const objectPath = cdnUrlPaths.join("\n");
178
+ const refreshReq = new RefreshObjectCachesRequest({ objectPath });
179
+ logger.info("\u5F00\u59CB\u5237\u65B0cdn\u7F13\u5B58");
180
+ try {
181
+ await cdnClient.refreshObjectCaches(refreshReq);
182
+ logger.info("\u5237\u65B0cdn\u7F13\u5B58\u6210\u529F");
183
+ } catch (err) {
184
+ logger.error("\u5237\u65B0cdn\u7F13\u5B58\u5931\u8D25", err);
185
+ throw err;
186
+ }
187
+ const request = new PushObjectCacheRequest({ objectPath });
188
+ logger.info("\u5F00\u59CB\u63A8\u9001cdn\u7F13\u5B58");
189
+ try {
190
+ await cdnClient.pushObjectCache(request);
191
+ logger.info("\u63A8\u9001cdn\u7F13\u5B58\u6210\u529F");
192
+ } catch (err) {
193
+ logger.error("\u63A8\u9001cdn\u7F13\u5B58\u5931\u8D25", err);
194
+ }
195
+ start += batchSize;
196
+ logger.info("\u5237\u65B0\u540Ecdn\u5730\u5740", cdnUrls);
197
+ }
198
+ }
199
+ };
200
+ }
201
+
202
+ // package.json
203
+ var package_default = {
204
+ name: "@yqg/permission",
205
+ version: "1.3.0-alpha.10",
206
+ main: "dist/index.js",
207
+ module: "dist/index.js",
208
+ type: "module",
209
+ publishConfig: {
210
+ access: "public",
211
+ registry: "https://registry.npmjs.org/"
212
+ },
213
+ scripts: {
214
+ build: "vue-tsc -b && vite build",
215
+ dev: "vite",
216
+ preview: "vite preview",
217
+ "demo:build": "vue-tsc -b && STAGE=test vite build",
218
+ "prod:build": "vue-tsc -b && STAGE=prod vite build"
219
+ },
220
+ devDependencies: {
221
+ "@ant-design/icons-vue": "^7.0.1",
222
+ "@commitlint/cli": "^19.5.0",
223
+ "@commitlint/config-conventional": "^19.5.0",
224
+ "@types/vue": "^2.0.0",
225
+ "@typescript-eslint/parser": "^8.13.0",
226
+ "@vitejs/plugin-vue": "^5.1.4",
227
+ "ant-design-vue": "4.x",
228
+ axios: "^1.7.7",
229
+ eslint: "^9.14.0",
230
+ husky: "^9",
231
+ "lint-staged": "^13.2.0",
232
+ typescript: "~5.5.4",
233
+ vite: "^5.4.9",
234
+ "vite-plugin-css-injected-by-js": "^3.5.2",
235
+ vue: "^3.5.12",
236
+ "vue-tsc": "^2.1.8",
237
+ "@alicloud/cdn20180510": "3.1.2",
238
+ "@alicloud/openapi-client": "0.4.12",
239
+ "@originjs/vite-plugin-commonjs": "1.0.3",
240
+ "@yqg/max-utils": "^1.0.2",
241
+ "ali-oss": "6.17.1",
242
+ chalk: "5.3.0",
243
+ ora: "5.4.1"
244
+ }
245
+ };
246
+
247
+ // vite.config.ts
248
+ var vite_config_default = defineConfig({
249
+ plugins: [
250
+ vue(),
251
+ cssInjectedByJsPlugin(),
252
+ viteAliossPlugin({
253
+ cdnDir: `cdn/yqg-permission/${package_default.version}/`
254
+ })
255
+ ],
256
+ resolve: {
257
+ alias: {
258
+ "@": "/src"
259
+ }
260
+ },
261
+ server: {
262
+ proxy: {
263
+ "/crane": {
264
+ target: "https://crane-test.yangqianguan.com",
265
+ changeOrigin: true
266
+ }
267
+ }
268
+ },
269
+ build: {
270
+ // 把style.css 内联到js文件中
271
+ cssCodeSplit: false,
272
+ lib: {
273
+ entry: "src/yqg-permission/index.ts",
274
+ name: "yqg-permission",
275
+ fileName: (format) => {
276
+ if (format === "umd") {
277
+ return "yqg-permission.umd.js";
278
+ }
279
+ return "index.js";
280
+ },
281
+ formats: ["es", "umd"]
282
+ }
283
+ },
284
+ define: {
285
+ "process.env.NODE_ENV": JSON.stringify("production")
286
+ // 手动替换
287
+ }
288
+ });
289
+ export {
290
+ vite_config_default as default
291
+ };
292
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAicGx1Z2lucy9hbGlvc3MudHMiLCAicGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL2x3dy9Eb3dubG9hZHMvd29yay9jb2RlL3lxZy1wZXJtaXNzaW9uXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvbHd3L0Rvd25sb2Fkcy93b3JrL2NvZGUveXFnLXBlcm1pc3Npb24vdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL1VzZXJzL2x3dy9Eb3dubG9hZHMvd29yay9jb2RlL3lxZy1wZXJtaXNzaW9uL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5cbmltcG9ydCBjc3NJbmplY3RlZEJ5SnNQbHVnaW4gZnJvbSAndml0ZS1wbHVnaW4tY3NzLWluamVjdGVkLWJ5LWpzJ1xuaW1wb3J0IGFsaW9zcyBmcm9tIFwiLi9wbHVnaW5zL2FsaW9zc1wiO1xuaW1wb3J0IHBrZyBmcm9tIFwiLi9wYWNrYWdlLmpzb25cIjtcblxuLy8gaHR0cHM6Ly92aXRlLmRldi9jb25maWcvXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICAgIHBsdWdpbnM6IFtcbiAgICAgICAgdnVlKCksXG4gICAgICAgIGNzc0luamVjdGVkQnlKc1BsdWdpbigpLFxuICAgICAgICBhbGlvc3Moe1xuICAgICAgICAgICAgY2RuRGlyOiBgY2RuL3lxZy1wZXJtaXNzaW9uLyR7cGtnLnZlcnNpb259L2BcbiAgICAgICAgfSksXG4gICAgXSxcbiAgICByZXNvbHZlOiB7XG4gICAgICAgIGFsaWFzOiB7XG4gICAgICAgICAgICAnQCc6ICcvc3JjJyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHNlcnZlcjoge1xuICAgICAgICBwcm94eToge1xuICAgICAgICAgICAgJy9jcmFuZSc6IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6ICdodHRwczovL2NyYW5lLXRlc3QueWFuZ3FpYW5ndWFuLmNvbScsXG5cdFx0XHRcdGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBidWlsZDoge1xuXHRcdC8vIFx1NjI4QXN0eWxlLmNzcyBcdTUxODVcdTgwNTRcdTUyMzBqc1x1NjU4N1x1NEVGNlx1NEUyRFxuXHRcdGNzc0NvZGVTcGxpdDogZmFsc2UsXG4gICAgICAgIGxpYjoge1xuICAgICAgICAgICAgZW50cnk6ICdzcmMveXFnLXBlcm1pc3Npb24vaW5kZXgudHMnLFxuICAgICAgICAgICAgbmFtZTogJ3lxZy1wZXJtaXNzaW9uJyxcbiAgICAgICAgICAgIGZpbGVOYW1lOiAoZm9ybWF0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ3VtZCcpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAneXFnLXBlcm1pc3Npb24udW1kLmpzJzsgLy8gVU1EIFx1NjgzQ1x1NUYwRlx1NzY4NFx1OEY5M1x1NTFGQVx1NjU4N1x1NEVGNlx1NTQwRFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJ2luZGV4LmpzJzsgLy8gRVNNIFx1NjgzQ1x1NUYwRlx1NzY4NFx1OEY5M1x1NTFGQVx1NjU4N1x1NEVGNlx1NTQwRFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcm1hdHM6IFsnZXMnLCAndW1kJ10sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZpbmU6IHtcbiAgICAgICAgJ3Byb2Nlc3MuZW52Lk5PREVfRU5WJzogSlNPTi5zdHJpbmdpZnkoJ3Byb2R1Y3Rpb24nKSwgLy8gXHU2MjRCXHU1MkE4XHU2NkZGXHU2MzYyXG4gICAgfSxcbn0pO1xuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvbHd3L0Rvd25sb2Fkcy93b3JrL2NvZGUveXFnLXBlcm1pc3Npb24vcGx1Z2luc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL2x3dy9Eb3dubG9hZHMvd29yay9jb2RlL3lxZy1wZXJtaXNzaW9uL3BsdWdpbnMvYWxpb3NzLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9sd3cvRG93bmxvYWRzL3dvcmsvY29kZS95cWctcGVybWlzc2lvbi9wbHVnaW5zL2FsaW9zcy50c1wiOy8vIHZpdGUtcGx1Z2luLWFsaW9zcy50c1xuaW1wb3J0IHsgUGx1Z2luT3B0aW9uLCBVc2VyQ29uZmlnLCBSZXNvbHZlZENvbmZpZyB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IENkbkNsaWVudCwge1xuICBQdXNoT2JqZWN0Q2FjaGVSZXF1ZXN0LFxuICBSZWZyZXNoT2JqZWN0Q2FjaGVzUmVxdWVzdCxcbn0gZnJvbSAnQGFsaWNsb3VkL2NkbjIwMTgwNTEwJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJ0BhbGljbG91ZC9vcGVuYXBpLWNsaWVudCc7XG5pbXBvcnQgT1NTIGZyb20gJ2FsaS1vc3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGxvZGFzaCBhcyBfLCBsb2dnZXIsIG9yYSB9IGZyb20gJ0B5cWcvbWF4LXV0aWxzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbnR5cGUgQWxpT1NTQ29uZmlnID0ge1xuICBjZG5EaXI6IHN0cmluZztcbiAgaHRtbERpcj86IHN0cmluZztcbiAgY2RuUmV0cnk/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdml0ZUFsaW9zc1BsdWdpbihvcHRpb25zOiBBbGlPU1NDb25maWcpOiBQbHVnaW5PcHRpb24ge1xuICBsZXQgdml0ZUNvbmZpZzogUmVzb2x2ZWRDb25maWc7XG4gIGxldCBmaWx0ZXJGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFsaXl1bkJ1Y2tldE1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh7XG4gICAgICBmZWF0OiBbXG4gICAgICAgICdmaW50b3BpYS13ZWInLFxuICAgICAgICAnaHR0cHM6Ly9zdGF0aWMtYWxpLnlhbmdxaWFuZ3Vhbi5jb20nLFxuICAgICAgICAnb3NzLWNuLWJlaWppbmcnLFxuICAgICAgXSxcbiAgICAgIHByb2Q6IFtcbiAgICAgICAgJ2ZpbnRvcGlhLXdlYicsXG4gICAgICAgICdodHRwczovL3N0YXRpYy1hbGkueWFuZ3FpYW5ndWFuLmNvbScsXG4gICAgICAgICdvc3MtY24tYmVpamluZycsXG4gICAgICBdLFxuICAgICAgdGVzdDogW1xuICAgICAgICAnZmludG9waWEtd2ViLXRlc3QnLFxuICAgICAgICAnaHR0cHM6Ly9zdGF0aWMtYWxpLXRlc3QueWFuZ3FpYW5ndWFuLmNvbScsXG4gICAgICAgICdvc3MtY24tYmVpamluZycsXG4gICAgICBdLFxuICAgIH0pLm1hcCgoW3N0YWdlLCBbbmFtZSwgb3JpZ2luLCByZWdpb24sIGVuZHBvaW50XV0pID0+IFtcbiAgICAgIHN0YWdlLFxuICAgICAgeyBuYW1lLCBvcmlnaW4sIHJlZ2lvbiwgZW5kcG9pbnQgfSxcbiAgICBdKSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd2aXRlLXBsdWdpbi1hbGlvc3MnLFxuICAgIGVuZm9yY2U6ICdwb3N0JyxcbiAgICBhcHBseTogXCJidWlsZFwiLFxuICAgIC8vIFx1OTE0RFx1N0Y2RVx1ODlFM1x1Njc5MFx1OTRBOVx1NUI1MFxuICAgIGNvbmZpZygpIHtcbiAgICAgIGNvbnN0IFNUQUdFID0gcHJvY2Vzcy5lbnYuU1RBR0UgYXMgJ3Rlc3QnIHwgJ3Byb2QnO1xuICAgICAgaWYgKCFTVEFHRSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdcdTdGM0FcdTVDMTFcdTczQUZcdTU4ODNcdTUzRDhcdTkxQ0YgU1RBR0VcdUZGMENcdTVDMDZcdThERjNcdThGQzdcdTk2M0ZcdTkxQ0NcdTRFOTEgQ0ROIFx1NEUwQVx1NEYyMCcpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBcdThCQkVcdTdGNkUgcHVibGljUGF0aFxuICAgICAgY29uc3QgYnVja2V0ID0gYWxpeXVuQnVja2V0TWFwW1NUQUdFXTtcbiAgICAgIGlmIChidWNrZXQgJiYgb3B0aW9ucz8uY2RuRGlyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYmFzZTogYCR7YnVja2V0Lm9yaWdpbn0vJHtvcHRpb25zLmNkbkRpcn1gXG4gICAgICAgIH0gYXMgVXNlckNvbmZpZztcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gXHU4M0I3XHU1M0Q2XHU4OUUzXHU2NzkwXHU1NDBFXHU3Njg0IFZpdGUgXHU5MTREXHU3RjZFXG4gICAgY29uZmlnUmVzb2x2ZWQoY29uZmlnKSB7XG4gICAgICB2aXRlQ29uZmlnID0gY29uZmlnO1xuICAgIH0sXG5cbiAgICBnZW5lcmF0ZUJ1bmRsZShfLCBidW5kbGUpIHtcbiAgICAgIC8vIFx1NEYxQVx1NTkxQVx1NkIyMVx1NjI2N1x1ODg0Q1xuICAgICAgaWYoXy5mb3JtYXQgPT09ICd1bWQnKSB7XG4gICAgICAgIGZpbHRlckZpZWxkcyA9IE9iamVjdC5rZXlzKGJ1bmRsZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFx1Njc4NFx1NUVGQVx1NUI4Q1x1NjIxMFx1OTRBOVx1NUI1MFxuICAgIGFzeW5jIGNsb3NlQnVuZGxlKCkge1xuICAgICAgY29uc3QgU1RBR0UgPSBwcm9jZXNzLmVudi5TVEFHRSBhcyAndGVzdCcgfCAncHJvZCc7XG4gICAgICBpZiAoIVNUQUdFIHx8IG9wdGlvbnM/LmNkblJldHJ5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnXHU4REYzXHU4RkM3XHU5NjNGXHU5MUNDXHU0RTkxIENETiBcdTRFMEFcdTRGMjAnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBjZG5EaXIgfSA9IG9wdGlvbnMgfHwge1xuICAgICAgICBjZG5EaXI6ICcnLFxuICAgICAgfTtcblxuICAgICAgaWYgKGNkbkRpcikge1xuICAgICAgICBpZiAoY2RuRGlyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnY2RuRGlyXHU3OTgxXHU2QjYyXHU0RUU1L1x1NUYwMFx1NTkzNCcpKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjZG5EaXIuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnY2RuRGlyXHU1RkM1XHU5ODdCXHU0RUU1L1x1N0VEM1x1NUMzRScpKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYWxpeXVuQWNjZXNzS2V5SWQgPVxuICAgICAgICBwcm9jZXNzLmVudi5hbGl5dW5BY2Nlc3NLZXlJZCB8fCAnTFRBSTV0TGNCTkVCUkxrZmFrOW5SQTFNJztcbiAgICAgIGNvbnN0IGFsaXl1bkFjY2Vzc0tleVNlY3JldCA9XG4gICAgICAgIHByb2Nlc3MuZW52LmFsaXl1bkFjY2Vzc0tleVNlY3JldCB8fCAnd3hJa2syZGQ1NklzaWJENmJCQ2VFbWE3UUZxZGkxJztcblxuICAgICAgLy8gXHU1MjFEXHU1OUNCXHU1MzE2IE9TUyBcdTVCQTJcdTYyMzdcdTdBRUZcbiAgICAgIGNvbnN0IGFsaXl1bkJ1Y2tldCA9IGFsaXl1bkJ1Y2tldE1hcFtTVEFHRV07XG4gICAgICBpZiAoIWFsaXl1bkJ1Y2tldCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXG4gICAgICAgICAgYFx1OTYzRlx1OTFDQ1x1NEU5MUJ1Y2tldFx1OTE0RFx1N0Y2RVx1NEUwRFx1NUI1OFx1NTcyOCwgXHU1RjUzXHU1MjREXHU3M0FGXHU1ODgzXHU2NjJGJHtTVEFHRX0gXHU3NkVFXHU1MjREXHU2NTJGXHU2MzAxXHU3Njg0c3RhZ2VcdTY3MDk6ICR7T2JqZWN0LmtleXMoXG4gICAgICAgICAgICBhbGl5dW5CdWNrZXRNYXAsXG4gICAgICAgICAgKS5qb2luKCcsICcpfWAsXG4gICAgICAgICkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlZ2lvbiwgb3JpZ2luOiBjZG5PcmlnaW4sIGVuZHBvaW50IH0gPSBhbGl5dW5CdWNrZXQ7XG5cbiAgICAgIGNvbnN0IGFsaW9zc0NvbmZpZyA9IHtcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBhY2Nlc3NLZXlJZDogYWxpeXVuQWNjZXNzS2V5SWQsXG4gICAgICAgIGFjY2Vzc0tleVNlY3JldDogYWxpeXVuQWNjZXNzS2V5U2VjcmV0LFxuICAgICAgICBidWNrZXQ6IGFsaXl1bkJ1Y2tldC5uYW1lLFxuICAgICAgICBzZWN1cmU6IHRydWUsXG4gICAgICAgIHRpbWVvdXQ6IDE4MDAwMDAsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3V0RGlyID0gdml0ZUNvbmZpZy5idWlsZC5vdXREaXI7XG4gICAgICBjb25zb2xlLmxvZyhvdXREaXIsICdPdXREaXInKTtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBqb2luKHByb2Nlc3MuY3dkKCksIG91dERpcik7XG4gICAgICBjb25zdCBtYXhSZXRyaWVzID0gMztcblxuICAgICAgbG9nZ2VyLmluZm8oJ2FsaW9zcycsICdcdTVGMDBcdTU5Q0JcdTRFMEFcdTRGMjBjZG5cdThENDRcdTZFOTAnLCAnXHVEODNEXHVERTgwJyk7XG4gICAgICBjb25zdCBwdXRCYXRjaFNpemUgPSA1MDtcbiAgICAgIGNvbnN0IGZpbGVDaHVua3MgPSBfLmNodW5rKGZpbHRlckZpZWxkcywgcHV0QmF0Y2hTaXplKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTkxNERcdTdGNkVcdTRGRTFcdTYwNkY6ICR7SlNPTi5zdHJpbmdpZnkoYWxpb3NzQ29uZmlnLCBudWxsLCAyKX1gKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTY1ODdcdTRFRjZcdTY1NzBcdTkxQ0Y6ICR7ZmlsdGVyRmllbGRzLmxlbmd0aH1gKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTY1ODdcdTRFRjZcdTUyMDZcdTYyNzlcdTY1NzBcdTkxQ0Y6ICR7ZmlsZUNodW5rcy5sZW5ndGh9YCk7XG4gICAgICBsb2dnZXIuaW5mbyhgXHU0RTBBXHU0RjIwXHU2NTg3XHU0RUY2XHU1MjA2XHU2Mjc5XHU1OTI3XHU1QzBGOiAke3B1dEJhdGNoU2l6ZX1gKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTY1ODdcdTRFRjZcdTY3MDBcdTU5MjdcdTkxQ0RcdThCRDVcdTZCMjFcdTY1NzA6ICR7bWF4UmV0cmllc31gKTtcblxuICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYSh7XG4gICAgICAgIHByZWZpeFRleHQ6ICdhbGlvc3MudXBsb2FkJyxcbiAgICAgICAgc3Bpbm5lcjogJ2Flc3RoZXRpYycsXG4gICAgICB9KS5zdGFydCgnXHU1RjAwXHU1OUNCXHU0RTBBXHU0RjIwY2RuXHU4RDQ0XHU2RTkwJyk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGVXaXRoUmV0cnkoXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIHJldHJpZXMgPSBtYXhSZXRyaWVzLFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGpvaW4oY2RuRGlyLCBmaWxlbmFtZSk7XG4gICAgICAgIGNvbnN0IGxvY2FsRmlsZSA9IGpvaW4ob3V0cHV0UGF0aCwgZmlsZW5hbWUpO1xuICAgICAgICBjb25zb2xlLmxvZyhsb2NhbEZpbGUsIFwibG9jYWxGaWxlXCIpO1xuXG4gICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgICAgIGNvbnN0IGF0dGVtcHRUZXh0ID0gYXR0ZW1wdCA9PT0gMSA/ICcnIDogYCAoXHU5MUNEXHU4QkQ1ICR7YXR0ZW1wdH0pYDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFx1NEUwQVx1NEYyMFx1NEUyRCAke2ZpbGVuYW1lfSAke2F0dGVtcHRUZXh0fS4uLmApO1xuICAgICAgICAgICAgYXdhaXQgY2xpZW50LnB1dChrZXksIGxvY2FsRmlsZSk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgXHU0RTBBXHU0RjIwXHU1QjhDXHU2MjEwICR7ZmlsZW5hbWV9ICR7YXR0ZW1wdFRleHR9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTU5MzFcdThEMjUgJHtmaWxlbmFtZX0gJHthdHRlbXB0VGV4dH1gKTtcbiAgICAgICAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgXHU2NzAwXHU1OTI3XHU5MUNEXHU4QkQ1XHU2QjIxXHU2NTcwXHU1NDBFXHU5NjNGXHU5MUNDXHU0RTkxXHU0RTBBXHU0RjIwXHU1OTMxXHU4RDI1ICR7ZmlsZW5hbWV9YCk7XG4gICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBcdTkxQ0RcdThCRDVcdTRFMEFcdTRGMjAgJHtmaWxlbmFtZX0gJHthdHRlbXB0VGV4dH0uLi5gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmlsZUNodW5rcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpbGVDaHVua3MsIGtleSkpIHtcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGZpbGVDaHVua3Nba2V5XTtcbiAgICAgICAgICBzcGlubmVyLmluZm8oXG4gICAgICAgICAgICBgXHU3QjJDJHsra2V5ICsgMX0vJHtmaWxlQ2h1bmtzLmxlbmd0aH1cdTYyNzlcdTRFMEFcdTRGMjAgLSAke2NodW5rLmxlbmd0aH0gXHU0RTJBXHU2NTg3XHU0RUY2YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBPU1MoYWxpb3NzQ29uZmlnKTtcblxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgY2h1bmsubWFwKChmaWxlbmFtZSkgPT4gdXBsb2FkRmlsZVdpdGhSZXRyeShjbGllbnQsIGZpbGVuYW1lKSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzcGlubmVyLmluZm8oYFx1N0IyQyR7K2tleSArIDF9LyR7ZmlsZUNodW5rcy5sZW5ndGh9XHU2Mjc5XHU0RTBBXHU0RjIwXHU1QjhDXHU2MjEwYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdcdTRFMEFcdTRGMjBjZG5cdThENDRcdTZFOTBcdTVCOENcdTYyMTAnKTtcbiAgICAgIGNvbnN0IGNkbkNsaWVudCA9IG5ldyBDZG5DbGllbnQuZGVmYXVsdChuZXcgQ29uZmlnKHtcbiAgICAgICAgYWNjZXNzS2V5SWQ6IGFsaXl1bkFjY2Vzc0tleUlkLFxuICAgICAgICBhY2Nlc3NLZXlTZWNyZXQ6IGFsaXl1bkFjY2Vzc0tleVNlY3JldCxcbiAgICAgICAgcmVnaW9uSWQ6IHJlZ2lvbixcbiAgICAgIH0pKTtcbiAgXG4gICAgICBjb25zdCB2YWxpZEFzc2V0VXJscyA9IGZpbHRlckZpZWxkcy5tYXAoXG4gICAgICAgIChmaWxlbmFtZTogc3RyaW5nKSA9PiBgJHtjZG5PcmlnaW59LyR7Y2RuRGlyfSR7ZmlsZW5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBjZG5Ib3N0bmFtZSA9IG5ldyBVUkwoY2RuT3JpZ2luKS5ob3N0bmFtZTtcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDEwMDtcbiAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICB3aGlsZSAoc3RhcnQgPCB2YWxpZEFzc2V0VXJscy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2RuVXJscyA9IHZhbGlkQXNzZXRVcmxzLnNsaWNlKHN0YXJ0LCBzdGFydCArIGJhdGNoU2l6ZSk7XG5cbiAgICAgICAgY29uc3QgY2RuVXJsUGF0aHMgPSBjZG5VcmxzLm1hcCgoYXNzZXRQYXRoKSA9PlxuICAgICAgICAgIGpvaW4oY2RuSG9zdG5hbWUsIGNkbkRpciwgYXNzZXRQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0UGF0aCA9IGNkblVybFBhdGhzLmpvaW4oJ1xcbicpO1xuICAgICAgICAvLyByZWZyZXNoXG4gICAgICAgIGNvbnN0IHJlZnJlc2hSZXEgPSBuZXcgUmVmcmVzaE9iamVjdENhY2hlc1JlcXVlc3QoeyBvYmplY3RQYXRoIH0pO1xuICAgICAgICBsb2dnZXIuaW5mbygnXHU1RjAwXHU1OUNCXHU1MjM3XHU2NUIwY2RuXHU3RjEzXHU1QjU4Jyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2RuQ2xpZW50LnJlZnJlc2hPYmplY3RDYWNoZXMocmVmcmVzaFJlcSk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1x1NTIzN1x1NjVCMGNkblx1N0YxM1x1NUI1OFx1NjIxMFx1NTI5RicpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1x1NTIzN1x1NjVCMGNkblx1N0YxM1x1NUI1OFx1NTkzMVx1OEQyNScsIGVycik7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBQdXNoT2JqZWN0Q2FjaGVSZXF1ZXN0KHsgb2JqZWN0UGF0aCB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1x1NUYwMFx1NTlDQlx1NjNBOFx1OTAwMWNkblx1N0YxM1x1NUI1OCcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNkbkNsaWVudC5wdXNoT2JqZWN0Q2FjaGUocmVxdWVzdCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1x1NjNBOFx1OTAwMWNkblx1N0YxM1x1NUI1OFx1NjIxMFx1NTI5RicpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1x1NjNBOFx1OTAwMWNkblx1N0YxM1x1NUI1OFx1NTkzMVx1OEQyNScsIGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCArPSBiYXRjaFNpemU7XG5cbiAgICAgICAgLy8gXHU4RjkzXHU1MUZBXHU1MjM3XHU2NUIwXHU1NDBFY2RuXHU1NzMwXHU1NzQwXG4gICAgICAgIGxvZ2dlci5pbmZvKCdcdTUyMzdcdTY1QjBcdTU0MEVjZG5cdTU3MzBcdTU3NDAnLCBjZG5VcmxzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufSIsICJ7XG4gICAgXCJuYW1lXCI6IFwiQHlxZy9wZXJtaXNzaW9uXCIsXG4gICAgXCJ2ZXJzaW9uXCI6IFwiMS4zLjAtYWxwaGEuMTBcIixcbiAgICBcIm1haW5cIjogXCJkaXN0L2luZGV4LmpzXCIsXG4gICAgXCJtb2R1bGVcIjogXCJkaXN0L2luZGV4LmpzXCIsXG4gICAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gICAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICAgICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIixcbiAgICAgICAgXCJyZWdpc3RyeVwiOiBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL1wiXG4gICAgfSxcbiAgICBcInNjcmlwdHNcIjoge1xuICAgICAgICBcImJ1aWxkXCI6IFwidnVlLXRzYyAtYiAmJiB2aXRlIGJ1aWxkXCIsXG4gICAgICAgIFwiZGV2XCI6IFwidml0ZVwiLFxuICAgICAgICBcInByZXZpZXdcIjogXCJ2aXRlIHByZXZpZXdcIixcbiAgICAgICAgXCJkZW1vOmJ1aWxkXCI6IFwidnVlLXRzYyAtYiAmJiBTVEFHRT10ZXN0IHZpdGUgYnVpbGRcIixcbiAgICAgICAgXCJwcm9kOmJ1aWxkXCI6IFwidnVlLXRzYyAtYiAmJiBTVEFHRT1wcm9kIHZpdGUgYnVpbGRcIlxuXG4gICAgfSxcbiAgICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgICAgIFwiQGFudC1kZXNpZ24vaWNvbnMtdnVlXCI6IFwiXjcuMC4xXCIsXG4gICAgICAgIFwiQGNvbW1pdGxpbnQvY2xpXCI6IFwiXjE5LjUuMFwiLFxuICAgICAgICBcIkBjb21taXRsaW50L2NvbmZpZy1jb252ZW50aW9uYWxcIjogXCJeMTkuNS4wXCIsXG4gICAgICAgIFwiQHR5cGVzL3Z1ZVwiOiBcIl4yLjAuMFwiLFxuICAgICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXJcIjogXCJeOC4xMy4wXCIsXG4gICAgICAgIFwiQHZpdGVqcy9wbHVnaW4tdnVlXCI6IFwiXjUuMS40XCIsXG4gICAgICAgIFwiYW50LWRlc2lnbi12dWVcIjogXCI0LnhcIixcbiAgICAgICAgXCJheGlvc1wiOiBcIl4xLjcuN1wiLFxuICAgICAgICBcImVzbGludFwiOiBcIl45LjE0LjBcIixcbiAgICAgICAgXCJodXNreVwiOiBcIl45XCIsXG4gICAgICAgIFwibGludC1zdGFnZWRcIjogXCJeMTMuMi4wXCIsXG4gICAgICAgIFwidHlwZXNjcmlwdFwiOiBcIn41LjUuNFwiLFxuICAgICAgICBcInZpdGVcIjogXCJeNS40LjlcIixcbiAgICAgICAgXCJ2aXRlLXBsdWdpbi1jc3MtaW5qZWN0ZWQtYnktanNcIjogXCJeMy41LjJcIixcbiAgICAgICAgXCJ2dWVcIjogXCJeMy41LjEyXCIsXG4gICAgICAgIFwidnVlLXRzY1wiOiBcIl4yLjEuOFwiLFxuICAgICAgICBcIkBhbGljbG91ZC9jZG4yMDE4MDUxMFwiOiBcIjMuMS4yXCIsXG4gICAgICAgIFwiQGFsaWNsb3VkL29wZW5hcGktY2xpZW50XCI6IFwiMC40LjEyXCIsXG4gICAgICAgIFwiQG9yaWdpbmpzL3ZpdGUtcGx1Z2luLWNvbW1vbmpzXCI6IFwiMS4wLjNcIixcbiAgICAgICAgXCJAeXFnL21heC11dGlsc1wiOiBcIl4xLjAuMlwiLFxuICAgICAgICBcImFsaS1vc3NcIjogXCI2LjE3LjFcIixcbiAgICAgICAgXCJjaGFsa1wiOiBcIjUuMy4wXCIsXG4gICAgICAgIFwib3JhXCI6IFwiNS40LjFcIlxuICAgIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBeVQsT0FBTyxTQUFTO0FBQ3pVLFNBQVMsb0JBQW9CO0FBRTdCLE9BQU8sMkJBQTJCOzs7QUNEbEMsT0FBTztBQUFBLEVBQ0w7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixPQUFPLFNBQVM7QUFDaEIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsV0FBVztBQUNwQixTQUFTLFVBQVUsR0FBRyxRQUFRLFdBQVc7QUFDekMsT0FBTyxXQUFXO0FBUUgsU0FBUixpQkFBa0MsU0FBcUM7QUFDNUUsTUFBSTtBQUNKLE1BQUksZUFBeUIsQ0FBQztBQUM5QixRQUFNLGtCQUFrQixPQUFPO0FBQUEsSUFDN0IsT0FBTyxRQUFRO0FBQUEsTUFDYixNQUFNO0FBQUEsUUFDSjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BQ0EsTUFBTTtBQUFBLFFBQ0o7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE1BQU07QUFBQSxRQUNKO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDLEVBQUUsSUFB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