obsidian-dev-utils 87.1.2 → 87.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/dist/dev/main.js +37543 -0
- package/dist/dev/manifest.json +9 -0
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +155 -57
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +18 -9
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +18 -9
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +166 -59
- package/package.json +1 -1
|
@@ -6,10 +6,16 @@
|
|
|
6
6
|
*
|
|
7
7
|
* A plugin can attach a `<plugin-id>.demo-vault.zip` archive to each GitHub release (see
|
|
8
8
|
* `archivePluginDemoVault` in `script-utils/demo-vault.ts`). This resolves the plugin's repository
|
|
9
|
-
* from Obsidian's community registry, downloads the archive for the chosen version,
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* from Obsidian's community registry, downloads the archive for the chosen version, and opens it as a
|
|
10
|
+
* vault in a new window. When the installed plugin version is behind the latest release, the user is
|
|
11
|
+
* offered a choice between the two versions.
|
|
12
|
+
*
|
|
13
|
+
* A progress notice is shown immediately (download + extraction can take a while, so the user must see
|
|
14
|
+
* something is happening right away). Only the downloaded ARCHIVE is cached (under the OS temp
|
|
15
|
+
* directory); every invocation extracts a FRESH copy into its own temporary folder and opens that, so a
|
|
16
|
+
* previous session's edits never leak into a new one. The extracted vault folder is named
|
|
17
|
+
* `<plugin-id>-<version>.demo-vault` so it reads nicely in Obsidian's vault switcher. Orphaned
|
|
18
|
+
* extracted folders left over from earlier sessions are cleaned up (best-effort) on each open.
|
|
13
19
|
*/
|
|
14
20
|
import type { App } from 'obsidian';
|
|
15
21
|
import type { PluginNoticeComponent } from './components/plugin-notice-component.mjs';
|
|
@@ -22,8 +28,8 @@ export interface OpenDemoVaultParams {
|
|
|
22
28
|
*/
|
|
23
29
|
readonly app: App;
|
|
24
30
|
/**
|
|
25
|
-
* The plugin id, used to locate the GitHub repository
|
|
26
|
-
*
|
|
31
|
+
* The plugin id, used to locate the GitHub repository, to name the archive asset, and to name the
|
|
32
|
+
* cached archive and the extracted vault folder.
|
|
27
33
|
*/
|
|
28
34
|
readonly pluginId: string;
|
|
29
35
|
/**
|
|
@@ -31,7 +37,8 @@ export interface OpenDemoVaultParams {
|
|
|
31
37
|
*/
|
|
32
38
|
readonly pluginName: string;
|
|
33
39
|
/**
|
|
34
|
-
* The notice component used to report problems (plugin not in the registry, missing
|
|
40
|
+
* The notice component used to report progress and problems (plugin not in the registry, missing
|
|
41
|
+
* archive).
|
|
35
42
|
*/
|
|
36
43
|
readonly pluginNoticeComponent: PluginNoticeComponent;
|
|
37
44
|
/**
|
|
@@ -43,8 +50,10 @@ export interface OpenDemoVaultParams {
|
|
|
43
50
|
* Downloads and opens the plugin's demo vault in a new Obsidian window. Desktop only.
|
|
44
51
|
*
|
|
45
52
|
* If the installed plugin version is the latest (or newer), its demo vault opens directly; otherwise
|
|
46
|
-
* the user chooses between the latest and the currently-installed version.
|
|
47
|
-
* archive is downloaded
|
|
53
|
+
* the user chooses between the latest and the currently-installed version. A progress notice is shown
|
|
54
|
+
* immediately. The chosen version's archive is downloaded once (then reused from the archive cache),
|
|
55
|
+
* but a fresh copy is extracted into its own temporary folder on every open — the vault is never reused
|
|
56
|
+
* across sessions.
|
|
48
57
|
*
|
|
49
58
|
* @param params - The {@link OpenDemoVaultParams}.
|
|
50
59
|
* @returns A {@link Promise} that resolves once the vault has been opened, or once the operation has
|
|
@@ -21,10 +21,64 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
+
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
25
|
+
var __typeError = (msg) => {
|
|
26
|
+
throw TypeError(msg);
|
|
27
|
+
};
|
|
28
|
+
var __using = (stack, value, async) => {
|
|
29
|
+
if (value != null) {
|
|
30
|
+
if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
|
|
31
|
+
var dispose, inner;
|
|
32
|
+
if (async) dispose = value[__knownSymbol("asyncDispose")];
|
|
33
|
+
if (dispose === void 0) {
|
|
34
|
+
dispose = value[__knownSymbol("dispose")];
|
|
35
|
+
if (async) inner = dispose;
|
|
36
|
+
}
|
|
37
|
+
if (typeof dispose !== "function") __typeError("Object not disposable");
|
|
38
|
+
if (inner) dispose = function() {
|
|
39
|
+
try {
|
|
40
|
+
inner.call(this);
|
|
41
|
+
} catch (e) {
|
|
42
|
+
return Promise.reject(e);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
stack.push([async, dispose, value]);
|
|
46
|
+
} else if (async) {
|
|
47
|
+
stack.push([async]);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
};
|
|
51
|
+
var __callDispose = (stack, error, hasError) => {
|
|
52
|
+
var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
|
|
53
|
+
return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
|
|
54
|
+
};
|
|
55
|
+
var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
|
|
56
|
+
var next = (it) => {
|
|
57
|
+
while (it = stack.pop()) {
|
|
58
|
+
try {
|
|
59
|
+
var result = it[1] && it[1].call(it[2]);
|
|
60
|
+
if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
|
|
61
|
+
} catch (e) {
|
|
62
|
+
fail(e);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (hasError) throw error;
|
|
66
|
+
};
|
|
67
|
+
return next();
|
|
68
|
+
};
|
|
24
69
|
import AdmZip from "adm-zip";
|
|
25
70
|
import { compareVersions } from "compare-versions";
|
|
26
|
-
import { Buffer } from "node:buffer";
|
|
27
|
-
import {
|
|
71
|
+
import { Buffer as Buffer2 } from "node:buffer";
|
|
72
|
+
import {
|
|
73
|
+
existsSync,
|
|
74
|
+
mkdirSync,
|
|
75
|
+
mkdtempSync,
|
|
76
|
+
readdirSync,
|
|
77
|
+
readFileSync,
|
|
78
|
+
rmSync,
|
|
79
|
+
statSync,
|
|
80
|
+
writeFileSync
|
|
81
|
+
} from "node:fs";
|
|
28
82
|
import { tmpdir } from "node:os";
|
|
29
83
|
import { requestUrl } from "obsidian";
|
|
30
84
|
import { join } from "../path.mjs";
|
|
@@ -34,76 +88,132 @@ import {
|
|
|
34
88
|
} from "./community-plugins.mjs";
|
|
35
89
|
import { selectOption } from "./modals/select-option.mjs";
|
|
36
90
|
const DEMO_VAULTS_CACHE_FOLDER = "obsidian-demo-vaults";
|
|
91
|
+
const ARCHIVES_SUBFOLDER = "archives";
|
|
92
|
+
const EXTRACTED_VAULTS_SUBFOLDER = "extracted";
|
|
37
93
|
const HTTP_STATUS_OK = 200;
|
|
94
|
+
const ORPHANED_EXTRACTED_VAULT_MAX_AGE_IN_MILLISECONDS = 864e5;
|
|
38
95
|
async function openDemoVault(params) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
pluginName,
|
|
43
|
-
pluginNoticeComponent,
|
|
44
|
-
pluginVersion
|
|
45
|
-
} = params;
|
|
46
|
-
const repo = await getCommunityPluginRepo(pluginId);
|
|
47
|
-
if (!repo) {
|
|
48
|
-
pluginNoticeComponent.showNotice(`Could not find plugin ${pluginName} in the community plugins registry.`);
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
const currentVersion = pluginVersion;
|
|
52
|
-
const latestVersion = await getLatestReleaseVersion(repo);
|
|
53
|
-
let versionToOpen;
|
|
54
|
-
if (compareVersions(currentVersion, latestVersion) >= 0) {
|
|
55
|
-
versionToOpen = currentVersion;
|
|
56
|
-
} else {
|
|
57
|
-
const chosenVersion = await selectOption({
|
|
96
|
+
var _stack = [];
|
|
97
|
+
try {
|
|
98
|
+
const {
|
|
58
99
|
app,
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
text: "Cancel",
|
|
72
|
-
value: null
|
|
73
|
-
}
|
|
74
|
-
],
|
|
75
|
-
title: pluginName
|
|
76
|
-
});
|
|
77
|
-
if (chosenVersion === null) {
|
|
100
|
+
pluginId,
|
|
101
|
+
pluginName,
|
|
102
|
+
pluginNoticeComponent,
|
|
103
|
+
pluginVersion
|
|
104
|
+
} = params;
|
|
105
|
+
const progressNotice = __using(_stack, pluginNoticeComponent.showNoticeAfterDelay({
|
|
106
|
+
content: `Opening demo vault for ${pluginName}\u2026`,
|
|
107
|
+
delayInMilliseconds: 0
|
|
108
|
+
}));
|
|
109
|
+
const repo = await getCommunityPluginRepo(pluginId);
|
|
110
|
+
if (!repo) {
|
|
111
|
+
pluginNoticeComponent.showNotice(`Could not find plugin ${pluginName} in the community plugins registry.`);
|
|
78
112
|
return;
|
|
79
113
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
114
|
+
const currentVersion = pluginVersion;
|
|
115
|
+
const latestVersion = await getLatestReleaseVersion(repo);
|
|
116
|
+
let versionToOpen;
|
|
117
|
+
if (compareVersions(currentVersion, latestVersion) >= 0) {
|
|
118
|
+
versionToOpen = currentVersion;
|
|
119
|
+
} else {
|
|
120
|
+
const chosenVersion = await selectOption({
|
|
121
|
+
app,
|
|
122
|
+
message: `Current version of plugin ${pluginName} v${currentVersion} is not the latest (v${latestVersion})`,
|
|
123
|
+
options: [
|
|
124
|
+
{
|
|
125
|
+
isCta: true,
|
|
126
|
+
text: `Open demo vault for latest version (v${latestVersion})`,
|
|
127
|
+
value: latestVersion
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
text: `Open demo vault for current version (v${currentVersion})`,
|
|
131
|
+
value: currentVersion
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
text: "Cancel",
|
|
135
|
+
value: null
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
title: pluginName
|
|
139
|
+
});
|
|
140
|
+
if (chosenVersion === null) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
versionToOpen = chosenVersion;
|
|
144
|
+
}
|
|
145
|
+
const archive = await resolveDemoVaultArchive({
|
|
86
146
|
pluginId,
|
|
87
147
|
pluginName,
|
|
88
148
|
pluginNoticeComponent,
|
|
149
|
+
progressNotice,
|
|
89
150
|
repo,
|
|
90
151
|
version: versionToOpen
|
|
91
152
|
});
|
|
92
|
-
if (!
|
|
153
|
+
if (!archive) {
|
|
93
154
|
return;
|
|
94
155
|
}
|
|
156
|
+
progressNotice.setContent(`Extracting demo vault for ${pluginName} v${versionToOpen}\u2026`);
|
|
157
|
+
cleanupOrphanedExtractedVaults();
|
|
158
|
+
const vaultDir = extractDemoVaultToFreshFolder({
|
|
159
|
+
archive,
|
|
160
|
+
pluginId,
|
|
161
|
+
version: versionToOpen
|
|
162
|
+
});
|
|
163
|
+
window.electron.ipcRenderer.sendSync("vault-open", vaultDir, false);
|
|
164
|
+
} catch (_) {
|
|
165
|
+
var _error = _, _hasError = true;
|
|
166
|
+
} finally {
|
|
167
|
+
__callDispose(_stack, _error, _hasError);
|
|
95
168
|
}
|
|
96
|
-
window.electron.ipcRenderer.sendSync("vault-open", cacheDir, false);
|
|
97
169
|
}
|
|
98
|
-
|
|
170
|
+
function cleanupOrphanedExtractedVaults() {
|
|
171
|
+
const extractedVaultsRoot = join(tmpdir(), DEMO_VAULTS_CACHE_FOLDER, EXTRACTED_VAULTS_SUBFOLDER);
|
|
172
|
+
if (!existsSync(extractedVaultsRoot)) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const now = Date.now();
|
|
176
|
+
for (const entryName of readdirSync(extractedVaultsRoot)) {
|
|
177
|
+
const entryPath = join(extractedVaultsRoot, entryName);
|
|
178
|
+
try {
|
|
179
|
+
const stats = statSync(entryPath);
|
|
180
|
+
if (now - stats.mtimeMs < ORPHANED_EXTRACTED_VAULT_MAX_AGE_IN_MILLISECONDS) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
rmSync(entryPath, { force: true, recursive: true });
|
|
184
|
+
} catch {
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function extractDemoVaultArchive(archive, targetDir) {
|
|
189
|
+
const originalFs = window.require('node:original-fs');
|
|
190
|
+
const zip = new AdmZip(archive, { fs: originalFs });
|
|
191
|
+
zip.extractAllTo(targetDir, true);
|
|
192
|
+
}
|
|
193
|
+
function extractDemoVaultToFreshFolder(params) {
|
|
194
|
+
const { archive, pluginId, version } = params;
|
|
195
|
+
const extractedVaultsRoot = join(tmpdir(), DEMO_VAULTS_CACHE_FOLDER, EXTRACTED_VAULTS_SUBFOLDER);
|
|
196
|
+
mkdirSync(extractedVaultsRoot, { recursive: true });
|
|
197
|
+
const uniqueParentDir = mkdtempSync(join(extractedVaultsRoot, `${pluginId}-${version}-`));
|
|
198
|
+
const vaultDir = join(uniqueParentDir, `${pluginId}-${version}.demo-vault`);
|
|
199
|
+
extractDemoVaultArchive(archive, vaultDir);
|
|
200
|
+
return vaultDir;
|
|
201
|
+
}
|
|
202
|
+
async function resolveDemoVaultArchive(params) {
|
|
99
203
|
const {
|
|
100
|
-
cacheDir,
|
|
101
204
|
pluginId,
|
|
102
205
|
pluginName,
|
|
103
206
|
pluginNoticeComponent,
|
|
207
|
+
progressNotice,
|
|
104
208
|
repo,
|
|
105
209
|
version
|
|
106
210
|
} = params;
|
|
211
|
+
const archivesDir = join(tmpdir(), DEMO_VAULTS_CACHE_FOLDER, ARCHIVES_SUBFOLDER);
|
|
212
|
+
const archivePath = join(archivesDir, `${pluginId}-${version}.zip`);
|
|
213
|
+
if (existsSync(archivePath)) {
|
|
214
|
+
return readFileSync(archivePath);
|
|
215
|
+
}
|
|
216
|
+
progressNotice.setContent(`Downloading demo vault for ${pluginName} v${version}\u2026`);
|
|
107
217
|
const assetUrl = `https://github.com/${repo}/releases/download/${version}/${pluginId}.demo-vault.zip`;
|
|
108
218
|
const response = await requestUrl({
|
|
109
219
|
throw: false,
|
|
@@ -111,17 +221,14 @@ async function downloadAndExtractDemoVault(params) {
|
|
|
111
221
|
});
|
|
112
222
|
if (response.status !== HTTP_STATUS_OK) {
|
|
113
223
|
pluginNoticeComponent.showNotice(`No demo vault is available for plugin ${pluginName} v${version}.`);
|
|
114
|
-
return
|
|
224
|
+
return null;
|
|
115
225
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const originalFs = window.require('node:original-fs');
|
|
121
|
-
const zip = new AdmZip(archive, { fs: originalFs });
|
|
122
|
-
zip.extractAllTo(targetDir, true);
|
|
226
|
+
const archive = Buffer2.from(response.arrayBuffer);
|
|
227
|
+
mkdirSync(archivesDir, { recursive: true });
|
|
228
|
+
writeFileSync(archivePath, archive);
|
|
229
|
+
return archive;
|
|
123
230
|
}
|
|
124
231
|
export {
|
|
125
232
|
openDemoVault
|
|
126
233
|
};
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Rlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIGEgcGx1Z2luJ3Mgc2hpcHBlZCBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdyAoZGVza3RvcCBvbmx5KS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gYXR0YWNoIGEgYDxwbHVnaW4taWQ+LmRlbW8tdmF1bHQuemlwYCBhcmNoaXZlIHRvIGVhY2ggR2l0SHViIHJlbGVhc2UgKHNlZVxuICogYGFyY2hpdmVQbHVnaW5EZW1vVmF1bHRgIGluIGBzY3JpcHQtdXRpbHMvZGVtby12YXVsdC50c2ApLiBUaGlzIHJlc29sdmVzIHRoZSBwbHVnaW4ncyByZXBvc2l0b3J5XG4gKiBmcm9tIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHJlZ2lzdHJ5LCBkb3dubG9hZHMgdGhlIGFyY2hpdmUgZm9yIHRoZSBjaG9zZW4gdmVyc2lvbiwgZXh0cmFjdHMgaXQgdG8gYVxuICogcGVyLXZlcnNpb24gY2FjaGUgZm9sZGVyIHVuZGVyIHRoZSBPUyB0ZW1wIGRpcmVjdG9yeSwgYW5kIG9wZW5zIHRoYXQgZm9sZGVyIGFzIGEgdmF1bHQgaW4gYSBuZXdcbiAqIHdpbmRvdy4gV2hlbiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIGJlaGluZCB0aGUgbGF0ZXN0IHJlbGVhc2UsIHRoZSB1c2VyIGlzIG9mZmVyZWQgYSBjaG9pY2VcbiAqIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IEFkbVppcCBmcm9tICdhZG0temlwJztcbmltcG9ydCB7IGNvbXBhcmVWZXJzaW9ucyB9IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBmZWF0dXJlIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgOyB0aGUgY29tbWFuZCBpcyBoaWRkZW4gb24gbW9iaWxlIHNvIHRoaXMgTm9kZSBBUEkgaXMgbmV2ZXIgcmVhY2hlZCB0aGVyZS5cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1ub2RlanMtbW9kdWxlcyAtLSBEZXNrdG9wLW9ubHkgZmVhdHVyZSBnYXRlZCBieSBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYDsgdGhlIGNvbW1hbmQgaXMgaGlkZGVuIG9uIG1vYmlsZSBzbyB0aGlzIE5vZGUgQVBJIGlzIG5ldmVyIHJlYWNoZWQgdGhlcmUuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXMgLS0gRGVza3RvcC1vbmx5IGZlYXR1cmUgZ2F0ZWQgYnkgYFBsYXRmb3JtLmlzRGVza3RvcEFwcGA7IHRoZSBjb21tYW5kIGlzIGhpZGRlbiBvbiBtb2JpbGUgc28gdGhpcyBOb2RlIEFQSSBpcyBuZXZlciByZWFjaGVkIHRoZXJlLlxuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyByZXF1ZXN0VXJsIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIGdldENvbW11bml0eVBsdWdpblJlcG8sXG4gIGdldExhdGVzdFJlbGVhc2VWZXJzaW9uXG59IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgc2VsZWN0T3B0aW9uIH0gZnJvbSAnLi9tb2RhbHMvc2VsZWN0LW9wdGlvbi50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIG9wZW5EZW1vVmF1bHR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5EZW1vVmF1bHRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlkLCB1c2VkIHRvIGxvY2F0ZSB0aGUgR2l0SHViIHJlcG9zaXRvcnkgYW5kIHRoZSBwZXItdmVyc2lvbiBjYWNoZSBmb2xkZXIsIGFuZCB0byBuYW1lXG4gICAqIHRoZSBhcmNoaXZlIGFzc2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBkaXNwbGF5IG5hbWUsIHVzZWQgdG8gbGFiZWwgdGhlIG5vdGljZXMgYW5kIHRoZSB2ZXJzaW9uLWNob2ljZSBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IHVzZWQgdG8gcmVwb3J0IHByb2JsZW1zIChwbHVnaW4gbm90IGluIHRoZSByZWdpc3RyeSwgbWlzc2luZyBhcmNoaXZlKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiwgb2ZmZXJlZCBhcyBvbmUgb2YgdGhlIHZlcnNpb24gY2hvaWNlcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblZlcnNpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIERvd25sb2FkQW5kRXh0cmFjdERlbW9WYXVsdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGNhY2hlRGlyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jb25zdCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIgPSAnb2JzaWRpYW4tZGVtby12YXVsdHMnO1xuY29uc3QgSFRUUF9TVEFUVVNfT0sgPSAyMDA7XG5cbi8qKlxuICogRG93bmxvYWRzIGFuZCBvcGVucyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCBpbiBhIG5ldyBPYnNpZGlhbiB3aW5kb3cuIERlc2t0b3Agb25seS5cbiAqXG4gKiBJZiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIHRoZSBsYXRlc3QgKG9yIG5ld2VyKSwgaXRzIGRlbW8gdmF1bHQgb3BlbnMgZGlyZWN0bHk7IG90aGVyd2lzZVxuICogdGhlIHVzZXIgY2hvb3NlcyBiZXR3ZWVuIHRoZSBsYXRlc3QgYW5kIHRoZSBjdXJyZW50bHktaW5zdGFsbGVkIHZlcnNpb24uIFRoZSBjaG9zZW4gdmVyc2lvbidzXG4gKiBhcmNoaXZlIGlzIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZCBvbmNlLCB0aGVuIHJldXNlZCBmcm9tIGEgcGVyLXZlcnNpb24gY2FjaGUgZm9sZGVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIE9wZW5EZW1vVmF1bHRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB2YXVsdCBoYXMgYmVlbiBvcGVuZWQsIG9yIG9uY2UgdGhlIG9wZXJhdGlvbiBoYXNcbiAqIGJlZW4gcmVwb3J0ZWQgYXMgbm90IHBvc3NpYmxlIChub3RpY2Ugc2hvd24pIG9yIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5EZW1vVmF1bHQocGFyYW1zOiBPcGVuRGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcGx1Z2luVmVyc2lvblxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHJlcG8gPSBhd2FpdCBnZXRDb21tdW5pdHlQbHVnaW5SZXBvKHBsdWdpbklkKTtcbiAgaWYgKCFyZXBvKSB7XG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UoYENvdWxkIG5vdCBmaW5kIHBsdWdpbiAke3BsdWdpbk5hbWV9IGluIHRoZSBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBsdWdpblZlcnNpb247XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RSZWxlYXNlVmVyc2lvbihyZXBvKTtcblxuICBsZXQgdmVyc2lvblRvT3Blbjogc3RyaW5nO1xuICBpZiAoY29tcGFyZVZlcnNpb25zKGN1cnJlbnRWZXJzaW9uLCBsYXRlc3RWZXJzaW9uKSA+PSAwKSB7XG4gICAgdmVyc2lvblRvT3BlbiA9IGN1cnJlbnRWZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNob3NlblZlcnNpb24gPSBhd2FpdCBzZWxlY3RPcHRpb248bnVsbCB8IHN0cmluZz4oe1xuICAgICAgYXBwLFxuICAgICAgbWVzc2FnZTogYEN1cnJlbnQgdmVyc2lvbiBvZiBwbHVnaW4gJHtwbHVnaW5OYW1lfSB2JHtjdXJyZW50VmVyc2lvbn0gaXMgbm90IHRoZSBsYXRlc3QgKHYke2xhdGVzdFZlcnNpb259KWAsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpc0N0YTogdHJ1ZSxcbiAgICAgICAgICB0ZXh0OiBgT3BlbiBkZW1vIHZhdWx0IGZvciBsYXRlc3QgdmVyc2lvbiAodiR7bGF0ZXN0VmVyc2lvbn0pYCxcbiAgICAgICAgICB2YWx1ZTogbGF0ZXN0VmVyc2lvblxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogYE9wZW4gZGVtbyB2YXVsdCBmb3IgY3VycmVudCB2ZXJzaW9uICh2JHtjdXJyZW50VmVyc2lvbn0pYCxcbiAgICAgICAgICB2YWx1ZTogY3VycmVudFZlcnNpb25cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICB0aXRsZTogcGx1Z2luTmFtZVxuICAgIH0pO1xuICAgIGlmIChjaG9zZW5WZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZlcnNpb25Ub09wZW4gPSBjaG9zZW5WZXJzaW9uO1xuICB9XG5cbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKHRtcGRpcigpLCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIsIHBsdWdpbklkLCB2ZXJzaW9uVG9PcGVuKTtcbiAgaWYgKCFleGlzdHNTeW5jKGNhY2hlRGlyKSkge1xuICAgIGNvbnN0IGlzRXh0cmFjdGVkID0gYXdhaXQgZG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0KHtcbiAgICAgIGNhY2hlRGlyLFxuICAgICAgcGx1Z2luSWQsXG4gICAgICBwbHVnaW5OYW1lLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVwbyxcbiAgICAgIHZlcnNpb246IHZlcnNpb25Ub09wZW5cbiAgICB9KTtcbiAgICBpZiAoIWlzRXh0cmFjdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2YXVsdC1vcGVuJywgY2FjaGVEaXIsIGZhbHNlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0KHBhcmFtczogRG93bmxvYWRBbmRFeHRyYWN0RGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHtcbiAgICBjYWNoZURpcixcbiAgICBwbHVnaW5JZCxcbiAgICBwbHVnaW5OYW1lLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICByZXBvLFxuICAgIHZlcnNpb25cbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBhc3NldFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259LyR7cGx1Z2luSWR9LmRlbW8tdmF1bHQuemlwYDtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0VXJsKHtcbiAgICB0aHJvdzogZmFsc2UsXG4gICAgdXJsOiBhc3NldFVybFxuICB9KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gSFRUUF9TVEFUVVNfT0spIHtcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShgTm8gZGVtbyB2YXVsdCBpcyBhdmFpbGFibGUgZm9yIHBsdWdpbiAke3BsdWdpbk5hbWV9IHYke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKEJ1ZmZlci5mcm9tKHJlc3BvbnNlLmFycmF5QnVmZmVyKSwgY2FjaGVEaXIpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIGRvd25sb2FkZWQgZGVtby12YXVsdCBhcmNoaXZlIHRvIGRpc2suXG4gKlxuICogRWxlY3Ryb24ncyBhc2FyIGxheWVyIGludGVyY2VwdHMgYGZzYCBvcGVyYXRpb25zIG9uIGFueSBwYXRoIGNvbnRhaW5pbmcgYC5hc2FyYCBhbmQgdGhyb3dzIGBFTk9FTlRgXG4gKiB3aGVuIGBjaG1vZGAtaW5nIGFuIGAuYXNhcmAgZmlsZSAoaXQgdHJlYXRzIGl0IGFzIGFuIGFyY2hpdmUgcm9vdCByYXRoZXIgdGhhbiBhIHBsYWluIGZpbGUpLiBBIGRlbW9cbiAqIHZhdWx0IG1heSBzaGlwIHN1Y2ggYSBmaWxlIChlLmcuIGBfYXNzZXRzL0NvZGVTY3JpcHRUb29sa2l0L21vZHVsZS5hc2FyYCBkZW1vbnN0cmF0aW5nIHRoZSBBU0FSXG4gKiByZXF1aXJlIGZlYXR1cmUpLCBhbmQgYWRtLXppcCBgY2htb2RgcyBldmVyeSBleHRyYWN0ZWQgZmlsZSwgc28gZXh0cmFjdGlvbiB3b3VsZCBvdGhlcndpc2UgY3Jhc2guXG4gKiBIYW5kIGFkbS16aXAgRWxlY3Ryb24ncyBgb3JpZ2luYWwtZnNgIFx1MjAxNCB0aGUgcmVhbCBgZnNgIHdpdGggYXNhciBpbnRlcmNlcHRpb24gZGlzYWJsZWQgXHUyMDE0IHNvIHRoZVxuICogYC5hc2FyYCBmaWxlIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBmaWxlIGFuZCBgY2htb2RgIHN1Y2NlZWRzLiBJdCBpcyBhIGRlc2t0b3Atb25seSBFbGVjdHJvbiBtb2R1bGVcbiAqIHdpdGggbm8gYnVuZGxlZCB0eXBlcywgc28gaXQgaXMgbG9hZGVkIHZpYSBgd2luZG93LnJlcXVpcmVgIGFuZCB0eXBlZCBhcyBgbm9kZTpmc2AncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gYXJjaGl2ZSAtIFRoZSByYXcgemlwIGFyY2hpdmUgYnl0ZXMuXG4gKiBAcGFyYW0gdGFyZ2V0RGlyIC0gVGhlIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG8uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKGFyY2hpdmU6IEJ1ZmZlciwgdGFyZ2V0RGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxGcyA9IHdpbmRvdy5yZXF1aXJlKCdub2RlOm9yaWdpbmFsLWZzJykgYXMgdHlwZW9mIGltcG9ydCgnbm9kZTpmcycpO1xuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKGFyY2hpdmUsIHsgZnM6IG9yaWdpbmFsRnMgfSk7XG4gIHppcC5leHRyYWN0QWxsVG8odGFyZ2V0RGlyLCB0cnVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUEsT0FBTyxZQUFZO0FBQ25CLFNBQVMsdUJBQXVCO0FBRWhDLFNBQVMsY0FBYztBQUV2QixTQUFTLGtCQUFrQjtBQUUzQixTQUFTLGNBQWM7QUFDdkIsU0FBUyxrQkFBa0I7QUFJM0IsU0FBUyxZQUFZO0FBQ3JCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxvQkFBb0I7QUEwQzdCLE1BQU0sMkJBQTJCO0FBQ2pDLE1BQU0saUJBQWlCO0FBYXZCLGVBQXNCLGNBQWMsUUFBNEM7QUFDOUUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosUUFBTSxPQUFPLE1BQU0sdUJBQXVCLFFBQVE7QUFDbEQsTUFBSSxDQUFDLE1BQU07QUFDVCwwQkFBc0IsV0FBVyx5QkFBeUIsVUFBVSxxQ0FBcUM7QUFDekc7QUFBQSxFQUNGO0FBRUEsUUFBTSxpQkFBaUI7QUFDdkIsUUFBTSxnQkFBZ0IsTUFBTSx3QkFBd0IsSUFBSTtBQUV4RCxNQUFJO0FBQ0osTUFBSSxnQkFBZ0IsZ0JBQWdCLGFBQWEsS0FBSyxHQUFHO0FBQ3ZELG9CQUFnQjtBQUFBLEVBQ2xCLE9BQU87QUFDTCxVQUFNLGdCQUFnQixNQUFNLGFBQTRCO0FBQUEsTUFDdEQ7QUFBQSxNQUNBLFNBQVMsNkJBQTZCLFVBQVUsS0FBSyxjQUFjLHdCQUF3QixhQUFhO0FBQUEsTUFDeEcsU0FBUztBQUFBLFFBQ1A7QUFBQSxVQUNFLE9BQU87QUFBQSxVQUNQLE1BQU0sd0NBQXdDLGFBQWE7QUFBQSxVQUMzRCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU0seUNBQXlDLGNBQWM7QUFBQSxVQUM3RCxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLE9BQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTztBQUFBLElBQ1QsQ0FBQztBQUNELFFBQUksa0JBQWtCLE1BQU07QUFDMUI7QUFBQSxJQUNGO0FBQ0Esb0JBQWdCO0FBQUEsRUFDbEI7QUFFQSxRQUFNLFdBQVcsS0FBSyxPQUFPLEdBQUcsMEJBQTBCLFVBQVUsYUFBYTtBQUNqRixNQUFJLENBQUMsV0FBVyxRQUFRLEdBQUc7QUFDekIsVUFBTSxjQUFjLE1BQU0sNEJBQTRCO0FBQUEsTUFDcEQ7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxTQUFTO0FBQUEsSUFDWCxDQUFDO0FBQ0QsUUFBSSxDQUFDLGFBQWE7QUFDaEI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sU0FBUyxZQUFZLFNBQVMsY0FBYyxVQUFVLEtBQUs7QUFDcEU7QUFFQSxlQUFlLDRCQUE0QixRQUE2RDtBQUN0RyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosUUFBTSxXQUFXLHNCQUFzQixJQUFJLHNCQUFzQixPQUFPLElBQUksUUFBUTtBQUNwRixRQUFNLFdBQVcsTUFBTSxXQUFXO0FBQUEsSUFDaEMsT0FBTztBQUFBLElBQ1AsS0FBSztBQUFBLEVBQ1AsQ0FBQztBQUNELE1BQUksU0FBUyxXQUFXLGdCQUFnQjtBQUN0QywwQkFBc0IsV0FBVyx5Q0FBeUMsVUFBVSxLQUFLLE9BQU8sR0FBRztBQUNuRyxXQUFPO0FBQUEsRUFDVDtBQUVBLDBCQUF3QixPQUFPLEtBQUssU0FBUyxXQUFXLEdBQUcsUUFBUTtBQUNuRSxTQUFPO0FBQ1Q7QUFnQkEsU0FBUyx3QkFBd0IsU0FBaUIsV0FBeUI7QUFDekUsUUFBTSxhQUFhLE9BQU8sUUFBUSxrQkFBa0I7QUFDcEQsUUFBTSxNQUFNLElBQUksT0FBTyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUM7QUFDbEQsTUFBSSxhQUFhLFdBQVcsSUFBSTtBQUNsQzsiLAogICJuYW1lcyI6IFtdCn0K
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Rlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIGEgcGx1Z2luJ3Mgc2hpcHBlZCBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdyAoZGVza3RvcCBvbmx5KS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gYXR0YWNoIGEgYDxwbHVnaW4taWQ+LmRlbW8tdmF1bHQuemlwYCBhcmNoaXZlIHRvIGVhY2ggR2l0SHViIHJlbGVhc2UgKHNlZVxuICogYGFyY2hpdmVQbHVnaW5EZW1vVmF1bHRgIGluIGBzY3JpcHQtdXRpbHMvZGVtby12YXVsdC50c2ApLiBUaGlzIHJlc29sdmVzIHRoZSBwbHVnaW4ncyByZXBvc2l0b3J5XG4gKiBmcm9tIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHJlZ2lzdHJ5LCBkb3dubG9hZHMgdGhlIGFyY2hpdmUgZm9yIHRoZSBjaG9zZW4gdmVyc2lvbiwgYW5kIG9wZW5zIGl0IGFzIGFcbiAqIHZhdWx0IGluIGEgbmV3IHdpbmRvdy4gV2hlbiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIGJlaGluZCB0aGUgbGF0ZXN0IHJlbGVhc2UsIHRoZSB1c2VyIGlzXG4gKiBvZmZlcmVkIGEgY2hvaWNlIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucy5cbiAqXG4gKiBBIHByb2dyZXNzIG5vdGljZSBpcyBzaG93biBpbW1lZGlhdGVseSAoZG93bmxvYWQgKyBleHRyYWN0aW9uIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHRoZSB1c2VyIG11c3Qgc2VlXG4gKiBzb21ldGhpbmcgaXMgaGFwcGVuaW5nIHJpZ2h0IGF3YXkpLiBPbmx5IHRoZSBkb3dubG9hZGVkIEFSQ0hJVkUgaXMgY2FjaGVkICh1bmRlciB0aGUgT1MgdGVtcFxuICogZGlyZWN0b3J5KTsgZXZlcnkgaW52b2NhdGlvbiBleHRyYWN0cyBhIEZSRVNIIGNvcHkgaW50byBpdHMgb3duIHRlbXBvcmFyeSBmb2xkZXIgYW5kIG9wZW5zIHRoYXQsIHNvIGFcbiAqIHByZXZpb3VzIHNlc3Npb24ncyBlZGl0cyBuZXZlciBsZWFrIGludG8gYSBuZXcgb25lLiBUaGUgZXh0cmFjdGVkIHZhdWx0IGZvbGRlciBpcyBuYW1lZFxuICogYDxwbHVnaW4taWQ+LTx2ZXJzaW9uPi5kZW1vLXZhdWx0YCBzbyBpdCByZWFkcyBuaWNlbHkgaW4gT2JzaWRpYW4ncyB2YXVsdCBzd2l0Y2hlci4gT3JwaGFuZWRcbiAqIGV4dHJhY3RlZCBmb2xkZXJzIGxlZnQgb3ZlciBmcm9tIGVhcmxpZXIgc2Vzc2lvbnMgYXJlIGNsZWFuZWQgdXAgKGJlc3QtZWZmb3J0KSBvbiBlYWNoIG9wZW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCBBZG1aaXAgZnJvbSAnYWRtLXppcCc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBmZWF0dXJlIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgOyB0aGUgY29tbWFuZCBpcyBoaWRkZW4gb24gbW9iaWxlIHNvIHRoZXNlIE5vZGUgQVBJcyBhcmUgbmV2ZXIgcmVhY2hlZCB0aGVyZS4gKi9cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgbWtkdGVtcFN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgc3RhdFN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbi8qIGVzbGludC1lbmFibGUgaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXMgLS0gRGVza3RvcC1vbmx5IGZlYXR1cmUgZ2F0ZWQgYnkgYFBsYXRmb3JtLmlzRGVza3RvcEFwcGA7IHRoZSBjb21tYW5kIGlzIGhpZGRlbiBvbiBtb2JpbGUgc28gdGhlc2UgTm9kZSBBUElzIGFyZSBuZXZlciByZWFjaGVkIHRoZXJlLiAqL1xuaW1wb3J0IHsgcmVxdWVzdFVybCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2Vcbn0gZnJvbSAnLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Q29tbXVuaXR5UGx1Z2luUmVwbyxcbiAgZ2V0TGF0ZXN0UmVsZWFzZVZlcnNpb25cbn0gZnJvbSAnLi9jb21tdW5pdHktcGx1Z2lucy50cyc7XG5pbXBvcnQgeyBzZWxlY3RPcHRpb24gfSBmcm9tICcuL21vZGFscy9zZWxlY3Qtb3B0aW9uLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgb3BlbkRlbW9WYXVsdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkRlbW9WYXVsdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQsIHVzZWQgdG8gbG9jYXRlIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSwgdG8gbmFtZSB0aGUgYXJjaGl2ZSBhc3NldCwgYW5kIHRvIG5hbWUgdGhlXG4gICAqIGNhY2hlZCBhcmNoaXZlIGFuZCB0aGUgZXh0cmFjdGVkIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZGlzcGxheSBuYW1lLCB1c2VkIHRvIGxhYmVsIHRoZSBub3RpY2VzIGFuZCB0aGUgdmVyc2lvbi1jaG9pY2UgZGlhbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcyBhbmQgcHJvYmxlbXMgKHBsdWdpbiBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBtaXNzaW5nXG4gICAqIGFyY2hpdmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uLCBvZmZlcmVkIGFzIG9uZSBvZiB0aGUgdmVyc2lvbiBjaG9pY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXJQYXJhbXMge1xuICByZWFkb25seSBhcmNoaXZlOiBCdWZmZXI7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlc29sdmVEZW1vVmF1bHRBcmNoaXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcHJvZ3Jlc3NOb3RpY2U6IFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2U7XG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jb25zdCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIgPSAnb2JzaWRpYW4tZGVtby12YXVsdHMnO1xuY29uc3QgQVJDSElWRVNfU1VCRk9MREVSID0gJ2FyY2hpdmVzJztcbmNvbnN0IEVYVFJBQ1RFRF9WQVVMVFNfU1VCRk9MREVSID0gJ2V4dHJhY3RlZCc7XG5jb25zdCBIVFRQX1NUQVRVU19PSyA9IDIwMDtcbi8vIE9uZSBkYXkgaW4gbWlsbGlzZWNvbmRzICgyNCAqIDYwICogNjAgKiAxMDAwKS5cbmNvbnN0IE9SUEhBTkVEX0VYVFJBQ1RFRF9WQVVMVF9NQVhfQUdFX0lOX01JTExJU0VDT05EUyA9IDg2XzQwMF8wMDA7XG5cbi8qKlxuICogRG93bmxvYWRzIGFuZCBvcGVucyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCBpbiBhIG5ldyBPYnNpZGlhbiB3aW5kb3cuIERlc2t0b3Agb25seS5cbiAqXG4gKiBJZiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIHRoZSBsYXRlc3QgKG9yIG5ld2VyKSwgaXRzIGRlbW8gdmF1bHQgb3BlbnMgZGlyZWN0bHk7IG90aGVyd2lzZVxuICogdGhlIHVzZXIgY2hvb3NlcyBiZXR3ZWVuIHRoZSBsYXRlc3QgYW5kIHRoZSBjdXJyZW50bHktaW5zdGFsbGVkIHZlcnNpb24uIEEgcHJvZ3Jlc3Mgbm90aWNlIGlzIHNob3duXG4gKiBpbW1lZGlhdGVseS4gVGhlIGNob3NlbiB2ZXJzaW9uJ3MgYXJjaGl2ZSBpcyBkb3dubG9hZGVkIG9uY2UgKHRoZW4gcmV1c2VkIGZyb20gdGhlIGFyY2hpdmUgY2FjaGUpLFxuICogYnV0IGEgZnJlc2ggY29weSBpcyBleHRyYWN0ZWQgaW50byBpdHMgb3duIHRlbXBvcmFyeSBmb2xkZXIgb24gZXZlcnkgb3BlbiBcdTIwMTQgdGhlIHZhdWx0IGlzIG5ldmVyIHJldXNlZFxuICogYWNyb3NzIHNlc3Npb25zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIE9wZW5EZW1vVmF1bHRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB2YXVsdCBoYXMgYmVlbiBvcGVuZWQsIG9yIG9uY2UgdGhlIG9wZXJhdGlvbiBoYXNcbiAqIGJlZW4gcmVwb3J0ZWQgYXMgbm90IHBvc3NpYmxlIChub3RpY2Ugc2hvd24pIG9yIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5EZW1vVmF1bHQocGFyYW1zOiBPcGVuRGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcGx1Z2luVmVyc2lvblxuICB9ID0gcGFyYW1zO1xuXG4gIC8vIFNob3duIGltbWVkaWF0ZWx5IChgZGVsYXlJbk1pbGxpc2Vjb25kczogMGApOiByZXNvbHZpbmcgdGhlIHJlbGVhc2UsIGRvd25sb2FkaW5nIGFuZCBleHRyYWN0aW5nIGNhblxuICAvLyBFYWNoIHRha2UgYSB3aGlsZSwgc28gdGhlIHVzZXIgbXVzdCBzZWUgcHJvZ3Jlc3MgdGhlIG1vbWVudCB0aGUgY29tbWFuZCBpcyBpbnZva2VkLlxuICB1c2luZyBwcm9ncmVzc05vdGljZSA9IHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheSh7XG4gICAgY29udGVudDogYE9wZW5pbmcgZGVtbyB2YXVsdCBmb3IgJHtwbHVnaW5OYW1lfVx1MjAyNmAsXG4gICAgZGVsYXlJbk1pbGxpc2Vjb25kczogMFxuICB9KTtcblxuICBjb25zdCByZXBvID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luUmVwbyhwbHVnaW5JZCk7XG4gIGlmICghcmVwbykge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGBDb3VsZCBub3QgZmluZCBwbHVnaW4gJHtwbHVnaW5OYW1lfSBpbiB0aGUgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwbHVnaW5WZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0UmVsZWFzZVZlcnNpb24ocmVwbyk7XG5cbiAgbGV0IHZlcnNpb25Ub09wZW46IHN0cmluZztcbiAgaWYgKGNvbXBhcmVWZXJzaW9ucyhjdXJyZW50VmVyc2lvbiwgbGF0ZXN0VmVyc2lvbikgPj0gMCkge1xuICAgIHZlcnNpb25Ub09wZW4gPSBjdXJyZW50VmVyc2lvbjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjaG9zZW5WZXJzaW9uID0gYXdhaXQgc2VsZWN0T3B0aW9uPG51bGwgfCBzdHJpbmc+KHtcbiAgICAgIGFwcCxcbiAgICAgIG1lc3NhZ2U6IGBDdXJyZW50IHZlcnNpb24gb2YgcGx1Z2luICR7cGx1Z2luTmFtZX0gdiR7Y3VycmVudFZlcnNpb259IGlzIG5vdCB0aGUgbGF0ZXN0ICh2JHtsYXRlc3RWZXJzaW9ufSlgLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaXNDdGE6IHRydWUsXG4gICAgICAgICAgdGV4dDogYE9wZW4gZGVtbyB2YXVsdCBmb3IgbGF0ZXN0IHZlcnNpb24gKHYke2xhdGVzdFZlcnNpb259KWAsXG4gICAgICAgICAgdmFsdWU6IGxhdGVzdFZlcnNpb25cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IGBPcGVuIGRlbW8gdmF1bHQgZm9yIGN1cnJlbnQgdmVyc2lvbiAodiR7Y3VycmVudFZlcnNpb259KWAsXG4gICAgICAgICAgdmFsdWU6IGN1cnJlbnRWZXJzaW9uXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcbiAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgdGl0bGU6IHBsdWdpbk5hbWVcbiAgICB9KTtcbiAgICBpZiAoY2hvc2VuVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2ZXJzaW9uVG9PcGVuID0gY2hvc2VuVmVyc2lvbjtcbiAgfVxuXG4gIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCByZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZSh7XG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcHJvZ3Jlc3NOb3RpY2UsXG4gICAgcmVwbyxcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uVG9PcGVuXG4gIH0pO1xuICBpZiAoIWFyY2hpdmUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm9ncmVzc05vdGljZS5zZXRDb250ZW50KGBFeHRyYWN0aW5nIGRlbW8gdmF1bHQgZm9yICR7cGx1Z2luTmFtZX0gdiR7dmVyc2lvblRvT3Blbn1cdTIwMjZgKTtcbiAgY2xlYW51cE9ycGhhbmVkRXh0cmFjdGVkVmF1bHRzKCk7XG4gIGNvbnN0IHZhdWx0RGlyID0gZXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXIoe1xuICAgIGFyY2hpdmUsXG4gICAgcGx1Z2luSWQsXG4gICAgdmVyc2lvbjogdmVyc2lvblRvT3BlblxuICB9KTtcblxuICB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ3ZhdWx0LW9wZW4nLCB2YXVsdERpciwgZmFsc2UpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXh0cmFjdGVkIGRlbW8tdmF1bHQgZm9sZGVycyBsZWZ0IG92ZXIgZnJvbSBlYXJsaWVyIHNlc3Npb25zIChiZXN0LWVmZm9ydCkuXG4gKlxuICogRXZlcnkgb3BlbiBleHRyYWN0cyBhIGZyZXNoIGNvcHkgaW50byBpdHMgb3duIGZvbGRlciBhbmQgbmV2ZXIgZGVsZXRlcyBpdCBhZnRlcndhcmRzICh0aGUgdmF1bHQgc3RheXNcbiAqIG9wZW4gaW4gaXRzIHdpbmRvdyksIHNvIHRoZXNlIGFjY3VtdWxhdGUuIFRoaXMgZHJvcHMgZm9sZGVycyBvbGRlciB0aGFuXG4gKiB7QGxpbmsgT1JQSEFORURfRVhUUkFDVEVEX1ZBVUxUX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTfS4gQSBmb2xkZXIgd2hvc2UgdmF1bHQgaXMgc3RpbGwgb3BlbiBpbiBhbm90aGVyXG4gKiB3aW5kb3cgaXMgbG9ja2VkIG9uIFdpbmRvd3MgYW5kIGNhbm5vdCBiZSByZW1vdmVkIFx1MjAxNCB0aGUgcmVtb3ZhbCBpcyB3cmFwcGVkIHNvIHN1Y2ggYSBmb2xkZXIgaXMgc2ltcGx5XG4gKiBza2lwcGVkIGFuZCByZXRyaWVkIG9uIGEgbGF0ZXIgb3Blbi5cbiAqL1xuZnVuY3Rpb24gY2xlYW51cE9ycGhhbmVkRXh0cmFjdGVkVmF1bHRzKCk6IHZvaWQge1xuICBjb25zdCBleHRyYWN0ZWRWYXVsdHNSb290ID0gam9pbih0bXBkaXIoKSwgREVNT19WQVVMVFNfQ0FDSEVfRk9MREVSLCBFWFRSQUNURURfVkFVTFRTX1NVQkZPTERFUik7XG4gIGlmICghZXhpc3RzU3luYyhleHRyYWN0ZWRWYXVsdHNSb290KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGZvciAoY29uc3QgZW50cnlOYW1lIG9mIHJlYWRkaXJTeW5jKGV4dHJhY3RlZFZhdWx0c1Jvb3QpKSB7XG4gICAgY29uc3QgZW50cnlQYXRoID0gam9pbihleHRyYWN0ZWRWYXVsdHNSb290LCBlbnRyeU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IHN0YXRTeW5jKGVudHJ5UGF0aCk7XG4gICAgICBpZiAobm93IC0gc3RhdHMubXRpbWVNcyA8IE9SUEhBTkVEX0VYVFJBQ1RFRF9WQVVMVF9NQVhfQUdFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJtU3luYyhlbnRyeVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEJlc3QtZWZmb3J0IGNsZWFudXA6IGFuIG9ycGhhbiB3aG9zZSB2YXVsdCBpcyBzdGlsbCBvcGVuIChsb2NrZWQgb24gV2luZG93cykgY2Fubm90IGJlIHJlbW92ZWQ7IHNraXAgaXQgYW5kIHJldHJ5IG9uIGEgbGF0ZXIgb3Blbi5cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIGRvd25sb2FkZWQgZGVtby12YXVsdCBhcmNoaXZlIHRvIGRpc2suXG4gKlxuICogRWxlY3Ryb24ncyBhc2FyIGxheWVyIGludGVyY2VwdHMgYGZzYCBvcGVyYXRpb25zIG9uIGFueSBwYXRoIGNvbnRhaW5pbmcgYC5hc2FyYCBhbmQgdGhyb3dzIGBFTk9FTlRgXG4gKiB3aGVuIGBjaG1vZGAtaW5nIGFuIGAuYXNhcmAgZmlsZSAoaXQgdHJlYXRzIGl0IGFzIGFuIGFyY2hpdmUgcm9vdCByYXRoZXIgdGhhbiBhIHBsYWluIGZpbGUpLiBBIGRlbW9cbiAqIHZhdWx0IG1heSBzaGlwIHN1Y2ggYSBmaWxlIChlLmcuIGBfYXNzZXRzL0NvZGVTY3JpcHRUb29sa2l0L21vZHVsZS5hc2FyYCBkZW1vbnN0cmF0aW5nIHRoZSBBU0FSXG4gKiByZXF1aXJlIGZlYXR1cmUpLCBhbmQgYWRtLXppcCBgY2htb2RgcyBldmVyeSBleHRyYWN0ZWQgZmlsZSwgc28gZXh0cmFjdGlvbiB3b3VsZCBvdGhlcndpc2UgY3Jhc2guXG4gKiBIYW5kIGFkbS16aXAgRWxlY3Ryb24ncyBgb3JpZ2luYWwtZnNgIFx1MjAxNCB0aGUgcmVhbCBgZnNgIHdpdGggYXNhciBpbnRlcmNlcHRpb24gZGlzYWJsZWQgXHUyMDE0IHNvIHRoZVxuICogYC5hc2FyYCBmaWxlIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBmaWxlIGFuZCBgY2htb2RgIHN1Y2NlZWRzLiBJdCBpcyBhIGRlc2t0b3Atb25seSBFbGVjdHJvbiBtb2R1bGVcbiAqIHdpdGggbm8gYnVuZGxlZCB0eXBlcywgc28gaXQgaXMgbG9hZGVkIHZpYSBgd2luZG93LnJlcXVpcmVgIGFuZCB0eXBlZCBhcyBgbm9kZTpmc2AncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gYXJjaGl2ZSAtIFRoZSByYXcgemlwIGFyY2hpdmUgYnl0ZXMuXG4gKiBAcGFyYW0gdGFyZ2V0RGlyIC0gVGhlIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG8uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKGFyY2hpdmU6IEJ1ZmZlciwgdGFyZ2V0RGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxGcyA9IHdpbmRvdy5yZXF1aXJlKCdub2RlOm9yaWdpbmFsLWZzJykgYXMgdHlwZW9mIGltcG9ydCgnbm9kZTpmcycpO1xuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKGFyY2hpdmUsIHsgZnM6IG9yaWdpbmFsRnMgfSk7XG4gIHppcC5leHRyYWN0QWxsVG8odGFyZ2V0RGlyLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYXJjaGl2ZSBpbnRvIGEgZnJlc2gsIHVuaXF1ZWx5LW5hbWVkIHRlbXBvcmFyeSBmb2xkZXIgYW5kIHJldHVybnMgdGhlIHZhdWx0IHBhdGguXG4gKlxuICogQSB1bmlxdWUgcGFyZW50IGZvbGRlciAoYG1rZHRlbXBTeW5jYCkgZ3VhcmFudGVlcyBhIGJyYW5kLW5ldyBleHRyYWN0aW9uIGV2ZXJ5IHRpbWUgXHUyMDE0IHRoZSBkZW1vIHZhdWx0XG4gKiBpcyBuZXZlciByZXVzZWQgYWNyb3NzIG9wZW5zLCBzbyBhIHByZXZpb3VzIHNlc3Npb24ncyBlZGl0cyBuZXZlciBsZWFrIGluLiBJbnNpZGUgaXQsIHRoZSB2YXVsdCBmb2xkZXJcbiAqIGlzIG5hbWVkIGA8cGx1Z2luLWlkPi08dmVyc2lvbj4uZGVtby12YXVsdGAgc28gT2JzaWRpYW4ncyB2YXVsdCBzd2l0Y2hlciBzaG93cyBhIGZyaWVuZGx5IG5hbWUgKGl0c1xuICogYmFzZW5hbWUpIHJhdGhlciB0aGFuIHRoZSByYW5kb20gdGVtcCBpZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBFeHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlclBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZnJlc2hseSBleHRyYWN0ZWQgdmF1bHQgZm9sZGVyLlxuICovXG5mdW5jdGlvbiBleHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlcihwYXJhbXM6IEV4dHJhY3REZW1vVmF1bHRUb0ZyZXNoRm9sZGVyUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcmNoaXZlLCBwbHVnaW5JZCwgdmVyc2lvbiB9ID0gcGFyYW1zO1xuICBjb25zdCBleHRyYWN0ZWRWYXVsdHNSb290ID0gam9pbih0bXBkaXIoKSwgREVNT19WQVVMVFNfQ0FDSEVfRk9MREVSLCBFWFRSQUNURURfVkFVTFRTX1NVQkZPTERFUik7XG4gIG1rZGlyU3luYyhleHRyYWN0ZWRWYXVsdHNSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgdW5pcXVlUGFyZW50RGlyID0gbWtkdGVtcFN5bmMoam9pbihleHRyYWN0ZWRWYXVsdHNSb290LCBgJHtwbHVnaW5JZH0tJHt2ZXJzaW9ufS1gKSk7XG4gIGNvbnN0IHZhdWx0RGlyID0gam9pbih1bmlxdWVQYXJlbnREaXIsIGAke3BsdWdpbklkfS0ke3ZlcnNpb259LmRlbW8tdmF1bHRgKTtcbiAgZXh0cmFjdERlbW9WYXVsdEFyY2hpdmUoYXJjaGl2ZSwgdmF1bHREaXIpO1xuICByZXR1cm4gdmF1bHREaXI7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGRlbW8tdmF1bHQgYXJjaGl2ZSBieXRlcyBmb3IgYSB2ZXJzaW9uLCBkb3dubG9hZGluZyBhbmQgY2FjaGluZyB0aGVtIG9uIGZpcnN0IHVzZS5cbiAqXG4gKiBPbmx5IHRoZSBhcmNoaXZlIGlzIGNhY2hlZCAoa2V5ZWQgYnkgcGx1Z2luIGlkICsgdmVyc2lvbik7IHRoZSBleHRyYWN0ZWQgdmF1bHQgaXMgbm90LiBBIGNhY2hlIGhpdCBpc1xuICogcmV0dXJuZWQgd2l0aG91dCBhbnkgbmV0d29yayByZXF1ZXN0OyBhIG1pc3MgZG93bmxvYWRzIHRoZSByZWxlYXNlIGFzc2V0LCB3cml0ZXMgaXQgdG8gdGhlIGFyY2hpdmVcbiAqIGNhY2hlLCBhbmQgcmV0dXJucyB0aGUgZnJlc2hseSBkb3dubG9hZGVkIGJ5dGVzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVEZW1vVmF1bHRBcmNoaXZlUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgYXJjaGl2ZSBieXRlcywgb3IgYG51bGxgIHdoZW4gbm8gYXJjaGl2ZSBpcyBhdmFpbGFibGUgZm9yXG4gKiB0aGUgdmVyc2lvbiAoYSBub3RpY2UgaGFzIGJlZW4gc2hvd24pLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZShwYXJhbXM6IFJlc29sdmVEZW1vVmF1bHRBcmNoaXZlUGFyYW1zKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gIGNvbnN0IHtcbiAgICBwbHVnaW5JZCxcbiAgICBwbHVnaW5OYW1lLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICBwcm9ncmVzc05vdGljZSxcbiAgICByZXBvLFxuICAgIHZlcnNpb25cbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBhcmNoaXZlc0RpciA9IGpvaW4odG1wZGlyKCksIERFTU9fVkFVTFRTX0NBQ0hFX0ZPTERFUiwgQVJDSElWRVNfU1VCRk9MREVSKTtcbiAgY29uc3QgYXJjaGl2ZVBhdGggPSBqb2luKGFyY2hpdmVzRGlyLCBgJHtwbHVnaW5JZH0tJHt2ZXJzaW9ufS56aXBgKTtcbiAgaWYgKGV4aXN0c1N5bmMoYXJjaGl2ZVBhdGgpKSB7XG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYyhhcmNoaXZlUGF0aCk7XG4gIH1cblxuICBwcm9ncmVzc05vdGljZS5zZXRDb250ZW50KGBEb3dubG9hZGluZyBkZW1vIHZhdWx0IGZvciAke3BsdWdpbk5hbWV9IHYke3ZlcnNpb259XHUyMDI2YCk7XG4gIGNvbnN0IGFzc2V0VXJsID0gYGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG99L3JlbGVhc2VzL2Rvd25sb2FkLyR7dmVyc2lvbn0vJHtwbHVnaW5JZH0uZGVtby12YXVsdC56aXBgO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoe1xuICAgIHRocm93OiBmYWxzZSxcbiAgICB1cmw6IGFzc2V0VXJsXG4gIH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIVFRQX1NUQVRVU19PSykge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGBObyBkZW1vIHZhdWx0IGlzIGF2YWlsYWJsZSBmb3IgcGx1Z2luICR7cGx1Z2luTmFtZX0gdiR7dmVyc2lvbn0uYCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhcmNoaXZlID0gQnVmZmVyLmZyb20ocmVzcG9uc2UuYXJyYXlCdWZmZXIpO1xuICBta2RpclN5bmMoYXJjaGl2ZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGFyY2hpdmVQYXRoLCBhcmNoaXZlKTtcbiAgcmV0dXJuIGFyY2hpdmU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQSxPQUFPLFlBQVk7QUFDbkIsU0FBUyx1QkFBdUI7QUFFaEMsU0FBUyxVQUFBQSxlQUFjO0FBQ3ZCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBRXZCLFNBQVMsa0JBQWtCO0FBTzNCLFNBQVMsWUFBWTtBQUNyQjtBQUFBLEVBQ0U7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
|