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
|
@@ -81,4 +81,4 @@ export {
|
|
|
81
81
|
typeIntoEditor,
|
|
82
82
|
unhoverElement
|
|
83
83
|
};
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vYmlsZS10cnVzdGVkLWlucHV0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTW9iaWxlLW9ubHkgdHJ1c3RlZCBpbnB1dCBoZWxwZXJzLiBUaGVyZSBpcyBubyBpbi1yZW5kZXJlciByb3V0ZSB0byBhIHRydXN0ZWQgZXZlbnQgb24gYSBwaG9uZSBcdTIwMTRcbiAqIGB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudGAgaXMgRWxlY3Ryb24tb25seSBhbmQgYSBkaXNwYXRjaGVkIGV2ZW50IGlzIHVudHJ1c3RlZCBcdTIwMTQgc28gdGhlIGluamVjdGlvblxuICogaGFzIHRvIGJlIGEgcm91bmQtdHJpcDogdGhlIHJlcXVlc3QgZ29lcyB0byB0aGUgaG9zdCBvdmVyIHRoZSBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AgaGFybmVzcydzXG4gKiBiaW5kaW5nIGNoYW5uZWwsIGFuZCB0aGUgaG9zdCBpbmplY3RzIGl0IGludG8gdGhlIFdlYlZpZXcgb3ZlciBDRFAuXG4gKlxuICogVGhhdCBjaGFubmVsIGlzIGluc3RhbGxlZCBieSB0aGUgaGFybmVzcydzIEFwcGl1bSB0cmFuc3BvcnQsIHNvIHRoZXNlIGhlbHBlcnMgKipkZWxlZ2F0ZSoqIHRvIHRoZVxuICogaGFybmVzcyByYXRoZXIgdGhhbiByZWltcGxlbWVudGluZyB0aGUgd2lyZSBmb3JtYXQ6IHRoZXkgY2FsbFxuICogYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnRydXN0ZWRJbnB1dC4qYCwgd2hpY2ggaG9sZHMgdGhlIHZlcnkgZnVuY3Rpb24gb2JqZWN0cyB0aGUgaGFybmVzc1xuICogc2VlZHMgaW50byBhbiBgZXZhbEluT2JzaWRpYW5gIGNsb3N1cmUncyBgbGliYCBiYWcuIERlbGVnYXRpbmcgaXMgd2hhdCBrZWVwcyB0aGUgbW9iaWxlIHNlbWFudGljcyBcdTIwMTRcbiAqIHRhcCwgbG9uZy1wcmVzcyBmb3IgYGJ1dHRvbjogJ3JpZ2h0J2AsIGEgdGhyb3cgZm9yIGAnbWlkZGxlJ2AsIHRoZSBgcHJlc3NLZXlgIGtleSBzZXQsIGFuZCB0aGUgdGhyb3dzXG4gKiBmb3IgdGhlIGA6aG92ZXJgIGhlbHBlcnMgXHUyMDE0IGlkZW50aWNhbCB0byB0aGUgaGFybmVzcydzIG93biBjb3B5IGZvciBmcmVlLCBpbnN0ZWFkIG9mIGEgc2Vjb25kXG4gKiBpbXBsZW1lbnRhdGlvbiB0byBoYW5kLXN5bmMgKHNlZSB0aGUgcHJvamVjdCBgQUdFTlRTLm1kYCAqKkw0KiopLlxuICpcbiAqIFRoZSBuYW1lc3BhY2Ugc2hhcGUgaXMgZGVjbGFyZWQgKipsb2NhbGx5Kio6IHRoZSBoYXJuZXNzIG11c3QgbmV2ZXIgYmUgYSBkZXBlbmRlbmN5IG9mIHRoaXMgbGlicmFyeSwgaW5cbiAqIGVpdGhlciBkaXJlY3Rpb24sIGF0IHJ1bnRpbWUgb3IgaW4gdHlwZXMuXG4gKlxuICogKipDb25zZXF1ZW5jZSwgYW5kIGl0IGlzIGRlbGliZXJhdGU6KiogdGhlc2UgaGVscGVycyBvbmx5IHdvcmsgaW5zaWRlIGFuIGFwcCB0aGUgaGFybmVzcyBib290c3RyYXBwZWQuXG4gKiBPdXRzaWRlIG9uZSB0aGV5IHRocm93IGEgbWVzc2FnZSBzYXlpbmcgc28sIHJhdGhlciB0aGFuIHNpbGVudGx5IGRvaW5nIG5vdGhpbmcgXHUyMDE0IGEgbm8tb3Agd291bGQgcmVjcmVhdGVcbiAqIGV4YWN0bHkgdGhlIGZhbHNlLWNvbmZpZGVuY2UgZmFpbHVyZSB0cnVzdGVkIGlucHV0IGV4aXN0cyB0byBlbmQuIENvbnN1bWVycyB3YW50aW5nIHRoZSBwbGF0Zm9ybS1jb3JyZWN0XG4gKiBoZWxwZXIgc2hvdWxkIGltcG9ydCB0aGUge0BsaW5rIC4uL3RydXN0ZWQtaW5wdXQudHMgfCB0cnVzdGVkLWlucHV0fSBmYWNhZGUgaW5zdGVhZCBvZiB0aGlzIG1vZHVsZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIENsaWNrRWxlbWVudFBhcmFtcyxcbiAgQ2xpY2tNb3VzZVBhcmFtcyxcbiAgSG92ZXJFbGVtZW50UGFyYW1zLFxuICBNb3ZlTW91c2VQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXNcbiAgLy8gVGhlIHBhcmFtZXRlciBjb250cmFjdHMgbGl2ZSB3aXRoIHRoZSBkZXNrdG9wIHR3aW4gYW5kIGFyZSBzaGFyZWQgdmVyYmF0aW0sIHNvIHRoZSB0d28gcGxhdGZvcm1zXG4gIC8vIENhbm5vdCBkcmlmdCBhcGFydCBvbiB3aGF0IGEgY2FsbGVyIHBhc3Nlcy4gQSB0eXBlLW9ubHkgaW1wb3J0IGxvYWRzIG5vdGhpbmcgKEw1KS5cbn0gZnJvbSAnLi9kZXNrdG9wLXRydXN0ZWQtaW5wdXQudHMnO1xuXG4vKipcbiAqIFRoZSBnbG9iYWwgdGhlIGhhcm5lc3MgYm9vdHN0cmFwcyBpdHMgbmFtZXNwYWNlIG9udG8uXG4gKi9cbmludGVyZmFjZSBPYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gIF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc6IE9ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIHRoZSBoYXJuZXNzIG5hbWVzcGFjZSB0aGlzIG1vZHVsZSByZWFkcy4gRXZlcnl0aGluZyBlbHNlIG9uIGl0IGlzIG5vbmUgb2YgdGhpcyBtb2R1bGUnc1xuICogYnVzaW5lc3MuXG4gKi9cbmludGVyZmFjZSBPYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSB7XG4gIHRydXN0ZWRJbnB1dD86IFBhcnRpYWw8VHJ1c3RlZElucHV0U2VhbT47XG59XG5cbi8qKlxuICogVGhlIHRydXN0ZWQtaW5wdXQgc2VhbSB0aGUgYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgIGhhcm5lc3MgcHVibGlzaGVzIG9uIGl0cyBuYW1lc3BhY2UuXG4gKlxuICogRGVjbGFyZWQgaGVyZSByYXRoZXIgdGhhbiBpbXBvcnRlZDogdGhlIGhhcm5lc3MgaXMgbm90IGEgZGVwZW5kZW5jeSBvZiB0aGlzIGxpYnJhcnkuIEl0IG1pcnJvcnNcbiAqIGBuYW1lc3BhY2UtYm9vdHN0cmFwLnRzYCdzIGB0cnVzdGVkSW5wdXRgIG9iamVjdCwgYW5kIHRoZSBtaXJyb3JpbmcgaXMgYnkgaGFuZCBcdTIwMTQgdGhlIHNhbWVcbiAqIGJlaGF2aW9yYWwtc3luYyBvYmxpZ2F0aW9uIHRoZSBkZXNrdG9wIHR3aW4gY2Fycmllcy5cbiAqL1xuaW50ZXJmYWNlIFRydXN0ZWRJbnB1dFNlYW0ge1xuICBjbGlja0VsZW1lbnQocGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICBjbGlja01vdXNlKHBhcmFtczogQ2xpY2tNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIGhvdmVyRWxlbWVudChwYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIG1vdmVNb3VzZShwYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIHByZXNzS2V5KHBhcmFtczogUHJlc3NLZXlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB0eXBlSW50b0VkaXRvcihwYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgdW5ob3ZlckVsZW1lbnQocGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQ2xpY2tzIHRoZSBjZW50ZXIgb2YgYW4gZWxlbWVudCB1c2luZyAqKnRydXN0ZWQqKiB0b3VjaCBpbnB1dCBcdTIwMTQgYSBDRFAgdGFwIGluIHRoZSBXZWJWaWV3LCBpbmplY3RlZCBieVxuICogdGhlIGhvc3QuXG4gKlxuICogVGhlIGVsZW1lbnQtcmVsYXRpdmUgY291bnRlcnBhcnQgb2Yge0BsaW5rIGNsaWNrTW91c2V9LiBgYnV0dG9uOiAncmlnaHQnYCBpcyB0aGUgbG9uZy1wcmVzcyB0aGF0IG9wZW5zXG4gKiBPYnNpZGlhbiBNb2JpbGUncyBjb250ZXh0IG1lbnU7IGAnbWlkZGxlJ2AgdGhyb3dzLCBiZWNhdXNlIHRvdWNoIGhhcyBubyBnZXN0dXJlIGZvciBpdCBhbmQgaW52ZW50aW5nXG4gKiBvbmUgd291bGQgYmUgd29yc2UgdGhhbiBzYXlpbmcgc28uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIGNsaWNrLCB0aGUgYnV0dG9uIHRvIHByZXNzIGFuZCBhbnkgbW9kaWZpZXJzIHRvIGhvbGQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNsaWNrIGhhcyBiZWVuIGluamVjdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KHBhcmFtczogQ2xpY2tFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdldFNlYW1GdW5jdGlvbignY2xpY2tFbGVtZW50JykocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBDbGlja3MgYXQgdGhlIGdpdmVuIHZpZXdwb3J0IGNvb3JkaW5hdGVzIHVzaW5nICoqdHJ1c3RlZCoqIHRvdWNoIGlucHV0LCBpbmplY3RlZCBieSB0aGUgaG9zdCBvdmVyIENEUC5cbiAqXG4gKiBUaGUgY29vcmRpbmF0ZXMgYXJlIENTUyBwaXhlbHMgaW4gdGhlIFdlYlZpZXcncyBvd24gdmlld3BvcnQgXHUyMDE0IHdoaWNoIGlzIHdoYXQgQ0RQIHRha2VzIFx1MjAxNCBzb1xuICogYGRldmljZVBpeGVsUmF0aW9gIG5ldmVyIGVudGVycyB0aGUgcGljdHVyZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHZpZXdwb3J0IGNvb3JkaW5hdGVzIHRvIGNsaWNrIGF0LCB0aGUgYnV0dG9uIHRvIHByZXNzIGFuZCBhbnkgbW9kaWZpZXJzIHRvIGhvbGQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNsaWNrIGhhcyBiZWVuIGluamVjdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xpY2tNb3VzZShwYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2V0U2VhbUZ1bmN0aW9uKCdjbGlja01vdXNlJykocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBBbHdheXMgdGhyb3dzOiBgOmhvdmVyYCBoYXMgbm8gdG91Y2ggZXF1aXZhbGVudC5cbiAqXG4gKiBBIHNpbGVudCBuby1vcCBoZXJlIHdvdWxkIGxldCBhIGhvdmVyIHRlc3QgcGFzcyBvbiBhIHBob25lIHdpdGhvdXQgaG92ZXJpbmcgYW55dGhpbmcsIHNvIHRoZSBtb2JpbGUgYXJtXG4gKiByZWZ1c2VzIGluc3RlYWQuIEdhdGUgdGhlIGFzc2VydGlvbiBvbiBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYCwgb3IgZHJpdmUgdGhlIGVsZW1lbnQgd2l0aFxuICoge0BsaW5rIGNsaWNrRWxlbWVudH0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIGhvdmVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBuZXZlciByZXNvbHZlcyBcdTIwMTQgdGhlIGNhbGwgdGhyb3dzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaG92ZXJFbGVtZW50KHBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdldFNlYW1GdW5jdGlvbignaG92ZXJFbGVtZW50JykocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBBbHdheXMgdGhyb3dzOiBhIHRvdWNoIHNjcmVlbiBoYXMgbm8gcGVyc2lzdGVudCBwb2ludGVyIHRvIG1vdmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2aWV3cG9ydCBjb29yZGluYXRlcyB0byBtb3ZlIHRvLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBuZXZlciByZXNvbHZlcyBcdTIwMTQgdGhlIGNhbGwgdGhyb3dzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbW92ZU1vdXNlKHBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdldFNlYW1GdW5jdGlvbignbW92ZU1vdXNlJykocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBQcmVzc2VzIGEgc2luZ2xlIGtleSB1c2luZyAqKnRydXN0ZWQqKiBrZXlib2FyZCBpbnB1dCwgaW5qZWN0ZWQgYnkgdGhlIGhvc3Qgb3ZlciBDRFAuXG4gKlxuICogTmFtZWQga2V5cyAoYCdFbnRlcidgLCBgJ0VzY2FwZSdgLCBgJ1RhYidgLCBgJ0JhY2tzcGFjZSdgLCBgJ0RlbGV0ZSdgLCB0aGUgYXJyb3dzKSBhbmQgc2luZ2xlIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBhcmUgc3VwcG9ydGVkOyBhbnl0aGluZyBlbHNlIHRocm93cyByYXRoZXIgdGhhbiBwcmVzc2luZyBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUga2V5IHRvIHByZXNzIGFuZCBhbnkgbW9kaWZpZXJzIHRvIGhvbGQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGtleSBwcmVzcyBoYXMgYmVlbiBpbmplY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXNzS2V5KHBhcmFtczogUHJlc3NLZXlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2V0U2VhbUZ1bmN0aW9uKCdwcmVzc0tleScpKHBhcmFtcyk7XG59XG5cbi8qKlxuICogVHlwZXMgdGV4dCBpbnRvIGEgQ29kZU1pcnJvciBlZGl0b3IgdXNpbmcgKip0cnVzdGVkKioga2V5Ym9hcmQgaW5wdXQsIGluamVjdGVkIGJ5IHRoZSBob3N0IG92ZXIgQ0RQLlxuICpcbiAqIEZvY3VzZXMgdGhlIGVkaXRvciAoY2FyZXQgdG8gdGhlIGVuZCksIHByZXNzZXMgZXZlcnkgY29kZSBwb2ludCBvZiB0aGUgdGV4dCwgdGhlbiBwb2xscyB1bnRpbCB0aGVcbiAqIGRvY3VtZW50IHJlZmxlY3RzIHRoZSBpbnB1dCBvciBhIGJvdW5kZWQgdGltZW91dCBlbGFwc2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWRpdG9yIHRvIHR5cGUgaW50byBhbmQgdGhlIHRleHQgdG8gdHlwZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUga2V5c3Ryb2tlcyBoYXZlIHNldHRsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0eXBlSW50b0VkaXRvcihwYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdldFNlYW1GdW5jdGlvbigndHlwZUludG9FZGl0b3InKShwYXJhbXMpO1xufVxuXG4vKipcbiAqIEFsd2F5cyB0aHJvd3MsIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIGhvdmVyRWxlbWVudH06IHRoZXJlIGlzIG5vIGA6aG92ZXJgIHN0YXRlIHRvIGNsZWFyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWxlbWVudCB0byBtb3ZlIHRoZSBwb2ludGVyIGF3YXkgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgbmV2ZXIgcmVzb2x2ZXMgXHUyMDE0IHRoZSBjYWxsIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVuaG92ZXJFbGVtZW50KHBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZ2V0U2VhbUZ1bmN0aW9uKCd1bmhvdmVyRWxlbWVudCcpKHBhcmFtcyk7XG59XG5cbmZ1bmN0aW9uIGdldFNlYW1GdW5jdGlvbjxLZXkgZXh0ZW5kcyBrZXlvZiBUcnVzdGVkSW5wdXRTZWFtPihuYW1lOiBLZXkpOiBUcnVzdGVkSW5wdXRTZWFtW0tleV0ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9uby1nbG9iYWwtdGhpcyAtLSBUaGUgaGFybmVzcyBpbnN0YWxscyBpdHMgbmFtZXNwYWNlIG9uIHRoZSByZWFsbSBnbG9iYWw7IHRoZXJlIGlzIG5vd2hlcmUgZWxzZSB0byByZWFkIGl0IGZyb20uXG4gIGNvbnN0IGhvbGRlciA9IGdsb2JhbFRoaXMgYXMgUGFydGlhbDxPYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gIGNvbnN0IHNlYW1GdW5jdGlvbiA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy50cnVzdGVkSW5wdXQ/LltuYW1lXTtcbiAgaWYgKCFzZWFtRnVuY3Rpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVHJ1c3RlZCBpbnB1dCBpcyB1bmF2YWlsYWJsZSBvbiBtb2JpbGU6IFxcYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnRydXN0ZWRJbnB1dC4ke25hbWV9XFxgIGlzIG5vdCBpbnN0YWxsZWQuIGBcbiAgICAgICAgKyAnQSBwaG9uZSBoYXMgbm8gaW4tcmVuZGVyZXIgcm91dGUgdG8gYSB0cnVzdGVkIGV2ZW50LCBzbyB0aGUgaW5qZWN0aW9uIGlzIGEgcm91bmQtdHJpcCB0byB0aGUgaG9zdCBvdmVyIHRoZSAnXG4gICAgICAgICsgJ2BvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nYCBBcHBpdW0gdHJhbnNwb3J0XFwncyBjaGFubmVsIFx1MjAxNCB3aGljaCBtZWFucyB0aGVzZSBoZWxwZXJzIG9ubHkgd29yayBpbnNpZGUgYW4gYXBwIHRoYXQgJ1xuICAgICAgICArICdoYXJuZXNzIGJvb3RzdHJhcHBlZC4nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzZWFtRnVuY3Rpb247XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0ZBLGVBQXNCLGFBQWEsUUFBMkM7QUFDNUUsUUFBTSxnQkFBZ0IsY0FBYyxFQUFFLE1BQU07QUFDOUM7QUFXQSxlQUFzQixXQUFXLFFBQXlDO0FBQ3hFLFFBQU0sZ0JBQWdCLFlBQVksRUFBRSxNQUFNO0FBQzVDO0FBWUEsZUFBc0IsYUFBYSxRQUEyQztBQUM1RSxRQUFNLGdCQUFnQixjQUFjLEVBQUUsTUFBTTtBQUM5QztBQVFBLGVBQXNCLFVBQVUsUUFBd0M7QUFDdEUsUUFBTSxnQkFBZ0IsV0FBVyxFQUFFLE1BQU07QUFDM0M7QUFXQSxlQUFzQixTQUFTLFFBQXVDO0FBQ3BFLFFBQU0sZ0JBQWdCLFVBQVUsRUFBRSxNQUFNO0FBQzFDO0FBV0EsZUFBc0IsZUFBZSxRQUE2QztBQUNoRixRQUFNLGdCQUFnQixnQkFBZ0IsRUFBRSxNQUFNO0FBQ2hEO0FBUUEsZUFBc0IsZUFBZSxRQUE2QztBQUNoRixRQUFNLGdCQUFnQixnQkFBZ0IsRUFBRSxNQUFNO0FBQ2hEO0FBRUEsU0FBUyxnQkFBb0QsTUFBa0M7QUFFN0YsUUFBTSxTQUFTO0FBQ2YsUUFBTSxlQUFlLE9BQU8sOEJBQThCLGVBQWUsSUFBSTtBQUM3RSxNQUFJLENBQUMsY0FBYztBQUNqQixVQUFNLElBQUk7QUFBQSxNQUNSLDhGQUE4RixJQUFJO0FBQUEsSUFJcEc7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vYmlsZS10cnVzdGVkLWlucHV0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogTW9iaWxlLW9ubHkgdHJ1c3RlZCBpbnB1dCBoZWxwZXJzLiBUaGVyZSBpcyBubyBpbi1yZW5kZXJlciByb3V0ZSB0byBhIHRydXN0ZWQgZXZlbnQgb24gYSBwaG9uZSBcdTIwMTRcbiAqIGB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudGAgaXMgRWxlY3Ryb24tb25seSBhbmQgYSBkaXNwYXRjaGVkIGV2ZW50IGlzIHVudHJ1c3RlZCBcdTIwMTQgc28gdGhlIGluamVjdGlvblxuICogaGFzIHRvIGJlIGEgcm91bmQtdHJpcDogdGhlIHJlcXVlc3QgZ29lcyB0byB0aGUgaG9zdCBvdmVyIHRoZSBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AgaGFybmVzcydzXG4gKiBiaW5kaW5nIGNoYW5uZWwsIGFuZCB0aGUgaG9zdCBpbmplY3RzIGl0IGludG8gdGhlIFdlYlZpZXcgb3ZlciBDRFAgXHUyMDE0IGFzIGBJbnB1dC5kaXNwYXRjaFRvdWNoRXZlbnRgIGZvclxuICogYSB0YXAgYnV0IGBJbnB1dC5zeW50aGVzaXplVGFwR2VzdHVyZWAgZm9yIGEgbG9uZy1wcmVzcywgYmVjYXVzZSBgZGlzcGF0Y2hUb3VjaEV2ZW50YCBpbmplY3RzIHBhc3RcbiAqIEFuZHJvaWQncyBnZXN0dXJlIHJlY29nbml6ZXIgYW5kIHNvIGlzIGNsYXNzaWZpZWQgYXMgYSB0YXAgYXQgYW55IGR3ZWxsLlxuICpcbiAqIFRoYXQgY2hhbm5lbCBpcyBpbnN0YWxsZWQgYnkgdGhlIGhhcm5lc3MncyBBcHBpdW0gdHJhbnNwb3J0LCBzbyB0aGVzZSBoZWxwZXJzICoqZGVsZWdhdGUqKiB0byB0aGVcbiAqIGhhcm5lc3MgcmF0aGVyIHRoYW4gcmVpbXBsZW1lbnRpbmcgdGhlIHdpcmUgZm9ybWF0OiB0aGV5IGNhbGxcbiAqIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy50cnVzdGVkSW5wdXQuKmAsIHdoaWNoIGhvbGRzIHRoZSB2ZXJ5IGZ1bmN0aW9uIG9iamVjdHMgdGhlIGhhcm5lc3NcbiAqIHNlZWRzIGludG8gYW4gYGV2YWxJbk9ic2lkaWFuYCBjbG9zdXJlJ3MgYGxpYmAgYmFnLiBEZWxlZ2F0aW5nIGlzIHdoYXQga2VlcHMgdGhlIG1vYmlsZSBzZW1hbnRpY3MgXHUyMDE0XG4gKiB0YXAsIGxvbmctcHJlc3MgZm9yIGBidXR0b246ICdyaWdodCdgLCBhIHRocm93IGZvciBgJ21pZGRsZSdgLCB0aGUgYHByZXNzS2V5YCBrZXkgc2V0LCBhbmQgdGhlIHRocm93c1xuICogZm9yIHRoZSBgOmhvdmVyYCBoZWxwZXJzIFx1MjAxNCBpZGVudGljYWwgdG8gdGhlIGhhcm5lc3MncyBvd24gY29weSBmb3IgZnJlZSwgaW5zdGVhZCBvZiBhIHNlY29uZFxuICogaW1wbGVtZW50YXRpb24gdG8gaGFuZC1zeW5jIChzZWUgdGhlIHByb2plY3QgYEFHRU5UUy5tZGAgKipMNCoqKS5cbiAqXG4gKiBUaGUgbmFtZXNwYWNlIHNoYXBlIGlzIGRlY2xhcmVkICoqbG9jYWxseSoqOiB0aGUgaGFybmVzcyBtdXN0IG5ldmVyIGJlIGEgZGVwZW5kZW5jeSBvZiB0aGlzIGxpYnJhcnksIGluXG4gKiBlaXRoZXIgZGlyZWN0aW9uLCBhdCBydW50aW1lIG9yIGluIHR5cGVzLlxuICpcbiAqICoqQ29uc2VxdWVuY2UsIGFuZCBpdCBpcyBkZWxpYmVyYXRlOioqIHRoZXNlIGhlbHBlcnMgb25seSB3b3JrIGluc2lkZSBhbiBhcHAgdGhlIGhhcm5lc3MgYm9vdHN0cmFwcGVkLlxuICogT3V0c2lkZSBvbmUgdGhleSB0aHJvdyBhIG1lc3NhZ2Ugc2F5aW5nIHNvLCByYXRoZXIgdGhhbiBzaWxlbnRseSBkb2luZyBub3RoaW5nIFx1MjAxNCBhIG5vLW9wIHdvdWxkIHJlY3JlYXRlXG4gKiBleGFjdGx5IHRoZSBmYWxzZS1jb25maWRlbmNlIGZhaWx1cmUgdHJ1c3RlZCBpbnB1dCBleGlzdHMgdG8gZW5kLiBDb25zdW1lcnMgd2FudGluZyB0aGUgcGxhdGZvcm0tY29ycmVjdFxuICogaGVscGVyIHNob3VsZCBpbXBvcnQgdGhlIHtAbGluayAuLi90cnVzdGVkLWlucHV0LnRzIHwgdHJ1c3RlZC1pbnB1dH0gZmFjYWRlIGluc3RlYWQgb2YgdGhpcyBtb2R1bGUuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBQcmVzc0tleVBhcmFtcyxcbiAgVHlwZUludG9FZGl0b3JQYXJhbXMsXG4gIFVuaG92ZXJFbGVtZW50UGFyYW1zXG4gIC8vIFRoZSBwYXJhbWV0ZXIgY29udHJhY3RzIGxpdmUgd2l0aCB0aGUgZGVza3RvcCB0d2luIGFuZCBhcmUgc2hhcmVkIHZlcmJhdGltLCBzbyB0aGUgdHdvIHBsYXRmb3Jtc1xuICAvLyBDYW5ub3QgZHJpZnQgYXBhcnQgb24gd2hhdCBhIGNhbGxlciBwYXNzZXMuIEEgdHlwZS1vbmx5IGltcG9ydCBsb2FkcyBub3RoaW5nIChMNSkuXG59IGZyb20gJy4vZGVza3RvcC10cnVzdGVkLWlucHV0LnRzJztcblxuLyoqXG4gKiBUaGUgZ2xvYmFsIHRoZSBoYXJuZXNzIGJvb3RzdHJhcHMgaXRzIG5hbWVzcGFjZSBvbnRvLlxuICovXG5pbnRlcmZhY2UgT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXIge1xuICBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nOiBPYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZTtcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiB0aGUgaGFybmVzcyBuYW1lc3BhY2UgdGhpcyBtb2R1bGUgcmVhZHMuIEV2ZXJ5dGhpbmcgZWxzZSBvbiBpdCBpcyBub25lIG9mIHRoaXMgbW9kdWxlJ3NcbiAqIGJ1c2luZXNzLlxuICovXG5pbnRlcmZhY2UgT2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2Uge1xuICB0cnVzdGVkSW5wdXQ/OiBQYXJ0aWFsPFRydXN0ZWRJbnB1dFNlYW0+O1xufVxuXG4vKipcbiAqIFRoZSB0cnVzdGVkLWlucHV0IHNlYW0gdGhlIGBvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nYCBoYXJuZXNzIHB1Ymxpc2hlcyBvbiBpdHMgbmFtZXNwYWNlLlxuICpcbiAqIERlY2xhcmVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wb3J0ZWQ6IHRoZSBoYXJuZXNzIGlzIG5vdCBhIGRlcGVuZGVuY3kgb2YgdGhpcyBsaWJyYXJ5LiBJdCBtaXJyb3JzXG4gKiBgbmFtZXNwYWNlLWJvb3RzdHJhcC50c2AncyBgdHJ1c3RlZElucHV0YCBvYmplY3QsIGFuZCB0aGUgbWlycm9yaW5nIGlzIGJ5IGhhbmQgXHUyMDE0IHRoZSBzYW1lXG4gKiBiZWhhdmlvcmFsLXN5bmMgb2JsaWdhdGlvbiB0aGUgZGVza3RvcCB0d2luIGNhcnJpZXMuXG4gKi9cbmludGVyZmFjZSBUcnVzdGVkSW5wdXRTZWFtIHtcbiAgY2xpY2tFbGVtZW50KHBhcmFtczogQ2xpY2tFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgY2xpY2tNb3VzZShwYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICBob3ZlckVsZW1lbnQocGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICBtb3ZlTW91c2UocGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICBwcmVzc0tleShwYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgdHlwZUludG9FZGl0b3IocGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIHVuaG92ZXJFbGVtZW50KHBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIENsaWNrcyB0aGUgY2VudGVyIG9mIGFuIGVsZW1lbnQgdXNpbmcgKip0cnVzdGVkKiogdG91Y2ggaW5wdXQsIGluamVjdGVkIGludG8gdGhlIFdlYlZpZXcgYnkgdGhlIGhvc3RcbiAqIG92ZXIgQ0RQLlxuICpcbiAqIFRoZSBlbGVtZW50LXJlbGF0aXZlIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBjbGlja01vdXNlfS4gYGJ1dHRvbjogJ3JpZ2h0J2AgaXMgdGhlIGxvbmctcHJlc3MgdGhhdCBvcGVuc1xuICogT2JzaWRpYW4gTW9iaWxlJ3MgY29udGV4dCBtZW51OyBgJ21pZGRsZSdgIHRocm93cywgYmVjYXVzZSB0b3VjaCBoYXMgbm8gZ2VzdHVyZSBmb3IgaXQgYW5kIGludmVudGluZ1xuICogb25lIHdvdWxkIGJlIHdvcnNlIHRoYW4gc2F5aW5nIHNvLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWxlbWVudCB0byBjbGljaywgdGhlIGJ1dHRvbiB0byBwcmVzcyBhbmQgYW55IG1vZGlmaWVycyB0byBob2xkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjbGljayBoYXMgYmVlbiBpbmplY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsaWNrRWxlbWVudChwYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBnZXRTZWFtRnVuY3Rpb24oJ2NsaWNrRWxlbWVudCcpKHBhcmFtcyk7XG59XG5cbi8qKlxuICogQ2xpY2tzIGF0IHRoZSBnaXZlbiB2aWV3cG9ydCBjb29yZGluYXRlcyB1c2luZyAqKnRydXN0ZWQqKiB0b3VjaCBpbnB1dCwgaW5qZWN0ZWQgYnkgdGhlIGhvc3Qgb3ZlciBDRFAuXG4gKlxuICogVGhlIGNvb3JkaW5hdGVzIGFyZSBDU1MgcGl4ZWxzIGluIHRoZSBXZWJWaWV3J3Mgb3duIHZpZXdwb3J0IFx1MjAxNCB3aGljaCBpcyB3aGF0IENEUCB0YWtlcyBcdTIwMTQgc29cbiAqIGBkZXZpY2VQaXhlbFJhdGlvYCBuZXZlciBlbnRlcnMgdGhlIHBpY3R1cmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2aWV3cG9ydCBjb29yZGluYXRlcyB0byBjbGljayBhdCwgdGhlIGJ1dHRvbiB0byBwcmVzcyBhbmQgYW55IG1vZGlmaWVycyB0byBob2xkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjbGljayBoYXMgYmVlbiBpbmplY3RlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsaWNrTW91c2UocGFyYW1zOiBDbGlja01vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdldFNlYW1GdW5jdGlvbignY2xpY2tNb3VzZScpKHBhcmFtcyk7XG59XG5cbi8qKlxuICogQWx3YXlzIHRocm93czogYDpob3ZlcmAgaGFzIG5vIHRvdWNoIGVxdWl2YWxlbnQuXG4gKlxuICogQSBzaWxlbnQgbm8tb3AgaGVyZSB3b3VsZCBsZXQgYSBob3ZlciB0ZXN0IHBhc3Mgb24gYSBwaG9uZSB3aXRob3V0IGhvdmVyaW5nIGFueXRoaW5nLCBzbyB0aGUgbW9iaWxlIGFybVxuICogcmVmdXNlcyBpbnN0ZWFkLiBHYXRlIHRoZSBhc3NlcnRpb24gb24gYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAsIG9yIGRyaXZlIHRoZSBlbGVtZW50IHdpdGhcbiAqIHtAbGluayBjbGlja0VsZW1lbnR9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWxlbWVudCB0byBob3Zlci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgbmV2ZXIgcmVzb2x2ZXMgXHUyMDE0IHRoZSBjYWxsIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhvdmVyRWxlbWVudChwYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBnZXRTZWFtRnVuY3Rpb24oJ2hvdmVyRWxlbWVudCcpKHBhcmFtcyk7XG59XG5cbi8qKlxuICogQWx3YXlzIHRocm93czogYSB0b3VjaCBzY3JlZW4gaGFzIG5vIHBlcnNpc3RlbnQgcG9pbnRlciB0byBtb3ZlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdmlld3BvcnQgY29vcmRpbmF0ZXMgdG8gbW92ZSB0by5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgbmV2ZXIgcmVzb2x2ZXMgXHUyMDE0IHRoZSBjYWxsIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1vdmVNb3VzZShwYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBnZXRTZWFtRnVuY3Rpb24oJ21vdmVNb3VzZScpKHBhcmFtcyk7XG59XG5cbi8qKlxuICogUHJlc3NlcyBhIHNpbmdsZSBrZXkgdXNpbmcgKip0cnVzdGVkKioga2V5Ym9hcmQgaW5wdXQsIGluamVjdGVkIGJ5IHRoZSBob3N0IG92ZXIgQ0RQLlxuICpcbiAqIE5hbWVkIGtleXMgKGAnRW50ZXInYCwgYCdFc2NhcGUnYCwgYCdUYWInYCwgYCdCYWNrc3BhY2UnYCwgYCdEZWxldGUnYCwgdGhlIGFycm93cykgYW5kIHNpbmdsZSBwcmludGFibGVcbiAqIGNoYXJhY3RlcnMgYXJlIHN1cHBvcnRlZDsgYW55dGhpbmcgZWxzZSB0aHJvd3MgcmF0aGVyIHRoYW4gcHJlc3Npbmcgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGtleSB0byBwcmVzcyBhbmQgYW55IG1vZGlmaWVycyB0byBob2xkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBrZXkgcHJlc3MgaGFzIGJlZW4gaW5qZWN0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVzc0tleShwYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdldFNlYW1GdW5jdGlvbigncHJlc3NLZXknKShwYXJhbXMpO1xufVxuXG4vKipcbiAqIFR5cGVzIHRleHQgaW50byBhIENvZGVNaXJyb3IgZWRpdG9yIHVzaW5nICoqdHJ1c3RlZCoqIGtleWJvYXJkIGlucHV0LCBpbmplY3RlZCBieSB0aGUgaG9zdCBvdmVyIENEUC5cbiAqXG4gKiBGb2N1c2VzIHRoZSBlZGl0b3IgKGNhcmV0IHRvIHRoZSBlbmQpLCBwcmVzc2VzIGV2ZXJ5IGNvZGUgcG9pbnQgb2YgdGhlIHRleHQsIHRoZW4gcG9sbHMgdW50aWwgdGhlXG4gKiBkb2N1bWVudCByZWZsZWN0cyB0aGUgaW5wdXQgb3IgYSBib3VuZGVkIHRpbWVvdXQgZWxhcHNlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVkaXRvciB0byB0eXBlIGludG8gYW5kIHRoZSB0ZXh0IHRvIHR5cGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGtleXN0cm9rZXMgaGF2ZSBzZXR0bGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IocGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBnZXRTZWFtRnVuY3Rpb24oJ3R5cGVJbnRvRWRpdG9yJykocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBBbHdheXMgdGhyb3dzLCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHtAbGluayBob3ZlckVsZW1lbnR9OiB0aGVyZSBpcyBubyBgOmhvdmVyYCBzdGF0ZSB0byBjbGVhci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgcG9pbnRlciBhd2F5IGZyb20uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IG5ldmVyIHJlc29sdmVzIFx1MjAxNCB0aGUgY2FsbCB0aHJvd3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudChwYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGdldFNlYW1GdW5jdGlvbigndW5ob3ZlckVsZW1lbnQnKShwYXJhbXMpO1xufVxuXG5mdW5jdGlvbiBnZXRTZWFtRnVuY3Rpb248S2V5IGV4dGVuZHMga2V5b2YgVHJ1c3RlZElucHV0U2VhbT4obmFtZTogS2V5KTogVHJ1c3RlZElucHV0U2VhbVtLZXldIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvbm8tZ2xvYmFsLXRoaXMgLS0gVGhlIGhhcm5lc3MgaW5zdGFsbHMgaXRzIG5hbWVzcGFjZSBvbiB0aGUgcmVhbG0gZ2xvYmFsOyB0aGVyZSBpcyBub3doZXJlIGVsc2UgdG8gcmVhZCBpdCBmcm9tLlxuICBjb25zdCBob2xkZXIgPSBnbG9iYWxUaGlzIGFzIFBhcnRpYWw8T2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICBjb25zdCBzZWFtRnVuY3Rpb24gPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8udHJ1c3RlZElucHV0Py5bbmFtZV07XG4gIGlmICghc2VhbUZ1bmN0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRydXN0ZWQgaW5wdXQgaXMgdW5hdmFpbGFibGUgb24gbW9iaWxlOiBcXGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy50cnVzdGVkSW5wdXQuJHtuYW1lfVxcYCBpcyBub3QgaW5zdGFsbGVkLiBgXG4gICAgICAgICsgJ0EgcGhvbmUgaGFzIG5vIGluLXJlbmRlcmVyIHJvdXRlIHRvIGEgdHJ1c3RlZCBldmVudCwgc28gdGhlIGluamVjdGlvbiBpcyBhIHJvdW5kLXRyaXAgdG8gdGhlIGhvc3Qgb3ZlciB0aGUgJ1xuICAgICAgICArICdgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AgQXBwaXVtIHRyYW5zcG9ydFxcJ3MgY2hhbm5lbCBcdTIwMTQgd2hpY2ggbWVhbnMgdGhlc2UgaGVscGVycyBvbmx5IHdvcmsgaW5zaWRlIGFuIGFwcCB0aGF0ICdcbiAgICAgICAgKyAnaGFybmVzcyBib290c3RyYXBwZWQuJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gc2VhbUZ1bmN0aW9uO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtGQSxlQUFzQixhQUFhLFFBQTJDO0FBQzVFLFFBQU0sZ0JBQWdCLGNBQWMsRUFBRSxNQUFNO0FBQzlDO0FBV0EsZUFBc0IsV0FBVyxRQUF5QztBQUN4RSxRQUFNLGdCQUFnQixZQUFZLEVBQUUsTUFBTTtBQUM1QztBQVlBLGVBQXNCLGFBQWEsUUFBMkM7QUFDNUUsUUFBTSxnQkFBZ0IsY0FBYyxFQUFFLE1BQU07QUFDOUM7QUFRQSxlQUFzQixVQUFVLFFBQXdDO0FBQ3RFLFFBQU0sZ0JBQWdCLFdBQVcsRUFBRSxNQUFNO0FBQzNDO0FBV0EsZUFBc0IsU0FBUyxRQUF1QztBQUNwRSxRQUFNLGdCQUFnQixVQUFVLEVBQUUsTUFBTTtBQUMxQztBQVdBLGVBQXNCLGVBQWUsUUFBNkM7QUFDaEYsUUFBTSxnQkFBZ0IsZ0JBQWdCLEVBQUUsTUFBTTtBQUNoRDtBQVFBLGVBQXNCLGVBQWUsUUFBNkM7QUFDaEYsUUFBTSxnQkFBZ0IsZ0JBQWdCLEVBQUUsTUFBTTtBQUNoRDtBQUVBLFNBQVMsZ0JBQW9ELE1BQWtDO0FBRTdGLFFBQU0sU0FBUztBQUNmLFFBQU0sZUFBZSxPQUFPLDhCQUE4QixlQUFlLElBQUk7QUFDN0UsTUFBSSxDQUFDLGNBQWM7QUFDakIsVUFBTSxJQUFJO0FBQUEsTUFDUiw4RkFBOEYsSUFBSTtBQUFBLElBSXBHO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -3,5 +3,8 @@ export * as 'obsidian-plugin-repo-paths' from './obsidian-plugin-repo-paths.mjs'
|
|
|
3
3
|
export * as 'plugin-api' from './plugin-api.mjs';
|
|
4
4
|
export * as 'plugin-context' from './plugin-context.mjs';
|
|
5
5
|
export * as 'plugin-event-source' from './plugin-event-source.mjs';
|
|
6
|
+
export * as 'plugin-install-state' from './plugin-install-state.mjs';
|
|
7
|
+
export * as 'plugin-lifecycle-events' from './plugin-lifecycle-events.mjs';
|
|
6
8
|
export * as 'plugin-settings-tab' from './plugin-settings-tab.mjs';
|
|
7
9
|
export * as 'plugin' from './plugin.mjs';
|
|
10
|
+
export * as 'settings-migration-api' from './settings-migration-api.mjs';
|
|
@@ -45,14 +45,20 @@ import * as obsidian_plugin_repo_paths from "./obsidian-plugin-repo-paths.mjs";
|
|
|
45
45
|
import * as plugin_api from "./plugin-api.mjs";
|
|
46
46
|
import * as plugin_context from "./plugin-context.mjs";
|
|
47
47
|
import * as plugin_event_source from "./plugin-event-source.mjs";
|
|
48
|
+
import * as plugin_install_state from "./plugin-install-state.mjs";
|
|
49
|
+
import * as plugin_lifecycle_events from "./plugin-lifecycle-events.mjs";
|
|
48
50
|
import * as plugin_settings_tab from "./plugin-settings-tab.mjs";
|
|
49
51
|
import * as plugin from "./plugin.mjs";
|
|
52
|
+
import * as settings_migration_api from "./settings-migration-api.mjs";
|
|
50
53
|
export {
|
|
51
54
|
obsidian_plugin_repo_paths as "obsidian-plugin-repo-paths",
|
|
52
55
|
plugin,
|
|
53
56
|
plugin_api as "plugin-api",
|
|
54
57
|
plugin_context as "plugin-context",
|
|
55
58
|
plugin_event_source as "plugin-event-source",
|
|
56
|
-
|
|
59
|
+
plugin_install_state as "plugin-install-state",
|
|
60
|
+
plugin_lifecycle_events as "plugin-lifecycle-events",
|
|
61
|
+
plugin_settings_tab as "plugin-settings-tab",
|
|
62
|
+
settings_migration_api as "settings-migration-api"
|
|
57
63
|
};
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdvYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocycgZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tcmVwby1wYXRocy50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWFwaScgZnJvbSAnLi9wbHVnaW4tYXBpLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4tY29udGV4dCcgZnJvbSAnLi9wbHVnaW4tY29udGV4dC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWV2ZW50LXNvdXJjZScgZnJvbSAnLi9wbHVnaW4tZXZlbnQtc291cmNlLnRzJztcbmV4cG9ydCAqIGFzICdwbHVnaW4taW5zdGFsbC1zdGF0ZScgZnJvbSAnLi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWxpZmVjeWNsZS1ldmVudHMnIGZyb20gJy4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy10YWInIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luJyBmcm9tICcuL3BsdWdpbi50cyc7XG5leHBvcnQgKiBhcyAnc2V0dGluZ3MtbWlncmF0aW9uLWFwaScgZnJvbSAnLi9zZXR0aW5ncy1taWdyYXRpb24tYXBpLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxZQUFZQSxnQ0FBa0M7QUFDOUMsWUFBWUMsZ0JBQWtCO0FBQzlCLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZQyx5QkFBMkI7QUFDdkMsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVlDLDZCQUErQjtBQUMzQyxZQUFZQyx5QkFBMkI7QUFDdkMsWUFBWSxZQUFjO0FBQzFCLFlBQVlDLDRCQUE4QjsiLAogICJuYW1lcyI6IFsib2JzaWRpYW4tcGx1Z2luLXJlcG8tcGF0aHMiLCAicGx1Z2luLWFwaSIsICJwbHVnaW4tY29udGV4dCIsICJwbHVnaW4tZXZlbnQtc291cmNlIiwgInBsdWdpbi1pbnN0YWxsLXN0YXRlIiwgInBsdWdpbi1saWZlY3ljbGUtZXZlbnRzIiwgInBsdWdpbi1zZXR0aW5ncy10YWIiLCAic2V0dGluZ3MtbWlncmF0aW9uLWFwaSJdCn0K
|
|
@@ -131,6 +131,32 @@ export declare enum PluginApiUnavailabilityReason {
|
|
|
131
131
|
* declared method names are checked with `typeof`, and the payloads are validated per method instead.
|
|
132
132
|
*/
|
|
133
133
|
export type PluginApiContract = Record<string, PluginApiMethodContract>;
|
|
134
|
+
/**
|
|
135
|
+
* One API a plugin exposes: the object, the contract version it satisfies, and optionally the contract
|
|
136
|
+
* itself. This is {@link PublishPluginApiParams} without the publishing plugin, so a plugin can DECLARE what
|
|
137
|
+
* it exposes without also stating who is publishing it — which is what lets `PluginBase.getPluginApis` collect
|
|
138
|
+
* the declarations and do the publishing itself.
|
|
139
|
+
*
|
|
140
|
+
* @typeParam TApi - The API type being declared.
|
|
141
|
+
*/
|
|
142
|
+
export interface PluginApiDeclaration<TApi extends object = object> {
|
|
143
|
+
/**
|
|
144
|
+
* The API object to publish. Its methods are handed to consumers through a revocable handle, and they are
|
|
145
|
+
* always invoked with this object as their `this`, so an implementation using private class fields keeps
|
|
146
|
+
* working.
|
|
147
|
+
*/
|
|
148
|
+
readonly api: TApi;
|
|
149
|
+
/**
|
|
150
|
+
* The CONTRACT version, in semver form — independent of the plugin's own version. Plugin `1.4.7` may
|
|
151
|
+
* perfectly well expose API `2.0.0`.
|
|
152
|
+
*/
|
|
153
|
+
readonly apiVersion: string;
|
|
154
|
+
/**
|
|
155
|
+
* The contract this version of the API satisfies. Optional: when omitted, no shape check is performed on
|
|
156
|
+
* the provider's behalf and the consumer's own contract (if any) is used instead.
|
|
157
|
+
*/
|
|
158
|
+
readonly contract?: PluginApiContract;
|
|
159
|
+
}
|
|
134
160
|
/**
|
|
135
161
|
* The payload schemas for a single API method. Both halves are optional: a method may declare only its input,
|
|
136
162
|
* only its output, neither (the entry then just declares that the method must exist), or both.
|
|
@@ -229,23 +255,16 @@ export interface PluginApiValidationErrorConstructorParams {
|
|
|
229
255
|
*
|
|
230
256
|
* @typeParam TApi - The API type being published.
|
|
231
257
|
*/
|
|
232
|
-
export interface PublishPluginApiParams<TApi extends object> {
|
|
258
|
+
export interface PublishPluginApiParams<TApi extends object> extends PluginApiDeclaration<TApi> {
|
|
233
259
|
/**
|
|
234
|
-
* The
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
* The CONTRACT version, in semver form — independent of the plugin's own version. Plugin `1.4.7` may
|
|
241
|
-
* perfectly well expose API `2.0.0`.
|
|
242
|
-
*/
|
|
243
|
-
readonly apiVersion: string;
|
|
244
|
-
/**
|
|
245
|
-
* The contract this version of the API satisfies. Optional: when omitted, no shape check is performed on
|
|
246
|
-
* the provider's behalf and the consumer's own contract (if any) is used instead.
|
|
260
|
+
* The component whose unload revokes the record. Defaults to {@link PublishPluginApiParams.plugin}, which is
|
|
261
|
+
* the right owner for an API published for as long as the plugin runs.
|
|
262
|
+
*
|
|
263
|
+
* Pass a narrower one when the API is only valid for part of the plugin's life — a plugin whose feature
|
|
264
|
+
* surface is torn down and rebuilt while the plugin itself stays loaded must revoke with the surface, or it
|
|
265
|
+
* leaves consumers holding handles into code that is no longer there.
|
|
247
266
|
*/
|
|
248
|
-
readonly
|
|
267
|
+
readonly component?: Component;
|
|
249
268
|
/**
|
|
250
269
|
* The publishing plugin. The record is keyed by its `manifest.id` and revoked automatically when the plugin
|
|
251
270
|
* unloads, via `plugin.register()`.
|
|
@@ -232,7 +232,7 @@ function publishPluginApi(params) {
|
|
|
232
232
|
};
|
|
233
233
|
records.push(record);
|
|
234
234
|
notifySubscribers();
|
|
235
|
-
params.plugin.register(() => {
|
|
235
|
+
(params.component ?? params.plugin).register(() => {
|
|
236
236
|
revokeRecord(record);
|
|
237
237
|
});
|
|
238
238
|
}
|
|
@@ -423,4 +423,4 @@ export {
|
|
|
423
423
|
publishPluginApi,
|
|
424
424
|
watchPluginApi
|
|
425
425
|
};
|
|
426
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIFx1MjAxNCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IFx1MjAxNCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwgXHUyMDE0IHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUgXHUyMDE0IGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHM6UGx1Z2luQXBpYCBkZWJ1Z2dlciBpcyBlbmFibGVkLCBzbyBwcm9kdWN0aW9uIHBheXMgbm90aGluZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIGBvYnNpZGlhbi1kZXYtdXRpbHNgLCBzbyBhIHJlZ2lzdHJ5IHJlY29yZCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW5cbiAqIGRpZmZlcmVudCBsaWJyYXJ5IHZlcnNpb25zIGFuZCBtdXN0IHN0YXkgYmFja3dhcmQtY29tcGF0aWJsZSBmb3JldmVyLiBOb3RoaW5nIGNyb3NzaW5nIGl0IG1heSBiZVxuICogYGluc3RhbmNlb2ZgLWNoZWNrZWQgXHUyMDE0IHJlYWRzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgb25seSBwbGFpbiBkYXRhIG9iamVjdHMgYW5kIHBsYWluIGZ1bmN0aW9ucyBhcmUgc3RvcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ29tcG9uZW50LFxuICBQbHVnaW5cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uXG59IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5cbmNvbnN0IFBMVUdJTl9BUElfREVCVUdHRVJfTkFNRVNQQUNFID0gJ1BsdWdpbkFwaSc7XG5jb25zdCBQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSA9ICdwbHVnaW5BcGlSZWdpc3RyeSc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSB3YWl0cyBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAqL1xuY29uc3QgREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGljaCBoYWxmIG9mIGEgbWV0aG9kIGNhbGwgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlQYXlsb2FkS2luZCB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgSW5wdXQgPSAnaW5wdXQnLFxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgT3V0cHV0ID0gJ291dHB1dCdcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgcGx1Z2luIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKlxuICogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBlbnVtIGlzIHRoYXQgdGhlc2UgYXJlIHRvbGQgYXBhcnQuIGBAdmFuYWthdC9wbHVnaW4tYXBpYCBjYW5ub3QgdGVsbCBhbnkgb2YgdGhlbVxuICogYXBhcnQsIGFuZCBub3QgdW5pZm9ybWx5OiBgTm90SW5zdGFsbGVkYCAvIGBOb3RFbmFibGVkYCAvIGBOb3RQdWJsaXNoZWRgIGFsbCByZWR1Y2UgdG8gb25lIGBOb3RpY2VgIHBsdXNcbiAqIGB1bmRlZmluZWRgLCB3aGlsZSBgVmVyc2lvbk1pc21hdGNoYCAvIGBTaGFwZU1pc21hdGNoYCBwcm9kdWNlIE5PIHNpZ25hbCBhdCBhbGwgXHUyMDE0IGl0IG5ldmVyIGV4YW1pbmVzIHdoYXQgaXRcbiAqIGZvdW5kLCBzbyBpdCBoYW5kcyB0aGUgb2JqZWN0IG92ZXIgYW5kIHRoZSBtaXNtYXRjaCBzdXJmYWNlcyBsYXRlciwgc29tZXdoZXJlIGVsc2UsIGFzIHNvbWVib2R5IGVsc2Unc1xuICogYFR5cGVFcnJvcmAuXG4gKlxuICogQHJlbWFya3NcbiAqIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gY2FuIHJlcG9ydCB0aGUgZmlyc3QgZml2ZTsge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWR9XG4gKiBpcyBub3Qgb25lIG9mIHRoZW0sIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgaGFuZGxlIHRoYXQgV0FTIHZhbGlkIGFuZCBpcyBjYXJyaWVkIGJ5XG4gKiB7QGxpbmsgUGx1Z2luQXBpUmV2b2tlZEVycm9yfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBidXQgbm90IGVuYWJsZWQuXG4gICAqL1xuICBOb3RFbmFibGVkID0gJ25vdEVuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCBidXQgaGFzIG5vdCBwdWJsaXNoZWQgYW55IEFQSS5cbiAgICovXG4gIE5vdFB1Ymxpc2hlZCA9ICdub3RQdWJsaXNoZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlIHdhcyB2YWxpZCBidXQgdGhlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZCwgc28gaXQgaGFzIGJlZW4gcmV2b2tlZC5cbiAgICovXG4gIFJldm9rZWQgPSAncmV2b2tlZCcsXG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gcmFuZ2UsIGJ1dCB0aGUgQVBJIG9iamVjdCBpcyBtaXNzaW5nIGEgbWV0aG9kIHRoZSBjb250cmFjdFxuICAgKiBkZWNsYXJlcyBcdTIwMTQgdGhlIHByb3ZpZGVyJ3Mgc2hpcHBlZCBzaGFwZSBhbmQgaXRzIGRlY2xhcmVkIHNoYXBlIGRpc2FncmVlLlxuICAgKi9cbiAgU2hhcGVNaXNtYXRjaCA9ICdzaGFwZU1pc21hdGNoJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwdWJsaXNoZWQgYW4gQVBJLCBidXQgbm8gcHVibGlzaGVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAqL1xuICBWZXJzaW9uTWlzbWF0Y2ggPSAndmVyc2lvbk1pc21hdGNoJ1xufVxuXG4vKipcbiAqIFRoZSBjb250cmFjdCBhIHByb3ZpZGVyIGRlY2xhcmVzIGZvciBpdHMgQVBJOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBpcyBwcm9taXNpbmcgdG8gZXhwb3NlLCBhbmRcbiAqIGl0cyB2YWx1ZSBvcHRpb25hbGx5IGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVGhlIEtFWVMgYXJlIHRoZSBwYXJ0IHRoYXQgYWx3YXlzIG1hdHRlcnMgXHUyMDE0IHRoZXkgZHJpdmUgdGhlIHNoYXBlIGNoZWNrIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcHVibGlzaGVkXG4gKiByZWNvcmQgaXMgdXNhYmxlIGF0IGFsbC4gVGhlIHNjaGVtYXMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IGV2ZXIgY29uc3VsdGVkIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2h5IHRoZSBzaGFwZSBjaGVjayBpcyBhIGB0eXBlb2ZgIHJhdGhlciB0aGFuIGEgc2NoZW1hIG92ZXIgdGhlIHdob2xlIEFQSSBvYmplY3QuIEluIHpvZCA0IGB6LmZ1bmN0aW9uKClgXG4gKiByZXR1cm5zIGEgZnVuY3Rpb24gRkFDVE9SWSwgbm90IGEgc2NoZW1hLCBzbyBpdCBjYW5ub3QgYmUgYSBgei5vYmplY3QoKWAgbWVtYmVyIGRpcmVjdGx5LiBUaGVyZSBpcyBhIGtub3duXG4gKiB3b3JrYXJvdW5kICh6b2QjNDE0MykgXHUyMDE0IGB6LmN1c3RvbSgoZm4pID0+IGZ1bmN0aW9uU2NoZW1hLmltcGxlbWVudChmbikpYCBcdTIwMTQgYW5kIGl0IGRvZXMgYnV5IGNvcnJlY3RcbiAqIGB6LmluZmVyYCB0eXBlcyBmb3IgYSBmdW5jdGlvbiBtZW1iZXIuIEl0IGRvZXMgbm90IGJ1eSBydW50aW1lIHZhbGlkYXRpb24gaGVyZSwgdGhvdWdoOiBgei5jdXN0b21gIGlzIGFcbiAqIGJvb2xlYW4gcHJlZGljYXRlIHRoYXQgcmV0dXJucyBpdHMgaW5wdXQgdW5jaGFuZ2VkLCBzbyB0aGUgdmFsaWRhdGluZyB3cmFwcGVyIGBpbXBsZW1lbnRgIGJ1aWxkcyBpc1xuICogZGlzY2FyZGVkIGFuZCB0aGUgY2hlY2sgY29sbGFwc2VzIGJhY2sgdG8gXCJpcyBpdCBjYWxsYWJsZVwiLiBLZWVwaW5nIHRoYXQgd3JhcHBlciB3b3VsZCBuZWVkIGEgZnVydGhlclxuICogYC50cmFuc2Zvcm0oKWAsIGFuZCB3b3VsZCB0aGVuIG1vdmUgdmFsaWRhdGlvbiBvbnRvIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiBiZWhpbmQgdGhlIGRlYnVnIGdhdGUsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXBpQ29udHJhY3QgPSBSZWNvcmQ8c3RyaW5nLCBQbHVnaW5BcGlNZXRob2RDb250cmFjdD47XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpTWV0aG9kQ29udHJhY3Qge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBcdTIwMTQgb3IsIHdoZW4gdGhlIG1ldGhvZCByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSB2YWx1ZSBpdCByZXNvbHZlcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dD86IFN0YW5kYXJkU2NoZW1hVjE7XG59XG5cbi8qKlxuICogQSBsaXZlIHJlZmVyZW5jZSB0byBhbm90aGVyIHBsdWdpbidzIEFQSS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSByZWYgaXMgdGhlIFdIT0xFIGNvbnN1bWVyIHN1cmZhY2UsIGRlbGliZXJhdGVseS4gQSBwbGFpbiB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IG1vZGVsIHRoaXMgYmVjYXVzZSBpdFxuICogc2V0dGxlcyBvbmNlLCB3aGVyZWFzIGF2YWlsYWJpbGl0eSBpcyBhIHJlcGVhdGluZyBzaWduYWwgKGF2YWlsYWJsZSBcdTIxOTIgZ29uZSBcdTIxOTIgYXZhaWxhYmxlIGFnYWluIGFjcm9zcyBhXG4gKiBkaXNhYmxlL2VuYWJsZSBjeWNsZSkgXHUyMDE0IHdoaWNoIGlzIHdoeSB7QGxpbmsgUGx1Z2luQXBpUmVmLndoZW5BdmFpbGFibGV9IGlzIGEgbWV0aG9kIE9OIHRoZSByZWYgcmF0aGVyIHRoYW5cbiAqIHRoZSB0aGluZyBoYW5kZWQgYmFjay4gVGhlIGBjaGFuZ2VgIGV2ZW50IGV4aXN0cyBmb3IgY29uc3VtZXJzIHRoYXQgbXVzdCByZWFjdCByYXRoZXIgdGhhbiByZWFkLCBhbmQgaXNcbiAqIHNlY29uZGFyeTogaXQgaW1wb3NlcyBubyBjZXJlbW9ueSBvbiB0aGUgY29tbW9uIGNhc2UsIHdoaWNoIGlzIHJlYWRpbmcge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxQbHVnaW5BcGlSZWZFdmVudE1hcD4ge1xuICAvKipcbiAgICogVGhlIEFQSSwgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEFsd2F5cyBjdXJyZW50LCBzeW5jaHJvbm91cywgYW5kIGZyZWUgXHUyMDE0IHRoZSByZWYgbWFpbnRhaW5zIGl0LCBzbyB0aGVyZSBpcyBubyByZWdpc3RyeSBsb29rdXAgcGVyIHJlYWQuXG4gICAqIGBudWxsYCBoZXJlIG1lYW5zIFwibm90IGF2YWlsYWJsZSByaWdodCBub3dcIiwgTk9UIFwibm90IGluc3RhbGxlZFwiOiBkdXJpbmcgYSBjb25zdW1lcidzIGBvbmxvYWRgIHRoZVxuICAgKiBwcm92aWRlciBtYXkgc2ltcGx5IG5vdCBoYXZlIGxvYWRlZCB5ZXQsIGFuZCB0aGUgdmFsdWUgYmVjb21lcyBub24tYG51bGxgIG9uIGl0cyBvd24uXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogbnVsbCB8IFRBcGk7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgQVBJIHRvIGJlY29tZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3YWl0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEFQSS5cbiAgICogQHRocm93cyBBIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yfSB3aG9zZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvci5yZWFzb259IHNheXMgd2hpY2ggb2ZcbiAgICogdGhlIGZpdmUgZmFpbHVyZXMgb2NjdXJyZWQsIGlmIHRoZSBBUEkgZG9lcyBub3QgYmVjb21lIGF2YWlsYWJsZSBiZWZvcmUgdGhlIHRpbWVvdXQgZWxhcHNlcy5cbiAgICovXG4gIHdoZW5BdmFpbGFibGUob3B0aW9ucz86IFdoZW5BdmFpbGFibGVQbHVnaW5BcGlPcHRpb25zKTogUHJvbWlzZTxUQXBpPjtcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnRzIGEge0BsaW5rIFBsdWdpbkFwaVJlZn0gZmlyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmRXZlbnRNYXAge1xuICAvKipcbiAgICogRmlyZWQgd2hlbmV2ZXIge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gY2hhbmdlcyBcdTIwMTQgaW5jbHVkaW5nIHdoZW4gaXQgYmVjb21lcyBgbnVsbGAgYmVjYXVzZSB0aGUgcHJvdmlkZXJcbiAgICogdW5sb2FkZWQuXG4gICAqL1xuICBjaGFuZ2U6IFtdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGV4cGxpY2l0IG1lc3NhZ2UuIFdoZW4gb21pdHRlZCwgb25lIGlzIGRlcml2ZWQgZnJvbSB0aGUgcGx1Z2luIGlkIGFuZCB0aGUgcmVhc29uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGlzc3VlcyB0aGUgc2NoZW1hIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dCBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcHVibGlzaFBsdWdpbkFwaX0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIGJlaW5nIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgb2JqZWN0IHRvIHB1Ymxpc2guIEl0cyBtZXRob2RzIGFyZSBoYW5kZWQgdG8gY29uc3VtZXJzIHRocm91Z2ggYSByZXZvY2FibGUgaGFuZGxlLCBhbmQgdGhleSBhcmVcbiAgICogYWx3YXlzIGludm9rZWQgd2l0aCB0aGlzIG9iamVjdCBhcyB0aGVpciBgdGhpc2AsIHNvIGFuIGltcGxlbWVudGF0aW9uIHVzaW5nIHByaXZhdGUgY2xhc3MgZmllbGRzIGtlZXBzXG4gICAqIHdvcmtpbmcuXG4gICAqL1xuICByZWFkb25seSBhcGk6IFRBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBDT05UUkFDVCB2ZXJzaW9uLCBpbiBzZW12ZXIgZm9ybSBcdTIwMTQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsdWdpbidzIG93biB2ZXJzaW9uLiBQbHVnaW4gYDEuNC43YCBtYXlcbiAgICogcGVyZmVjdGx5IHdlbGwgZXhwb3NlIEFQSSBgMi4wLjBgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udHJhY3QgdGhpcyB2ZXJzaW9uIG9mIHRoZSBBUEkgc2F0aXNmaWVzLiBPcHRpb25hbDogd2hlbiBvbWl0dGVkLCBubyBzaGFwZSBjaGVjayBpcyBwZXJmb3JtZWQgb25cbiAgICogdGhlIHByb3ZpZGVyJ3MgYmVoYWxmIGFuZCB0aGUgY29uc3VtZXIncyBvd24gY29udHJhY3QgKGlmIGFueSkgaXMgdXNlZCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBQbHVnaW5BcGlDb250cmFjdDtcblxuICAvKipcbiAgICogVGhlIHB1Ymxpc2hpbmcgcGx1Z2luLiBUaGUgcmVjb3JkIGlzIGtleWVkIGJ5IGl0cyBgbWFuaWZlc3QuaWRgIGFuZCByZXZva2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luXG4gICAqIHVubG9hZHMsIHZpYSBgcGx1Z2luLnJlZ2lzdGVyKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHdhdGNoUGx1Z2luQXBpfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaFBsdWdpbkFwaVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIGNvbnRyYWN0IHZlcnNpb25zIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC4gVGhlIGhpZ2hlc3QgcHVibGlzaGVkXG4gICAqIHZlcnNpb24gc2F0aXNmeWluZyBpdCB3aW5zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGUgcmFuZ2UgaXMgZXZhbHVhdGVkIGJ5IGBjb21wYXJlLXZlcnNpb25zYCwgd2hpY2ggYWNjZXB0cyBgXmAsIGB+YCwgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGFuZCBgeGBcbiAgICogd2lsZGNhcmRzIFx1MjAxNCBidXQgTk9UIGEgYmFyZSBgKmAuIFNwZWxsIFwiYW55IHZlcnNpb25cIiBhcyBgJz49MC4wLjAnYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb25SYW5nZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLCB1c2VkIHRvIGNsYXNzaWZ5IGEgZmFpbHVyZSBhcyBub3QtaW5zdGFsbGVkIHZzIG5vdC1lbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgb3duaW5nIHRoZSBzdWJzY3JpcHRpb24uIFRoZSB3YXRjaCBpcyB0b3JuIGRvd24gd2hlbiBpdCB1bmxvYWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50OiBDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGUgQ09OU1VNRVIgZXhwZWN0cy4gT3B0aW9uYWwsIGFuZCBpdCB3aW5zIG92ZXIgdGhlIHByb3ZpZGVyJ3MgcHVibGlzaGVkIGNvbnRyYWN0IHdoZW5cbiAgICogc3VwcGxpZWQgXHUyMDE0IGl0IGlzIHRoZSBjb25zdW1lcidzIG93biBjb21waWxlZC1hZ2FpbnN0IGV4cGVjdGF0aW9uLCBzbyBpdCBpcyB0aGUgb25lIHdob3NlIHZpb2xhdGlvbiBpc1xuICAgKiB0aGUgY29uc3VtZXIncyBwcm9ibGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBQbHVnaW5BcGlDb250cmFjdDtcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAwMDBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTWV0aG9kV3JhcHBlcn0uXG4gKi9cbmludGVyZmFjZSBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kQ29udHJhY3Q6IFBsdWdpbkFwaU1ldGhvZENvbnRyYWN0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBkZWJ1ZyBvdXRwdXQuIE5PVCBhIGtleSBcdTIwMTQgc2VlIHtAbGluayBwcm9wZXJ0eUtleX0uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtleSB0aGUgbWV0aG9kIGlzIGFjdHVhbGx5IHJlYWQgYnksIHdoaWNoIG1heSBiZSBhIHN5bWJvbC5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnR5S2V5OiBQcm9wZXJ0eUtleTtcblxuICByZWFkb25seSB0YXJnZXQ6IG9iamVjdDtcbn1cblxuLyoqXG4gKiBUaGUgcmVhbG0tZ2xvYmFsIHJlZ2lzdHJ5IHNoYXJlZCBieSBldmVyeSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjb3B5IGluIHRoZSByZW5kZXJlci5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgcmVjb3JkczogUmVjb3JkPHN0cmluZywgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10+O1xuICBzdWJzY3JpYmVyczogKCgpID0+IHZvaWQpW107XG59XG5cbi8qKlxuICogQSByZWNvcmQgYXMgaXQgc2l0cyBpbiB0aGUgc2hhcmVkIHJlZ2lzdHJ5LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGlzIHRoZSBXSVJFIEZPUk1BVCBiZXR3ZWVuIGRpZmZlcmVudCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjb3BpZXMsIHNvIGl0IGhvbGRzIG5vdGhpbmcgYnV0IHBsYWluIGRhdGFcbiAqIGFuZCBwbGFpbiBmdW5jdGlvbnMsIGFuZCBldmVyeSByZWFkIG9mIGl0IGVsc2V3aGVyZSBpbiB0aGlzIGZpbGUgaXMgc3RydWN0dXJhbC5cbiAqL1xuaW50ZXJmYWNlIFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCB7XG4gIGFwaTogb2JqZWN0O1xuICBhcGlWZXJzaW9uOiBzdHJpbmc7XG4gIGNvbnRyYWN0OiBQbHVnaW5BcGlDb250cmFjdDtcbiAgaXNSZXZva2VkOiBib29sZWFuO1xuICBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB2YWxpZGF0ZVBheWxvYWR9LlxuICovXG5pbnRlcmZhY2UgVmFsaWRhdGVQYXlsb2FkUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjaGVtYTogU3RhbmRhcmRTY2hlbWFWMTtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSG9sZHMgd2hhdCBhIHdhdGNoIG5lZWRzIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0eXBlIGl0IGlzIHR5cGVkIGFnYWluc3QsIHNvIHRoZSB7QGxpbmsgbWl4aW5Bc3luY0V2ZW50c31cbiAqIG1peGluIGhhcyBhIHJlYWwgYmFzZSB0byBleHRlbmQuXG4gKi9cbmFic3RyYWN0IGNsYXNzIFBsdWdpbkFwaVdhdGNoQmFzZSB7XG4gIHByb3RlY3RlZCBoYW5kbGU6IG51bGwgfCBvYmplY3QgPSBudWxsO1xuXG4gIHByb3RlY3RlZCByZWNvcmQ6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSBudWxsO1xuXG4gIC8vIEEgYHByb3RlY3RlZGAgY29uc3RydWN0b3IgaXMgbm90IGFzc2lnbmFibGUgdG8gYEFic3RyYWN0Q29uc3RydWN0b3I8b2JqZWN0PmAsIHdoaWNoIGlzIHdoYXRcbiAgLy8gYG1peGluQXN5bmNFdmVudHNgIGFjY2VwdHMsIHNvIHRoaXMgc3RheXMgcHVibGljIGV2ZW4gdGhvdWdoIG9ubHkgdGhlIHN1YmNsYXNzIGJlbG93IGNhbGxzIGl0LlxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZXJyb3IgZGVzY3JpYmluZyB3aHkgdGhlIEFQSSBpcyBub3QgYXZhaWxhYmxlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNsYXNzaWZpZWQgZXJyb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpOiBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ioe1xuICAgICAgcGx1Z2luSWQ6IHRoaXMucGFyYW1zLnBsdWdpbklkLFxuICAgICAgcmVhc29uOiByZXNvbHZlVW5hdmFpbGFiaWxpdHlSZWFzb24odGhpcy5wYXJhbXMpXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgUGx1Z2luQXBpUmVmSW1wbDxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8UGx1Z2luQXBpUmVmRXZlbnRNYXA+KCkoUGx1Z2luQXBpV2F0Y2hCYXNlKSBpbXBsZW1lbnRzIFBsdWdpbkFwaVJlZjxUQXBpPiB7XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogbnVsbCB8IFRBcGkge1xuICAgIHJldHVybiBjYXN0VG88bnVsbCB8IFRBcGk+KHRoaXMuaGFuZGxlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFdhdGNoUGx1Z2luQXBpUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGVzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIHJlZ2lzdHJ5LCBmaXJpbmcgYGNoYW5nZWAgb25seSB3aGVuIGl0IGFjdHVhbGx5IGNoYW5nZWQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQgPSBzZWxlY3RSZWNvcmQodGhpcy5wYXJhbXMpO1xuICAgIGlmIChyZWNvcmQgPT09IHRoaXMucmVjb3JkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgdGhpcy5oYW5kbGUgPSByZWNvcmQgPT09IG51bGwgPyBudWxsIDogY3JlYXRlUmV2b2NhYmxlSGFuZGxlKHJlY29yZCwgdGhpcy5wYXJhbXMuY29udHJhY3QpO1xuICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgd2hlbkF2YWlsYWJsZShvcHRpb25zPzogV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMpOiBQcm9taXNlPFRBcGk+IHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChjdXJyZW50VmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5XaXRoVGltZW91dDxUQXBpPih7XG4gICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiBhc3luYyAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiA9PiBhd2FpdCB0aGlzLndhaXRGb3JWYWx1ZShhYm9ydFNpZ25hbCksXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IGB3YXRjaFBsdWdpbkFwaShcIiR7dGhpcy5wYXJhbXMucGx1Z2luSWR9XCIpLndoZW5BdmFpbGFibGVgLFxuICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnM/LnRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dIRU5fQVZBSUxBQkxFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclZhbHVlKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VEFwaT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxUQXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCBGSVJTVCBhbmQgaW52b2tlZCB0aHJvdWdoIGEgdGh1bmssIHNvIGBldmVudFJlZmAgaXMgYWxyZWFkeSBib3VuZCBieSB0aGVcbiAgICAgIC8vIFRpbWUgYW55dGhpbmcgY2FuIHJlYWNoIGl0IFx1MjAxNCB3aGljaCBpcyB3aGF0IGxldHMgYGNsZWFuVXBgIGJlIHVuY29uZGl0aW9uYWwgcmF0aGVyIHRoYW4gbnVsbC1ndWFyZGVkLlxuICAgICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKTogdm9pZCB7XG4gICAgICAgIGV2ZW50UmVmLmFzeW5jRXZlbnRTb3VyY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgICAgYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBoYW5kbGVBYm9ydCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUFib3J0KCk6IHZvaWQge1xuICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgIHJlamVjdChhYm9ydFNpZ25hbC5yZWFzb24gYXMgRXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwbHVnaW4gQVBJIGNhbm5vdCBiZSBoYW5kZWQgb3ZlciwgY2FycnlpbmcgdGhlIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbn0gdGhhdCBzYXlzXG4gKiB3aHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5tZXNzYWdlID8/IGBUaGUgQVBJIG9mIHRoZSBwbHVnaW4gXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBpcyB1bmF2YWlsYWJsZTogJHtwYXJhbXMucmVhc29ufS5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcic7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnJlYXNvbiA9IHBhcmFtcy5yZWFzb247XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHByb3BlcnR5IGlzIHJlYWQgZnJvbSBhIGhhbmRsZSB3aG9zZSBwcm92aWRlciBoYXMgc2luY2UgdW5sb2FkZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgcG9pbnQgb2YgaGFuZGluZyBvdXQgYSByZXZvY2FibGUgaGFuZGxlIHJhdGhlciB0aGFuIHRoZSByYXcgb2JqZWN0OiBhIGNvbnN1bWVyIHRoYXQgY2FjaGVkIHRoZVxuICogQVBJIGluIGEgZmllbGQgYW5kIGtlcHQgdXNpbmcgaXQgYWNyb3NzIGEgZGlzYWJsZSBnZXRzIGFuIGVycm9yIG5hbWluZyB0aGUgcHJvdmlkZXIsIGluc3RlYWQgb2ZcbiAqIGBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZGAgc29tZXdoZXJlIGRlZXAgaW5zaWRlIGEgdG9ybi1kb3duIHBsdWdpbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVJldm9rZWRFcnJvciBleHRlbmRzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlSZXZva2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmV2b2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGJlZW4gcmV2b2tlZCwgYmVjYXVzZSB0aGUgcGx1Z2luIHdhcyB1bmxvYWRlZC5gLFxuICAgICAgcGx1Z2luSWQsXG4gICAgICByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWRcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpUmV2b2tlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHVibGlzaGVkIEFQSSdzIHBheWxvYWQgZmFpbHMgdGhlIHNjaGVtYSBpdHMgY29udHJhY3QgZGVjbGFyZXMuXG4gKlxuICogT25seSBldmVyIHRocm93biB3aGlsZSB0aGUgYG9ic2lkaWFuLWRldi11dGlsczpQbHVnaW5BcGlgIGRlYnVnZ2VyIGlzIGVuYWJsZWQgXHUyMDE0IGluIHByb2R1Y3Rpb24gdGhlIG1ldGhvZHNcbiAqIGFyZSBub3Qgd3JhcHBlZCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgaXNzdWVzIHRoZSBzY2hlbWEgcmVwb3J0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKFxuICAgICAgYFRoZSAke3BhcmFtcy5wYXlsb2FkS2luZH0gb2YgXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBBUEkgbWV0aG9kIFwiJHtwYXJhbXMubWV0aG9kTmFtZX1cIiBmYWlsZWQgdmFsaWRhdGlvbjogJHtmb3JtYXRJc3N1ZXMocGFyYW1zLmlzc3Vlcyl9YFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1BsdWdpbkFwaVZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5pc3N1ZXMgPSBwYXJhbXMuaXNzdWVzO1xuICAgIHRoaXMubWV0aG9kTmFtZSA9IHBhcmFtcy5tZXRob2ROYW1lO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBwbHVnaW4ncyBBUEkgc28gb3RoZXIgcGx1Z2lucyBjYW4gY29uc3VtZSBpdCwga2V5ZWQgYnkgdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gKlxuICogU2V2ZXJhbCBjb250cmFjdCB2ZXJzaW9ucyBtYXkgYmUgcHVibGlzaGVkIHNpZGUgYnkgc2lkZSwgc28gYSBwcm92aWRlciBjYW4gbW92ZSB0byBgMi4wLjBgIHdpdGhvdXQgYnJlYWtpbmdcbiAqIGNvbnN1bWVycyBzdGlsbCBwaW5uZWQgdG8gYF4xYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgcHVibGlzaGVkLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBwdWJsaXNoaW5nLlxuICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoaXMgcGx1Z2luIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGlzIGV4YWN0IGBhcGlWZXJzaW9uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hQbHVnaW5BcGk8VEFwaSBleHRlbmRzIG9iamVjdD4ocGFyYW1zOiBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGk+KTogdm9pZCB7XG4gIGNvbnN0IHBsdWdpbklkID0gcGFyYW1zLnBsdWdpbi5tYW5pZmVzdC5pZDtcbiAgY29uc3QgcmVnaXN0cnkgPSBnZXRSZWdpc3RyeSgpO1xuICBjb25zdCByZWNvcmRzID0gcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW107XG4gIHJlZ2lzdHJ5LnJlY29yZHNbcGx1Z2luSWRdID0gcmVjb3JkcztcblxuICBpZiAocmVjb3Jkcy5zb21lKChyZWNvcmQpID0+IHJlY29yZC5hcGlWZXJzaW9uID09PSBwYXJhbXMuYXBpVmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgQVBJIHZlcnNpb24gXCIke3BhcmFtcy5hcGlWZXJzaW9ufVwiLmApO1xuICB9XG5cbiAgY29uc3QgcmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSB7XG4gICAgYXBpOiBwYXJhbXMuYXBpLFxuICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgIGNvbnRyYWN0OiBwYXJhbXMuY29udHJhY3QgPz8ge30sXG4gICAgaXNSZXZva2VkOiBmYWxzZSxcbiAgICBwbHVnaW5JZFxuICB9O1xuICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcblxuICBwYXJhbXMucGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZXZva2VSZWNvcmQocmVjb3JkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBhbm90aGVyIHBsdWdpbidzIEFQSSBhbmQgcmV0dXJucyBhIGxpdmUge0BsaW5rIFBsdWdpbkFwaVJlZn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gc3RheXNcbiAqIGNvcnJlY3QgYWNyb3NzIHRoZSBwcm92aWRlcidzIGxvYWQsIHVubG9hZCwgYW5kIHJlLWVuYWJsZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBlbnRpcmUgY29uc3VtZXIgc3VyZmFjZS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHN5bmNocm9ub3VzIFwiZ2V0IGl0IG9yIGBudWxsYFwiIHByb2JlOiBhIHByb2JlXG4gKiBvbmx5IGFuc3dlcnMgXCJub3dcIiBhbmQgbmV2ZXIgdGVsbHMgeW91IHdoZW4gXCJub3dcIiBjaGFuZ2VkLCBzbyBjYWxsaW5nIG9uZSBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIFx1MjAxNCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSBcdTIwMTQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBjb25zdCByZWYgPSBuZXcgUGx1Z2luQXBpUmVmSW1wbDxUQXBpPihwYXJhbXMpO1xuICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSgoKSA9PiB7XG4gICAgcmVmLnJlZnJlc2goKTtcbiAgfSk7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIodW5zdWJzY3JpYmUpO1xuICByZWYucmVmcmVzaCgpO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSBkZXRlY3RzIGEgdGhlbmFibGUuIEEgY3Jvc3MtY29weSB2YWx1ZSBtYXkgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0sIHNvIGBpbnN0YW5jZW9mIFByb21pc2VgIGlzXG4gKiBub3QgdXNhYmxlIGhlcmUgXHUyMDE0IHRoZSBzYW1lIGRpc2NpcGxpbmUgdGhlIHJlZ2lzdHJ5IHJlY29yZHMgZm9sbG93LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB2YWx1ZSB0aGUgdGhlbmFibGUgcmVzb2x2ZXMgdG8uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgJ3RoZW4nIGluIHZhbHVlXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBldmVyeSBtZXRob2QgdGhlIGVmZmVjdGl2ZSBjb250cmFjdCBkZWNsYXJlcyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIHRoZSBwdWJsaXNoZWQgQVBJLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIHdoZW4gc3VwcGxpZWQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc2hhcGUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tNYXRjaGVzQ29udHJhY3RTaGFwZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gY29uc3VtZXJDb250cmFjdCA/PyByZWNvcmQuY29udHJhY3Q7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cmFjdCkuZXZlcnkoKG1ldGhvZE5hbWUpID0+IHR5cGVvZiBnZXRNZW1iZXIocmVjb3JkLmFwaSwgbWV0aG9kTmFtZSkgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVuY3Rpb24gYSBjb25zdW1lciBhY3R1YWxseSBjYWxsczogaXQgYWx3YXlzIGludm9rZXMgdGhlIG9yaWdpbmFsIHdpdGggdGhlIHJhdyBBUEkgb2JqZWN0IGFzXG4gKiBgdGhpc2AsIGFuZCBcdTIwMTQgb25seSB3aGlsZSB0aGUgbGlicmFyeSBkZWJ1Z2dlciBpcyBlbmFibGVkIFx1MjAxNCB2YWxpZGF0ZXMgdGhlIGRlY2xhcmVkIHBheWxvYWRzIGFyb3VuZCBpdC5cbiAqXG4gKiBUaGUgZGVidWdnZXIgaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBgREVCVUdgIGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIEtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFBsdWdpbkFwaURlYnVnZ2VyKCkuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2UgXHUyMDE0IGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQgXHUyMDE0IHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBnYXRlcyBwYXlsb2FkIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnZ2VyLlxuICovXG5mdW5jdGlvbiBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0TGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgYG9ic2lkaWFuLWRldi11dGlsc2AgY29weSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxQYXJ0aWFsPFBsdWdpbkFwaVJlZ2lzdHJ5Pj4oUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVksIHt9KTtcbiAgY29uc3QgcmVnaXN0cnkgPSB3cmFwcGVyLnZhbHVlO1xuICByZWdpc3RyeS5yZWNvcmRzID8/PSB7fTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMgPz89IFtdO1xuICByZXR1cm4gY2FzdFRvPFBsdWdpbkFwaVJlZ2lzdHJ5PihyZWdpc3RyeSk7XG59XG5cbi8qKlxuICogTm90aWZpZXMgZXZlcnkgc3Vic2NyaWJlciwgb3ZlciBhIFNOQVBTSE9UIG9mIHRoZSBsaXN0IFx1MjAxNCBhIGNhbGxiYWNrIGlzIGZyZWUgdG8gdW5zdWJzY3JpYmUgKG9yIHN1YnNjcmliZSlcbiAqIHdoaWxlIHRoZSBzd2VlcCBpcyBydW5uaW5nLlxuICovXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIHNuYXBzaG90KGdldFJlZ2lzdHJ5KCkuc3Vic2NyaWJlcnMpKSB7XG4gICAgc3Vic2NyaWJlcigpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBhcHBsaWVzLCBwcm9iaW5nIHRoZSBjYXVzZXMgZnJvbSB0aGUgb3V0ZXJtb3N0IGlud2FyZHMgc28gdGhlIG1vc3RcbiAqIGFjdGlvbmFibGUgb25lIHdpbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3YXRjaCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHJlYXNvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihwYXJhbXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEluc3RhbGxlZDtcbiAgfVxuXG4gIGlmICghcGFyYW1zLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEVuYWJsZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmRzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZDtcbiAgfVxuXG4gIGlmIChyZWNvcmRzLmV2ZXJ5KChyZWNvcmQpID0+ICFzYXRpc2ZpZXNWZXJzaW9uKHJlY29yZC5hcGlWZXJzaW9uLCBwYXJhbXMuYXBpVmVyc2lvblJhbmdlKSkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uVmVyc2lvbk1pc21hdGNoO1xuICB9XG5cbiAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCBcdTIwMTQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgd2lubmluZyByZWNvcmQsIG9yIGBudWxsYCB3aGVuIG5vbmUgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiBzZWxlY3RSZWNvcmQocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3Mi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
|
|
426
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIFx1MjAxNCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IFx1MjAxNCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwgXHUyMDE0IHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUgXHUyMDE0IGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHM6UGx1Z2luQXBpYCBkZWJ1Z2dlciBpcyBlbmFibGVkLCBzbyBwcm9kdWN0aW9uIHBheXMgbm90aGluZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIGBvYnNpZGlhbi1kZXYtdXRpbHNgLCBzbyBhIHJlZ2lzdHJ5IHJlY29yZCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW5cbiAqIGRpZmZlcmVudCBsaWJyYXJ5IHZlcnNpb25zIGFuZCBtdXN0IHN0YXkgYmFja3dhcmQtY29tcGF0aWJsZSBmb3JldmVyLiBOb3RoaW5nIGNyb3NzaW5nIGl0IG1heSBiZVxuICogYGluc3RhbmNlb2ZgLWNoZWNrZWQgXHUyMDE0IHJlYWRzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgb25seSBwbGFpbiBkYXRhIG9iamVjdHMgYW5kIHBsYWluIGZ1bmN0aW9ucyBhcmUgc3RvcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ29tcG9uZW50LFxuICBQbHVnaW5cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uXG59IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5cbmNvbnN0IFBMVUdJTl9BUElfREVCVUdHRVJfTkFNRVNQQUNFID0gJ1BsdWdpbkFwaSc7XG5jb25zdCBQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSA9ICdwbHVnaW5BcGlSZWdpc3RyeSc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSB3YWl0cyBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAqL1xuY29uc3QgREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGljaCBoYWxmIG9mIGEgbWV0aG9kIGNhbGwgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlQYXlsb2FkS2luZCB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgSW5wdXQgPSAnaW5wdXQnLFxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgT3V0cHV0ID0gJ291dHB1dCdcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgcGx1Z2luIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKlxuICogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBlbnVtIGlzIHRoYXQgdGhlc2UgYXJlIHRvbGQgYXBhcnQuIGBAdmFuYWthdC9wbHVnaW4tYXBpYCBjYW5ub3QgdGVsbCBhbnkgb2YgdGhlbVxuICogYXBhcnQsIGFuZCBub3QgdW5pZm9ybWx5OiBgTm90SW5zdGFsbGVkYCAvIGBOb3RFbmFibGVkYCAvIGBOb3RQdWJsaXNoZWRgIGFsbCByZWR1Y2UgdG8gb25lIGBOb3RpY2VgIHBsdXNcbiAqIGB1bmRlZmluZWRgLCB3aGlsZSBgVmVyc2lvbk1pc21hdGNoYCAvIGBTaGFwZU1pc21hdGNoYCBwcm9kdWNlIE5PIHNpZ25hbCBhdCBhbGwgXHUyMDE0IGl0IG5ldmVyIGV4YW1pbmVzIHdoYXQgaXRcbiAqIGZvdW5kLCBzbyBpdCBoYW5kcyB0aGUgb2JqZWN0IG92ZXIgYW5kIHRoZSBtaXNtYXRjaCBzdXJmYWNlcyBsYXRlciwgc29tZXdoZXJlIGVsc2UsIGFzIHNvbWVib2R5IGVsc2Unc1xuICogYFR5cGVFcnJvcmAuXG4gKlxuICogQHJlbWFya3NcbiAqIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gY2FuIHJlcG9ydCB0aGUgZmlyc3QgZml2ZTsge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWR9XG4gKiBpcyBub3Qgb25lIG9mIHRoZW0sIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgaGFuZGxlIHRoYXQgV0FTIHZhbGlkIGFuZCBpcyBjYXJyaWVkIGJ5XG4gKiB7QGxpbmsgUGx1Z2luQXBpUmV2b2tlZEVycm9yfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBidXQgbm90IGVuYWJsZWQuXG4gICAqL1xuICBOb3RFbmFibGVkID0gJ25vdEVuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCBidXQgaGFzIG5vdCBwdWJsaXNoZWQgYW55IEFQSS5cbiAgICovXG4gIE5vdFB1Ymxpc2hlZCA9ICdub3RQdWJsaXNoZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlIHdhcyB2YWxpZCBidXQgdGhlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZCwgc28gaXQgaGFzIGJlZW4gcmV2b2tlZC5cbiAgICovXG4gIFJldm9rZWQgPSAncmV2b2tlZCcsXG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gcmFuZ2UsIGJ1dCB0aGUgQVBJIG9iamVjdCBpcyBtaXNzaW5nIGEgbWV0aG9kIHRoZSBjb250cmFjdFxuICAgKiBkZWNsYXJlcyBcdTIwMTQgdGhlIHByb3ZpZGVyJ3Mgc2hpcHBlZCBzaGFwZSBhbmQgaXRzIGRlY2xhcmVkIHNoYXBlIGRpc2FncmVlLlxuICAgKi9cbiAgU2hhcGVNaXNtYXRjaCA9ICdzaGFwZU1pc21hdGNoJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwdWJsaXNoZWQgYW4gQVBJLCBidXQgbm8gcHVibGlzaGVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAqL1xuICBWZXJzaW9uTWlzbWF0Y2ggPSAndmVyc2lvbk1pc21hdGNoJ1xufVxuXG4vKipcbiAqIFRoZSBjb250cmFjdCBhIHByb3ZpZGVyIGRlY2xhcmVzIGZvciBpdHMgQVBJOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBpcyBwcm9taXNpbmcgdG8gZXhwb3NlLCBhbmRcbiAqIGl0cyB2YWx1ZSBvcHRpb25hbGx5IGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVGhlIEtFWVMgYXJlIHRoZSBwYXJ0IHRoYXQgYWx3YXlzIG1hdHRlcnMgXHUyMDE0IHRoZXkgZHJpdmUgdGhlIHNoYXBlIGNoZWNrIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcHVibGlzaGVkXG4gKiByZWNvcmQgaXMgdXNhYmxlIGF0IGFsbC4gVGhlIHNjaGVtYXMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IGV2ZXIgY29uc3VsdGVkIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2h5IHRoZSBzaGFwZSBjaGVjayBpcyBhIGB0eXBlb2ZgIHJhdGhlciB0aGFuIGEgc2NoZW1hIG92ZXIgdGhlIHdob2xlIEFQSSBvYmplY3QuIEluIHpvZCA0IGB6LmZ1bmN0aW9uKClgXG4gKiByZXR1cm5zIGEgZnVuY3Rpb24gRkFDVE9SWSwgbm90IGEgc2NoZW1hLCBzbyBpdCBjYW5ub3QgYmUgYSBgei5vYmplY3QoKWAgbWVtYmVyIGRpcmVjdGx5LiBUaGVyZSBpcyBhIGtub3duXG4gKiB3b3JrYXJvdW5kICh6b2QjNDE0MykgXHUyMDE0IGB6LmN1c3RvbSgoZm4pID0+IGZ1bmN0aW9uU2NoZW1hLmltcGxlbWVudChmbikpYCBcdTIwMTQgYW5kIGl0IGRvZXMgYnV5IGNvcnJlY3RcbiAqIGB6LmluZmVyYCB0eXBlcyBmb3IgYSBmdW5jdGlvbiBtZW1iZXIuIEl0IGRvZXMgbm90IGJ1eSBydW50aW1lIHZhbGlkYXRpb24gaGVyZSwgdGhvdWdoOiBgei5jdXN0b21gIGlzIGFcbiAqIGJvb2xlYW4gcHJlZGljYXRlIHRoYXQgcmV0dXJucyBpdHMgaW5wdXQgdW5jaGFuZ2VkLCBzbyB0aGUgdmFsaWRhdGluZyB3cmFwcGVyIGBpbXBsZW1lbnRgIGJ1aWxkcyBpc1xuICogZGlzY2FyZGVkIGFuZCB0aGUgY2hlY2sgY29sbGFwc2VzIGJhY2sgdG8gXCJpcyBpdCBjYWxsYWJsZVwiLiBLZWVwaW5nIHRoYXQgd3JhcHBlciB3b3VsZCBuZWVkIGEgZnVydGhlclxuICogYC50cmFuc2Zvcm0oKWAsIGFuZCB3b3VsZCB0aGVuIG1vdmUgdmFsaWRhdGlvbiBvbnRvIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiBiZWhpbmQgdGhlIGRlYnVnIGdhdGUsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXBpQ29udHJhY3QgPSBSZWNvcmQ8c3RyaW5nLCBQbHVnaW5BcGlNZXRob2RDb250cmFjdD47XG5cbi8qKlxuICogT25lIEFQSSBhIHBsdWdpbiBleHBvc2VzOiB0aGUgb2JqZWN0LCB0aGUgY29udHJhY3QgdmVyc2lvbiBpdCBzYXRpc2ZpZXMsIGFuZCBvcHRpb25hbGx5IHRoZSBjb250cmFjdFxuICogaXRzZWxmLiBUaGlzIGlzIHtAbGluayBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zfSB3aXRob3V0IHRoZSBwdWJsaXNoaW5nIHBsdWdpbiwgc28gYSBwbHVnaW4gY2FuIERFQ0xBUkUgd2hhdFxuICogaXQgZXhwb3NlcyB3aXRob3V0IGFsc28gc3RhdGluZyB3aG8gaXMgcHVibGlzaGluZyBpdCBcdTIwMTQgd2hpY2ggaXMgd2hhdCBsZXRzIGBQbHVnaW5CYXNlLmdldFBsdWdpbkFwaXNgIGNvbGxlY3RcbiAqIHRoZSBkZWNsYXJhdGlvbnMgYW5kIGRvIHRoZSBwdWJsaXNoaW5nIGl0c2VsZi5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgZGVjbGFyZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpRGVjbGFyYXRpb248VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIEFQSSBvYmplY3QgdG8gcHVibGlzaC4gSXRzIG1ldGhvZHMgYXJlIGhhbmRlZCB0byBjb25zdW1lcnMgdGhyb3VnaCBhIHJldm9jYWJsZSBoYW5kbGUsIGFuZCB0aGV5IGFyZVxuICAgKiBhbHdheXMgaW52b2tlZCB3aXRoIHRoaXMgb2JqZWN0IGFzIHRoZWlyIGB0aGlzYCwgc28gYW4gaW1wbGVtZW50YXRpb24gdXNpbmcgcHJpdmF0ZSBjbGFzcyBmaWVsZHMga2VlcHNcbiAgICogd29ya2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGFwaTogVEFwaTtcblxuICAvKipcbiAgICogVGhlIENPTlRSQUNUIHZlcnNpb24sIGluIHNlbXZlciBmb3JtIFx1MjAxNCBpbmRlcGVuZGVudCBvZiB0aGUgcGx1Z2luJ3Mgb3duIHZlcnNpb24uIFBsdWdpbiBgMS40LjdgIG1heVxuICAgKiBwZXJmZWN0bHkgd2VsbCBleHBvc2UgQVBJIGAyLjAuMGAuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGlzIHZlcnNpb24gb2YgdGhlIEFQSSBzYXRpc2ZpZXMuIE9wdGlvbmFsOiB3aGVuIG9taXR0ZWQsIG5vIHNoYXBlIGNoZWNrIGlzIHBlcmZvcm1lZCBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBiZWhhbGYgYW5kIHRoZSBjb25zdW1lcidzIG93biBjb250cmFjdCAoaWYgYW55KSBpcyB1c2VkIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNjaGVtYXMgZm9yIGEgc2luZ2xlIEFQSSBtZXRob2QuIEJvdGggaGFsdmVzIGFyZSBvcHRpb25hbDogYSBtZXRob2QgbWF5IGRlY2xhcmUgb25seSBpdHMgaW5wdXQsXG4gKiBvbmx5IGl0cyBvdXRwdXQsIG5laXRoZXIgKHRoZSBlbnRyeSB0aGVuIGp1c3QgZGVjbGFyZXMgdGhhdCB0aGUgbWV0aG9kIG11c3QgZXhpc3QpLCBvciBib3RoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaU1ldGhvZENvbnRyYWN0IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBhcyBhbiBhcnJheS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogU3RhbmRhcmRTY2hlbWFWMTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgXHUyMDE0IG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxO1xufVxuXG4vKipcbiAqIEEgbGl2ZSByZWZlcmVuY2UgdG8gYW5vdGhlciBwbHVnaW4ncyBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVmIGlzIHRoZSBXSE9MRSBjb25zdW1lciBzdXJmYWNlLCBkZWxpYmVyYXRlbHkuIEEgcGxhaW4ge0BsaW5rIFByb21pc2V9IGNhbm5vdCBtb2RlbCB0aGlzIGJlY2F1c2UgaXRcbiAqIHNldHRsZXMgb25jZSwgd2hlcmVhcyBhdmFpbGFiaWxpdHkgaXMgYSByZXBlYXRpbmcgc2lnbmFsIChhdmFpbGFibGUgXHUyMTkyIGdvbmUgXHUyMTkyIGF2YWlsYWJsZSBhZ2FpbiBhY3Jvc3MgYVxuICogZGlzYWJsZS9lbmFibGUgY3ljbGUpIFx1MjAxNCB3aGljaCBpcyB3aHkge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSBpcyBhIG1ldGhvZCBPTiB0aGUgcmVmIHJhdGhlciB0aGFuXG4gKiB0aGUgdGhpbmcgaGFuZGVkIGJhY2suIFRoZSBgY2hhbmdlYCBldmVudCBleGlzdHMgZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgcmVhY3QgcmF0aGVyIHRoYW4gcmVhZCwgYW5kIGlzXG4gKiBzZWNvbmRhcnk6IGl0IGltcG9zZXMgbm8gY2VyZW1vbnkgb24gdGhlIGNvbW1vbiBjYXNlLCB3aGljaCBpcyByZWFkaW5nIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZjxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIEFzeW5jRXZlbnRTb3VyY2U8UGx1Z2luQXBpUmVmRXZlbnRNYXA+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEksIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBBbHdheXMgY3VycmVudCwgc3luY2hyb25vdXMsIGFuZCBmcmVlIFx1MjAxNCB0aGUgcmVmIG1haW50YWlucyBpdCwgc28gdGhlcmUgaXMgbm8gcmVnaXN0cnkgbG9va3VwIHBlciByZWFkLlxuICAgKiBgbnVsbGAgaGVyZSBtZWFucyBcIm5vdCBhdmFpbGFibGUgcmlnaHQgbm93XCIsIE5PVCBcIm5vdCBpbnN0YWxsZWRcIjogZHVyaW5nIGEgY29uc3VtZXIncyBgb25sb2FkYCB0aGVcbiAgICogcHJvdmlkZXIgbWF5IHNpbXBseSBub3QgaGF2ZSBsb2FkZWQgeWV0LCBhbmQgdGhlIHZhbHVlIGJlY29tZXMgbm9uLWBudWxsYCBvbiBpdHMgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG51bGwgfCBUQXBpO1xuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd2FpdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBBUEkuXG4gICAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IucmVhc29ufSBzYXlzIHdoaWNoIG9mXG4gICAqIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLCBpZiB0aGUgQVBJIGRvZXMgbm90IGJlY29tZSBhdmFpbGFibGUgYmVmb3JlIHRoZSB0aW1lb3V0IGVsYXBzZXMuXG4gICAqL1xuICB3aGVuQXZhaWxhYmxlKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyk6IFByb21pc2U8VEFwaT47XG59XG5cbi8qKlxuICogVGhlIGV2ZW50cyBhIHtAbGluayBQbHVnaW5BcGlSZWZ9IGZpcmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZkV2ZW50TWFwIHtcbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGNoYW5nZXMgXHUyMDE0IGluY2x1ZGluZyB3aGVuIGl0IGJlY29tZXMgYG51bGxgIGJlY2F1c2UgdGhlIHByb3ZpZGVyXG4gICAqIHVubG9hZGVkLlxuICAgKi9cbiAgY2hhbmdlOiBbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBleHBsaWNpdCBtZXNzYWdlLiBXaGVuIG9taXR0ZWQsIG9uZSBpcyBkZXJpdmVkIGZyb20gdGhlIHBsdWdpbiBpZCBhbmQgdGhlIHJlYXNvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgU3RhbmRhcmRTY2hlbWFWMS5Jc3N1ZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdob3NlIHBheWxvYWQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGlucHV0IG9yIHRoZSBvdXRwdXQgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHB1Ymxpc2hQbHVnaW5BcGl9LlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaFBsdWdpbkFwaVBhcmFtczxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFBsdWdpbkFwaURlY2xhcmF0aW9uPFRBcGk+IHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgd2hvc2UgdW5sb2FkIHJldm9rZXMgdGhlIHJlY29yZC4gRGVmYXVsdHMgdG8ge0BsaW5rIFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXMucGx1Z2lufSwgd2hpY2ggaXNcbiAgICogdGhlIHJpZ2h0IG93bmVyIGZvciBhbiBBUEkgcHVibGlzaGVkIGZvciBhcyBsb25nIGFzIHRoZSBwbHVnaW4gcnVucy5cbiAgICpcbiAgICogUGFzcyBhIG5hcnJvd2VyIG9uZSB3aGVuIHRoZSBBUEkgaXMgb25seSB2YWxpZCBmb3IgcGFydCBvZiB0aGUgcGx1Z2luJ3MgbGlmZSBcdTIwMTQgYSBwbHVnaW4gd2hvc2UgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGlzIHRvcm4gZG93biBhbmQgcmVidWlsdCB3aGlsZSB0aGUgcGx1Z2luIGl0c2VsZiBzdGF5cyBsb2FkZWQgbXVzdCByZXZva2Ugd2l0aCB0aGUgc3VyZmFjZSwgb3IgaXRcbiAgICogbGVhdmVzIGNvbnN1bWVycyBob2xkaW5nIGhhbmRsZXMgaW50byBjb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50PzogQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgcHVibGlzaGluZyBwbHVnaW4uIFRoZSByZWNvcmQgaXMga2V5ZWQgYnkgaXRzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW5cbiAgICogdW5sb2FkcywgdmlhIGBwbHVnaW4ucmVnaXN0ZXIoKWAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd2F0Y2hQbHVnaW5BcGl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoUGx1Z2luQXBpUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgY29udHJhY3QgdmVyc2lvbnMgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QsIGUuZy4gYCdeMidgLiBUaGUgaGlnaGVzdCBwdWJsaXNoZWRcbiAgICogdmVyc2lvbiBzYXRpc2Z5aW5nIGl0IHdpbnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoZSByYW5nZSBpcyBldmFsdWF0ZWQgYnkgYGNvbXBhcmUtdmVyc2lvbnNgLCB3aGljaCBhY2NlcHRzIGBeYCwgYH5gLCBjb21wYXJpc29uIG9wZXJhdG9ycywgYW5kIGB4YFxuICAgKiB3aWxkY2FyZHMgXHUyMDE0IGJ1dCBOT1QgYSBiYXJlIGAqYC4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UsIHVzZWQgdG8gY2xhc3NpZnkgYSBmYWlsdXJlIGFzIG5vdC1pbnN0YWxsZWQgdnMgbm90LWVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCBvd25pbmcgdGhlIHN1YnNjcmlwdGlvbi4gVGhlIHdhdGNoIGlzIHRvcm4gZG93biB3aGVuIGl0IHVubG9hZHMuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIGNvbnRyYWN0IHRoZSBDT05TVU1FUiBleHBlY3RzLiBPcHRpb25hbCwgYW5kIGl0IHdpbnMgb3ZlciB0aGUgcHJvdmlkZXIncyBwdWJsaXNoZWQgY29udHJhY3Qgd2hlblxuICAgKiBzdXBwbGllZCBcdTIwMTQgaXQgaXMgdGhlIGNvbnN1bWVyJ3Mgb3duIGNvbXBpbGVkLWFnYWluc3QgZXhwZWN0YXRpb24sIHNvIGl0IGlzIHRoZSBvbmUgd2hvc2UgdmlvbGF0aW9uIGlzXG4gICAqIHRoZSBjb25zdW1lcidzIHByb2JsZW0uXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0O1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgYW5kIGNsYXNzaWZ5aW5nIHRoZSBmYWlsdXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVNZXRob2RXcmFwcGVyfS5cbiAqL1xuaW50ZXJmYWNlIENyZWF0ZU1ldGhvZFdyYXBwZXJQYXJhbXMge1xuICByZWFkb25seSBtZXRob2RDb250cmFjdDogUGx1Z2luQXBpTWV0aG9kQ29udHJhY3QgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIGRlYnVnIG91dHB1dC4gTk9UIGEga2V5IFx1MjAxNCBzZWUge0BsaW5rIHByb3BlcnR5S2V5fS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHRoZSBtZXRob2QgaXMgYWN0dWFsbHkgcmVhZCBieSwgd2hpY2ggbWF5IGJlIGEgc3ltYm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5O1xuXG4gIHJlYWRvbmx5IHRhcmdldDogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSByZWFsbS1nbG9iYWwgcmVnaXN0cnkgc2hhcmVkIGJ5IGV2ZXJ5IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcHkgaW4gdGhlIHJlbmRlcmVyLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luQXBpUmVnaXN0cnkge1xuICByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmRbXT47XG4gIHN1YnNjcmliZXJzOiAoKCkgPT4gdm9pZClbXTtcbn1cblxuLyoqXG4gKiBBIHJlY29yZCBhcyBpdCBzaXRzIGluIHRoZSBzaGFyZWQgcmVnaXN0cnkuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaXMgdGhlIFdJUkUgRk9STUFUIGJldHdlZW4gZGlmZmVyZW50IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcGllcywgc28gaXQgaG9sZHMgbm90aGluZyBidXQgcGxhaW4gZGF0YVxuICogYW5kIHBsYWluIGZ1bmN0aW9ucywgYW5kIGV2ZXJ5IHJlYWQgb2YgaXQgZWxzZXdoZXJlIGluIHRoaXMgZmlsZSBpcyBzdHJ1Y3R1cmFsLlxuICovXG5pbnRlcmZhY2UgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkIHtcbiAgYXBpOiBvYmplY3Q7XG4gIGFwaVZlcnNpb246IHN0cmluZztcbiAgY29udHJhY3Q6IFBsdWdpbkFwaUNvbnRyYWN0O1xuICBpc1Jldm9rZWQ6IGJvb2xlYW47XG4gIHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHZhbGlkYXRlUGF5bG9hZH0uXG4gKi9cbmludGVyZmFjZSBWYWxpZGF0ZVBheWxvYWRQYXJhbXMge1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBheWxvYWRLaW5kOiBQbHVnaW5BcGlQYXlsb2FkS2luZDtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NoZW1hOiBTdGFuZGFyZFNjaGVtYVYxO1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBIb2xkcyB3aGF0IGEgd2F0Y2ggbmVlZHMgcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHR5cGUgaXQgaXMgdHlwZWQgYWdhaW5zdCwgc28gdGhlIHtAbGluayBtaXhpbkFzeW5jRXZlbnRzfVxuICogbWl4aW4gaGFzIGEgcmVhbCBiYXNlIHRvIGV4dGVuZC5cbiAqL1xuYWJzdHJhY3QgY2xhc3MgUGx1Z2luQXBpV2F0Y2hCYXNlIHtcbiAgcHJvdGVjdGVkIGhhbmRsZTogbnVsbCB8IG9iamVjdCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlY29yZDogbnVsbCB8IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCA9IG51bGw7XG5cbiAgLy8gQSBgcHJvdGVjdGVkYCBjb25zdHJ1Y3RvciBpcyBub3QgYXNzaWduYWJsZSB0byBgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+YCwgd2hpY2ggaXMgd2hhdFxuICAvLyBgbWl4aW5Bc3luY0V2ZW50c2AgYWNjZXB0cywgc28gdGhpcyBzdGF5cyBwdWJsaWMgZXZlbiB0aG91Z2ggb25seSB0aGUgc3ViY2xhc3MgYmVsb3cgY2FsbHMgaXQuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcykge31cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBlcnJvciBkZXNjcmliaW5nIHdoeSB0aGUgQVBJIGlzIG5vdCBhdmFpbGFibGUgcmlnaHQgbm93LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY2xhc3NpZmllZCBlcnJvci5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVVbmF2YWlsYWJsZUVycm9yKCk6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAgIHJldHVybiBuZXcgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcih7XG4gICAgICBwbHVnaW5JZDogdGhpcy5wYXJhbXMucGx1Z2luSWQsXG4gICAgICByZWFzb246IHJlc29sdmVVbmF2YWlsYWJpbGl0eVJlYXNvbih0aGlzLnBhcmFtcylcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBQbHVnaW5BcGlSZWZJbXBsPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgbWl4aW5Bc3luY0V2ZW50czxQbHVnaW5BcGlSZWZFdmVudE1hcD4oKShQbHVnaW5BcGlXYXRjaEJhc2UpIGltcGxlbWVudHMgUGx1Z2luQXBpUmVmPFRBcGk+IHtcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBudWxsIHwgVEFwaSB7XG4gICAgcmV0dXJuIGNhc3RUbzxudWxsIHwgVEFwaT4odGhpcy5oYW5kbGUpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnksIGZpcmluZyBgY2hhbmdlYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY29yZCA9IHNlbGVjdFJlY29yZCh0aGlzLnBhcmFtcyk7XG4gICAgaWYgKHJlY29yZCA9PT0gdGhpcy5yZWNvcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLmhhbmRsZSA9IHJlY29yZCA9PT0gbnVsbCA/IG51bGwgOiBjcmVhdGVSZXZvY2FibGVIYW5kbGUocmVjb3JkLCB0aGlzLnBhcmFtcy5jb250cmFjdCk7XG4gICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB3aGVuQXZhaWxhYmxlKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyk6IFByb21pc2U8VEFwaT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJ1bldpdGhUaW1lb3V0PFRBcGk+KHtcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IGFzeW5jIChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFRBcGk+ID0+IGF3YWl0IHRoaXMud2FpdEZvclZhbHVlKGFib3J0U2lnbmFsKSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogYHdhdGNoUGx1Z2luQXBpKFwiJHt0aGlzLnBhcmFtcy5wbHVnaW5JZH1cIikud2hlbkF2YWlsYWJsZWAsXG4gICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8udGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0hFTl9BVkFJTEFCTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVVbmF2YWlsYWJsZUVycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yVmFsdWUoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFRBcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkIEZJUlNUIGFuZCBpbnZva2VkIHRocm91Z2ggYSB0aHVuaywgc28gYGV2ZW50UmVmYCBpcyBhbHJlYWR5IGJvdW5kIGJ5IHRoZVxuICAgICAgLy8gVGltZSBhbnl0aGluZyBjYW4gcmVhY2ggaXQgXHUyMDE0IHdoaWNoIGlzIHdoYXQgbGV0cyBgY2xlYW5VcGAgYmUgdW5jb25kaXRpb25hbCByYXRoZXIgdGhhbiBudWxsLWd1YXJkZWQuXG4gICAgICBjb25zdCBldmVudFJlZiA9IHRoaXMub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpOiB2b2lkIHtcbiAgICAgICAgZXZlbnRSZWYuYXN5bmNFdmVudFNvdXJjZS5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgICBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaGFuZGxlQWJvcnQoKTogdm9pZCB7XG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgcmVqZWN0KGFib3J0U2lnbmFsLnJlYXNvbiBhcyBFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgaGFuZGxlQWJvcnQpO1xuICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbiBBUEkgY2Fubm90IGJlIGhhbmRlZCBvdmVyLCBjYXJyeWluZyB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29ufSB0aGF0IHNheXNcbiAqIHdoeS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmVxdWVzdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zLm1lc3NhZ2UgPz8gYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIGlzIHVuYXZhaWxhYmxlOiAke3BhcmFtcy5yZWFzb259LmApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yJztcbiAgICB0aGlzLnBsdWdpbklkID0gcGFyYW1zLnBsdWdpbklkO1xuICAgIHRoaXMucmVhc29uID0gcGFyYW1zLnJlYXNvbjtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHJvcGVydHkgaXMgcmVhZCBmcm9tIGEgaGFuZGxlIHdob3NlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwb2ludCBvZiBoYW5kaW5nIG91dCBhIHJldm9jYWJsZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIHJhdyBvYmplY3Q6IGEgY29uc3VtZXIgdGhhdCBjYWNoZWQgdGhlXG4gKiBBUEkgaW4gYSBmaWVsZCBhbmQga2VwdCB1c2luZyBpdCBhY3Jvc3MgYSBkaXNhYmxlIGdldHMgYW4gZXJyb3IgbmFtaW5nIHRoZSBwcm92aWRlciwgaW5zdGVhZCBvZlxuICogYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkYCBzb21ld2hlcmUgZGVlcCBpbnNpZGUgYSB0b3JuLWRvd24gcGx1Z2luLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQXBpUmV2b2tlZEVycm9yIGV4dGVuZHMgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXZva2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBgVGhlIEFQSSBvZiB0aGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgYmVlbiByZXZva2VkLCBiZWNhdXNlIHRoZSBwbHVnaW4gd2FzIHVubG9hZGVkLmAsXG4gICAgICBwbHVnaW5JZCxcbiAgICAgIHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uUmV2b2tlZFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlSZXZva2VkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwdWJsaXNoZWQgQVBJJ3MgcGF5bG9hZCBmYWlscyB0aGUgc2NoZW1hIGl0cyBjb250cmFjdCBkZWNsYXJlcy5cbiAqXG4gKiBPbmx5IGV2ZXIgdGhyb3duIHdoaWxlIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzOlBsdWdpbkFwaWAgZGVidWdnZXIgaXMgZW5hYmxlZCBcdTIwMTQgaW4gcHJvZHVjdGlvbiB0aGUgbWV0aG9kc1xuICogYXJlIG5vdCB3cmFwcGVkIGF0IGFsbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc3N1ZXM6IHJlYWRvbmx5IFN0YW5kYXJkU2NoZW1hVjEuSXNzdWVbXTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aG9zZSBwYXlsb2FkIGZhaWxlZCB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGhlICR7cGFyYW1zLnBheWxvYWRLaW5kfSBvZiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIEFQSSBtZXRob2QgXCIke3BhcmFtcy5tZXRob2ROYW1lfVwiIGZhaWxlZCB2YWxpZGF0aW9uOiAke2Zvcm1hdElzc3VlcyhwYXJhbXMuaXNzdWVzKX1gXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmlzc3VlcyA9IHBhcmFtcy5pc3N1ZXM7XG4gICAgdGhpcy5tZXRob2ROYW1lID0gcGFyYW1zLm1ldGhvZE5hbWU7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIHBsdWdpbidzIEFQSSBzbyBvdGhlciBwbHVnaW5zIGNhbiBjb25zdW1lIGl0LCBrZXllZCBieSB0aGUgcGx1Z2luJ3MgYG1hbmlmZXN0LmlkYCBhbmQgcmV2b2tlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2Fkcy5cbiAqXG4gKiBTZXZlcmFsIGNvbnRyYWN0IHZlcnNpb25zIG1heSBiZSBwdWJsaXNoZWQgc2lkZSBieSBzaWRlLCBzbyBhIHByb3ZpZGVyIGNhbiBtb3ZlIHRvIGAyLjAuMGAgd2l0aG91dCBicmVha2luZ1xuICogY29uc3VtZXJzIHN0aWxsIHBpbm5lZCB0byBgXjFgLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHB1Ymxpc2hpbmcuXG4gKiBAdGhyb3dzIEFuIHtAbGluayBFcnJvcn0gaWYgdGhpcyBwbHVnaW4gaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoaXMgZXhhY3QgYGFwaVZlcnNpb25gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFBsdWdpbkFwaTxUQXBpIGV4dGVuZHMgb2JqZWN0PihwYXJhbXM6IFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXM8VEFwaT4pOiB2b2lkIHtcbiAgY29uc3QgcGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luLm1hbmlmZXN0LmlkO1xuICBjb25zdCByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7XG4gIGNvbnN0IHJlY29yZHMgPSByZWdpc3RyeS5yZWNvcmRzW3BsdWdpbklkXSA/PyBbXTtcbiAgcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0gPSByZWNvcmRzO1xuXG4gIGlmIChyZWNvcmRzLnNvbWUoKHJlY29yZCkgPT4gcmVjb3JkLmFwaVZlcnNpb24gPT09IHBhcmFtcy5hcGlWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoZSBBUEkgdmVyc2lvbiBcIiR7cGFyYW1zLmFwaVZlcnNpb259XCIuYCk7XG4gIH1cblxuICBjb25zdCByZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCA9IHtcbiAgICBhcGk6IHBhcmFtcy5hcGksXG4gICAgYXBpVmVyc2lvbjogcGFyYW1zLmFwaVZlcnNpb24sXG4gICAgY29udHJhY3Q6IHBhcmFtcy5jb250cmFjdCA/PyB7fSxcbiAgICBpc1Jldm9rZWQ6IGZhbHNlLFxuICAgIHBsdWdpbklkXG4gIH07XG4gIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICBub3RpZnlTdWJzY3JpYmVycygpO1xuXG4gIChwYXJhbXMuY29tcG9uZW50ID8/IHBhcmFtcy5wbHVnaW4pLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZXZva2VSZWNvcmQocmVjb3JkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBhbm90aGVyIHBsdWdpbidzIEFQSSBhbmQgcmV0dXJucyBhIGxpdmUge0BsaW5rIFBsdWdpbkFwaVJlZn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gc3RheXNcbiAqIGNvcnJlY3QgYWNyb3NzIHRoZSBwcm92aWRlcidzIGxvYWQsIHVubG9hZCwgYW5kIHJlLWVuYWJsZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBlbnRpcmUgY29uc3VtZXIgc3VyZmFjZS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHN5bmNocm9ub3VzIFwiZ2V0IGl0IG9yIGBudWxsYFwiIHByb2JlOiBhIHByb2JlXG4gKiBvbmx5IGFuc3dlcnMgXCJub3dcIiBhbmQgbmV2ZXIgdGVsbHMgeW91IHdoZW4gXCJub3dcIiBjaGFuZ2VkLCBzbyBjYWxsaW5nIG9uZSBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIFx1MjAxNCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSBcdTIwMTQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBjb25zdCByZWYgPSBuZXcgUGx1Z2luQXBpUmVmSW1wbDxUQXBpPihwYXJhbXMpO1xuICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSgoKSA9PiB7XG4gICAgcmVmLnJlZnJlc2goKTtcbiAgfSk7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIodW5zdWJzY3JpYmUpO1xuICByZWYucmVmcmVzaCgpO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSBkZXRlY3RzIGEgdGhlbmFibGUuIEEgY3Jvc3MtY29weSB2YWx1ZSBtYXkgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0sIHNvIGBpbnN0YW5jZW9mIFByb21pc2VgIGlzXG4gKiBub3QgdXNhYmxlIGhlcmUgXHUyMDE0IHRoZSBzYW1lIGRpc2NpcGxpbmUgdGhlIHJlZ2lzdHJ5IHJlY29yZHMgZm9sbG93LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB2YWx1ZSB0aGUgdGhlbmFibGUgcmVzb2x2ZXMgdG8uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgJ3RoZW4nIGluIHZhbHVlXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBldmVyeSBtZXRob2QgdGhlIGVmZmVjdGl2ZSBjb250cmFjdCBkZWNsYXJlcyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIHRoZSBwdWJsaXNoZWQgQVBJLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIHdoZW4gc3VwcGxpZWQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc2hhcGUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tNYXRjaGVzQ29udHJhY3RTaGFwZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gY29uc3VtZXJDb250cmFjdCA/PyByZWNvcmQuY29udHJhY3Q7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cmFjdCkuZXZlcnkoKG1ldGhvZE5hbWUpID0+IHR5cGVvZiBnZXRNZW1iZXIocmVjb3JkLmFwaSwgbWV0aG9kTmFtZSkgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVuY3Rpb24gYSBjb25zdW1lciBhY3R1YWxseSBjYWxsczogaXQgYWx3YXlzIGludm9rZXMgdGhlIG9yaWdpbmFsIHdpdGggdGhlIHJhdyBBUEkgb2JqZWN0IGFzXG4gKiBgdGhpc2AsIGFuZCBcdTIwMTQgb25seSB3aGlsZSB0aGUgbGlicmFyeSBkZWJ1Z2dlciBpcyBlbmFibGVkIFx1MjAxNCB2YWxpZGF0ZXMgdGhlIGRlY2xhcmVkIHBheWxvYWRzIGFyb3VuZCBpdC5cbiAqXG4gKiBUaGUgZGVidWdnZXIgaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBgREVCVUdgIGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIEtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFBsdWdpbkFwaURlYnVnZ2VyKCkuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2UgXHUyMDE0IGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQgXHUyMDE0IHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBnYXRlcyBwYXlsb2FkIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnZ2VyLlxuICovXG5mdW5jdGlvbiBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0TGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgYG9ic2lkaWFuLWRldi11dGlsc2AgY29weSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxQYXJ0aWFsPFBsdWdpbkFwaVJlZ2lzdHJ5Pj4oUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVksIHt9KTtcbiAgY29uc3QgcmVnaXN0cnkgPSB3cmFwcGVyLnZhbHVlO1xuICByZWdpc3RyeS5yZWNvcmRzID8/PSB7fTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMgPz89IFtdO1xuICByZXR1cm4gY2FzdFRvPFBsdWdpbkFwaVJlZ2lzdHJ5PihyZWdpc3RyeSk7XG59XG5cbi8qKlxuICogTm90aWZpZXMgZXZlcnkgc3Vic2NyaWJlciwgb3ZlciBhIFNOQVBTSE9UIG9mIHRoZSBsaXN0IFx1MjAxNCBhIGNhbGxiYWNrIGlzIGZyZWUgdG8gdW5zdWJzY3JpYmUgKG9yIHN1YnNjcmliZSlcbiAqIHdoaWxlIHRoZSBzd2VlcCBpcyBydW5uaW5nLlxuICovXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIHNuYXBzaG90KGdldFJlZ2lzdHJ5KCkuc3Vic2NyaWJlcnMpKSB7XG4gICAgc3Vic2NyaWJlcigpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBhcHBsaWVzLCBwcm9iaW5nIHRoZSBjYXVzZXMgZnJvbSB0aGUgb3V0ZXJtb3N0IGlud2FyZHMgc28gdGhlIG1vc3RcbiAqIGFjdGlvbmFibGUgb25lIHdpbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3YXRjaCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHJlYXNvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihwYXJhbXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEluc3RhbGxlZDtcbiAgfVxuXG4gIGlmICghcGFyYW1zLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEVuYWJsZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmRzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZDtcbiAgfVxuXG4gIGlmIChyZWNvcmRzLmV2ZXJ5KChyZWNvcmQpID0+ICFzYXRpc2ZpZXNWZXJzaW9uKHJlY29yZC5hcGlWZXJzaW9uLCBwYXJhbXMuYXBpVmVyc2lvblJhbmdlKSkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uVmVyc2lvbk1pc21hdGNoO1xuICB9XG5cbiAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCBcdTIwMTQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgd2lubmluZyByZWNvcmQsIG9yIGBudWxsYCB3aGVuIG5vbmUgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiBzZWxlY3RSZWNvcmQocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0VBO0FBQUEsRUFDRTtBQUFBLEVBQ0EsYUFBYTtBQUFBLE9BQ1I7QUFJUCxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHdCQUF3QjtBQUNqQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsY0FBYztBQUN2QixTQUFTLGdDQUFnQztBQUV6QyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGlEQUFpRDtBQUtoRCxJQUFLLHVCQUFMLGtCQUFLQSwwQkFBTDtBQUlMLEVBQUFBLHNCQUFBLFdBQVE7QUFLUixFQUFBQSxzQkFBQSxZQUFTO0FBVEMsU0FBQUE7QUFBQSxHQUFBO0FBMEJMLElBQUssZ0NBQUwsa0JBQUtDLG1DQUFMO0FBSUwsRUFBQUEsK0JBQUEsZ0JBQWE7QUFLYixFQUFBQSwrQkFBQSxrQkFBZTtBQUtmLEVBQUFBLCtCQUFBLGtCQUFlO0FBS2YsRUFBQUEsK0JBQUEsYUFBVTtBQU1WLEVBQUFBLCtCQUFBLG1CQUFnQjtBQUtoQixFQUFBQSwrQkFBQSxxQkFBa0I7QUE5QlIsU0FBQUE7QUFBQSxHQUFBO0FBOFRaLE1BQWUsbUJBQW1CO0FBQUE7QUFBQTtBQUFBLEVBT3pCLFlBQStCLFFBQThCO0FBQTlCO0FBQUEsRUFBK0I7QUFBQSxFQUEvQjtBQUFBLEVBTjVCLFNBQXdCO0FBQUEsRUFFeEIsU0FBMEM7QUFBQTtBQUFBO0FB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O0FBQzVELFNBQU8sWUFBWTtBQUNuQixRQUFNLFdBQVcsWUFBWTtBQUM3QixRQUFNLFVBQVUsU0FBUyxRQUFRLE9BQU8sUUFBUTtBQUNoRCxNQUFJLFNBQVM7QUFDWCxhQUFTLFFBQVEsT0FBTyxRQUFRLElBQUksUUFBUSxPQUFPLENBQUMsY0FBYyxjQUFjLE1BQU07QUFBQSxFQUN4RjtBQUNBLG9CQUFrQjtBQUNwQjtBQVNBLFNBQVMsYUFBYSxRQUErRDtBQUNuRixRQUFNLGFBQWEsZUFBZSxPQUFPLFFBQVEsRUFDOUMsT0FBTyxDQUFDLFdBQVcsaUJBQWlCLE9BQU8sWUFBWSxPQUFPLGVBQWUsQ0FBQyxFQUM5RSxPQUFPLENBQUMsV0FBVywwQkFBMEIsUUFBUSxPQUFPLFFBQVEsQ0FBQyxFQUNyRSxLQUFLLENBQUMsR0FBRyxNQUFNLGdCQUFnQixFQUFFLFlBQVksRUFBRSxVQUFVLENBQUM7QUFFN0QsU0FBTyxXQUFXLENBQUMsS0FBSztBQUMxQjtBQVFBLFNBQVMsVUFBVSxZQUFvQztBQUNyRCxRQUFNLFdBQVcsWUFBWTtBQUM3QixXQUFTLFlBQVksS0FBSyxVQUFVO0FBQ3BDLFNBQU8sTUFBWTtBQUNqQixVQUFNLFFBQVEsU0FBUyxZQUFZLFFBQVEsVUFBVTtBQUNyRCxRQUFJLFVBQVUsSUFBSTtBQUNoQixlQUFTLFlBQVksT0FBTyxPQUFPLENBQUM7QUFBQSxJQUN0QztBQUFBLEVBQ0Y7QUFDRjtBQWFBLFNBQVMsZ0JBQWdCLFFBQXFDO0FBQzVELFFBQU0sU0FBUyxPQUFPLE9BQU8sV0FBVyxFQUFFLFNBQVMsT0FBTyxLQUFLO0FBRS9ELE1BQUksbUJBQXFELE1BQU0sR0FBRztBQUNoRSxzQkFBa0IsWUFBWTtBQUM1QixZQUFNLGNBQWMsTUFBTTtBQUMxQixVQUFJLFlBQVksUUFBUTtBQUN0Qiw2QkFBcUI7QUFBQSxVQUNuQjtBQUFBLFVBQ0EsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsYUFBYSxZQUFZLE1BQU07QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFDRDtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sUUFBUTtBQUNqQixVQUFNLElBQUkseUJBQXlCO0FBQUEsTUFDakMsUUFBUSxPQUFPO0FBQUEsTUFDZixZQUFZLE9BQU87QUFBQSxNQUNuQixhQUFhLE9BQU87QUFBQSxNQUNwQixVQUFVLE9BQU87QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDSDtBQUNGOyIsCiAgIm5hbWVzIjogWyJQbHVnaW5BcGlQYXlsb2FkS2luZCIsICJQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiIsICJyZWNvcmQiXQp9Cg==
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/// <reference path="../../library.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* How another plugin is present in this vault, and the one-click path to making it present.
|
|
6
|
+
*
|
|
7
|
+
* Shared by the two components that ask a user to bring another plugin in: `PluginSuggestionComponent`,
|
|
8
|
+
* which OFFERS one and keeps working without it, and `PluginGateComponent`, which REQUIRES one and
|
|
9
|
+
* does nothing until it is there. The offer and the requirement differ in what they do about the answer,
|
|
10
|
+
* not in how they read the state or how they install — so that part lives here rather than in both.
|
|
11
|
+
*/
|
|
12
|
+
import type { App } from 'obsidian';
|
|
13
|
+
import type { PluginNoticeComponent } from '../components/plugin-notice-component.mjs';
|
|
14
|
+
/**
|
|
15
|
+
* How another plugin is currently present in the vault.
|
|
16
|
+
*/
|
|
17
|
+
export declare enum InstalledPluginState {
|
|
18
|
+
/**
|
|
19
|
+
* Installed and enabled — there is nothing to do.
|
|
20
|
+
*/
|
|
21
|
+
Enabled = "enabled",
|
|
22
|
+
/**
|
|
23
|
+
* Installed but disabled. Only an enable is needed, so no download happens.
|
|
24
|
+
*/
|
|
25
|
+
InstalledButDisabled = "installedButDisabled",
|
|
26
|
+
/**
|
|
27
|
+
* Not installed at all.
|
|
28
|
+
*/
|
|
29
|
+
NotInstalled = "notInstalled"
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parameters for {@link getInstalledPluginState}.
|
|
33
|
+
*/
|
|
34
|
+
export interface GetInstalledPluginStateParams {
|
|
35
|
+
/**
|
|
36
|
+
* The Obsidian app instance.
|
|
37
|
+
*/
|
|
38
|
+
readonly app: App;
|
|
39
|
+
/**
|
|
40
|
+
* The `manifest.id` of the plugin to look for.
|
|
41
|
+
*/
|
|
42
|
+
readonly pluginId: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parameters for {@link getInstalledPluginVersion}.
|
|
46
|
+
*/
|
|
47
|
+
export interface GetInstalledPluginVersionParams {
|
|
48
|
+
/**
|
|
49
|
+
* The Obsidian app instance.
|
|
50
|
+
*/
|
|
51
|
+
readonly app: App;
|
|
52
|
+
/**
|
|
53
|
+
* The `manifest.id` of the plugin to look for.
|
|
54
|
+
*/
|
|
55
|
+
readonly pluginId: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parameters for {@link installAndEnablePlugin}.
|
|
59
|
+
*/
|
|
60
|
+
export interface InstallAndEnablePluginParams {
|
|
61
|
+
/**
|
|
62
|
+
* The Obsidian app instance.
|
|
63
|
+
*/
|
|
64
|
+
readonly app: App;
|
|
65
|
+
/**
|
|
66
|
+
* The `manifest.id` of the plugin to install and enable.
|
|
67
|
+
*/
|
|
68
|
+
readonly pluginId: string;
|
|
69
|
+
/**
|
|
70
|
+
* The display name of the plugin, shown to the user.
|
|
71
|
+
*/
|
|
72
|
+
readonly pluginName: string;
|
|
73
|
+
/**
|
|
74
|
+
* The notice component of the plugin doing the asking, used to report the outcome.
|
|
75
|
+
*/
|
|
76
|
+
readonly pluginNoticeComponent: PluginNoticeComponent;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolves how another plugin is currently present in the vault.
|
|
80
|
+
*
|
|
81
|
+
* @param params - The {@link GetInstalledPluginStateParams}.
|
|
82
|
+
* @returns The {@link InstalledPluginState}.
|
|
83
|
+
*/
|
|
84
|
+
export declare function getInstalledPluginState(params: GetInstalledPluginStateParams): InstalledPluginState;
|
|
85
|
+
/**
|
|
86
|
+
* Reads the version of another plugin as this vault has it installed, or `null` when it is not running.
|
|
87
|
+
*
|
|
88
|
+
* The version comes out of `app.plugins.manifests`, which is populated for every installed plugin at
|
|
89
|
+
* startup — so, unlike anything a plugin REGISTERS, it answers the same way no matter which plugin loaded
|
|
90
|
+
* first. That load-order independence is the whole reason a conflict is detected by version rather than by
|
|
91
|
+
* asking a registry.
|
|
92
|
+
*
|
|
93
|
+
* `null` for a plugin that is not installed OR is installed but disabled: a disabled plugin registers
|
|
94
|
+
* nothing, so for every question this answers the two cases are the same. An installed, enabled plugin
|
|
95
|
+
* whose manifest somehow carries no version reads as an empty string rather than `null`, which keeps
|
|
96
|
+
* "running, version unknown" distinguishable from "not running" — a caller comparing versions should fail
|
|
97
|
+
* closed on it rather than treat it as absent.
|
|
98
|
+
*
|
|
99
|
+
* @param params - The {@link GetInstalledPluginVersionParams}.
|
|
100
|
+
* @returns The installed version, or `null` when the plugin is not enabled.
|
|
101
|
+
*/
|
|
102
|
+
export declare function getInstalledPluginVersion(params: GetInstalledPluginVersionParams): null | string;
|
|
103
|
+
/**
|
|
104
|
+
* Installs (when needed) and enables another plugin, reporting the outcome as a notice.
|
|
105
|
+
*
|
|
106
|
+
* A no-op when the plugin is already enabled, so a caller reacting to a click need not check first.
|
|
107
|
+
*
|
|
108
|
+
* @param params - The {@link InstallAndEnablePluginParams}.
|
|
109
|
+
* @returns A {@link Promise} that resolves once the plugin is enabled.
|
|
110
|
+
* @throws Whatever the install or enable threw, after reporting it as a notice — the caller decides
|
|
111
|
+
* whether a failure is worth more than the notice the user has already seen.
|
|
112
|
+
*/
|
|
113
|
+
export declare function installAndEnablePlugin(params: InstallAndEnablePluginParams): Promise<void>;
|