@liflig/cdk 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,11 @@
1
1
  /**
2
- * This lambda verifies authorization header against static basic auth credentials saved in Secret
2
+ * This lambda verifies authorization header against static basic auth credentials saved in Secrets
3
3
  * Manager.
4
4
  *
5
5
  * Expects the following environment variables:
6
6
  * - CREDENTIALS_SECRET_NAME
7
- * - Secret value should follow this format: `{"username":"<username>","password":"<password>"}`.
8
- * A different format with an array of pre-encoded credentials is also supported - see docs for
9
- * the `BasicAuthAuthorizerProps` on the `ApiGateway` construct.
7
+ * - Name of secret in AWS Secrets Manager that stores basic auth credentials. See
8
+ * `BasicAuthAuthorizerProps` on the `ApiGateway` construct for the supported formats.
10
9
  */
11
10
  import type { APIGatewayRequestAuthorizerEventV2, APIGatewaySimpleAuthorizerResult } from "aws-lambda";
12
11
  import { SecretsManager } from "@aws-sdk/client-secrets-manager";
@@ -1,12 +1,11 @@
1
1
  /**
2
- * This lambda verifies authorization header against static basic auth credentials saved in Secret
2
+ * This lambda verifies authorization header against static basic auth credentials saved in Secrets
3
3
  * Manager.
4
4
  *
5
5
  * Expects the following environment variables:
6
6
  * - CREDENTIALS_SECRET_NAME
7
- * - Secret value should follow this format: `{"username":"<username>","password":"<password>"}`.
8
- * A different format with an array of pre-encoded credentials is also supported - see docs for
9
- * the `BasicAuthAuthorizerProps` on the `ApiGateway` construct.
7
+ * - Name of secret in AWS Secrets Manager that stores basic auth credentials. See
8
+ * `BasicAuthAuthorizerProps` on the `ApiGateway` construct for the supported formats.
10
9
  */
11
10
  import { SecretsManager } from "@aws-sdk/client-secrets-manager";
12
11
  export const handler = async (event) => {
@@ -46,10 +45,8 @@ async function getExpectedBasicAuthCredentials() {
46
45
  }
47
46
  async function getBasicAuthCredentialsSecret(secretName) {
48
47
  const secret = await getSecretValue(secretName);
49
- if (isSingleUsernameAndPassword(secret)) {
50
- const header = "Basic " +
51
- Buffer.from(`${secret.username}:${secret.password}`).toString("base64");
52
- return [{ basicAuthHeader: header, username: secret.username }];
48
+ if (isUsernameAndPasswordObject(secret)) {
49
+ return [encodeBasicAuthCredentials(secret)];
53
50
  }
54
51
  // See `BasicAuthAuthorizerProps` on the `ApiGateway` construct for an explanation of the formats
55
52
  // we parse here
@@ -62,6 +59,9 @@ async function getBasicAuthCredentialsSecret(secretName) {
62
59
  console.error(`Failed to parse credentials array in secret '${secretName}' as JSON`, e);
63
60
  throw new Error();
64
61
  }
62
+ if (isArrayOfUsernameAndPasswordObjects(credentialsArray)) {
63
+ return credentialsArray.map(encodeBasicAuthCredentials);
64
+ }
65
65
  if (isStringArray(credentialsArray)) {
66
66
  return credentialsArray.map(parseEncodedBasicAuthCredentials);
67
67
  }
@@ -88,7 +88,12 @@ async function getSecretValue(secretName) {
88
88
  throw new Error();
89
89
  }
90
90
  }
91
- function isSingleUsernameAndPassword(value) {
91
+ function encodeBasicAuthCredentials(credentials) {
92
+ const basicAuthHeader = "Basic " +
93
+ Buffer.from(`${credentials.username}:${credentials.password}`).toString("base64");
94
+ return { basicAuthHeader, username: credentials.username };
95
+ }
96
+ function isUsernameAndPasswordObject(value) {
92
97
  return (typeof value === "object" &&
93
98
  value !== null &&
94
99
  "username" in value &&
@@ -96,6 +101,17 @@ function isSingleUsernameAndPassword(value) {
96
101
  "password" in value &&
97
102
  typeof value.password === "string");
98
103
  }
104
+ function isArrayOfUsernameAndPasswordObjects(value) {
105
+ if (!Array.isArray(value)) {
106
+ return false;
107
+ }
108
+ for (const element of value) {
109
+ if (!isUsernameAndPasswordObject(element)) {
110
+ return false;
111
+ }
112
+ }
113
+ return true;
114
+ }
99
115
  function hasCredentialsKeyWithStringValue(value) {
100
116
  return (typeof value === "object" &&
101
117
  value !== null &&
@@ -141,4 +157,4 @@ function parseEncodedBasicAuthCredentials(encodedCredentials) {
141
157
  export function clearCache() {
142
158
  cachedBasicAuthCredentials = undefined;
143
159
  }
144
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtYXV0aC1hdXRob3JpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nYXRld2F5L2F1dGhvcml6ZXItbGFtYmRhcy9iYXNpYy1hdXRoLWF1dGhvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBTUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBb0JoRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUMxQixLQUF5QyxFQUNkLEVBQUU7SUFDN0IsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUE7SUFDL0MsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sK0JBQStCLEVBQUUsQ0FBQTtJQUVuRSxLQUFLLE1BQU0sUUFBUSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDM0MsSUFBSSxVQUFVLEtBQUssUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVDLE9BQU87Z0JBQ0wsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLE9BQU8sRUFBRTtvQkFDUCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7aUJBQzVCO2FBQ0YsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQTtBQUNoQyxDQUFDLENBQUE7QUFPRCxxRkFBcUY7QUFDckYsSUFBSSwwQkFBMEIsR0FDNUIsU0FBUyxDQUFBO0FBRVg7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLCtCQUErQjtJQUc1QyxJQUFJLDBCQUEwQixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdDLE1BQU0sVUFB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QixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDNUQsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxDQUFDLEtBQUssQ0FDWCwyRUFBMkUsQ0FDNUUsQ0FBQTtRQUNELE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsT0FBTztRQUNMLGVBQWUsRUFBRSxTQUFTLGtCQUFrQixFQUFFO1FBQzlDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7S0FDakMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVTtJQUN4QiwwQkFBMEIsR0FBRyxTQUFTLENBQUE7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBsYW1iZGEgdmVyaWZpZXMgYXV0aG9yaXphdGlvbiBoZWFkZXIgYWdhaW5zdCBzdGF0aWMgYmFzaWMgYXV0aCBjcmVkZW50aWFscyBzYXZlZCBpbiBTZWNyZXRcbiAqIE1hbmFnZXIuXG4gKlxuICogRXhwZWN0cyB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcbiAqICAgLSBTZWNyZXQgdmFsdWUgc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDogYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWAuXG4gKiAgICAgQSBkaWZmZXJlbnQgZm9ybWF0IHdpdGggYW4gYXJyYXkgb2YgcHJlLWVuY29kZWQgY3JlZGVudGlhbHMgaXMgYWxzbyBzdXBwb3J0ZWQgLSBzZWUgZG9jcyBmb3JcbiAqICAgICB0aGUgYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuICBBUElHYXRld2F5U2ltcGxlQXV0aG9yaXplclJlc3VsdCxcbn0gZnJvbSBcImF3cy1sYW1iZGFcIlxuaW1wb3J0IHsgU2VjcmV0c01hbmFnZXIgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiXG5cbnR5cGUgQXV0aG9yaXplclJlc3VsdCA9IEFQSUdhdGV3YXlTaW1wbGVBdXRob3JpemVyUmVzdWx0ICYge1xuICAvKipcbiAgICogUmV0dXJuaW5nIGEgY29udGV4dCBvYmplY3QgZnJvbSBvdXIgYXV0aG9yaXplciBhbGxvd3Mgb3VyIEFQSSBHYXRld2F5IHRvIGFjY2VzcyB0aGVzZSB2YXJpYWJsZXNcbiAgICogdmlhIGAke2NvbnRleHQuYXV0aG9yaXplci48cHJvcGVydHk+fWAuXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sXG4gICAqL1xuICBjb250ZXh0Pzoge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSByZXF1ZXN0J3MgY3JlZGVudGlhbHMgYXJlIHZlcmlmaWVkLCB3ZSByZXR1cm4gdGhlIHVzZXJuYW1lIHRoYXQgd2FzIHVzZWQgaW4gdGhpc1xuICAgICAqIGNvbnRleHQgdmFyaWFibGUgKG5hbWVkIGBhdXRob3JpemVyLnVzZXJuYW1lYCkuIFdlIHVzZSB0aGlzIHRvIGluY2x1ZGUgdGhlIHJlcXVlc3RpbmcgdXNlciBpblxuICAgICAqIHRoZSBBUEkgR2F0ZXdheSBhY2Nlc3MgbG9ncyAoc2VlIGBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0YCBpbiBvdXIgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCkuIFlvdVxuICAgICAqIGNhbiBhbHNvIHVzZSB0aGlzIHdoZW4gbWFwcGluZyBwYXJhbWV0ZXJzIHRvIHRoZSBiYWNrZW5kIGludGVncmF0aW9uIChzZWVcbiAgICAgKiBgQWxiSW50ZWdyYXRpb25Qcm9wcy5tYXBQYXJhbWV0ZXJzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCkuXG4gICAgICovXG4gICAgdXNlcm5hbWU6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgKFxuICBldmVudDogQVBJR2F0ZXdheVJlcXVlc3RBdXRob3JpemVyRXZlbnRWMixcbik6IFByb21pc2U8QXV0aG9yaXplclJlc3VsdD4gPT4ge1xuICBjb25zdCBhdXRoSGVhZGVyID0gZXZlbnQuaGVhZGVycz8uYXV0aG9yaXphdGlvblxuICBpZiAoIWF1dGhIZWFkZXIgfHwgIWF1dGhIZWFkZXIuc3RhcnRzV2l0aChcIkJhc2ljIFwiKSkge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG5cbiAgY29uc3QgZXhwZWN0ZWRDcmVkZW50aWFscyA9IGF3YWl0IGdldEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoKVxuXG4gIGZvciAoY29uc3QgZXhwZWN0ZWQgb2YgZXhwZWN0ZWRDcmVkZW50aWFscykge1xuICAgIGlmIChhdXRoSGVhZGVyID09PSBleHBlY3RlZC5iYXNpY0F1dGhIZWFkZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzQXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIHVzZXJuYW1lOiBleHBlY3RlZC51c2VybmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBpc0F1dGhvcml6ZWQ6IGZhbHNlIH1cbn1cblxudHlwZSBFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzID0ge1xuICBiYXNpY0F1dGhIZWFkZXI6IHN0cmluZ1xuICB1c2VybmFtZTogc3RyaW5nXG59XG5cbi8qKiBDYWNoZSB0aGlzIHZhbHVlLCBzbyB0aGF0IHN1YnNlcXVlbnQgbGFtYmRhIGludm9jYXRpb25zIGRvbid0IGhhdmUgdG8gcmVmZXRjaC4gKi9cbmxldCBjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFsczogRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFsc1tdIHwgdW5kZWZpbmVkID1cbiAgdW5kZWZpbmVkXG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSwgdG8gc3VwcG9ydCBjcmVkZW50aWFsIHNlY3JldHMgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgKHNlZVxuICogYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QgZm9yIG1vcmUgb24gdGhpcykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoKTogUHJvbWlzZTxcbiAgRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFsc1tdXG4+IHtcbiAgaWYgKGNhY2hlZEJhc2ljQXV0aENyZWRlbnRpYWxzID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzZWNyZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgcHJvY2Vzcy5lbnZbXCJDUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXVxuICAgIGlmICghc2VjcmV0TmFtZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkNSRURFTlRJQUxTX1NFQ1JFVF9OQU1FIGVudiB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZFwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICB9XG5cbiAgICBjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9IGF3YWl0IGdldEJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0KHNlY3JldE5hbWUpXG4gIH1cblxuICByZXR1cm4gY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXQoXG4gIHNlY3JldE5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8RXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFsc1tdPiB7XG4gIGNvbnN0IHNlY3JldCA9IGF3YWl0IGdldFNlY3JldFZhbHVlKHNlY3JldE5hbWUpXG5cbiAgaWYgKGlzU2luZ2xlVXNlcm5hbWVBbmRQYXNzd29yZChzZWNyZXQpKSB7XG4gICAgY29uc3QgaGVhZGVyID1cbiAgICAgIFwiQmFzaWMgXCIgK1xuICAgICAgQnVmZmVyLmZyb20oYCR7c2VjcmV0LnVzZXJuYW1lfToke3NlY3JldC5wYXNzd29yZH1gKS50b1N0cmluZyhcImJhc2U2NFwiKVxuICAgIHJldHVybiBbeyBiYXNpY0F1dGhIZWFkZXI6IGhlYWRlciwgdXNlcm5hbWU6IHNlY3JldC51c2VybmFtZSB9XVxuICB9XG5cbiAgLy8gU2VlIGBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0IGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgZm9ybWF0c1xuICAvLyB3ZSBwYXJzZSBoZXJlXG4gIGlmIChoYXNDcmVkZW50aWFsc0tleVdpdGhTdHJpbmdWYWx1ZShzZWNyZXQpKSB7XG4gICAgbGV0IGNyZWRlbnRpYWxzQXJyYXk6IHVua25vd25cbiAgICB0cnkge1xuICAgICAgY3JlZGVudGlhbHNBcnJheSA9IEpTT04ucGFyc2Uoc2VjcmV0LmNyZWRlbnRpYWxzKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgY3JlZGVudGlhbHMgYXJyYXkgaW4gc2VjcmV0ICcke3NlY3JldE5hbWV9JyBhcyBKU09OYCxcbiAgICAgICAgZSxcbiAgICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgfVxuXG4gICAgaWYgKGlzU3RyaW5nQXJyYXkoY3JlZGVudGlhbHNBcnJheSkpIHtcbiAgICAgIHJldHVybiBjcmVkZW50aWFsc0FycmF5Lm1hcChwYXJzZUVuY29kZWRCYXNpY0F1dGhDcmVkZW50aWFscylcbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmVycm9yKFxuICAgIGBCYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBkaWQgbm90IGZvbGxvdyBhbnkgZXhwZWN0ZWQgZm9ybWF0IChzZWNyZXQgbmFtZTogJyR7c2VjcmV0TmFtZX0nKWAsXG4gIClcbiAgdGhyb3cgbmV3IEVycm9yKClcbn1cblxuLyoqIEZvciBvdmVycmlkaW5nIGRlcGVuZGVuY3kgY3JlYXRpb24gaW4gdGVzdHMuICovXG5leHBvcnQgY29uc3QgZGVwZW5kZW5jaWVzID0ge1xuICBjcmVhdGVTZWNyZXRzTWFuYWdlcjogKCkgPT4gbmV3IFNlY3JldHNNYW5hZ2VyKCksXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldFZhbHVlKHNlY3JldE5hbWU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjbGllbnQgPSBkZXBlbmRlbmNpZXMuY3JlYXRlU2VjcmV0c01hbmFnZXIoKVxuICBjb25zdCBzZWNyZXQgPSBhd2FpdCBjbGllbnQuZ2V0U2VjcmV0VmFsdWUoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KVxuXG4gIGlmICghc2VjcmV0LlNlY3JldFN0cmluZykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFNlY3JldCB2YWx1ZSBub3QgZm91bmQgZm9yICcke3NlY3JldE5hbWV9J2ApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc2VjcmV0LlNlY3JldFN0cmluZylcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBzZWNyZXQgJyR7c2VjcmV0TmFtZX0nIGFzIEpTT046YCwgZSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzU2luZ2xlVXNlcm5hbWVBbmRQYXNzd29yZChcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyB7IHVzZXJuYW1lOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcInVzZXJuYW1lXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUudXNlcm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICBcInBhc3N3b3JkXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUucGFzc3dvcmQgPT09IFwic3RyaW5nXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBoYXNDcmVkZW50aWFsc0tleVdpdGhTdHJpbmdWYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyB7IGNyZWRlbnRpYWxzOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcImNyZWRlbnRpYWxzXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuY3JlZGVudGlhbHMgPT09IFwic3RyaW5nXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBpc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogV2Ugd2FudCB0byByZXR1cm4gdGhlIHJlcXVlc3RpbmcgdXNlcm5hbWUgYXMgYSBjb250ZXh0IHZhcmlhYmxlIGluXG4gKiB7QGxpbmsgQXV0aG9yaXplclJlc3VsdC5jb250ZXh0fSwgZm9yIEFQSSBHYXRld2F5IGFjY2VzcyBsb2dzIGFuZCBwYXJhbWV0ZXIgbWFwcGluZy4gU28gaWYgdGhlXG4gKiBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBpcyBzdG9yZWQgYXMgcHJlLWVuY29kZWQgYmFzZTY0IHN0cmluZ3MsIHdlIG5lZWQgdG8gcGFyc2UgdGhlbSB0b1xuICogZ2V0IHRoZSB1c2VybmFtZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VFbmNvZGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoXG4gIGVuY29kZWRDcmVkZW50aWFsczogc3RyaW5nLFxuKTogRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyB7XG4gIGxldCBkZWNvZGVkQ3JlZGVudGlhbHM6IHN0cmluZ1xuICB0cnkge1xuICAgIGRlY29kZWRDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGVuY29kZWRDcmVkZW50aWFscywgXCJiYXNlNjRcIikudG9TdHJpbmcoKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiQmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgY291bGQgbm90IGJlIGRlY29kZWQgYXMgYmFzZTY0OlwiLFxuICAgICAgZSxcbiAgICApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIGNvbnN0IHVzZXJuYW1lQW5kUGFzc3dvcmQgPSBkZWNvZGVkQ3JlZGVudGlhbHMuc3BsaXQoXCI6XCIsIDIpXG4gIGlmICh1c2VybmFtZUFuZFBhc3N3b3JkLmxlbmd0aCAhPT0gMikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGNvdWxkIG5vdCBiZSBkZWNvZGVkIGFzICd1c2VybmFtZTpwYXNzd29yZCdcIixcbiAgICApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmFzaWNBdXRoSGVhZGVyOiBgQmFzaWMgJHtlbmNvZGVkQ3JlZGVudGlhbHN9YCxcbiAgICB1c2VybmFtZTogdXNlcm5hbWVBbmRQYXNzd29yZFswXSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDYWNoZSgpIHtcbiAgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMgPSB1bmRlZmluZWRcbn1cbiJdfQ==
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWMtYXV0aC1hdXRob3JpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nYXRld2F5L2F1dGhvcml6ZXItbGFtYmRhcy9iYXNpYy1hdXRoLWF1dGhvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFNSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFvQmhFLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQzFCLEtBQXlDLEVBQ2QsRUFBRTtJQUM3QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQTtJQUMvQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSwrQkFBK0IsRUFBRSxDQUFBO0lBRW5FLEtBQUssTUFBTSxRQUFRLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFVBQVUsS0FBSyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDNUMsT0FBTztnQkFDTCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsT0FBTyxFQUFFO29CQUNQLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtpQkFDNUI7YUFDRixDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFBO0FBQ2hDLENBQUMsQ0FBQTtBQU9ELHFGQUFxRjtBQUNyRixJQUFJLDBCQUEwQixHQUM1QixTQUFTLENBQUE7QUFFWDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsK0JBQStCO0lBRzVDLElBQUksMEJBQTBCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0MsTUFBTSxVQUFV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QUssRUFBRSxDQUFDO1FBQzVCLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxnQ0FBZ0MsQ0FDdkMsa0JBQTBCO0lBRTFCLElBQUksa0JBQTBCLENBQUE7SUFDOUIsSUFBSSxDQUFDO1FBQ0gsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUMzRSxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FBQyxLQUFLLENBQ1gsK0RBQStELEVBQy9ELENBQUMsQ0FDRixDQUFBO1FBQ0QsTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFBO0lBQ25CLENBQUM7SUFFRCxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDNUQsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxDQUFDLEtBQUssQ0FDWCwyRUFBMkUsQ0FDNUUsQ0FBQTtRQUNELE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsT0FBTztRQUNMLGVBQWUsRUFBRSxTQUFTLGtCQUFrQixFQUFFO1FBQzlDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7S0FDakMsQ0FBQTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVTtJQUN4QiwwQkFBMEIsR0FBRyxTQUFTLENBQUE7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBsYW1iZGEgdmVyaWZpZXMgYXV0aG9yaXphdGlvbiBoZWFkZXIgYWdhaW5zdCBzdGF0aWMgYmFzaWMgYXV0aCBjcmVkZW50aWFscyBzYXZlZCBpbiBTZWNyZXRzXG4gKiBNYW5hZ2VyLlxuICpcbiAqIEV4cGVjdHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIENSRURFTlRJQUxTX1NFQ1JFVF9OQU1FXG4gKiAgIC0gTmFtZSBvZiBzZWNyZXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciB0aGF0IHN0b3JlcyBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzLiBTZWVcbiAqICAgICBgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCBmb3IgdGhlIHN1cHBvcnRlZCBmb3JtYXRzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQVBJR2F0ZXdheVJlcXVlc3RBdXRob3JpemVyRXZlbnRWMixcbiAgQVBJR2F0ZXdheVNpbXBsZUF1dGhvcml6ZXJSZXN1bHQsXG59IGZyb20gXCJhd3MtbGFtYmRhXCJcbmltcG9ydCB7IFNlY3JldHNNYW5hZ2VyIH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zZWNyZXRzLW1hbmFnZXJcIlxuXG50eXBlIEF1dGhvcml6ZXJSZXN1bHQgPSBBUElHYXRld2F5U2ltcGxlQXV0aG9yaXplclJlc3VsdCAmIHtcbiAgLyoqXG4gICAqIFJldHVybmluZyBhIGNvbnRleHQgb2JqZWN0IGZyb20gb3VyIGF1dGhvcml6ZXIgYWxsb3dzIG91ciBBUEkgR2F0ZXdheSB0byBhY2Nlc3MgdGhlc2UgdmFyaWFibGVzXG4gICAqIHZpYSBgJHtjb250ZXh0LmF1dGhvcml6ZXIuPHByb3BlcnR5Pn1gLlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktcGFyYW1ldGVyLW1hcHBpbmcuaHRtbFxuICAgKi9cbiAgY29udGV4dD86IHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcmVxdWVzdCdzIGNyZWRlbnRpYWxzIGFyZSB2ZXJpZmllZCwgd2UgcmV0dXJuIHRoZSB1c2VybmFtZSB0aGF0IHdhcyB1c2VkIGluIHRoaXNcbiAgICAgKiBjb250ZXh0IHZhcmlhYmxlIChuYW1lZCBgYXV0aG9yaXplci51c2VybmFtZWApLiBXZSB1c2UgdGhpcyB0byBpbmNsdWRlIHRoZSByZXF1ZXN0aW5nIHVzZXIgaW5cbiAgICAgKiB0aGUgQVBJIEdhdGV3YXkgYWNjZXNzIGxvZ3MgKHNlZSBgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdGAgaW4gb3VyIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLiBZb3VcbiAgICAgKiBjYW4gYWxzbyB1c2UgdGhpcyB3aGVuIG1hcHBpbmcgcGFyYW1ldGVycyB0byB0aGUgYmFja2VuZCBpbnRlZ3JhdGlvbiAoc2VlXG4gICAgICogYEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLlxuICAgICAqL1xuICAgIHVzZXJuYW1lOiBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQ6IEFQSUdhdGV3YXlSZXF1ZXN0QXV0aG9yaXplckV2ZW50VjIsXG4pOiBQcm9taXNlPEF1dGhvcml6ZXJSZXN1bHQ+ID0+IHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IGV2ZW50LmhlYWRlcnM/LmF1dGhvcml6YXRpb25cbiAgaWYgKCFhdXRoSGVhZGVyIHx8ICFhdXRoSGVhZGVyLnN0YXJ0c1dpdGgoXCJCYXNpYyBcIikpIHtcbiAgICByZXR1cm4geyBpc0F1dGhvcml6ZWQ6IGZhbHNlIH1cbiAgfVxuXG4gIGNvbnN0IGV4cGVjdGVkQ3JlZGVudGlhbHMgPSBhd2FpdCBnZXRFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKClcblxuICBmb3IgKGNvbnN0IGV4cGVjdGVkIG9mIGV4cGVjdGVkQ3JlZGVudGlhbHMpIHtcbiAgICBpZiAoYXV0aEhlYWRlciA9PT0gZXhwZWN0ZWQuYmFzaWNBdXRoSGVhZGVyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0F1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICB1c2VybmFtZTogZXhwZWN0ZWQudXNlcm5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgaXNBdXRob3JpemVkOiBmYWxzZSB9XG59XG5cbnR5cGUgRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9IHtcbiAgYmFzaWNBdXRoSGVhZGVyOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xufVxuXG4vKiogQ2FjaGUgdGhpcyB2YWx1ZSwgc28gdGhhdCBzdWJzZXF1ZW50IGxhbWJkYSBpbnZvY2F0aW9ucyBkb24ndCBoYXZlIHRvIHJlZmV0Y2guICovXG5sZXQgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHM6IEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNbXSB8IHVuZGVmaW5lZCA9XG4gIHVuZGVmaW5lZFxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXksIHRvIHN1cHBvcnQgY3JlZGVudGlhbCBzZWNyZXRzIHdpdGggbXVsdGlwbGUgdmFsdWVzIChzZWVcbiAqIGBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0IGZvciBtb3JlIG9uIHRoaXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKCk6IFByb21pc2U8XG4gIEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNbXVxuPiB7XG4gIGlmIChjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc2VjcmV0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIHByb2Nlc3MuZW52W1wiQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl1cbiAgICBpZiAoIXNlY3JldE5hbWUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDUkVERU5USUFMU19TRUNSRVRfTkFNRSBlbnYgdmFyaWFibGUgaXMgbm90IGRlZmluZWRcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgfVxuXG4gICAgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMgPSBhd2FpdCBnZXRCYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldChzZWNyZXROYW1lKVxuICB9XG5cbiAgcmV0dXJuIGNhY2hlZEJhc2ljQXV0aENyZWRlbnRpYWxzXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0KFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNbXT4ge1xuICBjb25zdCBzZWNyZXQgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lKVxuXG4gIGlmIChpc1VzZXJuYW1lQW5kUGFzc3dvcmRPYmplY3Qoc2VjcmV0KSkge1xuICAgIHJldHVybiBbZW5jb2RlQmFzaWNBdXRoQ3JlZGVudGlhbHMoc2VjcmV0KV1cbiAgfVxuXG4gIC8vIFNlZSBgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGZvcm1hdHNcbiAgLy8gd2UgcGFyc2UgaGVyZVxuICBpZiAoaGFzQ3JlZGVudGlhbHNLZXlXaXRoU3RyaW5nVmFsdWUoc2VjcmV0KSkge1xuICAgIGxldCBjcmVkZW50aWFsc0FycmF5OiB1bmtub3duXG4gICAgdHJ5IHtcbiAgICAgIGNyZWRlbnRpYWxzQXJyYXkgPSBKU09OLnBhcnNlKHNlY3JldC5jcmVkZW50aWFscylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIGNyZWRlbnRpYWxzIGFycmF5IGluIHNlY3JldCAnJHtzZWNyZXROYW1lfScgYXMgSlNPTmAsXG4gICAgICAgIGUsXG4gICAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIH1cblxuICAgIGlmIChpc0FycmF5T2ZVc2VybmFtZUFuZFBhc3N3b3JkT2JqZWN0cyhjcmVkZW50aWFsc0FycmF5KSkge1xuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzQXJyYXkubWFwKGVuY29kZUJhc2ljQXV0aENyZWRlbnRpYWxzKVxuICAgIH1cblxuICAgIGlmIChpc1N0cmluZ0FycmF5KGNyZWRlbnRpYWxzQXJyYXkpKSB7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHNBcnJheS5tYXAocGFyc2VFbmNvZGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMpXG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5lcnJvcihcbiAgICBgQmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgZGlkIG5vdCBmb2xsb3cgYW55IGV4cGVjdGVkIGZvcm1hdCAoc2VjcmV0IG5hbWU6ICcke3NlY3JldE5hbWV9JylgLFxuICApXG4gIHRocm93IG5ldyBFcnJvcigpXG59XG5cbi8qKiBGb3Igb3ZlcnJpZGluZyBkZXBlbmRlbmN5IGNyZWF0aW9uIGluIHRlc3RzLiAqL1xuZXhwb3J0IGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlU2VjcmV0c01hbmFnZXI6ICgpID0+IG5ldyBTZWNyZXRzTWFuYWdlcigpLFxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY2xpZW50ID0gZGVwZW5kZW5jaWVzLmNyZWF0ZVNlY3JldHNNYW5hZ2VyKClcbiAgY29uc3Qgc2VjcmV0ID0gYXdhaXQgY2xpZW50LmdldFNlY3JldFZhbHVlKHsgU2VjcmV0SWQ6IHNlY3JldE5hbWUgfSlcblxuICBpZiAoIXNlY3JldC5TZWNyZXRTdHJpbmcpIHtcbiAgICBjb25zb2xlLmVycm9yKGBTZWNyZXQgdmFsdWUgbm90IGZvdW5kIGZvciAnJHtzZWNyZXROYW1lfSdgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHNlY3JldC5TZWNyZXRTdHJpbmcpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2Ugc2VjcmV0ICcke3NlY3JldE5hbWV9JyBhcyBKU09OOmAsIGUpXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmNvZGVCYXNpY0F1dGhDcmVkZW50aWFscyhjcmVkZW50aWFsczoge1xuICB1c2VybmFtZTogc3RyaW5nXG4gIHBhc3N3b3JkOiBzdHJpbmdcbn0pOiBFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzIHtcbiAgY29uc3QgYmFzaWNBdXRoSGVhZGVyID1cbiAgICBcIkJhc2ljIFwiICtcbiAgICBCdWZmZXIuZnJvbShgJHtjcmVkZW50aWFscy51c2VybmFtZX06JHtjcmVkZW50aWFscy5wYXNzd29yZH1gKS50b1N0cmluZyhcbiAgICAgIFwiYmFzZTY0XCIsXG4gICAgKVxuXG4gIHJldHVybiB7IGJhc2ljQXV0aEhlYWRlciwgdXNlcm5hbWU6IGNyZWRlbnRpYWxzLnVzZXJuYW1lIH1cbn1cblxuZnVuY3Rpb24gaXNVc2VybmFtZUFuZFBhc3N3b3JkT2JqZWN0KFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZhbHVlIGlzIHsgdXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIFwidXNlcm5hbWVcIiBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS51c2VybmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgIFwicGFzc3dvcmRcIiBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS5wYXNzd29yZCA9PT0gXCJzdHJpbmdcIlxuICApXG59XG5cbmZ1bmN0aW9uIGlzQXJyYXlPZlVzZXJuYW1lQW5kUGFzc3dvcmRPYmplY3RzKFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZhbHVlIGlzIHsgdXNlcm5hbWU6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9W10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWUpIHtcbiAgICBpZiAoIWlzVXNlcm5hbWVBbmRQYXNzd29yZE9iamVjdChlbGVtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZnVuY3Rpb24gaGFzQ3JlZGVudGlhbHNLZXlXaXRoU3RyaW5nVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyBjcmVkZW50aWFsczogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJjcmVkZW50aWFsc1wiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLmNyZWRlbnRpYWxzID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZ1tdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFdlIHdhbnQgdG8gcmV0dXJuIHRoZSByZXF1ZXN0aW5nIHVzZXJuYW1lIGFzIGEgY29udGV4dCB2YXJpYWJsZSBpblxuICoge0BsaW5rIEF1dGhvcml6ZXJSZXN1bHQuY29udGV4dH0sIGZvciBBUEkgR2F0ZXdheSBhY2Nlc3MgbG9ncyBhbmQgcGFyYW1ldGVyIG1hcHBpbmcuIFNvIGlmIHRoZVxuICogYmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgaXMgc3RvcmVkIGFzIHByZS1lbmNvZGVkIGJhc2U2NCBzdHJpbmdzLCB3ZSBuZWVkIHRvIHBhcnNlIHRoZW0gdG9cbiAqIGdldCB0aGUgdXNlcm5hbWUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRW5jb2RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKFxuICBlbmNvZGVkQ3JlZGVudGlhbHM6IHN0cmluZyxcbik6IEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMge1xuICBsZXQgZGVjb2RlZENyZWRlbnRpYWxzOiBzdHJpbmdcbiAgdHJ5IHtcbiAgICBkZWNvZGVkQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShlbmNvZGVkQ3JlZGVudGlhbHMsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGNvdWxkIG5vdCBiZSBkZWNvZGVkIGFzIGJhc2U2NDpcIixcbiAgICAgIGUsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICBjb25zdCB1c2VybmFtZUFuZFBhc3N3b3JkID0gZGVjb2RlZENyZWRlbnRpYWxzLnNwbGl0KFwiOlwiLCAyKVxuICBpZiAodXNlcm5hbWVBbmRQYXNzd29yZC5sZW5ndGggIT09IDIpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJCYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBjb3VsZCBub3QgYmUgZGVjb2RlZCBhcyAndXNlcm5hbWU6cGFzc3dvcmQnXCIsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhc2ljQXV0aEhlYWRlcjogYEJhc2ljICR7ZW5jb2RlZENyZWRlbnRpYWxzfWAsXG4gICAgdXNlcm5hbWU6IHVzZXJuYW1lQW5kUGFzc3dvcmRbMF0sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKSB7XG4gIGNhY2hlZEJhc2ljQXV0aENyZWRlbnRpYWxzID0gdW5kZWZpbmVkXG59XG4iXX0=
@@ -3,12 +3,11 @@
3
3
  * - Against Cognito user pool if request uses access token in Bearer authorization header
4
4
  * - Against credentials saved in Secret Manager if request uses basic auth (and if secret exists)
5
5
  *
6
- * Expects the following environment variables
6
+ * Expects the following environment variables:
7
7
  * - USER_POOL_ID
8
8
  * - BASIC_AUTH_CREDENTIALS_SECRET_NAME (optional)
9
- * - Secret value should follow this format: `{"username":"<username>","password":"<password>"}`.
10
- * A different format with an array of pre-encoded credentials is also supported - see docs for
11
- * the `CognitoUserPoolOrBasicAuthAuthorizerProps` on the `ApiGateway` construct.
9
+ * - Name of secret in AWS Secrets Manager that stores basic auth credentials. See
10
+ * `BasicAuthAuthorizerProps` on the `ApiGateway` construct for the supported formats.
12
11
  * - REQUIRED_SCOPE (optional)
13
12
  * - Set this to require that the access token payload contains the given scope
14
13
  */
@@ -3,12 +3,11 @@
3
3
  * - Against Cognito user pool if request uses access token in Bearer authorization header
4
4
  * - Against credentials saved in Secret Manager if request uses basic auth (and if secret exists)
5
5
  *
6
- * Expects the following environment variables
6
+ * Expects the following environment variables:
7
7
  * - USER_POOL_ID
8
8
  * - BASIC_AUTH_CREDENTIALS_SECRET_NAME (optional)
9
- * - Secret value should follow this format: `{"username":"<username>","password":"<password>"}`.
10
- * A different format with an array of pre-encoded credentials is also supported - see docs for
11
- * the `CognitoUserPoolOrBasicAuthAuthorizerProps` on the `ApiGateway` construct.
9
+ * - Name of secret in AWS Secrets Manager that stores basic auth credentials. See
10
+ * `BasicAuthAuthorizerProps` on the `ApiGateway` construct for the supported formats.
12
11
  * - REQUIRED_SCOPE (optional)
13
12
  * - Set this to require that the access token payload contains the given scope
14
13
  */
@@ -127,10 +126,8 @@ async function getExpectedBasicAuthCredentials() {
127
126
  }
128
127
  async function getBasicAuthCredentialsSecret(secretName) {
129
128
  const secret = await getSecretValue(secretName);
130
- if (isSingleUsernameAndPassword(secret)) {
131
- const header = "Basic " +
132
- Buffer.from(`${secret.username}:${secret.password}`).toString("base64");
133
- return [{ basicAuthHeader: header, username: secret.username }];
129
+ if (isUsernameAndPasswordObject(secret)) {
130
+ return [encodeBasicAuthCredentials(secret)];
134
131
  }
135
132
  // See `BasicAuthAuthorizerProps` on the `ApiGateway` construct for an explanation of the formats
136
133
  // we parse here
@@ -143,6 +140,9 @@ async function getBasicAuthCredentialsSecret(secretName) {
143
140
  console.error(`Failed to parse credentials array in secret '${secretName}' as JSON`, e);
144
141
  throw new Error();
145
142
  }
143
+ if (isArrayOfUsernameAndPasswordObjects(credentialsArray)) {
144
+ return credentialsArray.map(encodeBasicAuthCredentials);
145
+ }
146
146
  if (isStringArray(credentialsArray)) {
147
147
  return credentialsArray.map(parseEncodedBasicAuthCredentials);
148
148
  }
@@ -165,7 +165,12 @@ async function getSecretValue(secretName) {
165
165
  throw new Error();
166
166
  }
167
167
  }
168
- function isSingleUsernameAndPassword(value) {
168
+ function encodeBasicAuthCredentials(credentials) {
169
+ const basicAuthHeader = "Basic " +
170
+ Buffer.from(`${credentials.username}:${credentials.password}`).toString("base64");
171
+ return { basicAuthHeader, username: credentials.username };
172
+ }
173
+ function isUsernameAndPasswordObject(value) {
169
174
  return (typeof value === "object" &&
170
175
  value !== null &&
171
176
  "username" in value &&
@@ -173,6 +178,17 @@ function isSingleUsernameAndPassword(value) {
173
178
  "password" in value &&
174
179
  typeof value.password === "string");
175
180
  }
181
+ function isArrayOfUsernameAndPasswordObjects(value) {
182
+ if (!Array.isArray(value)) {
183
+ return false;
184
+ }
185
+ for (const element of value) {
186
+ if (!isUsernameAndPasswordObject(element)) {
187
+ return false;
188
+ }
189
+ }
190
+ return true;
191
+ }
176
192
  function hasCredentialsKeyWithStringValue(value) {
177
193
  return (typeof value === "object" &&
178
194
  value !== null &&
@@ -219,4 +235,4 @@ export function clearCache() {
219
235
  cachedTokenVerifier = undefined;
220
236
  cachedBasicAuthCredentials = undefined;
221
237
  }
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by11c2VyLXBvb2wtb3ItYmFzaWMtYXV0aC1hdXRob3JpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nYXRld2F5L2F1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1vci1iYXNpYy1hdXRoLWF1dGhvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU1ILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQW1DbkQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFDMUIsS0FBeUMsRUFDZCxFQUFFO0lBQzdCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFBO0lBQy9DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFBO0lBQ2hDLENBQUM7SUFFRCxNQUFNLDRCQUE0QixHQUFHLE1BQU0sK0JBQStCLEVBQUUsQ0FBQTtJQUU1RSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLGtDQUFrQztRQUNsRyxRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxTQUFTO2dCQUNaLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUE7WUFDaEMsS0FBSyxTQUFTO2dCQUNaLHdGQUF3RjtnQkFDeEYscUZBQXFGO2dCQUNyRix5RkFBeUY7Z0JBQ3pGLHFFQUFxRTtnQkFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUNqQztn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LENBQ1gsMkVBQTJFLENBQzVFLENBQUE7UUFDRCxNQUFNLElBQUksS0FBSyxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVELE9BQU87UUFDTCxlQUFlLEVBQUUsU0FBUyxrQkFBa0IsRUFBRTtRQUM5QyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0tBQ2pDLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVU7SUFDeEIsbUJBQW1CLEdBQUcsU0FBUyxDQUFBO0lBQy9CLDBCQUEwQixHQUFHLFNBQVMsQ0FBQTtBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGxhbWJkYSB2ZXJpZmllcyBjcmVkZW50aWFsczpcbiAqIC0gQWdhaW5zdCBDb2duaXRvIHVzZXIgcG9vbCBpZiByZXF1ZXN0IHVzZXMgYWNjZXNzIHRva2VuIGluIEJlYXJlciBhdXRob3JpemF0aW9uIGhlYWRlclxuICogLSBBZ2FpbnN0IGNyZWRlbnRpYWxzIHNhdmVkIGluIFNlY3JldCBNYW5hZ2VyIGlmIHJlcXVlc3QgdXNlcyBiYXNpYyBhdXRoIChhbmQgaWYgc2VjcmV0IGV4aXN0cylcbiAqXG4gKiBFeHBlY3RzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKiAtIFVTRVJfUE9PTF9JRFxuICogLSBCQVNJQ19BVVRIX0NSRURFTlRJQUxTX1NFQ1JFVF9OQU1FIChvcHRpb25hbClcbiAqICAgLSBTZWNyZXQgdmFsdWUgc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDogYHtcInVzZXJuYW1lXCI6XCI8dXNlcm5hbWU+XCIsXCJwYXNzd29yZFwiOlwiPHBhc3N3b3JkPlwifWAuXG4gKiAgICAgQSBkaWZmZXJlbnQgZm9ybWF0IHdpdGggYW4gYXJyYXkgb2YgcHJlLWVuY29kZWQgY3JlZGVudGlhbHMgaXMgYWxzbyBzdXBwb3J0ZWQgLSBzZWUgZG9jcyBmb3JcbiAqICAgICB0aGUgYENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdC5cbiAqIC0gUkVRVUlSRURfU0NPUEUgKG9wdGlvbmFsKVxuICogICAtIFNldCB0aGlzIHRvIHJlcXVpcmUgdGhhdCB0aGUgYWNjZXNzIHRva2VuIHBheWxvYWQgY29udGFpbnMgdGhlIGdpdmVuIHNjb3BlXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuICBBUElHYXRld2F5U2ltcGxlQXV0aG9yaXplclJlc3VsdCxcbn0gZnJvbSBcImF3cy1sYW1iZGFcIlxuaW1wb3J0IHsgU2VjcmV0c01hbmFnZXIgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiXG5pbXBvcnQgeyBDb2duaXRvSnd0VmVyaWZpZXIgfSBmcm9tIFwiYXdzLWp3dC12ZXJpZnlcIlxuaW1wb3J0IHR5cGUgeyBDb2duaXRvQWNjZXNzVG9rZW5QYXlsb2FkIH0gZnJvbSBcImF3cy1qd3QtdmVyaWZ5L2p3dC1tb2RlbFwiXG5cbnR5cGUgQXV0aG9yaXplclJlc3VsdCA9IEFQSUdhdGV3YXlTaW1wbGVBdXRob3JpemVyUmVzdWx0ICYge1xuICAvKipcbiAgICogUmV0dXJuaW5nIGEgY29udGV4dCBvYmplY3QgZnJvbSBvdXIgYXV0aG9yaXplciBhbGxvd3Mgb3VyIEFQSSBHYXRld2F5IHRvIGFjY2VzcyB0aGVzZSB2YXJpYWJsZXNcbiAgICogdmlhIGAke2NvbnRleHQuYXV0aG9yaXplci48cHJvcGVydHk+fWAuXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sXG4gICAqL1xuICBjb250ZXh0Pzoge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSByZXF1ZXN0IHVzZWQgYW4gYWNjZXNzIHRva2VuLCBhbmQgdGhlIHRva2VuIHdhcyB2ZXJpZmllZCwgd2UgcmV0dXJuIHRoZSBhdXRoIGNsaWVudCBJRFxuICAgICAqIGZyb20gdGhlIHRva2VuJ3MgY2xhaW1zIGluIHRoaXMgY29udGV4dCB2YXJpYWJsZSAobmFtZWQgYGF1dGhvcml6ZXIuY2xpZW50SWRgKS4gV2UgdXNlIHRoaXNcbiAgICAgKiB0byBpbmNsdWRlIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBpbiB0aGUgQVBJIEdhdGV3YXkgYWNjZXNzIGxvZ3MgKHNlZSBgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdGBcbiAgICAgKiBpbiBvdXIgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCkuIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB3aGVuIG1hcHBpbmcgcGFyYW1ldGVycyB0byB0aGUgYmFja2VuZFxuICAgICAqIGludGVncmF0aW9uIChzZWUgYEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLlxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlcXVlc3QgdXNlZCBCYXNpYyBBdXRoLCBhbmQgdGhlIGNyZWRlbnRpYWxzIHdlcmUgdmVyaWZpZWQsIHdlIHJldHVybiB0aGUgdXNlcm5hbWVcbiAgICAgKiB0aGF0IHdhcyB1c2VkIGluIHRoaXMgY29udGV4dCB2YXJpYWJsZSAobmFtZWQgYGF1dGhvcml6ZXIudXNlcm5hbWVgKS4gV2UgdXNlIHRoaXMgdG8gaW5jbHVkZVxuICAgICAqIHRoZSByZXF1ZXN0aW5nIHVzZXIgaW4gdGhlIEFQSSBHYXRld2F5IGFjY2VzcyBsb2dzIChzZWUgYGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXRgIGluIG91clxuICAgICAqIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLiBZb3UgY2FuIGFsc28gdXNlIHRoaXMgd2hlbiBtYXBwaW5nIHBhcmFtZXRlcnMgdG8gdGhlIGJhY2tlbmRcbiAgICAgKiBpbnRlZ3JhdGlvbiAoc2VlIGBBbGJJbnRlZ3JhdGlvblByb3BzLm1hcFBhcmFtZXRlcnNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0KS5cbiAgICAgKi9cbiAgICB1c2VybmFtZT86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNlZSBgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzLmJhc2ljQXV0aEZvckludGVybmFsQXV0aG9yaXphdGlvbmAgb24gdGhlIGBBcGlHYXRld2F5YFxuICAgICAqIGNvbnN0cnVjdCAod2UgcHJvdmlkZSB0aGUgc2FtZSBjb250ZXh0IHZhcmlhYmxlIGhlcmUgYXMgaW4gdGhlIENvZ25pdG8gVXNlciBQb29sIGF1dGhvcml6ZXIsXG4gICAgICogdXNpbmcgdGhlIGNyZWRlbnRpYWxzIGZyb20gQkFTSUNfQVVUSF9DUkVERU5USUFMU19TRUNSRVRfTkFNRSkuXG4gICAgICovXG4gICAgaW50ZXJuYWxBdXRob3JpemF0aW9uSGVhZGVyPzogc3RyaW5nXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoXG4gIGV2ZW50OiBBUElHYXRld2F5UmVxdWVzdEF1dGhvcml6ZXJFdmVudFYyLFxuKTogUHJvbWlzZTxBdXRob3JpemVyUmVzdWx0PiA9PiB7XG4gIGNvbnN0IGF1dGhIZWFkZXIgPSBldmVudC5oZWFkZXJzPy5hdXRob3JpemF0aW9uXG4gIGlmICghYXV0aEhlYWRlcikge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG5cbiAgY29uc3QgZXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9IGF3YWl0IGdldEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoKVxuXG4gIGlmIChhdXRoSGVhZGVyLnN0YXJ0c1dpdGgoXCJCZWFyZXIgXCIpKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmVyaWZ5QWNjZXNzVG9rZW4oYXV0aEhlYWRlci5zdWJzdHJpbmcoNykpIC8vIHN1YnN0cmluZyg3KSA9PSBhZnRlciAnQmVhcmVyICdcbiAgICBzd2l0Y2ggKHJlc3VsdCkge1xuICAgICAgY2FzZSBcIklOVkFMSURcIjpcbiAgICAgICAgcmV0dXJuIHsgaXNBdXRob3JpemVkOiBmYWxzZSB9XG4gICAgICBjYXNlIFwiRVhQSVJFRFwiOlxuICAgICAgICAvLyBXZSB3YW50IHRvIHJldHVybiA0MDEgVW5hdXRob3JpemVkIGZvciBleHBpcmVkIHRva2Vucywgc28gdGhlIGNsaWVudCBrbm93cyB0byByZWZyZXNoXG4gICAgICAgIC8vIHRoZWlyIHRva2VuIHdoZW4gcmVjZWl2aW5nIHRoaXMgc3RhdHVzIGNvZGUuIEFQSSBHYXRld2F5IGF1dGhvcml6ZXIgbGFtYmRhcyByZXR1cm5cbiAgICAgICAgLy8gNDAzIEZvcmJpZGRlbiBmb3Ige2lzQXV0aG9yaXplZDogZmFsc2V9LCBidXQgdGhlcmUgaXMgYSB3YXkgdG8gcmV0dXJuIDQwMTogdGhyb3dpbmcgYW5cbiAgICAgICAgLy8gZXJyb3Igd2l0aCB0aGlzIGV4YWN0IHN0cmluZy4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzcxOTY1ODkwXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuYXV0aG9yaXplZFwiKVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc0F1dGhvcml6ZWQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IHJlc3VsdC5jbGllbnRfaWQsXG4gICAgICAgICAgICBpbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXI6XG4gICAgICAgICAgICAgIGV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHM/LlswXT8uYmFzaWNBdXRoSGVhZGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoXG4gICAgYXV0aEhlYWRlci5zdGFydHNXaXRoKFwiQmFzaWMgXCIpICYmXG4gICAgZXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIGZvciAoY29uc3QgZXhwZWN0ZWQgb2YgZXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscykge1xuICAgICAgaWYgKGF1dGhIZWFkZXIgPT09IGV4cGVjdGVkLmJhc2ljQXV0aEhlYWRlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzQXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICB1c2VybmFtZTogZXhwZWN0ZWQudXNlcm5hbWUsXG4gICAgICAgICAgICBpbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXI6IGV4cGVjdGVkLmJhc2ljQXV0aEhlYWRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IGlzQXV0aG9yaXplZDogZmFsc2UgfVxuICB9XG59XG5cbi8qKiBEZWNvZGVzIGFuZCB2ZXJpZmllcyB0aGUgZ2l2ZW4gdG9rZW4gYWdhaW5zdCBDb2duaXRvLiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QWNjZXNzVG9rZW4oXG4gIHRva2VuOiBzdHJpbmcsXG4pOiBQcm9taXNlPENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQgfCBcIkVYUElSRURcIiB8IFwiSU5WQUxJRFwiPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW5WZXJpZmllciA9IGdldFRva2VuVmVyaWZpZXIoKVxuICAgIC8vIE11c3QgYXdhaXQgaGVyZSBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgcHJvbWlzZSBkaXJlY3RseSwgc28gdGhhdCBlcnJvcnMgY2FuIGJlIGNhdWdodCBpblxuICAgIC8vIHRoaXMgZnVuY3Rpb25cbiAgICByZXR1cm4gYXdhaXQgdG9rZW5WZXJpZmllci52ZXJpZnkodG9rZW4pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiB0aGUgSldUIGhhcyBleHBpcmVkLCBhd3Mtand0LXZlcmlmeSB0aHJvd3MgdGhpcyBlcnJvcjpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzbGFicy9hd3Mtand0LXZlcmlmeS9ibG9iLzhkOGY3MTRkNzI4MTkxM2VjZDY2MDE0N2Y1YzMwMzExNDc5NjAxYzEvc3JjL2p3dC50cyNMMTk3XG4gICAgLy8gV2UgY2FuJ3QgY2hlY2sgaW5zdGFuY2VvZiBvbiB0aGF0IGVycm9yIGNsYXNzLCBzaW5jZSBpdCdzIG5vdCBleHBvcnRlZCwgc28gdGhpcyBpcyB0aGUgbmV4dFxuICAgIC8vIGJlc3QgdGhpbmcuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2U/LmluY2x1ZGVzKFwiVG9rZW4gZXhwaXJlZFwiKSkge1xuICAgICAgcmV0dXJuIFwiRVhQSVJFRFwiXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIklOVkFMSURcIlxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgdHlwZSBUb2tlblZlcmlmaWVyID0ge1xuICB2ZXJpZnk6IChhY2Nlc3NUb2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQ+XG59XG5cbi8qKlxuICogV2UgY2FjaGUgdGhlIHZlcmlmaWVyIGluIHRoaXMgZ2xvYmFsIHZhcmlhYmxlLCBzbyB0aGF0IHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgYSBob3QgbGFtYmRhXG4gKiB3aWxsIHJlLXVzZSB0aGlzLlxuICovXG5sZXQgY2FjaGVkVG9rZW5WZXJpZmllcjogVG9rZW5WZXJpZmllciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG5mdW5jdGlvbiBnZXRUb2tlblZlcmlmaWVyKCk6IFRva2VuVmVyaWZpZXIge1xuICBpZiAoY2FjaGVkVG9rZW5WZXJpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FjaGVkVG9rZW5WZXJpZmllciA9IGRlcGVuZGVuY2llcy5jcmVhdGVUb2tlblZlcmlmaWVyKClcbiAgfVxuICByZXR1cm4gY2FjaGVkVG9rZW5WZXJpZmllclxufVxuXG4vKiogRm9yIG92ZXJyaWRpbmcgZGVwZW5kZW5jeSBjcmVhdGlvbiBpbiB0ZXN0cy4gKi9cbmV4cG9ydCBjb25zdCBkZXBlbmRlbmNpZXMgPSB7XG4gIGNyZWF0ZVRva2VuVmVyaWZpZXI6ICgpOiBUb2tlblZlcmlmaWVyID0+IHtcbiAgICBjb25zdCB1c2VyUG9vbElkID0gcHJvY2Vzcy5lbnZbXCJVU0VSX1BPT0xfSURcIl1cbiAgICBpZiAoIXVzZXJQb29sSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJVU0VSX1BPT0xfSUQgZW52IHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIH1cblxuICAgIHJldHVybiBDb2duaXRvSnd0VmVyaWZpZXIuY3JlYXRlKHtcbiAgICAgIHVzZXJQb29sSWQsXG4gICAgICB0b2tlblVzZTogXCJhY2Nlc3NcIixcbiAgICAgIGNsaWVudElkOiBudWxsLFxuICAgICAgc2NvcGU6IHByb2Nlc3MuZW52LlJFUVVJUkVEX1NDT1BFIHx8IHVuZGVmaW5lZCwgLy8gYHx8IHVuZGVmaW5lZGAgdG8gZGlzY2FyZCBlbXB0eSBzdHJpbmdcbiAgICB9KVxuICB9LFxuICBjcmVhdGVTZWNyZXRzTWFuYWdlcjogKCkgPT4gbmV3IFNlY3JldHNNYW5hZ2VyKCksXG59XG5cbnR5cGUgRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9IHtcbiAgYmFzaWNBdXRoSGVhZGVyOiBzdHJpbmdcbiAgdXNlcm5hbWU6IHN0cmluZ1xufVxuXG4vKiogQ2FjaGUgdGhpcyB2YWx1ZSwgc28gdGhhdCBzdWJzZXF1ZW50IGxhbWJkYSBpbnZvY2F0aW9ucyBkb24ndCBoYXZlIHRvIHJlZmV0Y2guICovXG5sZXQgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHM6IEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNbXSB8IHVuZGVmaW5lZCA9XG4gIHVuZGVmaW5lZFxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXksIHRvIHN1cHBvcnQgY3JlZGVudGlhbCBzZWNyZXRzIHdpdGggbXVsdGlwbGUgdmFsdWVzIChzZWVcbiAqIGBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHNgIG9uIHRoZSBgQXBpR2F0ZXdheWAgY29uc3RydWN0IGZvciBtb3JlIG9uIHRoaXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKCk6IFByb21pc2U8XG4gIEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNbXSB8IHVuZGVmaW5lZFxuPiB7XG4gIGlmIChjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qgc2VjcmV0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgIHByb2Nlc3MuZW52W1wiQkFTSUNfQVVUSF9DUkVERU5USUFMU19TRUNSRVRfTkFNRVwiXVxuICAgIGlmICghc2VjcmV0TmFtZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNhY2hlZEJhc2ljQXV0aENyZWRlbnRpYWxzID0gYXdhaXQgZ2V0QmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXQoc2VjcmV0TmFtZSlcbiAgfVxuXG4gIHJldHVybiBjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFsc1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRCYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldChcbiAgc2VjcmV0TmFtZTogc3RyaW5nLFxuKTogUHJvbWlzZTxFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzW10+IHtcbiAgY29uc3Qgc2VjcmV0ID0gYXdhaXQgZ2V0U2VjcmV0VmFsdWUoc2VjcmV0TmFtZSlcblxuICBpZiAoaXNTaW5nbGVVc2VybmFtZUFuZFBhc3N3b3JkKHNlY3JldCkpIHtcbiAgICBjb25zdCBoZWFkZXIgPVxuICAgICAgXCJCYXNpYyBcIiArXG4gICAgICBCdWZmZXIuZnJvbShgJHtzZWNyZXQudXNlcm5hbWV9OiR7c2VjcmV0LnBhc3N3b3JkfWApLnRvU3RyaW5nKFwiYmFzZTY0XCIpXG4gICAgcmV0dXJuIFt7IGJhc2ljQXV0aEhlYWRlcjogaGVhZGVyLCB1c2VybmFtZTogc2VjcmV0LnVzZXJuYW1lIH1dXG4gIH1cblxuICAvLyBTZWUgYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBmb3JtYXRzXG4gIC8vIHdlIHBhcnNlIGhlcmVcbiAgaWYgKGhhc0NyZWRlbnRpYWxzS2V5V2l0aFN0cmluZ1ZhbHVlKHNlY3JldCkpIHtcbiAgICBsZXQgY3JlZGVudGlhbHNBcnJheTogdW5rbm93blxuICAgIHRyeSB7XG4gICAgICBjcmVkZW50aWFsc0FycmF5ID0gSlNPTi5wYXJzZShzZWNyZXQuY3JlZGVudGlhbHMpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBwYXJzZSBjcmVkZW50aWFscyBhcnJheSBpbiBzZWNyZXQgJyR7c2VjcmV0TmFtZX0nIGFzIEpTT05gLFxuICAgICAgICBlLFxuICAgICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmdBcnJheShjcmVkZW50aWFsc0FycmF5KSkge1xuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzQXJyYXkubWFwKHBhcnNlRW5jb2RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKVxuICAgIH1cbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgYEJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGRpZCBub3QgZm9sbG93IGFueSBleHBlY3RlZCBmb3JtYXQgKHNlY3JldCBuYW1lOiAnJHtzZWNyZXROYW1lfScpYCxcbiAgKVxuICB0aHJvdyBuZXcgRXJyb3IoKVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgY2xpZW50ID0gZGVwZW5kZW5jaWVzLmNyZWF0ZVNlY3JldHNNYW5hZ2VyKClcbiAgY29uc3Qgc2VjcmV0ID0gYXdhaXQgY2xpZW50LmdldFNlY3JldFZhbHVlKHsgU2VjcmV0SWQ6IHNlY3JldE5hbWUgfSlcblxuICBpZiAoIXNlY3JldC5TZWNyZXRTdHJpbmcpIHtcbiAgICBjb25zb2xlLmVycm9yKGBTZWNyZXQgdmFsdWUgbm90IGZvdW5kIGZvciAnJHtzZWNyZXROYW1lfSdgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHNlY3JldC5TZWNyZXRTdHJpbmcpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2Ugc2VjcmV0ICcke3NlY3JldE5hbWV9JyBhcyBKU09OOmAsIGUpXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1NpbmdsZVVzZXJuYW1lQW5kUGFzc3dvcmQoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJ1c2VybmFtZVwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnVzZXJuYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgXCJwYXNzd29yZFwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZnVuY3Rpb24gaGFzQ3JlZGVudGlhbHNLZXlXaXRoU3RyaW5nVmFsdWUoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyBjcmVkZW50aWFsczogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJjcmVkZW50aWFsc1wiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLmNyZWRlbnRpYWxzID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZnVuY3Rpb24gaXNTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZ1tdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFdlIHdhbnQgdG8gcmV0dXJuIHRoZSByZXF1ZXN0aW5nIHVzZXJuYW1lIGFzIGEgY29udGV4dCB2YXJpYWJsZSBpblxuICoge0BsaW5rIEF1dGhvcml6ZXJSZXN1bHQuY29udGV4dH0sIGZvciBBUEkgR2F0ZXdheSBhY2Nlc3MgbG9ncyBhbmQgcGFyYW1ldGVyIG1hcHBpbmcuIFNvIGlmIHRoZVxuICogYmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgaXMgc3RvcmVkIGFzIHByZS1lbmNvZGVkIGJhc2U2NCBzdHJpbmdzLCB3ZSBuZWVkIHRvIHBhcnNlIHRoZW0gdG9cbiAqIGdldCB0aGUgdXNlcm5hbWUuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRW5jb2RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKFxuICBlbmNvZGVkQ3JlZGVudGlhbHM6IHN0cmluZyxcbik6IEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMge1xuICBsZXQgZGVjb2RlZENyZWRlbnRpYWxzOiBzdHJpbmdcbiAgdHJ5IHtcbiAgICBkZWNvZGVkQ3JlZGVudGlhbHMgPSBCdWZmZXIuZnJvbShlbmNvZGVkQ3JlZGVudGlhbHMsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKClcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGNvdWxkIG5vdCBiZSBkZWNvZGVkIGFzIGJhc2U2NDpcIixcbiAgICAgIGUsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICBjb25zdCB1c2VybmFtZUFuZFBhc3N3b3JkID0gZGVjb2RlZENyZWRlbnRpYWxzLnNwbGl0KFwiOlwiLCAyKVxuICBpZiAodXNlcm5hbWVBbmRQYXNzd29yZC5sZW5ndGggIT09IDIpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJCYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBjb3VsZCBub3QgYmUgZGVjb2RlZCBhcyAndXNlcm5hbWU6cGFzc3dvcmQnXCIsXG4gICAgKVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhc2ljQXV0aEhlYWRlcjogYEJhc2ljICR7ZW5jb2RlZENyZWRlbnRpYWxzfWAsXG4gICAgdXNlcm5hbWU6IHVzZXJuYW1lQW5kUGFzc3dvcmRbMF0sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ2FjaGUoKSB7XG4gIGNhY2hlZFRva2VuVmVyaWZpZXIgPSB1bmRlZmluZWRcbiAgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMgPSB1bmRlZmluZWRcbn1cbiJdfQ==
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by11c2VyLXBvb2wtb3ItYmFzaWMtYXV0aC1hdXRob3JpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS1nYXRld2F5L2F1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1vci1iYXNpYy1hdXRoLWF1dGhvcml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztHQVlHO0FBTUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBbUNuRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUMxQixLQUF5QyxFQUNkLEVBQUU7SUFDN0IsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUE7SUFDL0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVELE1BQU0sNEJBQTRCLEdBQUcsTUFBTSwrQkFBK0IsRUFBRSxDQUFBO0lBRTVFLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsa0NBQWtDO1FBQ2xHLFFBQVEsTUFBTSxFQUFFLENBQUM7WUFDZixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQTtZQUNoQyxLQUFLLFNBQVM7Z0JBQ1osd0ZBQXdGO2dCQUN4RixxRkFBcUY7Z0JBQ3JGLHlGQUF5RjtnQkFDekYscUVBQXFFO2dCQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ2pDO2dC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Q0FBQTtBQUNiLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZ0NBQWdDLENBQ3ZDLGtCQUEwQjtJQUUxQixJQUFJLGtCQUEwQixDQUFBO0lBQzlCLElBQUksQ0FBQztRQUNILGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDM0UsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxPQUFPLENBQUMsS0FBSyxDQUNYLCtEQUErRCxFQUMvRCxDQUFDLENBQ0YsQ0FBQTtRQUNELE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzVELElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQ1gsMkVBQTJFLENBQzVFLENBQUE7UUFDRCxNQUFNLElBQUksS0FBSyxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQUVELE9BQU87UUFDTCxlQUFlLEVBQUUsU0FBUyxrQkFBa0IsRUFBRTtRQUM5QyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0tBQ2pDLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVU7SUFDeEIsbUJBQW1CLEdBQUcsU0FBUyxDQUFBO0lBQy9CLDBCQUEwQixHQUFHLFNBQVMsQ0FBQTtBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGxhbWJkYSB2ZXJpZmllcyBjcmVkZW50aWFsczpcbiAqIC0gQWdhaW5zdCBDb2duaXRvIHVzZXIgcG9vbCBpZiByZXF1ZXN0IHVzZXMgYWNjZXNzIHRva2VuIGluIEJlYXJlciBhdXRob3JpemF0aW9uIGhlYWRlclxuICogLSBBZ2FpbnN0IGNyZWRlbnRpYWxzIHNhdmVkIGluIFNlY3JldCBNYW5hZ2VyIGlmIHJlcXVlc3QgdXNlcyBiYXNpYyBhdXRoIChhbmQgaWYgc2VjcmV0IGV4aXN0cylcbiAqXG4gKiBFeHBlY3RzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBVU0VSX1BPT0xfSURcbiAqIC0gQkFTSUNfQVVUSF9DUkVERU5USUFMU19TRUNSRVRfTkFNRSAob3B0aW9uYWwpXG4gKiAgIC0gTmFtZSBvZiBzZWNyZXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciB0aGF0IHN0b3JlcyBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzLiBTZWVcbiAqICAgICBgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCBmb3IgdGhlIHN1cHBvcnRlZCBmb3JtYXRzLlxuICogLSBSRVFVSVJFRF9TQ09QRSAob3B0aW9uYWwpXG4gKiAgIC0gU2V0IHRoaXMgdG8gcmVxdWlyZSB0aGF0IHRoZSBhY2Nlc3MgdG9rZW4gcGF5bG9hZCBjb250YWlucyB0aGUgZ2l2ZW4gc2NvcGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFQSUdhdGV3YXlSZXF1ZXN0QXV0aG9yaXplckV2ZW50VjIsXG4gIEFQSUdhdGV3YXlTaW1wbGVBdXRob3JpemVyUmVzdWx0LFxufSBmcm9tIFwiYXdzLWxhbWJkYVwiXG5pbXBvcnQgeyBTZWNyZXRzTWFuYWdlciB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyXCJcbmltcG9ydCB7IENvZ25pdG9Kd3RWZXJpZmllciB9IGZyb20gXCJhd3Mtand0LXZlcmlmeVwiXG5pbXBvcnQgdHlwZSB7IENvZ25pdG9BY2Nlc3NUb2tlblBheWxvYWQgfSBmcm9tIFwiYXdzLWp3dC12ZXJpZnkvand0LW1vZGVsXCJcblxudHlwZSBBdXRob3JpemVyUmVzdWx0ID0gQVBJR2F0ZXdheVNpbXBsZUF1dGhvcml6ZXJSZXN1bHQgJiB7XG4gIC8qKlxuICAgKiBSZXR1cm5pbmcgYSBjb250ZXh0IG9iamVjdCBmcm9tIG91ciBhdXRob3JpemVyIGFsbG93cyBvdXIgQVBJIEdhdGV3YXkgdG8gYWNjZXNzIHRoZXNlIHZhcmlhYmxlc1xuICAgKiB2aWEgYCR7Y29udGV4dC5hdXRob3JpemVyLjxwcm9wZXJ0eT59YC5cbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLXBhcmFtZXRlci1tYXBwaW5nLmh0bWxcbiAgICovXG4gIGNvbnRleHQ/OiB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHJlcXVlc3QgdXNlZCBhbiBhY2Nlc3MgdG9rZW4sIGFuZCB0aGUgdG9rZW4gd2FzIHZlcmlmaWVkLCB3ZSByZXR1cm4gdGhlIGF1dGggY2xpZW50IElEXG4gICAgICogZnJvbSB0aGUgdG9rZW4ncyBjbGFpbXMgaW4gdGhpcyBjb250ZXh0IHZhcmlhYmxlIChuYW1lZCBgYXV0aG9yaXplci5jbGllbnRJZGApLiBXZSB1c2UgdGhpc1xuICAgICAqIHRvIGluY2x1ZGUgdGhlIHJlcXVlc3RpbmcgY2xpZW50IGluIHRoZSBBUEkgR2F0ZXdheSBhY2Nlc3MgbG9ncyAoc2VlIGBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0YFxuICAgICAqIGluIG91ciBgQXBpR2F0ZXdheWAgY29uc3RydWN0KS4gWW91IGNhbiBhbHNvIHVzZSB0aGlzIHdoZW4gbWFwcGluZyBwYXJhbWV0ZXJzIHRvIHRoZSBiYWNrZW5kXG4gICAgICogaW50ZWdyYXRpb24gKHNlZSBgQWxiSW50ZWdyYXRpb25Qcm9wcy5tYXBQYXJhbWV0ZXJzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCkuXG4gICAgICovXG4gICAgY2xpZW50SWQ/OiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgcmVxdWVzdCB1c2VkIEJhc2ljIEF1dGgsIGFuZCB0aGUgY3JlZGVudGlhbHMgd2VyZSB2ZXJpZmllZCwgd2UgcmV0dXJuIHRoZSB1c2VybmFtZVxuICAgICAqIHRoYXQgd2FzIHVzZWQgaW4gdGhpcyBjb250ZXh0IHZhcmlhYmxlIChuYW1lZCBgYXV0aG9yaXplci51c2VybmFtZWApLiBXZSB1c2UgdGhpcyB0byBpbmNsdWRlXG4gICAgICogdGhlIHJlcXVlc3RpbmcgdXNlciBpbiB0aGUgQVBJIEdhdGV3YXkgYWNjZXNzIGxvZ3MgKHNlZSBgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdGAgaW4gb3VyXG4gICAgICogYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCkuIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB3aGVuIG1hcHBpbmcgcGFyYW1ldGVycyB0byB0aGUgYmFja2VuZFxuICAgICAqIGludGVncmF0aW9uIChzZWUgYEFsYkludGVncmF0aW9uUHJvcHMubWFwUGFyYW1ldGVyc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QpLlxuICAgICAqL1xuICAgIHVzZXJuYW1lPzogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU2VlIGBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyUHJvcHMuYmFzaWNBdXRoRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uYCBvbiB0aGUgYEFwaUdhdGV3YXlgXG4gICAgICogY29uc3RydWN0ICh3ZSBwcm92aWRlIHRoZSBzYW1lIGNvbnRleHQgdmFyaWFibGUgaGVyZSBhcyBpbiB0aGUgQ29nbml0byBVc2VyIFBvb2wgYXV0aG9yaXplcixcbiAgICAgKiB1c2luZyB0aGUgY3JlZGVudGlhbHMgZnJvbSBCQVNJQ19BVVRIX0NSRURFTlRJQUxTX1NFQ1JFVF9OQU1FKS5cbiAgICAgKi9cbiAgICBpbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXI/OiBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChcbiAgZXZlbnQ6IEFQSUdhdGV3YXlSZXF1ZXN0QXV0aG9yaXplckV2ZW50VjIsXG4pOiBQcm9taXNlPEF1dGhvcml6ZXJSZXN1bHQ+ID0+IHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IGV2ZW50LmhlYWRlcnM/LmF1dGhvcml6YXRpb25cbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgcmV0dXJuIHsgaXNBdXRob3JpemVkOiBmYWxzZSB9XG4gIH1cblxuICBjb25zdCBleHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzID0gYXdhaXQgZ2V0RXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscygpXG5cbiAgaWYgKGF1dGhIZWFkZXIuc3RhcnRzV2l0aChcIkJlYXJlciBcIikpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2ZXJpZnlBY2Nlc3NUb2tlbihhdXRoSGVhZGVyLnN1YnN0cmluZyg3KSkgLy8gc3Vic3RyaW5nKDcpID09IGFmdGVyICdCZWFyZXIgJ1xuICAgIHN3aXRjaCAocmVzdWx0KSB7XG4gICAgICBjYXNlIFwiSU5WQUxJRFwiOlxuICAgICAgICByZXR1cm4geyBpc0F1dGhvcml6ZWQ6IGZhbHNlIH1cbiAgICAgIGNhc2UgXCJFWFBJUkVEXCI6XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gcmV0dXJuIDQwMSBVbmF1dGhvcml6ZWQgZm9yIGV4cGlyZWQgdG9rZW5zLCBzbyB0aGUgY2xpZW50IGtub3dzIHRvIHJlZnJlc2hcbiAgICAgICAgLy8gdGhlaXIgdG9rZW4gd2hlbiByZWNlaXZpbmcgdGhpcyBzdGF0dXMgY29kZS4gQVBJIEdhdGV3YXkgYXV0aG9yaXplciBsYW1iZGFzIHJldHVyblxuICAgICAgICAvLyA0MDMgRm9yYmlkZGVuIGZvciB7aXNBdXRob3JpemVkOiBmYWxzZX0sIGJ1dCB0aGVyZSBpcyBhIHdheSB0byByZXR1cm4gNDAxOiB0aHJvd2luZyBhblxuICAgICAgICAvLyBlcnJvciB3aXRoIHRoaXMgZXhhY3Qgc3RyaW5nLiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNzE5NjU4OTBcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hdXRob3JpemVkXCIpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzQXV0aG9yaXplZDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICBjbGllbnRJZDogcmVzdWx0LmNsaWVudF9pZCxcbiAgICAgICAgICAgIGludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcjpcbiAgICAgICAgICAgICAgZXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscz8uWzBdPy5iYXNpY0F1dGhIZWFkZXIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChcbiAgICBhdXRoSGVhZGVyLnN0YXJ0c1dpdGgoXCJCYXNpYyBcIikgJiZcbiAgICBleHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgZm9yIChjb25zdCBleHBlY3RlZCBvZiBleHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzKSB7XG4gICAgICBpZiAoYXV0aEhlYWRlciA9PT0gZXhwZWN0ZWQuYmFzaWNBdXRoSGVhZGVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNBdXRob3JpemVkOiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBleHBlY3RlZC51c2VybmFtZSxcbiAgICAgICAgICAgIGludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcjogZXhwZWN0ZWQuYmFzaWNBdXRoSGVhZGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgaXNBdXRob3JpemVkOiBmYWxzZSB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgaXNBdXRob3JpemVkOiBmYWxzZSB9XG4gIH1cbn1cblxuLyoqIERlY29kZXMgYW5kIHZlcmlmaWVzIHRoZSBnaXZlbiB0b2tlbiBhZ2FpbnN0IENvZ25pdG8uICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlBY2Nlc3NUb2tlbihcbiAgdG9rZW46IHN0cmluZyxcbik6IFByb21pc2U8Q29nbml0b0FjY2Vzc1Rva2VuUGF5bG9hZCB8IFwiRVhQSVJFRFwiIHwgXCJJTlZBTElEXCI+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB0b2tlblZlcmlmaWVyID0gZ2V0VG9rZW5WZXJpZmllcigpXG4gICAgLy8gTXVzdCBhd2FpdCBoZXJlIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBwcm9taXNlIGRpcmVjdGx5LCBzbyB0aGF0IGVycm9ycyBjYW4gYmUgY2F1Z2h0IGluXG4gICAgLy8gdGhpcyBmdW5jdGlvblxuICAgIHJldHVybiBhd2FpdCB0b2tlblZlcmlmaWVyLnZlcmlmeSh0b2tlbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElmIHRoZSBKV1QgaGFzIGV4cGlyZWQsIGF3cy1qd3QtdmVyaWZ5IHRocm93cyB0aGlzIGVycm9yOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3NsYWJzL2F3cy1qd3QtdmVyaWZ5L2Jsb2IvOGQ4ZjcxNGQ3MjgxOTEzZWNkNjYwMTQ3ZjVjMzAzMTE0Nzk2MDFjMS9zcmMvand0LnRzI0wxOTdcbiAgICAvLyBXZSBjYW4ndCBjaGVjayBpbnN0YW5jZW9mIG9uIHRoYXQgZXJyb3IgY2xhc3MsIHNpbmNlIGl0J3Mgbm90IGV4cG9ydGVkLCBzbyB0aGlzIGlzIHRoZSBuZXh0XG4gICAgLy8gYmVzdCB0aGluZy5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZT8uaW5jbHVkZXMoXCJUb2tlbiBleHBpcmVkXCIpKSB7XG4gICAgICByZXR1cm4gXCJFWFBJUkVEXCJcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwiSU5WQUxJRFwiXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB0eXBlIFRva2VuVmVyaWZpZXIgPSB7XG4gIHZlcmlmeTogKGFjY2Vzc1Rva2VuOiBzdHJpbmcpID0+IFByb21pc2U8Q29nbml0b0FjY2Vzc1Rva2VuUGF5bG9hZD5cbn1cblxuLyoqXG4gKiBXZSBjYWNoZSB0aGUgdmVyaWZpZXIgaW4gdGhpcyBnbG9iYWwgdmFyaWFibGUsIHNvIHRoYXQgc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZiBhIGhvdCBsYW1iZGFcbiAqIHdpbGwgcmUtdXNlIHRoaXMuXG4gKi9cbmxldCBjYWNoZWRUb2tlblZlcmlmaWVyOiBUb2tlblZlcmlmaWVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbmZ1bmN0aW9uIGdldFRva2VuVmVyaWZpZXIoKTogVG9rZW5WZXJpZmllciB7XG4gIGlmIChjYWNoZWRUb2tlblZlcmlmaWVyID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWNoZWRUb2tlblZlcmlmaWVyID0gZGVwZW5kZW5jaWVzLmNyZWF0ZVRva2VuVmVyaWZpZXIoKVxuICB9XG4gIHJldHVybiBjYWNoZWRUb2tlblZlcmlmaWVyXG59XG5cbi8qKiBGb3Igb3ZlcnJpZGluZyBkZXBlbmRlbmN5IGNyZWF0aW9uIGluIHRlc3RzLiAqL1xuZXhwb3J0IGNvbnN0IGRlcGVuZGVuY2llcyA9IHtcbiAgY3JlYXRlVG9rZW5WZXJpZmllcjogKCk6IFRva2VuVmVyaWZpZXIgPT4ge1xuICAgIGNvbnN0IHVzZXJQb29sSWQgPSBwcm9jZXNzLmVudltcIlVTRVJfUE9PTF9JRFwiXVxuICAgIGlmICghdXNlclBvb2xJZCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVTRVJfUE9PTF9JRCBlbnYgdmFyaWFibGUgaXMgbm90IGRlZmluZWRcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgfVxuXG4gICAgcmV0dXJuIENvZ25pdG9Kd3RWZXJpZmllci5jcmVhdGUoe1xuICAgICAgdXNlclBvb2xJZCxcbiAgICAgIHRva2VuVXNlOiBcImFjY2Vzc1wiLFxuICAgICAgY2xpZW50SWQ6IG51bGwsXG4gICAgICBzY29wZTogcHJvY2Vzcy5lbnYuUkVRVUlSRURfU0NPUEUgfHwgdW5kZWZpbmVkLCAvLyBgfHwgdW5kZWZpbmVkYCB0byBkaXNjYXJkIGVtcHR5IHN0cmluZ1xuICAgIH0pXG4gIH0sXG4gIGNyZWF0ZVNlY3JldHNNYW5hZ2VyOiAoKSA9PiBuZXcgU2VjcmV0c01hbmFnZXIoKSxcbn1cblxudHlwZSBFeHBlY3RlZEJhc2ljQXV0aENyZWRlbnRpYWxzID0ge1xuICBiYXNpY0F1dGhIZWFkZXI6IHN0cmluZ1xuICB1c2VybmFtZTogc3RyaW5nXG59XG5cbi8qKiBDYWNoZSB0aGlzIHZhbHVlLCBzbyB0aGF0IHN1YnNlcXVlbnQgbGFtYmRhIGludm9jYXRpb25zIGRvbid0IGhhdmUgdG8gcmVmZXRjaC4gKi9cbmxldCBjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFsczogRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFsc1tdIHwgdW5kZWZpbmVkID1cbiAgdW5kZWZpbmVkXG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSwgdG8gc3VwcG9ydCBjcmVkZW50aWFsIHNlY3JldHMgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgKHNlZVxuICogYEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc2Agb24gdGhlIGBBcGlHYXRld2F5YCBjb25zdHJ1Y3QgZm9yIG1vcmUgb24gdGhpcykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoKTogUHJvbWlzZTxcbiAgRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFsc1tdIHwgdW5kZWZpbmVkXG4+IHtcbiAgaWYgKGNhY2hlZEJhc2ljQXV0aENyZWRlbnRpYWxzID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzZWNyZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPVxuICAgICAgcHJvY2Vzcy5lbnZbXCJCQVNJQ19BVVRIX0NSRURFTlRJQUxTX1NFQ1JFVF9OQU1FXCJdXG4gICAgaWYgKCFzZWNyZXROYW1lKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY2FjaGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMgPSBhd2FpdCBnZXRCYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldChzZWNyZXROYW1lKVxuICB9XG5cbiAgcmV0dXJuIGNhY2hlZEJhc2ljQXV0aENyZWRlbnRpYWxzXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0KFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4pOiBQcm9taXNlPEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHNbXT4ge1xuICBjb25zdCBzZWNyZXQgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lKVxuXG4gIGlmIChpc1VzZXJuYW1lQW5kUGFzc3dvcmRPYmplY3Qoc2VjcmV0KSkge1xuICAgIHJldHVybiBbZW5jb2RlQmFzaWNBdXRoQ3JlZGVudGlhbHMoc2VjcmV0KV1cbiAgfVxuXG4gIC8vIFNlZSBgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzYCBvbiB0aGUgYEFwaUdhdGV3YXlgIGNvbnN0cnVjdCBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGZvcm1hdHNcbiAgLy8gd2UgcGFyc2UgaGVyZVxuICBpZiAoaGFzQ3JlZGVudGlhbHNLZXlXaXRoU3RyaW5nVmFsdWUoc2VjcmV0KSkge1xuICAgIGxldCBjcmVkZW50aWFsc0FycmF5OiB1bmtub3duXG4gICAgdHJ5IHtcbiAgICAgIGNyZWRlbnRpYWxzQXJyYXkgPSBKU09OLnBhcnNlKHNlY3JldC5jcmVkZW50aWFscylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHBhcnNlIGNyZWRlbnRpYWxzIGFycmF5IGluIHNlY3JldCAnJHtzZWNyZXROYW1lfScgYXMgSlNPTmAsXG4gICAgICAgIGUsXG4gICAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgIH1cblxuICAgIGlmIChpc0FycmF5T2ZVc2VybmFtZUFuZFBhc3N3b3JkT2JqZWN0cyhjcmVkZW50aWFsc0FycmF5KSkge1xuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzQXJyYXkubWFwKGVuY29kZUJhc2ljQXV0aENyZWRlbnRpYWxzKVxuICAgIH1cblxuICAgIGlmIChpc1N0cmluZ0FycmF5KGNyZWRlbnRpYWxzQXJyYXkpKSB7XG4gICAgICByZXR1cm4gY3JlZGVudGlhbHNBcnJheS5tYXAocGFyc2VFbmNvZGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMpXG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5lcnJvcihcbiAgICBgQmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgZGlkIG5vdCBmb2xsb3cgYW55IGV4cGVjdGVkIGZvcm1hdCAoc2VjcmV0IG5hbWU6ICcke3NlY3JldE5hbWV9JylgLFxuICApXG4gIHRocm93IG5ldyBFcnJvcigpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNlY3JldFZhbHVlKHNlY3JldE5hbWU6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBjbGllbnQgPSBkZXBlbmRlbmNpZXMuY3JlYXRlU2VjcmV0c01hbmFnZXIoKVxuICBjb25zdCBzZWNyZXQgPSBhd2FpdCBjbGllbnQuZ2V0U2VjcmV0VmFsdWUoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KVxuXG4gIGlmICghc2VjcmV0LlNlY3JldFN0cmluZykge1xuICAgIGNvbnNvbGUuZXJyb3IoYFNlY3JldCB2YWx1ZSBub3QgZm91bmQgZm9yICcke3NlY3JldE5hbWV9J2ApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc2VjcmV0LlNlY3JldFN0cmluZylcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBwYXJzZSBzZWNyZXQgJyR7c2VjcmV0TmFtZX0nIGFzIEpTT046YCwgZSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZUJhc2ljQXV0aENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzOiB7XG4gIHVzZXJuYW1lOiBzdHJpbmdcbiAgcGFzc3dvcmQ6IHN0cmluZ1xufSk6IEV4cGVjdGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMge1xuICBjb25zdCBiYXNpY0F1dGhIZWFkZXIgPVxuICAgIFwiQmFzaWMgXCIgK1xuICAgIEJ1ZmZlci5mcm9tKGAke2NyZWRlbnRpYWxzLnVzZXJuYW1lfToke2NyZWRlbnRpYWxzLnBhc3N3b3JkfWApLnRvU3RyaW5nKFxuICAgICAgXCJiYXNlNjRcIixcbiAgICApXG5cbiAgcmV0dXJuIHsgYmFzaWNBdXRoSGVhZGVyLCB1c2VybmFtZTogY3JlZGVudGlhbHMudXNlcm5hbWUgfVxufVxuXG5mdW5jdGlvbiBpc1VzZXJuYW1lQW5kUGFzc3dvcmRPYmplY3QoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgXCJ1c2VybmFtZVwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnVzZXJuYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgXCJwYXNzd29yZFwiIGluIHZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiXG4gIClcbn1cblxuZnVuY3Rpb24gaXNBcnJheU9mVXNlcm5hbWVBbmRQYXNzd29yZE9iamVjdHMoXG4gIHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgeyB1c2VybmFtZTogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH1bXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiB2YWx1ZSkge1xuICAgIGlmICghaXNVc2VybmFtZUFuZFBhc3N3b3JkT2JqZWN0KGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5mdW5jdGlvbiBoYXNDcmVkZW50aWFsc0tleVdpdGhTdHJpbmdWYWx1ZShcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyB7IGNyZWRlbnRpYWxzOiBzdHJpbmcgfSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICBcImNyZWRlbnRpYWxzXCIgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuY3JlZGVudGlhbHMgPT09IFwic3RyaW5nXCJcbiAgKVxufVxuXG5mdW5jdGlvbiBpc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgdmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbi8qKlxuICogV2Ugd2FudCB0byByZXR1cm4gdGhlIHJlcXVlc3RpbmcgdXNlcm5hbWUgYXMgYSBjb250ZXh0IHZhcmlhYmxlIGluXG4gKiB7QGxpbmsgQXV0aG9yaXplclJlc3VsdC5jb250ZXh0fSwgZm9yIEFQSSBHYXRld2F5IGFjY2VzcyBsb2dzIGFuZCBwYXJhbWV0ZXIgbWFwcGluZy4gU28gaWYgdGhlXG4gKiBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzIHNlY3JldCBpcyBzdG9yZWQgYXMgcHJlLWVuY29kZWQgYmFzZTY0IHN0cmluZ3MsIHdlIG5lZWQgdG8gcGFyc2UgdGhlbSB0b1xuICogZ2V0IHRoZSB1c2VybmFtZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VFbmNvZGVkQmFzaWNBdXRoQ3JlZGVudGlhbHMoXG4gIGVuY29kZWRDcmVkZW50aWFsczogc3RyaW5nLFxuKTogRXhwZWN0ZWRCYXNpY0F1dGhDcmVkZW50aWFscyB7XG4gIGxldCBkZWNvZGVkQ3JlZGVudGlhbHM6IHN0cmluZ1xuICB0cnkge1xuICAgIGRlY29kZWRDcmVkZW50aWFscyA9IEJ1ZmZlci5mcm9tKGVuY29kZWRDcmVkZW50aWFscywgXCJiYXNlNjRcIikudG9TdHJpbmcoKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiQmFzaWMgYXV0aCBjcmVkZW50aWFscyBzZWNyZXQgY291bGQgbm90IGJlIGRlY29kZWQgYXMgYmFzZTY0OlwiLFxuICAgICAgZSxcbiAgICApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIGNvbnN0IHVzZXJuYW1lQW5kUGFzc3dvcmQgPSBkZWNvZGVkQ3JlZGVudGlhbHMuc3BsaXQoXCI6XCIsIDIpXG4gIGlmICh1c2VybmFtZUFuZFBhc3N3b3JkLmxlbmd0aCAhPT0gMikge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIkJhc2ljIGF1dGggY3JlZGVudGlhbHMgc2VjcmV0IGNvdWxkIG5vdCBiZSBkZWNvZGVkIGFzICd1c2VybmFtZTpwYXNzd29yZCdcIixcbiAgICApXG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmFzaWNBdXRoSGVhZGVyOiBgQmFzaWMgJHtlbmNvZGVkQ3JlZGVudGlhbHN9YCxcbiAgICB1c2VybmFtZTogdXNlcm5hbWVBbmRQYXNzd29yZFswXSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDYWNoZSgpIHtcbiAgY2FjaGVkVG9rZW5WZXJpZmllciA9IHVuZGVmaW5lZFxuICBjYWNoZWRCYXNpY0F1dGhDcmVkZW50aWFscyA9IHVuZGVmaW5lZFxufVxuIl19
@@ -349,54 +349,39 @@ export type CognitoUserPoolAuthorizerProps<AuthScopesT extends string = string>
349
349
  };
350
350
  export type BasicAuthAuthorizerProps = {
351
351
  /**
352
- * Name of secret in AWS Secrets Manager that stores basic auth credentials. The secret value
353
- * should follow this format:
354
- * ```json
355
- * { "username": "<username>", "password": "<password>" }
356
- * ```
357
- *
358
- * The following format is also supported:
359
- * ```json
360
- * { "credentials": "[\"<encoded-credential-1>\",\"<encoded-credential-2>\"]" }
361
- * ```
362
- * ...consisting of:
363
- * - A single key, `credentials`
364
- * - With a _string_ value
365
- * - Which is a stringified, escaped JSON array of base64-encoded credentials
366
- * - In which each element is encoded from `<username>:<password>`
367
- *
368
- * If the secret is on this format, the authorizer will match the request's Authorization header
369
- * against any one of these encoded credentials.
370
- *
371
- * The reason that this second format stores stringified JSON _inside_ JSON, is due to a
372
- * limitation in Liflig's `load-secrets` library, which only allows storing strings values.
352
+ * Name of secret in AWS Secrets Manager that stores basic auth credentials.
353
+ *
354
+ * The following formats are supported for the secret value:
355
+ * - Single username and password:
356
+ * ```json
357
+ * { "username": "<username>", "password": "<password>" }
358
+ * ```
359
+ * - Array of username + password objects:
360
+ * ```json
361
+ * { "credentials": "[{\"username\":\"<user-1>\",\"password\":\"password-1\"},{\"username\":\"<user-2>\",\"password\":\"<password-2>\"}]" }
362
+ * ```
363
+ * - The value of the `credentials` field is a string, with a stringified, escaped JSON array of
364
+ * objects with `username` and `password` fields.
365
+ * - The reason that this second format stores stringified JSON _inside_ JSON, is due to a
366
+ * limitation in Liflig's `load-secrets` library, which only allows storing string values.
367
+ * - Array of base64-encoded credentials:
368
+ * ```json
369
+ * { "credentials": "[\"<encoded-credential-1>\",\"<encoded-credential-2>\"]" }
370
+ * ```
371
+ * - Each element is encoded from `<username>:<password>`.
372
+ * - The array is stringified for the same reason as above.
373
+ *
374
+ * If the secret uses one of the array formats, the authorizer will match the request's
375
+ * Authorization header against any one of the credentials.
373
376
  */
374
377
  credentialsSecretName: string;
375
378
  };
376
379
  export type CognitoUserPoolOrBasicAuthAuthorizerProps<AuthScopesT extends string = string> = {
377
380
  userPool: IUserPool;
378
381
  /**
379
- * Name of secret in AWS Secrets Manager that stores basic auth credentials. The secret value
380
- * should follow this format:
381
- * ```json
382
- * { "username": "<username>", "password": "<password>" }
383
- * ```
384
- *
385
- * The following format is also supported:
386
- * ```json
387
- * { "credentials": "[\"<encoded-credential-1>\",\"<encoded-credential-2>\"]" }
388
- * ```
389
- * ...consisting of:
390
- * - A single key, `credentials`
391
- * - With a _string_ value
392
- * - Which is a stringified, escaped JSON array of base64-encoded credentials
393
- * - In which each element is encoded from `<username>:<password>`
394
- *
395
- * If the secret is on this format, the authorizer will match the request's Authorization header
396
- * against any one of these encoded credentials.
382
+ * Name of secret in AWS Secrets Manager that stores basic auth credentials.
397
383
  *
398
- * The reason that this second format stores stringified JSON _inside_ JSON, is due to a
399
- * limitation in Liflig's `load-secrets` library, which only allows storing strings values.
384
+ * See {@link BasicAuthAuthorizerProps.credentialsSecretName} for the supported formats.
400
385
  */
401
386
  basicAuthCredentialsSecretName?: string;
402
387
  /**
@@ -585,4 +585,4 @@ function shortHash(str) {
585
585
  // which is fine
586
586
  return createHash("sha1").update(str).digest("hex").substring(0, 10);
587
587
  }
588
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hcGktZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGktZ2F0ZXdheS9odHRwLWFwaS1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBR2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEtBQUssTUFBTSw4QkFBOEIsQ0FBQTtBQUNyRCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUNoRSxPQUFPLEtBQUssWUFBWSxNQUFNLDJDQUEyQyxDQUFBO0FBQ3pFLE9BQU8sS0FBSyxXQUFXLE1BQU0sMENBQTBDLENBQUE7QUFFdkUsT0FBTyxLQUFLLFlBQVksTUFBTSwrQkFBK0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ25DLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUE7QUFDbEQsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNqRSxPQUFPLEtBQUssR0FBRyxNQUFNLG9DQUFvQyxDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUE7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUVuQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FB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O0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHR5cGUgKiBhcyBlbGIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCJcbmltcG9ydCB0eXBlICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgdHlwZSAqIGFzIHNxcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiXG5pbXBvcnQgKiBhcyBhcGlndyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiXG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBpbnRlZ3JhdGlvbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zXCJcbmltcG9ydCAqIGFzIGF1dGhvcml6ZXJzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWF1dGhvcml6ZXJzXCJcbmltcG9ydCB0eXBlIHsgSVVzZXJQb29sIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2duaXRvXCJcbmltcG9ydCAqIGFzIGxhbWJkYU5vZGVqcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIlxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIlxuaW1wb3J0ICogYXMgcm91dGU1M1RhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIlxuaW1wb3J0ICogYXMgYWNtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCJcbmltcG9ydCB7IHRhZ1Jlc291cmNlcyB9IGZyb20gXCIuLi90YWdzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIlxuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSlcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIHtAbGluayBBcGlHYXRld2F5fSBjb25zdHJ1Y3QuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICogQGF1dGhvciBIZXJtYW5uIE3DuHJrcmlkIDxoZW1AbGlmbGlnLm5vPlxuICovXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogU2V0dGluZ3MgZm9yIHRoZSBleHRlcm5hbC1mYWNpbmcgcGFydCBvZiB0aGUgQVBJLUdXLiAqL1xuICBkbnM6IEFwaUdhdGV3YXlEbnNQcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBpbnRlZ3JhdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGEgcm91dGUsIHRoaXMgaW50ZWdyYXRpb24gaXMgdXNlZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBJbnRlZ3JhdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEludGVncmF0aW9uPzogSW50ZWdyYXRpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBhdXRob3JpemF0aW9uIGlzIHNwZWNpZmllZCBmb3IgYSByb3V0ZSwgdGhpcyBhdXRob3JpemF0aW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgQXV0aG9yaXphdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEF1dGhvcml6YXRpb24/OiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+XG5cbiAgcm91dGVzOiBBcGlHYXRld2F5Um91dGU8QXV0aFNjb3Blc1Q+W11cblxuICAvKipcbiAgICogVGhlIEFQSS1HVyBhY2Nlc3MgbG9ncyBmb3IgdGhlIGAkZGVmYXVsdGAgc3RhZ2UgYXJlIGtlcHQuXG4gICAqIFRoaXMgaGFzIG9wdGlvbnMgZm9yIHRoZSBsb2dzLlxuICAgKi9cbiAgYWNjZXNzTG9ncz86IEFwaUdhdGV3YXlBY2Nlc3NMb2dzUHJvcHNcblxuICAvKipcbiAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm91dGUtbGV2ZWwgbWV0cmljcy5cbiAgICogVGhpcyBjYW4gaW5jcmVhc2UgQ2xvdWRXYXRjaCBjb3N0cyB3aGVuIG5vdCBkaXNhYmxlZC5cbiAgICpcbiAgICogU2VlIFtBV1M6IFdvcmtpbmcgd2l0aCBtZXRyaWNzIGZvciBIVFRQIEFQSXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1tZXRyaWNzLmh0bWw/aWNtcGlkPWFwaWdhdGV3YXlfY29uc29sZV9oZWxwIzp+OnRleHQ9YW5kJTIwc3RhZ2UlMjBJRC4tLEFwaUlkJTJDJTIwU3RhZ2UlMkMlMjBSb3V0ZSwtRmlsdGVycyUyMEFQSSUyMEdhdGV3YXkpXG4gICAqIGZvciBtb3JlIGluZm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGRldGFpbGVkTWV0cmljcz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhyb3R0bGluZyBvZiByZXF1ZXN0cy5cbiAgICogSWYgbm90IHNldCwgdGhlIEFXUyBkZWZhdWx0IG9mIDUwMDAgYnVyc3QgYW5kIDEwMDAwIHJhdGUgaXMgdXNlZC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdGhyb3R0bGluZyBpcyBwZXItYWNjb3VudCwgYW5kIGNvdW50cyBhbGwgQVBJcyBpbiB0aGUgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKiBJZiB5b3UgaGF2ZSBhbm90aGVyIEFQSSBpbiB0aGlzIHJlZ2lvbiBnZXR0aW5nIDEwXzAwMCByZXF1ZXN0IHJhdGUsIGl0IG1heSBpbXBhY3QgdGhpcyBBUEkgYXMgd2VsbC5cbiAgICovXG4gIHRocm90dGxpbmc/OiB7XG4gICAgLyoqXG4gICAgICogR29pbmcgb3ZlciBgNV8wMDBgIG1heSByZXF1aXJlIHlvdSB0byBjb250YWN0IEFXUyBTdXBwb3J0IC0gdGhleSBhcmUgYWNjb3VudCBib3VuZC5cbiAgICAgKi9cbiAgICBidXJzdD86IG51bWJlclxuICAgIC8qKlxuICAgICAqIEdvaW5nIG92ZXIgYDEwXzAwMGAgbWF5IHJlcXVpcmUgeW91IHRvIGNvbnRhY3QgQVdTIFN1cHBvcnQgLSB0aGV5IGFyZSBhY2NvdW50IGJvdW5kLlxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIENPUlMgaGVhZGVycyBvbiByZXNwb25zZXMgZnJvbSB0aGUgQVBJIEdhdGV3YXkgdG8gYWxsb3cgYWxsIG9yaWdpbnMsIGhlYWRlcnMgYW5kIG1ldGhvZHMuXG4gICAqIFVzZWZ1bCBpZiB5b3VyIEFQSSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgYW55IGJyb3dzZXIuXG4gICAqL1xuICBjb3JzQWxsb3dBbGw/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIElmIHNvbWUgc2V0dGluZ3MgaW4gdGhpcyBjb25zdHJ1Y3QgZG8gbm90IHdvcmsgZm9yIHlvdSwgdGhpcyBpcyBhbiBlc2NhcGUgaGF0Y2ggbWVjaGFuaXNtIHRvXG4gICAqIG92ZXJyaWRlIGFueXRoaW5nLlxuICAgKi9cbiAgcHJvcHNPdmVycmlkZT86IHtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBzZXR0aW5ncyBmb3IgdGhlIHtAbGluayBhcGlndy5IdHRwQXBpfSAoYWNjZXNzaWJsZSBpbiB7QGxpbmsgQXBpR2F0ZXdheS5odHRwQXBpfSkuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBmcm9udGVuZCBhY2Nlc3NpbmcgdGhpcyBBUEksIHlvdSBtaWdodCB3YW50IHRvIHNldFxuICAgICAqIFtDT1JTIHByZWZsaWdodF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9hcGkvdjEvZG9jcy9hd3MtYXBpZ2F0ZXdheXYyLXJlYWRtZS5odG1sI2Nyb3NzLW9yaWdpbi1yZXNvdXJjZS1zaGFyaW5nLWNvcnMpXG4gICAgICogc2V0dGluZ3MuXG4gICAgICovXG4gICAgaHR0cEFwaT86IFBhcnRpYWw8YXBpZ3cuSHR0cEFwaVByb3BzPlxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlEbnNQcm9wcyA9IHtcbiAgLyoqXG4gICAqIE9ubHkgdGhlIHN1YmRvbWFpbiBwcmVmaXgsIHdoaWNoIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogRXhhbXBsZTogU3ViZG9tYWluIGBwcm9kdWN0YCB3b3VsZCBnaXZlIHRoZSBlbmQgcmVzdWx0IG9mIGFuIEFQSS1HVyB3aXRoXG4gICAqIGBwcm9kdWN0LnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgKi9cbiAgc3ViZG9tYWluOiBzdHJpbmdcblxuICAvKipcbiAgICogSG9zdGVkIFpvbmUgZm9yIHRoZSBleHRlcm5hbCBmYWNpbmcgZG9tYWluLlxuICAgKiBUaGlzIGlzIHdoZXJlIHJvdXRlcyB3aWxsIGJlIGNyZWF0ZWQsIHRvIHJlZGlyZWN0IGNvbnN1bWVycyB0byB0aGUgQVBJLUdXLlxuICAgKiBGb3IgZXhhbXBsZSBhIEhaIGZvciBgcGxhdGZvcm0uZXhhbXBsZS5ub2AuXG4gICAqL1xuICBob3N0ZWRab25lOiByb3V0ZTUzLklIb3N0ZWRab25lXG5cbiAgLyoqXG4gICAqIFRoZSBUaW1lIFRvIExpdmUgKFRUTCkgZm9yIHRoZSBwdWJsaWMgRE5TIEEgcmVjb3JkIHRoYXQgd2lsbCBleHBvc2UgdGhlIEFQSS1HVy5cbiAgICogVGhpcyBpcyBob3cgbG9uZyBETlMgc2VydmVycyB3aWxsIGNhY2hlIHRoZSByZWNvcmQuXG4gICAqXG4gICAqIEEgbG9uZyBUVEwgKGhvdXJzKSBpcyBiZW5lZmljaWFsIHRvIEROUyBzZXJ2ZXJzLCBidXQgbWFrZXMgZGV2ZWxvcGVycyAoeW91KSB3YWl0IGxvbmdlciB3aGVuXG4gICAqIGRvaW5nIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDUgbWludXRlc1xuICAgKi9cbiAgdHRsPzogY2RrLkR1cmF0aW9uXG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlSb3V0ZTxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIC8qKiBUaGUgcGF0aCBvZiB0aGUgcm91dGUgdG8gZXhwb3NlIHRocm91Z2ggdGhlIEFQSSBHYXRld2F5LiBVc2UgXCIvXCIgZm9yIHRoZSByb290IHJvdXRlLiAqL1xuICBwYXRoOiBzdHJpbmdcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgd2Ugb25seSBmb3J3YXJkIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIHJvdXRlJ3MgcGF0aCBleGFjdGx5LiBTbyBmb3IgYSByb3V0ZSB3aXRoXG4gICAqIHBhdGggYC9hcGkvdXNlcnNgLCBhIHJlcXVlc3QgdG8gYC9hcGkvdXNlcnNgIHdpbGwgYmUgZm9yd2FyZGVkLCBidXQgYSByZXF1ZXN0IHRvXG4gICAqIGAvYXBpL3VzZXJzL2FkbWluYCB3aWxsIG5vdC4gSWYgeW91IHdhbnQgdG8gZm9yd2FyZCByZXF1ZXN0cyB0byBhbGwgc3ViLXBhdGhzIHVuZGVyIHRoZSByb3V0ZSdzXG4gICAqIHBhdGgsIHlvdSBjYW4gc2V0IHRoaXMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGluY2x1ZGVTdWJwYXRocz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kIHRvIGV4cG9zZS4gYEFOWWAgZXhwb3NlcyBhbGwgSFRUUCBtZXRob2RzIG9uIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkFOWVwiXG4gICAqL1xuICBtZXRob2Q/OiBIdHRwTWV0aG9kXG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlZ3JhdGlvbiB0aGF0IHRoZSByb3V0ZSB3aWxsIGZvcndhcmQgdG8uIFNlZSB7QGxpbmsgSW50ZWdyYXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGVcbiAgICogb3B0aW9ucy5cbiAgICpcbiAgICogSWYgdW5kZWZpbmVkLCB1c2VzIHRoZSB7QGxpbmsgQXBpR2F0ZXdheVByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbn0uXG4gICAqL1xuICBpbnRlZ3JhdGlvbj86IEludGVncmF0aW9uUHJvcHNcblxuICAvKipcbiAgICogSG93IHJlcXVlc3RzIG9uIHRoZSByb3V0ZSBhcmUgYXV0aGVudGljYXRlZC4gU2VlIHtAbGluayBBdXRob3JpemF0aW9uUHJvcHN9IGZvciB0aGUgYXZhaWxhYmxlXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUge0BsaW5rIEFwaUdhdGV3YXlQcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbn0uXG4gICAqL1xuICBhdXRob3JpemF0aW9uPzogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPlxufVxuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID1cbiAgfCBcIkFOWVwiXG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJQVVRcIlxuICB8IFwiUEFUQ0hcIlxuICB8IFwiREVMRVRFXCJcbiAgfCBcIk9QVElPTlNcIlxuICB8IFwiSEVBRFwiXG5cbmV4cG9ydCB0eXBlIEludGVncmF0aW9uUHJvcHMgPVxuICAvKiogVXNlIHRoaXMgd2hlbiBjb25uZWN0aW5nIHRoZSByb3V0ZSB0byBhbiBBTEIgKEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIpLiAqL1xuICB8ICh7IHR5cGU6IFwiQUxCXCIgfSAmIEFsYkludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3Rpbmcgcm91dGUgdG8gYSBMYW1iZGEuICovXG4gIHwgKHsgdHlwZTogXCJMYW1iZGFcIiB9ICYgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcylcbiAgLyoqIFVzZSB0aGlzIHdoZW4gY29ubmVjdGluZyBhIHJvdXRlIHRvIHNlbmQgdG8gYW4gU1FTIHF1ZXVlLiAqL1xuICB8ICh7IHR5cGU6IFwiU1FTXCIgfSAmIFNxc0ludGVncmF0aW9uUHJvcHMpXG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBBUEktR1cgLT4gQUxCIChBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyKSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICovXG5leHBvcnQgdHlwZSBBbGJJbnRlZ3JhdGlvblByb3BzID0ge1xuICAvKipcbiAgICogQSBsaXN0ZW5lciBvbiBlLmcuIHBvcnQgNDQzIChIVFRQUykuXG4gICAqXG4gICAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gICAqL1xuICBsb2FkQmFsYW5jZXJMaXN0ZW5lcjogZWxiLklBcHBsaWNhdGlvbkxpc3RlbmVyXG5cbiAgLyoqXG4gICAqIFRoZSBob3N0IG5hbWUgKGRvbWFpbiBuYW1lKSBvZiB0aGUgYmFja2VuZCBzZXJ2aWNlIHRoYXQgd2Ugd2FudCB0byByZWFjaCB0aHJvdWdoIHRoZSBBTEIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0bzpcbiAgICogLSBWZXJpZnkgdGhlIEhUVFBTIGNlcnRpZmljYXRlIG9mIHRoZSBiYWNrZW5kIHNlcnZpY2UsIHNvIHRoYXQgdGhlIHJlcXVlc3QgZm9yd2FyZGVkIGZyb21cbiAgICogICBBUEktR1cgY2FuIHVzZSBUTFNcbiAgICogLSBTZXQgdGhlIGBIb3N0YCBoZWFkZXIgb24gdGhlIHJlcXVlc3Qgd2hlbiBmb3J3YXJkaW5nIHRvIHRoZSBBTEIsIHNvIHRoYXQgcmVxdWVzdHMgY2FuIGJlXG4gICAqICAgcm91dGVkIHRvIHRoZSBjb3JyZWN0IFRhcmdldCBHcm91cFxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgPHNlcnZpY2U+LnN0YWdpbmcubXktcHJvamVjdC5saWZsaWcuaW9gIChub3QgcHJlZml4ZWQgYnkgYGh0dHBzOi8vYCkuXG4gICAqL1xuICBob3N0TmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgdXNlZCBieSB0aGUgQUxCLiBUaGUgQVBJLUdXIGludGVncmF0aW9uIHdpbGwgY29ubmVjdCB0byB0aGUgQUxCIHVzaW5nIGEgVlBDIExpbmsgZm9yXG4gICAqIHRoaXMgVlBDLlxuICAgKlxuICAgKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgdnBjOiBlYzIuSVZwY1xuXG4gIC8qKlxuICAgKiBBIHNlY3VyaXR5IGdyb3VwIChTRykgdGhhdCBhbGxvd3MgaW5jb21pbmcgdHJhZmZpYyB0byB0aGUgQUxCLiBXaWxsIGJlIHVzZWQgYnkgdGhlIFZQQyBsaW5rLCBzb1xuICAgKiB0aGUgQVBJLUdXIGludGVncmF0aW9uIGNhbiBjb25uZWN0LlxuICAgKlxuICAgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIHNhbWUgU0cgYXMgdGhlIEFMQiB1c2VzLCBiZWNhdXNlIHRoZXkgaGF2ZSBhIHJ1bGUgdGhhdCBhbGxvd3MgdHJhZmZpYyBmcm9tXG4gICAqIG90aGVycyBpbiB0aGUgc2FtZSBTRy5cbiAgICpcbiAgICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIHNlY3VyaXR5R3JvdXA6IGVjMi5JU2VjdXJpdHlHcm91cFxuXG4gIC8qKlxuICAgKiBNYXAgcmVxdWVzdCBwYXJhbWV0ZXJzIChhZGQvb3ZlcndyaXRlIHBhdGgvaGVhZGVycy9xdWVyeSBwYXJhbXMpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIHRoZVxuICAgKiBiYWNrZW5kLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sfVxuICAgKiBmb3IgbW9yZSBvbiB0aGlzLiBSZWFkIHRoZSAnUmVzZXJ2ZWQgaGVhZGVycycgc2VjdGlvbiBmb3Igd2hpY2ggaGVhZGVycyBjYW5ub3QgYmUgb3ZlcnJpZGRlbi5cbiAgICogSW4gYWRkaXRpb24gdG8gdGhlIEFXUy1yZXNlcnZlZCBoZWFkZXJzLCB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgJ0hvc3QnIGhlYWRlciBlaXRoZXIsIGFzXG4gICAqIHRoYXQncyB1c2VkIGZvciByb3V0aW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBjb3JyZWN0IHNlcnZpY2UgYmVoaW5kIHRoZSBsb2FkIGJhbGFuY2VyLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZTpcbiAgICpcbiAgICogQWRkaW5nIGEgaGVhZGVyOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlSGVhZGVyKFxuICAgKiAgICBcIlgtTXktQ3VzdG9tLUhlYWRlclwiLFxuICAgKiAgICBhcGlndy5NYXBwaW5nVmFsdWUuY3VzdG9tKFwibXktY3VzdG9tLXZhbHVlXCIpLFxuICAgKiApXG4gICAqIGBgYFxuICAgKlxuICAgKiBPdmVyd3JpdGluZyB0aGUgcGF0aCAoaWYsIGZvciBleGFtcGxlLCB5b3UgY29uZmlndXJlIGEgYC91c2Vyc2Agcm91dGUgb24gdGhlIEFQSSBHYXRld2F5IHRoYXRcbiAgICogeW91IHdhbnQgdG8gZm9yd2FyZCB0byBgL2FwaS91c2Vyc2Agb24gdGhlIGJhY2tlbmQpOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlUGF0aChcIi9hcGkvdXNlcnNcIilcbiAgICogYGBgXG4gICAqL1xuICBtYXBQYXJhbWV0ZXJzPzogKHBhcmFtZXRlcnM6IGFwaWd3LlBhcmFtZXRlck1hcHBpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgaW50ZWdyYXRpb24gdXNlcyB0aGUgVjIgcGF5bG9hZCBmb3JtYXQ6XG4gICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktZGV2ZWxvcC1pbnRlZ3JhdGlvbnMtbGFtYmRhLmh0bWx9XG4gICAqXG4gICAqIElmIHdyaXRpbmcgdGhlIExhbWJkYSBpbiBUeXBlU2NyaXB0LCB0aGlzIG1lYW5zIHlvdSBzaG91bGQgdXNlIGBBUElHYXRld2F5UHJveHlFdmVudFYyYCBhcyB0aGVcbiAgICogcmVxdWVzdCB0eXBlLCBhbmQgYEFQSUdhdGV3YXlQcm94eVJlc3VsdFYyYCBhcyB0aGUgcmVzcG9uc2UgdHlwZS5cbiAgICovXG4gIGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxufVxuXG5leHBvcnQgdHlwZSBTcXNJbnRlZ3JhdGlvblByb3BzID0ge1xuICBxdWV1ZTogc3FzLklRdWV1ZVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGF0dHJpYnV0ZXMgdG8gcGFzcyBvbiB0byBTUVMuIFRoZSBrZXlzIGluIHRoaXMgb2JqZWN0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZXMuXG4gICAqIEVhY2ggYXR0cmlidXRlIGhhcyBhIERhdGFUeXBlIGZpZWxkLCBhbmQgZWl0aGVyIGEgU3RyaW5nVmFsdWUgb3IgQmluYXJ5VmFsdWUgZmllbGQgZGVwZW5kaW5nIG9uXG4gICAqIGl0cyB0eXBlLiBTZWUgQVdTIGRvY3M6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NTaW1wbGVRdWV1ZVNlcnZpY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTWVzc2FnZUF0dHJpYnV0ZVZhbHVlLmh0bWxcbiAgICpcbiAgICogSW4gdGhlIFN0cmluZ1ZhbHVlIGZpZWxkLCB5b3UgY2FuIGRvIEFQSSBHYXRld2F5IHBhcmFtZXRlciBtYXBwaW5nOlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktcGFyYW1ldGVyLW1hcHBpbmcuaHRtbFxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBcbiAgICogbWVzc2FnZUF0dHJpYnV0ZXM6IHtcbiAgICogICBjbGllbnRJZDoge1xuICAgKiAgICAgRGF0YVR5cGU6IFwiU3RyaW5nXCIsXG4gICAqICAgICBTdHJpbmdWYWx1ZTogXCIke2NvbnRleHQuYXV0aG9yaXplci5jbGllbnRJZH1cIixcbiAgICogICB9LFxuICAgKiB9LFxuICAgKiBgYGBcbiAgICovXG4gIG1lc3NhZ2VBdHRyaWJ1dGVzPzoge1xuICAgIFthdHRyaWJ1dGVOYW1lOiBzdHJpbmddOlxuICAgICAgfCB7IERhdGFUeXBlOiBcIlN0cmluZ1wiIHwgXCJOdW1iZXJcIjsgU3RyaW5nVmFsdWU6IHN0cmluZyB9XG4gICAgICB8IHtcbiAgICAgICAgICBEYXRhVHlwZTogXCJCaW5hcnlcIlxuICAgICAgICAgIC8qKiBCYXNlNjQtZW5jb2RlZCBiaW5hcnkgZGF0YSBvYmplY3QuICovXG4gICAgICAgICAgQmluYXJ5VmFsdWU6IHN0cmluZ1xuICAgICAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIC8qKlxuICAgKiBObyBhdXRoZW50aWNhdGlvbiwgZm9yIHdoZW4geW91IHdhbnQgYSBmdWxseSBwdWJsaWMgcm91dGUgKG9yIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBpbiB0aGVcbiAgICogYmFja2VuZCBpbnRlZ3JhdGlvbikuXG4gICAqL1xuICB8IHsgdHlwZTogXCJOT05FXCIgfVxuICAvKipcbiAgICogQVdTIElBTSBhdXRob3JpemF0aW9uLlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktYWNjZXNzLWNvbnRyb2wtaWFtLmh0bWxcbiAgICovXG4gIHwgeyB0eXBlOiBcIklBTVwiIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyXG4gICAqIGFuZCB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICAgKi9cbiAgfCAoe1xuICAgICAgdHlwZTogXCJDT0dOSVRPX1VTRVJfUE9PTFwiXG4gICAgfSAmIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICAgKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICAgKi9cbiAgfCAoeyB0eXBlOiBcIkJBU0lDX0FVVEhcIiB9ICYgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzKVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIGxhbWJkYSB3aGljaCBhbGxvd3MgYm90aDpcbiAgICogLSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgdG9rZW4gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZVxuICAgKiAgIGdpdmVuIENvZ25pdG8gdXNlciBwb29sXG4gICAqIC0gYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcmVcbiAgICogICBjaGVja2VkIGFnYWluc3QgdGhlIGNyZWRlbnRpYWxzIGZyb20gdGhlIGdpdmVuIGJhc2ljIGF1dGggc2VjcmV0IG5hbWVcbiAgICpcbiAgICogSWYgZWl0aGVyIG9mIHRoZXNlIGFyZSBnaXZlbiBhbmQgdmFsaWQsIHRoZSByZXF1ZXN0IGlzIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICB8ICh7XG4gICAgICB0eXBlOiBcIkNPR05JVE9fVVNFUl9QT09MX09SX0JBU0lDX0FVVEhcIlxuICAgIH0gJiBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG5cbmV4cG9ydCB0eXBlIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0ge1xuICB1c2VyUG9vbDogSVVzZXJQb29sXG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgYWNjZXNzIHRva2VuIGNsYWltcyBjb250YWluIHRoZSBnaXZlbiBzY29wZS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMgZm9yIHRoZSBiYWNrZW5kXG4gICAqIHNlcnZpY2UsIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgYmFja2VuZCBpZiBDb2duaXRvIHVzZXIgcG9vbCBhdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQuXG4gICAqXG4gICAqIFRoZSBzZWNyZXQgdmFsdWUgbXVzdCBmb2xsb3cgdGhpcyBmb3JtYXQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcInVzZXJuYW1lXCI6IFwiPHVzZXJuYW1lPlwiLCBcInBhc3N3b3JkXCI6IFwiPHBhc3N3b3JkPlwiIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFRoaXMgcHJvcCBzb2x2ZXMgdGhlIGZvbGxvd2luZyB1c2UtY2FzZTpcbiAgICogLSBZb3Ugd2FudCB0byBkbyBDb2duaXRvIHVzZXIgcG9vbCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgQVBJIEdhdGV3YXlcbiAgICogLSBZb3Ugd2FudCBhbiBhZGRpdGlvbmFsIGF1dGggY2hlY2sgaW4gdGhlIGJhY2tlbmQsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggQ29nbml0b1xuICAgKiAgIHRoZXJlXG4gICAqIC0gVGhlIGJhY2tlbmQgdXNlcyBiYXNpYyBhdXRoXG4gICAqXG4gICAqIFRoaXMgcHJvcCBzb2x2ZXMgdGhpcyBieSBsZXR0aW5nIHlvdSBzcGVjaWZ5IGNyZWRlbnRpYWxzIHRvIHBhc3MgdG8gdGhlIGJhY2tlbmQgYWZ0ZXIgQVBJLUdXXG4gICAqIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLiBZb3UgY2FuIHBhc3MgdGhlIGVuY29kZWQgY3JlZGVudGlhbHMgdGhyb3VnaFxuICAgKiB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wcy5tYXBQYXJhbWV0ZXJzfSwgdXNpbmcgdGhlIGBhdXRob3JpemVyLmludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcmBcbiAgICogY29udGV4dCB2YXJpYWJsZSwgbGlrZSBzbzpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZUhlYWRlcihcbiAgICogICAvLyAnQXV0aG9yaXphdGlvbicgaGVhZGVyIGNhbm5vdCBiZSBvdmVycmlkZGVuLCBzbyB3ZSB1c2UgYSBjdXN0b20gaGVhZGVyXG4gICAqICAgXCJYLUludGVybmFsLUF1dGhvcml6YXRpb25cIixcbiAgICogICBhcGlndy5NYXBwaW5nVmFsdWUuY29udGV4dFZhcmlhYmxlKFwiYXV0aG9yaXplci5pbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXJcIiksXG4gICAqIClcbiAgICogYGBgXG4gICAqIFRoZSBiYWNrZW5kIGNhbiB0aGVuIGNoZWNrIHRoZSBgWC1JbnRlcm5hbC1BdXRob3JpemF0aW9uYCBoZWFkZXIuXG4gICAqL1xuICBjcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMuIFRoZSBzZWNyZXQgdmFsdWVcbiAgICogc2hvdWxkIGZvbGxvdyB0aGlzIGZvcm1hdDpcbiAgICogYGBganNvblxuICAgKiB7IFwidXNlcm5hbWVcIjogXCI8dXNlcm5hbWU+XCIsIFwicGFzc3dvcmRcIjogXCI8cGFzc3dvcmQ+XCIgfVxuICAgKiBgYGBcbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBmb3JtYXQgaXMgYWxzbyBzdXBwb3J0ZWQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcImNyZWRlbnRpYWxzXCI6IFwiW1xcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTE+XFxcIixcXFwiPGVuY29kZWQtY3JlZGVudGlhbC0yPlxcXCJdXCIgfVxuICAgKiBgYGBcbiAgICogLi4uY29uc2lzdGluZyBvZjpcbiAgICogLSBBIHNpbmdsZSBrZXksIGBjcmVkZW50aWFsc2BcbiAgICogLSBXaXRoIGEgX3N0cmluZ18gdmFsdWVcbiAgICogLSBXaGljaCBpcyBhIHN0cmluZ2lmaWVkLCBlc2NhcGVkIEpTT04gYXJyYXkgb2YgYmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHNcbiAgICogLSBJbiB3aGljaCBlYWNoIGVsZW1lbnQgaXMgZW5jb2RlZCBmcm9tIGA8dXNlcm5hbWU+OjxwYXNzd29yZD5gXG4gICAqXG4gICAqIElmIHRoZSBzZWNyZXQgaXMgb24gdGhpcyBmb3JtYXQsIHRoZSBhdXRob3JpemVyIHdpbGwgbWF0Y2ggdGhlIHJlcXVlc3QncyBBdXRob3JpemF0aW9uIGhlYWRlclxuICAgKiBhZ2FpbnN0IGFueSBvbmUgb2YgdGhlc2UgZW5jb2RlZCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogVGhlIHJlYXNvbiB0aGF0IHRoaXMgc2Vjb25kIGZvcm1hdCBzdG9yZXMgc3RyaW5naWZpZWQgSlNPTiBfaW5zaWRlXyBKU09OLCBpcyBkdWUgdG8gYVxuICAgKiBsaW1pdGF0aW9uIGluIExpZmxpZydzIGBsb2FkLXNlY3JldHNgIGxpYnJhcnksIHdoaWNoIG9ubHkgYWxsb3dzIHN0b3Jpbmcgc3RyaW5ncyB2YWx1ZXMuXG4gICAqL1xuICBjcmVkZW50aWFsc1NlY3JldE5hbWU6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0ge1xuICB1c2VyUG9vbDogSVVzZXJQb29sXG5cbiAgLyoqXG4gICAqIE5hbWUgb2Ygc2VjcmV0IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgdGhhdCBzdG9yZXMgYmFzaWMgYXV0aCBjcmVkZW50aWFscy4gVGhlIHNlY3JldCB2YWx1ZVxuICAgKiBzaG91bGQgZm9sbG93IHRoaXMgZm9ybWF0OlxuICAgKiBgYGBqc29uXG4gICAqIHsgXCJ1c2VybmFtZVwiOiBcIjx1c2VybmFtZT5cIiwgXCJwYXNzd29yZFwiOiBcIjxwYXNzd29yZD5cIiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGZvcm1hdCBpcyBhbHNvIHN1cHBvcnRlZDpcbiAgICogYGBganNvblxuICAgKiB7IFwiY3JlZGVudGlhbHNcIjogXCJbXFxcIjxlbmNvZGVkLWNyZWRlbnRpYWwtMT5cXFwiLFxcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTI+XFxcIl1cIiB9XG4gICAqIGBgYFxuICAgKiAuLi5jb25zaXN0aW5nIG9mOlxuICAgKiAtIEEgc2luZ2xlIGtleSwgYGNyZWRlbnRpYWxzYFxuICAgKiAtIFdpdGggYSBfc3RyaW5nXyB2YWx1ZVxuICAgKiAtIFdoaWNoIGlzIGEgc3RyaW5naWZpZWQsIGVzY2FwZWQgSlNPTiBhcnJheSBvZiBiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFsc1xuICAgKiAtIEluIHdoaWNoIGVhY2ggZWxlbWVudCBpcyBlbmNvZGVkIGZyb20gYDx1c2VybmFtZT46PHBhc3N3b3JkPmBcbiAgICpcbiAgICogSWYgdGhlIHNlY3JldCBpcyBvbiB0aGlzIGZvcm1hdCwgdGhlIGF1dGhvcml6ZXIgd2lsbCBtYXRjaCB0aGUgcmVxdWVzdCdzIEF1dGhvcml6YXRpb24gaGVhZGVyXG4gICAqIGFnYWluc3QgYW55IG9uZSBvZiB0aGVzZSBlbmNvZGVkIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBUaGUgcmVhc29uIHRoYXQgdGhpcyBzZWNvbmQgZm9ybWF0IHN0b3JlcyBzdHJpbmdpZmllZCBKU09OIF9pbnNpZGVfIEpTT04sIGlzIGR1ZSB0byBhXG4gICAqIGxpbWl0YXRpb24gaW4gTGlmbGlnJ3MgYGxvYWQtc2VjcmV0c2AgbGlicmFyeSwgd2hpY2ggb25seSBhbGxvd3Mgc3RvcmluZyBzdHJpbmdzIHZhbHVlcy5cbiAgICovXG4gIGJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZT86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGFjY2VzcyB0b2tlbiBjbGFpbXMgY29udGFpbiB0aGUgZ2l2ZW4gc2NvcGUuIE9ubHkgYXBwbGljYWJsZSBmb3IgcmVxdWVzdHMgdGhhdFxuICAgKiB1c2UgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgKG5vdCBhcHBsaWNhYmxlIGZvciBiYXNpYyBhdXRoKS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxufVxuXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzID0ge1xuICAvKipcbiAgICogRGVsZXRlIHRoZSBhY2Nlc3MgbG9ncyBpZiB0aGlzIGNvbnN0cnVjdCBpcyBkZWxldGVkP1xuICAgKlxuICAgKiBNYXliZSB5b3Ugd2FudCB0byBERVNUUk9ZIGluc3RlYWQuIE9yIGZvciBsZWdhbCByZWFzb25zLCByZXRhaW4gZm9yIGF1ZGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgKi9cbiAgcmVtb3ZhbFBvbGljeT86IGNkay5SZW1vdmFsUG9saWN5XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIGtlZXAgdGhlIGxvZ3MuIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUgc2FtZSBkZWZhdWx0IGFzIG5ldyBBV1MgbG9nIGdyb3Vwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgUmV0ZW50aW9uRGF5cy5UV09fWUVBUlNcbiAgICovXG4gIHJldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5c1xuXG4gIC8qKlxuICAgKiBBIGN1c3RvbSBKU09OIGxvZyBmb3JtYXQsIHdoaWNoIHVzZXMgdmFyaWFibGVzIGZyb20gYFwiJGNvbnRleHRcImAuXG4gICAqXG4gICAqIFNlZSBbQVdTOiBDbG91ZFdhdGNoIGxvZyBmb3JtYXRzIGZvciBBUEkgR2F0ZXdheV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NldC11cC1sb2dnaW5nLmh0bWwjYXBpZ2F0ZXdheS1jbG91ZHdhdGNoLWxvZy1mb3JtYXRzKVxuICAgKiBmb3IgZm9ybWF0cyBhbmQgcnVsZXMuIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBvdGhlciBmb3JtYXRzIGxpa2UgQ0xGIGFuZCBYTUwsIGJ1dCB0aGlzIGNvbnN0cnVjdFxuICAgKiBvbmx5IHN1cHBvcnRzIEpTT04gZm9yIG5vdy5cbiAgICpcbiAgICogRm9yIGEgbGlzdCBvZiBhbGwgcG9zc2libGUgdmFyaWFibGVzIHRvIGxvZywgc2VlXG4gICAqIFtBV1M6ICRjb250ZXh0IFZhcmlhYmxlcyBmb3IgZGF0YSBtb2RlbHMsIGF1dGhvcml6ZXJzLCBtYXBwaW5nIHRlbXBsYXRlcywgYW5kIENsb3VkV2F0Y2ggYWNjZXNzIGxvZ2dpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9hcGktZ2F0ZXdheS1tYXBwaW5nLXRlbXBsYXRlLXJlZmVyZW5jZS5odG1sI2NvbnRleHQtdmFyaWFibGUtcmVmZXJlbmNlKVxuICAgKiBhbmRcbiAgICogW0FXUzogJGNvbnRleHQgVmFyaWFibGVzIGZvciBhY2Nlc3MgbG9nZ2luZyBvbmx5XShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYXBpLWdhdGV3YXktbWFwcGluZy10ZW1wbGF0ZS1yZWZlcmVuY2UuaHRtbCNjb250ZXh0LXZhcmlhYmxlLXJlZmVyZW5jZS1hY2Nlc3MtbG9nZ2luZy1vbmx5KSAuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0fVxuICAgKi9cbiAgYWNjZXNzTG9nRm9ybWF0PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG4vKipcbiAqIFRoaXMgY29uc3RydWN0IHRyaWVzIHRvIHNpbXBsaWZ5IHRoZSBjcmVhdGlvbiBvZiBhbiBBUEkgR2F0ZXdheSBmb3IgYSBzZXJ2aWNlLCBieSBjb2xsZWN0aW5nIG1vc3RcbiAqIG9mIHRoZSBjb21tb24gc2V0dXAgaGVyZS5cbiAqXG4gKiBUaGUgYXBwcm9hY2ggZm9sbG93ZWQgaW4gdGhpcyBjb25zdHJ1Y3QgaXM6XG4gKiAxLiBPbmUgQVBJLUdXIHBlciBzZXJ2aWNlXG4gKiAyLiBPbmUgc3ViZG9tYWluIHBlciBBUEktR1cgLyBzZXJ2aWNlXG4gKiAzLiBVc2UgSFRUUCBBUEksIG5vdCBSRVNUXG4gKiA0LiBVc2UgYSAkZGVmYXVsdCBzdGFnZSB3aXRoIGF1dG9kZXBsb3lcbiAqIDUuIFN1cHBvcnQgbXVsdGlwbGUgcm91dGVzICh3aXRoIHBvc3NpYmxlIGAve3Byb3h5K31gIHRvIGxldCBhbGwgc3ViLXBhdGhzIHRocm91Z2gpXG4gKiA2LiBBbGxvdyBjdXN0b20gaW50ZWdyYXRpb24vYXV0aG9yaXplciBmb3IgZWFjaCByb3V0ZSwgb3IgZGVmYXVsdHMgZm9yIHRoZSB3aG9sZSBnYXRld2F5XG4gKlxuICogVGhlIHJvdXRlIGludGVncmF0aW9uIGlzIG9uZSBvZiB0aGVzZTpcbiAqIC0gQUxCIHByaXZhdGUgaW50ZWdyYXRpb24gd2l0aCBWUEMgTGluayB1c2luZyBIVFRQUyB0byB0aGUgQUxCXG4gKiAtIExhbWJkYSBpbnRlZ3JhdGlvblxuICogLSBTUVMgaW50ZWdyYXRpb25cbiAqXG4gKiAjIyMgTG9hZCBCYWxhbmNlciBTZWN1cml0eSBHcm91cFxuICpcbiAqIE5vdGUgdGhhdCB0aGUgbG9hZCBiYWxhbmNlciB1c2VkIGluIGFuIHtAbGluayBBbGJJbnRlZ3JhdGlvblByb3BzfSBtdXN0IGFsbG93IG91dGJvdW5kIEhUVFBTXG4gKiB0cmFmZmljIHRvIGl0cyBTZWN1cml0eUdyb3VwLiBPdGhlcndpc2UsIHRoZSBWUEMgTGluayB1c2VkIGJ5IHRoZSBBUEktR1cgY2FuJ3QgZ2V0IHRyYWZmaWMgZnJvbVxuICogdGhlIEFMQi5cbiAqXG4gKiBgYGBcbiAqIGNvbnN0IGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAoLi4uLCB7XG4gKiAgIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlLFxuICogfSlcbiAqXG4gKiBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLmFkZEVncmVzc1J1bGUoXG4gKiAgIGxvYWRCYWxhbmNlclNlY3VyaXR5R3JvdXAsXG4gKiAgIGVjMi5Qb3J0LnRjcCg0NDMpLFxuICogICBcIk91dGJvdW5kIHRvIHNlbGYgZm9yIEFMQiB0byBBUEktR1cgVlBDLUxpbmtcIixcbiAqIClcbiAqXG4gKiBjb25zdCBsb2FkQmFsYW5jZXIgPSBuZXcgbGlmbGlnTG9hZEJhbGFuY2VyLkxvYWRCYWxhbmNlciguLi4sXG4gKiAgIHtcbiAqICAgICBvdmVycmlkZUxvYWRCYWxhbmNlclByb3BzOiB7XG4gKiAgICAgICBzZWN1cml0eUdyb3VwOiBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICogICAgIH0sXG4gKiAgIH0sXG4gKiApXG4gKiBgYGBcbiAqXG4gKiBAdGVtcGxhdGUgQXV0aFNjb3Blc1QgVGhpcyB0eXBlIHBhcmFtZXRlciBhbGxvd3MgeW91IHRvIGltcHJvdmUgdHlwZSBzYWZldHkgb24gdGhlXG4gKiBgcmVxdWlyZWRTY29wZWAgZmllbGQgb24ge0BsaW5rIENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzfSwgYnkgbmFycm93aW5nIHRoZSB0eXBlXG4gKiB0byBzcGVjaWZpYyBzdHJpbmdzLiBZb3UgY2FuIHRoZW4gZXh0ZW5kIHRoZSBgQXBpR2F0ZXdheWAgd2l0aCB0aGlzIHR5cGUgdG8gZW5mb3JjZSB0aG9zZSBzY29wZXNcbiAqIGFjcm9zcyB0aGUgYXBwbGljYXRpb24uIFJlbWVtYmVyIHRoYXQgYXV0aCBzY29wZXMgbXVzdCBiZSBvbiB0aGUgZm9ybWF0XG4gKiBge3Jlc291cmNlIHNlcnZlciBpZGVudGlmaWVyfS97c2NvcGUgbmFtZX1gLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIHR5cGUgQXV0aFNjb3BlcyA9IFwiZXh0ZXJuYWwvcmVhZF91c2Vyc1wiIHwgXCJpbnRlcm5hbC9jcmVhdGVfdXNlcnNcIlxuICpcbiAqIGV4cG9ydCBjbGFzcyBNeVByb2plY3RBcGlHYXRld2F5IGV4dGVuZHMgQXBpR2F0ZXdheTxBdXRoU2NvcGVzPiB7fVxuICogYGBgXG4gKiBUeXBlU2NyaXB0IHdpbGwgdGhlbiBlbmZvcmNlIHRoYXQgYHJlcXVpcmVkU2NvcGVgIGlzIG9uZSBvZiBgQXV0aFNjb3Blc2AsIGFuZCBwcm92aWRlXG4gKiBhdXRvLWNvbXBsZXRlLlxuICpcbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqIEBhdXRob3IgSGVybWFubiBNw7hya3JpZCA8aGVtQGxpZmxpZy5ubz5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUdhdGV3YXk8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqIFRoZSBBUEkgR2F0ZXdheSBIVFRQIEFQSS4gVGhpcyBpcyB0aGUgbWFpbiBjb25zdHJ1Y3QgZm9yIEFQSS1HVy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGh0dHBBcGk6IGFwaWd3Lkh0dHBBcGlcblxuICAvKiogVGhlIHJvdXRlcyB3aGljaCBjb25uZWN0IHRoZSB7QGxpbmsgaHR0cEFwaX0gdG8gdGhlIGJhY2tlbmQgaW50ZWdyYXRpb24ocykuICovXG4gIHB1YmxpYyByZWFkb25seSByb3V0ZXM6IGFwaWd3Lkh0dHBSb3V0ZVtdID0gW11cblxuICAvKiogVGhlIGRvbWFpbiB3aGljaCBjb25zdW1lcnMgbXVzdCB1c2UuKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nXG5cbiAgLyoqIEFjY2VzcyBsb2cgZ3JvdXAuICovXG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5Mb2dHcm91cFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IEFwaUdhdGV3YXlQcm9wczxBdXRoU2NvcGVzVD5cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXBpR2F0ZXdheVByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgQXBpR2F0ZXdheS52YWxpZGF0ZVByb3BzKHByb3BzLCBpZCwgY2RrLlN0YWNrLm9mKHRoaXMpKVxuXG4gICAgY29uc3QgY3VzdG9tRG9tYWluID0gbmV3IEN1c3RvbURvbWFpbih0aGlzLCBcIkN1c3RvbURvbWFpblwiLCBwcm9wcy5kbnMpXG4gICAgdGhpcy5kb21haW4gPSBjdXN0b21Eb21haW4uY3VzdG9tRG9tYWluTmFtZVxuXG4gICAgbGV0IGNvcnNPcHRpb25zOiBhcGlndy5Db3JzUHJlZmxpZ2h0T3B0aW9ucyB8IHVuZGVmaW5lZFxuICAgIGlmIChwcm9wcy5jb3JzQWxsb3dBbGwpIHtcbiAgICAgIGNvcnNPcHRpb25zID0ge1xuICAgICAgICBhbGxvd09yaWdpbnM6IFtcIipcIl0sXG4gICAgICAgIC8vIFwiVGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIGNhbid0IGJlIHdpbGRjYXJkZWQgYW5kIGFsd2F5cyBuZWVkcyB0byBiZSBsaXN0ZWQgZXhwbGljaXRseVwiXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9BY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZSBtYXkgYWxzbyByZXF1aXJlIGV4cGxpY2l0IHdoaXRlbGlzdGluZzogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzYzNTY3NjQ3XG4gICAgICAgIGFsbG93SGVhZGVyczogW1wiQXV0aG9yaXphdGlvblwiLCBcIkNvbnRlbnQtVHlwZVwiLCBcIipcIl0sXG4gICAgICAgIC8vIE5vdCB1c2luZyAnKicgaGVyZSwgYmVjYXVzZSBcIkluIHJlcXVlc3RzIHdpdGggY3JlZGVudGlhbHMsIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIGxpdGVyYWxcbiAgICAgICAgLy8gbWV0aG9kIG5hbWUgJyonIHdpdGhvdXQgc3BlY2lhbCBzZW1hbnRpY3NcIlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1xuICAgICAgICBhbGxvd01ldGhvZHM6IFtcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5HRVQsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUEFUQ0gsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLk9QVElPTlMsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuSEVBRCxcbiAgICAgICAgXSxcbiAgICAgICAgbWF4QWdlOiBjZGsuRHVyYXRpb24uZGF5cygxKSxcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgYWN0dWFsIEFQSS4gVGhpcyBob2xkcyB0aGUgcm91dGVzLCBhdXRob3JpemVycyBhbmQgaW50ZWdyYXRpb25zLlxuICAgIGNvbnN0IGFwaSA9IG5ldyBhcGlndy5IdHRwQXBpKHRoaXMsIFwiSHR0cEFwaS1cIiArIHByb3BzLmRucy5zdWJkb21haW4sIHtcbiAgICAgIC8vIGRlZmF1bHRJbnRlZ3JhdGlvbjogZGVmYXVsdEludGVncmF0aW9uLCAvLyBUaGlzIGlzIGZvciBhIGNhdGNoLWFsbCAkZGVmYXVsdCByb3V0ZVxuICAgICAgZGVzY3JpcHRpb246IGBBbiBIVFRQIEFQSSBmb3IgJHtwcm9wcy5kbnMuc3ViZG9tYWlufS4ke3Byb3BzLmRucy5ob3N0ZWRab25lLnpvbmVOYW1lfS5gLFxuICAgICAgZGlzYWJsZUV4ZWN1dGVBcGlFbmRwb2ludDogdHJ1ZSwgLy8gRm9yY2UgZXh0ZXJuYWxzIHRvIGdvIHRocm91Z2ggY3VzdG9tIGRvbWFpbi4gTVVTVCBiZSB0cnVlIHdoZW4gdXNpbmcgTXV0dWFsIFRMUywgZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgIGNyZWF0ZURlZmF1bHRTdGFnZTogdHJ1ZSxcbiAgICAgIGRlZmF1bHREb21haW5NYXBwaW5nOiB7IGRvbWFpbk5hbWU6IGN1c3RvbURvbWFpbi5hcGlHd0N1c3RvbURvbWFpbiB9LFxuICAgICAgY29yc1ByZWZsaWdodDogY29yc09wdGlvbnMsXG4gICAgICAuLi5wcm9wcz8ucHJvcHNPdmVycmlkZT8uaHR0cEFwaSxcbiAgICB9KVxuICAgIHRoaXMuaHR0cEFwaSA9IGFwaVxuXG4gICAgY29uc3Qgc3RhZ2UgPSBhcGkuZGVmYXVsdFN0YWdlPy5ub2RlLmRlZmF1bHRDaGlsZCBhcyBhcGlndy5DZm5TdGFnZVxuXG4gICAgY29uc3QgbG9ncyA9IG5ldyBBcGlHYXRld2F5QWNjZXNzTG9ncyhcbiAgICAgIHRoaXMsXG4gICAgICBcIkFjY2Vzc0xvZ3NcIixcbiAgICAgIHN0YWdlLFxuICAgICAgcHJvcHMuYWNjZXNzTG9ncyxcbiAgICAgIGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQsXG4gICAgKVxuICAgIHRoaXMubG9nR3JvdXAgPSBsb2dzLmxvZ0dyb3VwXG5cbiAgICBzdGFnZS5kZWZhdWx0Um91dGVTZXR0aW5ncyA9IHtcbiAgICAgIC4uLnN0YWdlLmRlZmF1bHRSb3V0ZVNldHRpbmdzLFxuICAgICAgZGV0YWlsZWRNZXRyaWNzRW5hYmxlZDogcHJvcHMuZGV0YWlsZWRNZXRyaWNzID8/IHRydWUsXG4gICAgICB0aHJvdHRsaW5nQnVyc3RMaW1pdDogcHJvcHMudGhyb3R0bGluZz8uYnVyc3QsIC8vIERlZmF1bHQgZm9yIGFjY291bnQgaXMgNV8wMDBcbiAgICAgIHRocm90dGxpbmdSYXRlTGltaXQ6IHByb3BzLnRocm90dGxpbmc/LnJhdGUsIC8vIERlZmF1bHQgZm9yIGFjY291bnQgaXMgMTBfMDAwXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEludGVncmF0aW9uID0gcHJvcHMuZGVmYXVsdEludGVncmF0aW9uXG4gICAgICA/IHRoaXMuY3JlYXRlSW50ZWdyYXRpb24ocHJvcHMuZGVmYXVsdEludGVncmF0aW9uLCBwcm9wcy5kbnMpXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZGVmYXVsdEF1dGhvcml6ZXIgPSBwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvblxuICAgICAgPyB0aGlzLmNyZWF0ZUF1dGhvcml6ZXIoXCJEZWZhdWx0QXV0aG9yaXplclwiLCBwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHByb3BzLnJvdXRlcykge1xuICAgICAgbGV0IGludGVncmF0aW9uOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvblxuICAgICAgaWYgKHJvdXRlLmludGVncmF0aW9uKSB7XG4gICAgICAgIGludGVncmF0aW9uID0gdGhpcy5jcmVhdGVJbnRlZ3JhdGlvbihyb3V0ZS5pbnRlZ3JhdGlvbiwgcHJvcHMuZG5zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW50ZWdyYXRpb24gPSBkZWZhdWx0SW50ZWdyYXRpb24hIC8vIFZlcmlmaWVkIGluIHZhbGlkYXRlUHJvcHNcbiAgICAgIH1cblxuICAgICAgbGV0IGF1dGhvcml6ZXI6IGFwaWd3LklIdHRwUm91dGVBdXRob3JpemVyIHwgdW5kZWZpbmVkXG4gICAgICBpZiAocm91dGUuYXV0aG9yaXphdGlvbikge1xuICAgICAgICBhdXRob3JpemVyID0gdGhpcy5jcmVhdGVBdXRob3JpemVyKFxuICAgICAgICAgIC8vIFVzaW5nIHRoZSByb3V0ZSBwYXRoIGhlcmUgY2F1c2VkIENsb3VkRm9ybWF0aW9uIHRvIGZhaWwgZHVlIHRvIHJlc291cmNlIG5hbWVzIGJlaW5nIHRvb1xuICAgICAgICAgIC8vIGxvbmcuIFRoZXJlZm9yZSwgd2Ugbm93IGhhc2ggdGhlIHJvdXRlIHBhdGggdG8gZ2V0IGEgc2hvcnRlciBuYW1lLlxuICAgICAgICAgIGBSb3V0ZUF1dGhvcml6ZXIke3Nob3J0SGFzaChgJHtyb3V0ZS5tZXRob2QgPz8gXCJcIn0ke3JvdXRlLnBhdGh9YCl9YCxcbiAgICAgICAgICByb3V0ZS5hdXRob3JpemF0aW9uLFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdXRob3JpemVyID0gZGVmYXVsdEF1dGhvcml6ZXJcbiAgICAgIH1cblxuICAgICAgY29uc3Qgcm91dGVQYXRocyA9IFtyb3V0ZS5wYXRoXVxuICAgICAgaWYgKHJvdXRlLmluY2x1ZGVTdWJwYXRocyA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBJZiB3ZSBpbmNsdWRlIHN1Yi1wYXRocywgd2UgYWRkIGFuIGFkZGl0aW9uYWwgcm91dGUgd2l0aCAve3Byb3h5K30gKHRoZSArIG1lYW5zIGl0IHdpbGxcbiAgICAgICAgLy8gbWF0Y2ggYWxsIHN1YnJvdXRlcykuIFdlIHdhbnQgYm90aCB0aGlzIHJvdXRlIGFuZCB0aGUgbm9ybWFsIHJvdXRlIHdpdGhvdXQgL3twcm94eSt9LFxuICAgICAgICAvLyBzaW5jZSAve3Byb3h5K30gd2lsbCBvbmx5IG1hdGNoIHRoZSBiYXNlIHBhdGggd2l0aCB0cmFpbGluZyBzbGFzaC5cbiAgICAgICAgcm91dGVQYXRocy5wdXNoKFxuICAgICAgICAgIHJvdXRlLnBhdGggKyAocm91dGUucGF0aCA9PT0gXCIvXCIgPyBcIlwiIDogXCIvXCIpICsgXCJ7cHJveHkrfVwiLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGVQYXRoIG9mIHJvdXRlUGF0aHMpIHtcbiAgICAgICAgLy8gVGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIEFQSSBHYXRld2F5IGNvbnN0cnVjdCBoYWQgYSBzaW5nbGUgcm91dGUgd2l0aCB0aGUgSURcbiAgICAgICAgLy8gJ0RlZmF1bHRQcm94eVJvdXRlJywgYW5kIGFsbCBnYXRld2F5cyB3ZSB1c2VkIGV4cG9zZWQgdGhlIHJvdXRlIC97cHJveHkrfS4gV2hlbiB0cnlpbmcgdG9cbiAgICAgICAgLy8gY2hhbmdlIHRvIHRoaXMgbmV3IHZlcnNpb24gb2YgdGhlIGNvbnN0cnVjdCwgZGVwbG95bWVudCBmYWlsZWQgZm9yIGdhdGV3YXlzIGV4cG9zaW5nXG4gICAgICAgIC8vIC97cHJveHkrfSwgYmVjYXVzZSBcImEgcm91dGUgd2l0aCB0aGF0IGtleSBbaS5lLiBwYXRoICsgbWV0aG9kXSBhbHJlYWR5IGV4aXN0c1wiLiBXZSB0aGlua1xuICAgICAgICAvLyB0aGlzIG1heSBiZSBiZWNhdXNlIHdlIHVzZWQgdGhlIHNhbWUgcm91dGUgcGF0aCwgYnV0IHdpdGggYSBuZXcgcm91dGUgSUQsIGNhdXNpbmdcbiAgICAgICAgLy8gY29uZnVzaW9uIGZvciBDbG91ZEZvcm1hdGlvbi4gU28gd2Uga2VlcCB0aGUgb2xkIHJvdXRlIElEIGhlcmUgZm9yIC97cHJveHkrfS5cbiAgICAgICAgY29uc3Qgcm91dGVJZCA9XG4gICAgICAgICAgcm91dGVQYXRoID09PSBcIi97cHJveHkrfVwiID8gXCJEZWZhdWx0UHJveHlSb3V0ZVwiIDogYFJvdXRlLSR7cm91dGVQYXRofWBcblxuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKFxuICAgICAgICAgIG5ldyBhcGlndy5IdHRwUm91dGUodGhpcywgcm91dGVJZCwge1xuICAgICAgICAgICAgaHR0cEFwaTogYXBpLFxuICAgICAgICAgICAgaW50ZWdyYXRpb246IGludGVncmF0aW9uLFxuICAgICAgICAgICAgYXV0aG9yaXplcjogYXV0aG9yaXplcixcbiAgICAgICAgICAgIHJvdXRlS2V5OiBhcGlndy5IdHRwUm91dGVLZXkud2l0aChcbiAgICAgICAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICAgICAgICByb3V0ZS5tZXRob2RcbiAgICAgICAgICAgICAgICA/IGFwaWd3Lkh0dHBNZXRob2Rbcm91dGUubWV0aG9kXVxuICAgICAgICAgICAgICAgIDogYXBpZ3cuSHR0cE1ldGhvZC5BTlksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFnUmVzb3VyY2VzKHRoaXMsICgpID0+ICh7IHNlcnZpY2U6IHByb3BzLmRucy5zdWJkb21haW4gfSkpXG4gIH1cblxuICAvKiogQHRocm93cyBFcnJvciAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZVByb3BzKFxuICAgIHByb3BzOiBBcGlHYXRld2F5UHJvcHMsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdGFjazogY2RrLlN0YWNrLFxuICApIHtcbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHByb3BzLnJvdXRlcykge1xuICAgICAgaWYgKCFyb3V0ZS5pbnRlZ3JhdGlvbiAmJiAhcHJvcHMuZGVmYXVsdEludGVncmF0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm8gaW50ZWdyYXRpb24gZGVmaW5lZCBmb3Igcm91dGUgJyR7cm91dGUucGF0aH0nLCBhbmQgbm8gZGVmYXVsdCBpbnRlZ3JhdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBnYXRld2F5YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKCFyb3V0ZS5hdXRob3JpemF0aW9uICYmICFwcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vIGF1dGhvcml6YXRpb24gZGVmaW5lZCBmb3Igcm91dGUgJyR7cm91dGUucGF0aH0nLCBhbmQgbm8gZGVmYXVsdCBhdXRob3JpemF0aW9uIHNwZWNpZmllZCBmb3IgdGhlIGdhdGV3YXlgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoIXJvdXRlLnBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHBhdGggJyR7cm91dGUucGF0aH0nOiBwYXRocyBtdXN0IGJlZ2luIHdpdGggJy8nICh1c2UgJy8nIGZvciByb290IHBhdGgpYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKHJvdXRlLnBhdGggIT09IFwiL1wiICYmIHJvdXRlLnBhdGguZW5kc1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBwYXRoICcke3JvdXRlLnBhdGh9JzogcGF0aHMgY2Fubm90IGVuZCB3aXRoICcvJyAoZXhjZXB0IHJvb3QgcGF0aClgLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHJvdXRlLmludGVncmF0aW9uPy50eXBlID09PSBcIkFMQlwiICYmXG4gICAgICAgIHJvdXRlLmludGVncmF0aW9uLmhvc3ROYW1lLnN0YXJ0c1dpdGgoXCJodHRwczpcIilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSBhbGJJbnRlZ3JhdGlvbi5ob3N0SHR0cHNOYW1lIHNob3VsZCBub3QgaW5jbHVkZSBhIHByb3RvY29sOiAke3JvdXRlLmludGVncmF0aW9uLmhvc3ROYW1lfWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmRucy5zdWJkb21haW4gPT09IFwiXCIgfHwgcHJvcHMuZG5zLnN1YmRvbWFpbi5pbmNsdWRlcyhcIiBcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN1YmRvbWFpbiBtdXN0IGJlIHNldCwgYW5kIG5vdCBjb250YWluIHNwYWNlczogJHtwcm9wcy5kbnMuc3ViZG9tYWlufWAsXG4gICAgICApXG4gICAgfVxuICAgIGlmIChwcm9wcy50aHJvdHRsaW5nPy5idXJzdCAmJiBwcm9wcy50aHJvdHRsaW5nLmJ1cnN0ID4gNV8wMDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKaoO+4jyBZb3VyIHRocm90dGxpbmcgYnVyc3QgbGltaXQgJyR7cHJvcHMudGhyb3R0bGluZy5idXJzdH0nIGlzIGhpZ2hlciB0aGFuIHRoZSBBV1MgQWNjb3VudCBsaW1pdC4gTWFrZSBzdXJlIHlvdXIgYWNjb3VudCBoYXMgdXBncmFkZWQgdGhpcyBxdW90YSEgYCxcbiAgICAgICAgc3RhY2ssXG4gICAgICAgIGlkLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAocHJvcHMudGhyb3R0bGluZz8ucmF0ZSAmJiBwcm9wcy50aHJvdHRsaW5nLnJhdGUgPiAxMF8wMDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYOKaoO+4jyBZb3VyIHRocm90dGxpbmcgcmF0ZSBsaW1pdCAnJHtwcm9wcy50aHJvdHRsaW5nLnJhdGV9JyBpcyBoaWdoZXIgdGhhbiB0aGUgQVdTIEFjY291bnQgbGltaXQuIE1ha2Ugc3VyZSB5b3VyIGFjY291bnQgaGFzIHVwZ3JhZGVkIHRoaXMgcXVvdGEhIGAsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBpZCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGF1dGhvcml6ZXIgb25seSBhY2NlcHRzIHJlcXVlc3RzIGZyb20gZXh0ZXJuYWwgdXNlcnMgdGhhdCBhcmUgYXV0aG9yaXplZC5cbiAgICogVW5hdXRob3JpemVkIHVzZXJzIGFyZSBzdG9wcGVkIGluIHRoZSBBUEktR1csIGFuZCBub3QgZm9yd2FyZGVkIHRvIHRoZSBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQXV0aG9yaXplcjxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZz4oXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdXRob3JpemF0aW9uOiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApOiBhcGlndy5JSHR0cFJvdXRlQXV0aG9yaXplciB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChhdXRob3JpemF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJOT05FXCI6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgY2FzZSBcIklBTVwiOiB7XG4gICAgICAgIC8vIEFQSSBHYXRld2F5IGludm9rZXMgeW91ciBBUEkgcm91dGUgb25seSBpZiB0aGUgY2xpZW50IGhhcyBleGVjdXRlLWFwaSBwZXJtaXNzaW9uIGZvciB0aGUgcm91dGUuXG4gICAgICAgIC8vIFRoZSBjbGllbnQgaGFzIHRvIHVzZSBBV1MgU2lnVjQgdG8gaWRlbnRpZnkgdGhlbXNlbHZlcyBpbiB0aGUgcmVxdWVzdC5cbiAgICAgICAgLy8gUmVhZCB0aGlzIHBhZ2UgZm9yIGhlbHAgd2l0aCBJQU0gYW5kIEFQSS1HVyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvc2VjdXJpdHlfaWFtX3NlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgICAgICAvLyBOb3RlIHRoYXQgW3Jlc291cmNlIHBvbGljaWVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCBmb3IgSFRUUF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWFjY2Vzcy1jb250cm9sLWlhbS5odG1sKVxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBJYW1BdXRob3JpemVyKClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJDT0dOSVRPX1VTRVJfUE9PTFwiOiB7XG4gICAgICAgIC8vIFdlIHVzZSBhIGN1c3RvbSBsYW1iZGEgYXV0aG9yaXplciBoZXJlIGluc3RlYWQgb2YgdGhlIGBIdHRwVXNlclBvb2xBdXRob3JpemVyYCBwcm92aWRlZFxuICAgICAgICAvLyBieSBDREssIGluIG9yZGVyIHRvIHN1cHBvcnQgYHJlcXVpcmVkU2NvcGVgIGFuZCBzZXR0aW5nIG9mIGN1c3RvbSBjb250ZXh0IHZhcmlhYmxlcy5cbiAgICAgICAgY29uc3QgYXV0aG9yaXplciA9IG5ldyBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2FzZSBcIkJBU0lDX0FVVEhcIjoge1xuICAgICAgICBjb25zdCBhdXRob3JpemVyID0gbmV3IEJhc2ljQXV0aEF1dGhvcml6ZXIoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBpZCArIFwiTGFtYmRhXCIsXG4gICAgICAgICAgYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiBuZXcgYXV0aG9yaXplcnMuSHR0cExhbWJkYUF1dGhvcml6ZXIoaWQsIGF1dGhvcml6ZXIubGFtYmRhLCB7XG4gICAgICAgICAgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplci5yZXNwb25zZVR5cGVzLFxuICAgICAgICAgIC8vIE1heCAxaCwgb3IgZGlzYWJsZWQgKDBzKS4gVGhlIHZhbHVlIG9ubHkgbWF0dGVycyB3aGVuIGludmFsaWRhdGluZy9keW5hbWljIGNyZWRlbnRpYWxzXG4gICAgICAgICAgcmVzdWx0c0NhY2hlVHRsOiBjZGsuRHVyYXRpb24ubWludXRlcygzMCksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjYXNlIFwiQ09HTklUT19VU0VSX1BPT0xfT1JfQkFTSUNfQVVUSFwiOiB7XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBuZXcgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLmhvdXJzKDEpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW50ZWdyYXRpb24oXG4gICAgaW50ZWdyYXRpb246IEludGVncmF0aW9uUHJvcHMsXG4gICAgZG5zOiBBcGlHYXRld2F5UHJvcHNbXCJkbnNcIl0sXG4gICk6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uIHtcbiAgICBzd2l0Y2ggKGludGVncmF0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJBTEJcIjoge1xuICAgICAgICAvLyBUaGUgVlBDTGluayBjb25uZWN0cyB0aGUgaW50ZWdyYXRpb24gaW50byB0aGUgQUxCJ3MgVlBDLiBNdXN0IGJlIG1hbnVhbGx5IGNyZWF0ZWQgd2hlblxuICAgICAgICAvLyB0aGUgVlBDIGlzIGltcG9ydGVkLCB3aGljaCBpcyB0aGUgY2FzZSB3aGVuIHVzaW5nIENvcmVQbGF0Zm9ybUNvbnN1bWVyLlxuICAgICAgICBjb25zdCB2cGNMaW5rID0gbmV3IGFwaWd3LlZwY0xpbmsodGhpcywgXCJBbGJWcGNMaW5rXCIsIHtcbiAgICAgICAgICB2cGM6IGludGVncmF0aW9uLnZwYyxcbiAgICAgICAgICBzZWN1cml0eUdyb3VwczogW2ludGVncmF0aW9uLnNlY3VyaXR5R3JvdXBdLFxuICAgICAgICAgIHN1Ym5ldHM6IGludGVncmF0aW9uLnZwYy5zZWxlY3RTdWJuZXRzKCksIC8vIFRoaXMgY29ycmVjdGx5IHNlbGVjdHMgdGhlIHByaXZhdGUgc3VibmV0c1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgYXBpZ3cuUGFyYW1ldGVyTWFwcGluZygpXG4gICAgICAgICAgLyoqIFNlZSB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wcy5ob3N0TmFtZX0gKi9cbiAgICAgICAgICAub3ZlcndyaXRlSGVhZGVyKFxuICAgICAgICAgICAgXCJIb3N0XCIsXG4gICAgICAgICAgICAvLyBUaGUgSG9zdCBoZWFkZXIgY2FuIE5PVCB1c2UgZHluYW1pYyBtYXBwaW5nLCBsaWtlICRjb250ZXh0LmRvbWFpbk5hbWUgZXRjLlxuICAgICAgICAgICAgYXBpZ3cuTWFwcGluZ1ZhbHVlLmN1c3RvbShpbnRlZ3JhdGlvbi5ob3N0TmFtZSksXG4gICAgICAgICAgKVxuICAgICAgICBpZiAoaW50ZWdyYXRpb24ubWFwUGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaW50ZWdyYXRpb24ubWFwUGFyYW1ldGVycyhwYXJhbWV0ZXJNYXBwaW5nKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbnMuSHR0cEFsYkludGVncmF0aW9uKFxuICAgICAgICAgIFwiQWxiSW50ZWdyYXRpb24tXCIgKyBkbnMuc3ViZG9tYWluLFxuICAgICAgICAgIGludGVncmF0aW9uLmxvYWRCYWxhbmNlckxpc3RlbmVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNlY3VyZVNlcnZlck5hbWU6IGludGVncmF0aW9uLmhvc3ROYW1lLFxuICAgICAgICAgICAgdnBjTGluazogdnBjTGluayxcbiAgICAgICAgICAgIG1ldGhvZDogYXBpZ3cuSHR0cE1ldGhvZC5BTlksXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJMYW1iZGFcIjoge1xuICAgICAgICByZXR1cm4gbmV3IGludGVncmF0aW9ucy5IdHRwTGFtYmRhSW50ZWdyYXRpb24oXG4gICAgICAgICAgXCJMYW1iZGFJbnRlZ3JhdGlvblwiLFxuICAgICAgICAgIGludGVncmF0aW9uLmxhbWJkYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXlsb2FkRm9ybWF0VmVyc2lvbjogYXBpZ3cuUGF5bG9hZEZvcm1hdFZlcnNpb24uVkVSU0lPTl8yXzAsXG4gICAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY2FzZSBcIlNRU1wiOiB7XG4gICAgICAgIC8vIEFQSS1HVyBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBTUVMgYnkgZGVmYXVsdFxuICAgICAgICBjb25zdCByb2xlID0gbmV3IGlhbS5Sb2xlKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYEFwaUd3VG8ke2ludGVncmF0aW9uLnF1ZXVlLm5vZGUuaWR9U2VydmljZVJvbGVgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICBcIkFsbG93cyBBUEktR1cgdG8gYWRkIG1lc3NhZ2VzIHRvIFwiICsgaW50ZWdyYXRpb24ucXVldWUucXVldWVBcm4sXG4gICAgICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICAgIGludGVncmF0aW9uLnF1ZXVlLmdyYW50U2VuZE1lc3NhZ2VzKHJvbGUpXG5cbiAgICAgICAgbGV0IHBhcmFtZXRlck1hcHBpbmcgPSBuZXcgYXBpZ3cuUGFyYW1ldGVyTWFwcGluZygpXG4gICAgICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWRldmVsb3AtaW50ZWdyYXRpb25zLWF3cy1zZXJ2aWNlcy1yZWZlcmVuY2UuaHRtbCNTUVMtU2VuZE1lc3NhZ2VcbiAgICAgICAgICAuY3VzdG9tKFwiUXVldWVVcmxcIiwgaW50ZWdyYXRpb24ucXVldWUucXVldWVVcmwpXG4gICAgICAgICAgLmN1c3RvbShcIk1lc3NhZ2VCb2R5XCIsIFwiJHJlcXVlc3QuYm9keVwiKVxuICAgICAgICAgIC5jdXN0b20oXCJSZWdpb25cIiwgXCJldS13ZXN0LTFcIikgLy8gQ2hhbmdlIHRoaXMgaWYgdGhlIFNRUyBxdWV1ZSBpcyBpbiBhbm90aGVyIHJlZ2lvbiFcblxuICAgICAgICBpZiAoaW50ZWdyYXRpb24ubWVzc2FnZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nID0gcGFyYW1ldGVyTWFwcGluZy5jdXN0b20oXG4gICAgICAgICAgICBcIk1lc3NhZ2VBdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShpbnRlZ3JhdGlvbi5tZXNzYWdlQXR0cmlidXRlcyksXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTcXNSb3V0ZUludGVncmF0aW9uKFwiU3FzSW50ZWdyYXRpb25cIiwge1xuICAgICAgICAgIHR5cGU6IGFwaWd3Lkh0dHBJbnRlZ3JhdGlvblR5cGUuQVdTX1BST1hZLFxuICAgICAgICAgIHN1YnR5cGU6IGFwaWd3Lkh0dHBJbnRlZ3JhdGlvblN1YnR5cGUuU1FTX1NFTkRfTUVTU0FHRSxcbiAgICAgICAgICBjcmVkZW50aWFsczogYXBpZ3cuSW50ZWdyYXRpb25DcmVkZW50aWFscy5mcm9tUm9sZShyb2xlKSxcbiAgICAgICAgICBwYXJhbWV0ZXJNYXBwaW5nOiBwYXJhbWV0ZXJNYXBwaW5nLFxuICAgICAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiBhcGlndy5QYXlsb2FkRm9ybWF0VmVyc2lvbi5WRVJTSU9OXzFfMCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGEgZ3JhbnRhYmxlIHRhcmdldCAocm9sZSwgdXNlciBldGMuKSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGUgQVBJLlxuICAgKiBPbmx5IHdvcmtzIHdoZW4gdXNpbmcgYElBTWAgYXMge0BsaW5rIEFwaUdhdGV3YXlSb3V0ZS5hdXRob3JpemF0aW9ufS5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCBBIGdyYW50YWJsZSwgbGlrZSB7QGxpbmsgaWFtLlJvbGV9XG4gICAqL1xuICBwdWJsaWMgZ3JhbnRJbnZva2UodGFyZ2V0OiBpYW0uSUdyYW50YWJsZSkge1xuICAgIGZvciAoY29uc3Qgcm91dGVQcm9wcyBvZiB0aGlzLnByb3BzLnJvdXRlcykge1xuICAgICAgY29uc3QgYXV0aFR5cGUgPVxuICAgICAgICByb3V0ZVByb3BzLmF1dGhvcml6YXRpb24/LnR5cGUgPz8gdGhpcy5wcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbj8udHlwZVxuXG4gICAgICBpZiAoYXV0aFR5cGUgIT09IFwiSUFNXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZ3JhbnQgaW52b2tlIGZvciBhbiBBUEkgR2F0ZXdheSB3aGVuIG5vdCB1c2luZyBJQU0gYXV0aCAoZm91bmQgYXV0aCAnJHthdXRoVHlwZX0nIG9uIHJvdXRlICcke3JvdXRlUHJvcHMucGF0aH0nKSBbJHtjZGsuU3RhY2sub2YodGhpcykuc3RhY2tOYW1lfV1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiB0aGlzLnJvdXRlcykge1xuICAgICAgcm91dGUuZ3JhbnRJbnZva2UodGFyZ2V0KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gZG9tYWluIGZvciB0aGUgQVBJLUdhdGV3YXksIGEgUm91dGU1MyByZWNvcmQgYW5kIGFuIEhUVFBTIGNlcnQuXG4gKiBAYXV0aG9yIEtyaXN0aWFuIFJla3N0YWQgPGtyZUBjYXByYWNvbnN1bHRpbmcubm8+XG4gKi9cbmNsYXNzIEN1c3RvbURvbWFpbiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwaUd3Q3VzdG9tRG9tYWluOiBhcGlndy5Eb21haW5OYW1lXG5cbiAgLyoqIFRoZSBGdWxseSBRdWFsaWZpZWQgRG9tYWluIE5hbWUgKEZRRE4pIGxpa2UgYHByb2R1Y3QucGxhdGZvcm0uZXhhbXBsZS5ub2AuICovXG4gIHB1YmxpYyByZWFkb25seSBjdXN0b21Eb21haW5OYW1lOiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQXBpR2F0ZXdheURuc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG4gICAgdGhpcy5jdXN0b21Eb21haW5OYW1lID0gYCR7cHJvcHMuc3ViZG9tYWlufS4ke3Byb3BzLmhvc3RlZFpvbmUuem9uZU5hbWV9YFxuXG4gICAgLy8gQ2FuIGFsc28gdXNlIHdpbGRjYXJkIGNlcnRzIGluc3RlYWQhIENoZWFwZXJcbiAgICAvKiogQWxsb3dzIGV4dGVybmFsIHVzZXJzIHRvIGNvbm5lY3Qgd2l0aCBIVFRQUy4gKi9cbiAgICBjb25zdCBjdXN0b21Eb21haW5DZXJ0ID0gbmV3IGFjbS5DZXJ0aWZpY2F0ZSh0aGlzLCBcIkh0dHBzQ2VydGlmaWNhdGVcIiwge1xuICAgICAgZG9tYWluTmFtZTogdGhpcy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgdmFsaWRhdGlvbjogYWNtLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHByb3BzLmhvc3RlZFpvbmUpLFxuICAgIH0pXG5cbiAgICAvLyBOb3RlIHRoYXQgQVBJLUdXIGNhbiBhbHNvIHN1cHBvcnQgd2lsZGNhcmQgZG9tYWlucyEgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWN1c3RvbS1kb21haW4tbmFtZXMuaHRtbCNodHRwLXdpbGRjYXJkLWN1c3RvbS1kb21haW4tbmFtZXNcbiAgICAvLyBCdXQgdGhpcyB3aWxsIG5vdCB3b3JrIHdoZW4gQVdTIGFjY291bnQgWCBoYXMgQ3VzdG9tRG9tYWluIGBzdGFnaW5nLnBsYXRmb3JtLmV4YW1wbGUubm9gIGFuZCBhY2NvdW50IFkgaGFzIEN1c3RvbURvbWFpbiBgKi5wbGF0Zm9ybS5leGFtcGxlLm5vYC5cbiAgICAvLyBOb3Qgc3VyZSBob3cgc3ViLXN1YmRvbWFpbnMgYXJlIGFmZmVjdGVkOiBgbXlzZXJ2aWNlLnN0YWdpbmcucGxhdGZvcm0uZXhhbXBsZS5ub2AgYW5kIGAqLnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgIHRoaXMuYXBpR3dDdXN0b21Eb21haW4gPSBuZXcgYXBpZ3cuRG9tYWluTmFtZShcbiAgICAgIHRoaXMsXG4gICAgICBcIkRvbWFpbk5hbWUtXCIgKyBwcm9wcy5zdWJkb21haW4sXG4gICAgICB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuY3VzdG9tRG9tYWluTmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGU6IGN1c3RvbURvbWFpbkNlcnQsXG4gICAgICAgIGVuZHBvaW50VHlwZTogYXBpZ3cuRW5kcG9pbnRUeXBlLlJFR0lPTkFMLFxuICAgICAgICBzZWN1cml0eVBvbGljeTogYXBpZ3cuU2VjdXJpdHlQb2xpY3kuVExTXzFfMixcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgLy8gVGhpcyBtYWtlcyB0aGUgQVBJLUdXIHB1YmxpY2x5IGF2YWlsYWJsZSBvbiB0aGUgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQodGhpcywgXCJSb3V0ZTUzQVJlY29yZEFwaWd3QWxpYXNcIiwge1xuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuc3ViZG9tYWluLFxuICAgICAgem9uZTogcHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICBuZXcgcm91dGU1M1RhcmdldHMuQXBpR2F0ZXdheXYyRG9tYWluUHJvcGVydGllcyhcbiAgICAgICAgICB0aGlzLmFwaUd3Q3VzdG9tRG9tYWluLnJlZ2lvbmFsRG9tYWluTmFtZSxcbiAgICAgICAgICB0aGlzLmFwaUd3Q3VzdG9tRG9tYWluLnJlZ2lvbmFsSG9zdGVkWm9uZUlkLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIHR0bDogcHJvcHMudHRsID8/IGNkay5EdXJhdGlvbi5taW51dGVzKDUpLCAvLyBMb3cgVFRMIG1ha2VzIGl0IGVhc2llciB0byBkbyBjaGFuZ2VzXG4gICAgfSlcbiAgfVxufVxuXG4vKiogQWN0cyBhcyBnbHVlIChiZXR3ZWVuIHRoZSBpbnRlZ3JhdGlvbiBwcm9wcyBhbmQgdGhlIEh0dHBBcGkpIHdoZW4gY3JlYXRpbmcgYW4gU3FzSW50ZWdyYXRpb24uICovXG5jbGFzcyBTcXNSb3V0ZUludGVncmF0aW9uIGV4dGVuZHMgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQHBhcmFtIGlkIFRoZSBpZCB1c2VkIGluIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSBjb25zdHJ1Y3RcbiAgICogICAgY3JlYXRlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbi5fYmluZFRvUm91dGV9LlxuICAgKiAgICBbU291cmNlIGNvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL2I1YWUzNzc4MmJjM2NiNjM3ZWVlZjlmYmIxZmJlMmM1ZWZkZmMwNjgvcGFja2FnZXMvJTQwYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyL2xpYi9odHRwL2ludGVncmF0aW9uLnRzI0wzMjEpXG4gICAqIEBwYXJhbSBpbnRlZ3JhdGlvblByb3BzIFRoZSBwcm9wcyB0byBwYXNzIHRvIHRoZSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSBjb25zdHJ1Y3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBpZDogc3RyaW5nLFxuICAgIHByaXZhdGUgaW50ZWdyYXRpb25Qcm9wczogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25Db25maWcsXG4gICkge1xuICAgIHN1cGVyKGlkKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgc2VuZHMgdGhlIHByb3BlcnRpZXMgbmVlZGVkIGZvciBjcmVhdGluZyBhIHtAbGluayBhcGlndy5IdHRwSW50ZWdyYXRpb259IHRvIHRoZVxuICAgKiB7QGxpbmsgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb259LlxuICAgKi9cbiAgYmluZCgpOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbkNvbmZpZyB7XG4gICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5OlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL2I1YWUzNzc4MmJjM2NiNjM3ZWVlZjlmYmIxZmJlMmM1ZWZkZmMwNjgvcGFja2FnZXMvJTQwYXdzLWNkay9hd3MtYXBpZ2F0ZXdheXYyL2xpYi9odHRwL2ludGVncmF0aW9uLnRzI0wzMTlcbiAgICByZXR1cm4gdGhpcy5pbnRlZ3JhdGlvblByb3BzXG4gIH1cbn1cblxuLyoqXG4gKiBXaGVuIHVzaW5nIGBOb2RlanNGdW5jdGlvbmAgd2l0aCBgZW50cnlgLCB3ZSBwb2ludCBDREsgdG8gYSBmaWxlIHdpdGggb3VyIGxhbWJkYSBjb2RlLiBUaGlzIGNhblxuICogZWl0aGVyIGJlIGEgVHlwZVNjcmlwdCBvciBKYXZhU2NyaXB0IGZpbGUuIFdoZW4gY3JlYXRpbmcgY29uc3RydWN0cyBpbiB0ZXN0cyBpbnNpZGUgdGhpcyBsaWJyYXJ5LFxuICogdGhlIGVudHJ5IHdpbGwgcG9pbnQgdG8gdGhlIFR5cGVTY3JpcHQgZmlsZSBpbiB0aGUgc291cmNlIGNvZGUuIEJ1dCB3aGVuIGEgbGlicmFyeSBjb25zdW1lciB1c2VzXG4gKiB0aGlzLCBpdCB3aWxsIGluc3RlYWQgcG9pbnQgdG8gdGhlIHRyYW5zcGlsZWQgSmF2YVNjcmlwdCBmaWxlLiBTbyB0byBzZXQgdGhlIGNvcnJlY3QgZmlsZVxuICogZXh0ZW5zaW9uLCB3ZSBtdXN0IGNoZWNrIGlmIHdlJ3JlIGJlaW5nIHJ1biBpbiB0aGUgY29udGV4dCBvZiB0aGUgVHlwZVNjcmlwdCBzb3VyY2UgY29kZVxuICogKHNyYy9hcGktZ2F0ZXdheSksIG90aGVyd2lzZSB3ZSdyZSBiZWluZyBydW4gYnkgYSBjb25zdW1lciBhcyB0cmFuc3BpbGVkIEphdmFTY3JpcHQuXG4gKi9cbmNvbnN0IGF1dGhvcml6ZXJGaWxlRXh0ZW5zaW9uID0gX19kaXJuYW1lLmVuZHNXaXRoKFwic3JjL2FwaS1nYXRld2F5XCIpXG4gID8gXCJ0c1wiXG4gIDogXCJqc1wiXG5cbi8qKlxuICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIGxhbWJkYSB3aGljaCByZWFkcyBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIgYW5kXG4gKiB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICovXG5jbGFzcyBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyPFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyxcbj4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGE6IGxhbWJkYS5JRnVuY3Rpb25cblxuICAvKipcbiAgICogVXNlIHNpbXBsZSByZXNwb25zZSB0eXBlIChgeyBpc0F1dGhvcml6ZWQ6IHRydWUvZmFsc2UgfWApLCBhcyBvcHBvc2VkIHRvIHJldHVybmluZyBhbiBJQU1cbiAgICogUG9saWN5IGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGVbXSA9IFtcbiAgICBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRSxcbiAgXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBDb2duaXRvVXNlclBvb2xBdXRob3JpemVyUHJvcHM8QXV0aFNjb3Blc1Q+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBsYW1iZGFOb2RlanMuTm9kZWpzRnVuY3Rpb24odGhpcywgXCJBdXRob3JpemVyRnVuY3Rpb25cIiwge1xuICAgICAgZW50cnk6IHBhdGguam9pbihcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBgYXV0aG9yaXplci1sYW1iZGFzL2NvZ25pdG8tdXNlci1wb29sLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkNSRURFTlRJQUxTX0ZPUl9JTlRFUk5BTF9BVVRIT1JJWkFUSU9OXCJdOlxuICAgICAgICAgIHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA/IHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uXG4gICAgICAgICAgICA6IFwiXCIsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMuY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24pIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbixcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gXG4gKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICovXG5jbGFzcyBCYXNpY0F1dGhBdXRob3JpemVyIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLy8gU2ltcGxlIGlzIGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNIFBvbGljeSBkb2N1bWVudFxuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQmFzaWNBdXRoTGFtYmRhXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9iYXNpYy1hdXRoLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkFuIGF1dGhvcml6ZXIgZm9yIEFQSS1HYXRld2F5IHRoYXQgY2hlY2tzIEJhc2ljIEF1dGggY3JlZGVudGlhbHMgb24gcmVxdWVzdHNcIixcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl06IHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgID8gcHJvcHMuY3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZSkge1xuICAgICAgc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCArIFwiQmFzaWNBdXRoU2VjcmV0XCIsXG4gICAgICAgIHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZSxcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggYWxsb3dzIGJvdGg6XG4gKiAtIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFjY2VzcyB0b2tlbj5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSB0b2tlbiBpcyBjaGVja2VkIGFnYWluc3QgdGhlIGdpdmVuXG4gKiAgIENvZ25pdG8gdXNlciBwb29sXG4gKiAtIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgY3JlZGVudGlhbHMgYXJlXG4gKiAgIGNoZWNrZWQgYWdhaW5zdCB0aGUgY3JlZGVudGlhbHMgZnJvbSB0aGUgZ2l2ZW4gYmFzaWMgYXV0aCBzZWNyZXQgbmFtZVxuICpcbiAqIElmIGVpdGhlciBvZiB0aGVzZSBhcmUgZ2l2ZW4gYW5kIHZhbGlkLCB0aGUgcmVxdWVzdCBpcyBhdXRoZW50aWNhdGVkLlxuICovXG5jbGFzcyBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXI8XG4gIEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nLFxuPiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8qKlxuICAgKiBVc2Ugc2ltcGxlIHJlc3BvbnNlIHR5cGUgKGB7IGlzQXV0aG9yaXplZDogdHJ1ZS9mYWxzZSB9YCksIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTVxuICAgKiBQb2xpY3kgZG9jdW1lbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzcG9uc2VUeXBlczogYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZVtdID0gW1xuICAgIGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGUuU0lNUExFLFxuICBdXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1vci1iYXNpYy1hdXRoLWF1dGhvcml6ZXIuJHthdXRob3JpemVyRmlsZUV4dGVuc2lvbn1gLFxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNSksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBbXCJVU0VSX1BPT0xfSURcIl06IHByb3BzLnVzZXJQb29sID8gcHJvcHMudXNlclBvb2wudXNlclBvb2xJZCA6IFwiXCIsXG4gICAgICAgIFtcIlJFUVVJUkVEX1NDT1BFXCJdOiBwcm9wcy5yZXF1aXJlZFNjb3BlID8/IFwiXCIsXG4gICAgICAgIFtcIkJBU0lDX0FVVEhfQ1JFREVOVElBTFNfU0VDUkVUX05BTUVcIl06XG4gICAgICAgICAgcHJvcHMuYmFzaWNBdXRoQ3JlZGVudGlhbHNTZWNyZXROYW1lXG4gICAgICAgICAgICA/IHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZSkge1xuICAgICAgc2VjcmV0c21hbmFnZXIuU2VjcmV0LmZyb21TZWNyZXROYW1lVjIoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBpZCArIFwiQmFzaWNBdXRoU2VjcmV0XCIsXG4gICAgICAgIHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZSxcbiAgICAgICkuZ3JhbnRSZWFkKHRoaXMubGFtYmRhKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgc2xpZ2h0bHkgZXh0ZW5kZWQgdmVyc2lvbiBvZiB0aGUgW2RlZmF1bHQgSlNPTiBmb3JtYXQgc3VnZ2VzdGVkIGJ5IEFXU10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmcuaHRtbCNodHRwLWFwaS1lbmFibGUtbG9nZ2luZy5leGFtcGxlcykuXG4gKi9cbmNvbnN0IGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQgPSB7XG4gIHJlcXVlc3RJZDogXCIkY29udGV4dC5yZXF1ZXN0SWRcIixcbiAgdXNlckFnZW50OiBcIiRjb250ZXh0LmlkZW50aXR5LnVzZXJBZ2VudFwiLFxuICBpcDogXCIkY29udGV4dC5pZGVudGl0eS5zb3VyY2VJcFwiLFxuICAvKiogQ0xGIGZvcm1hdDogYGRkL01NTS95eXl5OkhIOm1tOnNzICstaGhtbWAgKi9cbiAgcmVxdWVzdFRpbWU6IFwiJGNvbnRleHQucmVxdWVzdFRpbWVcIixcbiAgcmVxdWVzdFRpbWVFcG9jaDogXCIkY29udGV4dC5yZXF1ZXN0VGltZUVwb2NoXCIsXG4gIGRhdGFQcm9jZXNzZWQ6IFwiJGNvbnRleHQuZGF0YVByb2Nlc3NlZFwiLFxuICBodHRwTWV0aG9kOiBcIiRjb250ZXh0Lmh0dHBNZXRob2RcIixcbiAgcGF0aDogXCIkY29udGV4dC5wYXRoXCIsXG4gIHJvdXRlS2V5OiBcIiRjb250ZXh0LnJvdXRlS2V5XCIsXG4gIHN0YXR1czogXCIkY29udGV4dC5zdGF0dXNcIixcbiAgcHJvdG9jb2w6IFwiJGNvbnRleHQucHJvdG9jb2xcIixcbiAgcmVzcG9uc2VMZW5ndGg6IFwiJGNvbnRleHQucmVzcG9uc2VMZW5ndGhcIixcbiAgcmVzcG9uc2VMYXRlbmN5OiBcIiRjb250ZXh0LnJlc3BvbnNlTGF0ZW5jeVwiLFxuICBkb21haW5OYW1lOiBcIiRjb250ZXh0LmRvbWFpbk5hbWVcIixcbiAgZXJyb3I6IHtcbiAgICB0eXBlOiBcIiRjb250ZXh0LmVycm9yLnJlc3BvbnNlVHlwZVwiLFxuICAgIGdhdGV3YXlFcnJvcjogXCIkY29udGV4dC5lcnJvci5tZXNzYWdlXCIsXG4gICAgaW50ZWdyYXRpb25FcnJvcjogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5lcnJvclwiLFxuICAgIGF1dGhvcml6ZXJFcnJvcjogXCIkY29udGV4dC5hdXRob3JpemVyLmVycm9yXCIsXG4gIH0sXG4gIGludGVncmF0aW9uOiB7XG4gICAgbGF0ZW5jeTogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5sYXRlbmN5XCIsXG4gICAgcmVxdWVzdElkOiBcIiRjb250ZXh0LmludGVncmF0aW9uLnJlcXVlc3RJZFwiLFxuICAgIHJlc3BvbnNlU3RhdHVzOiBcIiRjb250ZXh0LmludGVncmF0aW9uLnN0YXR1c1wiLFxuICB9LFxuICBhdXRoOiB7XG4gICAgaWFtOiB7XG4gICAgICB1c2VyQXJuOiBcIiRjb250ZXh0LmlkZW50aXR5LnVzZXJBcm5cIixcbiAgICAgIGF3c0FjY291bnQ6IFwiJGNvbnRleHQuaWRlbnRpdHkuYWNjb3VudElkXCIsXG4gICAgICBhd3NQcmluY2lwYWw6IFwiJGNvbnRleHQuaWRlbnRpdHkuY2FsbGVyXCIsXG4gICAgICBhd3NQcmluY2lwYWxPcmc6IFwiJGNvbnRleHQuaWRlbnRpdHkucHJpbmNpcGFsT3JnSWRcIixcbiAgICB9LFxuICAgIGJhc2ljOiB7IHVzZXJuYW1lOiBcIiRjb250ZXh0LmF1dGhvcml6ZXIudXNlcm5hbWVcIiB9LFxuICAgIGNvZ25pdG86IHsgY2xpZW50SWQ6IFwiJGNvbnRleHQuYXV0aG9yaXplci5jbGllbnRJZFwiIH0sXG4gIH0sXG4gIGF3c0VuZHBvaW50UmVxdWVzdDoge1xuICAgIGlkOiBcIiRjb250ZXh0LmF3c0VuZHBvaW50UmVxdWVzdElkXCIsXG4gICAgaWQyOiBcIiRjb250ZXh0LmF3c0VuZHBvaW50UmVxdWVzdElkMlwiLFxuICB9LFxuICBtZXNzYWdlOlxuICAgIFwiJGNvbnRleHQuaWRlbnRpdHkuc291cmNlSXAgLSAkY29udGV4dC5odHRwTWV0aG9kICRjb250ZXh0LmRvbWFpbk5hbWUgJGNvbnRleHQucGF0aCAoJGNvbnRleHQucm91dGVLZXkpIC0gJGNvbnRleHQuc3RhdHVzIFskY29udGV4dC5yZXNwb25zZUxhdGVuY3kgbXNdXCIsXG59XG5cbi8qKlxuICogRW5hYmxlcyBhY2Nlc3MgbG9ncyBvbiB0aGUgQVBJLUdhdGV3YXkuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICovXG5jbGFzcyBBcGlHYXRld2F5QWNjZXNzTG9ncyBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3RhZ2U6IGFwaWd3LkNmblN0YWdlLFxuICAgIHByb3BzOiBBcGlHYXRld2F5QWNjZXNzTG9nc1Byb3BzIHwgdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICAvLyBsb2dHcm91cCBpcyBzZXQgdXAgd2l0aCBoZWxwIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvMTExMDAjaXNzdWVjb21tZW50LTkwNDYyNzA4MVxuICAgIC8vIE5vdCBzdXJlIGlmIEhUVFAgQVBJIGFjdHVhbGx5IG5lZWRzIHRoZSBzZXJ2aWNlIHJvbGUgd2l0aCBtYW5hZ2VkIHBvbGljeTogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2h0dHAtYXBpLWxvZ2dpbmcuaHRtbFxuICAgIGNvbnN0IGFjY2Vzc0xvZ3MgPSBuZXcgbG9ncy5Mb2dHcm91cCh0aGlzLCBcIkFjY2Vzc0xvZ0dyb3VwXCIsIHtcbiAgICAgIHJldGVudGlvbjogcHJvcHM/LnJldGVudGlvbixcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzPy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTixcbiAgICAgIC8vIEFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgZW5jcnlwdGlvbiBrZXkuIE90aGVyd2lzZSwgdGhlIGtleSBuZWVkcyBzcGVjaWFsIHBvbGljaWVzOlxuICAgICAgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L2xvZ3MvZW5jcnlwdC1sb2ctZGF0YS1rbXMuaHRtbCNjbWstcGVybWlzc2lvbnNcbiAgICAgIGVuY3J5cHRpb25LZXk6IHVuZGVmaW5lZCxcbiAgICB9KVxuICAgIHRoaXMubG9nR3JvdXAgPSBhY2Nlc3NMb2dzXG5cbiAgICBzdGFnZS5hY2Nlc3NMb2dTZXR0aW5ncyA9IHtcbiAgICAgIGRlc3RpbmF0aW9uQXJuOiBhY2Nlc3NMb2dzLmxvZ0dyb3VwQXJuLFxuICAgICAgZm9ybWF0OiBKU09OLnN0cmluZ2lmeShwcm9wcz8uYWNjZXNzTG9nRm9ybWF0ID8/IGRlZmF1bHRBY2Nlc3NMb2dGb3JtYXQpLFxuICAgIH1cblxuICAgIGNvbnN0IGFwaUd3TG9nc1JvbGUgPSBuZXcgaWFtLlJvbGUoXG4gICAgICB0aGlzLFxuICAgICAgXCJBcGlHYXRld2F5UHVzaFRvQ2xvdWR3YXRjaExvZ3NSb2xlXCIsXG4gICAgICB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKFwiYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tXCIpLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgICBcInNlcnZpY2Utcm9sZS9BbWF6b25BUElHYXRld2F5UHVzaFRvQ2xvdWRXYXRjaExvZ3NcIixcbiAgICAgICAgICApLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBhY2Nlc3NMb2dzLmdyYW50V3JpdGUoYXBpR3dMb2dzUm9sZSlcbiAgfVxufVxuXG4vKiogUmV0dXJucyBhIHNob3J0IHNlbWktdW5pcXVlIGhhc2ggb2YgdGhlIGdpdmVuIHN0cmluZy4gKi9cbmZ1bmN0aW9uIHNob3J0SGFzaChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFNIQS0xIGlzIG5vLW5vIHdoZW4gd2UgbmVlZCBjcnlwdG9ncmFwaGljIHNlY3VyaXR5LCBidXQgaGVyZSB3ZSBqdXN0IGl0IGZvciBzaG9ydGVuaW5nIGEgbmFtZSxcbiAgLy8gd2hpY2ggaXMgZmluZVxuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTFcIikudXBkYXRlKHN0cikuZGlnZXN0KFwiaGV4XCIpLnN1YnN0cmluZygwLCAxMClcbn1cbiJdfQ==
588
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1hcGktZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGktZ2F0ZXdheS9odHRwLWFwaS1nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFBO0FBR2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEtBQUssTUFBTSw4QkFBOEIsQ0FBQTtBQUNyRCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxLQUFLLGNBQWMsTUFBTSxnQ0FBZ0MsQ0FBQTtBQUNoRSxPQUFPLEtBQUssWUFBWSxNQUFNLDJDQUEyQyxDQUFBO0FBQ3pFLE9BQU8sS0FBSyxXQUFXLE1BQU0sMENBQTBDLENBQUE7QUFFdkUsT0FBTyxLQUFLLFlBQVksTUFBTSwrQkFBK0IsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQ25DLE9BQU8sS0FBSyxPQUFPLE1BQU0seUJBQXlCLENBQUE7QUFDbEQsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNqRSxPQUFPLEtBQUssR0FBRyxNQUFNLG9DQUFvQyxDQUFBO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUE7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUVuQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FB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O0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHR5cGUgKiBhcyBlbGIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCJcbmltcG9ydCB0eXBlICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgdHlwZSAqIGFzIHNxcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiXG5pbXBvcnQgKiBhcyBhcGlndyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiXG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBpbnRlZ3JhdGlvbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djItaW50ZWdyYXRpb25zXCJcbmltcG9ydCAqIGFzIGF1dGhvcml6ZXJzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheXYyLWF1dGhvcml6ZXJzXCJcbmltcG9ydCB0eXBlIHsgSVVzZXJQb29sIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2duaXRvXCJcbmltcG9ydCAqIGFzIGxhbWJkYU5vZGVqcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIlxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIlxuaW1wb3J0ICogYXMgcm91dGU1M1RhcmdldHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIlxuaW1wb3J0ICogYXMgYWNtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyXCJcbmltcG9ydCB7IHRhZ1Jlc291cmNlcyB9IGZyb20gXCIuLi90YWdzXCJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJ1cmxcIlxuXG5jb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoX19maWxlbmFtZSlcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIHtAbGluayBBcGlHYXRld2F5fSBjb25zdHJ1Y3QuXG4gKlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICogQGF1dGhvciBIZXJtYW5uIE3DuHJrcmlkIDxoZW1AbGlmbGlnLm5vPlxuICovXG5leHBvcnQgdHlwZSBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+ID0ge1xuICAvKiogU2V0dGluZ3MgZm9yIHRoZSBleHRlcm5hbC1mYWNpbmcgcGFydCBvZiB0aGUgQVBJLUdXLiAqL1xuICBkbnM6IEFwaUdhdGV3YXlEbnNQcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBpbnRlZ3JhdGlvbiBpcyBzcGVjaWZpZWQgZm9yIGEgcm91dGUsIHRoaXMgaW50ZWdyYXRpb24gaXMgdXNlZC5cbiAgICpcbiAgICogU2VlIHtAbGluayBJbnRlZ3JhdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEludGVncmF0aW9uPzogSW50ZWdyYXRpb25Qcm9wc1xuXG4gIC8qKlxuICAgKiBJZiBubyBhdXRob3JpemF0aW9uIGlzIHNwZWNpZmllZCBmb3IgYSByb3V0ZSwgdGhpcyBhdXRob3JpemF0aW9uIGlzIHVzZWQuXG4gICAqXG4gICAqIFNlZSB7QGxpbmsgQXV0aG9yaXphdGlvblByb3BzfSBmb3IgdGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgKi9cbiAgZGVmYXVsdEF1dGhvcml6YXRpb24/OiBBdXRob3JpemF0aW9uUHJvcHM8QXV0aFNjb3Blc1Q+XG5cbiAgcm91dGVzOiBBcGlHYXRld2F5Um91dGU8QXV0aFNjb3Blc1Q+W11cblxuICAvKipcbiAgICogVGhlIEFQSS1HVyBhY2Nlc3MgbG9ncyBmb3IgdGhlIGAkZGVmYXVsdGAgc3RhZ2UgYXJlIGtlcHQuXG4gICAqIFRoaXMgaGFzIG9wdGlvbnMgZm9yIHRoZSBsb2dzLlxuICAgKi9cbiAgYWNjZXNzTG9ncz86IEFwaUdhdGV3YXlBY2Nlc3NMb2dzUHJvcHNcblxuICAvKipcbiAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm91dGUtbGV2ZWwgbWV0cmljcy5cbiAgICogVGhpcyBjYW4gaW5jcmVhc2UgQ2xvdWRXYXRjaCBjb3N0cyB3aGVuIG5vdCBkaXNhYmxlZC5cbiAgICpcbiAgICogU2VlIFtBV1M6IFdvcmtpbmcgd2l0aCBtZXRyaWNzIGZvciBIVFRQIEFQSXNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1tZXRyaWNzLmh0bWw/aWNtcGlkPWFwaWdhdGV3YXlfY29uc29sZV9oZWxwIzp+OnRleHQ9YW5kJTIwc3RhZ2UlMjBJRC4tLEFwaUlkJTJDJTIwU3RhZ2UlMkMlMjBSb3V0ZSwtRmlsdGVycyUyMEFQSSUyMEdhdGV3YXkpXG4gICAqIGZvciBtb3JlIGluZm8uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGRldGFpbGVkTWV0cmljcz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhyb3R0bGluZyBvZiByZXF1ZXN0cy5cbiAgICogSWYgbm90IHNldCwgdGhlIEFXUyBkZWZhdWx0IG9mIDUwMDAgYnVyc3QgYW5kIDEwMDAwIHJhdGUgaXMgdXNlZC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgdGhyb3R0bGluZyBpcyBwZXItYWNjb3VudCwgYW5kIGNvdW50cyBhbGwgQVBJcyBpbiB0aGUgYWNjb3VudCBhbmQgcmVnaW9uLlxuICAgKiBJZiB5b3UgaGF2ZSBhbm90aGVyIEFQSSBpbiB0aGlzIHJlZ2lvbiBnZXR0aW5nIDEwXzAwMCByZXF1ZXN0IHJhdGUsIGl0IG1heSBpbXBhY3QgdGhpcyBBUEkgYXMgd2VsbC5cbiAgICovXG4gIHRocm90dGxpbmc/OiB7XG4gICAgLyoqXG4gICAgICogR29pbmcgb3ZlciBgNV8wMDBgIG1heSByZXF1aXJlIHlvdSB0byBjb250YWN0IEFXUyBTdXBwb3J0IC0gdGhleSBhcmUgYWNjb3VudCBib3VuZC5cbiAgICAgKi9cbiAgICBidXJzdD86IG51bWJlclxuICAgIC8qKlxuICAgICAqIEdvaW5nIG92ZXIgYDEwXzAwMGAgbWF5IHJlcXVpcmUgeW91IHRvIGNvbnRhY3QgQVdTIFN1cHBvcnQgLSB0aGV5IGFyZSBhY2NvdW50IGJvdW5kLlxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIENPUlMgaGVhZGVycyBvbiByZXNwb25zZXMgZnJvbSB0aGUgQVBJIEdhdGV3YXkgdG8gYWxsb3cgYWxsIG9yaWdpbnMsIGhlYWRlcnMgYW5kIG1ldGhvZHMuXG4gICAqIFVzZWZ1bCBpZiB5b3VyIEFQSSBzaG91bGQgYmUgYWNjZXNzZWQgYnkgYW55IGJyb3dzZXIuXG4gICAqL1xuICBjb3JzQWxsb3dBbGw/OiBib29sZWFuXG5cbiAgLyoqXG4gICAqIElmIHNvbWUgc2V0dGluZ3MgaW4gdGhpcyBjb25zdHJ1Y3QgZG8gbm90IHdvcmsgZm9yIHlvdSwgdGhpcyBpcyBhbiBlc2NhcGUgaGF0Y2ggbWVjaGFuaXNtIHRvXG4gICAqIG92ZXJyaWRlIGFueXRoaW5nLlxuICAgKi9cbiAgcHJvcHNPdmVycmlkZT86IHtcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSBzZXR0aW5ncyBmb3IgdGhlIHtAbGluayBhcGlndy5IdHRwQXBpfSAoYWNjZXNzaWJsZSBpbiB7QGxpbmsgQXBpR2F0ZXdheS5odHRwQXBpfSkuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBmcm9udGVuZCBhY2Nlc3NpbmcgdGhpcyBBUEksIHlvdSBtaWdodCB3YW50IHRvIHNldFxuICAgICAqIFtDT1JTIHByZWZsaWdodF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nkay9hcGkvdjEvZG9jcy9hd3MtYXBpZ2F0ZXdheXYyLXJlYWRtZS5odG1sI2Nyb3NzLW9yaWdpbi1yZXNvdXJjZS1zaGFyaW5nLWNvcnMpXG4gICAgICogc2V0dGluZ3MuXG4gICAgICovXG4gICAgaHR0cEFwaT86IFBhcnRpYWw8YXBpZ3cuSHR0cEFwaVByb3BzPlxuICB9XG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlEbnNQcm9wcyA9IHtcbiAgLyoqXG4gICAqIE9ubHkgdGhlIHN1YmRvbWFpbiBwcmVmaXgsIHdoaWNoIHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogRXhhbXBsZTogU3ViZG9tYWluIGBwcm9kdWN0YCB3b3VsZCBnaXZlIHRoZSBlbmQgcmVzdWx0IG9mIGFuIEFQSS1HVyB3aXRoXG4gICAqIGBwcm9kdWN0LnBsYXRmb3JtLmV4YW1wbGUubm9gLlxuICAgKi9cbiAgc3ViZG9tYWluOiBzdHJpbmdcblxuICAvKipcbiAgICogSG9zdGVkIFpvbmUgZm9yIHRoZSBleHRlcm5hbCBmYWNpbmcgZG9tYWluLlxuICAgKiBUaGlzIGlzIHdoZXJlIHJvdXRlcyB3aWxsIGJlIGNyZWF0ZWQsIHRvIHJlZGlyZWN0IGNvbnN1bWVycyB0byB0aGUgQVBJLUdXLlxuICAgKiBGb3IgZXhhbXBsZSBhIEhaIGZvciBgcGxhdGZvcm0uZXhhbXBsZS5ub2AuXG4gICAqL1xuICBob3N0ZWRab25lOiByb3V0ZTUzLklIb3N0ZWRab25lXG5cbiAgLyoqXG4gICAqIFRoZSBUaW1lIFRvIExpdmUgKFRUTCkgZm9yIHRoZSBwdWJsaWMgRE5TIEEgcmVjb3JkIHRoYXQgd2lsbCBleHBvc2UgdGhlIEFQSS1HVy5cbiAgICogVGhpcyBpcyBob3cgbG9uZyBETlMgc2VydmVycyB3aWxsIGNhY2hlIHRoZSByZWNvcmQuXG4gICAqXG4gICAqIEEgbG9uZyBUVEwgKGhvdXJzKSBpcyBiZW5lZmljaWFsIHRvIEROUyBzZXJ2ZXJzLCBidXQgbWFrZXMgZGV2ZWxvcGVycyAoeW91KSB3YWl0IGxvbmdlciB3aGVuXG4gICAqIGRvaW5nIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IDUgbWludXRlc1xuICAgKi9cbiAgdHRsPzogY2RrLkR1cmF0aW9uXG59XG5cbmV4cG9ydCB0eXBlIEFwaUdhdGV3YXlSb3V0ZTxBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIC8qKiBUaGUgcGF0aCBvZiB0aGUgcm91dGUgdG8gZXhwb3NlIHRocm91Z2ggdGhlIEFQSSBHYXRld2F5LiBVc2UgXCIvXCIgZm9yIHRoZSByb290IHJvdXRlLiAqL1xuICBwYXRoOiBzdHJpbmdcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgd2Ugb25seSBmb3J3YXJkIHJlcXVlc3RzIHRoYXQgbWF0Y2ggdGhlIHJvdXRlJ3MgcGF0aCBleGFjdGx5LiBTbyBmb3IgYSByb3V0ZSB3aXRoXG4gICAqIHBhdGggYC9hcGkvdXNlcnNgLCBhIHJlcXVlc3QgdG8gYC9hcGkvdXNlcnNgIHdpbGwgYmUgZm9yd2FyZGVkLCBidXQgYSByZXF1ZXN0IHRvXG4gICAqIGAvYXBpL3VzZXJzL2FkbWluYCB3aWxsIG5vdC4gSWYgeW91IHdhbnQgdG8gZm9yd2FyZCByZXF1ZXN0cyB0byBhbGwgc3ViLXBhdGhzIHVuZGVyIHRoZSByb3V0ZSdzXG4gICAqIHBhdGgsIHlvdSBjYW4gc2V0IHRoaXMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGluY2x1ZGVTdWJwYXRocz86IGJvb2xlYW5cblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kIHRvIGV4cG9zZS4gYEFOWWAgZXhwb3NlcyBhbGwgSFRUUCBtZXRob2RzIG9uIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkFOWVwiXG4gICAqL1xuICBtZXRob2Q/OiBIdHRwTWV0aG9kXG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlZ3JhdGlvbiB0aGF0IHRoZSByb3V0ZSB3aWxsIGZvcndhcmQgdG8uIFNlZSB7QGxpbmsgSW50ZWdyYXRpb25Qcm9wc30gZm9yIHRoZSBhdmFpbGFibGVcbiAgICogb3B0aW9ucy5cbiAgICpcbiAgICogSWYgdW5kZWZpbmVkLCB1c2VzIHRoZSB7QGxpbmsgQXBpR2F0ZXdheVByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbn0uXG4gICAqL1xuICBpbnRlZ3JhdGlvbj86IEludGVncmF0aW9uUHJvcHNcblxuICAvKipcbiAgICogSG93IHJlcXVlc3RzIG9uIHRoZSByb3V0ZSBhcmUgYXV0aGVudGljYXRlZC4gU2VlIHtAbGluayBBdXRob3JpemF0aW9uUHJvcHN9IGZvciB0aGUgYXZhaWxhYmxlXG4gICAqIG9wdGlvbnMuXG4gICAqXG4gICAqIElmIHVuZGVmaW5lZCwgdXNlcyB0aGUge0BsaW5rIEFwaUdhdGV3YXlQcm9wcy5kZWZhdWx0QXV0aG9yaXphdGlvbn0uXG4gICAqL1xuICBhdXRob3JpemF0aW9uPzogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPlxufVxuXG5leHBvcnQgdHlwZSBIdHRwTWV0aG9kID1cbiAgfCBcIkFOWVwiXG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJQVVRcIlxuICB8IFwiUEFUQ0hcIlxuICB8IFwiREVMRVRFXCJcbiAgfCBcIk9QVElPTlNcIlxuICB8IFwiSEVBRFwiXG5cbmV4cG9ydCB0eXBlIEludGVncmF0aW9uUHJvcHMgPVxuICAvKiogVXNlIHRoaXMgd2hlbiBjb25uZWN0aW5nIHRoZSByb3V0ZSB0byBhbiBBTEIgKEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIpLiAqL1xuICB8ICh7IHR5cGU6IFwiQUxCXCIgfSAmIEFsYkludGVncmF0aW9uUHJvcHMpXG4gIC8qKiBVc2UgdGhpcyB3aGVuIGNvbm5lY3Rpbmcgcm91dGUgdG8gYSBMYW1iZGEuICovXG4gIHwgKHsgdHlwZTogXCJMYW1iZGFcIiB9ICYgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcylcbiAgLyoqIFVzZSB0aGlzIHdoZW4gY29ubmVjdGluZyBhIHJvdXRlIHRvIHNlbmQgdG8gYW4gU1FTIHF1ZXVlLiAqL1xuICB8ICh7IHR5cGU6IFwiU1FTXCIgfSAmIFNxc0ludGVncmF0aW9uUHJvcHMpXG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBBUEktR1cgLT4gQUxCIChBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyKSBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICovXG5leHBvcnQgdHlwZSBBbGJJbnRlZ3JhdGlvblByb3BzID0ge1xuICAvKipcbiAgICogQSBsaXN0ZW5lciBvbiBlLmcuIHBvcnQgNDQzIChIVFRQUykuXG4gICAqXG4gICAqIFNlZSB0aGUgbm90ZSBvbiB7QGxpbmsgQXBpR2F0ZXdheX0gYWJvdXQgdGhlIGxvYWQgYmFsYW5jZXIgc2VjdXJpdHkgZ3JvdXAuXG4gICAqL1xuICBsb2FkQmFsYW5jZXJMaXN0ZW5lcjogZWxiLklBcHBsaWNhdGlvbkxpc3RlbmVyXG5cbiAgLyoqXG4gICAqIFRoZSBob3N0IG5hbWUgKGRvbWFpbiBuYW1lKSBvZiB0aGUgYmFja2VuZCBzZXJ2aWNlIHRoYXQgd2Ugd2FudCB0byByZWFjaCB0aHJvdWdoIHRoZSBBTEIuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB0bzpcbiAgICogLSBWZXJpZnkgdGhlIEhUVFBTIGNlcnRpZmljYXRlIG9mIHRoZSBiYWNrZW5kIHNlcnZpY2UsIHNvIHRoYXQgdGhlIHJlcXVlc3QgZm9yd2FyZGVkIGZyb21cbiAgICogICBBUEktR1cgY2FuIHVzZSBUTFNcbiAgICogLSBTZXQgdGhlIGBIb3N0YCBoZWFkZXIgb24gdGhlIHJlcXVlc3Qgd2hlbiBmb3J3YXJkaW5nIHRvIHRoZSBBTEIsIHNvIHRoYXQgcmVxdWVzdHMgY2FuIGJlXG4gICAqICAgcm91dGVkIHRvIHRoZSBjb3JyZWN0IFRhcmdldCBHcm91cFxuICAgKlxuICAgKiBFeGFtcGxlIHZhbHVlOiBgPHNlcnZpY2U+LnN0YWdpbmcubXktcHJvamVjdC5saWZsaWcuaW9gIChub3QgcHJlZml4ZWQgYnkgYGh0dHBzOi8vYCkuXG4gICAqL1xuICBob3N0TmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgdXNlZCBieSB0aGUgQUxCLiBUaGUgQVBJLUdXIGludGVncmF0aW9uIHdpbGwgY29ubmVjdCB0byB0aGUgQUxCIHVzaW5nIGEgVlBDIExpbmsgZm9yXG4gICAqIHRoaXMgVlBDLlxuICAgKlxuICAgKiBTZWUgdGhlIG5vdGUgb24ge0BsaW5rIEFwaUdhdGV3YXl9IGFib3V0IHRoZSBsb2FkIGJhbGFuY2VyIHNlY3VyaXR5IGdyb3VwLlxuICAgKi9cbiAgdnBjOiBlYzIuSVZwY1xuXG4gIC8qKlxuICAgKiBBIHNlY3VyaXR5IGdyb3VwIChTRykgdGhhdCBhbGxvd3MgaW5jb21pbmcgdHJhZmZpYyB0byB0aGUgQUxCLiBXaWxsIGJlIHVzZWQgYnkgdGhlIFZQQyBsaW5rLCBzb1xuICAgKiB0aGUgQVBJLUdXIGludGVncmF0aW9uIGNhbiBjb25uZWN0LlxuICAgKlxuICAgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIHNhbWUgU0cgYXMgdGhlIEFMQiB1c2VzLCBiZWNhdXNlIHRoZXkgaGF2ZSBhIHJ1bGUgdGhhdCBhbGxvd3MgdHJhZmZpYyBmcm9tXG4gICAqIG90aGVycyBpbiB0aGUgc2FtZSBTRy5cbiAgICpcbiAgICogU2VlIHRoZSBub3RlIG9uIHtAbGluayBBcGlHYXRld2F5fSBhYm91dCB0aGUgbG9hZCBiYWxhbmNlciBzZWN1cml0eSBncm91cC5cbiAgICovXG4gIHNlY3VyaXR5R3JvdXA6IGVjMi5JU2VjdXJpdHlHcm91cFxuXG4gIC8qKlxuICAgKiBNYXAgcmVxdWVzdCBwYXJhbWV0ZXJzIChhZGQvb3ZlcndyaXRlIHBhdGgvaGVhZGVycy9xdWVyeSBwYXJhbXMpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIHRoZVxuICAgKiBiYWNrZW5kLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1wYXJhbWV0ZXItbWFwcGluZy5odG1sfVxuICAgKiBmb3IgbW9yZSBvbiB0aGlzLiBSZWFkIHRoZSAnUmVzZXJ2ZWQgaGVhZGVycycgc2VjdGlvbiBmb3Igd2hpY2ggaGVhZGVycyBjYW5ub3QgYmUgb3ZlcnJpZGRlbi5cbiAgICogSW4gYWRkaXRpb24gdG8gdGhlIEFXUy1yZXNlcnZlZCBoZWFkZXJzLCB5b3Ugc2hvdWxkIG5vdCBvdmVycmlkZSB0aGUgJ0hvc3QnIGhlYWRlciBlaXRoZXIsIGFzXG4gICAqIHRoYXQncyB1c2VkIGZvciByb3V0aW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBjb3JyZWN0IHNlcnZpY2UgYmVoaW5kIHRoZSBsb2FkIGJhbGFuY2VyLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZTpcbiAgICpcbiAgICogQWRkaW5nIGEgaGVhZGVyOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlSGVhZGVyKFxuICAgKiAgICBcIlgtTXktQ3VzdG9tLUhlYWRlclwiLFxuICAgKiAgICBhcGlndy5NYXBwaW5nVmFsdWUuY3VzdG9tKFwibXktY3VzdG9tLXZhbHVlXCIpLFxuICAgKiApXG4gICAqIGBgYFxuICAgKlxuICAgKiBPdmVyd3JpdGluZyB0aGUgcGF0aCAoaWYsIGZvciBleGFtcGxlLCB5b3UgY29uZmlndXJlIGEgYC91c2Vyc2Agcm91dGUgb24gdGhlIEFQSSBHYXRld2F5IHRoYXRcbiAgICogeW91IHdhbnQgdG8gZm9yd2FyZCB0byBgL2FwaS91c2Vyc2Agb24gdGhlIGJhY2tlbmQpOlxuICAgKiBgYGBcbiAgICogbWFwUGFyYW1ldGVyczogKHBhcmFtZXRlcnMpID0+IHBhcmFtZXRlcnMub3ZlcndyaXRlUGF0aChcIi9hcGkvdXNlcnNcIilcbiAgICogYGBgXG4gICAqL1xuICBtYXBQYXJhbWV0ZXJzPzogKHBhcmFtZXRlcnM6IGFwaWd3LlBhcmFtZXRlck1hcHBpbmcpID0+IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgTGFtYmRhSW50ZWdyYXRpb25Qcm9wcyA9IHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgaW50ZWdyYXRpb24gdXNlcyB0aGUgVjIgcGF5bG9hZCBmb3JtYXQ6XG4gICAqIHtAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktZGV2ZWxvcC1pbnRlZ3JhdGlvbnMtbGFtYmRhLmh0bWx9XG4gICAqXG4gICAqIElmIHdyaXRpbmcgdGhlIExhbWJkYSBpbiBUeXBlU2NyaXB0LCB0aGlzIG1lYW5zIHlvdSBzaG91bGQgdXNlIGBBUElHYXRld2F5UHJveHlFdmVudFYyYCBhcyB0aGVcbiAgICogcmVxdWVzdCB0eXBlLCBhbmQgYEFQSUdhdGV3YXlQcm94eVJlc3VsdFYyYCBhcyB0aGUgcmVzcG9uc2UgdHlwZS5cbiAgICovXG4gIGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxufVxuXG5leHBvcnQgdHlwZSBTcXNJbnRlZ3JhdGlvblByb3BzID0ge1xuICBxdWV1ZTogc3FzLklRdWV1ZVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGF0dHJpYnV0ZXMgdG8gcGFzcyBvbiB0byBTUVMuIFRoZSBrZXlzIGluIHRoaXMgb2JqZWN0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZXMuXG4gICAqIEVhY2ggYXR0cmlidXRlIGhhcyBhIERhdGFUeXBlIGZpZWxkLCBhbmQgZWl0aGVyIGEgU3RyaW5nVmFsdWUgb3IgQmluYXJ5VmFsdWUgZmllbGQgZGVwZW5kaW5nIG9uXG4gICAqIGl0cyB0eXBlLiBTZWUgQVdTIGRvY3M6XG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NTaW1wbGVRdWV1ZVNlcnZpY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTWVzc2FnZUF0dHJpYnV0ZVZhbHVlLmh0bWxcbiAgICpcbiAgICogSW4gdGhlIFN0cmluZ1ZhbHVlIGZpZWxkLCB5b3UgY2FuIGRvIEFQSSBHYXRld2F5IHBhcmFtZXRlciBtYXBwaW5nOlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktcGFyYW1ldGVyLW1hcHBpbmcuaHRtbFxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGBcbiAgICogbWVzc2FnZUF0dHJpYnV0ZXM6IHtcbiAgICogICBjbGllbnRJZDoge1xuICAgKiAgICAgRGF0YVR5cGU6IFwiU3RyaW5nXCIsXG4gICAqICAgICBTdHJpbmdWYWx1ZTogXCIke2NvbnRleHQuYXV0aG9yaXplci5jbGllbnRJZH1cIixcbiAgICogICB9LFxuICAgKiB9LFxuICAgKiBgYGBcbiAgICovXG4gIG1lc3NhZ2VBdHRyaWJ1dGVzPzoge1xuICAgIFthdHRyaWJ1dGVOYW1lOiBzdHJpbmddOlxuICAgICAgfCB7IERhdGFUeXBlOiBcIlN0cmluZ1wiIHwgXCJOdW1iZXJcIjsgU3RyaW5nVmFsdWU6IHN0cmluZyB9XG4gICAgICB8IHtcbiAgICAgICAgICBEYXRhVHlwZTogXCJCaW5hcnlcIlxuICAgICAgICAgIC8qKiBCYXNlNjQtZW5jb2RlZCBiaW5hcnkgZGF0YSBvYmplY3QuICovXG4gICAgICAgICAgQmluYXJ5VmFsdWU6IHN0cmluZ1xuICAgICAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9XG4gIC8qKlxuICAgKiBObyBhdXRoZW50aWNhdGlvbiwgZm9yIHdoZW4geW91IHdhbnQgYSBmdWxseSBwdWJsaWMgcm91dGUgKG9yIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBpbiB0aGVcbiAgICogYmFja2VuZCBpbnRlZ3JhdGlvbikuXG4gICAqL1xuICB8IHsgdHlwZTogXCJOT05FXCIgfVxuICAvKipcbiAgICogQVdTIElBTSBhdXRob3JpemF0aW9uLlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvaHR0cC1hcGktYWNjZXNzLWNvbnRyb2wtaWFtLmh0bWxcbiAgICovXG4gIHwgeyB0eXBlOiBcIklBTVwiIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyXG4gICAqIGFuZCB2ZXJpZmllcyB0aGUgdG9rZW4gYWdhaW5zdCBhIENvZ25pdG8gdXNlciBwb29sLlxuICAgKi9cbiAgfCAoe1xuICAgICAgdHlwZTogXCJDT0dOSVRPX1VTRVJfUE9PTFwiXG4gICAgfSAmIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICAgKiBoZWFkZXIgYW5kIHZlcmlmaWVzIHRoZSBjcmVkZW50aWFscyBhZ2FpbnN0IGEgZ2l2ZW4gc2VjcmV0LlxuICAgKi9cbiAgfCAoeyB0eXBlOiBcIkJBU0lDX0FVVEhcIiB9ICYgQmFzaWNBdXRoQXV0aG9yaXplclByb3BzKVxuICAvKipcbiAgICogQ3JlYXRlcyBhIGN1c3RvbSBhdXRob3JpemVyIGxhbWJkYSB3aGljaCBhbGxvd3MgYm90aDpcbiAgICogLSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgdG9rZW4gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZVxuICAgKiAgIGdpdmVuIENvZ25pdG8gdXNlciBwb29sXG4gICAqIC0gYEF1dGhvcml6YXRpb246IEJhc2ljIDxiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFscz5gIGhlYWRlciwgZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcmVcbiAgICogICBjaGVja2VkIGFnYWluc3QgdGhlIGNyZWRlbnRpYWxzIGZyb20gdGhlIGdpdmVuIGJhc2ljIGF1dGggc2VjcmV0IG5hbWVcbiAgICpcbiAgICogSWYgZWl0aGVyIG9mIHRoZXNlIGFyZSBnaXZlbiBhbmQgdmFsaWQsIHRoZSByZXF1ZXN0IGlzIGF1dGhlbnRpY2F0ZWQuXG4gICAqL1xuICB8ICh7XG4gICAgICB0eXBlOiBcIkNPR05JVE9fVVNFUl9QT09MX09SX0JBU0lDX0FVVEhcIlxuICAgIH0gJiBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4pXG5cbmV4cG9ydCB0eXBlIENvZ25pdG9Vc2VyUG9vbEF1dGhvcml6ZXJQcm9wczxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+ID0ge1xuICB1c2VyUG9vbDogSVVzZXJQb29sXG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgYWNjZXNzIHRva2VuIGNsYWltcyBjb250YWluIHRoZSBnaXZlbiBzY29wZS5cbiAgICpcbiAgICogV2hlbiBkZWZpbmVkIGFzIHBhcnQgb2YgYSByZXNvdXJjZSBzZXJ2ZXIsIHNjb3BlcyBhcmUgb24gdGhlIGZvcm1hdDpcbiAgICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YCwgZS5nLiBgZXh0ZXJuYWwvdmlld191c2Vyc2AuXG4gICAqXG4gICAqIFRvIGdldCBtb3JlIHR5cGUgc2FmZXR5IG9uIHRoaXMgcGFyYW1ldGVyLCBzZWUgdGhlIGRvY3MgZm9yIHRoZSBgQXV0aFNjb3Blc1RgIHR5cGUgcGFyYW1ldGVyIG9uXG4gICAqIHtAbGluayBBcGlHYXRld2F5fS5cbiAgICovXG4gIHJlcXVpcmVkU2NvcGU/OiBBdXRoU2NvcGVzVFxuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMgZm9yIHRoZSBiYWNrZW5kXG4gICAqIHNlcnZpY2UsIHRvIGJlIGZvcndhcmRlZCB0byB0aGUgYmFja2VuZCBpZiBDb2duaXRvIHVzZXIgcG9vbCBhdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQuXG4gICAqXG4gICAqIFRoZSBzZWNyZXQgdmFsdWUgbXVzdCBmb2xsb3cgdGhpcyBmb3JtYXQ6XG4gICAqIGBgYGpzb25cbiAgICogeyBcInVzZXJuYW1lXCI6IFwiPHVzZXJuYW1lPlwiLCBcInBhc3N3b3JkXCI6IFwiPHBhc3N3b3JkPlwiIH1cbiAgICogYGBgXG4gICAqXG4gICAqIFRoaXMgcHJvcCBzb2x2ZXMgdGhlIGZvbGxvd2luZyB1c2UtY2FzZTpcbiAgICogLSBZb3Ugd2FudCB0byBkbyBDb2duaXRvIHVzZXIgcG9vbCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgQVBJIEdhdGV3YXlcbiAgICogLSBZb3Ugd2FudCBhbiBhZGRpdGlvbmFsIGF1dGggY2hlY2sgaW4gdGhlIGJhY2tlbmQsIGJ1dCB5b3UgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggQ29nbml0b1xuICAgKiAgIHRoZXJlXG4gICAqIC0gVGhlIGJhY2tlbmQgdXNlcyBiYXNpYyBhdXRoXG4gICAqXG4gICAqIFRoaXMgcHJvcCBzb2x2ZXMgdGhpcyBieSBsZXR0aW5nIHlvdSBzcGVjaWZ5IGNyZWRlbnRpYWxzIHRvIHBhc3MgdG8gdGhlIGJhY2tlbmQgYWZ0ZXIgQVBJLUdXXG4gICAqIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLiBZb3UgY2FuIHBhc3MgdGhlIGVuY29kZWQgY3JlZGVudGlhbHMgdGhyb3VnaFxuICAgKiB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wcy5tYXBQYXJhbWV0ZXJzfSwgdXNpbmcgdGhlIGBhdXRob3JpemVyLmludGVybmFsQXV0aG9yaXphdGlvbkhlYWRlcmBcbiAgICogY29udGV4dCB2YXJpYWJsZSwgbGlrZSBzbzpcbiAgICogYGBgXG4gICAqIG1hcFBhcmFtZXRlcnM6IChwYXJhbWV0ZXJzKSA9PiBwYXJhbWV0ZXJzLm92ZXJ3cml0ZUhlYWRlcihcbiAgICogICAvLyAnQXV0aG9yaXphdGlvbicgaGVhZGVyIGNhbm5vdCBiZSBvdmVycmlkZGVuLCBzbyB3ZSB1c2UgYSBjdXN0b20gaGVhZGVyXG4gICAqICAgXCJYLUludGVybmFsLUF1dGhvcml6YXRpb25cIixcbiAgICogICBhcGlndy5NYXBwaW5nVmFsdWUuY29udGV4dFZhcmlhYmxlKFwiYXV0aG9yaXplci5pbnRlcm5hbEF1dGhvcml6YXRpb25IZWFkZXJcIiksXG4gICAqIClcbiAgICogYGBgXG4gICAqIFRoZSBiYWNrZW5kIGNhbiB0aGVuIGNoZWNrIHRoZSBgWC1JbnRlcm5hbC1BdXRob3JpemF0aW9uYCBoZWFkZXIuXG4gICAqL1xuICBjcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvbj86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHMgPSB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHNlY3JldCBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIHRoYXQgc3RvcmVzIGJhc2ljIGF1dGggY3JlZGVudGlhbHMuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIGZvciB0aGUgc2VjcmV0IHZhbHVlOlxuICAgKiAtIFNpbmdsZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQ6XG4gICAqICAgYGBganNvblxuICAgKiAgIHsgXCJ1c2VybmFtZVwiOiBcIjx1c2VybmFtZT5cIiwgXCJwYXNzd29yZFwiOiBcIjxwYXNzd29yZD5cIiB9XG4gICAqICAgYGBgXG4gICAqIC0gQXJyYXkgb2YgdXNlcm5hbWUgKyBwYXNzd29yZCBvYmplY3RzOlxuICAgKiAgIGBgYGpzb25cbiAgICogICB7IFwiY3JlZGVudGlhbHNcIjogXCJbe1xcXCJ1c2VybmFtZVxcXCI6XFxcIjx1c2VyLTE+XFxcIixcXFwicGFzc3dvcmRcXFwiOlxcXCJwYXNzd29yZC0xXFxcIn0se1xcXCJ1c2VybmFtZVxcXCI6XFxcIjx1c2VyLTI+XFxcIixcXFwicGFzc3dvcmRcXFwiOlxcXCI8cGFzc3dvcmQtMj5cXFwifV1cIiB9XG4gICAqICAgYGBgXG4gICAqICAgLSBUaGUgdmFsdWUgb2YgdGhlIGBjcmVkZW50aWFsc2AgZmllbGQgaXMgYSBzdHJpbmcsIHdpdGggYSBzdHJpbmdpZmllZCwgZXNjYXBlZCBKU09OIGFycmF5IG9mXG4gICAqICAgICBvYmplY3RzIHdpdGggYHVzZXJuYW1lYCBhbmQgYHBhc3N3b3JkYCBmaWVsZHMuXG4gICAqICAgLSBUaGUgcmVhc29uIHRoYXQgdGhpcyBzZWNvbmQgZm9ybWF0IHN0b3JlcyBzdHJpbmdpZmllZCBKU09OIF9pbnNpZGVfIEpTT04sIGlzIGR1ZSB0byBhXG4gICAqICAgICBsaW1pdGF0aW9uIGluIExpZmxpZydzIGBsb2FkLXNlY3JldHNgIGxpYnJhcnksIHdoaWNoIG9ubHkgYWxsb3dzIHN0b3Jpbmcgc3RyaW5nIHZhbHVlcy5cbiAgICogLSBBcnJheSBvZiBiYXNlNjQtZW5jb2RlZCBjcmVkZW50aWFsczpcbiAgICogICBgYGBqc29uXG4gICAqICAgeyBcImNyZWRlbnRpYWxzXCI6IFwiW1xcXCI8ZW5jb2RlZC1jcmVkZW50aWFsLTE+XFxcIixcXFwiPGVuY29kZWQtY3JlZGVudGlhbC0yPlxcXCJdXCIgfVxuICAgKiAgIGBgYFxuICAgKiAgIC0gRWFjaCBlbGVtZW50IGlzIGVuY29kZWQgZnJvbSBgPHVzZXJuYW1lPjo8cGFzc3dvcmQ+YC5cbiAgICogICAtIFRoZSBhcnJheSBpcyBzdHJpbmdpZmllZCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGFib3ZlLlxuICAgKlxuICAgKiBJZiB0aGUgc2VjcmV0IHVzZXMgb25lIG9mIHRoZSBhcnJheSBmb3JtYXRzLCB0aGUgYXV0aG9yaXplciB3aWxsIG1hdGNoIHRoZSByZXF1ZXN0J3NcbiAgICogQXV0aG9yaXphdGlvbiBoZWFkZXIgYWdhaW5zdCBhbnkgb25lIG9mIHRoZSBjcmVkZW50aWFscy5cbiAgICovXG4gIGNyZWRlbnRpYWxzU2VjcmV0TmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplclByb3BzPFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gPSB7XG4gIHVzZXJQb29sOiBJVXNlclBvb2xcblxuICAvKipcbiAgICogTmFtZSBvZiBzZWNyZXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciB0aGF0IHN0b3JlcyBiYXNpYyBhdXRoIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIEJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWV9IGZvciB0aGUgc3VwcG9ydGVkIGZvcm1hdHMuXG4gICAqL1xuICBiYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWU/OiBzdHJpbmdcblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhY2Nlc3MgdG9rZW4gY2xhaW1zIGNvbnRhaW4gdGhlIGdpdmVuIHNjb3BlLiBPbmx5IGFwcGxpY2FibGUgZm9yIHJlcXVlc3RzIHRoYXRcbiAgICogdXNlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFjY2VzcyB0b2tlbj5gIChub3QgYXBwbGljYWJsZSBmb3IgYmFzaWMgYXV0aCkuXG4gICAqXG4gICAqIFdoZW4gZGVmaW5lZCBhcyBwYXJ0IG9mIGEgcmVzb3VyY2Ugc2VydmVyLCBzY29wZXMgYXJlIG9uIHRoZSBmb3JtYXQ6XG4gICAqIGB7cmVzb3VyY2Ugc2VydmVyIGlkZW50aWZpZXJ9L3tzY29wZSBuYW1lfWAsIGUuZy4gYGV4dGVybmFsL3ZpZXdfdXNlcnNgLlxuICAgKlxuICAgKiBUbyBnZXQgbW9yZSB0eXBlIHNhZmV0eSBvbiB0aGlzIHBhcmFtZXRlciwgc2VlIHRoZSBkb2NzIGZvciB0aGUgYEF1dGhTY29wZXNUYCB0eXBlIHBhcmFtZXRlciBvblxuICAgKiB7QGxpbmsgQXBpR2F0ZXdheX0uXG4gICAqL1xuICByZXF1aXJlZFNjb3BlPzogQXV0aFNjb3Blc1Rcbn1cblxuZXhwb3J0IHR5cGUgQXBpR2F0ZXdheUFjY2Vzc0xvZ3NQcm9wcyA9IHtcbiAgLyoqXG4gICAqIERlbGV0ZSB0aGUgYWNjZXNzIGxvZ3MgaWYgdGhpcyBjb25zdHJ1Y3QgaXMgZGVsZXRlZD9cbiAgICpcbiAgICogTWF5YmUgeW91IHdhbnQgdG8gREVTVFJPWSBpbnN0ZWFkLiBPciBmb3IgbGVnYWwgcmVhc29ucywgcmV0YWluIGZvciBhdWRpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgUmVtb3ZhbFBvbGljeS5SRVRBSU5cbiAgICovXG4gIHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeVxuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byBrZWVwIHRoZSBsb2dzLiBJZiB1bmRlZmluZWQsIHVzZXMgdGhlIHNhbWUgZGVmYXVsdCBhcyBuZXcgQVdTIGxvZyBncm91cHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJldGVudGlvbkRheXMuVFdPX1lFQVJTXG4gICAqL1xuICByZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXNcblxuICAvKipcbiAgICogQSBjdXN0b20gSlNPTiBsb2cgZm9ybWF0LCB3aGljaCB1c2VzIHZhcmlhYmxlcyBmcm9tIGBcIiRjb250ZXh0XCJgLlxuICAgKlxuICAgKiBTZWUgW0FXUzogQ2xvdWRXYXRjaCBsb2cgZm9ybWF0cyBmb3IgQVBJIEdhdGV3YXldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9zZXQtdXAtbG9nZ2luZy5odG1sI2FwaWdhdGV3YXktY2xvdWR3YXRjaC1sb2ctZm9ybWF0cylcbiAgICogZm9yIGZvcm1hdHMgYW5kIHJ1bGVzLiBJdCBpcyBwb3NzaWJsZSB0byB1c2Ugb3RoZXIgZm9ybWF0cyBsaWtlIENMRiBhbmQgWE1MLCBidXQgdGhpcyBjb25zdHJ1Y3RcbiAgICogb25seSBzdXBwb3J0cyBKU09OIGZvciBub3cuXG4gICAqXG4gICAqIEZvciBhIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIHZhcmlhYmxlcyB0byBsb2csIHNlZVxuICAgKiBbQVdTOiAkY29udGV4dCBWYXJpYWJsZXMgZm9yIGRhdGEgbW9kZWxzLCBhdXRob3JpemVycywgbWFwcGluZyB0ZW1wbGF0ZXMsIGFuZCBDbG91ZFdhdGNoIGFjY2VzcyBsb2dnaW5nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYXBpZ2F0ZXdheS9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvYXBpLWdhdGV3YXktbWFwcGluZy10ZW1wbGF0ZS1yZWZlcmVuY2UuaHRtbCNjb250ZXh0LXZhcmlhYmxlLXJlZmVyZW5jZSlcbiAgICogYW5kXG4gICAqIFtBV1M6ICRjb250ZXh0IFZhcmlhYmxlcyBmb3IgYWNjZXNzIGxvZ2dpbmcgb25seV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL2FwaS1nYXRld2F5LW1hcHBpbmctdGVtcGxhdGUtcmVmZXJlbmNlLmh0bWwjY29udGV4dC12YXJpYWJsZS1yZWZlcmVuY2UtYWNjZXNzLWxvZ2dpbmctb25seSkgLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgZGVmYXVsdEFjY2Vzc0xvZ0Zvcm1hdH1cbiAgICovXG4gIGFjY2Vzc0xvZ0Zvcm1hdD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuLyoqXG4gKiBUaGlzIGNvbnN0cnVjdCB0cmllcyB0byBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YgYW4gQVBJIEdhdGV3YXkgZm9yIGEgc2VydmljZSwgYnkgY29sbGVjdGluZyBtb3N0XG4gKiBvZiB0aGUgY29tbW9uIHNldHVwIGhlcmUuXG4gKlxuICogVGhlIGFwcHJvYWNoIGZvbGxvd2VkIGluIHRoaXMgY29uc3RydWN0IGlzOlxuICogMS4gT25lIEFQSS1HVyBwZXIgc2VydmljZVxuICogMi4gT25lIHN1YmRvbWFpbiBwZXIgQVBJLUdXIC8gc2VydmljZVxuICogMy4gVXNlIEhUVFAgQVBJLCBub3QgUkVTVFxuICogNC4gVXNlIGEgJGRlZmF1bHQgc3RhZ2Ugd2l0aCBhdXRvZGVwbG95XG4gKiA1LiBTdXBwb3J0IG11bHRpcGxlIHJvdXRlcyAod2l0aCBwb3NzaWJsZSBgL3twcm94eSt9YCB0byBsZXQgYWxsIHN1Yi1wYXRocyB0aHJvdWdoKVxuICogNi4gQWxsb3cgY3VzdG9tIGludGVncmF0aW9uL2F1dGhvcml6ZXIgZm9yIGVhY2ggcm91dGUsIG9yIGRlZmF1bHRzIGZvciB0aGUgd2hvbGUgZ2F0ZXdheVxuICpcbiAqIFRoZSByb3V0ZSBpbnRlZ3JhdGlvbiBpcyBvbmUgb2YgdGhlc2U6XG4gKiAtIEFMQiBwcml2YXRlIGludGVncmF0aW9uIHdpdGggVlBDIExpbmsgdXNpbmcgSFRUUFMgdG8gdGhlIEFMQlxuICogLSBMYW1iZGEgaW50ZWdyYXRpb25cbiAqIC0gU1FTIGludGVncmF0aW9uXG4gKlxuICogIyMjIExvYWQgQmFsYW5jZXIgU2VjdXJpdHkgR3JvdXBcbiAqXG4gKiBOb3RlIHRoYXQgdGhlIGxvYWQgYmFsYW5jZXIgdXNlZCBpbiBhbiB7QGxpbmsgQWxiSW50ZWdyYXRpb25Qcm9wc30gbXVzdCBhbGxvdyBvdXRib3VuZCBIVFRQU1xuICogdHJhZmZpYyB0byBpdHMgU2VjdXJpdHlHcm91cC4gT3RoZXJ3aXNlLCB0aGUgVlBDIExpbmsgdXNlZCBieSB0aGUgQVBJLUdXIGNhbid0IGdldCB0cmFmZmljIGZyb21cbiAqIHRoZSBBTEIuXG4gKlxuICogYGBgXG4gKiBjb25zdCBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKC4uLiwge1xuICogICBhbGxvd0FsbE91dGJvdW5kOiBmYWxzZSxcbiAqIH0pXG4gKlxuICogbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cC5hZGRFZ3Jlc3NSdWxlKFxuICogICBsb2FkQmFsYW5jZXJTZWN1cml0eUdyb3VwLFxuICogICBlYzIuUG9ydC50Y3AoNDQzKSxcbiAqICAgXCJPdXRib3VuZCB0byBzZWxmIGZvciBBTEIgdG8gQVBJLUdXIFZQQy1MaW5rXCIsXG4gKiApXG4gKlxuICogY29uc3QgbG9hZEJhbGFuY2VyID0gbmV3IGxpZmxpZ0xvYWRCYWxhbmNlci5Mb2FkQmFsYW5jZXIoLi4uLFxuICogICB7XG4gKiAgICAgb3ZlcnJpZGVMb2FkQmFsYW5jZXJQcm9wczoge1xuICogICAgICAgc2VjdXJpdHlHcm91cDogbG9hZEJhbGFuY2VyU2VjdXJpdHlHcm91cCxcbiAqICAgICB9LFxuICogICB9LFxuICogKVxuICogYGBgXG4gKlxuICogQHRlbXBsYXRlIEF1dGhTY29wZXNUIFRoaXMgdHlwZSBwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBpbXByb3ZlIHR5cGUgc2FmZXR5IG9uIHRoZVxuICogYHJlcXVpcmVkU2NvcGVgIGZpZWxkIG9uIHtAbGluayBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wc30sIGJ5IG5hcnJvd2luZyB0aGUgdHlwZVxuICogdG8gc3BlY2lmaWMgc3RyaW5ncy4gWW91IGNhbiB0aGVuIGV4dGVuZCB0aGUgYEFwaUdhdGV3YXlgIHdpdGggdGhpcyB0eXBlIHRvIGVuZm9yY2UgdGhvc2Ugc2NvcGVzXG4gKiBhY3Jvc3MgdGhlIGFwcGxpY2F0aW9uLiBSZW1lbWJlciB0aGF0IGF1dGggc2NvcGVzIG11c3QgYmUgb24gdGhlIGZvcm1hdFxuICogYHtyZXNvdXJjZSBzZXJ2ZXIgaWRlbnRpZmllcn0ve3Njb3BlIG5hbWV9YC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgXG4gKiB0eXBlIEF1dGhTY29wZXMgPSBcImV4dGVybmFsL3JlYWRfdXNlcnNcIiB8IFwiaW50ZXJuYWwvY3JlYXRlX3VzZXJzXCJcbiAqXG4gKiBleHBvcnQgY2xhc3MgTXlQcm9qZWN0QXBpR2F0ZXdheSBleHRlbmRzIEFwaUdhdGV3YXk8QXV0aFNjb3Blcz4ge31cbiAqIGBgYFxuICogVHlwZVNjcmlwdCB3aWxsIHRoZW4gZW5mb3JjZSB0aGF0IGByZXF1aXJlZFNjb3BlYCBpcyBvbmUgb2YgYEF1dGhTY29wZXNgLCBhbmQgcHJvdmlkZVxuICogYXV0by1jb21wbGV0ZS5cbiAqXG4gKiBAYXV0aG9yIEtyaXN0aWFuIFJla3N0YWQgPGtyZUBjYXByYWNvbnN1bHRpbmcubm8+XG4gKiBAYXV0aG9yIEhlcm1hbm4gTcO4cmtyaWQgPGhlbUBsaWZsaWcubm8+XG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlHYXRld2F5PFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIC8qKiBUaGUgQVBJIEdhdGV3YXkgSFRUUCBBUEkuIFRoaXMgaXMgdGhlIG1haW4gY29uc3RydWN0IGZvciBBUEktR1cuICovXG4gIHB1YmxpYyByZWFkb25seSBodHRwQXBpOiBhcGlndy5IdHRwQXBpXG5cbiAgLyoqIFRoZSByb3V0ZXMgd2hpY2ggY29ubmVjdCB0aGUge0BsaW5rIGh0dHBBcGl9IHRvIHRoZSBiYWNrZW5kIGludGVncmF0aW9uKHMpLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcm91dGVzOiBhcGlndy5IdHRwUm91dGVbXSA9IFtdXG5cbiAgLyoqIFRoZSBkb21haW4gd2hpY2ggY29uc3VtZXJzIG11c3QgdXNlLiovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZ1xuXG4gIC8qKiBBY2Nlc3MgbG9nIGdyb3VwLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nR3JvdXA6IGxvZ3MuTG9nR3JvdXBcblxuICBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBBcGlHYXRld2F5UHJvcHM8QXV0aFNjb3Blc1Q+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEFwaUdhdGV3YXlQcm9wczxBdXRoU2NvcGVzVD4sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIEFwaUdhdGV3YXkudmFsaWRhdGVQcm9wcyhwcm9wcywgaWQsIGNkay5TdGFjay5vZih0aGlzKSlcblxuICAgIGNvbnN0IGN1c3RvbURvbWFpbiA9IG5ldyBDdXN0b21Eb21haW4odGhpcywgXCJDdXN0b21Eb21haW5cIiwgcHJvcHMuZG5zKVxuICAgIHRoaXMuZG9tYWluID0gY3VzdG9tRG9tYWluLmN1c3RvbURvbWFpbk5hbWVcblxuICAgIGxldCBjb3JzT3B0aW9uczogYXBpZ3cuQ29yc1ByZWZsaWdodE9wdGlvbnMgfCB1bmRlZmluZWRcbiAgICBpZiAocHJvcHMuY29yc0FsbG93QWxsKSB7XG4gICAgICBjb3JzT3B0aW9ucyA9IHtcbiAgICAgICAgYWxsb3dPcmlnaW5zOiBbXCIqXCJdLFxuICAgICAgICAvLyBcIlRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjYW4ndCBiZSB3aWxkY2FyZGVkIGFuZCBhbHdheXMgbmVlZHMgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHlcIlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1xuICAgICAgICAvLyBDb250ZW50LVR5cGUgbWF5IGFsc28gcmVxdWlyZSBleHBsaWNpdCB3aGl0ZWxpc3Rpbmc6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82MzU2NzY0N1xuICAgICAgICBhbGxvd0hlYWRlcnM6IFtcIkF1dGhvcml6YXRpb25cIiwgXCJDb250ZW50LVR5cGVcIiwgXCIqXCJdLFxuICAgICAgICAvLyBOb3QgdXNpbmcgJyonIGhlcmUsIGJlY2F1c2UgXCJJbiByZXF1ZXN0cyB3aXRoIGNyZWRlbnRpYWxzLCBpdCBpcyB0cmVhdGVkIGFzIHRoZSBsaXRlcmFsXG4gICAgICAgIC8vIG1ldGhvZCBuYW1lICcqJyB3aXRob3V0IHNwZWNpYWwgc2VtYW50aWNzXCJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9IZWFkZXJzL0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcbiAgICAgICAgYWxsb3dNZXRob2RzOiBbXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuR0VULFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLlBPU1QsXG4gICAgICAgICAgYXBpZ3cuQ29yc0h0dHBNZXRob2QuUFVULFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLlBBVENILFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLkRFTEVURSxcbiAgICAgICAgICBhcGlndy5Db3JzSHR0cE1ldGhvZC5PUFRJT05TLFxuICAgICAgICAgIGFwaWd3LkNvcnNIdHRwTWV0aG9kLkhFQUQsXG4gICAgICAgIF0sXG4gICAgICAgIG1heEFnZTogY2RrLkR1cmF0aW9uLmRheXMoMSksXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGFjdHVhbCBBUEkuIFRoaXMgaG9sZHMgdGhlIHJvdXRlcywgYXV0aG9yaXplcnMgYW5kIGludGVncmF0aW9ucy5cbiAgICBjb25zdCBhcGkgPSBuZXcgYXBpZ3cuSHR0cEFwaSh0aGlzLCBcIkh0dHBBcGktXCIgKyBwcm9wcy5kbnMuc3ViZG9tYWluLCB7XG4gICAgICAvLyBkZWZhdWx0SW50ZWdyYXRpb246IGRlZmF1bHRJbnRlZ3JhdGlvbiwgLy8gVGhpcyBpcyBmb3IgYSBjYXRjaC1hbGwgJGRlZmF1bHQgcm91dGVcbiAgICAgIGRlc2NyaXB0aW9uOiBgQW4gSFRUUCBBUEkgZm9yICR7cHJvcHMuZG5zLnN1YmRvbWFpbn0uJHtwcm9wcy5kbnMuaG9zdGVkWm9uZS56b25lTmFtZX0uYCxcbiAgICAgIGRpc2FibGVFeGVjdXRlQXBpRW5kcG9pbnQ6IHRydWUsIC8vIEZvcmNlIGV4dGVybmFscyB0byBnbyB0aHJvdWdoIGN1c3RvbSBkb21haW4uIE1VU1QgYmUgdHJ1ZSB3aGVuIHVzaW5nIE11dHVhbCBUTFMsIGZvciBzZWN1cml0eSByZWFzb25zXG4gICAgICBjcmVhdGVEZWZhdWx0U3RhZ2U6IHRydWUsXG4gICAgICBkZWZhdWx0RG9tYWluTWFwcGluZzogeyBkb21haW5OYW1lOiBjdXN0b21Eb21haW4uYXBpR3dDdXN0b21Eb21haW4gfSxcbiAgICAgIGNvcnNQcmVmbGlnaHQ6IGNvcnNPcHRpb25zLFxuICAgICAgLi4ucHJvcHM/LnByb3BzT3ZlcnJpZGU/Lmh0dHBBcGksXG4gICAgfSlcbiAgICB0aGlzLmh0dHBBcGkgPSBhcGlcblxuICAgIGNvbnN0IHN0YWdlID0gYXBpLmRlZmF1bHRTdGFnZT8ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYXBpZ3cuQ2ZuU3RhZ2VcblxuICAgIGNvbnN0IGxvZ3MgPSBuZXcgQXBpR2F0ZXdheUFjY2Vzc0xvZ3MoXG4gICAgICB0aGlzLFxuICAgICAgXCJBY2Nlc3NMb2dzXCIsXG4gICAgICBzdGFnZSxcbiAgICAgIHByb3BzLmFjY2Vzc0xvZ3MsXG4gICAgICBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0LFxuICAgIClcbiAgICB0aGlzLmxvZ0dyb3VwID0gbG9ncy5sb2dHcm91cFxuXG4gICAgc3RhZ2UuZGVmYXVsdFJvdXRlU2V0dGluZ3MgPSB7XG4gICAgICAuLi5zdGFnZS5kZWZhdWx0Um91dGVTZXR0aW5ncyxcbiAgICAgIGRldGFpbGVkTWV0cmljc0VuYWJsZWQ6IHByb3BzLmRldGFpbGVkTWV0cmljcyA/PyB0cnVlLFxuICAgICAgdGhyb3R0bGluZ0J1cnN0TGltaXQ6IHByb3BzLnRocm90dGxpbmc/LmJ1cnN0LCAvLyBEZWZhdWx0IGZvciBhY2NvdW50IGlzIDVfMDAwXG4gICAgICB0aHJvdHRsaW5nUmF0ZUxpbWl0OiBwcm9wcy50aHJvdHRsaW5nPy5yYXRlLCAvLyBEZWZhdWx0IGZvciBhY2NvdW50IGlzIDEwXzAwMFxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRJbnRlZ3JhdGlvbiA9IHByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvblxuICAgICAgPyB0aGlzLmNyZWF0ZUludGVncmF0aW9uKHByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbiwgcHJvcHMuZG5zKVxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGNvbnN0IGRlZmF1bHRBdXRob3JpemVyID0gcHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb25cbiAgICAgID8gdGhpcy5jcmVhdGVBdXRob3JpemVyKFwiRGVmYXVsdEF1dGhvcml6ZXJcIiwgcHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb24pXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiBwcm9wcy5yb3V0ZXMpIHtcbiAgICAgIGxldCBpbnRlZ3JhdGlvbjogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25cbiAgICAgIGlmIChyb3V0ZS5pbnRlZ3JhdGlvbikge1xuICAgICAgICBpbnRlZ3JhdGlvbiA9IHRoaXMuY3JlYXRlSW50ZWdyYXRpb24ocm91dGUuaW50ZWdyYXRpb24sIHByb3BzLmRucylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVncmF0aW9uID0gZGVmYXVsdEludGVncmF0aW9uISAvLyBWZXJpZmllZCBpbiB2YWxpZGF0ZVByb3BzXG4gICAgICB9XG5cbiAgICAgIGxldCBhdXRob3JpemVyOiBhcGlndy5JSHR0cFJvdXRlQXV0aG9yaXplciB8IHVuZGVmaW5lZFxuICAgICAgaWYgKHJvdXRlLmF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgYXV0aG9yaXplciA9IHRoaXMuY3JlYXRlQXV0aG9yaXplcihcbiAgICAgICAgICAvLyBVc2luZyB0aGUgcm91dGUgcGF0aCBoZXJlIGNhdXNlZCBDbG91ZEZvcm1hdGlvbiB0byBmYWlsIGR1ZSB0byByZXNvdXJjZSBuYW1lcyBiZWluZyB0b29cbiAgICAgICAgICAvLyBsb25nLiBUaGVyZWZvcmUsIHdlIG5vdyBoYXNoIHRoZSByb3V0ZSBwYXRoIHRvIGdldCBhIHNob3J0ZXIgbmFtZS5cbiAgICAgICAgICBgUm91dGVBdXRob3JpemVyJHtzaG9ydEhhc2goYCR7cm91dGUubWV0aG9kID8/IFwiXCJ9JHtyb3V0ZS5wYXRofWApfWAsXG4gICAgICAgICAgcm91dGUuYXV0aG9yaXphdGlvbixcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXV0aG9yaXplciA9IGRlZmF1bHRBdXRob3JpemVyXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvdXRlUGF0aHMgPSBbcm91dGUucGF0aF1cbiAgICAgIGlmIChyb3V0ZS5pbmNsdWRlU3VicGF0aHMgPT09IHRydWUpIHtcbiAgICAgICAgLy8gSWYgd2UgaW5jbHVkZSBzdWItcGF0aHMsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHJvdXRlIHdpdGggL3twcm94eSt9ICh0aGUgKyBtZWFucyBpdCB3aWxsXG4gICAgICAgIC8vIG1hdGNoIGFsbCBzdWJyb3V0ZXMpLiBXZSB3YW50IGJvdGggdGhpcyByb3V0ZSBhbmQgdGhlIG5vcm1hbCByb3V0ZSB3aXRob3V0IC97cHJveHkrfSxcbiAgICAgICAgLy8gc2luY2UgL3twcm94eSt9IHdpbGwgb25seSBtYXRjaCB0aGUgYmFzZSBwYXRoIHdpdGggdHJhaWxpbmcgc2xhc2guXG4gICAgICAgIHJvdXRlUGF0aHMucHVzaChcbiAgICAgICAgICByb3V0ZS5wYXRoICsgKHJvdXRlLnBhdGggPT09IFwiL1wiID8gXCJcIiA6IFwiL1wiKSArIFwie3Byb3h5K31cIixcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJvdXRlUGF0aCBvZiByb3V0ZVBhdGhzKSB7XG4gICAgICAgIC8vIFRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBBUEkgR2F0ZXdheSBjb25zdHJ1Y3QgaGFkIGEgc2luZ2xlIHJvdXRlIHdpdGggdGhlIElEXG4gICAgICAgIC8vICdEZWZhdWx0UHJveHlSb3V0ZScsIGFuZCBhbGwgZ2F0ZXdheXMgd2UgdXNlZCBleHBvc2VkIHRoZSByb3V0ZSAve3Byb3h5K30uIFdoZW4gdHJ5aW5nIHRvXG4gICAgICAgIC8vIGNoYW5nZSB0byB0aGlzIG5ldyB2ZXJzaW9uIG9mIHRoZSBjb25zdHJ1Y3QsIGRlcGxveW1lbnQgZmFpbGVkIGZvciBnYXRld2F5cyBleHBvc2luZ1xuICAgICAgICAvLyAve3Byb3h5K30sIGJlY2F1c2UgXCJhIHJvdXRlIHdpdGggdGhhdCBrZXkgW2kuZS4gcGF0aCArIG1ldGhvZF0gYWxyZWFkeSBleGlzdHNcIi4gV2UgdGhpbmtcbiAgICAgICAgLy8gdGhpcyBtYXkgYmUgYmVjYXVzZSB3ZSB1c2VkIHRoZSBzYW1lIHJvdXRlIHBhdGgsIGJ1dCB3aXRoIGEgbmV3IHJvdXRlIElELCBjYXVzaW5nXG4gICAgICAgIC8vIGNvbmZ1c2lvbiBmb3IgQ2xvdWRGb3JtYXRpb24uIFNvIHdlIGtlZXAgdGhlIG9sZCByb3V0ZSBJRCBoZXJlIGZvciAve3Byb3h5K30uXG4gICAgICAgIGNvbnN0IHJvdXRlSWQgPVxuICAgICAgICAgIHJvdXRlUGF0aCA9PT0gXCIve3Byb3h5K31cIiA/IFwiRGVmYXVsdFByb3h5Um91dGVcIiA6IGBSb3V0ZS0ke3JvdXRlUGF0aH1gXG5cbiAgICAgICAgdGhpcy5yb3V0ZXMucHVzaChcbiAgICAgICAgICBuZXcgYXBpZ3cuSHR0cFJvdXRlKHRoaXMsIHJvdXRlSWQsIHtcbiAgICAgICAgICAgIGh0dHBBcGk6IGFwaSxcbiAgICAgICAgICAgIGludGVncmF0aW9uOiBpbnRlZ3JhdGlvbixcbiAgICAgICAgICAgIGF1dGhvcml6ZXI6IGF1dGhvcml6ZXIsXG4gICAgICAgICAgICByb3V0ZUtleTogYXBpZ3cuSHR0cFJvdXRlS2V5LndpdGgoXG4gICAgICAgICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgICAgICAgcm91dGUubWV0aG9kXG4gICAgICAgICAgICAgICAgPyBhcGlndy5IdHRwTWV0aG9kW3JvdXRlLm1ldGhvZF1cbiAgICAgICAgICAgICAgICA6IGFwaWd3Lkh0dHBNZXRob2QuQU5ZLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhZ1Jlc291cmNlcyh0aGlzLCAoKSA9PiAoeyBzZXJ2aWNlOiBwcm9wcy5kbnMuc3ViZG9tYWluIH0pKVxuICB9XG5cbiAgLyoqIEB0aHJvd3MgRXJyb3IgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgdmFsaWRhdGVQcm9wcyhcbiAgICBwcm9wczogQXBpR2F0ZXdheVByb3BzLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc3RhY2s6IGNkay5TdGFjayxcbiAgKSB7XG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiBwcm9wcy5yb3V0ZXMpIHtcbiAgICAgIGlmICghcm91dGUuaW50ZWdyYXRpb24gJiYgIXByb3BzLmRlZmF1bHRJbnRlZ3JhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vIGludGVncmF0aW9uIGRlZmluZWQgZm9yIHJvdXRlICcke3JvdXRlLnBhdGh9JywgYW5kIG5vIGRlZmF1bHQgaW50ZWdyYXRpb24gc3BlY2lmaWVkIGZvciB0aGUgZ2F0ZXdheWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmICghcm91dGUuYXV0aG9yaXphdGlvbiAmJiAhcHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBObyBhdXRob3JpemF0aW9uIGRlZmluZWQgZm9yIHJvdXRlICcke3JvdXRlLnBhdGh9JywgYW5kIG5vIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBnYXRld2F5YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKCFyb3V0ZS5wYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBwYXRoICcke3JvdXRlLnBhdGh9JzogcGF0aHMgbXVzdCBiZWdpbiB3aXRoICcvJyAodXNlICcvJyBmb3Igcm9vdCBwYXRoKWAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGlmIChyb3V0ZS5wYXRoICE9PSBcIi9cIiAmJiByb3V0ZS5wYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgcGF0aCAnJHtyb3V0ZS5wYXRofSc6IHBhdGhzIGNhbm5vdCBlbmQgd2l0aCAnLycgKGV4Y2VwdCByb290IHBhdGgpYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICByb3V0ZS5pbnRlZ3JhdGlvbj8udHlwZSA9PT0gXCJBTEJcIiAmJlxuICAgICAgICByb3V0ZS5pbnRlZ3JhdGlvbi5ob3N0TmFtZS5zdGFydHNXaXRoKFwiaHR0cHM6XCIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgYWxiSW50ZWdyYXRpb24uaG9zdEh0dHBzTmFtZSBzaG91bGQgbm90IGluY2x1ZGUgYSBwcm90b2NvbDogJHtyb3V0ZS5pbnRlZ3JhdGlvbi5ob3N0TmFtZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5kbnMuc3ViZG9tYWluID09PSBcIlwiIHx8IHByb3BzLmRucy5zdWJkb21haW4uaW5jbHVkZXMoXCIgXCIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTdWJkb21haW4gbXVzdCBiZSBzZXQsIGFuZCBub3QgY29udGFpbiBzcGFjZXM6ICR7cHJvcHMuZG5zLnN1YmRvbWFpbn1gLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAocHJvcHMudGhyb3R0bGluZz8uYnVyc3QgJiYgcHJvcHMudGhyb3R0bGluZy5idXJzdCA+IDVfMDAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGDimqDvuI8gWW91ciB0aHJvdHRsaW5nIGJ1cnN0IGxpbWl0ICcke3Byb3BzLnRocm90dGxpbmcuYnVyc3R9JyBpcyBoaWdoZXIgdGhhbiB0aGUgQVdTIEFjY291bnQgbGltaXQuIE1ha2Ugc3VyZSB5b3VyIGFjY291bnQgaGFzIHVwZ3JhZGVkIHRoaXMgcXVvdGEhIGAsXG4gICAgICAgIHN0YWNrLFxuICAgICAgICBpZCxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHByb3BzLnRocm90dGxpbmc/LnJhdGUgJiYgcHJvcHMudGhyb3R0bGluZy5yYXRlID4gMTBfMDAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGDimqDvuI8gWW91ciB0aHJvdHRsaW5nIHJhdGUgbGltaXQgJyR7cHJvcHMudGhyb3R0bGluZy5yYXRlfScgaXMgaGlnaGVyIHRoYW4gdGhlIEFXUyBBY2NvdW50IGxpbWl0LiBNYWtlIHN1cmUgeW91ciBhY2NvdW50IGhhcyB1cGdyYWRlZCB0aGlzIHF1b3RhISBgLFxuICAgICAgICBzdGFjayxcbiAgICAgICAgaWQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhdXRob3JpemVyIG9ubHkgYWNjZXB0cyByZXF1ZXN0cyBmcm9tIGV4dGVybmFsIHVzZXJzIHRoYXQgYXJlIGF1dGhvcml6ZWQuXG4gICAqIFVuYXV0aG9yaXplZCB1c2VycyBhcmUgc3RvcHBlZCBpbiB0aGUgQVBJLUdXLCBhbmQgbm90IGZvcndhcmRlZCB0byB0aGUgaW50ZWdyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUF1dGhvcml6ZXI8QXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYXV0aG9yaXphdGlvbjogQXV0aG9yaXphdGlvblByb3BzPEF1dGhTY29wZXNUPixcbiAgKTogYXBpZ3cuSUh0dHBSb3V0ZUF1dGhvcml6ZXIgfCB1bmRlZmluZWQge1xuICAgIHN3aXRjaCAoYXV0aG9yaXphdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIFwiTk9ORVwiOiB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJJQU1cIjoge1xuICAgICAgICAvLyBBUEkgR2F0ZXdheSBpbnZva2VzIHlvdXIgQVBJIHJvdXRlIG9ubHkgaWYgdGhlIGNsaWVudCBoYXMgZXhlY3V0ZS1hcGkgcGVybWlzc2lvbiBmb3IgdGhlIHJvdXRlLlxuICAgICAgICAvLyBUaGUgY2xpZW50IGhhcyB0byB1c2UgQVdTIFNpZ1Y0IHRvIGlkZW50aWZ5IHRoZW1zZWx2ZXMgaW4gdGhlIHJlcXVlc3QuXG4gICAgICAgIC8vIFJlYWQgdGhpcyBwYWdlIGZvciBoZWxwIHdpdGggSUFNIGFuZCBBUEktR1cgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FwaWdhdGV3YXkvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3NlY3VyaXR5X2lhbV9zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICAgICAgLy8gTm90ZSB0aGF0IFtyZXNvdXJjZSBwb2xpY2llcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQgZm9yIEhUVFBdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1hY2Nlc3MtY29udHJvbC1pYW0uaHRtbClcbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwSWFtQXV0aG9yaXplcigpXG4gICAgICB9XG4gICAgICBjYXNlIFwiQ09HTklUT19VU0VSX1BPT0xcIjoge1xuICAgICAgICAvLyBXZSB1c2UgYSBjdXN0b20gbGFtYmRhIGF1dGhvcml6ZXIgaGVyZSBpbnN0ZWFkIG9mIHRoZSBgSHR0cFVzZXJQb29sQXV0aG9yaXplcmAgcHJvdmlkZWRcbiAgICAgICAgLy8gYnkgQ0RLLCBpbiBvcmRlciB0byBzdXBwb3J0IGByZXF1aXJlZFNjb3BlYCBhbmQgc2V0dGluZyBvZiBjdXN0b20gY29udGV4dCB2YXJpYWJsZXMuXG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZXIgPSBuZXcgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGlkICsgXCJMYW1iZGFcIixcbiAgICAgICAgICBhdXRob3JpemF0aW9uLFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwTGFtYmRhQXV0aG9yaXplcihpZCwgYXV0aG9yaXplci5sYW1iZGEsIHtcbiAgICAgICAgICByZXNwb25zZVR5cGVzOiBhdXRob3JpemVyLnJlc3BvbnNlVHlwZXMsXG4gICAgICAgICAgLy8gTWF4IDFoLCBvciBkaXNhYmxlZCAoMHMpLiBUaGUgdmFsdWUgb25seSBtYXR0ZXJzIHdoZW4gaW52YWxpZGF0aW5nL2R5bmFtaWMgY3JlZGVudGlhbHNcbiAgICAgICAgICByZXN1bHRzQ2FjaGVUdGw6IGNkay5EdXJhdGlvbi5ob3VycygxKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJCQVNJQ19BVVRIXCI6IHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplciA9IG5ldyBCYXNpY0F1dGhBdXRob3JpemVyKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgaWQgKyBcIkxhbWJkYVwiLFxuICAgICAgICAgIGF1dGhvcml6YXRpb24sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gbmV3IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFBdXRob3JpemVyKGlkLCBhdXRob3JpemVyLmxhbWJkYSwge1xuICAgICAgICAgIHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXIucmVzcG9uc2VUeXBlcyxcbiAgICAgICAgICAvLyBNYXggMWgsIG9yIGRpc2FibGVkICgwcykuIFRoZSB2YWx1ZSBvbmx5IG1hdHRlcnMgd2hlbiBpbnZhbGlkYXRpbmcvZHluYW1pYyBjcmVkZW50aWFsc1xuICAgICAgICAgIHJlc3VsdHNDYWNoZVR0bDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY2FzZSBcIkNPR05JVE9fVVNFUl9QT09MX09SX0JBU0lDX0FVVEhcIjoge1xuICAgICAgICBjb25zdCBhdXRob3JpemVyID0gbmV3IENvZ25pdG9Vc2VyUG9vbE9yQmFzaWNBdXRoQXV0aG9yaXplcihcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGlkICsgXCJMYW1iZGFcIixcbiAgICAgICAgICBhdXRob3JpemF0aW9uLFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIG5ldyBhdXRob3JpemVycy5IdHRwTGFtYmRhQXV0aG9yaXplcihpZCwgYXV0aG9yaXplci5sYW1iZGEsIHtcbiAgICAgICAgICByZXNwb25zZVR5cGVzOiBhdXRob3JpemVyLnJlc3BvbnNlVHlwZXMsXG4gICAgICAgICAgLy8gTWF4IDFoLCBvciBkaXNhYmxlZCAoMHMpLiBUaGUgdmFsdWUgb25seSBtYXR0ZXJzIHdoZW4gaW52YWxpZGF0aW5nL2R5bmFtaWMgY3JlZGVudGlhbHNcbiAgICAgICAgICByZXN1bHRzQ2FjaGVUdGw6IGNkay5EdXJhdGlvbi5ob3VycygxKSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUludGVncmF0aW9uKFxuICAgIGludGVncmF0aW9uOiBJbnRlZ3JhdGlvblByb3BzLFxuICAgIGRuczogQXBpR2F0ZXdheVByb3BzW1wiZG5zXCJdLFxuICApOiBhcGlndy5IdHRwUm91dGVJbnRlZ3JhdGlvbiB7XG4gICAgc3dpdGNoIChpbnRlZ3JhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIFwiQUxCXCI6IHtcbiAgICAgICAgLy8gVGhlIFZQQ0xpbmsgY29ubmVjdHMgdGhlIGludGVncmF0aW9uIGludG8gdGhlIEFMQidzIFZQQy4gTXVzdCBiZSBtYW51YWxseSBjcmVhdGVkIHdoZW5cbiAgICAgICAgLy8gdGhlIFZQQyBpcyBpbXBvcnRlZCwgd2hpY2ggaXMgdGhlIGNhc2Ugd2hlbiB1c2luZyBDb3JlUGxhdGZvcm1Db25zdW1lci5cbiAgICAgICAgY29uc3QgdnBjTGluayA9IG5ldyBhcGlndy5WcGNMaW5rKHRoaXMsIFwiQWxiVnBjTGlua1wiLCB7XG4gICAgICAgICAgdnBjOiBpbnRlZ3JhdGlvbi52cGMsXG4gICAgICAgICAgc2VjdXJpdHlHcm91cHM6IFtpbnRlZ3JhdGlvbi5zZWN1cml0eUdyb3VwXSxcbiAgICAgICAgICBzdWJuZXRzOiBpbnRlZ3JhdGlvbi52cGMuc2VsZWN0U3VibmV0cygpLCAvLyBUaGlzIGNvcnJlY3RseSBzZWxlY3RzIHRoZSBwcml2YXRlIHN1Ym5ldHNcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJNYXBwaW5nID0gbmV3IGFwaWd3LlBhcmFtZXRlck1hcHBpbmcoKVxuICAgICAgICAgIC8qKiBTZWUge0BsaW5rIEFsYkludGVncmF0aW9uUHJvcHMuaG9zdE5hbWV9ICovXG4gICAgICAgICAgLm92ZXJ3cml0ZUhlYWRlcihcbiAgICAgICAgICAgIFwiSG9zdFwiLFxuICAgICAgICAgICAgLy8gVGhlIEhvc3QgaGVhZGVyIGNhbiBOT1QgdXNlIGR5bmFtaWMgbWFwcGluZywgbGlrZSAkY29udGV4dC5kb21haW5OYW1lIGV0Yy5cbiAgICAgICAgICAgIGFwaWd3Lk1hcHBpbmdWYWx1ZS5jdXN0b20oaW50ZWdyYXRpb24uaG9zdE5hbWUpLFxuICAgICAgICAgIClcbiAgICAgICAgaWYgKGludGVncmF0aW9uLm1hcFBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGludGVncmF0aW9uLm1hcFBhcmFtZXRlcnMocGFyYW1ldGVyTWFwcGluZylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb25zLkh0dHBBbGJJbnRlZ3JhdGlvbihcbiAgICAgICAgICBcIkFsYkludGVncmF0aW9uLVwiICsgZG5zLnN1YmRvbWFpbixcbiAgICAgICAgICBpbnRlZ3JhdGlvbi5sb2FkQmFsYW5jZXJMaXN0ZW5lcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZWN1cmVTZXJ2ZXJOYW1lOiBpbnRlZ3JhdGlvbi5ob3N0TmFtZSxcbiAgICAgICAgICAgIHZwY0xpbms6IHZwY0xpbmssXG4gICAgICAgICAgICBtZXRob2Q6IGFwaWd3Lkh0dHBNZXRob2QuQU5ZLFxuICAgICAgICAgICAgcGFyYW1ldGVyTWFwcGluZyxcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBjYXNlIFwiTGFtYmRhXCI6IHtcbiAgICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbnMuSHR0cExhbWJkYUludGVncmF0aW9uKFxuICAgICAgICAgIFwiTGFtYmRhSW50ZWdyYXRpb25cIixcbiAgICAgICAgICBpbnRlZ3JhdGlvbi5sYW1iZGEsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF5bG9hZEZvcm1hdFZlcnNpb246IGFwaWd3LlBheWxvYWRGb3JtYXRWZXJzaW9uLlZFUlNJT05fMl8wLFxuICAgICAgICAgICAgcGFyYW1ldGVyTWFwcGluZzogdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJTUVNcIjoge1xuICAgICAgICAvLyBBUEktR1cgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gU1FTIGJ5IGRlZmF1bHRcbiAgICAgICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGBBcGlHd1RvJHtpbnRlZ3JhdGlvbi5xdWV1ZS5ub2RlLmlkfVNlcnZpY2VSb2xlYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgXCJBbGxvd3MgQVBJLUdXIHRvIGFkZCBtZXNzYWdlcyB0byBcIiArIGludGVncmF0aW9uLnF1ZXVlLnF1ZXVlQXJuLFxuICAgICAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJhcGlnYXRld2F5LmFtYXpvbmF3cy5jb21cIiksXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBpbnRlZ3JhdGlvbi5xdWV1ZS5ncmFudFNlbmRNZXNzYWdlcyhyb2xlKVxuXG4gICAgICAgIGxldCBwYXJhbWV0ZXJNYXBwaW5nID0gbmV3IGFwaWd3LlBhcmFtZXRlck1hcHBpbmcoKVxuICAgICAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1kZXZlbG9wLWludGVncmF0aW9ucy1hd3Mtc2VydmljZXMtcmVmZXJlbmNlLmh0bWwjU1FTLVNlbmRNZXNzYWdlXG4gICAgICAgICAgLmN1c3RvbShcIlF1ZXVlVXJsXCIsIGludGVncmF0aW9uLnF1ZXVlLnF1ZXVlVXJsKVxuICAgICAgICAgIC5jdXN0b20oXCJNZXNzYWdlQm9keVwiLCBcIiRyZXF1ZXN0LmJvZHlcIilcbiAgICAgICAgICAuY3VzdG9tKFwiUmVnaW9uXCIsIFwiZXUtd2VzdC0xXCIpIC8vIENoYW5nZSB0aGlzIGlmIHRoZSBTUVMgcXVldWUgaXMgaW4gYW5vdGhlciByZWdpb24hXG5cbiAgICAgICAgaWYgKGludGVncmF0aW9uLm1lc3NhZ2VBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgcGFyYW1ldGVyTWFwcGluZyA9IHBhcmFtZXRlck1hcHBpbmcuY3VzdG9tKFxuICAgICAgICAgICAgXCJNZXNzYWdlQXR0cmlidXRlc1wiLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW50ZWdyYXRpb24ubWVzc2FnZUF0dHJpYnV0ZXMpLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU3FzUm91dGVJbnRlZ3JhdGlvbihcIlNxc0ludGVncmF0aW9uXCIsIHtcbiAgICAgICAgICB0eXBlOiBhcGlndy5IdHRwSW50ZWdyYXRpb25UeXBlLkFXU19QUk9YWSxcbiAgICAgICAgICBzdWJ0eXBlOiBhcGlndy5IdHRwSW50ZWdyYXRpb25TdWJ0eXBlLlNRU19TRU5EX01FU1NBR0UsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IGFwaWd3LkludGVncmF0aW9uQ3JlZGVudGlhbHMuZnJvbVJvbGUocm9sZSksXG4gICAgICAgICAgcGFyYW1ldGVyTWFwcGluZzogcGFyYW1ldGVyTWFwcGluZyxcbiAgICAgICAgICBwYXlsb2FkRm9ybWF0VmVyc2lvbjogYXBpZ3cuUGF5bG9hZEZvcm1hdFZlcnNpb24uVkVSU0lPTl8xXzAsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBhIGdyYW50YWJsZSB0YXJnZXQgKHJvbGUsIHVzZXIgZXRjLikgcGVybWlzc2lvbiB0byBpbnZva2UgdGhlIEFQSS5cbiAgICogT25seSB3b3JrcyB3aGVuIHVzaW5nIGBJQU1gIGFzIHtAbGluayBBcGlHYXRld2F5Um91dGUuYXV0aG9yaXphdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgQSBncmFudGFibGUsIGxpa2Uge0BsaW5rIGlhbS5Sb2xlfVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKHRhcmdldDogaWFtLklHcmFudGFibGUpIHtcbiAgICBmb3IgKGNvbnN0IHJvdXRlUHJvcHMgb2YgdGhpcy5wcm9wcy5yb3V0ZXMpIHtcbiAgICAgIGNvbnN0IGF1dGhUeXBlID1cbiAgICAgICAgcm91dGVQcm9wcy5hdXRob3JpemF0aW9uPy50eXBlID8/IHRoaXMucHJvcHMuZGVmYXVsdEF1dGhvcml6YXRpb24/LnR5cGVcblxuICAgICAgaWYgKGF1dGhUeXBlICE9PSBcIklBTVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGdyYW50IGludm9rZSBmb3IgYW4gQVBJIEdhdGV3YXkgd2hlbiBub3QgdXNpbmcgSUFNIGF1dGggKGZvdW5kIGF1dGggJyR7YXV0aFR5cGV9JyBvbiByb3V0ZSAnJHtyb3V0ZVByb3BzLnBhdGh9JykgWyR7Y2RrLlN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX1dYCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgIHJvdXRlLmdyYW50SW52b2tlKHRhcmdldClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGRvbWFpbiBmb3IgdGhlIEFQSS1HYXRld2F5LCBhIFJvdXRlNTMgcmVjb3JkIGFuZCBhbiBIVFRQUyBjZXJ0LlxuICogQGF1dGhvciBLcmlzdGlhbiBSZWtzdGFkIDxrcmVAY2FwcmFjb25zdWx0aW5nLm5vPlxuICovXG5jbGFzcyBDdXN0b21Eb21haW4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBhcGlHd0N1c3RvbURvbWFpbjogYXBpZ3cuRG9tYWluTmFtZVxuXG4gIC8qKiBUaGUgRnVsbHkgUXVhbGlmaWVkIERvbWFpbiBOYW1lIChGUUROKSBsaWtlIGBwcm9kdWN0LnBsYXRmb3JtLmV4YW1wbGUubm9gLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3VzdG9tRG9tYWluTmFtZTogc3RyaW5nXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEFwaUdhdGV3YXlEbnNQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMuY3VzdG9tRG9tYWluTmFtZSA9IGAke3Byb3BzLnN1YmRvbWFpbn0uJHtwcm9wcy5ob3N0ZWRab25lLnpvbmVOYW1lfWBcblxuICAgIC8vIENhbiBhbHNvIHVzZSB3aWxkY2FyZCBjZXJ0cyBpbnN0ZWFkISBDaGVhcGVyXG4gICAgLyoqIEFsbG93cyBleHRlcm5hbCB1c2VycyB0byBjb25uZWN0IHdpdGggSFRUUFMuICovXG4gICAgY29uc3QgY3VzdG9tRG9tYWluQ2VydCA9IG5ldyBhY20uQ2VydGlmaWNhdGUodGhpcywgXCJIdHRwc0NlcnRpZmljYXRlXCIsIHtcbiAgICAgIGRvbWFpbk5hbWU6IHRoaXMuY3VzdG9tRG9tYWluTmFtZSxcbiAgICAgIHZhbGlkYXRpb246IGFjbS5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyhwcm9wcy5ob3N0ZWRab25lKSxcbiAgICB9KVxuXG4gICAgLy8gTm90ZSB0aGF0IEFQSS1HVyBjYW4gYWxzbyBzdXBwb3J0IHdpbGRjYXJkIGRvbWFpbnMhIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1jdXN0b20tZG9tYWluLW5hbWVzLmh0bWwjaHR0cC13aWxkY2FyZC1jdXN0b20tZG9tYWluLW5hbWVzXG4gICAgLy8gQnV0IHRoaXMgd2lsbCBub3Qgd29yayB3aGVuIEFXUyBhY2NvdW50IFggaGFzIEN1c3RvbURvbWFpbiBgc3RhZ2luZy5wbGF0Zm9ybS5leGFtcGxlLm5vYCBhbmQgYWNjb3VudCBZIGhhcyBDdXN0b21Eb21haW4gYCoucGxhdGZvcm0uZXhhbXBsZS5ub2AuXG4gICAgLy8gTm90IHN1cmUgaG93IHN1Yi1zdWJkb21haW5zIGFyZSBhZmZlY3RlZDogYG15c2VydmljZS5zdGFnaW5nLnBsYXRmb3JtLmV4YW1wbGUubm9gIGFuZCBgKi5wbGF0Zm9ybS5leGFtcGxlLm5vYC5cbiAgICB0aGlzLmFwaUd3Q3VzdG9tRG9tYWluID0gbmV3IGFwaWd3LkRvbWFpbk5hbWUoXG4gICAgICB0aGlzLFxuICAgICAgXCJEb21haW5OYW1lLVwiICsgcHJvcHMuc3ViZG9tYWluLFxuICAgICAge1xuICAgICAgICBkb21haW5OYW1lOiB0aGlzLmN1c3RvbURvbWFpbk5hbWUsXG4gICAgICAgIGNlcnRpZmljYXRlOiBjdXN0b21Eb21haW5DZXJ0LFxuICAgICAgICBlbmRwb2ludFR5cGU6IGFwaWd3LkVuZHBvaW50VHlwZS5SRUdJT05BTCxcbiAgICAgICAgc2VjdXJpdHlQb2xpY3k6IGFwaWd3LlNlY3VyaXR5UG9saWN5LlRMU18xXzIsXG4gICAgICB9LFxuICAgIClcblxuICAgIC8vIFRoaXMgbWFrZXMgdGhlIEFQSS1HVyBwdWJsaWNseSBhdmFpbGFibGUgb24gdGhlIGN1c3RvbSBkb21haW4gbmFtZS5cbiAgICBuZXcgcm91dGU1My5BUmVjb3JkKHRoaXMsIFwiUm91dGU1M0FSZWNvcmRBcGlnd0FsaWFzXCIsIHtcbiAgICAgIHJlY29yZE5hbWU6IHByb3BzLnN1YmRvbWFpbixcbiAgICAgIHpvbmU6IHByb3BzLmhvc3RlZFpvbmUsXG4gICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhcbiAgICAgICAgbmV3IHJvdXRlNTNUYXJnZXRzLkFwaUdhdGV3YXl2MkRvbWFpblByb3BlcnRpZXMoXG4gICAgICAgICAgdGhpcy5hcGlHd0N1c3RvbURvbWFpbi5yZWdpb25hbERvbWFpbk5hbWUsXG4gICAgICAgICAgdGhpcy5hcGlHd0N1c3RvbURvbWFpbi5yZWdpb25hbEhvc3RlZFpvbmVJZCxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgICB0dGw6IHByb3BzLnR0bCA/PyBjZGsuRHVyYXRpb24ubWludXRlcyg1KSwgLy8gTG93IFRUTCBtYWtlcyBpdCBlYXNpZXIgdG8gZG8gY2hhbmdlc1xuICAgIH0pXG4gIH1cbn1cblxuLyoqIEFjdHMgYXMgZ2x1ZSAoYmV0d2VlbiB0aGUgaW50ZWdyYXRpb24gcHJvcHMgYW5kIHRoZSBIdHRwQXBpKSB3aGVuIGNyZWF0aW5nIGFuIFNxc0ludGVncmF0aW9uLiAqL1xuY2xhc3MgU3FzUm91dGVJbnRlZ3JhdGlvbiBleHRlbmRzIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgdXNlZCBpbiB0aGUge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gY29uc3RydWN0XG4gICAqICAgIGNyZWF0ZWQgaW50ZXJuYWxseSBieSB7QGxpbmsgYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb24uX2JpbmRUb1JvdXRlfS5cbiAgICogICAgW1NvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9iNWFlMzc3ODJiYzNjYjYzN2VlZWY5ZmJiMWZiZTJjNWVmZGZjMDY4L3BhY2thZ2VzLyU0MGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi9saWIvaHR0cC9pbnRlZ3JhdGlvbi50cyNMMzIxKVxuICAgKiBAcGFyYW0gaW50ZWdyYXRpb25Qcm9wcyBUaGUgcHJvcHMgdG8gcGFzcyB0byB0aGUge0BsaW5rIGFwaWd3Lkh0dHBJbnRlZ3JhdGlvbn0gY29uc3RydWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGludGVncmF0aW9uUHJvcHM6IGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9uQ29uZmlnLFxuICApIHtcbiAgICBzdXBlcihpZClcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHNlbmRzIHRoZSBwcm9wZXJ0aWVzIG5lZWRlZCBmb3IgY3JlYXRpbmcgYSB7QGxpbmsgYXBpZ3cuSHR0cEludGVncmF0aW9ufSB0byB0aGVcbiAgICoge0BsaW5rIGFwaWd3Lkh0dHBSb3V0ZUludGVncmF0aW9ufS5cbiAgICovXG4gIGJpbmQoKTogYXBpZ3cuSHR0cFJvdXRlSW50ZWdyYXRpb25Db25maWcge1xuICAgIC8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9iNWFlMzc3ODJiYzNjYjYzN2VlZWY5ZmJiMWZiZTJjNWVmZGZjMDY4L3BhY2thZ2VzLyU0MGF3cy1jZGsvYXdzLWFwaWdhdGV3YXl2Mi9saWIvaHR0cC9pbnRlZ3JhdGlvbi50cyNMMzE5XG4gICAgcmV0dXJuIHRoaXMuaW50ZWdyYXRpb25Qcm9wc1xuICB9XG59XG5cbi8qKlxuICogV2hlbiB1c2luZyBgTm9kZWpzRnVuY3Rpb25gIHdpdGggYGVudHJ5YCwgd2UgcG9pbnQgQ0RLIHRvIGEgZmlsZSB3aXRoIG91ciBsYW1iZGEgY29kZS4gVGhpcyBjYW5cbiAqIGVpdGhlciBiZSBhIFR5cGVTY3JpcHQgb3IgSmF2YVNjcmlwdCBmaWxlLiBXaGVuIGNyZWF0aW5nIGNvbnN0cnVjdHMgaW4gdGVzdHMgaW5zaWRlIHRoaXMgbGlicmFyeSxcbiAqIHRoZSBlbnRyeSB3aWxsIHBvaW50IHRvIHRoZSBUeXBlU2NyaXB0IGZpbGUgaW4gdGhlIHNvdXJjZSBjb2RlLiBCdXQgd2hlbiBhIGxpYnJhcnkgY29uc3VtZXIgdXNlc1xuICogdGhpcywgaXQgd2lsbCBpbnN0ZWFkIHBvaW50IHRvIHRoZSB0cmFuc3BpbGVkIEphdmFTY3JpcHQgZmlsZS4gU28gdG8gc2V0IHRoZSBjb3JyZWN0IGZpbGVcbiAqIGV4dGVuc2lvbiwgd2UgbXVzdCBjaGVjayBpZiB3ZSdyZSBiZWluZyBydW4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIFR5cGVTY3JpcHQgc291cmNlIGNvZGVcbiAqIChzcmMvYXBpLWdhdGV3YXkpLCBvdGhlcndpc2Ugd2UncmUgYmVpbmcgcnVuIGJ5IGEgY29uc3VtZXIgYXMgdHJhbnNwaWxlZCBKYXZhU2NyaXB0LlxuICovXG5jb25zdCBhdXRob3JpemVyRmlsZUV4dGVuc2lvbiA9IF9fZGlybmFtZS5lbmRzV2l0aChcInNyYy9hcGktZ2F0ZXdheVwiKVxuICA/IFwidHNcIlxuICA6IFwianNcIlxuXG4vKipcbiAqIENyZWF0ZXMgYSBjdXN0b20gYXV0aG9yaXplciBsYW1iZGEgd2hpY2ggcmVhZHMgYEF1dGhvcml6YXRpb246IEJlYXJlciA8YWNjZXNzIHRva2VuPmAgaGVhZGVyIGFuZFxuICogdmVyaWZpZXMgdGhlIHRva2VuIGFnYWluc3QgYSBDb2duaXRvIHVzZXIgcG9vbC5cbiAqL1xuY2xhc3MgQ29nbml0b1VzZXJQb29sQXV0aG9yaXplcjxcbiAgQXV0aFNjb3Blc1QgZXh0ZW5kcyBzdHJpbmcsXG4+IGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbGFtYmRhOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgLyoqXG4gICAqIFVzZSBzaW1wbGUgcmVzcG9uc2UgdHlwZSAoYHsgaXNBdXRob3JpemVkOiB0cnVlL2ZhbHNlIH1gKSwgYXMgb3Bwb3NlZCB0byByZXR1cm5pbmcgYW4gSUFNXG4gICAqIFBvbGljeSBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZXNwb25zZVR5cGVzOiBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlW10gPSBbXG4gICAgYXV0aG9yaXplcnMuSHR0cExhbWJkYVJlc3BvbnNlVHlwZS5TSU1QTEUsXG4gIF1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQ29nbml0b1VzZXJQb29sQXV0aG9yaXplclByb3BzPEF1dGhTY29wZXNUPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgdGhpcy5sYW1iZGEgPSBuZXcgbGFtYmRhTm9kZWpzLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiQXV0aG9yaXplckZ1bmN0aW9uXCIsIHtcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgYGF1dGhvcml6ZXItbGFtYmRhcy9jb2duaXRvLXVzZXItcG9vbC1hdXRob3JpemVyLiR7YXV0aG9yaXplckZpbGVFeHRlbnNpb259YCxcbiAgICAgICksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiVVNFUl9QT09MX0lEXCJdOiBwcm9wcy51c2VyUG9vbC51c2VyUG9vbElkLFxuICAgICAgICBbXCJSRVFVSVJFRF9TQ09QRVwiXTogcHJvcHMucmVxdWlyZWRTY29wZSA/PyBcIlwiLFxuICAgICAgICBbXCJDUkVERU5USUFMU19GT1JfSU5URVJOQUxfQVVUSE9SSVpBVElPTlwiXTpcbiAgICAgICAgICBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvblxuICAgICAgICAgICAgPyBwcm9wcy5jcmVkZW50aWFsc0ZvckludGVybmFsQXV0aG9yaXphdGlvblxuICAgICAgICAgICAgOiBcIlwiLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLmNyZWRlbnRpYWxzRm9ySW50ZXJuYWxBdXRob3JpemF0aW9uKSB7XG4gICAgICBzZWNyZXRzbWFuYWdlci5TZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIGlkICsgXCJCYXNpY0F1dGhTZWNyZXRcIixcbiAgICAgICAgcHJvcHMuY3JlZGVudGlhbHNGb3JJbnRlcm5hbEF1dGhvcml6YXRpb24sXG4gICAgICApLmdyYW50UmVhZCh0aGlzLmxhbWJkYSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIHJlYWRzIGBBdXRob3JpemF0aW9uOiBCYXNpYyA8YmFzZTY0LWVuY29kZWQgY3JlZGVudGlhbHM+YFxuICogaGVhZGVyIGFuZCB2ZXJpZmllcyB0aGUgY3JlZGVudGlhbHMgYWdhaW5zdCBhIGdpdmVuIHNlY3JldC5cbiAqL1xuY2xhc3MgQmFzaWNBdXRoQXV0aG9yaXplciBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYTogbGFtYmRhLklGdW5jdGlvblxuXG4gIC8vIFNpbXBsZSBpcyBgeyBpc0F1dGhvcml6ZWQ6IHRydWUvZmFsc2UgfWAsIGFzIG9wcG9zZWQgdG8gcmV0dXJuaW5nIGFuIElBTSBQb2xpY3kgZG9jdW1lbnRcbiAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGVbXSA9IFtcbiAgICBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRSxcbiAgXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBCYXNpY0F1dGhBdXRob3JpemVyUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMubGFtYmRhID0gbmV3IGxhbWJkYU5vZGVqcy5Ob2RlanNGdW5jdGlvbih0aGlzLCBcIkJhc2ljQXV0aExhbWJkYVwiLCB7XG4gICAgICBlbnRyeTogcGF0aC5qb2luKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIGBhdXRob3JpemVyLWxhbWJkYXMvYmFzaWMtYXV0aC1hdXRob3JpemVyLiR7YXV0aG9yaXplckZpbGVFeHRlbnNpb259YCxcbiAgICAgICksXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBbiBhdXRob3JpemVyIGZvciBBUEktR2F0ZXdheSB0aGF0IGNoZWNrcyBCYXNpYyBBdXRoIGNyZWRlbnRpYWxzIG9uIHJlcXVlc3RzXCIsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFtcIkNSRURFTlRJQUxTX1NFQ1JFVF9OQU1FXCJdOiBwcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWVcbiAgICAgICAgICA/IHByb3BzLmNyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgIDogXCJcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGlmIChwcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWUpIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5jcmVkZW50aWFsc1NlY3JldE5hbWUsXG4gICAgICApLmdyYW50UmVhZCh0aGlzLmxhbWJkYSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgY3VzdG9tIGF1dGhvcml6ZXIgbGFtYmRhIHdoaWNoIGFsbG93cyBib3RoOlxuICogLSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhY2Nlc3MgdG9rZW4+YCBoZWFkZXIsIGZvciB3aGljaCB0aGUgdG9rZW4gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBnaXZlblxuICogICBDb2duaXRvIHVzZXIgcG9vbFxuICogLSBgQXV0aG9yaXphdGlvbjogQmFzaWMgPGJhc2U2NC1lbmNvZGVkIGNyZWRlbnRpYWxzPmAgaGVhZGVyLCBmb3Igd2hpY2ggdGhlIGNyZWRlbnRpYWxzIGFyZVxuICogICBjaGVja2VkIGFnYWluc3QgdGhlIGNyZWRlbnRpYWxzIGZyb20gdGhlIGdpdmVuIGJhc2ljIGF1dGggc2VjcmV0IG5hbWVcbiAqXG4gKiBJZiBlaXRoZXIgb2YgdGhlc2UgYXJlIGdpdmVuIGFuZCB2YWxpZCwgdGhlIHJlcXVlc3QgaXMgYXV0aGVudGljYXRlZC5cbiAqL1xuY2xhc3MgQ29nbml0b1VzZXJQb29sT3JCYXNpY0F1dGhBdXRob3JpemVyPFxuICBBdXRoU2NvcGVzVCBleHRlbmRzIHN0cmluZyxcbj4gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGE6IGxhbWJkYS5JRnVuY3Rpb25cblxuICAvKipcbiAgICogVXNlIHNpbXBsZSByZXNwb25zZSB0eXBlIChgeyBpc0F1dGhvcml6ZWQ6IHRydWUvZmFsc2UgfWApLCBhcyBvcHBvc2VkIHRvIHJldHVybmluZyBhbiBJQU1cbiAgICogUG9saWN5IGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc3BvbnNlVHlwZXM6IGF1dGhvcml6ZXJzLkh0dHBMYW1iZGFSZXNwb25zZVR5cGVbXSA9IFtcbiAgICBhdXRob3JpemVycy5IdHRwTGFtYmRhUmVzcG9uc2VUeXBlLlNJTVBMRSxcbiAgXVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBDb2duaXRvVXNlclBvb2xPckJhc2ljQXV0aEF1dGhvcml6ZXJQcm9wczxBdXRoU2NvcGVzVD4sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMubGFtYmRhID0gbmV3IGxhbWJkYU5vZGVqcy5Ob2RlanNGdW5jdGlvbih0aGlzLCBcIkF1dGhvcml6ZXJGdW5jdGlvblwiLCB7XG4gICAgICBlbnRyeTogcGF0aC5qb2luKFxuICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgIGBhdXRob3JpemVyLWxhbWJkYXMvY29nbml0by11c2VyLXBvb2wtb3ItYmFzaWMtYXV0aC1hdXRob3JpemVyLiR7YXV0aG9yaXplckZpbGVFeHRlbnNpb259YCxcbiAgICAgICksXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDUpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgW1wiVVNFUl9QT09MX0lEXCJdOiBwcm9wcy51c2VyUG9vbCA/IHByb3BzLnVzZXJQb29sLnVzZXJQb29sSWQgOiBcIlwiLFxuICAgICAgICBbXCJSRVFVSVJFRF9TQ09QRVwiXTogcHJvcHMucmVxdWlyZWRTY29wZSA/PyBcIlwiLFxuICAgICAgICBbXCJCQVNJQ19BVVRIX0NSRURFTlRJQUxTX1NFQ1JFVF9OQU1FXCJdOlxuICAgICAgICAgIHByb3BzLmJhc2ljQXV0aENyZWRlbnRpYWxzU2VjcmV0TmFtZVxuICAgICAgICAgICAgPyBwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWVcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGlmIChwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWUpIHtcbiAgICAgIHNlY3JldHNtYW5hZ2VyLlNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgaWQgKyBcIkJhc2ljQXV0aFNlY3JldFwiLFxuICAgICAgICBwcm9wcy5iYXNpY0F1dGhDcmVkZW50aWFsc1NlY3JldE5hbWUsXG4gICAgICApLmdyYW50UmVhZCh0aGlzLmxhbWJkYSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNsaWdodGx5IGV4dGVuZGVkIHZlcnNpb24gb2YgdGhlIFtkZWZhdWx0IEpTT04gZm9ybWF0IHN1Z2dlc3RlZCBieSBBV1NdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1sb2dnaW5nLmh0bWwjaHR0cC1hcGktZW5hYmxlLWxvZ2dpbmcuZXhhbXBsZXMpLlxuICovXG5jb25zdCBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0ID0ge1xuICByZXF1ZXN0SWQ6IFwiJGNvbnRleHQucmVxdWVzdElkXCIsXG4gIHVzZXJBZ2VudDogXCIkY29udGV4dC5pZGVudGl0eS51c2VyQWdlbnRcIixcbiAgaXA6IFwiJGNvbnRleHQuaWRlbnRpdHkuc291cmNlSXBcIixcbiAgLyoqIENMRiBmb3JtYXQ6IGBkZC9NTU0veXl5eTpISDptbTpzcyArLWhobW1gICovXG4gIHJlcXVlc3RUaW1lOiBcIiRjb250ZXh0LnJlcXVlc3RUaW1lXCIsXG4gIHJlcXVlc3RUaW1lRXBvY2g6IFwiJGNvbnRleHQucmVxdWVzdFRpbWVFcG9jaFwiLFxuICBkYXRhUHJvY2Vzc2VkOiBcIiRjb250ZXh0LmRhdGFQcm9jZXNzZWRcIixcbiAgaHR0cE1ldGhvZDogXCIkY29udGV4dC5odHRwTWV0aG9kXCIsXG4gIHBhdGg6IFwiJGNvbnRleHQucGF0aFwiLFxuICByb3V0ZUtleTogXCIkY29udGV4dC5yb3V0ZUtleVwiLFxuICBzdGF0dXM6IFwiJGNvbnRleHQuc3RhdHVzXCIsXG4gIHByb3RvY29sOiBcIiRjb250ZXh0LnByb3RvY29sXCIsXG4gIHJlc3BvbnNlTGVuZ3RoOiBcIiRjb250ZXh0LnJlc3BvbnNlTGVuZ3RoXCIsXG4gIHJlc3BvbnNlTGF0ZW5jeTogXCIkY29udGV4dC5yZXNwb25zZUxhdGVuY3lcIixcbiAgZG9tYWluTmFtZTogXCIkY29udGV4dC5kb21haW5OYW1lXCIsXG4gIGVycm9yOiB7XG4gICAgdHlwZTogXCIkY29udGV4dC5lcnJvci5yZXNwb25zZVR5cGVcIixcbiAgICBnYXRld2F5RXJyb3I6IFwiJGNvbnRleHQuZXJyb3IubWVzc2FnZVwiLFxuICAgIGludGVncmF0aW9uRXJyb3I6IFwiJGNvbnRleHQuaW50ZWdyYXRpb24uZXJyb3JcIixcbiAgICBhdXRob3JpemVyRXJyb3I6IFwiJGNvbnRleHQuYXV0aG9yaXplci5lcnJvclwiLFxuICB9LFxuICBpbnRlZ3JhdGlvbjoge1xuICAgIGxhdGVuY3k6IFwiJGNvbnRleHQuaW50ZWdyYXRpb24ubGF0ZW5jeVwiLFxuICAgIHJlcXVlc3RJZDogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5yZXF1ZXN0SWRcIixcbiAgICByZXNwb25zZVN0YXR1czogXCIkY29udGV4dC5pbnRlZ3JhdGlvbi5zdGF0dXNcIixcbiAgfSxcbiAgYXV0aDoge1xuICAgIGlhbToge1xuICAgICAgdXNlckFybjogXCIkY29udGV4dC5pZGVudGl0eS51c2VyQXJuXCIsXG4gICAgICBhd3NBY2NvdW50OiBcIiRjb250ZXh0LmlkZW50aXR5LmFjY291bnRJZFwiLFxuICAgICAgYXdzUHJpbmNpcGFsOiBcIiRjb250ZXh0LmlkZW50aXR5LmNhbGxlclwiLFxuICAgICAgYXdzUHJpbmNpcGFsT3JnOiBcIiRjb250ZXh0LmlkZW50aXR5LnByaW5jaXBhbE9yZ0lkXCIsXG4gICAgfSxcbiAgICBiYXNpYzogeyB1c2VybmFtZTogXCIkY29udGV4dC5hdXRob3JpemVyLnVzZXJuYW1lXCIgfSxcbiAgICBjb2duaXRvOiB7IGNsaWVudElkOiBcIiRjb250ZXh0LmF1dGhvcml6ZXIuY2xpZW50SWRcIiB9LFxuICB9LFxuICBhd3NFbmRwb2ludFJlcXVlc3Q6IHtcbiAgICBpZDogXCIkY29udGV4dC5hd3NFbmRwb2ludFJlcXVlc3RJZFwiLFxuICAgIGlkMjogXCIkY29udGV4dC5hd3NFbmRwb2ludFJlcXVlc3RJZDJcIixcbiAgfSxcbiAgbWVzc2FnZTpcbiAgICBcIiRjb250ZXh0LmlkZW50aXR5LnNvdXJjZUlwIC0gJGNvbnRleHQuaHR0cE1ldGhvZCAkY29udGV4dC5kb21haW5OYW1lICRjb250ZXh0LnBhdGggKCRjb250ZXh0LnJvdXRlS2V5KSAtICRjb250ZXh0LnN0YXR1cyBbJGNvbnRleHQucmVzcG9uc2VMYXRlbmN5IG1zXVwiLFxufVxuXG4vKipcbiAqIEVuYWJsZXMgYWNjZXNzIGxvZ3Mgb24gdGhlIEFQSS1HYXRld2F5LlxuICpcbiAqIEBhdXRob3IgS3Jpc3RpYW4gUmVrc3RhZCA8a3JlQGNhcHJhY29uc3VsdGluZy5ubz5cbiAqL1xuY2xhc3MgQXBpR2F0ZXdheUFjY2Vzc0xvZ3MgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5Mb2dHcm91cFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHN0YWdlOiBhcGlndy5DZm5TdGFnZSxcbiAgICBwcm9wczogQXBpR2F0ZXdheUFjY2Vzc0xvZ3NQcm9wcyB8IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuXG4gICAgLy8gbG9nR3JvdXAgaXMgc2V0IHVwIHdpdGggaGVscCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzExMTAwI2lzc3VlY29tbWVudC05MDQ2MjcwODFcbiAgICAvLyBOb3Qgc3VyZSBpZiBIVFRQIEFQSSBhY3R1YWxseSBuZWVkcyB0aGUgc2VydmljZSByb2xlIHdpdGggbWFuYWdlZCBwb2xpY3k6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hcGlnYXRld2F5L2xhdGVzdC9kZXZlbG9wZXJndWlkZS9odHRwLWFwaS1sb2dnaW5nLmh0bWxcbiAgICBjb25zdCBhY2Nlc3NMb2dzID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgXCJBY2Nlc3NMb2dHcm91cFwiLCB7XG4gICAgICByZXRlbnRpb246IHByb3BzPy5yZXRlbnRpb24sXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcz8ucmVtb3ZhbFBvbGljeSA/PyBjZGsuUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICAvLyBBbHdheXMgdXNlIHRoZSBkZWZhdWx0IGVuY3J5cHRpb24ga2V5LiBPdGhlcndpc2UsIHRoZSBrZXkgbmVlZHMgc3BlY2lhbCBwb2xpY2llczpcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9sb2dzL2VuY3J5cHQtbG9nLWRhdGEta21zLmh0bWwjY21rLXBlcm1pc3Npb25zXG4gICAgICBlbmNyeXB0aW9uS2V5OiB1bmRlZmluZWQsXG4gICAgfSlcbiAgICB0aGlzLmxvZ0dyb3VwID0gYWNjZXNzTG9nc1xuXG4gICAgc3RhZ2UuYWNjZXNzTG9nU2V0dGluZ3MgPSB7XG4gICAgICBkZXN0aW5hdGlvbkFybjogYWNjZXNzTG9ncy5sb2dHcm91cEFybixcbiAgICAgIGZvcm1hdDogSlNPTi5zdHJpbmdpZnkocHJvcHM/LmFjY2Vzc0xvZ0Zvcm1hdCA/PyBkZWZhdWx0QWNjZXNzTG9nRm9ybWF0KSxcbiAgICB9XG5cbiAgICBjb25zdCBhcGlHd0xvZ3NSb2xlID0gbmV3IGlhbS5Sb2xlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiQXBpR2F0ZXdheVB1c2hUb0Nsb3Vkd2F0Y2hMb2dzUm9sZVwiLFxuICAgICAge1xuICAgICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbChcImFwaWdhdGV3YXkuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgICAgbWFuYWdlZFBvbGljaWVzOiBbXG4gICAgICAgICAgaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFxuICAgICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQW1hem9uQVBJR2F0ZXdheVB1c2hUb0Nsb3VkV2F0Y2hMb2dzXCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgYWNjZXNzTG9ncy5ncmFudFdyaXRlKGFwaUd3TG9nc1JvbGUpXG4gIH1cbn1cblxuLyoqIFJldHVybnMgYSBzaG9ydCBzZW1pLXVuaXF1ZSBoYXNoIG9mIHRoZSBnaXZlbiBzdHJpbmcuICovXG5mdW5jdGlvbiBzaG9ydEhhc2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBTSEEtMSBpcyBuby1ubyB3aGVuIHdlIG5lZWQgY3J5cHRvZ3JhcGhpYyBzZWN1cml0eSwgYnV0IGhlcmUgd2UganVzdCBpdCBmb3Igc2hvcnRlbmluZyBhIG5hbWUsXG4gIC8vIHdoaWNoIGlzIGZpbmVcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJzaGExXCIpLnVwZGF0ZShzdHIpLmRpZ2VzdChcImhleFwiKS5zdWJzdHJpbmcoMCwgMTApXG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liflig/cdk",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "description": "CDK library for Liflig",
5
5
  "type": "module",
6
6
  "repository": {