cdk-nextjs 0.7.13 → 0.7.14
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/.jsii +132 -42
- package/.jsii.tabl.json +1 -1
- package/API.md +56 -0
- package/docs/harness-coverage.md +16 -6
- package/docs/next-build-output-guide.md +1 -1
- package/lib/adapter/adapter.mjs +1 -1
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +6 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +6 -0
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/nextjs-api.d.ts +11 -0
- package/lib/nextjs-api.js +63 -9
- package/lib/nextjs-api.test.js +127 -1
- package/lib/nextjs-build/nextjs-build.js +1 -1
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.d.ts +21 -0
- package/lib/nextjs-distribution.js +69 -4
- package/lib/nextjs-distribution.test.js +132 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +7 -0
- package/lib/root-constructs/nextjs-base-construct.js +14 -2
- package/lib/root-constructs/nextjs-global-containers.js +3 -2
- package/lib/root-constructs/nextjs-global-functions.js +3 -2
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +3 -2
- package/lib/runtime/lambda.mjs +1 -1
- package/lib/runtime/server.mjs +1 -1
- package/package.json +1 -1
- package/scripts/e2e-harness/README.md +10 -8
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJwbnBtIGRseCBwcm9qZW5cIi5cbmltcG9ydCB0eXBlIHsgYXdzX2NlcnRpZmljYXRlbWFuYWdlciwgYXdzX2Nsb3VkZnJvbnQsIGF3c19lbGFzdGljbG9hZGJhbGFuY2luZ3YyLCBhd3NfbGFtYmRhLCBhd3NfczMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IE5leHRqc1R5cGUsIFB1YmxpY0RpckVudHJ5IH0gZnJvbSAnLi4vJztcblxuLyoqXG4gKiBPcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBBIENsb3VkRnJvbnQgS2V5VmFsdWVTdG9yZSBhc3NvY2lhdGVkIHdpdGggZXZlcnkgdmlld2VyLXJlcXVlc3QgZnVuY3Rpb24ge0BsaW5rIHZpZXdlclJlcXVlc3RGdW5jdGlvbkNvZGV9IGlzIGNvcGllZCBpbnRvICh1cCB0byB0aHJlZSwgb25lIHBlciBraW5kIG9mIGJlaGF2aW9yKSwgc28gdmFsdWVzIGl0IHJlYWRzIOKAlCBCYXNpYyBhdXRoIGNyZWRlbnRpYWxzLCBhbiBhbGxvd2xpc3Qg4oCUIGxpdmUgb3V0c2lkZSB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgYW5kIGNoYW5nZSB3aXRob3V0IGEgZGVwbG95LlxuICAgKiBSZWFkIGl0IHdpdGggYGNmLmt2cygpYCwgbm8gSUQgbmVlZGVkLlxuICAgKiBAZGVmYXVsdCAtIG5vbmVcbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlPzogYXdzX2Nsb3VkZnJvbnQuSUtleVZhbHVlU3RvcmU7XG4gIC8qKlxuICAgKiBDbG91ZEZyb250IEZ1bmN0aW9uIGNvZGUgcnVuIGZpcnN0IG9uIGV2ZXJ5IHZpZXdlciByZXF1ZXN0LCBvbiBldmVyeSBiZWhhdmlvciBjZGstbmV4dGpzIGFkZHMsIHN0YXRpYyBhc3NldHMgaW5jbHVkZWQg4oCUIEhUVFAgQmFzaWMgYXV0aCBvbiBhIHByZS1sYXVuY2ggc2l0ZSwgZ2VvLWdhdGluZy5cbiAgICogSXQgbXVzdCBkZWZpbmUgYHZpZXdlclJlcXVlc3QoZXZlbnQpYCAoYSBmdW5jdGlvbiwgc3luYyBvciBhc3luYywgb3IgYVxuICAgKiBgdmFyYC9gbGV0YC9gY29uc3RgKTogcmV0dXJuIGEgcmVzcG9uc2UgdG8gYW5zd2VyIHRoZSB2aWV3ZXIsIG9yIHRoZVxuICAgKiByZXF1ZXN0IChvciBub3RoaW5nKSB0byBjYXJyeSBvbi4gSXQgaXMgc3BsaWNlZCBpbnRvIGNkay1uZXh0anMncyBvd25cbiAgICogdmlld2VyLXJlcXVlc3QgZnVuY3Rpb25zLCBhaGVhZCBvZiB0aGVpciBsb2dpYywgc28gaXQgbWF5IG5vdCB1c2UgdGhlXG4gICAqIG5hbWUgYGhhbmRsZXJgLCBhbmQgdGhlIGNvbWJpbmVkIGZ1bmN0aW9uIG11c3QgZml0IENsb3VkRnJvbnQncyAxMCBLQi5cbiAgICogSXQgcnVucyBvbiBgY2xvdWRmcm9udC1qcy0yLjBgLCBzbyBpdCBtYXkgYmUgYXN5bmMgYW5kIHJlYWRcbiAgICoge0BsaW5rIHZpZXdlclJlcXVlc3RLZXlWYWx1ZVN0b3JlfSB3aXRoIGBjZi5rdnMoKWAuIEEgYnJpbmcteW91ci1vd25cbiAgICoge0BsaW5rIGRpc3RyaWJ1dGlvbn0ncyBkZWZhdWx0IGJlaGF2aW9yIGlzbid0IGNvdmVyZWQuXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgdmlld2VyUmVxdWVzdEZ1bmN0aW9uQ29kZT86IGF3c19jbG91ZGZyb250LkZ1bmN0aW9uQ29kZTtcbiAgLyoqXG4gICAqIFRoZSBgU2VydmljZS1Xb3JrZXItQWxsb3dlZGAgaGVhZGVyIGZvciBgX25leHQvc3RhdGljL3NlcnZpY2Utd29ya2VyLypgLCB3aGljaCBOZXh0LmpzIHNlbmRzIHNvIGEgY29tcGlsZWQgc2VydmljZSB3b3JrZXIgY2FuIHJlZ2lzdGVyIGF0IGEgc2NvcGUgd2lkZXIgdGhhbiBpdHMgb3duIGRpcmVjdG9yeSwgc3VjaCBhcyBgL2AuIFMzIGNhbid0IHNlbmQgYW4gYXJiaXRyYXJ5IGhlYWRlciwgc28gc2V0dGluZyB0aGlzIGFkZHMgYSBiZWhhdmlvciBmb3IgdGhvc2UgZmlsZXMgd2hvc2UgcmVzcG9uc2UgaGVhZGVycyBwb2xpY3kgZG9lcy4gTmV4dC5qcyB1c2VzIHRoZSBhcHAncyBgYmFzZVBhdGhgLCBvciBgL2AgZm9yIG5vbmUuXG4gICAqIEBkZWZhdWx0IC0gbm8gYmVoYXZpb3I7IHRoZSBidWlsZCBoYXMgbm8gc2VydmljZSB3b3JrZXJcbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VXb3JrZXJBbGxvd2VkPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG1vc3QgY2FjaGUgYmVoYXZpb3JzIHRoZSBkaXN0cmlidXRpb24gbWF5IGhhdmUsIHRoZSBkZWZhdWx0IG9uZSBpbmNsdWRlZC5cbiAgICogY2RrLW5leHRqcyBjb3VudHMgd2hhdCBpdCBhZGRzIGFnYWluc3QgdGhpcyBhdCBzeW50aCwgc28gcnVubmluZ1xuICAgKiBvdXQgaXMgYSBzeW50aCBlcnJvciBuYW1pbmcgd2hhdCB1c2VkIHRoZW0gcmF0aGVyIHRoYW4gYSBmYWlsZWQgZGVwbG95LlxuICAgKlxuICAgKiBSYWlzZSBpdCBhZnRlciByYWlzaW5nIHRoZSBcIkNhY2hlIGJlaGF2aW9ycyBwZXIgZGlzdHJpYnV0aW9uXCIgcXVvdGEgZm9yXG4gICAqIHlvdXIgYWNjb3VudC4gTG93ZXIgaXQgYnkgdGhlIGJlaGF2aW9ycyBhIHN1cHBsaWVkIHtAbGluayBkaXN0cmlidXRpb259XG4gICAqIChvciBgb3ZlcnJpZGVzLmRpc3RyaWJ1dGlvblByb3BzYCkgYWxyZWFkeSBoYXMsIHdoaWNoIGFyZSBub3QgY291bnRlZC5cbiAgICogQGRlZmF1bHQgNzUgLSBDbG91ZEZyb250J3MgZGVmYXVsdCBxdW90YVxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q2FjaGVCZWhhdmlvcnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBpZiBgTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU2Agb3IgYE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSU2AuXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSBsb2FkQmFsYW5jZXI/OiBhd3NfZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi5JQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBpZiBgTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TYC5cbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uVXJsPzogYXdzX2xhbWJkYS5JRnVuY3Rpb25Vcmw7XG4gIC8qKlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uPzogYXdzX2Nsb3VkZnJvbnQuRGlzdHJpYnV0aW9uO1xuICAvKipcbiAgICogT3B0aW9uYWwgYnV0IG9ubHkgYXBwbGljYWJsZSBmb3IgYE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNgLlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2VydGlmaWNhdGU/OiBhd3NfY2VydGlmaWNhdGVtYW5hZ2VyLklDZXJ0aWZpY2F0ZTtcbiAgLyoqXG4gICAqIFVSSSBwYXRoIHByZWZpeCB0aGUgYXBwIGlzIHNlcnZlZCBhdC5cbiAgICogU3Vycm91bmRpbmcgc2xhc2hlcyBhcmUgbm9ybWFsaXplZFxuICAgKiBhd2F5LCBzbyBcIi9iYXNlXCIsIFwiYmFzZVwiIGFuZCBcIi9iYXNlL1wiIGFsbCBwcm9kdWNlIHRoZSBzYW1lIGNhY2hlIGJlaGF2aW9ycy5cbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGFwcCdzIG93biBgYXNzZXRQcmVmaXhgLlxuICAgKiBOZXh0LmpzIGVtaXRzIGA8YXNzZXRQcmVmaXg+L19uZXh0L3N0YXRpYy8uLi5gXG4gICAqIGZvciBldmVyeSBidW5kbGUgd2hpbGUgdGhlIG9iamVjdHMgc3RheSBhdCBgPGJhc2VQYXRoPi9fbmV4dC9zdGF0aWMvLi4uYCBpblxuICAgKiBTMywgc28gdGhlIHByZWZpeCdzIHBhdGggZ2V0cyBhIGNhY2hlIGJlaGF2aW9yIG9mIGl0cyBvd24gdGhhdCByZXdyaXRlcyBpdFxuICAgKiBhd2F5LlxuICAgKlxuICAgKiBFaXRoZXIgZm9ybSBpcyBhY2NlcHRlZDogYSBwYXRoIChcIi9jZG5cIiksIG9yIGFuIGFic29sdXRlIFVSTCwgaW4gd2hpY2ggY2FzZVxuICAgKiBvbmx5IGl0cyBwYXRoIGNvdW50cyAoXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbS9jZG5cIiBiZWhhdmVzIGFzIFwiL2NkblwiLCBhbmRcbiAgICogXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbVwiIG5lZWRzIG5vIGJlaGF2aW9yIGF0IGFsbCkuIEFuIGFic29sdXRlIHByZWZpeCdzIHBhdGhcbiAgICogbWF0dGVycyBiZWNhdXNlIGBuZXh0IGJ1aWxkYCBjb21waWxlcyBhIGAvY2RuL19uZXh0LzpwYXRoK2AgcmV3cml0ZSBvZiBpdHNcbiAgICogb3duLCBzbyBgbmV4dCBzdGFydGAgc2VydmVzIGV2ZXJ5IGJ1bmRsZSB1bmRlciBpdCDigJQgYSBDRE4gZnJvbnRpbmcgdGhpc1xuICAgKiBkaXN0cmlidXRpb24gdGhlcmUgaGFzIHRvIGJlIGFuc3dlcmVkIHRvby5cbiAgICpcbiAgICogQXBwbGllZCBvbiB0b3Agb2YgYGJhc2VQYXRoYCwgbm90IHVuZGVyIGl0LCBiZWNhdXNlIHRoYXQgaXMgaG93IE5leHQuanNcbiAgICogYnVpbGRzIHRoZSBVUkwuXG4gICAqIEBkZWZhdWx0IC0gbm9uZTsgcGFzcyBgTmV4dGpzQnVpbGQubmV4dENvbmZpZ0Fzc2V0UHJlZml4UGF0aGBcbiAgICogQHN0YWJpbGl0eSBzdGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0UHJlZml4Pzogc3RyaW5nO1xuICAvKipcbiAgICogRW50cmllcyAoZmlsZXMvZGlyZWN0b3JpZXMpIHdpdGhpbiBOZXh0LmpzIGFwcCdzIHB1YmxpYyBkaXJlY3RvcnkuIFVzZWQgdG8gYWRkIHN0YXRpYyBiZWhhdmlvcnMgdG8gZGlzdHJpYnV0aW9uLlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljRGlyRW50cmllcz86IEFycmF5PFB1YmxpY0RpckVudHJ5PjtcbiAgLyoqXG4gICAqIEBzdGFiaWxpdHkgc3RhYmxlXG4gICAqL1xuICByZWFkb25seSBuZXh0anNUeXBlPzogTmV4dGpzVHlwZTtcbiAgLyoqXG4gICAqIEJ1Y2tldCBjb250YWluaW5nIHN0YXRpYyBhc3NldHMuXG4gICAqIE11c3QgYmUgcHJvdmlkZWQgaWYgeW91IHdhbnQgdG8gc2VydmUgc3RhdGljIGZpbGVzLlxuICAgKiBAc3RhYmlsaXR5IHN0YWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRzQnVja2V0PzogYXdzX3MzLklCdWNrZXQ7XG59XG4iXX0=
|
package/lib/nextjs-api.d.ts
CHANGED
|
@@ -51,6 +51,15 @@ export interface NextjsApiProps {
|
|
|
51
51
|
* applied.
|
|
52
52
|
*/
|
|
53
53
|
readonly staticAssetsKeyPrefix?: string;
|
|
54
|
+
/**
|
|
55
|
+
* The `Service-Worker-Allowed` header for `_next/static/service-worker/*`,
|
|
56
|
+
* which Next.js sends so a compiled service worker can register at a scope
|
|
57
|
+
* wider than its own directory, such as `/`. S3 can't send an arbitrary
|
|
58
|
+
* header, so setting this adds a resource for those files whose integration
|
|
59
|
+
* response does. Next.js uses the app's `basePath`, or `/` for none.
|
|
60
|
+
* @default - no resource; the build has no service worker
|
|
61
|
+
*/
|
|
62
|
+
readonly serviceWorkerAllowed?: string;
|
|
54
63
|
/**
|
|
55
64
|
* [Future] Required if `NextjsRegionalContainers`. VPC to create VPC Link and ECS Service Discovery
|
|
56
65
|
*/
|
|
@@ -155,8 +164,10 @@ export declare class NextjsApi extends Construct {
|
|
|
155
164
|
* Maps API request to S3 request.
|
|
156
165
|
* @see https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-parameter-mapping-sources.html
|
|
157
166
|
* @see https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html#api-items-in-folder-as-s3-objects-in-bucket
|
|
167
|
+
* @param headers fixed response headers, sent with a 200 and a 304
|
|
158
168
|
*/
|
|
159
169
|
private createS3Integration;
|
|
170
|
+
/** @param headers the fixed headers `createS3Integration` was given */
|
|
160
171
|
private getStaticMethodOptions;
|
|
161
172
|
/**
|
|
162
173
|
* One resource subtree per function group pattern.
|
package/lib/nextjs-api.js
CHANGED
|
@@ -22,7 +22,7 @@ const API_PATH_PART = /^[a-zA-Z0-9:._\-$]+$/;
|
|
|
22
22
|
* Creates an API Gateway REST API for Next.js applications
|
|
23
23
|
*/
|
|
24
24
|
class NextjsApi extends constructs_1.Construct {
|
|
25
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.7.
|
|
25
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.7.14" };
|
|
26
26
|
/**
|
|
27
27
|
* The API Gateway REST API
|
|
28
28
|
*/
|
|
@@ -215,10 +215,23 @@ class NextjsApi extends constructs_1.Construct {
|
|
|
215
215
|
return staticIntegrationRole;
|
|
216
216
|
}
|
|
217
217
|
createStaticIntegrations() {
|
|
218
|
-
this.nextResource
|
|
219
|
-
|
|
218
|
+
const staticResource = this.nextResource.addResource("static");
|
|
219
|
+
staticResource
|
|
220
220
|
.addResource("{proxy+}")
|
|
221
221
|
.addMethod("GET", this.createS3Integration({ key: this.s3Key("_next/static/{key}") }), this.getStaticMethodOptions({ proxy: true }));
|
|
222
|
+
const { serviceWorkerAllowed } = this.props;
|
|
223
|
+
if (serviceWorkerAllowed !== undefined) {
|
|
224
|
+
// A literal segment beats `{proxy+}`, so service workers get the one
|
|
225
|
+
// header S3 can't send, and the rest of `_next/static` is unaffected.
|
|
226
|
+
const headers = { "Service-Worker-Allowed": serviceWorkerAllowed };
|
|
227
|
+
staticResource
|
|
228
|
+
.addResource("service-worker")
|
|
229
|
+
.addResource("{proxy+}")
|
|
230
|
+
.addMethod("GET", this.createS3Integration({
|
|
231
|
+
key: this.s3Key("_next/static/service-worker/{key}"),
|
|
232
|
+
headers,
|
|
233
|
+
}), this.getStaticMethodOptions({ proxy: true, headers }));
|
|
234
|
+
}
|
|
222
235
|
// add public directory files/directories that exist at top level but need to go to S3.
|
|
223
236
|
const unroutable = [];
|
|
224
237
|
for (const publicDirEntry of this.props.publicDirEntries) {
|
|
@@ -266,9 +279,15 @@ class NextjsApi extends constructs_1.Construct {
|
|
|
266
279
|
* Maps API request to S3 request.
|
|
267
280
|
* @see https://docs.aws.amazon.com/apigateway/latest/developerguide/rest-api-parameter-mapping-sources.html
|
|
268
281
|
* @see https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html#api-items-in-folder-as-s3-objects-in-bucket
|
|
282
|
+
* @param headers fixed response headers, sent with a 200 and a 304
|
|
269
283
|
*/
|
|
270
|
-
createS3Integration({ key }) {
|
|
271
|
-
|
|
284
|
+
createS3Integration({ key, headers = {}, }) {
|
|
285
|
+
// A static value is a single-quoted literal in a mapping expression.
|
|
286
|
+
const fixedHeaders = Object.fromEntries(Object.entries(headers).map(([name, value]) => [
|
|
287
|
+
`method.response.header.${name}`,
|
|
288
|
+
`'${value}'`,
|
|
289
|
+
]));
|
|
290
|
+
const props = {
|
|
272
291
|
service: "s3",
|
|
273
292
|
integrationHttpMethod: "GET",
|
|
274
293
|
path: `${this.props.staticAssetsBucket.bucketName}/${key}`,
|
|
@@ -316,11 +335,24 @@ class NextjsApi extends constructs_1.Construct {
|
|
|
316
335
|
],
|
|
317
336
|
},
|
|
318
337
|
...this.props.overrides?.staticIntegrationProps,
|
|
338
|
+
};
|
|
339
|
+
// Added after the override, which replaces `options` whole, so the
|
|
340
|
+
// headers survive one that sets its own integration responses.
|
|
341
|
+
return new aws_apigateway_1.AwsIntegration({
|
|
342
|
+
...props,
|
|
343
|
+
options: props.options && {
|
|
344
|
+
...props.options,
|
|
345
|
+
integrationResponses: withFixedHeaders(props.options.integrationResponses, fixedHeaders),
|
|
346
|
+
},
|
|
319
347
|
});
|
|
320
|
-
return s3Integration;
|
|
321
348
|
}
|
|
322
|
-
|
|
323
|
-
|
|
349
|
+
/** @param headers the fixed headers `createS3Integration` was given */
|
|
350
|
+
getStaticMethodOptions({ proxy = false, headers = {}, } = {}) {
|
|
351
|
+
const fixedHeaders = Object.fromEntries(Object.keys(headers).map((name) => [
|
|
352
|
+
`method.response.header.${name}`,
|
|
353
|
+
true,
|
|
354
|
+
]));
|
|
355
|
+
const options = {
|
|
324
356
|
requestParameters: {
|
|
325
357
|
// Declared optional (`false`): a plain GET carries neither, and
|
|
326
358
|
// requiring them would 400 it.
|
|
@@ -353,6 +385,13 @@ class NextjsApi extends constructs_1.Construct {
|
|
|
353
385
|
],
|
|
354
386
|
...this.props.overrides?.s3MethodOptions,
|
|
355
387
|
};
|
|
388
|
+
// After the override, as in `createS3Integration`: API Gateway rejects an
|
|
389
|
+
// integration response mapping a header its method response doesn't
|
|
390
|
+
// declare, so the two have to survive an override together.
|
|
391
|
+
return {
|
|
392
|
+
...options,
|
|
393
|
+
methodResponses: withFixedHeaders(options.methodResponses, fixedHeaders),
|
|
394
|
+
};
|
|
356
395
|
}
|
|
357
396
|
/**
|
|
358
397
|
* One resource subtree per function group pattern.
|
|
@@ -539,4 +578,19 @@ class NextjsApi extends constructs_1.Construct {
|
|
|
539
578
|
}
|
|
540
579
|
}
|
|
541
580
|
exports.NextjsApi = NextjsApi;
|
|
542
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSx5Q0FBaUM7QUFDakMsNkNBQWlFO0FBQ2pFLCtEQVlvQztBQUVwQyx1REFBOEM7QUFDOUMsdUVBQXdGO0FBQ3hGLGlEQUs2QjtBQUM3Qix1REFPZ0M7QUFFaEMsMkNBQXVDO0FBQ3ZDLDJDQUF5QztBQU16QyxpRUFBb0U7QUFDcEUsaURBQWdFO0FBRWhFOzs7R0FHRztBQUNILE1BQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDO0FBeUY3Qzs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLHNCQUFTOztJQUN0Qzs7T0FFRztJQUNhLEdBQUcsQ0FBVTtJQUU3Qjs7Ozs7Ozs7T0FRRztJQUNILElBQUksR0FBRztRQUNMLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3pDLHdFQUF3RTtRQUN4RSxvRUFBb0U7UUFDcEUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxZQUFZO1lBQ25DLENBQUMsQ0FBQztnQkFDRSxXQUFXLFlBQVksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUTthQUN6RDtZQUNILENBQUMsQ0FBQztnQkFDRSxXQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxnQkFBZ0IsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxnQkFBZ0I7Z0JBQ2xGLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVM7YUFDbkMsQ0FBQztRQUNOLE9BQU8sSUFBQSxvQkFBUSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7OztPQUdH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QztRQUNsRCxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsYUFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQWpsQkgsOEJBa2xCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgRHVyYXRpb24sIFNpemUsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBSZXN0QXBpLFxuICBMYW1iZGFJbnRlZ3JhdGlvbixcbiAgQXdzSW50ZWdyYXRpb24sXG4gIE1ldGhvZE9wdGlvbnMsXG4gIElSZXNvdXJjZSxcbiAgRW5kcG9pbnRUeXBlLFxuICBSZXN0QXBpUHJvcHMsXG4gIEF3c0ludGVncmF0aW9uUHJvcHMsXG4gIExhbWJkYUludGVncmF0aW9uT3B0aW9ucyxcbiAgUGFzc3Rocm91Z2hCZWhhdmlvcixcbiAgUmVzcG9uc2VUcmFuc2Zlck1vZGUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheVwiO1xuaW1wb3J0IHsgSVZwYyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIGFzIExhbWJkYUZ1bmN0aW9uVGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0IHtcbiAgUm9sZSxcbiAgU2VydmljZVByaW5jaXBhbCxcbiAgUG9saWN5U3RhdGVtZW50LFxuICBJUm9sZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7XG4gIEFyY2hpdGVjdHVyZSxcbiAgQ29kZSxcbiAgRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb24sXG4gIElGdW5jdGlvbixcbiAgUnVudGltZSxcbiAgUnVudGltZUZhbWlseSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IElCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxGdW5jdGlvblByb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbkdyb3VwQmVoYXZpb3IsXG4gIFB1YmxpY0RpckVudHJ5LFxufSBmcm9tIFwiLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBzdGF0aWNBc3NldHNPYmplY3RzUGF0dGVybiB9IGZyb20gXCIuL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5pbXBvcnQgeyBqb2luUGF0aCwgbm9ybWFsaXplQmFzZVBhdGggfSBmcm9tIFwiLi91dGlscy9iYXNlLXBhdGhcIjtcblxuLyoqXG4gKiBXaGF0IEFQSSBHYXRld2F5IGFjY2VwdHMgYXMgYSByZXNvdXJjZSBwYXRoIHBhcnQsIHBlciBDREsncyBvd24gY2hlY2sgaW5cbiAqIGBSZXNvdXJjZWA6IGBbYS16QS1aMC05Oi5fLSRdYCwgcGx1cyBhbiBvcHRpb25hbCB0cmFpbGluZyBgK2AuXG4gKi9cbmNvbnN0IEFQSV9QQVRIX1BBUlQgPSAvXlthLXpBLVowLTk6Ll9cXC0kXSskLztcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBcGlPdmVycmlkZXMge1xuICByZWFkb25seSByZXN0QXBpUHJvcHM/OiBSZXN0QXBpUHJvcHM7XG4gIHJlYWRvbmx5IHN0YXRpY0ludGVncmF0aW9uUHJvcHM/OiBBd3NJbnRlZ3JhdGlvblByb3BzO1xuICByZWFkb25seSBzM01ldGhvZE9wdGlvbnM/OiBNZXRob2RPcHRpb25zO1xuICByZWFkb25seSBkeW5hbWljSW50ZWdyYXRpb25Qcm9wcz86IExhbWJkYUludGVncmF0aW9uT3B0aW9ucztcbiAgLyoqXG4gICAqIFByb3BzIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBkZXBsb3lzIHRoZSBzdGFnZSBhZ2FpbiBhZnRlciBlYWNoIHN0YWNrXG4gICAqIHVwZGF0ZS5cbiAgICogQHNlZSBOZXh0anNBcGlQcm9wcy5yZWRlcGxveUFmdGVyVXBkYXRlXG4gICAqL1xuICByZWFkb25seSByZWRlcGxveUZ1bmN0aW9uUHJvcHM/OiBPcHRpb25hbEZ1bmN0aW9uUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXBpUHJvcHMge1xuICAvKipcbiAgICogT3B0aW9uYWwgYmFzZSBwYXRoIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgZm9yIGV2ZXJ5IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0FwaU92ZXJyaWRlcztcbiAgLyoqXG4gICAqIFBhdGggdG8gZGlyZWN0b3J5IG9mIE5leHQuanMgYXBwJ3MgcHVibGljIGRpcmVjdG9yeS4gVXNlZCB0byBhZGQgcmVzb3VyY2VzXG4gICAqIHRvIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBwdWJsaWMgZGlyZWN0b3J5IHRvIGdvIGRpcmVjdGx5IHRvIFMzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljRGlyRW50cmllczogUHVibGljRGlyRW50cnlbXTtcbiAgLyoqXG4gICAqIFJlcXVpcmVkIGlmIGBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc2AuIFRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyRnVuY3Rpb24/OiBJRnVuY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgUzMgYnVja2V0IGNvbnRhaW5pbmcgc3RhdGljIGFzc2V0c1xuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzQnVja2V0OiBJQnVja2V0O1xuICAvKipcbiAgICogUzMga2V5IHByZWZpeCB0aGUgc3RhdGljIGFzc2V0cyB3ZXJlIHVwbG9hZGVkIHVuZGVyLCBpLmUuXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4YCwgd2hpY2ggbmFtZXNwYWNlcyBhIHNoYXJlZCBidWNrZXQuXG4gICAqXG4gICAqIEluZGVwZW5kZW50IG9mIGBiYXNlUGF0aGAgYWJvdmU6IHRoYXQgb25lIGlzIHRoZSBVUkwgcHJlZml4IHRoZSBSRVNUIEFQSVxuICAgKiBzZXJ2ZXMgdGhlIGFwcCBhdCAoY29tbW9ubHkgdGhlIEFQSSBHYXRld2F5IHN0YWdlKSwgd2hpbGUgdGhpcyBvbmUgaXMgd2hlcmVcbiAgICogdGhlIG9iamVjdHMgbGl2ZSBpbiB0aGUgYnVja2V0LiBgX25leHQvc3RhdGljYCBhbmQgcHVibGljIGRpcmVjdG9yeVxuICAgKiByZXF1ZXN0cyBhcmUgbWFwcGVkIHRvIFMzIGtleXMgZGlyZWN0bHksIHNvIHRoZXkgNDA0IHVubGVzcyB0aGlzIHByZWZpeCBpc1xuICAgKiBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzS2V5UHJlZml4Pzogc3RyaW5nO1xuICAvKipcbiAgICogW0Z1dHVyZV0gUmVxdWlyZWQgaWYgYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2AuIFZQQyB0byBjcmVhdGUgVlBDIExpbmsgYW5kIEVDUyBTZXJ2aWNlIERpc2NvdmVyeVxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcbiAgLyoqXG4gICAqIFRoZSBub24tYGRlZmF1bHRgIGZ1bmN0aW9uIGdyb3VwcywgdGhlIExhbWJkYXNcbiAgICoge0BsaW5rIGZ1bmN0aW9uR3JvdXBCZWhhdmlvcnN9IHJvdXRlIHRvLlxuICAgKiBAZGVmYXVsdCAtIG5vIHNwbGl0dGluZzsgYHtwcm94eSt9YCBzZXJ2ZXMgZXZlcnkgZHluYW1pYyByb3V0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cHM/OiBOZXh0anNBcGlGdW5jdGlvbkdyb3VwW107XG4gIC8qKlxuICAgKiBgTmV4dGpzQnVpbGQuZnVuY3Rpb25Hcm91cEJlaGF2aW9yc2A6IGVhY2ggZGlzdGluY3QgYHJvdXRlYCBiZWNvbWVzIGFcbiAgICogcmVzb3VyY2Ugc3VidHJlZSBpbnRlZ3JhdGVkIHdpdGggaXRzIGdyb3VwLCBzbyB0aGUgcm91dGVzIGVhY2ggZ3JvdXAgd2FzXG4gICAqIHBhY2thZ2VkIHdpdGggcmVhY2ggaXQgcmF0aGVyIHRoYW4ge0BsaW5rIHNlcnZlckZ1bmN0aW9ufS5cbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzPzogTmV4dGpzRnVuY3Rpb25Hcm91cEJlaGF2aW9yW107XG4gIC8qKlxuICAgKiBEZXBsb3kgdGhlIHN0YWdlIGFnYWluIG9uY2UgZWFjaCBzdGFjayB1cGRhdGUgaGFzIGZpbmlzaGVkLCBzbyBpdCBzZXJ2ZXNcbiAgICogdGhlIEFQSSBhcyBpdCBpcyBhZnRlciB0aGUgdXBkYXRlLlxuICAgKlxuICAgKiBDbG91ZEZvcm1hdGlvbiBzbmFwc2hvdHMgdGhlIEFQSSBpbnRvIGEgbmV3IGRlcGxveW1lbnQgd2hpbGUgcmVzb3VyY2VzXG4gICAqIHJlbW92ZWQgZnJvbSB0aGUgdGVtcGxhdGUgc3RpbGwgZXhpc3Qg4oCUIGl0IGRlbGV0ZXMgdGhlbSBvbmx5IGR1cmluZ1xuICAgKiBjbGVhbnVwIOKAlCBzbyB0aGUgc3RhZ2Uga2VlcHMgc2VydmluZyB0aGVtLiBBZnRlciByZW1vdmluZyBhIGZ1bmN0aW9uXG4gICAqIGdyb3VwLCBpdHMgcm91dGVzIHRoZW4gcG9pbnQgYXQgYSBkZWxldGVkIExhbWJkYSBhbmQgYW5zd2VyIDUwMCB1bnRpbCB0aGVcbiAgICogbmV4dCBkZXBsb3ltZW50LiBBbiBFdmVudEJyaWRnZSBydWxlIG9uIHRoaXMgc3RhY2sncyBgVVBEQVRFX0NPTVBMRVRFYFxuICAgKiAoYW5kIGBVUERBVEVfUk9MTEJBQ0tfQ09NUExFVEVgKSBpbnZva2VzIGEgc21hbGwgZnVuY3Rpb24gdGhhdCBkZXBsb3lzIHRoZVxuICAgKiBzdGFnZSBmcm9tIHRoZSBsaXZlIEFQSSBhbmQgZGVsZXRlcyB0aGUgZGVwbG95bWVudHMgaXRzIGVhcmxpZXIgcnVucyBtYWRlLlxuICAgKlxuICAgKiBJZ25vcmVkIHdoZW4gYG92ZXJyaWRlcy5yZXN0QXBpUHJvcHMuZGVwbG95YCBpcyBgZmFsc2VgOiB0aGVyZSBpcyBubyBzdGFnZS5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVkZXBsb3lBZnRlclVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKiBBIG5vbi1kZWZhdWx0IGZ1bmN0aW9uIGdyb3VwIGFuZCB0aGUgTGFtYmRhIGl0cyByb3V0ZXMgbXVzdCByZWFjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXBpRnVuY3Rpb25Hcm91cCB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZnVuY3Rpb246IElGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIEFQSSBHYXRld2F5IFJFU1QgQVBJIGZvciBOZXh0LmpzIGFwcGxpY2F0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQXBpIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgR2F0ZXdheSBSRVNUIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaTogUmVzdEFwaTtcblxuICAvKipcbiAgICogUHVibGljIFVSTCBvZiB0aGUgYXBwLCBpbmNsdWRpbmcgZXZlcnkgcGF0aCBzZWdtZW50IHRoZSBBUEkgbmVzdHMgaXQgdW5kZXIuXG4gICAqIFByZWZlcnMgYSBjdXN0b20gZG9tYWluIGNvbmZpZ3VyZWQgdGhyb3VnaCBgb3ZlcnJpZGVzLnJlc3RBcGlQcm9wcy5kb21haW5OYW1lYFxuICAgKiBvdmVyIHRoZSBleGVjdXRlLWFwaSBlbmRwb2ludC5cbiAgICpcbiAgICogQSBkb21haW4gYXR0YWNoZWQgYWZ0ZXIgdGhpcyBjb25zdHJ1Y3QgaXMgY3JlYXRlZCAoYGFwaS5hZGREb21haW5OYW1lKClgKSBpc1xuICAgKiBzdGlsbCB1c2VkIGZvciB0aGUgaG9zdCwgYnV0IENESyBrZWVwcyBpdHMgYmFzZSBwYXRoIG1hcHBpbmdzIHByaXZhdGUsIHNvIGFcbiAgICogbWFwcGluZyBhZGRlZCB0aGF0IHdheSB3b24ndCBzaG93IHVwIGhlcmUuXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY3VzdG9tRG9tYWluID0gdGhpcy5hcGkuZG9tYWluTmFtZTtcbiAgICAvLyBBIGN1c3RvbSBkb21haW4gcmVhY2hlcyB0aGUgc3RhZ2UgdGhyb3VnaCBhIGJhc2UgcGF0aCBtYXBwaW5nLCBzbyB0aGVcbiAgICAvLyBzdGFnZSBuYW1lIGlzbid0IGluIHRoZSBwYXRoIHRoZXJlOyB0aGUgbWFwcGluZyBtYXkgYmUsIHdoZW4gc2V0LlxuICAgIGNvbnN0IFtvcmlnaW4sIHByZWZpeF0gPSBjdXN0b21Eb21haW5cbiAgICAgID8gW1xuICAgICAgICAgIGBodHRwczovLyR7Y3VzdG9tRG9tYWluLmRvbWFpbk5hbWV9YCxcbiAgICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8ucmVzdEFwaVByb3BzPy5kb21haW5OYW1lPy5iYXNlUGF0aCxcbiAgICAgICAgXVxuICAgICAgOiBbXG4gICAgICAgICAgYGh0dHBzOi8vJHt0aGlzLmFwaS5yZXN0QXBpSWR9LmV4ZWN1dGUtYXBpLiR7U3RhY2sub2YodGhpcykucmVnaW9ufS5hbWF6b25hd3MuY29tYCxcbiAgICAgICAgICB0aGlzLmFwaS5kZXBsb3ltZW50U3RhZ2Uuc3RhZ2VOYW1lLFxuICAgICAgICBdO1xuICAgIHJldHVybiBqb2luUGF0aChvcmlnaW4sIHByZWZpeCwgdGhpcy5wcm9wcy5iYXNlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRGVwbG95cyB0aGUgc3RhZ2UgYWdhaW4gYWZ0ZXIgZWFjaCBzdGFjayB1cGRhdGUuXG4gICAqIEBzZWUgTmV4dGpzQXBpUHJvcHMucmVkZXBsb3lBZnRlclVwZGF0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlZGVwbG95RnVuY3Rpb24/OiBMYW1iZGFGdW5jdGlvbjtcbiAgLyoqXG4gICAqIE1hdGNoZXMgdGhpcyBzdGFjaydzIGBVUERBVEVfQ09NUExFVEVgIGFuZCBgVVBEQVRFX1JPTExCQUNLX0NPTVBMRVRFYCBhbmRcbiAgICogaW52b2tlcyB7QGxpbmsgcmVkZXBsb3lGdW5jdGlvbn0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVkZXBsb3lSdWxlPzogUnVsZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VSZXNvdXJjZTogSVJlc291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG5leHRSZXNvdXJjZTogSVJlc291cmNlO1xuICAvKipcbiAgICogUmVzb3VyY2VzIGNyZWF0ZWQgb25seSBhcyBwYXJlbnRzIG9mIGEgZ3JvdXAgcm91dGUsIGFuZCB0aGVpciBwYXRocy4gQVBJXG4gICAqIEdhdGV3YXkgYW5zd2VycyBhIHJlcXVlc3QgZm9yIGEgcmVzb3VyY2Ugd2l0aCBubyBtZXRob2QgaXRzZWxmIOKAlCA0MDNcbiAgICogXCJNaXNzaW5nIEF1dGhlbnRpY2F0aW9uIFRva2VuXCIg4oCUIHJhdGhlciB0aGFuIGZhbGxpbmcgYmFjayB0byBhIGB7cHJveHkrfWBcbiAgICogaGlnaGVyIHVwLCBzbyBlYWNoIG5lZWRzIG9uZS4gV2l0aG91dCBpdCBhIGAvYXBpL3JlcG9ydHMvKipgIGdyb3VwIHR1cm5lZFxuICAgKiBgL2FwaS9yZXBvcnRzYCBhbmQgYC9hcGlgIGludG8gNDAzcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JvdXBQYXJlbnRSZXNvdXJjZXMgPSBuZXcgTWFwPElSZXNvdXJjZSwgc3RyaW5nW10+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IE5leHRqc0FwaVByb3BzO1xuICBwcml2YXRlIHN0YXRpY0ludGVncmF0aW9uUm9sZTogSVJvbGU7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0FwaVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICB0aGlzLnZhbGlkYXRlUHJvcHMocHJvcHMpO1xuICAgIHRoaXMuYXBpID0gdGhpcy5jcmVhdGVSZXN0QXBpKCk7XG4gICAgdGhpcy5iYXNlUmVzb3VyY2UgPSB0aGlzLmNyZWF0ZUJhc2VSZXNvdXJjZShwcm9wcy5iYXNlUGF0aCk7XG4gICAgdGhpcy5uZXh0UmVzb3VyY2UgPSB0aGlzLmJhc2VSZXNvdXJjZS5hZGRSZXNvdXJjZShcIl9uZXh0XCIpO1xuICAgIHRoaXMuc3RhdGljSW50ZWdyYXRpb25Sb2xlID0gdGhpcy5jcmVhdGVTdGF0aWNJbnRlZ3JhdGlvblJvbGUoKTtcbiAgICB0aGlzLmNyZWF0ZVN0YXRpY0ludGVncmF0aW9ucygpO1xuICAgIGlmIChwcm9wcy5zZXJ2ZXJGdW5jdGlvbikge1xuICAgICAgLy8gR3JvdXAgcmVzb3VyY2VzIGJlZm9yZSB0aGUgY2F0Y2gtYWxsLCBzbyBgYWRkUmVzb3VyY2VgIHNlZXMgYSBjbGVhbiB0cmVlXG4gICAgICAvLyBhbmQgYSBncm91cCBjYW4gY2xhaW0gYSBwYXRoIHRoZSBjYXRjaC1hbGwgd291bGQgb3RoZXJ3aXNlIHNlcnZlLlxuICAgICAgdGhpcy5jcmVhdGVGdW5jdGlvbkdyb3VwSW50ZWdyYXRpb25zKCk7XG4gICAgICAvLyBgX25leHQvaW1hZ2VgIGhhcyBubyByZXNvdXJjZSBvZiBpdHMgb3duOiBpdCBmYWxscyB0aHJvdWdoIHRvIHRoZVxuICAgICAgLy8gYHtwcm94eSt9YCBjYXRjaC1hbGwsIGFuZCB0aGUgc2VydmVyIGZ1bmN0aW9uIG9wdGltaXplcyBpbi1wcm9jZXNzLlxuICAgICAgdGhpcy5jcmVhdGVEeW5hbWljSW50ZWdyYXRpb24ocHJvcHMuc2VydmVyRnVuY3Rpb24pO1xuICAgIH0gZWxzZSBpZiAocHJvcHMudnBjKSB7XG4gICAgICAvLyBbRnV0dXJlXSBjcmVhdGUgaW50ZWdyYXRpb24gd2l0aCBFQ1MgdmlhIFZQQyBMaW5rIGFuZCBFQ1MgU2VydmljZSBEaXNjb3ZlcnlcbiAgICB9XG4gICAgaWYgKFxuICAgICAgcHJvcHMucmVkZXBsb3lBZnRlclVwZGF0ZSAhPT0gZmFsc2UgJiZcbiAgICAgIHByb3BzLm92ZXJyaWRlcz8ucmVzdEFwaVByb3BzPy5kZXBsb3kgIT09IGZhbHNlXG4gICAgKSB7XG4gICAgICBbdGhpcy5yZWRlcGxveUZ1bmN0aW9uLCB0aGlzLnJlZGVwbG95UnVsZV0gPSB0aGlzLmNyZWF0ZVJlZGVwbG95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBzZWUgTmV4dGpzQXBpUHJvcHMucmVkZXBsb3lBZnRlclVwZGF0ZSAqL1xuICBwcml2YXRlIGNyZWF0ZVJlZGVwbG95KCk6IFtMYW1iZGFGdW5jdGlvbiwgUnVsZV0ge1xuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG4gICAgY29uc3QgeyByZXN0QXBpSWQgfSA9IHRoaXMuYXBpO1xuICAgIGNvbnN0IHsgc3RhZ2VOYW1lIH0gPSB0aGlzLmFwaS5kZXBsb3ltZW50U3RhZ2U7XG4gICAgY29uc3QgZm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24odGhpcywgXCJSZWRlcGxveUZuXCIsIHtcbiAgICAgIC8vIFBsYWluIGJ1bmRsZWQgSlMgd2l0aCBubyBuYXRpdmUgZGVwZW5kZW5jaWVzOiBhbHdheXMgYXJtNjQuXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChcbiAgICAgICAgam9pbihcbiAgICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgICAgXCIuLi9hc3NldHMvbGFtYmRhcy9yZWRlcGxveS1zdGFnZS9yZWRlcGxveS1zdGFnZS5sYW1iZGFcIixcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIG1lbW9yeVNpemU6IDI1NixcbiAgICAgIHJ1bnRpbWU6IG5ldyBSdW50aW1lKFwibm9kZWpzMjQueFwiLCBSdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnJlZGVwbG95RnVuY3Rpb25Qcm9wcyxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5yZWRlcGxveUZ1bmN0aW9uUHJvcHM/LmVudmlyb25tZW50LFxuICAgICAgICBSRVNUX0FQSV9JRDogcmVzdEFwaUlkLFxuICAgICAgICBTVEFHRV9OQU1FOiBzdGFnZU5hbWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIEFQSSBHYXRld2F5IGF1dGhvcml6ZXMgaXRzIG1hbmFnZW1lbnQgQVBJIGJ5IEhUVFAgdmVyYiBvbiB0aGUgcmVzb3VyY2VcbiAgICAvLyBwYXRoOyB0aGVzZSBhcmUgdGhlIGZvdXIgY2FsbHMgYHJlZGVwbG95U3RhZ2VgIG1ha2VzLCBvbiB0aGlzIEFQSSBvbmx5LlxuICAgIGNvbnN0IHJlc3RBcGkgPSBgYXJuOiR7c3RhY2sucGFydGl0aW9ufTphcGlnYXRld2F5OiR7c3RhY2sucmVnaW9ufTo6L3Jlc3RhcGlzLyR7cmVzdEFwaUlkfWA7XG4gICAgZm4uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcImFwaWdhdGV3YXk6UE9TVFwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbYCR7cmVzdEFwaX0vZGVwbG95bWVudHNgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgZm4uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcImFwaWdhdGV3YXk6R0VUXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtgJHtyZXN0QXBpfS9kZXBsb3ltZW50c2AsIGAke3Jlc3RBcGl9L3N0YWdlc2BdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBmbi5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wiYXBpZ2F0ZXdheTpERUxFVEVcIl0sXG4gICAgICAgIHJlc291cmNlczogW2Ake3Jlc3RBcGl9L2RlcGxveW1lbnRzLypgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgLy8gQ2xvdWRGb3JtYXRpb24gc2VuZHMgZXZlcnkgc3RhY2sgc3RhdHVzIGNoYW5nZSB0byB0aGUgZGVmYXVsdCBldmVudCBidXNcbiAgICAvLyAoXCJNb25pdG9yaW5nIENsb3VkRm9ybWF0aW9uIC4uLiBldmVudHMgd2l0aCBFdmVudEJyaWRnZVwiIGluIHRoZVxuICAgIC8vIENsb3VkRm9ybWF0aW9uIFVzZXIgR3VpZGUpLiBgVVBEQVRFX0NPTVBMRVRFYCBjb21lcyBhZnRlclxuICAgIC8vIGBVUERBVEVfQ09NUExFVEVfQ0xFQU5VUF9JTl9QUk9HUkVTU2AsIHNvIHJlbW92ZWQgcmVzb3VyY2VzIGFyZSBnb25lIGJ5XG4gICAgLy8gdGhlbi4gQSByb2xsYmFjayByZXN0b3JlcyB0aGUgc3RhZ2UgdG8gdGhlIHByZS11cGRhdGUgZGVwbG95bWVudCwgd2hpY2hcbiAgICAvLyBjYW4gY2FycnkgdGhlIHNhbWUgc3RhbGVuZXNzIGZyb20gYW4gZWFybGllciB1cGRhdGUsIHNvIGl0IHJlZGVwbG95cyB0b28uXG4gICAgY29uc3QgcnVsZSA9IG5ldyBSdWxlKHRoaXMsIFwiUmVkZXBsb3lSdWxlXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgUmVkZXBsb3lzICR7c3RhY2suc3RhY2tOYW1lfSdzIFJFU1QgQVBJIHN0YWdlIGFmdGVyIGEgc3RhY2sgdXBkYXRlYCxcbiAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICBzb3VyY2U6IFtcImF3cy5jbG91ZGZvcm1hdGlvblwiXSxcbiAgICAgICAgZGV0YWlsVHlwZTogW1wiQ2xvdWRGb3JtYXRpb24gU3RhY2sgU3RhdHVzIENoYW5nZVwiXSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgXCJzdGFjay1pZFwiOiBbc3RhY2suc3RhY2tJZF0sXG4gICAgICAgICAgXCJzdGF0dXMtZGV0YWlsc1wiOiB7XG4gICAgICAgICAgICBzdGF0dXM6IFtcIlVQREFURV9DT01QTEVURVwiLCBcIlVQREFURV9ST0xMQkFDS19DT01QTEVURVwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhcmdldHM6IFtuZXcgTGFtYmRhRnVuY3Rpb25UYXJnZXQoZm4sIHsgcmV0cnlBdHRlbXB0czogMiB9KV0sXG4gICAgfSk7XG4gICAgcmV0dXJuIFtmbiwgcnVsZV07XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlUHJvcHMocHJvcHM6IE5leHRqc0FwaVByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy5zZXJ2ZXJGdW5jdGlvbiAmJiAhcHJvcHMudnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZXJ2ZXJGdW5jdGlvbiBvciB2cGMgbXVzdCBiZSBzZXQgaW4gTmV4dGpzQXBpUHJvcHNcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZXN0QXBpKCk6IFJlc3RBcGkge1xuICAgIHJldHVybiBuZXcgUmVzdEFwaSh0aGlzLCBcIlJlc3RBcGlcIiwge1xuICAgICAgYmluYXJ5TWVkaWFUeXBlczogW1wiKi8qXCJdLFxuICAgICAgZGVzY3JpcHRpb246IGBjZGstbmV4dGpzIFJFU1QgQVBJIGZvciAke1N0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX1gLFxuICAgICAgZW5kcG9pbnRUeXBlczogW0VuZHBvaW50VHlwZS5SRUdJT05BTF0sXG4gICAgICAvLyBJbmVydCBmb3IgdGhlIGR5bmFtaWMgcm91dGVzOiBBUEkgR2F0ZXdheSBkb2VzIG5vdCBjb21wcmVzcyBhIHJlc3BvbnNlIGl0XG4gICAgICAvLyBzdHJlYW1zIChgUmVzcG9uc2VUcmFuc2Zlck1vZGUuU1RSRUFNYCksIHdoaWNoIGV2ZXJ5IExhbWJkYSBpbnRlZ3JhdGlvblxuICAgICAgLy8gaGVyZSB1c2VzLCBzbyB0aGUgcnVudGltZSBnemlwcyB0aG9zZSBpdHNlbGYuIEtlcHQgYmVjYXVzZSBpdCBzdGlsbFxuICAgICAgLy8gYXBwbGllcyB0byB0aGUgYnVmZmVyZWQgUzMgc3RhdGljIGludGVncmF0aW9ucywgYW5kIGJlY2F1c2UgYSBjb25zdW1lclxuICAgICAgLy8gd2hvIG92ZXJyaWRlcyBhbiBpbnRlZ3JhdGlvbiB0byBCVUZGRVJFRCBnZXRzIGNvbXByZXNzaW9uIGJhY2suXG4gICAgICBtaW5Db21wcmVzc2lvblNpemU6IFNpemUuYnl0ZXMoMCksXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ucmVzdEFwaVByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBiYXNlIHJlc291cmNlIHBhdGggaWYgbmVlZGVkLiBJbXBvcnRhbnQgaWYgYGJhc2VQYXRoYCBpcyBzZXQuXG4gICAqXG4gICAqIEEgbmVzdGVkIGBiYXNlUGF0aGAgKFwiL3RlYW0vYXBwXCIpIGhhcyB0byBiZWNvbWUgb25lIHJlc291cmNlIHBlciBzZWdtZW50OlxuICAgKiBBUEkgR2F0ZXdheSBwYXRoIHBhcnRzIGNhbid0IGNvbnRhaW4gXCIvXCIsIHNvIHBhc3NpbmcgdGhlIHdob2xlIHRoaW5nIHRvIGFcbiAgICogc2luZ2xlIGBhZGRSZXNvdXJjZWAgZmFpbHMgdmFsaWRhdGlvbiBhdCBzeW50aC4gYHJlc29sdmVCYXNlUGF0aGAgYWNjZXB0c1xuICAgKiBuZXN0ZWQgdmFsdWVzLCBzbyB0aGlzIGlzIHJlYWNoYWJsZS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQmFzZVJlc291cmNlKGJhc2VQYXRoPzogc3RyaW5nKTogSVJlc291cmNlIHtcbiAgICAvLyBDcmVhdGUgYmFzZSByZXNvdXJjZSBwYXRoIGlmIG5lZWRlZFxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVCYXNlUGF0aChiYXNlUGF0aCk7XG4gICAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcGkucm9vdDtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5yZWR1Y2U8SVJlc291cmNlPihcbiAgICAgICAgKHBhcmVudCwgc2VnbWVudCkgPT4gcGFyZW50LmFkZFJlc291cmNlKHNlZ21lbnQpLFxuICAgICAgICB0aGlzLmFwaS5yb290LFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCkge1xuICAgIC8vIENyZWF0ZSBTMyBpbnRlZ3JhdGlvbiByb2xlXG4gICAgY29uc3Qgc3RhdGljSW50ZWdyYXRpb25Sb2xlID0gbmV3IFJvbGUodGhpcywgXCJTdGF0aWNJbnRlZ3JhdGlvblJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICB9KTtcblxuICAgIC8vIE9ubHkgdGhpcyBhcHAncyBvd24gb2JqZWN0czogYSBzaGFyZWQgYnVja2V0IGhvbGRzIG90aGVyIGFwcHMnIGFzc2V0c1xuICAgIC8vIHVuZGVyIHRoZWlyIG93biBwcmVmaXhlcy4gYHMzOkxpc3RCdWNrZXRgIG1ha2VzIGEgbWlzc2luZyBrZXkgYSA0MDQgKHRoZVxuICAgIC8vIG9ubHkgZXJyb3IgdGhlIGludGVncmF0aW9uIG1hcHMpIHJhdGhlciB0aGFuIGEgNDAzLiBJdCBzdGF5cyB1bmNvbmRpdGlvbmVkOlxuICAgIC8vIFMzIGNoZWNrcyBpdCBkdXJpbmcgYSBHZXRPYmplY3QsIHdoZXJlIG5vIGBzMzpwcmVmaXhgIGlzIHByZXNlbnQsIHNvIGFcbiAgICAvLyBwcmVmaXggY29uZGl0aW9uIHdvdWxkIHR1cm4gZXZlcnkgbWlzc2luZyBrZXkgYmFjayBpbnRvIGEgNDAzLlxuICAgIHN0YXRpY0ludGVncmF0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXRPYmplY3RcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGAke3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldEFybn0vJHtzdGF0aWNBc3NldHNPYmplY3RzUGF0dGVybih0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0tleVByZWZpeCl9YCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgc3RhdGljSW50ZWdyYXRpb25Sb2xlLmFkZFRvUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcInMzOkxpc3RCdWNrZXRcIl0sXG4gICAgICAgIHJlc291cmNlczogW3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldEFybl0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBzdGF0aWNJbnRlZ3JhdGlvblJvbGU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRpY0ludGVncmF0aW9ucygpIHtcbiAgICB0aGlzLm5leHRSZXNvdXJjZVxuICAgICAgLmFkZFJlc291cmNlKFwic3RhdGljXCIpXG4gICAgICAuYWRkUmVzb3VyY2UoXCJ7cHJveHkrfVwiKVxuICAgICAgLmFkZE1ldGhvZChcbiAgICAgICAgXCJHRVRcIixcbiAgICAgICAgdGhpcy5jcmVhdGVTM0ludGVncmF0aW9uKHsga2V5OiB0aGlzLnMzS2V5KFwiX25leHQvc3RhdGljL3trZXl9XCIpIH0pLFxuICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eTogdHJ1ZSB9KSxcbiAgICAgICk7XG4gICAgLy8gYWRkIHB1YmxpYyBkaXJlY3RvcnkgZmlsZXMvZGlyZWN0b3JpZXMgdGhhdCBleGlzdCBhdCB0b3AgbGV2ZWwgYnV0IG5lZWQgdG8gZ28gdG8gUzMuXG4gICAgY29uc3QgdW5yb3V0YWJsZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHB1YmxpY0RpckVudHJ5IG9mIHRoaXMucHJvcHMucHVibGljRGlyRW50cmllcykge1xuICAgICAgLy8gQSBzcGFjZSBvciBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIgaXMgbGVnYWwgaW4gYHB1YmxpYy9gIGFuZCBpbGxlZ2FsIGluIGFuXG4gICAgICAvLyBBUEkgR2F0ZXdheSByZXNvdXJjZSBwYXRoIHBhcnQsIGFuZCBgYWRkUmVzb3VyY2VgIHRocm93cyDigJQgd2hpY2ggdG9vayB0aGVcbiAgICAgIC8vIHdob2xlIHN5bnRoIGRvd24gZm9yIGFuIGFwcCB0aGF0IGRlcGxveXMgZmluZSBvbiB0aGUgR2xvYmFsIHR5cGVzXG4gICAgICAvLyAoYG5leHQtaW1hZ2UtbGVnYWN5L3VuaWNvZGVgLCB3aG9zZSBgcHVibGljL2AgaG9sZHMgXCJoZWxsbyB3b3JsZC5qcGdcIikuXG4gICAgICAvLyBXYXJuIGFuZCBza2lwIHRoZSBvbmUgZW50cnkgaW5zdGVhZDogdGhhdCBhc3NldCA0MDRzLCB0aGUgYXBwIGRlcGxveXMuXG4gICAgICBpZiAoIUFQSV9QQVRIX1BBUlQudGVzdChwdWJsaWNEaXJFbnRyeS5uYW1lKSkge1xuICAgICAgICB1bnJvdXRhYmxlLnB1c2goYFwiJHtwdWJsaWNEaXJFbnRyeS5uYW1lfVwiYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHB1YmxpY0RpckVudHJ5LmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIHRoaXMuYmFzZVJlc291cmNlXG4gICAgICAgICAgLmFkZFJlc291cmNlKHB1YmxpY0RpckVudHJ5Lm5hbWUpXG4gICAgICAgICAgLmFkZFJlc291cmNlKFwie3Byb3h5K31cIilcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7XG4gICAgICAgICAgICAgIGtleTogdGhpcy5zM0tleShgJHtwdWJsaWNEaXJFbnRyeS5uYW1lfS97a2V5fWApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoeyBwcm94eTogdHJ1ZSB9KSxcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5iYXNlUmVzb3VyY2VcbiAgICAgICAgICAuYWRkUmVzb3VyY2UocHVibGljRGlyRW50cnkubmFtZSlcbiAgICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogdGhpcy5zM0tleShwdWJsaWNEaXJFbnRyeS5uYW1lKSB9KSxcbiAgICAgICAgICAgIHRoaXMuZ2V0U3RhdGljTWV0aG9kT3B0aW9ucygpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh1bnJvdXRhYmxlLmxlbmd0aCA+IDApIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmcoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IEFuIEFQSSBHYXRld2F5IHJlc291cmNlIHBhdGggcGFydCBvbmx5IGFsbG93cyBgICtcbiAgICAgICAgICBcIlthLXpBLVowLTk6Ll8tJF0sIHNvIHRoZXNlIHRvcC1sZXZlbCBwdWJsaWMvIGVudHJpZXMgZ2V0IG5vIHJlc291cmNlIG9mIFwiICtcbiAgICAgICAgICBcInRoZWlyIG93bjsgdGhlaXIgcmVxdWVzdHMgcmVhY2ggdGhlIHNlcnZlciBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgdGhlbSBcIiArXG4gICAgICAgICAgYGZyb20gUzMgaW5zdGVhZDogJHt1bnJvdXRhYmxlLmpvaW4oXCIsIFwiKX0uIFRvIHNlcnZlIHRoZW0gZGlyZWN0bHksIHJlbmFtZSB0aGVtLCBtb3ZlIHRoZW0gaW50byBhIGAgK1xuICAgICAgICAgIFwicHVibGljLyBzdWJkaXJlY3Rvcnkgd2hvc2Ugb3duIG5hbWUgaXMgZXhwcmVzc2libGUsIG9yIHVzZSBcIiArXG4gICAgICAgICAgXCJOZXh0anNHbG9iYWxGdW5jdGlvbnMgb3IgTmV4dGpzR2xvYmFsQ29udGFpbmVycywgd2hvc2UgQ2xvdWRGcm9udCBcIiArXG4gICAgICAgICAgXCJiZWhhdmlvcnMgY2FuIG1hdGNoIHRoZW0uXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXhlcyBhIHJlcXVlc3QgcGF0aCB3aXRoIHRoZSBrZXkgcHJlZml4IHRoZSBhc3NldHMgd2VyZSB1cGxvYWRlZCB1bmRlcixcbiAgICogc2luY2UgdGhlIFMzIGludGVncmF0aW9ucyBhZGRyZXNzIG9iamVjdHMgYnkga2V5IHJhdGhlciB0aGFuIGJ5IFVSTC5cbiAgICovXG4gIHByaXZhdGUgczNLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luUGF0aCh0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0tleVByZWZpeCwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIEFQSSByZXF1ZXN0IHRvIFMzIHJlcXVlc3QuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3Jlc3QtYXBpLXBhcmFtZXRlci1tYXBwaW5nLXNvdXJjZXMuaHRtbFxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9pbnRlZ3JhdGluZy1hcGktd2l0aC1hd3Mtc2VydmljZXMtczMuaHRtbCNhcGktaXRlbXMtaW4tZm9sZGVyLWFzLXMzLW9iamVjdHMtaW4tYnVja2V0XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVMzSW50ZWdyYXRpb24oeyBrZXkgfTogeyBrZXk6IHN0cmluZyB9KSB7XG4gICAgY29uc3QgczNJbnRlZ3JhdGlvbiA9IG5ldyBBd3NJbnRlZ3JhdGlvbih7XG4gICAgICBzZXJ2aWNlOiBcInMzXCIsXG4gICAgICBpbnRlZ3JhdGlvbkh0dHBNZXRob2Q6IFwiR0VUXCIsXG4gICAgICBwYXRoOiBgJHt0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lfS8ke2tleX1gLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBjcmVkZW50aWFsc1JvbGU6IHRoaXMuc3RhdGljSW50ZWdyYXRpb25Sb2xlLFxuICAgICAgICBwYXNzdGhyb3VnaEJlaGF2aW9yOiBQYXNzdGhyb3VnaEJlaGF2aW9yLldIRU5fTk9fVEVNUExBVEVTLCAvLyByZWNvbW1lbmRlZFxuICAgICAgICByZXF1ZXN0UGFyYW1ldGVyczoge1xuICAgICAgICAgIC8vIFdpdGhvdXQgdGhpcyBTMyBuZXZlciBzZWVzIHRoZSBjb25kaXRpb25hbCByZXF1ZXN0LCBzbyBldmVyeVxuICAgICAgICAgIC8vIHJldmFsaWRhdGlvbiBvZiBhbiBpbW11dGFibGUgYF9uZXh0L3N0YXRpY2AgY2h1bmsgcmUtZG93bmxvYWRzIGl0XG4gICAgICAgICAgLy8gd2l0aCBhIDIwMCBpbnN0ZWFkIG9mIGdldHRpbmcgYSAzMDQuXG4gICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXF1ZXN0LmhlYWRlci5JZi1Ob25lLU1hdGNoXCI6XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LmhlYWRlci5JZi1Ob25lLU1hdGNoXCIsXG4gICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXF1ZXN0LmhlYWRlci5JZi1Nb2RpZmllZC1TaW5jZVwiOlxuICAgICAgICAgICAgXCJtZXRob2QucmVxdWVzdC5oZWFkZXIuSWYtTW9kaWZpZWQtU2luY2VcIixcbiAgICAgICAgICAuLi4oa2V5LmluY2x1ZGVzKFwie2tleX1cIilcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVxdWVzdC5wYXRoLmtleVwiOiBcIm1ldGhvZC5yZXF1ZXN0LnBhdGgucHJveHlcIixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIGludGVncmF0aW9uUmVzcG9uc2VzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuRVRhZ1wiOiBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5FVGFnXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIEEgMzA0IGNhcnJpZXMgbm8gYm9keSwgYW5kIGBFVGFnYCBpcyB0aGUgaGVhZGVyIGEgY2xpZW50IG5lZWRzXG4gICAgICAgICAgICAvLyBiYWNrIHRvIGtlZXAgcmV2YWxpZGF0aW5nLlxuICAgICAgICAgICAgc3RhdHVzQ29kZTogXCIzMDRcIixcbiAgICAgICAgICAgIHNlbGVjdGlvblBhdHRlcm46IFwiMzA0XCIsXG4gICAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNhY2hlLUNvbnRyb2xcIjpcbiAgICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5FVGFnXCI6IFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkVUYWdcIixcbiAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkxhc3QtTW9kaWZpZWRcIjpcbiAgICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhdHVzQ29kZTogXCI0MDRcIixcbiAgICAgICAgICAgIHNlbGVjdGlvblBhdHRlcm46IFwiNDA0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uc3RhdGljSW50ZWdyYXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgICByZXR1cm4gczNJbnRlZ3JhdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhdGljTWV0aG9kT3B0aW9ucyh7IHByb3h5IH0gPSB7IHByb3h5OiBmYWxzZSB9KTogTWV0aG9kT3B0aW9ucyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiB7XG4gICAgICAgIC8vIERlY2xhcmVkIG9wdGlvbmFsIChgZmFsc2VgKTogYSBwbGFpbiBHRVQgY2FycmllcyBuZWl0aGVyLCBhbmRcbiAgICAgICAgLy8gcmVxdWlyaW5nIHRoZW0gd291bGQgNDAwIGl0LlxuICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LmhlYWRlci5JZi1Ob25lLU1hdGNoXCI6IGZhbHNlLFxuICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LmhlYWRlci5JZi1Nb2RpZmllZC1TaW5jZVwiOiBmYWxzZSxcbiAgICAgICAgLi4uKHByb3h5ID8geyBcIm1ldGhvZC5yZXF1ZXN0LnBhdGgucHJveHlcIjogdHJ1ZSB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZFJlc3BvbnNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogXCIyMDBcIixcbiAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LVR5cGVcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LUxlbmd0aFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNhY2hlLUNvbnRyb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5FVGFnXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjMwNFwiLFxuICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNhY2hlLUNvbnRyb2xcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5FVGFnXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjQwNFwiLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5zM01ldGhvZE9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgcmVzb3VyY2Ugc3VidHJlZSBwZXIgZnVuY3Rpb24gZ3JvdXAgcGF0dGVybi5cbiAgICpcbiAgICogVW5saWtlIENsb3VkRnJvbnQgdGhpcyBuZWVkcyBubyBvcmRlcmluZzogQVBJIEdhdGV3YXkgbWF0Y2hlcyBvbiBhIHJlc291cmNlXG4gICAqICp0cmVlKiwgc28gYC9hcGkvcmVwb3J0cy97cHJveHkrfWAgYmVhdHMgYC9hcGkve3Byb3h5K31gIGJlYXRzIGAve3Byb3h5K31gXG4gICAqIHN0cnVjdHVyYWxseSwgYW5kIFwibG9uZ2VzdCBwYXR0ZXJuIHdpbnNcIiBjb21lcyBmb3IgZnJlZS4gV2hhdCBkb2VzIG5lZWQgY2FyZVxuICAgKiBpcyBub3QgY3JlYXRpbmcgdGhlIHNhbWUgcGF0aCB0d2ljZSDigJQgdHdvIGdyb3VwcyB1bmRlciBgL2FwaWAgc2hhcmUgdGhlIGBhcGlgXG4gICAqIHJlc291cmNlIOKAlCBzbyBldmVyeSBzZWdtZW50IGdvZXMgdGhyb3VnaCB7QGxpbmsgcmVzb3VyY2VGb3J9LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbkdyb3VwSW50ZWdyYXRpb25zKCkge1xuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMucHJvcHMuZnVuY3Rpb25Hcm91cHMgPz8gW107XG4gICAgY29uc3QgYmVoYXZpb3JzID0gdGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwQmVoYXZpb3JzID8/IFtdO1xuICAgIGNvbnN0IHVua25vd24gPSBiZWhhdmlvcnMuZmluZChcbiAgICAgIChiZWhhdmlvcikgPT4gIWdyb3Vwcy5zb21lKChncm91cCkgPT4gZ3JvdXAubmFtZSA9PT0gYmVoYXZpb3IuZ3JvdXApLFxuICAgICk7XG4gICAgaWYgKHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7TE9HX1BSRUZJWH0gXFxgZnVuY3Rpb25Hcm91cEJlaGF2aW9yc1xcYCByb3V0ZXMgdG8gZnVuY3Rpb24gZ3JvdXAgYCArXG4gICAgICAgICAgYFwiJHt1bmtub3duLmdyb3VwfVwiLCB3aGljaCBpcyBub3QgaW4gXFxgZnVuY3Rpb25Hcm91cHNcXGAuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHJvdXRlUmVzb3VyY2VzID0gbmV3IFNldDxJUmVzb3VyY2U+KCk7XG4gICAgLyoqIEVhY2ggc3VidHJlZSdzIGJhc2UgcGF0aCBhbmQgdGhlIGludGVncmF0aW9uIGl0cyBge3Byb3h5K31gIGdvdC4gKi9cbiAgICBjb25zdCBzdWJ0cmVlczogW3N0cmluZ1tdLCBMYW1iZGFJbnRlZ3JhdGlvbl1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICBjb25zdCBpbnRlZ3JhdGlvbiA9IG5ldyBMYW1iZGFJbnRlZ3JhdGlvbihncm91cC5mdW5jdGlvbiwge1xuICAgICAgICByZXNwb25zZVRyYW5zZmVyTW9kZTogUmVzcG9uc2VUcmFuc2Zlck1vZGUuU1RSRUFNLFxuICAgICAgICAvLyBPbmUgQVBJLXdpZGUgcGVybWlzc2lvbiBwZXIgZnVuY3Rpb247IHNlZSBgY3JlYXRlRHluYW1pY0ludGVncmF0aW9uYC5cbiAgICAgICAgc2NvcGVQZXJtaXNzaW9uVG9NZXRob2Q6IGZhbHNlLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0ludGVncmF0aW9uUHJvcHMsXG4gICAgICB9KTtcbiAgICAgIC8vIFRoZSBDbG91ZEZyb250IHBhdHRlcm5zIGFyZSBmb3IgdGhlIGVkZ2U7IGEgcmVzb3VyY2UgcGF0aCBwZXIgcm91dGVcbiAgICAgIC8vIGNvdmVycyB3aGF0IHRoZXkgZG8gaGVyZSwgYSBgdHJhaWxpbmdTbGFzaGAgZm9ybSBpbmNsdWRlZCwgc2luY2UgQVBJXG4gICAgICAvLyBHYXRld2F5IG1hdGNoZXMgYC9wcmljaW5nL2Agb24gdGhlIGBwcmljaW5nYCByZXNvdXJjZS5cbiAgICAgIGNvbnN0IG93biA9IGJlaGF2aW9ycy5maWx0ZXIoKGJlaGF2aW9yKSA9PiBiZWhhdmlvci5ncm91cCA9PT0gZ3JvdXAubmFtZSk7XG4gICAgICBjb25zdCBoYXNEYXRhUm91dGVzID0gb3duLnNvbWUoKHsgcGF0dGVybiB9KSA9PlxuICAgICAgICBwYXR0ZXJuLnN0YXJ0c1dpdGgoXCJfbmV4dC9kYXRhL1wiKSxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIG5ldyBTZXQob3duLm1hcCgoYmVoYXZpb3IpID0+IGJlaGF2aW9yLnJvdXRlKSkpIHtcbiAgICAgICAgdGhpcy5hc3NlcnRSb3V0YWJsZShyb3V0ZSwgZ3JvdXAubmFtZSk7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm9QdWJsaWNDb2xsaXNpb24ocm91dGUsIGdyb3VwLm5hbWUpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5yZXNvdXJjZVBhdGhzRm9yKHJvdXRlLCBoYXNEYXRhUm91dGVzKSkge1xuICAgICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZUZvcihwYXRoKTtcbiAgICAgICAgICByZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgaW50ZWdyYXRpb24pO1xuICAgICAgICAgIHJvdXRlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgaWYgKHBhdGhbcGF0aC5sZW5ndGggLSAxXSA9PT0gXCJ7cHJveHkrfVwiKSB7XG4gICAgICAgICAgICBzdWJ0cmVlcy5wdXNoKFtwYXRoLnNsaWNlKDAsIC0xKSwgaW50ZWdyYXRpb25dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQSBwYXJlbnQgdW5kZXIgYW5vdGhlciBncm91cCdzIHN1YnRyZWUgYmVsb25ncyB0byB0aGF0IGdyb3VwLCBhcyBpdCBkb2VzXG4gICAgLy8gYXQgdGhlIGVkZ2UgYW5kIGluIGBhc3NpZ25Sb3V0ZXNUb0dyb3Vwc2A6IHdpdGggYC9hcGkvKipgIGFuZFxuICAgIC8vIGAvYXBpL3JlcG9ydHMvKipgLCBgL2FwaS9yZXBvcnRzYCBpcyB0aGUgYGFwaWAgZ3JvdXAncy4gVGhlIGRlZXBlc3RcbiAgICAvLyBjb3ZlcmluZyBzdWJ0cmVlIHdpbnM7IHRoZSByZXN0IGFyZSBsZWZ0IHRvIHRoZSBkZWZhdWx0IGZ1bmN0aW9uLlxuICAgIGZvciAoY29uc3QgW3Jlc291cmNlLCBwYXRoXSBvZiB0aGlzLmdyb3VwUGFyZW50UmVzb3VyY2VzKSB7XG4gICAgICBpZiAocm91dGVSZXNvdXJjZXMuaGFzKHJlc291cmNlKSkge1xuICAgICAgICB0aGlzLmdyb3VwUGFyZW50UmVzb3VyY2VzLmRlbGV0ZShyZXNvdXJjZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3duZXIgPSBzdWJ0cmVlc1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChbYmFzZV0pID0+XG4gICAgICAgICAgICBiYXNlLmxlbmd0aCA8IHBhdGgubGVuZ3RoICYmXG4gICAgICAgICAgICBiYXNlLmV2ZXJ5KChzZWdtZW50LCBpKSA9PiBzZWdtZW50ID09PSBwYXRoW2ldKSxcbiAgICAgICAgKVxuICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpWzBdO1xuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBvd25lclsxXSk7XG4gICAgICAgIHRoaXMuZ3JvdXBQYXJlbnRSZXNvdXJjZXMuZGVsZXRlKHJlc291cmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGdyb3VwIHBhdHRlcm4gdmFsaWRhdGlvbiBhY2NlcHRzIGV2ZXJ5IGNoYXJhY3RlciBhIENsb3VkRnJvbnQgcGF0aFxuICAgKiBwYXR0ZXJuIGNhbiBob2xkLCBhbmQgQVBJIEdhdGV3YXkncyBwYXRoIHBhcnRzIGhvbGQgZmV3ZXI6IGB+YCwgYEBgLCBgK2AsXG4gICAqIGAmYCBhbmQgcXVvdGVzIHBhc3MgaXQgYW5kIHRoZW4gZmFpbCBgYWRkUmVzb3VyY2VgIHdpdGggYW4gZXJyb3IgdGhhdCBuYW1lc1xuICAgKiBuZWl0aGVyIHRoZSBncm91cCBub3IgdGhlIHBhdHRlcm4uIFNheSB3aGljaCwgYW5kIHdoYXQgdG8gZG8gaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXNzZXJ0Um91dGFibGUocm91dGU6IHN0cmluZywgZ3JvdXBOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IChyb3V0ZS5lbmRzV2l0aChcIi8qKlwiKSA/IHJvdXRlLnNsaWNlKDAsIC0zKSA6IHJvdXRlKVxuICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBpbnZhbGlkID0gc2VnbWVudHMuZmluZCgoc2VnbWVudCkgPT4gIUFQSV9QQVRIX1BBUlQudGVzdChzZWdtZW50KSk7XG4gICAgaWYgKGludmFsaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBmdW5jdGlvbkdyb3VwcyBwYXR0ZXJuIFwiJHtyb3V0ZX1cIiAoZ3JvdXAgXCIke2dyb3VwTmFtZX1cIikgYCArXG4gICAgICAgIGBoYXMgYSBzZWdtZW50LCBcIiR7aW52YWxpZH1cIiwgdGhhdCBhbiBBUEkgR2F0ZXdheSByZXNvdXJjZSBwYXRoIHBhcnQgYCArXG4gICAgICAgIFwiY2Fubm90IGhvbGQ6IG9ubHkgW2EtekEtWjAtOTouXy0kXSBhcmUgYWxsb3dlZC4gUm91dGUgdGhhdCBwYXRoIGZyb20gXCIgK1xuICAgICAgICBcImEgcGF0dGVybiBoaWdoZXIgdXAgdGhlIHRyZWUgKGUuZy4gaXRzIHBhcmVudCBkaXJlY3Rvcnkgd2l0aCBgLyoqYCksIFwiICtcbiAgICAgICAgXCJvciB1c2UgTmV4dGpzR2xvYmFsRnVuY3Rpb25zLCB3aG9zZSBDbG91ZEZyb250IGJlaGF2aW9ycyBhbGxvdyBpdC5cIixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnVzZSBhIGdyb3VwIHJvdXRlIHRoYXQgc2hhcmVzIGEgcmVzb3VyY2Ugd2l0aCBhIGBwdWJsaWMvYCBlbnRyeS5cbiAgICpcbiAgICogQSBwdWJsaWMgZGlyZWN0b3J5IGBkb2NzYCBpcyBgZG9jcy97cHJveHkrfWAgd2l0aCBhIGBHRVRgIHRvIFMzLiBgL2RvY3MvKipgXG4gICAqIGFkZHMgYEFOWWAgdG8gdGhhdCBzYW1lIHJlc291cmNlLCBhbmQgQVBJIEdhdGV3YXkgcHJlZmVycyB0aGUgYEdFVGAsIHNvXG4gICAqIGV2ZXJ5IHBhZ2UgbG9hZCB1bmRlciB0aGUgZ3JvdXAgd2VudCB0byBTMzsgYC9kb2NzL2d1aWRlLyoqYCBpcyBhIG1vcmVcbiAgICogc3BlY2lmaWMgcmVzb3VyY2UgaW5zdGVhZCwgYW5kIHRha2VzIGAvZG9jcy9ndWlkZS/igKZgIGF3YXkgZnJvbSB0aGUgcHVibGljXG4gICAqIGZpbGVzLiBBIHB1YmxpYyBmaWxlIGBwcmljaW5nYCBhbmQgYW4gZXhhY3QgYC9wcmljaW5nYCBhcmUgdGhlIHNhbWVcbiAgICogcmVzb3VyY2UgdGhlIHNhbWUgd2F5LiBgTmV4dGpzRGlzdHJpYnV0aW9uYCByZWplY3RzIHRoZSBDbG91ZEZyb250XG4gICAqIGVxdWl2YWxlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnROb1B1YmxpY0NvbGxpc2lvbihyb3V0ZTogc3RyaW5nLCBncm91cE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IGlzU3VidHJlZSA9IHJvdXRlLmVuZHNXaXRoKFwiLyoqXCIpO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gKGlzU3VidHJlZSA/IHJvdXRlLnNsaWNlKDAsIC0zKSA6IHJvdXRlKVxuICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMucHJvcHMucHVibGljRGlyRW50cmllcy5maW5kKChpdCkgPT5cbiAgICAgIGl0LmlzRGlyZWN0b3J5XG4gICAgICAgID8gaXQubmFtZSA9PT0gc2VnbWVudHNbMF0gJiYgKGlzU3VidHJlZSB8fCBzZWdtZW50cy5sZW5ndGggPiAxKVxuICAgICAgICA6ICFpc1N1YnRyZWUgJiYgc2VnbWVudHMubGVuZ3RoID09PSAxICYmIGl0Lm5hbWUgPT09IHNlZ21lbnRzWzBdLFxuICAgICk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtMT0dfUFJFRklYfSBmdW5jdGlvbkdyb3VwcyBwYXR0ZXJuIFwiJHtyb3V0ZX1cIiAoZ3JvdXAgXCIke2dyb3VwTmFtZX1cIikgYCArXG4gICAgICAgIGBvdmVybGFwcyB0aGUgdG9wLWxldmVsIHB1YmxpYy8gJHtlbnRyeS5pc0RpcmVjdG9yeSA/IFwiZGlyZWN0b3J5XCIgOiBcImZpbGVcIn0gYCArXG4gICAgICAgIGBcIiR7ZW50cnkubmFtZX1cIiwgd2hpY2ggQVBJIEdhdGV3YXkgc2VydmVzIGZyb20gUzMgb24gdGhlIHNhbWUgYCArXG4gICAgICAgIGByZXNvdXJjZSBwYXRoLCBzbyBvbmUgb2YgdGhlIHR3byB3b3VsZCBuZXZlciBiZSByZWFjaGVkLiBNb3ZlIHRob3NlIGAgK1xuICAgICAgICBgcHVibGljLyBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSBubyByb3V0ZSB1c2VzLCBvciBncm91cCBhIGRpZmZlcmVudCBgICtcbiAgICAgICAgYHBhdGguYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc291cmNlIHBhdGhzLCBhcyBzZWdtZW50IGFycmF5cywgZm9yIG9uZSBncm91cCBwYXR0ZXJuLlxuICAgKlxuICAgKiBBIHN1YnRyZWUgZ2V0cyBge3Byb3h5K31gIGFzIGl0cyBsYXN0IHNlZ21lbnQgYW5kIHNvIG93bnMgZXZlcnl0aGluZyAqdW5kZXIqXG4gICAqIHRoZSBwYXRoIGJ1dCBub3QgdGhlIHBhdGggaXRzZWxmLCBtYXRjaGluZyBib3RoIHRoZSBDbG91ZEZyb250IHRyYW5zbGF0aW9uIGFuZFxuICAgKiBgYXNzaWduUm91dGVzVG9Hcm91cHNgLiBBbiBleGFjdCBwYXRoIGdldHMgbm8gcHJveHkgc2VnbWVudCwgd2hpY2ggbGVhdmVzIGl0c1xuICAgKiBjaGlsZHJlbiBmYWxsaW5nIHRocm91Z2ggdG8gdGhlIHJvb3QgYHtwcm94eSt9YCDigJQgYWxzbyB0aGUgQ2xvdWRGcm9udCByZXN1bHQuXG4gICAqL1xuICBwcml2YXRlIHJlc291cmNlUGF0aHNGb3Iocm91dGU6IHN0cmluZywgaGFzRGF0YVJvdXRlcz86IGJvb2xlYW4pOiBzdHJpbmdbXVtdIHtcbiAgICBjb25zdCBpc1N1YnRyZWUgPSByb3V0ZS5lbmRzV2l0aChcIi8qKlwiKTtcbiAgICBjb25zdCBiYXNlID0gKGlzU3VidHJlZSA/IHJvdXRlLnNsaWNlKDAsIC0zKSA6IHJvdXRlKVxuICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXRocyA9IFtpc1N1YnRyZWUgPyBbLi4uYmFzZSwgXCJ7cHJveHkrfVwiXSA6IGJhc2VdO1xuICAgIGlmIChoYXNEYXRhUm91dGVzKSB7XG4gICAgICAvLyBgPGJ1aWxkSWQ+YCBjaGFuZ2VzIGV2ZXJ5IGJ1aWxkLCBzbyBpdCBpcyBhIHBhdGggcGFyYW1ldGVyIHJhdGhlciB0aGFuIGFcbiAgICAgIC8vIGxpdGVyYWwg4oCUIHRoZSBpbnRlZ3JhdGlvbiBpZ25vcmVzIGl0LCB0aGUgcnVudGltZSByZWFkcyBpdCBvZmYgdGhlIFVSTC5cbiAgICAgIC8vIFVubGlrZSBDbG91ZEZyb250J3MgYCpgLCB3aGljaCBgTmV4dGpzRGlzdHJpYnV0aW9uYCBoYWQgdG8gcmVwbGFjZSB3aXRoXG4gICAgICAvLyB0aGUgbGl0ZXJhbCBJRCwgYSBwYXRoIHBhcmFtZXRlciBpcyBleGFjdGx5IG9uZSBzZWdtZW50LCBzb1xuICAgICAgLy8gYC9fbmV4dC9kYXRhL3tidWlsZElkfS9ibG9nL3twcm94eSt9YCBjYW5ub3QgY2FwdHVyZSBhbm90aGVyIGdyb3VwJ3NcbiAgICAgIC8vIGAvX25leHQvZGF0YS88aWQ+L2RvY3MvYmxvZy/igKZgLiBBIHJlcXVlc3QgZm9yIGFuIG9sZCBidWlsZCBJRCByZWFjaGVzXG4gICAgICAvLyB0aGUgZ3JvdXAsIHdoaWNoIDQwNHMgaXQganVzdCBhcyB0aGUgZGVmYXVsdCBmdW5jdGlvbiB3b3VsZC5cbiAgICAgIGNvbnN0IGRhdGFQcmVmaXggPSBbXCJfbmV4dFwiLCBcImRhdGFcIiwgXCJ7YnVpbGRJZH1cIl07XG4gICAgICBwYXRocy5wdXNoKFxuICAgICAgICBpc1N1YnRyZWVcbiAgICAgICAgICA/IFsuLi5kYXRhUHJlZml4LCAuLi5iYXNlLCBcIntwcm94eSt9XCJdXG4gICAgICAgICAgOiBbXG4gICAgICAgICAgICAgIC4uLmRhdGFQcmVmaXgsXG4gICAgICAgICAgICAgIC4uLmJhc2Uuc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgICBgJHtiYXNlW2Jhc2UubGVuZ3RoIC0gMV19Lmpzb25gLFxuICAgICAgICAgICAgXSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBwYXRocztcbiAgfVxuXG4gIC8qKiBXYWxrIG9yIGNyZWF0ZSBhIHJlc291cmNlIHBhdGgsIHJldXNpbmcgd2hhdGV2ZXIgYWxyZWFkeSBleGlzdHMuICovXG4gIHByaXZhdGUgcmVzb3VyY2VGb3Ioc2VnbWVudHM6IHN0cmluZ1tdKTogSVJlc291cmNlIHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLmJhc2VSZXNvdXJjZTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgc2VnbWVudF0gb2Ygc2VnbWVudHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHJlc291cmNlLmdldFJlc291cmNlKHNlZ21lbnQpO1xuICAgICAgcmVzb3VyY2UgPSBleGlzdGluZyA/PyByZXNvdXJjZS5hZGRSZXNvdXJjZShzZWdtZW50KTtcbiAgICAgIGlmICghZXhpc3RpbmcgJiYgaW5kZXggPCBzZWdtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBQYXJlbnRSZXNvdXJjZXMuc2V0KHJlc291cmNlLCBzZWdtZW50cy5zbGljZSgwLCBpbmRleCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgUHJveHkgaW50ZWdyYXRpb24gZm9yIGFsbCBvdGhlciByb3V0ZXNcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRHluYW1pY0ludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uOiBJRnVuY3Rpb24pIHtcbiAgICAvLyBBbGwgb3RoZXIgcm91dGVzIHVzZSBzdHJlYW1pbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cbiAgICAvL1xuICAgIC8vIGBzY29wZVBlcm1pc3Npb25Ub01ldGhvZDogZmFsc2VgIGdyYW50cyB0aGUgZnVuY3Rpb24gb25lIHBlcm1pc3Npb24gZm9yXG4gICAgLy8gdGhpcyBBUEkncyBleGVjdXRlLWFwaSBBUk4gKGA8YXBpPi8qLyovKmApIGluc3RlYWQgb2YgdHdvIHBlciBtZXRob2QgKHRoZVxuICAgIC8vIG1ldGhvZCBhbmQgaXRzIGNvbnNvbGUgdGVzdC1pbnZva2UpLiBFdmVyeSBncm91cCBhZGRzIHJlc291cmNlcyB0aGF0IHRoZVxuICAgIC8vIGRlZmF1bHQgZnVuY3Rpb24gc3RpbGwgYW5zd2VycyBmb3IgaXRzIHBhcmVudHMgYW5kIGRhdGEgcm91dGVzLCBhbmQgYXRcbiAgICAvLyB+MzUwIGJ5dGVzIGEgc3RhdGVtZW50IHRoZSBwZXItbWV0aG9kIHBvbGljeSBvdXRncm93cyBMYW1iZGEncyAyMCBLQlxuICAgIC8vIHJlc291cmNlLXBvbGljeSBjYXAgYWZ0ZXIgYSBmZXcgZG96ZW4gYEFOWWAgbWV0aG9kcywgZmFpbGluZyB0aGUgZGVwbG95LlxuICAgIGNvbnN0IHN0cmVhbWluZ0ludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKHNlcnZlckZ1bmN0aW9uLCB7XG4gICAgICByZXNwb25zZVRyYW5zZmVyTW9kZTogUmVzcG9uc2VUcmFuc2Zlck1vZGUuU1RSRUFNLFxuICAgICAgc2NvcGVQZXJtaXNzaW9uVG9NZXRob2Q6IGZhbHNlLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmR5bmFtaWNJbnRlZ3JhdGlvblByb3BzLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGNhdGNoLWFsbCByb3V0ZXMgd2l0aCBzdHJlYW1pbmcgaW50ZWdyYXRpb24gZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZ1xuICAgIHRoaXMuYmFzZVJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBzdHJlYW1pbmdJbnRlZ3JhdGlvbik7XG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiB0aGlzLmdyb3VwUGFyZW50UmVzb3VyY2VzLmtleXMoKSkge1xuICAgICAgcmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIHN0cmVhbWluZ0ludGVncmF0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgcHJveHlSZXNvdXJjZSA9IHRoaXMuYmFzZVJlc291cmNlLmFkZFJlc291cmNlKFwie3Byb3h5K31cIik7XG4gICAgcHJveHlSZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgc3RyZWFtaW5nSW50ZWdyYXRpb24pO1xuICB9XG59XG4iXX0=
|
|
581
|
+
/**
|
|
582
|
+
* `responses` with `parameters` added to the 200 and the 304, the responses a
|
|
583
|
+
* fixed header goes out with.
|
|
584
|
+
*/
|
|
585
|
+
function withFixedHeaders(responses, parameters) {
|
|
586
|
+
if (!Object.keys(parameters).length) {
|
|
587
|
+
return responses;
|
|
588
|
+
}
|
|
589
|
+
return responses?.map((response) => ["200", "304"].includes(response.statusCode)
|
|
590
|
+
? {
|
|
591
|
+
...response,
|
|
592
|
+
responseParameters: { ...response.responseParameters, ...parameters },
|
|
593
|
+
}
|
|
594
|
+
: response);
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSx5Q0FBaUM7QUFDakMsNkNBQWlFO0FBQ2pFLCtEQVlvQztBQUVwQyx1REFBOEM7QUFDOUMsdUVBQXdGO0FBQ3hGLGlEQUs2QjtBQUM3Qix1REFPZ0M7QUFFaEMsMkNBQXVDO0FBQ3ZDLDJDQUF5QztBQU16QyxpRUFBb0U7QUFDcEUsaURBQWdFO0FBRWhFOzs7R0FHRztBQUNILE1BQU0sYUFBYSxHQUFHLHNCQUFzQixDQUFDO0FBa0c3Qzs7R0FFRztBQUNILE1BQWEsU0FBVSxTQUFRLHNCQUFTOztJQUN0Qzs7T0FFRztJQUNhLEdBQUcsQ0FBVTtJQUU3Qjs7Ozs7Ozs7T0FRRztJQUNILElBQUksR0FBRztRQUNMLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3pDLHdFQUF3RTtRQUN4RSxvRUFBb0U7UUFDcEUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxZQUFZO1lBQ25DLENBQUMsQ0FBQztnQkFDRSxXQUFXLFlBQVksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUTthQUN6RDtZQUNILENBQUMsQ0FBQztnQkFDRSxXQUFXLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxnQkFBZ0IsbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxnQkFBZ0I7Z0JBQ2xGLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVM7YUFDbkMsQ0FBQztRQUNOLE9BQU8sSUFBQSxvQkFBUSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7OztPQUdH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aW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IEFubm90YXRpb25zLCBEdXJhdGlvbiwgU2l6ZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIFJlc3RBcGksXG4gIExhbWJkYUludGVncmF0aW9uLFxuICBBd3NJbnRlZ3JhdGlvbixcbiAgTWV0aG9kT3B0aW9ucyxcbiAgSVJlc291cmNlLFxuICBFbmRwb2ludFR5cGUsXG4gIFJlc3RBcGlQcm9wcyxcbiAgQXdzSW50ZWdyYXRpb25Qcm9wcyxcbiAgTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zLFxuICBQYXNzdGhyb3VnaEJlaGF2aW9yLFxuICBSZXNwb25zZVRyYW5zZmVyTW9kZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IFJ1bGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb25UYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCI7XG5pbXBvcnQge1xuICBSb2xlLFxuICBTZXJ2aWNlUHJpbmNpcGFsLFxuICBQb2xpY3lTdGF0ZW1lbnQsXG4gIElSb2xlLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHtcbiAgQXJjaGl0ZWN0dXJlLFxuICBDb2RlLFxuICBGdW5jdGlvbiBhcyBMYW1iZGFGdW5jdGlvbixcbiAgSUZ1bmN0aW9uLFxuICBSdW50aW1lLFxuICBSdW50aW1lRmFtaWx5LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcHRpb25hbEZ1bmN0aW9uUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbEZ1bmN0aW9uUHJvcHNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvcixcbiAgUHVibGljRGlyRW50cnksXG59IGZyb20gXCIuL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGRcIjtcbmltcG9ydCB7IHN0YXRpY0Fzc2V0c09iamVjdHNQYXR0ZXJuIH0gZnJvbSBcIi4vbmV4dGpzLXN0YXRpYy1hc3NldHNcIjtcbmltcG9ydCB7IGpvaW5QYXRoLCBub3JtYWxpemVCYXNlUGF0aCB9IGZyb20gXCIuL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIFdoYXQgQVBJIEdhdGV3YXkgYWNjZXB0cyBhcyBhIHJlc291cmNlIHBhdGggcGFydCwgcGVyIENESydzIG93biBjaGVjayBpblxuICogYFJlc291cmNlYDogYFthLXpBLVowLTk6Ll8tJF1gLCBwbHVzIGFuIG9wdGlvbmFsIHRyYWlsaW5nIGArYC5cbiAqL1xuY29uc3QgQVBJX1BBVEhfUEFSVCA9IC9eW2EtekEtWjAtOTouX1xcLSRdKyQvO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0FwaU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IHJlc3RBcGlQcm9wcz86IFJlc3RBcGlQcm9wcztcbiAgcmVhZG9ubHkgc3RhdGljSW50ZWdyYXRpb25Qcm9wcz86IEF3c0ludGVncmF0aW9uUHJvcHM7XG4gIHJlYWRvbmx5IHMzTWV0aG9kT3B0aW9ucz86IE1ldGhvZE9wdGlvbnM7XG4gIHJlYWRvbmx5IGR5bmFtaWNJbnRlZ3JhdGlvblByb3BzPzogTGFtYmRhSW50ZWdyYXRpb25PcHRpb25zO1xuICAvKipcbiAgICogUHJvcHMgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGRlcGxveXMgdGhlIHN0YWdlIGFnYWluIGFmdGVyIGVhY2ggc3RhY2tcbiAgICogdXBkYXRlLlxuICAgKiBAc2VlIE5leHRqc0FwaVByb3BzLnJlZGVwbG95QWZ0ZXJVcGRhdGVcbiAgICovXG4gIHJlYWRvbmx5IHJlZGVwbG95RnVuY3Rpb25Qcm9wcz86IE9wdGlvbmFsRnVuY3Rpb25Qcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBcGlQcm9wcyB7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBiYXNlIHBhdGggZm9yIHRoZSBhcHBsaWNhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBwcm9wcyBmb3IgZXZlcnkgY29uc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQXBpT3ZlcnJpZGVzO1xuICAvKipcbiAgICogUGF0aCB0byBkaXJlY3Rvcnkgb2YgTmV4dC5qcyBhcHAncyBwdWJsaWMgZGlyZWN0b3J5LiBVc2VkIHRvIGFkZCByZXNvdXJjZXNcbiAgICogdG8gQVBJIEdhdGV3YXkgUkVTVCBBUEkgZm9yIHB1YmxpYyBkaXJlY3RvcnkgdG8gZ28gZGlyZWN0bHkgdG8gUzMuXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogUmVxdWlyZWQgaWYgYE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zYC4gVGhlIExhbWJkYSBmdW5jdGlvbiBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAqL1xuICByZWFkb25seSBzZXJ2ZXJGdW5jdGlvbj86IElGdW5jdGlvbjtcbiAgLyoqXG4gICAqIFRoZSBTMyBidWNrZXQgY29udGFpbmluZyBzdGF0aWMgYXNzZXRzXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNBc3NldHNCdWNrZXQ6IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBTMyBrZXkgcHJlZml4IHRoZSBzdGF0aWMgYXNzZXRzIHdlcmUgdXBsb2FkZWQgdW5kZXIsIGkuZS5cbiAgICogYE5leHRqc1N0YXRpY0Fzc2V0cy5rZXlQcmVmaXhgLCB3aGljaCBuYW1lc3BhY2VzIGEgc2hhcmVkIGJ1Y2tldC5cbiAgICpcbiAgICogSW5kZXBlbmRlbnQgb2YgYGJhc2VQYXRoYCBhYm92ZTogdGhhdCBvbmUgaXMgdGhlIFVSTCBwcmVmaXggdGhlIFJFU1QgQVBJXG4gICAqIHNlcnZlcyB0aGUgYXBwIGF0IChjb21tb25seSB0aGUgQVBJIEdhdGV3YXkgc3RhZ2UpLCB3aGlsZSB0aGlzIG9uZSBpcyB3aGVyZVxuICAgKiB0aGUgb2JqZWN0cyBsaXZlIGluIHRoZSBidWNrZXQuIGBfbmV4dC9zdGF0aWNgIGFuZCBwdWJsaWMgZGlyZWN0b3J5XG4gICAqIHJlcXVlc3RzIGFyZSBtYXBwZWQgdG8gUzMga2V5cyBkaXJlY3RseSwgc28gdGhleSA0MDQgdW5sZXNzIHRoaXMgcHJlZml4IGlzXG4gICAqIGFwcGxpZWQuXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNBc3NldHNLZXlQcmVmaXg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYFNlcnZpY2UtV29ya2VyLUFsbG93ZWRgIGhlYWRlciBmb3IgYF9uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlci8qYCxcbiAgICogd2hpY2ggTmV4dC5qcyBzZW5kcyBzbyBhIGNvbXBpbGVkIHNlcnZpY2Ugd29ya2VyIGNhbiByZWdpc3RlciBhdCBhIHNjb3BlXG4gICAqIHdpZGVyIHRoYW4gaXRzIG93biBkaXJlY3RvcnksIHN1Y2ggYXMgYC9gLiBTMyBjYW4ndCBzZW5kIGFuIGFyYml0cmFyeVxuICAgKiBoZWFkZXIsIHNvIHNldHRpbmcgdGhpcyBhZGRzIGEgcmVzb3VyY2UgZm9yIHRob3NlIGZpbGVzIHdob3NlIGludGVncmF0aW9uXG4gICAqIHJlc3BvbnNlIGRvZXMuIE5leHQuanMgdXNlcyB0aGUgYXBwJ3MgYGJhc2VQYXRoYCwgb3IgYC9gIGZvciBub25lLlxuICAgKiBAZGVmYXVsdCAtIG5vIHJlc291cmNlOyB0aGUgYnVpbGQgaGFzIG5vIHNlcnZpY2Ugd29ya2VyXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlV29ya2VyQWxsb3dlZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFtGdXR1cmVdIFJlcXVpcmVkIGlmIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgLiBWUEMgdG8gY3JlYXRlIFZQQyBMaW5rIGFuZCBFQ1MgU2VydmljZSBEaXNjb3ZlcnlcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG4gIC8qKlxuICAgKiBUaGUgbm9uLWBkZWZhdWx0YCBmdW5jdGlvbiBncm91cHMsIHRoZSBMYW1iZGFzXG4gICAqIHtAbGluayBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzfSByb3V0ZSB0by5cbiAgICogQGRlZmF1bHQgLSBubyBzcGxpdHRpbmc7IGB7cHJveHkrfWAgc2VydmVzIGV2ZXJ5IGR5bmFtaWMgcm91dGVcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uR3JvdXBzPzogTmV4dGpzQXBpRnVuY3Rpb25Hcm91cFtdO1xuICAvKipcbiAgICogYE5leHRqc0J1aWxkLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnNgOiBlYWNoIGRpc3RpbmN0IGByb3V0ZWAgYmVjb21lcyBhXG4gICAqIHJlc291cmNlIHN1YnRyZWUgaW50ZWdyYXRlZCB3aXRoIGl0cyBncm91cCwgc28gdGhlIHJvdXRlcyBlYWNoIGdyb3VwIHdhc1xuICAgKiBwYWNrYWdlZCB3aXRoIHJlYWNoIGl0IHJhdGhlciB0aGFuIHtAbGluayBzZXJ2ZXJGdW5jdGlvbn0uXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Hcm91cEJlaGF2aW9ycz86IE5leHRqc0Z1bmN0aW9uR3JvdXBCZWhhdmlvcltdO1xuICAvKipcbiAgICogRGVwbG95IHRoZSBzdGFnZSBhZ2FpbiBvbmNlIGVhY2ggc3RhY2sgdXBkYXRlIGhhcyBmaW5pc2hlZCwgc28gaXQgc2VydmVzXG4gICAqIHRoZSBBUEkgYXMgaXQgaXMgYWZ0ZXIgdGhlIHVwZGF0ZS5cbiAgICpcbiAgICogQ2xvdWRGb3JtYXRpb24gc25hcHNob3RzIHRoZSBBUEkgaW50byBhIG5ldyBkZXBsb3ltZW50IHdoaWxlIHJlc291cmNlc1xuICAgKiByZW1vdmVkIGZyb20gdGhlIHRlbXBsYXRlIHN0aWxsIGV4aXN0IOKAlCBpdCBkZWxldGVzIHRoZW0gb25seSBkdXJpbmdcbiAgICogY2xlYW51cCDigJQgc28gdGhlIHN0YWdlIGtlZXBzIHNlcnZpbmcgdGhlbS4gQWZ0ZXIgcmVtb3ZpbmcgYSBmdW5jdGlvblxuICAgKiBncm91cCwgaXRzIHJvdXRlcyB0aGVuIHBvaW50IGF0IGEgZGVsZXRlZCBMYW1iZGEgYW5kIGFuc3dlciA1MDAgdW50aWwgdGhlXG4gICAqIG5leHQgZGVwbG95bWVudC4gQW4gRXZlbnRCcmlkZ2UgcnVsZSBvbiB0aGlzIHN0YWNrJ3MgYFVQREFURV9DT01QTEVURWBcbiAgICogKGFuZCBgVVBEQVRFX1JPTExCQUNLX0NPTVBMRVRFYCkgaW52b2tlcyBhIHNtYWxsIGZ1bmN0aW9uIHRoYXQgZGVwbG95cyB0aGVcbiAgICogc3RhZ2UgZnJvbSB0aGUgbGl2ZSBBUEkgYW5kIGRlbGV0ZXMgdGhlIGRlcGxveW1lbnRzIGl0cyBlYXJsaWVyIHJ1bnMgbWFkZS5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIGBvdmVycmlkZXMucmVzdEFwaVByb3BzLmRlcGxveWAgaXMgYGZhbHNlYDogdGhlcmUgaXMgbm8gc3RhZ2UuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHJlZGVwbG95QWZ0ZXJVcGRhdGU/OiBib29sZWFuO1xufVxuXG4vKiogQSBub24tZGVmYXVsdCBmdW5jdGlvbiBncm91cCBhbmQgdGhlIExhbWJkYSBpdHMgcm91dGVzIG11c3QgcmVhY2guICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0FwaUZ1bmN0aW9uR3JvdXAge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZ1bmN0aW9uOiBJRnVuY3Rpb247XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBUEkgR2F0ZXdheSBSRVNUIEFQSSBmb3IgTmV4dC5qcyBhcHBsaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0FwaSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgQVBJIEdhdGV3YXkgUkVTVCBBUElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGk6IFJlc3RBcGk7XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBVUkwgb2YgdGhlIGFwcCwgaW5jbHVkaW5nIGV2ZXJ5IHBhdGggc2VnbWVudCB0aGUgQVBJIG5lc3RzIGl0IHVuZGVyLlxuICAgKiBQcmVmZXJzIGEgY3VzdG9tIGRvbWFpbiBjb25maWd1cmVkIHRocm91Z2ggYG92ZXJyaWRlcy5yZXN0QXBpUHJvcHMuZG9tYWluTmFtZWBcbiAgICogb3ZlciB0aGUgZXhlY3V0ZS1hcGkgZW5kcG9pbnQuXG4gICAqXG4gICAqIEEgZG9tYWluIGF0dGFjaGVkIGFmdGVyIHRoaXMgY29uc3RydWN0IGlzIGNyZWF0ZWQgKGBhcGkuYWRkRG9tYWluTmFtZSgpYCkgaXNcbiAgICogc3RpbGwgdXNlZCBmb3IgdGhlIGhvc3QsIGJ1dCBDREsga2VlcHMgaXRzIGJhc2UgcGF0aCBtYXBwaW5ncyBwcml2YXRlLCBzbyBhXG4gICAqIG1hcHBpbmcgYWRkZWQgdGhhdCB3YXkgd29uJ3Qgc2hvdyB1cCBoZXJlLlxuICAgKi9cbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN1c3RvbURvbWFpbiA9IHRoaXMuYXBpLmRvbWFpbk5hbWU7XG4gICAgLy8gQSBjdXN0b20gZG9tYWluIHJlYWNoZXMgdGhlIHN0YWdlIHRocm91Z2ggYSBiYXNlIHBhdGggbWFwcGluZywgc28gdGhlXG4gICAgLy8gc3RhZ2UgbmFtZSBpc24ndCBpbiB0aGUgcGF0aCB0aGVyZTsgdGhlIG1hcHBpbmcgbWF5IGJlLCB3aGVuIHNldC5cbiAgICBjb25zdCBbb3JpZ2luLCBwcmVmaXhdID0gY3VzdG9tRG9tYWluXG4gICAgICA/IFtcbiAgICAgICAgICBgaHR0cHM6Ly8ke2N1c3RvbURvbWFpbi5kb21haW5OYW1lfWAsXG4gICAgICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LnJlc3RBcGlQcm9wcz8uZG9tYWluTmFtZT8uYmFzZVBhdGgsXG4gICAgICAgIF1cbiAgICAgIDogW1xuICAgICAgICAgIGBodHRwczovLyR7dGhpcy5hcGkucmVzdEFwaUlkfS5leGVjdXRlLWFwaS4ke1N0YWNrLm9mKHRoaXMpLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWAsXG4gICAgICAgICAgdGhpcy5hcGkuZGVwbG95bWVudFN0YWdlLnN0YWdlTmFtZSxcbiAgICAgICAgXTtcbiAgICByZXR1cm4gam9pblBhdGgob3JpZ2luLCBwcmVmaXgsIHRoaXMucHJvcHMuYmFzZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveXMgdGhlIHN0YWdlIGFnYWluIGFmdGVyIGVhY2ggc3RhY2sgdXBkYXRlLlxuICAgKiBAc2VlIE5leHRqc0FwaVByb3BzLnJlZGVwbG95QWZ0ZXJVcGRhdGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWRlcGxveUZ1bmN0aW9uPzogTGFtYmRhRnVuY3Rpb247XG4gIC8qKlxuICAgKiBNYXRjaGVzIHRoaXMgc3RhY2sncyBgVVBEQVRFX0NPTVBMRVRFYCBhbmQgYFVQREFURV9ST0xMQkFDS19DT01QTEVURWAgYW5kXG4gICAqIGludm9rZXMge0BsaW5rIHJlZGVwbG95RnVuY3Rpb259LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlZGVwbG95UnVsZT86IFJ1bGU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlUmVzb3VyY2U6IElSZXNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXh0UmVzb3VyY2U6IElSZXNvdXJjZTtcbiAgLyoqXG4gICAqIFJlc291cmNlcyBjcmVhdGVkIG9ubHkgYXMgcGFyZW50cyBvZiBhIGdyb3VwIHJvdXRlLCBhbmQgdGhlaXIgcGF0aHMuIEFQSVxuICAgKiBHYXRld2F5IGFuc3dlcnMgYSByZXF1ZXN0IGZvciBhIHJlc291cmNlIHdpdGggbm8gbWV0aG9kIGl0c2VsZiDigJQgNDAzXG4gICAqIFwiTWlzc2luZyBBdXRoZW50aWNhdGlvbiBUb2tlblwiIOKAlCByYXRoZXIgdGhhbiBmYWxsaW5nIGJhY2sgdG8gYSBge3Byb3h5K31gXG4gICAqIGhpZ2hlciB1cCwgc28gZWFjaCBuZWVkcyBvbmUuIFdpdGhvdXQgaXQgYSBgL2FwaS9yZXBvcnRzLyoqYCBncm91cCB0dXJuZWRcbiAgICogYC9hcGkvcmVwb3J0c2AgYW5kIGAvYXBpYCBpbnRvIDQwM3MuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwUGFyZW50UmVzb3VyY2VzID0gbmV3IE1hcDxJUmVzb3VyY2UsIHN0cmluZ1tdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBOZXh0anNBcGlQcm9wcztcbiAgcHJpdmF0ZSBzdGF0aWNJbnRlZ3JhdGlvblJvbGU6IElSb2xlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy52YWxpZGF0ZVByb3BzKHByb3BzKTtcbiAgICB0aGlzLmFwaSA9IHRoaXMuY3JlYXRlUmVzdEFwaSgpO1xuICAgIHRoaXMuYmFzZVJlc291cmNlID0gdGhpcy5jcmVhdGVCYXNlUmVzb3VyY2UocHJvcHMuYmFzZVBhdGgpO1xuICAgIHRoaXMubmV4dFJlc291cmNlID0gdGhpcy5iYXNlUmVzb3VyY2UuYWRkUmVzb3VyY2UoXCJfbmV4dFwiKTtcbiAgICB0aGlzLnN0YXRpY0ludGVncmF0aW9uUm9sZSA9IHRoaXMuY3JlYXRlU3RhdGljSW50ZWdyYXRpb25Sb2xlKCk7XG4gICAgdGhpcy5jcmVhdGVTdGF0aWNJbnRlZ3JhdGlvbnMoKTtcbiAgICBpZiAocHJvcHMuc2VydmVyRnVuY3Rpb24pIHtcbiAgICAgIC8vIEdyb3VwIHJlc291cmNlcyBiZWZvcmUgdGhlIGNhdGNoLWFsbCwgc28gYGFkZFJlc291cmNlYCBzZWVzIGEgY2xlYW4gdHJlZVxuICAgICAgLy8gYW5kIGEgZ3JvdXAgY2FuIGNsYWltIGEgcGF0aCB0aGUgY2F0Y2gtYWxsIHdvdWxkIG90aGVyd2lzZSBzZXJ2ZS5cbiAgICAgIHRoaXMuY3JlYXRlRnVuY3Rpb25Hcm91cEludGVncmF0aW9ucygpO1xuICAgICAgLy8gYF9uZXh0L2ltYWdlYCBoYXMgbm8gcmVzb3VyY2Ugb2YgaXRzIG93bjogaXQgZmFsbHMgdGhyb3VnaCB0byB0aGVcbiAgICAgIC8vIGB7cHJveHkrfWAgY2F0Y2gtYWxsLCBhbmQgdGhlIHNlcnZlciBmdW5jdGlvbiBvcHRpbWl6ZXMgaW4tcHJvY2Vzcy5cbiAgICAgIHRoaXMuY3JlYXRlRHluYW1pY0ludGVncmF0aW9uKHByb3BzLnNlcnZlckZ1bmN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHByb3BzLnZwYykge1xuICAgICAgLy8gW0Z1dHVyZV0gY3JlYXRlIGludGVncmF0aW9uIHdpdGggRUNTIHZpYSBWUEMgTGluayBhbmQgRUNTIFNlcnZpY2UgRGlzY292ZXJ5XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHByb3BzLnJlZGVwbG95QWZ0ZXJVcGRhdGUgIT09IGZhbHNlICYmXG4gICAgICBwcm9wcy5vdmVycmlkZXM/LnJlc3RBcGlQcm9wcz8uZGVwbG95ICE9PSBmYWxzZVxuICAgICkge1xuICAgICAgW3RoaXMucmVkZXBsb3lGdW5jdGlvbiwgdGhpcy5yZWRlcGxveVJ1bGVdID0gdGhpcy5jcmVhdGVSZWRlcGxveSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAc2VlIE5leHRqc0FwaVByb3BzLnJlZGVwbG95QWZ0ZXJVcGRhdGUgKi9cbiAgcHJpdmF0ZSBjcmVhdGVSZWRlcGxveSgpOiBbTGFtYmRhRnVuY3Rpb24sIFJ1bGVdIHtcbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHRoaXMpO1xuICAgIGNvbnN0IHsgcmVzdEFwaUlkIH0gPSB0aGlzLmFwaTtcbiAgICBjb25zdCB7IHN0YWdlTmFtZSB9ID0gdGhpcy5hcGkuZGVwbG95bWVudFN0YWdlO1xuICAgIGNvbnN0IGZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMsIFwiUmVkZXBsb3lGblwiLCB7XG4gICAgICAvLyBQbGFpbiBidW5kbGVkIEpTIHdpdGggbm8gbmF0aXZlIGRlcGVuZGVuY2llczogYWx3YXlzIGFybTY0LlxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIGpvaW4oXG4gICAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICAgIFwiLi4vYXNzZXRzL2xhbWJkYXMvcmVkZXBsb3ktc3RhZ2UvcmVkZXBsb3ktc3RhZ2UubGFtYmRhXCIsXG4gICAgICAgICksXG4gICAgICApLFxuICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBtZW1vcnlTaXplOiAyNTYsXG4gICAgICBydW50aW1lOiBuZXcgUnVudGltZShcIm5vZGVqczI0LnhcIiwgUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5yZWRlcGxveUZ1bmN0aW9uUHJvcHMsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ucmVkZXBsb3lGdW5jdGlvblByb3BzPy5lbnZpcm9ubWVudCxcbiAgICAgICAgUkVTVF9BUElfSUQ6IHJlc3RBcGlJZCxcbiAgICAgICAgU1RBR0VfTkFNRTogc3RhZ2VOYW1lLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICAvLyBBUEkgR2F0ZXdheSBhdXRob3JpemVzIGl0cyBtYW5hZ2VtZW50IEFQSSBieSBIVFRQIHZlcmIgb24gdGhlIHJlc291cmNlXG4gICAgLy8gcGF0aDsgdGhlc2UgYXJlIHRoZSBmb3VyIGNhbGxzIGByZWRlcGxveVN0YWdlYCBtYWtlcywgb24gdGhpcyBBUEkgb25seS5cbiAgICBjb25zdCByZXN0QXBpID0gYGFybjoke3N0YWNrLnBhcnRpdGlvbn06YXBpZ2F0ZXdheToke3N0YWNrLnJlZ2lvbn06Oi9yZXN0YXBpcy8ke3Jlc3RBcGlJZH1gO1xuICAgIGZuLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJhcGlnYXRld2F5OlBPU1RcIl0sXG4gICAgICAgIHJlc291cmNlczogW2Ake3Jlc3RBcGl9L2RlcGxveW1lbnRzYF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIGZuLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJhcGlnYXRld2F5OkdFVFwiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbYCR7cmVzdEFwaX0vZGVwbG95bWVudHNgLCBgJHtyZXN0QXBpfS9zdGFnZXNgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgZm4uYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcImFwaWdhdGV3YXk6REVMRVRFXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtgJHtyZXN0QXBpfS9kZXBsb3ltZW50cy8qYF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIC8vIENsb3VkRm9ybWF0aW9uIHNlbmRzIGV2ZXJ5IHN0YWNrIHN0YXR1cyBjaGFuZ2UgdG8gdGhlIGRlZmF1bHQgZXZlbnQgYnVzXG4gICAgLy8gKFwiTW9uaXRvcmluZyBDbG91ZEZvcm1hdGlvbiAuLi4gZXZlbnRzIHdpdGggRXZlbnRCcmlkZ2VcIiBpbiB0aGVcbiAgICAvLyBDbG91ZEZvcm1hdGlvbiBVc2VyIEd1aWRlKS4gYFVQREFURV9DT01QTEVURWAgY29tZXMgYWZ0ZXJcbiAgICAvLyBgVVBEQVRFX0NPTVBMRVRFX0NMRUFOVVBfSU5fUFJPR1JFU1NgLCBzbyByZW1vdmVkIHJlc291cmNlcyBhcmUgZ29uZSBieVxuICAgIC8vIHRoZW4uIEEgcm9sbGJhY2sgcmVzdG9yZXMgdGhlIHN0YWdlIHRvIHRoZSBwcmUtdXBkYXRlIGRlcGxveW1lbnQsIHdoaWNoXG4gICAgLy8gY2FuIGNhcnJ5IHRoZSBzYW1lIHN0YWxlbmVzcyBmcm9tIGFuIGVhcmxpZXIgdXBkYXRlLCBzbyBpdCByZWRlcGxveXMgdG9vLlxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUnVsZSh0aGlzLCBcIlJlZGVwbG95UnVsZVwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogYFJlZGVwbG95cyAke3N0YWNrLnN0YWNrTmFtZX0ncyBSRVNUIEFQSSBzdGFnZSBhZnRlciBhIHN0YWNrIHVwZGF0ZWAsXG4gICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgc291cmNlOiBbXCJhd3MuY2xvdWRmb3JtYXRpb25cIl0sXG4gICAgICAgIGRldGFpbFR5cGU6IFtcIkNsb3VkRm9ybWF0aW9uIFN0YWNrIFN0YXR1cyBDaGFuZ2VcIl0sXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIFwic3RhY2staWRcIjogW3N0YWNrLnN0YWNrSWRdLFxuICAgICAgICAgIFwic3RhdHVzLWRldGFpbHNcIjoge1xuICAgICAgICAgICAgc3RhdHVzOiBbXCJVUERBVEVfQ09NUExFVEVcIiwgXCJVUERBVEVfUk9MTEJBQ0tfQ09NUExFVEVcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uVGFyZ2V0KGZuLCB7IHJldHJ5QXR0ZW1wdHM6IDIgfSldLFxuICAgIH0pO1xuICAgIHJldHVybiBbZm4sIHJ1bGVdO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3BzKHByb3BzOiBOZXh0anNBcGlQcm9wcykge1xuICAgIGlmICghcHJvcHMuc2VydmVyRnVuY3Rpb24gJiYgIXByb3BzLnZwYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic2VydmVyRnVuY3Rpb24gb3IgdnBjIG11c3QgYmUgc2V0IGluIE5leHRqc0FwaVByb3BzXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVzdEFwaSgpOiBSZXN0QXBpIHtcbiAgICByZXR1cm4gbmV3IFJlc3RBcGkodGhpcywgXCJSZXN0QXBpXCIsIHtcbiAgICAgIGJpbmFyeU1lZGlhVHlwZXM6IFtcIiovKlwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgY2RrLW5leHRqcyBSRVNUIEFQSSBmb3IgJHtTdGFjay5vZih0aGlzKS5zdGFja05hbWV9YCxcbiAgICAgIGVuZHBvaW50VHlwZXM6IFtFbmRwb2ludFR5cGUuUkVHSU9OQUxdLFxuICAgICAgLy8gSW5lcnQgZm9yIHRoZSBkeW5hbWljIHJvdXRlczogQVBJIEdhdGV3YXkgZG9lcyBub3QgY29tcHJlc3MgYSByZXNwb25zZSBpdFxuICAgICAgLy8gc3RyZWFtcyAoYFJlc3BvbnNlVHJhbnNmZXJNb2RlLlNUUkVBTWApLCB3aGljaCBldmVyeSBMYW1iZGEgaW50ZWdyYXRpb25cbiAgICAgIC8vIGhlcmUgdXNlcywgc28gdGhlIHJ1bnRpbWUgZ3ppcHMgdGhvc2UgaXRzZWxmLiBLZXB0IGJlY2F1c2UgaXQgc3RpbGxcbiAgICAgIC8vIGFwcGxpZXMgdG8gdGhlIGJ1ZmZlcmVkIFMzIHN0YXRpYyBpbnRlZ3JhdGlvbnMsIGFuZCBiZWNhdXNlIGEgY29uc3VtZXJcbiAgICAgIC8vIHdobyBvdmVycmlkZXMgYW4gaW50ZWdyYXRpb24gdG8gQlVGRkVSRUQgZ2V0cyBjb21wcmVzc2lvbiBiYWNrLlxuICAgICAgbWluQ29tcHJlc3Npb25TaXplOiBTaXplLmJ5dGVzKDApLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnJlc3RBcGlQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYmFzZSByZXNvdXJjZSBwYXRoIGlmIG5lZWRlZC4gSW1wb3J0YW50IGlmIGBiYXNlUGF0aGAgaXMgc2V0LlxuICAgKlxuICAgKiBBIG5lc3RlZCBgYmFzZVBhdGhgIChcIi90ZWFtL2FwcFwiKSBoYXMgdG8gYmVjb21lIG9uZSByZXNvdXJjZSBwZXIgc2VnbWVudDpcbiAgICogQVBJIEdhdGV3YXkgcGF0aCBwYXJ0cyBjYW4ndCBjb250YWluIFwiL1wiLCBzbyBwYXNzaW5nIHRoZSB3aG9sZSB0aGluZyB0byBhXG4gICAqIHNpbmdsZSBgYWRkUmVzb3VyY2VgIGZhaWxzIHZhbGlkYXRpb24gYXQgc3ludGguIGByZXNvbHZlQmFzZVBhdGhgIGFjY2VwdHNcbiAgICogbmVzdGVkIHZhbHVlcywgc28gdGhpcyBpcyByZWFjaGFibGUuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUJhc2VSZXNvdXJjZShiYXNlUGF0aD86IHN0cmluZyk6IElSZXNvdXJjZSB7XG4gICAgLy8gQ3JlYXRlIGJhc2UgcmVzb3VyY2UgcGF0aCBpZiBuZWVkZWRcbiAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplQmFzZVBhdGgoYmFzZVBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXBpLnJvb3Q7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVkXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAucmVkdWNlPElSZXNvdXJjZT4oXG4gICAgICAgIChwYXJlbnQsIHNlZ21lbnQpID0+IHBhcmVudC5hZGRSZXNvdXJjZShzZWdtZW50KSxcbiAgICAgICAgdGhpcy5hcGkucm9vdCxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRpY0ludGVncmF0aW9uUm9sZSgpIHtcbiAgICAvLyBDcmVhdGUgUzMgaW50ZWdyYXRpb24gcm9sZVxuICAgIGNvbnN0IHN0YXRpY0ludGVncmF0aW9uUm9sZSA9IG5ldyBSb2xlKHRoaXMsIFwiU3RhdGljSW50ZWdyYXRpb25Sb2xlXCIsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiksXG4gICAgfSk7XG5cbiAgICAvLyBPbmx5IHRoaXMgYXBwJ3Mgb3duIG9iamVjdHM6IGEgc2hhcmVkIGJ1Y2tldCBob2xkcyBvdGhlciBhcHBzJyBhc3NldHNcbiAgICAvLyB1bmRlciB0aGVpciBvd24gcHJlZml4ZXMuIGBzMzpMaXN0QnVja2V0YCBtYWtlcyBhIG1pc3Npbmcga2V5IGEgNDA0ICh0aGVcbiAgICAvLyBvbmx5IGVycm9yIHRoZSBpbnRlZ3JhdGlvbiBtYXBzKSByYXRoZXIgdGhhbiBhIDQwMy4gSXQgc3RheXMgdW5jb25kaXRpb25lZDpcbiAgICAvLyBTMyBjaGVja3MgaXQgZHVyaW5nIGEgR2V0T2JqZWN0LCB3aGVyZSBubyBgczM6cHJlZml4YCBpcyBwcmVzZW50LCBzbyBhXG4gICAgLy8gcHJlZml4IGNvbmRpdGlvbiB3b3VsZCB0dXJuIGV2ZXJ5IG1pc3Npbmcga2V5IGJhY2sgaW50byBhIDQwMy5cbiAgICBzdGF0aWNJbnRlZ3JhdGlvblJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wiczM6R2V0T2JqZWN0XCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBgJHt0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXRBcm59LyR7c3RhdGljQXNzZXRzT2JqZWN0c1BhdHRlcm4odGhpcy5wcm9wcy5zdGF0aWNBc3NldHNLZXlQcmVmaXgpfWAsXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHN0YXRpY0ludGVncmF0aW9uUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXCJzMzpMaXN0QnVja2V0XCJdLFxuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXRBcm5dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gc3RhdGljSW50ZWdyYXRpb25Sb2xlO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdGF0aWNJbnRlZ3JhdGlvbnMoKSB7XG4gICAgY29uc3Qgc3RhdGljUmVzb3VyY2UgPSB0aGlzLm5leHRSZXNvdXJjZS5hZGRSZXNvdXJjZShcInN0YXRpY1wiKTtcbiAgICBzdGF0aWNSZXNvdXJjZVxuICAgICAgLmFkZFJlc291cmNlKFwie3Byb3h5K31cIilcbiAgICAgIC5hZGRNZXRob2QoXG4gICAgICAgIFwiR0VUXCIsXG4gICAgICAgIHRoaXMuY3JlYXRlUzNJbnRlZ3JhdGlvbih7IGtleTogdGhpcy5zM0tleShcIl9uZXh0L3N0YXRpYy97a2V5fVwiKSB9KSxcbiAgICAgICAgdGhpcy5nZXRTdGF0aWNNZXRob2RPcHRpb25zKHsgcHJveHk6IHRydWUgfSksXG4gICAgICApO1xuICAgIGNvbnN0IHsgc2VydmljZVdvcmtlckFsbG93ZWQgfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKHNlcnZpY2VXb3JrZXJBbGxvd2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgbGl0ZXJhbCBzZWdtZW50IGJlYXRzIGB7cHJveHkrfWAsIHNvIHNlcnZpY2Ugd29ya2VycyBnZXQgdGhlIG9uZVxuICAgICAgLy8gaGVhZGVyIFMzIGNhbid0IHNlbmQsIGFuZCB0aGUgcmVzdCBvZiBgX25leHQvc3RhdGljYCBpcyB1bmFmZmVjdGVkLlxuICAgICAgY29uc3QgaGVhZGVycyA9IHsgXCJTZXJ2aWNlLVdvcmtlci1BbGxvd2VkXCI6IHNlcnZpY2VXb3JrZXJBbGxvd2VkIH07XG4gICAgICBzdGF0aWNSZXNvdXJjZVxuICAgICAgICAuYWRkUmVzb3VyY2UoXCJzZXJ2aWNlLXdvcmtlclwiKVxuICAgICAgICAuYWRkUmVzb3VyY2UoXCJ7cHJveHkrfVwiKVxuICAgICAgICAuYWRkTWV0aG9kKFxuICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgdGhpcy5jcmVhdGVTM0ludGVncmF0aW9uKHtcbiAgICAgICAgICAgIGtleTogdGhpcy5zM0tleShcIl9uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlci97a2V5fVwiKSxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGhpcy5nZXRTdGF0aWNNZXRob2RPcHRpb25zKHsgcHJveHk6IHRydWUsIGhlYWRlcnMgfSksXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIGFkZCBwdWJsaWMgZGlyZWN0b3J5IGZpbGVzL2RpcmVjdG9yaWVzIHRoYXQgZXhpc3QgYXQgdG9wIGxldmVsIGJ1dCBuZWVkIHRvIGdvIHRvIFMzLlxuICAgIGNvbnN0IHVucm91dGFibGU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBwdWJsaWNEaXJFbnRyeSBvZiB0aGlzLnByb3BzLnB1YmxpY0RpckVudHJpZXMpIHtcbiAgICAgIC8vIEEgc3BhY2Ugb3IgYSBub24tQVNDSUkgY2hhcmFjdGVyIGlzIGxlZ2FsIGluIGBwdWJsaWMvYCBhbmQgaWxsZWdhbCBpbiBhblxuICAgICAgLy8gQVBJIEdhdGV3YXkgcmVzb3VyY2UgcGF0aCBwYXJ0LCBhbmQgYGFkZFJlc291cmNlYCB0aHJvd3Mg4oCUIHdoaWNoIHRvb2sgdGhlXG4gICAgICAvLyB3aG9sZSBzeW50aCBkb3duIGZvciBhbiBhcHAgdGhhdCBkZXBsb3lzIGZpbmUgb24gdGhlIEdsb2JhbCB0eXBlc1xuICAgICAgLy8gKGBuZXh0LWltYWdlLWxlZ2FjeS91bmljb2RlYCwgd2hvc2UgYHB1YmxpYy9gIGhvbGRzIFwiaGVsbG8gd29ybGQuanBnXCIpLlxuICAgICAgLy8gV2FybiBhbmQgc2tpcCB0aGUgb25lIGVudHJ5IGluc3RlYWQ6IHRoYXQgYXNzZXQgNDA0cywgdGhlIGFwcCBkZXBsb3lzLlxuICAgICAgaWYgKCFBUElfUEFUSF9QQVJULnRlc3QocHVibGljRGlyRW50cnkubmFtZSkpIHtcbiAgICAgICAgdW5yb3V0YWJsZS5wdXNoKGBcIiR7cHVibGljRGlyRW50cnkubmFtZX1cImApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwdWJsaWNEaXJFbnRyeS5pc0RpcmVjdG9yeSkge1xuICAgICAgICB0aGlzLmJhc2VSZXNvdXJjZVxuICAgICAgICAgIC5hZGRSZXNvdXJjZShwdWJsaWNEaXJFbnRyeS5uYW1lKVxuICAgICAgICAgIC5hZGRSZXNvdXJjZShcIntwcm94eSt9XCIpXG4gICAgICAgICAgLmFkZE1ldGhvZChcbiAgICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVMzSW50ZWdyYXRpb24oe1xuICAgICAgICAgICAgICBrZXk6IHRoaXMuczNLZXkoYCR7cHVibGljRGlyRW50cnkubmFtZX0ve2tleX1gKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy5nZXRTdGF0aWNNZXRob2RPcHRpb25zKHsgcHJveHk6IHRydWUgfSksXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYmFzZVJlc291cmNlXG4gICAgICAgICAgLmFkZFJlc291cmNlKHB1YmxpY0RpckVudHJ5Lm5hbWUpXG4gICAgICAgICAgLmFkZE1ldGhvZChcbiAgICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVMzSW50ZWdyYXRpb24oeyBrZXk6IHRoaXMuczNLZXkocHVibGljRGlyRW50cnkubmFtZSkgfSksXG4gICAgICAgICAgICB0aGlzLmdldFN0YXRpY01ldGhvZE9wdGlvbnMoKSxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodW5yb3V0YWJsZS5sZW5ndGggPiAwKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBBbiBBUEkgR2F0ZXdheSByZXNvdXJjZSBwYXRoIHBhcnQgb25seSBhbGxvd3MgYCArXG4gICAgICAgICAgXCJbYS16QS1aMC05Oi5fLSRdLCBzbyB0aGVzZSB0b3AtbGV2ZWwgcHVibGljLyBlbnRyaWVzIGdldCBubyByZXNvdXJjZSBvZiBcIiArXG4gICAgICAgICAgXCJ0aGVpciBvd247IHRoZWlyIHJlcXVlc3RzIHJlYWNoIHRoZSBzZXJ2ZXIgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIHRoZW0gXCIgK1xuICAgICAgICAgIGBmcm9tIFMzIGluc3RlYWQ6ICR7dW5yb3V0YWJsZS5qb2luKFwiLCBcIil9LiBUbyBzZXJ2ZSB0aGVtIGRpcmVjdGx5LCByZW5hbWUgdGhlbSwgbW92ZSB0aGVtIGludG8gYSBgICtcbiAgICAgICAgICBcInB1YmxpYy8gc3ViZGlyZWN0b3J5IHdob3NlIG93biBuYW1lIGlzIGV4cHJlc3NpYmxlLCBvciB1c2UgXCIgK1xuICAgICAgICAgIFwiTmV4dGpzR2xvYmFsRnVuY3Rpb25zIG9yIE5leHRqc0dsb2JhbENvbnRhaW5lcnMsIHdob3NlIENsb3VkRnJvbnQgXCIgK1xuICAgICAgICAgIFwiYmVoYXZpb3JzIGNhbiBtYXRjaCB0aGVtLlwiLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlZml4ZXMgYSByZXF1ZXN0IHBhdGggd2l0aCB0aGUga2V5IHByZWZpeCB0aGUgYXNzZXRzIHdlcmUgdXBsb2FkZWQgdW5kZXIsXG4gICAqIHNpbmNlIHRoZSBTMyBpbnRlZ3JhdGlvbnMgYWRkcmVzcyBvYmplY3RzIGJ5IGtleSByYXRoZXIgdGhhbiBieSBVUkwuXG4gICAqL1xuICBwcml2YXRlIHMzS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gam9pblBhdGgodGhpcy5wcm9wcy5zdGF0aWNBc3NldHNLZXlQcmVmaXgsIGtleSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBBUEkgcmVxdWVzdCB0byBTMyByZXF1ZXN0LlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9yZXN0LWFwaS1wYXJhbWV0ZXItbWFwcGluZy1zb3VyY2VzLmh0bWxcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaW50ZWdyYXRpbmctYXBpLXdpdGgtYXdzLXNlcnZpY2VzLXMzLmh0bWwjYXBpLWl0ZW1zLWluLWZvbGRlci1hcy1zMy1vYmplY3RzLWluLWJ1Y2tldFxuICAgKiBAcGFyYW0gaGVhZGVycyBmaXhlZCByZXNwb25zZSBoZWFkZXJzLCBzZW50IHdpdGggYSAyMDAgYW5kIGEgMzA0XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVMzSW50ZWdyYXRpb24oe1xuICAgIGtleSxcbiAgICBoZWFkZXJzID0ge30sXG4gIH06IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSkge1xuICAgIC8vIEEgc3RhdGljIHZhbHVlIGlzIGEgc2luZ2xlLXF1b3RlZCBsaXRlcmFsIGluIGEgbWFwcGluZyBleHByZXNzaW9uLlxuICAgIGNvbnN0IGZpeGVkSGVhZGVycyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gW1xuICAgICAgICBgbWV0aG9kLnJlc3BvbnNlLmhlYWRlci4ke25hbWV9YCxcbiAgICAgICAgYCcke3ZhbHVlfSdgLFxuICAgICAgXSksXG4gICAgKTtcbiAgICBjb25zdCBwcm9wczogQXdzSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgICAgIHNlcnZpY2U6IFwiczNcIixcbiAgICAgIGludGVncmF0aW9uSHR0cE1ldGhvZDogXCJHRVRcIixcbiAgICAgIHBhdGg6IGAke3RoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWV9LyR7a2V5fWAsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGNyZWRlbnRpYWxzUm9sZTogdGhpcy5zdGF0aWNJbnRlZ3JhdGlvblJvbGUsXG4gICAgICAgIHBhc3N0aHJvdWdoQmVoYXZpb3I6IFBhc3N0aHJvdWdoQmVoYXZpb3IuV0hFTl9OT19URU1QTEFURVMsIC8vIHJlY29tbWVuZGVkXG4gICAgICAgIHJlcXVlc3RQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgLy8gV2l0aG91dCB0aGlzIFMzIG5ldmVyIHNlZXMgdGhlIGNvbmRpdGlvbmFsIHJlcXVlc3QsIHNvIGV2ZXJ5XG4gICAgICAgICAgLy8gcmV2YWxpZGF0aW9uIG9mIGFuIGltbXV0YWJsZSBgX25leHQvc3RhdGljYCBjaHVuayByZS1kb3dubG9hZHMgaXRcbiAgICAgICAgICAvLyB3aXRoIGEgMjAwIGluc3RlYWQgb2YgZ2V0dGluZyBhIDMwNC5cbiAgICAgICAgICBcImludGVncmF0aW9uLnJlcXVlc3QuaGVhZGVyLklmLU5vbmUtTWF0Y2hcIjpcbiAgICAgICAgICAgIFwibWV0aG9kLnJlcXVlc3QuaGVhZGVyLklmLU5vbmUtTWF0Y2hcIixcbiAgICAgICAgICBcImludGVncmF0aW9uLnJlcXVlc3QuaGVhZGVyLklmLU1vZGlmaWVkLVNpbmNlXCI6XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXF1ZXN0LmhlYWRlci5JZi1Nb2RpZmllZC1TaW5jZVwiLFxuICAgICAgICAgIC4uLihrZXkuaW5jbHVkZXMoXCJ7a2V5fVwiKVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXF1ZXN0LnBhdGgua2V5XCI6IFwibWV0aG9kLnJlcXVlc3QucGF0aC5wcm94eVwiLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZWdyYXRpb25SZXNwb25zZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBcIjIwMFwiLFxuICAgICAgICAgICAgcmVzcG9uc2VQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LVR5cGVcIjpcbiAgICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5Db250ZW50LVR5cGVcIixcbiAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCI6XG4gICAgICAgICAgICAgICAgXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuQ29udGVudC1MZW5ndGhcIixcbiAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNhY2hlLUNvbnRyb2xcIjpcbiAgICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5DYWNoZS1Db250cm9sXCIsXG4gICAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5FVGFnXCI6IFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkVUYWdcIixcbiAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkxhc3QtTW9kaWZpZWRcIjpcbiAgICAgICAgICAgICAgICBcImludGVncmF0aW9uLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gQSAzMDQgY2FycmllcyBubyBib2R5LCBhbmQgYEVUYWdgIGlzIHRoZSBoZWFkZXIgYSBjbGllbnQgbmVlZHNcbiAgICAgICAgICAgIC8vIGJhY2sgdG8ga2VlcCByZXZhbGlkYXRpbmcuXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBcIjMwNFwiLFxuICAgICAgICAgICAgc2VsZWN0aW9uUGF0dGVybjogXCIzMDRcIixcbiAgICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkNhY2hlLUNvbnRyb2xcIixcbiAgICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogXCJpbnRlZ3JhdGlvbi5yZXNwb25zZS5oZWFkZXIuRVRhZ1wiLFxuICAgICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuTGFzdC1Nb2RpZmllZFwiOlxuICAgICAgICAgICAgICAgIFwiaW50ZWdyYXRpb24ucmVzcG9uc2UuaGVhZGVyLkxhc3QtTW9kaWZpZWRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiBcIjQwNFwiLFxuICAgICAgICAgICAgc2VsZWN0aW9uUGF0dGVybjogXCI0MDRcIixcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5zdGF0aWNJbnRlZ3JhdGlvblByb3BzLFxuICAgIH07XG4gICAgLy8gQWRkZWQgYWZ0ZXIgdGhlIG92ZXJyaWRlLCB3aGljaCByZXBsYWNlcyBgb3B0aW9uc2Agd2hvbGUsIHNvIHRoZVxuICAgIC8vIGhlYWRlcnMgc3Vydml2ZSBvbmUgdGhhdCBzZXRzIGl0cyBvd24gaW50ZWdyYXRpb24gcmVzcG9uc2VzLlxuICAgIHJldHVybiBuZXcgQXdzSW50ZWdyYXRpb24oe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBvcHRpb25zOiBwcm9wcy5vcHRpb25zICYmIHtcbiAgICAgICAgLi4ucHJvcHMub3B0aW9ucyxcbiAgICAgICAgaW50ZWdyYXRpb25SZXNwb25zZXM6IHdpdGhGaXhlZEhlYWRlcnMoXG4gICAgICAgICAgcHJvcHMub3B0aW9ucy5pbnRlZ3JhdGlvblJlc3BvbnNlcyxcbiAgICAgICAgICBmaXhlZEhlYWRlcnMsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBwYXJhbSBoZWFkZXJzIHRoZSBmaXhlZCBoZWFkZXJzIGBjcmVhdGVTM0ludGVncmF0aW9uYCB3YXMgZ2l2ZW4gKi9cbiAgcHJpdmF0ZSBnZXRTdGF0aWNNZXRob2RPcHRpb25zKHtcbiAgICBwcm94eSA9IGZhbHNlLFxuICAgIGhlYWRlcnMgPSB7fSxcbiAgfToge1xuICAgIHByb3h5PzogYm9vbGVhbjtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSA9IHt9KTogTWV0aG9kT3B0aW9ucyB7XG4gICAgY29uc3QgZml4ZWRIZWFkZXJzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmtleXMoaGVhZGVycykubWFwKChuYW1lKSA9PiBbXG4gICAgICAgIGBtZXRob2QucmVzcG9uc2UuaGVhZGVyLiR7bmFtZX1gLFxuICAgICAgICB0cnVlLFxuICAgICAgXSksXG4gICAgKTtcbiAgICBjb25zdCBvcHRpb25zOiBNZXRob2RPcHRpb25zID0ge1xuICAgICAgcmVxdWVzdFBhcmFtZXRlcnM6IHtcbiAgICAgICAgLy8gRGVjbGFyZWQgb3B0aW9uYWwgKGBmYWxzZWApOiBhIHBsYWluIEdFVCBjYXJyaWVzIG5laXRoZXIsIGFuZFxuICAgICAgICAvLyByZXF1aXJpbmcgdGhlbSB3b3VsZCA0MDAgaXQuXG4gICAgICAgIFwibWV0aG9kLnJlcXVlc3QuaGVhZGVyLklmLU5vbmUtTWF0Y2hcIjogZmFsc2UsXG4gICAgICAgIFwibWV0aG9kLnJlcXVlc3QuaGVhZGVyLklmLU1vZGlmaWVkLVNpbmNlXCI6IGZhbHNlLFxuICAgICAgICAuLi4ocHJveHkgPyB7IFwibWV0aG9kLnJlcXVlc3QucGF0aC5wcm94eVwiOiB0cnVlIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgbWV0aG9kUmVzcG9uc2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiBcIjIwMFwiLFxuICAgICAgICAgIHJlc3BvbnNlUGFyYW1ldGVyczoge1xuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtVHlwZVwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkNvbnRlbnQtTGVuZ3RoXCI6IHRydWUsXG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IFwiMzA0XCIsXG4gICAgICAgICAgcmVzcG9uc2VQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICBcIm1ldGhvZC5yZXNwb25zZS5oZWFkZXIuQ2FjaGUtQ29udHJvbFwiOiB0cnVlLFxuICAgICAgICAgICAgXCJtZXRob2QucmVzcG9uc2UuaGVhZGVyLkVUYWdcIjogdHJ1ZSxcbiAgICAgICAgICAgIFwibWV0aG9kLnJlc3BvbnNlLmhlYWRlci5MYXN0LU1vZGlmaWVkXCI6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0YXR1c0NvZGU6IFwiNDA0XCIsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnMzTWV0aG9kT3B0aW9ucyxcbiAgICB9O1xuICAgIC8vIEFmdGVyIHRoZSBvdmVycmlkZSwgYXMgaW4gYGNyZWF0ZVMzSW50ZWdyYXRpb25gOiBBUEkgR2F0ZXdheSByZWplY3RzIGFuXG4gICAgLy8gaW50ZWdyYXRpb24gcmVzcG9uc2UgbWFwcGluZyBhIGhlYWRlciBpdHMgbWV0aG9kIHJlc3BvbnNlIGRvZXNuJ3RcbiAgICAvLyBkZWNsYXJlLCBzbyB0aGUgdHdvIGhhdmUgdG8gc3Vydml2ZSBhbiBvdmVycmlkZSB0b2dldGhlci5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIG1ldGhvZFJlc3BvbnNlczogd2l0aEZpeGVkSGVhZGVycyhvcHRpb25zLm1ldGhvZFJlc3BvbnNlcywgZml4ZWRIZWFkZXJzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE9uZSByZXNvdXJjZSBzdWJ0cmVlIHBlciBmdW5jdGlvbiBncm91cCBwYXR0ZXJuLlxuICAgKlxuICAgKiBVbmxpa2UgQ2xvdWRGcm9udCB0aGlzIG5lZWRzIG5vIG9yZGVyaW5nOiBBUEkgR2F0ZXdheSBtYXRjaGVzIG9uIGEgcmVzb3VyY2VcbiAgICogKnRyZWUqLCBzbyBgL2FwaS9yZXBvcnRzL3twcm94eSt9YCBiZWF0cyBgL2FwaS97cHJveHkrfWAgYmVhdHMgYC97cHJveHkrfWBcbiAgICogc3RydWN0dXJhbGx5LCBhbmQgXCJsb25nZXN0IHBhdHRlcm4gd2luc1wiIGNvbWVzIGZvciBmcmVlLiBXaGF0IGRvZXMgbmVlZCBjYXJlXG4gICAqIGlzIG5vdCBjcmVhdGluZyB0aGUgc2FtZSBwYXRoIHR3aWNlIOKAlCB0d28gZ3JvdXBzIHVuZGVyIGAvYXBpYCBzaGFyZSB0aGUgYGFwaWBcbiAgICogcmVzb3VyY2Ug4oCUIHNvIGV2ZXJ5IHNlZ21lbnQgZ29lcyB0aHJvdWdoIHtAbGluayByZXNvdXJjZUZvcn0uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uR3JvdXBJbnRlZ3JhdGlvbnMoKSB7XG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy5wcm9wcy5mdW5jdGlvbkdyb3VwcyA/PyBbXTtcbiAgICBjb25zdCBiZWhhdmlvcnMgPSB0aGlzLnByb3BzLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMgPz8gW107XG4gICAgY29uc3QgdW5rbm93biA9IGJlaGF2aW9ycy5maW5kKFxuICAgICAgKGJlaGF2aW9yKSA9PiAhZ3JvdXBzLnNvbWUoKGdyb3VwKSA9PiBncm91cC5uYW1lID09PSBiZWhhdmlvci5ncm91cCksXG4gICAgKTtcbiAgICBpZiAodW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBcXGBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzXFxgIHJvdXRlcyB0byBmdW5jdGlvbiBncm91cCBgICtcbiAgICAgICAgICBgXCIke3Vua25vd24uZ3JvdXB9XCIsIHdoaWNoIGlzIG5vdCBpbiBcXGBmdW5jdGlvbkdyb3Vwc1xcYC5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgcm91dGVSZXNvdXJjZXMgPSBuZXcgU2V0PElSZXNvdXJjZT4oKTtcbiAgICAvKiogRWFjaCBzdWJ0cmVlJ3MgYmFzZSBwYXRoIGFuZCB0aGUgaW50ZWdyYXRpb24gaXRzIGB7cHJveHkrfWAgZ290LiAqL1xuICAgIGNvbnN0IHN1YnRyZWVzOiBbc3RyaW5nW10sIExhbWJkYUludGVncmF0aW9uXVtdID0gW107XG4gICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICAgIGNvbnN0IGludGVncmF0aW9uID0gbmV3IExhbWJkYUludGVncmF0aW9uKGdyb3VwLmZ1bmN0aW9uLCB7XG4gICAgICAgIHJlc3BvbnNlVHJhbnNmZXJNb2RlOiBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU0sXG4gICAgICAgIC8vIE9uZSBBUEktd2lkZSBwZXJtaXNzaW9uIHBlciBmdW5jdGlvbjsgc2VlIGBjcmVhdGVEeW5hbWljSW50ZWdyYXRpb25gLlxuICAgICAgICBzY29wZVBlcm1pc3Npb25Ub01ldGhvZDogZmFsc2UsXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5keW5hbWljSW50ZWdyYXRpb25Qcm9wcyxcbiAgICAgIH0pO1xuICAgICAgLy8gVGhlIENsb3VkRnJvbnQgcGF0dGVybnMgYXJlIGZvciB0aGUgZWRnZTsgYSByZXNvdXJjZSBwYXRoIHBlciByb3V0ZVxuICAgICAgLy8gY292ZXJzIHdoYXQgdGhleSBkbyBoZXJlLCBhIGB0cmFpbGluZ1NsYXNoYCBmb3JtIGluY2x1ZGVkLCBzaW5jZSBBUElcbiAgICAgIC8vIEdhdGV3YXkgbWF0Y2hlcyBgL3ByaWNpbmcvYCBvbiB0aGUgYHByaWNpbmdgIHJlc291cmNlLlxuICAgICAgY29uc3Qgb3duID0gYmVoYXZpb3JzLmZpbHRlcigoYmVoYXZpb3IpID0+IGJlaGF2aW9yLmdyb3VwID09PSBncm91cC5uYW1lKTtcbiAgICAgIGNvbnN0IGhhc0RhdGFSb3V0ZXMgPSBvd24uc29tZSgoeyBwYXR0ZXJuIH0pID0+XG4gICAgICAgIHBhdHRlcm4uc3RhcnRzV2l0aChcIl9uZXh0L2RhdGEvXCIpLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgbmV3IFNldChvd24ubWFwKChiZWhhdmlvcikgPT4gYmVoYXZpb3Iucm91dGUpKSkge1xuICAgICAgICB0aGlzLmFzc2VydFJvdXRhYmxlKHJvdXRlLCBncm91cC5uYW1lKTtcbiAgICAgICAgdGhpcy5hc3NlcnROb1B1YmxpY0NvbGxpc2lvbihyb3V0ZSwgZ3JvdXAubmFtZSk7XG4gICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLnJlc291cmNlUGF0aHNGb3Iocm91dGUsIGhhc0RhdGFSb3V0ZXMpKSB7XG4gICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlRm9yKHBhdGgpO1xuICAgICAgICAgIHJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBpbnRlZ3JhdGlvbik7XG4gICAgICAgICAgcm91dGVSZXNvdXJjZXMuYWRkKHJlc291cmNlKTtcbiAgICAgICAgICBpZiAocGF0aFtwYXRoLmxlbmd0aCAtIDFdID09PSBcIntwcm94eSt9XCIpIHtcbiAgICAgICAgICAgIHN1YnRyZWVzLnB1c2goW3BhdGguc2xpY2UoMCwgLTEpLCBpbnRlZ3JhdGlvbl0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBBIHBhcmVudCB1bmRlciBhbm90aGVyIGdyb3VwJ3Mgc3VidHJlZSBiZWxvbmdzIHRvIHRoYXQgZ3JvdXAsIGFzIGl0IGRvZXNcbiAgICAvLyBhdCB0aGUgZWRnZSBhbmQgaW4gYGFzc2lnblJvdXRlc1RvR3JvdXBzYDogd2l0aCBgL2FwaS8qKmAgYW5kXG4gICAgLy8gYC9hcGkvcmVwb3J0cy8qKmAsIGAvYXBpL3JlcG9ydHNgIGlzIHRoZSBgYXBpYCBncm91cCdzLiBUaGUgZGVlcGVzdFxuICAgIC8vIGNvdmVyaW5nIHN1YnRyZWUgd2luczsgdGhlIHJlc3QgYXJlIGxlZnQgdG8gdGhlIGRlZmF1bHQgZnVuY3Rpb24uXG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2UsIHBhdGhdIG9mIHRoaXMuZ3JvdXBQYXJlbnRSZXNvdXJjZXMpIHtcbiAgICAgIGlmIChyb3V0ZVJlc291cmNlcy5oYXMocmVzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBQYXJlbnRSZXNvdXJjZXMuZGVsZXRlKHJlc291cmNlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBvd25lciA9IHN1YnRyZWVzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFtiYXNlXSkgPT5cbiAgICAgICAgICAgIGJhc2UubGVuZ3RoIDwgcGF0aC5sZW5ndGggJiZcbiAgICAgICAgICAgIGJhc2UuZXZlcnkoKHNlZ21lbnQsIGkpID0+IHNlZ21lbnQgPT09IHBhdGhbaV0pLFxuICAgICAgICApXG4gICAgICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYi5sZW5ndGggLSBhLmxlbmd0aClbMF07XG4gICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgcmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIG93bmVyWzFdKTtcbiAgICAgICAgdGhpcy5ncm91cFBhcmVudFJlc291cmNlcy5kZWxldGUocmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZ3JvdXAgcGF0dGVybiB2YWxpZGF0aW9uIGFjY2VwdHMgZXZlcnkgY2hhcmFjdGVyIGEgQ2xvdWRGcm9udCBwYXRoXG4gICAqIHBhdHRlcm4gY2FuIGhvbGQsIGFuZCBBUEkgR2F0ZXdheSdzIHBhdGggcGFydHMgaG9sZCBmZXdlcjogYH5gLCBgQGAsIGArYCxcbiAgICogYCZgIGFuZCBxdW90ZXMgcGFzcyBpdCBhbmQgdGhlbiBmYWlsIGBhZGRSZXNvdXJjZWAgd2l0aCBhbiBlcnJvciB0aGF0IG5hbWVzXG4gICAqIG5laXRoZXIgdGhlIGdyb3VwIG5vciB0aGUgcGF0dGVybi4gU2F5IHdoaWNoLCBhbmQgd2hhdCB0byBkbyBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnRSb3V0YWJsZShyb3V0ZTogc3RyaW5nLCBncm91cE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gKHJvdXRlLmVuZHNXaXRoKFwiLyoqXCIpID8gcm91dGUuc2xpY2UoMCwgLTMpIDogcm91dGUpXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGludmFsaWQgPSBzZWdtZW50cy5maW5kKChzZWdtZW50KSA9PiAhQVBJX1BBVEhfUEFSVC50ZXN0KHNlZ21lbnQpKTtcbiAgICBpZiAoaW52YWxpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9IGZ1bmN0aW9uR3JvdXBzIHBhdHRlcm4gXCIke3JvdXRlfVwiIChncm91cCBcIiR7Z3JvdXBOYW1lfVwiKSBgICtcbiAgICAgICAgYGhhcyBhIHNlZ21lbnQsIFwiJHtpbnZhbGlkfVwiLCB0aGF0IGFuIEFQSSBHYXRld2F5IHJlc291cmNlIHBhdGggcGFydCBgICtcbiAgICAgICAgXCJjYW5ub3QgaG9sZDogb25seSBbYS16QS1aMC05Oi5fLSRdIGFyZSBhbGxvd2VkLiBSb3V0ZSB0aGF0IHBhdGggZnJvbSBcIiArXG4gICAgICAgIFwiYSBwYXR0ZXJuIGhpZ2hlciB1cCB0aGUgdHJlZSAoZS5nLiBpdHMgcGFyZW50IGRpcmVjdG9yeSB3aXRoIGAvKipgKSwgXCIgK1xuICAgICAgICBcIm9yIHVzZSBOZXh0anNHbG9iYWxGdW5jdGlvbnMsIHdob3NlIENsb3VkRnJvbnQgYmVoYXZpb3JzIGFsbG93IGl0LlwiLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdXNlIGEgZ3JvdXAgcm91dGUgdGhhdCBzaGFyZXMgYSByZXNvdXJjZSB3aXRoIGEgYHB1YmxpYy9gIGVudHJ5LlxuICAgKlxuICAgKiBBIHB1YmxpYyBkaXJlY3RvcnkgYGRvY3NgIGlzIGBkb2NzL3twcm94eSt9YCB3aXRoIGEgYEdFVGAgdG8gUzMuIGAvZG9jcy8qKmBcbiAgICogYWRkcyBgQU5ZYCB0byB0aGF0IHNhbWUgcmVzb3VyY2UsIGFuZCBBUEkgR2F0ZXdheSBwcmVmZXJzIHRoZSBgR0VUYCwgc29cbiAgICogZXZlcnkgcGFnZSBsb2FkIHVuZGVyIHRoZSBncm91cCB3ZW50IHRvIFMzOyBgL2RvY3MvZ3VpZGUvKipgIGlzIGEgbW9yZVxuICAgKiBzcGVjaWZpYyByZXNvdXJjZSBpbnN0ZWFkLCBhbmQgdGFrZXMgYC9kb2NzL2d1aWRlL+KApmAgYXdheSBmcm9tIHRoZSBwdWJsaWNcbiAgICogZmlsZXMuIEEgcHVibGljIGZpbGUgYHByaWNpbmdgIGFuZCBhbiBleGFjdCBgL3ByaWNpbmdgIGFyZSB0aGUgc2FtZVxuICAgKiByZXNvdXJjZSB0aGUgc2FtZSB3YXkuIGBOZXh0anNEaXN0cmlidXRpb25gIHJlamVjdHMgdGhlIENsb3VkRnJvbnRcbiAgICogZXF1aXZhbGVudHMuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydE5vUHVibGljQ29sbGlzaW9uKHJvdXRlOiBzdHJpbmcsIGdyb3VwTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgaXNTdWJ0cmVlID0gcm91dGUuZW5kc1dpdGgoXCIvKipcIik7XG4gICAgY29uc3Qgc2VnbWVudHMgPSAoaXNTdWJ0cmVlID8gcm91dGUuc2xpY2UoMCwgLTMpIDogcm91dGUpXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5wcm9wcy5wdWJsaWNEaXJFbnRyaWVzLmZpbmQoKGl0KSA9PlxuICAgICAgaXQuaXNEaXJlY3RvcnlcbiAgICAgICAgPyBpdC5uYW1lID09PSBzZWdtZW50c1swXSAmJiAoaXNTdWJ0cmVlIHx8IHNlZ21lbnRzLmxlbmd0aCA+IDEpXG4gICAgICAgIDogIWlzU3VidHJlZSAmJiBzZWdtZW50cy5sZW5ndGggPT09IDEgJiYgaXQubmFtZSA9PT0gc2VnbWVudHNbMF0sXG4gICAgKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke0xPR19QUkVGSVh9IGZ1bmN0aW9uR3JvdXBzIHBhdHRlcm4gXCIke3JvdXRlfVwiIChncm91cCBcIiR7Z3JvdXBOYW1lfVwiKSBgICtcbiAgICAgICAgYG92ZXJsYXBzIHRoZSB0b3AtbGV2ZWwgcHVibGljLyAke2VudHJ5LmlzRGlyZWN0b3J5ID8gXCJkaXJlY3RvcnlcIiA6IFwiZmlsZVwifSBgICtcbiAgICAgICAgYFwiJHtlbnRyeS5uYW1lfVwiLCB3aGljaCBBUEkgR2F0ZXdheSBzZXJ2ZXMgZnJvbSBTMyBvbiB0aGUgc2FtZSBgICtcbiAgICAgICAgYHJlc291cmNlIHBhdGgsIHNvIG9uZSBvZiB0aGUgdHdvIHdvdWxkIG5ldmVyIGJlIHJlYWNoZWQuIE1vdmUgdGhvc2UgYCArXG4gICAgICAgIGBwdWJsaWMvIGZpbGVzIHVuZGVyIGEgZGlyZWN0b3J5IG5vIHJvdXRlIHVzZXMsIG9yIGdyb3VwIGEgZGlmZmVyZW50IGAgK1xuICAgICAgICBgcGF0aC5gLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb3VyY2UgcGF0aHMsIGFzIHNlZ21lbnQgYXJyYXlzLCBmb3Igb25lIGdyb3VwIHBhdHRlcm4uXG4gICAqXG4gICAqIEEgc3VidHJlZSBnZXRzIGB7cHJveHkrfWAgYXMgaXRzIGxhc3Qgc2VnbWVudCBhbmQgc28gb3ducyBldmVyeXRoaW5nICp1bmRlcipcbiAgICogdGhlIHBhdGggYnV0IG5vdCB0aGUgcGF0aCBpdHNlbGYsIG1hdGNoaW5nIGJvdGggdGhlIENsb3VkRnJvbnQgdHJhbnNsYXRpb24gYW5kXG4gICAqIGBhc3NpZ25Sb3V0ZXNUb0dyb3Vwc2AuIEFuIGV4YWN0IHBhdGggZ2V0cyBubyBwcm94eSBzZWdtZW50LCB3aGljaCBsZWF2ZXMgaXRzXG4gICAqIGNoaWxkcmVuIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgcm9vdCBge3Byb3h5K31gIOKAlCBhbHNvIHRoZSBDbG91ZEZyb250IHJlc3VsdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb3VyY2VQYXRoc0Zvcihyb3V0ZTogc3RyaW5nLCBoYXNEYXRhUm91dGVzPzogYm9vbGVhbik6IHN0cmluZ1tdW10ge1xuICAgIGNvbnN0IGlzU3VidHJlZSA9IHJvdXRlLmVuZHNXaXRoKFwiLyoqXCIpO1xuICAgIGNvbnN0IGJhc2UgPSAoaXNTdWJ0cmVlID8gcm91dGUuc2xpY2UoMCwgLTMpIDogcm91dGUpXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHBhdGhzID0gW2lzU3VidHJlZSA/IFsuLi5iYXNlLCBcIntwcm94eSt9XCJdIDogYmFzZV07XG4gICAgaWYgKGhhc0RhdGFSb3V0ZXMpIHtcbiAgICAgIC8vIGA8YnVpbGRJZD5gIGNoYW5nZXMgZXZlcnkgYnVpbGQsIHNvIGl0IGlzIGEgcGF0aCBwYXJhbWV0ZXIgcmF0aGVyIHRoYW4gYVxuICAgICAgLy8gbGl0ZXJhbCDigJQgdGhlIGludGVncmF0aW9uIGlnbm9yZXMgaXQsIHRoZSBydW50aW1lIHJlYWRzIGl0IG9mZiB0aGUgVVJMLlxuICAgICAgLy8gVW5saWtlIENsb3VkRnJvbnQncyBgKmAsIHdoaWNoIGBOZXh0anNEaXN0cmlidXRpb25gIGhhZCB0byByZXBsYWNlIHdpdGhcbiAgICAgIC8vIHRoZSBsaXRlcmFsIElELCBhIHBhdGggcGFyYW1ldGVyIGlzIGV4YWN0bHkgb25lIHNlZ21lbnQsIHNvXG4gICAgICAvLyBgL19uZXh0L2RhdGEve2J1aWxkSWR9L2Jsb2cve3Byb3h5K31gIGNhbm5vdCBjYXB0dXJlIGFub3RoZXIgZ3JvdXAnc1xuICAgICAgLy8gYC9fbmV4dC9kYXRhLzxpZD4vZG9jcy9ibG9nL+KApmAuIEEgcmVxdWVzdCBmb3IgYW4gb2xkIGJ1aWxkIElEIHJlYWNoZXNcbiAgICAgIC8vIHRoZSBncm91cCwgd2hpY2ggNDA0cyBpdCBqdXN0IGFzIHRoZSBkZWZhdWx0IGZ1bmN0aW9uIHdvdWxkLlxuICAgICAgY29uc3QgZGF0YVByZWZpeCA9IFtcIl9uZXh0XCIsIFwiZGF0YVwiLCBcIntidWlsZElkfVwiXTtcbiAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgIGlzU3VidHJlZVxuICAgICAgICAgID8gWy4uLmRhdGFQcmVmaXgsIC4uLmJhc2UsIFwie3Byb3h5K31cIl1cbiAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgLi4uZGF0YVByZWZpeCxcbiAgICAgICAgICAgICAgLi4uYmFzZS5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgIGAke2Jhc2VbYmFzZS5sZW5ndGggLSAxXX0uanNvbmAsXG4gICAgICAgICAgICBdLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG5cbiAgLyoqIFdhbGsgb3IgY3JlYXRlIGEgcmVzb3VyY2UgcGF0aCwgcmV1c2luZyB3aGF0ZXZlciBhbHJlYWR5IGV4aXN0cy4gKi9cbiAgcHJpdmF0ZSByZXNvdXJjZUZvcihzZWdtZW50czogc3RyaW5nW10pOiBJUmVzb3VyY2Uge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMuYmFzZVJlc291cmNlO1xuICAgIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2Uoc2VnbWVudCk7XG4gICAgICByZXNvdXJjZSA9IGV4aXN0aW5nID8/IHJlc291cmNlLmFkZFJlc291cmNlKHNlZ21lbnQpO1xuICAgICAgaWYgKCFleGlzdGluZyAmJiBpbmRleCA8IHNlZ21lbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5ncm91cFBhcmVudFJlc291cmNlcy5zZXQocmVzb3VyY2UsIHNlZ21lbnRzLnNsaWNlKDAsIGluZGV4ICsgMSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIExhbWJkYSBQcm94eSBpbnRlZ3JhdGlvbiBmb3IgYWxsIG90aGVyIHJvdXRlc1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEeW5hbWljSW50ZWdyYXRpb24oc2VydmVyRnVuY3Rpb246IElGdW5jdGlvbikge1xuICAgIC8vIEFsbCBvdGhlciByb3V0ZXMgdXNlIHN0cmVhbWluZyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICAgIC8vXG4gICAgLy8gYHNjb3BlUGVybWlzc2lvblRvTWV0aG9kOiBmYWxzZWAgZ3JhbnRzIHRoZSBmdW5jdGlvbiBvbmUgcGVybWlzc2lvbiBmb3JcbiAgICAvLyB0aGlzIEFQSSdzIGV4ZWN1dGUtYXBpIEFSTiAoYDxhcGk+LyovKi8qYCkgaW5zdGVhZCBvZiB0d28gcGVyIG1ldGhvZCAodGhlXG4gICAgLy8gbWV0aG9kIGFuZCBpdHMgY29uc29sZSB0ZXN0LWludm9rZSkuIEV2ZXJ5IGdyb3VwIGFkZHMgcmVzb3VyY2VzIHRoYXQgdGhlXG4gICAgLy8gZGVmYXVsdCBmdW5jdGlvbiBzdGlsbCBhbnN3ZXJzIGZvciBpdHMgcGFyZW50cyBhbmQgZGF0YSByb3V0ZXMsIGFuZCBhdFxuICAgIC8vIH4zNTAgYnl0ZXMgYSBzdGF0ZW1lbnQgdGhlIHBlci1tZXRob2QgcG9saWN5IG91dGdyb3dzIExhbWJkYSdzIDIwIEtCXG4gICAgLy8gcmVzb3VyY2UtcG9saWN5IGNhcCBhZnRlciBhIGZldyBkb3plbiBgQU5ZYCBtZXRob2RzLCBmYWlsaW5nIHRoZSBkZXBsb3kuXG4gICAgY29uc3Qgc3RyZWFtaW5nSW50ZWdyYXRpb24gPSBuZXcgTGFtYmRhSW50ZWdyYXRpb24oc2VydmVyRnVuY3Rpb24sIHtcbiAgICAgIHJlc3BvbnNlVHJhbnNmZXJNb2RlOiBSZXNwb25zZVRyYW5zZmVyTW9kZS5TVFJFQU0sXG4gICAgICBzY29wZVBlcm1pc3Npb25Ub01ldGhvZDogZmFsc2UsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZHluYW1pY0ludGVncmF0aW9uUHJvcHMsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgY2F0Y2gtYWxsIHJvdXRlcyB3aXRoIHN0cmVhbWluZyBpbnRlZ3JhdGlvbiBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgdGhpcy5iYXNlUmVzb3VyY2UuYWRkTWV0aG9kKFwiQU5ZXCIsIHN0cmVhbWluZ0ludGVncmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMuZ3JvdXBQYXJlbnRSZXNvdXJjZXMua2V5cygpKSB7XG4gICAgICByZXNvdXJjZS5hZGRNZXRob2QoXCJBTllcIiwgc3RyZWFtaW5nSW50ZWdyYXRpb24pO1xuICAgIH1cbiAgICBjb25zdCBwcm94eVJlc291cmNlID0gdGhpcy5iYXNlUmVzb3VyY2UuYWRkUmVzb3VyY2UoXCJ7cHJveHkrfVwiKTtcbiAgICBwcm94eVJlc291cmNlLmFkZE1ldGhvZChcIkFOWVwiLCBzdHJlYW1pbmdJbnRlZ3JhdGlvbik7XG4gIH1cbn1cblxuLyoqXG4gKiBgcmVzcG9uc2VzYCB3aXRoIGBwYXJhbWV0ZXJzYCBhZGRlZCB0byB0aGUgMjAwIGFuZCB0aGUgMzA0LCB0aGUgcmVzcG9uc2VzIGFcbiAqIGZpeGVkIGhlYWRlciBnb2VzIG91dCB3aXRoLlxuICovXG5mdW5jdGlvbiB3aXRoRml4ZWRIZWFkZXJzPFxuICBUIGV4dGVuZHMge1xuICAgIHJlYWRvbmx5IHN0YXR1c0NvZGU6IHN0cmluZztcbiAgICByZWFkb25seSByZXNwb25zZVBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IFYgfTtcbiAgfSxcbiAgVixcbj4oXG4gIHJlc3BvbnNlczogVFtdIHwgdW5kZWZpbmVkLFxuICBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IFYgfSxcbik6IFRbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghT2JqZWN0LmtleXMocGFyYW1ldGVycykubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlcztcbiAgfVxuICByZXR1cm4gcmVzcG9uc2VzPy5tYXAoKHJlc3BvbnNlKSA9PlxuICAgIFtcIjIwMFwiLCBcIjMwNFwiXS5pbmNsdWRlcyhyZXNwb25zZS5zdGF0dXNDb2RlKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4ucmVzcG9uc2UsXG4gICAgICAgICAgcmVzcG9uc2VQYXJhbWV0ZXJzOiB7IC4uLnJlc3BvbnNlLnJlc3BvbnNlUGFyYW1ldGVycywgLi4ucGFyYW1ldGVycyB9LFxuICAgICAgICB9XG4gICAgICA6IHJlc3BvbnNlLFxuICApO1xufVxuIl19
|