@dbx-tools/appkit-mastra 0.6.75 → 0.6.76
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/lib/src/config.d.ts +1 -1
- package/lib/src/config.js +1 -1
- package/lib/src/plugin.d.ts +7 -8
- package/lib/src/plugin.js +8 -9
- package/lib/src/skill-paths.d.ts +3 -3
- package/lib/src/skill-paths.js +4 -4
- package/package.json +13 -13
- package/src/config.ts +1 -1
- package/src/plugin.ts +7 -8
- package/src/skill-paths.ts +3 -3
package/lib/src/config.d.ts
CHANGED
|
@@ -487,7 +487,7 @@ export interface MastraPluginConfig extends BasePluginConfig {
|
|
|
487
487
|
*
|
|
488
488
|
* - `"user"` (default): always OBO. Per-user attribution, and Genie / Unity
|
|
489
489
|
* Catalog row filters apply per user. Correct when every caller is a
|
|
490
|
-
* workspace member
|
|
490
|
+
* workspace member.
|
|
491
491
|
* - `"service-principal"`: always the app service principal. Needs no OBO
|
|
492
492
|
* scopes and works for any caller who can open the app, at the cost of
|
|
493
493
|
* per-user attribution in Genie / Unity Catalog.
|
package/lib/src/config.js
CHANGED
|
@@ -221,4 +221,4 @@ export const MASTRA_CONFIG_SCHEMA = {
|
|
|
221
221
|
},
|
|
222
222
|
},
|
|
223
223
|
};
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUs1RixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUd4RTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0FBRXpEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQXNCO0lBQzNELHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFB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QUNILElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7WUFDM0IsV0FBVyxFQUNULDRKQUE0SjtTQUMvSjtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsMkVBQTJFO1lBQzNFLDBFQUEwRTtZQUMxRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUN6QixXQUFXLEVBQ1QsNmZBQTZmO1NBQ2hnQjtRQUNELFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN4QixXQUFXLEVBQ1QscU9BQXFPO1NBQ3hPO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsMElBQTBJO1NBQzdJO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgc2hhcmVkIGBSZXF1ZXN0Q29udGV4dGAga2V5cy5cbiAqXG4gKiBPd25zIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdFxuICogY29uZmlnKSBhbmQge0BsaW5rIE1BU1RSQV9DT05GSUdfU0NIRU1BfSwgdGhlIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdFxuICogcHVibGlzaGVzIGZvciBpdCBzbyBzY2FmZm9sZGluZyB0b29scyBhbmQgYWdlbnRzIGNhbiByZWFkIHRoZSBvcHRpb24gc2V0LlxuICpcbiAqIFByZWNlZGVuY2UgcGVyIGZpZWxkIGlzIGV4cGxpY2l0IHBsdWdpbiBjb25maWcsIHRoZW4gdGhlIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZSBuYW1lZCBvbiB0aGUgZmllbGQsIHRoZW4gYSBidWlsdC1pbiBkZWZhdWx0LlxuICpcbiAqIEtlcHQgaW4gYSBsZWFmIG1vZHVsZSBzbyBgcGx1Z2luLnRzYCwgYHNlcnZlci50c2AsIGBtb2RlbC50c2AsIGFuZFxuICogYG1lbW9yeS50c2AgY2FuIGltcG9ydCB0aGVtIHdpdGhvdXQgY3JlYXRpbmcgYSBjeWNsZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIENvbmZpZ1NjaGVtYSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFUb29scyB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgeyBJREVOVElUWV9NT0RFUywgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVTa2lsbHNPcHRpb24gfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgdW5kZXIgd2hpY2gge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RvcmVzIHRoZVxuICogcmVzb2x2ZWQgQXBwS2l0IHVzZXIuIGBtb2RlbC50c2AgcmVhZHMgaXQgdG8gbWludCB1c2VyLXNjb3BlZFxuICogRGF0YWJyaWNrcyB0b2tlbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9LRVkgPSBcIm1hc3RyYV9fdXNlclwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5cyBmb3IgQXBwS2l0IHVzZXIgbWV0YWRhdGEgc3RhbXBlZCBieVxuICoge0BsaW5rIE1hc3RyYVNlcnZlcn0uIFN1cmZhY2VkIGFzIHRyYWNlIG1ldGFkYXRhIHZpYVxuICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBzbyB0cmFjZXMgYXJlIGZpbHRlcmFibGUgYnkgd2hvXG4gKiBpc3N1ZWQgdGhlIHJlcXVlc3Qgd2l0aG91dCBsZWFraW5nIHRoZSBmdWxsIHVzZXIgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfTkFNRV9LRVkgPSBcIm1hc3RyYV9fdXNlck5hbWVcIjtcbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9FTUFJTF9LRVkgPSBcIm1hc3RyYV9fdXNlckVtYWlsXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgZm9yIHRoZSBwZXItSFRUUC1yZXF1ZXN0IGlkIHN0YW1wZWQgYnlcbiAqIHtAbGluayBNYXN0cmFTZXJ2ZXJ9LiBSZWFkcyBgWC1SZXF1ZXN0LUlkYCBmcm9tIHRoZSBpbmNvbWluZ1xuICogaGVhZGVycyB3aGVuIHByZXNlbnQgKHNvIGFuIHVwc3RyZWFtIGxvYWQgYmFsYW5jZXIgLyBBUEkgZ2F0ZXdheVxuICogY2FuIGtlZXAgaXRzIHRyYWNlIGNvcnJlbGF0aW9uKSwgZmFsbHMgYmFjayB0byBhIGZyZXNobHkgbWludGVkXG4gKiBVVUlELiBFY2hvZWQgYmFjayBvbiB0aGUgcmVzcG9uc2UgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IHNwYW4gdmlhXG4gKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IHNvIGxvZ3MgYW5kIHRyYWNlcyBzaGFyZSBhXG4gKiBqb2luIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9SRVFVRVNUX0lEX0tFWSA9IFwibWFzdHJhX19yZXF1ZXN0SWRcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSBmb3IgT0F1dGggc2NvcGVzIHBhcnNlZCBmcm9tIHRoZSBmb3J3YXJkZWRcbiAqIGFjY2VzcyB0b2tlbiBieSB7QGxpbmsgTWFzdHJhU2VydmVyLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzfS5cbiAqIFdvcmtzcGFjZSBtb3VudHMgdGhhdCB0b3VjaCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcyByZXF1aXJlXG4gKiBgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIGluIHRoaXMgbGlzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9TQ09QRVNfS0VZID0gXCJtYXN0cmFfX3Njb3Blc1wiO1xuXG4vKipcbiAqIENhbm9uaWNhbCBsaXN0IG9mIGBSZXF1ZXN0Q29udGV4dGAga2V5cyB3ZSB3YW50IE1hc3RyYSB0byBleHRyYWN0XG4gKiBhcyBtZXRhZGF0YSBvbiBldmVyeSBvYnNlcnZhYmlsaXR5IHNwYW4gKGFnZW50IHJ1bnMsIG1vZGVsIGNhbGxzLFxuICogdG9vbCBpbnZvY2F0aW9ucywgd29ya2Zsb3cgc3RlcHMpLlxuICpcbiAqIE1pcnJvcnMge0BsaW5rIGh0dHBzOi8vbWFzdHJhLmFpL2RvY3Mvb2JzZXJ2YWJpbGl0eS90cmFjaW5nL292ZXJ2aWV3I2F1dG9tYXRpYy1tZXRhZGF0YS1mcm9tLXJlcXVlc3Rjb250ZXh0fTpcbiAqIHBhc3NlZCB2ZXJiYXRpbSBpbnRvIGBPYnNlcnZhYmlsaXR5LmNvbmZpZ3NbKl0ucmVxdWVzdENvbnRleHRLZXlzYCxcbiAqIHNvIGFueSBrZXkgbGlzdGVkIGhlcmUgaXMgcmVhZCBmcm9tIGBSZXF1ZXN0Q29udGV4dGAgYXQgdHJhY2VcbiAqIHN0YXJ0IGFuZCBhdHRhY2hlZCBhcyBzY2FsYXIgc3BhbiBtZXRhZGF0YS4gS2VlcCB0aGUgc2V0IHRvIHBsYWluXG4gKiBzY2FsYXJzIC0gbmV2ZXIgaW5jbHVkZSB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSAoaXQgY2FycmllcyB0aGVcbiAqIGZ1bGwgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggYSBgV29ya3NwYWNlQ2xpZW50YCByZWZlcmVuY2UpLlxuICpcbiAqIE9yZGVyIGlzIHB1cmVseSBjb3NtZXRpYzsgTWFzdHJhIGRlLWR1cGVzIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIC8vIE1vZGVsIG92ZXJyaWRlIGtleSBpcyBvd25lZCBieSBgc2VydmluZy50c2A7IHNwZWxsZWQgaW5saW5lIGhlcmVcbiAgLy8gc28gdGhpcyBtb2R1bGUgc3RheXMgbGVhZi1sZXZlbCAobm8gY3ljbGVzIHdpdGggYHNlcnZpbmcudHNgKS5cbiAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG5dO1xuXG4vKiogQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHBsdXMgdGhlIGNhbm9uaWNhbCB1c2VyIGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgaWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBpZGVudGl0eSBmb3IgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0OiB0aGUgT0JPIHVzZXIgaWQgb24gYVxuICogdXNlci1zY29wZWQgY2FsbCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkO1xufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgd2hpY2ggaXMgbm90IGFsd2F5cyB3aG9zZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWxcbiAqIHJ1bnMgaXQuIEFuIE9CTyBjb250ZXh0J3Mgb3duIHVzZXIgaWQgaXMgYXV0aG9yaXRhdGl2ZS4gVW5kZXIgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCwgZXZlcnkgY2FsbGVyIHNoYXJlcyBvbmUgY3JlZGVudGlhbCwgc28gdGhlIGZvcndhcmRlZCB1c2VyIGlkIGlzXG4gKiB3aGF0IGtlZXBzIG1lbW9yeSB0aHJlYWRzIGFuZCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2VzIGRpc3RpbmN0OyB0aGUgc2VydmljZVxuICogcHJpbmNpcGFsIGlkIGlzIHRoZSBmbG9vciB3aGVuIG5vIHVzZXIgd2FzIGZvcndhcmRlZC5cbiAqXG4gKiBUaGlzIHJ1bGUgaGFzIHRvIGJlIGlkZW50aWNhbCBldmVyeXdoZXJlIGEgY2FjaGUga2V5IGlzIGJ1aWx0LCBzbyBib3RoIHRoZVxuICogd3JpdGUgc2lkZSAodGhlIGBSZXF1ZXN0Q29udGV4dGAgdXNlciBzdGFtcGVkIGJ5IGBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcmApXG4gKiBhbmQgdGhlIHJlYWQgc2lkZSAodGhlIHBsdWdpbidzIG93biBBcHBLaXQgcm91dGVzLCB3aGljaCBoYXZlIGEgcmVxdWVzdCBidXRcbiAqIG5vIGBSZXF1ZXN0Q29udGV4dGApIGRlcml2ZSB0aGVpciBrZXkgZnJvbSB0aGlzIG9uZSBmdW5jdGlvbi4gV2hlbiB0aGUgdHdvXG4gKiBkaXNhZ3JlZWQsIGEgY2hhcnQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgd2FzIHJlYWQgYmFjayB1bmRlclxuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIGFuZCB0aGUgZW1iZWQgcm91dGUgYW5zd2VyZWQgNDA0LCB3aGljaCB0aGUgY2hhdCBVSVxuICogcmVuZGVycyBhcyBhbiBleHBpcmVkIGNoYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlZFVzZXJJZChcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlLFxuICBmb3J3YXJkZWRVc2VySWQ/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBpZiAoXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCkgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCk7XG4gIHJldHVybiBmb3J3YXJkZWRVc2VySWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChleGVjdXRpb25Db250ZXh0KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBldmVyeSBwZXItdXNlciBjYWNoZSBlbnRyeSBpcyBuYW1lc3BhY2VkIHVuZGVyLCBzbyBhbiBPQk8gcmVzdWx0XG4gKiBjYW5ub3QgYmUgcmVhZCBiYWNrIGJ5IGFub3RoZXIgY2FsbGVyLlxuICpcbiAqIFByZWZlcnMgdGhlIHtAbGluayBVc2VyfSB0aGF0IHtAbGluayBNYXN0cmFTZXJ2ZXJ9IHN0YW1wcyBvbiB0aGUgcmVxdWVzdFxuICogY29udGV4dCwgd2hvc2UgaWQgYWxyZWFkeSBmb2xsb3dzIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfS4gVGhlIE1DUCB0cmFuc3BvcnRcbiAqIHJvdXRlcyBkbyBub3QgdGhyZWFkIHRoYXQgY29udGV4dCBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyB0aG9zZSBmYWxsIGJhY2sgdG9cbiAqIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0ICh0aGUgYWN0aXZlIE9CTyBzY29wZSwgb3IgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCkuIEEgY2FsbGVyIGhvbGRpbmcgYW4gZXhwcmVzcyByZXF1ZXN0IHNob3VsZCBidWlsZCBpdHMga2V5IGZyb21cbiAqIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSBpbnN0ZWFkLCBzbyB0aGUgZm9yd2FyZGVkIHVzZXIgaXMgbm90IGxvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdXNlcj8uaWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCkpO1xufVxuXG4vKiogUGdWZWN0b3IgY29uZmlnIHdpdGggYW4gb3B0aW9uYWwgTWFzdHJhIHN0b3JlIGlkLiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnID0gUGdWZWN0b3JDb25maWcgJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXIgZXhwb3N1cmVcbiAqICh7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLm1jcH0pLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbDsgdGhlIG9iamVjdFxuICogZm9ybSBvbmx5IG5lZWRzIHRvIHNldCB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhTWNwQ29uZmlnIHtcbiAgLyoqXG4gICAqIFNlcnZlciBpZCB1c2VkIGluIHRoZSByb3V0ZSBwYXRoIChgL21jcC88c2VydmVySWQ+Ly4uLmApIGFuZCBhcyB0aGVcbiAgICogTUNQIHJlZ2lzdHJ5IGlkLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKi9cbiAgc2VydmVySWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gRGVmYXVsdHMgdG8gYFwiPGRpc3BsYXlOYW1lPiBNQ1BcImAuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTZW1hbnRpYyB2ZXJzaW9uIGFkdmVydGlzZWQgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGBcIjEuMC4wXCJgLiAqL1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHBvc2UgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBhcyBhbiBgYXNrXzxhZ2VudElkPmAgTUNQIHRvb2wuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYCAtIHRoaXMgaXMgdGhlIFwibGV2ZXJhZ2UgdGhlIE1hc3RyYSBhZ2VudHMgb3ZlclxuICAgKiBNQ1BcIiBiZWhhdmlvciBtb3N0IGNhbGxlcnMgd2FudC5cbiAgICovXG4gIGFnZW50cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbHNvIGV4cG9zZSB0aGUgcGx1Z2luJ3MgYW1iaWVudCB0b29scyAodGhlIGJ1aWx0LWluIGByZW5kZXJfZGF0YWBcbiAgICogcGx1cyBhbnl0aGluZyBpbiBgY29uZmlnLnRvb2xzYCkgYXMgTUNQIHRvb2xzLiBEZWZhdWx0cyB0byBgZmFsc2VgOlxuICAgKiB0aGUgYW1iaWVudCB0b29scyBhc3N1bWUgYW4gaW4tcHJvY2VzcyBjaGF0IHR1cm4gKHRoZXkgcHVibGlzaFxuICAgKiB3cml0ZXIgZXZlbnRzIHRoZSBjaGF0IFVJIGNvbnN1bWVzKSwgc28gdGhleSBhcmVuJ3QgdXNlZnVsIHRvIGFcbiAgICogc3RhbmRhbG9uZSBNQ1AgY2xpZW50LiBUdXJuIHRoaXMgb24gb25seSB3aGVuIHRob3NlIHRvb2xzIGFyZSBzYWZlXG4gICAqIHRvIGNhbGwgb3V0LW9mLWJhbmQuXG4gICAqL1xuICB0b29scz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFeHRyYSB0b29scyB0byBleHBvc2Ugb3ZlciBNQ1AgYmV5b25kIHRoZSBhZ2VudCAvIGFtYmllbnQgc2V0cy5cbiAgICogVXNlIHRoaXMgZm9yIHRvb2xzIHdyaXR0ZW4gc3BlY2lmaWNhbGx5IGZvciBNQ1AgY29uc3VtZXJzLlxuICAgKi9cbiAgZXh0cmFUb29scz86IE1hc3RyYVRvb2xzO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBhY2NlcHRlZCBieSB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogTWFzdHJhIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGlkLiBEZWZhdWx0cyB0byBgXCJkYXRhYnJpY2tzXCJgOyBubyBlbnYgZmFsbGJhY2suICovXG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQb3N0Z3Jlc1N0b3JlIGZvciBNYXN0cmEgdGhyZWFkcy9tZXNzYWdlcy4gYHRydWVgIHJldXNlcyB0aGVcbiAgICogYGxha2ViYXNlYCBwbHVnaW4ncyBwb29sOyBhbiBvYmplY3Qgb3BlbnMgYSBkZWRpY2F0ZWQgc3RvcmUuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IFBvc3RncmVzU3RvcmVDb25maWc7XG4gIC8qKlxuICAgKiBQZ1ZlY3RvciBzdG9yZSBmb3IgTWFzdHJhIG1lbW9yeSByZWNhbGwuIGB0cnVlYCByZXVzZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZztcbiAgLyoqXG4gICAqIENvZGUtZGVmaW5lZCBhZ2VudHMuIEFjY2VwdHMgdGhyZWUgc2hhcGVzIGZvciBjb252ZW5pZW5jZTpcbiAgICpcbiAgICogLSAqKlJlY29yZCoqOiBgeyBhbmFseXN0OiBkZWYsIGhlbHBlcjogZGVmIH1gIC0ga2V5cyBiZWNvbWUgdGhlXG4gICAqICAgcmVnaXN0ZXJlZCBpZHMgYW5kIHRoZSBmaXJzdCBrZXkgaXMgdGhlIGRlZmF1bHQuXG4gICAqIC0gKipTaW5nbGUgZGVmaW5pdGlvbioqOiBgZGVmYCAtIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgXCJkZWZhdWx0XCJgIHdoZW4gYG5hbWVgIGlzIG9taXR0ZWQpIGFuZFxuICAgKiAgIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHRoZSBkZWZhdWx0IGFnZW50LlxuICAgKiAtICoqQXJyYXkqKjogYFtkZWYxLCBkZWYyXWAgLSBlYWNoIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgYWdlbnRfJHtpfWAgd2hlbiBgbmFtZWAgaXMgb21pdHRlZCk7XG4gICAqICAgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBFYWNoIGVudHJ5IGJlY29tZXMgYSBNYXN0cmEgYEFnZW50YCByZWFjaGFibGUgYXRcbiAgICogYC9hcGkvPHBsdWdpbj4vcm91dGUvY2hhdC88aWQ+YCAodGhlIGNoYXQgcm91dGUgYWxzbyBtYXRjaGVzXG4gICAqIGA6YWdlbnRJZGApLiBXaGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHksIHRoZSBwbHVnaW5cbiAgICogcmVnaXN0ZXJzIGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlXG4gICAqIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nIGNoYXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBleGFtcGxlIFNpbmdsZS1hZ2VudCBzaG9ydGhhbmRcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIEFycmF5XG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiBbXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiYW5hbHlzdFwiLCBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiaGVscGVyXCIsIGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICBdLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFJlY29yZCAoZXhwbGljaXQgaWRzKVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czoge1xuICAgKiAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgIH0sXG4gICAqICAgZGVmYXVsdEFnZW50OiBcImFuYWx5c3RcIixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWdlbnRzPzogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbltdO1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzcHJlYWQgaW50byBldmVyeSByZWdpc3RlcmVkIGFnZW50J3MgdG9vbHMgcmVjb3JkO1xuICAgKiBwZXItYWdlbnQgdG9vbHMgd2luIG9uIGtleSBjb2xsaXNpb24uIFVzZSBmb3IgYSBzbWFsbCBzaGFyZWRcbiAgICogbGlicmFyeTsgZm9yIHBlci1hZ2VudCB0b29scyBzZXQgYGFnZW50c1tpZF0udG9vbHNgIGluc3RlYWQuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzO1xuICAvKipcbiAgICogQWdlbnQgaWQgdXNlZCB3aGVuIHRoZSBjbGllbnQgZG9lc24ndCBzcGVjaWZ5IG9uZSAodGhlIGJhcmUsXG4gICAqIHVuLXN1ZmZpeGVkIGhpc3RvcnkgLyBzdWdnZXN0aW9ucyByb3V0ZXMgcmVzb2x2ZSB0byBpdCkuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBrZXkgaW4gYGFnZW50c2AgKG9yIGBcImRlZmF1bHRcImAgd2hlblxuICAgKiBgYWdlbnRzYCBpcyBvbWl0dGVkKS4gTXVzdCBtYXRjaCBhbiBpZCBpbiBgYWdlbnRzYCB3aGVuIGJvdGggYXJlXG4gICAqIHNldDsgYSBtaXNtYXRjaCB0aHJvd3MgYXQgc2V0dXAgd2l0aCB0aGUgYXZhaWxhYmxlIGNhbmRpZGF0ZXMuXG4gICAqL1xuICBkZWZhdWx0QWdlbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbHVnaW4tbGV2ZWwgZGVmYXVsdCBtb2RlbCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzXG4gICAqIG93biBgbW9kZWxgLiBNaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICAgKlxuICAgKiAtIGBzdHJpbmdgOiBzaG9ydGhhbmQgZm9yIFwidXNlIHRoZSBPQk8gYXV0by1yZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCJgKS5cbiAgICogLSBBbnkgb3RoZXIgTWFzdHJhIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YDogcGFzc2VkXG4gICAqICAgdGhyb3VnaCB2ZXJiYXRpbS4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsIGNvbnRyb2wgb3ZlciBhdXRoXG4gICAqICAgb3IgYHByb3ZpZGVySWRgLlxuICAgKlxuICAgKiBSZXNvbHV0aW9uIG9yZGVyIHBlciBhZ2VudDogYGRlZi5tb2RlbGAg4oaSIGBkZWZhdWx0TW9kZWxgIOKGklxuICAgKiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIOKGkiBidWlsdC1pbiBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICAgKiByZXNvbHZlci5cbiAgICovXG4gIGRlZmF1bHRNb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyAoYFwiY2xhdWRlIHNvbm5ldFwiYCkgYWdhaW5zdCB0aGUgd29ya3NwYWNlJ3NcbiAgICogTW9kZWwgU2VydmluZyBlbmRwb2ludHMuIERlZmF1bHRzIHRvIGB0cnVlYDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBTZXQgYGZhbHNlYCB0byByZXF1aXJlIGV4YWN0IGVuZHBvaW50IG5hbWVzIGV2ZXJ5d2hlcmUuXG4gICAqL1xuICBtb2RlbEZ1enp5TWF0Y2g/OiBib29sZWFuO1xuICAvKipcbiAgICogRnVzZS5qcyBzY29yZSB0aHJlc2hvbGQgZm9yIHRoZSBmdXp6eSBtYXRjaGVyLCAwIChleGFjdCkgdG8gMSAoYW55dGhpbmcpLlxuICAgKiBEZWZhdWx0cyB0byBgMC40YDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBMb3dlciB2YWx1ZXMgcmVqZWN0IGxvb3NlIG1hdGNoZXM7IHJhaXNlIGl0IGlmIHlvdSBoYXZlIGEgc3ByYXdsaW5nXG4gICAqIGVuZHBvaW50IGNhdGFsb2d1ZSB3aXRoIHNpbWlsYXItbG9va2luZyBuYW1lcy5cbiAgICovXG4gIG1vZGVsRnV6enlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBEZWZhdWx0cyB0byA1IG1pbnV0ZXM7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogVGhlIGNhY2hlIGlzIHBlciB3b3Jrc3BhY2UgaG9zdCBhbmQgc2hhcmVkIGFjcm9zcyB1c2VyczsgY29uY3VycmVudFxuICAgKiBjYWxsZXJzIGNvYWxlc2NlIG9uIGEgc2luZ2xlIGluLWZsaWdodCBmZXRjaC5cbiAgICovXG4gIG1vZGVsQ2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIExldCBjbGllbnRzIHBpY2sgdGhlIGJhY2tpbmcgZW5kcG9pbnQgcGVyIHJlcXVlc3QuIERlZmF1bHRzIHRvIGB0cnVlYDtcbiAgICogbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBSZWFkcyB0aGUgYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXIsIHRoZSBgP21vZGVsPWAgcXVlcnkgc3RyaW5nLCBvciBhXG4gICAqIGBtb2RlbGAgYm9keSBmaWVsZCwgaW4gdGhhdCBvcmRlci4gRGlzYWJsZSB3aGVuIHJ1bm5pbmcgbXVsdGktdGVuYW50XG4gICAqIHdoZXJlIHVudHJ1c3RlZCBjbGllbnRzIHNob3VsZG4ndCBjaG9vc2UgdGhlIGVuZHBvaW50LlxuICAgKi9cbiAgbW9kZWxPdmVycmlkZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcmlvcml0eS1vcmRlcmVkIGxpc3Qgb2YgZW5kcG9pbnQgbmFtZXMgdHJpZWQgKmZpcnN0KiB3aGVuIG5vXG4gICAqIGFnZW50IC8gcGx1Z2luIC8gZW52IC8gcmVxdWVzdC1vdmVycmlkZSBtb2RlbCBpZCBpcyBzZXQsIGFoZWFkIG9mXG4gICAqIHRoZSBkeW5hbWljIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlLiBUaGUgcmVzb2x2ZXIgcGlja3MgdGhlXG4gICAqIGZpcnN0IGlkIHRoYXQgaXMgYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgd29ya3NwYWNlJ3NcbiAgICogYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZy5cbiAgICpcbiAgICogV2hlbiB1bnNldCwgcmVzb2x1dGlvbiBpcyBkcml2ZW4gYnkgdGhlIGxpdmUgRm91bmRhdGlvbiBNb2RlbCBBUElcbiAgICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXM6IGVuZHBvaW50cyBhcmUgY2xhc3NpZmllZCBpbnRvXG4gICAqIGNoYXQgY2xhc3NlcyAoYGNsYXNzaWZ5RW5kcG9pbnRzYCkgYW5kIHdhbGtlZCBiZXN0LWZpcnN0XG4gICAqIChDaGF0VGhpbmtpbmcgLT4gQ2hhdEJhbGFuY2VkIC0+IENoYXRGYXN0KSwgd2l0aCB0aGUgc21hbGwgYnVpbHQtaW5cbiAgICogYEZBTExCQUNLX01PREVMX0lEU2AgbGlzdCBhcyB0aGUgZmxvb3Igd2hlbiB0aGUgY2F0YWxvZ3VlIGNhbid0IGJlXG4gICAqIHJlYWQuIFNldCB0aGlzIHRvXG4gICAqIHBpbiBhIHJlZ3VsYXRlZCB3b3Jrc3BhY2UgdG8gYW4gYXBwcm92ZWQgc3Vic2V0LCBvciB0byBwdXQgY3VzdG9tXG4gICAqIGVuZHBvaW50cyBpbiBmcm9udCBvZiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbEZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKGRlZmF1bHQpLCBldmVyeSBhZ2VudCBnZXRzIGEgYnVpbHQtaW4gaW5wdXRcbiAgICogcHJvY2Vzc29yIHRoYXQgc3RyaXBzIGBjaGFydElkYCBmaWVsZHMgZnJvbSBwcmlvciBhc3Npc3RhbnRcbiAgICogdG9vbC1pbnZvY2F0aW9uIHJlc3VsdHMgYmVmb3JlIHRoZXkgcmVhY2ggdGhlIG1vZGVsLiBUaGlzXG4gICAqIHByZXZlbnRzIHRoZSBtb2RlbCBmcm9tIHJldXNpbmcgdHVybi1zY29wZWQgY2hhcnRJZHMgaXQgc2Vlc1xuICAgKiBpbiBtZW1vcnkgcmVjYWxsICh3aGljaCB3b3VsZCBsZWF2ZSBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzXG4gICAqIHBvaW50aW5nIGF0IHdyaXRlciBldmVudHMgdGhhdCBubyBsb25nZXIgZXhpc3QpLlxuICAgKlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBvcHQgb3V0IC0gdXNlZnVsIGlmIGEgbm9uLWRlZmF1bHQgYWdlbnRcbiAgICogbmVlZHMgZnVsbCB2aXNpYmlsaXR5IGludG8gcHJpb3IgY2hhcnRJZHMgKGUuZy4gYW4gYXVkaXRcbiAgICogYWdlbnQgcmVhc29uaW5nIGFib3V0IGNoYXJ0IGxpbmVhZ2UpLlxuICAgKi9cbiAgc3RyaXBTdGFsZUNoYXJ0cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICAgKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCB0aHJvd2F3YXlcbiAgICogY2xvc2VycywgZXhjZXNzaXZlIGhlZGdpbmcpLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogdXNlIHRoZSBidWlsdC1pblxuICAgKiAgIGBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OU2AgZnJvbSBgYWdlbnRzLnRzYC5cbiAgICogLSBgc3RyaW5nYDogcmVwbGFjZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSBzdXBwbGllZCBibG9jay5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIGVudGlyZWx5IChhZ2VudHMgc2VlIG9ubHkgdGhlaXIgYmVzcG9rZVxuICAgKiAgIGBpbnN0cnVjdGlvbnNgKS5cbiAgICpcbiAgICogQXBwZW5kZWQgKG5vdCBwcmVwZW5kZWQpIHNvIHRoZSBhZ2VudCdzIHJvbGUgYW5kIHJ1bGVzIGNvbWUgZmlyc3RcbiAgICogYW5kIHRoZSBzdHlsZSBibG9jayBsZWFucyBvbiB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMuXG4gICAqL1xuICBzdHlsZUluc3RydWN0aW9ucz86IHN0cmluZyB8IGZhbHNlO1xuICAvKipcbiAgICogR2VuaWUgc3BhY2VzIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIGNhbiBkZWxlZ2F0ZSB0by4gT25lIE1hc3RyYVxuICAgKiB0b29sIGlzIHJlZ2lzdGVyZWQgcGVyIGFsaWFzIChgZ2VuaWVgIGZvciB0aGUgd2VsbC1rbm93blxuICAgKiBgZGVmYXVsdGAgYWxpYXMsIGBnZW5pZV88YWxpYXM+YCBvdGhlcndpc2UpLiBFYWNoIHRvb2wgc3BpbnNcbiAgICogdXAgYSBwZXItcXVlc3Rpb24gR2VuaWUgc3ViLWFnZW50IHRoYXQgcnVucyBEYXRhYnJpY2tzXG4gICAqIFwiYWdlbnQgbW9kZVwiIGFnYWluc3QgdGhlIHNwYWNlLCBicm9hZGNhc3RzIHdpcmUgZXZlbnRzIHRvIHRoZVxuICAgKiBVSSwgZmV0Y2hlcyBzdGF0ZW1lbnQgcm93cyBmb3Igbm9uLWVtcHR5IHJlc3VsdHMsIGFuZCByZXR1cm5zXG4gICAqIGEgYChzdHJpbmcgfCBkYXRhIHwgY2hhcnQpW11gIHN1bW1hcnkgdGhlIGhvc3QgVUkgcmVuZGVyc1xuICAgKiBpbmxpbmUuXG4gICAqXG4gICAqIEVudHJpZXMgYWNjZXB0IGVpdGhlciBhIGZ1bGwge0BsaW5rIEdlbmllU3BhY2VDb25maWd9IG9iamVjdFxuICAgKiBvciBhIGJhcmUgYHNwYWNlX2lkYCBzdHJpbmcgd2hlbiBubyBleHRyYXMgYXJlIG5lZWRlZDpcbiAgICpcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBnZW5pZVNwYWNlczoge1xuICAgKiAgICAgZGVmYXVsdDogXCIwMWVmMGQzYzBlMWIxZjRhOGQyYzNlNGY1YTZiN2M4ZFwiLFxuICAgKiAgICAgZm9yZWNhc3RzOiB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiLCBoaW50OiBcIndlZWtseSBkZW1hbmQgZm9yZWNhc3RzXCIgfSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJlYWNoIHRoZSBzcGFjZXMgZnJvbSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgdmlhXG4gICAqIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgOyB0aGUgcmVzdWx0aW5nIHRvb2xzIGFjY2VwdFxuICAgKiBgeyBjb250ZW50LCBjb252ZXJzYXRpb25JZD8gfWAgYW5kIHJldHVybiBhIGh5ZHJhdGVkIHN1bW1hcnkuXG4gICAqXG4gICAqICoqRmFsbGJhY2sgZGlzY292ZXJ5KiogKGhpZ2hlc3QgcHJlY2VkZW5jZSBmaXJzdCk6IGlmIHRoaXNcbiAgICogZmllbGQgaXMgb21pdHRlZCwgdGhlIEdlbmllIGFnZW50IGFsc28gcGlja3MgdXAgc3BhY2VzIGZyb21cbiAgICogKDEpIHRoZSBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2VcbiAgICogd2hlbiByZWdpc3RlcmVkLCBhbmQgKDIpIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGBcbiAgICogZW52IHZhciAocmVnaXN0ZXJlZCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzKS4gVGhpcyBrZWVwc1xuICAgKiBleGlzdGluZyBBcHBLaXQgZGVwbG95bWVudHMgd29ya2luZyB3aXRob3V0IHJlc3RhdGluZyB0aGVcbiAgICogc3BhY2VzIGNvbmZpZyBpbiB0d28gcGxhY2VzLlxuICAgKi9cbiAgZ2VuaWVTcGFjZXM/OiBHZW5pZVNwYWNlc0NvbmZpZztcbiAgLyoqXG4gICAqIFRUTCBmb3IgdGhlIGluLW1lbW9yeSBHZW5pZSBzcGFjZSBtZXRhZGF0YSBjYWNoZSwgaW5cbiAgICogbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuIFRoZSBHZW5pZSBhZ2VudCBjYWxsc1xuICAgKiBgY2xpZW50LmdlbmllLmdldFNwYWNlKC4uLilgIG9uIGV2ZXJ5IGNvbGQtc3RhcnQgdG8gZ2V0IHRoZVxuICAgKiB0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkOyBjYWNoZWQgcmVzcG9uc2VzIHNraXAgdGhlXG4gICAqIHJvdW5kLXRyaXAgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZVxuICAgKiBpbi1mbGlnaHQgZmV0Y2guIERyb3AgdG8gYSBzbWFsbGVyIHZhbHVlIHdoZW4gYW5hbHlzdHMgYXJlXG4gICAqIGFjdGl2ZWx5IGVkaXRpbmcgc3BhY2UgbWV0YWRhdGEgYW5kIHlvdSB3YW50IGNoYW5nZXMgdmlzaWJsZVxuICAgKiB3aXRoaW4gc2Vjb25kczsgcmFpc2UgaXQgdG8gYW1vcnRpc2UgdGhlIHJvdW5kLXRyaXAgd2hlblxuICAgKiBzcGFjZSBtZXRhZGF0YSBpcyBlZmZlY3RpdmVseSBmcm96ZW4uXG4gICAqXG4gICAqIEJhY2tlZCBieSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYCwgc28gdGhlIGNhY2hlIHBhcnRpY2lwYXRlc1xuICAgKiBpbiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSBhbmQgYmVuZWZpdHMgZnJvbVxuICAgKiBMYWtlYmFzZSBwZXJzaXN0ZW5jZSB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAgICovXG4gIGdlbmllU3BhY2VDYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuLiBPbmUgc3RlcCA9IG9uZVxuICAgKiByb3VuZC10cmlwIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIChhIHRvb2wgY2FsbCBjb25zdW1lcyBhXG4gICAqIHN0ZXAsIHRoZSBmaW5hbC10ZXh0IHJlcGx5IGNvbnN1bWVzIG9uZSB0b28pLiBBcHBsaWVzIHRvXG4gICAqIGV2ZXJ5IGFnZW50IHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50c31cbiAgICogLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFyZW4ndCBzdXJmYWNlZCB5ZXQgYmVjYXVzZSB0aGUgc2FtZVxuICAgKiBjZWlsaW5nIGhhcyBiZWVuIHN1ZmZpY2llbnQgYWNyb3NzIGV2ZXJ5IHdvcmtsb2FkIHdlJ3ZlIHJ1bi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTfSAoMjUpLCBzaXplZCB0byBmaXRcbiAgICogYSBkZWNvbXBvc2VkIEdlbmllIHR1cm4gKGdyb3VuZGluZyArIHNldmVyYWwgYGFza19nZW5pZWAgY2FsbHNcbiAgICogKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICAgKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gICAqIGFuc3dlcmluZy4gTWFzdHJhJ3Mgb3duIGBhZ2VudC5nZW5lcmF0ZWAgZGVmYXVsdCBvZiA1IHdvdWxkXG4gICAqIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIGFmdGVyIDItMyB0b29sIGNhbGxzLCBzb1xuICAgKiBleHBsaWNpdGx5IHJhaXNpbmcgdGhlIGNlaWxpbmcgaGVyZSBpcyB3aGF0IGxldHMgdGhlXG4gICAqIGFnZW50LW1vZGUgbG9vcCBwbGF5IG91dC5cbiAgICpcbiAgICogTG93ZXIgd2hlbiBhbiB1bnVzdWFsbHkgc2xvdyBvciBleHBlbnNpdmUgbW9kZWwgbWFrZXMgbG9uZ1xuICAgKiB0dXJucyB1bmFmZm9yZGFibGU7IHJhaXNlIGZvciBleHBsb3JhdG9yeSB3b3JrbG9hZHMgdGhhdCBuZWVkXG4gICAqIHRvIGRyaWxsIGRlZXAgaW50byBhIGRhdGFzZXQgd2l0aGluIGEgc2luZ2xlIHR1cm4uXG4gICAqL1xuICBhZ2VudE1heFN0ZXBzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2lyZSBNYXN0cmEgc3BhbnMgaW50byBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSB2aWFcbiAgICogYEBtYXN0cmEvb3RlbC1icmlkZ2VgLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogb24gb25seSB3aGVuXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgb3JcbiAgICogICBgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVGAgaXMgc2V0LiBXaGVuIHVuc2V0LCB0aGVcbiAgICogICBicmlkZ2UgaXMgc2tpcHBlZCBzbyBNYXN0cmEgZG9lcyBub3QgbG9nXG4gICAqICAgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW4gZm91bmRgIG9uIHRoZSBub29wIHRyYWNlci5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uIGV2ZW4gd2l0aG91dCBhbiBPVExQIGVuZHBvaW50LlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi5cbiAgICovXG4gIG9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuICAvKipcbiAgICogTG9nIHVzZXIgZmVlZGJhY2sgKHRodW1icyB1cC9kb3duICsgZnJlZWZvcm0gY29tbWVudHMpIHRvIE1MZmxvdyBhc1xuICAgKiB0cmFjZSBhc3Nlc3NtZW50cywgYW5kIHN1cmZhY2UgdGhlIGZlZWRiYWNrIGNvbnRyb2xzIGluIHRoZSBjaGF0IFVJLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogZW5hYmxlZCBvbmx5IHdoZW4gTUxmbG93IHRyYWNpbmcgaXNcbiAgICogICB3aXJlZCAtIGFuIE9UTFAgZXhwb3J0ZXIgZW5kcG9pbnQgaXMgc2V0IGFuZCBhbiBNTGZsb3cgZXhwZXJpbWVudFxuICAgKiAgIGlzIG5hbWVkICh0aGUgc2FtZSBzaWduYWxzIHRoZSBvYnNlcnZhYmlsaXR5IHBpcGVsaW5lIG5lZWRzIHRvXG4gICAqICAgc2hpcCB0cmFjZXMgdG8gTUxmbG93KS4gT3RoZXJ3aXNlIG9mZiwgc2luY2UgdGhlcmUnZCBiZSBubyB0cmFjZVxuICAgKiAgIHRvIGF0dGFjaCBmZWVkYmFjayB0by5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uLiBGZWVkYmFjayBjb250cm9scyBzaG93IGFuZCB3cml0ZXMgYXJlIGF0dGVtcHRlZFxuICAgKiAgIHJlZ2FyZGxlc3Mgb2YgZW52IGRldGVjdGlvbiAodXNlIHdoZW4gdGhlIGVudiBpcyBjb25maWd1cmVkIGluIGFcbiAgICogICB3YXkgdGhlIGF1dG8tcHJvYmUgZG9lc24ndCByZWNvZ25pemUpLlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi4gTm8gdHJhY2UtaWQgaGVhZGVyLCBubyBmZWVkYmFjayByb3V0ZSwgbm8gVUkuXG4gICAqXG4gICAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHVybidzIE1MZmxvdyB0cmFjZSB2aWEgdGhlIE9wZW5UZWxlbWV0cnlcbiAgICogdHJhY2UgaWQgdGhlIHNlcnZlciBzdGFtcHMgb24gZWFjaCByZXNwb25zZTsgc2VlIGBtbGZsb3cudHNgLlxuICAgKi9cbiAgZmVlZGJhY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogRXhwb3NlIHRoZSBwbHVnaW4ncyBhZ2VudHMgKGFuZCBvcHRpb25hbGx5IHRvb2xzKSBhcyBhIE1hc3RyYSBNQ1BcbiAgICogc2VydmVyIHNvIGV4dGVybmFsIE1DUCBjbGllbnRzIC0gQ2xhdWRlIERlc2t0b3AsIEN1cnNvciwgdGhlIE1hc3RyYVxuICAgKiBwbGF5Z3JvdW5kLCBvciBhbm90aGVyIGFnZW50IC0gY2FuIGNhbGwgdGhlbSBvdmVyIHRoZSBzdGFuZGFyZCBNQ1BcbiAgICogdHJhbnNwb3J0cy4gRW5hYmxlZCBieSBkZWZhdWx0IChhZ2VudHMgb25seSk6IHdyYXBwaW5nIHRoZVxuICAgKiBhbHJlYWR5LXJlZ2lzdGVyZWQgYWdlbnRzIGNvc3RzIG5vdGhpbmcgZXh0cmEsIHNvIHRoZSBlbmRwb2ludCBpcyBvblxuICAgKiBvdXQgb2YgdGhlIGJveDsgb25seSB0aGUgYW1iaWVudCB0b29scyAod2hpY2ggYXNzdW1lIGFuIGluLXByb2Nlc3NcbiAgICogY2hhdCB0dXJuKSBzdGF5IG9mZiB1bmxlc3MgZXhwbGljaXRseSBvcHRlZCBpbi5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCkgLyBgdHJ1ZWA6IGV4cG9zZSBldmVyeSByZWdpc3RlcmVkIGFnZW50IGFzXG4gICAqICAgYW4gYGFza188YWdlbnRJZD5gIE1DUCB0b29sIHVuZGVyIGEgc2VydmVyIHdob3NlIGlkIGlzIHRoZSBwbHVnaW5cbiAgICogICBuYW1lLlxuICAgKiAtIGBmYWxzZWA6IG5vIE1DUCBlbmRwb2ludHMuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1jcENvbmZpZ306IGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIHNlcnZlciBpZCxcbiAgICogICBhZHZlcnRpc2VkIG1ldGFkYXRhLCBhbmQgd2hpY2ggYWdlbnRzIC8gdG9vbHMgYXJlIGV4cG9zZWQuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIHN0b2NrIE1hc3RyYSBNQ1Agcm91dGVzIG1vdW50IHVuZGVyIHRoZSBwbHVnaW4nc1xuICAgKiBiYXNlIHBhdGggKG5vIGJlc3Bva2Ugcm91dGUgaXMgYWRkZWQgLSB0aGUgc2VydmVyIGlzIGhhbmRlZCB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdmlhIGBtY3BTZXJ2ZXJzYCwgd2hpY2ggYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzKTpcbiAgICpcbiAgICogLSBTdHJlYW1hYmxlIEhUVFA6IGBQT1NUIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vbWNwYFxuICAgKiAtIFNTRSAobGVnYWN5KTogICAgYEdFVCAgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9zc2VgXG4gICAqICAgICAgICAgICAgICAgICAgICBgUE9TVCAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L21lc3NhZ2VzYFxuICAgKlxuICAgKiBSZXF1ZXN0cyBydW4gdW5kZXIgdGhlIHNhbWUgQXBwS2l0IE9CTyBzY29wZSBhcyB0aGUgY2hhdCByb3V0ZXMsIHNvXG4gICAqIGFuIGFnZW50IGludm9rZWQgb3ZlciBNQ1AgcmVzb2x2ZXMgaXRzIG1vZGVsIGFuZCB0b29scyBhcyB0aGVcbiAgICogY2FsbGluZyB1c2VyLlxuICAgKi9cbiAgbWNwPzogYm9vbGVhbiB8IE1hc3RyYU1jcENvbmZpZztcbiAgLyoqXG4gICAqIEhvdyBtdWNoIG9mIHRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBtYW5hZ2VtZW50IEFQSSBpcyByZWFjaGFibGVcbiAgICogdGhyb3VnaCB0aGUgcGx1Z2luIG1vdW50LiBgQG1hc3RyYS9leHByZXNzYCByZWdpc3RlcnMgaXRzIGZ1bGwgcm91dGVcbiAgICogdGFibGUgKGFnZW50IGluZmVyZW5jZSBwbHVzIGFkbWluIC8gbXV0YXRpbmcgcm91dGVzOiBkaXJlY3QgdG9vbFxuICAgKiBleGVjdXRpb24sIHdvcmtmbG93IGNvbnRyb2wsIHJhdyBtZW1vcnkgcmVhZC93cml0ZSwgdGVsZW1ldHJ5LCBsb2dzLFxuICAgKiBzY29yZXMpLiBBcHBLaXQgYWxyZWFkeSBhdXRoZW50aWNhdGVzIGV2ZXJ5IHJlcXVlc3QgYXMgdGhlIE9CTyB1c2VyLFxuICAgKiBidXQgbm90aGluZyB0aGVyZSByZXN0cmljdHMgKndoaWNoKiBvZiB0aG9zZSBvcGVyYXRpb25zIHRoZSBicm93c2VyXG4gICAqIGNsaWVudCBtYXkgaW52b2tlLlxuICAgKlxuICAgKiAtIGBcInNjb3BlZFwiYCAoZGVmYXVsdCk6IG9ubHkgdGhlIHJvdXRlcyB0aGUgY2hhdCBjbGllbnQgbGVnaXRpbWF0ZWx5XG4gICAqICAgbmVlZHMgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhIC0gYWdlbnQgaW5mZXJlbmNlXG4gICAqICAgKGBzdHJlYW1gIC8gYGdlbmVyYXRlYCAvIGBuZXR3b3JrYCksIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpc1xuICAgKiAgIHBsdWdpbidzIG93biBPQk8tIGFuZCByZXNvdXJjZS1zY29wZWQgYC9yb3V0ZS8qYCByb3V0ZXMgKGhpc3RvcnkgL1xuICAgKiAgIHRocmVhZHMpLCBhbmQsIHdoZW4ge0BsaW5rIG1jcH0gaXMgZW5hYmxlZCwgdGhlIE1DUCB0cmFuc3BvcnQuXG4gICAqICAgRXZlcnl0aGluZyBlbHNlICh0b29sIGV4ZWN1dGlvbiwgd29ya2Zsb3cgY29udHJvbCwgcmF3IG1lbW9yeSxcbiAgICogICB0ZWxlbWV0cnksIGxvZ3MsIHNjb3JlcywgYW5kIG90aGVyIG11dGF0aW9ucykgaXMgcmVqZWN0ZWQgd2l0aFxuICAgKiAgIGA0MDNgIGJlZm9yZSBpdCByZWFjaGVzIE1hc3RyYS5cbiAgICogLSBgXCJmdWxsXCJgOiBkaXNwYXRjaCB0aGUgZW50aXJlIHN0b2NrIE1hc3RyYSBBUEkuIFVzZSBvbmx5IGZvciBhXG4gICAqICAgdHJ1c3RlZCBmaXJzdC1wYXJ0eSBjb25zb2xlIHRoYXQgZ2VudWluZWx5IG5lZWRzIHRoZSBtYW5hZ2VtZW50XG4gICAqICAgc3VyZmFjZS5cbiAgICovXG4gIGFwaUFjY2Vzcz86IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqXG4gICAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgdGhlIGFnZW50cycgd29ya3NwYWNlIGNhbGxzIHJ1biBhczogdGhlXG4gICAqIHNlcnZpbmctZW5kcG9pbnQgY2F0YWxvZ3VlIGJlaGluZCB0aGUgbW9kZWwgcGlja2VyLCBHZW5pZSBzdWdnZXN0aW9ucyxcbiAgICogYGFza19nZW5pZWAsIGFuZCB0aGUgU3RhdGVtZW50IEV4ZWN1dGlvbiBmZXRjaCBiZWhpbmQgYSBgW2RhdGE6PGlkPl1gXG4gICAqIGVtYmVkLiBGYWxscyBiYWNrIHRvIGBNQVNUUkFfR0VOSUVfSURFTlRJVFlgLCB0aGVuIGBcInVzZXJcImAuXG4gICAqXG4gICAqIE9uLWJlaGFsZi1vZiAoT0JPKSBhdXRoIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBtZW1iZXIgb2YgdGhlXG4gICAqIFdPUktTUEFDRSwgbm90IGp1c3Qgb2YgdGhlIERhdGFicmlja3MgYWNjb3VudC4gQW4gYXBwIHNoYXJlZCB3aXRoIGFuXG4gICAqIGFjY291bnQtbGV2ZWwgZ3JvdXAgY2FuIGJlIG9wZW5lZCBieSBzb21lb25lIHdob3NlIHRva2VuIGlzIHZhbGlkIGJ1dCB3aG9zZVxuICAgKiBldmVyeSB3b3Jrc3BhY2UgY2FsbCBmYWlscyB3aXRoIGBVbmF1dGhvcml6ZWQgYWNjZXNzIHRvIE9yZzogPGlkPmAgLSBhbmRcbiAgICogZ3JhbnRpbmcgd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwgc2luY2UgYSB3b3Jrc3BhY2VcbiAgICogY2FwcyBtZW1iZXJzaGlwIHdlbGwgYmVsb3cgdGhlIHNpemUgb2YgYSBsYXJnZSBhY2NvdW50J3MgdXNlciBncm91cC4gVGhlXG4gICAqIGFwcCdzIHNlcnZpY2UgcHJpbmNpcGFsIGFscmVhZHkgaG9sZHMgdGhlIGdyYW50cyB0aGUgYXBwIHdhcyBkZXBsb3llZCB3aXRoLlxuICAgKlxuICAgKiAtIGBcInVzZXJcImAgKGRlZmF1bHQpOiBhbHdheXMgT0JPLiBQZXItdXNlciBhdHRyaWJ1dGlvbiwgYW5kIEdlbmllIC8gVW5pdHlcbiAgICogICBDYXRhbG9nIHJvdyBmaWx0ZXJzIGFwcGx5IHBlciB1c2VyLiBDb3JyZWN0IHdoZW4gZXZlcnkgY2FsbGVyIGlzIGFcbiAgICogICB3b3Jrc3BhY2UgbWVtYmVyLCBhbmQgdW5jaGFuZ2VkIGZyb20gYmVmb3JlIHRoaXMgb3B0aW9uIGV4aXN0ZWQuXG4gICAqIC0gYFwic2VydmljZS1wcmluY2lwYWxcImA6IGFsd2F5cyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLiBOZWVkcyBubyBPQk9cbiAgICogICBzY29wZXMgYW5kIHdvcmtzIGZvciBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwLCBhdCB0aGUgY29zdCBvZlxuICAgKiAgIHBlci11c2VyIGF0dHJpYnV0aW9uIGluIEdlbmllIC8gVW5pdHkgQ2F0YWxvZy5cbiAgICogLSBgXCJhdXRvXCJgOiBPQk8gd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIGFuIE9CTyB0b2tlbiwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsXG4gICAqICAgd2hlbiBpdCBkb2VzIG5vdC4gRm9yIGFuIGFwcCBzZXJ2aW5nIEJPVEggdGhlIHBsYXRmb3JtIGZyb250IGRvb3IgYW5kIGFcbiAgICogICBkb29yIHRoYXQgaGFzIG5vIHRva2VuIHRvIGZvcndhcmQgLSBhIGBAZGJ4LXRvb2xzL3R1bm5lbGAgZ2F0ZSwgYVxuICAgKiAgIFRlYW1zIGNoYW5uZWwgLSB3aGVyZSBBcHBLaXQncyBgYXNVc2VyYCB3b3VsZCBvdGhlcndpc2UgdGhyb3dcbiAgICogICBgQXV0aGVudGljYXRpb25FcnJvcmAgb3V0c2lkZSBgTk9ERV9FTlY9ZGV2ZWxvcG1lbnRgLlxuICAgKlxuICAgKiBUaGUgc2VydmljZS1wcmluY2lwYWwgcGF0aCBjaGFuZ2VzIG9ubHkgdGhlIERhdGFicmlja3MgQ1JFREVOVElBTC4gTWVtb3J5XG4gICAqIHRocmVhZHMsIHRoZSBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2UsIGFuZCB0cmFjZSBtZXRhZGF0YSBzdGlsbCBrZXkgb2ZmIHRoZVxuICAgKiBmb3J3YXJkZWQgdXNlciwgc28gY2FsbGVycyBzaGFyaW5nIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCdzIGRhdGEgYWNjZXNzIGtlZXBcbiAgICogc2VwYXJhdGUgY29udmVyc2F0aW9ucyBhbmQgY2Fubm90IHJlYWQgZWFjaCBvdGhlcidzIHRocmVhZHMgb3IgY2hhcnRzLlxuICAgKlxuICAgKiBAZXhhbXBsZSBBbiBhcHAgYW55IGFjY291bnQgdXNlciBjYW4gb3BlblxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoeyBnZW5pZUlkZW50aXR5OiBcInNlcnZpY2UtcHJpbmNpcGFsXCIsIGdlbmllU3BhY2VzOiB7IGRlZmF1bHQ6IHNwYWNlSWQgfSB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIE9uZSBhcHAgYmVoaW5kIGJvdGggdGhlIGZyb250IGRvb3IgYW5kIGEgcHVibGljIHR1bm5lbFxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoeyBnZW5pZUlkZW50aXR5OiBcImF1dG9cIiwgZ2VuaWVTcGFjZXM6IHsgZGVmYXVsdDogc3BhY2VJZCB9IH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGdlbmllSWRlbnRpdHk/OiBNYXN0cmFJZGVudGl0eU1vZGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBicmFuZCBjb250ZXh0IGFwcGxpZWQgdG8gY2hhcnRzIHByb2R1Y2VkIGJ5IHRoZSBidWlsdC1pblxuICAgKiBgcmVuZGVyX2RhdGFgIC8gYHByZXBhcmVfY2hhcnRgIHRvb2xzLiBXaGVuIHNldCwgdGhlIGNoYXJ0IHBsYW5uZXInc1xuICAgKiBFY2hhcnRzIG91dHB1dCBpcyB0aGVtZWQgd2l0aCB0aGUgYnJhbmQncyBwYWxldHRlIChzZXJpZXMgY29sb3JzIGRlcml2ZWRcbiAgICogZnJvbSBgY29sb3JzLnByaW1hcnlgIC8gYGNvbG9ycy5hY2NlbnRgKSBhbmQgc2FucyBmb250XG4gICAqIChgdHlwb2dyYXBoeS5zYW5zYCkgaW5zdGVhZCBvZiBFY2hhcnRzJyBkZWZhdWx0cy4gT21pdCBmb3IgdGhlIGRlZmF1bHRcbiAgICogRWNoYXJ0cyBsb29rLlxuICAgKlxuICAgKiBQYXNzIHRoZSBwb3J0YWJsZSB7QGxpbmsgQnJhbmRDb250ZXh0fSBzaGFyZWQgYWNyb3NzIHRoZSBVSSBhbmRcbiAgICogbGlicmFyaWVzIChlLmcuIGBicmFuZC5kZWZhdWx0QnJhbmRDb250ZXh0YCBmcm9tIGBAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlYCxcbiAgICogb3IgYSBjdXN0b21lciBicmFuZCkgLSB0aGUgc2FtZSBvYmplY3QgdGhlIGVtYWlsIGFkZC1vbiBhbmQgdGhlIFVJXG4gICAqIGBCcmFuZFByb3ZpZGVyYCBjb25zdW1lLCBzbyBhIGhvc3QgdGhlbWVzIGNoYXJ0cywgZW1haWwsIGFuZCBVSSBmcm9tIG9uZVxuICAgKiBzb3VyY2UuXG4gICAqL1xuICBicmFuZD86IEJyYW5kQ29udGV4dDtcbiAgLyoqXG4gICAqIFJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIG1hdGVyaWFsaXplZCBvbmNlIGF0IGFwcCBzdGFydHVwLiBBIHNpbmdsZVxuICAgKiBzb3VyY2UsIGEgbGlzdCwgb3IgYSBgeyBzb3VyY2VzLCBmYWlsT25FcnJvcj8sIC4uLiB9YCBiYWcuXG4gICAqXG4gICAqIEVhY2ggc291cmNlIGlzIGEgR2l0SHViIGBvd25lci9yZXBvYCwgYSBnaXQgLyBHaXRMYWIgVVJMLCBvciBhIGRpcmVjdFxuICAgKiBgU0tJTEwubWRgIC8gYXJjaGl2ZSBkb3dubG9hZCBVUkwuIFJlc29sdXRpb24gcHJlZmVycyB0aGUgT1BUSU9OQUwgYHNraWxsc2BcbiAgICogbnBtIENMSSAoYSBwZWVyIGRlcCkgd2hpY2ggaXMgY29waWVkIGludG8gYSB0ZW1wIGRpciBhbmQgdGhlbiBwZXJzaXN0ZWQ7XG4gICAqIHdpdGhvdXQgaXQsIGEgVVJMIHNvdXJjZSBpcyBmZXRjaGVkIGRpcmVjdGx5LiBBIHNvdXJjZSB0aGF0IHJlc29sdmVzXG4gICAqIHRocm91Z2ggbmVpdGhlciBmYWlscyBzdGFydHVwIHVubGVzcyBgZmFpbE9uRXJyb3I6IGZhbHNlYC5cbiAgICpcbiAgICogUHJvdmlzaW9uZWQgc2tpbGxzIGFyZSB3cml0dGVuIHRvIHRoZSBEYXRhYnJpY2tzIHVzZXIncyBBc3Npc3RhbnQgc2tpbGxzXG4gICAqIGZvbGRlciAoYC9Vc2Vycy88ZW1haWw+Ly5hc3Npc3RhbnQvc2tpbGxzYCwgdGhlIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIlxuICAgKiB0YXJnZXQpIHNvIHRoZXkgcGVyc2lzdCBhbmQgYXJlIHBpY2tlZCB1cCBieSB0aGUgYnVpbHQtaW4gQXNzaXN0YW50LXNraWxsc1xuICAgKiBtb3VudC4gV2l0aCBubyB3cml0YWJsZSB3b3Jrc3BhY2UsIHRoZXkgZ28gdG8gYSBsb2NhbCB0ZW1wIGRpciBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoeyByZW1vdGVTa2lsbHM6IFwidmVyY2VsLWxhYnMvYWdlbnQtc2tpbGxzXCIgfSk7XG4gICAqIG1hc3RyYSh7XG4gICAqICAgcmVtb3RlU2tpbGxzOiB7XG4gICAqICAgICBzb3VyY2VzOiBbXCJ2ZXJjZWwtbGFicy9hZ2VudC1za2lsbHNcIiwgXCJodHRwczovL2V4YW1wbGUuY29tL3NraWxsLm1kXCJdLFxuICAgKiAgICAgZmFpbE9uRXJyb3I6IGZhbHNlLFxuICAgKiAgIH0sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHJlbW90ZVNraWxscz86IFJlbW90ZVNraWxsc09wdGlvbjtcbn1cblxuLyoqXG4gKiBKU09OIFNjaGVtYSBwdWJsaXNoZWQgb24gdGhlIG1hbmlmZXN0J3MgYGNvbmZpZy5zY2hlbWFgLCBtaXJyb3JpbmcgdGhlXG4gKiBkb2N1bWVudGVkIGRlZmF1bHRzIGFuZCBlbnZpcm9ubWVudCBmYWxsYmFja3Mgb2Yge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZ30uXG4gKlxuICogQ292ZXJzIHRoZSBKU09OLWV4cHJlc3NpYmxlIG9wdGlvbnMgb25seS4gYGFnZW50c2AsIGB0b29sc2AsIGFuZCBhXG4gKiBgZGVmYXVsdE1vZGVsYCBwYXNzZWQgYXMgYSBNYXN0cmEgYER5bmFtaWNBcmd1bWVudGAgYXJlIGNvZGUtZGVmaW5lZFxuICogKGZ1bmN0aW9ucyAvIGNsYXNzIGluc3RhbmNlcyksIHNvIHRoZXkgY2Fycnkgbm8gc2NoZW1hIGVudHJ5OyB0aGVcbiAqIGBkZWZhdWx0TW9kZWxgIHByb3BlcnR5IGJlbG93IGRlc2NyaWJlcyBpdHMgc3RyaW5nIGZvcm0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfQ09ORklHX1NDSEVNQTogQ29uZmlnU2NoZW1hID0ge1xuICB0eXBlOiBcIm9iamVjdFwiLFxuICBwcm9wZXJ0aWVzOiB7XG4gICAgcHJvdmlkZXJJZDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOiAnTWFzdHJhIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGlkLiBEZWZhdWx0cyB0byBcImRhdGFicmlja3NcIi4nLFxuICAgIH0sXG4gICAgcmVtb3RlU2tpbGxzOiB7XG4gICAgICB0eXBlOiBbXCJzdHJpbmdcIiwgXCJhcnJheVwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnUmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgcHJvdmlzaW9uZWQgYXQgc3RhcnR1cDogXCJhaXRvb2xzXCIgZm9yIERhdGFicmlja3NcXCcgb3duIHNraWxsIHNldCAocmVhZCBmcm9tIHRoZSBwdWJsaWMgZGF0YWJyaWNrcy9kYXRhYnJpY2tzLWFnZW50LXNraWxscyByZXBvLCBubyBDTEkgbmVlZGVkKSwgYSBHaXRIdWIgb3duZXIvcmVwbywgYSBnaXQvR2l0TGFiIFVSTCwgb3IgYSBkaXJlY3QgU0tJTEwubWQvYXJjaGl2ZSBVUkwuIE5vbi1haXRvb2xzIHNvdXJjZXMgcHJlZmVyIHRoZSBvcHRpb25hbCBgc2tpbGxzYCBucG0gQ0xJLCBlbHNlIGEgZGlyZWN0IGZldGNoOyBmYWlscyBzdGFydHVwIG9uIGVycm9yIHVubGVzcyBmYWlsT25FcnJvcjpmYWxzZS4gV3JpdHRlbiB0byB0aGUgRGF0YWJyaWNrcyB1c2VyIEFzc2lzdGFudCBza2lsbHMgZm9sZGVyLCBvciBhIGxvY2FsIHRlbXAgZGlyIHdoZW4gbm8gd29ya3NwYWNlIGlzIHdyaXRhYmxlLicsXG4gICAgfSxcbiAgICBzdG9yYWdlOiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9zdGdyZXNTdG9yZSBmb3IgTWFzdHJhIHRocmVhZHMgLyBtZXNzYWdlcy4gYHRydWVgIHJldXNlcyB0aGUgYGxha2ViYXNlYCBwbHVnaW4ncyBwb29sLCBhbiBvYmplY3Qgb3BlbnMgYSBkZWRpY2F0ZWQgc3RvcmUuIEF1dG8tZW5hYmxlZCB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLlwiLFxuICAgIH0sXG4gICAgbWVtb3J5OiB7XG4gICAgICB0eXBlOiBbXCJib29sZWFuXCIsIFwib2JqZWN0XCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUGdWZWN0b3Igc3RvcmUgZm9yIE1hc3RyYSBzZW1hbnRpYyByZWNhbGwuIGB0cnVlYCByZXVzZXMgdGhlIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbCwgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLiBBdXRvLWVuYWJsZWQgd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRBZ2VudDoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkFnZW50IGlkIHVzZWQgd2hlbiB0aGUgY2xpZW50IG5hbWVzIG5vbmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCByZWdpc3RlcmVkIGFnZW50LCBlbHNlIHRoZSBidWlsdC1pbiBgZGVmYXVsdGAuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0TW9kZWw6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTZXJ2aW5nIGVuZHBvaW50IGFwcGxpZWQgdG8gZXZlcnkgYWdlbnQgdGhhdCBvbWl0cyBpdHMgb3duIG1vZGVsLiBGYWxscyBiYWNrIHRvIERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FLCB0aGVuIHRoZSBhdXRvLXJlc29sdmVkIGNhdGFsb2d1ZS5cIixcbiAgICB9LFxuICAgIGRlZmF1bHRNb2RlbEZhbGxiYWNrczoge1xuICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgaXRlbXM6IHsgdHlwZTogXCJzdHJpbmdcIiB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUHJpb3JpdHktb3JkZXJlZCBlbmRwb2ludCBuYW1lcyB0cmllZCBiZWZvcmUgdGhlIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlIHdoZW4gbm90aGluZyBlbHNlIHBpbnMgYSBtb2RlbC5cIixcbiAgICB9LFxuICAgIG1vZGVsRnV6enlNYXRjaDoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyBhZ2FpbnN0IHRoZSB3b3Jrc3BhY2UgY2F0YWxvZ3VlLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgIH0sXG4gICAgbW9kZWxGdXp6eVRocmVzaG9sZDoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkZ1c2UuanMgc2NvcmUgdGhyZXNob2xkIGZvciB0aGUgZnV6enkgbWF0Y2hlciwgMCAoZXhhY3QpIHRvIDEgKGFueXRoaW5nKS4gRGVmYXVsdHMgdG8gMC40LlwiLFxuICAgIH0sXG4gICAgbW9kZWxDYWNoZVR0bE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiVFRMIGluIG1zIGZvciB0aGUgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgcGVyIHdvcmtzcGFjZSBob3N0LiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuXCIsXG4gICAgfSxcbiAgICBtb2RlbE92ZXJyaWRlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhvbm9yIGEgcGVyLXJlcXVlc3QgbW9kZWwgb3ZlcnJpZGUgZnJvbSB0aGUgWC1NYXN0cmEtTW9kZWwgaGVhZGVyLCA/bW9kZWw9IHF1ZXJ5LCBvciBhIGBtb2RlbGAgYm9keSBmaWVsZC4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIGdlbmllU3BhY2VzOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IHsgdHlwZTogW1wic3RyaW5nXCIsIFwib2JqZWN0XCJdIH0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJHZW5pZSBzcGFjZXMgdGhlIGFnZW50cyBjYW4gZGVsZWdhdGUgdG8sIGtleWVkIGJ5IGFsaWFzICh0aGUgdG9vbC1uYW1lIHN1ZmZpeCkuIEVhY2ggdmFsdWUgaXMgYSBzcGFjZSBpZCBvciBgeyBzcGFjZUlkLCBoaW50IH1gLiBGYWxscyBiYWNrIHRvIHRoZSBgZ2VuaWVgIHBsdWdpbidzIG93biBgc3BhY2VzYCBjb25maWcsIHRoZW4gREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzLlwiLFxuICAgIH0sXG4gICAgZ2VuaWVTcGFjZUNhY2hlVHRsTXM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJUVEwgaW4gbXMgZm9yIHRoZSBHZW5pZSBzcGFjZSBtZXRhZGF0YSBjYWNoZS4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLlwiLFxuICAgIH0sXG4gICAgYWdlbnRNYXhTdGVwczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIk1heGltdW0gTExNIHN0ZXBzIGVhY2ggYWdlbnQgZ2V0cyBwZXIgdHVybiAoYSB0b29sIGNhbGwgYW5kIHRoZSBmaW5hbCByZXBseSBlYWNoIGNvbnN1bWUgb25lKS4gRGVmYXVsdHMgdG8gMjUuXCIsXG4gICAgfSxcbiAgICBzdHJpcFN0YWxlQ2hhcnRzOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlN0cmlwIGNoYXJ0SWRzIGZyb20gcmVjYWxsZWQgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBzbyB0aGUgbW9kZWwgY2Fubm90IHJldXNlIGEgdHVybi1zY29wZWQgY2hhcnQgbWFya2VyLiBEZWZhdWx0cyB0byB0cnVlLlwiLFxuICAgIH0sXG4gICAgc3R5bGVJbnN0cnVjdGlvbnM6IHtcbiAgICAgIHR5cGU6IFtcInN0cmluZ1wiLCBcImJvb2xlYW5cIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgaW5zdHJ1Y3Rpb25zLiBBIHN0cmluZyByZXBsYWNlcyB0aGUgYnVpbHQtaW4gYmxvY2ssIGBmYWxzZWAgZGlzYWJsZXMgaXQuXCIsXG4gICAgfSxcbiAgICBvYnNlcnZhYmlsaXR5OiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkJyaWRnZSBNYXN0cmEgc3BhbnMgaW50byBBcHBLaXQncyBPVGVsIHBpcGVsaW5lLiBEZWZhdWx0cyB0byBvbiBvbmx5IHdoZW4gT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UIG9yIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQgaXMgc2V0LlwiLFxuICAgIH0sXG4gICAgZmVlZGJhY2s6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiTG9nIHRodW1icyAvIGNvbW1lbnQgYXNzZXNzbWVudHMgdG8gTUxmbG93IGFuZCBzdXJmYWNlIHRoZSBmZWVkYmFjayBjb250cm9scy4gRGVmYXVsdHMgdG8gb24gb25seSB3aGVuIGFuIE9UTFAgZW5kcG9pbnQgYW5kIE1MRkxPV19FWFBFUklNRU5UX0lEIG9yIE1MRkxPV19FWFBFUklNRU5UX05BTUUgYXJlIHNldC5cIixcbiAgICB9LFxuICAgIG1jcDoge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkV4cG9zZSB0aGUgcmVnaXN0ZXJlZCBhZ2VudHMgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGFnZW50cy1vbmx5OyBhbiBvYmplY3QgdHVuZXMgdGhlIHNlcnZlciBpZCwgYWR2ZXJ0aXNlZCBtZXRhZGF0YSwgYW5kIHdoZXRoZXIgYW1iaWVudCB0b29scyBhcmUgZXhwb3NlZC5cIixcbiAgICB9LFxuICAgIGdlbmllSWRlbnRpdHk6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAvLyBEZXJpdmVkIGZyb20gdGhlIHJlc29sdmVyJ3Mgb3duIGxpc3QsIHNvIGEgbW9kZSBjYW4gbmV2ZXIgYmUgYWNjZXB0ZWQgYXRcbiAgICAgIC8vIHJ1bnRpbWUgd2hpbGUgdGhlIHB1Ymxpc2hlZCBzY2hlbWEgKGFuZCB0aGUgVUkgYnVpbHQgZnJvbSBpdCkgb21pdHMgaXQuXG4gICAgICBlbnVtOiBbLi4uSURFTlRJVFlfTU9ERVNdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdXaGljaCBEYXRhYnJpY2tzIGlkZW50aXR5IHRoZSBhZ2VudHNcXCcgd29ya3NwYWNlIGNhbGxzIChzZXJ2aW5nIGNhdGFsb2d1ZSwgR2VuaWUsIHN0YXRlbWVudCBleGVjdXRpb24pIHJ1biBhcy4gXCJ1c2VyXCIgKGRlZmF1bHQpIGlzIGFsd2F5cyBPQk8sIHNvIGNhbGxlcnMgbXVzdCBiZSB3b3Jrc3BhY2UgbWVtYmVyczsgXCJzZXJ2aWNlLXByaW5jaXBhbFwiIGFsd2F5cyB1c2VzIHRoZSBhcHAgc2VydmljZSBwcmluY2lwYWwsIHNvIGFueSBjYWxsZXIgd2hvIGNhbiBvcGVuIHRoZSBhcHAgd29ya3MsIGF0IHRoZSBjb3N0IG9mIHBlci11c2VyIGF0dHJpYnV0aW9uOyBcImF1dG9cIiB1c2VzIE9CTyB3aGVuIHRoZSByZXF1ZXN0IGNhcnJpZXMgYW4gT0JPIHRva2VuIGFuZCB0aGUgc2VydmljZSBwcmluY2lwYWwgd2hlbiBpdCBkb2VzIG5vdCwgZm9yIGFuIGFwcCB0aGF0IGFsc28gc2VydmVzIGEgdHVubmVsIG9yIHdlYmhvb2sgZG9vci4gRmFsbHMgYmFjayB0byBNQVNUUkFfR0VOSUVfSURFTlRJVFkuJyxcbiAgICB9LFxuICAgIGFwaUFjY2Vzczoge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgIGVudW06IFtcInNjb3BlZFwiLCBcImZ1bGxcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0hvdyBtdWNoIG9mIHRoZSBzdG9jayBAbWFzdHJhL2V4cHJlc3MgQVBJIGlzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtb3VudC4gXCJzY29wZWRcIiAoZGVmYXVsdCkgYWxsb3dzIGFnZW50IGluZmVyZW5jZSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGlzIHBsdWdpblxcJ3Mgb3duIHJvdXRlcywgYW5kIE1DUDsgXCJmdWxsXCIgZGlzcGF0Y2hlcyB0aGUgZW50aXJlIG1hbmFnZW1lbnQgc3VyZmFjZS4nLFxuICAgIH0sXG4gICAgYnJhbmQ6IHtcbiAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQb3J0YWJsZSBicmFuZCBjb250ZXh0IGFwcGxpZWQgdG8gZ2VuZXJhdGVkIGNoYXJ0cyAoc2VyaWVzIHBhbGV0dGUgZnJvbSBjb2xvcnMucHJpbWFyeSAvIGNvbG9ycy5hY2NlbnQsIGJhc2UgZm9udCBmcm9tIHR5cG9ncmFwaHkuc2FucykuXCIsXG4gICAgfSxcbiAgfSxcbn07XG4iXX0=
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUs1RixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUd4RTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0FBRXpEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQXNCO0lBQzNELHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFB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QUNILElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7WUFDM0IsV0FBVyxFQUNULDRKQUE0SjtTQUMvSjtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsMkVBQTJFO1lBQzNFLDBFQUEwRTtZQUMxRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUN6QixXQUFXLEVBQ1QsNmZBQTZmO1NBQ2hnQjtRQUNELFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN4QixXQUFXLEVBQ1QscU9BQXFPO1NBQ3hPO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsMElBQTBJO1NBQzdJO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgc2hhcmVkIGBSZXF1ZXN0Q29udGV4dGAga2V5cy5cbiAqXG4gKiBPd25zIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdFxuICogY29uZmlnKSBhbmQge0BsaW5rIE1BU1RSQV9DT05GSUdfU0NIRU1BfSwgdGhlIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdFxuICogcHVibGlzaGVzIGZvciBpdCBzbyBzY2FmZm9sZGluZyB0b29scyBhbmQgYWdlbnRzIGNhbiByZWFkIHRoZSBvcHRpb24gc2V0LlxuICpcbiAqIFByZWNlZGVuY2UgcGVyIGZpZWxkIGlzIGV4cGxpY2l0IHBsdWdpbiBjb25maWcsIHRoZW4gdGhlIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZSBuYW1lZCBvbiB0aGUgZmllbGQsIHRoZW4gYSBidWlsdC1pbiBkZWZhdWx0LlxuICpcbiAqIEtlcHQgaW4gYSBsZWFmIG1vZHVsZSBzbyBgcGx1Z2luLnRzYCwgYHNlcnZlci50c2AsIGBtb2RlbC50c2AsIGFuZFxuICogYG1lbW9yeS50c2AgY2FuIGltcG9ydCB0aGVtIHdpdGhvdXQgY3JlYXRpbmcgYSBjeWNsZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIENvbmZpZ1NjaGVtYSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFUb29scyB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgeyBJREVOVElUWV9NT0RFUywgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVTa2lsbHNPcHRpb24gfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgdW5kZXIgd2hpY2gge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RvcmVzIHRoZVxuICogcmVzb2x2ZWQgQXBwS2l0IHVzZXIuIGBtb2RlbC50c2AgcmVhZHMgaXQgdG8gbWludCB1c2VyLXNjb3BlZFxuICogRGF0YWJyaWNrcyB0b2tlbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9LRVkgPSBcIm1hc3RyYV9fdXNlclwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5cyBmb3IgQXBwS2l0IHVzZXIgbWV0YWRhdGEgc3RhbXBlZCBieVxuICoge0BsaW5rIE1hc3RyYVNlcnZlcn0uIFN1cmZhY2VkIGFzIHRyYWNlIG1ldGFkYXRhIHZpYVxuICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBzbyB0cmFjZXMgYXJlIGZpbHRlcmFibGUgYnkgd2hvXG4gKiBpc3N1ZWQgdGhlIHJlcXVlc3Qgd2l0aG91dCBsZWFraW5nIHRoZSBmdWxsIHVzZXIgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfTkFNRV9LRVkgPSBcIm1hc3RyYV9fdXNlck5hbWVcIjtcbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9FTUFJTF9LRVkgPSBcIm1hc3RyYV9fdXNlckVtYWlsXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgZm9yIHRoZSBwZXItSFRUUC1yZXF1ZXN0IGlkIHN0YW1wZWQgYnlcbiAqIHtAbGluayBNYXN0cmFTZXJ2ZXJ9LiBSZWFkcyBgWC1SZXF1ZXN0LUlkYCBmcm9tIHRoZSBpbmNvbWluZ1xuICogaGVhZGVycyB3aGVuIHByZXNlbnQgKHNvIGFuIHVwc3RyZWFtIGxvYWQgYmFsYW5jZXIgLyBBUEkgZ2F0ZXdheVxuICogY2FuIGtlZXAgaXRzIHRyYWNlIGNvcnJlbGF0aW9uKSwgZmFsbHMgYmFjayB0byBhIGZyZXNobHkgbWludGVkXG4gKiBVVUlELiBFY2hvZWQgYmFjayBvbiB0aGUgcmVzcG9uc2UgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IHNwYW4gdmlhXG4gKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IHNvIGxvZ3MgYW5kIHRyYWNlcyBzaGFyZSBhXG4gKiBqb2luIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9SRVFVRVNUX0lEX0tFWSA9IFwibWFzdHJhX19yZXF1ZXN0SWRcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSBmb3IgT0F1dGggc2NvcGVzIHBhcnNlZCBmcm9tIHRoZSBmb3J3YXJkZWRcbiAqIGFjY2VzcyB0b2tlbiBieSB7QGxpbmsgTWFzdHJhU2VydmVyLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzfS5cbiAqIFdvcmtzcGFjZSBtb3VudHMgdGhhdCB0b3VjaCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcyByZXF1aXJlXG4gKiBgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIGluIHRoaXMgbGlzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9TQ09QRVNfS0VZID0gXCJtYXN0cmFfX3Njb3Blc1wiO1xuXG4vKipcbiAqIENhbm9uaWNhbCBsaXN0IG9mIGBSZXF1ZXN0Q29udGV4dGAga2V5cyB3ZSB3YW50IE1hc3RyYSB0byBleHRyYWN0XG4gKiBhcyBtZXRhZGF0YSBvbiBldmVyeSBvYnNlcnZhYmlsaXR5IHNwYW4gKGFnZW50IHJ1bnMsIG1vZGVsIGNhbGxzLFxuICogdG9vbCBpbnZvY2F0aW9ucywgd29ya2Zsb3cgc3RlcHMpLlxuICpcbiAqIE1pcnJvcnMge0BsaW5rIGh0dHBzOi8vbWFzdHJhLmFpL2RvY3Mvb2JzZXJ2YWJpbGl0eS90cmFjaW5nL292ZXJ2aWV3I2F1dG9tYXRpYy1tZXRhZGF0YS1mcm9tLXJlcXVlc3Rjb250ZXh0fTpcbiAqIHBhc3NlZCB2ZXJiYXRpbSBpbnRvIGBPYnNlcnZhYmlsaXR5LmNvbmZpZ3NbKl0ucmVxdWVzdENvbnRleHRLZXlzYCxcbiAqIHNvIGFueSBrZXkgbGlzdGVkIGhlcmUgaXMgcmVhZCBmcm9tIGBSZXF1ZXN0Q29udGV4dGAgYXQgdHJhY2VcbiAqIHN0YXJ0IGFuZCBhdHRhY2hlZCBhcyBzY2FsYXIgc3BhbiBtZXRhZGF0YS4gS2VlcCB0aGUgc2V0IHRvIHBsYWluXG4gKiBzY2FsYXJzIC0gbmV2ZXIgaW5jbHVkZSB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSAoaXQgY2FycmllcyB0aGVcbiAqIGZ1bGwgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggYSBgV29ya3NwYWNlQ2xpZW50YCByZWZlcmVuY2UpLlxuICpcbiAqIE9yZGVyIGlzIHB1cmVseSBjb3NtZXRpYzsgTWFzdHJhIGRlLWR1cGVzIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIC8vIE1vZGVsIG92ZXJyaWRlIGtleSBpcyBvd25lZCBieSBgc2VydmluZy50c2A7IHNwZWxsZWQgaW5saW5lIGhlcmVcbiAgLy8gc28gdGhpcyBtb2R1bGUgc3RheXMgbGVhZi1sZXZlbCAobm8gY3ljbGVzIHdpdGggYHNlcnZpbmcudHNgKS5cbiAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG5dO1xuXG4vKiogQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHBsdXMgdGhlIGNhbm9uaWNhbCB1c2VyIGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgaWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBpZGVudGl0eSBmb3IgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0OiB0aGUgT0JPIHVzZXIgaWQgb24gYVxuICogdXNlci1zY29wZWQgY2FsbCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkO1xufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgd2hpY2ggaXMgbm90IGFsd2F5cyB3aG9zZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWxcbiAqIHJ1bnMgaXQuIEFuIE9CTyBjb250ZXh0J3Mgb3duIHVzZXIgaWQgaXMgYXV0aG9yaXRhdGl2ZS4gVW5kZXIgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCwgZXZlcnkgY2FsbGVyIHNoYXJlcyBvbmUgY3JlZGVudGlhbCwgc28gdGhlIGZvcndhcmRlZCB1c2VyIGlkIGlzXG4gKiB3aGF0IGtlZXBzIG1lbW9yeSB0aHJlYWRzIGFuZCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2VzIGRpc3RpbmN0OyB0aGUgc2VydmljZVxuICogcHJpbmNpcGFsIGlkIGlzIHRoZSBmbG9vciB3aGVuIG5vIHVzZXIgd2FzIGZvcndhcmRlZC5cbiAqXG4gKiBUaGlzIHJ1bGUgaGFzIHRvIGJlIGlkZW50aWNhbCBldmVyeXdoZXJlIGEgY2FjaGUga2V5IGlzIGJ1aWx0LCBzbyBib3RoIHRoZVxuICogd3JpdGUgc2lkZSAodGhlIGBSZXF1ZXN0Q29udGV4dGAgdXNlciBzdGFtcGVkIGJ5IGBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcmApXG4gKiBhbmQgdGhlIHJlYWQgc2lkZSAodGhlIHBsdWdpbidzIG93biBBcHBLaXQgcm91dGVzLCB3aGljaCBoYXZlIGEgcmVxdWVzdCBidXRcbiAqIG5vIGBSZXF1ZXN0Q29udGV4dGApIGRlcml2ZSB0aGVpciBrZXkgZnJvbSB0aGlzIG9uZSBmdW5jdGlvbi4gV2hlbiB0aGUgdHdvXG4gKiBkaXNhZ3JlZWQsIGEgY2hhcnQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgd2FzIHJlYWQgYmFjayB1bmRlclxuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIGFuZCB0aGUgZW1iZWQgcm91dGUgYW5zd2VyZWQgNDA0LCB3aGljaCB0aGUgY2hhdCBVSVxuICogcmVuZGVycyBhcyBhbiBleHBpcmVkIGNoYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlZFVzZXJJZChcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlLFxuICBmb3J3YXJkZWRVc2VySWQ/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBpZiAoXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCkgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCk7XG4gIHJldHVybiBmb3J3YXJkZWRVc2VySWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChleGVjdXRpb25Db250ZXh0KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBldmVyeSBwZXItdXNlciBjYWNoZSBlbnRyeSBpcyBuYW1lc3BhY2VkIHVuZGVyLCBzbyBhbiBPQk8gcmVzdWx0XG4gKiBjYW5ub3QgYmUgcmVhZCBiYWNrIGJ5IGFub3RoZXIgY2FsbGVyLlxuICpcbiAqIFByZWZlcnMgdGhlIHtAbGluayBVc2VyfSB0aGF0IHtAbGluayBNYXN0cmFTZXJ2ZXJ9IHN0YW1wcyBvbiB0aGUgcmVxdWVzdFxuICogY29udGV4dCwgd2hvc2UgaWQgYWxyZWFkeSBmb2xsb3dzIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfS4gVGhlIE1DUCB0cmFuc3BvcnRcbiAqIHJvdXRlcyBkbyBub3QgdGhyZWFkIHRoYXQgY29udGV4dCBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyB0aG9zZSBmYWxsIGJhY2sgdG9cbiAqIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0ICh0aGUgYWN0aXZlIE9CTyBzY29wZSwgb3IgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCkuIEEgY2FsbGVyIGhvbGRpbmcgYW4gZXhwcmVzcyByZXF1ZXN0IHNob3VsZCBidWlsZCBpdHMga2V5IGZyb21cbiAqIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSBpbnN0ZWFkLCBzbyB0aGUgZm9yd2FyZGVkIHVzZXIgaXMgbm90IGxvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdXNlcj8uaWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCkpO1xufVxuXG4vKiogUGdWZWN0b3IgY29uZmlnIHdpdGggYW4gb3B0aW9uYWwgTWFzdHJhIHN0b3JlIGlkLiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnID0gUGdWZWN0b3JDb25maWcgJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXIgZXhwb3N1cmVcbiAqICh7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLm1jcH0pLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbDsgdGhlIG9iamVjdFxuICogZm9ybSBvbmx5IG5lZWRzIHRvIHNldCB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhTWNwQ29uZmlnIHtcbiAgLyoqXG4gICAqIFNlcnZlciBpZCB1c2VkIGluIHRoZSByb3V0ZSBwYXRoIChgL21jcC88c2VydmVySWQ+Ly4uLmApIGFuZCBhcyB0aGVcbiAgICogTUNQIHJlZ2lzdHJ5IGlkLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKi9cbiAgc2VydmVySWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gRGVmYXVsdHMgdG8gYFwiPGRpc3BsYXlOYW1lPiBNQ1BcImAuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTZW1hbnRpYyB2ZXJzaW9uIGFkdmVydGlzZWQgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGBcIjEuMC4wXCJgLiAqL1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHBvc2UgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBhcyBhbiBgYXNrXzxhZ2VudElkPmAgTUNQIHRvb2wuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYCAtIHRoaXMgaXMgdGhlIFwibGV2ZXJhZ2UgdGhlIE1hc3RyYSBhZ2VudHMgb3ZlclxuICAgKiBNQ1BcIiBiZWhhdmlvciBtb3N0IGNhbGxlcnMgd2FudC5cbiAgICovXG4gIGFnZW50cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbHNvIGV4cG9zZSB0aGUgcGx1Z2luJ3MgYW1iaWVudCB0b29scyAodGhlIGJ1aWx0LWluIGByZW5kZXJfZGF0YWBcbiAgICogcGx1cyBhbnl0aGluZyBpbiBgY29uZmlnLnRvb2xzYCkgYXMgTUNQIHRvb2xzLiBEZWZhdWx0cyB0byBgZmFsc2VgOlxuICAgKiB0aGUgYW1iaWVudCB0b29scyBhc3N1bWUgYW4gaW4tcHJvY2VzcyBjaGF0IHR1cm4gKHRoZXkgcHVibGlzaFxuICAgKiB3cml0ZXIgZXZlbnRzIHRoZSBjaGF0IFVJIGNvbnN1bWVzKSwgc28gdGhleSBhcmVuJ3QgdXNlZnVsIHRvIGFcbiAgICogc3RhbmRhbG9uZSBNQ1AgY2xpZW50LiBUdXJuIHRoaXMgb24gb25seSB3aGVuIHRob3NlIHRvb2xzIGFyZSBzYWZlXG4gICAqIHRvIGNhbGwgb3V0LW9mLWJhbmQuXG4gICAqL1xuICB0b29scz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFeHRyYSB0b29scyB0byBleHBvc2Ugb3ZlciBNQ1AgYmV5b25kIHRoZSBhZ2VudCAvIGFtYmllbnQgc2V0cy5cbiAgICogVXNlIHRoaXMgZm9yIHRvb2xzIHdyaXR0ZW4gc3BlY2lmaWNhbGx5IGZvciBNQ1AgY29uc3VtZXJzLlxuICAgKi9cbiAgZXh0cmFUb29scz86IE1hc3RyYVRvb2xzO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBhY2NlcHRlZCBieSB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogTWFzdHJhIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGlkLiBEZWZhdWx0cyB0byBgXCJkYXRhYnJpY2tzXCJgOyBubyBlbnYgZmFsbGJhY2suICovXG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQb3N0Z3Jlc1N0b3JlIGZvciBNYXN0cmEgdGhyZWFkcy9tZXNzYWdlcy4gYHRydWVgIHJldXNlcyB0aGVcbiAgICogYGxha2ViYXNlYCBwbHVnaW4ncyBwb29sOyBhbiBvYmplY3Qgb3BlbnMgYSBkZWRpY2F0ZWQgc3RvcmUuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IFBvc3RncmVzU3RvcmVDb25maWc7XG4gIC8qKlxuICAgKiBQZ1ZlY3RvciBzdG9yZSBmb3IgTWFzdHJhIG1lbW9yeSByZWNhbGwuIGB0cnVlYCByZXVzZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZztcbiAgLyoqXG4gICAqIENvZGUtZGVmaW5lZCBhZ2VudHMuIEFjY2VwdHMgdGhyZWUgc2hhcGVzIGZvciBjb252ZW5pZW5jZTpcbiAgICpcbiAgICogLSAqKlJlY29yZCoqOiBgeyBhbmFseXN0OiBkZWYsIGhlbHBlcjogZGVmIH1gIC0ga2V5cyBiZWNvbWUgdGhlXG4gICAqICAgcmVnaXN0ZXJlZCBpZHMgYW5kIHRoZSBmaXJzdCBrZXkgaXMgdGhlIGRlZmF1bHQuXG4gICAqIC0gKipTaW5nbGUgZGVmaW5pdGlvbioqOiBgZGVmYCAtIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgXCJkZWZhdWx0XCJgIHdoZW4gYG5hbWVgIGlzIG9taXR0ZWQpIGFuZFxuICAgKiAgIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHRoZSBkZWZhdWx0IGFnZW50LlxuICAgKiAtICoqQXJyYXkqKjogYFtkZWYxLCBkZWYyXWAgLSBlYWNoIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgYWdlbnRfJHtpfWAgd2hlbiBgbmFtZWAgaXMgb21pdHRlZCk7XG4gICAqICAgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBFYWNoIGVudHJ5IGJlY29tZXMgYSBNYXN0cmEgYEFnZW50YCByZWFjaGFibGUgYXRcbiAgICogYC9hcGkvPHBsdWdpbj4vcm91dGUvY2hhdC88aWQ+YCAodGhlIGNoYXQgcm91dGUgYWxzbyBtYXRjaGVzXG4gICAqIGA6YWdlbnRJZGApLiBXaGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHksIHRoZSBwbHVnaW5cbiAgICogcmVnaXN0ZXJzIGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlXG4gICAqIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nIGNoYXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBleGFtcGxlIFNpbmdsZS1hZ2VudCBzaG9ydGhhbmRcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIEFycmF5XG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiBbXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiYW5hbHlzdFwiLCBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiaGVscGVyXCIsIGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICBdLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFJlY29yZCAoZXhwbGljaXQgaWRzKVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czoge1xuICAgKiAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgIH0sXG4gICAqICAgZGVmYXVsdEFnZW50OiBcImFuYWx5c3RcIixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWdlbnRzPzogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbltdO1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzcHJlYWQgaW50byBldmVyeSByZWdpc3RlcmVkIGFnZW50J3MgdG9vbHMgcmVjb3JkO1xuICAgKiBwZXItYWdlbnQgdG9vbHMgd2luIG9uIGtleSBjb2xsaXNpb24uIFVzZSBmb3IgYSBzbWFsbCBzaGFyZWRcbiAgICogbGlicmFyeTsgZm9yIHBlci1hZ2VudCB0b29scyBzZXQgYGFnZW50c1tpZF0udG9vbHNgIGluc3RlYWQuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzO1xuICAvKipcbiAgICogQWdlbnQgaWQgdXNlZCB3aGVuIHRoZSBjbGllbnQgZG9lc24ndCBzcGVjaWZ5IG9uZSAodGhlIGJhcmUsXG4gICAqIHVuLXN1ZmZpeGVkIGhpc3RvcnkgLyBzdWdnZXN0aW9ucyByb3V0ZXMgcmVzb2x2ZSB0byBpdCkuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBrZXkgaW4gYGFnZW50c2AgKG9yIGBcImRlZmF1bHRcImAgd2hlblxuICAgKiBgYWdlbnRzYCBpcyBvbWl0dGVkKS4gTXVzdCBtYXRjaCBhbiBpZCBpbiBgYWdlbnRzYCB3aGVuIGJvdGggYXJlXG4gICAqIHNldDsgYSBtaXNtYXRjaCB0aHJvd3MgYXQgc2V0dXAgd2l0aCB0aGUgYXZhaWxhYmxlIGNhbmRpZGF0ZXMuXG4gICAqL1xuICBkZWZhdWx0QWdlbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbHVnaW4tbGV2ZWwgZGVmYXVsdCBtb2RlbCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzXG4gICAqIG93biBgbW9kZWxgLiBNaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICAgKlxuICAgKiAtIGBzdHJpbmdgOiBzaG9ydGhhbmQgZm9yIFwidXNlIHRoZSBPQk8gYXV0by1yZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCJgKS5cbiAgICogLSBBbnkgb3RoZXIgTWFzdHJhIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YDogcGFzc2VkXG4gICAqICAgdGhyb3VnaCB2ZXJiYXRpbS4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsIGNvbnRyb2wgb3ZlciBhdXRoXG4gICAqICAgb3IgYHByb3ZpZGVySWRgLlxuICAgKlxuICAgKiBSZXNvbHV0aW9uIG9yZGVyIHBlciBhZ2VudDogYGRlZi5tb2RlbGAg4oaSIGBkZWZhdWx0TW9kZWxgIOKGklxuICAgKiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIOKGkiBidWlsdC1pbiBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICAgKiByZXNvbHZlci5cbiAgICovXG4gIGRlZmF1bHRNb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyAoYFwiY2xhdWRlIHNvbm5ldFwiYCkgYWdhaW5zdCB0aGUgd29ya3NwYWNlJ3NcbiAgICogTW9kZWwgU2VydmluZyBlbmRwb2ludHMuIERlZmF1bHRzIHRvIGB0cnVlYDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBTZXQgYGZhbHNlYCB0byByZXF1aXJlIGV4YWN0IGVuZHBvaW50IG5hbWVzIGV2ZXJ5d2hlcmUuXG4gICAqL1xuICBtb2RlbEZ1enp5TWF0Y2g/OiBib29sZWFuO1xuICAvKipcbiAgICogRnVzZS5qcyBzY29yZSB0aHJlc2hvbGQgZm9yIHRoZSBmdXp6eSBtYXRjaGVyLCAwIChleGFjdCkgdG8gMSAoYW55dGhpbmcpLlxuICAgKiBEZWZhdWx0cyB0byBgMC40YDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBMb3dlciB2YWx1ZXMgcmVqZWN0IGxvb3NlIG1hdGNoZXM7IHJhaXNlIGl0IGlmIHlvdSBoYXZlIGEgc3ByYXdsaW5nXG4gICAqIGVuZHBvaW50IGNhdGFsb2d1ZSB3aXRoIHNpbWlsYXItbG9va2luZyBuYW1lcy5cbiAgICovXG4gIG1vZGVsRnV6enlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBEZWZhdWx0cyB0byA1IG1pbnV0ZXM7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogVGhlIGNhY2hlIGlzIHBlciB3b3Jrc3BhY2UgaG9zdCBhbmQgc2hhcmVkIGFjcm9zcyB1c2VyczsgY29uY3VycmVudFxuICAgKiBjYWxsZXJzIGNvYWxlc2NlIG9uIGEgc2luZ2xlIGluLWZsaWdodCBmZXRjaC5cbiAgICovXG4gIG1vZGVsQ2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIExldCBjbGllbnRzIHBpY2sgdGhlIGJhY2tpbmcgZW5kcG9pbnQgcGVyIHJlcXVlc3QuIERlZmF1bHRzIHRvIGB0cnVlYDtcbiAgICogbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBSZWFkcyB0aGUgYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXIsIHRoZSBgP21vZGVsPWAgcXVlcnkgc3RyaW5nLCBvciBhXG4gICAqIGBtb2RlbGAgYm9keSBmaWVsZCwgaW4gdGhhdCBvcmRlci4gRGlzYWJsZSB3aGVuIHJ1bm5pbmcgbXVsdGktdGVuYW50XG4gICAqIHdoZXJlIHVudHJ1c3RlZCBjbGllbnRzIHNob3VsZG4ndCBjaG9vc2UgdGhlIGVuZHBvaW50LlxuICAgKi9cbiAgbW9kZWxPdmVycmlkZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcmlvcml0eS1vcmRlcmVkIGxpc3Qgb2YgZW5kcG9pbnQgbmFtZXMgdHJpZWQgKmZpcnN0KiB3aGVuIG5vXG4gICAqIGFnZW50IC8gcGx1Z2luIC8gZW52IC8gcmVxdWVzdC1vdmVycmlkZSBtb2RlbCBpZCBpcyBzZXQsIGFoZWFkIG9mXG4gICAqIHRoZSBkeW5hbWljIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlLiBUaGUgcmVzb2x2ZXIgcGlja3MgdGhlXG4gICAqIGZpcnN0IGlkIHRoYXQgaXMgYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgd29ya3NwYWNlJ3NcbiAgICogYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZy5cbiAgICpcbiAgICogV2hlbiB1bnNldCwgcmVzb2x1dGlvbiBpcyBkcml2ZW4gYnkgdGhlIGxpdmUgRm91bmRhdGlvbiBNb2RlbCBBUElcbiAgICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXM6IGVuZHBvaW50cyBhcmUgY2xhc3NpZmllZCBpbnRvXG4gICAqIGNoYXQgY2xhc3NlcyAoYGNsYXNzaWZ5RW5kcG9pbnRzYCkgYW5kIHdhbGtlZCBiZXN0LWZpcnN0XG4gICAqIChDaGF0VGhpbmtpbmcgLT4gQ2hhdEJhbGFuY2VkIC0+IENoYXRGYXN0KSwgd2l0aCB0aGUgc21hbGwgYnVpbHQtaW5cbiAgICogYEZBTExCQUNLX01PREVMX0lEU2AgbGlzdCBhcyB0aGUgZmxvb3Igd2hlbiB0aGUgY2F0YWxvZ3VlIGNhbid0IGJlXG4gICAqIHJlYWQuIFNldCB0aGlzIHRvXG4gICAqIHBpbiBhIHJlZ3VsYXRlZCB3b3Jrc3BhY2UgdG8gYW4gYXBwcm92ZWQgc3Vic2V0LCBvciB0byBwdXQgY3VzdG9tXG4gICAqIGVuZHBvaW50cyBpbiBmcm9udCBvZiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbEZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKGRlZmF1bHQpLCBldmVyeSBhZ2VudCBnZXRzIGEgYnVpbHQtaW4gaW5wdXRcbiAgICogcHJvY2Vzc29yIHRoYXQgc3RyaXBzIGBjaGFydElkYCBmaWVsZHMgZnJvbSBwcmlvciBhc3Npc3RhbnRcbiAgICogdG9vbC1pbnZvY2F0aW9uIHJlc3VsdHMgYmVmb3JlIHRoZXkgcmVhY2ggdGhlIG1vZGVsLiBUaGlzXG4gICAqIHByZXZlbnRzIHRoZSBtb2RlbCBmcm9tIHJldXNpbmcgdHVybi1zY29wZWQgY2hhcnRJZHMgaXQgc2Vlc1xuICAgKiBpbiBtZW1vcnkgcmVjYWxsICh3aGljaCB3b3VsZCBsZWF2ZSBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzXG4gICAqIHBvaW50aW5nIGF0IHdyaXRlciBldmVudHMgdGhhdCBubyBsb25nZXIgZXhpc3QpLlxuICAgKlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBvcHQgb3V0IC0gdXNlZnVsIGlmIGEgbm9uLWRlZmF1bHQgYWdlbnRcbiAgICogbmVlZHMgZnVsbCB2aXNpYmlsaXR5IGludG8gcHJpb3IgY2hhcnRJZHMgKGUuZy4gYW4gYXVkaXRcbiAgICogYWdlbnQgcmVhc29uaW5nIGFib3V0IGNoYXJ0IGxpbmVhZ2UpLlxuICAgKi9cbiAgc3RyaXBTdGFsZUNoYXJ0cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICAgKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCB0aHJvd2F3YXlcbiAgICogY2xvc2VycywgZXhjZXNzaXZlIGhlZGdpbmcpLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogdXNlIHRoZSBidWlsdC1pblxuICAgKiAgIGBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OU2AgZnJvbSBgYWdlbnRzLnRzYC5cbiAgICogLSBgc3RyaW5nYDogcmVwbGFjZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSBzdXBwbGllZCBibG9jay5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIGVudGlyZWx5IChhZ2VudHMgc2VlIG9ubHkgdGhlaXIgYmVzcG9rZVxuICAgKiAgIGBpbnN0cnVjdGlvbnNgKS5cbiAgICpcbiAgICogQXBwZW5kZWQgKG5vdCBwcmVwZW5kZWQpIHNvIHRoZSBhZ2VudCdzIHJvbGUgYW5kIHJ1bGVzIGNvbWUgZmlyc3RcbiAgICogYW5kIHRoZSBzdHlsZSBibG9jayBsZWFucyBvbiB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMuXG4gICAqL1xuICBzdHlsZUluc3RydWN0aW9ucz86IHN0cmluZyB8IGZhbHNlO1xuICAvKipcbiAgICogR2VuaWUgc3BhY2VzIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIGNhbiBkZWxlZ2F0ZSB0by4gT25lIE1hc3RyYVxuICAgKiB0b29sIGlzIHJlZ2lzdGVyZWQgcGVyIGFsaWFzIChgZ2VuaWVgIGZvciB0aGUgd2VsbC1rbm93blxuICAgKiBgZGVmYXVsdGAgYWxpYXMsIGBnZW5pZV88YWxpYXM+YCBvdGhlcndpc2UpLiBFYWNoIHRvb2wgc3BpbnNcbiAgICogdXAgYSBwZXItcXVlc3Rpb24gR2VuaWUgc3ViLWFnZW50IHRoYXQgcnVucyBEYXRhYnJpY2tzXG4gICAqIFwiYWdlbnQgbW9kZVwiIGFnYWluc3QgdGhlIHNwYWNlLCBicm9hZGNhc3RzIHdpcmUgZXZlbnRzIHRvIHRoZVxuICAgKiBVSSwgZmV0Y2hlcyBzdGF0ZW1lbnQgcm93cyBmb3Igbm9uLWVtcHR5IHJlc3VsdHMsIGFuZCByZXR1cm5zXG4gICAqIGEgYChzdHJpbmcgfCBkYXRhIHwgY2hhcnQpW11gIHN1bW1hcnkgdGhlIGhvc3QgVUkgcmVuZGVyc1xuICAgKiBpbmxpbmUuXG4gICAqXG4gICAqIEVudHJpZXMgYWNjZXB0IGVpdGhlciBhIGZ1bGwge0BsaW5rIEdlbmllU3BhY2VDb25maWd9IG9iamVjdFxuICAgKiBvciBhIGJhcmUgYHNwYWNlX2lkYCBzdHJpbmcgd2hlbiBubyBleHRyYXMgYXJlIG5lZWRlZDpcbiAgICpcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBnZW5pZVNwYWNlczoge1xuICAgKiAgICAgZGVmYXVsdDogXCIwMWVmMGQzYzBlMWIxZjRhOGQyYzNlNGY1YTZiN2M4ZFwiLFxuICAgKiAgICAgZm9yZWNhc3RzOiB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiLCBoaW50OiBcIndlZWtseSBkZW1hbmQgZm9yZWNhc3RzXCIgfSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJlYWNoIHRoZSBzcGFjZXMgZnJvbSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgdmlhXG4gICAqIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgOyB0aGUgcmVzdWx0aW5nIHRvb2xzIGFjY2VwdFxuICAgKiBgeyBjb250ZW50LCBjb252ZXJzYXRpb25JZD8gfWAgYW5kIHJldHVybiBhIGh5ZHJhdGVkIHN1bW1hcnkuXG4gICAqXG4gICAqICoqRmFsbGJhY2sgZGlzY292ZXJ5KiogKGhpZ2hlc3QgcHJlY2VkZW5jZSBmaXJzdCk6IGlmIHRoaXNcbiAgICogZmllbGQgaXMgb21pdHRlZCwgdGhlIEdlbmllIGFnZW50IGFsc28gcGlja3MgdXAgc3BhY2VzIGZyb21cbiAgICogKDEpIHRoZSBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2VcbiAgICogd2hlbiByZWdpc3RlcmVkLCBhbmQgKDIpIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGBcbiAgICogZW52IHZhciAocmVnaXN0ZXJlZCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzKS4gVGhpcyBrZWVwc1xuICAgKiBleGlzdGluZyBBcHBLaXQgZGVwbG95bWVudHMgd29ya2luZyB3aXRob3V0IHJlc3RhdGluZyB0aGVcbiAgICogc3BhY2VzIGNvbmZpZyBpbiB0d28gcGxhY2VzLlxuICAgKi9cbiAgZ2VuaWVTcGFjZXM/OiBHZW5pZVNwYWNlc0NvbmZpZztcbiAgLyoqXG4gICAqIFRUTCBmb3IgdGhlIGluLW1lbW9yeSBHZW5pZSBzcGFjZSBtZXRhZGF0YSBjYWNoZSwgaW5cbiAgICogbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuIFRoZSBHZW5pZSBhZ2VudCBjYWxsc1xuICAgKiBgY2xpZW50LmdlbmllLmdldFNwYWNlKC4uLilgIG9uIGV2ZXJ5IGNvbGQtc3RhcnQgdG8gZ2V0IHRoZVxuICAgKiB0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkOyBjYWNoZWQgcmVzcG9uc2VzIHNraXAgdGhlXG4gICAqIHJvdW5kLXRyaXAgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZVxuICAgKiBpbi1mbGlnaHQgZmV0Y2guIERyb3AgdG8gYSBzbWFsbGVyIHZhbHVlIHdoZW4gYW5hbHlzdHMgYXJlXG4gICAqIGFjdGl2ZWx5IGVkaXRpbmcgc3BhY2UgbWV0YWRhdGEgYW5kIHlvdSB3YW50IGNoYW5nZXMgdmlzaWJsZVxuICAgKiB3aXRoaW4gc2Vjb25kczsgcmFpc2UgaXQgdG8gYW1vcnRpc2UgdGhlIHJvdW5kLXRyaXAgd2hlblxuICAgKiBzcGFjZSBtZXRhZGF0YSBpcyBlZmZlY3RpdmVseSBmcm96ZW4uXG4gICAqXG4gICAqIEJhY2tlZCBieSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYCwgc28gdGhlIGNhY2hlIHBhcnRpY2lwYXRlc1xuICAgKiBpbiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSBhbmQgYmVuZWZpdHMgZnJvbVxuICAgKiBMYWtlYmFzZSBwZXJzaXN0ZW5jZSB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAgICovXG4gIGdlbmllU3BhY2VDYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuLiBPbmUgc3RlcCA9IG9uZVxuICAgKiByb3VuZC10cmlwIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIChhIHRvb2wgY2FsbCBjb25zdW1lcyBhXG4gICAqIHN0ZXAsIHRoZSBmaW5hbC10ZXh0IHJlcGx5IGNvbnN1bWVzIG9uZSB0b28pLiBBcHBsaWVzIHRvXG4gICAqIGV2ZXJ5IGFnZW50IHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50c31cbiAgICogLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFyZW4ndCBzdXJmYWNlZCB5ZXQgYmVjYXVzZSB0aGUgc2FtZVxuICAgKiBjZWlsaW5nIGhhcyBiZWVuIHN1ZmZpY2llbnQgYWNyb3NzIGV2ZXJ5IHdvcmtsb2FkIHdlJ3ZlIHJ1bi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTfSAoMjUpLCBzaXplZCB0byBmaXRcbiAgICogYSBkZWNvbXBvc2VkIEdlbmllIHR1cm4gKGdyb3VuZGluZyArIHNldmVyYWwgYGFza19nZW5pZWAgY2FsbHNcbiAgICogKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICAgKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gICAqIGFuc3dlcmluZy4gTWFzdHJhJ3Mgb3duIGBhZ2VudC5nZW5lcmF0ZWAgZGVmYXVsdCBvZiA1IHdvdWxkXG4gICAqIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIGFmdGVyIDItMyB0b29sIGNhbGxzLCBzb1xuICAgKiBleHBsaWNpdGx5IHJhaXNpbmcgdGhlIGNlaWxpbmcgaGVyZSBpcyB3aGF0IGxldHMgdGhlXG4gICAqIGFnZW50LW1vZGUgbG9vcCBwbGF5IG91dC5cbiAgICpcbiAgICogTG93ZXIgd2hlbiBhbiB1bnVzdWFsbHkgc2xvdyBvciBleHBlbnNpdmUgbW9kZWwgbWFrZXMgbG9uZ1xuICAgKiB0dXJucyB1bmFmZm9yZGFibGU7IHJhaXNlIGZvciBleHBsb3JhdG9yeSB3b3JrbG9hZHMgdGhhdCBuZWVkXG4gICAqIHRvIGRyaWxsIGRlZXAgaW50byBhIGRhdGFzZXQgd2l0aGluIGEgc2luZ2xlIHR1cm4uXG4gICAqL1xuICBhZ2VudE1heFN0ZXBzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2lyZSBNYXN0cmEgc3BhbnMgaW50byBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSB2aWFcbiAgICogYEBtYXN0cmEvb3RlbC1icmlkZ2VgLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogb24gb25seSB3aGVuXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgb3JcbiAgICogICBgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVGAgaXMgc2V0LiBXaGVuIHVuc2V0LCB0aGVcbiAgICogICBicmlkZ2UgaXMgc2tpcHBlZCBzbyBNYXN0cmEgZG9lcyBub3QgbG9nXG4gICAqICAgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW4gZm91bmRgIG9uIHRoZSBub29wIHRyYWNlci5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uIGV2ZW4gd2l0aG91dCBhbiBPVExQIGVuZHBvaW50LlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi5cbiAgICovXG4gIG9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuICAvKipcbiAgICogTG9nIHVzZXIgZmVlZGJhY2sgKHRodW1icyB1cC9kb3duICsgZnJlZWZvcm0gY29tbWVudHMpIHRvIE1MZmxvdyBhc1xuICAgKiB0cmFjZSBhc3Nlc3NtZW50cywgYW5kIHN1cmZhY2UgdGhlIGZlZWRiYWNrIGNvbnRyb2xzIGluIHRoZSBjaGF0IFVJLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogZW5hYmxlZCBvbmx5IHdoZW4gTUxmbG93IHRyYWNpbmcgaXNcbiAgICogICB3aXJlZCAtIGFuIE9UTFAgZXhwb3J0ZXIgZW5kcG9pbnQgaXMgc2V0IGFuZCBhbiBNTGZsb3cgZXhwZXJpbWVudFxuICAgKiAgIGlzIG5hbWVkICh0aGUgc2FtZSBzaWduYWxzIHRoZSBvYnNlcnZhYmlsaXR5IHBpcGVsaW5lIG5lZWRzIHRvXG4gICAqICAgc2hpcCB0cmFjZXMgdG8gTUxmbG93KS4gT3RoZXJ3aXNlIG9mZiwgc2luY2UgdGhlcmUnZCBiZSBubyB0cmFjZVxuICAgKiAgIHRvIGF0dGFjaCBmZWVkYmFjayB0by5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uLiBGZWVkYmFjayBjb250cm9scyBzaG93IGFuZCB3cml0ZXMgYXJlIGF0dGVtcHRlZFxuICAgKiAgIHJlZ2FyZGxlc3Mgb2YgZW52IGRldGVjdGlvbiAodXNlIHdoZW4gdGhlIGVudiBpcyBjb25maWd1cmVkIGluIGFcbiAgICogICB3YXkgdGhlIGF1dG8tcHJvYmUgZG9lc24ndCByZWNvZ25pemUpLlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi4gTm8gdHJhY2UtaWQgaGVhZGVyLCBubyBmZWVkYmFjayByb3V0ZSwgbm8gVUkuXG4gICAqXG4gICAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHVybidzIE1MZmxvdyB0cmFjZSB2aWEgdGhlIE9wZW5UZWxlbWV0cnlcbiAgICogdHJhY2UgaWQgdGhlIHNlcnZlciBzdGFtcHMgb24gZWFjaCByZXNwb25zZTsgc2VlIGBtbGZsb3cudHNgLlxuICAgKi9cbiAgZmVlZGJhY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogRXhwb3NlIHRoZSBwbHVnaW4ncyBhZ2VudHMgKGFuZCBvcHRpb25hbGx5IHRvb2xzKSBhcyBhIE1hc3RyYSBNQ1BcbiAgICogc2VydmVyIHNvIGV4dGVybmFsIE1DUCBjbGllbnRzIC0gQ2xhdWRlIERlc2t0b3AsIEN1cnNvciwgdGhlIE1hc3RyYVxuICAgKiBwbGF5Z3JvdW5kLCBvciBhbm90aGVyIGFnZW50IC0gY2FuIGNhbGwgdGhlbSBvdmVyIHRoZSBzdGFuZGFyZCBNQ1BcbiAgICogdHJhbnNwb3J0cy4gRW5hYmxlZCBieSBkZWZhdWx0IChhZ2VudHMgb25seSk6IHdyYXBwaW5nIHRoZVxuICAgKiBhbHJlYWR5LXJlZ2lzdGVyZWQgYWdlbnRzIGNvc3RzIG5vdGhpbmcgZXh0cmEsIHNvIHRoZSBlbmRwb2ludCBpcyBvblxuICAgKiBvdXQgb2YgdGhlIGJveDsgb25seSB0aGUgYW1iaWVudCB0b29scyAod2hpY2ggYXNzdW1lIGFuIGluLXByb2Nlc3NcbiAgICogY2hhdCB0dXJuKSBzdGF5IG9mZiB1bmxlc3MgZXhwbGljaXRseSBvcHRlZCBpbi5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCkgLyBgdHJ1ZWA6IGV4cG9zZSBldmVyeSByZWdpc3RlcmVkIGFnZW50IGFzXG4gICAqICAgYW4gYGFza188YWdlbnRJZD5gIE1DUCB0b29sIHVuZGVyIGEgc2VydmVyIHdob3NlIGlkIGlzIHRoZSBwbHVnaW5cbiAgICogICBuYW1lLlxuICAgKiAtIGBmYWxzZWA6IG5vIE1DUCBlbmRwb2ludHMuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1jcENvbmZpZ306IGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIHNlcnZlciBpZCxcbiAgICogICBhZHZlcnRpc2VkIG1ldGFkYXRhLCBhbmQgd2hpY2ggYWdlbnRzIC8gdG9vbHMgYXJlIGV4cG9zZWQuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIHN0b2NrIE1hc3RyYSBNQ1Agcm91dGVzIG1vdW50IHVuZGVyIHRoZSBwbHVnaW4nc1xuICAgKiBiYXNlIHBhdGggKG5vIGJlc3Bva2Ugcm91dGUgaXMgYWRkZWQgLSB0aGUgc2VydmVyIGlzIGhhbmRlZCB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdmlhIGBtY3BTZXJ2ZXJzYCwgd2hpY2ggYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzKTpcbiAgICpcbiAgICogLSBTdHJlYW1hYmxlIEhUVFA6IGBQT1NUIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vbWNwYFxuICAgKiAtIFNTRSAobGVnYWN5KTogICAgYEdFVCAgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9zc2VgXG4gICAqICAgICAgICAgICAgICAgICAgICBgUE9TVCAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L21lc3NhZ2VzYFxuICAgKlxuICAgKiBSZXF1ZXN0cyBydW4gdW5kZXIgdGhlIHNhbWUgQXBwS2l0IE9CTyBzY29wZSBhcyB0aGUgY2hhdCByb3V0ZXMsIHNvXG4gICAqIGFuIGFnZW50IGludm9rZWQgb3ZlciBNQ1AgcmVzb2x2ZXMgaXRzIG1vZGVsIGFuZCB0b29scyBhcyB0aGVcbiAgICogY2FsbGluZyB1c2VyLlxuICAgKi9cbiAgbWNwPzogYm9vbGVhbiB8IE1hc3RyYU1jcENvbmZpZztcbiAgLyoqXG4gICAqIEhvdyBtdWNoIG9mIHRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBtYW5hZ2VtZW50IEFQSSBpcyByZWFjaGFibGVcbiAgICogdGhyb3VnaCB0aGUgcGx1Z2luIG1vdW50LiBgQG1hc3RyYS9leHByZXNzYCByZWdpc3RlcnMgaXRzIGZ1bGwgcm91dGVcbiAgICogdGFibGUgKGFnZW50IGluZmVyZW5jZSBwbHVzIGFkbWluIC8gbXV0YXRpbmcgcm91dGVzOiBkaXJlY3QgdG9vbFxuICAgKiBleGVjdXRpb24sIHdvcmtmbG93IGNvbnRyb2wsIHJhdyBtZW1vcnkgcmVhZC93cml0ZSwgdGVsZW1ldHJ5LCBsb2dzLFxuICAgKiBzY29yZXMpLiBBcHBLaXQgYWxyZWFkeSBhdXRoZW50aWNhdGVzIGV2ZXJ5IHJlcXVlc3QgYXMgdGhlIE9CTyB1c2VyLFxuICAgKiBidXQgbm90aGluZyB0aGVyZSByZXN0cmljdHMgKndoaWNoKiBvZiB0aG9zZSBvcGVyYXRpb25zIHRoZSBicm93c2VyXG4gICAqIGNsaWVudCBtYXkgaW52b2tlLlxuICAgKlxuICAgKiAtIGBcInNjb3BlZFwiYCAoZGVmYXVsdCk6IG9ubHkgdGhlIHJvdXRlcyB0aGUgY2hhdCBjbGllbnQgbGVnaXRpbWF0ZWx5XG4gICAqICAgbmVlZHMgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhIC0gYWdlbnQgaW5mZXJlbmNlXG4gICAqICAgKGBzdHJlYW1gIC8gYGdlbmVyYXRlYCAvIGBuZXR3b3JrYCksIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpc1xuICAgKiAgIHBsdWdpbidzIG93biBPQk8tIGFuZCByZXNvdXJjZS1zY29wZWQgYC9yb3V0ZS8qYCByb3V0ZXMgKGhpc3RvcnkgL1xuICAgKiAgIHRocmVhZHMpLCBhbmQsIHdoZW4ge0BsaW5rIG1jcH0gaXMgZW5hYmxlZCwgdGhlIE1DUCB0cmFuc3BvcnQuXG4gICAqICAgRXZlcnl0aGluZyBlbHNlICh0b29sIGV4ZWN1dGlvbiwgd29ya2Zsb3cgY29udHJvbCwgcmF3IG1lbW9yeSxcbiAgICogICB0ZWxlbWV0cnksIGxvZ3MsIHNjb3JlcywgYW5kIG90aGVyIG11dGF0aW9ucykgaXMgcmVqZWN0ZWQgd2l0aFxuICAgKiAgIGA0MDNgIGJlZm9yZSBpdCByZWFjaGVzIE1hc3RyYS5cbiAgICogLSBgXCJmdWxsXCJgOiBkaXNwYXRjaCB0aGUgZW50aXJlIHN0b2NrIE1hc3RyYSBBUEkuIFVzZSBvbmx5IGZvciBhXG4gICAqICAgdHJ1c3RlZCBmaXJzdC1wYXJ0eSBjb25zb2xlIHRoYXQgZ2VudWluZWx5IG5lZWRzIHRoZSBtYW5hZ2VtZW50XG4gICAqICAgc3VyZmFjZS5cbiAgICovXG4gIGFwaUFjY2Vzcz86IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqXG4gICAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgdGhlIGFnZW50cycgd29ya3NwYWNlIGNhbGxzIHJ1biBhczogdGhlXG4gICAqIHNlcnZpbmctZW5kcG9pbnQgY2F0YWxvZ3VlIGJlaGluZCB0aGUgbW9kZWwgcGlja2VyLCBHZW5pZSBzdWdnZXN0aW9ucyxcbiAgICogYGFza19nZW5pZWAsIGFuZCB0aGUgU3RhdGVtZW50IEV4ZWN1dGlvbiBmZXRjaCBiZWhpbmQgYSBgW2RhdGE6PGlkPl1gXG4gICAqIGVtYmVkLiBGYWxscyBiYWNrIHRvIGBNQVNUUkFfR0VOSUVfSURFTlRJVFlgLCB0aGVuIGBcInVzZXJcImAuXG4gICAqXG4gICAqIE9uLWJlaGFsZi1vZiAoT0JPKSBhdXRoIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBtZW1iZXIgb2YgdGhlXG4gICAqIFdPUktTUEFDRSwgbm90IGp1c3Qgb2YgdGhlIERhdGFicmlja3MgYWNjb3VudC4gQW4gYXBwIHNoYXJlZCB3aXRoIGFuXG4gICAqIGFjY291bnQtbGV2ZWwgZ3JvdXAgY2FuIGJlIG9wZW5lZCBieSBzb21lb25lIHdob3NlIHRva2VuIGlzIHZhbGlkIGJ1dCB3aG9zZVxuICAgKiBldmVyeSB3b3Jrc3BhY2UgY2FsbCBmYWlscyB3aXRoIGBVbmF1dGhvcml6ZWQgYWNjZXNzIHRvIE9yZzogPGlkPmAgLSBhbmRcbiAgICogZ3JhbnRpbmcgd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwgc2luY2UgYSB3b3Jrc3BhY2VcbiAgICogY2FwcyBtZW1iZXJzaGlwIHdlbGwgYmVsb3cgdGhlIHNpemUgb2YgYSBsYXJnZSBhY2NvdW50J3MgdXNlciBncm91cC4gVGhlXG4gICAqIGFwcCdzIHNlcnZpY2UgcHJpbmNpcGFsIGFscmVhZHkgaG9sZHMgdGhlIGdyYW50cyB0aGUgYXBwIHdhcyBkZXBsb3llZCB3aXRoLlxuICAgKlxuICAgKiAtIGBcInVzZXJcImAgKGRlZmF1bHQpOiBhbHdheXMgT0JPLiBQZXItdXNlciBhdHRyaWJ1dGlvbiwgYW5kIEdlbmllIC8gVW5pdHlcbiAgICogICBDYXRhbG9nIHJvdyBmaWx0ZXJzIGFwcGx5IHBlciB1c2VyLiBDb3JyZWN0IHdoZW4gZXZlcnkgY2FsbGVyIGlzIGFcbiAgICogICB3b3Jrc3BhY2UgbWVtYmVyLlxuICAgKiAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgOiBhbHdheXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbC4gTmVlZHMgbm8gT0JPXG4gICAqICAgc2NvcGVzIGFuZCB3b3JrcyBmb3IgYW55IGNhbGxlciB3aG8gY2FuIG9wZW4gdGhlIGFwcCwgYXQgdGhlIGNvc3Qgb2ZcbiAgICogICBwZXItdXNlciBhdHRyaWJ1dGlvbiBpbiBHZW5pZSAvIFVuaXR5IENhdGFsb2cuXG4gICAqIC0gYFwiYXV0b1wiYDogT0JPIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBhbiBPQk8gdG9rZW4sIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICAgKiAgIHdoZW4gaXQgZG9lcyBub3QuIEZvciBhbiBhcHAgc2VydmluZyBCT1RIIHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yIGFuZCBhXG4gICAqICAgZG9vciB0aGF0IGhhcyBubyB0b2tlbiB0byBmb3J3YXJkIC0gYSBgQGRieC10b29scy90dW5uZWxgIGdhdGUsIGFcbiAgICogICBUZWFtcyBjaGFubmVsIC0gd2hlcmUgQXBwS2l0J3MgYGFzVXNlcmAgd291bGQgb3RoZXJ3aXNlIHRocm93XG4gICAqICAgYEF1dGhlbnRpY2F0aW9uRXJyb3JgIG91dHNpZGUgYE5PREVfRU5WPWRldmVsb3BtZW50YC5cbiAgICpcbiAgICogVGhlIHNlcnZpY2UtcHJpbmNpcGFsIHBhdGggY2hhbmdlcyBvbmx5IHRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwuIE1lbW9yeVxuICAgKiB0aHJlYWRzLCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdHJhY2UgbWV0YWRhdGEgc3RpbGwga2V5IG9mZiB0aGVcbiAgICogZm9yd2FyZGVkIHVzZXIsIHNvIGNhbGxlcnMgc2hhcmluZyB0aGUgc2VydmljZSBwcmluY2lwYWwncyBkYXRhIGFjY2VzcyBrZWVwXG4gICAqIHNlcGFyYXRlIGNvbnZlcnNhdGlvbnMgYW5kIGNhbm5vdCByZWFkIGVhY2ggb3RoZXIncyB0aHJlYWRzIG9yIGNoYXJ0cy5cbiAgICpcbiAgICogQGV4YW1wbGUgQW4gYXBwIGFueSBhY2NvdW50IHVzZXIgY2FuIG9wZW5cbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJzZXJ2aWNlLXByaW5jaXBhbFwiLCBnZW5pZVNwYWNlczogeyBkZWZhdWx0OiBzcGFjZUlkIH0gfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBPbmUgYXBwIGJlaGluZCBib3RoIHRoZSBmcm9udCBkb29yIGFuZCBhIHB1YmxpYyB0dW5uZWxcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJhdXRvXCIsIGdlbmllU3BhY2VzOiB7IGRlZmF1bHQ6IHNwYWNlSWQgfSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBnZW5pZUlkZW50aXR5PzogTWFzdHJhSWRlbnRpdHlNb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGNoYXJ0cyBwcm9kdWNlZCBieSB0aGUgYnVpbHQtaW5cbiAgICogYHJlbmRlcl9kYXRhYCAvIGBwcmVwYXJlX2NoYXJ0YCB0b29scy4gV2hlbiBzZXQsIHRoZSBjaGFydCBwbGFubmVyJ3NcbiAgICogRWNoYXJ0cyBvdXRwdXQgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3MgcGFsZXR0ZSAoc2VyaWVzIGNvbG9ycyBkZXJpdmVkXG4gICAqIGZyb20gYGNvbG9ycy5wcmltYXJ5YCAvIGBjb2xvcnMuYWNjZW50YCkgYW5kIHNhbnMgZm9udFxuICAgKiAoYHR5cG9ncmFwaHkuc2Fuc2ApIGluc3RlYWQgb2YgRWNoYXJ0cycgZGVmYXVsdHMuIE9taXQgZm9yIHRoZSBkZWZhdWx0XG4gICAqIEVjaGFydHMgbG9vay5cbiAgICpcbiAgICogUGFzcyB0aGUgcG9ydGFibGUge0BsaW5rIEJyYW5kQ29udGV4dH0gc2hhcmVkIGFjcm9zcyB0aGUgVUkgYW5kXG4gICAqIGxpYnJhcmllcyAoZS5nLiBgYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dGAgZnJvbSBgQGRieC10b29scy9zaGFyZWQtY29yZWAsXG4gICAqIG9yIGEgY3VzdG9tZXIgYnJhbmQpIC0gdGhlIHNhbWUgb2JqZWN0IHRoZSBlbWFpbCBhZGQtb24gYW5kIHRoZSBVSVxuICAgKiBgQnJhbmRQcm92aWRlcmAgY29uc3VtZSwgc28gYSBob3N0IHRoZW1lcyBjaGFydHMsIGVtYWlsLCBhbmQgVUkgZnJvbSBvbmVcbiAgICogc291cmNlLlxuICAgKi9cbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQ7XG4gIC8qKlxuICAgKiBSZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBtYXRlcmlhbGl6ZWQgb25jZSBhdCBhcHAgc3RhcnR1cC4gQSBzaW5nbGVcbiAgICogc291cmNlLCBhIGxpc3QsIG9yIGEgYHsgc291cmNlcywgZmFpbE9uRXJyb3I/LCAuLi4gfWAgYmFnLlxuICAgKlxuICAgKiBFYWNoIHNvdXJjZSBpcyBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGEgZ2l0IC8gR2l0TGFiIFVSTCwgb3IgYSBkaXJlY3RcbiAgICogYFNLSUxMLm1kYCAvIGFyY2hpdmUgZG93bmxvYWQgVVJMLiBSZXNvbHV0aW9uIHByZWZlcnMgdGhlIE9QVElPTkFMIGBza2lsbHNgXG4gICAqIG5wbSBDTEkgKGEgcGVlciBkZXApIHdoaWNoIGlzIGNvcGllZCBpbnRvIGEgdGVtcCBkaXIgYW5kIHRoZW4gcGVyc2lzdGVkO1xuICAgKiB3aXRob3V0IGl0LCBhIFVSTCBzb3VyY2UgaXMgZmV0Y2hlZCBkaXJlY3RseS4gQSBzb3VyY2UgdGhhdCByZXNvbHZlc1xuICAgKiB0aHJvdWdoIG5laXRoZXIgZmFpbHMgc3RhcnR1cCB1bmxlc3MgYGZhaWxPbkVycm9yOiBmYWxzZWAuXG4gICAqXG4gICAqIFByb3Zpc2lvbmVkIHNraWxscyBhcmUgd3JpdHRlbiB0byB0aGUgRGF0YWJyaWNrcyB1c2VyJ3MgQXNzaXN0YW50IHNraWxsc1xuICAgKiBmb2xkZXIgKGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2AsIHRoZSBcInNhdmUgdGhpcyBhcyBhIHNraWxsXCJcbiAgICogdGFyZ2V0KSBzbyB0aGV5IHBlcnNpc3QgYW5kIGFyZSBwaWNrZWQgdXAgYnkgdGhlIGJ1aWx0LWluIEFzc2lzdGFudC1za2lsbHNcbiAgICogbW91bnQuIFdpdGggbm8gd3JpdGFibGUgd29ya3NwYWNlLCB0aGV5IGdvIHRvIGEgbG9jYWwgdGVtcCBkaXIgaW5zdGVhZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgcmVtb3RlU2tpbGxzOiBcInZlcmNlbC1sYWJzL2FnZW50LXNraWxsc1wiIH0pO1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIHJlbW90ZVNraWxsczoge1xuICAgKiAgICAgc291cmNlczogW1widmVyY2VsLWxhYnMvYWdlbnQtc2tpbGxzXCIsIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9za2lsbC5tZFwiXSxcbiAgICogICAgIGZhaWxPbkVycm9yOiBmYWxzZSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICByZW1vdGVTa2lsbHM/OiBSZW1vdGVTa2lsbHNPcHRpb247XG59XG5cbi8qKlxuICogSlNPTiBTY2hlbWEgcHVibGlzaGVkIG9uIHRoZSBtYW5pZmVzdCdzIGBjb25maWcuc2NoZW1hYCwgbWlycm9yaW5nIHRoZVxuICogZG9jdW1lbnRlZCBkZWZhdWx0cyBhbmQgZW52aXJvbm1lbnQgZmFsbGJhY2tzIG9mIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWd9LlxuICpcbiAqIENvdmVycyB0aGUgSlNPTi1leHByZXNzaWJsZSBvcHRpb25zIG9ubHkuIGBhZ2VudHNgLCBgdG9vbHNgLCBhbmQgYVxuICogYGRlZmF1bHRNb2RlbGAgcGFzc2VkIGFzIGEgTWFzdHJhIGBEeW5hbWljQXJndW1lbnRgIGFyZSBjb2RlLWRlZmluZWRcbiAqIChmdW5jdGlvbnMgLyBjbGFzcyBpbnN0YW5jZXMpLCBzbyB0aGV5IGNhcnJ5IG5vIHNjaGVtYSBlbnRyeTsgdGhlXG4gKiBgZGVmYXVsdE1vZGVsYCBwcm9wZXJ0eSBiZWxvdyBkZXNjcmliZXMgaXRzIHN0cmluZyBmb3JtLlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX0NPTkZJR19TQ0hFTUE6IENvbmZpZ1NjaGVtYSA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgcHJvcGVydGllczoge1xuICAgIHByb3ZpZGVySWQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogJ01hc3RyYSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBpZC4gRGVmYXVsdHMgdG8gXCJkYXRhYnJpY2tzXCIuJyxcbiAgICB9LFxuICAgIHJlbW90ZVNraWxsczoge1xuICAgICAgdHlwZTogW1wic3RyaW5nXCIsIFwiYXJyYXlcIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1JlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIHByb3Zpc2lvbmVkIGF0IHN0YXJ0dXA6IFwiYWl0b29sc1wiIGZvciBEYXRhYnJpY2tzXFwnIG93biBza2lsbCBzZXQgKHJlYWQgZnJvbSB0aGUgcHVibGljIGRhdGFicmlja3MvZGF0YWJyaWNrcy1hZ2VudC1za2lsbHMgcmVwbywgbm8gQ0xJIG5lZWRlZCksIGEgR2l0SHViIG93bmVyL3JlcG8sIGEgZ2l0L0dpdExhYiBVUkwsIG9yIGEgZGlyZWN0IFNLSUxMLm1kL2FyY2hpdmUgVVJMLiBOb24tYWl0b29scyBzb3VyY2VzIHByZWZlciB0aGUgb3B0aW9uYWwgYHNraWxsc2AgbnBtIENMSSwgZWxzZSBhIGRpcmVjdCBmZXRjaDsgZmFpbHMgc3RhcnR1cCBvbiBlcnJvciB1bmxlc3MgZmFpbE9uRXJyb3I6ZmFsc2UuIFdyaXR0ZW4gdG8gdGhlIERhdGFicmlja3MgdXNlciBBc3Npc3RhbnQgc2tpbGxzIGZvbGRlciwgb3IgYSBsb2NhbCB0ZW1wIGRpciB3aGVuIG5vIHdvcmtzcGFjZSBpcyB3cml0YWJsZS4nLFxuICAgIH0sXG4gICAgc3RvcmFnZToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBvc3RncmVzU3RvcmUgZm9yIE1hc3RyYSB0aHJlYWRzIC8gbWVzc2FnZXMuIGB0cnVlYCByZXVzZXMgdGhlIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbCwgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLiBBdXRvLWVuYWJsZWQgd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC5cIixcbiAgICB9LFxuICAgIG1lbW9yeToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBnVmVjdG9yIHN0b3JlIGZvciBNYXN0cmEgc2VtYW50aWMgcmVjYWxsLiBgdHJ1ZWAgcmV1c2VzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbidzIHBvb2wsIGFuIG9iamVjdCBvcGVucyBhIGRlZGljYXRlZCBzdG9yZS4gQXV0by1lbmFibGVkIHdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0QWdlbnQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBZ2VudCBpZCB1c2VkIHdoZW4gdGhlIGNsaWVudCBuYW1lcyBub25lLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBhZ2VudCwgZWxzZSB0aGUgYnVpbHQtaW4gYGRlZmF1bHRgLlwiLFxuICAgIH0sXG4gICAgZGVmYXVsdE1vZGVsOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU2VydmluZyBlbmRwb2ludCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzIG93biBtb2RlbC4gRmFsbHMgYmFjayB0byBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRSwgdGhlbiB0aGUgYXV0by1yZXNvbHZlZCBjYXRhbG9ndWUuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0TW9kZWxGYWxsYmFja3M6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByaW9yaXR5LW9yZGVyZWQgZW5kcG9pbnQgbmFtZXMgdHJpZWQgYmVmb3JlIHRoZSBzY29yZS1jbGFzc2lmaWVkIGNhdGFsb2d1ZSB3aGVuIG5vdGhpbmcgZWxzZSBwaW5zIGEgbW9kZWwuXCIsXG4gICAgfSxcbiAgICBtb2RlbEZ1enp5TWF0Y2g6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRnV6enktbWF0Y2ggbG9vc2UgbW9kZWwgbmFtZXMgYWdhaW5zdCB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZS4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIG1vZGVsRnV6enlUaHJlc2hvbGQ6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXNlLmpzIHNjb3JlIHRocmVzaG9sZCBmb3IgdGhlIGZ1enp5IG1hdGNoZXIsIDAgKGV4YWN0KSB0byAxIChhbnl0aGluZykuIERlZmF1bHRzIHRvIDAuNC5cIixcbiAgICB9LFxuICAgIG1vZGVsQ2FjaGVUdGxNczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlRUTCBpbiBtcyBmb3IgdGhlIHNlcnZpbmctZW5kcG9pbnRzIGxpc3QgY2FjaGUsIHBlciB3b3Jrc3BhY2UgaG9zdC4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLlwiLFxuICAgIH0sXG4gICAgbW9kZWxPdmVycmlkZToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIb25vciBhIHBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlIGZyb20gdGhlIFgtTWFzdHJhLU1vZGVsIGhlYWRlciwgP21vZGVsPSBxdWVyeSwgb3IgYSBgbW9kZWxgIGJvZHkgZmllbGQuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBnZW5pZVNwYWNlczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7IHR5cGU6IFtcInN0cmluZ1wiLCBcIm9iamVjdFwiXSB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiR2VuaWUgc3BhY2VzIHRoZSBhZ2VudHMgY2FuIGRlbGVnYXRlIHRvLCBrZXllZCBieSBhbGlhcyAodGhlIHRvb2wtbmFtZSBzdWZmaXgpLiBFYWNoIHZhbHVlIGlzIGEgc3BhY2UgaWQgb3IgYHsgc3BhY2VJZCwgaGludCB9YC4gRmFsbHMgYmFjayB0byB0aGUgYGdlbmllYCBwbHVnaW4ncyBvd24gYHNwYWNlc2AgY29uZmlnLCB0aGVuIERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQgdW5kZXIgdGhlIGBkZWZhdWx0YCBhbGlhcy5cIixcbiAgICB9LFxuICAgIGdlbmllU3BhY2VDYWNoZVR0bE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVFRMIGluIG1zIGZvciB0aGUgR2VuaWUgc3BhY2UgbWV0YWRhdGEgY2FjaGUuIERlZmF1bHRzIHRvIDUgbWludXRlcy5cIixcbiAgICB9LFxuICAgIGFnZW50TWF4U3RlcHM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNYXhpbXVtIExMTSBzdGVwcyBlYWNoIGFnZW50IGdldHMgcGVyIHR1cm4gKGEgdG9vbCBjYWxsIGFuZCB0aGUgZmluYWwgcmVwbHkgZWFjaCBjb25zdW1lIG9uZSkuIERlZmF1bHRzIHRvIDI1LlwiLFxuICAgIH0sXG4gICAgc3RyaXBTdGFsZUNoYXJ0czoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTdHJpcCBjaGFydElkcyBmcm9tIHJlY2FsbGVkIGFzc2lzdGFudCB0b29sIHJlc3VsdHMgc28gdGhlIG1vZGVsIGNhbm5vdCByZXVzZSBhIHR1cm4tc2NvcGVkIGNoYXJ0IG1hcmtlci4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIHN0eWxlSW5zdHJ1Y3Rpb25zOiB7XG4gICAgICB0eXBlOiBbXCJzdHJpbmdcIiwgXCJib29sZWFuXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy4gQSBzdHJpbmcgcmVwbGFjZXMgdGhlIGJ1aWx0LWluIGJsb2NrLCBgZmFsc2VgIGRpc2FibGVzIGl0LlwiLFxuICAgIH0sXG4gICAgb2JzZXJ2YWJpbGl0eToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJCcmlkZ2UgTWFzdHJhIHNwYW5zIGludG8gQXBwS2l0J3MgT1RlbCBwaXBlbGluZS4gRGVmYXVsdHMgdG8gb24gb25seSB3aGVuIE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVCBvciBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UIGlzIHNldC5cIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkxvZyB0aHVtYnMgLyBjb21tZW50IGFzc2Vzc21lbnRzIHRvIE1MZmxvdyBhbmQgc3VyZmFjZSB0aGUgZmVlZGJhY2sgY29udHJvbHMuIERlZmF1bHRzIHRvIG9uIG9ubHkgd2hlbiBhbiBPVExQIGVuZHBvaW50IGFuZCBNTEZMT1dfRVhQRVJJTUVOVF9JRCBvciBNTEZMT1dfRVhQRVJJTUVOVF9OQU1FIGFyZSBzZXQuXCIsXG4gICAgfSxcbiAgICBtY3A6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFeHBvc2UgdGhlIHJlZ2lzdGVyZWQgYWdlbnRzIG92ZXIgTUNQLiBEZWZhdWx0cyB0byBhZ2VudHMtb25seTsgYW4gb2JqZWN0IHR1bmVzIHRoZSBzZXJ2ZXIgaWQsIGFkdmVydGlzZWQgbWV0YWRhdGEsIGFuZCB3aGV0aGVyIGFtYmllbnQgdG9vbHMgYXJlIGV4cG9zZWQuXCIsXG4gICAgfSxcbiAgICBnZW5pZUlkZW50aXR5OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgLy8gRGVyaXZlZCBmcm9tIHRoZSByZXNvbHZlcidzIG93biBsaXN0LCBzbyBhIG1vZGUgY2FuIG5ldmVyIGJlIGFjY2VwdGVkIGF0XG4gICAgICAvLyBydW50aW1lIHdoaWxlIHRoZSBwdWJsaXNoZWQgc2NoZW1hIChhbmQgdGhlIFVJIGJ1aWx0IGZyb20gaXQpIG9taXRzIGl0LlxuICAgICAgZW51bTogWy4uLklERU5USVRZX01PREVTXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnV2hpY2ggRGF0YWJyaWNrcyBpZGVudGl0eSB0aGUgYWdlbnRzXFwnIHdvcmtzcGFjZSBjYWxscyAoc2VydmluZyBjYXRhbG9ndWUsIEdlbmllLCBzdGF0ZW1lbnQgZXhlY3V0aW9uKSBydW4gYXMuIFwidXNlclwiIChkZWZhdWx0KSBpcyBhbHdheXMgT0JPLCBzbyBjYWxsZXJzIG11c3QgYmUgd29ya3NwYWNlIG1lbWJlcnM7IFwic2VydmljZS1wcmluY2lwYWxcIiBhbHdheXMgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLCBzbyBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwIHdvcmtzLCBhdCB0aGUgY29zdCBvZiBwZXItdXNlciBhdHRyaWJ1dGlvbjsgXCJhdXRvXCIgdXNlcyBPQk8gd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIGFuIE9CTyB0b2tlbiBhbmQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIHdoZW4gaXQgZG9lcyBub3QsIGZvciBhbiBhcHAgdGhhdCBhbHNvIHNlcnZlcyBhIHR1bm5lbCBvciB3ZWJob29rIGRvb3IuIEZhbGxzIGJhY2sgdG8gTUFTVFJBX0dFTklFX0lERU5USVRZLicsXG4gICAgfSxcbiAgICBhcGlBY2Nlc3M6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJzY29wZWRcIiwgXCJmdWxsXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdIb3cgbXVjaCBvZiB0aGUgc3RvY2sgQG1hc3RyYS9leHByZXNzIEFQSSBpcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbW91bnQuIFwic2NvcGVkXCIgKGRlZmF1bHQpIGFsbG93cyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpcyBwbHVnaW5cXCdzIG93biByb3V0ZXMsIGFuZCBNQ1A7IFwiZnVsbFwiIGRpc3BhdGNoZXMgdGhlIGVudGlyZSBtYW5hZ2VtZW50IHN1cmZhY2UuJyxcbiAgICB9LFxuICAgIGJyYW5kOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9ydGFibGUgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGdlbmVyYXRlZCBjaGFydHMgKHNlcmllcyBwYWxldHRlIGZyb20gY29sb3JzLnByaW1hcnkgLyBjb2xvcnMuYWNjZW50LCBiYXNlIGZvbnQgZnJvbSB0eXBvZ3JhcGh5LnNhbnMpLlwiLFxuICAgIH0sXG4gIH0sXG59O1xuIl19
|
package/lib/src/plugin.d.ts
CHANGED
|
@@ -124,14 +124,13 @@ export declare class MastraPlugin extends Plugin<MastraPluginConfig> {
|
|
|
124
124
|
*
|
|
125
125
|
* In `"user"` mode (the default) this is `this.asUser(req)` - AppKit's own
|
|
126
126
|
* proxy that runs every call inside `runInUserContext`, so `getExecutionContext()`
|
|
127
|
-
* returns the caller's OBO client
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
* decision lives in one place.
|
|
127
|
+
* returns the caller's OBO client. In `"service-principal"` mode it is `this`
|
|
128
|
+
* unwrapped, so the same methods run in the ambient service context and
|
|
129
|
+
* `getExecutionContext()` returns the app service principal's client - the same
|
|
130
|
+
* "just don't enter `asUser`" pattern AppKit's own service-context calls use. One
|
|
131
|
+
* helper covers every workspace call the chat path makes (serving catalogue,
|
|
132
|
+
* Genie suggestions, `ask_genie` via the dispatched agent turn, statement fetch,
|
|
133
|
+
* feedback), so the identity decision lives in one place.
|
|
135
134
|
*/
|
|
136
135
|
private scopedSelf;
|
|
137
136
|
/**
|
package/lib/src/plugin.js
CHANGED
|
@@ -206,14 +206,13 @@ export class MastraPlugin extends Plugin {
|
|
|
206
206
|
*
|
|
207
207
|
* In `"user"` mode (the default) this is `this.asUser(req)` - AppKit's own
|
|
208
208
|
* proxy that runs every call inside `runInUserContext`, so `getExecutionContext()`
|
|
209
|
-
* returns the caller's OBO client
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
* decision lives in one place.
|
|
209
|
+
* returns the caller's OBO client. In `"service-principal"` mode it is `this`
|
|
210
|
+
* unwrapped, so the same methods run in the ambient service context and
|
|
211
|
+
* `getExecutionContext()` returns the app service principal's client - the same
|
|
212
|
+
* "just don't enter `asUser`" pattern AppKit's own service-context calls use. One
|
|
213
|
+
* helper covers every workspace call the chat path makes (serving catalogue,
|
|
214
|
+
* Genie suggestions, `ask_genie` via the dispatched agent turn, statement fetch,
|
|
215
|
+
* feedback), so the identity decision lives in one place.
|
|
217
216
|
*/
|
|
218
217
|
scopedSelf(req) {
|
|
219
218
|
return useServicePrincipal(this.identityMode, req) ? this : this.asUser(req);
|
|
@@ -1100,4 +1099,4 @@ function parseStatementLimit(raw) {
|
|
|
1100
1099
|
* ```
|
|
1101
1100
|
*/
|
|
1102
1101
|
export const mastra = toPlugin(MastraPlugin);
|
|
1103
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxHQUtQLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBK0IsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0MsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBRzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUM5RixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZ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U0FBUyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDRztBQUNILE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwcEtpdCBwbHVnaW4gdGhhdCBidWlsZHMgb25lIG9yIG1vcmUgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2VzIGFuZFxuICogbW91bnRzIHRoZSBgQG1hc3RyYS9leHByZXNzYCBzZXJ2ZXIuIENsaWVudHMgZHJpdmUgdGhlIGNvbnZlcnNhdGlvblxuICogb3ZlciB0aGUgc3RhbmRhcmQgTWFzdHJhIGFnZW50IHN0cmVhbSAoYEBtYXN0cmEvY2xpZW50LWpzYCdzXG4gKiBgZ2V0QWdlbnQoaWQpLnN0cmVhbSgpYCksIHNvIHRoZXJlJ3Mgbm8gYmVzcG9rZSBjaGF0IHRyYW5zcG9ydCB0b1xuICoga2VlcCBpbiBzeW5jLlxuICpcbiAqIC0gQWdlbnRzOiByZWdpc3RlcmVkIHRocm91Z2ggYGNvbmZpZy5hZ2VudHNgIGF0IHBsdWdpbiBjcmVhdGlvblxuICogICAoe0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0pLiBFYWNoIGVudHJ5J3MgYHRvb2xzYCBmaWVsZCBhY2NlcHRzXG4gKiAgIGVpdGhlciBhIHBsYWluIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrIHRoYXQgZ2V0c1xuICogICBhIHR5cGVkIHNpYmxpbmctcGx1Z2luIGluZGV4ICh7QGxpbmsgTWFzdHJhUGx1Z2luc30pLiBPbWl0XG4gKiAgIGBjb25maWcuYWdlbnRzYCB0byBnZXQgYSBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3QuXG4gKiAtIE1vZGVsOiBlYWNoIGFnZW50IGNhbGwgcmVzb2x2ZXMgYSBgTWFzdHJhTW9kZWxDb25maWdgIHZpYVxuICogICB7QGxpbmsgYnVpbGRNb2RlbH0gZnJvbSBgLi9tb2RlbC5qc2AuIFBlci1hZ2VudCBgbW9kZWxgIG92ZXJyaWRlc1xuICogICAoYEFnZW50Q29uZmlnW1wibW9kZWxcIl1gIG9yIGEgYG1vZGVsSWRgIHN0cmluZykgZmxvdyB0aHJvdWdoXG4gKiAgIHtAbGluayBidWlsZEFnZW50c30uXG4gKiAtIE1lbW9yeSAvIHN0b3JhZ2U6IHBlci1hZ2VudCwgYnVpbHQgYnkge0BsaW5rIGNyZWF0ZU1lbW9yeUJ1aWxkZXJ9XG4gKiAgIGZyb20gYC4vbWVtb3J5LmpzYC4gQm90aCBhdXRvLWRlZmF1bHQgdG8gYHRydWVgIHdoZW4gdGhlXG4gKiAgIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQgKHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZFxuICogICBgZmFsc2VgIG9yIGEgY3VzdG9tIGNvbmZpZykuIFN0b3JhZ2UgbmFtZXNwYWNlcyBwZXIgYWdlbnQgdmlhXG4gKiAgIHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBwZXIgYWdlbnQ7IHRoZSB2ZWN0b3Igc3RvcmUgaXMgYSBzaW5nbGVcbiAqICAgc2hhcmVkIHNpbmdsZXRvbiBhY3Jvc3MgZXZlcnkgYWdlbnQuXG4gKiAtIFNlcnZlcjogdGhlIEV4cHJlc3Mgc3ViYXBwIHdpcmluZyBsaXZlcyBpbiBgLi9zZXJ2ZXIuanNgLlxuICogLSBIVFRQOiBBcHBLaXQgbW91bnRzIHRoaXMgcGx1Z2luIHVuZGVyIGAvYXBpL21hc3RyYWAuIEFsb25nc2lkZSB0aGVcbiAqICAgTWFzdHJhIGFnZW50IHJvdXRlcywgdGhlIHBsdWdpbiByZWdpc3RlcnMgYC9yb3V0ZS9oaXN0b3J5YFxuICogICAobG9hZCArIGNsZWFyIGEgdGhyZWFkJ3MgbWVzc2FnZXMpLCBgL3JvdXRlL3RocmVhZHNgIChsaXN0IHRoZVxuICogICBjYWxsZXIncyBjb252ZXJzYXRpb25zICsgZGVsZXRlIG9uZSksIGAvbW9kZWxzYCwgYC9kZWZhdWx0LW1vZGVsYCxcbiAqICAgYC9zdWdnZXN0aW9uc2AsIGAvcm91dGUvZmVlZGJhY2tgIChsb2cgYSB0aHVtYnMgLyBjb21tZW50IHRvIE1MZmxvd1xuICogICB3aGVuIGZlZWRiYWNrIGlzIGVuYWJsZWQpLCBhbmQgdGhlIGdlbmVyaWMgYC9lbWJlZC86dHlwZS86aWRgXG4gKiAgIHJlc29sdmVyIGZvciBpbmxpbmUgY2hhcnQgLyBkYXRhIG1hcmtlcnMuIEVhY2ggaXMgcmVnaXN0ZXJlZCB0aHJvdWdoXG4gKiAgIEFwcEtpdCdzIGByb3V0ZSgpYCBzbyBpdCBsYW5kcyBpbiB0aGUgcGx1Z2luJ3MgZW5kcG9pbnQgbWFwLCBhbmRcbiAqICAgZXZlcnkgb3V0Ym91bmQgY2FsbCBvbmUgbWFrZXMgcnVucyB0aHJvdWdoIGBleGVjdXRlKClgIChzZWVcbiAqICAgYC4vZGVmYXVsdHMuanNgKS4gVGhlIHN0b2NrIGBAbWFzdHJhL2V4cHJlc3NgIHN1cmZhY2UgaXMgZ2F0ZWRcbiAqICAgYnkgYGNvbmZpZy5hcGlBY2Nlc3NgIChkZWZhdWx0IGBcInNjb3BlZFwiYCk6IG9ubHkgYWdlbnQgaW5mZXJlbmNlLFxuICogICByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoZSBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpXG4gKiAgIE1DUCBhcmUgZGlzcGF0Y2hlZCB0byBNYXN0cmE7IGFkbWluIC8gbXV0YXRpbmcgLyBidWxrLWV4cG9ydCByb3V0ZXNcbiAqICAgYXJlIHJlZnVzZWQgd2l0aCBgNDAzYC4gU2VlIHtAbGluayBpc01hc3RyYVJlcXVlc3RBbGxvd2VkfS5cbiAqIC0gTUNQOiBvcHQgaW4gd2l0aCBgY29uZmlnLm1jcGAgdG8gZXhwb3NlIHRoZSBhZ2VudHMgKGFuZCBvcHRpb25hbGx5XG4gKiAgIHRvb2xzKSBhcyBhIE1hc3RyYSBgTUNQU2VydmVyYC4gSXQgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgYE1hc3RyYWBcbiAqICAgaW5zdGFuY2UgdmlhIGBtY3BTZXJ2ZXJzYCwgc28gYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzIHRoZSBzdG9ja1xuICogICBNQ1AgdHJhbnNwb3J0IHJvdXRlcyAoYC9tY3AvPHNlcnZlcklkPi8uLi5gKSB1bmRlciB0aGUgbW91bnQuIFNlZVxuICogICBgLi9tY3AuanNgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBFeGVjdXRpb25FcnJvcixcbiAgZ2VuaWUsXG4gIGdldEV4ZWN1dGlvbkNvbnRleHQsXG4gIGxha2ViYXNlLFxuICBQbHVnaW4sXG4gIHRvUGx1Z2luLFxuICB0eXBlIEV4ZWN1dGlvblJlc3VsdCxcbiAgdHlwZSBJQXBwUm91dGVyLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgc2VydmluZyBhcyBub2RlU2VydmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBhc3luYywgZXJyb3IsIGxvZywgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgZmVlZGJhY2ssXG4gIHJvdXRlcyxcbiAgdHlwZSBDaGFydCxcbiAgdHlwZSBNYXN0cmFDbGllbnRDb25maWcsXG4gIHR5cGUgTWFzdHJhRmVlZGJhY2tSZXF1ZXN0LFxuICB0eXBlIFN0YXRlbWVudERhdGEsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IGRpc3BsYXksIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IE1hc3RyYSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgdHlwZSB7IFBvb2wgfSBmcm9tIFwicGdcIjtcblxuaW1wb3J0IHsgYnVpbGRBZ2VudHMsIEZBTExCQUNLX0FHRU5UX0lELCB0eXBlIEJ1aWx0QWdlbnRzIH0gZnJvbSBcIi4vYWdlbnRzLnRzXCI7XG5pbXBvcnQgeyBmZXRjaENoYXJ0IH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB7IGF0dHJpYnV0ZWRVc2VySWQsIE1BU1RSQV9DT05GSUdfU0NIRU1BLCB0eXBlIE1hc3RyYVBsdWdpbkNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgY2hhcnRGZXRjaERlZmF1bHRzLFxuICBmZWVkYmFja1dyaXRlRGVmYXVsdHMsXG4gIGdlbmllU3VnZ2VzdGlvbkRlZmF1bHRzLFxuICBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLFxuICBzdGF0ZW1lbnREYXRhRGVmYXVsdHMsXG59IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucywgcmVzb2x2ZUdlbmllU3BhY2VzIH0gZnJvbSBcIi4vZ2VuaWUudHNcIjtcbmltcG9ydCB7IGhpc3RvcnlSb3V0ZSB9IGZyb20gXCIuL2hpc3RvcnkudHNcIjtcbmltcG9ydCB7XG4gIHJlcXVlc3RVc2VySWQsXG4gIHJlc29sdmVJZGVudGl0eU1vZGUsXG4gIHVzZVNlcnZpY2VQcmluY2lwYWwsXG4gIHR5cGUgTWFzdHJhSWRlbnRpdHlNb2RlLFxufSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHsgYnVpbGRNY3BTZXJ2ZXIsIHR5cGUgUmVzb2x2ZWRNY3AgfSBmcm9tIFwiLi9tY3AudHNcIjtcbmltcG9ydCB7IGNyZWF0ZU1lbW9yeUJ1aWxkZXIsIGNyZWF0ZVNlcnZpY2VQcmluY2lwYWxQb29sLCBuZWVkc0xha2ViYXNlIH0gZnJvbSBcIi4vbWVtb3J5LnRzXCI7XG5pbXBvcnQgeyBsb2dGZWVkYmFjaywgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZCB9IGZyb20gXCIuL21sZmxvdy50c1wiO1xuaW1wb3J0IHsgYnVpbGRPYnNlcnZhYmlsaXR5IH0gZnJvbSBcIi4vb2JzZXJ2YWJpbGl0eS50c1wiO1xuaW1wb3J0IHsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzIH0gZnJvbSBcIi4vcmVtb3RlLXNraWxscy50c1wiO1xuaW1wb3J0IHtcbiAgYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUsXG4gIGNyZWF0ZVJlcXVlc3RDb250ZXh0LFxuICBpc01hc3RyYVJlcXVlc3RBbGxvd2VkLFxuICBNYXN0cmFTZXJ2ZXIsXG59IGZyb20gXCIuL3NlcnZlci50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVNlcnZpbmdDb25maWcgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyBmZXRjaFN0YXRlbWVudERhdGEsIFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3RhdGVtZW50LnRzXCI7XG5pbXBvcnQgeyB0aHJlYWRzUm91dGUgfSBmcm9tIFwiLi90aHJlYWRzLnRzXCI7XG5pbXBvcnQgeyBhdHRhY2hDaGF0VHVyblRyYWNlSW8gfSBmcm9tIFwiLi90cmFjZS1pby50c1wiO1xuaW1wb3J0IHsgaW52YWxpZEZpZWxkcyB9IGZyb20gXCIuL3ZhbGlkYXRpb24udHNcIjtcblxuY29uc3QgR0VOSUVfTUFOSUZFU1QgPSBwbHVnaW4uZGF0YShnZW5pZSkucGx1Z2luLm1hbmlmZXN0O1xuY29uc3QgTEFLRUJBU0VfTUFOSUZFU1QgPSBwbHVnaW4uZGF0YShsYWtlYmFzZSkucGx1Z2luLm1hbmlmZXN0O1xuXG4vKipcbiAqIEJ1ZGdldCBmb3IgZHJhaW5pbmcgdGhlIG1lbW9yeSBzZXJ2aWNlLXByaW5jaXBhbCBwb29sIG9uIHNodXRkb3duLiBXZWxsXG4gKiBpbnNpZGUgQXBwS2l0J3MgMTVzIGdyYWNlZnVsLXNodXRkb3duIHdpbmRvdywgc28gYSBzdHVjayBjb25uZWN0aW9uIGNhblxuICogbmV2ZXIgYmUgd2hhdCBob2xkcyB0aGUgcHJvY2VzcyBvcGVuLlxuICovXG5jb25zdCBQT09MX0RSQUlOX1RJTUVPVVRfTVMgPSA1XzAwMDtcblxuLyoqIENlaWxpbmcgb24gdGhlIGA/dGltZW91dE1zPWAgbG9uZy1wb2xsIGJ1ZGdldCBhIGNsaWVudCBtYXkgcmVxdWVzdC4gKi9cbmNvbnN0IE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVMgPSA1ICogNjBfMDAwO1xuXG4vKiogU3RhYmxlIGNsaWVudCBtZXNzYWdlIHdoZW4gdGhlIHdvcmtzcGFjZSdzIG1vZGVsIGNhdGFsb2d1ZSBjYW4ndCBiZSByZWFkLiAqL1xuY29uc3QgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFID0gXCJDb3VsZCBub3QgcmVhZCB0aGUgd29ya3NwYWNlJ3MgbW9kZWwgY2F0YWxvZ3VlXCI7XG5cbi8qKiBTdGFibGUgY2xpZW50IG1lc3NhZ2UgZm9yIGEgZmVlZGJhY2sgYm9keSB0aGF0IGZhaWxzIHNjaGVtYSB2YWxpZGF0aW9uLiAqL1xuY29uc3QgSU5WQUxJRF9GRUVEQkFDS19NRVNTQUdFID0gXCJJbnZhbGlkIGZlZWRiYWNrIHJlcXVlc3RcIjtcblxuLyoqIENhY2hlIG5hbWVzcGFjZSBmb3Igc3RhdGVtZW50IHJlc3VsdCBzZXRzLCBtYXRjaGluZyB0aGUgY2hhcnQgY2FjaGUncyBmb3JtLiAqL1xuY29uc3QgU1RBVEVNRU5UX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOnN0YXRlbWVudFwiO1xuXG4vKipcbiAqIEFwcEtpdCBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYG1hc3RyYWApIHRoYXQgaG9zdHMgTWFzdHJhIGFnZW50c1xuICogd2l0aCBvcHRpb25hbCBMYWtlYmFzZS1iYWNrZWQgbWVtb3J5IGFuZCBBSSBTREsgY2hhdCByb3V0ZXMgdW5kZXJcbiAqIHRoZSBwbHVnaW4gbW91bnQgKHR5cGljYWxseSBgL2FwaS9tYXN0cmFgKS5cbiAqXG4gKiBAZXhhbXBsZSBSZWdpc3RlciB0aGUgcGx1Z2luXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBsYWtlYmFzZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZUFnZW50LCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogLy8gYGxha2ViYXNlYCBmaXJzdDogcmVnaXN0ZXJpbmcgaXQgYXV0by1lbmFibGVzIE1hc3RyYSBzdG9yYWdlICsgbWVtb3J5LlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIGxha2ViYXNlKCksXG4gKiAgICAgbWFzdHJhKHtcbiAqICAgICAgIGdlbmllU3BhY2VzOiB7IGRlZmF1bHQ6IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQhIH0sXG4gKiAgICAgICBhZ2VudHM6IGNyZWF0ZUFnZW50KHtcbiAqICAgICAgICAgbmFtZTogXCJhbmFseXN0XCIsXG4gKiAgICAgICAgIGluc3RydWN0aW9uczogXCJZb3UgYW5zd2VyIHF1ZXN0aW9ucyBhYm91dCByZXZlbnVlIGFuZCByZXR1cm5zLlwiLFxuICogICAgICAgICB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgICAgICAgcmV0dXJuIHsgLi4ucGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpIH07XG4gKiAgICAgICAgIH0sXG4gKiAgICAgICB9KSxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgUmVhZCB0aGUgYWdlbnRzIGJhY2sgb2ZmIHRoZSBBcHBLaXQgaW5zdGFuY2VcbiAqIGBgYHRzXG4gKiBjb25zdCBhZ2VudElkcyA9IGFwcC5tYXN0cmEubGlzdCgpO1xuICogY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgYXBwLm1hc3RyYS5saXN0TW9kZWxzKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE1hc3RyYVBsdWdpbiBleHRlbmRzIFBsdWdpbjxNYXN0cmFQbHVnaW5Db25maWc+IHtcbiAgLy8gQW5ub3RhdGVkIHJhdGhlciB0aGFuIGxlZnQgdG8gYHNhdGlzZmllc2A6IHRoZSBjb25maWcgc2NoZW1hJ3MgdHlwZSBjb21lc1xuICAvLyBmcm9tIGBAdHlwZXMvanNvbi1zY2hlbWFgLCB3aGljaCB0aGlzIHBhY2thZ2UgZG9lcyBub3QgZGVwZW5kIG9uLCBzbyBhblxuICAvLyBpbmZlcnJlZCBtYW5pZmVzdCB0eXBlIGNhbm5vdCBiZSBuYW1lZCBpbiB0aGUgZW1pdHRlZCBkZWNsYXJhdGlvbi4gVGhlXG4gIC8vIGBQbHVnaW5NYW5pZmVzdDxcIm1hc3RyYVwiPmAgcGFyYW1ldGVyIHN0aWxsIGNhcnJpZXMgdGhlIGxpdGVyYWwgbmFtZSBpbnRvXG4gIC8vIGB0b1BsdWdpbigpYCdzIGZhY3RvcnkgdHlwZS5cbiAgc3RhdGljIG1hbmlmZXN0OiBQbHVnaW5NYW5pZmVzdDxcIm1hc3RyYVwiPiA9IHtcbiAgICBuYW1lOiBcIm1hc3RyYVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIk1hc3RyYVwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJCdWlsZHMgYSBNYXN0cmEgQWdlbnQgd2l0aCB1c2VyLXNjb3BlZCB3b3Jrc3BhY2UgYXV0aCAoYXNVc2VyKSBcIiArXG4gICAgICBcImFuZCBvcHRpb25hbCBQb3N0Z3Jlcy1iYWNrZWQgTWFzdHJhIE1lbW9yeSB2aWEgdGhlIGBsYWtlYmFzZWAgcGx1Z2luLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW1xuICAgICAgICAvLyBSZXVzZSB0aGUgR2VuaWUgc3BhY2UtaWQgYmluZGluZyBkZWNsYXJlZCBieSBBcHBLaXQncyBgZ2VuaWVgXG4gICAgICAgIC8vIG1hbmlmZXN0IHNvIHRoZSByZXNvdXJjZS1iaW5kaW5nIHNoYXBlIGlzIGlkZW50aWNhbCB0byBBcHBLaXQncyBhbmRcbiAgICAgICAgLy8gYW4gZXhpc3RpbmcgYGFwcC55YW1sYCAvIGBnZW5pZSh7IHNwYWNlcyB9KWAgd2lyaW5nIGtlZXBzIHdvcmtpbmcuXG4gICAgICAgIC8vIFRoZSBidWlsdC1pbiBHZW5pZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHRocm91Z2hcbiAgICAgICAgLy8gYEBkYngtdG9vbHMvZ2VuaWVgLCBzbyBvbmx5IHRoZSBiaW5kaW5nIGlzIHNoYXJlZCwgbm90IHRoZSBwbHVnaW4nc1xuICAgICAgICAvLyB0b29scy5cbiAgICAgICAgLi4uR0VOSUVfTUFOSUZFU1QucmVzb3VyY2VzLnJlcXVpcmVkLFxuICAgICAgICAuLi5MQUtFQkFTRV9NQU5JRkVTVC5yZXNvdXJjZXMucmVxdWlyZWQsXG4gICAgICBdLFxuICAgIH0sXG4gICAgY29uZmlnOiB7IHNjaGVtYTogTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSxcbiAgfTtcblxuICAvKipcbiAgICogVGlnaHRlbiByZXNvdXJjZSByZXF1aXJlbWVudHMgYmFzZWQgb24gd2hpY2ggZmVhdHVyZXMgYXJlIGVuYWJsZWQuXG4gICAqIEFwcEtpdCBjYWxscyB0aGlzIGF0IHJlZ2lzdHJhdGlvbiB0aW1lIChjb25maWctYXdhcmUpIHNvIGRpc2FibGVkXG4gICAqIGZlYXR1cmVzIGRvbid0IHN1cmZhY2UgdGhlaXIgcmVzb3VyY2UgYXNrcyB0byB0aGUgaG9zdCBhcHAuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHJlc291cmNlczogUmVzb3VyY2VSZXF1aXJlbWVudFtdID0gW107XG4gICAgY29uc3QgZW5hYmxlZE1hbmlmZXN0czogUGx1Z2luTWFuaWZlc3Q8c3RyaW5nPltdID0gW107XG5cbiAgICBpZiAobmVlZHNMYWtlYmFzZShjb25maWcpKSB7XG4gICAgICBlbmFibGVkTWFuaWZlc3RzLnB1c2goTEFLRUJBU0VfTUFOSUZFU1QpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG0gb2YgZW5hYmxlZE1hbmlmZXN0cykge1xuICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBtLnJlc291cmNlcy5yZXF1aXJlZCkge1xuICAgICAgICByZXNvdXJjZXMucHVzaCh7IC4uLnJlc291cmNlLCByZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlcztcbiAgfVxuXG4gIHByaXZhdGUgbG9nZ2VyID0gbG9nLmxvZ2dlcih0aGlzKTtcbiAgcHJpdmF0ZSBidWlsdDogQnVpbHRBZ2VudHMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmE6IE1hc3RyYSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYUFwcDogZXhwcmVzcy5FeHByZXNzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhU2VydmVyOiBNYXN0cmFTZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBvcHRpb25hbCBNQ1Agc2VydmVyIGV4cG9zaW5nIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIC8gdG9vbHMsIG9yXG4gICAqIGBudWxsYCB3aGVuIGBjb25maWcubWNwYCBpcyBkaXNhYmxlZCAodGhlIGRlZmF1bHQpLiBCdWlsdCBpblxuICAgKiB7QGxpbmsgYnVpbGRBZ2VudEFuZFNlcnZlcn0gYW5kIHJlZ2lzdGVyZWQgb24gdGhlIE1hc3RyYSBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgbWNwOiBSZXNvbHZlZE1jcCB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogUmVzb2x2ZWQge0BsaW5rIE1hc3RyYUlkZW50aXR5TW9kZX06IHRoZSBpZGVudGl0eSB0aGUgY2hhdCBwYXRoJ3MgRGF0YWJyaWNrc1xuICAgKiBjYWxscyBydW4gYXMuIFJlYWQgb25jZSBhdCBzZXR1cCBzbyBhbiBpbnZhbGlkIGBnZW5pZUlkZW50aXR5YCBmYWlscyB0aGUgYXBwXG4gICAqIGJvb3QgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IHJlcXVlc3QsIGFuZCBzbyBldmVyeSByZXF1ZXN0IGFncmVlcy5cbiAgICovXG4gIHByaXZhdGUgaWRlbnRpdHlNb2RlOiBNYXN0cmFJZGVudGl0eU1vZGUgPSBcInVzZXJcIjtcbiAgLyoqXG4gICAqIERlZGljYXRlZCBzZXJ2aWNlLXByaW5jaXBhbCBMYWtlYmFzZSBwb29sIGJhY2tpbmcgTWFzdHJhIG1lbW9yeSAvXG4gICAqIHN0b3JhZ2UuIEJ1aWx0IG9uY2UgaW4ge0BsaW5rIGJ1aWxkQWdlbnRBbmRTZXJ2ZXJ9IChvdXRzaWRlIGFueVxuICAgKiBgYXNVc2VyYCBzY29wZSwgc28gaXQgbmV2ZXIgaW5oZXJpdHMgYSByZXF1ZXN0J3MgT0JPIGlkZW50aXR5KSBhbmRcbiAgICogZHJhaW5lZCBpbiB7QGxpbmsgc2h1dGRvd259LiBgbnVsbGAgdW50aWwgc2V0dXAgcnVucyBvciB3aGVuXG4gICAqIExha2ViYXNlIGlzbid0IG5lZWRlZC5cbiAgICovXG4gIHByaXZhdGUgc2VydmljZVByaW5jaXBhbFBvb2w6IFBvb2wgfCBudWxsID0gbnVsbDtcblxuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlIHRoZSBpZGVudGl0eSBtb2RlIHVwIGZyb250IHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZVxuICAgIC8vIGFwcCBib290IHdpdGggYSBjbGVhciBtZXNzYWdlIHJhdGhlciB0aGFuIDUwMC1pbmcgdGhlIGZpcnN0IGNoYXQgcmVxdWVzdC5cbiAgICB0aGlzLmlkZW50aXR5TW9kZSA9IHJlc29sdmVJZGVudGl0eU1vZGUodGhpcy5jb25maWcuZ2VuaWVJZGVudGl0eSk7XG4gICAgLy8gV2FpdCB1bnRpbCBzaWJsaW5nIHBsdWdpbnMgKGUuZy4gYGxha2ViYXNlYCkgZmluaXNoIGBzZXR1cCgpYCBzb1xuICAgIC8vIHRoZSBsYWtlYmFzZSBwb29sIGlzIHZhbGlkIHdoZW4gc3RvcmFnZS9tZW1vcnkgYXJlIGVuYWJsZWQuXG4gICAgdGhpcy5jb250ZXh0Py5vbkxpZmVjeWNsZShcInNldHVwOmNvbXBsZXRlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZEFnZW50QW5kU2VydmVyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGUgY2hhdCBwYXRoJ3MgRGF0YWJyaWNrcyBjYWxscyBzaG91bGQgcnVuIHRocm91Z2ggZm9yXG4gICAqIGByZXFgLCBob25vcmluZyB7QGxpbmsgaWRlbnRpdHlNb2RlfS5cbiAgICpcbiAgICogSW4gYFwidXNlclwiYCBtb2RlICh0aGUgZGVmYXVsdCkgdGhpcyBpcyBgdGhpcy5hc1VzZXIocmVxKWAgLSBBcHBLaXQncyBvd25cbiAgICogcHJveHkgdGhhdCBydW5zIGV2ZXJ5IGNhbGwgaW5zaWRlIGBydW5JblVzZXJDb250ZXh0YCwgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWBcbiAgICogcmV0dXJucyB0aGUgY2FsbGVyJ3MgT0JPIGNsaWVudCwgZXhhY3RseSBhcyBiZWZvcmUgdGhpcyBvcHRpb24gZXhpc3RlZC4gSW5cbiAgICogYFwic2VydmljZS1wcmluY2lwYWxcImAgbW9kZSBpdCBpcyBgdGhpc2AgdW53cmFwcGVkLCBzbyB0aGUgc2FtZSBtZXRob2RzIHJ1biBpblxuICAgKiB0aGUgYW1iaWVudCBzZXJ2aWNlIGNvbnRleHQgYW5kIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIGFwcFxuICAgKiBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudCAtIHRoZSBzYW1lIFwianVzdCBkb24ndCBlbnRlciBgYXNVc2VyYFwiIHBhdHRlcm5cbiAgICogQXBwS2l0J3Mgb3duIHNlcnZpY2UtY29udGV4dCBjYWxscyB1c2UuIE9uZSBoZWxwZXIgY292ZXJzIGV2ZXJ5IHdvcmtzcGFjZVxuICAgKiBjYWxsIHRoZSBjaGF0IHBhdGggbWFrZXMgKHNlcnZpbmcgY2F0YWxvZ3VlLCBHZW5pZSBzdWdnZXN0aW9ucywgYGFza19nZW5pZWBcbiAgICogdmlhIHRoZSBkaXNwYXRjaGVkIGFnZW50IHR1cm4sIHN0YXRlbWVudCBmZXRjaCwgZmVlZGJhY2spLCBzbyB0aGUgaWRlbnRpdHlcbiAgICogZGVjaXNpb24gbGl2ZXMgaW4gb25lIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzY29wZWRTZWxmKHJlcTogZXhwcmVzcy5SZXF1ZXN0KTogdGhpcyB7XG4gICAgcmV0dXJuIHVzZVNlcnZpY2VQcmluY2lwYWwodGhpcy5pZGVudGl0eU1vZGUsIHJlcSkgPyB0aGlzIDogdGhpcy5hc1VzZXIocmVxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLCBhdXRvLWVuYWJsZSBgc3RvcmFnZWBcbiAgICogYW5kIGBtZW1vcnlgIHVubGVzcyB0aGUgY2FsbGVyIG9wdGVkIG91dCBleHBsaWNpdGx5IChgZmFsc2VgIG9yIGFcbiAgICogY3VzdG9tIGNvbmZpZyBvYmplY3QpLiBSdW4gYWZ0ZXIgYHNldHVwOmNvbXBsZXRlYCBzbyB0aGUgbG9va3VwXG4gICAqIGlzIHJlbGlhYmxlOiBhbnkgcGx1Z2luIHRoYXQgcmVnaXN0ZXJzIGl0c2VsZiBzeW5jaHJvbm91c2x5IGlzXG4gICAqIGFscmVhZHkgaW4gdGhlIHJlZ2lzdHJ5IGJ5IHRoZSB0aW1lIHRoaXMgZmlyZXMuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TGFrZWJhc2VBdXRvRGVmYXVsdHMoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzTGFrZWJhc2UgPSBwbHVnaW4uaW5zdGFuY2UodGhpcy5jb250ZXh0LCBsYWtlYmFzZSkgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAoIWhhc0xha2ViYXNlKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY29uZmlnLnN0b3JhZ2UgPT09IHVuZGVmaW5lZCkgdGhpcy5jb25maWcuc3RvcmFnZSA9IHRydWU7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1lbW9yeSA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbmZpZy5tZW1vcnkgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYWluIHRoZSBtZW1vcnkgc2VydmljZS1wcmluY2lwYWwgcG9vbC4gSWRlbXBvdGVudDogdGhlIGhhbmRsZSBpc1xuICAgKiBjbGVhcmVkIGJlZm9yZSB0aGUgZHJhaW4gc3RhcnRzLCBzbyBhIHNlY29uZCBjYWxsIGlzIGEgbm8tb3AgYW5kIGFcbiAgICogbGF0ZXIgYHNldHVwKClgIHJlYnVpbGRzIHRoZSBwb29sLiBCb3VuZGVkIGJ5XG4gICAqIHtAbGluayBQT09MX0RSQUlOX1RJTUVPVVRfTVN9IHRvIHN0YXkgd2VsbCBpbnNpZGUgdGhlIDE1cyBncmFjZWZ1bFxuICAgKiBzaHV0ZG93biBidWRnZXQuXG4gICAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb29sID0gdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbDtcbiAgICBpZiAoIXBvb2wpIHJldHVybjtcbiAgICB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sID0gbnVsbDtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFwiY2xvc2luZyBtZW1vcnkgU1AgcG9vbFwiKTtcbiAgICAvLyBUaGUgYnVkZ2V0IHRpbWVyIGlzIGNhbmNlbGxlZCBvbiB0aGUgd2F5IG91dCBzbyBhIGRyYWluIHRoYXQgZmluaXNoZWRcbiAgICAvLyBlYXJseSBjYW5ub3QgaG9sZCB0aGUgZXZlbnQgbG9vcCBvcGVuIGZvciB0aGUgcmVzdCBvZiB0aGUgd2luZG93LlxuICAgIGNvbnN0IGJ1ZGdldCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtwb29sLmVuZCgpLCBhc3luYy5zbGVlcChQT09MX0RSQUlOX1RJTUVPVVRfTVMsIGJ1ZGdldC5zaWduYWwpXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcImVycm9yIGNsb3NpbmcgbWVtb3J5IFNQIHBvb2xcIiwge1xuICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYnVkZ2V0LmFib3J0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IGluLWZsaWdodCB3b3JrLiBBcHBLaXQncyBncmFjZWZ1bCBzaHV0ZG93biBjYWxscyB0aGlzIGhvb2tcbiAgICogc3luY2hyb25vdXNseSBhbmQgbmV2ZXIgYXdhaXRzIHtAbGluayBzaHV0ZG93bn0sIHNvIHRoZSBwb29sIGRyYWluIGlzXG4gICAqIHN0YXJ0ZWQgaGVyZSB0b287IGl0IGNhbm5vdCBiZSBhd2FpdGVkIGZyb20gYSBgdm9pZGAgaG9vaywgYW5kXG4gICAqIHtAbGluayBzaHV0ZG93bn0gaXMgaWRlbXBvdGVudCBzbyB0aGUgZHVwbGljYXRlIGNhbGwgaXMgZnJlZS5cbiAgICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgICB2b2lkIHRoaXMuc2h1dGRvd24oKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogSWRzIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiBNYXRjaGVzXG4gICAgICAgKiBBcHBLaXQgYGFnZW50cy5saXN0KClgIHNvIGNhbGxlcnMgY2FuIGl0ZXJhdGUgdGhlIHJlZ2lzdHJ5IHRoZVxuICAgICAgICogc2FtZSB3YXkgdW5kZXIgYm90aCBwbHVnaW5zLlxuICAgICAgICovXG4gICAgICBsaXN0OiAoKTogc3RyaW5nW10gPT4gT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KSxcbiAgICAgIC8qKlxuICAgICAgICogTG9vayB1cCBhIHJlZ2lzdGVyZWQgYWdlbnQgYnkgaWQuIFJldHVybnMgYG51bGxgIChub3RcbiAgICAgICAqIHVuZGVmaW5lZCkgd2hlbiB1bmtub3duIHNvIGNhbGwgc2l0ZXMgY2FuIGVhcmx5LXJldHVybiB3aXRob3V0XG4gICAgICAgKiBhIHNlcGFyYXRlIGBpbmAgY2hlY2suXG4gICAgICAgKi9cbiAgICAgIGdldDogKGlkOiBzdHJpbmcpOiBBZ2VudCB8IG51bGwgPT4gdGhpcy5idWlsdD8uYWdlbnRzW2lkXSA/PyBudWxsLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYWdlbnQgdGhlIGNsaWVudCBjb252ZXJzZXMgd2l0aCB3aGVuIGl0IGRvZXNuJ3QgbmFtZSBvbmUuXG4gICAgICAgKiBSZXNvbHZlcyB0byBgY29uZmlnLmRlZmF1bHRBZ2VudGAsIHRoZSBmaXJzdCByZWdpc3RlcmVkIGlkLCBvclxuICAgICAgICogdGhlIGJ1aWx0LWluIGBkZWZhdWx0YCBmYWxsYmFjay5cbiAgICAgICAqL1xuICAgICAgZ2V0RGVmYXVsdDogKCk6IEFnZW50IHwgbnVsbCA9PlxuICAgICAgICAodGhpcy5idWlsdCAmJiB0aGlzLmJ1aWx0LmFnZW50c1t0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkXSkgPz8gbnVsbCxcbiAgICAgIC8qKiBVbmRlcmx5aW5nIE1hc3RyYSBpbnN0YW5jZSBmb3IgYWR2YW5jZWQgdXNlIChjdXN0b20gcm91dGVzIGV0Yy4pLiAqL1xuICAgICAgZ2V0TWFzdHJhOiAoKSA9PiB0aGlzLm1hc3RyYSxcbiAgICAgIC8qKlxuICAgICAgICogQnVpbGQgdGhlIGBSZXF1ZXN0Q29udGV4dGAgYW4gYWdlbnQgdHVybiBkcml2ZW4gZnJvbSBPVVRTSURFIHRoaXNcbiAgICAgICAqIHBsdWdpbidzIHJvdXRlcyBuZWVkcyAoYSBUZWFtcyBhY3Rpdml0eSBvbiBhbm90aGVyIHBsdWdpbidzIGVuZHBvaW50LCBhXG4gICAgICAgKiBzY2hlZHVsZWQgam9iKS5cbiAgICAgICAqXG4gICAgICAgKiBNYXN0cmEncyB1c2VyLXNjb3BlZCB0b29scyAtIGBhc2tfZ2VuaWVgIG1vc3QgdmlzaWJseSAtIHJlYWQgdGhlIEFwcEtpdFxuICAgICAgICogdXNlciBvZmYgdGhlIHJlcXVlc3QgY29udGV4dCwgd2hpY2ggb25seSB0aGUgSFRUUCBtaWRkbGV3YXJlIHN0YW1wcy5cbiAgICAgICAqIENhbGxpbmcgYGFnZW50LmdlbmVyYXRlYCB3aXRoIGEgcmF3IHByb21wdCB0aGVyZWZvcmUgYW5zd2VycyBcInRoZSBkYXRhXG4gICAgICAgKiBzb3VyY2UgaXMgdW5yZWFjaGFibGVcIiB3aGVyZSB0aGUgY2hhdCByb3V0ZXMgYW5zd2VyIHdpdGggcmVhbCBkYXRhLlxuICAgICAgICogUGFzc2luZyB0aGlzIGFzIGByZXF1ZXN0Q29udGV4dGAgY2xvc2VzIHRoYXQgZ2FwLCBzbyBhbiBvdXQtb2YtYmFuZCB0dXJuXG4gICAgICAgKiBoYXMgZXhhY3RseSB0aGUgY2FwYWJpbGl0aWVzIGEgY2hhdCB0dXJuIGhhcy5cbiAgICAgICAqXG4gICAgICAgKiBNdXN0IGJlIGNhbGxlZCBJTlNJREUgYW4gYGFzVXNlcihyZXEpYCBzY29wZSB0byBpbmhlcml0IHRoZSBjYWxsZXInc1xuICAgICAgICogT0JPIGlkZW50aXR5OyBvdXRzaWRlIG9uZSBpdCByZXNvbHZlcyB0byB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gICAgICAgKi9cbiAgICAgIGNyZWF0ZVJlcXVlc3RDb250ZXh0OiAoXG4gICAgICAgIG9wdGlvbnM6IHsgdGhyZWFkSWQ/OiBzdHJpbmc7IHJlc291cmNlSWQ/OiBzdHJpbmc7IHJlcXVlc3RJZD86IHN0cmluZyB9ID0ge30sXG4gICAgICApOiBQcm9taXNlPFJlcXVlc3RDb250ZXh0PiA9PiBjcmVhdGVSZXF1ZXN0Q29udGV4dChvcHRpb25zKSxcbiAgICAgIC8qKlxuICAgICAgICogTUNQIGVuZHBvaW50IGluZm8gd2hlbiBgY29uZmlnLm1jcGAgaXMgZW5hYmxlZCwgZWxzZSBgbnVsbGAuXG4gICAgICAgKiBTdHJlYW1hYmxlIEhUVFAgaXMgYGh0dHBgOyB0aGUgU1NFIHBhaXIgaXMgdGhlIGxlZ2FjeSB0cmFuc3BvcnQuXG4gICAgICAgKlxuICAgICAgICogRWFjaCBwYXRoIGlzIGdpdmVuIHR3aWNlOiBtb3VudC1yZWxhdGl2ZSAoYGh0dHBQYXRoYCwgYHNzZVBhdGhgLFxuICAgICAgICogYG1lc3NhZ2VQYXRoYCkgZm9yIGFueXRoaW5nIHRoYXQgYWxyZWFkeSBrbm93cyB3aGVyZSB0aGUgcGx1Z2luIGlzXG4gICAgICAgKiBtb3VudGVkLCBhbmQgYWJzb2x1dGUgKGBodHRwYCwgYHNzZWAsIGBtZXNzYWdlc2ApIGZvciBNQ1AgY2xpZW50cyxcbiAgICAgICAqIHdoaWNoIHRha2UgYSBzaW5nbGUgVVJMIGFuZCBjYW5ub3QgY29tcG9zZSBvbmUuIFRoZSBhYnNvbHV0ZSBmb3JtIGlzXG4gICAgICAgKiBidWlsdCBmcm9tIHtAbGluayBiYXNlUGF0aH0sIHNvIGl0IGhvbm9ycyBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUgYnV0XG4gICAgICAgKiBzdGlsbCBhc3N1bWVzIEFwcEtpdCdzIGRlZmF1bHQgYC9hcGkvPG5hbWU+YCBtb3VudC5cbiAgICAgICAqL1xuICAgICAgZ2V0TWNwOiAoKToge1xuICAgICAgICBzZXJ2ZXJJZDogc3RyaW5nO1xuICAgICAgICBodHRwUGF0aDogc3RyaW5nO1xuICAgICAgICBzc2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VQYXRoOiBzdHJpbmc7XG4gICAgICAgIGh0dHA6IHN0cmluZztcbiAgICAgICAgc3NlOiBzdHJpbmc7XG4gICAgICAgIG1lc3NhZ2VzOiBzdHJpbmc7XG4gICAgICB9IHwgbnVsbCA9PlxuICAgICAgICB0aGlzLm1jcFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBzZXJ2ZXJJZDogdGhpcy5tY3Auc2VydmVySWQsXG4gICAgICAgICAgICAgIGh0dHBQYXRoOiB0aGlzLm1jcC5odHRwUGF0aCxcbiAgICAgICAgICAgICAgc3NlUGF0aDogdGhpcy5tY3Auc3NlUGF0aCxcbiAgICAgICAgICAgICAgbWVzc2FnZVBhdGg6IHRoaXMubWNwLm1lc3NhZ2VQYXRoLFxuICAgICAgICAgICAgICBodHRwOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCxcbiAgICAgICAgICAgICAgc3NlOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3Auc3NlUGF0aH1gLFxuICAgICAgICAgICAgICBtZXNzYWdlczogYCR7dGhpcy5iYXNlUGF0aH0ke3RoaXMubWNwLm1lc3NhZ2VQYXRofWAsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBudWxsLFxuICAgICAgLyoqIEV4cHJlc3Mgc3ViYXBwIE1hc3RyYSBpcyBtb3VudGVkIG9uOyBtb3N0bHkgZm9yIHRlc3RzLiAqL1xuICAgICAgZ2V0TWFzdHJhU2VydmVyOiAoKSA9PiB0aGlzLm1hc3RyYVNlcnZlcixcbiAgICAgIC8qKlxuICAgICAgICogRmV0Y2ggdGhlIHdvcmtzcGFjZSdzIE1vZGVsIFNlcnZpbmcgZW5kcG9pbnRzIChjYWNoZWQpLiBTYW1lXG4gICAgICAgKiBwYXlsb2FkIHRoZSBgR0VUIC9tb2RlbHNgIHJvdXRlIHJldHVybnM7IHN1cmZhY2VkIGhlcmUgc29cbiAgICAgICAqIG90aGVyIHBsdWdpbnMgLyBzY3JpcHRzIGNhbiBpbnRyb3NwZWN0IHRoZSBjYXRhbG9ndWUgd2l0aG91dFxuICAgICAgICogYW4gSFRUUCByb3VuZC10cmlwLiBBcHBLaXQgd3JhcHMgdGhpcyB3aXRoIGBhc1VzZXIocmVxKWAgZm9yXG4gICAgICAgKiBPQk8gc2NvcGluZyBhdXRvbWF0aWNhbGx5LiBUaHJvd3Mgd2hlbiB0aGUgbGlzdGluZyBmYWlscywgc2luY2VcbiAgICAgICAqIHRoZXJlIGlzIG5vIHN0YXR1cyBjb2RlIHRvIGhhbmQgYmFjayBvbiB0aGlzIHN1cmZhY2UuXG4gICAgICAgKi9cbiAgICAgIGxpc3RNb2RlbHM6ICgpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4gPT4gdGhpcy5saXN0TW9kZWxzKCksXG4gICAgICAvKipcbiAgICAgICAqIEZvcmNlLWV2aWN0IGNhY2hlZCBlbmRwb2ludCBsaXN0aW5ncyB2aWEgQXBwS2l0J3NcbiAgICAgICAqIGBDYWNoZU1hbmFnZXJgLiBVc2VmdWwgaW4gdGVzdHMgb3IgcmlnaHQgYWZ0ZXIgYW4gYWRtaW5cbiAgICAgICAqIGRlcGxveXMgYSBuZXcgZW5kcG9pbnQgYW5kIGRvZXNuJ3Qgd2FudCB0byB3YWl0IGZvciB0aGUgVFRMLlxuICAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBgQ2FjaGVNYW5hZ2VyLmRlbGV0ZWAvYGNsZWFyYCBwcm9taXNlLlxuICAgICAgICovXG4gICAgICBjbGVhck1vZGVsc0NhY2hlOiAoaG9zdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgICAgbm9kZVNlcnZpbmcuY2xlYXJTZXJ2aW5nRW5kcG9pbnRzQ2FjaGUoaG9zdCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBtb3VudCB0aGlzIHBsdWdpbidzIHJvdXRlcyBhbnN3ZXIgb24uIEFwcEtpdCBtb3VudHMgZXZlcnkgcGx1Z2luXG4gICAqIGF0IGAvYXBpLzxwbHVnaW4ubmFtZT5gIGFuZCBgdGhpcy5uYW1lYCBob25vcnMgYSBgY29uZmlnLm5hbWVgIG92ZXJyaWRlLFxuICAgKiBzbyB0aGUgcGVyLXJvdXRlIHNlZ21lbnRzIChgcm91dGVzLk1BU1RSQV9ST1VURVNgKSBoYW5nIG9mZiB0aGlzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9hcGkvJHt0aGlzLm5hbWV9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgLy8gUHVibGlzaGluZyBgYmFzZVBhdGhgIGlzIGVub3VnaCBmb3IgdGhlIGNsaWVudCB0byBzdGF5IGNvcnJlY3QgdW5kZXIgYVxuICAgIC8vIGN1c3RvbSBtb3VudCBpZDogdGhlIHBlci1yb3V0ZSBzZWdtZW50cyBhcmUgZml4ZWRcbiAgICAvLyAoYHJvdXRlcy5NQVNUUkFfUk9VVEVTYCkgYW5kIHRoZSBjbGllbnQgKGBNYXN0cmFQbHVnaW5DbGllbnRgKSBkZXJpdmVzXG4gICAgLy8gZXZlcnkgZW5kcG9pbnQgZnJvbSBgYmFzZVBhdGhgLlxuICAgIC8vIFJldHVybiB3aWRlbnMgdG8gYFJlY29yZDxzdHJpbmcsIHVua25vd24+YCB0byBzYXRpc2Z5IHRoZVxuICAgIC8vIGJhc2UtY2xhc3Mgc2lnbmF0dXJlOyBjb25zdW1lcnMgcmVhZCBpdCB0aHJvdWdoIHRoZSB0eXBlZFxuICAgIC8vIGBNYXN0cmFDbGllbnRDb25maWdgIHNoYXBlIHZpYSBgdXNlUGx1Z2luQ2xpZW50Q29uZmlnPC4uLj4oLi4uKWAuXG4gICAgY29uc3QgY29uZmlnOiBNYXN0cmFDbGllbnRDb25maWcgPSB7XG4gICAgICBiYXNlUGF0aDogdGhpcy5iYXNlUGF0aCxcbiAgICAgIGRlZmF1bHRBZ2VudDogdGhpcy5idWlsdD8uZGVmYXVsdEFnZW50SWQgPz8gRkFMTEJBQ0tfQUdFTlRfSUQsXG4gICAgICBhZ2VudHM6IE9iamVjdC5rZXlzKHRoaXMuYnVpbHQ/LmFnZW50cyA/PyB7fSksXG4gICAgICBmZWVkYmFja0VuYWJsZWQ6IHRoaXMuZmVlZGJhY2tFbmFibGVkKCksXG4gICAgICAvLyBJbiBgc2VydmljZS1wcmluY2lwYWxgIG1vZGUgdGhlIGNoYXQgd29ya3MgZm9yIGFueSBjYWxsZXIgd2hvIGNhbiBvcGVuXG4gICAgICAvLyB0aGUgYXBwLCBzbyBhIFVJIHRoYXQgaGlkZXMgY2hhdCBiZWhpbmQgYW4gT0JPLXRva2VuIHByb2JlIHNob3VsZCBzaG93XG4gICAgICAvLyBpdCByZWdhcmRsZXNzLiBgXCJ1c2VyXCJgIG1vZGUga2VlcHMgdGhlIE9CTy1nYXRlZCBiZWhhdmlvci5cbiAgICAgIGNoYXRBbHdheXNBdmFpbGFibGU6IHRoaXMuaWRlbnRpdHlNb2RlID09PSBcInNlcnZpY2UtcHJpbmNpcGFsXCIsXG4gICAgfTtcbiAgICByZXR1cm4gY29uZmlnIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB1c2VyIGZlZWRiYWNrIGNhbiBiZSBsb2dnZWQgdG8gTUxmbG93LiBEZWxlZ2F0ZXMgdG9cbiAgICoge0BsaW5rIHJlc29sdmVGZWVkYmFja0VuYWJsZWR9IHNvIHRoZSBjbGllbnQtY29uZmlnIGZsYWcgYW5kIHRoZVxuICAgKiBmZWVkYmFjayByb3V0ZSBzaGFyZSB0aGUgc2FtZSBnYXRlIGFzIHRoZSBzZXJ2ZXIncyB0cmFjZS1pZCBoZWFkZXIuXG4gICAqL1xuICBwcml2YXRlIGZlZWRiYWNrRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZCh0aGlzLmNvbmZpZy5mZWVkYmFjayk7XG4gIH1cblxuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgLy8gRXhwb3NlIHRoZSBNQ1AgdHJhbnNwb3J0IGF0IHRoZSBjbGVhbiBgL21jcGAgKHBsdXMgdGhlIGxlZ2FjeVxuICAgIC8vIGAvc3NlYCArIGAvbWVzc2FnZXNgKSB1bmRlciB0aGUgcGx1Z2luIG1vdW50LiBgQG1hc3RyYS9leHByZXNzYFxuICAgIC8vIG1vdW50cyBNQ1AgdW5kZXIgYC9tY3AvPHNlcnZlcklkPi88dHJhbnNwb3J0PmAsIGFuZCB0aGUgc2VydmVySWRcbiAgICAvLyBkZWZhdWx0cyB0byB0aGUgcGx1Z2luIG5hbWUsIHNvIHRoZSByYXcgcm91dGUgcmVhZHNcbiAgICAvLyBgL2FwaS9tYXN0cmEvbWNwL21hc3RyYS9tY3BgIChkb3VibGVkIHNlZ21lbnQpLiBUaGlzIHJ1bnMgYmVmb3JlXG4gICAgLy8gdGhlIGNhdGNoLWFsbCBhbmQgcmV3cml0ZXMgdGhlIGFsaWFzIHRvIHRoZSB1bmRlcmx5aW5nIHJvdXRlLCBzb1xuICAgIC8vIHRoZSBwdWJsaWMgcGF0aCBpcyBqdXN0IGAvYXBpLzxwbHVnaW4+L21jcGA7IHRoZSBxdWVyeSBzdHJpbmdcbiAgICAvLyAoZS5nLiB0aGUgU1NFIGBzZXNzaW9uSWRgKSBpcyBwcmVzZXJ2ZWQuXG4gICAgLy9cbiAgICAvLyBNaWRkbGV3YXJlIHJhdGhlciB0aGFuIGB0aGlzLnJvdXRlYDogaXQgcmV3cml0ZXMgdGhlIFVSTCBmb3Igcm91dGVzXG4gICAgLy8gYEBtYXN0cmEvZXhwcmVzc2Agb3ducyBmdXJ0aGVyIGRvd24gdGhlIGNoYWluIGluc3RlYWQgb2YgYW5zd2VyaW5nIHRoZVxuICAgIC8vIHJlcXVlc3QsIHdoaWNoIGBSb3V0ZUNvbmZpZ2AgaGFzIG5vIHNoYXBlIGZvci5cbiAgICByb3V0ZXIudXNlKChyZXEsIF9yZXMsIG5leHQpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMubWNwUm91dGVBbGlhcyhyZXEucGF0aCk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHEgPSByZXEudXJsLmluZGV4T2YoXCI/XCIpO1xuICAgICAgICByZXEudXJsID0gcSA+PSAwID8gdGFyZ2V0ICsgcmVxLnVybC5zbGljZShxKSA6IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcblxuICAgIC8vIGBHRVQgL21vZGVsc2AgZXhwb3NlcyB0aGUgY2FjaGVkIGVuZHBvaW50IGxpc3Qgc28gY2xpZW50cyBjYW5cbiAgICAvLyBwb3B1bGF0ZSBtb2RlbCBwaWNrZXJzLCB2YWxpZGF0ZSBgP21vZGVsPWAgY2hvaWNlcywgZXRjLiBNdXN0XG4gICAgLy8gYmUgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNhdGNoLWFsbCB0aGF0IGZvcndhcmRzIGV2ZXJ5dGhpbmcgdG9cbiAgICAvLyB0aGUgTWFzdHJhIHN1YmFwcC5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJtb2RlbHNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLm1vZGVscyxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgXCJtb2RlbHNcIiwgTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzLmpzb24oeyBlbmRwb2ludHM6IHJlc3VsdC5kYXRhIH0pO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIGBHRVQgL2RlZmF1bHQtbW9kZWxgIChhbmQgYC9kZWZhdWx0LW1vZGVsLzphZ2VudElkYCkgcmVwb3J0cyB0aGUgc3RhdGljXG4gICAgLy8gc2VydmluZy1lbmRwb2ludCBhbiBhZ2VudCBmYWxscyBiYWNrIHRvIHdoZW4gdGhlIGNsaWVudCBwaW5zIG5vIG1vZGVsLFxuICAgIC8vIHNvIHRoZSBwaWNrZXIgY2FuIGxhYmVsIGl0cyBkZWZhdWx0IG9wdGlvbiB3aXRoIHRoZSBtb2RlbCdzIGh1bWFuaXplZFxuICAgIC8vIG5hbWUuIEFnZW50LXNjb3BlZCB2aWEgdGhlIG9wdGlvbmFsIGAvOmFnZW50SWRgIHN1ZmZpeCAoVVJMIHN5bW1ldHJ5XG4gICAgLy8gd2l0aCB0aGUgaGlzdG9yeSAvIHRocmVhZHMgLyBzdWdnZXN0aW9ucyByb3V0ZXMpLCBkZWZhdWx0aW5nIHRvIHRoZVxuICAgIC8vIGRlZmF1bHQgYWdlbnQuIGBtb2RlbGAgLyBgZGlzcGxheU5hbWVgIGFyZSBudWxsIHdoZW4gdGhlIGFnZW50IGhhcyBub1xuICAgIC8vIHN0YXRpYyBkZWZhdWx0IChhIGR5bmFtaWMsIGNhbGwtdGltZSBtb2RlbCk7IGFuIHVua25vd24gYWdlbnQgaWQgaXMgYVxuICAgIC8vIDQwNCwgbWF0Y2hpbmcgdGhlIGhpc3RvcnkgLyB0aHJlYWRzIHJvdXRlcy4gUmVhZHMgb25seSBpbi1tZW1vcnkgYnVpbGRcbiAgICAvLyBzdGF0ZSwgc28gaXQgbmVlZHMgbm8gT0JPIHNjb3BpbmcuIFJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBjYXRjaC1hbGwsXG4gICAgLy8gc2FtZSBhcyBgL21vZGVsc2AuXG4gICAgY29uc3QgaGFuZGxlRGVmYXVsdE1vZGVsID0gYXN5bmMgKFxuICAgICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWQgPSBzdHJpbmcuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmFnZW50SWQpO1xuICAgICAgaWYgKHJlcXVlc3RlZCAhPT0gbnVsbCAmJiAhdGhpcy5idWlsdD8uYWdlbnRzW3JlcXVlc3RlZF0pIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogdGhpcy51bmtub3duQWdlbnRNZXNzYWdlKHJlcXVlc3RlZCkgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFnZW50SWQgPSByZXF1ZXN0ZWQgPz8gdGhpcy5idWlsdD8uZGVmYXVsdEFnZW50SWQgPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG4gICAgICBjb25zdCByYXcgPSB0aGlzLmJ1aWx0Py5kZWZhdWx0TW9kZWxzW2FnZW50SWRdO1xuICAgICAgLy8gYFwiPGR5bmFtaWM+XCJgIChhIGNhbGwtdGltZSBmdW5jdGlvbikgaGFzIG5vIGZpeGVkIGlkIHRvIGFkdmVydGlzZS5cbiAgICAgIGNvbnN0IG1vZGVsID0gcmF3ICYmIHJhdyAhPT0gXCI8ZHluYW1pYz5cIiA/IHJhdyA6IG51bGw7XG4gICAgICAvLyBSZXR1cm4gdGhlIGh1bWFuaXplZCBsYWJlbCB0b28sIHNvIHRoZSBwaWNrZXIgc2hvd3MgYSBmcmllbmRseSBuYW1lIG9uXG4gICAgICAvLyBsb2FkIHdpdGhvdXQgd2FpdGluZyBvbiB0aGUgYC9tb2RlbHNgIGNhdGFsb2d1ZSAobm8gcmF3LWlkIGZsYXNoKS5cbiAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBtb2RlbCA/IGRpc3BsYXkudG9Nb2RlbERpc3BsYXlOYW1lKG1vZGVsKSA6IG51bGwsXG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRlZmF1bHRNb2RlbFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuZGVmYXVsdE1vZGVsLFxuICAgICAgaGFuZGxlcjogaGFuZGxlRGVmYXVsdE1vZGVsLFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRlZmF1bHRNb2RlbEJ5QWdlbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLmRlZmF1bHRNb2RlbH0vOmFnZW50SWRgLFxuICAgICAgaGFuZGxlcjogaGFuZGxlRGVmYXVsdE1vZGVsLFxuICAgIH0pO1xuXG4gICAgLy8gYEdFVCAvZW1iZWQvOnR5cGUvOmlkYCBpcyB0aGUgc2luZ2xlIHJlc29sdmVyIGZvciBldmVyeSBlbWJlZFxuICAgIC8vIG1hcmtlciB0aGUgYWdlbnQgZW1pdHMgaW4gcHJvc2UgKGBbY2hhcnQ6PGlkPl1gLFxuICAgIC8vIGBbZGF0YTo8aWQ+XWAsIC4uLikuIGA6dHlwZWAgc2VsZWN0cyBhIHJlc29sdmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0cnkgYmVsb3c7IGA6aWRgIGlzIHRoYXQgcmVzb2x2ZXIncyBsb29rdXAga2V5LiBUaGVcbiAgICAvLyBncmFtbWFyIChzZWUgYG1hcmtlci50c2ApIGlzIHR5cGUtYWdub3N0aWMgb24gcHVycG9zZSAtIG5ld1xuICAgIC8vIGVtYmVkIGtpbmRzIGFyZSBhZGRlZCBieSByZWdpc3RlcmluZyBhIHJlc29sdmVyIGhlcmUsIHdpdGggbm9cbiAgICAvLyBjbGllbnQgb3IgZ3JhbW1hciBjaGFuZ2UuXG4gICAgLy9cbiAgICAvLyBTdGF0dXMgY29kZXM6XG4gICAgLy8gICAtIDIwMCB3aXRoIHRoZSByZXNvbHZlcidzIEpTT04gYm9keSB3aGVuIHRoZSBpZCByZXNvbHZlcy5cbiAgICAvLyAgIC0gNDA0IHdoZW4gYDp0eXBlYCBpc24ndCByZWdpc3RlcmVkICh1bnN1cHBvcnRlZCBlbWJlZFxuICAgIC8vICAgICB0eXBlKSBPUiBhIHJlZ2lzdGVyZWQgcmVzb2x2ZXIgY2FuJ3QgZmluZCBgOmlkYCAodW5rbm93blxuICAgIC8vICAgICAvIGV4cGlyZWQgLSBlLmcuIGEgY2hhcnQgcGFzdCBpdHMgMWggVFRMIG9yIGEgZmFicmljYXRlZFxuICAgIC8vICAgICBpZCB0aGUgbW9kZWwgbmV2ZXIgbWludGVkKS5cbiAgICAvLyAgIC0gNDAwIHdoZW4gYDppZGAgaXMgZW1wdHkuXG4gICAgLy9cbiAgICAvLyBQZXItdHlwZSBxdWVyeSBrbm9icyBhbmQgYmVoYXZpb3I6XG4gICAgLy8gICAtIGBjaGFydGA6IGxvbmctcG9sbHMgdGhlIGNoYXJ0IGNhY2hlIHVudGlsIHRoZSBlbnRyeVxuICAgIC8vICAgICBzZXR0bGVzIChgcmVzdWx0YCAvIGBlcnJvcmApIG9yIHRoZSBidWRnZXQgZWxhcHNlcyAodGhlblxuICAgIC8vICAgICByZXR1cm5zIHRoZSBzdGlsbC1wcm9jZXNzaW5nIGVudHJ5IHRvIHBvbGwgYWdhaW4pLlxuICAgIC8vICAgICBgP3RpbWVvdXRNcz08bj5gIChkZWZhdWx0IDYwcywgY2FwcGVkIDVtaW4pIHR1bmVzIGl0LlxuICAgIC8vICAgLSBgZGF0YWA6IG9uZSBPQk8tc2NvcGVkIFN0YXRlbWVudCBFeGVjdXRpb24gZmV0Y2guXG4gICAgLy8gICAgIGA/bGltaXQ9PG4+YCBjYXBzIHJvd3MgKGNsYW1wZWQgdG8gU1RBVEVNRU5UX1JPV19DQVApLlxuICAgIC8vXG4gICAgLy8gQnVpbHQgb25jZSAodGhpcyBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgb25jZSkgYW5kIGtleWVkIGJ5IHRoZVxuICAgIC8vIHJhdyBgOnR5cGVgIHRva2VuLiBFYWNoIHJlc29sdmVyIGdldHMgdGhlIHJlcXVlc3QgKGZvciBxdWVyeVxuICAgIC8vIHBhcnNpbmcgKyBPQk8gc2NvcGluZykgYW5kIGFuIGBBYm9ydFNpZ25hbGAgYnJpZGdlZCBvZmYgdGhlXG4gICAgLy8gY29ubmVjdGlvbiBgY2xvc2VgIGV2ZW50IHNvIGEgbG9uZy1wb2xsIHVuYmxvY2tzIHRoZSBpbnN0YW50XG4gICAgLy8gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4gYHVuZGVmaW5lZGAgZnJvbSBhIHJlc29sdmVyIG1hcHMgdG8gYVxuICAgIC8vIGNsZWFuIDQwNDsgdGhyb3duIGVycm9ycyBidWJibGUgdGhyb3VnaCBgbmV4dChlcnIpYC5cbiAgICBjb25zdCBlbWJlZFJlc29sdmVyczogUmVjb3JkPHN0cmluZywgRW1iZWRSZXNvbHZlcj4gPSB7XG4gICAgICBjaGFydDogKHJlcSwgaWQsIHNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSBwYXJzZVRpbWVvdXRNcyhyZXEucXVlcnkudGltZW91dE1zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoQ2hhcnRFbnRyeShyZXEsIGlkLCB7XG4gICAgICAgICAgLi4uKHRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGRhdGE6IChyZXEsIGlkLCBzaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBwYXJzZVN0YXRlbWVudExpbWl0KHJlcS5xdWVyeS5saW1pdCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaFN0YXRlbWVudChpZCwge1xuICAgICAgICAgIC4uLihsaW1pdCAhPT0gdW5kZWZpbmVkID8geyBsaW1pdCB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJlbWJlZFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuZW1iZWR9Lzp0eXBlLzppZGAsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHN0cmluZy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMudHlwZSkgPz8gXCJcIjtcbiAgICAgICAgY29uc3QgaWQgPSBzdHJpbmcuZmlyc3ROb25FbXB0eShyZXEucGFyYW1zLmlkKTtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IGVtYmVkUmVzb2x2ZXJzW3R5cGVdO1xuICAgICAgICBpZiAoIXJlc29sdmUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZW1iZWQ6dW5zdXBwb3J0ZWRcIiwge1xuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgdW5zdXBwb3J0ZWQgZW1iZWQgdHlwZTogJHt0eXBlfWAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZW1iZWQ6aW52YWxpZFwiLCB7XG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBcImlkIGlzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogXCJpZCBpcyByZXF1aXJlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHByZXNzJ3MgYHJlcWAgcHJlZGF0ZXMgYEFib3J0U2lnbmFsYDsgYnJpZGdlIHRoZSBgY2xvc2VgXG4gICAgICAgIC8vIGV2ZW50IG9udG8gYW4gYEFib3J0Q29udHJvbGxlcmAgc28gYSBjbG9zZWQgY29ubmVjdGlvblxuICAgICAgICAvLyB1bmJsb2NrcyBhbnkgbG9uZy1wb2xsIGltbWVkaWF0ZWx5IGFuZCBmcmVlcyB0aGUgcmVxdWVzdFxuICAgICAgICAvLyB0aHJlYWQuIFRoZSBsaXN0ZW5lciBpcyBHQydkIHdpdGggdGhlIHJlcXVlc3Qgb24gbm9ybWFsXG4gICAgICAgIC8vIGNvbXBsZXRpb24uXG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIHJlcS5vbihcImNsb3NlXCIsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc29sdmUocmVxLCBpZCwgY29udHJvbGxlci5zaWduYWwpO1xuICAgICAgICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIGBlbWJlZDoke3R5cGV9YCwgYENvdWxkIG5vdCByZXNvbHZlIHRoZSAke3R5cGV9IGVtYmVkYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gQSBjYWNoZSBtaXNzIGlzIHNlY3VyaXR5LWRlbGliZXJhdGVseSBhbWJpZ3VvdXM6IHVua25vd24sIGV4cGlyZWQsXG4gICAgICAgICAgLy8gb3Igb3duZWQgYnkgYW5vdGhlciBpZGVudGl0eSBhbGwgbWFwIHRvIHRoZSBzYW1lIDQwNC4gTG9nIHRoZVxuICAgICAgICAgIC8vIG9wYXF1ZSBpZCBhbmQgdGhvc2UgcG9zc2libGUgY2F1c2VzIHNvIGEgZmFicmljYXRlZCBtYXJrZXIgaXNcbiAgICAgICAgICAvLyBkaWFnbm9zYWJsZSBmcm9tIHRoZSBzZXJ2ZXIgd2l0aG91dCBkaXNjbG9zaW5nIHdoaWNoIGNhdXNlIGFwcGxpZWQuXG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgZW1iZWQ6JHt0eXBlfTpub3QtZm91bmRgLCB7XG4gICAgICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICAgICAgcmVhc29uOiBcInVua25vd24sIGV4cGlyZWQsIG9yIG93bmVkIGJ5IGFub3RoZXIgaWRlbnRpdHlcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgJHt0eXBlfSBub3QgZm91bmRgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuanNvbihyZXN1bHQuZGF0YSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gYEdFVCAvc3VnZ2VzdGlvbnNgIChhbmQgYC9zdWdnZXN0aW9ucy86YWdlbnRJZGApIHJldHVybnMgdGhlXG4gICAgLy8gY3VyYXRlZCBzdGFydGVyIHF1ZXN0aW9ucyBmb3IgdGhlIGFnZW50J3MgR2VuaWUgc3BhY2UocykgLSB0aGVcbiAgICAvLyBhdXRob3ItY29uZmlndXJlZCBgc2FtcGxlX3F1ZXN0aW9uc2AsIHN1cmZhY2VkIGFzIG9uZS10YXBcbiAgICAvLyBwcm9tcHRzIG9uIHRoZSBjaGF0IGVtcHR5IHN0YXRlLiBSZXR1cm5zIGB7IHF1ZXN0aW9uczogW10gfWBcbiAgICAvLyB3aGVuIG5vIEdlbmllIHNwYWNlIGlzIHdpcmVkIHNvIHRoZSBjbGllbnQgcmVuZGVycyBhIGJhcmVcbiAgICAvLyBlbXB0eSBzdGF0ZSAobm8gYnVpbHQtaW4gZXhhbXBsZSBwcm9tcHRzKS4gVGhlIGA6YWdlbnRJZGBcbiAgICAvLyBzZWdtZW50IGlzIGFjY2VwdGVkIGZvciBVUkwgc3ltbWV0cnkgd2l0aCB0aGUgY2hhdCAvIGhpc3RvcnlcbiAgICAvLyByb3V0ZXM7IEdlbmllIHNwYWNlcyBhcmUgcmVzb2x2ZWQgcGVyLXBsdWdpbiwgbm90IHBlci1hZ2VudCxcbiAgICAvLyBzbyBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgcmVzdWx0LiBPQk8tc2NvcGVkIGxpa2UgdGhlIG90aGVyXG4gICAgLy8gZGF0YSByb3V0ZXMgc28gdGhlIHNwYWNlIGxvb2t1cCBydW5zIGFzIHRoZSBjYWxsaW5nIHVzZXIuXG4gICAgY29uc3QgaGFuZGxlU3VnZ2VzdGlvbnMgPSBhc3luYyAoXG4gICAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICByZXEub24oXCJjbG9zZVwiLCAoKSA9PiBjb250cm9sbGVyLmFib3J0KCkpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hTdWdnZXN0aW9ucyhjb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgLy8gU3VnZ2VzdGlvbnMgYXJlIGEgbm9uLWNyaXRpY2FsIGVuaGFuY2VtZW50OyBhIGxvb2t1cCBmYWlsdXJlIHNob3VsZFxuICAgICAgICAvLyBsZWF2ZSB0aGUgY2hhdCB1c2FibGUgd2l0aCBhIGJhcmUgZW1wdHkgc3RhdGUgcmF0aGVyIHRoYW4gc3VyZmFjaW5nXG4gICAgICAgIC8vIHRoZSB1cHN0cmVhbSBzdGF0dXMuIExvZyBhbmQgZGVncmFkZS5cbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcInN1Z2dlc3Rpb25zOmVycm9yXCIsIHtcbiAgICAgICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICAgICAgZXJyb3I6IHJlc3VsdC5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLmpzb24oeyBxdWVzdGlvbnM6IFtdIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXMuanNvbih7IHF1ZXN0aW9uczogcmVzdWx0LmRhdGEgfSk7XG4gICAgfTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzdWdnZXN0aW9uc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuc3VnZ2VzdGlvbnMsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVTdWdnZXN0aW9ucyxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzdWdnZXN0aW9uc0J5QWdlbnRcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLnN1Z2dlc3Rpb25zfS86YWdlbnRJZGAsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVTdWdnZXN0aW9ucyxcbiAgICB9KTtcblxuICAgIC8vIGBQT1NUIC9yb3V0ZS9mZWVkYmFja2AgbG9ncyBhIHRodW1icyAvIGNvbW1lbnQgYXNzZXNzbWVudCBhZ2FpbnN0XG4gICAgLy8gYSB0dXJuJ3MgTUxmbG93IHRyYWNlICh0aGUgYHRyYWNlSWRgIHRoZSBjbGllbnQgY2FwdHVyZWQgZnJvbSB0aGVcbiAgICAvLyBzdHJlYW0gcmVzcG9uc2UncyB0cmFjZS1pZCBoZWFkZXIpLiBSZWdpc3RlcmVkIG9uIHRoZSBBcHBLaXRcbiAgICAvLyByb3V0ZXIgKGxpa2UgYC9tb2RlbHNgKSByYXRoZXIgdGhhbiB0aGUgTWFzdHJhIHN1YmFwcCBzbyBpdCBydW5zXG4gICAgLy8gdW5kZXIgdGhlIHNhbWUgT0JPIHNjb3BlIC0gdGhlIGZlZWRiYWNrIGlzIGF0dHJpYnV0ZWQgdG8gdGhlXG4gICAgLy8gc2lnbmVkLWluIHVzZXIuIFJldHVybnMgNDA0IHdoZW4gZmVlZGJhY2sgaXMgZGlzYWJsZWQgc28gdGhlXG4gICAgLy8gY2xpZW50IHRyZWF0cyB0aGUgY2FwYWJpbGl0eSBhcyBhYnNlbnQ7IDQwMCBvbiBhIG1hbGZvcm1lZCBib2R5LlxuICAgIC8vIEEgcmVjb3JkZWQgYXNzZXNzbWVudCB5aWVsZHMgYHsgb2s6IHRydWUgfWA7IGEgc29mdCBmYWlsdXJlIChtb3N0XG4gICAgLy8gb2Z0ZW4gdGhlIHRyYWNlIGhhc24ndCBmaW5pc2hlZCBleHBvcnRpbmcgdG8gTUxmbG93IHlldCkgeWllbGRzXG4gICAgLy8gYHsgb2s6IGZhbHNlIH1gIHdpdGhvdXQgYSA1eHggc28gdGhlIFVJIGNhbiBwcm9tcHQgYSByZXRyeS5cbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJmZWVkYmFja1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLmZlZWRiYWNrLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mZWVkYmFja0VuYWJsZWQoKSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgb2s6IGZhbHNlIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWQgPSBmZWVkYmFjay5NYXN0cmFGZWVkYmFja1JlcXVlc3RTY2hlbWEuc2FmZVBhcnNlKHJlcS5ib2R5KTtcbiAgICAgICAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgICAgICAgIC8vIEEgWm9kIGlzc3VlIHN0cmluZyBxdW90ZXMgdGhlIHJlY2VpdmVkIGJvZHkgYmFjaywgc28gb25seSB0aGVcbiAgICAgICAgICAvLyBvZmZlbmRpbmcgZmllbGQgbmFtZXMgdHJhdmVsOyB0aGUgZnVsbCBpc3N1ZSBsaXN0IGlzIGxvZ2dlZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiZmVlZGJhY2s6aW52YWxpZFwiLCB7IGVycm9yOiBwYXJzZWQuZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogSU5WQUxJRF9GRUVEQkFDS19NRVNTQUdFLFxuICAgICAgICAgICAgZmllbGRzOiBpbnZhbGlkRmllbGRzKHBhcnNlZC5lcnJvciksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxvZ0ZlZWRiYWNrKHBhcnNlZC5kYXRhKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcImZlZWRiYWNrXCIsIFwiRmVlZGJhY2sgY291bGQgbm90IGJlIHJlY29yZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc3Nlc3NtZW50SWQgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgcmVzLmpzb24oe1xuICAgICAgICAgIG9rOiBhc3Nlc3NtZW50SWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAuLi4oYXNzZXNzbWVudElkID8geyBhc3Nlc3NtZW50SWQgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gTWlkZGxld2FyZSByYXRoZXIgdGhhbiBgdGhpcy5yb3V0ZWA6IHRoaXMgaXMgdGhlIGNhdGNoLWFsbCB0aGF0IGhhbmRzXG4gICAgLy8gZXZlcnkgcmVtYWluaW5nIG1ldGhvZCAvIHBhdGggcGFpciB0byB0aGUgTWFzdHJhIHN1Yi1hcHAsIHNvIGl0IGhhcyBub1xuICAgIC8vIHNpbmdsZSBtZXRob2Qgb3IgcGF0aCB0byByZWdpc3RlciB1bmRlci5cbiAgICByb3V0ZXIudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1hc3RyYUFwcCkgcmV0dXJuIHJlcy5zdGF0dXMoNTAzKS5lbmQoKTtcbiAgICAgIC8vIEdhdGUgdGhlIHN0b2NrIE1hc3RyYSBzdXJmYWNlIGJlZm9yZSBkaXNwYXRjaC4gSW4gdGhlIGRlZmF1bHRcbiAgICAgIC8vIFwic2NvcGVkXCIgbW9kZSBvbmx5IGFnZW50IGluZmVyZW5jZSwgcmVhZC1vbmx5IGFnZW50IG1ldGFkYXRhLCB0aGlzXG4gICAgICAvLyBwbHVnaW4ncyBvd24gYC9yb3V0ZS8qYCByb3V0ZXMsIGFuZCAod2hlbiBlbmFibGVkKSBNQ1AgcmVhY2ggTWFzdHJhO1xuICAgICAgLy8gYWRtaW4gLyBtdXRhdGluZyAvIGJ1bGstZXhwb3J0IHJvdXRlcyBhcmUgcmVmdXNlZCBoZXJlLiBgcmVxLnBhdGhgXG4gICAgICAvLyBpcyBtb3VudC1yZWxhdGl2ZSB1bmRlciB0aGUgcGx1Z2luIG1vdW50LiBTZWUgYHNlcnZlci50c2AuXG4gICAgICBpZiAoXG4gICAgICAgICFpc01hc3RyYVJlcXVlc3RBbGxvd2VkKHJlcS5tZXRob2QsIHJlcS5wYXRoLCB7XG4gICAgICAgICAgYWNjZXNzOiB0aGlzLmNvbmZpZy5hcGlBY2Nlc3MgPz8gXCJzY29wZWRcIixcbiAgICAgICAgICAvLyBSZWZsZWN0IHRoZSAqcmVzb2x2ZWQqIE1DUCBzdGF0ZSwgbm90IHJhdyBgY29uZmlnLm1jcGA6IE1DUCBpc1xuICAgICAgICAgIC8vIG9uIGJ5IGRlZmF1bHQgKGBjb25maWcubWNwYCB1bmRlZmluZWQpLCBzbyBnYXRlIG9uIHdoZXRoZXIgdGhlXG4gICAgICAgICAgLy8gc2VydmVyIHdhcyBhY3R1YWxseSBidWlsdCBhbmQgbW91bnRlZC5cbiAgICAgICAgICBtY3BFbmFibGVkOiB0aGlzLm1jcCAhPT0gbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcIkVuZHBvaW50IG5vdCBleHBvc2VkIHRvIHRoZSBjbGllbnQgKGFwaUFjY2Vzcz1zY29wZWQpXCIgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIERpc3BhdGNoIHRocm91Z2ggYSByZWFsIG1ldGhvZCwgTk9UIHRoZSBgbWFzdHJhQXBwYCBwcm9wZXJ0eS4gVGhlXG4gICAgICAvLyBBcHBLaXQgYGFzVXNlcihyZXEpYCBwcm94eSB3cmFwcyBmdW5jdGlvbi12YWx1ZWQgcHJvcHMgd2l0aFxuICAgICAgLy8gYHZhbHVlLmJpbmQodGFyZ2V0KWAuIGBtYXN0cmFBcHBgIGlzIGFuIGV4cHJlc3MgYXBwIHdob3NlIGAuYmluZGAgaXNcbiAgICAgIC8vIHRoZSBIVFRQIEJJTkQgcm91dGUgcmVnaXN0cmFyIChleHByZXNzIGRlZmluZXMgYSBtZXRob2QgcGVyIEhUVFAgdmVyYixcbiAgICAgIC8vIGFuZCBCSU5EIGlzIG9uZSksIG5vdCBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgIC0gc28gYmluZGluZyBpdCB0aHJvdWdoXG4gICAgICAvLyB0aGUgcHJveHkgcmVnaXN0ZXJzIGEgYm9ndXMgcm91dGUgYW5kIGNyYXNoZXMgYHBhdGhUb1JlZ2V4cGBcbiAgICAgIC8vIChcInBhdGggbXVzdCBiZSBhIHN0cmluZyAuLi5cIikuIFRoaXMgb25seSBtYW5pZmVzdHMgaW4gcHJvZHVjdGlvbiB3aGVyZVxuICAgICAgLy8gYW4gT0JPIHRva2VuIG1ha2VzIGBzY29wZWRTZWxmYCByZXR1cm4gdGhlIHByb3h5LiBgZGlzcGF0Y2hNYXN0cmFgXG4gICAgICAvLyBpcyBhIHBsYWluIG1ldGhvZCAoaXRzIGAuYmluZGAgaXMgdGhlIG5vcm1hbCBvbmUpIGFuZCBpbnZva2VzXG4gICAgICAvLyBgdGhpcy5tYXN0cmFBcHBgIG9mZiB0aGUgcmVhbCB0YXJnZXQsIGtlZXBpbmcgdGhlIE9CTyBzY29wZSBhY3RpdmUuXG4gICAgICByZXR1cm4gdGhpcy5zY29wZWRTZWxmKHJlcSkuZGlzcGF0Y2hNYXN0cmEocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBhIGZhaWxlZCB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBvbnRvIHRoZSByZXNwb25zZTogdGhlIHN0YXR1cyB0aGVcbiAgICogZXhlY3V0aW9uIHBpcGVsaW5lIHJlc29sdmVkLCBwYWlyZWQgd2l0aCBgY2xpZW50TWVzc2FnZWAgcmF0aGVyIHRoYW4gdGhlXG4gICAqIHJlc3VsdCdzIG93biB0ZXh0LCB3aGljaCBjYW4gY2FycnkgdXBzdHJlYW0gZGV0YWlsLiBUaGUgZnVsbCBtZXNzYWdlIGlzXG4gICAqIGxvZ2dlZCB1bmRlciBgPG9wZXJhdGlvbj46ZXJyb3JgLlxuICAgKi9cbiAgcHJpdmF0ZSBzZW5kRmFpbHVyZShcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgcmVzdWx0OiB7IHN0YXR1czogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfSxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBjbGllbnRNZXNzYWdlOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLndhcm4oYCR7b3BlcmF0aW9ufTplcnJvcmAsIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICB9KTtcbiAgICBpZiAocmVzLmhlYWRlcnNTZW50KSByZXR1cm47XG4gICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzKS5qc29uKHsgZXJyb3I6IGNsaWVudE1lc3NhZ2UgfSk7XG4gIH1cblxuICAvKiogNDA0IGJvZHkgZm9yIGEgcmVxdWVzdCBuYW1pbmcgYW4gYWdlbnQgdGhhdCBpc24ndCByZWdpc3RlcmVkLiAqL1xuICBwcml2YXRlIHVua25vd25BZ2VudE1lc3NhZ2UoYWdlbnRJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWdpc3RlcmVkID0gT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KTtcbiAgICByZXR1cm4gYFVua25vd24gYWdlbnQgXCIke2FnZW50SWR9XCIuIFJlZ2lzdGVyZWQgYWdlbnRzOiAke3JlZ2lzdGVyZWQuam9pbihcIiwgXCIpIHx8IFwibm9uZVwifWA7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIHRoZSBNYXN0cmEgZXhwcmVzcyBzdWItYXBwLiBFeGlzdHMgYXMgYSBtZXRob2QgKGluc3RlYWQgb2YgcmVhZGluZ1xuICAgKiBgdGhpcy5tYXN0cmFBcHBgIHRocm91Z2ggdGhlIGBhc1VzZXIocmVxKWAgcHJveHkgYXQgdGhlIGNhbGwgc2l0ZSkgc28gdGhlXG4gICAqIHByb3h5IGJpbmRzIHRoaXMgcGxhaW4gbWV0aG9kIC0gd2hvc2UgYC5iaW5kYCBpcyBgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRgXG4gICAqIC0gcmF0aGVyIHRoYW4gdGhlIGV4cHJlc3MgYXBwLCB3aG9zZSBgLmJpbmRgIGlzIHRoZSBIVFRQIEJJTkQgcm91dGVcbiAgICogcmVnaXN0cmFyIChzZWUgdGhlIG5vdGUgaW4gYGluamVjdFJvdXRlc2ApLiBSdW5zIGluc2lkZSB0aGUgdXNlciBzY29wZSBzb1xuICAgKiBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZSBPQk8gY2xpZW50IGZvciB0aGUgYWdlbnQvbW9kZWxcbiAgICogcmVzb2x2ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaE1hc3RyYShcbiAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICByZXM6IGV4cHJlc3MuUmVzcG9uc2UsXG4gICAgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb24sXG4gICk6IHZvaWQge1xuICAgIHRoaXMubWFzdHJhQXBwIShyZXEsIHJlcywgbmV4dCk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGEgY2xlYW4sIG1vdW50LXJlbGF0aXZlIE1DUCBhbGlhcyBwYXRoIHRvIHRoZSB1bmRlcmx5aW5nXG4gICAqIGBAbWFzdHJhL2V4cHJlc3NgIHJvdXRlLiBSZXR1cm5zIGBudWxsYCB3aGVuIE1DUCBpcyBvZmYgb3IgdGhlIHBhdGhcbiAgICogaXNuJ3QgYW4gYWxpYXMuIENvbGxhcHNlcyB0aGUgc3RvY2sgYC9tY3AvPHNlcnZlcklkPi88dHJhbnNwb3J0PmBcbiAgICogbGF5b3V0IChzZXJ2ZXJJZCBkZWZhdWx0cyB0byB0aGUgcGx1Z2luIG5hbWUpIGRvd24gdG8gYC9tY3BgLFxuICAgKiBgL3NzZWAsIGFuZCBgL21lc3NhZ2VzYC5cbiAgICovXG4gIHByaXZhdGUgbWNwUm91dGVBbGlhcyhwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubWNwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpZCA9IHRoaXMubWNwLnNlcnZlcklkO1xuICAgIGlmIChwYXRoID09PSBcIi9tY3BcIikgcmV0dXJuIGAvbWNwLyR7aWR9L21jcGA7XG4gICAgaWYgKHBhdGggPT09IFwiL3NzZVwiKSByZXR1cm4gYC9tY3AvJHtpZH0vc3NlYDtcbiAgICBpZiAocGF0aCA9PT0gXCIvbWVzc2FnZXNcIikgcmV0dXJuIGAvbWNwLyR7aWR9L21lc3NhZ2VzYDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL3N1Z2dlc3Rpb25zYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlXG4gICAqIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGVcbiAgICogT0JPLXNjb3BlZCBjbGllbnQuIFJlc29sdmVzIHRoZSBwbHVnaW4ncyBHZW5pZSBzcGFjZXMgYW5kIG1lcmdlc1xuICAgKiB0aGVpciBjdXJhdGVkIGBzYW1wbGVfcXVlc3Rpb25zYCAoc2VlIHtAbGluayBjb2xsZWN0U3BhY2VTdWdnZXN0aW9uc30pLlxuICAgKiBSZXR1cm5zIGBbXWAgd2hlbiBubyBHZW5pZSBzcGFjZSBpcyBjb25maWd1cmVkIHNvIHRoZSBjbGllbnRcbiAgICogc2hvd3MgYSBiYXJlIGVtcHR5IHN0YXRlIGluc3RlYWQgb2YgYnVpbHQtaW4gZXhhbXBsZSBwcm9tcHRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFN1Z2dlc3Rpb25zKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8c3RyaW5nW10+PiB7XG4gICAgY29uc3Qgc3BhY2VzID0gcmVzb2x2ZUdlbmllU3BhY2VzKHRoaXMuY29uZmlnLCB0aGlzLmNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgb2s6IHRydWUsIGRhdGE6IFtdIH07XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKChleGVjdXRlU2lnbmFsKSA9PiB7XG4gICAgICBjb25zdCBjb21iaW5lZCA9IGFzeW5jLmNvbWJpbmVBYm9ydFNpZ25hbHMoc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgIHJldHVybiBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyh7XG4gICAgICAgIHNwYWNlcyxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICAuLi4oY29tYmluZWQgPyB7IHNpZ25hbDogY29tYmluZWQgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH0sIGdlbmllU3VnZ2VzdGlvbkRlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL3JvdXRlL2ZlZWRiYWNrYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlXG4gICAqIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGVcbiAgICogT0JPLXNjb3BlZCBjbGllbnQgYW5kIHRoZSBhc3Nlc3NtZW50IGlzIGF0dHJpYnV0ZWQgdG8gdGhlIHNpZ25lZC1pblxuICAgKiB1c2VyICh0aGVpciBlbWFpbCAvIGlkIGFzIHRoZSBhc3Nlc3NtZW50IHNvdXJjZSkuIFJldHVybnMgdGhlXG4gICAqIGNyZWF0ZWQgYXNzZXNzbWVudCBpZCBvbiBzdWNjZXNzLCBvciBgdW5kZWZpbmVkYCBvbiBhIHNvZnQgZmFpbHVyZVxuICAgKiAoc2VlIHtAbGluayBsb2dGZWVkYmFja30gaW4gYC4vbWxmbG93LmpzYCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvZ0ZlZWRiYWNrKFxuICAgIGZlZWRiYWNrOiBNYXN0cmFGZWVkYmFja1JlcXVlc3QsXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHN0cmluZyB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjdHggPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgY29uc3Qgc291cmNlSWQgPVxuICAgICAgXCJ1c2VyRW1haWxcIiBpbiBjdHggJiYgY3R4LnVzZXJFbWFpbFxuICAgICAgICA/IGN0eC51c2VyRW1haWxcbiAgICAgICAgOiBcInVzZXJJZFwiIGluIGN0eFxuICAgICAgICAgID8gY3R4LnVzZXJJZFxuICAgICAgICAgIDogY3R4LnNlcnZpY2VVc2VySWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgICgpID0+XG4gICAgICAgIGxvZ0ZlZWRiYWNrKGN0eC5jbGllbnQsIHtcbiAgICAgICAgICAuLi5mZWVkYmFjayxcbiAgICAgICAgICAuLi4oc291cmNlSWQgPyB7IHNvdXJjZUlkIH0gOiB7fSksXG4gICAgICAgIH0pLFxuICAgICAgZmVlZGJhY2tXcml0ZURlZmF1bHRzLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGRhdGFgIGVtYmVkIHJlc29sdmVyXG4gICAqIChgR0VUIC9lbWJlZC9kYXRhLzppZGApLiBSdW5zIGluc2lkZSB0aGUgQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzb1xuICAgKiBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZVxuICAgKiBjbGllbnQsIHRoZW4gcmV1c2VzIHRoZSBzYW1lIGBmZXRjaFN0YXRlbWVudERhdGFgIHBpcGVsaW5lXG4gICAqIHRoZSBgZ2V0X3N0YXRlbWVudGAgdG9vbCBydW5zIHNvIHRoZSBMTE0gYW5kIHRoZSBVSSBzZWUgdGhlXG4gICAqIGV4YWN0IHNhbWUgc2hhcGUgZm9yIHRoZSBzYW1lIHN0YXRlbWVudC5cbiAgICpcbiAgICogUmVzb2x2ZXMgdG8gYHVuZGVmaW5lZGAgZGF0YSBmb3IgdXBzdHJlYW0gNDA0cyBzbyB0aGUgcm91dGUgY2FuIG1hcCB0aGVtXG4gICAqIHRvIGEgY2xlYW4gSFRUUCA0MDQ7IGFueSBvdGhlciBmYWlsdXJlIGNvbWVzIGJhY2sgYXMgYSBub24tYG9rYCByZXN1bHRcbiAgICogY2FycnlpbmcgdGhlIHN0YXR1cyB0byBhbnN3ZXIgd2l0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hTdGF0ZW1lbnQoXG4gICAgc3RhdGVtZW50SWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IGxpbWl0PzogbnVtYmVyOyBzaWduYWw/OiBBYm9ydFNpZ25hbCB9ID0ge30sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFN0YXRlbWVudERhdGEgfCB1bmRlZmluZWQ+PiB7XG4gICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICBjb25zdCBsaW1pdCA9IE1hdGgubWluKG9wdGlvbnMubGltaXQgPz8gU1RBVEVNRU5UX1JPV19DQVAsIFNUQVRFTUVOVF9ST1dfQ0FQKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpID0+IHtcbiAgICAgICAgY29uc3QgY29tYmluZWQgPSBhc3luYy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hTdGF0ZW1lbnREYXRhKGNsaWVudCwgc3RhdGVtZW50SWQsIHtcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgLi4uKGNvbWJpbmVkID8geyBzaWduYWw6IGNvbWJpbmVkIH0gOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbnM6IGRhdGEuY29sdW1ucyxcbiAgICAgICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgICAgIHJvd0NvdW50OiBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgICAgdHJ1bmNhdGVkOiBkYXRhLnJvd3MubGVuZ3RoIDwgZGF0YS5yb3dDb3VudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAvLyBUaGUgRGF0YWJyaWNrcyBTREsgdGhyb3dzIG9uIDQwNDsgc3VyZmFjZSBhcyBgdW5kZWZpbmVkYFxuICAgICAgICAgIC8vIHNvIHRoZSByb3V0ZSBtYXBzIHRvIGEgY2xlYW4gSFRUUCA0MDQgaW5zdGVhZCBvZiBhIDUwMC5cbiAgICAgICAgICBpZiAoZXJyb3IuZXJyb3JDb250ZXh0KGVycikubm90QWNjZXNzaWJsZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAuLi5zdGF0ZW1lbnREYXRhRGVmYXVsdHMuZGVmYXVsdCxcbiAgICAgICAgICAvLyBOYW1lc3BhY2VkIHNvIHRoZSBrZXkgY2FuJ3QgY29sbGlkZSB3aXRoIGFub3RoZXIgY2FjaGUgc2hhcmluZyB0aGVcbiAgICAgICAgICAvLyBtYW5hZ2VyLCBhbmQga2V5ZWQgb24gYGxpbWl0YCBiZWNhdXNlIHRoZSBzbGljZSBpcyBwYXJ0IG9mIHRoZVxuICAgICAgICAgIC8vIHBheWxvYWQuXG4gICAgICAgICAgY2FjaGU6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlbWVudERhdGFEZWZhdWx0cy5kZWZhdWx0LmNhY2hlLFxuICAgICAgICAgICAgY2FjaGVLZXk6IFtTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFLCBzdGF0ZW1lbnRJZCwgbGltaXRdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGNoYXJ0YCBlbWJlZCByZXNvbHZlclxuICAgKiAoYEdFVCAvZW1iZWQvY2hhcnQvOmlkYCkuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvIHRoZVxuICAgKiBsb29rdXAgaXMgbmFtZXNwYWNlZCB0byB0aGUgY2FsbGluZyBpZGVudGl0eTogYSBjaGFydCBtaW50ZWQgZm9yIGFub3RoZXJcbiAgICogdXNlciBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIHVua25vd24gaWQsIGFuZCB0aGUgcm91dGUgYW5zd2VycyA0MDQuXG4gICAqXG4gICAqIFRoZSBrZXkgaXMgYnVpbHQgZnJvbSB7QGxpbmsgYXR0cmlidXRlZFVzZXJJZH0gLSB0aGUgc2FtZSBydWxlIHRoYXQgbmFtZWRcbiAgICogdGhlIGlkZW50aXR5IHRoZSBjaGFydCB3YXMgd3JpdHRlbiB1bmRlciAtIHJhdGhlciB0aGFuIGZyb20gdGhlIGFtYmllbnRcbiAgICogZXhlY3V0aW9uIGNvbnRleHQgYWxvbmUuIEluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgYW1iaWVudCBjb250ZXh0IGlzXG4gICAqIHRoZSBTUCBmb3IgZXZlcnkgY2FsbGVyLCBzbyBrZXlpbmcgb2ZmIGl0IGFsb25lIG1pc3NlZCBldmVyeSBjaGFydCB0aGVcbiAgICogdHVybiBoYWQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgYW5kIHRoZSBVSSBzaG93ZWQgZWFjaCBvbmUgYXNcbiAgICogZXhwaXJlZC4gYHJlcWAgaXMgcmVhZCBpbnNpZGUgdGhlIG1ldGhvZCwgbm90IGF0IHRoZSBjYWxsIHNpdGUsIHNvIHRoZVxuICAgKiBleGVjdXRpb24gY29udGV4dCBpcyB0aGUgc2NvcGVkIG9uZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hDaGFydEVudHJ5KFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIGNoYXJ0SWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IHRpbWVvdXRNcz86IG51bWJlcjsgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuICApOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxDaGFydCB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCB1c2VyS2V5ID0gYXR0cmlidXRlZFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCksIHJlcXVlc3RVc2VySWQocmVxKSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShcbiAgICAgIChleGVjdXRlU2lnbmFsKSA9PlxuICAgICAgICBmZXRjaENoYXJ0KGNoYXJ0SWQsIHtcbiAgICAgICAgICB1c2VyS2V5LFxuICAgICAgICAgIC4uLihvcHRpb25zLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsOiBhc3luYy5jb21iaW5lQWJvcnRTaWduYWxzKG9wdGlvbnMuc2lnbmFsLCBleGVjdXRlU2lnbmFsKSA/PyBvcHRpb25zLnNpZ25hbCxcbiAgICAgICAgfSksXG4gICAgICBjaGFydEZldGNoRGVmYXVsdHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgL21vZGVsc2Agcm91dGUuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXRcbiAgICogdXNlci1jb250ZXh0IHByb3h5IHNvIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTy1zY29wZWRcbiAgICogY2xpZW50IGFuZCB0aGUgY2F0YWxvZ3VlIHJlZmxlY3RzIHdoYXQgdGhlIGNhbGxlciBjYW4gaW52b2tlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TW9kZWxzUmVzdWx0KCk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKHRoaXMuY29uZmlnKTtcbiAgICAgIHJldHVybiBub2RlU2VydmluZy5saXN0U2VydmluZ0VuZHBvaW50cyhjbGllbnQsIGhvc3QsIHsgdHRsTXM6IHNlcnZpbmcudHRsTXMgfSk7XG4gICAgfSwgbW9kZWxDYXRhbG9ndWVEZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gYmFja2luZyB0aGUgYGxpc3RNb2RlbHNgIGV4cG9ydC4gVGhlIHByb2dyYW1tYXRpYyBzdXJmYWNlXG4gICAqIGNhcnJpZXMgbm8gc3RhdHVzIGNvZGUsIHNvIGEgZmFpbGVkIGV4ZWN1dGlvbiBiZWNvbWVzIGEgdGhyb3cgd2l0aCBhXG4gICAqIHN0YWJsZSBtZXNzYWdlOyB0aGUgcm91dGVzIGJyYW5jaCBvbiB0aGUge0BsaW5rIEV4ZWN1dGlvblJlc3VsdH0gaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbGlzdE1vZGVscygpOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubGlzdE1vZGVsc1Jlc3VsdCgpO1xuICAgIGlmIChyZXN1bHQub2spIHJldHVybiByZXN1bHQuZGF0YTtcbiAgICB0aGlzLmxvZ2dlci53YXJuKFwibGlzdE1vZGVsczplcnJvclwiLCB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXMsXG4gICAgICBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UsXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKE1PREVMX0NBVEFMT0dVRV9GQUlMRURfTUVTU0FHRSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkQWdlbnRBbmRTZXJ2ZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUGVyLWFnZW50IG1lbW9yeSBmYWN0b3J5LiBXaGVuIGFueSBzdG9yYWdlIC8gbWVtb3J5IHNldHRpbmcgbmVlZHNcbiAgICAvLyBQb3N0Z3Jlcywgc3RhbmQgdXAgYSBkZWRpY2F0ZWQgc2VydmljZS1wcmluY2lwYWwgcG9vbCBmaXJzdCBzb1xuICAgIC8vIG1lbW9yeSBhY3RzIGFzIHRoZSBhcHAgU1AgKG93bmVyIG9mIHRoZSBgbWFzdHJhXypgIHNjaGVtYXMpLFxuICAgIC8vIG5ldmVyIHRoZSBwZXItcmVxdWVzdCBPQk8gaWRlbnRpdHkgdGhlIGNoYXQgdHVybiBydW5zIHVuZGVyLlxuICAgIC8vIGBnZXRQZ0NvbmZpZygpYCBpcyByZWFkIGhlcmUsIG91dHNpZGUgYW55IGBhc1VzZXJgIHNjb3BlLCBzbyBpdFxuICAgIC8vIHJldHVybnMgdGhlIFNQIGNvbm5lY3Rpb24gdGFyZ2V0ICsgdG9rZW4gcmVmcmVzaCBwbHVzIGFueVxuICAgIC8vIGBsYWtlYmFzZSh7IHBvb2wgfSlgIG92ZXJyaWRlczsgYHJlcXVpcmVgIHR1cm5zIGEgbWlzc2luZ1xuICAgIC8vIHNpYmxpbmcgaW50byBhIGNsZWFyIHdpcmluZyBlcnJvci4gVGhlIGJ1aWxkZXIgY2FjaGVzIHRoZSBzaGFyZWRcbiAgICAvLyBgUGdWZWN0b3JgIHNpbmdsZXRvbiBzbyByZWdpc3RlcmluZyBOIGFnZW50cyBzdGF5cyBjaGVhcC4gU2VlXG4gICAgLy8gYC4vbWVtb3J5LmpzYC5cbiAgICBpZiAobmVlZHNMYWtlYmFzZSh0aGlzLmNvbmZpZykpIHtcbiAgICAgIGNvbnN0IHNwUGdDb25maWcgPSBwbHVnaW5cbiAgICAgICAgLnJlcXVpcmUodGhpcy5jb250ZXh0LCBsYWtlYmFzZSwgdGhpcy5jb25maWcpXG4gICAgICAgIC5leHBvcnRzKClcbiAgICAgICAgLmdldFBnQ29uZmlnKCk7XG4gICAgICB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sID0gYXdhaXQgY3JlYXRlU2VydmljZVByaW5jaXBhbFBvb2woc3BQZ0NvbmZpZyk7XG4gICAgfVxuICAgIGNvbnN0IG1lbW9yeUJ1aWxkZXIgPSB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sXG4gICAgICA/IGNyZWF0ZU1lbW9yeUJ1aWxkZXIodGhpcy5jb25maWcsIHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEJ1aWxkIGV2ZXJ5IGFnZW50IGRlY2xhcmVkIGluIGBjb25maWcuYWdlbnRzYCAob3IgdGhlIGJ1aWx0LWluXG4gICAgLy8gZmFsbGJhY2sgd2hlbiBub25lIGFyZSBkZWNsYXJlZCkuIEVhY2ggYWdlbnQncyBgbW9kZWxgIHJlc29sdmVzXG4gICAgLy8gd29ya3NwYWNlIFVSTCArIGJlYXJlciBhdCBjYWxsIHRpbWUgc28gY29uY3VycmVudCByZXF1ZXN0cyBnZXRcbiAgICAvLyBkaXN0aW5jdCB1c2VyIGlkZW50aXRpZXM7IHRoZSBgYXNVc2VyKHJlcSlgIHNjb3BlIGFyb3VuZFxuICAgIC8vIGBoYW5kbGVDaGF0YCBpcyB3aGF0IGxldHMgYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJuIHRoZVxuICAgIC8vIHJpZ2h0IHVzZXIgaW5zaWRlIHRoZSByZXNvbHZlci5cbiAgICAvLyBNYXRlcmlhbGl6ZSBhbnkgcmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgT05DRSBhdCBzdGFydHVwLiBSdW5zXG4gICAgLy8gb3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUsIHNvIGl0IHVzZXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCdzIGNsaWVudFxuICAgIC8vIGFuZCBkZWZhdWx0cyB0byB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgc2tpbGxzIHRyZWU7IGEgc291cmNlXG4gICAgLy8gdGhhdCBsYW5kcyBvbiBhIGxvY2FsIHRlbXAgZGlyIChubyB3cml0YWJsZSB3b3Jrc3BhY2UpIGlzIGZvbGRlZCBpbnRvXG4gICAgLy8gZXZlcnkgZGVmYXVsdC13b3Jrc3BhY2UgYWdlbnQgdmlhIGBleHRyYVNraWxsUGF0aHNgLlxuICAgIGNvbnN0IHByb3Zpc2lvbmVkID0gYXdhaXQgcHJvdmlzaW9uUmVtb3RlU2tpbGxzKHRoaXMuY29uZmlnLnJlbW90ZVNraWxscyk7XG4gICAgaWYgKHByb3Zpc2lvbmVkLnNraWxsTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbHMgY29uZmlndXJlZFwiLCB7XG4gICAgICAgIHNraWxsczogcHJvdmlzaW9uZWQuc2tpbGxOYW1lcyxcbiAgICAgICAgZGF0YWJyaWNrc0Jhc2VQYXRoOiBwcm92aXNpb25lZC5kYXRhYnJpY2tzQmFzZVBhdGgsXG4gICAgICAgIGxvY2FsU2tpbGxQYXRoczogcHJvdmlzaW9uZWQubG9jYWxTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYnVpbHQgPSBhd2FpdCBidWlsZEFnZW50cyh7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LFxuICAgICAgbWVtb3J5QnVpbGRlcixcbiAgICAgIGxvZzogdGhpcy5sb2dnZXIsXG4gICAgICBleHRyYVNraWxsUGF0aHM6IHByb3Zpc2lvbmVkLmxvY2FsU2tpbGxQYXRocyxcbiAgICB9KTtcblxuICAgIC8vIGBtYXN0cmEuc2VydmVyLmFwaVJvdXRlc2AgaXMgb25seSBob25vcmVkIGJ5IE1hc3RyYSdzIHN0YW5kYWxvbmVcbiAgICAvLyBkZXYgc2VydmVyLiBTaW5jZSB3ZSdyZSBob3N0aW5nIE1hc3RyYSBpbnNpZGUgb3VyIG93biBFeHByZXNzXG4gICAgLy8gc3ViYXBwIHZpYSBgQG1hc3RyYS9leHByZXNzYCwgY3VzdG9tIHJvdXRlcyBtdXN0IGJlIHBhc3NlZCB0b1xuICAgIC8vIHRoZSBgTWFzdHJhU2VydmVyYCBjb25zdHJ1Y3RvciBkaXJlY3RseS5cbiAgICAvL1xuICAgIC8vIGBzdG9yYWdlYCBoZXJlIGlzICpNYXN0cmEtaW5zdGFuY2UtbGV2ZWwqIGFuZCBwZXJzaXN0cyB3b3JrZmxvd1xuICAgIC8vIHNuYXBzaG90cyAod2hlcmUgc3VzcGVuZGVkIGByZXF1aXJlQXBwcm92YWxgIHRvb2wgY2FsbHMgbGl2ZSkuXG4gICAgLy8gSXQncyBzZXBhcmF0ZSBmcm9tIGVhY2ggYWdlbnQncyBgTWVtb3J5LnN0b3JhZ2VgLCB3aGljaCBvbmx5XG4gICAgLy8gY292ZXJzIHRocmVhZCAvIG1lc3NhZ2UgaGlzdG9yeS4gV2l0aG91dCBpdCxcbiAgICAvLyBgYWdlbnQucmVzdW1lU3RyZWFtKClgIGVycm9ycyB3aXRoIFwiY291bGQgbm90IGZpbmQgYSBzdXNwZW5kZWRcbiAgICAvLyBydW5cIiBhbmQgdGhlIGFwcHJvdmFsIFVJIGhhbmdzIGFmdGVyIHRoZSB1c2VyIGNsaWNrcyBBcHByb3ZlLlxuICAgIGNvbnN0IGluc3RhbmNlU3RvcmFnZSA9IG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpO1xuICAgIC8vIFdpcmUgTWFzdHJhJ3MgdHJhY2VyIGludG8gQXBwS2l0J3MgZ2xvYmFsIE9UZWwgcGlwZWxpbmUgdmlhXG4gICAgLy8gYEBtYXN0cmEvb3RlbC1icmlkZ2VgLiBNYXN0cmEgc3BhbnMgYmVjb21lIG5hdGl2ZSBPVGVsIHNwYW5zIG9uXG4gICAgLy8gd2hhdGV2ZXIgdHJhY2VyIHByb3ZpZGVyIGBUZWxlbWV0cnlNYW5hZ2VyYCByZWdpc3RlcmVkIGR1cmluZ1xuICAgIC8vIGBjcmVhdGVBcHBgLCBzbyB0aGUgT1RMUCBlbmRwb2ludCAvIGhlYWRlcnMgLyBzYW1wbGluZyBhcmVcbiAgICAvLyBlbnYtZHJpdmVuIGFuZCBzaGFyZWQgd2l0aCBldmVyeSBvdGhlciBBcHBLaXQgcGx1Z2luLlxuICAgIGNvbnN0IG9ic2VydmFiaWxpdHkgPSBhd2FpdCBidWlsZE9ic2VydmFiaWxpdHkoe1xuICAgICAgc2VydmljZU5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGVuYWJsZWQ6IHRoaXMuY29uZmlnLm9ic2VydmFiaWxpdHksXG4gICAgfSk7XG4gICAgLy8gT3B0aW9uYWwgTUNQIGV4cG9zdXJlOiBidWlsZCBhIE1hc3RyYSBNQ1Agc2VydmVyIGZyb20gdGhlXG4gICAgLy8gcmVnaXN0ZXJlZCBhZ2VudHMgKGFuZCwgb3B0LWluLCB0aGUgYW1iaWVudCB0b29scykgYW5kIHJlZ2lzdGVyXG4gICAgLy8gaXQgb24gdGhlIE1hc3RyYSBpbnN0YW5jZS4gYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzIHRoZSBzdG9jayBNQ1BcbiAgICAvLyB0cmFuc3BvcnQgcm91dGVzIChgL21jcC88c2VydmVySWQ+Ly4uLmApIG9mZiBgbWNwU2VydmVyc2AsIHNvIHRoZVxuICAgIC8vIGNhdGNoLWFsbCBkaXNwYXRjaCBiZWxvdyBhbHJlYWR5IHJvdXRlcyBNQ1AgcmVxdWVzdHMgdW5kZXIgT0JPIC1cbiAgICAvLyBubyBiZXNwb2tlIHJvdXRlIG5lZWRlZC4gU2VlIGAuL21jcC5qc2AuXG4gICAgdGhpcy5tY3AgPSBidWlsZE1jcFNlcnZlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5uYW1lLFxuICAgICAgZGlzcGxheU5hbWU6IE1hc3RyYVBsdWdpbi5tYW5pZmVzdC5kaXNwbGF5TmFtZSxcbiAgICAgIGFnZW50czogdGhpcy5idWlsdC5hZ2VudHMsXG4gICAgICBhbWJpZW50VG9vbHM6IHRoaXMuYnVpbHQuYW1iaWVudFRvb2xzLFxuICAgIH0pO1xuICAgIHRoaXMubWFzdHJhID0gbmV3IE1hc3RyYSh7XG4gICAgICBhZ2VudHM6IHRoaXMuYnVpbHQuYWdlbnRzLFxuICAgICAgLi4uKGluc3RhbmNlU3RvcmFnZSA/IHsgc3RvcmFnZTogaW5zdGFuY2VTdG9yYWdlIH0gOiB7fSksXG4gICAgICAuLi4ob2JzZXJ2YWJpbGl0eSA/IHsgb2JzZXJ2YWJpbGl0eSB9IDoge30pLFxuICAgICAgLi4uKHRoaXMubWNwID8geyBtY3BTZXJ2ZXJzOiB7IFt0aGlzLm1jcC5zZXJ2ZXJJZF06IHRoaXMubWNwLnNlcnZlciB9IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy5tYXN0cmFBcHAgPSBleHByZXNzKCk7XG4gICAgYXR0YWNoUm91dGVQYXRjaE1pZGRsZXdhcmUodGhpcy5tYXN0cmFBcHApO1xuICAgIC8vIFN0YW1wIGNoYXQgcmVxdWVzdC9yZXNwb25zZSBvbnRvIHRoZSBIVFRQIHJvb3Qgc3BhbiBzbyBNTGZsb3cnc1xuICAgIC8vIFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgY2FuIHN1cmZhY2UgdGhlbSAoTWFzdHJhJ3Mgb3duXG4gICAgLy8gYG1hc3RyYS5hZ2VudF9ydW4uKmAgYXR0cmlidXRlcyBzaXQgb24gYSBjaGlsZCBzcGFuIHRoZSB2aWV3XG4gICAgLy8gbmV2ZXIgcmVhZHMpLiBNdXN0IHJ1biBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0YCBzbyB0aGUgbGF5ZXJcbiAgICAvLyBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudCByb3V0ZXMuXG4gICAgYXR0YWNoQ2hhdFR1cm5UcmFjZUlvKHRoaXMubWFzdHJhQXBwKTtcbiAgICB0aGlzLm1hc3RyYVNlcnZlciA9IG5ldyBNYXN0cmFTZXJ2ZXIodGhpcy5jb25maWcsIHtcbiAgICAgIGFwcDogdGhpcy5tYXN0cmFBcHAsXG4gICAgICBtYXN0cmE6IHRoaXMubWFzdHJhLFxuICAgICAgcHJlZml4OiBcIlwiLFxuICAgICAgY3VzdG9tQXBpUm91dGVzOiBbXG4gICAgICAgIC8vIGBoaXN0b3J5Um91dGVgIHJlZ2lzdGVycyBib3RoIEdFVCAobG9hZCkgYW5kIERFTEVURVxuICAgICAgICAvLyAoY2xlYXIpIG9uIHRoZSBzYW1lIHBhdGgsIHNvIGl0IHJldHVybnMgYW4gYXJyYXkgd2VcbiAgICAgICAgLy8gc3BsaWNlIGluLlxuICAgICAgICAuLi5oaXN0b3J5Um91dGUoe1xuICAgICAgICAgIHBhdGg6IHJvdXRlcy5NQVNUUkFfUk9VVEVTLmhpc3RvcnksXG4gICAgICAgICAgYWdlbnQ6IHRoaXMuYnVpbHQuZGVmYXVsdEFnZW50SWQsXG4gICAgICAgIH0pLFxuICAgICAgICAvLyBBc3NlcnQgdGhlIGA6YWdlbnRJZGAgdGVtcGxhdGUgdHlwZTogdGhlIHBlci1wYWNrYWdlIGJ1aWxkJ3NcbiAgICAgICAgLy8gTm9kZU5leHQgcmVzb2x1dGlvbiB3aWRlbnMgdGhlIGltcG9ydGVkIGByb3V0ZXMuTUFTVFJBX1JPVVRFUy5oaXN0b3J5YFxuICAgICAgICAvLyB0byBgc3RyaW5nYCAodGhlIHNvdXJjZS9idW5kbGVyIHR5cGVjaGVjayBrZWVwcyBpdCBhIGxpdGVyYWwpLFxuICAgICAgICAvLyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZHJvcCB0aGlzIG91dCBvZiB0aGUgZHluYW1pYy1hZ2VudFxuICAgICAgICAvLyBvdmVybG9hZCBhbmQgZGVtYW5kIGEgZml4ZWQgYGFnZW50YC5cbiAgICAgICAgLi4uaGlzdG9yeVJvdXRlKHtcbiAgICAgICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5oaXN0b3J5fS86YWdlbnRJZGAgYXMgYCR7c3RyaW5nfTphZ2VudElkYCxcbiAgICAgICAgfSksXG4gICAgICAgIC8vIGB0aHJlYWRzUm91dGVgIHJlZ2lzdGVycyBHRVQgKGxpc3QgdGhlIGNhbGxlcidzIGNvbnZlcnNhdGlvblxuICAgICAgICAvLyB0aHJlYWRzKSBhbmQgREVMRVRFIChyZW1vdmUgdGhlIHRhcmdldGVkIHRocmVhZCkgb24gdGhlIHNhbWVcbiAgICAgICAgLy8gcGF0aDsgYm90aCB0aGUgZGVmYXVsdC1hZ2VudCBhbmQgZHluYW1pYy1hZ2VudCBtb3VudHMgYXJlXG4gICAgICAgIC8vIHNwbGljZWQgaW4sIG1pcnJvcmluZyB0aGUgaGlzdG9yeSByb3V0ZXMgYWJvdmUuXG4gICAgICAgIC4uLnRocmVhZHNSb3V0ZSh7XG4gICAgICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMudGhyZWFkcyxcbiAgICAgICAgICBhZ2VudDogdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZCxcbiAgICAgICAgfSksXG4gICAgICAgIC4uLnRocmVhZHNSb3V0ZSh7XG4gICAgICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMudGhyZWFkc30vOmFnZW50SWRgIGFzIGAke3N0cmluZ306YWdlbnRJZGAsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLm1hc3RyYVNlcnZlci5pbml0KCk7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGFnZW50czogT2JqZWN0LmtleXModGhpcy5idWlsdC5hZ2VudHMpLFxuICAgICAgZGVmYXVsdEFnZW50OiB0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkLFxuICAgICAgYXBpQWNjZXNzOiB0aGlzLmNvbmZpZy5hcGlBY2Nlc3MgPz8gXCJzY29wZWRcIixcbiAgICAgIG1jcDogdGhpcy5tY3AgPyBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AuaHR0cFBhdGh9YCA6IFwib2ZmXCIsXG4gICAgICBsYWtlYmFzZTogbWVtb3J5QnVpbGRlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgZmVlZGJhY2s6IHRoaXMuZmVlZGJhY2tFbmFibGVkKCksXG4gICAgICBvYnNlcnZhYmlsaXR5OiBvYnNlcnZhYmlsaXR5ICE9PSB1bmRlZmluZWQgPyBcIm1sZmxvd1wiIDogXCJvZmZcIixcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVyIGZvciBvbmUgZW1iZWQgYDx0eXBlPmAgYmVoaW5kIHRoZSBnZW5lcmljXG4gKiBgR0VUIC9lbWJlZC86dHlwZS86aWRgIHJvdXRlLiBSZXR1cm5zIHRoZSBKU09OIGJvZHkgdG8gc2VuZCBvblxuICogc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgdG8gc2lnbmFsIGEgNDA0ICh1bmtub3duIC8gZXhwaXJlZCBpZCkuXG4gKiBgc2lnbmFsYCBhYm9ydHMgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzIHNvIGxvbmctcG9sbGluZ1xuICogcmVzb2x2ZXJzIChlLmcuIGBjaGFydGApIHVuYmxvY2sgaW1tZWRpYXRlbHkuXG4gKi9cbnR5cGUgRW1iZWRSZXNvbHZlciA9IChcbiAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gIGlkOiBzdHJpbmcsXG4gIHNpZ25hbDogQWJvcnRTaWduYWwsXG4pID0+IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PHVua25vd24+PjtcblxuLyoqXG4gKiBQYXJzZSB0aGUgb3B0aW9uYWwgYD90aW1lb3V0TXM9PG4+YCBxdWVyeSBwYXJhbWV0ZXIgZnJvbSBhXG4gKiBgR0VUIC9lbWJlZC9jaGFydC86aWRgIHJlcXVlc3QuIEFjY2VwdHMgYSBwb3NpdGl2ZSBpbnRlZ2VyIHVwXG4gKiB0byB7QGxpbmsgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NU30gKGNsYW1wZWQpIGFuZCByZWplY3RzIGV2ZXJ5dGhpbmcgZWxzZVxuICogYXMgYHVuZGVmaW5lZGAgc28ge0BsaW5rIGZldGNoQ2hhcnR9IGZhbGxzIGJhY2sgdG8gaXRzIGRlZmF1bHQuXG4gKiBFeHByZXNzIHByb2R1Y2VzIGBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZGA7IHdlIG5vcm1hbGl6ZVxuICogdG8gdGhlIGZpcnN0IHNjYWxhciBiZWZvcmUgcGFyc2luZy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VUaW1lb3V0TXMocmF3OiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdiA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBuID0gb2JqZWN0LnRvTnVtYmVyKHYpO1xuICBpZiAobiA9PT0gdW5kZWZpbmVkIHx8IG4gPD0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGguZmxvb3IobiksIE1BWF9FTUJFRF9QT0xMX1RJTUVPVVRfTVMpO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBvcHRpb25hbCBgP2xpbWl0PTxuPmAgcXVlcnkgcGFyYW1ldGVyIGZyb20gYVxuICogYEdFVCAvZW1iZWQvZGF0YS86aWRgIHJlcXVlc3QuIEFjY2VwdHMgYSBub24tbmVnYXRpdmVcbiAqIGludGVnZXIgYW5kIGxldHMgdGhlIHJvdXRlIGNsYW1wIHRvIGBTVEFURU1FTlRfUk9XX0NBUGA7XG4gKiByZWplY3RzIGFueXRoaW5nIGVsc2UgYXMgYHVuZGVmaW5lZGAgc28gdGhlIHJvdXRlIGZhbGxzIGJhY2tcbiAqIHRvIHRoZSBzZXJ2ZXItc2lkZSBjYXAuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3RhdGVtZW50TGltaXQocmF3OiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdiA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgaWYgKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBuID0gb2JqZWN0LnRvTnVtYmVyKHYpO1xuICBpZiAobiA9PT0gdW5kZWZpbmVkIHx8IG4gPCAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5mbG9vcihuKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciB0aGUgTWFzdHJhIHBsdWdpbiBvbiBhbiBBcHBLaXQgYXBwLiBNb3VudHMgdGhlIGFnZW50cywgdGhlXG4gKiBgL3JvdXRlLypgIGNoYXQgc3VyZmFjZSwgYW5kICh1bmxlc3MgZGlzYWJsZWQpIHRoZSBNQ1AgdHJhbnNwb3J0IHVuZGVyXG4gKiBgL2FwaS9tYXN0cmFgLlxuICpcbiAqIEBleGFtcGxlIE1pbmltYWwgYXBwXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIC8vIE5vIGBhZ2VudHNgOiBhIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdCBpcyByZWdpc3RlcmVkLCBzbyB0aGVcbiAqIC8vIGNoYXQgZW5kcG9pbnQgd29ya3Mgb3V0IG9mIHRoZSBib3guXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoeyBwbHVnaW5zOiBbbWFzdHJhKCldIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVHdvIGFnZW50cywgYSBwaW5uZWQgbW9kZWwsIGFuZCBHZW5pZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgbGFrZWJhc2UgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBjcmVhdGVBZ2VudCwgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBsYWtlYmFzZSgpLFxuICogICAgIG1hc3RyYSh7XG4gKiAgICAgICBkZWZhdWx0TW9kZWw6IFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiLFxuICogICAgICAgZGVmYXVsdEFnZW50OiBcImFuYWx5c3RcIixcbiAqICAgICAgIGdlbmllU3BhY2VzOiB7IHNhbGVzOiB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiLCBoaW50OiBcIm9yZGVycywgcmV0dXJuc1wiIH0gfSxcbiAqICAgICAgIGFnZW50czoge1xuICogICAgICAgICBhbmFseXN0OiBjcmVhdGVBZ2VudCh7XG4gKiAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIllvdSBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IHNhbGVzLlwiLFxuICogICAgICAgICAgIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICAgICAgICAgIHJldHVybiB7IC4uLnBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKSB9O1xuICogICAgICAgICAgIH0sXG4gKiAgICAgICAgIH0pLFxuICogICAgICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIllvdSBleHBsYWluIHRoZSBhbmFseXN0J3MgYW5zd2Vycy5cIiB9KSxcbiAqICAgICAgIH0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgbWFzdHJhID0gdG9QbHVnaW4oTWFzdHJhUGx1Z2luKTtcbiJdfQ==
|
|
1102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLE1BQU0sRUFDTixRQUFRLEdBS1QsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sSUFBSSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxHQUtQLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBK0IsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0MsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBRzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQW9CLE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDeEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUM5RixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsc0JBQXNCLEVBQ3RCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZ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QUFTLENBQUM7SUFDNUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiB0aGF0IGJ1aWxkcyBvbmUgb3IgbW9yZSBNYXN0cmEgYEFnZW50YCBpbnN0YW5jZXMgYW5kXG4gKiBtb3VudHMgdGhlIGBAbWFzdHJhL2V4cHJlc3NgIHNlcnZlci4gQ2xpZW50cyBkcml2ZSB0aGUgY29udmVyc2F0aW9uXG4gKiBvdmVyIHRoZSBzdGFuZGFyZCBNYXN0cmEgYWdlbnQgc3RyZWFtIChgQG1hc3RyYS9jbGllbnQtanNgJ3NcbiAqIGBnZXRBZ2VudChpZCkuc3RyZWFtKClgKSwgc28gdGhlcmUncyBubyBiZXNwb2tlIGNoYXQgdHJhbnNwb3J0IHRvXG4gKiBrZWVwIGluIHN5bmMuXG4gKlxuICogLSBBZ2VudHM6IHJlZ2lzdGVyZWQgdGhyb3VnaCBgY29uZmlnLmFnZW50c2AgYXQgcGx1Z2luIGNyZWF0aW9uXG4gKiAgICh7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSkuIEVhY2ggZW50cnkncyBgdG9vbHNgIGZpZWxkIGFjY2VwdHNcbiAqICAgZWl0aGVyIGEgcGxhaW4gcmVjb3JkIG9yIGEgYChwbHVnaW5zKSA9PiB0b29sc2AgY2FsbGJhY2sgdGhhdCBnZXRzXG4gKiAgIGEgdHlwZWQgc2libGluZy1wbHVnaW4gaW5kZXggKHtAbGluayBNYXN0cmFQbHVnaW5zfSkuIE9taXRcbiAqICAgYGNvbmZpZy5hZ2VudHNgIHRvIGdldCBhIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdC5cbiAqIC0gTW9kZWw6IGVhY2ggYWdlbnQgY2FsbCByZXNvbHZlcyBhIGBNYXN0cmFNb2RlbENvbmZpZ2AgdmlhXG4gKiAgIHtAbGluayBidWlsZE1vZGVsfSBmcm9tIGAuL21vZGVsLmpzYC4gUGVyLWFnZW50IGBtb2RlbGAgb3ZlcnJpZGVzXG4gKiAgIChgQWdlbnRDb25maWdbXCJtb2RlbFwiXWAgb3IgYSBgbW9kZWxJZGAgc3RyaW5nKSBmbG93IHRocm91Z2hcbiAqICAge0BsaW5rIGJ1aWxkQWdlbnRzfS5cbiAqIC0gTWVtb3J5IC8gc3RvcmFnZTogcGVyLWFnZW50LCBidWlsdCBieSB7QGxpbmsgY3JlYXRlTWVtb3J5QnVpbGRlcn1cbiAqICAgZnJvbSBgLi9tZW1vcnkuanNgLiBCb3RoIGF1dG8tZGVmYXVsdCB0byBgdHJ1ZWAgd2hlbiB0aGVcbiAqICAgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZCAodW5sZXNzIHRoZSBjYWxsZXIgcGFzc2VkXG4gKiAgIGBmYWxzZWAgb3IgYSBjdXN0b20gY29uZmlnKS4gU3RvcmFnZSBuYW1lc3BhY2VzIHBlciBhZ2VudCB2aWFcbiAqICAge0BsaW5rIGFnZW50U3RvcmFnZVNjaGVtYU5hbWV9IHBlciBhZ2VudDsgdGhlIHZlY3RvciBzdG9yZSBpcyBhIHNpbmdsZVxuICogICBzaGFyZWQgc2luZ2xldG9uIGFjcm9zcyBldmVyeSBhZ2VudC5cbiAqIC0gU2VydmVyOiB0aGUgRXhwcmVzcyBzdWJhcHAgd2lyaW5nIGxpdmVzIGluIGAuL3NlcnZlci5qc2AuXG4gKiAtIEhUVFA6IEFwcEtpdCBtb3VudHMgdGhpcyBwbHVnaW4gdW5kZXIgYC9hcGkvbWFzdHJhYC4gQWxvbmdzaWRlIHRoZVxuICogICBNYXN0cmEgYWdlbnQgcm91dGVzLCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBgL3JvdXRlL2hpc3RvcnlgXG4gKiAgIChsb2FkICsgY2xlYXIgYSB0aHJlYWQncyBtZXNzYWdlcyksIGAvcm91dGUvdGhyZWFkc2AgKGxpc3QgdGhlXG4gKiAgIGNhbGxlcidzIGNvbnZlcnNhdGlvbnMgKyBkZWxldGUgb25lKSwgYC9tb2RlbHNgLCBgL2RlZmF1bHQtbW9kZWxgLFxuICogICBgL3N1Z2dlc3Rpb25zYCwgYC9yb3V0ZS9mZWVkYmFja2AgKGxvZyBhIHRodW1icyAvIGNvbW1lbnQgdG8gTUxmbG93XG4gKiAgIHdoZW4gZmVlZGJhY2sgaXMgZW5hYmxlZCksIGFuZCB0aGUgZ2VuZXJpYyBgL2VtYmVkLzp0eXBlLzppZGBcbiAqICAgcmVzb2x2ZXIgZm9yIGlubGluZSBjaGFydCAvIGRhdGEgbWFya2Vycy4gRWFjaCBpcyByZWdpc3RlcmVkIHRocm91Z2hcbiAqICAgQXBwS2l0J3MgYHJvdXRlKClgIHNvIGl0IGxhbmRzIGluIHRoZSBwbHVnaW4ncyBlbmRwb2ludCBtYXAsIGFuZFxuICogICBldmVyeSBvdXRib3VuZCBjYWxsIG9uZSBtYWtlcyBydW5zIHRocm91Z2ggYGV4ZWN1dGUoKWAgKHNlZVxuICogICBgLi9kZWZhdWx0cy5qc2ApLiBUaGUgc3RvY2sgYEBtYXN0cmEvZXhwcmVzc2Agc3VyZmFjZSBpcyBnYXRlZFxuICogICBieSBgY29uZmlnLmFwaUFjY2Vzc2AgKGRlZmF1bHQgYFwic2NvcGVkXCJgKTogb25seSBhZ2VudCBpbmZlcmVuY2UsXG4gKiAgIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhlIGAvcm91dGUvKmAgcm91dGVzLCBhbmQgKHdoZW4gZW5hYmxlZClcbiAqICAgTUNQIGFyZSBkaXNwYXRjaGVkIHRvIE1hc3RyYTsgYWRtaW4gLyBtdXRhdGluZyAvIGJ1bGstZXhwb3J0IHJvdXRlc1xuICogICBhcmUgcmVmdXNlZCB3aXRoIGA0MDNgLiBTZWUge0BsaW5rIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWR9LlxuICogLSBNQ1A6IG9wdCBpbiB3aXRoIGBjb25maWcubWNwYCB0byBleHBvc2UgdGhlIGFnZW50cyAoYW5kIG9wdGlvbmFsbHlcbiAqICAgdG9vbHMpIGFzIGEgTWFzdHJhIGBNQ1BTZXJ2ZXJgLiBJdCBpcyByZWdpc3RlcmVkIG9uIHRoZSBgTWFzdHJhYFxuICogICBpbnN0YW5jZSB2aWEgYG1jcFNlcnZlcnNgLCBzbyBgQG1hc3RyYS9leHByZXNzYCBzZXJ2ZXMgdGhlIHN0b2NrXG4gKiAgIE1DUCB0cmFuc3BvcnQgcm91dGVzIChgL21jcC88c2VydmVySWQ+Ly4uLmApIHVuZGVyIHRoZSBtb3VudC4gU2VlXG4gKiAgIGAuL21jcC5qc2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIEV4ZWN1dGlvbkVycm9yLFxuICBnZW5pZSxcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgdG9QbHVnaW4sXG4gIHR5cGUgRXhlY3V0aW9uUmVzdWx0LFxuICB0eXBlIElBcHBSb3V0ZXIsXG4gIHR5cGUgUGx1Z2luTWFuaWZlc3QsXG4gIHR5cGUgUmVzb3VyY2VSZXF1aXJlbWVudCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBzZXJ2aW5nIGFzIG5vZGVTZXJ2aW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWxcIjtcbmltcG9ydCB7IGFzeW5jLCBlcnJvciwgbG9nLCBvYmplY3QsIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBmZWVkYmFjayxcbiAgcm91dGVzLFxuICB0eXBlIENoYXJ0LFxuICB0eXBlIE1hc3RyYUNsaWVudENvbmZpZyxcbiAgdHlwZSBNYXN0cmFGZWVkYmFja1JlcXVlc3QsXG4gIHR5cGUgU3RhdGVtZW50RGF0YSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHsgZGlzcGxheSwgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgTWFzdHJhIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgUG9vbCB9IGZyb20gXCJwZ1wiO1xuXG5pbXBvcnQgeyBidWlsZEFnZW50cywgRkFMTEJBQ0tfQUdFTlRfSUQsIHR5cGUgQnVpbHRBZ2VudHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB7IGZldGNoQ2hhcnQgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHsgYXR0cmlidXRlZFVzZXJJZCwgTUFTVFJBX0NPTkZJR19TQ0hFTUEsIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBjaGFydEZldGNoRGVmYXVsdHMsXG4gIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyxcbiAgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMsXG4gIG1vZGVsQ2F0YWxvZ3VlRGVmYXVsdHMsXG4gIHN0YXRlbWVudERhdGFEZWZhdWx0cyxcbn0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zLCByZXNvbHZlR2VuaWVTcGFjZXMgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHsgaGlzdG9yeVJvdXRlIH0gZnJvbSBcIi4vaGlzdG9yeS50c1wiO1xuaW1wb3J0IHtcbiAgcmVxdWVzdFVzZXJJZCxcbiAgcmVzb2x2ZUlkZW50aXR5TW9kZSxcbiAgdXNlU2VydmljZVByaW5jaXBhbCxcbiAgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUsXG59IGZyb20gXCIuL2lkZW50aXR5LnRzXCI7XG5pbXBvcnQgeyBidWlsZE1jcFNlcnZlciwgdHlwZSBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL21jcC50c1wiO1xuaW1wb3J0IHsgY3JlYXRlTWVtb3J5QnVpbGRlciwgY3JlYXRlU2VydmljZVByaW5jaXBhbFBvb2wsIG5lZWRzTGFrZWJhc2UgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGxvZ0ZlZWRiYWNrLCByZXNvbHZlRmVlZGJhY2tFbmFibGVkIH0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQgeyBidWlsZE9ic2VydmFiaWxpdHkgfSBmcm9tIFwiLi9vYnNlcnZhYmlsaXR5LnRzXCI7XG5pbXBvcnQgeyBwcm92aXNpb25SZW1vdGVTa2lsbHMgfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5pbXBvcnQge1xuICBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZSxcbiAgY3JlYXRlUmVxdWVzdENvbnRleHQsXG4gIGlzTWFzdHJhUmVxdWVzdEFsbG93ZWQsXG4gIE1hc3RyYVNlcnZlcixcbn0gZnJvbSBcIi4vc2VydmVyLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlU2VydmluZ0NvbmZpZyB9IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IGZldGNoU3RhdGVtZW50RGF0YSwgU1RBVEVNRU5UX1JPV19DQVAgfSBmcm9tIFwiLi9zdGF0ZW1lbnQudHNcIjtcbmltcG9ydCB7IHRocmVhZHNSb3V0ZSB9IGZyb20gXCIuL3RocmVhZHMudHNcIjtcbmltcG9ydCB7IGF0dGFjaENoYXRUdXJuVHJhY2VJbyB9IGZyb20gXCIuL3RyYWNlLWlvLnRzXCI7XG5pbXBvcnQgeyBpbnZhbGlkRmllbGRzIH0gZnJvbSBcIi4vdmFsaWRhdGlvbi50c1wiO1xuXG5jb25zdCBHRU5JRV9NQU5JRkVTVCA9IHBsdWdpbi5kYXRhKGdlbmllKS5wbHVnaW4ubWFuaWZlc3Q7XG5jb25zdCBMQUtFQkFTRV9NQU5JRkVTVCA9IHBsdWdpbi5kYXRhKGxha2ViYXNlKS5wbHVnaW4ubWFuaWZlc3Q7XG5cbi8qKlxuICogQnVkZ2V0IGZvciBkcmFpbmluZyB0aGUgbWVtb3J5IHNlcnZpY2UtcHJpbmNpcGFsIHBvb2wgb24gc2h1dGRvd24uIFdlbGxcbiAqIGluc2lkZSBBcHBLaXQncyAxNXMgZ3JhY2VmdWwtc2h1dGRvd24gd2luZG93LCBzbyBhIHN0dWNrIGNvbm5lY3Rpb24gY2FuXG4gKiBuZXZlciBiZSB3aGF0IGhvbGRzIHRoZSBwcm9jZXNzIG9wZW4uXG4gKi9cbmNvbnN0IFBPT0xfRFJBSU5fVElNRU9VVF9NUyA9IDVfMDAwO1xuXG4vKiogQ2VpbGluZyBvbiB0aGUgYD90aW1lb3V0TXM9YCBsb25nLXBvbGwgYnVkZ2V0IGEgY2xpZW50IG1heSByZXF1ZXN0LiAqL1xuY29uc3QgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyA9IDUgKiA2MF8wMDA7XG5cbi8qKiBTdGFibGUgY2xpZW50IG1lc3NhZ2Ugd2hlbiB0aGUgd29ya3NwYWNlJ3MgbW9kZWwgY2F0YWxvZ3VlIGNhbid0IGJlIHJlYWQuICovXG5jb25zdCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UgPSBcIkNvdWxkIG5vdCByZWFkIHRoZSB3b3Jrc3BhY2UncyBtb2RlbCBjYXRhbG9ndWVcIjtcblxuLyoqIFN0YWJsZSBjbGllbnQgbWVzc2FnZSBmb3IgYSBmZWVkYmFjayBib2R5IHRoYXQgZmFpbHMgc2NoZW1hIHZhbGlkYXRpb24uICovXG5jb25zdCBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UgPSBcIkludmFsaWQgZmVlZGJhY2sgcmVxdWVzdFwiO1xuXG4vKiogQ2FjaGUgbmFtZXNwYWNlIGZvciBzdGF0ZW1lbnQgcmVzdWx0IHNldHMsIG1hdGNoaW5nIHRoZSBjaGFydCBjYWNoZSdzIGZvcm0uICovXG5jb25zdCBTVEFURU1FTlRfQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6c3RhdGVtZW50XCI7XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgbWFzdHJhYCkgdGhhdCBob3N0cyBNYXN0cmEgYWdlbnRzXG4gKiB3aXRoIG9wdGlvbmFsIExha2ViYXNlLWJhY2tlZCBtZW1vcnkgYW5kIEFJIFNESyBjaGF0IHJvdXRlcyB1bmRlclxuICogdGhlIHBsdWdpbiBtb3VudCAodHlwaWNhbGx5IGAvYXBpL21hc3RyYWApLlxuICpcbiAqIEBleGFtcGxlIFJlZ2lzdGVyIHRoZSBwbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIGxha2ViYXNlIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgY3JlYXRlQWdlbnQsIG1hc3RyYSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiAvLyBgbGFrZWJhc2VgIGZpcnN0OiByZWdpc3RlcmluZyBpdCBhdXRvLWVuYWJsZXMgTWFzdHJhIHN0b3JhZ2UgKyBtZW1vcnkuXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgbGFrZWJhc2UoKSxcbiAqICAgICBtYXN0cmEoe1xuICogICAgICAgZ2VuaWVTcGFjZXM6IHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCEgfSxcbiAqICAgICAgIGFnZW50czogY3JlYXRlQWdlbnQoe1xuICogICAgICAgICBuYW1lOiBcImFuYWx5c3RcIixcbiAqICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBcIllvdSBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IHJldmVudWUgYW5kIHJldHVybnMuXCIsXG4gKiAgICAgICAgIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICAgICAgICByZXR1cm4geyAuLi5wbHVnaW5zLmdlbmllPy50b29sa2l0KCkgfTtcbiAqICAgICAgICAgfSxcbiAqICAgICAgIH0pLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBSZWFkIHRoZSBhZ2VudHMgYmFjayBvZmYgdGhlIEFwcEtpdCBpbnN0YW5jZVxuICogYGBgdHNcbiAqIGNvbnN0IGFnZW50SWRzID0gYXBwLm1hc3RyYS5saXN0KCk7XG4gKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhcHAubWFzdHJhLmxpc3RNb2RlbHMoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTWFzdHJhUGx1Z2luIGV4dGVuZHMgUGx1Z2luPE1hc3RyYVBsdWdpbkNvbmZpZz4ge1xuICAvLyBBbm5vdGF0ZWQgcmF0aGVyIHRoYW4gbGVmdCB0byBgc2F0aXNmaWVzYDogdGhlIGNvbmZpZyBzY2hlbWEncyB0eXBlIGNvbWVzXG4gIC8vIGZyb20gYEB0eXBlcy9qc29uLXNjaGVtYWAsIHdoaWNoIHRoaXMgcGFja2FnZSBkb2VzIG5vdCBkZXBlbmQgb24sIHNvIGFuXG4gIC8vIGluZmVycmVkIG1hbmlmZXN0IHR5cGUgY2Fubm90IGJlIG5hbWVkIGluIHRoZSBlbWl0dGVkIGRlY2xhcmF0aW9uLiBUaGVcbiAgLy8gYFBsdWdpbk1hbmlmZXN0PFwibWFzdHJhXCI+YCBwYXJhbWV0ZXIgc3RpbGwgY2FycmllcyB0aGUgbGl0ZXJhbCBuYW1lIGludG9cbiAgLy8gYHRvUGx1Z2luKClgJ3MgZmFjdG9yeSB0eXBlLlxuICBzdGF0aWMgbWFuaWZlc3Q6IFBsdWdpbk1hbmlmZXN0PFwibWFzdHJhXCI+ID0ge1xuICAgIG5hbWU6IFwibWFzdHJhXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiTWFzdHJhXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkJ1aWxkcyBhIE1hc3RyYSBBZ2VudCB3aXRoIHVzZXItc2NvcGVkIHdvcmtzcGFjZSBhdXRoIChhc1VzZXIpIFwiICtcbiAgICAgIFwiYW5kIG9wdGlvbmFsIFBvc3RncmVzLWJhY2tlZCBNYXN0cmEgTWVtb3J5IHZpYSB0aGUgYGxha2ViYXNlYCBwbHVnaW4uXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXG4gICAgICAgIC8vIFJldXNlIHRoZSBHZW5pZSBzcGFjZS1pZCBiaW5kaW5nIGRlY2xhcmVkIGJ5IEFwcEtpdCdzIGBnZW5pZWBcbiAgICAgICAgLy8gbWFuaWZlc3Qgc28gdGhlIHJlc291cmNlLWJpbmRpbmcgc2hhcGUgaXMgaWRlbnRpY2FsIHRvIEFwcEtpdCdzIGFuZFxuICAgICAgICAvLyBhbiBleGlzdGluZyBgYXBwLnlhbWxgIC8gYGdlbmllKHsgc3BhY2VzIH0pYCB3aXJpbmcga2VlcHMgd29ya2luZy5cbiAgICAgICAgLy8gVGhlIGJ1aWx0LWluIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaFxuICAgICAgICAvLyBgQGRieC10b29scy9nZW5pZWAsIHNvIG9ubHkgdGhlIGJpbmRpbmcgaXMgc2hhcmVkLCBub3QgdGhlIHBsdWdpbidzXG4gICAgICAgIC8vIHRvb2xzLlxuICAgICAgICAuLi5HRU5JRV9NQU5JRkVTVC5yZXNvdXJjZXMucmVxdWlyZWQsXG4gICAgICAgIC4uLkxBS0VCQVNFX01BTklGRVNULnJlc291cmNlcy5yZXF1aXJlZCxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBNQVNUUkFfQ09ORklHX1NDSEVNQSB9LFxuICB9O1xuXG4gIC8qKlxuICAgKiBUaWdodGVuIHJlc291cmNlIHJlcXVpcmVtZW50cyBiYXNlZCBvbiB3aGljaCBmZWF0dXJlcyBhcmUgZW5hYmxlZC5cbiAgICogQXBwS2l0IGNhbGxzIHRoaXMgYXQgcmVnaXN0cmF0aW9uIHRpbWUgKGNvbmZpZy1hd2FyZSkgc28gZGlzYWJsZWRcbiAgICogZmVhdHVyZXMgZG9uJ3Qgc3VyZmFjZSB0aGVpciByZXNvdXJjZSBhc2tzIHRvIHRoZSBob3N0IGFwcC5cbiAgICovXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IFJlc291cmNlUmVxdWlyZW1lbnRbXSB7XG4gICAgY29uc3QgcmVzb3VyY2VzOiBSZXNvdXJjZVJlcXVpcmVtZW50W10gPSBbXTtcbiAgICBjb25zdCBlbmFibGVkTWFuaWZlc3RzOiBQbHVnaW5NYW5pZmVzdDxzdHJpbmc+W10gPSBbXTtcblxuICAgIGlmIChuZWVkc0xha2ViYXNlKGNvbmZpZykpIHtcbiAgICAgIGVuYWJsZWRNYW5pZmVzdHMucHVzaChMQUtFQkFTRV9NQU5JRkVTVCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbSBvZiBlbmFibGVkTWFuaWZlc3RzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIG0ucmVzb3VyY2VzLnJlcXVpcmVkKSB7XG4gICAgICAgIHJlc291cmNlcy5wdXNoKHsgLi4ucmVzb3VyY2UsIHJlcXVpcmVkOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dnZXIgPSBsb2cubG9nZ2VyKHRoaXMpO1xuICBwcml2YXRlIGJ1aWx0OiBCdWlsdEFnZW50cyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hc3RyYTogTWFzdHJhIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFzdHJhQXBwOiBleHByZXNzLkV4cHJlc3MgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYXN0cmFTZXJ2ZXI6IE1hc3RyYVNlcnZlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogVGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXIgZXhwb3NpbmcgdGhpcyBwbHVnaW4ncyBhZ2VudHMgLyB0b29scywgb3JcbiAgICogYG51bGxgIHdoZW4gYGNvbmZpZy5tY3BgIGlzIGRpc2FibGVkICh0aGUgZGVmYXVsdCkuIEJ1aWx0IGluXG4gICAqIHtAbGluayBidWlsZEFnZW50QW5kU2VydmVyfSBhbmQgcmVnaXN0ZXJlZCBvbiB0aGUgTWFzdHJhIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBtY3A6IFJlc29sdmVkTWNwIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBSZXNvbHZlZCB7QGxpbmsgTWFzdHJhSWRlbnRpdHlNb2RlfTogdGhlIGlkZW50aXR5IHRoZSBjaGF0IHBhdGgncyBEYXRhYnJpY2tzXG4gICAqIGNhbGxzIHJ1biBhcy4gUmVhZCBvbmNlIGF0IHNldHVwIHNvIGFuIGludmFsaWQgYGdlbmllSWRlbnRpdHlgIGZhaWxzIHRoZSBhcHBcbiAgICogYm9vdCByYXRoZXIgdGhhbiB0aGUgZmlyc3QgcmVxdWVzdCwgYW5kIHNvIGV2ZXJ5IHJlcXVlc3QgYWdyZWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBpZGVudGl0eU1vZGU6IE1hc3RyYUlkZW50aXR5TW9kZSA9IFwidXNlclwiO1xuICAvKipcbiAgICogRGVkaWNhdGVkIHNlcnZpY2UtcHJpbmNpcGFsIExha2ViYXNlIHBvb2wgYmFja2luZyBNYXN0cmEgbWVtb3J5IC9cbiAgICogc3RvcmFnZS4gQnVpbHQgb25jZSBpbiB7QGxpbmsgYnVpbGRBZ2VudEFuZFNlcnZlcn0gKG91dHNpZGUgYW55XG4gICAqIGBhc1VzZXJgIHNjb3BlLCBzbyBpdCBuZXZlciBpbmhlcml0cyBhIHJlcXVlc3QncyBPQk8gaWRlbnRpdHkpIGFuZFxuICAgKiBkcmFpbmVkIGluIHtAbGluayBzaHV0ZG93bn0uIGBudWxsYCB1bnRpbCBzZXR1cCBydW5zIG9yIHdoZW5cbiAgICogTGFrZWJhc2UgaXNuJ3QgbmVlZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXJ2aWNlUHJpbmNpcGFsUG9vbDogUG9vbCB8IG51bGwgPSBudWxsO1xuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlc29sdmUgdGhlIGlkZW50aXR5IG1vZGUgdXAgZnJvbnQgc28gYW4gaW52YWxpZCBgZ2VuaWVJZGVudGl0eWAgZmFpbHMgdGhlXG4gICAgLy8gYXBwIGJvb3Qgd2l0aCBhIGNsZWFyIG1lc3NhZ2UgcmF0aGVyIHRoYW4gNTAwLWluZyB0aGUgZmlyc3QgY2hhdCByZXF1ZXN0LlxuICAgIHRoaXMuaWRlbnRpdHlNb2RlID0gcmVzb2x2ZUlkZW50aXR5TW9kZSh0aGlzLmNvbmZpZy5nZW5pZUlkZW50aXR5KTtcbiAgICAvLyBXYWl0IHVudGlsIHNpYmxpbmcgcGx1Z2lucyAoZS5nLiBgbGFrZWJhc2VgKSBmaW5pc2ggYHNldHVwKClgIHNvXG4gICAgLy8gdGhlIGxha2ViYXNlIHBvb2wgaXMgdmFsaWQgd2hlbiBzdG9yYWdlL21lbW9yeSBhcmUgZW5hYmxlZC5cbiAgICB0aGlzLmNvbnRleHQ/Lm9uTGlmZWN5Y2xlKFwic2V0dXA6Y29tcGxldGVcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5hcHBseUxha2ViYXNlQXV0b0RlZmF1bHRzKCk7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkQWdlbnRBbmRTZXJ2ZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoZSBjaGF0IHBhdGgncyBEYXRhYnJpY2tzIGNhbGxzIHNob3VsZCBydW4gdGhyb3VnaCBmb3JcbiAgICogYHJlcWAsIGhvbm9yaW5nIHtAbGluayBpZGVudGl0eU1vZGV9LlxuICAgKlxuICAgKiBJbiBgXCJ1c2VyXCJgIG1vZGUgKHRoZSBkZWZhdWx0KSB0aGlzIGlzIGB0aGlzLmFzVXNlcihyZXEpYCAtIEFwcEtpdCdzIG93blxuICAgKiBwcm94eSB0aGF0IHJ1bnMgZXZlcnkgY2FsbCBpbnNpZGUgYHJ1bkluVXNlckNvbnRleHRgLCBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYFxuICAgKiByZXR1cm5zIHRoZSBjYWxsZXIncyBPQk8gY2xpZW50LiBJbiBgXCJzZXJ2aWNlLXByaW5jaXBhbFwiYCBtb2RlIGl0IGlzIGB0aGlzYFxuICAgKiB1bndyYXBwZWQsIHNvIHRoZSBzYW1lIG1ldGhvZHMgcnVuIGluIHRoZSBhbWJpZW50IHNlcnZpY2UgY29udGV4dCBhbmRcbiAgICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsJ3MgY2xpZW50IC0gdGhlIHNhbWVcbiAgICogXCJqdXN0IGRvbid0IGVudGVyIGBhc1VzZXJgXCIgcGF0dGVybiBBcHBLaXQncyBvd24gc2VydmljZS1jb250ZXh0IGNhbGxzIHVzZS4gT25lXG4gICAqIGhlbHBlciBjb3ZlcnMgZXZlcnkgd29ya3NwYWNlIGNhbGwgdGhlIGNoYXQgcGF0aCBtYWtlcyAoc2VydmluZyBjYXRhbG9ndWUsXG4gICAqIEdlbmllIHN1Z2dlc3Rpb25zLCBgYXNrX2dlbmllYCB2aWEgdGhlIGRpc3BhdGNoZWQgYWdlbnQgdHVybiwgc3RhdGVtZW50IGZldGNoLFxuICAgKiBmZWVkYmFjayksIHNvIHRoZSBpZGVudGl0eSBkZWNpc2lvbiBsaXZlcyBpbiBvbmUgcGxhY2UuXG4gICAqL1xuICBwcml2YXRlIHNjb3BlZFNlbGYocmVxOiBleHByZXNzLlJlcXVlc3QpOiB0aGlzIHtcbiAgICByZXR1cm4gdXNlU2VydmljZVByaW5jaXBhbCh0aGlzLmlkZW50aXR5TW9kZSwgcmVxKSA/IHRoaXMgOiB0aGlzLmFzVXNlcihyZXEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQsIGF1dG8tZW5hYmxlIGBzdG9yYWdlYFxuICAgKiBhbmQgYG1lbW9yeWAgdW5sZXNzIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IGV4cGxpY2l0bHkgKGBmYWxzZWAgb3IgYVxuICAgKiBjdXN0b20gY29uZmlnIG9iamVjdCkuIFJ1biBhZnRlciBgc2V0dXA6Y29tcGxldGVgIHNvIHRoZSBsb29rdXBcbiAgICogaXMgcmVsaWFibGU6IGFueSBwbHVnaW4gdGhhdCByZWdpc3RlcnMgaXRzZWxmIHN5bmNocm9ub3VzbHkgaXNcbiAgICogYWxyZWFkeSBpbiB0aGUgcmVnaXN0cnkgYnkgdGhlIHRpbWUgdGhpcyBmaXJlcy5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlMYWtlYmFzZUF1dG9EZWZhdWx0cygpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNMYWtlYmFzZSA9IHBsdWdpbi5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICghaGFzTGFrZWJhc2UpIHJldHVybjtcbiAgICBpZiAodGhpcy5jb25maWcuc3RvcmFnZSA9PT0gdW5kZWZpbmVkKSB0aGlzLmNvbmZpZy5zdG9yYWdlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5jb25maWcubWVtb3J5ID09PSB1bmRlZmluZWQpIHRoaXMuY29uZmlnLm1lbW9yeSA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRHJhaW4gdGhlIG1lbW9yeSBzZXJ2aWNlLXByaW5jaXBhbCBwb29sLiBJZGVtcG90ZW50OiB0aGUgaGFuZGxlIGlzXG4gICAqIGNsZWFyZWQgYmVmb3JlIHRoZSBkcmFpbiBzdGFydHMsIHNvIGEgc2Vjb25kIGNhbGwgaXMgYSBuby1vcCBhbmQgYVxuICAgKiBsYXRlciBgc2V0dXAoKWAgcmVidWlsZHMgdGhlIHBvb2wuIEJvdW5kZWQgYnlcbiAgICoge0BsaW5rIFBPT0xfRFJBSU5fVElNRU9VVF9NU30gdG8gc3RheSB3ZWxsIGluc2lkZSB0aGUgMTVzIGdyYWNlZnVsXG4gICAqIHNodXRkb3duIGJ1ZGdldC5cbiAgICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvb2wgPSB0aGlzLnNlcnZpY2VQcmluY2lwYWxQb29sO1xuICAgIGlmICghcG9vbCkgcmV0dXJuO1xuICAgIHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wgPSBudWxsO1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXCJjbG9zaW5nIG1lbW9yeSBTUCBwb29sXCIpO1xuICAgIC8vIFRoZSBidWRnZXQgdGltZXIgaXMgY2FuY2VsbGVkIG9uIHRoZSB3YXkgb3V0IHNvIGEgZHJhaW4gdGhhdCBmaW5pc2hlZFxuICAgIC8vIGVhcmx5IGNhbm5vdCBob2xkIHRoZSBldmVudCBsb29wIG9wZW4gZm9yIHRoZSByZXN0IG9mIHRoZSB3aW5kb3cuXG4gICAgY29uc3QgYnVkZ2V0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJhY2UoW3Bvb2wuZW5kKCksIGFzeW5jLnNsZWVwKFBPT0xfRFJBSU5fVElNRU9VVF9NUywgYnVkZ2V0LnNpZ25hbCldKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFwiZXJyb3IgY2xvc2luZyBtZW1vcnkgU1AgcG9vbFwiLCB7XG4gICAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBidWRnZXQuYWJvcnQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgaW4tZmxpZ2h0IHdvcmsuIEFwcEtpdCdzIGdyYWNlZnVsIHNodXRkb3duIGNhbGxzIHRoaXMgaG9va1xuICAgKiBzeW5jaHJvbm91c2x5IGFuZCBuZXZlciBhd2FpdHMge0BsaW5rIHNodXRkb3dufSwgc28gdGhlIHBvb2wgZHJhaW4gaXNcbiAgICogc3RhcnRlZCBoZXJlIHRvbzsgaXQgY2Fubm90IGJlIGF3YWl0ZWQgZnJvbSBhIGB2b2lkYCBob29rLCBhbmRcbiAgICoge0BsaW5rIHNodXRkb3dufSBpcyBpZGVtcG90ZW50IHNvIHRoZSBkdXBsaWNhdGUgY2FsbCBpcyBmcmVlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZXhwb3J0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLyoqXG4gICAgICAgKiBJZHMgb2YgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBpbiByZWdpc3RyYXRpb24gb3JkZXIuIE1hdGNoZXNcbiAgICAgICAqIEFwcEtpdCBgYWdlbnRzLmxpc3QoKWAgc28gY2FsbGVycyBjYW4gaXRlcmF0ZSB0aGUgcmVnaXN0cnkgdGhlXG4gICAgICAgKiBzYW1lIHdheSB1bmRlciBib3RoIHBsdWdpbnMuXG4gICAgICAgKi9cbiAgICAgIGxpc3Q6ICgpOiBzdHJpbmdbXSA9PiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pLFxuICAgICAgLyoqXG4gICAgICAgKiBMb29rIHVwIGEgcmVnaXN0ZXJlZCBhZ2VudCBieSBpZC4gUmV0dXJucyBgbnVsbGAgKG5vdFxuICAgICAgICogdW5kZWZpbmVkKSB3aGVuIHVua25vd24gc28gY2FsbCBzaXRlcyBjYW4gZWFybHktcmV0dXJuIHdpdGhvdXRcbiAgICAgICAqIGEgc2VwYXJhdGUgYGluYCBjaGVjay5cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoaWQ6IHN0cmluZyk6IEFnZW50IHwgbnVsbCA9PiB0aGlzLmJ1aWx0Py5hZ2VudHNbaWRdID8/IG51bGwsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhZ2VudCB0aGUgY2xpZW50IGNvbnZlcnNlcyB3aXRoIHdoZW4gaXQgZG9lc24ndCBuYW1lIG9uZS5cbiAgICAgICAqIFJlc29sdmVzIHRvIGBjb25maWcuZGVmYXVsdEFnZW50YCwgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgaWQsIG9yXG4gICAgICAgKiB0aGUgYnVpbHQtaW4gYGRlZmF1bHRgIGZhbGxiYWNrLlxuICAgICAgICovXG4gICAgICBnZXREZWZhdWx0OiAoKTogQWdlbnQgfCBudWxsID0+XG4gICAgICAgICh0aGlzLmJ1aWx0ICYmIHRoaXMuYnVpbHQuYWdlbnRzW3RoaXMuYnVpbHQuZGVmYXVsdEFnZW50SWRdKSA/PyBudWxsLFxuICAgICAgLyoqIFVuZGVybHlpbmcgTWFzdHJhIGluc3RhbmNlIGZvciBhZHZhbmNlZCB1c2UgKGN1c3RvbSByb3V0ZXMgZXRjLikuICovXG4gICAgICBnZXRNYXN0cmE6ICgpID0+IHRoaXMubWFzdHJhLFxuICAgICAgLyoqXG4gICAgICAgKiBCdWlsZCB0aGUgYFJlcXVlc3RDb250ZXh0YCBhbiBhZ2VudCB0dXJuIGRyaXZlbiBmcm9tIE9VVFNJREUgdGhpc1xuICAgICAgICogcGx1Z2luJ3Mgcm91dGVzIG5lZWRzIChhIFRlYW1zIGFjdGl2aXR5IG9uIGFub3RoZXIgcGx1Z2luJ3MgZW5kcG9pbnQsIGFcbiAgICAgICAqIHNjaGVkdWxlZCBqb2IpLlxuICAgICAgICpcbiAgICAgICAqIE1hc3RyYSdzIHVzZXItc2NvcGVkIHRvb2xzIC0gYGFza19nZW5pZWAgbW9zdCB2aXNpYmx5IC0gcmVhZCB0aGUgQXBwS2l0XG4gICAgICAgKiB1c2VyIG9mZiB0aGUgcmVxdWVzdCBjb250ZXh0LCB3aGljaCBvbmx5IHRoZSBIVFRQIG1pZGRsZXdhcmUgc3RhbXBzLlxuICAgICAgICogQ2FsbGluZyBgYWdlbnQuZ2VuZXJhdGVgIHdpdGggYSByYXcgcHJvbXB0IHRoZXJlZm9yZSBhbnN3ZXJzIFwidGhlIGRhdGFcbiAgICAgICAqIHNvdXJjZSBpcyB1bnJlYWNoYWJsZVwiIHdoZXJlIHRoZSBjaGF0IHJvdXRlcyBhbnN3ZXIgd2l0aCByZWFsIGRhdGEuXG4gICAgICAgKiBQYXNzaW5nIHRoaXMgYXMgYHJlcXVlc3RDb250ZXh0YCBjbG9zZXMgdGhhdCBnYXAsIHNvIGFuIG91dC1vZi1iYW5kIHR1cm5cbiAgICAgICAqIGhhcyBleGFjdGx5IHRoZSBjYXBhYmlsaXRpZXMgYSBjaGF0IHR1cm4gaGFzLlxuICAgICAgICpcbiAgICAgICAqIE11c3QgYmUgY2FsbGVkIElOU0lERSBhbiBgYXNVc2VyKHJlcSlgIHNjb3BlIHRvIGluaGVyaXQgdGhlIGNhbGxlcidzXG4gICAgICAgKiBPQk8gaWRlbnRpdHk7IG91dHNpZGUgb25lIGl0IHJlc29sdmVzIHRvIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC5cbiAgICAgICAqL1xuICAgICAgY3JlYXRlUmVxdWVzdENvbnRleHQ6IChcbiAgICAgICAgb3B0aW9uczogeyB0aHJlYWRJZD86IHN0cmluZzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nIH0gPSB7fSxcbiAgICAgICk6IFByb21pc2U8UmVxdWVzdENvbnRleHQ+ID0+IGNyZWF0ZVJlcXVlc3RDb250ZXh0KG9wdGlvbnMpLFxuICAgICAgLyoqXG4gICAgICAgKiBNQ1AgZW5kcG9pbnQgaW5mbyB3aGVuIGBjb25maWcubWNwYCBpcyBlbmFibGVkLCBlbHNlIGBudWxsYC5cbiAgICAgICAqIFN0cmVhbWFibGUgSFRUUCBpcyBgaHR0cGA7IHRoZSBTU0UgcGFpciBpcyB0aGUgbGVnYWN5IHRyYW5zcG9ydC5cbiAgICAgICAqXG4gICAgICAgKiBFYWNoIHBhdGggaXMgZ2l2ZW4gdHdpY2U6IG1vdW50LXJlbGF0aXZlIChgaHR0cFBhdGhgLCBgc3NlUGF0aGAsXG4gICAgICAgKiBgbWVzc2FnZVBhdGhgKSBmb3IgYW55dGhpbmcgdGhhdCBhbHJlYWR5IGtub3dzIHdoZXJlIHRoZSBwbHVnaW4gaXNcbiAgICAgICAqIG1vdW50ZWQsIGFuZCBhYnNvbHV0ZSAoYGh0dHBgLCBgc3NlYCwgYG1lc3NhZ2VzYCkgZm9yIE1DUCBjbGllbnRzLFxuICAgICAgICogd2hpY2ggdGFrZSBhIHNpbmdsZSBVUkwgYW5kIGNhbm5vdCBjb21wb3NlIG9uZS4gVGhlIGFic29sdXRlIGZvcm0gaXNcbiAgICAgICAqIGJ1aWx0IGZyb20ge0BsaW5rIGJhc2VQYXRofSwgc28gaXQgaG9ub3JzIGEgYGNvbmZpZy5uYW1lYCBvdmVycmlkZSBidXRcbiAgICAgICAqIHN0aWxsIGFzc3VtZXMgQXBwS2l0J3MgZGVmYXVsdCBgL2FwaS88bmFtZT5gIG1vdW50LlxuICAgICAgICovXG4gICAgICBnZXRNY3A6ICgpOiB7XG4gICAgICAgIHNlcnZlcklkOiBzdHJpbmc7XG4gICAgICAgIGh0dHBQYXRoOiBzdHJpbmc7XG4gICAgICAgIHNzZVBhdGg6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZVBhdGg6IHN0cmluZztcbiAgICAgICAgaHR0cDogc3RyaW5nO1xuICAgICAgICBzc2U6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZXM6IHN0cmluZztcbiAgICAgIH0gfCBudWxsID0+XG4gICAgICAgIHRoaXMubWNwXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHNlcnZlcklkOiB0aGlzLm1jcC5zZXJ2ZXJJZCxcbiAgICAgICAgICAgICAgaHR0cFBhdGg6IHRoaXMubWNwLmh0dHBQYXRoLFxuICAgICAgICAgICAgICBzc2VQYXRoOiB0aGlzLm1jcC5zc2VQYXRoLFxuICAgICAgICAgICAgICBtZXNzYWdlUGF0aDogdGhpcy5tY3AubWVzc2FnZVBhdGgsXG4gICAgICAgICAgICAgIGh0dHA6IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5odHRwUGF0aH1gLFxuICAgICAgICAgICAgICBzc2U6IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5zc2VQYXRofWAsXG4gICAgICAgICAgICAgIG1lc3NhZ2VzOiBgJHt0aGlzLmJhc2VQYXRofSR7dGhpcy5tY3AubWVzc2FnZVBhdGh9YCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGwsXG4gICAgICAvKiogRXhwcmVzcyBzdWJhcHAgTWFzdHJhIGlzIG1vdW50ZWQgb247IG1vc3RseSBmb3IgdGVzdHMuICovXG4gICAgICBnZXRNYXN0cmFTZXJ2ZXI6ICgpID0+IHRoaXMubWFzdHJhU2VydmVyLFxuICAgICAgLyoqXG4gICAgICAgKiBGZXRjaCB0aGUgd29ya3NwYWNlJ3MgTW9kZWwgU2VydmluZyBlbmRwb2ludHMgKGNhY2hlZCkuIFNhbWVcbiAgICAgICAqIHBheWxvYWQgdGhlIGBHRVQgL21vZGVsc2Agcm91dGUgcmV0dXJuczsgc3VyZmFjZWQgaGVyZSBzb1xuICAgICAgICogb3RoZXIgcGx1Z2lucyAvIHNjcmlwdHMgY2FuIGludHJvc3BlY3QgdGhlIGNhdGFsb2d1ZSB3aXRob3V0XG4gICAgICAgKiBhbiBIVFRQIHJvdW5kLXRyaXAuIEFwcEtpdCB3cmFwcyB0aGlzIHdpdGggYGFzVXNlcihyZXEpYCBmb3JcbiAgICAgICAqIE9CTyBzY29waW5nIGF1dG9tYXRpY2FsbHkuIFRocm93cyB3aGVuIHRoZSBsaXN0aW5nIGZhaWxzLCBzaW5jZVxuICAgICAgICogdGhlcmUgaXMgbm8gc3RhdHVzIGNvZGUgdG8gaGFuZCBiYWNrIG9uIHRoaXMgc3VyZmFjZS5cbiAgICAgICAqL1xuICAgICAgbGlzdE1vZGVsczogKCk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiA9PiB0aGlzLmxpc3RNb2RlbHMoKSxcbiAgICAgIC8qKlxuICAgICAgICogRm9yY2UtZXZpY3QgY2FjaGVkIGVuZHBvaW50IGxpc3RpbmdzIHZpYSBBcHBLaXQnc1xuICAgICAgICogYENhY2hlTWFuYWdlcmAuIFVzZWZ1bCBpbiB0ZXN0cyBvciByaWdodCBhZnRlciBhbiBhZG1pblxuICAgICAgICogZGVwbG95cyBhIG5ldyBlbmRwb2ludCBhbmQgZG9lc24ndCB3YW50IHRvIHdhaXQgZm9yIHRoZSBUVEwuXG4gICAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGBDYWNoZU1hbmFnZXIuZGVsZXRlYC9gY2xlYXJgIHByb21pc2UuXG4gICAgICAgKi9cbiAgICAgIGNsZWFyTW9kZWxzQ2FjaGU6IChob3N0Pzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgICAgICBub2RlU2VydmluZy5jbGVhclNlcnZpbmdFbmRwb2ludHNDYWNoZShob3N0KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIG1vdW50IHRoaXMgcGx1Z2luJ3Mgcm91dGVzIGFuc3dlciBvbi4gQXBwS2l0IG1vdW50cyBldmVyeSBwbHVnaW5cbiAgICogYXQgYC9hcGkvPHBsdWdpbi5uYW1lPmAgYW5kIGB0aGlzLm5hbWVgIGhvbm9ycyBhIGBjb25maWcubmFtZWAgb3ZlcnJpZGUsXG4gICAqIHNvIHRoZSBwZXItcm91dGUgc2VnbWVudHMgKGByb3V0ZXMuTUFTVFJBX1JPVVRFU2ApIGhhbmcgb2ZmIHRoaXMuXG4gICAqL1xuICBwcml2YXRlIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgL2FwaS8ke3RoaXMubmFtZX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICAvLyBQdWJsaXNoaW5nIGBiYXNlUGF0aGAgaXMgZW5vdWdoIGZvciB0aGUgY2xpZW50IHRvIHN0YXkgY29ycmVjdCB1bmRlciBhXG4gICAgLy8gY3VzdG9tIG1vdW50IGlkOiB0aGUgcGVyLXJvdXRlIHNlZ21lbnRzIGFyZSBmaXhlZFxuICAgIC8vIChgcm91dGVzLk1BU1RSQV9ST1VURVNgKSBhbmQgdGhlIGNsaWVudCAoYE1hc3RyYVBsdWdpbkNsaWVudGApIGRlcml2ZXNcbiAgICAvLyBldmVyeSBlbmRwb2ludCBmcm9tIGBiYXNlUGF0aGAuXG4gICAgLy8gUmV0dXJuIHdpZGVucyB0byBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIHRvIHNhdGlzZnkgdGhlXG4gICAgLy8gYmFzZS1jbGFzcyBzaWduYXR1cmU7IGNvbnN1bWVycyByZWFkIGl0IHRocm91Z2ggdGhlIHR5cGVkXG4gICAgLy8gYE1hc3RyYUNsaWVudENvbmZpZ2Agc2hhcGUgdmlhIGB1c2VQbHVnaW5DbGllbnRDb25maWc8Li4uPiguLi4pYC5cbiAgICBjb25zdCBjb25maWc6IE1hc3RyYUNsaWVudENvbmZpZyA9IHtcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgZGVmYXVsdEFnZW50OiB0aGlzLmJ1aWx0Py5kZWZhdWx0QWdlbnRJZCA/PyBGQUxMQkFDS19BR0VOVF9JRCxcbiAgICAgIGFnZW50czogT2JqZWN0LmtleXModGhpcy5idWlsdD8uYWdlbnRzID8/IHt9KSxcbiAgICAgIGZlZWRiYWNrRW5hYmxlZDogdGhpcy5mZWVkYmFja0VuYWJsZWQoKSxcbiAgICAgIC8vIEluIGBzZXJ2aWNlLXByaW5jaXBhbGAgbW9kZSB0aGUgY2hhdCB3b3JrcyBmb3IgYW55IGNhbGxlciB3aG8gY2FuIG9wZW5cbiAgICAgIC8vIHRoZSBhcHAsIHNvIGEgVUkgdGhhdCBoaWRlcyBjaGF0IGJlaGluZCBhbiBPQk8tdG9rZW4gcHJvYmUgc2hvdWxkIHNob3dcbiAgICAgIC8vIGl0IHJlZ2FyZGxlc3MuIGBcInVzZXJcImAgbW9kZSBrZWVwcyB0aGUgT0JPLWdhdGVkIGJlaGF2aW9yLlxuICAgICAgY2hhdEFsd2F5c0F2YWlsYWJsZTogdGhpcy5pZGVudGl0eU1vZGUgPT09IFwic2VydmljZS1wcmluY2lwYWxcIixcbiAgICB9O1xuICAgIHJldHVybiBjb25maWcgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHVzZXIgZmVlZGJhY2sgY2FuIGJlIGxvZ2dlZCB0byBNTGZsb3cuIERlbGVnYXRlcyB0b1xuICAgKiB7QGxpbmsgcmVzb2x2ZUZlZWRiYWNrRW5hYmxlZH0gc28gdGhlIGNsaWVudC1jb25maWcgZmxhZyBhbmQgdGhlXG4gICAqIGZlZWRiYWNrIHJvdXRlIHNoYXJlIHRoZSBzYW1lIGdhdGUgYXMgdGhlIHNlcnZlcidzIHRyYWNlLWlkIGhlYWRlci5cbiAgICovXG4gIHByaXZhdGUgZmVlZGJhY2tFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvbHZlRmVlZGJhY2tFbmFibGVkKHRoaXMuY29uZmlnLmZlZWRiYWNrKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICAvLyBFeHBvc2UgdGhlIE1DUCB0cmFuc3BvcnQgYXQgdGhlIGNsZWFuIGAvbWNwYCAocGx1cyB0aGUgbGVnYWN5XG4gICAgLy8gYC9zc2VgICsgYC9tZXNzYWdlc2ApIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIGBAbWFzdHJhL2V4cHJlc3NgXG4gICAgLy8gbW91bnRzIE1DUCB1bmRlciBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YCwgYW5kIHRoZSBzZXJ2ZXJJZFxuICAgIC8vIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSwgc28gdGhlIHJhdyByb3V0ZSByZWFkc1xuICAgIC8vIGAvYXBpL21hc3RyYS9tY3AvbWFzdHJhL21jcGAgKGRvdWJsZWQgc2VnbWVudCkuIFRoaXMgcnVucyBiZWZvcmVcbiAgICAvLyB0aGUgY2F0Y2gtYWxsIGFuZCByZXdyaXRlcyB0aGUgYWxpYXMgdG8gdGhlIHVuZGVybHlpbmcgcm91dGUsIHNvXG4gICAgLy8gdGhlIHB1YmxpYyBwYXRoIGlzIGp1c3QgYC9hcGkvPHBsdWdpbj4vbWNwYDsgdGhlIHF1ZXJ5IHN0cmluZ1xuICAgIC8vIChlLmcuIHRoZSBTU0UgYHNlc3Npb25JZGApIGlzIHByZXNlcnZlZC5cbiAgICAvL1xuICAgIC8vIE1pZGRsZXdhcmUgcmF0aGVyIHRoYW4gYHRoaXMucm91dGVgOiBpdCByZXdyaXRlcyB0aGUgVVJMIGZvciByb3V0ZXNcbiAgICAvLyBgQG1hc3RyYS9leHByZXNzYCBvd25zIGZ1cnRoZXIgZG93biB0aGUgY2hhaW4gaW5zdGVhZCBvZiBhbnN3ZXJpbmcgdGhlXG4gICAgLy8gcmVxdWVzdCwgd2hpY2ggYFJvdXRlQ29uZmlnYCBoYXMgbm8gc2hhcGUgZm9yLlxuICAgIHJvdXRlci51c2UoKHJlcSwgX3JlcywgbmV4dCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5tY3BSb3V0ZUFsaWFzKHJlcS5wYXRoKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgcSA9IHJlcS51cmwuaW5kZXhPZihcIj9cIik7XG4gICAgICAgIHJlcS51cmwgPSBxID49IDAgPyB0YXJnZXQgKyByZXEudXJsLnNsaWNlKHEpIDogdGFyZ2V0O1xuICAgICAgfVxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuXG4gICAgLy8gYEdFVCAvbW9kZWxzYCBleHBvc2VzIHRoZSBjYWNoZWQgZW5kcG9pbnQgbGlzdCBzbyBjbGllbnRzIGNhblxuICAgIC8vIHBvcHVsYXRlIG1vZGVsIHBpY2tlcnMsIHZhbGlkYXRlIGA/bW9kZWw9YCBjaG9pY2VzLCBldGMuIE11c3RcbiAgICAvLyBiZSByZWdpc3RlcmVkIGJlZm9yZSB0aGUgY2F0Y2gtYWxsIHRoYXQgZm9yd2FyZHMgZXZlcnl0aGluZyB0b1xuICAgIC8vIHRoZSBNYXN0cmEgc3ViYXBwLlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcIm1vZGVsc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMubW9kZWxzLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2NvcGVkU2VsZihyZXEpLmxpc3RNb2RlbHNSZXN1bHQoKTtcbiAgICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgICB0aGlzLnNlbmRGYWlsdXJlKHJlcywgcmVzdWx0LCBcIm1vZGVsc1wiLCBNT0RFTF9DQVRBTE9HVUVfRkFJTEVEX01FU1NBR0UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXMuanNvbih7IGVuZHBvaW50czogcmVzdWx0LmRhdGEgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gYEdFVCAvZGVmYXVsdC1tb2RlbGAgKGFuZCBgL2RlZmF1bHQtbW9kZWwvOmFnZW50SWRgKSByZXBvcnRzIHRoZSBzdGF0aWNcbiAgICAvLyBzZXJ2aW5nLWVuZHBvaW50IGFuIGFnZW50IGZhbGxzIGJhY2sgdG8gd2hlbiB0aGUgY2xpZW50IHBpbnMgbm8gbW9kZWwsXG4gICAgLy8gc28gdGhlIHBpY2tlciBjYW4gbGFiZWwgaXRzIGRlZmF1bHQgb3B0aW9uIHdpdGggdGhlIG1vZGVsJ3MgaHVtYW5pemVkXG4gICAgLy8gbmFtZS4gQWdlbnQtc2NvcGVkIHZpYSB0aGUgb3B0aW9uYWwgYC86YWdlbnRJZGAgc3VmZml4IChVUkwgc3ltbWV0cnlcbiAgICAvLyB3aXRoIHRoZSBoaXN0b3J5IC8gdGhyZWFkcyAvIHN1Z2dlc3Rpb25zIHJvdXRlcyksIGRlZmF1bHRpbmcgdG8gdGhlXG4gICAgLy8gZGVmYXVsdCBhZ2VudC4gYG1vZGVsYCAvIGBkaXNwbGF5TmFtZWAgYXJlIG51bGwgd2hlbiB0aGUgYWdlbnQgaGFzIG5vXG4gICAgLy8gc3RhdGljIGRlZmF1bHQgKGEgZHluYW1pYywgY2FsbC10aW1lIG1vZGVsKTsgYW4gdW5rbm93biBhZ2VudCBpZCBpcyBhXG4gICAgLy8gNDA0LCBtYXRjaGluZyB0aGUgaGlzdG9yeSAvIHRocmVhZHMgcm91dGVzLiBSZWFkcyBvbmx5IGluLW1lbW9yeSBidWlsZFxuICAgIC8vIHN0YXRlLCBzbyBpdCBuZWVkcyBubyBPQk8gc2NvcGluZy4gUmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGNhdGNoLWFsbCxcbiAgICAvLyBzYW1lIGFzIGAvbW9kZWxzYC5cbiAgICBjb25zdCBoYW5kbGVEZWZhdWx0TW9kZWwgPSBhc3luYyAoXG4gICAgICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IHN0cmluZy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMuYWdlbnRJZCk7XG4gICAgICBpZiAocmVxdWVzdGVkICE9PSBudWxsICYmICF0aGlzLmJ1aWx0Py5hZ2VudHNbcmVxdWVzdGVkXSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiB0aGlzLnVua25vd25BZ2VudE1lc3NhZ2UocmVxdWVzdGVkKSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYWdlbnRJZCA9IHJlcXVlc3RlZCA/PyB0aGlzLmJ1aWx0Py5kZWZhdWx0QWdlbnRJZCA/PyBGQUxMQkFDS19BR0VOVF9JRDtcbiAgICAgIGNvbnN0IHJhdyA9IHRoaXMuYnVpbHQ/LmRlZmF1bHRNb2RlbHNbYWdlbnRJZF07XG4gICAgICAvLyBgXCI8ZHluYW1pYz5cImAgKGEgY2FsbC10aW1lIGZ1bmN0aW9uKSBoYXMgbm8gZml4ZWQgaWQgdG8gYWR2ZXJ0aXNlLlxuICAgICAgY29uc3QgbW9kZWwgPSByYXcgJiYgcmF3ICE9PSBcIjxkeW5hbWljPlwiID8gcmF3IDogbnVsbDtcbiAgICAgIC8vIFJldHVybiB0aGUgaHVtYW5pemVkIGxhYmVsIHRvbywgc28gdGhlIHBpY2tlciBzaG93cyBhIGZyaWVuZGx5IG5hbWUgb25cbiAgICAgIC8vIGxvYWQgd2l0aG91dCB3YWl0aW5nIG9uIHRoZSBgL21vZGVsc2AgY2F0YWxvZ3VlIChubyByYXctaWQgZmxhc2gpLlxuICAgICAgcmVzLmpzb24oe1xuICAgICAgICBhZ2VudElkLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgZGlzcGxheU5hbWU6IG1vZGVsID8gZGlzcGxheS50b01vZGVsRGlzcGxheU5hbWUobW9kZWwpIDogbnVsbCxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdE1vZGVsXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiByb3V0ZXMuTUFTVFJBX1JPVVRFUy5kZWZhdWx0TW9kZWwsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVEZWZhdWx0TW9kZWwsXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdE1vZGVsQnlBZ2VudFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuZGVmYXVsdE1vZGVsfS86YWdlbnRJZGAsXG4gICAgICBoYW5kbGVyOiBoYW5kbGVEZWZhdWx0TW9kZWwsXG4gICAgfSk7XG5cbiAgICAvLyBgR0VUIC9lbWJlZC86dHlwZS86aWRgIGlzIHRoZSBzaW5nbGUgcmVzb2x2ZXIgZm9yIGV2ZXJ5IGVtYmVkXG4gICAgLy8gbWFya2VyIHRoZSBhZ2VudCBlbWl0cyBpbiBwcm9zZSAoYFtjaGFydDo8aWQ+XWAsXG4gICAgLy8gYFtkYXRhOjxpZD5dYCwgLi4uKS4gYDp0eXBlYCBzZWxlY3RzIGEgcmVzb2x2ZXIgZnJvbSB0aGVcbiAgICAvLyByZWdpc3RyeSBiZWxvdzsgYDppZGAgaXMgdGhhdCByZXNvbHZlcidzIGxvb2t1cCBrZXkuIFRoZVxuICAgIC8vIGdyYW1tYXIgKHNlZSBgbWFya2VyLnRzYCkgaXMgdHlwZS1hZ25vc3RpYyBvbiBwdXJwb3NlIC0gbmV3XG4gICAgLy8gZW1iZWQga2luZHMgYXJlIGFkZGVkIGJ5IHJlZ2lzdGVyaW5nIGEgcmVzb2x2ZXIgaGVyZSwgd2l0aCBub1xuICAgIC8vIGNsaWVudCBvciBncmFtbWFyIGNoYW5nZS5cbiAgICAvL1xuICAgIC8vIFN0YXR1cyBjb2RlczpcbiAgICAvLyAgIC0gMjAwIHdpdGggdGhlIHJlc29sdmVyJ3MgSlNPTiBib2R5IHdoZW4gdGhlIGlkIHJlc29sdmVzLlxuICAgIC8vICAgLSA0MDQgd2hlbiBgOnR5cGVgIGlzbid0IHJlZ2lzdGVyZWQgKHVuc3VwcG9ydGVkIGVtYmVkXG4gICAgLy8gICAgIHR5cGUpIE9SIGEgcmVnaXN0ZXJlZCByZXNvbHZlciBjYW4ndCBmaW5kIGA6aWRgICh1bmtub3duXG4gICAgLy8gICAgIC8gZXhwaXJlZCAtIGUuZy4gYSBjaGFydCBwYXN0IGl0cyAxaCBUVEwgb3IgYSBmYWJyaWNhdGVkXG4gICAgLy8gICAgIGlkIHRoZSBtb2RlbCBuZXZlciBtaW50ZWQpLlxuICAgIC8vICAgLSA0MDAgd2hlbiBgOmlkYCBpcyBlbXB0eS5cbiAgICAvL1xuICAgIC8vIFBlci10eXBlIHF1ZXJ5IGtub2JzIGFuZCBiZWhhdmlvcjpcbiAgICAvLyAgIC0gYGNoYXJ0YDogbG9uZy1wb2xscyB0aGUgY2hhcnQgY2FjaGUgdW50aWwgdGhlIGVudHJ5XG4gICAgLy8gICAgIHNldHRsZXMgKGByZXN1bHRgIC8gYGVycm9yYCkgb3IgdGhlIGJ1ZGdldCBlbGFwc2VzICh0aGVuXG4gICAgLy8gICAgIHJldHVybnMgdGhlIHN0aWxsLXByb2Nlc3NpbmcgZW50cnkgdG8gcG9sbCBhZ2FpbikuXG4gICAgLy8gICAgIGA/dGltZW91dE1zPTxuPmAgKGRlZmF1bHQgNjBzLCBjYXBwZWQgNW1pbikgdHVuZXMgaXQuXG4gICAgLy8gICAtIGBkYXRhYDogb25lIE9CTy1zY29wZWQgU3RhdGVtZW50IEV4ZWN1dGlvbiBmZXRjaC5cbiAgICAvLyAgICAgYD9saW1pdD08bj5gIGNhcHMgcm93cyAoY2xhbXBlZCB0byBTVEFURU1FTlRfUk9XX0NBUCkuXG4gICAgLy9cbiAgICAvLyBCdWlsdCBvbmNlICh0aGlzIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBvbmNlKSBhbmQga2V5ZWQgYnkgdGhlXG4gICAgLy8gcmF3IGA6dHlwZWAgdG9rZW4uIEVhY2ggcmVzb2x2ZXIgZ2V0cyB0aGUgcmVxdWVzdCAoZm9yIHF1ZXJ5XG4gICAgLy8gcGFyc2luZyArIE9CTyBzY29waW5nKSBhbmQgYW4gYEFib3J0U2lnbmFsYCBicmlkZ2VkIG9mZiB0aGVcbiAgICAvLyBjb25uZWN0aW9uIGBjbG9zZWAgZXZlbnQgc28gYSBsb25nLXBvbGwgdW5ibG9ja3MgdGhlIGluc3RhbnRcbiAgICAvLyB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiBgdW5kZWZpbmVkYCBmcm9tIGEgcmVzb2x2ZXIgbWFwcyB0byBhXG4gICAgLy8gY2xlYW4gNDA0OyB0aHJvd24gZXJyb3JzIGJ1YmJsZSB0aHJvdWdoIGBuZXh0KGVycilgLlxuICAgIGNvbnN0IGVtYmVkUmVzb2x2ZXJzOiBSZWNvcmQ8c3RyaW5nLCBFbWJlZFJlc29sdmVyPiA9IHtcbiAgICAgIGNoYXJ0OiAocmVxLCBpZCwgc2lnbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVvdXRNcyA9IHBhcnNlVGltZW91dE1zKHJlcS5xdWVyeS50aW1lb3V0TXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5zY29wZWRTZWxmKHJlcSkuZmV0Y2hDaGFydEVudHJ5KHJlcSwgaWQsIHtcbiAgICAgICAgICAuLi4odGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNcyB9IDoge30pLFxuICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZGF0YTogKHJlcSwgaWQsIHNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCBsaW1pdCA9IHBhcnNlU3RhdGVtZW50TGltaXQocmVxLnF1ZXJ5LmxpbWl0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NvcGVkU2VsZihyZXEpLmZldGNoU3RhdGVtZW50KGlkLCB7XG4gICAgICAgICAgLi4uKGxpbWl0ICE9PSB1bmRlZmluZWQgPyB7IGxpbWl0IH0gOiB7fSksXG4gICAgICAgICAgc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImVtYmVkXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy5lbWJlZH0vOnR5cGUvOmlkYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gc3RyaW5nLmZpcnN0Tm9uRW1wdHkocmVxLnBhcmFtcy50eXBlKSA/PyBcIlwiO1xuICAgICAgICBjb25zdCBpZCA9IHN0cmluZy5maXJzdE5vbkVtcHR5KHJlcS5wYXJhbXMuaWQpO1xuICAgICAgICBjb25zdCByZXNvbHZlID0gZW1iZWRSZXNvbHZlcnNbdHlwZV07XG4gICAgICAgIGlmICghcmVzb2x2ZSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJlbWJlZDp1bnN1cHBvcnRlZFwiLCB7XG4gICAgICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGB1bnN1cHBvcnRlZCBlbWJlZCB0eXBlOiAke3R5cGV9YCB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJlbWJlZDppbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHJlcS5wYXRoLFxuICAgICAgICAgICAgZXJyb3I6IFwiaWQgaXMgcmVxdWlyZWRcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiBcImlkIGlzIHJlcXVpcmVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cHJlc3MncyBgcmVxYCBwcmVkYXRlcyBgQWJvcnRTaWduYWxgOyBicmlkZ2UgdGhlIGBjbG9zZWBcbiAgICAgICAgLy8gZXZlbnQgb250byBhbiBgQWJvcnRDb250cm9sbGVyYCBzbyBhIGNsb3NlZCBjb25uZWN0aW9uXG4gICAgICAgIC8vIHVuYmxvY2tzIGFueSBsb25nLXBvbGwgaW1tZWRpYXRlbHkgYW5kIGZyZWVzIHRoZSByZXF1ZXN0XG4gICAgICAgIC8vIHRocmVhZC4gVGhlIGxpc3RlbmVyIGlzIEdDJ2Qgd2l0aCB0aGUgcmVxdWVzdCBvbiBub3JtYWxcbiAgICAgICAgLy8gY29tcGxldGlvbi5cbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgcmVxLm9uKFwiY2xvc2VcIiwgKCkgPT4gY29udHJvbGxlci5hYm9ydCgpKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzb2x2ZShyZXEsIGlkLCBjb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICAgIGlmICghcmVzdWx0Lm9rKSB7XG4gICAgICAgICAgdGhpcy5zZW5kRmFpbHVyZShyZXMsIHJlc3VsdCwgYGVtYmVkOiR7dHlwZX1gLCBgQ291bGQgbm90IHJlc29sdmUgdGhlICR7dHlwZX0gZW1iZWRgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBBIGNhY2hlIG1pc3MgaXMgc2VjdXJpdHktZGVsaWJlcmF0ZWx5IGFtYmlndW91czogdW5rbm93biwgZXhwaXJlZCxcbiAgICAgICAgICAvLyBvciBvd25lZCBieSBhbm90aGVyIGlkZW50aXR5IGFsbCBtYXAgdG8gdGhlIHNhbWUgNDA0LiBMb2cgdGhlXG4gICAgICAgICAgLy8gb3BhcXVlIGlkIGFuZCB0aG9zZSBwb3NzaWJsZSBjYXVzZXMgc28gYSBmYWJyaWNhdGVkIG1hcmtlciBpc1xuICAgICAgICAgIC8vIGRpYWdub3NhYmxlIGZyb20gdGhlIHNlcnZlciB3aXRob3V0IGRpc2Nsb3Npbmcgd2hpY2ggY2F1c2UgYXBwbGllZC5cbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBlbWJlZDoke3R5cGV9Om5vdC1mb3VuZGAsIHtcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgICByZWFzb246IFwidW5rbm93biwgZXhwaXJlZCwgb3Igb3duZWQgYnkgYW5vdGhlciBpZGVudGl0eVwiLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGAke3R5cGV9IG5vdCBmb3VuZGAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlcy5qc29uKHJlc3VsdC5kYXRhKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBgR0VUIC9zdWdnZXN0aW9uc2AgKGFuZCBgL3N1Z2dlc3Rpb25zLzphZ2VudElkYCkgcmV0dXJucyB0aGVcbiAgICAvLyBjdXJhdGVkIHN0YXJ0ZXIgcXVlc3Rpb25zIGZvciB0aGUgYWdlbnQncyBHZW5pZSBzcGFjZShzKSAtIHRoZVxuICAgIC8vIGF1dGhvci1jb25maWd1cmVkIGBzYW1wbGVfcXVlc3Rpb25zYCwgc3VyZmFjZWQgYXMgb25lLXRhcFxuICAgIC8vIHByb21wdHMgb24gdGhlIGNoYXQgZW1wdHkgc3RhdGUuIFJldHVybnMgYHsgcXVlc3Rpb25zOiBbXSB9YFxuICAgIC8vIHdoZW4gbm8gR2VuaWUgc3BhY2UgaXMgd2lyZWQgc28gdGhlIGNsaWVudCByZW5kZXJzIGEgYmFyZVxuICAgIC8vIGVtcHR5IHN0YXRlIChubyBidWlsdC1pbiBleGFtcGxlIHByb21wdHMpLiBUaGUgYDphZ2VudElkYFxuICAgIC8vIHNlZ21lbnQgaXMgYWNjZXB0ZWQgZm9yIFVSTCBzeW1tZXRyeSB3aXRoIHRoZSBjaGF0IC8gaGlzdG9yeVxuICAgIC8vIHJvdXRlczsgR2VuaWUgc3BhY2VzIGFyZSByZXNvbHZlZCBwZXItcGx1Z2luLCBub3QgcGVyLWFnZW50LFxuICAgIC8vIHNvIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSByZXN1bHQuIE9CTy1zY29wZWQgbGlrZSB0aGUgb3RoZXJcbiAgICAvLyBkYXRhIHJvdXRlcyBzbyB0aGUgc3BhY2UgbG9va3VwIHJ1bnMgYXMgdGhlIGNhbGxpbmcgdXNlci5cbiAgICBjb25zdCBoYW5kbGVTdWdnZXN0aW9ucyA9IGFzeW5jIChcbiAgICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgICAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHJlcS5vbihcImNsb3NlXCIsICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNjb3BlZFNlbGYocmVxKS5mZXRjaFN1Z2dlc3Rpb25zKGNvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAvLyBTdWdnZXN0aW9ucyBhcmUgYSBub24tY3JpdGljYWwgZW5oYW5jZW1lbnQ7IGEgbG9va3VwIGZhaWx1cmUgc2hvdWxkXG4gICAgICAgIC8vIGxlYXZlIHRoZSBjaGF0IHVzYWJsZSB3aXRoIGEgYmFyZSBlbXB0eSBzdGF0ZSByYXRoZXIgdGhhbiBzdXJmYWNpbmdcbiAgICAgICAgLy8gdGhlIHVwc3RyZWFtIHN0YXR1cy4gTG9nIGFuZCBkZWdyYWRlLlxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwic3VnZ2VzdGlvbnM6ZXJyb3JcIiwge1xuICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICBlcnJvcjogcmVzdWx0Lm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXMuanNvbih7IHF1ZXN0aW9uczogW10gfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5qc29uKHsgcXVlc3Rpb25zOiByZXN1bHQuZGF0YSB9KTtcbiAgICB9O1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN1Z2dlc3Rpb25zXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiByb3V0ZXMuTUFTVFJBX1JPVVRFUy5zdWdnZXN0aW9ucyxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZVN1Z2dlc3Rpb25zLFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN1Z2dlc3Rpb25zQnlBZ2VudFwiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogYCR7cm91dGVzLk1BU1RSQV9ST1VURVMuc3VnZ2VzdGlvbnN9LzphZ2VudElkYCxcbiAgICAgIGhhbmRsZXI6IGhhbmRsZVN1Z2dlc3Rpb25zLFxuICAgIH0pO1xuXG4gICAgLy8gYFBPU1QgL3JvdXRlL2ZlZWRiYWNrYCBsb2dzIGEgdGh1bWJzIC8gY29tbWVudCBhc3Nlc3NtZW50IGFnYWluc3RcbiAgICAvLyBhIHR1cm4ncyBNTGZsb3cgdHJhY2UgKHRoZSBgdHJhY2VJZGAgdGhlIGNsaWVudCBjYXB0dXJlZCBmcm9tIHRoZVxuICAgIC8vIHN0cmVhbSByZXNwb25zZSdzIHRyYWNlLWlkIGhlYWRlcikuIFJlZ2lzdGVyZWQgb24gdGhlIEFwcEtpdFxuICAgIC8vIHJvdXRlciAobGlrZSBgL21vZGVsc2ApIHJhdGhlciB0aGFuIHRoZSBNYXN0cmEgc3ViYXBwIHNvIGl0IHJ1bnNcbiAgICAvLyB1bmRlciB0aGUgc2FtZSBPQk8gc2NvcGUgLSB0aGUgZmVlZGJhY2sgaXMgYXR0cmlidXRlZCB0byB0aGVcbiAgICAvLyBzaWduZWQtaW4gdXNlci4gUmV0dXJucyA0MDQgd2hlbiBmZWVkYmFjayBpcyBkaXNhYmxlZCBzbyB0aGVcbiAgICAvLyBjbGllbnQgdHJlYXRzIHRoZSBjYXBhYmlsaXR5IGFzIGFic2VudDsgNDAwIG9uIGEgbWFsZm9ybWVkIGJvZHkuXG4gICAgLy8gQSByZWNvcmRlZCBhc3Nlc3NtZW50IHlpZWxkcyBgeyBvazogdHJ1ZSB9YDsgYSBzb2Z0IGZhaWx1cmUgKG1vc3RcbiAgICAvLyBvZnRlbiB0aGUgdHJhY2UgaGFzbid0IGZpbmlzaGVkIGV4cG9ydGluZyB0byBNTGZsb3cgeWV0KSB5aWVsZHNcbiAgICAvLyBgeyBvazogZmFsc2UgfWAgd2l0aG91dCBhIDV4eCBzbyB0aGUgVUkgY2FuIHByb21wdCBhIHJldHJ5LlxuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImZlZWRiYWNrXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuZmVlZGJhY2ssXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmZlZWRiYWNrRW5hYmxlZCgpKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBvazogZmFsc2UgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IGZlZWRiYWNrLk1hc3RyYUZlZWRiYWNrUmVxdWVzdFNjaGVtYS5zYWZlUGFyc2UocmVxLmJvZHkpO1xuICAgICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgICAgICAgLy8gQSBab2QgaXNzdWUgc3RyaW5nIHF1b3RlcyB0aGUgcmVjZWl2ZWQgYm9keSBiYWNrLCBzbyBvbmx5IHRoZVxuICAgICAgICAgIC8vIG9mZmVuZGluZyBmaWVsZCBuYW1lcyB0cmF2ZWw7IHRoZSBmdWxsIGlzc3VlIGxpc3QgaXMgbG9nZ2VkLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJmZWVkYmFjazppbnZhbGlkXCIsIHsgZXJyb3I6IHBhcnNlZC5lcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBJTlZBTElEX0ZFRURCQUNLX01FU1NBR0UsXG4gICAgICAgICAgICBmaWVsZHM6IGludmFsaWRGaWVsZHMocGFyc2VkLmVycm9yKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zY29wZWRTZWxmKHJlcSkubG9nRmVlZGJhY2socGFyc2VkLmRhdGEpO1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykge1xuICAgICAgICAgIHRoaXMuc2VuZEZhaWx1cmUocmVzLCByZXN1bHQsIFwiZmVlZGJhY2tcIiwgXCJGZWVkYmFjayBjb3VsZCBub3QgYmUgcmVjb3JkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzc2Vzc21lbnRJZCA9IHJlc3VsdC5kYXRhO1xuICAgICAgICByZXMuanNvbih7XG4gICAgICAgICAgb2s6IGFzc2Vzc21lbnRJZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgIC4uLihhc3Nlc3NtZW50SWQgPyB7IGFzc2Vzc21lbnRJZCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBNaWRkbGV3YXJlIHJhdGhlciB0aGFuIGB0aGlzLnJvdXRlYDogdGhpcyBpcyB0aGUgY2F0Y2gtYWxsIHRoYXQgaGFuZHNcbiAgICAvLyBldmVyeSByZW1haW5pbmcgbWV0aG9kIC8gcGF0aCBwYWlyIHRvIHRoZSBNYXN0cmEgc3ViLWFwcCwgc28gaXQgaGFzIG5vXG4gICAgLy8gc2luZ2xlIG1ldGhvZCBvciBwYXRoIHRvIHJlZ2lzdGVyIHVuZGVyLlxuICAgIHJvdXRlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBpZiAoIXRoaXMubWFzdHJhQXBwKSByZXR1cm4gcmVzLnN0YXR1cyg1MDMpLmVuZCgpO1xuICAgICAgLy8gR2F0ZSB0aGUgc3RvY2sgTWFzdHJhIHN1cmZhY2UgYmVmb3JlIGRpc3BhdGNoLiBJbiB0aGUgZGVmYXVsdFxuICAgICAgLy8gXCJzY29wZWRcIiBtb2RlIG9ubHkgYWdlbnQgaW5mZXJlbmNlLCByZWFkLW9ubHkgYWdlbnQgbWV0YWRhdGEsIHRoaXNcbiAgICAgIC8vIHBsdWdpbidzIG93biBgL3JvdXRlLypgIHJvdXRlcywgYW5kICh3aGVuIGVuYWJsZWQpIE1DUCByZWFjaCBNYXN0cmE7XG4gICAgICAvLyBhZG1pbiAvIG11dGF0aW5nIC8gYnVsay1leHBvcnQgcm91dGVzIGFyZSByZWZ1c2VkIGhlcmUuIGByZXEucGF0aGBcbiAgICAgIC8vIGlzIG1vdW50LXJlbGF0aXZlIHVuZGVyIHRoZSBwbHVnaW4gbW91bnQuIFNlZSBgc2VydmVyLnRzYC5cbiAgICAgIGlmIChcbiAgICAgICAgIWlzTWFzdHJhUmVxdWVzdEFsbG93ZWQocmVxLm1ldGhvZCwgcmVxLnBhdGgsIHtcbiAgICAgICAgICBhY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgICAgIC8vIFJlZmxlY3QgdGhlICpyZXNvbHZlZCogTUNQIHN0YXRlLCBub3QgcmF3IGBjb25maWcubWNwYDogTUNQIGlzXG4gICAgICAgICAgLy8gb24gYnkgZGVmYXVsdCAoYGNvbmZpZy5tY3BgIHVuZGVmaW5lZCksIHNvIGdhdGUgb24gd2hldGhlciB0aGVcbiAgICAgICAgICAvLyBzZXJ2ZXIgd2FzIGFjdHVhbGx5IGJ1aWx0IGFuZCBtb3VudGVkLlxuICAgICAgICAgIG1jcEVuYWJsZWQ6IHRoaXMubWNwICE9PSBudWxsLFxuICAgICAgICB9KVxuICAgICAgKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwiRW5kcG9pbnQgbm90IGV4cG9zZWQgdG8gdGhlIGNsaWVudCAoYXBpQWNjZXNzPXNjb3BlZClcIiB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gRGlzcGF0Y2ggdGhyb3VnaCBhIHJlYWwgbWV0aG9kLCBOT1QgdGhlIGBtYXN0cmFBcHBgIHByb3BlcnR5LiBUaGVcbiAgICAgIC8vIEFwcEtpdCBgYXNVc2VyKHJlcSlgIHByb3h5IHdyYXBzIGZ1bmN0aW9uLXZhbHVlZCBwcm9wcyB3aXRoXG4gICAgICAvLyBgdmFsdWUuYmluZCh0YXJnZXQpYC4gYG1hc3RyYUFwcGAgaXMgYW4gZXhwcmVzcyBhcHAgd2hvc2UgYC5iaW5kYCBpc1xuICAgICAgLy8gdGhlIEhUVFAgQklORCByb3V0ZSByZWdpc3RyYXIgKGV4cHJlc3MgZGVmaW5lcyBhIG1ldGhvZCBwZXIgSFRUUCB2ZXJiLFxuICAgICAgLy8gYW5kIEJJTkQgaXMgb25lKSwgbm90IGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGAgLSBzbyBiaW5kaW5nIGl0IHRocm91Z2hcbiAgICAgIC8vIHRoZSBwcm94eSByZWdpc3RlcnMgYSBib2d1cyByb3V0ZSBhbmQgY3Jhc2hlcyBgcGF0aFRvUmVnZXhwYFxuICAgICAgLy8gKFwicGF0aCBtdXN0IGJlIGEgc3RyaW5nIC4uLlwiKS4gVGhpcyBvbmx5IG1hbmlmZXN0cyBpbiBwcm9kdWN0aW9uIHdoZXJlXG4gICAgICAvLyBhbiBPQk8gdG9rZW4gbWFrZXMgYHNjb3BlZFNlbGZgIHJldHVybiB0aGUgcHJveHkuIGBkaXNwYXRjaE1hc3RyYWBcbiAgICAgIC8vIGlzIGEgcGxhaW4gbWV0aG9kIChpdHMgYC5iaW5kYCBpcyB0aGUgbm9ybWFsIG9uZSkgYW5kIGludm9rZXNcbiAgICAgIC8vIGB0aGlzLm1hc3RyYUFwcGAgb2ZmIHRoZSByZWFsIHRhcmdldCwga2VlcGluZyB0aGUgT0JPIHNjb3BlIGFjdGl2ZS5cbiAgICAgIHJldHVybiB0aGlzLnNjb3BlZFNlbGYocmVxKS5kaXNwYXRjaE1hc3RyYShyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwIGEgZmFpbGVkIHtAbGluayBFeGVjdXRpb25SZXN1bHR9IG9udG8gdGhlIHJlc3BvbnNlOiB0aGUgc3RhdHVzIHRoZVxuICAgKiBleGVjdXRpb24gcGlwZWxpbmUgcmVzb2x2ZWQsIHBhaXJlZCB3aXRoIGBjbGllbnRNZXNzYWdlYCByYXRoZXIgdGhhbiB0aGVcbiAgICogcmVzdWx0J3Mgb3duIHRleHQsIHdoaWNoIGNhbiBjYXJyeSB1cHN0cmVhbSBkZXRhaWwuIFRoZSBmdWxsIG1lc3NhZ2UgaXNcbiAgICogbG9nZ2VkIHVuZGVyIGA8b3BlcmF0aW9uPjplcnJvcmAuXG4gICAqL1xuICBwcml2YXRlIHNlbmRGYWlsdXJlKFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICByZXN1bHQ6IHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9LFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGNsaWVudE1lc3NhZ2U6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5sb2dnZXIud2FybihgJHtvcGVyYXRpb259OmVycm9yYCwge1xuICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgZXJyb3I6IHJlc3VsdC5tZXNzYWdlLFxuICAgIH0pO1xuICAgIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXMpLmpzb24oeyBlcnJvcjogY2xpZW50TWVzc2FnZSB9KTtcbiAgfVxuXG4gIC8qKiA0MDQgYm9keSBmb3IgYSByZXF1ZXN0IG5hbWluZyBhbiBhZ2VudCB0aGF0IGlzbid0IHJlZ2lzdGVyZWQuICovXG4gIHByaXZhdGUgdW5rbm93bkFnZW50TWVzc2FnZShhZ2VudElkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0Py5hZ2VudHMgPz8ge30pO1xuICAgIHJldHVybiBgVW5rbm93biBhZ2VudCBcIiR7YWdlbnRJZH1cIi4gUmVnaXN0ZXJlZCBhZ2VudHM6ICR7cmVnaXN0ZXJlZC5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIE1hc3RyYSBleHByZXNzIHN1Yi1hcHAuIEV4aXN0cyBhcyBhIG1ldGhvZCAoaW5zdGVhZCBvZiByZWFkaW5nXG4gICAqIGB0aGlzLm1hc3RyYUFwcGAgdGhyb3VnaCB0aGUgYGFzVXNlcihyZXEpYCBwcm94eSBhdCB0aGUgY2FsbCBzaXRlKSBzbyB0aGVcbiAgICogcHJveHkgYmluZHMgdGhpcyBwbGFpbiBtZXRob2QgLSB3aG9zZSBgLmJpbmRgIGlzIGBGdW5jdGlvbi5wcm90b3R5cGUuYmluZGBcbiAgICogLSByYXRoZXIgdGhhbiB0aGUgZXhwcmVzcyBhcHAsIHdob3NlIGAuYmluZGAgaXMgdGhlIEhUVFAgQklORCByb3V0ZVxuICAgKiByZWdpc3RyYXIgKHNlZSB0aGUgbm90ZSBpbiBgaW5qZWN0Um91dGVzYCkuIFJ1bnMgaW5zaWRlIHRoZSB1c2VyIHNjb3BlIHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTyBjbGllbnQgZm9yIHRoZSBhZ2VudC9tb2RlbFxuICAgKiByZXNvbHZlcnMuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTWFzdHJhKFxuICAgIHJlcTogZXhwcmVzcy5SZXF1ZXN0LFxuICAgIHJlczogZXhwcmVzcy5SZXNwb25zZSxcbiAgICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5tYXN0cmFBcHAhKHJlcSwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgYSBjbGVhbiwgbW91bnQtcmVsYXRpdmUgTUNQIGFsaWFzIHBhdGggdG8gdGhlIHVuZGVybHlpbmdcbiAgICogYEBtYXN0cmEvZXhwcmVzc2Agcm91dGUuIFJldHVybnMgYG51bGxgIHdoZW4gTUNQIGlzIG9mZiBvciB0aGUgcGF0aFxuICAgKiBpc24ndCBhbiBhbGlhcy4gQ29sbGFwc2VzIHRoZSBzdG9jayBgL21jcC88c2VydmVySWQ+Lzx0cmFuc3BvcnQ+YFxuICAgKiBsYXlvdXQgKHNlcnZlcklkIGRlZmF1bHRzIHRvIHRoZSBwbHVnaW4gbmFtZSkgZG93biB0byBgL21jcGAsXG4gICAqIGAvc3NlYCwgYW5kIGAvbWVzc2FnZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBtY3BSb3V0ZUFsaWFzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5tY3ApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGlkID0gdGhpcy5tY3Auc2VydmVySWQ7XG4gICAgaWYgKHBhdGggPT09IFwiL21jcFwiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWNwYDtcbiAgICBpZiAocGF0aCA9PT0gXCIvc3NlXCIpIHJldHVybiBgL21jcC8ke2lkfS9zc2VgO1xuICAgIGlmIChwYXRoID09PSBcIi9tZXNzYWdlc1wiKSByZXR1cm4gYC9tY3AvJHtpZH0vbWVzc2FnZXNgO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvc3VnZ2VzdGlvbnNgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGVcbiAgICogQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZVxuICAgKiBPQk8tc2NvcGVkIGNsaWVudC4gUmVzb2x2ZXMgdGhlIHBsdWdpbidzIEdlbmllIHNwYWNlcyBhbmQgbWVyZ2VzXG4gICAqIHRoZWlyIGN1cmF0ZWQgYHNhbXBsZV9xdWVzdGlvbnNgIChzZWUge0BsaW5rIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zfSkuXG4gICAqIFJldHVybnMgYFtdYCB3aGVuIG5vIEdlbmllIHNwYWNlIGlzIGNvbmZpZ3VyZWQgc28gdGhlIGNsaWVudFxuICAgKiBzaG93cyBhIGJhcmUgZW1wdHkgc3RhdGUgaW5zdGVhZCBvZiBidWlsdC1pbiBleGFtcGxlIHByb21wdHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoU3VnZ2VzdGlvbnMoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxzdHJpbmdbXT4+IHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXModGhpcy5jb25maWcsIHRoaXMuY29udGV4dCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHNwYWNlcykubGVuZ3RoID09PSAwKSByZXR1cm4geyBvazogdHJ1ZSwgZGF0YTogW10gfTtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoKGV4ZWN1dGVTaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkID0gYXN5bmMuY29tYmluZUFib3J0U2lnbmFscyhzaWduYWwsIGV4ZWN1dGVTaWduYWwpO1xuICAgICAgcmV0dXJuIGNvbGxlY3RTcGFjZVN1Z2dlc3Rpb25zKHtcbiAgICAgICAgc3BhY2VzLFxuICAgICAgICBjbGllbnQsXG4gICAgICAgIC4uLihjb21iaW5lZCA/IHsgc2lnbmFsOiBjb21iaW5lZCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSwgZ2VuaWVTdWdnZXN0aW9uRGVmYXVsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvcm91dGUvZmVlZGJhY2tgIHJvdXRlLiBSdW5zIGluc2lkZSB0aGVcbiAgICogQXBwS2l0IHVzZXItY29udGV4dCBwcm94eSBzbyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm5zIHRoZVxuICAgKiBPQk8tc2NvcGVkIGNsaWVudCBhbmQgdGhlIGFzc2Vzc21lbnQgaXMgYXR0cmlidXRlZCB0byB0aGUgc2lnbmVkLWluXG4gICAqIHVzZXIgKHRoZWlyIGVtYWlsIC8gaWQgYXMgdGhlIGFzc2Vzc21lbnQgc291cmNlKS4gUmV0dXJucyB0aGVcbiAgICogY3JlYXRlZCBhc3Nlc3NtZW50IGlkIG9uIHN1Y2Nlc3MsIG9yIGB1bmRlZmluZWRgIG9uIGEgc29mdCBmYWlsdXJlXG4gICAqIChzZWUge0BsaW5rIGxvZ0ZlZWRiYWNrfSBpbiBgLi9tbGZsb3cuanNgKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9nRmVlZGJhY2soXG4gICAgZmVlZGJhY2s6IE1hc3RyYUZlZWRiYWNrUmVxdWVzdCxcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IGN0eCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgICBjb25zdCBzb3VyY2VJZCA9XG4gICAgICBcInVzZXJFbWFpbFwiIGluIGN0eCAmJiBjdHgudXNlckVtYWlsXG4gICAgICAgID8gY3R4LnVzZXJFbWFpbFxuICAgICAgICA6IFwidXNlcklkXCIgaW4gY3R4XG4gICAgICAgICAgPyBjdHgudXNlcklkXG4gICAgICAgICAgOiBjdHguc2VydmljZVVzZXJJZDtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgKCkgPT5cbiAgICAgICAgbG9nRmVlZGJhY2soY3R4LmNsaWVudCwge1xuICAgICAgICAgIC4uLmZlZWRiYWNrLFxuICAgICAgICAgIC4uLihzb3VyY2VJZCA/IHsgc291cmNlSWQgfSA6IHt9KSxcbiAgICAgICAgfSksXG4gICAgICBmZWVkYmFja1dyaXRlRGVmYXVsdHMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgZGF0YWAgZW1iZWQgcmVzb2x2ZXJcbiAgICogKGBHRVQgL2VtYmVkL2RhdGEvOmlkYCkuIFJ1bnMgaW5zaWRlIHRoZSBBcHBLaXQgdXNlci1jb250ZXh0IHByb3h5IHNvXG4gICAqIGBnZXRFeGVjdXRpb25Db250ZXh0KClgIHJldHVybnMgdGhlIE9CTy1zY29wZWQgd29ya3NwYWNlXG4gICAqIGNsaWVudCwgdGhlbiByZXVzZXMgdGhlIHNhbWUgYGZldGNoU3RhdGVtZW50RGF0YWAgcGlwZWxpbmVcbiAgICogdGhlIGBnZXRfc3RhdGVtZW50YCB0b29sIHJ1bnMgc28gdGhlIExMTSBhbmQgdGhlIFVJIHNlZSB0aGVcbiAgICogZXhhY3Qgc2FtZSBzaGFwZSBmb3IgdGhlIHNhbWUgc3RhdGVtZW50LlxuICAgKlxuICAgKiBSZXNvbHZlcyB0byBgdW5kZWZpbmVkYCBkYXRhIGZvciB1cHN0cmVhbSA0MDRzIHNvIHRoZSByb3V0ZSBjYW4gbWFwIHRoZW1cbiAgICogdG8gYSBjbGVhbiBIVFRQIDQwNDsgYW55IG90aGVyIGZhaWx1cmUgY29tZXMgYmFjayBhcyBhIG5vbi1gb2tgIHJlc3VsdFxuICAgKiBjYXJyeWluZyB0aGUgc3RhdHVzIHRvIGFuc3dlciB3aXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFN0YXRlbWVudChcbiAgICBzdGF0ZW1lbnRJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgbGltaXQ/OiBudW1iZXI7IHNpZ25hbD86IEFib3J0U2lnbmFsIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8U3RhdGVtZW50RGF0YSB8IHVuZGVmaW5lZD4+IHtcbiAgICBjb25zdCBjbGllbnQgPSBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4ob3B0aW9ucy5saW1pdCA/PyBTVEFURU1FTlRfUk9XX0NBUCwgU1RBVEVNRU5UX1JPV19DQVApO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoXG4gICAgICBhc3luYyAoZXhlY3V0ZVNpZ25hbCkgPT4ge1xuICAgICAgICBjb25zdCBjb21iaW5lZCA9IGFzeW5jLmNvbWJpbmVBYm9ydFNpZ25hbHMob3B0aW9ucy5zaWduYWwsIGV4ZWN1dGVTaWduYWwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCBzdGF0ZW1lbnRJZCwge1xuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICAuLi4oY29tYmluZWQgPyB7IHNpZ25hbDogY29tYmluZWQgfSA6IHt9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29sdW1uczogZGF0YS5jb2x1bW5zLFxuICAgICAgICAgICAgcm93czogZGF0YS5yb3dzLFxuICAgICAgICAgICAgcm93Q291bnQ6IGRhdGEucm93Q291bnQsXG4gICAgICAgICAgICB0cnVuY2F0ZWQ6IGRhdGEucm93cy5sZW5ndGggPCBkYXRhLnJvd0NvdW50LFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIFRoZSBEYXRhYnJpY2tzIFNESyB0aHJvd3Mgb24gNDA0OyBzdXJmYWNlIGFzIGB1bmRlZmluZWRgXG4gICAgICAgICAgLy8gc28gdGhlIHJvdXRlIG1hcHMgdG8gYSBjbGVhbiBIVFRQIDQwNCBpbnN0ZWFkIG9mIGEgNTAwLlxuICAgICAgICAgIGlmIChlcnJvci5lcnJvckNvbnRleHQoZXJyKS5ub3RBY2Nlc3NpYmxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC4uLnN0YXRlbWVudERhdGFEZWZhdWx0cy5kZWZhdWx0LFxuICAgICAgICAgIC8vIE5hbWVzcGFjZWQgc28gdGhlIGtleSBjYW4ndCBjb2xsaWRlIHdpdGggYW5vdGhlciBjYWNoZSBzaGFyaW5nIHRoZVxuICAgICAgICAgIC8vIG1hbmFnZXIsIGFuZCBrZXllZCBvbiBgbGltaXRgIGJlY2F1c2UgdGhlIHNsaWNlIGlzIHBhcnQgb2YgdGhlXG4gICAgICAgICAgLy8gcGF5bG9hZC5cbiAgICAgICAgICBjYWNoZToge1xuICAgICAgICAgICAgLi4uc3RhdGVtZW50RGF0YURlZmF1bHRzLmRlZmF1bHQuY2FjaGUsXG4gICAgICAgICAgICBjYWNoZUtleTogW1NUQVRFTUVOVF9DQUNIRV9OQU1FU1BBQ0UsIHN0YXRlbWVudElkLCBsaW1pdF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgY2hhcnRgIGVtYmVkIHJlc29sdmVyXG4gICAqIChgR0VUIC9lbWJlZC9jaGFydC86aWRgKS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdCB1c2VyLWNvbnRleHQgcHJveHkgc28gdGhlXG4gICAqIGxvb2t1cCBpcyBuYW1lc3BhY2VkIHRvIHRoZSBjYWxsaW5nIGlkZW50aXR5OiBhIGNoYXJ0IG1pbnRlZCBmb3IgYW5vdGhlclxuICAgKiB1c2VyIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gdW5rbm93biBpZCwgYW5kIHRoZSByb3V0ZSBhbnN3ZXJzIDQwNC5cbiAgICpcbiAgICogVGhlIGtleSBpcyBidWlsdCBmcm9tIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSAtIHRoZSBzYW1lIHJ1bGUgdGhhdCBuYW1lZFxuICAgKiB0aGUgaWRlbnRpdHkgdGhlIGNoYXJ0IHdhcyB3cml0dGVuIHVuZGVyIC0gcmF0aGVyIHRoYW4gZnJvbSB0aGUgYW1iaWVudFxuICAgKiBleGVjdXRpb24gY29udGV4dCBhbG9uZS4gSW4gYHNlcnZpY2UtcHJpbmNpcGFsYCBtb2RlIHRoZSBhbWJpZW50IGNvbnRleHQgaXNcbiAgICogdGhlIFNQIGZvciBldmVyeSBjYWxsZXIsIHNvIGtleWluZyBvZmYgaXQgYWxvbmUgbWlzc2VkIGV2ZXJ5IGNoYXJ0IHRoZVxuICAgKiB0dXJuIGhhZCB3cml0dGVuIHVuZGVyIHRoZSBmb3J3YXJkZWQgdXNlciBhbmQgdGhlIFVJIHNob3dlZCBlYWNoIG9uZSBhc1xuICAgKiBleHBpcmVkLiBgcmVxYCBpcyByZWFkIGluc2lkZSB0aGUgbWV0aG9kLCBub3QgYXQgdGhlIGNhbGwgc2l0ZSwgc28gdGhlXG4gICAqIGV4ZWN1dGlvbiBjb250ZXh0IGlzIHRoZSBzY29wZWQgb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaENoYXJ0RW50cnkoXG4gICAgcmVxOiBleHByZXNzLlJlcXVlc3QsXG4gICAgY2hhcnRJZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgdGltZW91dE1zPzogbnVtYmVyOyBzaWduYWw6IEFib3J0U2lnbmFsIH0sXG4gICk6IFByb21pc2U8RXhlY3V0aW9uUmVzdWx0PENoYXJ0IHwgdW5kZWZpbmVkPj4ge1xuICAgIGNvbnN0IHVzZXJLZXkgPSBhdHRyaWJ1dGVkVXNlcklkKGdldEV4ZWN1dGlvbkNvbnRleHQoKSwgcmVxdWVzdFVzZXJJZChyZXEpKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFxuICAgICAgKGV4ZWN1dGVTaWduYWwpID0+XG4gICAgICAgIGZldGNoQ2hhcnQoY2hhcnRJZCwge1xuICAgICAgICAgIHVzZXJLZXksXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dE1zICE9PSB1bmRlZmluZWQgPyB7IHRpbWVvdXRNczogb3B0aW9ucy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgICBzaWduYWw6IGFzeW5jLmNvbWJpbmVBYm9ydFNpZ25hbHMob3B0aW9ucy5zaWduYWwsIGV4ZWN1dGVTaWduYWwpID8/IG9wdGlvbnMuc2lnbmFsLFxuICAgICAgICB9KSxcbiAgICAgIGNoYXJ0RmV0Y2hEZWZhdWx0cyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIGJhY2tpbmcgdGhlIGAvbW9kZWxzYCByb3V0ZS4gUnVucyBpbnNpZGUgdGhlIEFwcEtpdFxuICAgKiB1c2VyLWNvbnRleHQgcHJveHkgc28gYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgcmV0dXJucyB0aGUgT0JPLXNjb3BlZFxuICAgKiBjbGllbnQgYW5kIHRoZSBjYXRhbG9ndWUgcmVmbGVjdHMgd2hhdCB0aGUgY2FsbGVyIGNhbiBpbnZva2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxpc3RNb2RlbHNSZXN1bHQoKTogUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudDtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBzZXJ2aW5nID0gcmVzb2x2ZVNlcnZpbmdDb25maWcodGhpcy5jb25maWcpO1xuICAgICAgcmV0dXJuIG5vZGVTZXJ2aW5nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCwgeyB0dGxNczogc2VydmluZy50dGxNcyB9KTtcbiAgICB9LCBtb2RlbENhdGFsb2d1ZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRhdGlvbiBiYWNraW5nIHRoZSBgbGlzdE1vZGVsc2AgZXhwb3J0LiBUaGUgcHJvZ3JhbW1hdGljIHN1cmZhY2VcbiAgICogY2FycmllcyBubyBzdGF0dXMgY29kZSwgc28gYSBmYWlsZWQgZXhlY3V0aW9uIGJlY29tZXMgYSB0aHJvdyB3aXRoIGFcbiAgICogc3RhYmxlIG1lc3NhZ2U7IHRoZSByb3V0ZXMgYnJhbmNoIG9uIHRoZSB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0TW9kZWxzKCk6IFByb21pc2U8U2VydmluZ0VuZHBvaW50U3VtbWFyeVtdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5saXN0TW9kZWxzUmVzdWx0KCk7XG4gICAgaWYgKHJlc3VsdC5vaykgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgIHRoaXMubG9nZ2VyLndhcm4oXCJsaXN0TW9kZWxzOmVycm9yXCIsIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgIGVycm9yOiByZXN1bHQubWVzc2FnZSxcbiAgICB9KTtcbiAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoTU9ERUxfQ0FUQUxPR1VFX0ZBSUxFRF9NRVNTQUdFKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRBZ2VudEFuZFNlcnZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBQZXItYWdlbnQgbWVtb3J5IGZhY3RvcnkuIFdoZW4gYW55IHN0b3JhZ2UgLyBtZW1vcnkgc2V0dGluZyBuZWVkc1xuICAgIC8vIFBvc3RncmVzLCBzdGFuZCB1cCBhIGRlZGljYXRlZCBzZXJ2aWNlLXByaW5jaXBhbCBwb29sIGZpcnN0IHNvXG4gICAgLy8gbWVtb3J5IGFjdHMgYXMgdGhlIGFwcCBTUCAob3duZXIgb2YgdGhlIGBtYXN0cmFfKmAgc2NoZW1hcyksXG4gICAgLy8gbmV2ZXIgdGhlIHBlci1yZXF1ZXN0IE9CTyBpZGVudGl0eSB0aGUgY2hhdCB0dXJuIHJ1bnMgdW5kZXIuXG4gICAgLy8gYGdldFBnQ29uZmlnKClgIGlzIHJlYWQgaGVyZSwgb3V0c2lkZSBhbnkgYGFzVXNlcmAgc2NvcGUsIHNvIGl0XG4gICAgLy8gcmV0dXJucyB0aGUgU1AgY29ubmVjdGlvbiB0YXJnZXQgKyB0b2tlbiByZWZyZXNoIHBsdXMgYW55XG4gICAgLy8gYGxha2ViYXNlKHsgcG9vbCB9KWAgb3ZlcnJpZGVzOyBgcmVxdWlyZWAgdHVybnMgYSBtaXNzaW5nXG4gICAgLy8gc2libGluZyBpbnRvIGEgY2xlYXIgd2lyaW5nIGVycm9yLiBUaGUgYnVpbGRlciBjYWNoZXMgdGhlIHNoYXJlZFxuICAgIC8vIGBQZ1ZlY3RvcmAgc2luZ2xldG9uIHNvIHJlZ2lzdGVyaW5nIE4gYWdlbnRzIHN0YXlzIGNoZWFwLiBTZWVcbiAgICAvLyBgLi9tZW1vcnkuanNgLlxuICAgIGlmIChuZWVkc0xha2ViYXNlKHRoaXMuY29uZmlnKSkge1xuICAgICAgY29uc3Qgc3BQZ0NvbmZpZyA9IHBsdWdpblxuICAgICAgICAucmVxdWlyZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlLCB0aGlzLmNvbmZpZylcbiAgICAgICAgLmV4cG9ydHMoKVxuICAgICAgICAuZ2V0UGdDb25maWcoKTtcbiAgICAgIHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2wgPSBhd2FpdCBjcmVhdGVTZXJ2aWNlUHJpbmNpcGFsUG9vbChzcFBnQ29uZmlnKTtcbiAgICB9XG4gICAgY29uc3QgbWVtb3J5QnVpbGRlciA9IHRoaXMuc2VydmljZVByaW5jaXBhbFBvb2xcbiAgICAgID8gY3JlYXRlTWVtb3J5QnVpbGRlcih0aGlzLmNvbmZpZywgdGhpcy5zZXJ2aWNlUHJpbmNpcGFsUG9vbClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gQnVpbGQgZXZlcnkgYWdlbnQgZGVjbGFyZWQgaW4gYGNvbmZpZy5hZ2VudHNgIChvciB0aGUgYnVpbHQtaW5cbiAgICAvLyBmYWxsYmFjayB3aGVuIG5vbmUgYXJlIGRlY2xhcmVkKS4gRWFjaCBhZ2VudCdzIGBtb2RlbGAgcmVzb2x2ZXNcbiAgICAvLyB3b3Jrc3BhY2UgVVJMICsgYmVhcmVyIGF0IGNhbGwgdGltZSBzbyBjb25jdXJyZW50IHJlcXVlc3RzIGdldFxuICAgIC8vIGRpc3RpbmN0IHVzZXIgaWRlbnRpdGllczsgdGhlIGBhc1VzZXIocmVxKWAgc2NvcGUgYXJvdW5kXG4gICAgLy8gYGhhbmRsZUNoYXRgIGlzIHdoYXQgbGV0cyBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYCByZXR1cm4gdGhlXG4gICAgLy8gcmlnaHQgdXNlciBpbnNpZGUgdGhlIHJlc29sdmVyLlxuICAgIC8vIE1hdGVyaWFsaXplIGFueSByZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBPTkNFIGF0IHN0YXJ0dXAuIFJ1bnNcbiAgICAvLyBvdXRzaWRlIGEgcmVxdWVzdCBzY29wZSwgc28gaXQgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsJ3MgY2xpZW50XG4gICAgLy8gYW5kIGRlZmF1bHRzIHRvIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCBza2lsbHMgdHJlZTsgYSBzb3VyY2VcbiAgICAvLyB0aGF0IGxhbmRzIG9uIGEgbG9jYWwgdGVtcCBkaXIgKG5vIHdyaXRhYmxlIHdvcmtzcGFjZSkgaXMgZm9sZGVkIGludG9cbiAgICAvLyBldmVyeSBkZWZhdWx0LXdvcmtzcGFjZSBhZ2VudCB2aWEgYGV4dHJhU2tpbGxQYXRoc2AuXG4gICAgY29uc3QgcHJvdmlzaW9uZWQgPSBhd2FpdCBwcm92aXNpb25SZW1vdGVTa2lsbHModGhpcy5jb25maWcucmVtb3RlU2tpbGxzKTtcbiAgICBpZiAocHJvdmlzaW9uZWQuc2tpbGxOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxscyBjb25maWd1cmVkXCIsIHtcbiAgICAgICAgc2tpbGxzOiBwcm92aXNpb25lZC5za2lsbE5hbWVzLFxuICAgICAgICBkYXRhYnJpY2tzQmFzZVBhdGg6IHByb3Zpc2lvbmVkLmRhdGFicmlja3NCYXNlUGF0aCxcbiAgICAgICAgbG9jYWxTa2lsbFBhdGhzOiBwcm92aXNpb25lZC5sb2NhbFNraWxsUGF0aHMubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5idWlsdCA9IGF3YWl0IGJ1aWxkQWdlbnRzKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICBtZW1vcnlCdWlsZGVyLFxuICAgICAgbG9nOiB0aGlzLmxvZ2dlcixcbiAgICAgIGV4dHJhU2tpbGxQYXRoczogcHJvdmlzaW9uZWQubG9jYWxTa2lsbFBhdGhzLFxuICAgIH0pO1xuXG4gICAgLy8gYG1hc3RyYS5zZXJ2ZXIuYXBpUm91dGVzYCBpcyBvbmx5IGhvbm9yZWQgYnkgTWFzdHJhJ3Mgc3RhbmRhbG9uZVxuICAgIC8vIGRldiBzZXJ2ZXIuIFNpbmNlIHdlJ3JlIGhvc3RpbmcgTWFzdHJhIGluc2lkZSBvdXIgb3duIEV4cHJlc3NcbiAgICAvLyBzdWJhcHAgdmlhIGBAbWFzdHJhL2V4cHJlc3NgLCBjdXN0b20gcm91dGVzIG11c3QgYmUgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGBNYXN0cmFTZXJ2ZXJgIGNvbnN0cnVjdG9yIGRpcmVjdGx5LlxuICAgIC8vXG4gICAgLy8gYHN0b3JhZ2VgIGhlcmUgaXMgKk1hc3RyYS1pbnN0YW5jZS1sZXZlbCogYW5kIHBlcnNpc3RzIHdvcmtmbG93XG4gICAgLy8gc25hcHNob3RzICh3aGVyZSBzdXNwZW5kZWQgYHJlcXVpcmVBcHByb3ZhbGAgdG9vbCBjYWxscyBsaXZlKS5cbiAgICAvLyBJdCdzIHNlcGFyYXRlIGZyb20gZWFjaCBhZ2VudCdzIGBNZW1vcnkuc3RvcmFnZWAsIHdoaWNoIG9ubHlcbiAgICAvLyBjb3ZlcnMgdGhyZWFkIC8gbWVzc2FnZSBoaXN0b3J5LiBXaXRob3V0IGl0LFxuICAgIC8vIGBhZ2VudC5yZXN1bWVTdHJlYW0oKWAgZXJyb3JzIHdpdGggXCJjb3VsZCBub3QgZmluZCBhIHN1c3BlbmRlZFxuICAgIC8vIHJ1blwiIGFuZCB0aGUgYXBwcm92YWwgVUkgaGFuZ3MgYWZ0ZXIgdGhlIHVzZXIgY2xpY2tzIEFwcHJvdmUuXG4gICAgY29uc3QgaW5zdGFuY2VTdG9yYWdlID0gbWVtb3J5QnVpbGRlcj8uaW5zdGFuY2VTdG9yYWdlKCk7XG4gICAgLy8gV2lyZSBNYXN0cmEncyB0cmFjZXIgaW50byBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSB2aWFcbiAgICAvLyBgQG1hc3RyYS9vdGVsLWJyaWRnZWAuIE1hc3RyYSBzcGFucyBiZWNvbWUgbmF0aXZlIE9UZWwgc3BhbnMgb25cbiAgICAvLyB3aGF0ZXZlciB0cmFjZXIgcHJvdmlkZXIgYFRlbGVtZXRyeU1hbmFnZXJgIHJlZ2lzdGVyZWQgZHVyaW5nXG4gICAgLy8gYGNyZWF0ZUFwcGAsIHNvIHRoZSBPVExQIGVuZHBvaW50IC8gaGVhZGVycyAvIHNhbXBsaW5nIGFyZVxuICAgIC8vIGVudi1kcml2ZW4gYW5kIHNoYXJlZCB3aXRoIGV2ZXJ5IG90aGVyIEFwcEtpdCBwbHVnaW4uXG4gICAgY29uc3Qgb2JzZXJ2YWJpbGl0eSA9IGF3YWl0IGJ1aWxkT2JzZXJ2YWJpbGl0eSh7XG4gICAgICBzZXJ2aWNlTmFtZTogdGhpcy5uYW1lLFxuICAgICAgZW5hYmxlZDogdGhpcy5jb25maWcub2JzZXJ2YWJpbGl0eSxcbiAgICB9KTtcbiAgICAvLyBPcHRpb25hbCBNQ1AgZXhwb3N1cmU6IGJ1aWxkIGEgTWFzdHJhIE1DUCBzZXJ2ZXIgZnJvbSB0aGVcbiAgICAvLyByZWdpc3RlcmVkIGFnZW50cyAoYW5kLCBvcHQtaW4sIHRoZSBhbWJpZW50IHRvb2xzKSBhbmQgcmVnaXN0ZXJcbiAgICAvLyBpdCBvbiB0aGUgTWFzdHJhIGluc3RhbmNlLiBgQG1hc3RyYS9leHByZXNzYCBzZXJ2ZXMgdGhlIHN0b2NrIE1DUFxuICAgIC8vIHRyYW5zcG9ydCByb3V0ZXMgKGAvbWNwLzxzZXJ2ZXJJZD4vLi4uYCkgb2ZmIGBtY3BTZXJ2ZXJzYCwgc28gdGhlXG4gICAgLy8gY2F0Y2gtYWxsIGRpc3BhdGNoIGJlbG93IGFscmVhZHkgcm91dGVzIE1DUCByZXF1ZXN0cyB1bmRlciBPQk8gLVxuICAgIC8vIG5vIGJlc3Bva2Ugcm91dGUgbmVlZGVkLiBTZWUgYC4vbWNwLmpzYC5cbiAgICB0aGlzLm1jcCA9IGJ1aWxkTWNwU2VydmVyKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBwbHVnaW5OYW1lOiB0aGlzLm5hbWUsXG4gICAgICBkaXNwbGF5TmFtZTogTWFzdHJhUGx1Z2luLm1hbmlmZXN0LmRpc3BsYXlOYW1lLFxuICAgICAgYWdlbnRzOiB0aGlzLmJ1aWx0LmFnZW50cyxcbiAgICAgIGFtYmllbnRUb29sczogdGhpcy5idWlsdC5hbWJpZW50VG9vbHMsXG4gICAgfSk7XG4gICAgdGhpcy5tYXN0cmEgPSBuZXcgTWFzdHJhKHtcbiAgICAgIGFnZW50czogdGhpcy5idWlsdC5hZ2VudHMsXG4gICAgICAuLi4oaW5zdGFuY2VTdG9yYWdlID8geyBzdG9yYWdlOiBpbnN0YW5jZVN0b3JhZ2UgfSA6IHt9KSxcbiAgICAgIC4uLihvYnNlcnZhYmlsaXR5ID8geyBvYnNlcnZhYmlsaXR5IH0gOiB7fSksXG4gICAgICAuLi4odGhpcy5tY3AgPyB7IG1jcFNlcnZlcnM6IHsgW3RoaXMubWNwLnNlcnZlcklkXTogdGhpcy5tY3Auc2VydmVyIH0gfSA6IHt9KSxcbiAgICB9KTtcbiAgICB0aGlzLm1hc3RyYUFwcCA9IGV4cHJlc3MoKTtcbiAgICBhdHRhY2hSb3V0ZVBhdGNoTWlkZGxld2FyZSh0aGlzLm1hc3RyYUFwcCk7XG4gICAgLy8gU3RhbXAgY2hhdCByZXF1ZXN0L3Jlc3BvbnNlIG9udG8gdGhlIEhUVFAgcm9vdCBzcGFuIHNvIE1MZmxvdydzXG4gICAgLy8gVUMgYCpfdHJhY2VfdW5pZmllZGAgdmlldyBjYW4gc3VyZmFjZSB0aGVtIChNYXN0cmEncyBvd25cbiAgICAvLyBgbWFzdHJhLmFnZW50X3J1bi4qYCBhdHRyaWJ1dGVzIHNpdCBvbiBhIGNoaWxkIHNwYW4gdGhlIHZpZXdcbiAgICAvLyBuZXZlciByZWFkcykuIE11c3QgcnVuIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXRgIHNvIHRoZSBsYXllclxuICAgIC8vIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50IHJvdXRlcy5cbiAgICBhdHRhY2hDaGF0VHVyblRyYWNlSW8odGhpcy5tYXN0cmFBcHApO1xuICAgIHRoaXMubWFzdHJhU2VydmVyID0gbmV3IE1hc3RyYVNlcnZlcih0aGlzLmNvbmZpZywge1xuICAgICAgYXBwOiB0aGlzLm1hc3RyYUFwcCxcbiAgICAgIG1hc3RyYTogdGhpcy5tYXN0cmEsXG4gICAgICBwcmVmaXg6IFwiXCIsXG4gICAgICBjdXN0b21BcGlSb3V0ZXM6IFtcbiAgICAgICAgLy8gYGhpc3RvcnlSb3V0ZWAgcmVnaXN0ZXJzIGJvdGggR0VUIChsb2FkKSBhbmQgREVMRVRFXG4gICAgICAgIC8vIChjbGVhcikgb24gdGhlIHNhbWUgcGF0aCwgc28gaXQgcmV0dXJucyBhbiBhcnJheSB3ZVxuICAgICAgICAvLyBzcGxpY2UgaW4uXG4gICAgICAgIC4uLmhpc3RvcnlSb3V0ZSh7XG4gICAgICAgICAgcGF0aDogcm91dGVzLk1BU1RSQV9ST1VURVMuaGlzdG9yeSxcbiAgICAgICAgICBhZ2VudDogdGhpcy5idWlsdC5kZWZhdWx0QWdlbnRJZCxcbiAgICAgICAgfSksXG4gICAgICAgIC8vIEFzc2VydCB0aGUgYDphZ2VudElkYCB0ZW1wbGF0ZSB0eXBlOiB0aGUgcGVyLXBhY2thZ2UgYnVpbGQnc1xuICAgICAgICAvLyBOb2RlTmV4dCByZXNvbHV0aW9uIHdpZGVucyB0aGUgaW1wb3J0ZWQgYHJvdXRlcy5NQVNUUkFfUk9VVEVTLmhpc3RvcnlgXG4gICAgICAgIC8vIHRvIGBzdHJpbmdgICh0aGUgc291cmNlL2J1bmRsZXIgdHlwZWNoZWNrIGtlZXBzIGl0IGEgbGl0ZXJhbCksXG4gICAgICAgIC8vIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBkcm9wIHRoaXMgb3V0IG9mIHRoZSBkeW5hbWljLWFnZW50XG4gICAgICAgIC8vIG92ZXJsb2FkIGFuZCBkZW1hbmQgYSBmaXhlZCBgYWdlbnRgLlxuICAgICAgICAuLi5oaXN0b3J5Um91dGUoe1xuICAgICAgICAgIHBhdGg6IGAke3JvdXRlcy5NQVNUUkFfUk9VVEVTLmhpc3Rvcnl9LzphZ2VudElkYCBhcyBgJHtzdHJpbmd9OmFnZW50SWRgLFxuICAgICAgICB9KSxcbiAgICAgICAgLy8gYHRocmVhZHNSb3V0ZWAgcmVnaXN0ZXJzIEdFVCAobGlzdCB0aGUgY2FsbGVyJ3MgY29udmVyc2F0aW9uXG4gICAgICAgIC8vIHRocmVhZHMpIGFuZCBERUxFVEUgKHJlbW92ZSB0aGUgdGFyZ2V0ZWQgdGhyZWFkKSBvbiB0aGUgc2FtZVxuICAgICAgICAvLyBwYXRoOyBib3RoIHRoZSBkZWZhdWx0LWFnZW50IGFuZCBkeW5hbWljLWFnZW50IG1vdW50cyBhcmVcbiAgICAgICAgLy8gc3BsaWNlZCBpbiwgbWlycm9yaW5nIHRoZSBoaXN0b3J5IHJvdXRlcyBhYm92ZS5cbiAgICAgICAgLi4udGhyZWFkc1JvdXRlKHtcbiAgICAgICAgICBwYXRoOiByb3V0ZXMuTUFTVFJBX1JPVVRFUy50aHJlYWRzLFxuICAgICAgICAgIGFnZW50OiB0aGlzLmJ1aWx0LmRlZmF1bHRBZ2VudElkLFxuICAgICAgICB9KSxcbiAgICAgICAgLi4udGhyZWFkc1JvdXRlKHtcbiAgICAgICAgICBwYXRoOiBgJHtyb3V0ZXMuTUFTVFJBX1JPVVRFUy50aHJlYWRzfS86YWdlbnRJZGAgYXMgYCR7c3RyaW5nfTphZ2VudElkYCxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMubWFzdHJhU2VydmVyLmluaXQoKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgYWdlbnRzOiBPYmplY3Qua2V5cyh0aGlzLmJ1aWx0LmFnZW50cyksXG4gICAgICBkZWZhdWx0QWdlbnQ6IHRoaXMuYnVpbHQuZGVmYXVsdEFnZW50SWQsXG4gICAgICBhcGlBY2Nlc3M6IHRoaXMuY29uZmlnLmFwaUFjY2VzcyA/PyBcInNjb3BlZFwiLFxuICAgICAgbWNwOiB0aGlzLm1jcCA/IGAke3RoaXMuYmFzZVBhdGh9JHt0aGlzLm1jcC5odHRwUGF0aH1gIDogXCJvZmZcIixcbiAgICAgIGxha2ViYXNlOiBtZW1vcnlCdWlsZGVyICE9PSB1bmRlZmluZWQsXG4gICAgICBmZWVkYmFjazogdGhpcy5mZWVkYmFja0VuYWJsZWQoKSxcbiAgICAgIG9ic2VydmFiaWxpdHk6IG9ic2VydmFiaWxpdHkgIT09IHVuZGVmaW5lZCA/IFwibWxmbG93XCIgOiBcIm9mZlwiLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXIgZm9yIG9uZSBlbWJlZCBgPHR5cGU+YCBiZWhpbmQgdGhlIGdlbmVyaWNcbiAqIGBHRVQgL2VtYmVkLzp0eXBlLzppZGAgcm91dGUuIFJldHVybnMgdGhlIEpTT04gYm9keSB0byBzZW5kIG9uXG4gKiBzdWNjZXNzLCBvciBgdW5kZWZpbmVkYCB0byBzaWduYWwgYSA0MDQgKHVua25vd24gLyBleHBpcmVkIGlkKS5cbiAqIGBzaWduYWxgIGFib3J0cyB3aGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMgc28gbG9uZy1wb2xsaW5nXG4gKiByZXNvbHZlcnMgKGUuZy4gYGNoYXJ0YCkgdW5ibG9jayBpbW1lZGlhdGVseS5cbiAqL1xudHlwZSBFbWJlZFJlc29sdmVyID0gKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgaWQ6IHN0cmluZyxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbikgPT4gUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8dW5rbm93bj4+O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBvcHRpb25hbCBgP3RpbWVvdXRNcz08bj5gIHF1ZXJ5IHBhcmFtZXRlciBmcm9tIGFcbiAqIGBHRVQgL2VtYmVkL2NoYXJ0LzppZGAgcmVxdWVzdC4gQWNjZXB0cyBhIHBvc2l0aXZlIGludGVnZXIgdXBcbiAqIHRvIHtAbGluayBNQVhfRU1CRURfUE9MTF9USU1FT1VUX01TfSAoY2xhbXBlZCkgYW5kIHJlamVjdHMgZXZlcnl0aGluZyBlbHNlXG4gKiBhcyBgdW5kZWZpbmVkYCBzbyB7QGxpbmsgZmV0Y2hDaGFydH0gZmFsbHMgYmFjayB0byBpdHMgZGVmYXVsdC5cbiAqIEV4cHJlc3MgcHJvZHVjZXMgYHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkYDsgd2Ugbm9ybWFsaXplXG4gKiB0byB0aGUgZmlyc3Qgc2NhbGFyIGJlZm9yZSBwYXJzaW5nLlxuICovXG5mdW5jdGlvbiBwYXJzZVRpbWVvdXRNcyhyYXc6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB2ID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSBvYmplY3QudG9OdW1iZXIodik7XG4gIGlmIChuID09PSB1bmRlZmluZWQgfHwgbiA8PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gTWF0aC5taW4oTWF0aC5mbG9vcihuKSwgTUFYX0VNQkVEX1BPTExfVElNRU9VVF9NUyk7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIG9wdGlvbmFsIGA/bGltaXQ9PG4+YCBxdWVyeSBwYXJhbWV0ZXIgZnJvbSBhXG4gKiBgR0VUIC9lbWJlZC9kYXRhLzppZGAgcmVxdWVzdC4gQWNjZXB0cyBhIG5vbi1uZWdhdGl2ZVxuICogaW50ZWdlciBhbmQgbGV0cyB0aGUgcm91dGUgY2xhbXAgdG8gYFNUQVRFTUVOVF9ST1dfQ0FQYDtcbiAqIHJlamVjdHMgYW55dGhpbmcgZWxzZSBhcyBgdW5kZWZpbmVkYCBzbyB0aGUgcm91dGUgZmFsbHMgYmFja1xuICogdG8gdGhlIHNlcnZlci1zaWRlIGNhcC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnRMaW1pdChyYXc6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB2ID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICBpZiAodHlwZW9mIHYgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG4gPSBvYmplY3QudG9OdW1iZXIodik7XG4gIGlmIChuID09PSB1bmRlZmluZWQgfHwgbiA8IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBNYXRoLmZsb29yKG4pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBNYXN0cmEgcGx1Z2luIG9uIGFuIEFwcEtpdCBhcHAuIE1vdW50cyB0aGUgYWdlbnRzLCB0aGVcbiAqIGAvcm91dGUvKmAgY2hhdCBzdXJmYWNlLCBhbmQgKHVubGVzcyBkaXNhYmxlZCkgdGhlIE1DUCB0cmFuc3BvcnQgdW5kZXJcbiAqIGAvYXBpL21hc3RyYWAuXG4gKlxuICogQGV4YW1wbGUgTWluaW1hbCBhcHBcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogLy8gTm8gYGFnZW50c2A6IGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IGlzIHJlZ2lzdGVyZWQsIHNvIHRoZVxuICogLy8gY2hhdCBlbmRwb2ludCB3b3JrcyBvdXQgb2YgdGhlIGJveC5cbiAqIGNvbnN0IGFwcCA9IGF3YWl0IGNyZWF0ZUFwcCh7IHBsdWdpbnM6IFttYXN0cmEoKV0gfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBUd28gYWdlbnRzLCBhIHBpbm5lZCBtb2RlbCwgYW5kIEdlbmllXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBsYWtlYmFzZSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGNyZWF0ZUFnZW50LCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIGxha2ViYXNlKCksXG4gKiAgICAgbWFzdHJhKHtcbiAqICAgICAgIGRlZmF1bHRNb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgICAgICBkZWZhdWx0QWdlbnQ6IFwiYW5hbHlzdFwiLFxuICogICAgICAgZ2VuaWVTcGFjZXM6IHsgc2FsZXM6IHsgc3BhY2VJZDogXCIwMWVmLi4uXCIsIGhpbnQ6IFwib3JkZXJzLCByZXR1cm5zXCIgfSB9LFxuICogICAgICAgYWdlbnRzOiB7XG4gKiAgICAgICAgIGFuYWx5c3Q6IGNyZWF0ZUFnZW50KHtcbiAqICAgICAgICAgICBpbnN0cnVjdGlvbnM6IFwiWW91IGFuc3dlciBxdWVzdGlvbnMgYWJvdXQgc2FsZXMuXCIsXG4gKiAgICAgICAgICAgdG9vbHMocGx1Z2lucykge1xuICogICAgICAgICAgICAgcmV0dXJuIHsgLi4ucGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpIH07XG4gKiAgICAgICAgICAgfSxcbiAqICAgICAgICAgfSksXG4gKiAgICAgICAgIGhlbHBlcjogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiWW91IGV4cGxhaW4gdGhlIGFuYWx5c3QncyBhbnN3ZXJzLlwiIH0pLFxuICogICAgICAgfSxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBtYXN0cmEgPSB0b1BsdWdpbihNYXN0cmFQbHVnaW4pO1xuIl19
|
package/lib/src/skill-paths.d.ts
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Two modules need these paths and must agree on them: `workspaces.ts` MOUNTS
|
|
5
5
|
* them per request (see `DEFAULT_SKILL_FOLDERS`), and `remote-skills.ts`
|
|
6
|
-
* WRITES provisioned skills into them at startup. They
|
|
7
|
-
* out in both,
|
|
8
|
-
* other never scanned.
|
|
6
|
+
* WRITES provisioned skills into them at startup. They live here rather than being
|
|
7
|
+
* spelled out in both, where a change to one would silently provision skills into a
|
|
8
|
+
* tree the other never scanned.
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
package/lib/src/skill-paths.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Two modules need these paths and must agree on them: `workspaces.ts` MOUNTS
|
|
5
5
|
* them per request (see `DEFAULT_SKILL_FOLDERS`), and `remote-skills.ts`
|
|
6
|
-
* WRITES provisioned skills into them at startup. They
|
|
7
|
-
* out in both,
|
|
8
|
-
* other never scanned.
|
|
6
|
+
* WRITES provisioned skills into them at startup. They live here rather than being
|
|
7
|
+
* spelled out in both, where a change to one would silently provision skills into a
|
|
8
|
+
* tree the other never scanned.
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
@@ -15,4 +15,4 @@ export const ASSISTANT_SHARED_SKILLS_PATH = "/Workspace/.assistant/skills";
|
|
|
15
15
|
export function userAssistantSkillsPath(userEmail) {
|
|
16
16
|
return `/Users/${userEmail.trim()}/.assistant/skills`;
|
|
17
17
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGwtcGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2tpbGwtcGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyw4QkFBOEIsQ0FBQztBQUUzRSxtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLFNBQWlCO0lBQ3ZELE9BQU8sVUFBVSxTQUFTLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDO0FBQ3hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdoZXJlIERhdGFicmlja3MgQXNzaXN0YW50IGBTS0lMTC5tZGAgdHJlZXMgbGl2ZS5cbiAqXG4gKiBUd28gbW9kdWxlcyBuZWVkIHRoZXNlIHBhdGhzIGFuZCBtdXN0IGFncmVlIG9uIHRoZW06IGB3b3Jrc3BhY2VzLnRzYCBNT1VOVFNcbiAqIHRoZW0gcGVyIHJlcXVlc3QgKHNlZSBgREVGQVVMVF9TS0lMTF9GT0xERVJTYCksIGFuZCBgcmVtb3RlLXNraWxscy50c2BcbiAqIFdSSVRFUyBwcm92aXNpb25lZCBza2lsbHMgaW50byB0aGVtIGF0IHN0YXJ0dXAuIFRoZXkgbGl2ZSBoZXJlIHJhdGhlciB0aGFuIGJlaW5nXG4gKiBzcGVsbGVkIG91dCBpbiBib3RoLCB3aGVyZSBhIGNoYW5nZSB0byBvbmUgd291bGQgc2lsZW50bHkgcHJvdmlzaW9uIHNraWxscyBpbnRvIGFcbiAqIHRyZWUgdGhlIG90aGVyIG5ldmVyIHNjYW5uZWQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbi8qKiBTaGFyZWQgQXNzaXN0YW50IHNraWxscyB0cmVlLCByZWFkYWJsZSBieSBldmVyeW9uZSBpbiB0aGUgd29ya3NwYWNlLiAqL1xuZXhwb3J0IGNvbnN0IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEggPSBcIi9Xb3Jrc3BhY2UvLmFzc2lzdGFudC9za2lsbHNcIjtcblxuLyoqIEFzc2lzdGFudCBza2lsbHMgdHJlZSBvd25lZCBieSBvbmUgdXNlciAodGhlIFwic2F2ZSB0aGlzIGFzIGEgc2tpbGxcIiB0YXJnZXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJBc3Npc3RhbnRTa2lsbHNQYXRoKHVzZXJFbWFpbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAvVXNlcnMvJHt1c2VyRW1haWwudHJpbSgpfS8uYXNzaXN0YW50L3NraWxsc2A7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -31,18 +31,18 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@databricks/appkit": "^0.43.0",
|
|
33
33
|
"@databricks/sdk-experimental": "^0.17.0",
|
|
34
|
-
"@dbx-tools/appkit": "0.6.
|
|
35
|
-
"@dbx-tools/core": "0.6.
|
|
36
|
-
"@dbx-tools/databricks": "0.6.
|
|
37
|
-
"@dbx-tools/fs": "0.6.
|
|
38
|
-
"@dbx-tools/genie": "0.6.
|
|
39
|
-
"@dbx-tools/model": "0.6.
|
|
40
|
-
"@dbx-tools/path": "0.6.
|
|
41
|
-
"@dbx-tools/shared-core": "0.6.
|
|
42
|
-
"@dbx-tools/shared-fs": "0.6.
|
|
43
|
-
"@dbx-tools/shared-genie": "0.6.
|
|
44
|
-
"@dbx-tools/shared-mastra": "0.6.
|
|
45
|
-
"@dbx-tools/shared-model": "0.6.
|
|
34
|
+
"@dbx-tools/appkit": "0.6.76",
|
|
35
|
+
"@dbx-tools/core": "0.6.76",
|
|
36
|
+
"@dbx-tools/databricks": "0.6.76",
|
|
37
|
+
"@dbx-tools/fs": "0.6.76",
|
|
38
|
+
"@dbx-tools/genie": "0.6.76",
|
|
39
|
+
"@dbx-tools/model": "0.6.76",
|
|
40
|
+
"@dbx-tools/path": "0.6.76",
|
|
41
|
+
"@dbx-tools/shared-core": "0.6.76",
|
|
42
|
+
"@dbx-tools/shared-fs": "0.6.76",
|
|
43
|
+
"@dbx-tools/shared-genie": "0.6.76",
|
|
44
|
+
"@dbx-tools/shared-mastra": "0.6.76",
|
|
45
|
+
"@dbx-tools/shared-model": "0.6.76",
|
|
46
46
|
"@mastra/ai-sdk": "^1.6.0",
|
|
47
47
|
"@mastra/core": "^1.47.0",
|
|
48
48
|
"@mastra/express": "^1.4.2",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"./package.json": "./package.json"
|
|
72
72
|
}
|
|
73
73
|
},
|
|
74
|
-
"version": "0.6.
|
|
74
|
+
"version": "0.6.76",
|
|
75
75
|
"types": "./lib/index.d.ts",
|
|
76
76
|
"type": "module",
|
|
77
77
|
"exports": {
|
package/src/config.ts
CHANGED
|
@@ -522,7 +522,7 @@ export interface MastraPluginConfig extends BasePluginConfig {
|
|
|
522
522
|
*
|
|
523
523
|
* - `"user"` (default): always OBO. Per-user attribution, and Genie / Unity
|
|
524
524
|
* Catalog row filters apply per user. Correct when every caller is a
|
|
525
|
-
* workspace member
|
|
525
|
+
* workspace member.
|
|
526
526
|
* - `"service-principal"`: always the app service principal. Needs no OBO
|
|
527
527
|
* scopes and works for any caller who can open the app, at the cost of
|
|
528
528
|
* per-user attribution in Genie / Unity Catalog.
|
package/src/plugin.ts
CHANGED
|
@@ -258,14 +258,13 @@ export class MastraPlugin extends Plugin<MastraPluginConfig> {
|
|
|
258
258
|
*
|
|
259
259
|
* In `"user"` mode (the default) this is `this.asUser(req)` - AppKit's own
|
|
260
260
|
* proxy that runs every call inside `runInUserContext`, so `getExecutionContext()`
|
|
261
|
-
* returns the caller's OBO client
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
* decision lives in one place.
|
|
261
|
+
* returns the caller's OBO client. In `"service-principal"` mode it is `this`
|
|
262
|
+
* unwrapped, so the same methods run in the ambient service context and
|
|
263
|
+
* `getExecutionContext()` returns the app service principal's client - the same
|
|
264
|
+
* "just don't enter `asUser`" pattern AppKit's own service-context calls use. One
|
|
265
|
+
* helper covers every workspace call the chat path makes (serving catalogue,
|
|
266
|
+
* Genie suggestions, `ask_genie` via the dispatched agent turn, statement fetch,
|
|
267
|
+
* feedback), so the identity decision lives in one place.
|
|
269
268
|
*/
|
|
270
269
|
private scopedSelf(req: express.Request): this {
|
|
271
270
|
return useServicePrincipal(this.identityMode, req) ? this : this.asUser(req);
|
package/src/skill-paths.ts
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Two modules need these paths and must agree on them: `workspaces.ts` MOUNTS
|
|
5
5
|
* them per request (see `DEFAULT_SKILL_FOLDERS`), and `remote-skills.ts`
|
|
6
|
-
* WRITES provisioned skills into them at startup. They
|
|
7
|
-
* out in both,
|
|
8
|
-
* other never scanned.
|
|
6
|
+
* WRITES provisioned skills into them at startup. They live here rather than being
|
|
7
|
+
* spelled out in both, where a change to one would silently provision skills into a
|
|
8
|
+
* tree the other never scanned.
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|