@hanzo/browser-extension 1.7.6 → 1.9.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +9 -18
- package/dist/browser-extension/README.md +1 -1
- package/dist/browser-extension/background-firefox.js +4180 -499
- package/dist/browser-extension/background.js +6932 -2419
- package/dist/browser-extension/browser-control.js +652 -18
- package/dist/browser-extension/chrome/background.js +6932 -2419
- package/dist/browser-extension/chrome/content-script.js +1642 -123
- package/dist/browser-extension/chrome/icon128.png +0 -0
- package/dist/browser-extension/chrome/icon16.png +0 -0
- package/dist/browser-extension/chrome/icon48.png +0 -0
- package/dist/browser-extension/chrome/manifest.json +20 -11
- package/dist/browser-extension/chrome/popup.css +352 -110
- package/dist/browser-extension/chrome/popup.html +159 -48
- package/dist/browser-extension/chrome/popup.js +1418 -46
- package/dist/browser-extension/chrome/sidebar.css +772 -156
- package/dist/browser-extension/chrome/sidebar.html +268 -85
- package/dist/browser-extension/chrome/sidebar.js +25846 -84
- package/dist/browser-extension/cli.js +2 -2
- package/dist/browser-extension/content-script.js +1642 -123
- package/dist/browser-extension/firefox/background.js +4180 -499
- package/dist/browser-extension/firefox/content-script.js +1642 -123
- package/dist/browser-extension/firefox/icon128.png +0 -0
- package/dist/browser-extension/firefox/icon16.png +0 -0
- package/dist/browser-extension/firefox/icon48.png +0 -0
- package/dist/browser-extension/firefox/manifest.json +24 -13
- package/dist/browser-extension/firefox/popup.css +352 -110
- package/dist/browser-extension/firefox/popup.html +159 -48
- package/dist/browser-extension/firefox/popup.js +1418 -46
- package/dist/browser-extension/firefox/sidebar.css +772 -156
- package/dist/browser-extension/firefox/sidebar.html +268 -85
- package/dist/browser-extension/firefox/sidebar.js +25846 -84
- package/dist/browser-extension/icon128.png +0 -0
- package/dist/browser-extension/icon16.png +0 -0
- package/dist/browser-extension/icon48.png +0 -0
- package/dist/browser-extension/manifest.json +20 -11
- package/dist/browser-extension/package.json +1 -1
- package/dist/browser-extension/popup.js +1418 -46
- package/dist/browser-extension/safari/Info.plist +3 -3
- package/dist/browser-extension/safari/background.js +6932 -2419
- package/dist/browser-extension/safari/content-script.js +1642 -123
- package/dist/browser-extension/safari/icon128.png +0 -0
- package/dist/browser-extension/safari/icon16.png +0 -0
- package/dist/browser-extension/safari/icon48.png +0 -0
- package/dist/browser-extension/safari/popup.css +352 -110
- package/dist/browser-extension/safari/popup.html +159 -48
- package/dist/browser-extension/safari/popup.js +1418 -46
- package/dist/browser-extension/safari/sidebar.css +772 -156
- package/dist/browser-extension/safari/sidebar.html +268 -85
- package/dist/browser-extension/safari/sidebar.js +25846 -84
- package/dist/browser-extension/sidebar.js +25846 -84
- package/dist/browser-extension/webgpu-ai.js +78 -5
- package/images/icon128.png +0 -0
- package/images/icon16.png +0 -0
- package/images/icon48.png +0 -0
- package/manifest.json +7 -2
- package/package.json +27 -10
- package/src/chat-widget.tsx +96 -0
- package/src/gui-primitives.tsx +116 -0
- package/src/icon128.png +0 -0
- package/src/icon16.png +0 -0
- package/src/icon32.png +0 -0
- package/src/icon48.png +0 -0
- package/src/manifest-firefox.json +23 -12
- package/src/manifest.json +19 -10
- package/src/package.json +1 -1
- package/src/popup.css +352 -110
- package/src/popup.html +159 -48
- package/src/popup.js +196 -0
- package/src/sidebar.css +772 -156
- package/src/sidebar.html +268 -85
- package/src/sidebar.js +885 -0
- package/.github/workflows/docs.yml +0 -44
- package/.github/workflows/release.yml +0 -55
- package/README.md +0 -126
- package/dist/browser-extension/ai-worker.js +0 -30
- package/dist/browser-extension/cdp-bridge-server.js +0 -444
- package/dist/browser-extension/chrome/icon32.png +0 -0
- package/dist/browser-extension/firefox/icon32.png +0 -0
- package/dist/browser-extension/hanzo-browser-extension-firefox-1.1.0.zip +0 -0
- package/dist/browser-extension/icon32.png +0 -0
- package/dist/browser-extension/popup.css +0 -468
- package/dist/browser-extension/popup.html +0 -191
- package/dist/browser-extension/safari/icon32.png +0 -0
- package/dist/browser-extension/sidebar.css +0 -718
- package/dist/browser-extension/sidebar.html +0 -184
- package/dist/cdp-bridge-server.js +0 -411
- package/dist/hanzo-ai-chrome-1.7.2.zip +0 -0
- package/dist/hanzo-ai-chrome-1.7.3.zip +0 -0
- package/dist/hanzo-ai-firefox-1.7.2.zip +0 -0
- package/dist/hanzo-ai-firefox-1.7.3.zip +0 -0
- package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.pbxproj +0 -1047
- package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json +0 -11
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@1x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@2x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@1x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@2x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@1x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@2x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@1x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@2x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@1x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@2x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/universal-icon-1024@1x.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/Contents.json +0 -6
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json +0 -21
- package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon128.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Resources/Base.lproj/Main.html +0 -20
- package/dist/safari/Hanzo AI/Shared (App)/Resources/Icon.png +0 -0
- package/dist/safari/Hanzo AI/Shared (App)/Resources/Script.js +0 -24
- package/dist/safari/Hanzo AI/Shared (App)/Resources/Style.css +0 -61
- package/dist/safari/Hanzo AI/Shared (App)/ViewController.swift +0 -81
- package/dist/safari/Hanzo AI/Shared (Extension)/SafariWebExtensionHandler.swift +0 -42
- package/dist/safari/Hanzo AI/iOS (App)/AppDelegate.swift +0 -24
- package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/LaunchScreen.storyboard +0 -36
- package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/Main.storyboard +0 -38
- package/dist/safari/Hanzo AI/iOS (App)/Info.plist +0 -27
- package/dist/safari/Hanzo AI/iOS (App)/SceneDelegate.swift +0 -18
- package/dist/safari/Hanzo AI/iOS (Extension)/Info.plist +0 -13
- package/dist/safari/Hanzo AI/macOS (App)/AppDelegate.swift +0 -21
- package/dist/safari/Hanzo AI/macOS (App)/Base.lproj/Main.storyboard +0 -124
- package/dist/safari/Hanzo AI/macOS (App)/Info.plist +0 -8
- package/dist/safari/Hanzo AI/macOS (Extension)/Info.plist +0 -13
- package/docs/_config.yml +0 -13
- package/docs/_layouts/default.html +0 -435
- package/docs/index.md +0 -54
- package/hanzo-ai-chrome-v1.7.6.zip +0 -0
- package/hanzo-ai-firefox-v1.7.6.zip +0 -0
- package/install-extension.sh +0 -75
- package/test/claude-integration.test.ts +0 -251
- package/test/server-frameworks-edge-cases.test.ts +0 -145
- package/test/server-frameworks.test.ts +0 -395
- package/test-cdp-connection.js +0 -140
- package/tsconfig.json +0 -19
|
@@ -1,15 +1,1095 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
(() => {
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __commonJS = (cb, mod) => function __require() {
|
|
10
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
|
|
29
|
+
// ../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js
|
|
30
|
+
var require_browser_polyfill = __commonJS({
|
|
31
|
+
"../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js"(exports, module) {
|
|
32
|
+
(function(global, factory) {
|
|
33
|
+
if (typeof define === "function" && define.amd) {
|
|
34
|
+
define("webextension-polyfill", ["module"], factory);
|
|
35
|
+
} else if (typeof exports !== "undefined") {
|
|
36
|
+
factory(module);
|
|
37
|
+
} else {
|
|
38
|
+
var mod = {
|
|
39
|
+
exports: {}
|
|
40
|
+
};
|
|
41
|
+
factory(mod);
|
|
42
|
+
global.browser = mod.exports;
|
|
43
|
+
}
|
|
44
|
+
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : exports, function(module2) {
|
|
45
|
+
"use strict";
|
|
46
|
+
if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {
|
|
47
|
+
throw new Error("This script should only be loaded in a browser extension.");
|
|
48
|
+
}
|
|
49
|
+
if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {
|
|
50
|
+
const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.";
|
|
51
|
+
const wrapAPIs = (extensionAPIs) => {
|
|
52
|
+
const apiMetadata = {
|
|
53
|
+
"alarms": {
|
|
54
|
+
"clear": {
|
|
55
|
+
"minArgs": 0,
|
|
56
|
+
"maxArgs": 1
|
|
57
|
+
},
|
|
58
|
+
"clearAll": {
|
|
59
|
+
"minArgs": 0,
|
|
60
|
+
"maxArgs": 0
|
|
61
|
+
},
|
|
62
|
+
"get": {
|
|
63
|
+
"minArgs": 0,
|
|
64
|
+
"maxArgs": 1
|
|
65
|
+
},
|
|
66
|
+
"getAll": {
|
|
67
|
+
"minArgs": 0,
|
|
68
|
+
"maxArgs": 0
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"bookmarks": {
|
|
72
|
+
"create": {
|
|
73
|
+
"minArgs": 1,
|
|
74
|
+
"maxArgs": 1
|
|
75
|
+
},
|
|
76
|
+
"get": {
|
|
77
|
+
"minArgs": 1,
|
|
78
|
+
"maxArgs": 1
|
|
79
|
+
},
|
|
80
|
+
"getChildren": {
|
|
81
|
+
"minArgs": 1,
|
|
82
|
+
"maxArgs": 1
|
|
83
|
+
},
|
|
84
|
+
"getRecent": {
|
|
85
|
+
"minArgs": 1,
|
|
86
|
+
"maxArgs": 1
|
|
87
|
+
},
|
|
88
|
+
"getSubTree": {
|
|
89
|
+
"minArgs": 1,
|
|
90
|
+
"maxArgs": 1
|
|
91
|
+
},
|
|
92
|
+
"getTree": {
|
|
93
|
+
"minArgs": 0,
|
|
94
|
+
"maxArgs": 0
|
|
95
|
+
},
|
|
96
|
+
"move": {
|
|
97
|
+
"minArgs": 2,
|
|
98
|
+
"maxArgs": 2
|
|
99
|
+
},
|
|
100
|
+
"remove": {
|
|
101
|
+
"minArgs": 1,
|
|
102
|
+
"maxArgs": 1
|
|
103
|
+
},
|
|
104
|
+
"removeTree": {
|
|
105
|
+
"minArgs": 1,
|
|
106
|
+
"maxArgs": 1
|
|
107
|
+
},
|
|
108
|
+
"search": {
|
|
109
|
+
"minArgs": 1,
|
|
110
|
+
"maxArgs": 1
|
|
111
|
+
},
|
|
112
|
+
"update": {
|
|
113
|
+
"minArgs": 2,
|
|
114
|
+
"maxArgs": 2
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"browserAction": {
|
|
118
|
+
"disable": {
|
|
119
|
+
"minArgs": 0,
|
|
120
|
+
"maxArgs": 1,
|
|
121
|
+
"fallbackToNoCallback": true
|
|
122
|
+
},
|
|
123
|
+
"enable": {
|
|
124
|
+
"minArgs": 0,
|
|
125
|
+
"maxArgs": 1,
|
|
126
|
+
"fallbackToNoCallback": true
|
|
127
|
+
},
|
|
128
|
+
"getBadgeBackgroundColor": {
|
|
129
|
+
"minArgs": 1,
|
|
130
|
+
"maxArgs": 1
|
|
131
|
+
},
|
|
132
|
+
"getBadgeText": {
|
|
133
|
+
"minArgs": 1,
|
|
134
|
+
"maxArgs": 1
|
|
135
|
+
},
|
|
136
|
+
"getPopup": {
|
|
137
|
+
"minArgs": 1,
|
|
138
|
+
"maxArgs": 1
|
|
139
|
+
},
|
|
140
|
+
"getTitle": {
|
|
141
|
+
"minArgs": 1,
|
|
142
|
+
"maxArgs": 1
|
|
143
|
+
},
|
|
144
|
+
"openPopup": {
|
|
145
|
+
"minArgs": 0,
|
|
146
|
+
"maxArgs": 0
|
|
147
|
+
},
|
|
148
|
+
"setBadgeBackgroundColor": {
|
|
149
|
+
"minArgs": 1,
|
|
150
|
+
"maxArgs": 1,
|
|
151
|
+
"fallbackToNoCallback": true
|
|
152
|
+
},
|
|
153
|
+
"setBadgeText": {
|
|
154
|
+
"minArgs": 1,
|
|
155
|
+
"maxArgs": 1,
|
|
156
|
+
"fallbackToNoCallback": true
|
|
157
|
+
},
|
|
158
|
+
"setIcon": {
|
|
159
|
+
"minArgs": 1,
|
|
160
|
+
"maxArgs": 1
|
|
161
|
+
},
|
|
162
|
+
"setPopup": {
|
|
163
|
+
"minArgs": 1,
|
|
164
|
+
"maxArgs": 1,
|
|
165
|
+
"fallbackToNoCallback": true
|
|
166
|
+
},
|
|
167
|
+
"setTitle": {
|
|
168
|
+
"minArgs": 1,
|
|
169
|
+
"maxArgs": 1,
|
|
170
|
+
"fallbackToNoCallback": true
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
"browsingData": {
|
|
174
|
+
"remove": {
|
|
175
|
+
"minArgs": 2,
|
|
176
|
+
"maxArgs": 2
|
|
177
|
+
},
|
|
178
|
+
"removeCache": {
|
|
179
|
+
"minArgs": 1,
|
|
180
|
+
"maxArgs": 1
|
|
181
|
+
},
|
|
182
|
+
"removeCookies": {
|
|
183
|
+
"minArgs": 1,
|
|
184
|
+
"maxArgs": 1
|
|
185
|
+
},
|
|
186
|
+
"removeDownloads": {
|
|
187
|
+
"minArgs": 1,
|
|
188
|
+
"maxArgs": 1
|
|
189
|
+
},
|
|
190
|
+
"removeFormData": {
|
|
191
|
+
"minArgs": 1,
|
|
192
|
+
"maxArgs": 1
|
|
193
|
+
},
|
|
194
|
+
"removeHistory": {
|
|
195
|
+
"minArgs": 1,
|
|
196
|
+
"maxArgs": 1
|
|
197
|
+
},
|
|
198
|
+
"removeLocalStorage": {
|
|
199
|
+
"minArgs": 1,
|
|
200
|
+
"maxArgs": 1
|
|
201
|
+
},
|
|
202
|
+
"removePasswords": {
|
|
203
|
+
"minArgs": 1,
|
|
204
|
+
"maxArgs": 1
|
|
205
|
+
},
|
|
206
|
+
"removePluginData": {
|
|
207
|
+
"minArgs": 1,
|
|
208
|
+
"maxArgs": 1
|
|
209
|
+
},
|
|
210
|
+
"settings": {
|
|
211
|
+
"minArgs": 0,
|
|
212
|
+
"maxArgs": 0
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
"commands": {
|
|
216
|
+
"getAll": {
|
|
217
|
+
"minArgs": 0,
|
|
218
|
+
"maxArgs": 0
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
"contextMenus": {
|
|
222
|
+
"remove": {
|
|
223
|
+
"minArgs": 1,
|
|
224
|
+
"maxArgs": 1
|
|
225
|
+
},
|
|
226
|
+
"removeAll": {
|
|
227
|
+
"minArgs": 0,
|
|
228
|
+
"maxArgs": 0
|
|
229
|
+
},
|
|
230
|
+
"update": {
|
|
231
|
+
"minArgs": 2,
|
|
232
|
+
"maxArgs": 2
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
"cookies": {
|
|
236
|
+
"get": {
|
|
237
|
+
"minArgs": 1,
|
|
238
|
+
"maxArgs": 1
|
|
239
|
+
},
|
|
240
|
+
"getAll": {
|
|
241
|
+
"minArgs": 1,
|
|
242
|
+
"maxArgs": 1
|
|
243
|
+
},
|
|
244
|
+
"getAllCookieStores": {
|
|
245
|
+
"minArgs": 0,
|
|
246
|
+
"maxArgs": 0
|
|
247
|
+
},
|
|
248
|
+
"remove": {
|
|
249
|
+
"minArgs": 1,
|
|
250
|
+
"maxArgs": 1
|
|
251
|
+
},
|
|
252
|
+
"set": {
|
|
253
|
+
"minArgs": 1,
|
|
254
|
+
"maxArgs": 1
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
"devtools": {
|
|
258
|
+
"inspectedWindow": {
|
|
259
|
+
"eval": {
|
|
260
|
+
"minArgs": 1,
|
|
261
|
+
"maxArgs": 2,
|
|
262
|
+
"singleCallbackArg": false
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
"panels": {
|
|
266
|
+
"create": {
|
|
267
|
+
"minArgs": 3,
|
|
268
|
+
"maxArgs": 3,
|
|
269
|
+
"singleCallbackArg": true
|
|
270
|
+
},
|
|
271
|
+
"elements": {
|
|
272
|
+
"createSidebarPane": {
|
|
273
|
+
"minArgs": 1,
|
|
274
|
+
"maxArgs": 1
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
"downloads": {
|
|
280
|
+
"cancel": {
|
|
281
|
+
"minArgs": 1,
|
|
282
|
+
"maxArgs": 1
|
|
283
|
+
},
|
|
284
|
+
"download": {
|
|
285
|
+
"minArgs": 1,
|
|
286
|
+
"maxArgs": 1
|
|
287
|
+
},
|
|
288
|
+
"erase": {
|
|
289
|
+
"minArgs": 1,
|
|
290
|
+
"maxArgs": 1
|
|
291
|
+
},
|
|
292
|
+
"getFileIcon": {
|
|
293
|
+
"minArgs": 1,
|
|
294
|
+
"maxArgs": 2
|
|
295
|
+
},
|
|
296
|
+
"open": {
|
|
297
|
+
"minArgs": 1,
|
|
298
|
+
"maxArgs": 1,
|
|
299
|
+
"fallbackToNoCallback": true
|
|
300
|
+
},
|
|
301
|
+
"pause": {
|
|
302
|
+
"minArgs": 1,
|
|
303
|
+
"maxArgs": 1
|
|
304
|
+
},
|
|
305
|
+
"removeFile": {
|
|
306
|
+
"minArgs": 1,
|
|
307
|
+
"maxArgs": 1
|
|
308
|
+
},
|
|
309
|
+
"resume": {
|
|
310
|
+
"minArgs": 1,
|
|
311
|
+
"maxArgs": 1
|
|
312
|
+
},
|
|
313
|
+
"search": {
|
|
314
|
+
"minArgs": 1,
|
|
315
|
+
"maxArgs": 1
|
|
316
|
+
},
|
|
317
|
+
"show": {
|
|
318
|
+
"minArgs": 1,
|
|
319
|
+
"maxArgs": 1,
|
|
320
|
+
"fallbackToNoCallback": true
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"extension": {
|
|
324
|
+
"isAllowedFileSchemeAccess": {
|
|
325
|
+
"minArgs": 0,
|
|
326
|
+
"maxArgs": 0
|
|
327
|
+
},
|
|
328
|
+
"isAllowedIncognitoAccess": {
|
|
329
|
+
"minArgs": 0,
|
|
330
|
+
"maxArgs": 0
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
"history": {
|
|
334
|
+
"addUrl": {
|
|
335
|
+
"minArgs": 1,
|
|
336
|
+
"maxArgs": 1
|
|
337
|
+
},
|
|
338
|
+
"deleteAll": {
|
|
339
|
+
"minArgs": 0,
|
|
340
|
+
"maxArgs": 0
|
|
341
|
+
},
|
|
342
|
+
"deleteRange": {
|
|
343
|
+
"minArgs": 1,
|
|
344
|
+
"maxArgs": 1
|
|
345
|
+
},
|
|
346
|
+
"deleteUrl": {
|
|
347
|
+
"minArgs": 1,
|
|
348
|
+
"maxArgs": 1
|
|
349
|
+
},
|
|
350
|
+
"getVisits": {
|
|
351
|
+
"minArgs": 1,
|
|
352
|
+
"maxArgs": 1
|
|
353
|
+
},
|
|
354
|
+
"search": {
|
|
355
|
+
"minArgs": 1,
|
|
356
|
+
"maxArgs": 1
|
|
357
|
+
}
|
|
358
|
+
},
|
|
359
|
+
"i18n": {
|
|
360
|
+
"detectLanguage": {
|
|
361
|
+
"minArgs": 1,
|
|
362
|
+
"maxArgs": 1
|
|
363
|
+
},
|
|
364
|
+
"getAcceptLanguages": {
|
|
365
|
+
"minArgs": 0,
|
|
366
|
+
"maxArgs": 0
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
"identity": {
|
|
370
|
+
"launchWebAuthFlow": {
|
|
371
|
+
"minArgs": 1,
|
|
372
|
+
"maxArgs": 1
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
"idle": {
|
|
376
|
+
"queryState": {
|
|
377
|
+
"minArgs": 1,
|
|
378
|
+
"maxArgs": 1
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
"management": {
|
|
382
|
+
"get": {
|
|
383
|
+
"minArgs": 1,
|
|
384
|
+
"maxArgs": 1
|
|
385
|
+
},
|
|
386
|
+
"getAll": {
|
|
387
|
+
"minArgs": 0,
|
|
388
|
+
"maxArgs": 0
|
|
389
|
+
},
|
|
390
|
+
"getSelf": {
|
|
391
|
+
"minArgs": 0,
|
|
392
|
+
"maxArgs": 0
|
|
393
|
+
},
|
|
394
|
+
"setEnabled": {
|
|
395
|
+
"minArgs": 2,
|
|
396
|
+
"maxArgs": 2
|
|
397
|
+
},
|
|
398
|
+
"uninstallSelf": {
|
|
399
|
+
"minArgs": 0,
|
|
400
|
+
"maxArgs": 1
|
|
401
|
+
}
|
|
402
|
+
},
|
|
403
|
+
"notifications": {
|
|
404
|
+
"clear": {
|
|
405
|
+
"minArgs": 1,
|
|
406
|
+
"maxArgs": 1
|
|
407
|
+
},
|
|
408
|
+
"create": {
|
|
409
|
+
"minArgs": 1,
|
|
410
|
+
"maxArgs": 2
|
|
411
|
+
},
|
|
412
|
+
"getAll": {
|
|
413
|
+
"minArgs": 0,
|
|
414
|
+
"maxArgs": 0
|
|
415
|
+
},
|
|
416
|
+
"getPermissionLevel": {
|
|
417
|
+
"minArgs": 0,
|
|
418
|
+
"maxArgs": 0
|
|
419
|
+
},
|
|
420
|
+
"update": {
|
|
421
|
+
"minArgs": 2,
|
|
422
|
+
"maxArgs": 2
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
"pageAction": {
|
|
426
|
+
"getPopup": {
|
|
427
|
+
"minArgs": 1,
|
|
428
|
+
"maxArgs": 1
|
|
429
|
+
},
|
|
430
|
+
"getTitle": {
|
|
431
|
+
"minArgs": 1,
|
|
432
|
+
"maxArgs": 1
|
|
433
|
+
},
|
|
434
|
+
"hide": {
|
|
435
|
+
"minArgs": 1,
|
|
436
|
+
"maxArgs": 1,
|
|
437
|
+
"fallbackToNoCallback": true
|
|
438
|
+
},
|
|
439
|
+
"setIcon": {
|
|
440
|
+
"minArgs": 1,
|
|
441
|
+
"maxArgs": 1
|
|
442
|
+
},
|
|
443
|
+
"setPopup": {
|
|
444
|
+
"minArgs": 1,
|
|
445
|
+
"maxArgs": 1,
|
|
446
|
+
"fallbackToNoCallback": true
|
|
447
|
+
},
|
|
448
|
+
"setTitle": {
|
|
449
|
+
"minArgs": 1,
|
|
450
|
+
"maxArgs": 1,
|
|
451
|
+
"fallbackToNoCallback": true
|
|
452
|
+
},
|
|
453
|
+
"show": {
|
|
454
|
+
"minArgs": 1,
|
|
455
|
+
"maxArgs": 1,
|
|
456
|
+
"fallbackToNoCallback": true
|
|
457
|
+
}
|
|
458
|
+
},
|
|
459
|
+
"permissions": {
|
|
460
|
+
"contains": {
|
|
461
|
+
"minArgs": 1,
|
|
462
|
+
"maxArgs": 1
|
|
463
|
+
},
|
|
464
|
+
"getAll": {
|
|
465
|
+
"minArgs": 0,
|
|
466
|
+
"maxArgs": 0
|
|
467
|
+
},
|
|
468
|
+
"remove": {
|
|
469
|
+
"minArgs": 1,
|
|
470
|
+
"maxArgs": 1
|
|
471
|
+
},
|
|
472
|
+
"request": {
|
|
473
|
+
"minArgs": 1,
|
|
474
|
+
"maxArgs": 1
|
|
475
|
+
}
|
|
476
|
+
},
|
|
477
|
+
"runtime": {
|
|
478
|
+
"getBackgroundPage": {
|
|
479
|
+
"minArgs": 0,
|
|
480
|
+
"maxArgs": 0
|
|
481
|
+
},
|
|
482
|
+
"getPlatformInfo": {
|
|
483
|
+
"minArgs": 0,
|
|
484
|
+
"maxArgs": 0
|
|
485
|
+
},
|
|
486
|
+
"openOptionsPage": {
|
|
487
|
+
"minArgs": 0,
|
|
488
|
+
"maxArgs": 0
|
|
489
|
+
},
|
|
490
|
+
"requestUpdateCheck": {
|
|
491
|
+
"minArgs": 0,
|
|
492
|
+
"maxArgs": 0
|
|
493
|
+
},
|
|
494
|
+
"sendMessage": {
|
|
495
|
+
"minArgs": 1,
|
|
496
|
+
"maxArgs": 3
|
|
497
|
+
},
|
|
498
|
+
"sendNativeMessage": {
|
|
499
|
+
"minArgs": 2,
|
|
500
|
+
"maxArgs": 2
|
|
501
|
+
},
|
|
502
|
+
"setUninstallURL": {
|
|
503
|
+
"minArgs": 1,
|
|
504
|
+
"maxArgs": 1
|
|
505
|
+
}
|
|
506
|
+
},
|
|
507
|
+
"sessions": {
|
|
508
|
+
"getDevices": {
|
|
509
|
+
"minArgs": 0,
|
|
510
|
+
"maxArgs": 1
|
|
511
|
+
},
|
|
512
|
+
"getRecentlyClosed": {
|
|
513
|
+
"minArgs": 0,
|
|
514
|
+
"maxArgs": 1
|
|
515
|
+
},
|
|
516
|
+
"restore": {
|
|
517
|
+
"minArgs": 0,
|
|
518
|
+
"maxArgs": 1
|
|
519
|
+
}
|
|
520
|
+
},
|
|
521
|
+
"storage": {
|
|
522
|
+
"local": {
|
|
523
|
+
"clear": {
|
|
524
|
+
"minArgs": 0,
|
|
525
|
+
"maxArgs": 0
|
|
526
|
+
},
|
|
527
|
+
"get": {
|
|
528
|
+
"minArgs": 0,
|
|
529
|
+
"maxArgs": 1
|
|
530
|
+
},
|
|
531
|
+
"getBytesInUse": {
|
|
532
|
+
"minArgs": 0,
|
|
533
|
+
"maxArgs": 1
|
|
534
|
+
},
|
|
535
|
+
"remove": {
|
|
536
|
+
"minArgs": 1,
|
|
537
|
+
"maxArgs": 1
|
|
538
|
+
},
|
|
539
|
+
"set": {
|
|
540
|
+
"minArgs": 1,
|
|
541
|
+
"maxArgs": 1
|
|
542
|
+
}
|
|
543
|
+
},
|
|
544
|
+
"managed": {
|
|
545
|
+
"get": {
|
|
546
|
+
"minArgs": 0,
|
|
547
|
+
"maxArgs": 1
|
|
548
|
+
},
|
|
549
|
+
"getBytesInUse": {
|
|
550
|
+
"minArgs": 0,
|
|
551
|
+
"maxArgs": 1
|
|
552
|
+
}
|
|
553
|
+
},
|
|
554
|
+
"sync": {
|
|
555
|
+
"clear": {
|
|
556
|
+
"minArgs": 0,
|
|
557
|
+
"maxArgs": 0
|
|
558
|
+
},
|
|
559
|
+
"get": {
|
|
560
|
+
"minArgs": 0,
|
|
561
|
+
"maxArgs": 1
|
|
562
|
+
},
|
|
563
|
+
"getBytesInUse": {
|
|
564
|
+
"minArgs": 0,
|
|
565
|
+
"maxArgs": 1
|
|
566
|
+
},
|
|
567
|
+
"remove": {
|
|
568
|
+
"minArgs": 1,
|
|
569
|
+
"maxArgs": 1
|
|
570
|
+
},
|
|
571
|
+
"set": {
|
|
572
|
+
"minArgs": 1,
|
|
573
|
+
"maxArgs": 1
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
},
|
|
577
|
+
"tabs": {
|
|
578
|
+
"captureVisibleTab": {
|
|
579
|
+
"minArgs": 0,
|
|
580
|
+
"maxArgs": 2
|
|
581
|
+
},
|
|
582
|
+
"create": {
|
|
583
|
+
"minArgs": 1,
|
|
584
|
+
"maxArgs": 1
|
|
585
|
+
},
|
|
586
|
+
"detectLanguage": {
|
|
587
|
+
"minArgs": 0,
|
|
588
|
+
"maxArgs": 1
|
|
589
|
+
},
|
|
590
|
+
"discard": {
|
|
591
|
+
"minArgs": 0,
|
|
592
|
+
"maxArgs": 1
|
|
593
|
+
},
|
|
594
|
+
"duplicate": {
|
|
595
|
+
"minArgs": 1,
|
|
596
|
+
"maxArgs": 1
|
|
597
|
+
},
|
|
598
|
+
"executeScript": {
|
|
599
|
+
"minArgs": 1,
|
|
600
|
+
"maxArgs": 2
|
|
601
|
+
},
|
|
602
|
+
"get": {
|
|
603
|
+
"minArgs": 1,
|
|
604
|
+
"maxArgs": 1
|
|
605
|
+
},
|
|
606
|
+
"getCurrent": {
|
|
607
|
+
"minArgs": 0,
|
|
608
|
+
"maxArgs": 0
|
|
609
|
+
},
|
|
610
|
+
"getZoom": {
|
|
611
|
+
"minArgs": 0,
|
|
612
|
+
"maxArgs": 1
|
|
613
|
+
},
|
|
614
|
+
"getZoomSettings": {
|
|
615
|
+
"minArgs": 0,
|
|
616
|
+
"maxArgs": 1
|
|
617
|
+
},
|
|
618
|
+
"goBack": {
|
|
619
|
+
"minArgs": 0,
|
|
620
|
+
"maxArgs": 1
|
|
621
|
+
},
|
|
622
|
+
"goForward": {
|
|
623
|
+
"minArgs": 0,
|
|
624
|
+
"maxArgs": 1
|
|
625
|
+
},
|
|
626
|
+
"highlight": {
|
|
627
|
+
"minArgs": 1,
|
|
628
|
+
"maxArgs": 1
|
|
629
|
+
},
|
|
630
|
+
"insertCSS": {
|
|
631
|
+
"minArgs": 1,
|
|
632
|
+
"maxArgs": 2
|
|
633
|
+
},
|
|
634
|
+
"move": {
|
|
635
|
+
"minArgs": 2,
|
|
636
|
+
"maxArgs": 2
|
|
637
|
+
},
|
|
638
|
+
"query": {
|
|
639
|
+
"minArgs": 1,
|
|
640
|
+
"maxArgs": 1
|
|
641
|
+
},
|
|
642
|
+
"reload": {
|
|
643
|
+
"minArgs": 0,
|
|
644
|
+
"maxArgs": 2
|
|
645
|
+
},
|
|
646
|
+
"remove": {
|
|
647
|
+
"minArgs": 1,
|
|
648
|
+
"maxArgs": 1
|
|
649
|
+
},
|
|
650
|
+
"removeCSS": {
|
|
651
|
+
"minArgs": 1,
|
|
652
|
+
"maxArgs": 2
|
|
653
|
+
},
|
|
654
|
+
"sendMessage": {
|
|
655
|
+
"minArgs": 2,
|
|
656
|
+
"maxArgs": 3
|
|
657
|
+
},
|
|
658
|
+
"setZoom": {
|
|
659
|
+
"minArgs": 1,
|
|
660
|
+
"maxArgs": 2
|
|
661
|
+
},
|
|
662
|
+
"setZoomSettings": {
|
|
663
|
+
"minArgs": 1,
|
|
664
|
+
"maxArgs": 2
|
|
665
|
+
},
|
|
666
|
+
"update": {
|
|
667
|
+
"minArgs": 1,
|
|
668
|
+
"maxArgs": 2
|
|
669
|
+
}
|
|
670
|
+
},
|
|
671
|
+
"topSites": {
|
|
672
|
+
"get": {
|
|
673
|
+
"minArgs": 0,
|
|
674
|
+
"maxArgs": 0
|
|
675
|
+
}
|
|
676
|
+
},
|
|
677
|
+
"webNavigation": {
|
|
678
|
+
"getAllFrames": {
|
|
679
|
+
"minArgs": 1,
|
|
680
|
+
"maxArgs": 1
|
|
681
|
+
},
|
|
682
|
+
"getFrame": {
|
|
683
|
+
"minArgs": 1,
|
|
684
|
+
"maxArgs": 1
|
|
685
|
+
}
|
|
686
|
+
},
|
|
687
|
+
"webRequest": {
|
|
688
|
+
"handlerBehaviorChanged": {
|
|
689
|
+
"minArgs": 0,
|
|
690
|
+
"maxArgs": 0
|
|
691
|
+
}
|
|
692
|
+
},
|
|
693
|
+
"windows": {
|
|
694
|
+
"create": {
|
|
695
|
+
"minArgs": 0,
|
|
696
|
+
"maxArgs": 1
|
|
697
|
+
},
|
|
698
|
+
"get": {
|
|
699
|
+
"minArgs": 1,
|
|
700
|
+
"maxArgs": 2
|
|
701
|
+
},
|
|
702
|
+
"getAll": {
|
|
703
|
+
"minArgs": 0,
|
|
704
|
+
"maxArgs": 1
|
|
705
|
+
},
|
|
706
|
+
"getCurrent": {
|
|
707
|
+
"minArgs": 0,
|
|
708
|
+
"maxArgs": 1
|
|
709
|
+
},
|
|
710
|
+
"getLastFocused": {
|
|
711
|
+
"minArgs": 0,
|
|
712
|
+
"maxArgs": 1
|
|
713
|
+
},
|
|
714
|
+
"remove": {
|
|
715
|
+
"minArgs": 1,
|
|
716
|
+
"maxArgs": 1
|
|
717
|
+
},
|
|
718
|
+
"update": {
|
|
719
|
+
"minArgs": 2,
|
|
720
|
+
"maxArgs": 2
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
};
|
|
724
|
+
if (Object.keys(apiMetadata).length === 0) {
|
|
725
|
+
throw new Error("api-metadata.json has not been included in browser-polyfill");
|
|
726
|
+
}
|
|
727
|
+
class DefaultWeakMap extends WeakMap {
|
|
728
|
+
constructor(createItem, items = void 0) {
|
|
729
|
+
super(items);
|
|
730
|
+
this.createItem = createItem;
|
|
731
|
+
}
|
|
732
|
+
get(key) {
|
|
733
|
+
if (!this.has(key)) {
|
|
734
|
+
this.set(key, this.createItem(key));
|
|
735
|
+
}
|
|
736
|
+
return super.get(key);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
const isThenable = (value) => {
|
|
740
|
+
return value && typeof value === "object" && typeof value.then === "function";
|
|
741
|
+
};
|
|
742
|
+
const makeCallback = (promise, metadata) => {
|
|
743
|
+
return (...callbackArgs) => {
|
|
744
|
+
if (extensionAPIs.runtime.lastError) {
|
|
745
|
+
promise.reject(new Error(extensionAPIs.runtime.lastError.message));
|
|
746
|
+
} else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
|
|
747
|
+
promise.resolve(callbackArgs[0]);
|
|
748
|
+
} else {
|
|
749
|
+
promise.resolve(callbackArgs);
|
|
750
|
+
}
|
|
751
|
+
};
|
|
752
|
+
};
|
|
753
|
+
const pluralizeArguments = (numArgs) => numArgs == 1 ? "argument" : "arguments";
|
|
754
|
+
const wrapAsyncFunction = (name, metadata) => {
|
|
755
|
+
return function asyncFunctionWrapper(target, ...args) {
|
|
756
|
+
if (args.length < metadata.minArgs) {
|
|
757
|
+
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
|
758
|
+
}
|
|
759
|
+
if (args.length > metadata.maxArgs) {
|
|
760
|
+
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
|
761
|
+
}
|
|
762
|
+
return new Promise((resolve, reject) => {
|
|
763
|
+
if (metadata.fallbackToNoCallback) {
|
|
764
|
+
try {
|
|
765
|
+
target[name](...args, makeCallback({
|
|
766
|
+
resolve,
|
|
767
|
+
reject
|
|
768
|
+
}, metadata));
|
|
769
|
+
} catch (cbError) {
|
|
770
|
+
console.warn(`${name} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `, cbError);
|
|
771
|
+
target[name](...args);
|
|
772
|
+
metadata.fallbackToNoCallback = false;
|
|
773
|
+
metadata.noCallback = true;
|
|
774
|
+
resolve();
|
|
775
|
+
}
|
|
776
|
+
} else if (metadata.noCallback) {
|
|
777
|
+
target[name](...args);
|
|
778
|
+
resolve();
|
|
779
|
+
} else {
|
|
780
|
+
target[name](...args, makeCallback({
|
|
781
|
+
resolve,
|
|
782
|
+
reject
|
|
783
|
+
}, metadata));
|
|
784
|
+
}
|
|
785
|
+
});
|
|
786
|
+
};
|
|
787
|
+
};
|
|
788
|
+
const wrapMethod = (target, method, wrapper) => {
|
|
789
|
+
return new Proxy(method, {
|
|
790
|
+
apply(targetMethod, thisObj, args) {
|
|
791
|
+
return wrapper.call(thisObj, target, ...args);
|
|
792
|
+
}
|
|
793
|
+
});
|
|
794
|
+
};
|
|
795
|
+
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
|
|
796
|
+
const wrapObject = (target, wrappers = {}, metadata = {}) => {
|
|
797
|
+
let cache = /* @__PURE__ */ Object.create(null);
|
|
798
|
+
let handlers = {
|
|
799
|
+
has(proxyTarget2, prop) {
|
|
800
|
+
return prop in target || prop in cache;
|
|
801
|
+
},
|
|
802
|
+
get(proxyTarget2, prop, receiver) {
|
|
803
|
+
if (prop in cache) {
|
|
804
|
+
return cache[prop];
|
|
805
|
+
}
|
|
806
|
+
if (!(prop in target)) {
|
|
807
|
+
return void 0;
|
|
808
|
+
}
|
|
809
|
+
let value = target[prop];
|
|
810
|
+
if (typeof value === "function") {
|
|
811
|
+
if (typeof wrappers[prop] === "function") {
|
|
812
|
+
value = wrapMethod(target, target[prop], wrappers[prop]);
|
|
813
|
+
} else if (hasOwnProperty(metadata, prop)) {
|
|
814
|
+
let wrapper = wrapAsyncFunction(prop, metadata[prop]);
|
|
815
|
+
value = wrapMethod(target, target[prop], wrapper);
|
|
816
|
+
} else {
|
|
817
|
+
value = value.bind(target);
|
|
818
|
+
}
|
|
819
|
+
} else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {
|
|
820
|
+
value = wrapObject(value, wrappers[prop], metadata[prop]);
|
|
821
|
+
} else if (hasOwnProperty(metadata, "*")) {
|
|
822
|
+
value = wrapObject(value, wrappers[prop], metadata["*"]);
|
|
823
|
+
} else {
|
|
824
|
+
Object.defineProperty(cache, prop, {
|
|
825
|
+
configurable: true,
|
|
826
|
+
enumerable: true,
|
|
827
|
+
get() {
|
|
828
|
+
return target[prop];
|
|
829
|
+
},
|
|
830
|
+
set(value2) {
|
|
831
|
+
target[prop] = value2;
|
|
832
|
+
}
|
|
833
|
+
});
|
|
834
|
+
return value;
|
|
835
|
+
}
|
|
836
|
+
cache[prop] = value;
|
|
837
|
+
return value;
|
|
838
|
+
},
|
|
839
|
+
set(proxyTarget2, prop, value, receiver) {
|
|
840
|
+
if (prop in cache) {
|
|
841
|
+
cache[prop] = value;
|
|
842
|
+
} else {
|
|
843
|
+
target[prop] = value;
|
|
844
|
+
}
|
|
845
|
+
return true;
|
|
846
|
+
},
|
|
847
|
+
defineProperty(proxyTarget2, prop, desc) {
|
|
848
|
+
return Reflect.defineProperty(cache, prop, desc);
|
|
849
|
+
},
|
|
850
|
+
deleteProperty(proxyTarget2, prop) {
|
|
851
|
+
return Reflect.deleteProperty(cache, prop);
|
|
852
|
+
}
|
|
853
|
+
};
|
|
854
|
+
let proxyTarget = Object.create(target);
|
|
855
|
+
return new Proxy(proxyTarget, handlers);
|
|
856
|
+
};
|
|
857
|
+
const wrapEvent = (wrapperMap) => ({
|
|
858
|
+
addListener(target, listener, ...args) {
|
|
859
|
+
target.addListener(wrapperMap.get(listener), ...args);
|
|
860
|
+
},
|
|
861
|
+
hasListener(target, listener) {
|
|
862
|
+
return target.hasListener(wrapperMap.get(listener));
|
|
863
|
+
},
|
|
864
|
+
removeListener(target, listener) {
|
|
865
|
+
target.removeListener(wrapperMap.get(listener));
|
|
866
|
+
}
|
|
867
|
+
});
|
|
868
|
+
const onRequestFinishedWrappers = new DefaultWeakMap((listener) => {
|
|
869
|
+
if (typeof listener !== "function") {
|
|
870
|
+
return listener;
|
|
871
|
+
}
|
|
872
|
+
return function onRequestFinished(req) {
|
|
873
|
+
const wrappedReq = wrapObject(req, {}, {
|
|
874
|
+
getContent: {
|
|
875
|
+
minArgs: 0,
|
|
876
|
+
maxArgs: 0
|
|
877
|
+
}
|
|
878
|
+
});
|
|
879
|
+
listener(wrappedReq);
|
|
880
|
+
};
|
|
881
|
+
});
|
|
882
|
+
const onMessageWrappers = new DefaultWeakMap((listener) => {
|
|
883
|
+
if (typeof listener !== "function") {
|
|
884
|
+
return listener;
|
|
885
|
+
}
|
|
886
|
+
return function onMessage(message, sender, sendResponse) {
|
|
887
|
+
let didCallSendResponse = false;
|
|
888
|
+
let wrappedSendResponse;
|
|
889
|
+
let sendResponsePromise = new Promise((resolve) => {
|
|
890
|
+
wrappedSendResponse = function(response) {
|
|
891
|
+
didCallSendResponse = true;
|
|
892
|
+
resolve(response);
|
|
893
|
+
};
|
|
894
|
+
});
|
|
895
|
+
let result;
|
|
896
|
+
try {
|
|
897
|
+
result = listener(message, sender, wrappedSendResponse);
|
|
898
|
+
} catch (err) {
|
|
899
|
+
result = Promise.reject(err);
|
|
900
|
+
}
|
|
901
|
+
const isResultThenable = result !== true && isThenable(result);
|
|
902
|
+
if (result !== true && !isResultThenable && !didCallSendResponse) {
|
|
903
|
+
return false;
|
|
904
|
+
}
|
|
905
|
+
const sendPromisedResult = (promise) => {
|
|
906
|
+
promise.then((msg) => {
|
|
907
|
+
sendResponse(msg);
|
|
908
|
+
}, (error) => {
|
|
909
|
+
let message2;
|
|
910
|
+
if (error && (error instanceof Error || typeof error.message === "string")) {
|
|
911
|
+
message2 = error.message;
|
|
912
|
+
} else {
|
|
913
|
+
message2 = "An unexpected error occurred";
|
|
914
|
+
}
|
|
915
|
+
sendResponse({
|
|
916
|
+
__mozWebExtensionPolyfillReject__: true,
|
|
917
|
+
message: message2
|
|
918
|
+
});
|
|
919
|
+
}).catch((err) => {
|
|
920
|
+
console.error("Failed to send onMessage rejected reply", err);
|
|
921
|
+
});
|
|
922
|
+
};
|
|
923
|
+
if (isResultThenable) {
|
|
924
|
+
sendPromisedResult(result);
|
|
925
|
+
} else {
|
|
926
|
+
sendPromisedResult(sendResponsePromise);
|
|
927
|
+
}
|
|
928
|
+
return true;
|
|
929
|
+
};
|
|
930
|
+
});
|
|
931
|
+
const wrappedSendMessageCallback = ({
|
|
932
|
+
reject,
|
|
933
|
+
resolve
|
|
934
|
+
}, reply) => {
|
|
935
|
+
if (extensionAPIs.runtime.lastError) {
|
|
936
|
+
if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
|
|
937
|
+
resolve();
|
|
938
|
+
} else {
|
|
939
|
+
reject(new Error(extensionAPIs.runtime.lastError.message));
|
|
940
|
+
}
|
|
941
|
+
} else if (reply && reply.__mozWebExtensionPolyfillReject__) {
|
|
942
|
+
reject(new Error(reply.message));
|
|
943
|
+
} else {
|
|
944
|
+
resolve(reply);
|
|
945
|
+
}
|
|
946
|
+
};
|
|
947
|
+
const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
|
|
948
|
+
if (args.length < metadata.minArgs) {
|
|
949
|
+
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
|
950
|
+
}
|
|
951
|
+
if (args.length > metadata.maxArgs) {
|
|
952
|
+
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
|
953
|
+
}
|
|
954
|
+
return new Promise((resolve, reject) => {
|
|
955
|
+
const wrappedCb = wrappedSendMessageCallback.bind(null, {
|
|
956
|
+
resolve,
|
|
957
|
+
reject
|
|
958
|
+
});
|
|
959
|
+
args.push(wrappedCb);
|
|
960
|
+
apiNamespaceObj.sendMessage(...args);
|
|
961
|
+
});
|
|
962
|
+
};
|
|
963
|
+
const staticWrappers = {
|
|
964
|
+
devtools: {
|
|
965
|
+
network: {
|
|
966
|
+
onRequestFinished: wrapEvent(onRequestFinishedWrappers)
|
|
967
|
+
}
|
|
968
|
+
},
|
|
969
|
+
runtime: {
|
|
970
|
+
onMessage: wrapEvent(onMessageWrappers),
|
|
971
|
+
onMessageExternal: wrapEvent(onMessageWrappers),
|
|
972
|
+
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
|
|
973
|
+
minArgs: 1,
|
|
974
|
+
maxArgs: 3
|
|
975
|
+
})
|
|
976
|
+
},
|
|
977
|
+
tabs: {
|
|
978
|
+
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
|
|
979
|
+
minArgs: 2,
|
|
980
|
+
maxArgs: 3
|
|
981
|
+
})
|
|
982
|
+
}
|
|
983
|
+
};
|
|
984
|
+
const settingMetadata = {
|
|
985
|
+
clear: {
|
|
986
|
+
minArgs: 1,
|
|
987
|
+
maxArgs: 1
|
|
988
|
+
},
|
|
989
|
+
get: {
|
|
990
|
+
minArgs: 1,
|
|
991
|
+
maxArgs: 1
|
|
992
|
+
},
|
|
993
|
+
set: {
|
|
994
|
+
minArgs: 1,
|
|
995
|
+
maxArgs: 1
|
|
996
|
+
}
|
|
997
|
+
};
|
|
998
|
+
apiMetadata.privacy = {
|
|
999
|
+
network: {
|
|
1000
|
+
"*": settingMetadata
|
|
1001
|
+
},
|
|
1002
|
+
services: {
|
|
1003
|
+
"*": settingMetadata
|
|
1004
|
+
},
|
|
1005
|
+
websites: {
|
|
1006
|
+
"*": settingMetadata
|
|
1007
|
+
}
|
|
1008
|
+
};
|
|
1009
|
+
return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
|
|
1010
|
+
};
|
|
1011
|
+
module2.exports = wrapAPIs(chrome);
|
|
1012
|
+
} else {
|
|
1013
|
+
module2.exports = globalThis.browser;
|
|
1014
|
+
}
|
|
1015
|
+
});
|
|
1016
|
+
}
|
|
1017
|
+
});
|
|
1018
|
+
|
|
1019
|
+
// src/content-script.ts
|
|
1020
|
+
var import_webextension_polyfill = __toESM(require_browser_polyfill());
|
|
1021
|
+
|
|
1022
|
+
// src/shared/shortcut.ts
|
|
1023
|
+
var STORAGE_KEY_INSPECT = "hanzo_shortcut_inspect";
|
|
1024
|
+
var DEFAULT_INSPECT_SHORTCUT = {
|
|
1025
|
+
ctrl: true,
|
|
1026
|
+
meta: false,
|
|
1027
|
+
alt: false,
|
|
1028
|
+
shift: false,
|
|
1029
|
+
key: ""
|
|
1030
|
+
};
|
|
1031
|
+
function matchesShortcut(e, s) {
|
|
1032
|
+
if (s.ctrl && !e.ctrlKey) return false;
|
|
1033
|
+
if (s.meta && !e.metaKey) return false;
|
|
1034
|
+
if (s.alt && !e.altKey) return false;
|
|
1035
|
+
if (s.shift && !e.shiftKey) return false;
|
|
1036
|
+
if (!s.ctrl && e.ctrlKey) return false;
|
|
1037
|
+
if (!s.meta && e.metaKey) return false;
|
|
1038
|
+
if (!s.alt && e.altKey) return false;
|
|
1039
|
+
if (!s.shift && e.shiftKey) return false;
|
|
1040
|
+
if (s.key && (e.key || "").toLowerCase() !== s.key.toLowerCase()) return false;
|
|
1041
|
+
return true;
|
|
1042
|
+
}
|
|
1043
|
+
async function loadInspectShortcut(storage) {
|
|
1044
|
+
try {
|
|
1045
|
+
const raw = await storage.get([STORAGE_KEY_INSPECT]);
|
|
1046
|
+
const v = raw[STORAGE_KEY_INSPECT];
|
|
1047
|
+
if (v && typeof v === "object" && typeof v.ctrl === "boolean" && typeof v.alt === "boolean" && typeof v.shift === "boolean" && typeof v.meta === "boolean" && typeof v.key === "string") {
|
|
1048
|
+
return v;
|
|
1049
|
+
}
|
|
1050
|
+
} catch {
|
|
1051
|
+
}
|
|
1052
|
+
return { ...DEFAULT_INSPECT_SHORTCUT };
|
|
1053
|
+
}
|
|
1054
|
+
|
|
3
1055
|
// src/content-script.ts
|
|
4
1056
|
var HanzoContentScript = class {
|
|
5
1057
|
constructor() {
|
|
1058
|
+
// Cache the configured shortcut so every click/mousemove doesn't hit
|
|
1059
|
+
// chrome.storage. Reloaded eagerly on storage change so the popup's
|
|
1060
|
+
// recorder updates take effect immediately (no page reload required).
|
|
1061
|
+
this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
|
|
1062
|
+
this.loadShortcut();
|
|
1063
|
+
this.watchShortcut();
|
|
6
1064
|
this.setupClickHandler();
|
|
7
1065
|
this.injectHelpers();
|
|
8
1066
|
this.setupMessageHandlers();
|
|
9
1067
|
}
|
|
1068
|
+
async loadShortcut() {
|
|
1069
|
+
try {
|
|
1070
|
+
this.inspectShortcut = await loadInspectShortcut(chrome.storage.local);
|
|
1071
|
+
} catch {
|
|
1072
|
+
this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
watchShortcut() {
|
|
1076
|
+
try {
|
|
1077
|
+
chrome.storage.onChanged.addListener((changes, area) => {
|
|
1078
|
+
if (area !== "local") return;
|
|
1079
|
+
const c = changes[STORAGE_KEY_INSPECT];
|
|
1080
|
+
if (!c) return;
|
|
1081
|
+
if (c.newValue && typeof c.newValue === "object") {
|
|
1082
|
+
this.inspectShortcut = c.newValue;
|
|
1083
|
+
} else {
|
|
1084
|
+
this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
|
|
1085
|
+
}
|
|
1086
|
+
});
|
|
1087
|
+
} catch {
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
10
1090
|
setupClickHandler() {
|
|
11
1091
|
document.addEventListener("click", (e) => {
|
|
12
|
-
if (!e.
|
|
1092
|
+
if (!matchesShortcut(e, this.inspectShortcut)) return;
|
|
13
1093
|
e.preventDefault();
|
|
14
1094
|
e.stopPropagation();
|
|
15
1095
|
const element = e.target;
|
|
@@ -27,7 +1107,7 @@
|
|
|
27
1107
|
}
|
|
28
1108
|
setupMessageHandlers() {
|
|
29
1109
|
chrome.runtime.onMessage.addListener((request, _sender, sendResponse) => {
|
|
30
|
-
var
|
|
1110
|
+
var _a2;
|
|
31
1111
|
switch (request.action) {
|
|
32
1112
|
case "ai.control.start":
|
|
33
1113
|
aiOverlay.show(request.task || "AI is controlling this page");
|
|
@@ -50,12 +1130,22 @@
|
|
|
50
1130
|
sendResponse({ success: true });
|
|
51
1131
|
return true;
|
|
52
1132
|
case "page.overlay.toggle":
|
|
1133
|
+
if (request.side === "left" || request.side === "right") pageOverlay.setSide(request.side);
|
|
1134
|
+
if (request.mode === "push" || request.mode === "overlay") pageOverlay.setMode(request.mode);
|
|
1135
|
+
if (request.width === "compact" || request.width === "default" || request.width === "wide") {
|
|
1136
|
+
pageOverlay.setWidth(request.width);
|
|
1137
|
+
}
|
|
53
1138
|
sendResponse({
|
|
54
1139
|
success: true,
|
|
55
1140
|
open: pageOverlay.toggle()
|
|
56
1141
|
});
|
|
57
1142
|
return true;
|
|
58
1143
|
case "page.overlay.show":
|
|
1144
|
+
if (request.side === "left" || request.side === "right") pageOverlay.setSide(request.side);
|
|
1145
|
+
if (request.mode === "push" || request.mode === "overlay") pageOverlay.setMode(request.mode);
|
|
1146
|
+
if (request.width === "compact" || request.width === "default" || request.width === "wide") {
|
|
1147
|
+
pageOverlay.setWidth(request.width);
|
|
1148
|
+
}
|
|
59
1149
|
pageOverlay.show();
|
|
60
1150
|
sendResponse({ success: true, open: true });
|
|
61
1151
|
return true;
|
|
@@ -64,11 +1154,68 @@
|
|
|
64
1154
|
sendResponse({ success: true, open: false });
|
|
65
1155
|
return true;
|
|
66
1156
|
case "page.overlay.status":
|
|
67
|
-
sendResponse({
|
|
1157
|
+
sendResponse({
|
|
1158
|
+
success: true,
|
|
1159
|
+
open: pageOverlay.isOpen(),
|
|
1160
|
+
side: pageOverlay.getSide(),
|
|
1161
|
+
mode: pageOverlay.getMode()
|
|
1162
|
+
});
|
|
1163
|
+
return true;
|
|
1164
|
+
case "page.overlay.setSide":
|
|
1165
|
+
if (request.side === "left" || request.side === "right") {
|
|
1166
|
+
pageOverlay.setSide(request.side);
|
|
1167
|
+
sendResponse({ success: true, side: request.side });
|
|
1168
|
+
} else {
|
|
1169
|
+
sendResponse({ success: false, error: 'side must be "left" or "right"' });
|
|
1170
|
+
}
|
|
1171
|
+
return true;
|
|
1172
|
+
case "page.overlay.setMode":
|
|
1173
|
+
if (request.mode === "push" || request.mode === "overlay") {
|
|
1174
|
+
pageOverlay.setMode(request.mode);
|
|
1175
|
+
sendResponse({ success: true, mode: request.mode });
|
|
1176
|
+
} else {
|
|
1177
|
+
sendResponse({ success: false, error: 'mode must be "push" or "overlay"' });
|
|
1178
|
+
}
|
|
1179
|
+
return true;
|
|
1180
|
+
case "page.overlay.setWidth":
|
|
1181
|
+
if (request.width === "compact" || request.width === "default" || request.width === "wide") {
|
|
1182
|
+
pageOverlay.setWidth(request.width);
|
|
1183
|
+
sendResponse({ success: true, width: request.width });
|
|
1184
|
+
} else {
|
|
1185
|
+
sendResponse({ success: false, error: "width must be compact|default|wide" });
|
|
1186
|
+
}
|
|
1187
|
+
return true;
|
|
1188
|
+
case "page.overlay.setEnabled":
|
|
1189
|
+
if (typeof request.enabled === "boolean") {
|
|
1190
|
+
pageOverlay.setEnabled(request.enabled);
|
|
1191
|
+
sendResponse({ success: true, enabled: request.enabled });
|
|
1192
|
+
} else {
|
|
1193
|
+
sendResponse({ success: false, error: "enabled must be boolean" });
|
|
1194
|
+
}
|
|
1195
|
+
return true;
|
|
1196
|
+
// --- Popup Tool Actions ---
|
|
1197
|
+
case "tool.picker.start":
|
|
1198
|
+
elementPicker.start();
|
|
1199
|
+
sendResponse({ success: true });
|
|
1200
|
+
return true;
|
|
1201
|
+
case "tool.picker.stop":
|
|
1202
|
+
elementPicker.stop();
|
|
1203
|
+
sendResponse({ success: true });
|
|
1204
|
+
return true;
|
|
1205
|
+
case "tool.pageinfo":
|
|
1206
|
+
sendResponse({ success: true, info: gatherPageInfo() });
|
|
1207
|
+
return true;
|
|
1208
|
+
case "tool.console.start":
|
|
1209
|
+
inlineConsole.show();
|
|
1210
|
+
sendResponse({ success: true });
|
|
1211
|
+
return true;
|
|
1212
|
+
case "tool.console.hide":
|
|
1213
|
+
inlineConsole.hide();
|
|
1214
|
+
sendResponse({ success: true });
|
|
68
1215
|
return true;
|
|
69
1216
|
}
|
|
70
1217
|
if (request.action === "getContent") {
|
|
71
|
-
sendResponse({ content: ((
|
|
1218
|
+
sendResponse({ content: ((_a2 = document.documentElement) == null ? void 0 : _a2.outerHTML) || "" });
|
|
72
1219
|
return true;
|
|
73
1220
|
}
|
|
74
1221
|
if (request.action === "setContent") {
|
|
@@ -97,12 +1244,12 @@
|
|
|
97
1244
|
}
|
|
98
1245
|
}
|
|
99
1246
|
extractReactSource(element) {
|
|
100
|
-
var
|
|
1247
|
+
var _a2, _b2;
|
|
101
1248
|
const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
102
1249
|
if (!hook) return void 0;
|
|
103
1250
|
const fiber = this.findReactFiber(element);
|
|
104
1251
|
if (!fiber) return void 0;
|
|
105
|
-
const source = fiber._debugSource || ((
|
|
1252
|
+
const source = fiber._debugSource || ((_a2 = fiber.pendingProps) == null ? void 0 : _a2.__source) || ((_b2 = fiber.memoizedProps) == null ? void 0 : _b2.__source);
|
|
106
1253
|
if (source && source.fileName) {
|
|
107
1254
|
return {
|
|
108
1255
|
file: source.fileName,
|
|
@@ -119,19 +1266,19 @@
|
|
|
119
1266
|
return key ? element[key] : null;
|
|
120
1267
|
}
|
|
121
1268
|
extractVueSource(element) {
|
|
122
|
-
var
|
|
1269
|
+
var _a2, _b2;
|
|
123
1270
|
const hook = window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
|
|
124
1271
|
if (!hook) return void 0;
|
|
125
1272
|
let instance = element.__vueParentComponent;
|
|
126
1273
|
if (!instance) {
|
|
127
1274
|
instance = element.__vue__;
|
|
128
1275
|
}
|
|
129
|
-
if ((
|
|
1276
|
+
if ((_a2 = instance == null ? void 0 : instance.type) == null ? void 0 : _a2.__file) {
|
|
130
1277
|
const location2 = {
|
|
131
1278
|
file: instance.type.__file,
|
|
132
1279
|
line: 1
|
|
133
1280
|
};
|
|
134
|
-
if ((
|
|
1281
|
+
if ((_b2 = instance.vnode) == null ? void 0 : _b2.loc) {
|
|
135
1282
|
location2.line = instance.vnode.loc.start.line;
|
|
136
1283
|
location2.column = instance.vnode.loc.start.column;
|
|
137
1284
|
}
|
|
@@ -140,9 +1287,9 @@
|
|
|
140
1287
|
return void 0;
|
|
141
1288
|
}
|
|
142
1289
|
extractSvelteSource(element) {
|
|
143
|
-
var
|
|
1290
|
+
var _a2, _b2;
|
|
144
1291
|
const component = element.__svelte_component;
|
|
145
|
-
if ((
|
|
1292
|
+
if ((_b2 = (_a2 = component == null ? void 0 : component.$$) == null ? void 0 : _a2.ctx) == null ? void 0 : _b2.$$_location) {
|
|
146
1293
|
return component.$$.ctx.$$_location;
|
|
147
1294
|
}
|
|
148
1295
|
return void 0;
|
|
@@ -181,7 +1328,7 @@
|
|
|
181
1328
|
document.querySelectorAll("[data-hanzo-hover]").forEach((el) => {
|
|
182
1329
|
el.removeAttribute("data-hanzo-hover");
|
|
183
1330
|
});
|
|
184
|
-
if (e.
|
|
1331
|
+
if (matchesShortcut(e, this.inspectShortcut) && e.target instanceof HTMLElement) {
|
|
185
1332
|
e.target.setAttribute("data-hanzo-hover", "true");
|
|
186
1333
|
}
|
|
187
1334
|
});
|
|
@@ -462,7 +1609,7 @@
|
|
|
462
1609
|
}
|
|
463
1610
|
}
|
|
464
1611
|
function show(task) {
|
|
465
|
-
var
|
|
1612
|
+
var _a2;
|
|
466
1613
|
if (overlay) hide();
|
|
467
1614
|
injectStyles();
|
|
468
1615
|
setInteractionBlock(true);
|
|
@@ -483,7 +1630,7 @@
|
|
|
483
1630
|
<button class="hanzo-stop-btn">Stop</button>
|
|
484
1631
|
`;
|
|
485
1632
|
document.body.appendChild(statusEl);
|
|
486
|
-
(
|
|
1633
|
+
(_a2 = statusEl.querySelector(".hanzo-stop-btn")) == null ? void 0 : _a2.addEventListener("click", () => {
|
|
487
1634
|
chrome.runtime.sendMessage({ action: "ai.control.cancel" });
|
|
488
1635
|
hide();
|
|
489
1636
|
});
|
|
@@ -510,12 +1657,12 @@
|
|
|
510
1657
|
const refs = { overlay, cursor, statusEl, cancelBtn, highlightEl };
|
|
511
1658
|
const trails = [...trailNodes];
|
|
512
1659
|
setTimeout(() => {
|
|
513
|
-
var
|
|
514
|
-
(
|
|
515
|
-
(
|
|
516
|
-
(
|
|
517
|
-
(
|
|
518
|
-
(
|
|
1660
|
+
var _a2, _b2, _c2, _d2, _e2;
|
|
1661
|
+
(_a2 = refs.overlay) == null ? void 0 : _a2.remove();
|
|
1662
|
+
(_b2 = refs.cursor) == null ? void 0 : _b2.remove();
|
|
1663
|
+
(_c2 = refs.statusEl) == null ? void 0 : _c2.remove();
|
|
1664
|
+
(_d2 = refs.cancelBtn) == null ? void 0 : _d2.remove();
|
|
1665
|
+
(_e2 = refs.highlightEl) == null ? void 0 : _e2.remove();
|
|
519
1666
|
for (const node of trails) {
|
|
520
1667
|
node.remove();
|
|
521
1668
|
}
|
|
@@ -529,7 +1676,7 @@
|
|
|
529
1676
|
trailNodes = [];
|
|
530
1677
|
}
|
|
531
1678
|
function moveCursor(x, y) {
|
|
532
|
-
var
|
|
1679
|
+
var _a2;
|
|
533
1680
|
if (!cursor) return;
|
|
534
1681
|
const clampedX = Math.max(0, Math.min(window.innerWidth, Number.isFinite(x) ? x : 0));
|
|
535
1682
|
const clampedY = Math.max(0, Math.min(window.innerHeight, Number.isFinite(y) ? y : 0));
|
|
@@ -544,7 +1691,7 @@
|
|
|
544
1691
|
trailNodes = trailNodes.filter((node) => node !== trail);
|
|
545
1692
|
}, 400);
|
|
546
1693
|
while (trailNodes.length > 10) {
|
|
547
|
-
(
|
|
1694
|
+
(_a2 = trailNodes.shift()) == null ? void 0 : _a2.remove();
|
|
548
1695
|
}
|
|
549
1696
|
cursor.style.left = `${clampedX}px`;
|
|
550
1697
|
cursor.style.top = `${clampedY}px`;
|
|
@@ -582,11 +1729,19 @@
|
|
|
582
1729
|
}
|
|
583
1730
|
return { show, hide, moveCursor, highlight, updateStatus };
|
|
584
1731
|
})();
|
|
1732
|
+
var OVERLAY_WIDTH_PX = {
|
|
1733
|
+
compact: 320,
|
|
1734
|
+
default: 420,
|
|
1735
|
+
wide: 560
|
|
1736
|
+
};
|
|
585
1737
|
var HanzoPageOverlay = class {
|
|
586
1738
|
constructor() {
|
|
587
1739
|
this.mounted = false;
|
|
588
1740
|
this.enabled = false;
|
|
589
1741
|
this.open = false;
|
|
1742
|
+
this.side = "right";
|
|
1743
|
+
this.mode = "overlay";
|
|
1744
|
+
this.width = "default";
|
|
590
1745
|
this.sending = false;
|
|
591
1746
|
this.watchMode = false;
|
|
592
1747
|
this.editMode = false;
|
|
@@ -610,6 +1765,53 @@
|
|
|
610
1765
|
this.injectStyles();
|
|
611
1766
|
this.mount();
|
|
612
1767
|
this.bindGlobalEvents();
|
|
1768
|
+
this.restorePrefs();
|
|
1769
|
+
}
|
|
1770
|
+
restorePrefs() {
|
|
1771
|
+
var _a2, _b2;
|
|
1772
|
+
try {
|
|
1773
|
+
const ss = (_b2 = (_a2 = typeof browser !== "undefined" ? browser : chrome) == null ? void 0 : _a2.storage) == null ? void 0 : _b2.sync;
|
|
1774
|
+
if (!(ss == null ? void 0 : ss.get)) return;
|
|
1775
|
+
const promised = ss.get(["overlaySide", "overlayMode", "overlayWidth"]);
|
|
1776
|
+
const apply = (v) => {
|
|
1777
|
+
var _a3, _b3;
|
|
1778
|
+
if ((v == null ? void 0 : v.overlaySide) === "left" || (v == null ? void 0 : v.overlaySide) === "right") {
|
|
1779
|
+
this.side = v.overlaySide;
|
|
1780
|
+
(_a3 = this.root) == null ? void 0 : _a3.setAttribute("data-side", this.side);
|
|
1781
|
+
}
|
|
1782
|
+
if ((v == null ? void 0 : v.overlayMode) === "push" || (v == null ? void 0 : v.overlayMode) === "overlay") {
|
|
1783
|
+
this.mode = v.overlayMode;
|
|
1784
|
+
(_b3 = this.root) == null ? void 0 : _b3.setAttribute("data-mode", this.mode);
|
|
1785
|
+
}
|
|
1786
|
+
if ((v == null ? void 0 : v.overlayWidth) === "compact" || (v == null ? void 0 : v.overlayWidth) === "default" || (v == null ? void 0 : v.overlayWidth) === "wide") {
|
|
1787
|
+
this.width = v.overlayWidth;
|
|
1788
|
+
this.applyWidth();
|
|
1789
|
+
}
|
|
1790
|
+
this.applyPushIfOpen();
|
|
1791
|
+
};
|
|
1792
|
+
if (promised && typeof promised.then === "function") {
|
|
1793
|
+
promised.then(apply).catch(() => {
|
|
1794
|
+
});
|
|
1795
|
+
} else {
|
|
1796
|
+
ss.get(["overlaySide", "overlayMode", "overlayWidth"], apply);
|
|
1797
|
+
}
|
|
1798
|
+
} catch {
|
|
1799
|
+
}
|
|
1800
|
+
}
|
|
1801
|
+
applyWidth() {
|
|
1802
|
+
const px = OVERLAY_WIDTH_PX[this.width] ?? OVERLAY_WIDTH_PX.default;
|
|
1803
|
+
if (this.root) {
|
|
1804
|
+
this.root.style.setProperty("--hanzo-overlay-width", `${px}px`);
|
|
1805
|
+
this.root.style.width = `min(${px}px, 100vw)`;
|
|
1806
|
+
}
|
|
1807
|
+
document.documentElement.style.setProperty("--hanzo-overlay-width", `${px}px`);
|
|
1808
|
+
}
|
|
1809
|
+
applyPushIfOpen() {
|
|
1810
|
+
const html = document.documentElement;
|
|
1811
|
+
html.classList.remove("hanzo-overlay-push", "hanzo-overlay-push-left", "hanzo-overlay-push-right");
|
|
1812
|
+
if (this.open && this.enabled && this.mode === "push") {
|
|
1813
|
+
html.classList.add("hanzo-overlay-push", `hanzo-overlay-push-${this.side}`);
|
|
1814
|
+
}
|
|
613
1815
|
}
|
|
614
1816
|
toggle() {
|
|
615
1817
|
if (!this.enabled || !this.open) {
|
|
@@ -619,28 +1821,70 @@
|
|
|
619
1821
|
this.hide();
|
|
620
1822
|
return false;
|
|
621
1823
|
}
|
|
1824
|
+
isOpen() {
|
|
1825
|
+
return this.open;
|
|
1826
|
+
}
|
|
1827
|
+
getSide() {
|
|
1828
|
+
return this.side;
|
|
1829
|
+
}
|
|
1830
|
+
getMode() {
|
|
1831
|
+
return this.mode;
|
|
1832
|
+
}
|
|
1833
|
+
setSide(side) {
|
|
1834
|
+
var _a2;
|
|
1835
|
+
this.side = side;
|
|
1836
|
+
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-side", side);
|
|
1837
|
+
this.applyPushIfOpen();
|
|
1838
|
+
this.persist({ overlaySide: side });
|
|
1839
|
+
}
|
|
1840
|
+
setMode(mode) {
|
|
1841
|
+
var _a2;
|
|
1842
|
+
this.mode = mode;
|
|
1843
|
+
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-mode", mode);
|
|
1844
|
+
this.applyPushIfOpen();
|
|
1845
|
+
this.persist({ overlayMode: mode });
|
|
1846
|
+
}
|
|
1847
|
+
setWidth(width) {
|
|
1848
|
+
this.width = width;
|
|
1849
|
+
this.applyWidth();
|
|
1850
|
+
this.persist({ overlayWidth: width });
|
|
1851
|
+
}
|
|
1852
|
+
setEnabled(enabled) {
|
|
1853
|
+
var _a2;
|
|
1854
|
+
this.enabled = enabled;
|
|
1855
|
+
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-enabled", enabled ? "true" : "false");
|
|
1856
|
+
if (!enabled) this.hide();
|
|
1857
|
+
this.persist({ overlayEnabled: enabled });
|
|
1858
|
+
}
|
|
1859
|
+
persist(values) {
|
|
1860
|
+
var _a2, _b2, _c2;
|
|
1861
|
+
try {
|
|
1862
|
+
const ss = (_b2 = (_a2 = typeof browser !== "undefined" ? browser : chrome) == null ? void 0 : _a2.storage) == null ? void 0 : _b2.sync;
|
|
1863
|
+
(_c2 = ss == null ? void 0 : ss.set) == null ? void 0 : _c2.call(ss, values);
|
|
1864
|
+
} catch {
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
622
1867
|
show() {
|
|
623
|
-
var
|
|
1868
|
+
var _a2, _b2;
|
|
624
1869
|
this.ensureMounted();
|
|
625
1870
|
this.enabled = true;
|
|
626
1871
|
this.open = true;
|
|
627
|
-
(
|
|
628
|
-
(
|
|
1872
|
+
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-enabled", "true");
|
|
1873
|
+
(_b2 = this.root) == null ? void 0 : _b2.setAttribute("data-open", "true");
|
|
1874
|
+
this.applyPushIfOpen();
|
|
629
1875
|
this.loadModels();
|
|
630
1876
|
this.focusInput();
|
|
631
1877
|
}
|
|
632
1878
|
hide() {
|
|
633
|
-
var
|
|
1879
|
+
var _a2;
|
|
634
1880
|
this.open = false;
|
|
635
|
-
(
|
|
1881
|
+
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-open", "false");
|
|
1882
|
+
this.applyPushIfOpen();
|
|
636
1883
|
this.updateStatus("");
|
|
637
1884
|
this.clearHighlight();
|
|
638
1885
|
this.setWatchMode(false);
|
|
639
1886
|
this.setEditMode(false);
|
|
640
1887
|
}
|
|
641
|
-
isOpen() {
|
|
642
|
-
return this.open;
|
|
643
|
-
}
|
|
644
1888
|
ensureMounted() {
|
|
645
1889
|
if (this.mounted) return;
|
|
646
1890
|
this.mount();
|
|
@@ -650,89 +1894,85 @@
|
|
|
650
1894
|
const style = document.createElement("style");
|
|
651
1895
|
style.id = "hanzo-page-overlay-styles";
|
|
652
1896
|
style.textContent = `
|
|
1897
|
+
/* Edge-pinned sidebar panel \u2014 no FAB, opened from extension popup.
|
|
1898
|
+
Hanzo brand: monochrome (white primary, neutral surfaces). No blue. */
|
|
653
1899
|
#hanzo-page-overlay-root {
|
|
654
1900
|
position: fixed;
|
|
655
|
-
|
|
656
|
-
bottom:
|
|
1901
|
+
top: 0;
|
|
1902
|
+
bottom: 0;
|
|
1903
|
+
right: 0;
|
|
1904
|
+
width: min(var(--hanzo-overlay-width, 420px), 100vw);
|
|
657
1905
|
z-index: 2147483645;
|
|
658
1906
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
659
1907
|
pointer-events: none;
|
|
660
1908
|
}
|
|
661
1909
|
|
|
662
|
-
#hanzo-page-overlay-root
|
|
663
|
-
|
|
1910
|
+
#hanzo-page-overlay-root[data-side="left"] {
|
|
1911
|
+
right: auto;
|
|
1912
|
+
left: 0;
|
|
664
1913
|
}
|
|
665
1914
|
|
|
666
|
-
#hanzo-page-overlay-root
|
|
667
|
-
|
|
668
|
-
transform: translateY(16px);
|
|
669
|
-
pointer-events: none;
|
|
1915
|
+
#hanzo-page-overlay-root * {
|
|
1916
|
+
box-sizing: border-box;
|
|
670
1917
|
}
|
|
671
1918
|
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
color: #ffffff;
|
|
679
|
-
box-shadow: 0 14px 34px rgba(0, 0, 0, 0.35);
|
|
680
|
-
display: flex;
|
|
681
|
-
align-items: center;
|
|
682
|
-
justify-content: center;
|
|
683
|
-
cursor: pointer;
|
|
684
|
-
pointer-events: auto;
|
|
685
|
-
transition: transform 0.2s ease, opacity 0.2s ease;
|
|
1919
|
+
/* Push mode: when the user pins the panel as a dock, html shifts so
|
|
1920
|
+
page content reflows beside it instead of being covered. Applied to
|
|
1921
|
+
<html> from setMode('push') + open. */
|
|
1922
|
+
html.hanzo-overlay-push.hanzo-overlay-push-right {
|
|
1923
|
+
margin-right: var(--hanzo-overlay-width, 420px) !important;
|
|
1924
|
+
transition: margin-right 0.18s ease;
|
|
686
1925
|
}
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
1926
|
+
html.hanzo-overlay-push.hanzo-overlay-push-left {
|
|
1927
|
+
margin-left: var(--hanzo-overlay-width, 420px) !important;
|
|
1928
|
+
transition: margin-left 0.18s ease;
|
|
690
1929
|
}
|
|
691
1930
|
|
|
692
1931
|
.hanzo-page-panel {
|
|
693
|
-
width:
|
|
694
|
-
|
|
695
|
-
border-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
color: #eef2ff;
|
|
1932
|
+
width: 100%;
|
|
1933
|
+
height: 100%;
|
|
1934
|
+
border-left: 1px solid rgba(255, 255, 255, 0.16);
|
|
1935
|
+
background: linear-gradient(180deg, rgba(10, 10, 11, 0.97), rgba(7, 7, 8, 0.97));
|
|
1936
|
+
color: #f5f5f5;
|
|
699
1937
|
overflow: hidden;
|
|
700
|
-
box-shadow: 0
|
|
701
|
-
transform
|
|
702
|
-
transform: translateY(8px) scale(0.98);
|
|
1938
|
+
box-shadow: -22px 0 48px rgba(0, 0, 0, 0.45);
|
|
1939
|
+
transform: translateX(100%);
|
|
703
1940
|
opacity: 0;
|
|
704
1941
|
pointer-events: none;
|
|
705
1942
|
display: flex;
|
|
706
1943
|
flex-direction: column;
|
|
707
|
-
|
|
1944
|
+
min-height: 0;
|
|
708
1945
|
transition: transform 0.18s ease, opacity 0.18s ease;
|
|
709
1946
|
}
|
|
710
1947
|
|
|
1948
|
+
#hanzo-page-overlay-root[data-side="left"] .hanzo-page-panel {
|
|
1949
|
+
border-left: none;
|
|
1950
|
+
border-right: 1px solid rgba(255, 255, 255, 0.16);
|
|
1951
|
+
box-shadow: 22px 0 48px rgba(0, 0, 0, 0.45);
|
|
1952
|
+
transform: translateX(-100%);
|
|
1953
|
+
}
|
|
1954
|
+
|
|
711
1955
|
#hanzo-page-overlay-root[data-open="true"] .hanzo-page-panel {
|
|
712
|
-
transform:
|
|
1956
|
+
transform: translateX(0);
|
|
713
1957
|
opacity: 1;
|
|
714
1958
|
pointer-events: auto;
|
|
715
1959
|
}
|
|
716
1960
|
|
|
717
|
-
#hanzo-page-overlay-root[data-open="true"] .hanzo-page-launcher {
|
|
718
|
-
opacity: 0;
|
|
719
|
-
transform: scale(0.9);
|
|
720
|
-
pointer-events: none;
|
|
721
|
-
}
|
|
722
|
-
|
|
723
1961
|
.hanzo-page-header {
|
|
724
1962
|
display: flex;
|
|
725
1963
|
align-items: center;
|
|
726
1964
|
justify-content: space-between;
|
|
727
1965
|
padding: 12px 14px;
|
|
728
|
-
border-bottom: 1px solid rgba(255, 255, 255, 0.
|
|
1966
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.10);
|
|
729
1967
|
background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent);
|
|
1968
|
+
flex-shrink: 0;
|
|
730
1969
|
}
|
|
731
1970
|
|
|
732
1971
|
.hanzo-page-brand {
|
|
733
1972
|
font-weight: 700;
|
|
734
1973
|
letter-spacing: 0.2px;
|
|
735
1974
|
font-size: 13px;
|
|
1975
|
+
color: #f5f5f5;
|
|
736
1976
|
}
|
|
737
1977
|
|
|
738
1978
|
.hanzo-page-header-actions {
|
|
@@ -745,16 +1985,22 @@
|
|
|
745
1985
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
746
1986
|
border-radius: 9999px;
|
|
747
1987
|
padding: 4px 10px;
|
|
748
|
-
background:
|
|
749
|
-
color:
|
|
1988
|
+
background: transparent;
|
|
1989
|
+
color: rgba(245, 245, 245, 0.85);
|
|
750
1990
|
cursor: pointer;
|
|
751
1991
|
font-size: 11px;
|
|
1992
|
+
transition: background 0.15s, color 0.15s, border-color 0.15s;
|
|
1993
|
+
}
|
|
1994
|
+
|
|
1995
|
+
.hanzo-chip-btn:hover {
|
|
1996
|
+
background: rgba(255, 255, 255, 0.06);
|
|
1997
|
+
color: #fff;
|
|
752
1998
|
}
|
|
753
1999
|
|
|
754
2000
|
.hanzo-chip-btn[data-active="true"] {
|
|
755
|
-
border-color: rgba(
|
|
756
|
-
background: rgba(
|
|
757
|
-
color: #
|
|
2001
|
+
border-color: rgba(255, 255, 255, 0.7);
|
|
2002
|
+
background: rgba(255, 255, 255, 0.10);
|
|
2003
|
+
color: #fff;
|
|
758
2004
|
}
|
|
759
2005
|
|
|
760
2006
|
.hanzo-icon-btn {
|
|
@@ -763,9 +2009,28 @@
|
|
|
763
2009
|
border-radius: 8px;
|
|
764
2010
|
border: 1px solid rgba(255, 255, 255, 0.18);
|
|
765
2011
|
background: transparent;
|
|
766
|
-
color: #
|
|
2012
|
+
color: #f5f5f5;
|
|
767
2013
|
cursor: pointer;
|
|
768
|
-
font-size:
|
|
2014
|
+
font-size: 14px;
|
|
2015
|
+
display: inline-flex;
|
|
2016
|
+
align-items: center;
|
|
2017
|
+
justify-content: center;
|
|
2018
|
+
padding: 0;
|
|
2019
|
+
transition: background 0.15s, border-color 0.15s;
|
|
2020
|
+
}
|
|
2021
|
+
|
|
2022
|
+
.hanzo-icon-btn:hover {
|
|
2023
|
+
background: rgba(255, 255, 255, 0.06);
|
|
2024
|
+
}
|
|
2025
|
+
|
|
2026
|
+
.hanzo-icon-btn[data-active="true"] {
|
|
2027
|
+
background: rgba(255, 255, 255, 0.12);
|
|
2028
|
+
border-color: rgba(255, 255, 255, 0.5);
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
.hanzo-icon-btn svg {
|
|
2032
|
+
width: 14px;
|
|
2033
|
+
height: 14px;
|
|
769
2034
|
}
|
|
770
2035
|
|
|
771
2036
|
.hanzo-page-meta {
|
|
@@ -774,11 +2039,12 @@
|
|
|
774
2039
|
grid-template-columns: 1fr auto;
|
|
775
2040
|
gap: 8px;
|
|
776
2041
|
align-items: center;
|
|
2042
|
+
flex-shrink: 0;
|
|
777
2043
|
}
|
|
778
2044
|
|
|
779
2045
|
.hanzo-page-context {
|
|
780
2046
|
font-size: 11px;
|
|
781
|
-
color:
|
|
2047
|
+
color: rgba(245, 245, 245, 0.65);
|
|
782
2048
|
overflow: hidden;
|
|
783
2049
|
text-overflow: ellipsis;
|
|
784
2050
|
white-space: nowrap;
|
|
@@ -786,11 +2052,12 @@
|
|
|
786
2052
|
|
|
787
2053
|
.hanzo-page-status {
|
|
788
2054
|
font-size: 11px;
|
|
789
|
-
color:
|
|
2055
|
+
color: rgba(245, 245, 245, 0.55);
|
|
790
2056
|
}
|
|
791
2057
|
|
|
792
2058
|
.hanzo-model-row {
|
|
793
2059
|
padding: 0 14px 8px 14px;
|
|
2060
|
+
flex-shrink: 0;
|
|
794
2061
|
}
|
|
795
2062
|
|
|
796
2063
|
.hanzo-model-row select {
|
|
@@ -798,15 +2065,16 @@
|
|
|
798
2065
|
border-radius: 8px;
|
|
799
2066
|
border: 1px solid rgba(255, 255, 255, 0.16);
|
|
800
2067
|
background: rgba(255, 255, 255, 0.03);
|
|
801
|
-
color: #
|
|
2068
|
+
color: #f5f5f5;
|
|
802
2069
|
padding: 7px 9px;
|
|
803
2070
|
font-size: 12px;
|
|
804
2071
|
}
|
|
805
2072
|
|
|
2073
|
+
/* The chat scroller: takes ALL remaining vertical space so the
|
|
2074
|
+
composer below stays sticky against the bottom of the panel. */
|
|
806
2075
|
.hanzo-page-messages {
|
|
807
|
-
flex: 1;
|
|
808
|
-
min-height:
|
|
809
|
-
max-height: 370px;
|
|
2076
|
+
flex: 1 1 auto;
|
|
2077
|
+
min-height: 0;
|
|
810
2078
|
overflow-y: auto;
|
|
811
2079
|
padding: 8px 14px 12px 14px;
|
|
812
2080
|
display: flex;
|
|
@@ -825,23 +2093,27 @@
|
|
|
825
2093
|
.hanzo-page-msg.user {
|
|
826
2094
|
align-self: flex-end;
|
|
827
2095
|
max-width: 88%;
|
|
828
|
-
background: rgba(
|
|
829
|
-
border: 1px solid rgba(
|
|
2096
|
+
background: rgba(255, 255, 255, 0.10);
|
|
2097
|
+
border: 1px solid rgba(255, 255, 255, 0.18);
|
|
830
2098
|
}
|
|
831
2099
|
|
|
832
2100
|
.hanzo-page-msg.assistant {
|
|
833
2101
|
align-self: flex-start;
|
|
834
2102
|
max-width: 92%;
|
|
835
|
-
background: rgba(255, 255, 255, 0.
|
|
836
|
-
border: 1px solid rgba(255, 255, 255, 0.
|
|
2103
|
+
background: rgba(255, 255, 255, 0.04);
|
|
2104
|
+
border: 1px solid rgba(255, 255, 255, 0.10);
|
|
837
2105
|
}
|
|
838
2106
|
|
|
2107
|
+
/* Composer pinned to bottom of the panel. flex-shrink: 0 prevents
|
|
2108
|
+
it from collapsing when the messages scroller grows. */
|
|
839
2109
|
.hanzo-page-composer {
|
|
840
|
-
border-top: 1px solid rgba(255, 255, 255, 0.
|
|
2110
|
+
border-top: 1px solid rgba(255, 255, 255, 0.10);
|
|
841
2111
|
padding: 10px 12px;
|
|
842
2112
|
display: flex;
|
|
843
2113
|
gap: 8px;
|
|
844
2114
|
align-items: flex-end;
|
|
2115
|
+
background: rgba(0, 0, 0, 0.35);
|
|
2116
|
+
flex-shrink: 0;
|
|
845
2117
|
}
|
|
846
2118
|
|
|
847
2119
|
.hanzo-page-composer textarea {
|
|
@@ -852,21 +2124,31 @@
|
|
|
852
2124
|
border-radius: 10px;
|
|
853
2125
|
border: 1px solid rgba(255, 255, 255, 0.17);
|
|
854
2126
|
background: rgba(255, 255, 255, 0.03);
|
|
855
|
-
color: #
|
|
2127
|
+
color: #f5f5f5;
|
|
856
2128
|
padding: 9px 11px;
|
|
857
2129
|
font-size: 12px;
|
|
858
2130
|
}
|
|
859
2131
|
|
|
2132
|
+
/* Primary action: WHITE per @hanzo/brand monochrome guidelines. */
|
|
860
2133
|
.hanzo-page-composer button {
|
|
861
2134
|
min-width: 68px;
|
|
862
2135
|
height: 38px;
|
|
863
2136
|
border-radius: 10px;
|
|
864
|
-
border: 1px solid
|
|
865
|
-
background:
|
|
866
|
-
color: #
|
|
2137
|
+
border: 1px solid #ffffff;
|
|
2138
|
+
background: #ffffff;
|
|
2139
|
+
color: #0a0a0b;
|
|
867
2140
|
font-weight: 600;
|
|
868
2141
|
font-size: 12px;
|
|
869
2142
|
cursor: pointer;
|
|
2143
|
+
transition: background 0.12s, transform 0.08s;
|
|
2144
|
+
}
|
|
2145
|
+
|
|
2146
|
+
.hanzo-page-composer button:hover:not(:disabled) {
|
|
2147
|
+
background: #f5f5f5;
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2150
|
+
.hanzo-page-composer button:active:not(:disabled) {
|
|
2151
|
+
transform: translateY(1px);
|
|
870
2152
|
}
|
|
871
2153
|
|
|
872
2154
|
.hanzo-page-composer button:disabled {
|
|
@@ -878,33 +2160,41 @@
|
|
|
878
2160
|
position: fixed;
|
|
879
2161
|
z-index: 2147483644;
|
|
880
2162
|
pointer-events: none;
|
|
881
|
-
border: 2px solid rgba(
|
|
2163
|
+
border: 2px solid rgba(255, 255, 255, 0.95);
|
|
882
2164
|
border-radius: 6px;
|
|
883
|
-
box-shadow: 0 0 0 2px rgba(
|
|
2165
|
+
box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
|
|
884
2166
|
}
|
|
885
2167
|
|
|
886
2168
|
[data-hanzo-inline-editing="true"] {
|
|
887
|
-
outline: 2px solid rgba(
|
|
2169
|
+
outline: 2px solid rgba(255, 255, 255, 0.92) !important;
|
|
888
2170
|
outline-offset: 2px !important;
|
|
889
2171
|
}
|
|
890
2172
|
`;
|
|
891
2173
|
document.head.appendChild(style);
|
|
892
2174
|
}
|
|
893
2175
|
mount() {
|
|
894
|
-
var
|
|
2176
|
+
var _a2, _b2, _c2, _d2, _e2, _f2;
|
|
895
2177
|
if (this.mounted) return;
|
|
896
2178
|
this.root = document.createElement("div");
|
|
897
2179
|
this.root.id = "hanzo-page-overlay-root";
|
|
898
2180
|
this.root.setAttribute("data-open", "false");
|
|
899
2181
|
this.root.setAttribute("data-enabled", "false");
|
|
2182
|
+
this.root.setAttribute("data-side", this.side);
|
|
2183
|
+
this.root.setAttribute("data-mode", this.mode);
|
|
2184
|
+
this.applyWidth();
|
|
900
2185
|
this.root.innerHTML = `
|
|
901
2186
|
<div class="hanzo-page-panel" role="dialog" aria-label="Hanzo Page Assistant">
|
|
902
2187
|
<div class="hanzo-page-header">
|
|
903
|
-
<div class="hanzo-page-brand">Hanzo
|
|
2188
|
+
<div class="hanzo-page-brand">Hanzo</div>
|
|
904
2189
|
<div class="hanzo-page-header-actions">
|
|
905
2190
|
<button class="hanzo-chip-btn" data-role="watch" data-active="false" title="Watch elements on hover">Watch</button>
|
|
906
2191
|
<button class="hanzo-chip-btn" data-role="edit" data-active="false" title="Click any element to edit text">Edit</button>
|
|
907
|
-
<button class="hanzo-icon-btn" data-role="
|
|
2192
|
+
<button class="hanzo-icon-btn" data-role="pin-mode" title="Toggle: pin (push content) vs overlay (float over page)">
|
|
2193
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
|
|
2194
|
+
<path d="M9 4v16M3 4h12a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H3z"/>
|
|
2195
|
+
</svg>
|
|
2196
|
+
</button>
|
|
2197
|
+
<button class="hanzo-icon-btn" data-role="close" title="Hide overlay">\xD7</button>
|
|
908
2198
|
</div>
|
|
909
2199
|
</div>
|
|
910
2200
|
<div class="hanzo-page-meta">
|
|
@@ -928,10 +2218,9 @@
|
|
|
928
2218
|
<button data-role="send" type="button">Ask</button>
|
|
929
2219
|
</div>
|
|
930
2220
|
</div>
|
|
931
|
-
<button class="hanzo-page-launcher" data-role="launcher" type="button" title="Open Hanzo Overlay">AI</button>
|
|
932
2221
|
`;
|
|
933
2222
|
this.panel = this.root.querySelector(".hanzo-page-panel");
|
|
934
|
-
this.launcher =
|
|
2223
|
+
this.launcher = null;
|
|
935
2224
|
this.messagesEl = this.root.querySelector('[data-role="messages"]');
|
|
936
2225
|
this.inputEl = this.root.querySelector('[data-role="input"]');
|
|
937
2226
|
this.sendBtn = this.root.querySelector('[data-role="send"]');
|
|
@@ -940,18 +2229,24 @@
|
|
|
940
2229
|
this.watchBtn = this.root.querySelector('[data-role="watch"]');
|
|
941
2230
|
this.editBtn = this.root.querySelector('[data-role="edit"]');
|
|
942
2231
|
this.statusEl = this.root.querySelector(".hanzo-page-status");
|
|
943
|
-
(
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
2232
|
+
(_a2 = this.root.querySelector('[data-role="close"]')) == null ? void 0 : _a2.addEventListener("click", () => this.hide());
|
|
2233
|
+
const pinModeBtn = this.root.querySelector('[data-role="pin-mode"]');
|
|
2234
|
+
pinModeBtn == null ? void 0 : pinModeBtn.setAttribute("data-active", this.mode === "push" ? "true" : "false");
|
|
2235
|
+
pinModeBtn == null ? void 0 : pinModeBtn.addEventListener("click", () => {
|
|
2236
|
+
const next = this.mode === "push" ? "overlay" : "push";
|
|
2237
|
+
this.setMode(next);
|
|
2238
|
+
pinModeBtn.setAttribute("data-active", next === "push" ? "true" : "false");
|
|
2239
|
+
});
|
|
2240
|
+
(_b2 = this.watchBtn) == null ? void 0 : _b2.addEventListener("click", () => this.setWatchMode(!this.watchMode));
|
|
2241
|
+
(_c2 = this.editBtn) == null ? void 0 : _c2.addEventListener("click", () => this.setEditMode(!this.editMode));
|
|
2242
|
+
(_d2 = this.sendBtn) == null ? void 0 : _d2.addEventListener("click", () => this.askPageQuestion());
|
|
2243
|
+
(_e2 = this.inputEl) == null ? void 0 : _e2.addEventListener("keydown", (event) => {
|
|
949
2244
|
if (event.key === "Enter" && !event.shiftKey) {
|
|
950
2245
|
event.preventDefault();
|
|
951
2246
|
this.askPageQuestion();
|
|
952
2247
|
}
|
|
953
2248
|
});
|
|
954
|
-
(
|
|
2249
|
+
(_f2 = this.inputEl) == null ? void 0 : _f2.addEventListener("input", () => {
|
|
955
2250
|
if (!this.inputEl) return;
|
|
956
2251
|
this.inputEl.style.height = "auto";
|
|
957
2252
|
this.inputEl.style.height = `${Math.min(this.inputEl.scrollHeight, 110)}px`;
|
|
@@ -1006,18 +2301,18 @@
|
|
|
1006
2301
|
}
|
|
1007
2302
|
}
|
|
1008
2303
|
getPageTarget(target) {
|
|
1009
|
-
var
|
|
2304
|
+
var _a2;
|
|
1010
2305
|
if (!(target instanceof HTMLElement)) return null;
|
|
1011
|
-
if ((
|
|
2306
|
+
if ((_a2 = this.root) == null ? void 0 : _a2.contains(target)) return null;
|
|
1012
2307
|
if (!target.isConnected) return null;
|
|
1013
2308
|
if (target.tagName.toLowerCase() === "html" || target.tagName.toLowerCase() === "body") return null;
|
|
1014
2309
|
return target;
|
|
1015
2310
|
}
|
|
1016
2311
|
setWatchMode(active) {
|
|
1017
|
-
var
|
|
2312
|
+
var _a2;
|
|
1018
2313
|
this.watchMode = active;
|
|
1019
2314
|
if (active) this.setEditMode(false);
|
|
1020
|
-
(
|
|
2315
|
+
(_a2 = this.watchBtn) == null ? void 0 : _a2.setAttribute("data-active", active ? "true" : "false");
|
|
1021
2316
|
if (!active) {
|
|
1022
2317
|
this.hoveredElement = null;
|
|
1023
2318
|
this.clearHighlight();
|
|
@@ -1029,10 +2324,10 @@
|
|
|
1029
2324
|
}
|
|
1030
2325
|
}
|
|
1031
2326
|
setEditMode(active) {
|
|
1032
|
-
var
|
|
2327
|
+
var _a2;
|
|
1033
2328
|
this.editMode = active;
|
|
1034
2329
|
if (active) this.setWatchMode(false);
|
|
1035
|
-
(
|
|
2330
|
+
(_a2 = this.editBtn) == null ? void 0 : _a2.setAttribute("data-active", active ? "true" : "false");
|
|
1036
2331
|
if (!active && this.editingElement) {
|
|
1037
2332
|
this.disableInlineEdit(this.editingElement, true);
|
|
1038
2333
|
} else if (active) {
|
|
@@ -1106,8 +2401,8 @@
|
|
|
1106
2401
|
this.highlightBox.style.height = `${rect.height + 6}px`;
|
|
1107
2402
|
}
|
|
1108
2403
|
clearHighlight() {
|
|
1109
|
-
var
|
|
1110
|
-
(
|
|
2404
|
+
var _a2;
|
|
2405
|
+
(_a2 = this.highlightBox) == null ? void 0 : _a2.remove();
|
|
1111
2406
|
this.highlightBox = null;
|
|
1112
2407
|
}
|
|
1113
2408
|
captureElementContext(element) {
|
|
@@ -1191,8 +2486,8 @@
|
|
|
1191
2486
|
this.statusEl.textContent = text;
|
|
1192
2487
|
}
|
|
1193
2488
|
buildPageContext() {
|
|
1194
|
-
var
|
|
1195
|
-
const selection = this.normalizeText(((
|
|
2489
|
+
var _a2, _b2;
|
|
2490
|
+
const selection = this.normalizeText(((_b2 = (_a2 = window.getSelection) == null ? void 0 : _a2.call(window)) == null ? void 0 : _b2.toString()) || "");
|
|
1196
2491
|
const contextLines = [
|
|
1197
2492
|
`URL: ${location.href}`,
|
|
1198
2493
|
`Title: ${document.title || "Untitled"}`
|
|
@@ -1209,7 +2504,7 @@
|
|
|
1209
2504
|
return contextLines.join("\n");
|
|
1210
2505
|
}
|
|
1211
2506
|
async askPageQuestion() {
|
|
1212
|
-
var
|
|
2507
|
+
var _a2;
|
|
1213
2508
|
if (this.sending || !this.inputEl) return;
|
|
1214
2509
|
const prompt = this.normalizeText(this.inputEl.value);
|
|
1215
2510
|
if (!prompt) return;
|
|
@@ -1225,7 +2520,7 @@
|
|
|
1225
2520
|
this.inputEl.style.height = "auto";
|
|
1226
2521
|
this.appendMessage("user", prompt);
|
|
1227
2522
|
const systemContext = this.buildPageContext();
|
|
1228
|
-
const model = ((
|
|
2523
|
+
const model = ((_a2 = this.modelEl) == null ? void 0 : _a2.value) || "gpt-4o";
|
|
1229
2524
|
const requestMessages = [
|
|
1230
2525
|
{
|
|
1231
2526
|
role: "system",
|
|
@@ -1265,6 +2560,230 @@
|
|
|
1265
2560
|
}
|
|
1266
2561
|
};
|
|
1267
2562
|
var pageOverlay = new HanzoPageOverlay();
|
|
2563
|
+
var elementPicker = /* @__PURE__ */ (() => {
|
|
2564
|
+
let active = false;
|
|
2565
|
+
let overlay = null;
|
|
2566
|
+
let label = null;
|
|
2567
|
+
let hoveredEl = null;
|
|
2568
|
+
function getSelector(el) {
|
|
2569
|
+
if (el.id) return `#${el.id}`;
|
|
2570
|
+
const tag = el.tagName.toLowerCase();
|
|
2571
|
+
const classes = Array.from(el.classList).filter((c) => !c.startsWith("hanzo-")).slice(0, 3);
|
|
2572
|
+
let selector = tag;
|
|
2573
|
+
if (classes.length) selector += `.${classes.join(".")}`;
|
|
2574
|
+
const matches = document.querySelectorAll(selector);
|
|
2575
|
+
if (matches.length > 1) {
|
|
2576
|
+
const parent = el.parentElement;
|
|
2577
|
+
if (parent) {
|
|
2578
|
+
const idx = Array.from(parent.children).indexOf(el) + 1;
|
|
2579
|
+
selector += `:nth-child(${idx})`;
|
|
2580
|
+
}
|
|
2581
|
+
}
|
|
2582
|
+
return selector;
|
|
2583
|
+
}
|
|
2584
|
+
function getFullPath(el) {
|
|
2585
|
+
const parts = [];
|
|
2586
|
+
let cur = el;
|
|
2587
|
+
while (cur && cur !== document.documentElement) {
|
|
2588
|
+
parts.unshift(getSelector(cur));
|
|
2589
|
+
cur = cur.parentElement;
|
|
2590
|
+
}
|
|
2591
|
+
return parts.join(" > ");
|
|
2592
|
+
}
|
|
2593
|
+
function ensureOverlay() {
|
|
2594
|
+
if (overlay) return;
|
|
2595
|
+
overlay = document.createElement("div");
|
|
2596
|
+
overlay.id = "hanzo-picker-overlay";
|
|
2597
|
+
overlay.style.cssText = "position:fixed;pointer-events:none;z-index:2147483646;border:2px solid #fff;border-radius:3px;background:rgba(255,255,255,0.06);transition:all 0.1s ease;display:none;";
|
|
2598
|
+
label = document.createElement("div");
|
|
2599
|
+
label.id = "hanzo-picker-label";
|
|
2600
|
+
label.style.cssText = "position:fixed;z-index:2147483647;pointer-events:none;background:#000;color:#fff;font:11px/1.4 Geist Mono,Menlo,monospace;padding:3px 8px;border-radius:4px;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:none;box-shadow:0 2px 8px rgba(0,0,0,0.4);";
|
|
2601
|
+
document.body.appendChild(overlay);
|
|
2602
|
+
document.body.appendChild(label);
|
|
2603
|
+
}
|
|
2604
|
+
function onMove(e) {
|
|
2605
|
+
var _a2;
|
|
2606
|
+
if (!active) return;
|
|
2607
|
+
const target = e.target;
|
|
2608
|
+
if (!target || target === overlay || target === label) return;
|
|
2609
|
+
if ((_a2 = target.id) == null ? void 0 : _a2.startsWith("hanzo-picker")) return;
|
|
2610
|
+
hoveredEl = target;
|
|
2611
|
+
const rect = target.getBoundingClientRect();
|
|
2612
|
+
if (overlay) {
|
|
2613
|
+
overlay.style.display = "block";
|
|
2614
|
+
overlay.style.top = rect.top + "px";
|
|
2615
|
+
overlay.style.left = rect.left + "px";
|
|
2616
|
+
overlay.style.width = rect.width + "px";
|
|
2617
|
+
overlay.style.height = rect.height + "px";
|
|
2618
|
+
}
|
|
2619
|
+
if (label) {
|
|
2620
|
+
label.style.display = "block";
|
|
2621
|
+
label.textContent = getSelector(target);
|
|
2622
|
+
const labelTop = rect.top - 28;
|
|
2623
|
+
label.style.top = (labelTop > 0 ? labelTop : rect.bottom + 4) + "px";
|
|
2624
|
+
label.style.left = rect.left + "px";
|
|
2625
|
+
}
|
|
2626
|
+
}
|
|
2627
|
+
function onClick(e) {
|
|
2628
|
+
if (!active) return;
|
|
2629
|
+
e.preventDefault();
|
|
2630
|
+
e.stopPropagation();
|
|
2631
|
+
e.stopImmediatePropagation();
|
|
2632
|
+
const el = hoveredEl || e.target;
|
|
2633
|
+
if (!el) return;
|
|
2634
|
+
const selector = getSelector(el);
|
|
2635
|
+
const fullPath = getFullPath(el);
|
|
2636
|
+
const tag = el.tagName.toLowerCase();
|
|
2637
|
+
const text = (el.textContent || "").trim().slice(0, 80);
|
|
2638
|
+
const rect = el.getBoundingClientRect();
|
|
2639
|
+
const info = [
|
|
2640
|
+
`Selector: ${selector}`,
|
|
2641
|
+
`Path: ${fullPath}`,
|
|
2642
|
+
`Tag: ${tag}`,
|
|
2643
|
+
`Size: ${Math.round(rect.width)}x${Math.round(rect.height)}`,
|
|
2644
|
+
el.id ? `ID: ${el.id}` : "",
|
|
2645
|
+
el.className ? `Classes: ${el.className}` : "",
|
|
2646
|
+
text ? `Text: "${text}"` : ""
|
|
2647
|
+
].filter(Boolean).join("\n");
|
|
2648
|
+
navigator.clipboard.writeText(info).catch(() => {
|
|
2649
|
+
});
|
|
2650
|
+
chrome.runtime.sendMessage({ action: "elementSelected", data: { selector, fullPath, tag, text, rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height } } });
|
|
2651
|
+
stop();
|
|
2652
|
+
}
|
|
2653
|
+
function onKey(e) {
|
|
2654
|
+
if (e.key === "Escape") {
|
|
2655
|
+
e.preventDefault();
|
|
2656
|
+
stop();
|
|
2657
|
+
}
|
|
2658
|
+
}
|
|
2659
|
+
function start() {
|
|
2660
|
+
if (active) return;
|
|
2661
|
+
active = true;
|
|
2662
|
+
ensureOverlay();
|
|
2663
|
+
document.addEventListener("mousemove", onMove, true);
|
|
2664
|
+
document.addEventListener("click", onClick, true);
|
|
2665
|
+
document.addEventListener("keydown", onKey, true);
|
|
2666
|
+
document.body.style.cursor = "crosshair";
|
|
2667
|
+
}
|
|
2668
|
+
function stop() {
|
|
2669
|
+
active = false;
|
|
2670
|
+
document.removeEventListener("mousemove", onMove, true);
|
|
2671
|
+
document.removeEventListener("click", onClick, true);
|
|
2672
|
+
document.removeEventListener("keydown", onKey, true);
|
|
2673
|
+
document.body.style.cursor = "";
|
|
2674
|
+
if (overlay) overlay.style.display = "none";
|
|
2675
|
+
if (label) label.style.display = "none";
|
|
2676
|
+
hoveredEl = null;
|
|
2677
|
+
}
|
|
2678
|
+
return { start, stop };
|
|
2679
|
+
})();
|
|
2680
|
+
function gatherPageInfo() {
|
|
2681
|
+
const meta = (name) => {
|
|
2682
|
+
var _a2;
|
|
2683
|
+
return ((_a2 = document.querySelector(`meta[name="${name}"], meta[property="${name}"]`)) == null ? void 0 : _a2.getAttribute("content")) || "";
|
|
2684
|
+
};
|
|
2685
|
+
const lines = [
|
|
2686
|
+
`Title: ${document.title}`,
|
|
2687
|
+
`URL: ${location.href}`,
|
|
2688
|
+
`Description: ${meta("description") || meta("og:description")}`,
|
|
2689
|
+
`Charset: ${document.characterSet}`,
|
|
2690
|
+
`Language: ${document.documentElement.lang || "unknown"}`,
|
|
2691
|
+
`Viewport: ${meta("viewport")}`
|
|
2692
|
+
];
|
|
2693
|
+
const frameworks = [];
|
|
2694
|
+
if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) frameworks.push("React");
|
|
2695
|
+
if (window.__VUE_DEVTOOLS_GLOBAL_HOOK__) frameworks.push("Vue");
|
|
2696
|
+
if (window.__svelte) frameworks.push("Svelte");
|
|
2697
|
+
if (window.__NEXT_DATA__) frameworks.push("Next.js");
|
|
2698
|
+
if (window.__NUXT__) frameworks.push("Nuxt");
|
|
2699
|
+
if (document.querySelector("[ng-version]")) frameworks.push("Angular");
|
|
2700
|
+
if (frameworks.length) lines.push(`Frameworks: ${frameworks.join(", ")}`);
|
|
2701
|
+
const scripts = document.querySelectorAll("script[src]").length;
|
|
2702
|
+
const styles = document.querySelectorAll('link[rel="stylesheet"]').length;
|
|
2703
|
+
const images = document.querySelectorAll("img").length;
|
|
2704
|
+
const links = document.querySelectorAll("a[href]").length;
|
|
2705
|
+
lines.push(`Resources: ${scripts} scripts, ${styles} stylesheets, ${images} images, ${links} links`);
|
|
2706
|
+
const perf = performance.getEntriesByType("navigation")[0];
|
|
2707
|
+
if (perf) {
|
|
2708
|
+
lines.push(`Load: ${Math.round(perf.loadEventEnd - perf.startTime)}ms (DOM: ${Math.round(perf.domContentLoadedEventEnd - perf.startTime)}ms)`);
|
|
2709
|
+
}
|
|
2710
|
+
return lines.filter((l) => !l.endsWith(": ")).join("\n");
|
|
2711
|
+
}
|
|
2712
|
+
var inlineConsole = /* @__PURE__ */ (() => {
|
|
2713
|
+
let root = null;
|
|
2714
|
+
let input = null;
|
|
2715
|
+
let output = null;
|
|
2716
|
+
let visible = false;
|
|
2717
|
+
function ensureMount() {
|
|
2718
|
+
if (root) return;
|
|
2719
|
+
root = document.createElement("div");
|
|
2720
|
+
root.id = "hanzo-console-root";
|
|
2721
|
+
root.style.cssText = "position:fixed;bottom:20px;left:20px;right:20px;z-index:2147483646;font-family:Geist Mono,Menlo,Consolas,monospace;font-size:12px;display:none;";
|
|
2722
|
+
root.innerHTML = `
|
|
2723
|
+
<div style="background:rgba(0,0,0,0.92);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:10px;overflow:hidden;box-shadow:0 8px 32px rgba(0,0,0,0.5);">
|
|
2724
|
+
<div id="hanzo-console-output" style="max-height:200px;overflow-y:auto;padding:8px 12px;color:#ccc;white-space:pre-wrap;word-break:break-all;"></div>
|
|
2725
|
+
<div style="display:flex;align-items:center;border-top:1px solid rgba(255,255,255,0.1);padding:0 12px;">
|
|
2726
|
+
<span style="color:#666;margin-right:6px;">></span>
|
|
2727
|
+
<input id="hanzo-console-input" type="text" placeholder="eval(...)" style="flex:1;background:transparent;border:none;color:#fff;font:inherit;padding:10px 0;outline:none;">
|
|
2728
|
+
<span style="color:#444;font-size:10px;margin-left:8px;">Esc to close</span>
|
|
2729
|
+
</div>
|
|
2730
|
+
</div>
|
|
2731
|
+
`;
|
|
2732
|
+
document.body.appendChild(root);
|
|
2733
|
+
input = root.querySelector("#hanzo-console-input");
|
|
2734
|
+
output = root.querySelector("#hanzo-console-output");
|
|
2735
|
+
input == null ? void 0 : input.addEventListener("keydown", (e) => {
|
|
2736
|
+
if (e.key === "Escape") {
|
|
2737
|
+
hide();
|
|
2738
|
+
return;
|
|
2739
|
+
}
|
|
2740
|
+
if (e.key !== "Enter" || !(input == null ? void 0 : input.value.trim())) return;
|
|
2741
|
+
const expr = input.value.trim();
|
|
2742
|
+
input.value = "";
|
|
2743
|
+
appendLine(`> ${expr}`, "#888");
|
|
2744
|
+
try {
|
|
2745
|
+
const result = (0, eval)(expr);
|
|
2746
|
+
appendLine(String(result), "#4CAF50");
|
|
2747
|
+
} catch (err) {
|
|
2748
|
+
appendLine((err == null ? void 0 : err.message) || String(err), "#F44336");
|
|
2749
|
+
}
|
|
2750
|
+
});
|
|
2751
|
+
}
|
|
2752
|
+
function appendLine(text, color) {
|
|
2753
|
+
if (!output) return;
|
|
2754
|
+
const line = document.createElement("div");
|
|
2755
|
+
line.style.color = color;
|
|
2756
|
+
line.textContent = text;
|
|
2757
|
+
output.appendChild(line);
|
|
2758
|
+
output.scrollTop = output.scrollHeight;
|
|
2759
|
+
}
|
|
2760
|
+
function show() {
|
|
2761
|
+
ensureMount();
|
|
2762
|
+
if (root) root.style.display = "block";
|
|
2763
|
+
visible = true;
|
|
2764
|
+
setTimeout(() => input == null ? void 0 : input.focus(), 50);
|
|
2765
|
+
}
|
|
2766
|
+
function hide() {
|
|
2767
|
+
if (root) root.style.display = "none";
|
|
2768
|
+
visible = false;
|
|
2769
|
+
}
|
|
2770
|
+
return { show, hide, isVisible: () => visible };
|
|
2771
|
+
})();
|
|
1268
2772
|
new HanzoContentScript();
|
|
2773
|
+
var _a, _b, _c, _d, _e, _f;
|
|
2774
|
+
try {
|
|
2775
|
+
const port = ((_b = (_a = browser == null ? void 0 : browser.runtime) == null ? void 0 : _a.connect) == null ? void 0 : _b.call(_a, { name: "zap-keepalive" })) || ((_d = (_c = chrome == null ? void 0 : chrome.runtime) == null ? void 0 : _c.connect) == null ? void 0 : _d.call(_c, { name: "zap-keepalive" }));
|
|
2776
|
+
if (port) {
|
|
2777
|
+
const tick = setInterval(() => {
|
|
2778
|
+
try {
|
|
2779
|
+
port.postMessage({ type: "ping", t: Date.now() });
|
|
2780
|
+
} catch {
|
|
2781
|
+
clearInterval(tick);
|
|
2782
|
+
}
|
|
2783
|
+
}, 1e4);
|
|
2784
|
+
(_f = (_e = port.onDisconnect) == null ? void 0 : _e.addListener) == null ? void 0 : _f.call(_e, () => clearInterval(tick));
|
|
2785
|
+
}
|
|
2786
|
+
} catch {
|
|
2787
|
+
}
|
|
1269
2788
|
})();
|
|
1270
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnRlbnQtc2NyaXB0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBIYW56byBCcm93c2VyIEV4dGVuc2lvbiAtIENvbnRlbnQgU2NyaXB0XG4vLyBDb25uZWN0cyBjbGlja2VkIGVsZW1lbnRzIHRvIHNvdXJjZSBjb2RlIHZpYSBzb3VyY2UtbWFwc1xuXG5pbnRlcmZhY2UgU291cmNlTG9jYXRpb24ge1xuICBmaWxlOiBzdHJpbmc7XG4gIGxpbmU6IG51bWJlcjtcbiAgY29sdW1uPzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRWxlbWVudFNlbGVjdGVkRXZlbnQge1xuICBldmVudDogJ2VsZW1lbnRTZWxlY3RlZCc7XG4gIGZyYW1ld29yazogc3RyaW5nIHwgbnVsbDtcbiAgZG9tUGF0aDogc3RyaW5nO1xuICBzb3VyY2U/OiBTb3VyY2VMb2NhdGlvbjtcbiAgZmFsbGJhY2tJZD86IHN0cmluZztcbn1cblxuY2xhc3MgSGFuem9Db250ZW50U2NyaXB0IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXR1cENsaWNrSGFuZGxlcigpO1xuICAgIHRoaXMuaW5qZWN0SGVscGVycygpO1xuICAgIHRoaXMuc2V0dXBNZXNzYWdlSGFuZGxlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDbGlja0hhbmRsZXIoKSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgaWYgKCFlLmFsdEtleSkgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCBlbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmV4dHJhY3RTb3VyY2VMb2NhdGlvbihlbGVtZW50KTtcbiAgICAgIGNvbnN0IGRvbVBhdGggPSB0aGlzLmdldERPTVBhdGgoZWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IGV2ZW50OiBFbGVtZW50U2VsZWN0ZWRFdmVudCA9IHtcbiAgICAgICAgZXZlbnQ6ICdlbGVtZW50U2VsZWN0ZWQnLFxuICAgICAgICBmcmFtZXdvcms6IHRoaXMuZGV0ZWN0RnJhbWV3b3JrKCksXG4gICAgICAgIGRvbVBhdGgsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgZmFsbGJhY2tJZDogZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuem8taWQnKSB8fCB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGJhY2tncm91bmQgc2NyaXB0ICh3b3JrcyB3aXRoIGJvdGggWkFQIGFuZCBsZWdhY3kgTUNQKVxuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdlbGVtZW50U2VsZWN0ZWQnLCBkYXRhOiBldmVudCB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBNZXNzYWdlSGFuZGxlcnMoKSB7XG4gICAgY2hyb21lLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKChyZXF1ZXN0LCBfc2VuZGVyLCBzZW5kUmVzcG9uc2UpID0+IHtcbiAgICAgIHN3aXRjaCAocmVxdWVzdC5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5zdGFydCc6XG4gICAgICAgICAgYWlPdmVybGF5LnNob3cocmVxdWVzdC50YXNrIHx8ICdBSSBpcyBjb250cm9sbGluZyB0aGlzIHBhZ2UnKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdhaS5jb250cm9sLnN0b3AnOlxuICAgICAgICAgIGFpT3ZlcmxheS5oaWRlKCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5jdXJzb3InOlxuICAgICAgICAgIGFpT3ZlcmxheS5tb3ZlQ3Vyc29yKHJlcXVlc3QueCwgcmVxdWVzdC55KTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdhaS5jb250cm9sLmhpZ2hsaWdodCc6XG4gICAgICAgICAgYWlPdmVybGF5LmhpZ2hsaWdodChyZXF1ZXN0LnNlbGVjdG9yKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdhaS5jb250cm9sLnN0YXR1cyc6XG4gICAgICAgICAgYWlPdmVybGF5LnVwZGF0ZVN0YXR1cyhyZXF1ZXN0LnRleHQpO1xuICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ3BhZ2Uub3ZlcmxheS50b2dnbGUnOlxuICAgICAgICAgIHNlbmRSZXNwb25zZSh7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgb3BlbjogcGFnZU92ZXJsYXkudG9nZ2xlKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ3BhZ2Uub3ZlcmxheS5zaG93JzpcbiAgICAgICAgICBwYWdlT3ZlcmxheS5zaG93KCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgb3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LmhpZGUnOlxuICAgICAgICAgIHBhZ2VPdmVybGF5LmhpZGUoKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCBvcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnN0YXR1cyc6XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgb3BlbjogcGFnZU92ZXJsYXkuaXNPcGVuKCkgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRhYiBmaWxlc3lzdGVtIHN1cHBvcnRcbiAgICAgIGlmIChyZXF1ZXN0LmFjdGlvbiA9PT0gJ2dldENvbnRlbnQnKSB7XG4gICAgICAgIHNlbmRSZXNwb25zZSh7IGNvbnRlbnQ6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8ub3V0ZXJIVE1MIHx8ICcnIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVlc3QuYWN0aW9uID09PSAnc2V0Q29udGVudCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZG9jdW1lbnQub3BlbigpO1xuICAgICAgICAgIGRvY3VtZW50LndyaXRlKHJlcXVlc3QuY29udGVudCk7XG4gICAgICAgICAgZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0U291cmNlTG9jYXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQpOiBTb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZnJhbWV3b3JrID0gdGhpcy5kZXRlY3RGcmFtZXdvcmsoKTtcblxuICAgIHN3aXRjaCAoZnJhbWV3b3JrKSB7XG4gICAgICBjYXNlICdyZWFjdCc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RSZWFjdFNvdXJjZShlbGVtZW50KTtcbiAgICAgIGNhc2UgJ3Z1ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RWdWVTb3VyY2UoZWxlbWVudCk7XG4gICAgICBjYXNlICdzdmVsdGUnOlxuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0U3ZlbHRlU291cmNlKGVsZW1lbnQpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RSZWFjdFNvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBob29rID0gKHdpbmRvdyBhcyBhbnkpLl9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcbiAgICBpZiAoIWhvb2spIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBmaWJlciA9IHRoaXMuZmluZFJlYWN0RmliZXIoZWxlbWVudCk7XG4gICAgaWYgKCFmaWJlcikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNvdXJjZSA9IGZpYmVyLl9kZWJ1Z1NvdXJjZSB8fCBmaWJlci5wZW5kaW5nUHJvcHM/Ll9fc291cmNlIHx8IGZpYmVyLm1lbW9pemVkUHJvcHM/Ll9fc291cmNlO1xuXG4gICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UuZmlsZU5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpbGU6IHNvdXJjZS5maWxlTmFtZSxcbiAgICAgICAgbGluZTogc291cmNlLmxpbmVOdW1iZXIsXG4gICAgICAgIGNvbHVtbjogc291cmNlLmNvbHVtbk51bWJlcixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFJlYWN0RmliZXIoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBhbnkge1xuICAgIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKGVsZW1lbnQpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuc3RhcnRzV2l0aCgnX19yZWFjdEludGVybmFsSW5zdGFuY2UkJykgfHwgY2FuZGlkYXRlLnN0YXJ0c1dpdGgoJ19fcmVhY3RGaWJlciQnKSxcbiAgICApO1xuICAgIHJldHVybiBrZXkgPyAoZWxlbWVudCBhcyBhbnkpW2tleV0gOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0VnVlU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhvb2sgPSAod2luZG93IGFzIGFueSkuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcbiAgICBpZiAoIWhvb2spIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBsZXQgaW5zdGFuY2UgPSAoZWxlbWVudCBhcyBhbnkpLl9fdnVlUGFyZW50Q29tcG9uZW50O1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlID0gKGVsZW1lbnQgYXMgYW55KS5fX3Z1ZV9fO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZT8udHlwZT8uX19maWxlKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbjogU291cmNlTG9jYXRpb24gPSB7XG4gICAgICAgIGZpbGU6IGluc3RhbmNlLnR5cGUuX19maWxlLFxuICAgICAgICBsaW5lOiAxLFxuICAgICAgfTtcblxuICAgICAgaWYgKGluc3RhbmNlLnZub2RlPy5sb2MpIHtcbiAgICAgICAgbG9jYXRpb24ubGluZSA9IGluc3RhbmNlLnZub2RlLmxvYy5zdGFydC5saW5lO1xuICAgICAgICBsb2NhdGlvbi5jb2x1bW4gPSBpbnN0YW5jZS52bm9kZS5sb2Muc3RhcnQuY29sdW1uO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFN2ZWx0ZVNvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSAoZWxlbWVudCBhcyBhbnkpLl9fc3ZlbHRlX2NvbXBvbmVudDtcbiAgICBpZiAoY29tcG9uZW50Py4kJD8uY3R4Py4kJF9sb2NhdGlvbikge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudC4kJC5jdHguJCRfbG9jYXRpb247XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdEZyYW1ld29yaygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXykgcmV0dXJuICdyZWFjdCc7XG4gICAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fKSByZXR1cm4gJ3Z1ZSc7XG4gICAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX3N2ZWx0ZSkgcmV0dXJuICdzdmVsdGUnO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRET01QYXRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXRoOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgbGV0IHNlbGVjdG9yID0gY3VycmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIGlmIChjdXJyZW50LmlkKSB7XG4gICAgICAgIHNlbGVjdG9yICs9IGAjJHtjdXJyZW50LmlkfWA7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQuY2xhc3NOYW1lKSB7XG4gICAgICAgIHNlbGVjdG9yICs9IGAuJHtjdXJyZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpLmpvaW4oJy4nKX1gO1xuICAgICAgfVxuXG4gICAgICBwYXRoLnVuc2hpZnQoc2VsZWN0b3IpO1xuICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5qb2luKCcgPiAnKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0SGVscGVycygpIHtcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgICBbZGF0YS1oYW56by1ob3Zlcl0ge1xuICAgICAgICBvdXRsaW5lOiAycHggZGFzaGVkICNmZjZiNmIgIWltcG9ydGFudDtcbiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDJweCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIGA7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZSkgPT4ge1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtaGFuem8taG92ZXJdJykuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhhbnpvLWhvdmVyJyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGUuYWx0S2V5ICYmIGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgZS50YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLWhvdmVyJywgJ3RydWUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQUkgQ29udHJvbCBPdmVybGF5IFx1MjAxNCB0YWtlb3ZlciB2aXN1YWwgZmVlZGJhY2sgKyB1c2VyIGludGVyYWN0aW9uIGxvY2tcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IGFpT3ZlcmxheSA9ICgoKSA9PiB7XG4gIGxldCBvdmVybGF5OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgY3Vyc29yOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgc3RhdHVzRWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBjYW5jZWxCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBoaWdobGlnaHRFbDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IHRyYWlsTm9kZXM6IEhUTUxEaXZFbGVtZW50W10gPSBbXTtcbiAgbGV0IGludGVyYWN0aW9uQmxvY2tBY3RpdmUgPSBmYWxzZTtcblxuICBjb25zdCBPVkVSTEFZX0lEID0gJ2hhbnpvLWFpLW92ZXJsYXknO1xuICBjb25zdCBTVFlMRVNfSUQgPSAnaGFuem8tYWktb3ZlcmxheS1zdHlsZXMnO1xuICBjb25zdCBCTE9DS0VEX0VWRU5UUyA9IFtcbiAgICAnY2xpY2snLCAnZGJsY2xpY2snLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnY29udGV4dG1lbnUnLFxuICAgICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnLCAnd2hlZWwnLFxuICAgICdrZXlkb3duJywgJ2tleXVwJywgJ2tleXByZXNzJyxcbiAgXTtcblxuICBmdW5jdGlvbiBpbmplY3RTdHlsZXMoKSB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFNUWUxFU19JRCkpIHJldHVybjtcblxuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9IFNUWUxFU19JRDtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIC8qIC0tLS0gT3ZlcmxheSBiYWNrZHJvcCAtLS0tICovXG4gICAgICAjJHtPVkVSTEFZX0lEfSB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgaW5zZXQ6IDA7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDY7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7XG4gICAgICAgIGJhY2tncm91bmQ6XG4gICAgICAgICAgcmFkaWFsLWdyYWRpZW50KDkwdncgOTB2aCBhdCAxNSUgOCUsIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjEwKSwgdHJhbnNwYXJlbnQgNTUlKSxcbiAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoNjV2dyA2NXZoIGF0IDg0JSA4MiUsIHJnYmEoOTksIDEwMiwgMjQxLCAwLjEwKSwgdHJhbnNwYXJlbnQgNjAlKSxcbiAgICAgICAgICByZ2JhKDIsIDQsIDEwLCAwLjQyKTtcbiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEuNXB4KTtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtcyBlYXNlO1xuICAgICAgfVxuICAgICAgIyR7T1ZFUkxBWV9JRH0uaGFuem8tdmlzaWJsZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIC0tLS0gUHVsc2luZyBjeWFuIGdsb3cgY3Vyc29yIC0tLS0gKi9cbiAgICAgIC5oYW56by1haS1jdXJzb3Ige1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDc7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoNiwgMTgyLCAyMTIsIDAuOTUpO1xuICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgIDAgMCA4cHggMnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuNDUpLFxuICAgICAgICAgIDAgMCAyNHB4IDZweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjE4KTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xOHMgZWFzZS1vdXQsIHRvcCAwLjE4cyBlYXNlLW91dDtcbiAgICAgICAgYW5pbWF0aW9uOiBoYW56by1jdXJzb3ItcHVsc2UgMS42cyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1jdXJzb3IuaGFuem8tdmlzaWJsZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xOHMgZWFzZS1vdXQsIHRvcCAwLjE4cyBlYXNlLW91dCwgb3BhY2l0eSAzMDBtcyBlYXNlO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1jdXJzb3ItcHVsc2Uge1xuICAgICAgICAwJSwgMTAwJSB7XG4gICAgICAgICAgYm94LXNoYWRvdzpcbiAgICAgICAgICAgIDAgMCA4cHggMnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuNDUpLFxuICAgICAgICAgICAgMCAwIDI0cHggNnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuMTgpO1xuICAgICAgICB9XG4gICAgICAgIDUwJSB7XG4gICAgICAgICAgYm94LXNoYWRvdzpcbiAgICAgICAgICAgIDAgMCAxNHB4IDRweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjY1KSxcbiAgICAgICAgICAgIDAgMCAzNnB4IDEwcHggcmdiYSg2LCAxODIsIDIxMiwgMC4yOCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogLS0tLSBDdXJzb3IgdHJhaWwgLS0tLSAqL1xuICAgICAgLmhhbnpvLWN1cnNvci10cmFpbCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgd2lkdGg6IDZweDtcbiAgICAgICAgaGVpZ2h0OiA2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg2LCAxODIsIDIxMiwgMC43KTtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLXRyYWlsLWZhZGUgMC40cyBlYXNlLW91dCBmb3J3YXJkcztcbiAgICAgIH1cbiAgICAgIEBrZXlmcmFtZXMgaGFuem8tdHJhaWwtZmFkZSB7XG4gICAgICAgIGZyb20geyBvcGFjaXR5OiAwLjc7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHNjYWxlKDEpOyB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMC4xNSk7IH1cbiAgICAgIH1cblxuICAgICAgLyogLS0tLSBTdGF0dXMgYmFubmVyICh0b3AgY2VudGVyIHBpbGwpIC0tLS0gKi9cbiAgICAgIC5oYW56by1haS1zdGF0dXMge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMTZweDtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDc7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogMTBweDtcbiAgICAgICAgbWF4LXdpZHRoOiA5MHZ3O1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDE0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoOCwgMTIsIDIwLCAwLjk0KSwgcmdiYSgxMCwgMTYsIDI0LCAwLjk2KSk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjI2KTtcbiAgICAgICAgY29sb3I6ICNmM2Y0ZjY7XG4gICAgICAgIGZvbnQ6IDEzcHgvMS40IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjtcbiAgICAgICAgYm94LXNoYWRvdzpcbiAgICAgICAgICAwIDEwcHggMzZweCByZ2JhKDAsIDAsIDAsIDAuNDYpLFxuICAgICAgICAgIGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtcyBlYXNlO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLXN0YXR1czo6YmVmb3JlIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgaW5zZXQ6IC0ycHggYXV0byAtMnB4IC0yMCU7XG4gICAgICAgIHdpZHRoOiA0MCU7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNiksIHRyYW5zcGFyZW50KTtcbiAgICAgICAgdHJhbnNmb3JtOiBza2V3WCgtMThkZWcpO1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLXN0YXR1cy1zaGVlbiAzLjZzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cbiAgICAgIEBrZXlmcmFtZXMgaGFuem8tc3RhdHVzLXNoZWVuIHtcbiAgICAgICAgMCUsIDY4JSB7IGxlZnQ6IC0zMCU7IG9wYWNpdHk6IDA7IH1cbiAgICAgICAgNzIlIHsgb3BhY2l0eTogMC40OyB9XG4gICAgICAgIDEwMCUgeyBsZWZ0OiAxMzAlOyBvcGFjaXR5OiAwOyB9XG4gICAgICB9XG4gICAgICAuaGFuem8tYWktc3RhdHVzID4gKiB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1zdGF0dXMuaGFuem8tdmlzaWJsZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLWJyYW5kLWJ1YmJsZSB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICBtaW4td2lkdGg6IDMwcHg7XG4gICAgICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMjVweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgY29sb3I6ICNlMGYyZmU7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTQsIDExNiwgMTQ0LCAwLjk1KSwgcmdiYSgxNSwgMjMsIDQyLCAwLjk1KSk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjM1KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tcHVsc2UtZG90IHtcbiAgICAgICAgd2lkdGg6IDhweDtcbiAgICAgICAgaGVpZ2h0OiA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgICAgYmFja2dyb3VuZDogIzA2YjZkNDtcbiAgICAgICAgYW5pbWF0aW9uOiBoYW56by1kb3QtcHVsc2UgMS40cyBlYXNlLWluLW91dCBpbmZpbml0ZTtcbiAgICAgIH1cbiAgICAgIEBrZXlmcmFtZXMgaGFuem8tZG90LXB1bHNlIHtcbiAgICAgICAgMCUsIDEwMCUgeyBvcGFjaXR5OiAxOyB9XG4gICAgICAgIDUwJSB7IG9wYWNpdHk6IDAuNDsgfVxuICAgICAgfVxuXG4gICAgICAuaGFuem8tYWktc3RhdHVzIC5oYW56by1sYWJlbCB7XG4gICAgICAgIG1heC13aWR0aDogNDZ2dztcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLWRvdHM6OmFmdGVyIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIGFuaW1hdGlvbjogaGFuem8tYW5pbWF0ZWQtZG90cyAxLjVzIHN0ZXBzKDQpIGluZmluaXRlO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1hbmltYXRlZC1kb3RzIHtcbiAgICAgICAgMCUgeyBjb250ZW50OiAnJzsgfVxuICAgICAgICAyNSUgeyBjb250ZW50OiAnLic7IH1cbiAgICAgICAgNTAlIHsgY29udGVudDogJy4uJzsgfVxuICAgICAgICA3NSUgeyBjb250ZW50OiAnLi4uJzsgfVxuICAgICAgfVxuXG4gICAgICAuaGFuem8tYWktc3RhdHVzIC5oYW56by1zdG9wLWJ0biB7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yNCk7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4xOCk7XG4gICAgICAgIGNvbG9yOiAjZjhmYWZjO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBwYWRkaW5nOiA0cHggMTJweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMsIGJvcmRlci1jb2xvciAwLjE1cztcbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLXN0b3AtYnRuOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMjAsIDM4LCAzOCwgMC4yOCk7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNDgsIDExMywgMTEzLCAwLjYpO1xuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIFwiVGFrZSBCYWNrIENvbnRyb2xcIiBidXR0b24gKGJvdHRvbS1yaWdodCkgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLWNhbmNlbCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgYm90dG9tOiAyNHB4O1xuICAgICAgICByaWdodDogMjRweDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgcGFkZGluZzogMTJweCAyNHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTUsIDE4LCAyNCwgMC45NSk7XG4gICAgICAgIGNvbG9yOiAjZjNmNGY2O1xuICAgICAgICBmb250OiA2MDAgMTRweC8xLjQgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgOHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjQpO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtcyBlYXNlLCBiYWNrZ3JvdW5kIDAuMTVzO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLWNhbmNlbC5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1jYW5jZWw6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgMzgsIDM4LCAwLjM1KTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyMCwgMzgsIDM4LCAwLjUpO1xuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIEVsZW1lbnQgaGlnaGxpZ2h0IC0tLS0gKi9cbiAgICAgIC5oYW56by1haS1oaWdobGlnaHQge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDc7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDYsIDE4MiwgMjEyLCAwLjg1KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggcmdiYSg2LCAxODIsIDIxMiwgMC4xNSk7XG4gICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xNXMsIHRvcCAwLjE1cywgd2lkdGggMC4xNXMsIGhlaWdodCAwLjE1cztcbiAgICAgIH1cbiAgICBgO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPdmVybGF5RWxlbWVudCh0YXJnZXQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhKFxuICAgICAgb3ZlcmxheT8uY29udGFpbnModGFyZ2V0KSB8fFxuICAgICAgc3RhdHVzRWw/LmNvbnRhaW5zKHRhcmdldCkgfHxcbiAgICAgIGNhbmNlbEJ0bj8uY29udGFpbnModGFyZ2V0KSB8fFxuICAgICAgY3Vyc29yPy5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICBoaWdobGlnaHRFbD8uY29udGFpbnModGFyZ2V0KVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBibG9ja0ludGVyYWN0aW9uKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghaW50ZXJhY3Rpb25CbG9ja0FjdGl2ZSkgcmV0dXJuO1xuXG4gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCAmJiBldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2FpLmNvbnRyb2wuY2FuY2VsJyB9KTtcbiAgICAgIGhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPdmVybGF5RWxlbWVudChldmVudC50YXJnZXQpKSByZXR1cm47XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0SW50ZXJhY3Rpb25CbG9jayhhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoaW50ZXJhY3Rpb25CbG9ja0FjdGl2ZSA9PT0gYWN0aXZlKSByZXR1cm47XG5cbiAgICBpbnRlcmFjdGlvbkJsb2NrQWN0aXZlID0gYWN0aXZlO1xuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIEJMT0NLRURfRVZFTlRTKSB7XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBibG9ja0ludGVyYWN0aW9uLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBibG9ja0ludGVyYWN0aW9uLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93KHRhc2s6IHN0cmluZykge1xuICAgIGlmIChvdmVybGF5KSBoaWRlKCk7XG5cbiAgICBpbmplY3RTdHlsZXMoKTtcbiAgICBzZXRJbnRlcmFjdGlvbkJsb2NrKHRydWUpO1xuXG4gICAgLy8gQmFja2Ryb3BcbiAgICBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgb3ZlcmxheS5pZCA9IE9WRVJMQVlfSUQ7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcblxuICAgIC8vIEN1cnNvclxuICAgIGN1cnNvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGN1cnNvci5jbGFzc05hbWUgPSAnaGFuem8tYWktY3Vyc29yJztcbiAgICBjdXJzb3Iuc3R5bGUubGVmdCA9IGAke3dpbmRvdy5pbm5lcldpZHRoIC8gMn1weGA7XG4gICAgY3Vyc29yLnN0eWxlLnRvcCA9IGAke3dpbmRvdy5pbm5lckhlaWdodCAvIDJ9cHhgO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY3Vyc29yKTtcblxuICAgIC8vIFN0YXR1cyBiYW5uZXJcbiAgICBzdGF0dXNFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHN0YXR1c0VsLmNsYXNzTmFtZSA9ICdoYW56by1haS1zdGF0dXMnO1xuICAgIHN0YXR1c0VsLmlubmVySFRNTCA9IGBcbiAgICAgIDxzcGFuIGNsYXNzPVwiaGFuem8tYnJhbmQtYnViYmxlXCI+QUk8L3NwYW4+XG4gICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcHVsc2UtZG90XCI+PC9kaXY+XG4gICAgICA8c3BhbiBjbGFzcz1cImhhbnpvLWxhYmVsXCI+JHtlc2NhcGVIdG1sKHRhc2sgfHwgJ0hhbnpvIEFJIGlzIGNvbnRyb2xsaW5nIHRoaXMgdGFiJyl9PC9zcGFuPjxzcGFuIGNsYXNzPVwiaGFuem8tZG90c1wiPjwvc3Bhbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJoYW56by1zdG9wLWJ0blwiPlN0b3A8L2J1dHRvbj5cbiAgICBgO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3RhdHVzRWwpO1xuXG4gICAgc3RhdHVzRWwucXVlcnlTZWxlY3RvcignLmhhbnpvLXN0b3AtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhaS5jb250cm9sLmNhbmNlbCcgfSk7XG4gICAgICBoaWRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyBcIlRha2UgQmFjayBDb250cm9sXCIgYnV0dG9uXG4gICAgY2FuY2VsQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgY2FuY2VsQnRuLmNsYXNzTmFtZSA9ICdoYW56by1haS1jYW5jZWwnO1xuICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdUYWtlIEJhY2sgQ29udHJvbCc7XG4gICAgY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhaS5jb250cm9sLmNhbmNlbCcgfSk7XG4gICAgICBoaWRlKCk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYW5jZWxCdG4pO1xuXG4gICAgLy8gRmFkZSBpbiAobmV4dCBmcmFtZSBzbyB0aGUgdHJhbnNpdGlvbiB0cmlnZ2VycylcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgb3ZlcmxheT8uY2xhc3NMaXN0LmFkZCgnaGFuem8tdmlzaWJsZScpO1xuICAgICAgY3Vyc29yPy5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgICBzdGF0dXNFbD8uY2xhc3NMaXN0LmFkZCgnaGFuem8tdmlzaWJsZScpO1xuICAgICAgY2FuY2VsQnRuPy5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlKCkge1xuICAgIC8vIEZhZGUgb3V0XG4gICAgb3ZlcmxheT8uY2xhc3NMaXN0LnJlbW92ZSgnaGFuem8tdmlzaWJsZScpO1xuICAgIGN1cnNvcj8uY2xhc3NMaXN0LnJlbW92ZSgnaGFuem8tdmlzaWJsZScpO1xuICAgIHN0YXR1c0VsPy5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG4gICAgY2FuY2VsQnRuPy5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG5cbiAgICAvLyBSZW1vdmUgYWZ0ZXIgdHJhbnNpdGlvblxuICAgIGNvbnN0IHJlZnMgPSB7IG92ZXJsYXksIGN1cnNvciwgc3RhdHVzRWwsIGNhbmNlbEJ0biwgaGlnaGxpZ2h0RWwgfTtcbiAgICBjb25zdCB0cmFpbHMgPSBbLi4udHJhaWxOb2Rlc107XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlZnMub3ZlcmxheT8ucmVtb3ZlKCk7XG4gICAgICByZWZzLmN1cnNvcj8ucmVtb3ZlKCk7XG4gICAgICByZWZzLnN0YXR1c0VsPy5yZW1vdmUoKTtcbiAgICAgIHJlZnMuY2FuY2VsQnRuPy5yZW1vdmUoKTtcbiAgICAgIHJlZnMuaGlnaGxpZ2h0RWw/LnJlbW92ZSgpO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIHRyYWlscykge1xuICAgICAgICBub2RlLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0sIDMyMCk7XG5cbiAgICBzZXRJbnRlcmFjdGlvbkJsb2NrKGZhbHNlKTtcblxuICAgIG92ZXJsYXkgPSBudWxsO1xuICAgIGN1cnNvciA9IG51bGw7XG4gICAgc3RhdHVzRWwgPSBudWxsO1xuICAgIGNhbmNlbEJ0biA9IG51bGw7XG4gICAgaGlnaGxpZ2h0RWwgPSBudWxsO1xuICAgIHRyYWlsTm9kZXMgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVDdXJzb3IoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBpZiAoIWN1cnNvcikgcmV0dXJuO1xuXG4gICAgY29uc3QgY2xhbXBlZFggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih3aW5kb3cuaW5uZXJXaWR0aCwgTnVtYmVyLmlzRmluaXRlKHgpID8geCA6IDApKTtcbiAgICBjb25zdCBjbGFtcGVkWSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHdpbmRvdy5pbm5lckhlaWdodCwgTnVtYmVyLmlzRmluaXRlKHkpID8geSA6IDApKTtcblxuICAgIC8vIFRyYWlsIGRvdFxuICAgIGNvbnN0IHRyYWlsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdHJhaWwuY2xhc3NOYW1lID0gJ2hhbnpvLWN1cnNvci10cmFpbCc7XG4gICAgdHJhaWwuc3R5bGUubGVmdCA9IGAke2NsYW1wZWRYfXB4YDtcbiAgICB0cmFpbC5zdHlsZS50b3AgPSBgJHtjbGFtcGVkWX1weGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0cmFpbCk7XG4gICAgdHJhaWxOb2Rlcy5wdXNoKHRyYWlsKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdHJhaWwucmVtb3ZlKCk7XG4gICAgICB0cmFpbE5vZGVzID0gdHJhaWxOb2Rlcy5maWx0ZXIoKG5vZGUpID0+IG5vZGUgIT09IHRyYWlsKTtcbiAgICB9LCA0MDApO1xuXG4gICAgd2hpbGUgKHRyYWlsTm9kZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIHRyYWlsTm9kZXMuc2hpZnQoKT8ucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY3Vyc29yLnN0eWxlLmxlZnQgPSBgJHtjbGFtcGVkWH1weGA7XG4gICAgY3Vyc29yLnN0eWxlLnRvcCA9IGAke2NsYW1wZWRZfXB4YDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZ2hsaWdodChzZWxlY3Rvcjogc3RyaW5nKSB7XG4gICAgaGlnaGxpZ2h0RWw/LnJlbW92ZSgpO1xuICAgIGhpZ2hsaWdodEVsID0gbnVsbDtcblxuICAgIGlmICghc2VsZWN0b3IgfHwgdHlwZW9mIHNlbGVjdG9yICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChyZWN0LndpZHRoID09PSAwICYmIHJlY3QuaGVpZ2h0ID09PSAwKSByZXR1cm47XG5cbiAgICAgIGhpZ2hsaWdodEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBoaWdobGlnaHRFbC5jbGFzc05hbWUgPSAnaGFuem8tYWktaGlnaGxpZ2h0JztcbiAgICAgIGhpZ2hsaWdodEVsLnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCgwLCByZWN0LmxlZnQgLSA0KX1weGA7XG4gICAgICBoaWdobGlnaHRFbC5zdHlsZS50b3AgPSBgJHtNYXRoLm1heCgwLCByZWN0LnRvcCAtIDQpfXB4YDtcbiAgICAgIGhpZ2hsaWdodEVsLnN0eWxlLndpZHRoID0gYCR7cmVjdC53aWR0aCArIDh9cHhgO1xuICAgICAgaGlnaGxpZ2h0RWwuc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHQgKyA4fXB4YDtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaGlnaGxpZ2h0RWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIGludmFsaWQgc2VsZWN0b3JzLlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1cyh0ZXh0OiBzdHJpbmcpIHtcbiAgICBpZiAoIXN0YXR1c0VsKSByZXR1cm47XG5cbiAgICBjb25zdCBsYWJlbCA9IHN0YXR1c0VsLnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1sYWJlbCcpO1xuICAgIGlmIChsYWJlbCkge1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSB0ZXh0IHx8ICdIYW56byBBSSBpcyBjb250cm9sbGluZyB0aGlzIHRhYic7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICByZXR1cm4geyBzaG93LCBoaWRlLCBtb3ZlQ3Vyc29yLCBoaWdobGlnaHQsIHVwZGF0ZVN0YXR1cyB9O1xufSkoKTtcblxudHlwZSBPdmVybGF5Q2hhdFJvbGUgPSAndXNlcicgfCAnYXNzaXN0YW50JyB8ICdzeXN0ZW0nO1xuXG5pbnRlcmZhY2UgT3ZlcmxheUNoYXRNZXNzYWdlIHtcbiAgcm9sZTogT3ZlcmxheUNoYXRSb2xlO1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBPdmVybGF5RWxlbWVudENvbnRleHQge1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuICB0YWc6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBodG1sOiBzdHJpbmc7XG59XG5cbmNsYXNzIEhhbnpvUGFnZU92ZXJsYXkge1xuICBwcml2YXRlIG1vdW50ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBlbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgb3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIHNlbmRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSB3YXRjaE1vZGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBlZGl0TW9kZSA9IGZhbHNlO1xuICBwcml2YXRlIG1vZGVsc0xvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIG1lc3NhZ2VzOiBPdmVybGF5Q2hhdE1lc3NhZ2VbXSA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkQ29udGV4dDogT3ZlcmxheUVsZW1lbnRDb250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaG92ZXJlZEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRpdGluZ0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByb290OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhdW5jaGVyOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBhbmVsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1lc3NhZ2VzRWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaW5wdXRFbDogSFRNTFRleHRBcmVhRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNlbmRCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbW9kZWxFbDogSFRNTFNlbGVjdEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb250ZXh0RWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2F0Y2hCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRpdEJ0bjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0dXNFbDogSFRNTFNwYW5FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaGlnaGxpZ2h0Qm94OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5qZWN0U3R5bGVzKCk7XG4gICAgdGhpcy5tb3VudCgpO1xuICAgIHRoaXMuYmluZEdsb2JhbEV2ZW50cygpO1xuICB9XG5cbiAgdG9nZ2xlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLm9wZW4pIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRoaXMuaGlkZSgpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVNb3VudGVkKCk7XG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLWVuYWJsZWQnLCAndHJ1ZScpO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMubG9hZE1vZGVscygpO1xuICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICB9XG5cbiAgaGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLnJvb3Q/LnNldEF0dHJpYnV0ZSgnZGF0YS1vcGVuJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy51cGRhdGVTdGF0dXMoJycpO1xuICAgIHRoaXMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICB0aGlzLnNldFdhdGNoTW9kZShmYWxzZSk7XG4gICAgdGhpcy5zZXRFZGl0TW9kZShmYWxzZSk7XG4gIH1cblxuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlTW91bnRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3VudGVkKSByZXR1cm47XG4gICAgdGhpcy5tb3VudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3RTdHlsZXMoKTogdm9pZCB7XG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoYW56by1wYWdlLW92ZXJsYXktc3R5bGVzJykpIHJldHVybjtcblxuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9ICdoYW56by1wYWdlLW92ZXJsYXktc3R5bGVzJztcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgcmlnaHQ6IDIwcHg7XG4gICAgICAgIGJvdHRvbTogMjBweDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NTtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdCAqIHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIH1cblxuICAgICAgI2hhbnpvLXBhZ2Utb3ZlcmxheS1yb290W2RhdGEtZW5hYmxlZD1cImZhbHNlXCJdIC5oYW56by1wYWdlLWxhdW5jaGVyIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDE2cHgpO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbGF1bmNoZXIge1xuICAgICAgICB3aWR0aDogNTRweDtcbiAgICAgICAgaGVpZ2h0OiA1NHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgyMiwgMjQsIDMxLCAwLjk2KSwgcmdiYSg3LCA4LCAxMiwgMC45NikpO1xuICAgICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxNHB4IDM0cHggcmdiYSgwLCAwLCAwLCAwLjM1KTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2UsIG9wYWNpdHkgMC4ycyBlYXNlO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1sYXVuY2hlcjpob3ZlciB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtcGFuZWwge1xuICAgICAgICB3aWR0aDogbWluKDQyMHB4LCBjYWxjKDEwMHZ3IC0gMjRweCkpO1xuICAgICAgICBtYXgtaGVpZ2h0OiBtaW4oNjIwcHgsIGNhbGMoMTAwdmggLSAyOHB4KSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMTEsIDEzLCAxOCwgMC45NyksIHJnYmEoNywgOCwgMTIsIDAuOTcpKTtcbiAgICAgICAgY29sb3I6ICNlZWYyZmY7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMjJweCA0OHB4IHJnYmEoMCwgMCwgMCwgMC40NSk7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGJvdHRvbSByaWdodDtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDhweCkgc2NhbGUoMC45OCk7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xOHMgZWFzZSwgb3BhY2l0eSAwLjE4cyBlYXNlO1xuICAgICAgfVxuXG4gICAgICAjaGFuem8tcGFnZS1vdmVybGF5LXJvb3RbZGF0YS1vcGVuPVwidHJ1ZVwiXSAuaGFuem8tcGFnZS1wYW5lbCB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKSBzY2FsZSgxKTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdFtkYXRhLW9wZW49XCJ0cnVlXCJdIC5oYW56by1wYWdlLWxhdW5jaGVyIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjkpO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtaGVhZGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE0cHg7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpO1xuICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpLCB0cmFuc3BhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWJyYW5kIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4O1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWhlYWRlci1hY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tY2hpcC1idG4ge1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgICAgcGFkZGluZzogNHB4IDEwcHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMik7XG4gICAgICAgIGNvbG9yOiAjZDZkZWZmO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWNoaXAtYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSg1NiwgMTg5LCAyNDgsIDAuNjIpO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDE0LCAxMTYsIDE0NCwgMC4zKTtcbiAgICAgICAgY29sb3I6ICNlMGYyZmU7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1pY29uLWJ0biB7XG4gICAgICAgIHdpZHRoOiAyOHB4O1xuICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE4KTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGNvbG9yOiAjZTVlN2ViO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbWV0YSB7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweCA2cHggMTRweDtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgYXV0bztcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbnRleHQge1xuICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgIGNvbG9yOiAjYTViNGZjO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2Utc3RhdHVzIHtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBjb2xvcjogIzkzYzVmZDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLW1vZGVsLXJvdyB7XG4gICAgICAgIHBhZGRpbmc6IDAgMTRweCA4cHggMTRweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLW1vZGVsLXJvdyBzZWxlY3Qge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTYpO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDMpO1xuICAgICAgICBjb2xvcjogI2YxZjVmOTtcbiAgICAgICAgcGFkZGluZzogN3B4IDlweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1tZXNzYWdlcyB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDIwMHB4O1xuICAgICAgICBtYXgtaGVpZ2h0OiAzNzBweDtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgcGFkZGluZzogOHB4IDE0cHggMTJweCAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbXNnIHtcbiAgICAgICAgcGFkZGluZzogOXB4IDEwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLW1zZy51c2VyIHtcbiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgICAgIG1heC13aWR0aDogODglO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDU5LCAxMzAsIDI0NiwgMC4yKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1OSwgMTMwLCAyNDYsIDAuNCk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLW1zZy5hc3Npc3RhbnQge1xuICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgICAgICBtYXgtd2lkdGg6IDkyJTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtY29tcG9zZXIge1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIHRleHRhcmVhIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLWhlaWdodDogMzhweDtcbiAgICAgICAgbWF4LWhlaWdodDogMTEwcHg7XG4gICAgICAgIHJlc2l6ZTogbm9uZTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE3KTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzKTtcbiAgICAgICAgY29sb3I6ICNmOGZhZmM7XG4gICAgICAgIHBhZGRpbmc6IDlweCAxMXB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIGJ1dHRvbiB7XG4gICAgICAgIG1pbi13aWR0aDogNjhweDtcbiAgICAgICAgaGVpZ2h0OiAzOHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDM3LCA5OSwgMjM1LCAwLjY1KTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgzNywgOTksIDIzNSwgMC45NSksIHJnYmEoMzAsIDY0LCAxNzUsIDAuOTUpKTtcbiAgICAgICAgY29sb3I6ICNlZmY2ZmY7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciBidXR0b246ZGlzYWJsZWQge1xuICAgICAgICBvcGFjaXR5OiAwLjU1O1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWhpZ2hsaWdodCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NDtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoNTYsIDE4OSwgMjQ4LCAwLjk1KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNnB4O1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggcmdiYSgxNCwgMTE2LCAxNDQsIDAuMik7XG4gICAgICB9XG5cbiAgICAgIFtkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nPVwidHJ1ZVwiXSB7XG4gICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDI1MSwgMTkxLCAzNiwgMC45MikgIWltcG9ydGFudDtcbiAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDJweCAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIGA7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICBwcml2YXRlIG1vdW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcblxuICAgIHRoaXMucm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucm9vdC5pZCA9ICdoYW56by1wYWdlLW92ZXJsYXktcm9vdCc7XG4gICAgdGhpcy5yb290LnNldEF0dHJpYnV0ZSgnZGF0YS1vcGVuJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy5yb290LnNldEF0dHJpYnV0ZSgnZGF0YS1lbmFibGVkJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy5yb290LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLXBhbmVsXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWw9XCJIYW56byBQYWdlIEFzc2lzdGFudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1icmFuZFwiPkhhbnpvIE92ZXJsYXk8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1oZWFkZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWNoaXAtYnRuXCIgZGF0YS1yb2xlPVwid2F0Y2hcIiBkYXRhLWFjdGl2ZT1cImZhbHNlXCIgdGl0bGU9XCJXYXRjaCBlbGVtZW50cyBvbiBob3ZlclwiPldhdGNoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGFuem8tY2hpcC1idG5cIiBkYXRhLXJvbGU9XCJlZGl0XCIgZGF0YS1hY3RpdmU9XCJmYWxzZVwiIHRpdGxlPVwiQ2xpY2sgYW55IGVsZW1lbnQgdG8gZWRpdCB0ZXh0XCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWljb24tYnRuXCIgZGF0YS1yb2xlPVwiY2xvc2VcIiB0aXRsZT1cIk1pbmltaXplXCI+XHUwMEQ3PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1tZXRhXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtY29udGV4dFwiPlVzZSBXYXRjaCB0byBpbnNwZWN0IHBhZ2UgZWxlbWVudHMuPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJoYW56by1wYWdlLXN0YXR1c1wiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1tb2RlbC1yb3dcIj5cbiAgICAgICAgICA8c2VsZWN0IGRhdGEtcm9sZT1cIm1vZGVsXCI+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhdWRlLXNvbm5ldC00LTIwMjUwNTE0XCI+Q2xhdWRlIFNvbm5ldCA0PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2xhdWRlLW9wdXMtNC0yMDI1MDUxNFwiPkNsYXVkZSBPcHVzIDQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJncHQtNG9cIj5HUFQtNG88L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ6ZW4tY29kZXItZmxhc2hcIj5aZW4gQ29kZXIgRmxhc2g8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ6ZW4tbWF4XCI+WmVuIE1heDwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtbWVzc2FnZXNcIiBkYXRhLXJvbGU9XCJtZXNzYWdlc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLW1zZyBhc3Npc3RhbnRcIj5Bc2sgYWJvdXQgdGhpcyBwYWdlLCBpbnNwZWN0IGFueSBlbGVtZW50LCBvciB0dXJuIG9uIEVkaXQgbW9kZSB0byBjaGFuZ2UgdGV4dCBpbi1wbGFjZS48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWNvbXBvc2VyXCI+XG4gICAgICAgICAgPHRleHRhcmVhIGRhdGEtcm9sZT1cImlucHV0XCIgcm93cz1cIjFcIiBwbGFjZWhvbGRlcj1cIkFzayBhYm91dCB0aGlzIHBhZ2UuLi5cIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxidXR0b24gZGF0YS1yb2xlPVwic2VuZFwiIHR5cGU9XCJidXR0b25cIj5Bc2s8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJoYW56by1wYWdlLWxhdW5jaGVyXCIgZGF0YS1yb2xlPVwibGF1bmNoZXJcIiB0eXBlPVwiYnV0dG9uXCIgdGl0bGU9XCJPcGVuIEhhbnpvIE92ZXJsYXlcIj5BSTwvYnV0dG9uPlxuICAgIGA7XG5cbiAgICB0aGlzLnBhbmVsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1wYWdlLXBhbmVsJyk7XG4gICAgdGhpcy5sYXVuY2hlciA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwibGF1bmNoZXJcIl0nKTtcbiAgICB0aGlzLm1lc3NhZ2VzRWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cIm1lc3NhZ2VzXCJdJyk7XG4gICAgdGhpcy5pbnB1dEVsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJpbnB1dFwiXScpO1xuICAgIHRoaXMuc2VuZEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwic2VuZFwiXScpO1xuICAgIHRoaXMubW9kZWxFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwibW9kZWxcIl0nKTtcbiAgICB0aGlzLmNvbnRleHRFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuaGFuem8tcGFnZS1jb250ZXh0Jyk7XG4gICAgdGhpcy53YXRjaEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwid2F0Y2hcIl0nKTtcbiAgICB0aGlzLmVkaXRCdG4gPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cImVkaXRcIl0nKTtcbiAgICB0aGlzLnN0YXR1c0VsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1wYWdlLXN0YXR1cycpO1xuXG4gICAgdGhpcy5sYXVuY2hlcj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNob3coKSk7XG4gICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJjbG9zZVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICB0aGlzLndhdGNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2V0V2F0Y2hNb2RlKCF0aGlzLndhdGNoTW9kZSkpO1xuICAgIHRoaXMuZWRpdEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNldEVkaXRNb2RlKCF0aGlzLmVkaXRNb2RlKSk7XG4gICAgdGhpcy5zZW5kQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuYXNrUGFnZVF1ZXN0aW9uKCkpO1xuICAgIHRoaXMuaW5wdXRFbD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5hc2tQYWdlUXVlc3Rpb24oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmlucHV0RWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlucHV0RWwpIHJldHVybjtcbiAgICAgIHRoaXMuaW5wdXRFbC5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICB0aGlzLmlucHV0RWwuc3R5bGUuaGVpZ2h0ID0gYCR7TWF0aC5taW4odGhpcy5pbnB1dEVsLnNjcm9sbEhlaWdodCwgMTEwKX1weGA7XG4gICAgfSk7XG5cbiAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5yb290KTtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kR2xvYmFsRXZlbnRzKCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIChldmVudCkgPT4gdGhpcy5vbk1vdXNlTW92ZShldmVudCksIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB0aGlzLm9uRG9jdW1lbnRDbGljayhldmVudCksIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHRoaXMub25LZXlEb3duKGV2ZW50KSwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhdGNoTW9kZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0UGFnZVRhcmdldChldmVudC50YXJnZXQpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgdGhpcy5ob3ZlcmVkRWxlbWVudCA9IHRhcmdldDtcbiAgICB0aGlzLnNob3dIaWdobGlnaHQodGFyZ2V0KTtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb250ZXh0KSB7XG4gICAgICB0aGlzLmNvbnRleHRFbCAmJiAodGhpcy5jb250ZXh0RWwudGV4dENvbnRlbnQgPSB0aGlzLmdldEVsZW1lbnRTdW1tYXJ5KHRhcmdldCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhdGNoTW9kZSAmJiAhdGhpcy5lZGl0TW9kZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuZ2V0UGFnZVRhcmdldChldmVudC50YXJnZXQpO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMud2F0Y2hNb2RlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29udGV4dCA9IHRoaXMuY2FwdHVyZUVsZW1lbnRDb250ZXh0KHRhcmdldCk7XG4gICAgICB0aGlzLmNvbnRleHRFbCAmJiAodGhpcy5jb250ZXh0RWwudGV4dENvbnRlbnQgPSB0aGlzLmdldEVsZW1lbnRTdW1tYXJ5KHRhcmdldCkpO1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VsZW1lbnQgc2VsZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lZGl0TW9kZSkge1xuICAgICAgdGhpcy5lbmFibGVJbmxpbmVFZGl0KHRhcmdldCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdGluZyBlbGVtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgaWYgKHRoaXMuZWRpdGluZ0VsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdCh0aGlzLmVkaXRpbmdFbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IGNhbmNlbGVkJyk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wZW4pIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYWdlVGFyZ2V0KHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHJldHVybiBudWxsO1xuICAgIGlmICh0aGlzLnJvb3Q/LmNvbnRhaW5zKHRhcmdldCkpIHJldHVybiBudWxsO1xuICAgIGlmICghdGFyZ2V0LmlzQ29ubmVjdGVkKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2h0bWwnIHx8IHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdib2R5JykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0V2F0Y2hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMud2F0Y2hNb2RlID0gYWN0aXZlO1xuICAgIGlmIChhY3RpdmUpIHRoaXMuc2V0RWRpdE1vZGUoZmFsc2UpO1xuICAgIHRoaXMud2F0Y2hCdG4/LnNldEF0dHJpYnV0ZSgnZGF0YS1hY3RpdmUnLCBhY3RpdmUgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5ob3ZlcmVkRWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb250ZXh0ICYmIHRoaXMuY29udGV4dEVsKSB7XG4gICAgICAgIHRoaXMuY29udGV4dEVsLnRleHRDb250ZW50ID0gJ1VzZSBXYXRjaCB0byBpbnNwZWN0IHBhZ2UgZWxlbWVudHMuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ1dhdGNoIG1vZGUgb24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVkaXRNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdE1vZGUgPSBhY3RpdmU7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5zZXRXYXRjaE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuZWRpdEJ0bj8uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZScsIGFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIGlmICghYWN0aXZlICYmIHRoaXMuZWRpdGluZ0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQodGhpcy5lZGl0aW5nRWxlbWVudCwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IG1vZGUgb24nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZUlubGluZUVkaXQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lZGl0aW5nRWxlbWVudCAmJiB0aGlzLmVkaXRpbmdFbGVtZW50ICE9PSBlbGVtZW50KSB7XG4gICAgICB0aGlzLmRpc2FibGVJbmxpbmVFZGl0KHRoaXMuZWRpdGluZ0VsZW1lbnQsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgdGhpcy5lZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGF0YS1oYW56by1vcmlnaW5hbC1odG1sJykpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnLCBlbGVtZW50LmlubmVySFRNTCk7XG4gICAgfVxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAndHJ1ZScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzcGVsbGNoZWNrJywgJ3RydWUnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1oYW56by1pbmxpbmUtZWRpdGluZycsICd0cnVlJyk7XG4gICAgZWxlbWVudC5mb2N1cygpO1xuICAgIHRoaXMuZWRpdGluZ0VsZW1lbnQgPSBlbGVtZW50O1xuXG4gICAgY29uc3Qga2V5ZG93bkhhbmRsZXIgPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdCByZXZlcnRlZCcpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJyAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdChlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VkaXQgYXBwbGllZCcpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBibHVySGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdCBhcHBsaWVkJyk7XG4gICAgfTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGtleWRvd25IYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgYmx1ckhhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZUlubGluZUVkaXQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGtlZXBDaGFuZ2VzOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFrZWVwQ2hhbmdlcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1oYW56by1vcmlnaW5hbC1odG1sJyk7XG4gICAgICBpZiAob3JpZ2luYWwgIT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBvcmlnaW5hbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJyk7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snKTtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oYW56by1pbmxpbmUtZWRpdGluZycpO1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnKTtcblxuICAgIGlmICh0aGlzLmVkaXRpbmdFbGVtZW50ID09PSBlbGVtZW50KSB7XG4gICAgICB0aGlzLmVkaXRpbmdFbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dIaWdobGlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAocmVjdC53aWR0aCA9PT0gMCAmJiByZWN0LmhlaWdodCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhckhpZ2hsaWdodCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5oaWdobGlnaHRCb3gpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0Qm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmhpZ2hsaWdodEJveC5jbGFzc05hbWUgPSAnaGFuem8tcGFnZS1oaWdobGlnaHQnO1xuICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGlnaGxpZ2h0Qm94KTtcbiAgICB9XG5cbiAgICB0aGlzLmhpZ2hsaWdodEJveC5zdHlsZS5sZWZ0ID0gYCR7TWF0aC5tYXgoMCwgcmVjdC5sZWZ0IC0gMyl9cHhgO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLnRvcCA9IGAke01hdGgubWF4KDAsIHJlY3QudG9wIC0gMyl9cHhgO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLndpZHRoID0gYCR7cmVjdC53aWR0aCArIDZ9cHhgO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLmhlaWdodCA9IGAke3JlY3QuaGVpZ2h0ICsgNn1weGA7XG4gIH1cblxuICBwcml2YXRlIGNsZWFySGlnaGxpZ2h0KCk6IHZvaWQge1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94Py5yZW1vdmUoKTtcbiAgICB0aGlzLmhpZ2hsaWdodEJveCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNhcHR1cmVFbGVtZW50Q29udGV4dChlbGVtZW50OiBIVE1MRWxlbWVudCk6IE92ZXJsYXlFbGVtZW50Q29udGV4dCB7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMubm9ybWFsaXplVGV4dChlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50IHx8ICcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2VsZWN0b3I6IHRoaXMuYnVpbGRTZWxlY3RvcihlbGVtZW50KSxcbiAgICAgIHRhZzogZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICB0ZXh0OiB0ZXh0LnNsaWNlKDAsIDgwMCksXG4gICAgICBodG1sOiBlbGVtZW50Lm91dGVySFRNTC5zbGljZSgwLCAxMjAwKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlbGVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoZWxlbWVudC5pZCkgcmV0dXJuIGAjJHtlbGVtZW50LmlkfWA7XG5cbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgY3VycmVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gZWxlbWVudDtcbiAgICBsZXQgZGVwdGggPSAwO1xuXG4gICAgd2hpbGUgKGN1cnJlbnQgJiYgZGVwdGggPCA2KSB7XG4gICAgICBsZXQgcGFydCA9IGN1cnJlbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKGN1cnJlbnQuY2xhc3NMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gQXJyYXkuZnJvbShjdXJyZW50LmNsYXNzTGlzdCkuc2xpY2UoMCwgMikuam9pbignLicpO1xuICAgICAgICBpZiAoY2xhc3NOYW1lKSBwYXJ0ICs9IGAuJHtjbGFzc05hbWV9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY29uc3Qgc2libGluZ3MgPSBBcnJheS5mcm9tKHBhcmVudC5jaGlsZHJlbikuZmlsdGVyKChub2RlKSA9PiBub2RlLnRhZ05hbWUgPT09IGN1cnJlbnQhLnRhZ05hbWUpO1xuICAgICAgICBpZiAoc2libGluZ3MubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2libGluZ3MuaW5kZXhPZihjdXJyZW50KSArIDE7XG4gICAgICAgICAgcGFydCArPSBgOm50aC1vZi10eXBlKCR7aW5kZXh9KWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhcnRzLnVuc2hpZnQocGFydCk7XG4gICAgICBjdXJyZW50ID0gcGFyZW50O1xuICAgICAgZGVwdGggKz0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHMuam9pbignID4gJyk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVRleHQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xccysvZywgJyAnKS50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEVsZW1lbnRTdW1tYXJ5KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBjdHggPSB0aGlzLmNhcHR1cmVFbGVtZW50Q29udGV4dChlbGVtZW50KTtcbiAgICByZXR1cm4gYCR7Y3R4LnRhZ30gXHUyMDIyICR7Y3R4LnNlbGVjdG9yfWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRNb2RlbHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMubW9kZWxzTG9hZGVkIHx8ICF0aGlzLm1vZGVsRWwpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnY2hhdC5saXN0TW9kZWxzJyB9KTtcbiAgICAgIGlmICghcmVzcG9uc2U/LnN1Y2Nlc3MgfHwgIUFycmF5LmlzQXJyYXkocmVzcG9uc2UubW9kZWxzKSB8fCAhcmVzcG9uc2UubW9kZWxzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5tb2RlbEVsLnZhbHVlO1xuICAgICAgdGhpcy5tb2RlbEVsLmlubmVySFRNTCA9ICcnO1xuICAgICAgZm9yIChjb25zdCBtb2RlbCBvZiByZXNwb25zZS5tb2RlbHMpIHtcbiAgICAgICAgaWYgKCFtb2RlbD8uaWQpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0aW9uLnZhbHVlID0gbW9kZWwuaWQ7XG4gICAgICAgIG9wdGlvbi50ZXh0Q29udGVudCA9IG1vZGVsLm5hbWUgfHwgbW9kZWwuaWQ7XG4gICAgICAgIHRoaXMubW9kZWxFbC5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZpb3VzICYmIEFycmF5LmZyb20odGhpcy5tb2RlbEVsLm9wdGlvbnMpLnNvbWUoKG9wdCkgPT4gb3B0LnZhbHVlID09PSBwcmV2aW91cykpIHtcbiAgICAgICAgdGhpcy5tb2RlbEVsLnZhbHVlID0gcHJldmlvdXM7XG4gICAgICB9XG4gICAgICB0aGlzLm1vZGVsc0xvYWRlZCA9IHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZWVwIGxvY2FsIGRlZmF1bHRzIGlmIG1vZGVsIGZldGNoIGZhaWxzLlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNJbnB1dCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXRFbCkgcmV0dXJuO1xuICAgIHRoaXMuaW5wdXRFbC5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBlbmRNZXNzYWdlKHJvbGU6ICd1c2VyJyB8ICdhc3Npc3RhbnQnLCBjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubWVzc2FnZXNFbCkgcmV0dXJuO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSBgaGFuem8tcGFnZS1tc2cgJHtyb2xlfWA7XG4gICAgZGl2LnRleHRDb250ZW50ID0gY29udGVudDtcbiAgICB0aGlzLm1lc3NhZ2VzRWwuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICB0aGlzLm1lc3NhZ2VzRWwuc2Nyb2xsVG9wID0gdGhpcy5tZXNzYWdlc0VsLnNjcm9sbEhlaWdodDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdHVzKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0dXNFbCkgcmV0dXJuO1xuICAgIHRoaXMuc3RhdHVzRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFBhZ2VDb250ZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5ub3JtYWxpemVUZXh0KHdpbmRvdy5nZXRTZWxlY3Rpb24/LigpPy50b1N0cmluZygpIHx8ICcnKTtcbiAgICBjb25zdCBjb250ZXh0TGluZXMgPSBbXG4gICAgICBgVVJMOiAke2xvY2F0aW9uLmhyZWZ9YCxcbiAgICAgIGBUaXRsZTogJHtkb2N1bWVudC50aXRsZSB8fCAnVW50aXRsZWQnfWAsXG4gICAgXTtcblxuICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgIGNvbnRleHRMaW5lcy5wdXNoKGBUZXh0U2VsZWN0aW9uOiAke3NlbGVjdGlvbi5zbGljZSgwLCA2MDApfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRDb250ZXh0ID0gdGhpcy5zZWxlY3RlZENvbnRleHQgfHwgKHRoaXMuaG92ZXJlZEVsZW1lbnQgPyB0aGlzLmNhcHR1cmVFbGVtZW50Q29udGV4dCh0aGlzLmhvdmVyZWRFbGVtZW50KSA6IG51bGwpO1xuICAgIGlmIChlbGVtZW50Q29udGV4dCkge1xuICAgICAgY29udGV4dExpbmVzLnB1c2goYEVsZW1lbnRTZWxlY3RvcjogJHtlbGVtZW50Q29udGV4dC5zZWxlY3Rvcn1gKTtcbiAgICAgIGlmIChlbGVtZW50Q29udGV4dC50ZXh0KSBjb250ZXh0TGluZXMucHVzaChgRWxlbWVudFRleHQ6ICR7ZWxlbWVudENvbnRleHQudGV4dC5zbGljZSgwLCA2MDApfWApO1xuICAgICAgY29udGV4dExpbmVzLnB1c2goYEVsZW1lbnRIVE1MOiAke2VsZW1lbnRDb250ZXh0Lmh0bWwuc2xpY2UoMCwgODAwKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dExpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhc2tQYWdlUXVlc3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2VuZGluZyB8fCAhdGhpcy5pbnB1dEVsKSByZXR1cm47XG5cbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLm5vcm1hbGl6ZVRleHQodGhpcy5pbnB1dEVsLnZhbHVlKTtcbiAgICBpZiAoIXByb21wdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdG9rZW5SZXNwID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmdldFRva2VuJyB9KTtcbiAgICBpZiAoIXRva2VuUmVzcD8uc3VjY2VzcyB8fCAhdG9rZW5SZXNwLnRva2VuKSB7XG4gICAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsICdQbGVhc2Ugc2lnbiBpbiBmcm9tIHRoZSBIYW56byBzaWRlYmFyL3BvcHVwIGJlZm9yZSB1c2luZyBwYWdlIGNoYXQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZVN0YXR1cygnVGhpbmtpbmcuLi4nKTtcbiAgICB0aGlzLnNlbmRCdG4gJiYgKHRoaXMuc2VuZEJ0bi5kaXNhYmxlZCA9IHRydWUpO1xuXG4gICAgdGhpcy5pbnB1dEVsLnZhbHVlID0gJyc7XG4gICAgdGhpcy5pbnB1dEVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ3VzZXInLCBwcm9tcHQpO1xuXG4gICAgY29uc3Qgc3lzdGVtQ29udGV4dCA9IHRoaXMuYnVpbGRQYWdlQ29udGV4dCgpO1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbEVsPy52YWx1ZSB8fCAnZ3B0LTRvJztcbiAgICBjb25zdCByZXF1ZXN0TWVzc2FnZXM6IE92ZXJsYXlDaGF0TWVzc2FnZVtdID0gW1xuICAgICAge1xuICAgICAgICByb2xlOiAnc3lzdGVtJyxcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICdZb3UgYXJlIEhhbnpvIHBhZ2Ugb3ZlcmxheSBhc3Npc3RhbnQuJyxcbiAgICAgICAgICAnVXNlIHByb3ZpZGVkIHBhZ2UgY29udGV4dCBhbmQgc2VsZWN0ZWQgZWxlbWVudCBjb250ZXh0IHdoZW4gcmVsZXZhbnQuJyxcbiAgICAgICAgICAnQmUgY29uY2lzZSBhbmQgcHJvdmlkZSBjb25jcmV0ZSBVSSBvciBET00gZWRpdCBzdWdnZXN0aW9ucyB3aGVuIGFza2VkLicsXG4gICAgICAgICAgJycsXG4gICAgICAgICAgc3lzdGVtQ29udGV4dCxcbiAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLm1lc3NhZ2VzLnNsaWNlKC04KSxcbiAgICAgIHsgcm9sZTogJ3VzZXInLCBjb250ZW50OiBwcm9tcHQgfSxcbiAgICBdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgICAgICBhY3Rpb246ICdjaGF0LmNvbXBsZXRlJyxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIG1lc3NhZ2VzOiByZXF1ZXN0TWVzc2FnZXMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXNwb25zZT8uc3VjY2VzcyB8fCAhcmVzcG9uc2UuY29udGVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2U/LmVycm9yIHx8ICdObyByZXNwb25zZSBmcm9tIGNoYXQgc2VydmljZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhbnN3ZXIgPSBTdHJpbmcocmVzcG9uc2UuY29udGVudCkudHJpbSgpO1xuICAgICAgdGhpcy5hcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBhbnN3ZXIgfHwgJ05vIHJlc3BvbnNlIGNvbnRlbnQuJyk7XG4gICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHByb21wdCB9LCB7IHJvbGU6ICdhc3Npc3RhbnQnLCBjb250ZW50OiBhbnN3ZXIgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcy5zbGljZSgtMjApO1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ1JlYWR5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgdGhpcy5hcHBlbmRNZXNzYWdlKCdhc3Npc3RhbnQnLCBgRXJyb3I6ICR7ZXJyb3I/Lm1lc3NhZ2UgfHwgJ0NoYXQgcmVxdWVzdCBmYWlsZWQnfWApO1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0Vycm9yJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2VuZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zZW5kQnRuICYmICh0aGlzLnNlbmRCdG4uZGlzYWJsZWQgPSBmYWxzZSk7XG4gICAgICB0aGlzLmZvY3VzSW5wdXQoKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcGFnZU92ZXJsYXkgPSBuZXcgSGFuem9QYWdlT3Zlcmxh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QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd01mLGVBQVMsS0FBSyxZQUFZLEtBQUs7QUFBQSxJQUNqQztBQUVBLGFBQVMsaUJBQWlCLFFBQXFDO0FBQzdELFVBQUksRUFBRSxrQkFBa0IsTUFBTyxRQUFPO0FBQ3RDLGFBQU8sQ0FBQyxHQUNOLG1DQUFTLFNBQVMsYUFDbEIscUNBQVUsU0FBUyxhQUNuQix1Q0FBVyxTQUFTLGFBQ3BCLGlDQUFRLFNBQVMsYUFDakIsMkNBQWEsU0FBUztBQUFBLElBRTFCO0FBRUEsYUFBUyxpQkFBaUIsT0FBb0I7QUFDNUMsVUFBSSxDQUFDLHVCQUF3QjtBQUU3QixVQUFJLGlCQUFpQixpQkFBaUIsTUFBTSxRQUFRLFVBQVU7QUFDNUQsZUFBTyxRQUFRLFlBQVksRUFBRSxRQUFRLG9CQUFvQixDQUFDO0FBQzFELGFBQUs7QUFDTDtBQUFBLE1BQ0Y7QUFFQSxVQUFJLGlCQUFpQixNQUFNLE1BQU0sRUFBRztBQUVwQyxZQUFNLGVBQWU7QUFDckIsWUFBTSxnQkFBZ0I7QUFDdEIsWUFBTSx5QkFBeUI7QUFBQSxJQUNqQztBQUVBLGFBQVMsb0JBQW9CLFFBQXVCO0FBQ2xELFVBQUksMkJBQTJCLE9BQVE7QUFFdkMsK0JBQXlCO0FBQ3pCLGlCQUFXLGFBQWEsZ0JBQWdCO0FBQ3RDLFlBQUksUUFBUTtBQUNWLG1CQUFTLGlCQUFpQixXQUFXLGtCQUFrQixJQUFJO0FBQUEsUUFDN0QsT0FBTztBQUNMLG1CQUFTLG9CQUFvQixXQUFXLGtCQUFrQixJQUFJO0FBQUEsUUFDaEU7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLGFBQVMsS0FBSyxNQUFjO0FBdmdCOUI7QUF3Z0JJLFVBQUksUUFBUyxNQUFLO0FBRWxCLG1CQUFhO0FBQ2IsMEJBQW9CLElBQUk7QUFHeEIsZ0JBQVUsU0FBUyxjQUFjLEtBQUs7QUFDdEMsY0FBUSxLQUFLO0FBQ2IsZUFBUyxLQUFLLFlBQVksT0FBTztBQUdqQyxlQUFTLFNBQVMsY0FBYyxLQUFLO0FBQ3JDLGFBQU8sWUFBWTtBQUNuQixhQUFPLE1BQU0sT0FBTyxHQUFHLE9BQU8sYUFBYSxDQUFDO0FBQzVDLGFBQU8sTUFBTSxNQUFNLEdBQUcsT0FBTyxjQUFjLENBQUM7QUFDNUMsZUFBUyxLQUFLLFlBQVksTUFBTTtBQUdoQyxpQkFBVyxTQUFTLGNBQWMsS0FBSztBQUN2QyxlQUFTLFlBQVk7QUFDckIsZUFBUyxZQUFZO0FBQUE7QUFBQTtBQUFBLGtDQUdTLFdBQVcsUUFBUSxrQ0FBa0MsQ0FBQztBQUFBO0FBQUE7QUFHcEYsZUFBUyxLQUFLLFlBQVksUUFBUTtBQUVsQyxxQkFBUyxjQUFjLGlCQUFpQixNQUF4QyxtQkFBMkMsaUJBQWlCLFNBQVMsTUFBTTtBQUN6RSxlQUFPLFFBQVEsWUFBWSxFQUFFLFFBQVEsb0JBQW9CLENBQUM7QUFDMUQsYUFBSztBQUFBLE1BQ1A7QUFHQSxrQkFBWSxTQUFTLGNBQWMsUUFBUTtBQUMzQyxnQkFBVSxZQUFZO0FBQ3RCLGdCQUFVLGNBQWM7QUFDeEIsZ0JBQVUsaUJBQWlCLFNBQVMsTUFBTTtBQUN4QyxlQUFPLFFBQVEsWUFBWSxFQUFFLFFBQVEsb0JBQW9CLENBQUM7QUFDMUQsYUFBSztBQUFBLE1BQ1AsQ0FBQztBQUNELGVBQVMsS0FBSyxZQUFZLFNBQVM7QUFHbkMsNEJBQXNCLE1BQU07QUFDMUIsMkNBQVMsVUFBVSxJQUFJO0FBQ3ZCLHlDQUFRLFVBQVUsSUFBSTtBQUN0Qiw2Q0FBVSxVQUFVLElBQUk7QUFDeEIsK0NBQVcsVUFBVSxJQUFJO0FBQUEsTUFDM0IsQ0FBQztBQUFBLElBQ0g7QUFFQSxhQUFTLE9BQU87QUFFZCx5Q0FBUyxVQUFVLE9BQU87QUFDMUIsdUNBQVEsVUFBVSxPQUFPO0FBQ3pCLDJDQUFVLFVBQVUsT0FBTztBQUMzQiw2Q0FBVyxVQUFVLE9BQU87QUFHNUIsWUFBTSxPQUFPLEVBQUUsU0FBUyxRQUFRLFVBQVUsV0FBVyxZQUFZO0FBQ2pFLFlBQU0sU0FBUyxDQUFDLEdBQUcsVUFBVTtBQUU3QixpQkFBVyxNQUFNO0FBdmtCckI7QUF3a0JNLG1CQUFLLFlBQUwsbUJBQWM7QUFDZCxtQkFBSyxXQUFMLG1CQUFhO0FBQ2IsbUJBQUssYUFBTCxtQkFBZTtBQUNmLG1CQUFLLGNBQUwsbUJBQWdCO0FBQ2hCLG1CQUFLLGdCQUFMLG1CQUFrQjtBQUNsQixtQkFBVyxRQUFRLFFBQVE7QUFDekIsZUFBSyxPQUFPO0FBQUEsUUFDZDtBQUFBLE1BQ0YsR0FBRyxHQUFHO0FBRU4sMEJBQW9CLEtBQUs7QUFFekIsZ0JBQVU7QUFDVixlQUFTO0FBQ1QsaUJBQVc7QUFDWCxrQkFBWTtBQUNaLG9CQUFjO0FBQ2QsbUJBQWEsQ0FBQztBQUFBLElBQ2hCO0FBRUEsYUFBUyxXQUFXLEdBQVcsR0FBVztBQTVsQjVDO0FBNmxCSSxVQUFJLENBQUMsT0FBUTtBQUViLFlBQU0sV0FBVyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksT0FBTyxZQUFZLE9BQU8sU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7QUFDcEYsWUFBTSxXQUFXLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxPQUFPLGFBQWEsT0FBTyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUdyRixZQUFNLFFBQVEsU0FBUyxjQUFjLEtBQUs7QUFDMUMsWUFBTSxZQUFZO0FBQ2xCLFlBQU0sTUFBTSxPQUFPLEdBQUcsUUFBUTtBQUM5QixZQUFNLE1BQU0sTUFBTSxHQUFHLFFBQVE7QUFDN0IsZUFBUyxLQUFLLFlBQVksS0FBSztBQUMvQixpQkFBVyxLQUFLLEtBQUs7QUFFckIsaUJBQVcsTUFBTTtBQUNmLGNBQU0sT0FBTztBQUNiLHFCQUFhLFdBQVcsT0FBTyxDQUFDLFNBQVMsU0FBUyxLQUFLO0FBQUEsTUFDekQsR0FBRyxHQUFHO0FBRU4sYUFBTyxXQUFXLFNBQVMsSUFBSTtBQUM3Qix5QkFBVyxNQUFNLE1BQWpCLG1CQUFvQjtBQUFBLE1BQ3RCO0FBRUEsYUFBTyxNQUFNLE9BQU8sR0FBRyxRQUFRO0FBQy9CLGFBQU8sTUFBTSxNQUFNLEdBQUcsUUFBUTtBQUFBLElBQ2hDO0FBRUEsYUFBUyxVQUFVLFVBQWtCO0FBQ25DLGlEQUFhO0FBQ2Isb0JBQWM7QUFFZCxVQUFJLENBQUMsWUFBWSxPQUFPLGFBQWEsU0FBVTtBQUUvQyxVQUFJO0FBQ0YsY0FBTSxTQUFTLFNBQVMsY0FBYyxRQUFRO0FBQzlDLFlBQUksQ0FBQyxPQUFRO0FBRWIsY0FBTSxPQUFPLE9BQU8sc0JBQXNCO0FBQzFDLFlBQUksS0FBSyxVQUFVLEtBQUssS0FBSyxXQUFXLEVBQUc7QUFFM0Msc0JBQWMsU0FBUyxjQUFjLEtBQUs7QUFDMUMsb0JBQVksWUFBWTtBQUN4QixvQkFBWSxNQUFNLE9BQU8sR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELG9CQUFZLE1BQU0sTUFBTSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUM7QUFDcEQsb0JBQVksTUFBTSxRQUFRLEdBQUcsS0FBSyxRQUFRLENBQUM7QUFDM0Msb0JBQVksTUFBTSxTQUFTLEdBQUcsS0FBSyxTQUFTLENBQUM7QUFDN0MsaUJBQVMsS0FBSyxZQUFZLFdBQVc7QUFBQSxNQUN2QyxRQUFRO0FBQUEsTUFFUjtBQUFBLElBQ0Y7QUFFQSxhQUFTLGFBQWEsTUFBYztBQUNsQyxVQUFJLENBQUMsU0FBVTtBQUVmLFlBQU0sUUFBUSxTQUFTLGNBQWMsY0FBYztBQUNuRCxVQUFJLE9BQU87QUFDVCxjQUFNLGNBQWMsUUFBUTtBQUFBLE1BQzlCO0FBQUEsSUFDRjtBQUVBLGFBQVMsV0FBVyxNQUFzQjtBQUN4QyxZQUFNLE1BQU0sU0FBUyxjQUFjLEtBQUs7QUFDeEMsVUFBSSxjQUFjO0FBQ2xCLGFBQU8sSUFBSTtBQUFBLElBQ2I7QUFFQSxXQUFPLEVBQUUsTUFBTSxNQUFNLFlBQVksV0FBVyxhQUFhO0FBQUEsRUFDM0QsR0FBRztBQWdCSCxNQUFNLG1CQUFOLE1BQXVCO0FBQUEsSUEwQnJCLGNBQWM7QUF6QmQsV0FBUSxVQUFVO0FBQ2xCLFdBQVEsVUFBVTtBQUNsQixXQUFRLE9BQU87QUFDZixXQUFRLFVBQVU7QUFDbEIsV0FBUSxZQUFZO0FBQ3BCLFdBQVEsV0FBVztBQUNuQixXQUFRLGVBQWU7QUFDdkIsV0FBUSxXQUFpQyxDQUFDO0FBQzFDLFdBQVEsa0JBQWdEO0FBQ3hELFdBQVEsaUJBQXFDO0FBQzdDLFdBQVEsaUJBQXFDO0FBRTdDLFdBQVEsT0FBOEI7QUFDdEMsV0FBUSxXQUFxQztBQUM3QyxXQUFRLFFBQStCO0FBQ3ZDLFdBQVEsYUFBb0M7QUFDNUMsV0FBUSxVQUFzQztBQUM5QyxXQUFRLFVBQW9DO0FBQzVDLFdBQVEsVUFBb0M7QUFDNUMsV0FBUSxZQUFtQztBQUMzQyxXQUFRLFdBQXFDO0FBQzdDLFdBQVEsVUFBb0M7QUFDNUMsV0FBUSxXQUFtQztBQUMzQyxXQUFRLGVBQXNDO0FBRzVDLFdBQUssYUFBYTtBQUNsQixXQUFLLE1BQU07QUFDWCxXQUFLLGlCQUFpQjtBQUFBLElBQ3hCO0FBQUEsSUFFQSxTQUFrQjtBQUNoQixVQUFJLENBQUMsS0FBSyxXQUFXLENBQUMsS0FBSyxNQUFNO0FBQy9CLGFBQUssS0FBSztBQUNWLGVBQU87QUFBQSxNQUNUO0FBQ0EsV0FBSyxLQUFLO0FBQ1YsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUVBLE9BQWE7QUF6dEJmO0FBMHRCSSxXQUFLLGNBQWM7QUFDbkIsV0FBSyxVQUFVO0FBQ2YsV0FBSyxPQUFPO0FBQ1osaUJBQUssU0FBTCxtQkFBVyxhQUFhLGdCQUFnQjtBQUN4QyxpQkFBSyxTQUFMLG1CQUFXLGFBQWEsYUFBYTtBQUNyQyxXQUFLLFdBQVc7QUFDaEIsV0FBSyxXQUFXO0FBQUEsSUFDbEI7QUFBQSxJQUVBLE9BQWE7QUFudUJmO0FBb3VCSSxXQUFLLE9BQU87QUFDWixpQkFBSyxTQUFMLG1CQUFXLGFBQWEsYUFBYTtBQUNyQyxXQUFLLGFBQWEsRUFBRTtBQUNwQixXQUFLLGVBQWU7QUFDcEIsV0FBSyxhQUFhLEtBQUs7QUFDdkIsV0FBSyxZQUFZLEtBQUs7QUFBQSxJQUN4QjtBQUFBLElBRUEsU0FBa0I7QUFDaEIsYUFBTyxLQUFLO0FBQUEsSUFDZDtBQUFBLElBRVEsZ0JBQXNCO0FBQzVCLFVBQUksS0FBSyxRQUFTO0FBQ2xCLFdBQUssTUFBTTtBQUFBLElBQ2I7QUFBQSxJQUVRLGVBQXFCO0FBQzNCLFVBQUksU0FBUyxlQUFlLDJCQUEyQixFQUFHO0FBRTFELFlBQU0sUUFBUSxTQUFTLGNBQWMsT0FBTztBQUM1QyxZQUFNLEtBQUs7QUFDWCxZQUFNLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
|
|
2789
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbEAwLjEyLjAvbm9kZV9tb2R1bGVzL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbC9kaXN0L2Jyb3dzZXItcG9seWZpbGwuanMiLCAiLi4vLi4vc3JjL2NvbnRlbnQtc2NyaXB0LnRzIiwgIi4uLy4uL3NyYy9zaGFyZWQvc2hvcnRjdXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIHdlYmV4dGVuc2lvbi1wb2x5ZmlsbCAtIHYwLjEyLjAgLSBUdWUgTWF5IDE0IDIwMjQgMTg6MDE6MjkgKi9cbi8qIC0qLSBNb2RlOiBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGpzLWluZGVudC1sZXZlbDogMiAtKi0gKi9cbi8qIHZpbTogc2V0IHN0cz0yIHN3PTIgZXQgdHc9ODA6ICovXG4vKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLiAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmlmICghKGdsb2JhbFRoaXMuY2hyb21lICYmIGdsb2JhbFRoaXMuY2hyb21lLnJ1bnRpbWUgJiYgZ2xvYmFsVGhpcy5jaHJvbWUucnVudGltZS5pZCkpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzY3JpcHQgc2hvdWxkIG9ubHkgYmUgbG9hZGVkIGluIGEgYnJvd3NlciBleHRlbnNpb24uXCIpO1xufVxuXG5pZiAoIShnbG9iYWxUaGlzLmJyb3dzZXIgJiYgZ2xvYmFsVGhpcy5icm93c2VyLnJ1bnRpbWUgJiYgZ2xvYmFsVGhpcy5icm93c2VyLnJ1bnRpbWUuaWQpKSB7XG4gIGNvbnN0IENIUk9NRV9TRU5EX01FU1NBR0VfQ0FMTEJBQ0tfTk9fUkVTUE9OU0VfTUVTU0FHRSA9IFwiVGhlIG1lc3NhZ2UgcG9ydCBjbG9zZWQgYmVmb3JlIGEgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLlwiO1xuXG4gIC8vIFdyYXBwaW5nIHRoZSBidWxrIG9mIHRoaXMgcG9seWZpbGwgaW4gYSBvbmUtdGltZS11c2UgZnVuY3Rpb24gaXMgYSBtaW5vclxuICAvLyBvcHRpbWl6YXRpb24gZm9yIEZpcmVmb3guIFNpbmNlIFNwaWRlcm1vbmtleSBkb2VzIG5vdCBmdWxseSBwYXJzZSB0aGVcbiAgLy8gY29udGVudHMgb2YgYSBmdW5jdGlvbiB1bnRpbCB0aGUgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHNpbmNlIGl0IHdpbGxcbiAgLy8gbmV2ZXIgYWN0dWFsbHkgbmVlZCB0byBiZSBjYWxsZWQsIHRoaXMgYWxsb3dzIHRoZSBwb2x5ZmlsbCB0byBiZSBpbmNsdWRlZFxuICAvLyBpbiBGaXJlZm94IG5lYXJseSBmb3IgZnJlZS5cbiAgY29uc3Qgd3JhcEFQSXMgPSBleHRlbnNpb25BUElzID0+IHtcbiAgICAvLyBOT1RFOiBhcGlNZXRhZGF0YSBpcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZW50IG9mIHRoZSBhcGktbWV0YWRhdGEuanNvbiBmaWxlXG4gICAgLy8gYXQgYnVpbGQgdGltZSBieSByZXBsYWNpbmcgdGhlIGZvbGxvd2luZyBcImluY2x1ZGVcIiB3aXRoIHRoZSBjb250ZW50IG9mIHRoZVxuICAgIC8vIEpTT04gZmlsZS5cbiAgICBjb25zdCBhcGlNZXRhZGF0YSA9IHtcbiAgICAgIFwiYWxhcm1zXCI6IHtcbiAgICAgICAgXCJjbGVhclwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJjbGVhckFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJib29rbWFya3NcIjoge1xuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0Q2hpbGRyZW5cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0UmVjZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFN1YlRyZWVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VHJlZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVUcmVlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImJyb3dzZXJBY3Rpb25cIjoge1xuICAgICAgICBcImRpc2FibGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVuYWJsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3JcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QmFkZ2VUZXh0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFBvcHVwXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFRpdGxlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW5Qb3B1cFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRCYWRnZUJhY2tncm91bmRDb2xvclwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0QmFkZ2VUZXh0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRJY29uXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNldFBvcHVwXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRUaXRsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImJyb3dzaW5nRGF0YVwiOiB7XG4gICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUNhY2hlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUNvb2tpZXNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlRG93bmxvYWRzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUZvcm1EYXRhXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUhpc3RvcnlcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlTG9jYWxTdG9yYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVBhc3N3b3Jkc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVQbHVnaW5EYXRhXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb21tYW5kc1wiOiB7XG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb250ZXh0TWVudXNcIjoge1xuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb29raWVzXCI6IHtcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEFsbENvb2tpZVN0b3Jlc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJkZXZ0b29sc1wiOiB7XG4gICAgICAgIFwiaW5zcGVjdGVkV2luZG93XCI6IHtcbiAgICAgICAgICBcImV2YWxcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMixcbiAgICAgICAgICAgIFwic2luZ2xlQ2FsbGJhY2tBcmdcIjogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwicGFuZWxzXCI6IHtcbiAgICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMyxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAzLFxuICAgICAgICAgICAgXCJzaW5nbGVDYWxsYmFja0FyZ1wiOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImVsZW1lbnRzXCI6IHtcbiAgICAgICAgICAgIFwiY3JlYXRlU2lkZWJhclBhbmVcIjoge1xuICAgICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImRvd25sb2Fkc1wiOiB7XG4gICAgICAgIFwiY2FuY2VsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRvd25sb2FkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImVyYXNlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEZpbGVJY29uXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW5cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBhdXNlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUZpbGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVzdW1lXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaG93XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZXh0ZW5zaW9uXCI6IHtcbiAgICAgICAgXCJpc0FsbG93ZWRGaWxlU2NoZW1lQWNjZXNzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImlzQWxsb3dlZEluY29nbml0b0FjY2Vzc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiaGlzdG9yeVwiOiB7XG4gICAgICAgIFwiYWRkVXJsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRlbGV0ZUFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxldGVSYW5nZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxldGVVcmxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VmlzaXRzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiaTE4blwiOiB7XG4gICAgICAgIFwiZGV0ZWN0TGFuZ3VhZ2VcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWNjZXB0TGFuZ3VhZ2VzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJpZGVudGl0eVwiOiB7XG4gICAgICAgIFwibGF1bmNoV2ViQXV0aEZsb3dcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImlkbGVcIjoge1xuICAgICAgICBcInF1ZXJ5U3RhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIm1hbmFnZW1lbnRcIjoge1xuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0U2VsZlwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRFbmFibGVkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInVuaW5zdGFsbFNlbGZcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIm5vdGlmaWNhdGlvbnNcIjoge1xuICAgICAgICBcImNsZWFyXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0UGVybWlzc2lvbkxldmVsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwicGFnZUFjdGlvblwiOiB7XG4gICAgICAgIFwiZ2V0UG9wdXBcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VGl0bGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlkZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0SWNvblwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRQb3B1cFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0VGl0bGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNob3dcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJwZXJtaXNzaW9uc1wiOiB7XG4gICAgICAgIFwiY29udGFpbnNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJydW50aW1lXCI6IHtcbiAgICAgICAgXCJnZXRCYWNrZ3JvdW5kUGFnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRQbGF0Zm9ybUluZm9cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwib3Blbk9wdGlvbnNQYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInJlcXVlc3RVcGRhdGVDaGVja1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZW5kTWVzc2FnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDNcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZW5kTmF0aXZlTWVzc2FnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRVbmluc3RhbGxVUkxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInNlc3Npb25zXCI6IHtcbiAgICAgICAgXCJnZXREZXZpY2VzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFJlY2VudGx5Q2xvc2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlc3RvcmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInN0b3JhZ2VcIjoge1xuICAgICAgICBcImxvY2FsXCI6IHtcbiAgICAgICAgICBcImNsZWFyXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1hbmFnZWRcIjoge1xuICAgICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInN5bmNcIjoge1xuICAgICAgICAgIFwiY2xlYXJcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRCeXRlc0luVXNlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInRhYnNcIjoge1xuICAgICAgICBcImNhcHR1cmVWaXNpYmxlVGFiXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRlY3RMYW5ndWFnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXNjYXJkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImR1cGxpY2F0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJleGVjdXRlU2NyaXB0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRDdXJyZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImdldFpvb21cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0Wm9vbVNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdvQmFja1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnb0ZvcndhcmRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlnaGxpZ2h0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImluc2VydENTU1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInF1ZXJ5XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbG9hZFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlQ1NTXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInNlbmRNZXNzYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogM1xuICAgICAgICB9LFxuICAgICAgICBcInNldFpvb21cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0Wm9vbVNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwidG9wU2l0ZXNcIjoge1xuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwid2ViTmF2aWdhdGlvblwiOiB7XG4gICAgICAgIFwiZ2V0QWxsRnJhbWVzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEZyYW1lXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ3ZWJSZXF1ZXN0XCI6IHtcbiAgICAgICAgXCJoYW5kbGVyQmVoYXZpb3JDaGFuZ2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ3aW5kb3dzXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImdldEFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRDdXJyZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldExhc3RGb2N1c2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGFwaU1ldGFkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFwaS1tZXRhZGF0YS5qc29uIGhhcyBub3QgYmVlbiBpbmNsdWRlZCBpbiBicm93c2VyLXBvbHlmaWxsXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgV2Vha01hcCBzdWJjbGFzcyB3aGljaCBjcmVhdGVzIGFuZCBzdG9yZXMgYSB2YWx1ZSBmb3IgYW55IGtleSB3aGljaCBkb2VzXG4gICAgICogbm90IGV4aXN0IHdoZW4gYWNjZXNzZWQsIGJ1dCBiZWhhdmVzIGV4YWN0bHkgYXMgYW4gb3JkaW5hcnkgV2Vha01hcFxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNyZWF0ZUl0ZW1cbiAgICAgKiAgICAgICAgQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHZhbHVlIGZvciBhbnlcbiAgICAgKiAgICAgICAga2V5IHdoaWNoIGRvZXMgbm90IGV4aXN0LCB0aGUgZmlyc3QgdGltZSBpdCBpcyBhY2Nlc3NlZC4gVGhlXG4gICAgICogICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVzLCBhcyBpdHMgb25seSBhcmd1bWVudCwgdGhlIGtleSBiZWluZyBjcmVhdGVkLlxuICAgICAqL1xuICAgIGNsYXNzIERlZmF1bHRXZWFrTWFwIGV4dGVuZHMgV2Vha01hcCB7XG4gICAgICBjb25zdHJ1Y3RvcihjcmVhdGVJdGVtLCBpdGVtcyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcihpdGVtcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlSXRlbSA9IGNyZWF0ZUl0ZW07XG4gICAgICB9XG5cbiAgICAgIGdldChrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zZXQoa2V5LCB0aGlzLmNyZWF0ZUl0ZW0oa2V5KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gb2JqZWN0IHdpdGggYSBgdGhlbmAgbWV0aG9kLCBhbmQgY2FuXG4gICAgICogdGhlcmVmb3JlIGJlIGFzc3VtZWQgdG8gYmVoYXZlIGFzIGEgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHRoZW5hYmxlLlxuICAgICAqL1xuICAgIGNvbnN0IGlzVGhlbmFibGUgPSB2YWx1ZSA9PiB7XG4gICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSBcImZ1bmN0aW9uXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzb2x2ZSBvciByZWplY3RcbiAgICAgKiB0aGUgZ2l2ZW4gcHJvbWlzZSBiYXNlZCBvbiBob3cgaXQgaXMgY2FsbGVkOlxuICAgICAqXG4gICAgICogLSBJZiwgd2hlbiBjYWxsZWQsIGBjaHJvbWUucnVudGltZS5sYXN0RXJyb3JgIGNvbnRhaW5zIGEgbm9uLW51bGwgb2JqZWN0LFxuICAgICAqICAgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCB0aGF0IHZhbHVlLlxuICAgICAqIC0gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGV4YWN0bHkgb25lIGFyZ3VtZW50LCB0aGUgcHJvbWlzZSBpc1xuICAgICAqICAgcmVzb2x2ZWQgdG8gdGhhdCB2YWx1ZS5cbiAgICAgKiAtIE90aGVyd2lzZSwgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlXG4gICAgICogICBmdW5jdGlvbidzIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9taXNlXG4gICAgICogICAgICAgIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXNvbHV0aW9uIGFuZCByZWplY3Rpb24gZnVuY3Rpb25zIG9mIGFcbiAgICAgKiAgICAgICAgcHJvbWlzZS5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBwcm9taXNlLnJlc29sdmVcbiAgICAgKiAgICAgICAgVGhlIHByb21pc2UncyByZXNvbHV0aW9uIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHByb21pc2UucmVqZWN0XG4gICAgICogICAgICAgIFRoZSBwcm9taXNlJ3MgcmVqZWN0aW9uIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhZGF0YVxuICAgICAqICAgICAgICBNZXRhZGF0YSBhYm91dCB0aGUgd3JhcHBlZCBtZXRob2Qgd2hpY2ggaGFzIGNyZWF0ZWQgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmdcbiAgICAgKiAgICAgICAgV2hldGhlciBvciBub3QgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCBvbmx5IHRoZSBmaXJzdFxuICAgICAqICAgICAgICBhcmd1bWVudCBvZiB0aGUgY2FsbGJhY2ssIGFsdGVybmF0aXZlbHkgYW4gYXJyYXkgb2YgYWxsIHRoZVxuICAgICAqICAgICAgICBjYWxsYmFjayBhcmd1bWVudHMgaXMgcmVzb2x2ZWQuIEJ5IGRlZmF1bHQsIGlmIHRoZSBjYWxsYmFja1xuICAgICAqICAgICAgICBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggb25seSBhIHNpbmdsZSBhcmd1bWVudCwgdGhhdCB3aWxsIGJlXG4gICAgICogICAgICAgIHJlc29sdmVkIHRvIHRoZSBwcm9taXNlLCB3aGlsZSBhbGwgYXJndW1lbnRzIHdpbGwgYmUgcmVzb2x2ZWQgYXNcbiAgICAgKiAgICAgICAgYW4gYXJyYXkgaWYgbXVsdGlwbGUgYXJlIGdpdmVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9ufVxuICAgICAqICAgICAgICBUaGUgZ2VuZXJhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0IG1ha2VDYWxsYmFjayA9IChwcm9taXNlLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuICguLi5jYWxsYmFja0FyZ3MpID0+IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IpIHtcbiAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvci5tZXNzYWdlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmcgfHxcbiAgICAgICAgICAgICAgICAgICAoY2FsbGJhY2tBcmdzLmxlbmd0aCA8PSAxICYmIG1ldGFkYXRhLnNpbmdsZUNhbGxiYWNrQXJnICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2tBcmdzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgcGx1cmFsaXplQXJndW1lbnRzID0gKG51bUFyZ3MpID0+IG51bUFyZ3MgPT0gMSA/IFwiYXJndW1lbnRcIiA6IFwiYXJndW1lbnRzXCI7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdoaWNoIGlzIGJlaW5nIHdyYXBwZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhXG4gICAgICogICAgICAgIE1ldGFkYXRhIGFib3V0IHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC5cbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1ldGFkYXRhLm1pbkFyZ3NcbiAgICAgKiAgICAgICAgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCBtdXN0IGJlIHBhc3NlZCB0byB0aGVcbiAgICAgKiAgICAgICAgZnVuY3Rpb24uIElmIGNhbGxlZCB3aXRoIGZld2VyIHRoYW4gdGhpcyBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGVcbiAgICAgKiAgICAgICAgd3JhcHBlciB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi5cbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1ldGFkYXRhLm1heEFyZ3NcbiAgICAgKiAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCBtYXkgYmUgcGFzc2VkIHRvIHRoZVxuICAgICAqICAgICAgICBmdW5jdGlvbi4gSWYgY2FsbGVkIHdpdGggbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlXG4gICAgICogICAgICAgIHdyYXBwZXIgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtZXRhZGF0YS5zaW5nbGVDYWxsYmFja0FyZ1xuICAgICAqICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIG9ubHkgdGhlIGZpcnN0XG4gICAgICogICAgICAgIGFyZ3VtZW50IG9mIHRoZSBjYWxsYmFjaywgYWx0ZXJuYXRpdmVseSBhbiBhcnJheSBvZiBhbGwgdGhlXG4gICAgICogICAgICAgIGNhbGxiYWNrIGFyZ3VtZW50cyBpcyByZXNvbHZlZC4gQnkgZGVmYXVsdCwgaWYgdGhlIGNhbGxiYWNrXG4gICAgICogICAgICAgIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCBvbmx5IGEgc2luZ2xlIGFyZ3VtZW50LCB0aGF0IHdpbGwgYmVcbiAgICAgKiAgICAgICAgcmVzb2x2ZWQgdG8gdGhlIHByb21pc2UsIHdoaWxlIGFsbCBhcmd1bWVudHMgd2lsbCBiZSByZXNvbHZlZCBhc1xuICAgICAqICAgICAgICBhbiBhcnJheSBpZiBtdWx0aXBsZSBhcmUgZ2l2ZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24ob2JqZWN0LCAuLi4qKX1cbiAgICAgKiAgICAgICBUaGUgZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgY29uc3Qgd3JhcEFzeW5jRnVuY3Rpb24gPSAobmFtZSwgbWV0YWRhdGEpID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBhc3luY0Z1bmN0aW9uV3JhcHBlcih0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgbWV0YWRhdGEubWluQXJncykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttZXRhZGF0YS5taW5BcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5taW5BcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiBtZXRhZGF0YS5tYXhBcmdzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0ICR7bWV0YWRhdGEubWF4QXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWF4QXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBpZiAobWV0YWRhdGEuZmFsbGJhY2tUb05vQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIFRoaXMgQVBJIG1ldGhvZCBoYXMgY3VycmVudGx5IG5vIGNhbGxiYWNrIG9uIENocm9tZSwgYnV0IGl0IHJldHVybiBhIHByb21pc2Ugb24gRmlyZWZveCxcbiAgICAgICAgICAgIC8vIGFuZCBzbyB0aGUgcG9seWZpbGwgd2lsbCB0cnkgdG8gY2FsbCBpdCB3aXRoIGEgY2FsbGJhY2sgZmlyc3QsIGFuZCBpdCB3aWxsIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyB0byBub3QgcGFzc2luZyB0aGUgY2FsbGJhY2sgaWYgdGhlIGZpcnN0IGNhbGwgZmFpbHMuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncywgbWFrZUNhbGxiYWNrKHtyZXNvbHZlLCByZWplY3R9LCBtZXRhZGF0YSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoY2JFcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7bmFtZX0gQVBJIG1ldGhvZCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyLCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGNhbGwgaXQgd2l0aG91dCBhIGNhbGxiYWNrOiBcIiwgY2JFcnJvcik7XG5cbiAgICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MpO1xuXG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgQVBJIG1ldGhvZCBtZXRhZGF0YSwgc28gdGhhdCB0aGUgbmV4dCBBUEkgY2FsbHMgd2lsbCBub3QgdHJ5IHRvXG4gICAgICAgICAgICAgIC8vIHVzZSB0aGUgdW5zdXBwb3J0ZWQgY2FsbGJhY2sgYW55bW9yZS5cbiAgICAgICAgICAgICAgbWV0YWRhdGEuZmFsbGJhY2tUb05vQ2FsbGJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbWV0YWRhdGEubm9DYWxsYmFjayA9IHRydWU7XG5cbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEubm9DYWxsYmFjaykge1xuICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncywgbWFrZUNhbGxiYWNrKHtyZXNvbHZlLCByZWplY3R9LCBtZXRhZGF0YSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBXcmFwcyBhbiBleGlzdGluZyBtZXRob2Qgb2YgdGhlIHRhcmdldCBvYmplY3QsIHNvIHRoYXQgY2FsbHMgdG8gaXQgYXJlXG4gICAgICogaW50ZXJjZXB0ZWQgYnkgdGhlIGdpdmVuIHdyYXBwZXIgZnVuY3Rpb24uIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHJlY2VpdmVzLFxuICAgICAqIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgdGhlIG9yaWdpbmFsIGB0YXJnZXRgIG9iamVjdCwgZm9sbG93ZWQgYnkgZWFjaCBvZlxuICAgICAqIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBvcmlnaW5hbCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gICAgICogICAgICAgIFRoZSBvcmlnaW5hbCB0YXJnZXQgb2JqZWN0IHRoYXQgdGhlIHdyYXBwZWQgbWV0aG9kIGJlbG9uZ3MgdG8uXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWV0aG9kXG4gICAgICogICAgICAgIFRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4gVGhpcyBpcyB1c2VkIGFzIHRoZSB0YXJnZXQgb2YgdGhlIFByb3h5XG4gICAgICogICAgICAgIG9iamVjdCB3aGljaCBpcyBjcmVhdGVkIHRvIHdyYXAgdGhlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSB3cmFwcGVyXG4gICAgICogICAgICAgIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBpbiBwbGFjZSBvZiBhIGRpcmVjdCBpbnZvY2F0aW9uXG4gICAgICogICAgICAgIG9mIHRoZSB3cmFwcGVkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm94eTxmdW5jdGlvbj59XG4gICAgICogICAgICAgIEEgUHJveHkgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbWV0aG9kLCB3aGljaCBpbnZva2VzIHRoZSBnaXZlbiB3cmFwcGVyXG4gICAgICogICAgICAgIG1ldGhvZCBpbiBpdHMgcGxhY2UuXG4gICAgICovXG4gICAgY29uc3Qgd3JhcE1ldGhvZCA9ICh0YXJnZXQsIG1ldGhvZCwgd3JhcHBlcikgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eShtZXRob2QsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0TWV0aG9kLCB0aGlzT2JqLCBhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2FsbCh0aGlzT2JqLCB0YXJnZXQsIC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGxldCBoYXNPd25Qcm9wZXJ0eSA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIC8qKlxuICAgICAqIFdyYXBzIGFuIG9iamVjdCBpbiBhIFByb3h5IHdoaWNoIGludGVyY2VwdHMgYW5kIHdyYXBzIGNlcnRhaW4gbWV0aG9kc1xuICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBgd3JhcHBlcnNgIGFuZCBgbWV0YWRhdGFgIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gICAgICogICAgICAgIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHdyYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW3dyYXBwZXJzID0ge31dXG4gICAgICogICAgICAgIEFuIG9iamVjdCB0cmVlIGNvbnRhaW5pbmcgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHNwZWNpYWwgY2FzZXMuIEFueVxuICAgICAqICAgICAgICBmdW5jdGlvbiBwcmVzZW50IGluIHRoaXMgb2JqZWN0IHRyZWUgaXMgY2FsbGVkIGluIHBsYWNlIG9mIHRoZVxuICAgICAqICAgICAgICBtZXRob2QgaW4gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGB0YXJnZXRgIG9iamVjdCB0cmVlLiBUaGVzZVxuICAgICAqICAgICAgICB3cmFwcGVyIG1ldGhvZHMgYXJlIGludm9rZWQgYXMgZGVzY3JpYmVkIGluIHtAc2VlIHdyYXBNZXRob2R9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFttZXRhZGF0YSA9IHt9XVxuICAgICAqICAgICAgICBBbiBvYmplY3QgdHJlZSBjb250YWluaW5nIG1ldGFkYXRhIHVzZWQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZVxuICAgICAqICAgICAgICBQcm9taXNlLWJhc2VkIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMuIEFueSBmdW5jdGlvbiBpblxuICAgICAqICAgICAgICB0aGUgYHRhcmdldGAgb2JqZWN0IHRyZWUgd2hpY2ggaGFzIGEgY29ycmVzcG9uZGluZyBtZXRhZGF0YSBvYmplY3RcbiAgICAgKiAgICAgICAgaW4gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGBtZXRhZGF0YWAgdHJlZSBpcyByZXBsYWNlZCB3aXRoIGFuXG4gICAgICogICAgICAgIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb24sIGFzIGRlc2NyaWJlZCBpblxuICAgICAqICAgICAgICB7QHNlZSB3cmFwQXN5bmNGdW5jdGlvbn1cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm94eTxvYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IHdyYXBPYmplY3QgPSAodGFyZ2V0LCB3cmFwcGVycyA9IHt9LCBtZXRhZGF0YSA9IHt9KSA9PiB7XG4gICAgICBsZXQgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgbGV0IGhhbmRsZXJzID0ge1xuICAgICAgICBoYXMocHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQgfHwgcHJvcCBpbiBjYWNoZTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQocHJveHlUYXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgaWYgKHByb3AgaW4gY2FjaGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtwcm9wXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIShwcm9wIGluIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgbWV0aG9kIG9uIHRoZSB1bmRlcmx5aW5nIG9iamVjdC4gQ2hlY2sgaWYgd2UgbmVlZCB0byBkb1xuICAgICAgICAgICAgLy8gYW55IHdyYXBwaW5nLlxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHdyYXBwZXJzW3Byb3BdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHNwZWNpYWwtY2FzZSB3cmFwcGVyIGZvciB0aGlzIG1ldGhvZC5cbiAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwTWV0aG9kKHRhcmdldCwgdGFyZ2V0W3Byb3BdLCB3cmFwcGVyc1twcm9wXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc093blByb3BlcnR5KG1ldGFkYXRhLCBwcm9wKSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHdlIGhhdmUgbWV0YWRhdGEgZm9yLiBDcmVhdGUgYVxuICAgICAgICAgICAgICAvLyBQcm9taXNlIHdyYXBwZXIgZm9yIGl0LlxuICAgICAgICAgICAgICBsZXQgd3JhcHBlciA9IHdyYXBBc3luY0Z1bmN0aW9uKHByb3AsIG1ldGFkYXRhW3Byb3BdKTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwTWV0aG9kKHRhcmdldCwgdGFyZ2V0W3Byb3BdLCB3cmFwcGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBtZXRob2QgdGhhdCB3ZSBkb24ndCBrbm93IG9yIGNhcmUgYWJvdXQuIFJldHVybiB0aGVcbiAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbWV0aG9kLCBib3VuZCB0byB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuYmluZCh0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAoaGFzT3duUHJvcGVydHkod3JhcHBlcnMsIHByb3ApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIHByb3ApKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBvYmplY3QgdGhhdCB3ZSBuZWVkIHRvIGRvIHNvbWUgd3JhcHBpbmcgZm9yIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgLy8gb2YuIENyZWF0ZSBhIHN1Yi1vYmplY3Qgd3JhcHBlciBmb3IgaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY2hpbGRcbiAgICAgICAgICAgIC8vIG1ldGFkYXRhLlxuICAgICAgICAgICAgdmFsdWUgPSB3cmFwT2JqZWN0KHZhbHVlLCB3cmFwcGVyc1twcm9wXSwgbWV0YWRhdGFbcHJvcF0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIFwiKlwiKSkge1xuICAgICAgICAgICAgLy8gV3JhcCBhbGwgcHJvcGVydGllcyBpbiAqIG5hbWVzcGFjZS5cbiAgICAgICAgICAgIHZhbHVlID0gd3JhcE9iamVjdCh2YWx1ZSwgd3JhcHBlcnNbcHJvcF0sIG1ldGFkYXRhW1wiKlwiXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55IHdyYXBwaW5nIGZvciB0aGlzIHByb3BlcnR5LFxuICAgICAgICAgICAgLy8gc28ganVzdCBmb3J3YXJkIGFsbCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhY2hlLCBwcm9wLCB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWNoZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQocHJveHlUYXJnZXQsIHByb3AsIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICAgIGlmIChwcm9wIGluIGNhY2hlKSB7XG4gICAgICAgICAgICBjYWNoZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVmaW5lUHJvcGVydHkocHJveHlUYXJnZXQsIHByb3AsIGRlc2MpIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShjYWNoZSwgcHJvcCwgZGVzYyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVsZXRlUHJvcGVydHkocHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShjYWNoZSwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBQZXIgY29udHJhY3Qgb2YgdGhlIFByb3h5IEFQSSwgdGhlIFwiZ2V0XCIgcHJveHkgaGFuZGxlciBtdXN0IHJldHVybiB0aGVcbiAgICAgIC8vIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSB0YXJnZXQgaWYgdGhhdCB2YWx1ZSBpcyBkZWNsYXJlZCByZWFkLW9ubHkgYW5kXG4gICAgICAvLyBub24tY29uZmlndXJhYmxlLiBGb3IgdGhpcyByZWFzb24sIHdlIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgIC8vIHByb3RvdHlwZSBzZXQgdG8gYHRhcmdldGAgaW5zdGVhZCBvZiB1c2luZyBgdGFyZ2V0YCBkaXJlY3RseS5cbiAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW5ub3QgcmV0dXJuIGEgY3VzdG9tIG9iamVjdCBmb3IgQVBJcyB0aGF0XG4gICAgICAvLyBhcmUgZGVjbGFyZWQgcmVhZC1vbmx5IGFuZCBub24tY29uZmlndXJhYmxlLCBzdWNoIGFzIGBjaHJvbWUuZGV2dG9vbHNgLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwcm94eSBoYW5kbGVycyB0aGVtc2VsdmVzIHdpbGwgc3RpbGwgdXNlIHRoZSBvcmlnaW5hbCBgdGFyZ2V0YFxuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgYHByb3h5VGFyZ2V0YCwgc28gdGhhdCB0aGUgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcmVcbiAgICAgIC8vIGRlcmVmZXJlbmNlZCB2aWEgdGhlIG9yaWdpbmFsIHRhcmdldHMuXG4gICAgICBsZXQgcHJveHlUYXJnZXQgPSBPYmplY3QuY3JlYXRlKHRhcmdldCk7XG4gICAgICByZXR1cm4gbmV3IFByb3h5KHByb3h5VGFyZ2V0LCBoYW5kbGVycyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2Ygd3JhcHBlciBmdW5jdGlvbnMgZm9yIGFuIGV2ZW50IG9iamVjdCwgd2hpY2ggaGFuZGxlc1xuICAgICAqIHdyYXBwaW5nIG9mIGxpc3RlbmVyIGZ1bmN0aW9ucyB0aGF0IHRob3NlIG1lc3NhZ2VzIGFyZSBwYXNzZWQuXG4gICAgICpcbiAgICAgKiBBIHNpbmdsZSB3cmFwcGVyIGlzIGNyZWF0ZWQgZm9yIGVhY2ggbGlzdGVuZXIgZnVuY3Rpb24sIGFuZCBzdG9yZWQgaW4gYVxuICAgICAqIG1hcC4gU3Vic2VxdWVudCBjYWxscyB0byBgYWRkTGlzdGVuZXJgLCBgaGFzTGlzdGVuZXJgLCBvciBgcmVtb3ZlTGlzdGVuZXJgXG4gICAgICogcmV0cmlldmUgdGhlIG9yaWdpbmFsIHdyYXBwZXIsIHNvIHRoYXQgIGF0dGVtcHRzIHRvIHJlbW92ZSBhXG4gICAgICogcHJldmlvdXNseS1hZGRlZCBsaXN0ZW5lciB3b3JrIGFzIGV4cGVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEZWZhdWx0V2Vha01hcDxmdW5jdGlvbiwgZnVuY3Rpb24+fSB3cmFwcGVyTWFwXG4gICAgICogICAgICAgIEEgRGVmYXVsdFdlYWtNYXAgb2JqZWN0IHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyXG4gICAgICogICAgICAgIGZvciBhIGdpdmVuIGxpc3RlbmVyIGZ1bmN0aW9uIHdoZW4gb25lIGRvZXMgbm90IGV4aXN0LCBhbmQgcmV0cmlldmVcbiAgICAgKiAgICAgICAgYW4gZXhpc3Rpbmcgb25lIHdoZW4gaXQgZG9lcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgY29uc3Qgd3JhcEV2ZW50ID0gd3JhcHBlck1hcCA9PiAoe1xuICAgICAgYWRkTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lciwgLi4uYXJncykge1xuICAgICAgICB0YXJnZXQuYWRkTGlzdGVuZXIod3JhcHBlck1hcC5nZXQobGlzdGVuZXIpLCAuLi5hcmdzKTtcbiAgICAgIH0sXG5cbiAgICAgIGhhc0xpc3RlbmVyKHRhcmdldCwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldC5oYXNMaXN0ZW5lcih3cmFwcGVyTWFwLmdldChsaXN0ZW5lcikpO1xuICAgICAgfSxcblxuICAgICAgcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lcikge1xuICAgICAgICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIod3JhcHBlck1hcC5nZXQobGlzdGVuZXIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBvblJlcXVlc3RGaW5pc2hlZFdyYXBwZXJzID0gbmV3IERlZmF1bHRXZWFrTWFwKGxpc3RlbmVyID0+IHtcbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogV3JhcHMgYW4gb25SZXF1ZXN0RmluaXNoZWQgbGlzdGVuZXIgZnVuY3Rpb24gc28gdGhhdCBpdCB3aWxsIHJldHVybiBhXG4gICAgICAgKiBgZ2V0Q29udGVudCgpYCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgYFByb21pc2VgIHJhdGhlciB0aGFuIHVzaW5nIGFcbiAgICAgICAqIGNhbGxiYWNrIEFQSS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gICAgICAgKiAgICAgICAgVGhlIEhBUiBlbnRyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICAgKi9cbiAgICAgIHJldHVybiBmdW5jdGlvbiBvblJlcXVlc3RGaW5pc2hlZChyZXEpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZFJlcSA9IHdyYXBPYmplY3QocmVxLCB7fSAvKiB3cmFwcGVycyAqLywge1xuICAgICAgICAgIGdldENvbnRlbnQ6IHtcbiAgICAgICAgICAgIG1pbkFyZ3M6IDAsXG4gICAgICAgICAgICBtYXhBcmdzOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBsaXN0ZW5lcih3cmFwcGVkUmVxKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbk1lc3NhZ2VXcmFwcGVycyA9IG5ldyBEZWZhdWx0V2Vha01hcChsaXN0ZW5lciA9PiB7XG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFdyYXBzIGEgbWVzc2FnZSBsaXN0ZW5lciBmdW5jdGlvbiBzbyB0aGF0IGl0IG1heSBzZW5kIHJlc3BvbnNlcyBiYXNlZCBvblxuICAgICAgICogaXRzIHJldHVybiB2YWx1ZSwgcmF0aGVyIHRoYW4gYnkgcmV0dXJuaW5nIGEgc2VudGluZWwgdmFsdWUgYW5kIGNhbGxpbmcgYVxuICAgICAgICogY2FsbGJhY2suIElmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiByZXR1cm5zIGEgUHJvbWlzZSwgdGhlIHJlc3BvbnNlIGlzXG4gICAgICAgKiBzZW50IHdoZW4gdGhlIHByb21pc2UgZWl0aGVyIHJlc29sdmVzIG9yIHJlamVjdHMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHsqfSBtZXNzYWdlXG4gICAgICAgKiAgICAgICAgVGhlIG1lc3NhZ2Ugc2VudCBieSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjaGFubmVsLlxuICAgICAgICogQHBhcmFtIHtvYmplY3R9IHNlbmRlclxuICAgICAgICogICAgICAgIERldGFpbHMgYWJvdXQgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKil9IHNlbmRSZXNwb25zZVxuICAgICAgICogICAgICAgIEEgY2FsbGJhY2sgd2hpY2gsIHdoZW4gY2FsbGVkIHdpdGggYW4gYXJiaXRyYXJ5IGFyZ3VtZW50LCBzZW5kc1xuICAgICAgICogICAgICAgIHRoYXQgdmFsdWUgYXMgYSByZXNwb25zZS5cbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICogICAgICAgIFRydWUgaWYgdGhlIHdyYXBwZWQgbGlzdGVuZXIgcmV0dXJuZWQgYSBQcm9taXNlLCB3aGljaCB3aWxsIGxhdGVyXG4gICAgICAgKiAgICAgICAgeWllbGQgYSByZXNwb25zZS4gRmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAgICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gb25NZXNzYWdlKG1lc3NhZ2UsIHNlbmRlciwgc2VuZFJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkaWRDYWxsU2VuZFJlc3BvbnNlID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IHdyYXBwZWRTZW5kUmVzcG9uc2U7XG4gICAgICAgIGxldCBzZW5kUmVzcG9uc2VQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgd3JhcHBlZFNlbmRSZXNwb25zZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBkaWRDYWxsU2VuZFJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gbGlzdGVuZXIobWVzc2FnZSwgc2VuZGVyLCB3cmFwcGVkU2VuZFJlc3BvbnNlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUmVzdWx0VGhlbmFibGUgPSByZXN1bHQgIT09IHRydWUgJiYgaXNUaGVuYWJsZShyZXN1bHQpO1xuXG4gICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBkaWRuJ3QgcmV0dXJuZWQgdHJ1ZSBvciBhIFByb21pc2UsIG9yIGNhbGxlZFxuICAgICAgICAvLyB3cmFwcGVkU2VuZFJlc3BvbnNlIHN5bmNocm9ub3VzbHksIHdlIGNhbiBleGl0IGVhcmxpZXJcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSB3aWxsIGJlIG5vIHJlc3BvbnNlIHNlbnQgZnJvbSB0aGlzIGxpc3RlbmVyLlxuICAgICAgICBpZiAocmVzdWx0ICE9PSB0cnVlICYmICFpc1Jlc3VsdFRoZW5hYmxlICYmICFkaWRDYWxsU2VuZFJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBzbWFsbCBoZWxwZXIgdG8gc2VuZCB0aGUgbWVzc2FnZSBpZiB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgICAvLyBhbmQgYW4gZXJyb3IgaWYgdGhlIHByb21pc2UgcmVqZWN0cyAoYSB3cmFwcGVkIHNlbmRNZXNzYWdlIGhhc1xuICAgICAgICAvLyB0byB0cmFuc2xhdGUgdGhlIG1lc3NhZ2UgaW50byBhIHJlc29sdmVkIHByb21pc2Ugb3IgYSByZWplY3RlZFxuICAgICAgICAvLyBwcm9taXNlKS5cbiAgICAgICAgY29uc3Qgc2VuZFByb21pc2VkUmVzdWx0ID0gKHByb21pc2UpID0+IHtcbiAgICAgICAgICBwcm9taXNlLnRoZW4obXNnID0+IHtcbiAgICAgICAgICAgIC8vIHNlbmQgdGhlIG1lc3NhZ2UgdmFsdWUuXG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UobXNnKTtcbiAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAvLyBTZW5kIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgaWYgdGhlIHJlamVjdGVkIHZhbHVlXG4gICAgICAgICAgICAvLyBpcyBhbiBpbnN0YW5jZSBvZiBlcnJvciwgb3IgdGhlIG9iamVjdCBpdHNlbGYgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXNzYWdlID0gXCJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7XG4gICAgICAgICAgICAgIF9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXzogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAvLyBQcmludCBhbiBlcnJvciBvbiB0aGUgY29uc29sZSBpZiB1bmFibGUgdG8gc2VuZCB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNlbmQgb25NZXNzYWdlIHJlamVjdGVkIHJlcGx5XCIsIGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSWYgdGhlIGxpc3RlbmVyIHJldHVybmVkIGEgUHJvbWlzZSwgc2VuZCB0aGUgcmVzb2x2ZWQgdmFsdWUgYXMgYVxuICAgICAgICAvLyByZXN1bHQsIG90aGVyd2lzZSB3YWl0IHRoZSBwcm9taXNlIHJlbGF0ZWQgdG8gdGhlIHdyYXBwZWRTZW5kUmVzcG9uc2VcbiAgICAgICAgLy8gY2FsbGJhY2sgdG8gcmVzb2x2ZSBhbmQgc2VuZCBpdCBhcyBhIHJlc3BvbnNlLlxuICAgICAgICBpZiAoaXNSZXN1bHRUaGVuYWJsZSkge1xuICAgICAgICAgIHNlbmRQcm9taXNlZFJlc3VsdChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbmRQcm9taXNlZFJlc3VsdChzZW5kUmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExldCBDaHJvbWUga25vdyB0aGF0IHRoZSBsaXN0ZW5lciBpcyByZXBseWluZy5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgd3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2sgPSAoe3JlamVjdCwgcmVzb2x2ZX0sIHJlcGx5KSA9PiB7XG4gICAgICBpZiAoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAvLyBEZXRlY3Qgd2hlbiBub25lIG9mIHRoZSBsaXN0ZW5lcnMgcmVwbGllZCB0byB0aGUgc2VuZE1lc3NhZ2UgY2FsbCBhbmQgcmVzb2x2ZVxuICAgICAgICAvLyB0aGUgcHJvbWlzZSB0byB1bmRlZmluZWQgYXMgaW4gRmlyZWZveC5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbC9pc3N1ZXMvMTMwXG4gICAgICAgIGlmIChleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yLm1lc3NhZ2UgPT09IENIUk9NRV9TRU5EX01FU1NBR0VfQ0FMTEJBQ0tfTk9fUkVTUE9OU0VfTUVTU0FHRSkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IubWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlcGx5ICYmIHJlcGx5Ll9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXykge1xuICAgICAgICAvLyBDb252ZXJ0IGJhY2sgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGludG9cbiAgICAgICAgLy8gYW4gRXJyb3IgaW5zdGFuY2UuXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IocmVwbHkubWVzc2FnZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShyZXBseSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHdyYXBwZWRTZW5kTWVzc2FnZSA9IChuYW1lLCBtZXRhZGF0YSwgYXBpTmFtZXNwYWNlT2JqLCAuLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPCBtZXRhZGF0YS5taW5BcmdzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttZXRhZGF0YS5taW5BcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5taW5BcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA+IG1ldGFkYXRhLm1heEFyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0ICR7bWV0YWRhdGEubWF4QXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWF4QXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3cmFwcGVkQ2IgPSB3cmFwcGVkU2VuZE1lc3NhZ2VDYWxsYmFjay5iaW5kKG51bGwsIHtyZXNvbHZlLCByZWplY3R9KTtcbiAgICAgICAgYXJncy5wdXNoKHdyYXBwZWRDYik7XG4gICAgICAgIGFwaU5hbWVzcGFjZU9iai5zZW5kTWVzc2FnZSguLi5hcmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBzdGF0aWNXcmFwcGVycyA9IHtcbiAgICAgIGRldnRvb2xzOiB7XG4gICAgICAgIG5ldHdvcms6IHtcbiAgICAgICAgICBvblJlcXVlc3RGaW5pc2hlZDogd3JhcEV2ZW50KG9uUmVxdWVzdEZpbmlzaGVkV3JhcHBlcnMpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJ1bnRpbWU6IHtcbiAgICAgICAgb25NZXNzYWdlOiB3cmFwRXZlbnQob25NZXNzYWdlV3JhcHBlcnMpLFxuICAgICAgICBvbk1lc3NhZ2VFeHRlcm5hbDogd3JhcEV2ZW50KG9uTWVzc2FnZVdyYXBwZXJzKSxcbiAgICAgICAgc2VuZE1lc3NhZ2U6IHdyYXBwZWRTZW5kTWVzc2FnZS5iaW5kKG51bGwsIFwic2VuZE1lc3NhZ2VcIiwge21pbkFyZ3M6IDEsIG1heEFyZ3M6IDN9KSxcbiAgICAgIH0sXG4gICAgICB0YWJzOiB7XG4gICAgICAgIHNlbmRNZXNzYWdlOiB3cmFwcGVkU2VuZE1lc3NhZ2UuYmluZChudWxsLCBcInNlbmRNZXNzYWdlXCIsIHttaW5BcmdzOiAyLCBtYXhBcmdzOiAzfSksXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3Qgc2V0dGluZ01ldGFkYXRhID0ge1xuICAgICAgY2xlYXI6IHttaW5BcmdzOiAxLCBtYXhBcmdzOiAxfSxcbiAgICAgIGdldDoge21pbkFyZ3M6IDEsIG1heEFyZ3M6IDF9LFxuICAgICAgc2V0OiB7bWluQXJnczogMSwgbWF4QXJnczogMX0sXG4gICAgfTtcbiAgICBhcGlNZXRhZGF0YS5wcml2YWN5ID0ge1xuICAgICAgbmV0d29yazoge1wiKlwiOiBzZXR0aW5nTWV0YWRhdGF9LFxuICAgICAgc2VydmljZXM6IHtcIipcIjogc2V0dGluZ01ldGFkYXRhfSxcbiAgICAgIHdlYnNpdGVzOiB7XCIqXCI6IHNldHRpbmdNZXRhZGF0YX0sXG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwT2JqZWN0KGV4dGVuc2lvbkFQSXMsIHN0YXRpY1dyYXBwZXJzLCBhcGlNZXRhZGF0YSk7XG4gIH07XG5cbiAgLy8gVGhlIGJ1aWxkIHByb2Nlc3MgYWRkcyBhIFVNRCB3cmFwcGVyIGFyb3VuZCB0aGlzIGZpbGUsIHdoaWNoIG1ha2VzIHRoZVxuICAvLyBgbW9kdWxlYCB2YXJpYWJsZSBhdmFpbGFibGUuXG4gIG1vZHVsZS5leHBvcnRzID0gd3JhcEFQSXMoY2hyb21lKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsVGhpcy5icm93c2VyO1xufVxuIiwgIi8vIEhhbnpvIEJyb3dzZXIgRXh0ZW5zaW9uIC0gQ29udGVudCBTY3JpcHRcbi8vIENvbm5lY3RzIGNsaWNrZWQgZWxlbWVudHMgdG8gc291cmNlIGNvZGUgdmlhIHNvdXJjZS1tYXBzXG4vL1xuLy8gUG9seWZpbGwgTVVTVCBiZSB0aGUgZmlyc3QgaW1wb3J0IHNvIGFueSBzdWJzZXF1ZW50IGNvZGUgdGhhdCB0b3VjaGVzXG4vLyBgYnJvd3Nlci4qYCAodGhlIGNyb3NzLWJyb3dzZXIgQVBJIHN1cmZhY2UpIHNlZXMgdGhlIHdyYXBwZWQgUHJvbWlzZVxuLy8gQVBJIG9uIENocm9tZSB0b28uIE9uIG5hdGl2ZSBydW50aW1lcyAoRmlyZWZveCAvIFNhZmFyaSkgdGhlIGltcG9ydCBpc1xuLy8gYSBuby1vcC5cbmltcG9ydCAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VULFxuICBsb2FkSW5zcGVjdFNob3J0Y3V0LFxuICBtYXRjaGVzU2hvcnRjdXQsXG4gIFNUT1JBR0VfS0VZX0lOU1BFQ1QsXG4gIHR5cGUgU2hvcnRjdXQsXG59IGZyb20gJy4vc2hhcmVkL3Nob3J0Y3V0LmpzJztcblxuaW50ZXJmYWNlIFNvdXJjZUxvY2F0aW9uIHtcbiAgZmlsZTogc3RyaW5nO1xuICBsaW5lOiBudW1iZXI7XG4gIGNvbHVtbj86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEVsZW1lbnRTZWxlY3RlZEV2ZW50IHtcbiAgZXZlbnQ6ICdlbGVtZW50U2VsZWN0ZWQnO1xuICBmcmFtZXdvcms6IHN0cmluZyB8IG51bGw7XG4gIGRvbVBhdGg6IHN0cmluZztcbiAgc291cmNlPzogU291cmNlTG9jYXRpb247XG4gIGZhbGxiYWNrSWQ/OiBzdHJpbmc7XG59XG5cbmNsYXNzIEhhbnpvQ29udGVudFNjcmlwdCB7XG4gIC8vIENhY2hlIHRoZSBjb25maWd1cmVkIHNob3J0Y3V0IHNvIGV2ZXJ5IGNsaWNrL21vdXNlbW92ZSBkb2Vzbid0IGhpdFxuICAvLyBjaHJvbWUuc3RvcmFnZS4gUmVsb2FkZWQgZWFnZXJseSBvbiBzdG9yYWdlIGNoYW5nZSBzbyB0aGUgcG9wdXAnc1xuICAvLyByZWNvcmRlciB1cGRhdGVzIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5IChubyBwYWdlIHJlbG9hZCByZXF1aXJlZCkuXG4gIHByaXZhdGUgaW5zcGVjdFNob3J0Y3V0OiBTaG9ydGN1dCA9IHsgLi4uREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VUIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2FkU2hvcnRjdXQoKTtcbiAgICB0aGlzLndhdGNoU2hvcnRjdXQoKTtcbiAgICB0aGlzLnNldHVwQ2xpY2tIYW5kbGVyKCk7XG4gICAgdGhpcy5pbmplY3RIZWxwZXJzKCk7XG4gICAgdGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2hvcnRjdXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGNocm9tZS5zdG9yYWdlLmxvY2FsIGluIE1WMyByZXR1cm5zIGEgUHJvbWlzZS5cbiAgICAgIHRoaXMuaW5zcGVjdFNob3J0Y3V0ID0gYXdhaXQgbG9hZEluc3BlY3RTaG9ydGN1dChjaHJvbWUuc3RvcmFnZS5sb2NhbCBhcyBhbnkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5pbnNwZWN0U2hvcnRjdXQgPSB7IC4uLkRFRkFVTFRfSU5TUEVDVF9TSE9SVENVVCB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd2F0Y2hTaG9ydGN1dCgpIHtcbiAgICB0cnkge1xuICAgICAgY2hyb21lLnN0b3JhZ2Uub25DaGFuZ2VkLmFkZExpc3RlbmVyKChjaGFuZ2VzLCBhcmVhKSA9PiB7XG4gICAgICAgIGlmIChhcmVhICE9PSAnbG9jYWwnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGMgPSBjaGFuZ2VzW1NUT1JBR0VfS0VZX0lOU1BFQ1RdO1xuICAgICAgICBpZiAoIWMpIHJldHVybjtcbiAgICAgICAgaWYgKGMubmV3VmFsdWUgJiYgdHlwZW9mIGMubmV3VmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5pbnNwZWN0U2hvcnRjdXQgPSBjLm5ld1ZhbHVlIGFzIFNob3J0Y3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW5zcGVjdFNob3J0Y3V0ID0geyAuLi5ERUZBVUxUX0lOU1BFQ1RfU0hPUlRDVVQgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBhbGwgc3RvcmFnZSBBUElzIGltcGxlbWVudCBvbkNoYW5nZWQgKi8gfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENsaWNrSGFuZGxlcigpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoIW1hdGNoZXNTaG9ydGN1dChlLCB0aGlzLmluc3BlY3RTaG9ydGN1dCkpIHJldHVybjtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5leHRyYWN0U291cmNlTG9jYXRpb24oZWxlbWVudCk7XG4gICAgICBjb25zdCBkb21QYXRoID0gdGhpcy5nZXRET01QYXRoKGVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBldmVudDogRWxlbWVudFNlbGVjdGVkRXZlbnQgPSB7XG4gICAgICAgIGV2ZW50OiAnZWxlbWVudFNlbGVjdGVkJyxcbiAgICAgICAgZnJhbWV3b3JrOiB0aGlzLmRldGVjdEZyYW1ld29yaygpLFxuICAgICAgICBkb21QYXRoLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGZhbGxiYWNrSWQ6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLWlkJykgfHwgdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gUm91dGUgdGhyb3VnaCBiYWNrZ3JvdW5kIHNjcmlwdCAod29ya3Mgd2l0aCBib3RoIFpBUCBhbmQgbGVnYWN5IE1DUClcbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnZWxlbWVudFNlbGVjdGVkJywgZGF0YTogZXZlbnQgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTWVzc2FnZUhhbmRsZXJzKCkge1xuICAgIGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcigocmVxdWVzdCwgX3NlbmRlciwgc2VuZFJlc3BvbnNlKSA9PiB7XG4gICAgICBzd2l0Y2ggKHJlcXVlc3QuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2FpLmNvbnRyb2wuc3RhcnQnOlxuICAgICAgICAgIGFpT3ZlcmxheS5zaG93KHJlcXVlc3QudGFzayB8fCAnQUkgaXMgY29udHJvbGxpbmcgdGhpcyBwYWdlJyk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5zdG9wJzpcbiAgICAgICAgICBhaU92ZXJsYXkuaGlkZSgpO1xuICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2FpLmNvbnRyb2wuY3Vyc29yJzpcbiAgICAgICAgICBhaU92ZXJsYXkubW92ZUN1cnNvcihyZXF1ZXN0LngsIHJlcXVlc3QueSk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5oaWdobGlnaHQnOlxuICAgICAgICAgIGFpT3ZlcmxheS5oaWdobGlnaHQocmVxdWVzdC5zZWxlY3Rvcik7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5zdGF0dXMnOlxuICAgICAgICAgIGFpT3ZlcmxheS51cGRhdGVTdGF0dXMocmVxdWVzdC50ZXh0KTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkudG9nZ2xlJzpcbiAgICAgICAgICBpZiAocmVxdWVzdC5zaWRlID09PSAnbGVmdCcgfHwgcmVxdWVzdC5zaWRlID09PSAncmlnaHQnKSBwYWdlT3ZlcmxheS5zZXRTaWRlKHJlcXVlc3Quc2lkZSk7XG4gICAgICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3B1c2gnIHx8IHJlcXVlc3QubW9kZSA9PT0gJ292ZXJsYXknKSBwYWdlT3ZlcmxheS5zZXRNb2RlKHJlcXVlc3QubW9kZSk7XG4gICAgICAgICAgaWYgKHJlcXVlc3Qud2lkdGggPT09ICdjb21wYWN0JyB8fCByZXF1ZXN0LndpZHRoID09PSAnZGVmYXVsdCcgfHwgcmVxdWVzdC53aWR0aCA9PT0gJ3dpZGUnKSB7XG4gICAgICAgICAgICBwYWdlT3ZlcmxheS5zZXRXaWR0aChyZXF1ZXN0LndpZHRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBvcGVuOiBwYWdlT3ZlcmxheS50b2dnbGUoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnNob3cnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LnNpZGUgPT09ICdsZWZ0JyB8fCByZXF1ZXN0LnNpZGUgPT09ICdyaWdodCcpIHBhZ2VPdmVybGF5LnNldFNpZGUocmVxdWVzdC5zaWRlKTtcbiAgICAgICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAncHVzaCcgfHwgcmVxdWVzdC5tb2RlID09PSAnb3ZlcmxheScpIHBhZ2VPdmVybGF5LnNldE1vZGUocmVxdWVzdC5tb2RlKTtcbiAgICAgICAgICBpZiAocmVxdWVzdC53aWR0aCA9PT0gJ2NvbXBhY3QnIHx8IHJlcXVlc3Qud2lkdGggPT09ICdkZWZhdWx0JyB8fCByZXF1ZXN0LndpZHRoID09PSAnd2lkZScpIHtcbiAgICAgICAgICAgIHBhZ2VPdmVybGF5LnNldFdpZHRoKHJlcXVlc3Qud2lkdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlT3ZlcmxheS5zaG93KCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgb3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LmhpZGUnOlxuICAgICAgICAgIHBhZ2VPdmVybGF5LmhpZGUoKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCBvcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnN0YXR1cyc6XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBvcGVuOiBwYWdlT3ZlcmxheS5pc09wZW4oKSxcbiAgICAgICAgICAgIHNpZGU6IHBhZ2VPdmVybGF5LmdldFNpZGUoKSxcbiAgICAgICAgICAgIG1vZGU6IHBhZ2VPdmVybGF5LmdldE1vZGUoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnNldFNpZGUnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LnNpZGUgPT09ICdsZWZ0JyB8fCByZXF1ZXN0LnNpZGUgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHBhZ2VPdmVybGF5LnNldFNpZGUocmVxdWVzdC5zaWRlKTtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUsIHNpZGU6IHJlcXVlc3Quc2lkZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnc2lkZSBtdXN0IGJlIFwibGVmdFwiIG9yIFwicmlnaHRcIicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0TW9kZSc6XG4gICAgICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3B1c2gnIHx8IHJlcXVlc3QubW9kZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgICAgICBwYWdlT3ZlcmxheS5zZXRNb2RlKHJlcXVlc3QubW9kZSk7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCBtb2RlOiByZXF1ZXN0Lm1vZGUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ21vZGUgbXVzdCBiZSBcInB1c2hcIiBvciBcIm92ZXJsYXlcIicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0V2lkdGgnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LndpZHRoID09PSAnY29tcGFjdCcgfHwgcmVxdWVzdC53aWR0aCA9PT0gJ2RlZmF1bHQnIHx8IHJlcXVlc3Qud2lkdGggPT09ICd3aWRlJykge1xuICAgICAgICAgICAgcGFnZU92ZXJsYXkuc2V0V2lkdGgocmVxdWVzdC53aWR0aCk7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCB3aWR0aDogcmVxdWVzdC53aWR0aCB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnd2lkdGggbXVzdCBiZSBjb21wYWN0fGRlZmF1bHR8d2lkZScgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0RW5hYmxlZCc6XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmVuYWJsZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFnZU92ZXJsYXkuc2V0RW5hYmxlZChyZXF1ZXN0LmVuYWJsZWQpO1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgZW5hYmxlZDogcmVxdWVzdC5lbmFibGVkIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdlbmFibGVkIG11c3QgYmUgYm9vbGVhbicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIC0tLSBQb3B1cCBUb29sIEFjdGlvbnMgLS0tXG4gICAgICAgIGNhc2UgJ3Rvb2wucGlja2VyLnN0YXJ0JzpcbiAgICAgICAgICBlbGVtZW50UGlja2VyLnN0YXJ0KCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5waWNrZXIuc3RvcCc6XG4gICAgICAgICAgZWxlbWVudFBpY2tlci5zdG9wKCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5wYWdlaW5mbyc6XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgaW5mbzogZ2F0aGVyUGFnZUluZm8oKSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5jb25zb2xlLnN0YXJ0JzpcbiAgICAgICAgICBpbmxpbmVDb25zb2xlLnNob3coKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICd0b29sLmNvbnNvbGUuaGlkZSc6XG4gICAgICAgICAgaW5saW5lQ29uc29sZS5oaWRlKCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGFiIGZpbGVzeXN0ZW0gc3VwcG9ydFxuICAgICAgaWYgKHJlcXVlc3QuYWN0aW9uID09PSAnZ2V0Q29udGVudCcpIHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKHsgY29udGVudDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Py5vdXRlckhUTUwgfHwgJycgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdC5hY3Rpb24gPT09ICdzZXRDb250ZW50Jykge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3QuY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgZG9jdW1lbnQud3JpdGUocmVxdWVzdC5jb250ZW50KTtcbiAgICAgICAgICBkb2N1bWVudC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTb3VyY2VMb2NhdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCk6IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmcmFtZXdvcmsgPSB0aGlzLmRldGVjdEZyYW1ld29yaygpO1xuXG4gICAgc3dpdGNoIChmcmFtZXdvcmspIHtcbiAgICAgIGNhc2UgJ3JlYWN0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFJlYWN0U291cmNlKGVsZW1lbnQpO1xuICAgICAgY2FzZSAndnVlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFZ1ZVNvdXJjZShlbGVtZW50KTtcbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RTdmVsdGVTb3VyY2UoZWxlbWVudCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFJlYWN0U291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhvb2sgPSAod2luZG93IGFzIGFueSkuX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICAgIGlmICghaG9vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGZpYmVyID0gdGhpcy5maW5kUmVhY3RGaWJlcihlbGVtZW50KTtcbiAgICBpZiAoIWZpYmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc291cmNlID0gZmliZXIuX2RlYnVnU291cmNlIHx8IGZpYmVyLnBlbmRpbmdQcm9wcz8uX19zb3VyY2UgfHwgZmliZXIubWVtb2l6ZWRQcm9wcz8uX19zb3VyY2U7XG5cbiAgICBpZiAoc291cmNlICYmIHNvdXJjZS5maWxlTmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZTogc291cmNlLmZpbGVOYW1lLFxuICAgICAgICBsaW5lOiBzb3VyY2UubGluZU51bWJlcixcbiAgICAgICAgY29sdW1uOiBzb3VyY2UuY29sdW1uTnVtYmVyLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUmVhY3RGaWJlcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSB7XG4gICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZWxlbWVudCkuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5zdGFydHNXaXRoKCdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnKSB8fCBjYW5kaWRhdGUuc3RhcnRzV2l0aCgnX19yZWFjdEZpYmVyJCcpLFxuICAgICk7XG4gICAgcmV0dXJuIGtleSA/IChlbGVtZW50IGFzIGFueSlba2V5XSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RWdWVTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBTb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaG9vayA9ICh3aW5kb3cgYXMgYW55KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICAgIGlmICghaG9vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGxldCBpbnN0YW5jZSA9IChlbGVtZW50IGFzIGFueSkuX192dWVQYXJlbnRDb21wb25lbnQ7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSAoZWxlbWVudCBhcyBhbnkpLl9fdnVlX187XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlPy50eXBlPy5fX2ZpbGUpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uOiBTb3VyY2VMb2NhdGlvbiA9IHtcbiAgICAgICAgZmlsZTogaW5zdGFuY2UudHlwZS5fX2ZpbGUsXG4gICAgICAgIGxpbmU6IDEsXG4gICAgICB9O1xuXG4gICAgICBpZiAoaW5zdGFuY2Uudm5vZGU/LmxvYykge1xuICAgICAgICBsb2NhdGlvbi5saW5lID0gaW5zdGFuY2Uudm5vZGUubG9jLnN0YXJ0LmxpbmU7XG4gICAgICAgIGxvY2F0aW9uLmNvbHVtbiA9IGluc3RhbmNlLnZub2RlLmxvYy5zdGFydC5jb2x1bW47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0U3ZlbHRlU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IChlbGVtZW50IGFzIGFueSkuX19zdmVsdGVfY29tcG9uZW50O1xuICAgIGlmIChjb21wb25lbnQ/LiQkPy5jdHg/LiQkX2xvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50LiQkLmN0eC4kJF9sb2NhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0RnJhbWV3b3JrKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICgod2luZG93IGFzIGFueSkuX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fKSByZXR1cm4gJ3JlYWN0JztcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIHJldHVybiAndnVlJztcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fc3ZlbHRlKSByZXR1cm4gJ3N2ZWx0ZSc7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldERPTVBhdGgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cnJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQ7XG5cbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICBsZXQgc2VsZWN0b3IgPSBjdXJyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGN1cnJlbnQuaWQpIHtcbiAgICAgICAgc2VsZWN0b3IgKz0gYCMke2N1cnJlbnQuaWR9YDtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5jbGFzc05hbWUpIHtcbiAgICAgICAgc2VsZWN0b3IgKz0gYC4ke2N1cnJlbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykuam9pbignLicpfWA7XG4gICAgICB9XG5cbiAgICAgIHBhdGgudW5zaGlmdChzZWxlY3Rvcik7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoLmpvaW4oJyA+ICcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3RIZWxwZXJzKCkge1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIFtkYXRhLWhhbnpvLWhvdmVyXSB7XG4gICAgICAgIG91dGxpbmU6IDJweCBkYXNoZWQgI2ZmNmI2YiAhaW1wb3J0YW50O1xuICAgICAgICBvdXRsaW5lLW9mZnNldDogMnB4ICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgYDtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIChlKSA9PiB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1oYW56by1ob3Zlcl0nKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaGFuem8taG92ZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBtb3VzZW1vdmUgZ2l2ZXMgdGhlIHNhbWUgbW9kaWZpZXIgZmxhZ3MgYXMgY2xpY2ssIHNvIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCBpbnNwZWN0IHNob3J0Y3V0IGdvdmVybnMgdGhlIGhvdmVyIG91dGxpbmUgdG9vLlxuICAgICAgaWYgKG1hdGNoZXNTaG9ydGN1dChlLCB0aGlzLmluc3BlY3RTaG9ydGN1dCkgJiYgZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBlLnRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuem8taG92ZXInLCAndHJ1ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBSSBDb250cm9sIE92ZXJsYXkgXHUyMDE0IHRha2VvdmVyIHZpc3VhbCBmZWVkYmFjayArIHVzZXIgaW50ZXJhY3Rpb24gbG9ja1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgYWlPdmVybGF5ID0gKCgpID0+IHtcbiAgbGV0IG92ZXJsYXk6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBjdXJzb3I6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdGF0dXNFbDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGNhbmNlbEJ0bjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGhpZ2hsaWdodEVsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgdHJhaWxOb2RlczogSFRNTERpdkVsZW1lbnRbXSA9IFtdO1xuICBsZXQgaW50ZXJhY3Rpb25CbG9ja0FjdGl2ZSA9IGZhbHNlO1xuXG4gIGNvbnN0IE9WRVJMQVlfSUQgPSAnaGFuem8tYWktb3ZlcmxheSc7XG4gIGNvbnN0IFNUWUxFU19JRCA9ICdoYW56by1haS1vdmVybGF5LXN0eWxlcyc7XG4gIGNvbnN0IEJMT0NLRURfRVZFTlRTID0gW1xuICAgICdjbGljaycsICdkYmxjbGljaycsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdjb250ZXh0bWVudScsXG4gICAgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJ1cCcsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcsICd3aGVlbCcsXG4gICAgJ2tleWRvd24nLCAna2V5dXAnLCAna2V5cHJlc3MnLFxuICBdO1xuXG4gIGZ1bmN0aW9uIGluamVjdFN0eWxlcygpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU1RZTEVTX0lEKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLmlkID0gU1RZTEVTX0lEO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgICAgLyogLS0tLSBPdmVybGF5IGJhY2tkcm9wIC0tLS0gKi9cbiAgICAgICMke09WRVJMQVlfSUR9IHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoOTB2dyA5MHZoIGF0IDE1JSA4JSwgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMTApLCB0cmFuc3BhcmVudCA1NSUpLFxuICAgICAgICAgIHJhZGlhbC1ncmFkaWVudCg2NXZ3IDY1dmggYXQgODQlIDgyJSwgcmdiYSg5OSwgMTAyLCAyNDEsIDAuMTApLCB0cmFuc3BhcmVudCA2MCUpLFxuICAgICAgICAgIHJnYmEoMiwgNCwgMTAsIDAuNDIpO1xuICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMS41cHgpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICB9XG4gICAgICAjJHtPVkVSTEFZX0lEfS5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgLyogLS0tLSBQdWxzaW5nIGN5YW4gZ2xvdyBjdXJzb3IgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLWN1cnNvciB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYm9yZGVyOiAycHggc29saWQgcmdiYSg2LCAxODIsIDIxMiwgMC45NSk7XG4gICAgICAgIGJveC1zaGFkb3c6XG4gICAgICAgICAgMCAwIDhweCAycHggcmdiYSg2LCAxODIsIDIxMiwgMC40NSksXG4gICAgICAgICAgMCAwIDI0cHggNnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuMTgpO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlLW91dCwgdG9wIDAuMThzIGVhc2Utb3V0O1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLWN1cnNvci1wdWxzZSAxLjZzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLWN1cnNvci5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlLW91dCwgdG9wIDAuMThzIGVhc2Utb3V0LCBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIGhhbnpvLWN1cnNvci1wdWxzZSB7XG4gICAgICAgIDAlLCAxMDAlIHtcbiAgICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgICAgMCAwIDhweCAycHggcmdiYSg2LCAxODIsIDIxMiwgMC40NSksXG4gICAgICAgICAgICAwIDAgMjRweCA2cHggcmdiYSg2LCAxODIsIDIxMiwgMC4xOCk7XG4gICAgICAgIH1cbiAgICAgICAgNTAlIHtcbiAgICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgICAgMCAwIDE0cHggNHB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuNjUpLFxuICAgICAgICAgICAgMCAwIDM2cHggMTBweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjI4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIEN1cnNvciB0cmFpbCAtLS0tICovXG4gICAgICAuaGFuem8tY3Vyc29yLXRyYWlsIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB3aWR0aDogNnB4O1xuICAgICAgICBoZWlnaHQ6IDZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDYsIDE4MiwgMjEyLCAwLjcpO1xuICAgICAgICB6LWluZGV4OiAyMTQ3NDgzNjQ2O1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIGFuaW1hdGlvbjogaGFuem8tdHJhaWwtZmFkZSAwLjRzIGVhc2Utb3V0IGZvcndhcmRzO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by10cmFpbC1mYWRlIHtcbiAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDAuNzsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMSk7IH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgwLjE1KTsgfVxuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIFN0YXR1cyBiYW5uZXIgKHRvcCBjZW50ZXIgcGlsbCkgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLXN0YXR1cyB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgdG9wOiAxNnB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBtYXgtd2lkdGg6IDkwdnc7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg4LCAxMiwgMjAsIDAuOTQpLCByZ2JhKDEwLCAxNiwgMjQsIDAuOTYpKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMjYpO1xuICAgICAgICBjb2xvcjogI2YzZjRmNjtcbiAgICAgICAgZm9udDogMTNweC8xLjQgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmO1xuICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgIDAgMTBweCAzNnB4IHJnYmEoMCwgMCwgMCwgMC40NiksXG4gICAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG4gICAgICAuaGFuem8tYWktc3RhdHVzOjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBpbnNldDogLTJweCBhdXRvIC0ycHggLTIwJTtcbiAgICAgICAgd2lkdGg6IDQwJTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKC0xOGRlZyk7XG4gICAgICAgIGFuaW1hdGlvbjogaGFuem8tc3RhdHVzLXNoZWVuIDMuNnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1zdGF0dXMtc2hlZW4ge1xuICAgICAgICAwJSwgNjglIHsgbGVmdDogLTMwJTsgb3BhY2l0eTogMDsgfVxuICAgICAgICA3MiUgeyBvcGFjaXR5OiAwLjQ7IH1cbiAgICAgICAgMTAwJSB7IGxlZnQ6IDEzMCU7IG9wYWNpdHk6IDA7IH1cbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1zdGF0dXMgPiAqIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLXN0YXR1cy5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tYnJhbmQtYnViYmxlIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIG1pbi13aWR0aDogMzBweDtcbiAgICAgICAgcGFkZGluZzogMCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4yNXB4O1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBjb2xvcjogI2UwZjJmZTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxNCwgMTE2LCAxNDQsIDAuOTUpLCByZ2JhKDE1LCAyMywgNDIsIDAuOTUpKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMzUpO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tYWktc3RhdHVzIC5oYW56by1wdWxzZS1kb3Qge1xuICAgICAgICB3aWR0aDogOHB4O1xuICAgICAgICBoZWlnaHQ6IDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjMDZiNmQ0O1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLWRvdC1wdWxzZSAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1kb3QtcHVsc2Uge1xuICAgICAgICAwJSwgMTAwJSB7IG9wYWNpdHk6IDE7IH1cbiAgICAgICAgNTAlIHsgb3BhY2l0eTogMC40OyB9XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLWxhYmVsIHtcbiAgICAgICAgbWF4LXdpZHRoOiA0NnZ3O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tZG90czo6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgYW5pbWF0aW9uOiBoYW56by1hbmltYXRlZC1kb3RzIDEuNXMgc3RlcHMoNCkgaW5maW5pdGU7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIGhhbnpvLWFuaW1hdGVkLWRvdHMge1xuICAgICAgICAwJSB7IGNvbnRlbnQ6ICcnOyB9XG4gICAgICAgIDI1JSB7IGNvbnRlbnQ6ICcuJzsgfVxuICAgICAgICA1MCUgeyBjb250ZW50OiAnLi4nOyB9XG4gICAgICAgIDc1JSB7IGNvbnRlbnQ6ICcuLi4nOyB9XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLXN0b3AtYnRuIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTtcbiAgICAgICAgY29sb3I6ICNmOGZhZmM7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIHBhZGRpbmc6IDRweCAxMnB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cywgYm9yZGVyLWNvbG9yIDAuMTVzO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tc3RvcC1idG46aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgMzgsIDM4LCAwLjI4KTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuNik7XG4gICAgICB9XG5cbiAgICAgIC8qIC0tLS0gXCJUYWtlIEJhY2sgQ29udHJvbFwiIGJ1dHRvbiAoYm90dG9tLXJpZ2h0KSAtLS0tICovXG4gICAgICAuaGFuem8tYWktY2FuY2VsIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDI0cHg7XG4gICAgICAgIHJpZ2h0OiAyNHB4O1xuICAgICAgICB6LWluZGV4OiAyMTQ3NDgzNjQ3O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDI0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMTgsIDI0LCAwLjk1KTtcbiAgICAgICAgY29sb3I6ICNmM2Y0ZjY7XG4gICAgICAgIGZvbnQ6IDYwMCAxNHB4LzEuNCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2UsIGJhY2tncm91bmQgMC4xNXM7XG4gICAgICB9XG4gICAgICAuaGFuem8tYWktY2FuY2VsLmhhbnpvLXZpc2libGUge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLWNhbmNlbDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjIwLCAzOCwgMzgsIDAuMzUpO1xuICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAzOCwgMzgsIDAuNSk7XG4gICAgICB9XG5cbiAgICAgIC8qIC0tLS0gRWxlbWVudCBoaWdobGlnaHQgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLWhpZ2hsaWdodCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoNiwgMTgyLCAyMTIsIDAuODUpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjE1KTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE1cywgdG9wIDAuMTVzLCB3aWR0aCAwLjE1cywgaGVpZ2h0IDAuMTVzO1xuICAgICAgfVxuICAgIGA7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc092ZXJsYXlFbGVtZW50KHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gISEoXG4gICAgICBvdmVybGF5Py5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICBzdGF0dXNFbD8uY29udGFpbnModGFyZ2V0KSB8fFxuICAgICAgY2FuY2VsQnRuPy5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICBjdXJzb3I/LmNvbnRhaW5zKHRhcmdldCkgfHxcbiAgICAgIGhpZ2hsaWdodEVsPy5jb250YWlucyh0YXJnZXQpXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJsb2NrSW50ZXJhY3Rpb24oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFpbnRlcmFjdGlvbkJsb2NrQWN0aXZlKSByZXR1cm47XG5cbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnYWkuY29udHJvbC5jYW5jZWwnIH0pO1xuICAgICAgaGlkZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc092ZXJsYXlFbGVtZW50KGV2ZW50LnRhcmdldCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRJbnRlcmFjdGlvbkJsb2NrKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpbnRlcmFjdGlvbkJsb2NrQWN0aXZlID09PSBhY3RpdmUpIHJldHVybjtcblxuICAgIGludGVyYWN0aW9uQmxvY2tBY3RpdmUgPSBhY3RpdmU7XG4gICAgZm9yIChjb25zdCBldmVudE5hbWUgb2YgQkxPQ0tFRF9FVkVOVFMpIHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGJsb2NrSW50ZXJhY3Rpb24sIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGJsb2NrSW50ZXJhY3Rpb24sIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3codGFzazogc3RyaW5nKSB7XG4gICAgaWYgKG92ZXJsYXkpIGhpZGUoKTtcblxuICAgIGluamVjdFN0eWxlcygpO1xuICAgIHNldEludGVyYWN0aW9uQmxvY2sodHJ1ZSk7XG5cbiAgICAvLyBCYWNrZHJvcFxuICAgIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBvdmVybGF5LmlkID0gT1ZFUkxBWV9JRDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuXG4gICAgLy8gQ3Vyc29yXG4gICAgY3Vyc29yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY3Vyc29yLmNsYXNzTmFtZSA9ICdoYW56by1haS1jdXJzb3InO1xuICAgIGN1cnNvci5zdHlsZS5sZWZ0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLyAyfXB4YDtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC8gMn1weGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjdXJzb3IpO1xuXG4gICAgLy8gU3RhdHVzIGJhbm5lclxuICAgIHN0YXR1c0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ2hhbnpvLWFpLXN0YXR1cyc7XG4gICAgc3RhdHVzRWwuaW5uZXJIVE1MID0gYFxuICAgICAgPHNwYW4gY2xhc3M9XCJoYW56by1icmFuZC1idWJibGVcIj5BSTwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wdWxzZS1kb3RcIj48L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaGFuem8tbGFiZWxcIj4ke2VzY2FwZUh0bWwodGFzayB8fCAnSGFuem8gQUkgaXMgY29udHJvbGxpbmcgdGhpcyB0YWInKX08L3NwYW4+PHNwYW4gY2xhc3M9XCJoYW56by1kb3RzXCI+PC9zcGFuPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLXN0b3AtYnRuXCI+U3RvcDwvYnV0dG9uPlxuICAgIGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdGF0dXNFbCk7XG5cbiAgICBzdGF0dXNFbC5xdWVyeVNlbGVjdG9yKCcuaGFuem8tc3RvcC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2FpLmNvbnRyb2wuY2FuY2VsJyB9KTtcbiAgICAgIGhpZGUoKTtcbiAgICB9KTtcblxuICAgIC8vIFwiVGFrZSBCYWNrIENvbnRyb2xcIiBidXR0b25cbiAgICBjYW5jZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBjYW5jZWxCdG4uY2xhc3NOYW1lID0gJ2hhbnpvLWFpLWNhbmNlbCc7XG4gICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ1Rha2UgQmFjayBDb250cm9sJztcbiAgICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2FpLmNvbnRyb2wuY2FuY2VsJyB9KTtcbiAgICAgIGhpZGUoKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7XG5cbiAgICAvLyBGYWRlIGluIChuZXh0IGZyYW1lIHNvIHRoZSB0cmFuc2l0aW9uIHRyaWdnZXJzKVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBvdmVybGF5Py5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgICBjdXJzb3I/LmNsYXNzTGlzdC5hZGQoJ2hhbnpvLXZpc2libGUnKTtcbiAgICAgIHN0YXR1c0VsPy5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgICBjYW5jZWxCdG4/LmNsYXNzTGlzdC5hZGQoJ2hhbnpvLXZpc2libGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgLy8gRmFkZSBvdXRcbiAgICBvdmVybGF5Py5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG4gICAgY3Vyc29yPy5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG4gICAgc3RhdHVzRWw/LmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLXZpc2libGUnKTtcbiAgICBjYW5jZWxCdG4/LmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLXZpc2libGUnKTtcblxuICAgIC8vIFJlbW92ZSBhZnRlciB0cmFuc2l0aW9uXG4gICAgY29uc3QgcmVmcyA9IHsgb3ZlcmxheSwgY3Vyc29yLCBzdGF0dXNFbCwgY2FuY2VsQnRuLCBoaWdobGlnaHRFbCB9O1xuICAgIGNvbnN0IHRyYWlscyA9IFsuLi50cmFpbE5vZGVzXTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVmcy5vdmVybGF5Py5yZW1vdmUoKTtcbiAgICAgIHJlZnMuY3Vyc29yPy5yZW1vdmUoKTtcbiAgICAgIHJlZnMuc3RhdHVzRWw/LnJlbW92ZSgpO1xuICAgICAgcmVmcy5jYW5jZWxCdG4/LnJlbW92ZSgpO1xuICAgICAgcmVmcy5oaWdobGlnaHRFbD8ucmVtb3ZlKCk7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdHJhaWxzKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSwgMzIwKTtcblxuICAgIHNldEludGVyYWN0aW9uQmxvY2soZmFsc2UpO1xuXG4gICAgb3ZlcmxheSA9IG51bGw7XG4gICAgY3Vyc29yID0gbnVsbDtcbiAgICBzdGF0dXNFbCA9IG51bGw7XG4gICAgY2FuY2VsQnRuID0gbnVsbDtcbiAgICBoaWdobGlnaHRFbCA9IG51bGw7XG4gICAgdHJhaWxOb2RlcyA9IFtdO1xuICB9XG5cbiAgZnVuY3Rpb24gbW92ZUN1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGlmICghY3Vyc29yKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGFtcGVkWCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCBOdW1iZXIuaXNGaW5pdGUoeCkgPyB4IDogMCkpO1xuICAgIGNvbnN0IGNsYW1wZWRZID0gTWF0aC5tYXgoMCwgTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogMCkpO1xuXG4gICAgLy8gVHJhaWwgZG90XG4gICAgY29uc3QgdHJhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0cmFpbC5jbGFzc05hbWUgPSAnaGFuem8tY3Vyc29yLXRyYWlsJztcbiAgICB0cmFpbC5zdHlsZS5sZWZ0ID0gYCR7Y2xhbXBlZFh9cHhgO1xuICAgIHRyYWlsLnN0eWxlLnRvcCA9IGAke2NsYW1wZWRZfXB4YDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRyYWlsKTtcbiAgICB0cmFpbE5vZGVzLnB1c2godHJhaWwpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0cmFpbC5yZW1vdmUoKTtcbiAgICAgIHRyYWlsTm9kZXMgPSB0cmFpbE5vZGVzLmZpbHRlcigobm9kZSkgPT4gbm9kZSAhPT0gdHJhaWwpO1xuICAgIH0sIDQwMCk7XG5cbiAgICB3aGlsZSAodHJhaWxOb2Rlcy5sZW5ndGggPiAxMCkge1xuICAgICAgdHJhaWxOb2Rlcy5zaGlmdCgpPy5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBjdXJzb3Iuc3R5bGUubGVmdCA9IGAke2NsYW1wZWRYfXB4YDtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gYCR7Y2xhbXBlZFl9cHhgO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0KHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICBoaWdobGlnaHRFbD8ucmVtb3ZlKCk7XG4gICAgaGlnaGxpZ2h0RWwgPSBudWxsO1xuXG4gICAgaWYgKCFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHJlY3Qud2lkdGggPT09IDAgJiYgcmVjdC5oZWlnaHQgPT09IDApIHJldHVybjtcblxuICAgICAgaGlnaGxpZ2h0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhpZ2hsaWdodEVsLmNsYXNzTmFtZSA9ICdoYW56by1haS1oaWdobGlnaHQnO1xuICAgICAgaGlnaGxpZ2h0RWwuc3R5bGUubGVmdCA9IGAke01hdGgubWF4KDAsIHJlY3QubGVmdCAtIDQpfXB4YDtcbiAgICAgIGhpZ2hsaWdodEVsLnN0eWxlLnRvcCA9IGAke01hdGgubWF4KDAsIHJlY3QudG9wIC0gNCl9cHhgO1xuICAgICAgaGlnaGxpZ2h0RWwuc3R5bGUud2lkdGggPSBgJHtyZWN0LndpZHRoICsgOH1weGA7XG4gICAgICBoaWdobGlnaHRFbC5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodCArIDh9cHhgO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoaWdobGlnaHRFbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKHRleHQ6IHN0cmluZykge1xuICAgIGlmICghc3RhdHVzRWwpIHJldHVybjtcblxuICAgIGNvbnN0IGxhYmVsID0gc3RhdHVzRWwucXVlcnlTZWxlY3RvcignLmhhbnpvLWxhYmVsJyk7XG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHRleHQgfHwgJ0hhbnpvIEFJIGlzIGNvbnRyb2xsaW5nIHRoaXMgdGFiJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIHJldHVybiB7IHNob3csIGhpZGUsIG1vdmVDdXJzb3IsIGhpZ2hsaWdodCwgdXBkYXRlU3RhdHVzIH07XG59KSgpO1xuXG50eXBlIE92ZXJsYXlDaGF0Um9sZSA9ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ3N5c3RlbSc7XG5cbmludGVyZmFjZSBPdmVybGF5Q2hhdE1lc3NhZ2Uge1xuICByb2xlOiBPdmVybGF5Q2hhdFJvbGU7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE92ZXJsYXlFbGVtZW50Q29udGV4dCB7XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIHRhZzogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGh0bWw6IHN0cmluZztcbn1cblxudHlwZSBPdmVybGF5TW9kZSA9ICdvdmVybGF5JyB8ICdwdXNoJztcbnR5cGUgT3ZlcmxheVdpZHRoID0gJ2NvbXBhY3QnIHwgJ2RlZmF1bHQnIHwgJ3dpZGUnO1xuXG5jb25zdCBPVkVSTEFZX1dJRFRIX1BYOiBSZWNvcmQ8T3ZlcmxheVdpZHRoLCBudW1iZXI+ID0ge1xuICBjb21wYWN0OiAzMjAsXG4gIGRlZmF1bHQ6IDQyMCxcbiAgd2lkZTogNTYwLFxufTtcblxuY2xhc3MgSGFuem9QYWdlT3ZlcmxheSB7XG4gIHByaXZhdGUgbW91bnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgc2lkZTogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdyaWdodCc7XG4gIHByaXZhdGUgbW9kZTogT3ZlcmxheU1vZGUgPSAnb3ZlcmxheSc7XG4gIHByaXZhdGUgd2lkdGg6IE92ZXJsYXlXaWR0aCA9ICdkZWZhdWx0JztcbiAgcHJpdmF0ZSBzZW5kaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgd2F0Y2hNb2RlID0gZmFsc2U7XG4gIHByaXZhdGUgZWRpdE1vZGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb2RlbHNMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtZXNzYWdlczogT3ZlcmxheUNoYXRNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZENvbnRleHQ6IE92ZXJsYXlFbGVtZW50Q29udGV4dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVkaXRpbmdFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcm9vdDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXVuY2hlcjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwYW5lbDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlc0VsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlucHV0RWw6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZW5kQnRuOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1vZGVsRWw6IEhUTUxTZWxlY3RFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29udGV4dEVsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdhdGNoQnRuOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVkaXRCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzRWw6IEhUTUxTcGFuRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhpZ2hsaWdodEJveDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmluamVjdFN0eWxlcygpO1xuICAgIHRoaXMubW91bnQoKTtcbiAgICB0aGlzLmJpbmRHbG9iYWxFdmVudHMoKTtcbiAgICB0aGlzLnJlc3RvcmVQcmVmcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUHJlZnMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNzID0gKHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyA/IGJyb3dzZXIgOiAoY2hyb21lIGFzIGFueSkpPy5zdG9yYWdlPy5zeW5jO1xuICAgICAgaWYgKCFzcz8uZ2V0KSByZXR1cm47XG4gICAgICBjb25zdCBwcm9taXNlZCA9IHNzLmdldChbJ292ZXJsYXlTaWRlJywgJ292ZXJsYXlNb2RlJywgJ292ZXJsYXlXaWR0aCddKTtcbiAgICAgIGNvbnN0IGFwcGx5ID0gKHY6IGFueSkgPT4ge1xuICAgICAgICBpZiAodj8ub3ZlcmxheVNpZGUgPT09ICdsZWZ0JyB8fCB2Py5vdmVybGF5U2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRoaXMuc2lkZSA9IHYub3ZlcmxheVNpZGU7XG4gICAgICAgICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2lkZScsIHRoaXMuc2lkZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHY/Lm92ZXJsYXlNb2RlID09PSAncHVzaCcgfHwgdj8ub3ZlcmxheU1vZGUgPT09ICdvdmVybGF5Jykge1xuICAgICAgICAgIHRoaXMubW9kZSA9IHYub3ZlcmxheU1vZGU7XG4gICAgICAgICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZScsIHRoaXMubW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ2NvbXBhY3QnIHx8IHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ2RlZmF1bHQnIHx8IHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ3dpZGUnKSB7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHYub3ZlcmxheVdpZHRoO1xuICAgICAgICAgIHRoaXMuYXBwbHlXaWR0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgICB9O1xuICAgICAgaWYgKHByb21pc2VkICYmIHR5cGVvZiBwcm9taXNlZC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb21pc2VkLnRoZW4oYXBwbHkpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNzLmdldChbJ292ZXJsYXlTaWRlJywgJ292ZXJsYXlNb2RlJywgJ292ZXJsYXlXaWR0aCddLCBhcHBseSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7IC8qIHN0b3JhZ2UgbWF5IGJlIHVuYXZhaWxhYmxlICovIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlXaWR0aCgpOiB2b2lkIHtcbiAgICBjb25zdCBweCA9IE9WRVJMQVlfV0lEVEhfUFhbdGhpcy53aWR0aF0gPz8gT1ZFUkxBWV9XSURUSF9QWC5kZWZhdWx0O1xuICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgIHRoaXMucm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1oYW56by1vdmVybGF5LXdpZHRoJywgYCR7cHh9cHhgKTtcbiAgICAgIHRoaXMucm9vdC5zdHlsZS53aWR0aCA9IGBtaW4oJHtweH1weCwgMTAwdncpYDtcbiAgICB9XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWhhbnpvLW92ZXJsYXktd2lkdGgnLCBgJHtweH1weGApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVB1c2hJZk9wZW4oKTogdm9pZCB7XG4gICAgY29uc3QgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAvLyBBbHdheXMgc3RyaXAgZmlyc3Qgc28gd2UgbmV2ZXIgc3RhY2sgbWFyZ2lucy5cbiAgICBodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLW92ZXJsYXktcHVzaCcsICdoYW56by1vdmVybGF5LXB1c2gtbGVmdCcsICdoYW56by1vdmVybGF5LXB1c2gtcmlnaHQnKTtcbiAgICBpZiAodGhpcy5vcGVuICYmIHRoaXMuZW5hYmxlZCAmJiB0aGlzLm1vZGUgPT09ICdwdXNoJykge1xuICAgICAgaHRtbC5jbGFzc0xpc3QuYWRkKCdoYW56by1vdmVybGF5LXB1c2gnLCBgaGFuem8tb3ZlcmxheS1wdXNoLSR7dGhpcy5zaWRlfWApO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCAhdGhpcy5vcGVuKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmhpZGUoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgfVxuXG4gIGdldFNpZGUoKTogJ2xlZnQnIHwgJ3JpZ2h0JyB7XG4gICAgcmV0dXJuIHRoaXMuc2lkZTtcbiAgfVxuXG4gIGdldE1vZGUoKTogT3ZlcmxheU1vZGUge1xuICAgIHJldHVybiB0aGlzLm1vZGU7XG4gIH1cblxuICBzZXRTaWRlKHNpZGU6ICdsZWZ0JyB8ICdyaWdodCcpOiB2b2lkIHtcbiAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLXNpZGUnLCBzaWRlKTtcbiAgICB0aGlzLmFwcGx5UHVzaElmT3BlbigpO1xuICAgIHRoaXMucGVyc2lzdCh7IG92ZXJsYXlTaWRlOiBzaWRlIH0pO1xuICB9XG5cbiAgc2V0TW9kZShtb2RlOiBPdmVybGF5TW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZScsIG1vZGUpO1xuICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgdGhpcy5wZXJzaXN0KHsgb3ZlcmxheU1vZGU6IG1vZGUgfSk7XG4gIH1cblxuICBzZXRXaWR0aCh3aWR0aDogT3ZlcmxheVdpZHRoKTogdm9pZCB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuYXBwbHlXaWR0aCgpO1xuICAgIHRoaXMucGVyc2lzdCh7IG92ZXJsYXlXaWR0aDogd2lkdGggfSk7XG4gIH1cblxuICBzZXRFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLWVuYWJsZWQnLCBlbmFibGVkID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgaWYgKCFlbmFibGVkKSB0aGlzLmhpZGUoKTtcbiAgICB0aGlzLnBlcnNpc3QoeyBvdmVybGF5RW5hYmxlZDogZW5hYmxlZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdCh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNzID0gKHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyA/IGJyb3dzZXIgOiAoY2hyb21lIGFzIGFueSkpPy5zdG9yYWdlPy5zeW5jO1xuICAgICAgc3M/LnNldD8uKHZhbHVlcyk7XG4gICAgfSBjYXRjaCB7IC8qIHN0b3JhZ2UgbWF5IGJlIHVuYXZhaWxhYmxlICovIH1cbiAgfVxuXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVNb3VudGVkKCk7XG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLWVuYWJsZWQnLCAndHJ1ZScpO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgdGhpcy5sb2FkTW9kZWxzKCk7XG4gICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gIH1cblxuICBoaWRlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCAnZmFsc2UnKTtcbiAgICB0aGlzLmFwcGx5UHVzaElmT3BlbigpO1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKCcnKTtcbiAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgdGhpcy5zZXRXYXRjaE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuc2V0RWRpdE1vZGUoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVNb3VudGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICB0aGlzLm1vdW50KCk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFN0eWxlcygpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhbnpvLXBhZ2Utb3ZlcmxheS1zdHlsZXMnKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLmlkID0gJ2hhbnpvLXBhZ2Utb3ZlcmxheS1zdHlsZXMnO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgICAgLyogRWRnZS1waW5uZWQgc2lkZWJhciBwYW5lbCBcdTIwMTQgbm8gRkFCLCBvcGVuZWQgZnJvbSBleHRlbnNpb24gcG9wdXAuXG4gICAgICAgICBIYW56byBicmFuZDogbW9ub2Nocm9tZSAod2hpdGUgcHJpbWFyeSwgbmV1dHJhbCBzdXJmYWNlcykuIE5vIGJsdWUuICovXG4gICAgICAjaGFuem8tcGFnZS1vdmVybGF5LXJvb3Qge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgd2lkdGg6IG1pbih2YXIoLS1oYW56by1vdmVybGF5LXdpZHRoLCA0MjBweCksIDEwMHZ3KTtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NTtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdFtkYXRhLXNpZGU9XCJsZWZ0XCJdIHtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdCAqIHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIH1cblxuICAgICAgLyogUHVzaCBtb2RlOiB3aGVuIHRoZSB1c2VyIHBpbnMgdGhlIHBhbmVsIGFzIGEgZG9jaywgaHRtbCBzaGlmdHMgc29cbiAgICAgICAgIHBhZ2UgY29udGVudCByZWZsb3dzIGJlc2lkZSBpdCBpbnN0ZWFkIG9mIGJlaW5nIGNvdmVyZWQuIEFwcGxpZWQgdG9cbiAgICAgICAgIDxodG1sPiBmcm9tIHNldE1vZGUoJ3B1c2gnKSArIG9wZW4uICovXG4gICAgICBodG1sLmhhbnpvLW92ZXJsYXktcHVzaC5oYW56by1vdmVybGF5LXB1c2gtcmlnaHQge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLWhhbnpvLW92ZXJsYXktd2lkdGgsIDQyMHB4KSAhaW1wb3J0YW50O1xuICAgICAgICB0cmFuc2l0aW9uOiBtYXJnaW4tcmlnaHQgMC4xOHMgZWFzZTtcbiAgICAgIH1cbiAgICAgIGh0bWwuaGFuem8tb3ZlcmxheS1wdXNoLmhhbnpvLW92ZXJsYXktcHVzaC1sZWZ0IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IHZhcigtLWhhbnpvLW92ZXJsYXktd2lkdGgsIDQyMHB4KSAhaW1wb3J0YW50O1xuICAgICAgICB0cmFuc2l0aW9uOiBtYXJnaW4tbGVmdCAwLjE4cyBlYXNlO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1wYW5lbCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMCwgMTAsIDExLCAwLjk3KSwgcmdiYSg3LCA3LCA4LCAwLjk3KSk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBib3gtc2hhZG93OiAtMjJweCAwIDQ4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMThzIGVhc2UsIG9wYWNpdHkgMC4xOHMgZWFzZTtcbiAgICAgIH1cblxuICAgICAgI2hhbnpvLXBhZ2Utb3ZlcmxheS1yb290W2RhdGEtc2lkZT1cImxlZnRcIl0gLmhhbnpvLXBhZ2UtcGFuZWwge1xuICAgICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTtcbiAgICAgICAgYm94LXNoYWRvdzogMjJweCAwIDQ4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcbiAgICAgIH1cblxuICAgICAgI2hhbnpvLXBhZ2Utb3ZlcmxheS1yb290W2RhdGEtb3Blbj1cInRydWVcIl0gLmhhbnpvLXBhZ2UtcGFuZWwge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oZWFkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTRweDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHRyYW5zcGFyZW50KTtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWJyYW5kIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4O1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oZWFkZXItYWN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWNoaXAtYnRuIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICAgIHBhZGRpbmc6IDRweCAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgY29sb3I6IHJnYmEoMjQ1LCAyNDUsIDI0NSwgMC44NSk7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzLCBjb2xvciAwLjE1cywgYm9yZGVyLWNvbG9yIDAuMTVzO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tY2hpcC1idG46aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWNoaXAtYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuIHtcbiAgICAgICAgd2lkdGg6IDI4cHg7XG4gICAgICAgIGhlaWdodDogMjhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgY29sb3I6ICNmNWY1ZjU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMsIGJvcmRlci1jb2xvciAwLjE1cztcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8taWNvbi1idG4gc3ZnIHtcbiAgICAgICAgd2lkdGg6IDE0cHg7XG4gICAgICAgIGhlaWdodDogMTRweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbWV0YSB7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweCA2cHggMTRweDtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgYXV0bztcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1jb250ZXh0IHtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBjb2xvcjogcmdiYSgyNDUsIDI0NSwgMjQ1LCAwLjY1KTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLXN0YXR1cyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgY29sb3I6IHJnYmEoMjQ1LCAyNDUsIDI0NSwgMC41NSk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1tb2RlbC1yb3cge1xuICAgICAgICBwYWRkaW5nOiAwIDE0cHggOHB4IDE0cHg7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tbW9kZWwtcm93IHNlbGVjdCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBwYWRkaW5nOiA3cHggOXB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC8qIFRoZSBjaGF0IHNjcm9sbGVyOiB0YWtlcyBBTEwgcmVtYWluaW5nIHZlcnRpY2FsIHNwYWNlIHNvIHRoZVxuICAgICAgICAgY29tcG9zZXIgYmVsb3cgc3RheXMgc3RpY2t5IGFnYWluc3QgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZWwuICovXG4gICAgICAuaGFuem8tcGFnZS1tZXNzYWdlcyB7XG4gICAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgICBwYWRkaW5nOiA4cHggMTRweCAxMnB4IDE0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1tc2cge1xuICAgICAgICBwYWRkaW5nOiA5cHggMTBweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40NTtcbiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbXNnLnVzZXIge1xuICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgICAgICAgbWF4LXdpZHRoOiA4OCU7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLW1zZy5hc3Npc3RhbnQge1xuICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgICAgICBtYXgtd2lkdGg6IDkyJTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEwKTtcbiAgICAgIH1cblxuICAgICAgLyogQ29tcG9zZXIgcGlubmVkIHRvIGJvdHRvbSBvZiB0aGUgcGFuZWwuIGZsZXgtc2hyaW5rOiAwIHByZXZlbnRzXG4gICAgICAgICBpdCBmcm9tIGNvbGxhcHNpbmcgd2hlbiB0aGUgbWVzc2FnZXMgc2Nyb2xsZXIgZ3Jvd3MuICovXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApO1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciB0ZXh0YXJlYSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDM4cHg7XG4gICAgICAgIG1heC1oZWlnaHQ6IDExMHB4O1xuICAgICAgICByZXNpemU6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNyk7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBwYWRkaW5nOiA5cHggMTFweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgfVxuXG4gICAgICAvKiBQcmltYXJ5IGFjdGlvbjogV0hJVEUgcGVyIEBoYW56by9icmFuZCBtb25vY2hyb21lIGd1aWRlbGluZXMuICovXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciBidXR0b24ge1xuICAgICAgICBtaW4td2lkdGg6IDY4cHg7XG4gICAgICAgIGhlaWdodDogMzhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZmZmZjtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgICAgY29sb3I6ICMwYTBhMGI7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzLCB0cmFuc2Zvcm0gMC4wOHM7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIGJ1dHRvbjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIGJ1dHRvbjphY3RpdmU6bm90KDpkaXNhYmxlZCkge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtY29tcG9zZXIgYnV0dG9uOmRpc2FibGVkIHtcbiAgICAgICAgb3BhY2l0eTogMC41NTtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oaWdobGlnaHQge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDQ7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gICAgICB9XG5cbiAgICAgIFtkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nPVwidHJ1ZVwiXSB7XG4gICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpICFpbXBvcnRhbnQ7XG4gICAgICAgIG91dGxpbmUtb2Zmc2V0OiAycHggIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICBgO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3VudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3VudGVkKSByZXR1cm47XG5cbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJvb3QuaWQgPSAnaGFuem8tcGFnZS1vdmVybGF5LXJvb3QnO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3BlbicsICdmYWxzZScpO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZW5hYmxlZCcsICdmYWxzZScpO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2lkZScsIHRoaXMuc2lkZSk7XG4gICAgdGhpcy5yb290LnNldEF0dHJpYnV0ZSgnZGF0YS1tb2RlJywgdGhpcy5tb2RlKTtcbiAgICB0aGlzLmFwcGx5V2lkdGgoKTtcbiAgICB0aGlzLnJvb3QuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtcGFuZWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbD1cIkhhbnpvIFBhZ2UgQXNzaXN0YW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWhlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWJyYW5kXCI+SGFuem88L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1oZWFkZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWNoaXAtYnRuXCIgZGF0YS1yb2xlPVwid2F0Y2hcIiBkYXRhLWFjdGl2ZT1cImZhbHNlXCIgdGl0bGU9XCJXYXRjaCBlbGVtZW50cyBvbiBob3ZlclwiPldhdGNoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGFuem8tY2hpcC1idG5cIiBkYXRhLXJvbGU9XCJlZGl0XCIgZGF0YS1hY3RpdmU9XCJmYWxzZVwiIHRpdGxlPVwiQ2xpY2sgYW55IGVsZW1lbnQgdG8gZWRpdCB0ZXh0XCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWljb24tYnRuXCIgZGF0YS1yb2xlPVwicGluLW1vZGVcIiB0aXRsZT1cIlRvZ2dsZTogcGluIChwdXNoIGNvbnRlbnQpIHZzIG92ZXJsYXkgKGZsb2F0IG92ZXIgcGFnZSlcIj5cbiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDR2MTZNMyA0aDEyYTQgNCAwIDAgMSA0IDR2OGE0IDQgMCAwIDEtNCA0SDN6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWljb24tYnRuXCIgZGF0YS1yb2xlPVwiY2xvc2VcIiB0aXRsZT1cIkhpZGUgb3ZlcmxheVwiPlx1MDBENzwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtbWV0YVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWNvbnRleHRcIj5Vc2UgV2F0Y2ggdG8gaW5zcGVjdCBwYWdlIGVsZW1lbnRzLjwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGFuem8tcGFnZS1zdGF0dXNcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tbW9kZWwtcm93XCI+XG4gICAgICAgICAgPHNlbGVjdCBkYXRhLXJvbGU9XCJtb2RlbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNFwiPkNsYXVkZSBTb25uZXQgNDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYXVkZS1vcHVzLTQtMjAyNTA1MTRcIj5DbGF1ZGUgT3B1cyA0PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZ3B0LTRvXCI+R1BULTRvPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiemVuLWNvZGVyLWZsYXNoXCI+WmVuIENvZGVyIEZsYXNoPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiemVuLW1heFwiPlplbiBNYXg8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLW1lc3NhZ2VzXCIgZGF0YS1yb2xlPVwibWVzc2FnZXNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1tc2cgYXNzaXN0YW50XCI+QXNrIGFib3V0IHRoaXMgcGFnZSwgaW5zcGVjdCBhbnkgZWxlbWVudCwgb3IgdHVybiBvbiBFZGl0IG1vZGUgdG8gY2hhbmdlIHRleHQgaW4tcGxhY2UuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1jb21wb3NlclwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBkYXRhLXJvbGU9XCJpbnB1dFwiIHJvd3M9XCIxXCIgcGxhY2Vob2xkZXI9XCJBc2sgYWJvdXQgdGhpcyBwYWdlLi4uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8YnV0dG9uIGRhdGEtcm9sZT1cInNlbmRcIiB0eXBlPVwiYnV0dG9uXCI+QXNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIHRoaXMucGFuZWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignLmhhbnpvLXBhZ2UtcGFuZWwnKTtcbiAgICB0aGlzLmxhdW5jaGVyID0gbnVsbDtcbiAgICB0aGlzLm1lc3NhZ2VzRWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cIm1lc3NhZ2VzXCJdJyk7XG4gICAgdGhpcy5pbnB1dEVsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJpbnB1dFwiXScpO1xuICAgIHRoaXMuc2VuZEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwic2VuZFwiXScpO1xuICAgIHRoaXMubW9kZWxFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwibW9kZWxcIl0nKTtcbiAgICB0aGlzLmNvbnRleHRFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuaGFuem8tcGFnZS1jb250ZXh0Jyk7XG4gICAgdGhpcy53YXRjaEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwid2F0Y2hcIl0nKTtcbiAgICB0aGlzLmVkaXRCdG4gPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cImVkaXRcIl0nKTtcbiAgICB0aGlzLnN0YXR1c0VsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1wYWdlLXN0YXR1cycpO1xuXG4gICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJjbG9zZVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICBjb25zdCBwaW5Nb2RlQnRuID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJwaW4tbW9kZVwiXScpO1xuICAgIHBpbk1vZGVCdG4/LnNldEF0dHJpYnV0ZSgnZGF0YS1hY3RpdmUnLCB0aGlzLm1vZGUgPT09ICdwdXNoJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIHBpbk1vZGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgbmV4dDogT3ZlcmxheU1vZGUgPSB0aGlzLm1vZGUgPT09ICdwdXNoJyA/ICdvdmVybGF5JyA6ICdwdXNoJztcbiAgICAgIHRoaXMuc2V0TW9kZShuZXh0KTtcbiAgICAgIHBpbk1vZGVCdG4uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZScsIG5leHQgPT09ICdwdXNoJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIH0pO1xuICAgIHRoaXMud2F0Y2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zZXRXYXRjaE1vZGUoIXRoaXMud2F0Y2hNb2RlKSk7XG4gICAgdGhpcy5lZGl0QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2V0RWRpdE1vZGUoIXRoaXMuZWRpdE1vZGUpKTtcbiAgICB0aGlzLnNlbmRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5hc2tQYWdlUXVlc3Rpb24oKSk7XG4gICAgdGhpcy5pbnB1dEVsPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmFza1BhZ2VRdWVzdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaW5wdXRFbD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaW5wdXRFbCkgcmV0dXJuO1xuICAgICAgdGhpcy5pbnB1dEVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRoaXMuaW5wdXRFbC5zdHlsZS5oZWlnaHQgPSBgJHtNYXRoLm1pbih0aGlzLmlucHV0RWwuc2Nyb2xsSGVpZ2h0LCAxMTApfXB4YDtcbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnJvb3QpO1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGJpbmRHbG9iYWxFdmVudHMoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB0aGlzLm9uTW91c2VNb3ZlKGV2ZW50KSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHRoaXMub25Eb2N1bWVudENsaWNrKGV2ZW50KSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5vbktleURvd24oZXZlbnQpLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2F0Y2hNb2RlKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRQYWdlVGFyZ2V0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICB0aGlzLmhvdmVyZWRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2hvd0hpZ2hsaWdodCh0YXJnZXQpO1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbnRleHQpIHtcbiAgICAgIHRoaXMuY29udGV4dEVsICYmICh0aGlzLmNvbnRleHRFbC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0RWxlbWVudFN1bW1hcnkodGFyZ2V0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2F0Y2hNb2RlICYmICF0aGlzLmVkaXRNb2RlKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRQYWdlVGFyZ2V0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy53YXRjaE1vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb250ZXh0ID0gdGhpcy5jYXB0dXJlRWxlbWVudENvbnRleHQodGFyZ2V0KTtcbiAgICAgIHRoaXMuY29udGV4dEVsICYmICh0aGlzLmNvbnRleHRFbC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0RWxlbWVudFN1bW1hcnkodGFyZ2V0KSk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWxlbWVudCBzZWxlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICB0aGlzLmVuYWJsZUlubGluZUVkaXQodGFyZ2V0KTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0aW5nIGVsZW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBpZiAodGhpcy5lZGl0aW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRpc2FibGVJbmxpbmVFZGl0KHRoaXMuZWRpdGluZ0VsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VkaXQgY2FuY2VsZWQnKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFBhZ2VUYXJnZXQodGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMucm9vdD8uY29udGFpbnModGFyZ2V0KSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0YXJnZXQuaXNDb25uZWN0ZWQpIHJldHVybiBudWxsO1xuICAgIGlmICh0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaHRtbCcgfHwgdGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2JvZHknKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRXYXRjaE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy53YXRjaE1vZGUgPSBhY3RpdmU7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5zZXRFZGl0TW9kZShmYWxzZSk7XG4gICAgdGhpcy53YXRjaEJ0bj8uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZScsIGFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmhvdmVyZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbnRleHQgJiYgdGhpcy5jb250ZXh0RWwpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0RWwudGV4dENvbnRlbnQgPSAnVXNlIFdhdGNoIHRvIGluc3BlY3QgcGFnZSBlbGVtZW50cy4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnV2F0Y2ggbW9kZSBvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RWRpdE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZSA9IGFjdGl2ZTtcbiAgICBpZiAoYWN0aXZlKSB0aGlzLnNldFdhdGNoTW9kZShmYWxzZSk7XG4gICAgdGhpcy5lZGl0QnRuPy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWN0aXZlJywgYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgaWYgKCFhY3RpdmUgJiYgdGhpcy5lZGl0aW5nRWxlbWVudCkge1xuICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdCh0aGlzLmVkaXRpbmdFbGVtZW50LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VkaXQgbW9kZSBvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5saW5lRWRpdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRpbmdFbGVtZW50ICYmIHRoaXMuZWRpdGluZ0VsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQodGhpcy5lZGl0aW5nRWxlbWVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLmVkaXRpbmdFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuem8tb3JpZ2luYWwtaHRtbCcsIGVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICd0cnVlJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snLCAndHJ1ZScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nJywgJ3RydWUnKTtcbiAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5lZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICBjb25zdCBrZXlkb3duSGFuZGxlciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdChlbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IHJldmVydGVkJyk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRpc2FibGVJbmxpbmVFZGl0KGVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdCBhcHBsaWVkJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGJsdXJIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdChlbGVtZW50LCB0cnVlKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IGFwcGxpZWQnKTtcbiAgICB9O1xuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkhhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBibHVySGFuZGxlciwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlSW5saW5lRWRpdChlbGVtZW50OiBIVE1MRWxlbWVudCwga2VlcENoYW5nZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIWtlZXBDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnKTtcbiAgICAgIGlmIChvcmlnaW5hbCAhPT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IG9yaWdpbmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKTtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3BlbGxjaGVjaycpO1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nJyk7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaGFuem8tb3JpZ2luYWwtaHRtbCcpO1xuXG4gICAgaWYgKHRoaXMuZWRpdGluZ0VsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWRpdGluZ0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvd0hpZ2hsaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwICYmIHJlY3QuaGVpZ2h0ID09PSAwKSB7XG4gICAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhpZ2hsaWdodEJveCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0Qm94LmNsYXNzTmFtZSA9ICdoYW56by1wYWdlLWhpZ2hsaWdodCc7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oaWdobGlnaHRCb3gpO1xuICAgIH1cblxuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCgwLCByZWN0LmxlZnQgLSAzKX1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUudG9wID0gYCR7TWF0aC5tYXgoMCwgcmVjdC50b3AgLSAzKX1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUud2lkdGggPSBgJHtyZWN0LndpZHRoICsgNn1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHQgKyA2fXB4YDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJIaWdobGlnaHQoKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRCb3g/LnJlbW92ZSgpO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2FwdHVyZUVsZW1lbnRDb250ZXh0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogT3ZlcmxheUVsZW1lbnRDb250ZXh0IHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5ub3JtYWxpemVUZXh0KGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQgfHwgJycpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcjogdGhpcy5idWlsZFNlbGVjdG9yKGVsZW1lbnQpLFxuICAgICAgdGFnOiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgIHRleHQ6IHRleHQuc2xpY2UoMCwgODAwKSxcbiAgICAgIGh0bWw6IGVsZW1lbnQub3V0ZXJIVE1MLnNsaWNlKDAsIDEyMDApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VsZWN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGlmIChlbGVtZW50LmlkKSByZXR1cm4gYCMke2VsZW1lbnQuaWR9YDtcblxuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xuICAgIGxldCBkZXB0aCA9IDA7XG5cbiAgICB3aGlsZSAoY3VycmVudCAmJiBkZXB0aCA8IDYpIHtcbiAgICAgIGxldCBwYXJ0ID0gY3VycmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY3VycmVudC5jbGFzc0xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBBcnJheS5mcm9tKGN1cnJlbnQuY2xhc3NMaXN0KS5zbGljZSgwLCAyKS5qb2luKCcuJyk7XG4gICAgICAgIGlmIChjbGFzc05hbWUpIHBhcnQgKz0gYC4ke2NsYXNzTmFtZX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBjb25zdCBzaWJsaW5ncyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5maWx0ZXIoKG5vZGUpID0+IG5vZGUudGFnTmFtZSA9PT0gY3VycmVudCEudGFnTmFtZSk7XG4gICAgICAgIGlmIChzaWJsaW5ncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzaWJsaW5ncy5pbmRleE9mKGN1cnJlbnQpICsgMTtcbiAgICAgICAgICBwYXJ0ICs9IGA6bnRoLW9mLXR5cGUoJHtpbmRleH0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFydHMudW5zaGlmdChwYXJ0KTtcbiAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gICAgICBkZXB0aCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgPiAnKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWxlbWVudFN1bW1hcnkoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FwdHVyZUVsZW1lbnRDb250ZXh0KGVsZW1lbnQpO1xuICAgIHJldHVybiBgJHtjdHgudGFnfSBcdTIwMjIgJHtjdHguc2VsZWN0b3J9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb2RlbHNMb2FkZWQgfHwgIXRoaXMubW9kZWxFbCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdjaGF0Lmxpc3RNb2RlbHMnIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZT8uc3VjY2VzcyB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5tb2RlbHMpIHx8ICFyZXNwb25zZS5tb2RlbHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLm1vZGVsRWwudmFsdWU7XG4gICAgICB0aGlzLm1vZGVsRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJlc3BvbnNlLm1vZGVscykge1xuICAgICAgICBpZiAoIW1vZGVsPy5pZCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBtb2RlbC5pZDtcbiAgICAgICAgb3B0aW9uLnRleHRDb250ZW50ID0gbW9kZWwubmFtZSB8fCBtb2RlbC5pZDtcbiAgICAgICAgdGhpcy5tb2RlbEVsLmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAocHJldmlvdXMgJiYgQXJyYXkuZnJvbSh0aGlzLm1vZGVsRWwub3B0aW9ucykuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHByZXZpb3VzKSkge1xuICAgICAgICB0aGlzLm1vZGVsRWwudmFsdWUgPSBwcmV2aW91cztcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZWxzTG9hZGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEtlZXAgbG9jYWwgZGVmYXVsdHMgaWYgbW9kZWwgZmV0Y2ggZmFpbHMuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0lucHV0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnB1dEVsKSByZXR1cm47XG4gICAgdGhpcy5pbnB1dEVsLmZvY3VzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZE1lc3NhZ2Uocm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZXNzYWdlc0VsKSByZXR1cm47XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9IGBoYW56by1wYWdlLW1zZyAke3JvbGV9YDtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgIHRoaXMubWVzc2FnZXNFbC5hcHBlbmRDaGlsZChkaXYpO1xuICAgIHRoaXMubWVzc2FnZXNFbC5zY3JvbGxUb3AgPSB0aGlzLm1lc3NhZ2VzRWwuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXModGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YXR1c0VsKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGFnZUNvbnRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLm5vcm1hbGl6ZVRleHQod2luZG93LmdldFNlbGVjdGlvbj8uKCk/LnRvU3RyaW5nKCkgfHwgJycpO1xuICAgIGNvbnN0IGNvbnRleHRMaW5lcyA9IFtcbiAgICAgIGBVUkw6ICR7bG9jYXRpb24uaHJlZn1gLFxuICAgICAgYFRpdGxlOiAke2RvY3VtZW50LnRpdGxlIHx8ICdVbnRpdGxlZCd9YCxcbiAgICBdO1xuXG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgY29udGV4dExpbmVzLnB1c2goYFRleHRTZWxlY3Rpb246ICR7c2VsZWN0aW9uLnNsaWNlKDAsIDYwMCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudENvbnRleHQgPSB0aGlzLnNlbGVjdGVkQ29udGV4dCB8fCAodGhpcy5ob3ZlcmVkRWxlbWVudCA/IHRoaXMuY2FwdHVyZUVsZW1lbnRDb250ZXh0KHRoaXMuaG92ZXJlZEVsZW1lbnQpIDogbnVsbCk7XG4gICAgaWYgKGVsZW1lbnRDb250ZXh0KSB7XG4gICAgICBjb250ZXh0TGluZXMucHVzaChgRWxlbWVudFNlbGVjdG9yOiAke2VsZW1lbnRDb250ZXh0LnNlbGVjdG9yfWApO1xuICAgICAgaWYgKGVsZW1lbnRDb250ZXh0LnRleHQpIGNvbnRleHRMaW5lcy5wdXNoKGBFbGVtZW50VGV4dDogJHtlbGVtZW50Q29udGV4dC50ZXh0LnNsaWNlKDAsIDYwMCl9YCk7XG4gICAgICBjb250ZXh0TGluZXMucHVzaChgRWxlbWVudEhUTUw6ICR7ZWxlbWVudENvbnRleHQuaHRtbC5zbGljZSgwLCA4MDApfWApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0TGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFza1BhZ2VRdWVzdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zZW5kaW5nIHx8ICF0aGlzLmlucHV0RWwpIHJldHVybjtcblxuICAgIGNvbnN0IHByb21wdCA9IHRoaXMubm9ybWFsaXplVGV4dCh0aGlzLmlucHV0RWwudmFsdWUpO1xuICAgIGlmICghcHJvbXB0KSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlblJlc3AgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGguZ2V0VG9rZW4nIH0pO1xuICAgIGlmICghdG9rZW5SZXNwPy5zdWNjZXNzIHx8ICF0b2tlblJlc3AudG9rZW4pIHtcbiAgICAgIHRoaXMuYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1BsZWFzZSBzaWduIGluIGZyb20gdGhlIEhhbnpvIHNpZGViYXIvcG9wdXAgYmVmb3JlIHVzaW5nIHBhZ2UgY2hhdC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKCdUaGlua2luZy4uLicpO1xuICAgIHRoaXMuc2VuZEJ0biAmJiAodGhpcy5zZW5kQnRuLmRpc2FibGVkID0gdHJ1ZSk7XG5cbiAgICB0aGlzLmlucHV0RWwudmFsdWUgPSAnJztcbiAgICB0aGlzLmlucHV0RWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHRoaXMuYXBwZW5kTWVzc2FnZSgndXNlcicsIHByb21wdCk7XG5cbiAgICBjb25zdCBzeXN0ZW1Db250ZXh0ID0gdGhpcy5idWlsZFBhZ2VDb250ZXh0KCk7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRWw/LnZhbHVlIHx8ICdncHQtNG8nO1xuICAgIGNvbnN0IHJlcXVlc3RNZXNzYWdlczogT3ZlcmxheUNoYXRNZXNzYWdlW10gPSBbXG4gICAgICB7XG4gICAgICAgIHJvbGU6ICdzeXN0ZW0nLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgJ1lvdSBhcmUgSGFuem8gcGFnZSBvdmVybGF5IGFzc2lzdGFudC4nLFxuICAgICAgICAgICdVc2UgcHJvdmlkZWQgcGFnZSBjb250ZXh0IGFuZCBzZWxlY3RlZCBlbGVtZW50IGNvbnRleHQgd2hlbiByZWxldmFudC4nLFxuICAgICAgICAgICdCZSBjb25jaXNlIGFuZCBwcm92aWRlIGNvbmNyZXRlIFVJIG9yIERPTSBlZGl0IHN1Z2dlc3Rpb25zIHdoZW4gYXNrZWQuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBzeXN0ZW1Db250ZXh0LFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMubWVzc2FnZXMuc2xpY2UoLTgpLFxuICAgICAgeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHByb21wdCB9LFxuICAgIF07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7XG4gICAgICAgIGFjdGlvbjogJ2NoYXQuY29tcGxldGUnLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgbWVzc2FnZXM6IHJlcXVlc3RNZXNzYWdlcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlPy5zdWNjZXNzIHx8ICFyZXNwb25zZS5jb250ZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZT8uZXJyb3IgfHwgJ05vIHJlc3BvbnNlIGZyb20gY2hhdCBzZXJ2aWNlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFuc3dlciA9IFN0cmluZyhyZXNwb25zZS5jb250ZW50KS50cmltKCk7XG4gICAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGFuc3dlciB8fCAnTm8gcmVzcG9uc2UgY29udGVudC4nKTtcbiAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7IHJvbGU6ICd1c2VyJywgY29udGVudDogcHJvbXB0IH0sIHsgcm9sZTogJ2Fzc2lzdGFudCcsIGNvbnRlbnQ6IGFuc3dlciB9KTtcbiAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLnNsaWNlKC0yMCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnUmVhZHknKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBFcnJvcjogJHtlcnJvcj8ubWVzc2FnZSB8fCAnQ2hhdCByZXF1ZXN0IGZhaWxlZCd9YCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbmRCdG4gJiYgKHRoaXMuc2VuZEJ0bi5kaXNhYmxlZCA9IGZhbHNlKTtcbiAgICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBwYWdlT3ZlcmxheSA9IG5ldyBIYW56b1BhZ2VPdmVybGF5KCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbGVtZW50IFBpY2tlciBUb29sIFx1MjAxNCBwaWNrIGFueSBlbGVtZW50LCBjb3B5IGl0cyBDU1Mgc2VsZWN0b3Jcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IGVsZW1lbnRQaWNrZXIgPSAoKCkgPT4ge1xuICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gIGxldCBvdmVybGF5OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFiZWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBob3ZlcmVkRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0b3IoZWw6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoZWwuaWQpIHJldHVybiBgIyR7ZWwuaWR9YDtcbiAgICBjb25zdCB0YWcgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY2xhc3NlcyA9IEFycmF5LmZyb20oZWwuY2xhc3NMaXN0KS5maWx0ZXIoYyA9PiAhYy5zdGFydHNXaXRoKCdoYW56by0nKSkuc2xpY2UoMCwgMyk7XG4gICAgbGV0IHNlbGVjdG9yID0gdGFnO1xuICAgIGlmIChjbGFzc2VzLmxlbmd0aCkgc2VsZWN0b3IgKz0gYC4ke2NsYXNzZXMuam9pbignLicpfWA7XG4gICAgLy8gRW5zdXJlIHVuaXF1ZW5lc3NcbiAgICBjb25zdCBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gQXJyYXkuZnJvbShwYXJlbnQuY2hpbGRyZW4pLmluZGV4T2YoZWwpICsgMTtcbiAgICAgICAgc2VsZWN0b3IgKz0gYDpudGgtY2hpbGQoJHtpZHh9KWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZ1bGxQYXRoKGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cjogSFRNTEVsZW1lbnQgfCBudWxsID0gZWw7XG4gICAgd2hpbGUgKGN1ciAmJiBjdXIgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgcGFydHMudW5zaGlmdChnZXRTZWxlY3RvcihjdXIpKTtcbiAgICAgIGN1ciA9IGN1ci5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignID4gJyk7XG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVPdmVybGF5KCkge1xuICAgIGlmIChvdmVybGF5KSByZXR1cm47XG4gICAgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG92ZXJsYXkuaWQgPSAnaGFuem8tcGlja2VyLW92ZXJsYXknO1xuICAgIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6MjE0NzQ4MzY0Njtib3JkZXI6MnB4IHNvbGlkICNmZmY7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuMDYpO3RyYW5zaXRpb246YWxsIDAuMXMgZWFzZTtkaXNwbGF5Om5vbmU7JztcbiAgICBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGxhYmVsLmlkID0gJ2hhbnpvLXBpY2tlci1sYWJlbCc7XG4gICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjIxNDc0ODM2NDc7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6I2ZmZjtmb250OjExcHgvMS40IEdlaXN0IE1vbm8sTWVubG8sbW9ub3NwYWNlO3BhZGRpbmc6M3B4IDhweDtib3JkZXItcmFkaXVzOjRweDttYXgtd2lkdGg6NDAwcHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO2Rpc3BsYXk6bm9uZTtib3gtc2hhZG93OjAgMnB4IDhweCByZ2JhKDAsMCwwLDAuNCk7JztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Nb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghdGFyZ2V0IHx8IHRhcmdldCA9PT0gb3ZlcmxheSB8fCB0YXJnZXQgPT09IGxhYmVsKSByZXR1cm47XG4gICAgaWYgKHRhcmdldC5pZD8uc3RhcnRzV2l0aCgnaGFuem8tcGlja2VyJykpIHJldHVybjtcbiAgICBob3ZlcmVkRWwgPSB0YXJnZXQ7XG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIG92ZXJsYXkuc3R5bGUudG9wID0gcmVjdC50b3AgKyAncHgnO1xuICAgICAgb3ZlcmxheS5zdHlsZS5sZWZ0ID0gcmVjdC5sZWZ0ICsgJ3B4JztcbiAgICAgIG92ZXJsYXkuc3R5bGUud2lkdGggPSByZWN0LndpZHRoICsgJ3B4JztcbiAgICAgIG92ZXJsYXkuc3R5bGUuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKyAncHgnO1xuICAgIH1cbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGxhYmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBnZXRTZWxlY3Rvcih0YXJnZXQpO1xuICAgICAgY29uc3QgbGFiZWxUb3AgPSByZWN0LnRvcCAtIDI4O1xuICAgICAgbGFiZWwuc3R5bGUudG9wID0gKGxhYmVsVG9wID4gMCA/IGxhYmVsVG9wIDogcmVjdC5ib3R0b20gKyA0KSArICdweCc7XG4gICAgICBsYWJlbC5zdHlsZS5sZWZ0ID0gcmVjdC5sZWZ0ICsgJ3B4JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsaWNrKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgZWwgPSBob3ZlcmVkRWwgfHwgZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBnZXRGdWxsUGF0aChlbCk7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHRleHQgPSAoZWwudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKS5zbGljZSgwLCA4MCk7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgaW5mbyA9IFtcbiAgICAgIGBTZWxlY3RvcjogJHtzZWxlY3Rvcn1gLFxuICAgICAgYFBhdGg6ICR7ZnVsbFBhdGh9YCxcbiAgICAgIGBUYWc6ICR7dGFnfWAsXG4gICAgICBgU2l6ZTogJHtNYXRoLnJvdW5kKHJlY3Qud2lkdGgpfXgke01hdGgucm91bmQocmVjdC5oZWlnaHQpfWAsXG4gICAgICBlbC5pZCA/IGBJRDogJHtlbC5pZH1gIDogJycsXG4gICAgICBlbC5jbGFzc05hbWUgPyBgQ2xhc3NlczogJHtlbC5jbGFzc05hbWV9YCA6ICcnLFxuICAgICAgdGV4dCA/IGBUZXh0OiBcIiR7dGV4dH1cImAgOiAnJyxcbiAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcblxuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGluZm8pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAvLyBBbHNvIHNlbmQgdG8gYmFja2dyb3VuZCBmb3IgTUNQIHRvb2xzXG4gICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdlbGVtZW50U2VsZWN0ZWQnLCBkYXRhOiB7IHNlbGVjdG9yLCBmdWxsUGF0aCwgdGFnLCB0ZXh0LCByZWN0OiB7IHg6IHJlY3QueCwgeTogcmVjdC55LCB3OiByZWN0LndpZHRoLCBoOiByZWN0LmhlaWdodCB9IH0gfSk7XG4gICAgc3RvcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25LZXkoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICBpZiAoYWN0aXZlKSByZXR1cm47XG4gICAgYWN0aXZlID0gdHJ1ZTtcbiAgICBlbnN1cmVPdmVybGF5KCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlLCB0cnVlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgYWN0aXZlID0gZmFsc2U7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlLCB0cnVlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJztcbiAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBob3ZlcmVkRWwgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQsIHN0b3AgfTtcbn0pKCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYWdlIEluZm8gR2F0aGVyZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdhdGhlclBhZ2VJbmZvKCk6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGEgPSAobmFtZTogc3RyaW5nKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBtZXRhW25hbWU9XCIke25hbWV9XCJdLCBtZXRhW3Byb3BlcnR5PVwiJHtuYW1lfVwiXWApPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAnJztcbiAgY29uc3QgbGluZXMgPSBbXG4gICAgYFRpdGxlOiAke2RvY3VtZW50LnRpdGxlfWAsXG4gICAgYFVSTDogJHtsb2NhdGlvbi5ocmVmfWAsXG4gICAgYERlc2NyaXB0aW9uOiAke21ldGEoJ2Rlc2NyaXB0aW9uJykgfHwgbWV0YSgnb2c6ZGVzY3JpcHRpb24nKX1gLFxuICAgIGBDaGFyc2V0OiAke2RvY3VtZW50LmNoYXJhY3RlclNldH1gLFxuICAgIGBMYW5ndWFnZTogJHtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyB8fCAndW5rbm93bid9YCxcbiAgICBgVmlld3BvcnQ6ICR7bWV0YSgndmlld3BvcnQnKX1gLFxuICBdO1xuXG4gIC8vIEZyYW1ld29yayBkZXRlY3Rpb25cbiAgY29uc3QgZnJhbWV3b3Jrczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIGZyYW1ld29ya3MucHVzaCgnUmVhY3QnKTtcbiAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fKSBmcmFtZXdvcmtzLnB1c2goJ1Z1ZScpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fc3ZlbHRlKSBmcmFtZXdvcmtzLnB1c2goJ1N2ZWx0ZScpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fTkVYVF9EQVRBX18pIGZyYW1ld29ya3MucHVzaCgnTmV4dC5qcycpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fTlVYVF9fKSBmcmFtZXdvcmtzLnB1c2goJ051eHQnKTtcbiAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuZy12ZXJzaW9uXScpKSBmcmFtZXdvcmtzLnB1c2goJ0FuZ3VsYXInKTtcbiAgaWYgKGZyYW1ld29ya3MubGVuZ3RoKSBsaW5lcy5wdXNoKGBGcmFtZXdvcmtzOiAke2ZyYW1ld29ya3Muam9pbignLCAnKX1gKTtcblxuICAvLyBQYWdlIG1ldHJpY3NcbiAgY29uc3Qgc2NyaXB0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtzcmNdJykubGVuZ3RoO1xuICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl0nKS5sZW5ndGg7XG4gIGNvbnN0IGltYWdlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpLmxlbmd0aDtcbiAgY29uc3QgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykubGVuZ3RoO1xuICBsaW5lcy5wdXNoKGBSZXNvdXJjZXM6ICR7c2NyaXB0c30gc2NyaXB0cywgJHtzdHlsZXN9IHN0eWxlc2hlZXRzLCAke2ltYWdlc30gaW1hZ2VzLCAke2xpbmtzfSBsaW5rc2ApO1xuXG4gIC8vIFBlcmZvcm1hbmNlIHRpbWluZ1xuICBjb25zdCBwZXJmID0gcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgnbmF2aWdhdGlvbicpWzBdIGFzIFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZztcbiAgaWYgKHBlcmYpIHtcbiAgICBsaW5lcy5wdXNoKGBMb2FkOiAke01hdGgucm91bmQocGVyZi5sb2FkRXZlbnRFbmQgLSBwZXJmLnN0YXJ0VGltZSl9bXMgKERPTTogJHtNYXRoLnJvdW5kKHBlcmYuZG9tQ29udGVudExvYWRlZEV2ZW50RW5kIC0gcGVyZi5zdGFydFRpbWUpfW1zKWApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmZpbHRlcihsID0+ICFsLmVuZHNXaXRoKCc6ICcpKS5qb2luKCdcXG4nKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElubGluZSBDb25zb2xlIFRvb2wgXHUyMDE0IHF1aWNrIEpTIGV2YWwgb24gdGhlIHBhZ2Vcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IGlubGluZUNvbnNvbGUgPSAoKCkgPT4ge1xuICBsZXQgcm9vdDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBvdXRwdXQ6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCB2aXNpYmxlID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZW5zdXJlTW91bnQoKSB7XG4gICAgaWYgKHJvb3QpIHJldHVybjtcbiAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcm9vdC5pZCA9ICdoYW56by1jb25zb2xlLXJvb3QnO1xuICAgIHJvb3Quc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtib3R0b206MjBweDtsZWZ0OjIwcHg7cmlnaHQ6MjBweDt6LWluZGV4OjIxNDc0ODM2NDY7Zm9udC1mYW1pbHk6R2Vpc3QgTW9ubyxNZW5sbyxDb25zb2xhcyxtb25vc3BhY2U7Zm9udC1zaXplOjEycHg7ZGlzcGxheTpub25lOyc7XG4gICAgcm9vdC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuOTIpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEycHgpO2JvcmRlcjoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMCwwLDAuNSk7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoYW56by1jb25zb2xlLW91dHB1dFwiIHN0eWxlPVwibWF4LWhlaWdodDoyMDBweDtvdmVyZmxvdy15OmF1dG87cGFkZGluZzo4cHggMTJweDtjb2xvcjojY2NjO3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7cGFkZGluZzowIDEycHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojNjY2O21hcmdpbi1yaWdodDo2cHg7XCI+Jmd0Ozwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJoYW56by1jb25zb2xlLWlucHV0XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImV2YWwoLi4uKVwiIHN0eWxlPVwiZmxleDoxO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Y29sb3I6I2ZmZjtmb250OmluaGVyaXQ7cGFkZGluZzoxMHB4IDA7b3V0bGluZTpub25lO1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzQ0NDtmb250LXNpemU6MTBweDttYXJnaW4tbGVmdDo4cHg7XCI+RXNjIHRvIGNsb3NlPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290KTtcbiAgICBpbnB1dCA9IHJvb3QucXVlcnlTZWxlY3RvcignI2hhbnpvLWNvbnNvbGUtaW5wdXQnKTtcbiAgICBvdXRwdXQgPSByb290LnF1ZXJ5U2VsZWN0b3IoJyNoYW56by1jb25zb2xlLW91dHB1dCcpO1xuXG4gICAgaW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBoaWRlKCk7IHJldHVybjsgfVxuICAgICAgaWYgKGUua2V5ICE9PSAnRW50ZXInIHx8ICFpbnB1dD8udmFsdWUudHJpbSgpKSByZXR1cm47XG4gICAgICBjb25zdCBleHByID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgIGFwcGVuZExpbmUoYD4gJHtleHByfWAsICcjODg4Jyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoMCwgZXZhbCkoZXhwcik7XG4gICAgICAgIGFwcGVuZExpbmUoU3RyaW5nKHJlc3VsdCksICcjNENBRjUwJyk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBhcHBlbmRMaW5lKGVycj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSwgJyNGNDQzMzYnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZExpbmUodGV4dDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKSB7XG4gICAgaWYgKCFvdXRwdXQpIHJldHVybjtcbiAgICBjb25zdCBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbGluZS5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgIGxpbmUudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIG91dHB1dC5hcHBlbmRDaGlsZChsaW5lKTtcbiAgICBvdXRwdXQuc2Nyb2xsVG9wID0gb3V0cHV0LnNjcm9sbEhlaWdodDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3coKSB7XG4gICAgZW5zdXJlTW91bnQoKTtcbiAgICBpZiAocm9vdCkgcm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB2aXNpYmxlID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IGlucHV0Py5mb2N1cygpLCA1MCk7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlKCkge1xuICAgIGlmIChyb290KSByb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHsgc2hvdywgaGlkZSwgaXNWaXNpYmxlOiAoKSA9PiB2aXNpYmxlIH07XG59KSgpO1xuXG4vLyBJbml0aWFsaXplXG5uZXcgSGFuem9Db250ZW50U2NyaXB0KCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCYWNrZ3JvdW5kIGtlZXAtYWxpdmUgcG9ydC5cbi8vXG4vLyBGaXJlZm94IE1WMyB0cmVhdHMgYGJhY2tncm91bmQuc2NyaXB0c2AgYXMgZXZlbnQgcGFnZXM7IENocm9tZSBNVjMgc2VydmljZVxuLy8gd29ya2VycyBpZGxlIG91dCBhZnRlciB+MzBzLiBBbiBvcGVuIGBjaHJvbWUucnVudGltZWAgcG9ydCBmcm9tIGFueVxuLy8gY29udGVudCBzY3JpcHQga2VlcHMgdGhlIGJhY2tncm91bmQgcGFnZSBhbGl2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZVxuLy8gcG9ydCBcdTIwMTQgbm8gcG9sbGluZywgbm8gYWxhcm1zIHJlcXVpcmVkLiBFdmVyeSBsb2FkZWQgaHR0cChzKSB0YWIgaG9sZHNcbi8vIG9uZSBvZiB0aGVzZSwgc28gdGhlIGJhY2tncm91bmQgWkFQIHNvY2tldCBzdXJ2aXZlcyBpbmRlZmluaXRlbHkgYXNcbi8vIGxvbmcgYXMgdGhlIHVzZXIgaGFzIGFueSBub24tcHJpdmlsZWdlZCB0YWIgb3Blbi5cbi8vXG4vLyBIZWFydGJlYXRzIGV2ZXJ5IDEwcyBwcmV2ZW50IEZpcmVmb3gncyA0LW1pbnV0ZSBpZGxlLXBvcnQgZGlzY29ubmVjdC5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG50cnkge1xuICBjb25zdCBwb3J0ID0gKGJyb3dzZXIgYXMgYW55KT8ucnVudGltZT8uY29ubmVjdD8uKHsgbmFtZTogJ3phcC1rZWVwYWxpdmUnIH0pXG4gICAgfHwgKGNocm9tZSBhcyBhbnkpPy5ydW50aW1lPy5jb25uZWN0Py4oeyBuYW1lOiAnemFwLWtlZXBhbGl2ZScgfSk7XG4gIGlmIChwb3J0KSB7XG4gICAgY29uc3QgdGljayA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRyeSB7IHBvcnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAncGluZycsIHQ6IERhdGUubm93KCkgfSk7IH1cbiAgICAgIGNhdGNoIHsgY2xlYXJJbnRlcnZhbCh0aWNrKTsgfVxuICAgIH0sIDEwXzAwMCk7XG4gICAgcG9ydC5vbkRpc2Nvbm5lY3Q/LmFkZExpc3RlbmVyPy4oKCkgPT4gY2xlYXJJbnRlcnZhbCh0aWNrKSk7XG4gIH1cbn0gY2F0Y2ggeyAvKiBub3QgYWxsIHBhZ2VzIGxldCBjb250ZW50IHNjcmlwdHMgb3BlbiBwb3J0cyBcdTIwMTQgYmVzdCBlZmZvcnQgKi8gfVxuIiwgIi8qKlxuICogS2V5Ym9hcmQtc2hvcnRjdXQgY29uZmlndXJhdGlvbiBzaGFyZWQgYmV0d2VlbiBjb250ZW50IHNjcmlwdHMsIHRoZVxuICogcG9wdXAgcmVjb3JkZXIsIGFuZCB0aGUgYmFja2dyb3VuZC4gQSBcInNob3J0Y3V0XCIgaXMgYSBub3JtYWxpc2VkXG4gKiBkZXNjcmlwdGlvbiBvZiBhIGtleWJvYXJkIGNob3JkIChtb2RpZmllcnMgKyBrZXkpIHRoYXQgdGVsbHMgdGhlXG4gKiBjb250ZW50IHNjcmlwdCB3aGljaCBjb21iaW5hdGlvbiB0b2dnbGVzIGluc3BlY3QgLyBjbGljay10by1zb3VyY2VcbiAqIG5hdmlnYXRpb24uIFRoZSBkZWZhdWx0IGlzICoqQ3RybCoqIGFsb25lIChNYWMgdXNlcnMgd291bGQgb3RoZXJ3aXNlXG4gKiBuZWVkIHRvIGhvbGQgT3B0aW9uLCB3aGljaCBpbnRlcmZlcmVzIHdpdGggbmF0aXZlIG1hY09TIGNoYXJhY3RlclxuICogaW5wdXQpLiBBbnkgY29tYmluYXRpb24gaXMgY29uZmlndXJhYmxlIHRocm91Z2ggdGhlIHBvcHVwLlxuICpcbiAqIFN0b3JhZ2Ugc2hhcGU6IGBjaHJvbWUuc3RvcmFnZS5sb2NhbFtcImhhbnpvX3Nob3J0Y3V0X2luc3BlY3RcIl0gPSBTaG9ydGN1dGAuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBTaG9ydGN1dCB7XG4gIC8qKiBXaGV0aGVyIEN0cmwgKG9yIENtZCBvbiBtYWNPUykgaXMgcGFydCBvZiB0aGUgY2hvcmQuICovXG4gIGN0cmw6IGJvb2xlYW47XG4gIC8qKiBDbWQvTWV0YSBrZXkgKG1hY09TKSBcdTIwMTQgYm91bmQgc2VwYXJhdGVseSBmcm9tIEN0cmwuICovXG4gIG1ldGE6IGJvb2xlYW47XG4gIGFsdDogYm9vbGVhbjtcbiAgc2hpZnQ6IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBsZXR0ZXIgb3IgYEtleSpgIHZhbHVlLiBFbXB0eSBzdHJpbmcgbWVhbnMgbW9kaWZpZXItb25seS4gKi9cbiAga2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBTVE9SQUdFX0tFWV9JTlNQRUNUID0gJ2hhbnpvX3Nob3J0Y3V0X2luc3BlY3QnO1xuXG4vKipcbiAqIERlZmF1bHQgaW5zcGVjdC1tb2RpZmllcjogKipDdHJsKiogKG9yIENtZCBvbiBtYWNPUykgYWxvbmUuXG4gKlxuICogV2h5IG5vdCBBbHQvT3B0aW9uPyBPbiBtYWNPUywgT3B0aW9uIGlzIHRoZSBzeXN0ZW0tbGV2ZWwgY2hhcmFjdGVyLVxuICogY29tcG9zZSBtb2RpZmllciAoT3B0aW9uLWMgXHUyMTkyIFx1MDBFNywgT3B0aW9uLTMgXHUyMTkyIFx1MDBBMykuIFVzaW5nIE9wdGlvbiBmb3Igb3VyXG4gKiBpbnNwZWN0b3Igc2lsZW50bHkgc3dhbGxvd3MgcmVhbCB1c2VyIGtleXN0cm9rZXMgYW5kIGNvcnJ1cHRzIHRleHRcbiAqIGlucHV0IG9uIGV2ZXJ5IHBhZ2UgdGhhdCBoYXMgdXMgaW5qZWN0ZWQuIEN0cmwgaXMgdGhlIG5hdHVyYWwgY2hvaWNlXG4gKiBmb3IgYSBkZXZlbG9wZXItdG9vbHMgbW9kaWZpZXIgKGFuZCBtYXRjaGVzIERldlRvb2xzJyBJbnNwZWN0IEVsZW1lbnRcbiAqIGJlaGF2aW91ciBvbiBldmVyeSBicm93c2VyKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5TUEVDVF9TSE9SVENVVDogU2hvcnRjdXQgPSB7XG4gIGN0cmw6IHRydWUsXG4gIG1ldGE6IGZhbHNlLFxuICBhbHQ6IGZhbHNlLFxuICBzaGlmdDogZmFsc2UsXG4gIGtleTogJycsXG59O1xuXG4vKipcbiAqIE1hdGNoIGEga2V5Ym9hcmQgLyBtb3VzZSBldmVudCBhZ2FpbnN0IGEgU2hvcnRjdXQuIFJldHVybnMgdHJ1ZSBpZmZcbiAqIGV2ZXJ5IHJlcXVpcmVkIG1vZGlmaWVyIGlzIGhlbGQgQU5EIGV2ZXJ5IG5vbi1yZXF1aXJlZCBtb2RpZmllciBpc1xuICogTk9UIGhlbGQgQU5EIHRoZSBrZXkgbWF0Y2hlcyAob3IgYGtleSA9PT0gJydgIGZvciBtb2RpZmllci1vbmx5KS5cbiAqXG4gKiBPbiBtYWNPUywgY3RybCBtYXRjaGVzIGBldmVudC5tZXRhS2V5YCBpZiB0aGUgc2F2ZWQgc2hvcnRjdXQgaGFzXG4gKiBtZXRhPXRydWUgT1IgY3RybD10cnVlICh3ZSB0cmVhdCBDdHJsLW9uLU1hYyBhbmQgQ21kIGFzIGVxdWl2YWxlbnRcbiAqIGZvciB0aGUgZGVmYXVsdCBcdTIwMTQgbWFueSBkZXZzIGFzc3VtZSBcIkN0cmxcIiByZWFsbHkgbWVhbnMgXCJ0aGUgcGxhdGZvcm1cbiAqIHByaW1hcnkgbW9kaWZpZXJcIikuIFRvIGFkZHJlc3MgZXhwbGljaXRseSwgc2V0IGN0cmw9ZmFsc2UgbWV0YT10cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1Nob3J0Y3V0KFxuICBlOiB7IGN0cmxLZXk/OiBib29sZWFuOyBtZXRhS2V5PzogYm9vbGVhbjsgYWx0S2V5PzogYm9vbGVhbjsgc2hpZnRLZXk/OiBib29sZWFuOyBrZXk/OiBzdHJpbmcgfSxcbiAgczogU2hvcnRjdXQsXG4pOiBib29sZWFuIHtcbiAgLy8gUmVxdWlyZWQgbW9kaWZpZXJzIFx1MjAxNCBldmVyeSB0cnV0aHkgZmllbGQgb2YgYHNgIG11c3QgYmUgc2V0IG9uIHRoZSBldmVudC5cbiAgaWYgKHMuY3RybCAmJiAhZS5jdHJsS2V5KSByZXR1cm4gZmFsc2U7XG4gIGlmIChzLm1ldGEgJiYgIWUubWV0YUtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocy5hbHQgJiYgIWUuYWx0S2V5KSByZXR1cm4gZmFsc2U7XG4gIGlmIChzLnNoaWZ0ICYmICFlLnNoaWZ0S2V5KSByZXR1cm4gZmFsc2U7XG4gIC8vIEZvcmJpZGRlbiBtb2RpZmllcnMgXHUyMDE0IGV2ZXJ5IGZhbHNlIGZpZWxkIG9mIGBzYCBtdXN0IE5PVCBiZSBzZXQgb25cbiAgLy8gdGhlIGV2ZW50LiBPdGhlcndpc2UgQ3RybC1vbmx5IHdvdWxkIG1hdGNoIEN0cmwtU2hpZnQtWCB0b28sIHdoaWNoXG4gIC8vIHdvdWxkIHN1cnByaXNlIHVzZXJzIHdobyBjb25maWd1cmVkIEN0cmwgYWxvbmUuXG4gIGlmICghcy5jdHJsICYmIGUuY3RybEtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXMubWV0YSAmJiBlLm1ldGFLZXkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFzLmFsdCAmJiBlLmFsdEtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXMuc2hpZnQgJiYgZS5zaGlmdEtleSkgcmV0dXJuIGZhbHNlO1xuICAvLyBLZXkgbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUpLiBFbXB0eSBrZXkgbWVhbnMgdGhlIGNob3JkIGlzXG4gIC8vIG1vZGlmaWVyLW9ubHkgXHUyMDE0IGFueSBzdWJzZXF1ZW50IGtleSBzdGlsbCBzYXRpc2ZpZXMgaXQuXG4gIGlmIChzLmtleSAmJiAoZS5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCkgIT09IHMua2V5LnRvTG93ZXJDYXNlKCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmVuZGVyIGEgU2hvcnRjdXQgYXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgbGlrZSBcIkN0cmwrU2hpZnQrS1wiIG9yXG4gKiBcIlx1MjMxOCtDbGlja1wiLiBVc2VkIGJ5IHRoZSBwb3B1cCBVSSBhbmQgYW55IHBsYWNlIHdlIHN1cmZhY2UgdGhlIGNob3JkXG4gKiB0byB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNob3J0Y3V0KHM6IFNob3J0Y3V0LCBvcHRzPzogeyBtYWM/OiBib29sZWFuOyBjbGljaz86IGJvb2xlYW4gfSk6IHN0cmluZyB7XG4gIGNvbnN0IG1hYyA9IG9wdHM/Lm1hYyA/PyAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgL01hYy9pLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtIHx8ICcnKSk7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocy5jdHJsKSBwYXJ0cy5wdXNoKG1hYyA/ICdcdTIzMDMnIDogJ0N0cmwnKTtcbiAgaWYgKHMubWV0YSkgcGFydHMucHVzaChtYWMgPyAnXHUyMzE4JyA6ICdNZXRhJyk7XG4gIGlmIChzLmFsdCkgcGFydHMucHVzaChtYWMgPyAnXHUyMzI1JyA6ICdBbHQnKTtcbiAgaWYgKHMuc2hpZnQpIHBhcnRzLnB1c2gobWFjID8gJ1x1MjFFNycgOiAnU2hpZnQnKTtcbiAgaWYgKHMua2V5KSBwYXJ0cy5wdXNoKHMua2V5Lmxlbmd0aCA9PT0gMSA/IHMua2V5LnRvVXBwZXJDYXNlKCkgOiBzLmtleSk7XG4gIGlmIChvcHRzPy5jbGljaykgcGFydHMucHVzaCgnQ2xpY2snKTtcbiAgcmV0dXJuIHBhcnRzLmpvaW4oJysnKSB8fCAnKHVuc2V0KSc7XG59XG5cbi8qKlxuICogTm9ybWFsaXNlIGEgZnJlc2gga2V5ZG93biBpbnRvIGEgU2hvcnRjdXQgcGF5bG9hZC4gRHJvcHMgVGFiL0VzYy9ldGMuXG4gKiAodGhlIHJlY29yZGVyIFVJIGludml0ZXMgdGhlIHVzZXIgdG8gcHJlc3MgYSBjaG9yZCwgbm90IHRvIG5hdmlnYXRlXG4gKiB0aGUgcGFnZSkgYW5kIHJlamVjdHMgcHVyZSBtb2RpZmllciBrZXlkb3ducyBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndFxuICogZmlyZSBvbiBldmVyeSBTaGlmdCBwcmVzcyB3aGlsZSB0aGUgdXNlciBpcyByZWFjaGluZyBmb3IgYSBsZXR0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG9ydGN1dEZyb21FdmVudChcbiAgZTogeyBjdHJsS2V5PzogYm9vbGVhbjsgbWV0YUtleT86IGJvb2xlYW47IGFsdEtleT86IGJvb2xlYW47IHNoaWZ0S2V5PzogYm9vbGVhbjsga2V5Pzogc3RyaW5nIH0sXG4pOiBTaG9ydGN1dCB8IG51bGwge1xuICBjb25zdCBrID0gZS5rZXkgfHwgJyc7XG4gIC8vIE1vZGlmaWVyLW9ubHkgaXMgYSB2YWxpZCBzaG9ydGN1dCwgYnV0IHRoZSBrZXlkb3duIGV2ZW50IGZvciBhIHB1cmVcbiAgLy8gbW9kaWZpZXIgKENvbnRyb2wgLyBTaGlmdCAvIEFsdCAvIE1ldGEpIHJlcG9ydHMgYGtleWAgYXMgdGhlXG4gIC8vIG1vZGlmaWVyIG5hbWUgXHUyMDE0IHJlY29yZCB0aG9zZSBhcyBtb2RpZmllci1vbmx5LlxuICBpZiAoWydDb250cm9sJywgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0J10uaW5jbHVkZXMoaykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3RybDogISFlLmN0cmxLZXksXG4gICAgICBtZXRhOiAhIWUubWV0YUtleSxcbiAgICAgIGFsdDogISFlLmFsdEtleSxcbiAgICAgIHNoaWZ0OiAhIWUuc2hpZnRLZXksXG4gICAgICBrZXk6ICcnLFxuICAgIH07XG4gIH1cbiAgLy8gU3lzdGVtIGtleXMgd2UgbmV2ZXIgd2FudCB0byBiaW5kLlxuICBpZiAoWydUYWInLCAnRXNjYXBlJywgJ0VudGVyJywgJyddLmluY2x1ZGVzKGspKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBjdHJsOiAhIWUuY3RybEtleSxcbiAgICBtZXRhOiAhIWUubWV0YUtleSxcbiAgICBhbHQ6ICEhZS5hbHRLZXksXG4gICAgc2hpZnQ6ICEhZS5zaGlmdEtleSxcbiAgICBrZXk6IGssXG4gIH07XG59XG5cbi8qKlxuICogUmVhZCB0aGUgaW5zcGVjdCBzaG9ydGN1dCBmcm9tIGV4dGVuc2lvbiBzdG9yYWdlOyBmYWxsIGJhY2sgdG8gdGhlXG4gKiBkZWZhdWx0IGlmIGFic2VudCBvciBtYWxmb3JtZWQuIEFsd2F5cyByZXR1cm5zIGEgdmFsaWQgU2hvcnRjdXQgc29cbiAqIGNhbGxlcnMgZG9uJ3QgaGF2ZSB0byBkZWZlbnNpdmVseSByZS1kZWZhdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEluc3BlY3RTaG9ydGN1dChcbiAgc3RvcmFnZTogeyBnZXQoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IH0sXG4pOiBQcm9taXNlPFNob3J0Y3V0PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgc3RvcmFnZS5nZXQoW1NUT1JBR0VfS0VZX0lOU1BFQ1RdKTtcbiAgICBjb25zdCB2ID0gcmF3W1NUT1JBR0VfS0VZX0lOU1BFQ1RdO1xuICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAmJiB0eXBlb2Ygdi5jdHJsID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYuYWx0ID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYuc2hpZnQgPT09ICdib29sZWFuJ1xuICAgICAgICAmJiB0eXBlb2Ygdi5tZXRhID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYua2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHYgYXMgU2hvcnRjdXQ7XG4gICAgfVxuICB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH1cbiAgcmV0dXJuIHsgLi4uREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VUIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlSW5zcGVjdFNob3J0Y3V0KFxuICBzdG9yYWdlOiB7IHNldChpdGVtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IH0sXG4gIHM6IFNob3J0Y3V0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgW1NUT1JBR0VfS0VZX0lOU1BFQ1RdOiBzIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQTtBQUVBLFlBQUksRUFBRUEsV0FBV0MsVUFBVUQsV0FBV0MsT0FBT0MsV0FBV0YsV0FBV0MsT0FBT0MsUUFBUUMsS0FBSztBQUNyRixnQkFBTSxJQUFJQyxNQUFNLDJEQUEyRDtRQUM3RTtBQUVBLFlBQUksRUFBRUosV0FBV0ssV0FBV0wsV0FBV0ssUUFBUUgsV0FBV0YsV0FBV0ssUUFBUUgsUUFBUUMsS0FBSztBQUN4RixnQkFBTUcsbURBQW1EO0FBT3pELGdCQUFNQyxXQUFXQyxtQkFBaUI7QUFJaEMsa0JBQU1DLGNBQWM7Y0FDbEIsVUFBVTtn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RXhDLFlBQU0sUUFBUSxTQUFTLGNBQWMsT0FBTztBQUM1QyxZQUFNLEtBQUs7QUFDWCxZQUFNLGNBQWM7QUFBQTtBQUFBLFNBRWYsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBYVYsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxUnBCLGVBQVMsS0FBSyxZQUFZLEtBQUs7QUFBQSxJQUNqQztBQUFBLElBRVEsUUFBYztBQTV1Q3hCLFVBQUFBLEtBQUFDLEtBQUFFLEtBQUFDLEtBQUFDLEtBQUFDO0FBNnVDSSxVQUFJLEtBQUssUUFBUztBQUVsQixXQUFLLE9B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TUFBTSxNQUFNLFdBQVcsTUFBTSxRQUFRO0FBQUEsRUFDaEQsR0FBRztBQUdILE1BQUksbUJBQW1CO0FBcjVEdkI7QUFtNkRBLE1BQUk7QUFDRixVQUFNLFNBQVEsOENBQWlCLFlBQWpCLG1CQUEwQixZQUExQiw0QkFBb0MsRUFBRSxNQUFNLGdCQUFnQixTQUNwRSw0Q0FBZ0IsWUFBaEIsbUJBQXlCLFlBQXpCLDRCQUFtQyxFQUFFLE1BQU0sZ0JBQWdCO0FBQ2pFLFFBQUksTUFBTTtBQUNSLFlBQU0sT0FBTyxZQUFZLE1BQU07QUFDN0IsWUFBSTtBQUFFLGVBQUssWUFBWSxFQUFFLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFBQSxRQUFHLFFBQ25EO0FBQUUsd0JBQWMsSUFBSTtBQUFBLFFBQUc7QUFBQSxNQUMvQixHQUFHLEdBQU07QUFDVCx1QkFBSyxpQkFBTCxtQkFBbUIsZ0JBQW5CLDRCQUFpQyxNQUFNLGNBQWMsSUFBSTtBQUFBLElBQzNEO0FBQUEsRUFDRixRQUFRO0FBQUEsRUFBbUU7IiwKICAibmFtZXMiOiBbImdsb2JhbFRoaXMiLCAiY2hyb21lIiwgInJ1bnRpbWUiLCAiaWQiLCAiRXJyb3IiLCAiYnJvd3NlciIsICJDSFJPTUVfU0VORF9NRVNTQUdFX0NBTExCQUNLX05PX1JFU1BPTlNFX01FU1NBR0UiLCAid3JhcEFQSXMiLCAiZXh0ZW5zaW9uQVBJcyIsICJhcGlNZXRhZGF0YSIsICJPYmplY3QiLCAia2V5cyIsICJsZW5ndGgiLCAiRGVmYXVsdFdlYWtNYXAiLCAiV2Vha01hcCIsICJjb25zdHJ1Y3RvciIsICJjcmVhdGVJdGVtIiwgIml0ZW1zIiwgInVuZGVmaW5lZCIsICJnZXQiLCAia2V5IiwgImhhcyIsICJzZXQiLCAiaXNUaGVuYWJsZSIsICJ2YWx1ZSIsICJ0aGVuIiwgIm1ha2VDYWxsYmFjayIsICJwcm9taXNlIiwgIm1ldGFkYXRhIiwgImNhbGxiYWNrQXJncyIsICJsYXN0RXJyb3IiLCAicmVqZWN0IiwgIm1lc3NhZ2UiLCAic2luZ2xlQ2FsbGJhY2tBcmciLCAicmVzb2x2ZSIsICJwbHVyYWxpemVBcmd1bWVudHMiLCAibnVtQXJncyIsICJ3cmFwQXN5bmNGdW5jdGlvbiIsICJuYW1lIiwgImFzeW5jRnVuY3Rpb25XcmFwcGVyIiwgInRhcmdldCIsICJhcmdzIiwgIm1pbkFyZ3MiLCAibWF4QXJncyIsICJQcm9taXNlIiwgImZhbGxiYWNrVG9Ob0NhbGxiYWNrIiwgImNiRXJyb3IiLCAiY29uc29sZSIsICJ3YXJuIiwgIm5vQ2FsbGJhY2siLCAid3JhcE1ldGhvZCIsICJtZXRob2QiLCAid3JhcHBlciIsICJQcm94eSIsICJhcHBseSIsICJ0YXJnZXRNZXRob2QiLCAidGhpc09iaiIsICJjYWxsIiwgImhhc093blByb3BlcnR5IiwgIkZ1bmN0aW9uIiwgImJpbmQiLCAicHJvdG90eXBlIiwgIndyYXBPYmplY3QiLCAid3JhcHBlcnMiLCAiY2FjaGUiLCAiY3JlYXRlIiwgImhhbmRsZXJzIiwgInByb3h5VGFyZ2V0IiwgInByb3AiLCAicmVjZWl2ZXIiLCAiZGVmaW5lUHJvcGVydHkiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiZGVzYyIsICJSZWZsZWN0IiwgImRlbGV0ZVByb3BlcnR5IiwgIndyYXBFdmVudCIsICJ3cmFwcGVyTWFwIiwgImFkZExpc3RlbmVyIiwgImxpc3RlbmVyIiwgImhhc0xpc3RlbmVyIiwgInJlbW92ZUxpc3RlbmVyIiwgIm9uUmVxdWVzdEZpbmlzaGVkV3JhcHBlcnMiLCAib25SZXF1ZXN0RmluaXNoZWQiLCAicmVxIiwgIndyYXBwZWRSZXEiLCAiZ2V0Q29udGVudCIsICJvbk1lc3NhZ2VXcmFwcGVycyIsICJvbk1lc3NhZ2UiLCAic2VuZGVyIiwgInNlbmRSZXNwb25zZSIsICJkaWRDYWxsU2VuZFJlc3BvbnNlIiwgIndyYXBwZWRTZW5kUmVzcG9uc2UiLCAic2VuZFJlc3BvbnNlUHJvbWlzZSIsICJyZXNwb25zZSIsICJyZXN1bHQiLCAiZXJyIiwgImlzUmVzdWx0VGhlbmFibGUiLCAic2VuZFByb21pc2VkUmVzdWx0IiwgIm1zZyIsICJlcnJvciIsICJfX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X18iLCAiY2F0Y2giLCAid3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2siLCAicmVwbHkiLCAid3JhcHBlZFNlbmRNZXNzYWdlIiwgImFwaU5hbWVzcGFjZU9iaiIsICJ3cmFwcGVkQ2IiLCAicHVzaCIsICJzZW5kTWVzc2FnZSIsICJzdGF0aWNXcmFwcGVycyIsICJkZXZ0b29scyIsICJuZXR3b3JrIiwgIm9uTWVzc2FnZUV4dGVybmFsIiwgInRhYnMiLCAic2V0dGluZ01ldGFkYXRhIiwgImNsZWFyIiwgInByaXZhY3kiLCAic2VydmljZXMiLCAid2Vic2l0ZXMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiX2EiLCAiX2IiLCAibG9jYXRpb24iLCAiX2MiLCAiX2QiLCAiX2UiLCAiX2YiXQp9Cg==
|