obsidian-dev-utils 101.5.0 → 101.7.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 +12 -0
- package/dist/integration-test-plugin/main.js +2612 -1815
- package/dist/lib/cjs/__merged.cjs +29 -1
- package/dist/lib/cjs/__merged.d.cts +5 -1
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/component-ex.cjs +14 -1
- package/dist/lib/cjs/obsidian/components/component-ex.d.cts +11 -0
- package/dist/lib/cjs/obsidian/components/index.cjs +7 -1
- package/dist/lib/cjs/obsidian/components/index.d.cts +2 -0
- package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/plugin-gate-component.cjs +520 -0
- package/dist/lib/cjs/obsidian/components/plugin-gate-component.d.cts +299 -0
- package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.cjs +17 -38
- package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.d.cts +25 -18
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +7 -2
- package/dist/lib/cjs/obsidian/components/settings-migration-component.cjs +232 -0
- package/dist/lib/cjs/obsidian/components/settings-migration-component.d.cts +120 -0
- package/dist/lib/cjs/obsidian/css-class.cjs +3 -1
- package/dist/lib/cjs/obsidian/css-class.d.cts +9 -0
- package/dist/lib/cjs/obsidian/html-element.cjs +27 -3
- package/dist/lib/cjs/obsidian/html-element.d.cts +36 -0
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +15 -1
- package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +14 -0
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +14 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +1 -1
- package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +5 -3
- package/dist/lib/cjs/obsidian/plugin/index.cjs +12 -3
- package/dist/lib/cjs/obsidian/plugin/index.d.cts +3 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-api.cjs +2 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-api.d.cts +34 -15
- package/dist/lib/cjs/obsidian/plugin/plugin-install-state.cjs +208 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-install-state.d.cts +113 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.cjs +161 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.d.cts +119 -0
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +241 -21
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +133 -4
- package/dist/lib/cjs/obsidian/plugin/settings-migration-api.cjs +141 -0
- package/dist/lib/cjs/obsidian/plugin/settings-migration-api.d.cts +91 -0
- package/dist/lib/esm/__merged.d.mts +5 -1
- package/dist/lib/esm/__merged.mjs +32 -2
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/component-ex.d.mts +11 -0
- package/dist/lib/esm/obsidian/components/component-ex.mjs +14 -1
- package/dist/lib/esm/obsidian/components/index.d.mts +2 -0
- package/dist/lib/esm/obsidian/components/index.mjs +5 -1
- package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/plugin-gate-component.d.mts +299 -0
- package/dist/lib/esm/obsidian/components/plugin-gate-component.mjs +428 -0
- package/dist/lib/esm/obsidian/components/plugin-suggestion-component.d.mts +25 -18
- package/dist/lib/esm/obsidian/components/plugin-suggestion-component.mjs +21 -41
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +7 -2
- package/dist/lib/esm/obsidian/components/settings-migration-component.d.mts +120 -0
- package/dist/lib/esm/obsidian/components/settings-migration-component.mjs +127 -0
- package/dist/lib/esm/obsidian/css-class.d.mts +9 -0
- package/dist/lib/esm/obsidian/css-class.mjs +3 -1
- package/dist/lib/esm/obsidian/html-element.d.mts +36 -0
- package/dist/lib/esm/obsidian/html-element.mjs +24 -2
- package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +14 -0
- package/dist/lib/esm/obsidian/i18n/locales/en.mjs +15 -1
- package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +14 -0
- package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +5 -3
- package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +1 -1
- package/dist/lib/esm/obsidian/plugin/index.d.mts +3 -0
- package/dist/lib/esm/obsidian/plugin/index.mjs +8 -2
- package/dist/lib/esm/obsidian/plugin/plugin-api.d.mts +34 -15
- package/dist/lib/esm/obsidian/plugin/plugin-api.mjs +2 -2
- package/dist/lib/esm/obsidian/plugin/plugin-install-state.d.mts +113 -0
- package/dist/lib/esm/obsidian/plugin/plugin-install-state.mjs +106 -0
- package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.d.mts +119 -0
- package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.mjs +54 -0
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +133 -4
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +245 -21
- package/dist/lib/esm/obsidian/plugin/settings-migration-api.d.mts +91 -0
- package/dist/lib/esm/obsidian/plugin/settings-migration-api.mjs +44 -0
- package/obsidian/components/plugin-gate-component/package.json +6 -0
- package/obsidian/components/settings-migration-component/package.json +6 -0
- package/obsidian/plugin/plugin-install-state/package.json +6 -0
- package/obsidian/plugin/plugin-lifecycle-events/package.json +6 -0
- package/obsidian/plugin/settings-migration-api/package.json +6 -0
- package/package.json +15 -15
|
@@ -43,20 +43,16 @@ function ensureBrowserProcess() {
|
|
|
43
43
|
|
|
44
44
|
import { ButtonComponent } from "obsidian";
|
|
45
45
|
import { convertAsyncToSync } from "../../async.mjs";
|
|
46
|
-
import {
|
|
47
|
-
enableCommunityPlugin,
|
|
48
|
-
installConfigureEnableCommunityPlugin
|
|
49
|
-
} from "../community-plugins.mjs";
|
|
50
46
|
import { CssClass } from "../css-class.mjs";
|
|
51
47
|
import { t } from "../i18n/i18n.mjs";
|
|
48
|
+
import {
|
|
49
|
+
getInstalledPluginState,
|
|
50
|
+
installAndEnablePlugin,
|
|
51
|
+
InstalledPluginState
|
|
52
|
+
} from "../plugin/plugin-install-state.mjs";
|
|
52
53
|
import { ComponentEx } from "./component-ex.mjs";
|
|
53
54
|
import { CallbackLayoutReadyComponent } from "./layout-ready-component.mjs";
|
|
54
|
-
|
|
55
|
-
SuggestedPluginState2["Enabled"] = "enabled";
|
|
56
|
-
SuggestedPluginState2["InstalledButDisabled"] = "installedButDisabled";
|
|
57
|
-
SuggestedPluginState2["NotInstalled"] = "notInstalled";
|
|
58
|
-
return SuggestedPluginState2;
|
|
59
|
-
})(SuggestedPluginState || {});
|
|
55
|
+
const SuggestedPluginState = InstalledPluginState;
|
|
60
56
|
class PluginSuggestionComponent extends ComponentEx {
|
|
61
57
|
app;
|
|
62
58
|
isSuggestionDeclined;
|
|
@@ -88,10 +84,10 @@ class PluginSuggestionComponent extends ComponentEx {
|
|
|
88
84
|
* @returns The {@link SuggestedPluginState}.
|
|
89
85
|
*/
|
|
90
86
|
getSuggestedPluginState() {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
87
|
+
return getInstalledPluginState({
|
|
88
|
+
app: this.app,
|
|
89
|
+
pluginId: this.suggestedPluginId
|
|
90
|
+
});
|
|
95
91
|
}
|
|
96
92
|
/**
|
|
97
93
|
* Installs (when needed) and enables the suggested plugin, reporting the outcome as a notice.
|
|
@@ -100,32 +96,16 @@ class PluginSuggestionComponent extends ComponentEx {
|
|
|
100
96
|
* reported.
|
|
101
97
|
*/
|
|
102
98
|
async installAndEnableSuggestedPlugin() {
|
|
103
|
-
|
|
104
|
-
if (state === "enabled" /* Enabled */) {
|
|
99
|
+
if (this.getSuggestedPluginState() === SuggestedPluginState.Enabled) {
|
|
105
100
|
return;
|
|
106
101
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
} else {
|
|
114
|
-
await installConfigureEnableCommunityPlugin({
|
|
115
|
-
app: this.app,
|
|
116
|
-
pluginId: this.suggestedPluginId
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
} catch (error) {
|
|
120
|
-
this.pluginNoticeComponent.showNotice(t(($) => $.obsidianDevUtils.pluginSuggestion.installFailed, {
|
|
121
|
-
pluginName: this.suggestedPluginName
|
|
122
|
-
}));
|
|
123
|
-
throw error;
|
|
124
|
-
}
|
|
102
|
+
await installAndEnablePlugin({
|
|
103
|
+
app: this.app,
|
|
104
|
+
pluginId: this.suggestedPluginId,
|
|
105
|
+
pluginName: this.suggestedPluginName,
|
|
106
|
+
pluginNoticeComponent: this.pluginNoticeComponent
|
|
107
|
+
});
|
|
125
108
|
await this.setSuggestionDeclined(false);
|
|
126
|
-
this.pluginNoticeComponent.showNotice(t(($) => $.obsidianDevUtils.pluginSuggestion.installed, {
|
|
127
|
-
pluginName: this.suggestedPluginName
|
|
128
|
-
}));
|
|
129
109
|
}
|
|
130
110
|
/**
|
|
131
111
|
* Loads the component, showing the suggestion notice once the layout is ready AND the host's settings
|
|
@@ -165,7 +145,7 @@ class PluginSuggestionComponent extends ComponentEx {
|
|
|
165
145
|
*/
|
|
166
146
|
renderBanner(containerEl) {
|
|
167
147
|
const state = this.getSuggestedPluginState();
|
|
168
|
-
if (state ===
|
|
148
|
+
if (state === SuggestedPluginState.Enabled) {
|
|
169
149
|
return;
|
|
170
150
|
}
|
|
171
151
|
const bannerEl = containerEl.createDiv({
|
|
@@ -178,12 +158,12 @@ class PluginSuggestionComponent extends ComponentEx {
|
|
|
178
158
|
}
|
|
179
159
|
getActionButtonText(state) {
|
|
180
160
|
return t(
|
|
181
|
-
($) => state ===
|
|
161
|
+
($) => state === SuggestedPluginState.InstalledButDisabled ? $.obsidianDevUtils.pluginSuggestion.enable : $.obsidianDevUtils.pluginSuggestion.install
|
|
182
162
|
);
|
|
183
163
|
}
|
|
184
164
|
showSuggestionNotice() {
|
|
185
165
|
const state = this.getSuggestedPluginState();
|
|
186
|
-
if (state ===
|
|
166
|
+
if (state === SuggestedPluginState.Enabled || this.isSuggestionDeclined()) {
|
|
187
167
|
return;
|
|
188
168
|
}
|
|
189
169
|
const fragment = createFragment((fragmentEl) => {
|
|
@@ -203,4 +183,4 @@ export {
|
|
|
203
183
|
PluginSuggestionComponent,
|
|
204
184
|
SuggestedPluginState
|
|
205
185
|
};
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLXN1Z2dlc3Rpb24tY29tcG9uZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcG9uZW50IHRoYXQgc3VnZ2VzdHMgaW5zdGFsbGluZyBhbm90aGVyIGNvbW11bml0eSBwbHVnaW4gdGhlIGhvc3QgcGx1Z2luIG5lZWRzIGluIG9yZGVyIHRvIG9mZmVyXG4gKiBzb21lIG9mIGl0cyBiZWhhdmlvci5cbiAqXG4gKiBBIHN1Z2dlc3Rpb24gaXMgbm90IGEgZGVwZW5kZW5jeS4gT2JzaWRpYW4gaGFzIG5vIG1lY2hhbmlzbSBmb3Igb25lIGNvbW11bml0eSBwbHVnaW4gdG8gcmVxdWlyZVxuICogYW5vdGhlciwgYW5kIGludmVudGluZyBvbmUgYnkgcmVmdXNpbmcgdG8gbG9hZCB3b3VsZCBwdW5pc2ggdGhlIHVzZXIgZm9yIHNvbWV0aGluZyB0aGV5IG5ldmVyIGFncmVlZFxuICogdG8uIFNvIHRoZSBob3N0IHBsdWdpbiBrZWVwcyB3b3JraW5nIHdpdGhvdXQgdGhlIHN1Z2dlc3RlZCBwbHVnaW4gXHUyMDE0IGl0IHNpbXBseSBjYW5ub3Qgb2ZmZXIgd2hhdGV2ZXJcbiAqIHRoYXQgcGx1Z2luIG93bnMgXHUyMDE0IGFuZCB0aGlzIGNvbXBvbmVudCBhc2tzLCBvbmNlLCB3aGV0aGVyIHRoZSB1c2VyIHdvdWxkIGxpa2UgaXQgaW5zdGFsbGVkLlxuICpcbiAqIFRoZSBhc2sgaXMgc3VyZmFjZWQgdHdpY2UsIGRlbGliZXJhdGVseSwgYmVjYXVzZSB0aGUgdHdvIHBsYWNlbWVudHMgYW5zd2VyIGRpZmZlcmVudCBxdWVzdGlvbnM6XG4gKiBhIG5vdGljZSBvbiBsb2FkIChcInlvdSBhcmUgbWlzc2luZyBzb21ldGhpbmcgeW91IHByb2JhYmx5IHdhbnRcIikgYW5kIGEgc2V0dGluZ3MtdGFiIGJhbm5lciAoXCJ0aGVcbiAqIHNldHRpbmdzIHlvdSBjYW1lIGxvb2tpbmcgZm9yIGxpdmUgaW4gYW5vdGhlciBwbHVnaW5cIikuIERlY2xpbmluZyBzaWxlbmNlcyBvbmx5IHRoZSBub3RpY2UgXHUyMDE0IGEgdXNlclxuICogd2hvIG9wZW5zIHRoZSBzZXR0aW5ncyB0YWIgaXMgYXNraW5nIGFib3V0IHRoZSBmZWF0dXJlIHJpZ2h0IHRoZW4sIHNvIHRoZSBiYW5uZXIgc3RheXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGNvbnZlcnRBc3luY1RvU3luYyB9IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7XG4gIGVuYWJsZUNvbW11bml0eVBsdWdpbixcbiAgaW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpblxufSBmcm9tICcuLi9jb21tdW5pdHktcGx1Z2lucy50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IHRoZSBzdWdnZXN0ZWQgcGx1Z2luIGlzIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSB2YXVsdC5cbiAqL1xuZXhwb3J0IGVudW0gU3VnZ2VzdGVkUGx1Z2luU3RhdGUge1xuICAvKipcbiAgICogSW5zdGFsbGVkIGFuZCBlbmFibGVkIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHN1Z2dlc3QuXG4gICAqL1xuICBFbmFibGVkID0gJ2VuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYnV0IGRpc2FibGVkLiBPbmx5IGFuIGVuYWJsZSBpcyBuZWVkZWQsIHNvIG5vIGRvd25sb2FkIGhhcHBlbnMuXG4gICAqL1xuICBJbnN0YWxsZWRCdXREaXNhYmxlZCA9ICdpbnN0YWxsZWRCdXREaXNhYmxlZCcsXG5cbiAgLyoqXG4gICAqIE5vdCBpbnN0YWxsZWQgYXQgYWxsLlxuICAgKi9cbiAgTm90SW5zdGFsbGVkID0gJ25vdEluc3RhbGxlZCdcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHVzZXIgaGFzIGFscmVhZHkgZGVjbGluZWQgdGhpcyBzdWdnZXN0aW9uLlxuICAgKlxuICAgKiBTdG9yYWdlIGJlbG9uZ3MgdG8gdGhlIGhvc3QgcGx1Z2luICh0eXBpY2FsbHkgb25lIG9mIGl0cyBzZXR0aW5ncyksIGJlY2F1c2UgdGhpcyBjb21wb25lbnQgaGFzIG5vXG4gICAqIGBkYXRhLmpzb25gIG9mIGl0cyBvd24gYW5kIGEgZGVjbGluZSBoYXMgdG8gb3V0bGl2ZSBhIHJlbG9hZC5cbiAgICpcbiAgICogT25seSBldmVyIGNhbGxlZCBvbmNlIHtAbGluayBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudH0gcmVwb3J0cyBpdHMgc2V0dGluZ3MgbG9hZGVkLCBzbyBhbiBpbXBsZW1lbnRhdGlvblxuICAgKiByZWFkaW5nIGEgc2V0dGluZyBpcyBndWFyYW50ZWVkIHRvIHJlYWQgdGhlIHN0b3JlZCB2YWx1ZSByYXRoZXIgdGhhbiBpdHMgZGVmYXVsdC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHN1Z2dlc3Rpb24gaGFzIGJlZW4gZGVjbGluZWQuXG4gICAqL1xuICBpc1N1Z2dlc3Rpb25EZWNsaW5lZCh0aGlzOiB2b2lkKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgb2YgdGhlIHBsdWdpbiBtYWtpbmcgdGhlIHN1Z2dlc3Rpb24sIHVzZWQgdG8gc2hvdyB0aGUgc3VnZ2VzdGlvbiBhbmQgaXRzXG4gICAqIG91dGNvbWUuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIGNvbXBvbmVudCBob2xkaW5nIHdoYXRldmVyIHtAbGluayBpc1N1Z2dlc3Rpb25EZWNsaW5lZH0gcmVhZHMuXG4gICAqXG4gICAqIFRha2VuIGFzIGEgd2hvbGUgY29tcG9uZW50IHJhdGhlciB0aGFuIGFzIGEgYmFyZSBcInJlYWR5XCIgZmxhZyBzbyB0aGUgaG9zdCBjYW5ub3QgZm9yZ2V0IHRvIHdpcmUgdGhlXG4gICAqIHdhaXQ6IHRoZSBub3RpY2UgaXMgZGVjaWRlZCBvbmx5IGFmdGVyIHRoaXMgY29tcG9uZW50IGhhcyByZWFkIGBkYXRhLmpzb25gLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZS53aGVuTG9hZGVkRnJvbUZpbGV9IGZvciB3aHkgdGhlIHJlYWQgY2Fubm90IHNpbXBseSBoYXBwZW4gYXRcbiAgICogbGF5b3V0LXJlYWR5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQ6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+O1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jYWxpemVkIHNlbnRlbmNlIGV4cGxhaW5pbmcgd2hhdCB0aGUgaG9zdCBwbHVnaW4gY2Fubm90IGRvIHdpdGhvdXQgdGhlIHN1Z2dlc3RlZCBwbHVnaW4uIFRoZVxuICAgKiBob3N0IHBsdWdpbiBvd25zIHRoaXMgc3RyaW5nOiBvbmx5IGl0IGtub3dzIHdoaWNoIG9mIGl0cyBmZWF0dXJlcyBhcmUgYWZmZWN0ZWQuXG4gICAqL1xuICByZWFkb25seSByZWFzb246IHN0cmluZztcblxuICAvKipcbiAgICogUmVjb3JkcyB0aGUgdXNlcidzIGFuc3dlciB0byB0aGUgc3VnZ2VzdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGlzRGVjbGluZWQgLSBgdHJ1ZWAgd2hlbiB0aGUgdXNlciBkZWNsaW5lZC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBhbnN3ZXIgaXMgcGVyc2lzdGVkLlxuICAgKi9cbiAgc2V0U3VnZ2VzdGlvbkRlY2xpbmVkKHRoaXM6IHZvaWQsIGlzRGVjbGluZWQ6IGJvb2xlYW4pOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHN1Z2dlc3RlZCBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRQbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzdWdnZXN0ZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHN1Z2dlc3RlZFBsdWdpbk5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTdWdnZXN0cyBpbnN0YWxsaW5nIGFub3RoZXIgY29tbXVuaXR5IHBsdWdpbiwgdmlhIGEgbG9hZC10aW1lIG5vdGljZSBhbmQgYSBzZXR0aW5ncy10YWIgYmFubmVyLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N1Z2dlc3Rpb25EZWNsaW5lZDogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0U3VnZ2VzdGlvbkRlY2xpbmVkOiAoaXNEZWNsaW5lZDogYm9vbGVhbikgPT4gUHJvbWlzYWJsZTx2b2lkPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWdnZXN0ZWRQbHVnaW5JZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1Z2dlc3RlZFBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpblNldHRpbmdzQ29tcG9uZW50O1xuICAgIHRoaXMucmVhc29uID0gcGFyYW1zLnJlYXNvbjtcbiAgICB0aGlzLnN1Z2dlc3RlZFBsdWdpbklkID0gcGFyYW1zLnN1Z2dlc3RlZFBsdWdpbklkO1xuICAgIHRoaXMuc3VnZ2VzdGVkUGx1Z2luTmFtZSA9IHBhcmFtcy5zdWdnZXN0ZWRQbHVnaW5OYW1lO1xuICAgIHRoaXMuaXNTdWdnZXN0aW9uRGVjbGluZWQgPSBwYXJhbXMuaXNTdWdnZXN0aW9uRGVjbGluZWQ7XG4gICAgdGhpcy5zZXRTdWdnZXN0aW9uRGVjbGluZWQgPSBwYXJhbXMuc2V0U3VnZ2VzdGlvbkRlY2xpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGhvdyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgU3VnZ2VzdGVkUGx1Z2luU3RhdGV9LlxuICAgKi9cbiAgcHVibGljIGdldFN1Z2dlc3RlZFBsdWdpblN0YXRlKCk6IFN1Z2dlc3RlZFBsdWdpblN0YXRlIHtcbiAgICBpZiAodGhpcy5hcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXModGhpcy5zdWdnZXN0ZWRQbHVnaW5JZCkpIHtcbiAgICAgIHJldHVybiBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5FbmFibGVkO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuaGFzT3duKHRoaXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCB0aGlzLnN1Z2dlc3RlZFBsdWdpbklkKVxuICAgICAgPyBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgOiBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5Ob3RJbnN0YWxsZWQ7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgKHdoZW4gbmVlZGVkKSBhbmQgZW5hYmxlcyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiwgcmVwb3J0aW5nIHRoZSBvdXRjb21lIGFzIGEgbm90aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyBlbmFibGVkLCBvciBvbmNlIHRoZSBmYWlsdXJlIGhhcyBiZWVuXG4gICAqIHJlcG9ydGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluc3RhbGxBbmRFbmFibGVTdWdnZXN0ZWRQbHVnaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN1Z2dlc3RlZFBsdWdpblN0YXRlKCk7XG4gICAgaWYgKHN0YXRlID09PSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5FbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gU3VnZ2VzdGVkUGx1Z2luU3RhdGUuSW5zdGFsbGVkQnV0RGlzYWJsZWQpIHtcbiAgICAgICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbklkOiB0aGlzLnN1Z2dlc3RlZFBsdWdpbklkXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgaW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogdGhpcy5zdWdnZXN0ZWRQbHVnaW5JZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luU3VnZ2VzdGlvbi5pbnN0YWxsRmFpbGVkLCB7XG4gICAgICAgIHBsdWdpbk5hbWU6IHRoaXMuc3VnZ2VzdGVkUGx1Z2luTmFtZVxuICAgICAgfSkpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZXRTdWdnZXN0aW9uRGVjbGluZWQoZmFsc2UpO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpblN1Z2dlc3Rpb24uaW5zdGFsbGVkLCB7XG4gICAgICBwbHVnaW5OYW1lOiB0aGlzLnN1Z2dlc3RlZFBsdWdpbk5hbWVcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudCwgc2hvd2luZyB0aGUgc3VnZ2VzdGlvbiBub3RpY2Ugb25jZSB0aGUgbGF5b3V0IGlzIHJlYWR5IEFORCB0aGUgaG9zdCdzIHNldHRpbmdzXG4gICAqIGhhdmUgYmVlbiByZWFkIGZyb20gZGlzay5cbiAgICpcbiAgICogQm90aCB3YWl0cyBtYXR0ZXIsIGFuZCBuZWl0aGVyIGltcGxpZXMgdGhlIG90aGVyOlxuICAgKlxuICAgKiAtIExheW91dC1yZWFkeSwgYmVjYXVzZSBwbHVnaW5zIGxvYWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIsIHNvIHRoZSBzdWdnZXN0ZWQgcGx1Z2luIG1heSB3ZWxsIGJlXG4gICAqICAgZW5hYmxlZCBhIG1vbWVudCBhZnRlciB0aGlzIG9uZS4gQ2hlY2tpbmcgZWFybGllciB3b3VsZCBzdWdnZXN0IGluc3RhbGxpbmcgc29tZXRoaW5nIHRoZSB1c2VyXG4gICAqICAgYWxyZWFkeSBoYXMuXG4gICAqIC0gU2V0dGluZ3MtbG9hZGVkLCBiZWNhdXNlIHtAbGluayBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMuaXNTdWdnZXN0aW9uRGVjbGluZWR9XG4gICAqICAgcmVhZHMgYSBzZXR0aW5nIG9mIHRoZSBob3N0LCBhbmQgdGhlIGhvc3QncyBzZXR0aW5ncyBjb21wb25lbnQgaXMgYSBTSUJMSU5HIHdob3NlIG93biBhc3luYyBsb2FkIGlzXG4gICAqICAgc3RpbGwgaW4gZmxpZ2h0IGhlcmUuIE9uIGEgbGF5b3V0IHRoYXQgaXMgYWxyZWFkeSByZWFkeSBcdTIwMTQgYSBydW50aW1lIGVuYWJsZSBmcm9tIHRoZSBDb21tdW5pdHlcbiAgICogICBQbHVnaW5zIHRhYiwgb3IgYSByZS1lbmFibGUgYWZ0ZXIgYW4gdXBkYXRlIFx1MjAxNCB0aGUgbGF5b3V0LXJlYWR5IGNhbGxiYWNrIGZpcmVzIGltbWVkaWF0ZWx5LCBzbyB0aGVcbiAgICogICByZWFkIHdvdWxkIHNlZSB0aGUgZGVmYXVsdCBgZmFsc2VgIGFuZCBhc2sgYWdhaW4gYSB1c2VyIHdobyBoYXMgYWxyZWFkeSBkZWNsaW5lZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBDYWxsYmFja0xheW91dFJlYWR5Q29tcG9uZW50KHRoaXMuYXBwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQud2hlbkxvYWRlZEZyb21GaWxlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb25Ob3RpY2UoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBzdWdnZXN0aW9uIGJhbm5lciBpbnRvIGEgc2V0dGluZ3MtdGFiIGNvbnRhaW5lciwgd2l0aCBhIGJ1dHRvbiB0aGF0IGluc3RhbGxzIGFuZCBlbmFibGVzXG4gICAqIHRoZSBzdWdnZXN0ZWQgcGx1Z2luLlxuICAgKlxuICAgKiBSZW5kZXJzIG5vdGhpbmcgd2hlbiB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBpcyBhbHJlYWR5IGVuYWJsZWQuIFVubGlrZSB0aGUgbm90aWNlLCB0aGUgYmFubmVyIGlnbm9yZXMgYVxuICAgKiBwcmV2aW91cyBkZWNsaW5lIFx1MjAxNCB0aGUgdXNlciBpcyBsb29raW5nIGF0IHRoZXNlIHNldHRpbmdzIHJpZ2h0IG5vdywgd2hpY2ggaXMgYSBmcmVzaGVyIHNpZ25hbCB0aGFuIGFuXG4gICAqIGFuc3dlciB0aGV5IGdhdmUgZWFybGllci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIHRoZSBiYW5uZXIgaW50by5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJCYW5uZXIoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN1Z2dlc3RlZFBsdWdpblN0YXRlKCk7XG4gICAgaWYgKHN0YXRlID09PSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5FbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpblN1Z2dlc3Rpb25CYW5uZXJdXG4gICAgfSk7XG4gICAgYmFubmVyRWwuY3JlYXRlRGl2KHsgdGV4dDogdGhpcy5yZWFzb24gfSk7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KHN0YXRlKSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsQW5kRW5hYmxlU3VnZ2VzdGVkUGx1Z2luKCk7XG4gICAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGlvbkJ1dHRvblRleHQoc3RhdGU6IFN1Z2dlc3RlZFBsdWdpblN0YXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdCgoJCkgPT5cbiAgICAgIHN0YXRlID09PSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgICA/ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmVuYWJsZVxuICAgICAgICA6ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93U3VnZ2VzdGlvbk5vdGljZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGUoKTtcbiAgICBpZiAoc3RhdGUgPT09IFN1Z2dlc3RlZFBsdWdpblN0YXRlLkVuYWJsZWQgfHwgdGhpcy5pc1N1Z2dlc3Rpb25EZWNsaW5lZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgoZnJhZ21lbnRFbCkgPT4ge1xuICAgICAgZnJhZ21lbnRFbC5jcmVhdGVEaXYoeyB0ZXh0OiB0aGlzLnJlYXNvbiB9KTtcbiAgICAgIGNvbnN0IGJ1dHRvbnNFbCA9IGZyYWdtZW50RWwuY3JlYXRlRGl2KCk7XG5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYnV0dG9uc0VsKVxuICAgICAgICAuc2V0QnV0dG9uVGV4dCh0aGlzLmdldEFjdGlvbkJ1dHRvblRleHQoc3RhdGUpKVxuICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmluc3RhbGxBbmRFbmFibGVTdWdnZXN0ZWRQbHVnaW4oKTtcbiAgICAgICAgfSkpO1xuXG4gICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJ1dHRvbnNFbClcbiAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpblN1Z2dlc3Rpb24ubm90Tm93KSlcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldFN1Z2dlc3Rpb25EZWNsaW5lZCh0cnVlKTtcbiAgICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShmcmFnbWVudCwgeyBzaG91bGRIaWRlT25DbGljazogZmFsc2UgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsU0FBUyx1QkFBdUI7QUFLaEMsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLFNBQVM7QUFDbEIsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyxvQ0FBb0M7QUFLdEMsSUFBSyx1QkFBTCxrQkFBS0EsMEJBQUw7QUFJTCxFQUFBQSxzQkFBQSxhQUFVO0FBS1YsRUFBQUEsc0JBQUEsMEJBQXVCO0FBS3ZCLEVBQUFBLHNCQUFBLGtCQUFlO0FBZEwsU0FBQUE7QUFBQSxHQUFBO0FBbUZMLE1BQU0sa0NBQWtDLFlBQVk7QUFBQSxFQUN4QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQW9EO0FBQ3JFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLHdCQUF3QixPQUFPO0FBQ3BDLFNBQUssMEJBQTBCLE9BQU87QUFDdEMsU0FBSyxTQUFTLE9BQU87QUFDckIsU0FBSyxvQkFBb0IsT0FBTztBQUNoQyxTQUFLLHNCQUFzQixPQUFPO0FBQ2xDLFNBQUssdUJBQXVCLE9BQU87QUFDbkMsU0FBSyx3QkFBd0IsT0FBTztBQUFBLEVBQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sMEJBQWdEO0FBQ3JELFFBQUksS0FBSyxJQUFJLFFBQVEsZUFBZSxJQUFJLEtBQUssaUJBQWlCLEdBQUc7QUFDL0QsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPLE9BQU8sT0FBTyxLQUFLLElBQUksUUFBUSxXQUFXLEtBQUssaUJBQWlCLElBQ25FLG9EQUNBO0FBQUEsRUFDTjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxrQ0FBaUQ7QUFDNUQsVUFBTSxRQUFRLEtBQUssd0JBQXdCO0FBQzNDLFFBQUksVUFBVSx5QkFBOEI7QUFDMUM7QUFBQSxJQUNGO0FBRUEsUUFBSTtBQUNGLFVBQUksVUFBVSxtREFBMkM7QUFDdkQsY0FBTSxzQkFBc0I7QUFBQSxVQUMxQixLQUFLLEtBQUs7QUFBQSxVQUNWLFVBQVUsS0FBSztBQUFBLFFBQ2pCLENBQUM7QUFBQSxNQUNILE9BQU87QUFDTCxjQUFNLHNDQUFzQztBQUFBLFVBQzFDLEtBQUssS0FBSztBQUFBLFVBQ1YsVUFBVSxLQUFLO0FBQUEsUUFDakIsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGLFNBQVMsT0FBTztBQUNkLFdBQUssc0JBQXNCLFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsaUJBQWlCLGVBQWU7QUFBQSxRQUNoRyxZQUFZLEtBQUs7QUFBQSxNQUNuQixDQUFDLENBQUM7QUFDRixZQUFNO0FBQUEsSUFDUjtBQUVBLFVBQU0sS0FBSyxzQkFBc0IsS0FBSztBQUN0QyxTQUFLLHNCQUFzQixXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLGlCQUFpQixXQUFXO0FBQUEsTUFDNUYsWUFBWSxLQUFLO0FBQUEsSUFDbkIsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUJnQixTQUFlO0FBQzdCLFNBQUs7QUFBQSxNQUNILElBQUksNkJBQTZCLEtBQUssS0FBSyxZQUFZO0FBQ3JELGNBQU0sS0FBSyx3QkFBd0IsbUJBQW1CO0FBQ3RELFlBQUksS0FBSyxXQUFXLEdBQUc7QUFDckI7QUFBQSxRQUNGO0FBRUEsYUFBSyxxQkFBcUI7QUFBQSxNQUM1QixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWU8sYUFBYSxhQUFnQztBQUNsRCxVQUFNLFFBQVEsS0FBSyx3QkFBd0I7QUFDM0MsUUFBSSxVQUFVLHlCQUE4QjtBQUMxQztBQUFBLElBQ0Y7QUFFQSxVQUFNLFdBQVcsWUFBWSxVQUFVO0FBQUEsTUFDckMsS0FBSyxDQUFDLFNBQVMsYUFBYSxTQUFTLHNCQUFzQjtBQUFBLElBQzdELENBQUM7QUFDRCxhQUFTLFVBQVUsRUFBRSxNQUFNLEtBQUssT0FBTyxDQUFDO0FBRXhDLFFBQUksZ0JBQWdCLFFBQVEsRUFDekIsY0FBYyxLQUFLLG9CQUFvQixLQUFLLENBQUMsRUFDN0MsT0FBTyxFQUNQLFFBQVEsbUJBQW1CLFlBQVk7QUFDdEMsWUFBTSxLQUFLLGdDQUFnQztBQUFBLElBQzdDLENBQUMsQ0FBQztBQUFBLEVBQ047QUFBQSxFQUVRLG9CQUFvQixPQUFxQztBQUMvRCxXQUFPO0FBQUEsTUFBRSxDQUFDLE1BQ1IsVUFBVSxvREFDTixFQUFFLGlCQUFpQixpQkFBaUIsU0FDcEMsRUFBRSxpQkFBaUIsaUJBQWlCO0FBQUEsSUFDMUM7QUFBQSxFQUNGO0FBQUEsRUFFUSx1QkFBNkI7QUFDbkMsVUFBTSxRQUFRLEtBQUssd0JBQXdCO0FBQzNDLFFBQUksVUFBVSwyQkFBZ0MsS0FBSyxxQkFBcUIsR0FBRztBQUN6RTtBQUFBLElBQ0Y7QUFFQSxVQUFNLFdBQVcsZUFBZSxDQUFDLGVBQWU7QUFDOUMsaUJBQVcsVUFBVSxFQUFFLE1BQU0sS0FBSyxPQUFPLENBQUM7QUFDMUMsWUFBTSxZQUFZLFdBQVcsVUFBVTtBQUV2QyxVQUFJLGdCQUFnQixTQUFTLEVBQzFCLGNBQWMsS0FBSyxvQkFBb0IsS0FBSyxDQUFDLEVBQzdDLE9BQU8sRUFDUCxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLGNBQU0sS0FBSyxnQ0FBZ0M7QUFBQSxNQUM3QyxDQUFDLENBQUM7QUFFSixVQUFJLGdCQUFnQixTQUFTLEVBQzFCLGNBQWMsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsaUJBQWlCLE1BQU0sQ0FBQyxFQUNsRSxRQUFRLG1CQUFtQixZQUFZO0FBQ3RDLGNBQU0sS0FBSyxzQkFBc0IsSUFBSTtBQUFBLE1BQ3ZDLENBQUMsQ0FBQztBQUFBLElBQ04sQ0FBQztBQUVELFNBQUssc0JBQXNCLFdBQVcsVUFBVSxFQUFFLG1CQUFtQixNQUFNLENBQUM7QUFBQSxFQUM5RTtBQUNGOyIsCiAgIm5hbWVzIjogWyJTdWdnZXN0ZWRQbHVnaW5TdGF0ZSJdCn0K
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLXN1Z2dlc3Rpb24tY29tcG9uZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcG9uZW50IHRoYXQgc3VnZ2VzdHMgaW5zdGFsbGluZyBhbm90aGVyIGNvbW11bml0eSBwbHVnaW4gdGhlIGhvc3QgcGx1Z2luIG5lZWRzIGluIG9yZGVyIHRvIG9mZmVyXG4gKiBzb21lIG9mIGl0cyBiZWhhdmlvci5cbiAqXG4gKiBBIHN1Z2dlc3Rpb24gaXMgbm90IGEgZGVwZW5kZW5jeSBcdTIwMTQgYnV0IGEgZGVwZW5kZW5jeSBpcyBub3cgYSB0aGluZyB0aGlzIGxpYnJhcnkgSEFTLCBzbyB0aGUgY2hvaWNlXG4gKiBiZXR3ZWVuIHRoZW0gaXMgYSByZWFsIG9uZS4gVXNlIGEgc3VnZ2VzdGlvbiB3aGVuIHRoZSBvdGhlciBwbHVnaW4gQUREUyBzb21ldGhpbmc6IHRoZSBob3N0IGtlZXBzXG4gKiB3b3JraW5nIHdpdGhvdXQgaXQsIHNpbXBseSB1bmFibGUgdG8gb2ZmZXIgd2hhdGV2ZXIgdGhhdCBwbHVnaW4gb3ducywgYW5kIHRoaXMgY29tcG9uZW50IGFza3Mgb25jZVxuICogd2hldGhlciB0aGUgdXNlciB3b3VsZCBsaWtlIGl0IGluc3RhbGxlZC4gVXNlIGBQbHVnaW5HYXRlQ29tcG9uZW50YCB3aGVuIHRoZSBob3N0J3MgYWR2ZXJ0aXNlZFxuICogYmVoYXZpb3IgaXMgbm90IHRoZXJlIGF0IGFsbCB3aXRob3V0IHRoZSBvdGhlciBwbHVnaW4uXG4gKlxuICogVGhpcyBmaWxlIHVzZWQgdG8gYXJndWUgdGhlIHN0cm9uZ2VyIHBvc2l0aW9uIFx1MjAxNCB0aGF0IHJlcXVpcmluZyBhbm90aGVyIHBsdWdpbiBzaG91bGQgbm90IGV4aXN0LCBiZWNhdXNlXG4gKiBcImludmVudGluZyBvbmUgYnkgcmVmdXNpbmcgdG8gbG9hZCB3b3VsZCBwdW5pc2ggdGhlIHVzZXIgZm9yIHNvbWV0aGluZyB0aGV5IG5ldmVyIGFncmVlZCB0b1wiLiBUaGF0IHdhc1xuICogd3JvbmcgYWJvdXQgd2hpY2ggb3B0aW9uIHB1bmlzaGVzIHRoZSB1c2VyLCBhbmQgdGhlIGNvdW50ZXItY2FzZSBpcyB3b3J0aCBrZWVwaW5nIHJhdGhlciB0aGFuIHF1aWV0bHlcbiAqIGRlbGV0aW5nLiBBIGxvYWQtYmVhcmluZyBwbHVnaW4gdGhlIHVzZXIgY2Fubm90IGlkZW50aWZ5IGlzIG5vdCBhIG5ldXRyYWwgb3V0Y29tZTogbW9udGhzIGxhdGVyIHRoZXlcbiAqIG1lZXQgaXQgaW4gdGhlaXIgcGx1Z2luIGxpc3QsIG5vdGhpbmcgaW4gT2JzaWRpYW4ncyBtYW5pZmVzdCBmb3JtYXQgc2F5cyBhbnl0aGluZyBkZXBlbmRzIG9uIGl0LCB0aGV5XG4gKiByZW1vdmUgaXQsIGFuZCB0aGUgZGFtYWdlIHN1cmZhY2VzIHdlZWtzIGFmdGVyIHRoYXQgd2l0aCBubyB3YXkgdG8gY29ubmVjdCB0aGUgdHdvLiBCZXNpZGUgdGhhdCwgYVxuICogbWFuZGF0b3J5IGRlcGVuZGVuY3kgdGhhdCBzdGF5cyBlbmFibGVkLWJ1dC1pbmVydCwgbmFtZXMgd2hhdCBpdCBpcyB3YWl0aW5nIGZvciwgaW5zdGFsbHMgaXQgaW4gb25lXG4gKiBjbGljayBhbmQgcmVzdW1lcyB3aXRob3V0IGEgcmVzdGFydCBpcyBub3QgYSBwdW5pc2htZW50IFx1MjAxNCBpdCBpcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiwgZGVsaXZlcmVkIHdoaWxlXG4gKiB0aGUgdXNlciBjYW4gc3RpbGwgYWN0IG9uIGl0LlxuICpcbiAqIFRoZSBhc2sgaXMgc3VyZmFjZWQgdHdpY2UsIGRlbGliZXJhdGVseSwgYmVjYXVzZSB0aGUgdHdvIHBsYWNlbWVudHMgYW5zd2VyIGRpZmZlcmVudCBxdWVzdGlvbnM6XG4gKiBhIG5vdGljZSBvbiBsb2FkIChcInlvdSBhcmUgbWlzc2luZyBzb21ldGhpbmcgeW91IHByb2JhYmx5IHdhbnRcIikgYW5kIGEgc2V0dGluZ3MtdGFiIGJhbm5lciAoXCJ0aGVcbiAqIHNldHRpbmdzIHlvdSBjYW1lIGxvb2tpbmcgZm9yIGxpdmUgaW4gYW5vdGhlciBwbHVnaW5cIikuIERlY2xpbmluZyBzaWxlbmNlcyBvbmx5IHRoZSBub3RpY2UgXHUyMDE0IGEgdXNlclxuICogd2hvIG9wZW5zIHRoZSBzZXR0aW5ncyB0YWIgaXMgYXNraW5nIGFib3V0IHRoZSBmZWF0dXJlIHJpZ2h0IHRoZW4sIHNvIHRoZSBiYW5uZXIgc3RheXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGNvbnZlcnRBc3luY1RvU3luYyB9IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHtcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIGluc3RhbGxBbmRFbmFibGVQbHVnaW4sXG4gIEluc3RhbGxlZFBsdWdpblN0YXRlXG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1yZWFkeS1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIEhvdyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgdmF1bHQuXG4gKlxuICogVGhlIHNhbWUgdGhyZWUgc3RhdGVzIGEgbWFuZGF0b3J5IGRlcGVuZGVuY3kgaXMgaW4sIHNvIHRoaXMgaXMge0BsaW5rIEluc3RhbGxlZFBsdWdpblN0YXRlfSB1bmRlciB0aGVcbiAqIG5hbWUgdGhpcyBjb21wb25lbnQgaGFzIGFsd2F5cyB1c2VkIFx1MjAxNCBvbmUgZW51bSwgc28gYSBjYWxsZXIgaG9sZGluZyBhIHN0YXRlIGZyb20gZWl0aGVyIGNvbXBvbmVudCBjYW5cbiAqIGNvbXBhcmUgaXQgYWdhaW5zdCBlaXRoZXIgbmFtZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN1Z2dlc3RlZFBsdWdpblN0YXRlID0gSW5zdGFsbGVkUGx1Z2luU3RhdGU7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50fSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGRlY2xpbmVkIHRoaXMgc3VnZ2VzdGlvbi5cbiAgICpcbiAgICogU3RvcmFnZSBiZWxvbmdzIHRvIHRoZSBob3N0IHBsdWdpbiAodHlwaWNhbGx5IG9uZSBvZiBpdHMgc2V0dGluZ3MpLCBiZWNhdXNlIHRoaXMgY29tcG9uZW50IGhhcyBub1xuICAgKiBgZGF0YS5qc29uYCBvZiBpdHMgb3duIGFuZCBhIGRlY2xpbmUgaGFzIHRvIG91dGxpdmUgYSByZWxvYWQuXG4gICAqXG4gICAqIE9ubHkgZXZlciBjYWxsZWQgb25jZSB7QGxpbmsgcGx1Z2luU2V0dGluZ3NDb21wb25lbnR9IHJlcG9ydHMgaXRzIHNldHRpbmdzIGxvYWRlZCwgc28gYW4gaW1wbGVtZW50YXRpb25cbiAgICogcmVhZGluZyBhIHNldHRpbmcgaXMgZ3VhcmFudGVlZCB0byByZWFkIHRoZSBzdG9yZWQgdmFsdWUgcmF0aGVyIHRoYW4gaXRzIGRlZmF1bHQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBzdWdnZXN0aW9uIGhhcyBiZWVuIGRlY2xpbmVkLlxuICAgKi9cbiAgaXNTdWdnZXN0aW9uRGVjbGluZWQodGhpczogdm9pZCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IG9mIHRoZSBwbHVnaW4gbWFraW5nIHRoZSBzdWdnZXN0aW9uLCB1c2VkIHRvIHNob3cgdGhlIHN1Z2dlc3Rpb24gYW5kIGl0c1xuICAgKiBvdXRjb21lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBjb21wb25lbnQgaG9sZGluZyB3aGF0ZXZlciB7QGxpbmsgaXNTdWdnZXN0aW9uRGVjbGluZWR9IHJlYWRzLlxuICAgKlxuICAgKiBUYWtlbiBhcyBhIHdob2xlIGNvbXBvbmVudCByYXRoZXIgdGhhbiBhcyBhIGJhcmUgXCJyZWFkeVwiIGZsYWcgc28gdGhlIGhvc3QgY2Fubm90IGZvcmdldCB0byB3aXJlIHRoZVxuICAgKiB3YWl0OiB0aGUgbm90aWNlIGlzIGRlY2lkZWQgb25seSBhZnRlciB0aGlzIGNvbXBvbmVudCBoYXMgcmVhZCBgZGF0YS5qc29uYC4gU2VlXG4gICAqIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2Uud2hlbkxvYWRlZEZyb21GaWxlfSBmb3Igd2h5IHRoZSByZWFkIGNhbm5vdCBzaW1wbHkgaGFwcGVuIGF0XG4gICAqIGxheW91dC1yZWFkeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8b2JqZWN0PjtcblxuICAvKipcbiAgICogVGhlIGxvY2FsaXplZCBzZW50ZW5jZSBleHBsYWluaW5nIHdoYXQgdGhlIGhvc3QgcGx1Z2luIGNhbm5vdCBkbyB3aXRob3V0IHRoZSBzdWdnZXN0ZWQgcGx1Z2luLiBUaGVcbiAgICogaG9zdCBwbHVnaW4gb3ducyB0aGlzIHN0cmluZzogb25seSBpdCBrbm93cyB3aGljaCBvZiBpdHMgZmVhdHVyZXMgYXJlIGFmZmVjdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgdGhlIHVzZXIncyBhbnN3ZXIgdG8gdGhlIHN1Z2dlc3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpc0RlY2xpbmVkIC0gYHRydWVgIHdoZW4gdGhlIHVzZXIgZGVjbGluZWQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYW5zd2VyIGlzIHBlcnNpc3RlZC5cbiAgICovXG4gIHNldFN1Z2dlc3Rpb25EZWNsaW5lZCh0aGlzOiB2b2lkLCBpc0RlY2xpbmVkOiBib29sZWFuKTogUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBzdWdnZXN0ZWQgcGx1Z2luLCBhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkUGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc3VnZ2VzdGVkIHBsdWdpbiwgc2hvd24gdG8gdGhlIHVzZXIuXG4gICAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRQbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSG93IHRoZSBzdWdnZXN0ZWQgcGx1Z2luIGlzIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSB2YXVsdC5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkUGx1Z2luU3RhdGUgPSBJbnN0YWxsZWRQbHVnaW5TdGF0ZTtcblxuLyoqXG4gKiBTdWdnZXN0cyBpbnN0YWxsaW5nIGFub3RoZXIgY29tbXVuaXR5IHBsdWdpbiwgdmlhIGEgbG9hZC10aW1lIG5vdGljZSBhbmQgYSBzZXR0aW5ncy10YWIgYmFubmVyLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1N1Z2dlc3Rpb25EZWNsaW5lZDogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD47XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhc29uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0U3VnZ2VzdGlvbkRlY2xpbmVkOiAoaXNEZWNsaW5lZDogYm9vbGVhbikgPT4gUHJvbWlzYWJsZTx2b2lkPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWdnZXN0ZWRQbHVnaW5JZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1Z2dlc3RlZFBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpblNldHRpbmdzQ29tcG9uZW50O1xuICAgIHRoaXMucmVhc29uID0gcGFyYW1zLnJlYXNvbjtcbiAgICB0aGlzLnN1Z2dlc3RlZFBsdWdpbklkID0gcGFyYW1zLnN1Z2dlc3RlZFBsdWdpbklkO1xuICAgIHRoaXMuc3VnZ2VzdGVkUGx1Z2luTmFtZSA9IHBhcmFtcy5zdWdnZXN0ZWRQbHVnaW5OYW1lO1xuICAgIHRoaXMuaXNTdWdnZXN0aW9uRGVjbGluZWQgPSBwYXJhbXMuaXNTdWdnZXN0aW9uRGVjbGluZWQ7XG4gICAgdGhpcy5zZXRTdWdnZXN0aW9uRGVjbGluZWQgPSBwYXJhbXMuc2V0U3VnZ2VzdGlvbkRlY2xpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGhvdyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgU3VnZ2VzdGVkUGx1Z2luU3RhdGV9LlxuICAgKi9cbiAgcHVibGljIGdldFN1Z2dlc3RlZFBsdWdpblN0YXRlKCk6IFN1Z2dlc3RlZFBsdWdpblN0YXRlIHtcbiAgICByZXR1cm4gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnN1Z2dlc3RlZFBsdWdpbklkXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbHMgKHdoZW4gbmVlZGVkKSBhbmQgZW5hYmxlcyB0aGUgc3VnZ2VzdGVkIHBsdWdpbiwgcmVwb3J0aW5nIHRoZSBvdXRjb21lIGFzIGEgbm90aWNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyBlbmFibGVkLCBvciBvbmNlIHRoZSBmYWlsdXJlIGhhcyBiZWVuXG4gICAqIHJlcG9ydGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluc3RhbGxBbmRFbmFibGVTdWdnZXN0ZWRQbHVnaW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGUoKSA9PT0gU3VnZ2VzdGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGluc3RhbGxBbmRFbmFibGVQbHVnaW4oe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnN1Z2dlc3RlZFBsdWdpbklkLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5zdWdnZXN0ZWRQbHVnaW5OYW1lLFxuICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgIH0pO1xuXG4gICAgLy8gT25seSBhZnRlciB0aGUgaW5zdGFsbCBhY3R1YWxseSBzdWNjZWVkZWQgXHUyMDE0IGBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luYCByZXRocm93cyBvbiBmYWlsdXJlLCBzbyBhXG4gICAgLy8gRmFpbGVkIGF0dGVtcHQgbGVhdmVzIGEgcHJldmlvdXMgZGVjbGluZSBzdGFuZGluZyByYXRoZXIgdGhhbiBzaWxlbnRseSBjbGVhcmluZyBpdC5cbiAgICBhd2FpdCB0aGlzLnNldFN1Z2dlc3Rpb25EZWNsaW5lZChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudCwgc2hvd2luZyB0aGUgc3VnZ2VzdGlvbiBub3RpY2Ugb25jZSB0aGUgbGF5b3V0IGlzIHJlYWR5IEFORCB0aGUgaG9zdCdzIHNldHRpbmdzXG4gICAqIGhhdmUgYmVlbiByZWFkIGZyb20gZGlzay5cbiAgICpcbiAgICogQm90aCB3YWl0cyBtYXR0ZXIsIGFuZCBuZWl0aGVyIGltcGxpZXMgdGhlIG90aGVyOlxuICAgKlxuICAgKiAtIExheW91dC1yZWFkeSwgYmVjYXVzZSBwbHVnaW5zIGxvYWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIsIHNvIHRoZSBzdWdnZXN0ZWQgcGx1Z2luIG1heSB3ZWxsIGJlXG4gICAqICAgZW5hYmxlZCBhIG1vbWVudCBhZnRlciB0aGlzIG9uZS4gQ2hlY2tpbmcgZWFybGllciB3b3VsZCBzdWdnZXN0IGluc3RhbGxpbmcgc29tZXRoaW5nIHRoZSB1c2VyXG4gICAqICAgYWxyZWFkeSBoYXMuXG4gICAqIC0gU2V0dGluZ3MtbG9hZGVkLCBiZWNhdXNlIHtAbGluayBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMuaXNTdWdnZXN0aW9uRGVjbGluZWR9XG4gICAqICAgcmVhZHMgYSBzZXR0aW5nIG9mIHRoZSBob3N0LCBhbmQgdGhlIGhvc3QncyBzZXR0aW5ncyBjb21wb25lbnQgaXMgYSBTSUJMSU5HIHdob3NlIG93biBhc3luYyBsb2FkIGlzXG4gICAqICAgc3RpbGwgaW4gZmxpZ2h0IGhlcmUuIE9uIGEgbGF5b3V0IHRoYXQgaXMgYWxyZWFkeSByZWFkeSBcdTIwMTQgYSBydW50aW1lIGVuYWJsZSBmcm9tIHRoZSBDb21tdW5pdHlcbiAgICogICBQbHVnaW5zIHRhYiwgb3IgYSByZS1lbmFibGUgYWZ0ZXIgYW4gdXBkYXRlIFx1MjAxNCB0aGUgbGF5b3V0LXJlYWR5IGNhbGxiYWNrIGZpcmVzIGltbWVkaWF0ZWx5LCBzbyB0aGVcbiAgICogICByZWFkIHdvdWxkIHNlZSB0aGUgZGVmYXVsdCBgZmFsc2VgIGFuZCBhc2sgYWdhaW4gYSB1c2VyIHdobyBoYXMgYWxyZWFkeSBkZWNsaW5lZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBDYWxsYmFja0xheW91dFJlYWR5Q29tcG9uZW50KHRoaXMuYXBwLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQud2hlbkxvYWRlZEZyb21GaWxlKCk7XG4gICAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2hvd1N1Z2dlc3Rpb25Ob3RpY2UoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBzdWdnZXN0aW9uIGJhbm5lciBpbnRvIGEgc2V0dGluZ3MtdGFiIGNvbnRhaW5lciwgd2l0aCBhIGJ1dHRvbiB0aGF0IGluc3RhbGxzIGFuZCBlbmFibGVzXG4gICAqIHRoZSBzdWdnZXN0ZWQgcGx1Z2luLlxuICAgKlxuICAgKiBSZW5kZXJzIG5vdGhpbmcgd2hlbiB0aGUgc3VnZ2VzdGVkIHBsdWdpbiBpcyBhbHJlYWR5IGVuYWJsZWQuIFVubGlrZSB0aGUgbm90aWNlLCB0aGUgYmFubmVyIGlnbm9yZXMgYVxuICAgKiBwcmV2aW91cyBkZWNsaW5lIFx1MjAxNCB0aGUgdXNlciBpcyBsb29raW5nIGF0IHRoZXNlIHNldHRpbmdzIHJpZ2h0IG5vdywgd2hpY2ggaXMgYSBmcmVzaGVyIHNpZ25hbCB0aGFuIGFuXG4gICAqIGFuc3dlciB0aGV5IGdhdmUgZWFybGllci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIHRoZSBiYW5uZXIgaW50by5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJCYW5uZXIoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN1Z2dlc3RlZFBsdWdpblN0YXRlKCk7XG4gICAgaWYgKHN0YXRlID09PSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5FbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpblN1Z2dlc3Rpb25CYW5uZXJdXG4gICAgfSk7XG4gICAgYmFubmVyRWwuY3JlYXRlRGl2KHsgdGV4dDogdGhpcy5yZWFzb24gfSk7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodGhpcy5nZXRBY3Rpb25CdXR0b25UZXh0KHN0YXRlKSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnN0YWxsQW5kRW5hYmxlU3VnZ2VzdGVkUGx1Z2luKCk7XG4gICAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGlvbkJ1dHRvblRleHQoc3RhdGU6IFN1Z2dlc3RlZFBsdWdpblN0YXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdCgoJCkgPT5cbiAgICAgIHN0YXRlID09PSBTdWdnZXN0ZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgICA/ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmVuYWJsZVxuICAgICAgICA6ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93U3VnZ2VzdGlvbk5vdGljZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGUoKTtcbiAgICBpZiAoc3RhdGUgPT09IFN1Z2dlc3RlZFBsdWdpblN0YXRlLkVuYWJsZWQgfHwgdGhpcy5pc1N1Z2dlc3Rpb25EZWNsaW5lZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgoZnJhZ21lbnRFbCkgPT4ge1xuICAgICAgZnJhZ21lbnRFbC5jcmVhdGVEaXYoeyB0ZXh0OiB0aGlzLnJlYXNvbiB9KTtcbiAgICAgIGNvbnN0IGJ1dHRvbnNFbCA9IGZyYWdtZW50RWwuY3JlYXRlRGl2KCk7XG5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYnV0dG9uc0VsKVxuICAgICAgICAuc2V0QnV0dG9uVGV4dCh0aGlzLmdldEFjdGlvbkJ1dHRvblRleHQoc3RhdGUpKVxuICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmluc3RhbGxBbmRFbmFibGVTdWdnZXN0ZWRQbHVnaW4oKTtcbiAgICAgICAgfSkpO1xuXG4gICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJ1dHRvbnNFbClcbiAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnBsdWdpblN1Z2dlc3Rpb24ubm90Tm93KSlcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldFN1Z2dlc3Rpb25EZWNsaW5lZCh0cnVlKTtcbiAgICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShmcmFnbWVudCwgeyBzaG91bGRIaWRlT25DbGljazogZmFsc2UgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkEsU0FBUyx1QkFBdUI7QUFLaEMsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyxnQkFBZ0I7QUFD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
|