@bluedynamics/cdk8s-plone 0.1.42 → 0.1.44

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.
Files changed (78) hide show
  1. package/.jsii +26 -25
  2. package/API.md +6 -2
  3. package/README.md +3 -3
  4. package/documentation/sources/conf.py +55 -29
  5. package/documentation/sources/explanation/architecture.md +14 -16
  6. package/documentation/sources/explanation/cdk8s-workflow.md +66 -0
  7. package/documentation/sources/explanation/index.md +1 -27
  8. package/documentation/sources/how-to/backup-and-restore.md +107 -0
  9. package/documentation/sources/how-to/configure-env-and-secrets.md +184 -0
  10. package/documentation/sources/how-to/configure-ingress-tls.md +108 -0
  11. package/documentation/sources/how-to/configure-security-context.md +0 -5
  12. package/documentation/sources/how-to/deploy-blicca.md +8 -8
  13. package/documentation/sources/how-to/{deploy-production-volto.md → deploy-volto.md} +20 -25
  14. package/documentation/sources/how-to/deploy-with-httpcache.md +224 -0
  15. package/documentation/sources/how-to/deploy-with-vinyl-cache.md +0 -5
  16. package/documentation/sources/how-to/enable-prometheus-monitoring.md +4 -5
  17. package/documentation/sources/how-to/index.md +15 -8
  18. package/documentation/sources/how-to/scale-and-high-availability.md +122 -0
  19. package/documentation/sources/how-to/schedule-pods.md +0 -5
  20. package/documentation/sources/how-to/troubleshooting.md +113 -0
  21. package/documentation/sources/how-to/upgrade-and-rollout.md +89 -0
  22. package/documentation/sources/index.md +3 -11
  23. package/documentation/sources/reference/api/index.md +6 -4
  24. package/documentation/sources/reference/configuration-options.md +85 -516
  25. package/documentation/sources/reference/index.md +16 -43
  26. package/documentation/sources/tutorials/01-quick-start.md +1 -1
  27. package/documentation/sources/tutorials/index.md +7 -11
  28. package/examples/blicca/.env.example +3 -2
  29. package/examples/blicca/README.md +21 -24
  30. package/examples/blicca/__snapshots__/main.test.ts.snap +138 -345
  31. package/examples/blicca/main.test.ts +7 -0
  32. package/examples/blicca/main.ts +8 -7
  33. package/examples/blicca/postgres.plain.ts +115 -0
  34. package/examples/blicca/tsconfig.json +33 -0
  35. package/examples/{production-volto → volto}/.env.example +3 -2
  36. package/examples/{production-volto → volto}/README.md +20 -23
  37. package/examples/{production-volto → volto}/__snapshots__/main.test.ts.snap +139 -345
  38. package/examples/{production-volto → volto}/main.test.ts +7 -0
  39. package/examples/{production-volto → volto}/main.ts +8 -7
  40. package/examples/{production-volto → volto}/package.json +1 -1
  41. package/examples/volto/postgres.plain.ts +115 -0
  42. package/examples/volto/tsconfig.json +33 -0
  43. package/lib/deployment.js +36 -3
  44. package/lib/httpcache.js +42 -6
  45. package/lib/imports/k8s.js +1075 -1073
  46. package/lib/imports/monitoring.coreos.com.js +10 -8
  47. package/lib/imports/vinyl.bluedynamics.eu.d.ts +4011 -53
  48. package/lib/imports/vinyl.bluedynamics.eu.js +1791 -159
  49. package/lib/pdb.js +35 -2
  50. package/lib/plone.js +54 -5
  51. package/lib/service.js +44 -2
  52. package/lib/vinylcache.d.ts +3 -1
  53. package/lib/vinylcache.js +43 -6
  54. package/package.json +10 -12
  55. package/documentation/sources/_static/brand-theme.css +0 -685
  56. package/documentation/sources/_static/custom-icons.css +0 -123
  57. package/documentation/sources/_static/fonts/hack/Hack-Regular.woff2 +0 -0
  58. package/documentation/sources/_static/fonts/orbitron/Orbitron-Black.woff2 +0 -11
  59. package/documentation/sources/_static/fonts/orbitron/Orbitron-Bold.woff2 +0 -11
  60. package/documentation/sources/_static/fonts/orbitron/Orbitron-Regular.woff2 +0 -0
  61. package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Bold.woff2 +0 -11
  62. package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Medium.woff2 +0 -11
  63. package/documentation/sources/_static/fonts/rajdhani/Rajdhani-Regular.woff2 +0 -11
  64. package/documentation/sources/_static/fonts/rajdhani/Rajdhani-SemiBold.woff2 +0 -11
  65. package/documentation/sources/_static/kup6s-icon-explanation.svg +0 -32
  66. package/documentation/sources/_static/kup6s-icon-howto.svg +0 -34
  67. package/documentation/sources/_static/kup6s-icon-reference.svg +0 -34
  68. package/documentation/sources/_static/kup6s-icon-tutorials.svg +0 -30
  69. package/documentation/sources/_static/logo-fix.js +0 -12
  70. package/documentation/sources/reference/api/.gitkeep +0 -1
  71. package/examples/blicca/postgres.bitnami.ts +0 -49
  72. package/examples/production-volto/postgres.bitnami.ts +0 -49
  73. /package/documentation/sources/_static/{kup6s-icon-plone.svg → logo.svg} +0 -0
  74. /package/examples/{production-volto → volto}/cdk8s.yaml +0 -0
  75. /package/examples/{production-volto → volto}/config/varnish.tpl.vcl +0 -0
  76. /package/examples/{production-volto → volto}/ingress.ts +0 -0
  77. /package/examples/{production-volto → volto}/jest.config.js +0 -0
  78. /package/examples/{production-volto → volto}/postgres.cloudnativepg.ts +0 -0
@@ -54,6 +54,13 @@ Among other things, it allows to specify:
54
54
  * @schema ServiceMonitor
55
55
  */
56
56
  class ServiceMonitor extends cdk8s_1.ApiObject {
57
+ /**
58
+ * Returns the apiVersion and kind for "ServiceMonitor"
59
+ */
60
+ static GVK = {
61
+ apiVersion: 'monitoring.coreos.com/v1',
62
+ kind: 'ServiceMonitor',
63
+ };
57
64
  /**
58
65
  * Renders a Kubernetes manifest for "ServiceMonitor".
59
66
  *
@@ -91,13 +98,6 @@ class ServiceMonitor extends cdk8s_1.ApiObject {
91
98
  }
92
99
  }
93
100
  exports.ServiceMonitor = ServiceMonitor;
94
- /**
95
- * Returns the apiVersion and kind for "ServiceMonitor"
96
- */
97
- ServiceMonitor.GVK = {
98
- apiVersion: 'monitoring.coreos.com/v1',
99
- kind: 'ServiceMonitor',
100
- };
101
101
  /**
102
102
  * Converts an object of type 'ServiceMonitorProps' to JSON representation.
103
103
  */
@@ -246,6 +246,7 @@ function toJson_ServiceMonitorSpecNamespaceSelector(obj) {
246
246
  * @schema ServiceMonitorSpecNativeHistogramMinBucketFactor
247
247
  */
248
248
  class ServiceMonitorSpecNativeHistogramMinBucketFactor {
249
+ value;
249
250
  static fromNumber(value) {
250
251
  return new ServiceMonitorSpecNativeHistogramMinBucketFactor(value);
251
252
  }
@@ -475,6 +476,7 @@ var ServiceMonitorSpecEndpointsScheme;
475
476
  * @schema ServiceMonitorSpecEndpointsTargetPort
476
477
  */
477
478
  class ServiceMonitorSpecEndpointsTargetPort {
479
+ value;
478
480
  static fromNumber(value) {
479
481
  return new ServiceMonitorSpecEndpointsTargetPort(value);
480
482
  }
@@ -1039,4 +1041,4 @@ function toJson_ServiceMonitorSpecEndpointsOauth2TlsConfigCertSecret(obj) {
1039
1041
  return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1040
1042
  }
1041
1043
  /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1042
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy5jb3Jlb3MuY29tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvbW9uaXRvcmluZy5jb3Jlb3MuY29tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlHQSxnRUFRQztBQXVPRCw4REE2QkM7QUE0QkQsMEZBT0M7QUFzUEQsZ0ZBK0JDO0FBa0RELGdHQVFDO0FBd0VELDhFQVFDO0FBb0VELDBHQVFDO0FBaUNELGtHQVFDO0FBMkNELGtIQVNDO0FBbUZELGtIQWFDO0FBcUdELDRGQWdCQztBQXVDRCxvSEFTQztBQW1GRCxzR0FhQztBQXFIRCxrR0FnQkM7QUF3Q0QsOEdBU0M7QUF1Q0QsZ0lBU0M7QUF3Q0Qsa0hBU0M7QUF3Q0Qsa0hBU0M7QUFnRUQsNEdBUUM7QUF3Q0Qsb0hBU0M7QUF1Q0QsZ0lBU0M7QUFvRUQsOEdBYUM7QUErREQsc0dBUUM7QUE0QkQsMEdBUUM7QUF1Q0Qsb0hBU0M7QUEyRUQsOEhBU0M7QUF1Q0Qsd0hBU0M7QUE0QkQsa0hBUUM7QUE0QkQsc0hBUUM7QUF1Q0QsZ0lBU0M7QUEyRUQsd0hBU0M7QUF1Q0Qsa0hBU0M7QUF1Q0QsNEhBU0M7QUF1Q0Qsc0hBU0M7QUF1Q0Qsb0lBU0M7QUF1Q0QsOEhBU0M7QUF1Q0Qsd0lBU0M7QUF1Q0Qsa0lBU0M7QUExckZELHFCQUFxQjtBQUNyQixpQ0FBdUU7QUFJdkU7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLGNBQWUsU0FBUSxpQkFBUztJQVMzQzs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQTBCO1FBQy9DLE9BQU87WUFDTCxHQUFHLGNBQWMsQ0FBQyxHQUFHO1lBQ3JCLEdBQUcsMEJBQTBCLENBQUMsS0FBSyxDQUFDO1NBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUs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QUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFRoZSBgU2VydmljZU1vbml0b3JgIGN1c3RvbSByZXNvdXJjZSBkZWZpbml0aW9uIChDUkQpIGRlZmluZXMgaG93IGBQcm9tZXRoZXVzYCBhbmQgYFByb21ldGhldXNBZ2VudGAgY2FuIHNjcmFwZSBtZXRyaWNzIGZyb20gYSBncm91cCBvZiBzZXJ2aWNlcy5cbkFtb25nIG90aGVyIHRoaW5ncywgaXQgYWxsb3dzIHRvIHNwZWNpZnk6XG4qIFRoZSBzZXJ2aWNlcyB0byBzY3JhcGUgdmlhIGxhYmVsIHNlbGVjdG9ycy5cbiogVGhlIGNvbnRhaW5lciBwb3J0cyB0byBzY3JhcGUuXG4qIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZS5cbiogVGFyZ2V0IGFuZCBtZXRyaWMgcmVsYWJlbGluZy5cblxuYFByb21ldGhldXNgIGFuZCBgUHJvbWV0aGV1c0FnZW50YCBvYmplY3RzIHNlbGVjdCBgU2VydmljZU1vbml0b3JgIG9iamVjdHMgdXNpbmcgbGFiZWwgYW5kIG5hbWVzcGFjZSBzZWxlY3RvcnMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclxuICovXG5leHBvcnQgY2xhc3MgU2VydmljZU1vbml0b3IgZXh0ZW5kcyBBcGlPYmplY3Qge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXBpVmVyc2lvbiBhbmQga2luZCBmb3IgXCJTZXJ2aWNlTW9uaXRvclwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAnbW9uaXRvcmluZy5jb3Jlb3MuY29tL3YxJyxcbiAgICBraW5kOiAnU2VydmljZU1vbml0b3InLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBLdWJlcm5ldGVzIG1hbmlmZXN0IGZvciBcIlNlcnZpY2VNb25pdG9yXCIuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5saW5lIHJlc291cmNlIG1hbmlmZXN0cyBpbnNpZGUgb3RoZXIgb2JqZWN0cyAoZS5nLiBhcyB0ZW1wbGF0ZXMpLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFuaWZlc3QocHJvcHM6IFNlcnZpY2VNb25pdG9yUHJvcHMpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5TZXJ2aWNlTW9uaXRvci5HVkssXG4gICAgICAuLi50b0pzb25fU2VydmljZU1vbml0b3JQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJTZXJ2aWNlTW9uaXRvclwiIEFQSSBvYmplY3RcbiAgICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBvYmplY3RcbiAgICogQHBhcmFtIGlkIGEgc2NvcGUtbG9jYWwgbmFtZSBmb3IgdGhlIG9iamVjdFxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2VydmljZU1vbml0b3JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uU2VydmljZU1vbml0b3IuR1ZLLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgb2JqZWN0IHRvIEt1YmVybmV0ZXMgSlNPTi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB0b0pzb24oKTogYW55IHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHN1cGVyLnRvSnNvbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlNlcnZpY2VNb25pdG9yLkdWSyxcbiAgICAgIC4uLnRvSnNvbl9TZXJ2aWNlTW9uaXRvclByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBTZXJ2aWNlTW9uaXRvcmAgY3VzdG9tIHJlc291cmNlIGRlZmluaXRpb24gKENSRCkgZGVmaW5lcyBob3cgYFByb21ldGhldXNgIGFuZCBgUHJvbWV0aGV1c0FnZW50YCBjYW4gc2NyYXBlIG1ldHJpY3MgZnJvbSBhIGdyb3VwIG9mIHNlcnZpY2VzLlxuICogQW1vbmcgb3RoZXIgdGhpbmdzLCBpdCBhbGxvd3MgdG8gc3BlY2lmeTpcbiAqICogVGhlIHNlcnZpY2VzIHRvIHNjcmFwZSB2aWEgbGFiZWwgc2VsZWN0b3JzLlxuICogKiBUaGUgY29udGFpbmVyIHBvcnRzIHRvIHNjcmFwZS5cbiAqICogQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgdG8gdXNlLlxuICogKiBUYXJnZXQgYW5kIG1ldHJpYyByZWxhYmVsaW5nLlxuICpcbiAqIGBQcm9tZXRoZXVzYCBhbmQgYFByb21ldGhldXNBZ2VudGAgb2JqZWN0cyBzZWxlY3QgYFNlcnZpY2VNb25pdG9yYCBvYmplY3RzIHVzaW5nIGxhYmVsIGFuZCBuYW1lc3BhY2Ugc2VsZWN0b3JzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclByb3BzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3IjbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogQXBpT2JqZWN0TWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIHNwZWMgZGVmaW5lcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZXNpcmVkIFNlcnZpY2Ugc2VsZWN0aW9uIGZvciB0YXJnZXQgZGlzY292ZXJ5IGJ5XG4gICAqIFByb21ldGhldXMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3Ijc3BlY1xuICAgKi9cbiAgcmVhZG9ubHkgc3BlYzogU2VydmljZU1vbml0b3JTcGVjO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yUHJvcHMob2JqOiBTZXJ2aWNlTW9uaXRvclByb3BzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWV0YWRhdGEnOiBvYmoubWV0YWRhdGEsXG4gICAgJ3NwZWMnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZXNpcmVkIFNlcnZpY2Ugc2VsZWN0aW9uIGZvciB0YXJnZXQgZGlzY292ZXJ5IGJ5XG4gKiBQcm9tZXRoZXVzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjIHtcbiAgLyoqXG4gICAqIGF0dGFjaE1ldGFkYXRhIGRlZmluZXMgYWRkaXRpb25hbCBtZXRhZGF0YSB3aGljaCBpcyBhZGRlZCB0byB0aGVcbiAgICogZGlzY292ZXJlZCB0YXJnZXRzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjM3LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI2F0dGFjaE1ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBhdHRhY2hNZXRhZGF0YT86IFNlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBib2R5U2l6ZUxpbWl0IHdoZW4gZGVmaW5lZCwgYm9keVNpemVMaW1pdCBzcGVjaWZpZXMgYSBqb2IgbGV2ZWwgbGltaXQgb24gdGhlIHNpemVcbiAgICogb2YgdW5jb21wcmVzc2VkIHJlc3BvbnNlIGJvZHkgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5IFByb21ldGhldXMuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMjguMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjYm9keVNpemVMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgYm9keVNpemVMaW1pdD86IHN0cmluZztcblxuICAvKipcbiAgICogY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OSENCIGRlZmluZXMgd2hldGhlciB0byBjb252ZXJ0IGFsbCBzY3JhcGVkIGNsYXNzaWMgaGlzdG9ncmFtcyBpbnRvIGEgbmF0aXZlIGhpc3RvZ3JhbSB3aXRoIGN1c3RvbSBidWNrZXRzLlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYzLjAuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OSENCXG4gICAqL1xuICByZWFkb25seSBjb252ZXJ0Q2xhc3NpY0hpc3RvZ3JhbXNUb05oY2I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBlbmRwb2ludHMgZGVmaW5lcyB0aGUgbGlzdCBvZiBlbmRwb2ludHMgcGFydCBvZiB0aGlzIFNlcnZpY2VNb25pdG9yLlxuICAgKiBEZWZpbmVzIGhvdyB0byBzY3JhcGUgbWV0cmljcyBmcm9tIEt1YmVybmV0ZXMgW0VuZHBvaW50c10oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9zZXJ2aWNlLyNlbmRwb2ludHMpIG9iamVjdHMuXG4gICAqIEluIG1vc3QgY2FzZXMsIGFuIEVuZHBvaW50cyBvYmplY3QgaXMgYmFja2VkIGJ5IGEgS3ViZXJuZXRlcyBbU2VydmljZV0oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9zZXJ2aWNlLykgb2JqZWN0IHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNlbmRwb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50czogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzW107XG5cbiAgLyoqXG4gICAqIGZhbGxiYWNrU2NyYXBlUHJvdG9jb2wgZGVmaW5lcyB0aGUgcHJvdG9jb2wgdG8gdXNlIGlmIGEgc2NyYXBlIHJldHVybnMgYmxhbmssIHVucGFyc2VhYmxlLCBvciBvdGhlcndpc2UgaW52YWxpZCBDb250ZW50LVR5cGUuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjMuMC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNmYWxsYmFja1NjcmFwZVByb3RvY29sXG4gICAqL1xuICByZWFkb25seSBmYWxsYmFja1NjcmFwZVByb3RvY29sPzogU2VydmljZU1vbml0b3JTcGVjRmFsbGJhY2tTY3JhcGVQcm90b2NvbDtcblxuICAvKipcbiAgICogam9iTGFiZWwgc2VsZWN0cyB0aGUgbGFiZWwgZnJvbSB0aGUgYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBTZXJ2aWNlYFxuICAgKiBvYmplY3Qgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBgam9iYCBsYWJlbCBmb3IgYWxsIG1ldHJpY3MuXG4gICAqXG4gICAqIEZvciBleGFtcGxlIGlmIGBqb2JMYWJlbGAgaXMgc2V0IHRvIGBmb29gIGFuZCB0aGUgS3ViZXJuZXRlcyBgU2VydmljZWBcbiAgICogb2JqZWN0IGlzIGxhYmVsZWQgd2l0aCBgZm9vOiBiYXJgLCB0aGVuIFByb21ldGhldXMgYWRkcyB0aGUgYGpvYj1cImJhclwiYFxuICAgKiBsYWJlbCB0byBhbGwgaW5nZXN0ZWQgbWV0cmljcy5cbiAgICpcbiAgICogSWYgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgZW1wdHkgb3IgaWYgdGhlIGxhYmVsIGRvZXNuJ3QgZXhpc3QgZm9yXG4gICAqIHRoZSBnaXZlbiBTZXJ2aWNlLCB0aGUgYGpvYmAgbGFiZWwgb2YgdGhlIG1ldHJpY3MgZGVmYXVsdHMgdG8gdGhlIG5hbWVcbiAgICogb2YgdGhlIGFzc29jaWF0ZWQgS3ViZXJuZXRlcyBgU2VydmljZWAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI2pvYkxhYmVsXG4gICAqL1xuICByZWFkb25seSBqb2JMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICoga2VlcERyb3BwZWRUYXJnZXRzIGRlZmluZXMgdGhlIHBlci1zY3JhcGUgbGltaXQgb24gdGhlIG51bWJlciBvZiB0YXJnZXRzIGRyb3BwZWQgYnkgcmVsYWJlbGluZ1xuICAgKiB0aGF0IHdpbGwgYmUga2VwdCBpbiBtZW1vcnkuIDAgbWVhbnMgbm8gbGltaXQuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDcuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMja2VlcERyb3BwZWRUYXJnZXRzXG4gICAqL1xuICByZWFkb25seSBrZWVwRHJvcHBlZFRhcmdldHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGxhYmVsTGltaXQgZGVmaW5lcyB0aGUgcGVyLXNjcmFwZSBsaW1pdCBvbiBudW1iZXIgb2YgbGFiZWxzIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBmb3IgYSBzYW1wbGUuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMjcuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjbGFiZWxMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbGFiZWxOYW1lTGVuZ3RoTGltaXQgZGVmaW5lcyB0aGUgcGVyLXNjcmFwZSBsaW1pdCBvbiBsZW5ndGggb2YgbGFiZWxzIG5hbWUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGZvciBhIHNhbXBsZS5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4yNy4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNsYWJlbE5hbWVMZW5ndGhMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxOYW1lTGVuZ3RoTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGxhYmVsVmFsdWVMZW5ndGhMaW1pdCBkZWZpbmVzIHRoZSBwZXItc2NyYXBlIGxpbWl0IG9uIGxlbmd0aCBvZiBsYWJlbHMgdmFsdWUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGZvciBhIHNhbXBsZS5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4yNy4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNsYWJlbFZhbHVlTGVuZ3RoTGltaXRcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsVmFsdWVMZW5ndGhMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbmFtZXNwYWNlU2VsZWN0b3IgZGVmaW5lcyBpbiB3aGljaCBuYW1lc3BhY2UocykgUHJvbWV0aGV1cyBzaG91bGQgZGlzY292ZXIgdGhlIHNlcnZpY2VzLlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2VydmljZXMgYXJlIGRpc2NvdmVyZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBgU2VydmljZU1vbml0b3JgIG9iamVjdCBidXQgaXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IHBvZHMgYWNyb3NzIGRpZmZlcmVudC9hbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hdGl2ZUhpc3RvZ3JhbUJ1Y2tldExpbWl0IGRlZmluZXMgZmYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGlzIG1hbnkgYnVja2V0cyBpbiBhIG5hdGl2ZSBoaXN0b2dyYW0sXG4gICAqIGJ1Y2tldHMgd2lsbCBiZSBtZXJnZWQgdG8gc3RheSB3aXRoaW4gdGhlIGxpbWl0LlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQ1LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI25hdGl2ZUhpc3RvZ3JhbUJ1Y2tldExpbWl0XG4gICAqL1xuICByZWFkb25seSBuYXRpdmVIaXN0b2dyYW1CdWNrZXRMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIGRlZmluZXMgaWYgdGhlIGdyb3d0aCBmYWN0b3Igb2Ygb25lIGJ1Y2tldCB0byB0aGUgbmV4dCBpcyBzbWFsbGVyIHRoYW4gdGhpcyxcbiAgICogYnVja2V0cyB3aWxsIGJlIG1lcmdlZCB0byBpbmNyZWFzZSB0aGUgZmFjdG9yIHN1ZmZpY2llbnRseS5cbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi41MC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNuYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcj86IFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3RvcjtcblxuICAvKipcbiAgICogcG9kVGFyZ2V0TGFiZWxzIGRlZmluZXMgdGhlIGxhYmVscyB3aGljaCBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGVcbiAgICogYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBQb2RgIG9iamVjdCBvbnRvIHRoZSBpbmdlc3RlZCBtZXRyaWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNwb2RUYXJnZXRMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IHBvZFRhcmdldExhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBzYW1wbGVMaW1pdCBkZWZpbmVzIGEgcGVyLXNjcmFwZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNjcmFwZWQgc2FtcGxlc1xuICAgKiB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NhbXBsZUxpbWl0XG4gICAqL1xuICByZWFkb25seSBzYW1wbGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogc2NyYXBlQ2xhc3MgZGVmaW5lcyB0aGUgc2NyYXBlIGNsYXNzIHRvIGFwcGx5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNzY3JhcGVDbGFzc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNjcmFwZUNsYXNzaWNIaXN0b2dyYW1zIGRlZmluZXMgd2hldGhlciB0byBzY3JhcGUgYSBjbGFzc2ljIGhpc3RvZ3JhbSB0aGF0IGlzIGFsc28gZXhwb3NlZCBhcyBhIG5hdGl2ZSBoaXN0b2dyYW0uXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDUuMC5cbiAgICpcbiAgICogTm90aWNlOiBgc2NyYXBlQ2xhc3NpY0hpc3RvZ3JhbXNgIGNvcnJlc3BvbmRzIHRvIHRoZSBgYWx3YXlzX3NjcmFwZV9jbGFzc2ljX2hpc3RvZ3JhbXNgIGZpZWxkIGluIHRoZSBQcm9tZXRoZXVzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NjcmFwZUNsYXNzaWNIaXN0b2dyYW1zXG4gICAqL1xuICByZWFkb25seSBzY3JhcGVDbGFzc2ljSGlzdG9ncmFtcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNjcmFwZVByb3RvY29scyBkZWZpbmVzIHRoZSBwcm90b2NvbHMgdG8gbmVnb3RpYXRlIGR1cmluZyBhIHNjcmFwZS4gSXQgdGVsbHMgY2xpZW50cyB0aGVcbiAgICogcHJvdG9jb2xzIHN1cHBvcnRlZCBieSBQcm9tZXRoZXVzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UgKGZyb20gbW9zdCB0byBsZWFzdCBwcmVmZXJyZWQpLlxuICAgKlxuICAgKiBJZiB1bnNldCwgUHJvbWV0aGV1cyB1c2VzIGl0cyBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQ5LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NjcmFwZVByb3RvY29sc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlUHJvdG9jb2xzPzogU2VydmljZU1vbml0b3JTcGVjU2NyYXBlUHJvdG9jb2xzW107XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yIGRlZmluZXMgdGhlIGxhYmVsIHNlbGVjdG9yIHRvIHNlbGVjdCB0aGUgS3ViZXJuZXRlcyBgRW5kcG9pbnRzYCBvYmplY3RzIHRvIHNjcmFwZSBtZXRyaWNzIGZyb20uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBzZWxlY3RvcjogU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yTWVjaGFuaXNtIGRlZmluZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHNlbGVjdCB0aGUgZW5kcG9pbnRzIHRvIHNjcmFwZS5cbiAgICogQnkgZGVmYXVsdCwgdGhlIHNlbGVjdGlvbiBwcm9jZXNzIHJlbGllcyBvbiByZWxhYmVsIGNvbmZpZ3VyYXRpb25zIHRvIGZpbHRlciB0aGUgZGlzY292ZXJlZCB0YXJnZXRzLlxuICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIG9wdCBpbiBmb3Igcm9sZSBzZWxlY3RvcnMsIHdoaWNoIG1heSBvZmZlciBiZXR0ZXIgZWZmaWNpZW5jeSBpbiBsYXJnZSBjbHVzdGVycy5cbiAgICogV2hpY2ggc3RyYXRlZ3kgaXMgYmVzdCBmb3IgeW91ciB1c2UgY2FzZSBuZWVkcyB0byBiZSBjYXJlZnVsbHkgZXZhbHVhdGVkLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjE3LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NlbGVjdG9yTWVjaGFuaXNtXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rvck1lY2hhbmlzbT86IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtO1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlRGlzY292ZXJ5Um9sZSBkZWZpbmVzIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByb2xlIHVzZWQgdG8gZGlzY292ZXIgdGFyZ2V0cy5cbiAgICpcbiAgICogSWYgc2V0LCB0aGUgdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBcIkVuZHBvaW50c1wiIG9yIFwiRW5kcG9pbnRTbGljZVwiLlxuICAgKiBPdGhlcndpc2UgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlXG4gICAqIFByb21ldGhldXMvUHJvbWV0aGV1c0FnZW50IHJlc291cmNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNzZXJ2aWNlRGlzY292ZXJ5Um9sZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZURpc2NvdmVyeVJvbGU/OiBTZXJ2aWNlTW9uaXRvclNwZWNTZXJ2aWNlRGlzY292ZXJ5Um9sZTtcblxuICAvKipcbiAgICogdGFyZ2V0TGFiZWxzIGRlZmluZXMgdGhlIGxhYmVscyB3aGljaCBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGVcbiAgICogYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBTZXJ2aWNlYCBvYmplY3Qgb250byB0aGUgaW5nZXN0ZWQgbWV0cmljcy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjdGFyZ2V0TGFiZWxzXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRMYWJlbHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogdGFyZ2V0TGltaXQgZGVmaW5lcyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc2NyYXBlZCB0YXJnZXRzIHRoYXQgd2lsbFxuICAgKiBiZSBhY2NlcHRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjdGFyZ2V0TGltaXRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExpbWl0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjKG9iajogU2VydmljZU1vbml0b3JTcGVjIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXR0YWNoTWV0YWRhdGEnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEob2JqLmF0dGFjaE1ldGFkYXRhKSxcbiAgICAnYm9keVNpemVMaW1pdCc6IG9iai5ib2R5U2l6ZUxpbWl0LFxuICAgICdjb252ZXJ0Q2xhc3NpY0hpc3RvZ3JhbXNUb05IQ0InOiBvYmouY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OaGNiLFxuICAgICdlbmRwb2ludHMnOiBvYmouZW5kcG9pbnRzPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzKHkpKSxcbiAgICAnZmFsbGJhY2tTY3JhcGVQcm90b2NvbCc6IG9iai5mYWxsYmFja1NjcmFwZVByb3RvY29sLFxuICAgICdqb2JMYWJlbCc6IG9iai5qb2JMYWJlbCxcbiAgICAna2VlcERyb3BwZWRUYXJnZXRzJzogb2JqLmtlZXBEcm9wcGVkVGFyZ2V0cyxcbiAgICAnbGFiZWxMaW1pdCc6IG9iai5sYWJlbExpbWl0LFxuICAgICdsYWJlbE5hbWVMZW5ndGhMaW1pdCc6IG9iai5sYWJlbE5hbWVMZW5ndGhMaW1pdCxcbiAgICAnbGFiZWxWYWx1ZUxlbmd0aExpbWl0Jzogb2JqLmxhYmVsVmFsdWVMZW5ndGhMaW1pdCxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmF0aXZlSGlzdG9ncmFtQnVja2V0TGltaXQnOiBvYmoubmF0aXZlSGlzdG9ncmFtQnVja2V0TGltaXQsXG4gICAgJ25hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcic6IG9iai5uYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3I/LnZhbHVlLFxuICAgICdwb2RUYXJnZXRMYWJlbHMnOiBvYmoucG9kVGFyZ2V0TGFiZWxzPy5tYXAoeSA9PiB5KSxcbiAgICAnc2FtcGxlTGltaXQnOiBvYmouc2FtcGxlTGltaXQsXG4gICAgJ3NjcmFwZUNsYXNzJzogb2JqLnNjcmFwZUNsYXNzLFxuICAgICdzY3JhcGVDbGFzc2ljSGlzdG9ncmFtcyc6IG9iai5zY3JhcGVDbGFzc2ljSGlzdG9ncmFtcyxcbiAgICAnc2NyYXBlUHJvdG9jb2xzJzogb2JqLnNjcmFwZVByb3RvY29scz8ubWFwKHkgPT4geSksXG4gICAgJ3NlbGVjdG9yJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yKG9iai5zZWxlY3RvciksXG4gICAgJ3NlbGVjdG9yTWVjaGFuaXNtJzogb2JqLnNlbGVjdG9yTWVjaGFuaXNtLFxuICAgICdzZXJ2aWNlRGlzY292ZXJ5Um9sZSc6IG9iai5zZXJ2aWNlRGlzY292ZXJ5Um9sZSxcbiAgICAndGFyZ2V0TGFiZWxzJzogb2JqLnRhcmdldExhYmVscz8ubWFwKHkgPT4geSksXG4gICAgJ3RhcmdldExpbWl0Jzogb2JqLnRhcmdldExpbWl0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYXR0YWNoTWV0YWRhdGEgZGVmaW5lcyBhZGRpdGlvbmFsIG1ldGFkYXRhIHdoaWNoIGlzIGFkZGVkIHRvIHRoZVxuICogZGlzY292ZXJlZCB0YXJnZXRzLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMzcuMC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEge1xuICAvKipcbiAgICogbm9kZSB3aGVuIHNldCB0byB0cnVlLCBQcm9tZXRoZXVzIGF0dGFjaGVzIG5vZGUgbWV0YWRhdGEgdG8gdGhlIGRpc2NvdmVyZWRcbiAgICogdGFyZ2V0cy5cbiAgICpcbiAgICogVGhlIFByb21ldGhldXMgc2VydmljZSBhY2NvdW50IG11c3QgaGF2ZSB0aGUgYGxpc3RgIGFuZCBgd2F0Y2hgXG4gICAqIHBlcm1pc3Npb25zIG9uIHRoZSBgTm9kZXNgIG9iamVjdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEjbm9kZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhKG9iajogU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub2RlJzogb2JqLm5vZGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBFbmRwb2ludCBkZWZpbmVzIGFuIGVuZHBvaW50IHNlcnZpbmcgUHJvbWV0aGV1cyBtZXRyaWNzIHRvIGJlIHNjcmFwZWQgYnlcbiAqIFByb21ldGhldXMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMge1xuICAvKipcbiAgICogYXV0aG9yaXphdGlvbiBjb25maWd1cmVzIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjcmVkZW50aWFscyB0byB1c2Ugd2hlblxuICAgKiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMgYGJhc2ljQXV0aGAsIG9yIGBvYXV0aDJgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNhdXRob3JpemF0aW9uXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemF0aW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbjtcblxuICAvKipcbiAgICogYmFzaWNBdXRoIGRlZmluZXMgdGhlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB3aGVuXG4gICAqIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBvYXV0aDJgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNiYXNpY0F1dGhcbiAgICovXG4gIHJlYWRvbmx5IGJhc2ljQXV0aD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aDtcblxuICAvKipcbiAgICogYmVhcmVyVG9rZW5GaWxlIGRlZmluZXMgdGhlIGZpbGUgdG8gcmVhZCBiZWFyZXIgdG9rZW4gZm9yIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIERlcHJlY2F0ZWQ6IHVzZSBgYXV0aG9yaXphdGlvbmAgaW5zdGVhZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjYmVhcmVyVG9rZW5GaWxlXG4gICAqL1xuICByZWFkb25seSBiZWFyZXJUb2tlbkZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGJlYXJlclRva2VuU2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgYmVhcmVyXG4gICAqIHRva2VuIGZvciBzY3JhcGluZyB0YXJnZXRzLiBUaGUgc2VjcmV0IG5lZWRzIHRvIGJlIGluIHRoZSBzYW1lIG5hbWVzcGFjZVxuICAgKiBhcyB0aGUgU2VydmljZU1vbml0b3Igb2JqZWN0IGFuZCByZWFkYWJsZSBieSB0aGUgUHJvbWV0aGV1cyBPcGVyYXRvci5cbiAgICpcbiAgICogRGVwcmVjYXRlZDogdXNlIGBhdXRob3JpemF0aW9uYCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNiZWFyZXJUb2tlblNlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgYmVhcmVyVG9rZW5TZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldDtcblxuICAvKipcbiAgICogZW5hYmxlSHR0cDIgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBIVFRQMiB3aGVuIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI2VuYWJsZUh0dHAyXG4gICAqL1xuICByZWFkb25seSBlbmFibGVIdHRwMj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGZpbHRlclJ1bm5pbmcgd2hlbiB0cnVlLCB0aGUgcG9kcyB3aGljaCBhcmUgbm90IHJ1bm5pbmcgKGUuZy4gZWl0aGVyIGluIEZhaWxlZCBvclxuICAgKiBTdWNjZWVkZWQgc3RhdGUpIGFyZSBkcm9wcGVkIGR1cmluZyB0aGUgdGFyZ2V0IGRpc2NvdmVyeS5cbiAgICpcbiAgICogSWYgdW5zZXQsIHRoZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvcG9kcy9wb2QtbGlmZWN5Y2xlLyNwb2QtcGhhc2VcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjZmlsdGVyUnVubmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUnVubmluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGZvbGxvd1JlZGlyZWN0cyBkZWZpbmVzIHdoZXRoZXIgdGhlIHNjcmFwZSByZXF1ZXN0cyBzaG91bGQgZm9sbG93IEhUVFBcbiAgICogM3h4IHJlZGlyZWN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjZm9sbG93UmVkaXJlY3RzXG4gICAqL1xuICByZWFkb25seSBmb2xsb3dSZWRpcmVjdHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBob25vckxhYmVscyBkZWZpbmVzIHdoZW4gdHJ1ZSB0aGUgbWV0cmljJ3MgbGFiZWxzIHdoZW4gdGhleSBjb2xsaWRlXG4gICAqIHdpdGggdGhlIHRhcmdldCdzIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjaG9ub3JMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IGhvbm9yTGFiZWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogaG9ub3JUaW1lc3RhbXBzIGRlZmluZXMgd2hldGhlciBQcm9tZXRoZXVzIHByZXNlcnZlcyB0aGUgdGltZXN0YW1wc1xuICAgKiB3aGVuIGV4cG9zZWQgYnkgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjaG9ub3JUaW1lc3RhbXBzXG4gICAqL1xuICByZWFkb25seSBob25vclRpbWVzdGFtcHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBhdCB3aGljaCBQcm9tZXRoZXVzIHNjcmFwZXMgdGhlIG1ldHJpY3MgZnJvbSB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBnbG9iYWwgc2NyYXBlIGludGVydmFsLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1ldHJpY1JlbGFiZWxpbmdzIGRlZmluZXMgdGhlIHJlbGFiZWxpbmcgcnVsZXMgdG8gYXBwbHkgdG8gdGhlXG4gICAqIHNhbXBsZXMgYmVmb3JlIGluZ2VzdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjbWV0cmljUmVsYWJlbGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY1JlbGFiZWxpbmdzPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NbXTtcblxuICAvKipcbiAgICogbm9Qcm94eSBkZWZpbmVzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyB0aGF0IGNhbiBjb250YWluIElQcywgQ0lEUiBub3RhdGlvbiwgZG9tYWluIG5hbWVzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gcHJveHlpbmcuIElQIGFuZCBkb21haW4gbmFtZXMgY2FuXG4gICAqIGNvbnRhaW4gcG9ydCBudW1iZXJzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNub1Byb3h5XG4gICAqL1xuICByZWFkb25seSBub1Byb3h5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvYXV0aDIgZGVmaW5lcyB0aGUgT0F1dGgyIHNldHRpbmdzIHRvIHVzZSB3aGVuIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gMi4yNy4wLlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMgYGF1dGhvcml6YXRpb25gLCBvciBgYmFzaWNBdXRoYC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjb2F1dGgyXG4gICAqL1xuICByZWFkb25seSBvYXV0aDI/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDI7XG5cbiAgLyoqXG4gICAqIHBhcmFtcyBkZWZpbmUgb3B0aW9uYWwgSFRUUCBVUkwgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcGFyYW1zXG4gICAqL1xuICByZWFkb25seSBwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH07XG5cbiAgLyoqXG4gICAqIHBhdGggZGVmaW5lcyB0aGUgSFRUUCBwYXRoIGZyb20gd2hpY2ggdG8gc2NyYXBlIGZvciBtZXRyaWNzLlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuIGAvbWV0cmljc2ApLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIFNlcnZpY2UgcG9ydCB3aGljaCB0aGlzIGVuZHBvaW50IHJlZmVycyB0by5cbiAgICpcbiAgICogSXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGB0YXJnZXRQb3J0YC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IHN0cmluZztcblxuICAvKipcbiAgICogcHJveHlDb25uZWN0SGVhZGVyIG9wdGlvbmFsbHkgc3BlY2lmaWVzIGhlYWRlcnMgdG8gc2VuZCB0b1xuICAgKiBwcm94aWVzIGR1cmluZyBDT05ORUNUIHJlcXVlc3RzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNwcm94eUNvbm5lY3RIZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5Q29ubmVjdEhlYWRlcj86IHsgW2tleTogc3RyaW5nXTogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyW10gfTtcblxuICAvKipcbiAgICogcHJveHlGcm9tRW52aXJvbm1lbnQgZGVmaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBkZWZpbmVkIGJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyAoSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIGFuZCBOT19QUk9YWSkuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDMuMCwgQWxlcnRtYW5hZ2VyID49IHYwLjI1LjAgb3IgVGhhbm9zID49IHYwLjMyLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI3Byb3h5RnJvbUVudmlyb25tZW50XG4gICAqL1xuICByZWFkb25seSBwcm94eUZyb21FbnZpcm9ubWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHByb3h5VXJsIGRlZmluZXMgdGhlIEhUVFAgcHJveHkgc2VydmVyIHRvIHVzZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcHJveHlVcmxcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZWxhYmVsaW5ncyBkZWZpbmVzIHRoZSByZWxhYmVsaW5nIHJ1bGVzIHRvIGFwcGx5IHRoZSB0YXJnZXQnc1xuICAgKiBtZXRhZGF0YSBsYWJlbHMuXG4gICAqXG4gICAqIFRoZSBPcGVyYXRvciBhdXRvbWF0aWNhbGx5IGFkZHMgcmVsYWJlbGluZ3MgZm9yIGEgZmV3IHN0YW5kYXJkIEt1YmVybmV0ZXMgZmllbGRzLlxuICAgKlxuICAgKiBUaGUgb3JpZ2luYWwgc2NyYXBlIGpvYidzIG5hbWUgaXMgYXZhaWxhYmxlIHZpYSB0aGUgYF9fdG1wX3Byb21ldGhldXNfam9iX25hbWVgIGxhYmVsLlxuICAgKlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi8jcmVsYWJlbF9jb25maWdcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcmVsYWJlbGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IHJlbGFiZWxpbmdzPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3NbXTtcblxuICAvKipcbiAgICogc2NoZW1lIGRlZmluZXMgdGhlIEhUVFAgc2NoZW1lIHRvIHVzZSB3aGVuIHNjcmFwaW5nIHRoZSBtZXRyaWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNzY2hlbWVcbiAgICovXG4gIHJlYWRvbmx5IHNjaGVtZT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1NjaGVtZTtcblxuICAvKipcbiAgICogc2NyYXBlVGltZW91dCBkZWZpbmVzIHRoZSB0aW1lb3V0IGFmdGVyIHdoaWNoIFByb21ldGhldXMgY29uc2lkZXJzIHRoZSBzY3JhcGUgdG8gYmUgZmFpbGVkLlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBnbG9iYWwgc2NyYXBlIHRpbWVvdXQgdW5sZXNzIGl0IGlzIGxlc3NcbiAgICogdGhhbiB0aGUgdGFyZ2V0J3Mgc2NyYXBlIGludGVydmFsIHZhbHVlIGluIHdoaWNoIHRoZSBsYXR0ZXIgaXMgdXNlZC5cbiAgICogVGhlIHZhbHVlIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIHNjcmFwZSBpbnRlcnZhbCBvdGhlcndpc2UgdGhlIG9wZXJhdG9yIHdpbGwgcmVqZWN0IHRoZSByZXNvdXJjZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjc2NyYXBlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogdGFyZ2V0UG9ydCBkZWZpbmVzIHRoZSBuYW1lIG9yIG51bWJlciBvZiB0aGUgdGFyZ2V0IHBvcnQgb2YgdGhlIGBQb2RgIG9iamVjdCBiZWhpbmQgdGhlXG4gICAqIFNlcnZpY2UuIFRoZSBwb3J0IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGNvbnRhaW5lcidzIHBvcnQgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI3RhcmdldFBvcnRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBvcnQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0O1xuXG4gIC8qKlxuICAgKiB0bHNDb25maWcgZGVmaW5lcyB0aGUgVExTIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2NyYXBpbmcgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjdGxzQ29uZmlnXG4gICAqL1xuICByZWFkb25seSB0bHNDb25maWc/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWc7XG5cbiAgLyoqXG4gICAqIHRyYWNrVGltZXN0YW1wc1N0YWxlbmVzcyBkZWZpbmVzIHdoZXRoZXIgUHJvbWV0aGV1cyB0cmFja3Mgc3RhbGVuZXNzIG9mXG4gICAqIHRoZSBtZXRyaWNzIHRoYXQgaGF2ZSBhbiBleHBsaWNpdCB0aW1lc3RhbXAgcHJlc2VudCBpbiBzY3JhcGVkIGRhdGEuXG4gICAqIEhhcyBubyBlZmZlY3QgaWYgYGhvbm9yVGltZXN0YW1wc2AgaXMgZmFsc2UuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDguMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjdHJhY2tUaW1lc3RhbXBzU3RhbGVuZXNzXG4gICAqL1xuICByZWFkb25seSB0cmFja1RpbWVzdGFtcHNTdGFsZW5lc3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXV0aG9yaXphdGlvbic6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uKG9iai5hdXRob3JpemF0aW9uKSxcbiAgICAnYmFzaWNBdXRoJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aChvYmouYmFzaWNBdXRoKSxcbiAgICAnYmVhcmVyVG9rZW5GaWxlJzogb2JqLmJlYXJlclRva2VuRmlsZSxcbiAgICAnYmVhcmVyVG9rZW5TZWNyZXQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQob2JqLmJlYXJlclRva2VuU2VjcmV0KSxcbiAgICAnZW5hYmxlSHR0cDInOiBvYmouZW5hYmxlSHR0cDIsXG4gICAgJ2ZpbHRlclJ1bm5pbmcnOiBvYmouZmlsdGVyUnVubmluZyxcbiAgICAnZm9sbG93UmVkaXJlY3RzJzogb2JqLmZvbGxvd1JlZGlyZWN0cyxcbiAgICAnaG9ub3JMYWJlbHMnOiBvYmouaG9ub3JMYWJlbHMsXG4gICAgJ2hvbm9yVGltZXN0YW1wcyc6IG9iai5ob25vclRpbWVzdGFtcHMsXG4gICAgJ2ludGVydmFsJzogb2JqLmludGVydmFsLFxuICAgICdtZXRyaWNSZWxhYmVsaW5ncyc6IG9iai5tZXRyaWNSZWxhYmVsaW5ncz8ubWFwKHkgPT4gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzKHkpKSxcbiAgICAnbm9Qcm94eSc6IG9iai5ub1Byb3h5LFxuICAgICdvYXV0aDInOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyKG9iai5vYXV0aDIpLFxuICAgICdwYXJhbXMnOiAoKG9iai5wYXJhbXMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5wYXJhbXMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy5tYXAoeSA9PiB5KSB9KSwge30pKSxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gICAgJ3Byb3h5Q29ubmVjdEhlYWRlcic6ICgob2JqLnByb3h5Q29ubmVjdEhlYWRlcikgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnByb3h5Q29ubmVjdEhlYWRlcikucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/Lm1hcCh5ID0+IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIoeSkpIH0pLCB7fSkpLFxuICAgICdwcm94eUZyb21FbnZpcm9ubWVudCc6IG9iai5wcm94eUZyb21FbnZpcm9ubWVudCxcbiAgICAncHJveHlVcmwnOiBvYmoucHJveHlVcmwsXG4gICAgJ3JlbGFiZWxpbmdzJzogb2JqLnJlbGFiZWxpbmdzPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3MoeSkpLFxuICAgICdzY2hlbWUnOiBvYmouc2NoZW1lLFxuICAgICdzY3JhcGVUaW1lb3V0Jzogb2JqLnNjcmFwZVRpbWVvdXQsXG4gICAgJ3RhcmdldFBvcnQnOiBvYmoudGFyZ2V0UG9ydD8udmFsdWUsXG4gICAgJ3Rsc0NvbmZpZyc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcob2JqLnRsc0NvbmZpZyksXG4gICAgJ3RyYWNrVGltZXN0YW1wc1N0YWxlbmVzcyc6IG9iai50cmFja1RpbWVzdGFtcHNTdGFsZW5lc3MsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBmYWxsYmFja1NjcmFwZVByb3RvY29sIGRlZmluZXMgdGhlIHByb3RvY29sIHRvIHVzZSBpZiBhIHNjcmFwZSByZXR1cm5zIGJsYW5rLCB1bnBhcnNlYWJsZSwgb3Igb3RoZXJ3aXNlIGludmFsaWQgQ29udGVudC1UeXBlLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjMuMC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRmFsbGJhY2tTY3JhcGVQcm90b2NvbFxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNGYWxsYmFja1NjcmFwZVByb3RvY29sIHtcbiAgLyoqIFByb21ldGhldXNQcm90byAqL1xuICBQUk9NRVRIRVVTX1BST1RPID0gXCJQcm9tZXRoZXVzUHJvdG9cIixcbiAgLyoqIE9wZW5NZXRyaWNzVGV4dDAuMC4xICovXG4gIE9QRU5fTUVUUklDU19URVhUMF8wXzEgPSBcIk9wZW5NZXRyaWNzVGV4dDAuMC4xXCIsXG4gIC8qKiBPcGVuTWV0cmljc1RleHQxLjAuMCAqL1xuICBPUEVOX01FVFJJQ1NfVEVYVDFfMF8wID0gXCJPcGVuTWV0cmljc1RleHQxLjAuMFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQwLjAuNCAqL1xuICBQUk9NRVRIRVVTX1RFWFQwXzBfNCA9IFwiUHJvbWV0aGV1c1RleHQwLjAuNFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQxLjAuMCAqL1xuICBQUk9NRVRIRVVTX1RFWFQxXzBfMCA9IFwiUHJvbWV0aGV1c1RleHQxLjAuMFwiLFxufVxuXG4vKipcbiAqIG5hbWVzcGFjZVNlbGVjdG9yIGRlZmluZXMgaW4gd2hpY2ggbmFtZXNwYWNlKHMpIFByb21ldGhldXMgc2hvdWxkIGRpc2NvdmVyIHRoZSBzZXJ2aWNlcy5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBzZXJ2aWNlcyBhcmUgZGlzY292ZXJlZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGBTZXJ2aWNlTW9uaXRvcmAgb2JqZWN0IGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBzZWxlY3QgcG9kcyBhY3Jvc3MgZGlmZmVyZW50L2FsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNOYW1lc3BhY2VTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBhbnkgZGVmaW5lcyB0aGUgYm9vbGVhbiBkZXNjcmliaW5nIHdoZXRoZXIgYWxsIG5hbWVzcGFjZXMgYXJlIHNlbGVjdGVkIGluIGNvbnRyYXN0IHRvIGFcbiAgICogbGlzdCByZXN0cmljdGluZyB0aGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yI2FueVxuICAgKi9cbiAgcmVhZG9ubHkgYW55PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogbWF0Y2hOYW1lcyBkZWZpbmVzIHRoZSBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0byBzZWxlY3QgZnJvbS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNOYW1lc3BhY2VTZWxlY3RvciNtYXRjaE5hbWVzXG4gICAqL1xuICByZWFkb25seSBtYXRjaE5hbWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yKG9iajogU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbnknOiBvYmouYW55LFxuICAgICdtYXRjaE5hbWVzJzogb2JqLm1hdGNoTmFtZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIGRlZmluZXMgaWYgdGhlIGdyb3d0aCBmYWN0b3Igb2Ygb25lIGJ1Y2tldCB0byB0aGUgbmV4dCBpcyBzbWFsbGVyIHRoYW4gdGhpcyxcbiAqIGJ1Y2tldHMgd2lsbCBiZSBtZXJnZWQgdG8gaW5jcmVhc2UgdGhlIGZhY3RvciBzdWZmaWNpZW50bHkuXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjUwLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNOYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3RvciB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogU2VydmljZU1vbml0b3JTcGVjTmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcih2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBTZXJ2aWNlTW9uaXRvclNwZWNOYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3Ige1xuICAgIHJldHVybiBuZXcgU2VydmljZU1vbml0b3JTcGVjTmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBTY3JhcGVQcm90b2NvbCByZXByZXNlbnRzIGEgcHJvdG9jb2wgdXNlZCBieSBQcm9tZXRoZXVzIGZvciBzY3JhcGluZyBtZXRyaWNzLlxuICogU3VwcG9ydGVkIHZhbHVlcyBhcmU6XG4gKiAqIGBPcGVuTWV0cmljc1RleHQwLjAuMWBcbiAqICogYE9wZW5NZXRyaWNzVGV4dDEuMC4wYFxuICogKiBgUHJvbWV0aGV1c1Byb3RvYFxuICogKiBgUHJvbWV0aGV1c1RleHQwLjAuNGBcbiAqICogYFByb21ldGhldXNUZXh0MS4wLjBgXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTY3JhcGVQcm90b2NvbHNcbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZU1vbml0b3JTcGVjU2NyYXBlUHJvdG9jb2xzIHtcbiAgLyoqIFByb21ldGhldXNQcm90byAqL1xuICBQUk9NRVRIRVVTX1BST1RPID0gXCJQcm9tZXRoZXVzUHJvdG9cIixcbiAgLyoqIE9wZW5NZXRyaWNzVGV4dDAuMC4xICovXG4gIE9QRU5fTUVUUklDU19URVhUMF8wXzEgPSBcIk9wZW5NZXRyaWNzVGV4dDAuMC4xXCIsXG4gIC8qKiBPcGVuTWV0cmljc1RleHQxLjAuMCAqL1xuICBPUEVOX01FVFJJQ1NfVEVYVDFfMF8wID0gXCJPcGVuTWV0cmljc1RleHQxLjAuMFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQwLjAuNCAqL1xuICBQUk9NRVRIRVVTX1RFWFQwXzBfNCA9IFwiUHJvbWV0aGV1c1RleHQwLjAuNFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQxLjAuMCAqL1xuICBQUk9NRVRIRVVTX1RFWFQxXzBfMCA9IFwiUHJvbWV0aGV1c1RleHQxLjAuMFwiLFxufVxuXG4vKipcbiAqIHNlbGVjdG9yIGRlZmluZXMgdGhlIGxhYmVsIHNlbGVjdG9yIHRvIHNlbGVjdCB0aGUgS3ViZXJuZXRlcyBgRW5kcG9pbnRzYCBvYmplY3RzIHRvIHNjcmFwZSBtZXRyaWNzIGZyb20uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvcihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlbGVjdG9yTWVjaGFuaXNtIGRlZmluZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHNlbGVjdCB0aGUgZW5kcG9pbnRzIHRvIHNjcmFwZS5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBzZWxlY3Rpb24gcHJvY2VzcyByZWxpZXMgb24gcmVsYWJlbCBjb25maWd1cmF0aW9ucyB0byBmaWx0ZXIgdGhlIGRpc2NvdmVyZWQgdGFyZ2V0cy5cbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gb3B0IGluIGZvciByb2xlIHNlbGVjdG9ycywgd2hpY2ggbWF5IG9mZmVyIGJldHRlciBlZmZpY2llbmN5IGluIGxhcmdlIGNsdXN0ZXJzLlxuICogV2hpY2ggc3RyYXRlZ3kgaXMgYmVzdCBmb3IgeW91ciB1c2UgY2FzZSBuZWVkcyB0byBiZSBjYXJlZnVsbHkgZXZhbHVhdGVkLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMTcuMC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtIHtcbiAgLyoqIFJlbGFiZWxDb25maWcgKi9cbiAgUkVMQUJFTF9DT05GSUcgPSBcIlJlbGFiZWxDb25maWdcIixcbiAgLyoqIFJvbGVTZWxlY3RvciAqL1xuICBST0xFX1NFTEVDVE9SID0gXCJSb2xlU2VsZWN0b3JcIixcbn1cblxuLyoqXG4gKiBzZXJ2aWNlRGlzY292ZXJ5Um9sZSBkZWZpbmVzIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByb2xlIHVzZWQgdG8gZGlzY292ZXIgdGFyZ2V0cy5cbiAqXG4gKiBJZiBzZXQsIHRoZSB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIFwiRW5kcG9pbnRzXCIgb3IgXCJFbmRwb2ludFNsaWNlXCIuXG4gKiBPdGhlcndpc2UgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlXG4gKiBQcm9tZXRoZXVzL1Byb21ldGhldXNBZ2VudCByZXNvdXJjZS5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlcnZpY2VEaXNjb3ZlcnlSb2xlXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY1NlcnZpY2VEaXNjb3ZlcnlSb2xlIHtcbiAgLyoqIEVuZHBvaW50cyAqL1xuICBFTkRQT0lOVFMgPSBcIkVuZHBvaW50c1wiLFxuICAvKiogRW5kcG9pbnRTbGljZSAqL1xuICBFTkRQT0lOVF9TTElDRSA9IFwiRW5kcG9pbnRTbGljZVwiLFxufVxuXG4vKipcbiAqIGF1dGhvcml6YXRpb24gY29uZmlndXJlcyB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgY3JlZGVudGlhbHMgdG8gdXNlIHdoZW5cbiAqIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gKlxuICogQ2Fubm90IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lIGFzIGBiYXNpY0F1dGhgLCBvciBgb2F1dGgyYC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uIHtcbiAgLyoqXG4gICAqIGNyZWRlbnRpYWxzIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgaW4gdGhlIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVkZW50aWFscyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbiNjcmVkZW50aWFsc1xuICAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbHM/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHM7XG5cbiAgLyoqXG4gICAqIHR5cGUgZGVmaW5lcyB0aGUgYXV0aGVudGljYXRpb24gdHlwZS4gVGhlIHZhbHVlIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAqXG4gICAqIFwiQmFzaWNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUuXG4gICAqXG4gICAqIERlZmF1bHQ6IFwiQmVhcmVyXCJcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjcmVkZW50aWFscyc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMob2JqLmNyZWRlbnRpYWxzKSxcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYmFzaWNBdXRoIGRlZmluZXMgdGhlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB3aGVuXG4gKiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICpcbiAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBvYXV0aDJgLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoIHtcbiAgLyoqXG4gICAqIHBhc3N3b3JkIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgcGFzc3dvcmQgZm9yXG4gICAqIGF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aCNwYXNzd29yZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc3dvcmQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZDtcblxuICAvKipcbiAgICogdXNlcm5hbWUgZGVmaW5lcyBhIGtleSBvZiBhIFNlY3JldCBjb250YWluaW5nIHRoZSB1c2VybmFtZSBmb3JcbiAgICogYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoI3VzZXJuYW1lXG4gICAqL1xuICByZWFkb25seSB1c2VybmFtZT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGgnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncGFzc3dvcmQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQob2JqLnBhc3N3b3JkKSxcbiAgICAndXNlcm5hbWUnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUob2JqLnVzZXJuYW1lKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGJlYXJlclRva2VuU2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgYmVhcmVyXG4gKiB0b2tlbiBmb3Igc2NyYXBpbmcgdGFyZ2V0cy4gVGhlIHNlY3JldCBuZWVkcyB0byBiZSBpbiB0aGUgc2FtZSBuYW1lc3BhY2VcbiAqIGFzIHRoZSBTZXJ2aWNlTW9uaXRvciBvYmplY3QgYW5kIHJlYWRhYmxlIGJ5IHRoZSBQcm9tZXRoZXVzIE9wZXJhdG9yLlxuICpcbiAqIERlcHJlY2F0ZWQ6IHVzZSBgYXV0aG9yaXphdGlvbmAgaW5zdGVhZC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0JlYXJlclRva2VuU2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0JlYXJlclRva2VuU2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlbGFiZWxDb25maWcgYWxsb3dzIGR5bmFtaWMgcmV3cml0aW5nIG9mIHRoZSBsYWJlbCBzZXQgZm9yIHRhcmdldHMsIGFsZXJ0cyxcbiAqIHNjcmFwZWQgc2FtcGxlcyBhbmQgcmVtb3RlIHdyaXRlIHNhbXBsZXMuXG4gKlxuICogTW9yZSBpbmZvOiBodHRwczovL3Byb21ldGhldXMuaW8vZG9jcy9wcm9tZXRoZXVzL2xhdGVzdC9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24vI3JlbGFiZWxfY29uZmlnXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzIHtcbiAgLyoqXG4gICAqIGFjdGlvbiB0byBwZXJmb3JtIGJhc2VkIG9uIHRoZSByZWdleCBtYXRjaGluZy5cbiAgICpcbiAgICogYFVwcGVyY2FzZWAgYW5kIGBMb3dlcmNhc2VgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjM2LjAuXG4gICAqIGBEcm9wRXF1YWxgIGFuZCBgS2VlcEVxdWFsYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi40MS4wLlxuICAgKlxuICAgKiBEZWZhdWx0OiBcIlJlcGxhY2VcIlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI2FjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb247XG5cbiAgLyoqXG4gICAqIG1vZHVsdXMgdG8gdGFrZSBvZiB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGxhYmVsIHZhbHVlcy5cbiAgICpcbiAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gdGhlIGFjdGlvbiBpcyBgSGFzaE1vZGAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MjbW9kdWx1c1xuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWx1cz86IG51bWJlcjtcblxuICAvKipcbiAgICogcmVnZXggZGVmaW5lcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3Qgd2hpY2ggdGhlIGV4dHJhY3RlZCB2YWx1ZSBpcyBtYXRjaGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI3JlZ2V4XG4gICAqL1xuICByZWFkb25seSByZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGFjZW1lbnQgdmFsdWUgYWdhaW5zdCB3aGljaCBhIFJlcGxhY2UgYWN0aW9uIGlzIHBlcmZvcm1lZCBpZiB0aGVcbiAgICogcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMuXG4gICAqXG4gICAqIFJlZ2V4IGNhcHR1cmUgZ3JvdXBzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MjcmVwbGFjZW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxhY2VtZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzZXBhcmF0b3IgZGVmaW5lcyB0aGUgc3RyaW5nIGJldHdlZW4gY29uY2F0ZW5hdGVkIFNvdXJjZUxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5ncyNzZXBhcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IHNlcGFyYXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogc291cmNlTGFiZWxzIGRlZmluZXMgdGhlIHNvdXJjZSBsYWJlbHMgc2VsZWN0IHZhbHVlcyBmcm9tIGV4aXN0aW5nIGxhYmVscy4gVGhlaXIgY29udGVudCBpc1xuICAgKiBjb25jYXRlbmF0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgU2VwYXJhdG9yIGFuZCBtYXRjaGVkIGFnYWluc3QgdGhlXG4gICAqIGNvbmZpZ3VyZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI3NvdXJjZUxhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHRhcmdldExhYmVsIGRlZmluZXMgdGhlIGxhYmVsIHRvIHdoaWNoIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHdyaXR0ZW4gaW4gYSByZXBsYWNlbWVudC5cbiAgICpcbiAgICogSXQgaXMgbWFuZGF0b3J5IGZvciBgUmVwbGFjZWAsIGBIYXNoTW9kYCwgYExvd2VyY2FzZWAsIGBVcHBlcmNhc2VgLFxuICAgKiBgS2VlcEVxdWFsYCBhbmQgYERyb3BFcXVhbGAgYWN0aW9ucy5cbiAgICpcbiAgICogUmVnZXggY2FwdHVyZSBncm91cHMgYXJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5ncyN0YXJnZXRMYWJlbFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhY3Rpb24nOiBvYmouYWN0aW9uLFxuICAgICdtb2R1bHVzJzogb2JqLm1vZHVsdXMsXG4gICAgJ3JlZ2V4Jzogb2JqLnJlZ2V4LFxuICAgICdyZXBsYWNlbWVudCc6IG9iai5yZXBsYWNlbWVudCxcbiAgICAnc2VwYXJhdG9yJzogb2JqLnNlcGFyYXRvcixcbiAgICAnc291cmNlTGFiZWxzJzogb2JqLnNvdXJjZUxhYmVscz8ubWFwKHkgPT4geSksXG4gICAgJ3RhcmdldExhYmVsJzogb2JqLnRhcmdldExhYmVsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogb2F1dGgyIGRlZmluZXMgdGhlIE9BdXRoMiBzZXR0aW5ncyB0byB1c2Ugd2hlbiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gMi4yNy4wLlxuICpcbiAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBiYXNpY0F1dGhgLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyIHtcbiAgLyoqXG4gICAqIGNsaWVudElkIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgb3IgQ29uZmlnTWFwIGNvbnRhaW5pbmcgdGhlXG4gICAqIE9BdXRoMiBjbGllbnQncyBJRC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjY2xpZW50SWRcbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudElkOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZDtcblxuICAvKipcbiAgICogY2xpZW50U2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgT0F1dGgyXG4gICAqIGNsaWVudCdzIHNlY3JldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjY2xpZW50U2VjcmV0XG4gICAqL1xuICByZWFkb25seSBjbGllbnRTZWNyZXQ6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldDtcblxuICAvKipcbiAgICogZW5kcG9pbnRQYXJhbXMgY29uZmlndXJlcyB0aGUgSFRUUCBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byB0aGUgdG9rZW5cbiAgICogVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMiNlbmRwb2ludFBhcmFtc1xuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRQYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBub1Byb3h5IGRlZmluZXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIHRoYXQgY2FuIGNvbnRhaW4gSVBzLCBDSURSIG5vdGF0aW9uLCBkb21haW4gbmFtZXNcbiAgICogdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBwcm94eWluZy4gSVAgYW5kIGRvbWFpbiBuYW1lcyBjYW5cbiAgICogY29udGFpbiBwb3J0IG51bWJlcnMuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDMuMCwgQWxlcnRtYW5hZ2VyID49IHYwLjI1LjAgb3IgVGhhbm9zID49IHYwLjMyLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI25vUHJveHlcbiAgICovXG4gIHJlYWRvbmx5IG5vUHJveHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHByb3h5Q29ubmVjdEhlYWRlciBvcHRpb25hbGx5IHNwZWNpZmllcyBoZWFkZXJzIHRvIHNlbmQgdG9cbiAgICogcHJveGllcyBkdXJpbmcgQ09OTkVDVCByZXF1ZXN0cy5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi40My4wLCBBbGVydG1hbmFnZXIgPj0gdjAuMjUuMCBvciBUaGFub3MgPj0gdjAuMzIuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjcHJveHlDb25uZWN0SGVhZGVyXG4gICAqL1xuICByZWFkb25seSBwcm94eUNvbm5lY3RIZWFkZXI/OiB7IFtrZXk6IHN0cmluZ106IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlcltdIH07XG5cbiAgLyoqXG4gICAqIHByb3h5RnJvbUVudmlyb25tZW50IGRlZmluZXMgd2hldGhlciB0byB1c2UgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKEhUVFBfUFJPWFksIEhUVFBTX1BST1hZLCBhbmQgTk9fUFJPWFkpLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMiNwcm94eUZyb21FbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlGcm9tRW52aXJvbm1lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBwcm94eVVybCBkZWZpbmVzIHRoZSBIVFRQIHByb3h5IHNlcnZlciB0byB1c2UuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Byb3h5VXJsXG4gICAqL1xuICByZWFkb25seSBwcm94eVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogc2NvcGVzIGRlZmluZXMgdGhlIE9BdXRoMiBzY29wZXMgdXNlZCBmb3IgdGhlIHRva2VuIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Njb3Blc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHRsc0NvbmZpZyBkZWZpbmVzIHRoZSBUTFMgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBPQXV0aDIgc2VydmVyLlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Rsc0NvbmZpZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGxzQ29uZmlnPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnO1xuXG4gIC8qKlxuICAgKiB0b2tlblVybCBkZWZpbmVzIHRoZSBVUkwgdG8gZmV0Y2ggdGhlIHRva2VuIGZyb20uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Rva2VuVXJsXG4gICAqL1xuICByZWFkb25seSB0b2tlblVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xpZW50SWQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQob2JqLmNsaWVudElkKSxcbiAgICAnY2xpZW50U2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldChvYmouY2xpZW50U2VjcmV0KSxcbiAgICAnZW5kcG9pbnRQYXJhbXMnOiAoKG9iai5lbmRwb2ludFBhcmFtcykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmVuZHBvaW50UGFyYW1zKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbm9Qcm94eSc6IG9iai5ub1Byb3h5LFxuICAgICdwcm94eUNvbm5lY3RIZWFkZXInOiAoKG9iai5wcm94eUNvbm5lY3RIZWFkZXIpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5wcm94eUNvbm5lY3RIZWFkZXIpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyKHkpKSB9KSwge30pKSxcbiAgICAncHJveHlGcm9tRW52aXJvbm1lbnQnOiBvYmoucHJveHlGcm9tRW52aXJvbm1lbnQsXG4gICAgJ3Byb3h5VXJsJzogb2JqLnByb3h5VXJsLFxuICAgICdzY29wZXMnOiBvYmouc2NvcGVzPy5tYXAoeSA9PiB5KSxcbiAgICAndGxzQ29uZmlnJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyhvYmoudGxzQ29uZmlnKSxcbiAgICAndG9rZW5VcmwnOiBvYmoudG9rZW5VcmwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTZWNyZXRLZXlTZWxlY3RvciBzZWxlY3RzIGEga2V5IG9mIGEgU2VjcmV0LlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlciNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlcihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZWxhYmVsQ29uZmlnIGFsbG93cyBkeW5hbWljIHJld3JpdGluZyBvZiB0aGUgbGFiZWwgc2V0IGZvciB0YXJnZXRzLCBhbGVydHMsXG4gKiBzY3JhcGVkIHNhbXBsZXMgYW5kIHJlbW90ZSB3cml0ZSBzYW1wbGVzLlxuICpcbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9wcm9tZXRoZXVzLmlvL2RvY3MvcHJvbWV0aGV1cy9sYXRlc3QvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLyNyZWxhYmVsX2NvbmZpZ1xuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyB7XG4gIC8qKlxuICAgKiBhY3Rpb24gdG8gcGVyZm9ybSBiYXNlZCBvbiB0aGUgcmVnZXggbWF0Y2hpbmcuXG4gICAqXG4gICAqIGBVcHBlcmNhc2VgIGFuZCBgTG93ZXJjYXNlYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi4zNi4wLlxuICAgKiBgRHJvcEVxdWFsYCBhbmQgYEtlZXBFcXVhbGAgYWN0aW9ucyByZXF1aXJlIFByb21ldGhldXMgPj0gdjIuNDEuMC5cbiAgICpcbiAgICogRGVmYXVsdDogXCJSZXBsYWNlXCJcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNhY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbj86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBtb2R1bHVzIHRvIHRha2Ugb2YgdGhlIGhhc2ggb2YgdGhlIHNvdXJjZSBsYWJlbCB2YWx1ZXMuXG4gICAqXG4gICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIHRoZSBhY3Rpb24gaXMgYEhhc2hNb2RgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzI21vZHVsdXNcbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsdXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlZ2V4IGRlZmluZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhZ2FpbnN0IHdoaWNoIHRoZSBleHRyYWN0ZWQgdmFsdWUgaXMgbWF0Y2hlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNyZWdleFxuICAgKi9cbiAgcmVhZG9ubHkgcmVnZXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlcGxhY2VtZW50IHZhbHVlIGFnYWluc3Qgd2hpY2ggYSBSZXBsYWNlIGFjdGlvbiBpcyBwZXJmb3JtZWQgaWYgdGhlXG4gICAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzLlxuICAgKlxuICAgKiBSZWdleCBjYXB0dXJlIGdyb3VwcyBhcmUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzI3JlcGxhY2VtZW50XG4gICAqL1xuICByZWFkb25seSByZXBsYWNlbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogc2VwYXJhdG9yIGRlZmluZXMgdGhlIHN0cmluZyBiZXR3ZWVuIGNvbmNhdGVuYXRlZCBTb3VyY2VMYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3Mjc2VwYXJhdG9yXG4gICAqL1xuICByZWFkb25seSBzZXBhcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNvdXJjZUxhYmVscyBkZWZpbmVzIHRoZSBzb3VyY2UgbGFiZWxzIHNlbGVjdCB2YWx1ZXMgZnJvbSBleGlzdGluZyBsYWJlbHMuIFRoZWlyIGNvbnRlbnQgaXNcbiAgICogY29uY2F0ZW5hdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkIFNlcGFyYXRvciBhbmQgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBjb25maWd1cmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNzb3VyY2VMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUxhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiB0YXJnZXRMYWJlbCBkZWZpbmVzIHRoZSBsYWJlbCB0byB3aGljaCB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyB3cml0dGVuIGluIGEgcmVwbGFjZW1lbnQuXG4gICAqXG4gICAqIEl0IGlzIG1hbmRhdG9yeSBmb3IgYFJlcGxhY2VgLCBgSGFzaE1vZGAsIGBMb3dlcmNhc2VgLCBgVXBwZXJjYXNlYCxcbiAgICogYEtlZXBFcXVhbGAgYW5kIGBEcm9wRXF1YWxgIGFjdGlvbnMuXG4gICAqXG4gICAqIFJlZ2V4IGNhcHR1cmUgZ3JvdXBzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3MjdGFyZ2V0TGFiZWxcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyhvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWN0aW9uJzogb2JqLmFjdGlvbixcbiAgICAnbW9kdWx1cyc6IG9iai5tb2R1bHVzLFxuICAgICdyZWdleCc6IG9iai5yZWdleCxcbiAgICAncmVwbGFjZW1lbnQnOiBvYmoucmVwbGFjZW1lbnQsXG4gICAgJ3NlcGFyYXRvcic6IG9iai5zZXBhcmF0b3IsXG4gICAgJ3NvdXJjZUxhYmVscyc6IG9iai5zb3VyY2VMYWJlbHM/Lm1hcCh5ID0+IHkpLFxuICAgICd0YXJnZXRMYWJlbCc6IG9iai50YXJnZXRMYWJlbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNjaGVtZSBkZWZpbmVzIHRoZSBIVFRQIHNjaGVtZSB0byB1c2Ugd2hlbiBzY3JhcGluZyB0aGUgbWV0cmljcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1NjaGVtZVxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNTY2hlbWUge1xuICAvKiogaHR0cCAqL1xuICBIVFRQID0gXCJodHRwXCIsXG4gIC8qKiBodHRwcyAqL1xuICBIVFRQUyA9IFwiaHR0cHNcIixcbn1cblxuLyoqXG4gKiB0YXJnZXRQb3J0IGRlZmluZXMgdGhlIG5hbWUgb3IgbnVtYmVyIG9mIHRoZSB0YXJnZXQgcG9ydCBvZiB0aGUgYFBvZGAgb2JqZWN0IGJlaGluZCB0aGVcbiAqIFNlcnZpY2UuIFRoZSBwb3J0IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGNvbnRhaW5lcidzIHBvcnQgcHJvcGVydHkuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0IHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0IHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1RhcmdldFBvcnQodmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGFyZ2V0UG9ydCB7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0bHNDb25maWcgZGVmaW5lcyB0aGUgVExTIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2NyYXBpbmcgdGhlIHRhcmdldC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBjYSBkZWZpbmVzIHRoZSBDZXJ0aWZpY2F0ZSBhdXRob3JpdHkgdXNlZCB3aGVuIHZlcmlmeWluZyBzZXJ2ZXIgY2VydGlmaWNhdGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjYVxuICAgKi9cbiAgcmVhZG9ubHkgY2E/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYTtcblxuICAvKipcbiAgICogY2FGaWxlIGRlZmluZXMgdGhlIHBhdGggdG8gdGhlIENBIGNlcnQgaW4gdGhlIFByb21ldGhldXMgY29udGFpbmVyIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI2NhRmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBjZXJ0IGRlZmluZXMgdGhlIENsaWVudCBjZXJ0aWZpY2F0ZSB0byBwcmVzZW50IHdoZW4gZG9pbmcgY2xpZW50LWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjZXJ0XG4gICAqL1xuICByZWFkb25seSBjZXJ0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydDtcblxuICAvKipcbiAgICogY2VydEZpbGUgZGVmaW5lcyB0aGUgcGF0aCB0byB0aGUgY2xpZW50IGNlcnQgZmlsZSBpbiB0aGUgUHJvbWV0aGV1cyBjb250YWluZXIgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjZXJ0RmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2VydEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGluc2VjdXJlU2tpcFZlcmlmeSBkZWZpbmVzIGhvdyB0byBkaXNhYmxlIHRhcmdldCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNpbnNlY3VyZVNraXBWZXJpZnlcbiAgICovXG4gIHJlYWRvbmx5IGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGtleUZpbGUgZGVmaW5lcyB0aGUgcGF0aCB0byB0aGUgY2xpZW50IGtleSBmaWxlIGluIHRoZSBQcm9tZXRoZXVzIGNvbnRhaW5lciBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI2tleUZpbGVcbiAgICovXG4gIHJlYWRvbmx5IGtleUZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGtleVNlY3JldCBkZWZpbmVzIHRoZSBTZWNyZXQgY29udGFpbmluZyB0aGUgY2xpZW50IGtleSBmaWxlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcja2V5U2VjcmV0XG4gICAqL1xuICByZWFkb25seSBrZXlTZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIG1heFZlcnNpb24gZGVmaW5lcyB0aGUgbWF4aW11bSBhY2NlcHRhYmxlIFRMUyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI21heFZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1heFZlcnNpb24/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNYXhWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBtaW5WZXJzaW9uIGRlZmluZXMgdGhlIG1pbmltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNtaW5WZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBtaW5WZXJzaW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnTWluVmVyc2lvbjtcblxuICAvKipcbiAgICogc2VydmVyTmFtZSBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgaG9zdG5hbWUgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNzZXJ2ZXJOYW1lXG4gICAqL1xuICByZWFkb25seSBzZXJ2ZXJOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2EnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2Eob2JqLmNhKSxcbiAgICAnY2FGaWxlJzogb2JqLmNhRmlsZSxcbiAgICAnY2VydCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0KG9iai5jZXJ0KSxcbiAgICAnY2VydEZpbGUnOiBvYmouY2VydEZpbGUsXG4gICAgJ2luc2VjdXJlU2tpcFZlcmlmeSc6IG9iai5pbnNlY3VyZVNraXBWZXJpZnksXG4gICAgJ2tleUZpbGUnOiBvYmoua2V5RmlsZSxcbiAgICAna2V5U2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldChvYmoua2V5U2VjcmV0KSxcbiAgICAnbWF4VmVyc2lvbic6IG9iai5tYXhWZXJzaW9uLFxuICAgICdtaW5WZXJzaW9uJzogb2JqLm1pblZlcnNpb24sXG4gICAgJ3NlcnZlck5hbWUnOiBvYmouc2VydmVyTmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjcmVkZW50aWFscyBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGluIHRoZSBuYW1lc3BhY2UgdGhhdCBjb250YWlucyB0aGUgY3JlZGVudGlhbHMgZm9yIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyhvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwYXNzd29yZCBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGNvbnRhaW5pbmcgdGhlIHBhc3N3b3JkIGZvclxuICogYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiB1c2VybmFtZSBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lIGZvclxuICogYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhVc2VybmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhVc2VybmFtZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBhY3Rpb24gdG8gcGVyZm9ybSBiYXNlZCBvbiB0aGUgcmVnZXggbWF0Y2hpbmcuXG4gKlxuICogYFVwcGVyY2FzZWAgYW5kIGBMb3dlcmNhc2VgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjM2LjAuXG4gKiBgRHJvcEVxdWFsYCBhbmQgYEtlZXBFcXVhbGAgYWN0aW9ucyByZXF1aXJlIFByb21ldGhldXMgPj0gdjIuNDEuMC5cbiAqXG4gKiBEZWZhdWx0OiBcIlJlcGxhY2VcIlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb24ge1xuICAvKiogcmVwbGFjZSAqL1xuICBSRVBMQUNFID0gXCJyZXBsYWNlXCIsXG4gIC8qKiBrZWVwICovXG4gIEtFRVAgPSBcImtlZXBcIixcbiAgLyoqIGRyb3AgKi9cbiAgRFJPUCA9IFwiZHJvcFwiLFxuICAvKiogaGFzaG1vZCAqL1xuICBIQVNITU9EID0gXCJoYXNobW9kXCIsXG4gIC8qKiBsYWJlbG1hcCAqL1xuICBMQUJFTE1BUCA9IFwibGFiZWxtYXBcIixcbiAgLyoqIGxhYmVsZHJvcCAqL1xuICBMQUJFTERST1AgPSBcImxhYmVsZHJvcFwiLFxuICAvKiogbGFiZWxrZWVwICovXG4gIExBQkVMS0VFUCA9IFwibGFiZWxrZWVwXCIsXG4gIC8qKiBsb3dlcmNhc2UgKi9cbiAgTE9XRVJDQVNFID0gXCJsb3dlcmNhc2VcIixcbiAgLyoqIHVwcGVyY2FzZSAqL1xuICBVUFBFUkNBU0UgPSBcInVwcGVyY2FzZVwiLFxuICAvKioga2VlcGVxdWFsICovXG4gIEtFRVBFUVVBTCA9IFwia2VlcGVxdWFsXCIsXG4gIC8qKiBkcm9wZXF1YWwgKi9cbiAgRFJPUEVRVUFMID0gXCJkcm9wZXF1YWxcIixcbn1cblxuLyoqXG4gKiBjbGllbnRJZCBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IG9yIENvbmZpZ01hcCBjb250YWluaW5nIHRoZVxuICogT0F1dGgyIGNsaWVudCdzIElELlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkI2NvbmZpZ01hcFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnTWFwPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXA7XG5cbiAgLyoqXG4gICAqIHNlY3JldCBkZWZpbmVzIHRoZSBTZWNyZXQgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NvbmZpZ01hcCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcChvYmouY29uZmlnTWFwKSxcbiAgICAnc2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2xpZW50U2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgT0F1dGgyXG4gKiBjbGllbnQncyBzZWNyZXQuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0I2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNlY3JldEtleVNlbGVjdG9yIHNlbGVjdHMgYSBrZXkgb2YgYSBTZWNyZXQuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXIge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlciNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlciNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHRsc0NvbmZpZyBkZWZpbmVzIHRoZSBUTFMgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBPQXV0aDIgc2VydmVyLlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi40My4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnIHtcbiAgLyoqXG4gICAqIGNhIGRlZmluZXMgdGhlIENlcnRpZmljYXRlIGF1dGhvcml0eSB1c2VkIHdoZW4gdmVyaWZ5aW5nIHNlcnZlciBjZXJ0aWZpY2F0ZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI2NhXG4gICAqL1xuICByZWFkb25seSBjYT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhO1xuXG4gIC8qKlxuICAgKiBjZXJ0IGRlZmluZXMgdGhlIENsaWVudCBjZXJ0aWZpY2F0ZSB0byBwcmVzZW50IHdoZW4gZG9pbmcgY2xpZW50LWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyNjZXJ0XG4gICAqL1xuICByZWFkb25seSBjZXJ0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydDtcblxuICAvKipcbiAgICogaW5zZWN1cmVTa2lwVmVyaWZ5IGRlZmluZXMgaG93IHRvIGRpc2FibGUgdGFyZ2V0IGNlcnRpZmljYXRlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI2luc2VjdXJlU2tpcFZlcmlmeVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZWN1cmVTa2lwVmVyaWZ5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyNrZXlTZWNyZXRcbiAgICovXG4gIHJlYWRvbmx5IGtleVNlY3JldD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldDtcblxuICAvKipcbiAgICogbWF4VmVyc2lvbiBkZWZpbmVzIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDEuMCBvciBUaGFub3MgPj0gdjAuMzEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcjbWF4VmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgbWF4VmVyc2lvbj86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ01heFZlcnNpb247XG5cbiAgLyoqXG4gICAqIG1pblZlcnNpb24gZGVmaW5lcyB0aGUgbWluaW11bSBhY2NlcHRhYmxlIFRMUyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjM1LjAgb3IgVGhhbm9zID49IHYwLjI4LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI21pblZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pblZlcnNpb24/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNaW5WZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBzZXJ2ZXJOYW1lIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBob3N0bmFtZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI3NlcnZlck5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlck5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjYSc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYShvYmouY2EpLFxuICAgICdjZXJ0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQob2JqLmNlcnQpLFxuICAgICdpbnNlY3VyZVNraXBWZXJpZnknOiBvYmouaW5zZWN1cmVTa2lwVmVyaWZ5LFxuICAgICdrZXlTZWNyZXQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0KG9iai5rZXlTZWNyZXQpLFxuICAgICdtYXhWZXJzaW9uJzogb2JqLm1heFZlcnNpb24sXG4gICAgJ21pblZlcnNpb24nOiBvYmoubWluVmVyc2lvbixcbiAgICAnc2VydmVyTmFtZSc6IG9iai5zZXJ2ZXJOYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYWN0aW9uIHRvIHBlcmZvcm0gYmFzZWQgb24gdGhlIHJlZ2V4IG1hdGNoaW5nLlxuICpcbiAqIGBVcHBlcmNhc2VgIGFuZCBgTG93ZXJjYXNlYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi4zNi4wLlxuICogYERyb3BFcXVhbGAgYW5kIGBLZWVwRXF1YWxgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjQxLjAuXG4gKlxuICogRGVmYXVsdDogXCJSZXBsYWNlXCJcbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uIHtcbiAgLyoqIHJlcGxhY2UgKi9cbiAgUkVQTEFDRSA9IFwicmVwbGFjZVwiLFxuICAvKioga2VlcCAqL1xuICBLRUVQID0gXCJrZWVwXCIsXG4gIC8qKiBkcm9wICovXG4gIERST1AgPSBcImRyb3BcIixcbiAgLyoqIGhhc2htb2QgKi9cbiAgSEFTSE1PRCA9IFwiaGFzaG1vZFwiLFxuICAvKiogbGFiZWxtYXAgKi9cbiAgTEFCRUxNQVAgPSBcImxhYmVsbWFwXCIsXG4gIC8qKiBsYWJlbGRyb3AgKi9cbiAgTEFCRUxEUk9QID0gXCJsYWJlbGRyb3BcIixcbiAgLyoqIGxhYmVsa2VlcCAqL1xuICBMQUJFTEtFRVAgPSBcImxhYmVsa2VlcFwiLFxuICAvKiogbG93ZXJjYXNlICovXG4gIExPV0VSQ0FTRSA9IFwibG93ZXJjYXNlXCIsXG4gIC8qKiB1cHBlcmNhc2UgKi9cbiAgVVBQRVJDQVNFID0gXCJ1cHBlcmNhc2VcIixcbiAgLyoqIGtlZXBlcXVhbCAqL1xuICBLRUVQRVFVQUwgPSBcImtlZXBlcXVhbFwiLFxuICAvKiogZHJvcGVxdWFsICovXG4gIERST1BFUVVBTCA9IFwiZHJvcGVxdWFsXCIsXG59XG5cbi8qKlxuICogY2EgZGVmaW5lcyB0aGUgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IHVzZWQgd2hlbiB2ZXJpZnlpbmcgc2VydmVyIGNlcnRpZmljYXRlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2Ege1xuICAvKipcbiAgICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYSNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhI3NlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2EgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWdNYXAnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldChvYmouc2VjcmV0KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcnQgZGVmaW5lcyB0aGUgQ2xpZW50IGNlcnRpZmljYXRlIHRvIHByZXNlbnQgd2hlbiBkb2luZyBjbGllbnQtYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQjY29uZmlnTWFwXG4gICAqL1xuICByZWFkb25seSBjb25maWdNYXA/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBtYXhWZXJzaW9uIGRlZmluZXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAqXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNYXhWZXJzaW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ01heFZlcnNpb24ge1xuICAvKiogVExTMTAgKi9cbiAgVExTMTAgPSBcIlRMUzEwXCIsXG4gIC8qKiBUTFMxMSAqL1xuICBUTFMxMSA9IFwiVExTMTFcIixcbiAgLyoqIFRMUzEyICovXG4gIFRMUzEyID0gXCJUTFMxMlwiLFxuICAvKiogVExTMTMgKi9cbiAgVExTMTMgPSBcIlRMUzEzXCIsXG59XG5cbi8qKlxuICogbWluVmVyc2lvbiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gKlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnTWluVmVyc2lvblxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNaW5WZXJzaW9uIHtcbiAgLyoqIFRMUzEwICovXG4gIFRMUzEwID0gXCJUTFMxMFwiLFxuICAvKiogVExTMTEgKi9cbiAgVExTMTEgPSBcIlRMUzExXCIsXG4gIC8qKiBUTFMxMiAqL1xuICBUTFMxMiA9IFwiVExTMTJcIixcbiAgLyoqIFRMUzEzICovXG4gIFRMUzEzID0gXCJUTFMxM1wiLFxufVxuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2EgZGVmaW5lcyB0aGUgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IHVzZWQgd2hlbiB2ZXJpZnlpbmcgc2VydmVyIGNlcnRpZmljYXRlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2Ege1xuICAvKipcbiAgICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYSNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhI3NlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2EgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWdNYXAnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldChvYmouc2VjcmV0KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcnQgZGVmaW5lcyB0aGUgQ2xpZW50IGNlcnRpZmljYXRlIHRvIHByZXNlbnQgd2hlbiBkb2luZyBjbGllbnQtYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQjY29uZmlnTWFwXG4gICAqL1xuICByZWFkb25seSBjb25maWdNYXA/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdLZXlTZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdLZXlTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBtYXhWZXJzaW9uIGRlZmluZXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAqXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNYXhWZXJzaW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ01heFZlcnNpb24ge1xuICAvKiogVExTMTAgKi9cbiAgVExTMTAgPSBcIlRMUzEwXCIsXG4gIC8qKiBUTFMxMSAqL1xuICBUTFMxMSA9IFwiVExTMTFcIixcbiAgLyoqIFRMUzEyICovXG4gIFRMUzEyID0gXCJUTFMxMlwiLFxuICAvKiogVExTMTMgKi9cbiAgVExTMTMgPSBcIlRMUzEzXCIsXG59XG5cbi8qKlxuICogbWluVmVyc2lvbiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gKlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnTWluVmVyc2lvblxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNaW5WZXJzaW9uIHtcbiAgLyoqIFRMUzEwICovXG4gIFRMUzEwID0gXCJUTFMxMFwiLFxuICAvKiogVExTMTEgKi9cbiAgVExTMTEgPSBcIlRMUzExXCIsXG4gIC8qKiBUTFMxMiAqL1xuICBUTFMxMiA9IFwiVExTMTJcIixcbiAgLyoqIFRMUzEzICovXG4gIFRMUzEzID0gXCJUTFMxM1wiLFxufVxuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYUNvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYUNvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbmZpZ01hcCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0I25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRTZWNyZXQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYUNvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYUNvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbmZpZ01hcCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0I25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRTZWNyZXQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4iXX0=
1044
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmluZy5jb3Jlb3MuY29tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvbW9uaXRvcmluZy5jb3Jlb3MuY29tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlHQSxnRUFRQztBQXVPRCw4REE2QkM7QUE0QkQsMEZBT0M7QUFzUEQsZ0ZBK0JDO0FBa0RELGdHQVFDO0FBd0VELDhFQVFDO0FBb0VELDBHQVFDO0FBaUNELGtHQVFDO0FBMkNELGtIQVNDO0FBbUZELGtIQWFDO0FBcUdELDRGQWdCQztBQXVDRCxvSEFTQztBQW1GRCxzR0FhQztBQXFIRCxrR0FnQkM7QUF3Q0QsOEdBU0M7QUF1Q0QsZ0lBU0M7QUF3Q0Qsa0hBU0M7QUF3Q0Qsa0hBU0M7QUFnRUQsNEdBUUM7QUF3Q0Qsb0hBU0M7QUF1Q0QsZ0lBU0M7QUFvRUQsOEdBYUM7QUErREQsc0dBUUM7QUE0QkQsMEdBUUM7QUF1Q0Qsb0hBU0M7QUEyRUQsOEhBU0M7QUF1Q0Qsd0hBU0M7QUE0QkQsa0hBUUM7QUE0QkQsc0hBUUM7QUF1Q0QsZ0lBU0M7QUEyRUQsd0hBU0M7QUF1Q0Qsa0hBU0M7QUF1Q0QsNEhBU0M7QUF1Q0Qsc0hBU0M7QUF1Q0Qsb0lBU0M7QUF1Q0QsOEhBU0M7QUF1Q0Qsd0lBU0M7QUF1Q0Qsa0lBU0M7QUExckZELHFCQUFxQjtBQUNyQixpQ0FBdUU7QUFJdkU7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFhLGNBQWUsU0FBUSxpQkFBUztJQUMzQzs7T0FFRztJQUNJLE1BQU0sQ0FBVSxHQUFHLEdBQXFCO1FBQzdDLFVBQVUsRUFBRSwwQkFBMEI7UUFDdEMsSUFBSSxFQUFFLGdCQUFnQjtLQUN2QixDQUFBO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUEwQjtRQUMvQyxPQUFPO1lBQ0wsR0FBRyxjQUFjLENBQUMsR0FBRztZQUNyQixHQUFHLDBCQUEwQixDQUFDLEtBQUssQ0FBQztTQUNyQyxDQUFD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LE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFRoZSBgU2VydmljZU1vbml0b3JgIGN1c3RvbSByZXNvdXJjZSBkZWZpbml0aW9uIChDUkQpIGRlZmluZXMgaG93IGBQcm9tZXRoZXVzYCBhbmQgYFByb21ldGhldXNBZ2VudGAgY2FuIHNjcmFwZSBtZXRyaWNzIGZyb20gYSBncm91cCBvZiBzZXJ2aWNlcy5cbkFtb25nIG90aGVyIHRoaW5ncywgaXQgYWxsb3dzIHRvIHNwZWNpZnk6XG4qIFRoZSBzZXJ2aWNlcyB0byBzY3JhcGUgdmlhIGxhYmVsIHNlbGVjdG9ycy5cbiogVGhlIGNvbnRhaW5lciBwb3J0cyB0byBzY3JhcGUuXG4qIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZS5cbiogVGFyZ2V0IGFuZCBtZXRyaWMgcmVsYWJlbGluZy5cblxuYFByb21ldGhldXNgIGFuZCBgUHJvbWV0aGV1c0FnZW50YCBvYmplY3RzIHNlbGVjdCBgU2VydmljZU1vbml0b3JgIG9iamVjdHMgdXNpbmcgbGFiZWwgYW5kIG5hbWVzcGFjZSBzZWxlY3RvcnMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclxuICovXG5leHBvcnQgY2xhc3MgU2VydmljZU1vbml0b3IgZXh0ZW5kcyBBcGlPYmplY3Qge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgYXBpVmVyc2lvbiBhbmQga2luZCBmb3IgXCJTZXJ2aWNlTW9uaXRvclwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAnbW9uaXRvcmluZy5jb3Jlb3MuY29tL3YxJyxcbiAgICBraW5kOiAnU2VydmljZU1vbml0b3InLFxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBLdWJlcm5ldGVzIG1hbmlmZXN0IGZvciBcIlNlcnZpY2VNb25pdG9yXCIuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5saW5lIHJlc291cmNlIG1hbmlmZXN0cyBpbnNpZGUgb3RoZXIgb2JqZWN0cyAoZS5nLiBhcyB0ZW1wbGF0ZXMpLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFuaWZlc3QocHJvcHM6IFNlcnZpY2VNb25pdG9yUHJvcHMpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5TZXJ2aWNlTW9uaXRvci5HVkssXG4gICAgICAuLi50b0pzb25fU2VydmljZU1vbml0b3JQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJTZXJ2aWNlTW9uaXRvclwiIEFQSSBvYmplY3RcbiAgICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBvYmplY3RcbiAgICogQHBhcmFtIGlkIGEgc2NvcGUtbG9jYWwgbmFtZSBmb3IgdGhlIG9iamVjdFxuICAgKiBAcGFyYW0gcHJvcHMgaW5pdGlhbGl6YXRpb24gcHJvcHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2VydmljZU1vbml0b3JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uU2VydmljZU1vbml0b3IuR1ZLLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgb2JqZWN0IHRvIEt1YmVybmV0ZXMgSlNPTi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB0b0pzb24oKTogYW55IHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHN1cGVyLnRvSnNvbigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlNlcnZpY2VNb25pdG9yLkdWSyxcbiAgICAgIC4uLnRvSnNvbl9TZXJ2aWNlTW9uaXRvclByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVGhlIGBTZXJ2aWNlTW9uaXRvcmAgY3VzdG9tIHJlc291cmNlIGRlZmluaXRpb24gKENSRCkgZGVmaW5lcyBob3cgYFByb21ldGhldXNgIGFuZCBgUHJvbWV0aGV1c0FnZW50YCBjYW4gc2NyYXBlIG1ldHJpY3MgZnJvbSBhIGdyb3VwIG9mIHNlcnZpY2VzLlxuICogQW1vbmcgb3RoZXIgdGhpbmdzLCBpdCBhbGxvd3MgdG8gc3BlY2lmeTpcbiAqICogVGhlIHNlcnZpY2VzIHRvIHNjcmFwZSB2aWEgbGFiZWwgc2VsZWN0b3JzLlxuICogKiBUaGUgY29udGFpbmVyIHBvcnRzIHRvIHNjcmFwZS5cbiAqICogQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgdG8gdXNlLlxuICogKiBUYXJnZXQgYW5kIG1ldHJpYyByZWxhYmVsaW5nLlxuICpcbiAqIGBQcm9tZXRoZXVzYCBhbmQgYFByb21ldGhldXNBZ2VudGAgb2JqZWN0cyBzZWxlY3QgYFNlcnZpY2VNb25pdG9yYCBvYmplY3RzIHVzaW5nIGxhYmVsIGFuZCBuYW1lc3BhY2Ugc2VsZWN0b3JzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclByb3BzIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3IjbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogQXBpT2JqZWN0TWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIHNwZWMgZGVmaW5lcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZXNpcmVkIFNlcnZpY2Ugc2VsZWN0aW9uIGZvciB0YXJnZXQgZGlzY292ZXJ5IGJ5XG4gICAqIFByb21ldGhldXMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3Ijc3BlY1xuICAgKi9cbiAgcmVhZG9ubHkgc3BlYzogU2VydmljZU1vbml0b3JTcGVjO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yUHJvcHMob2JqOiBTZXJ2aWNlTW9uaXRvclByb3BzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWV0YWRhdGEnOiBvYmoubWV0YWRhdGEsXG4gICAgJ3NwZWMnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBkZXNpcmVkIFNlcnZpY2Ugc2VsZWN0aW9uIGZvciB0YXJnZXQgZGlzY292ZXJ5IGJ5XG4gKiBQcm9tZXRoZXVzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjIHtcbiAgLyoqXG4gICAqIGF0dGFjaE1ldGFkYXRhIGRlZmluZXMgYWRkaXRpb25hbCBtZXRhZGF0YSB3aGljaCBpcyBhZGRlZCB0byB0aGVcbiAgICogZGlzY292ZXJlZCB0YXJnZXRzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjM3LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI2F0dGFjaE1ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBhdHRhY2hNZXRhZGF0YT86IFNlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBib2R5U2l6ZUxpbWl0IHdoZW4gZGVmaW5lZCwgYm9keVNpemVMaW1pdCBzcGVjaWZpZXMgYSBqb2IgbGV2ZWwgbGltaXQgb24gdGhlIHNpemVcbiAgICogb2YgdW5jb21wcmVzc2VkIHJlc3BvbnNlIGJvZHkgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5IFByb21ldGhldXMuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMjguMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjYm9keVNpemVMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgYm9keVNpemVMaW1pdD86IHN0cmluZztcblxuICAvKipcbiAgICogY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OSENCIGRlZmluZXMgd2hldGhlciB0byBjb252ZXJ0IGFsbCBzY3JhcGVkIGNsYXNzaWMgaGlzdG9ncmFtcyBpbnRvIGEgbmF0aXZlIGhpc3RvZ3JhbSB3aXRoIGN1c3RvbSBidWNrZXRzLlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYzLjAuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OSENCXG4gICAqL1xuICByZWFkb25seSBjb252ZXJ0Q2xhc3NpY0hpc3RvZ3JhbXNUb05oY2I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBlbmRwb2ludHMgZGVmaW5lcyB0aGUgbGlzdCBvZiBlbmRwb2ludHMgcGFydCBvZiB0aGlzIFNlcnZpY2VNb25pdG9yLlxuICAgKiBEZWZpbmVzIGhvdyB0byBzY3JhcGUgbWV0cmljcyBmcm9tIEt1YmVybmV0ZXMgW0VuZHBvaW50c10oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9zZXJ2aWNlLyNlbmRwb2ludHMpIG9iamVjdHMuXG4gICAqIEluIG1vc3QgY2FzZXMsIGFuIEVuZHBvaW50cyBvYmplY3QgaXMgYmFja2VkIGJ5IGEgS3ViZXJuZXRlcyBbU2VydmljZV0oaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvc2VydmljZXMtbmV0d29ya2luZy9zZXJ2aWNlLykgb2JqZWN0IHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNlbmRwb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50czogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzW107XG5cbiAgLyoqXG4gICAqIGZhbGxiYWNrU2NyYXBlUHJvdG9jb2wgZGVmaW5lcyB0aGUgcHJvdG9jb2wgdG8gdXNlIGlmIGEgc2NyYXBlIHJldHVybnMgYmxhbmssIHVucGFyc2VhYmxlLCBvciBvdGhlcndpc2UgaW52YWxpZCBDb250ZW50LVR5cGUuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjMuMC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNmYWxsYmFja1NjcmFwZVByb3RvY29sXG4gICAqL1xuICByZWFkb25seSBmYWxsYmFja1NjcmFwZVByb3RvY29sPzogU2VydmljZU1vbml0b3JTcGVjRmFsbGJhY2tTY3JhcGVQcm90b2NvbDtcblxuICAvKipcbiAgICogam9iTGFiZWwgc2VsZWN0cyB0aGUgbGFiZWwgZnJvbSB0aGUgYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBTZXJ2aWNlYFxuICAgKiBvYmplY3Qgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBgam9iYCBsYWJlbCBmb3IgYWxsIG1ldHJpY3MuXG4gICAqXG4gICAqIEZvciBleGFtcGxlIGlmIGBqb2JMYWJlbGAgaXMgc2V0IHRvIGBmb29gIGFuZCB0aGUgS3ViZXJuZXRlcyBgU2VydmljZWBcbiAgICogb2JqZWN0IGlzIGxhYmVsZWQgd2l0aCBgZm9vOiBiYXJgLCB0aGVuIFByb21ldGhldXMgYWRkcyB0aGUgYGpvYj1cImJhclwiYFxuICAgKiBsYWJlbCB0byBhbGwgaW5nZXN0ZWQgbWV0cmljcy5cbiAgICpcbiAgICogSWYgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgZW1wdHkgb3IgaWYgdGhlIGxhYmVsIGRvZXNuJ3QgZXhpc3QgZm9yXG4gICAqIHRoZSBnaXZlbiBTZXJ2aWNlLCB0aGUgYGpvYmAgbGFiZWwgb2YgdGhlIG1ldHJpY3MgZGVmYXVsdHMgdG8gdGhlIG5hbWVcbiAgICogb2YgdGhlIGFzc29jaWF0ZWQgS3ViZXJuZXRlcyBgU2VydmljZWAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI2pvYkxhYmVsXG4gICAqL1xuICByZWFkb25seSBqb2JMYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICoga2VlcERyb3BwZWRUYXJnZXRzIGRlZmluZXMgdGhlIHBlci1zY3JhcGUgbGltaXQgb24gdGhlIG51bWJlciBvZiB0YXJnZXRzIGRyb3BwZWQgYnkgcmVsYWJlbGluZ1xuICAgKiB0aGF0IHdpbGwgYmUga2VwdCBpbiBtZW1vcnkuIDAgbWVhbnMgbm8gbGltaXQuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDcuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMja2VlcERyb3BwZWRUYXJnZXRzXG4gICAqL1xuICByZWFkb25seSBrZWVwRHJvcHBlZFRhcmdldHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGxhYmVsTGltaXQgZGVmaW5lcyB0aGUgcGVyLXNjcmFwZSBsaW1pdCBvbiBudW1iZXIgb2YgbGFiZWxzIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBmb3IgYSBzYW1wbGUuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMjcuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjbGFiZWxMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbGFiZWxOYW1lTGVuZ3RoTGltaXQgZGVmaW5lcyB0aGUgcGVyLXNjcmFwZSBsaW1pdCBvbiBsZW5ndGggb2YgbGFiZWxzIG5hbWUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGZvciBhIHNhbXBsZS5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4yNy4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNsYWJlbE5hbWVMZW5ndGhMaW1pdFxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxOYW1lTGVuZ3RoTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGxhYmVsVmFsdWVMZW5ndGhMaW1pdCBkZWZpbmVzIHRoZSBwZXItc2NyYXBlIGxpbWl0IG9uIGxlbmd0aCBvZiBsYWJlbHMgdmFsdWUgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGZvciBhIHNhbXBsZS5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4yNy4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNsYWJlbFZhbHVlTGVuZ3RoTGltaXRcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsVmFsdWVMZW5ndGhMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbmFtZXNwYWNlU2VsZWN0b3IgZGVmaW5lcyBpbiB3aGljaCBuYW1lc3BhY2UocykgUHJvbWV0aGV1cyBzaG91bGQgZGlzY292ZXIgdGhlIHNlcnZpY2VzLlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgc2VydmljZXMgYXJlIGRpc2NvdmVyZWQgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSBgU2VydmljZU1vbml0b3JgIG9iamVjdCBidXQgaXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IHBvZHMgYWNyb3NzIGRpZmZlcmVudC9hbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hdGl2ZUhpc3RvZ3JhbUJ1Y2tldExpbWl0IGRlZmluZXMgZmYgdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGlzIG1hbnkgYnVja2V0cyBpbiBhIG5hdGl2ZSBoaXN0b2dyYW0sXG4gICAqIGJ1Y2tldHMgd2lsbCBiZSBtZXJnZWQgdG8gc3RheSB3aXRoaW4gdGhlIGxpbWl0LlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQ1LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI25hdGl2ZUhpc3RvZ3JhbUJ1Y2tldExpbWl0XG4gICAqL1xuICByZWFkb25seSBuYXRpdmVIaXN0b2dyYW1CdWNrZXRMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogbmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIGRlZmluZXMgaWYgdGhlIGdyb3d0aCBmYWN0b3Igb2Ygb25lIGJ1Y2tldCB0byB0aGUgbmV4dCBpcyBzbWFsbGVyIHRoYW4gdGhpcyxcbiAgICogYnVja2V0cyB3aWxsIGJlIG1lcmdlZCB0byBpbmNyZWFzZSB0aGUgZmFjdG9yIHN1ZmZpY2llbnRseS5cbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi41MC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNuYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcj86IFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3RvcjtcblxuICAvKipcbiAgICogcG9kVGFyZ2V0TGFiZWxzIGRlZmluZXMgdGhlIGxhYmVscyB3aGljaCBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGVcbiAgICogYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBQb2RgIG9iamVjdCBvbnRvIHRoZSBpbmdlc3RlZCBtZXRyaWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNwb2RUYXJnZXRMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IHBvZFRhcmdldExhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBzYW1wbGVMaW1pdCBkZWZpbmVzIGEgcGVyLXNjcmFwZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNjcmFwZWQgc2FtcGxlc1xuICAgKiB0aGF0IHdpbGwgYmUgYWNjZXB0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NhbXBsZUxpbWl0XG4gICAqL1xuICByZWFkb25seSBzYW1wbGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogc2NyYXBlQ2xhc3MgZGVmaW5lcyB0aGUgc2NyYXBlIGNsYXNzIHRvIGFwcGx5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNzY3JhcGVDbGFzc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlQ2xhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNjcmFwZUNsYXNzaWNIaXN0b2dyYW1zIGRlZmluZXMgd2hldGhlciB0byBzY3JhcGUgYSBjbGFzc2ljIGhpc3RvZ3JhbSB0aGF0IGlzIGFsc28gZXhwb3NlZCBhcyBhIG5hdGl2ZSBoaXN0b2dyYW0uXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDUuMC5cbiAgICpcbiAgICogTm90aWNlOiBgc2NyYXBlQ2xhc3NpY0hpc3RvZ3JhbXNgIGNvcnJlc3BvbmRzIHRvIHRoZSBgYWx3YXlzX3NjcmFwZV9jbGFzc2ljX2hpc3RvZ3JhbXNgIGZpZWxkIGluIHRoZSBQcm9tZXRoZXVzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NjcmFwZUNsYXNzaWNIaXN0b2dyYW1zXG4gICAqL1xuICByZWFkb25seSBzY3JhcGVDbGFzc2ljSGlzdG9ncmFtcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNjcmFwZVByb3RvY29scyBkZWZpbmVzIHRoZSBwcm90b2NvbHMgdG8gbmVnb3RpYXRlIGR1cmluZyBhIHNjcmFwZS4gSXQgdGVsbHMgY2xpZW50cyB0aGVcbiAgICogcHJvdG9jb2xzIHN1cHBvcnRlZCBieSBQcm9tZXRoZXVzIGluIG9yZGVyIG9mIHByZWZlcmVuY2UgKGZyb20gbW9zdCB0byBsZWFzdCBwcmVmZXJyZWQpLlxuICAgKlxuICAgKiBJZiB1bnNldCwgUHJvbWV0aGV1cyB1c2VzIGl0cyBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQ5LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NjcmFwZVByb3RvY29sc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlUHJvdG9jb2xzPzogU2VydmljZU1vbml0b3JTcGVjU2NyYXBlUHJvdG9jb2xzW107XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yIGRlZmluZXMgdGhlIGxhYmVsIHNlbGVjdG9yIHRvIHNlbGVjdCB0aGUgS3ViZXJuZXRlcyBgRW5kcG9pbnRzYCBvYmplY3RzIHRvIHNjcmFwZSBtZXRyaWNzIGZyb20uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBzZWxlY3RvcjogU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIHNlbGVjdG9yTWVjaGFuaXNtIGRlZmluZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHNlbGVjdCB0aGUgZW5kcG9pbnRzIHRvIHNjcmFwZS5cbiAgICogQnkgZGVmYXVsdCwgdGhlIHNlbGVjdGlvbiBwcm9jZXNzIHJlbGllcyBvbiByZWxhYmVsIGNvbmZpZ3VyYXRpb25zIHRvIGZpbHRlciB0aGUgZGlzY292ZXJlZCB0YXJnZXRzLlxuICAgKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIG9wdCBpbiBmb3Igcm9sZSBzZWxlY3RvcnMsIHdoaWNoIG1heSBvZmZlciBiZXR0ZXIgZWZmaWNpZW5jeSBpbiBsYXJnZSBjbHVzdGVycy5cbiAgICogV2hpY2ggc3RyYXRlZ3kgaXMgYmVzdCBmb3IgeW91ciB1c2UgY2FzZSBuZWVkcyB0byBiZSBjYXJlZnVsbHkgZXZhbHVhdGVkLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjE3LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjI3NlbGVjdG9yTWVjaGFuaXNtXG4gICAqL1xuICByZWFkb25seSBzZWxlY3Rvck1lY2hhbmlzbT86IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtO1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlRGlzY292ZXJ5Um9sZSBkZWZpbmVzIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByb2xlIHVzZWQgdG8gZGlzY292ZXIgdGFyZ2V0cy5cbiAgICpcbiAgICogSWYgc2V0LCB0aGUgdmFsdWUgc2hvdWxkIGJlIGVpdGhlciBcIkVuZHBvaW50c1wiIG9yIFwiRW5kcG9pbnRTbGljZVwiLlxuICAgKiBPdGhlcndpc2UgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlXG4gICAqIFByb21ldGhldXMvUHJvbWV0aGV1c0FnZW50IHJlc291cmNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlYyNzZXJ2aWNlRGlzY292ZXJ5Um9sZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZURpc2NvdmVyeVJvbGU/OiBTZXJ2aWNlTW9uaXRvclNwZWNTZXJ2aWNlRGlzY292ZXJ5Um9sZTtcblxuICAvKipcbiAgICogdGFyZ2V0TGFiZWxzIGRlZmluZXMgdGhlIGxhYmVscyB3aGljaCBhcmUgdHJhbnNmZXJyZWQgZnJvbSB0aGVcbiAgICogYXNzb2NpYXRlZCBLdWJlcm5ldGVzIGBTZXJ2aWNlYCBvYmplY3Qgb250byB0aGUgaW5nZXN0ZWQgbWV0cmljcy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjdGFyZ2V0TGFiZWxzXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRMYWJlbHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogdGFyZ2V0TGltaXQgZGVmaW5lcyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc2NyYXBlZCB0YXJnZXRzIHRoYXQgd2lsbFxuICAgKiBiZSBhY2NlcHRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWMjdGFyZ2V0TGltaXRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExpbWl0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjKG9iajogU2VydmljZU1vbml0b3JTcGVjIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXR0YWNoTWV0YWRhdGEnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEob2JqLmF0dGFjaE1ldGFkYXRhKSxcbiAgICAnYm9keVNpemVMaW1pdCc6IG9iai5ib2R5U2l6ZUxpbWl0LFxuICAgICdjb252ZXJ0Q2xhc3NpY0hpc3RvZ3JhbXNUb05IQ0InOiBvYmouY29udmVydENsYXNzaWNIaXN0b2dyYW1zVG9OaGNiLFxuICAgICdlbmRwb2ludHMnOiBvYmouZW5kcG9pbnRzPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzKHkpKSxcbiAgICAnZmFsbGJhY2tTY3JhcGVQcm90b2NvbCc6IG9iai5mYWxsYmFja1NjcmFwZVByb3RvY29sLFxuICAgICdqb2JMYWJlbCc6IG9iai5qb2JMYWJlbCxcbiAgICAna2VlcERyb3BwZWRUYXJnZXRzJzogb2JqLmtlZXBEcm9wcGVkVGFyZ2V0cyxcbiAgICAnbGFiZWxMaW1pdCc6IG9iai5sYWJlbExpbWl0LFxuICAgICdsYWJlbE5hbWVMZW5ndGhMaW1pdCc6IG9iai5sYWJlbE5hbWVMZW5ndGhMaW1pdCxcbiAgICAnbGFiZWxWYWx1ZUxlbmd0aExpbWl0Jzogb2JqLmxhYmVsVmFsdWVMZW5ndGhMaW1pdCxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmF0aXZlSGlzdG9ncmFtQnVja2V0TGltaXQnOiBvYmoubmF0aXZlSGlzdG9ncmFtQnVja2V0TGltaXQsXG4gICAgJ25hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcic6IG9iai5uYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3I/LnZhbHVlLFxuICAgICdwb2RUYXJnZXRMYWJlbHMnOiBvYmoucG9kVGFyZ2V0TGFiZWxzPy5tYXAoeSA9PiB5KSxcbiAgICAnc2FtcGxlTGltaXQnOiBvYmouc2FtcGxlTGltaXQsXG4gICAgJ3NjcmFwZUNsYXNzJzogb2JqLnNjcmFwZUNsYXNzLFxuICAgICdzY3JhcGVDbGFzc2ljSGlzdG9ncmFtcyc6IG9iai5zY3JhcGVDbGFzc2ljSGlzdG9ncmFtcyxcbiAgICAnc2NyYXBlUHJvdG9jb2xzJzogb2JqLnNjcmFwZVByb3RvY29scz8ubWFwKHkgPT4geSksXG4gICAgJ3NlbGVjdG9yJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yKG9iai5zZWxlY3RvciksXG4gICAgJ3NlbGVjdG9yTWVjaGFuaXNtJzogb2JqLnNlbGVjdG9yTWVjaGFuaXNtLFxuICAgICdzZXJ2aWNlRGlzY292ZXJ5Um9sZSc6IG9iai5zZXJ2aWNlRGlzY292ZXJ5Um9sZSxcbiAgICAndGFyZ2V0TGFiZWxzJzogb2JqLnRhcmdldExhYmVscz8ubWFwKHkgPT4geSksXG4gICAgJ3RhcmdldExpbWl0Jzogb2JqLnRhcmdldExpbWl0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYXR0YWNoTWV0YWRhdGEgZGVmaW5lcyBhZGRpdGlvbmFsIG1ldGFkYXRhIHdoaWNoIGlzIGFkZGVkIHRvIHRoZVxuICogZGlzY292ZXJlZCB0YXJnZXRzLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMzcuMC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEge1xuICAvKipcbiAgICogbm9kZSB3aGVuIHNldCB0byB0cnVlLCBQcm9tZXRoZXVzIGF0dGFjaGVzIG5vZGUgbWV0YWRhdGEgdG8gdGhlIGRpc2NvdmVyZWRcbiAgICogdGFyZ2V0cy5cbiAgICpcbiAgICogVGhlIFByb21ldGhldXMgc2VydmljZSBhY2NvdW50IG11c3QgaGF2ZSB0aGUgYGxpc3RgIGFuZCBgd2F0Y2hgXG4gICAqIHBlcm1pc3Npb25zIG9uIHRoZSBgTm9kZXNgIG9iamVjdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEjbm9kZVxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0F0dGFjaE1ldGFkYXRhKG9iajogU2VydmljZU1vbml0b3JTcGVjQXR0YWNoTWV0YWRhdGEgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub2RlJzogb2JqLm5vZGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBFbmRwb2ludCBkZWZpbmVzIGFuIGVuZHBvaW50IHNlcnZpbmcgUHJvbWV0aGV1cyBtZXRyaWNzIHRvIGJlIHNjcmFwZWQgYnlcbiAqIFByb21ldGhldXMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMge1xuICAvKipcbiAgICogYXV0aG9yaXphdGlvbiBjb25maWd1cmVzIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBjcmVkZW50aWFscyB0byB1c2Ugd2hlblxuICAgKiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMgYGJhc2ljQXV0aGAsIG9yIGBvYXV0aDJgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNhdXRob3JpemF0aW9uXG4gICAqL1xuICByZWFkb25seSBhdXRob3JpemF0aW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbjtcblxuICAvKipcbiAgICogYmFzaWNBdXRoIGRlZmluZXMgdGhlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB3aGVuXG4gICAqIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBvYXV0aDJgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNiYXNpY0F1dGhcbiAgICovXG4gIHJlYWRvbmx5IGJhc2ljQXV0aD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aDtcblxuICAvKipcbiAgICogYmVhcmVyVG9rZW5GaWxlIGRlZmluZXMgdGhlIGZpbGUgdG8gcmVhZCBiZWFyZXIgdG9rZW4gZm9yIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIERlcHJlY2F0ZWQ6IHVzZSBgYXV0aG9yaXphdGlvbmAgaW5zdGVhZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjYmVhcmVyVG9rZW5GaWxlXG4gICAqL1xuICByZWFkb25seSBiZWFyZXJUb2tlbkZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGJlYXJlclRva2VuU2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgYmVhcmVyXG4gICAqIHRva2VuIGZvciBzY3JhcGluZyB0YXJnZXRzLiBUaGUgc2VjcmV0IG5lZWRzIHRvIGJlIGluIHRoZSBzYW1lIG5hbWVzcGFjZVxuICAgKiBhcyB0aGUgU2VydmljZU1vbml0b3Igb2JqZWN0IGFuZCByZWFkYWJsZSBieSB0aGUgUHJvbWV0aGV1cyBPcGVyYXRvci5cbiAgICpcbiAgICogRGVwcmVjYXRlZDogdXNlIGBhdXRob3JpemF0aW9uYCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNiZWFyZXJUb2tlblNlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgYmVhcmVyVG9rZW5TZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldDtcblxuICAvKipcbiAgICogZW5hYmxlSHR0cDIgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBIVFRQMiB3aGVuIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI2VuYWJsZUh0dHAyXG4gICAqL1xuICByZWFkb25seSBlbmFibGVIdHRwMj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGZpbHRlclJ1bm5pbmcgd2hlbiB0cnVlLCB0aGUgcG9kcyB3aGljaCBhcmUgbm90IHJ1bm5pbmcgKGUuZy4gZWl0aGVyIGluIEZhaWxlZCBvclxuICAgKiBTdWNjZWVkZWQgc3RhdGUpIGFyZSBkcm9wcGVkIGR1cmluZyB0aGUgdGFyZ2V0IGRpc2NvdmVyeS5cbiAgICpcbiAgICogSWYgdW5zZXQsIHRoZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy93b3JrbG9hZHMvcG9kcy9wb2QtbGlmZWN5Y2xlLyNwb2QtcGhhc2VcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjZmlsdGVyUnVubmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsdGVyUnVubmluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGZvbGxvd1JlZGlyZWN0cyBkZWZpbmVzIHdoZXRoZXIgdGhlIHNjcmFwZSByZXF1ZXN0cyBzaG91bGQgZm9sbG93IEhUVFBcbiAgICogM3h4IHJlZGlyZWN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjZm9sbG93UmVkaXJlY3RzXG4gICAqL1xuICByZWFkb25seSBmb2xsb3dSZWRpcmVjdHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBob25vckxhYmVscyBkZWZpbmVzIHdoZW4gdHJ1ZSB0aGUgbWV0cmljJ3MgbGFiZWxzIHdoZW4gdGhleSBjb2xsaWRlXG4gICAqIHdpdGggdGhlIHRhcmdldCdzIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjaG9ub3JMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IGhvbm9yTGFiZWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogaG9ub3JUaW1lc3RhbXBzIGRlZmluZXMgd2hldGhlciBQcm9tZXRoZXVzIHByZXNlcnZlcyB0aGUgdGltZXN0YW1wc1xuICAgKiB3aGVuIGV4cG9zZWQgYnkgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjaG9ub3JUaW1lc3RhbXBzXG4gICAqL1xuICByZWFkb25seSBob25vclRpbWVzdGFtcHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBhdCB3aGljaCBQcm9tZXRoZXVzIHNjcmFwZXMgdGhlIG1ldHJpY3MgZnJvbSB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBnbG9iYWwgc2NyYXBlIGludGVydmFsLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1ldHJpY1JlbGFiZWxpbmdzIGRlZmluZXMgdGhlIHJlbGFiZWxpbmcgcnVsZXMgdG8gYXBwbHkgdG8gdGhlXG4gICAqIHNhbXBsZXMgYmVmb3JlIGluZ2VzdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjbWV0cmljUmVsYWJlbGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY1JlbGFiZWxpbmdzPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NbXTtcblxuICAvKipcbiAgICogbm9Qcm94eSBkZWZpbmVzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZyB0aGF0IGNhbiBjb250YWluIElQcywgQ0lEUiBub3RhdGlvbiwgZG9tYWluIG5hbWVzXG4gICAqIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gcHJveHlpbmcuIElQIGFuZCBkb21haW4gbmFtZXMgY2FuXG4gICAqIGNvbnRhaW4gcG9ydCBudW1iZXJzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNub1Byb3h5XG4gICAqL1xuICByZWFkb25seSBub1Byb3h5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvYXV0aDIgZGVmaW5lcyB0aGUgT0F1dGgyIHNldHRpbmdzIHRvIHVzZSB3aGVuIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gMi4yNy4wLlxuICAgKlxuICAgKiBDYW5ub3QgYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUgYXMgYGF1dGhvcml6YXRpb25gLCBvciBgYmFzaWNBdXRoYC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjb2F1dGgyXG4gICAqL1xuICByZWFkb25seSBvYXV0aDI/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDI7XG5cbiAgLyoqXG4gICAqIHBhcmFtcyBkZWZpbmUgb3B0aW9uYWwgSFRUUCBVUkwgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcGFyYW1zXG4gICAqL1xuICByZWFkb25seSBwYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH07XG5cbiAgLyoqXG4gICAqIHBhdGggZGVmaW5lcyB0aGUgSFRUUCBwYXRoIGZyb20gd2hpY2ggdG8gc2NyYXBlIGZvciBtZXRyaWNzLlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuIGAvbWV0cmljc2ApLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIFNlcnZpY2UgcG9ydCB3aGljaCB0aGlzIGVuZHBvaW50IHJlZmVycyB0by5cbiAgICpcbiAgICogSXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGB0YXJnZXRQb3J0YC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IHN0cmluZztcblxuICAvKipcbiAgICogcHJveHlDb25uZWN0SGVhZGVyIG9wdGlvbmFsbHkgc3BlY2lmaWVzIGhlYWRlcnMgdG8gc2VuZCB0b1xuICAgKiBwcm94aWVzIGR1cmluZyBDT05ORUNUIHJlcXVlc3RzLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNwcm94eUNvbm5lY3RIZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5Q29ubmVjdEhlYWRlcj86IHsgW2tleTogc3RyaW5nXTogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyW10gfTtcblxuICAvKipcbiAgICogcHJveHlGcm9tRW52aXJvbm1lbnQgZGVmaW5lcyB3aGV0aGVyIHRvIHVzZSB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBkZWZpbmVkIGJ5IGVudmlyb25tZW50IHZhcmlhYmxlcyAoSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIGFuZCBOT19QUk9YWSkuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDMuMCwgQWxlcnRtYW5hZ2VyID49IHYwLjI1LjAgb3IgVGhhbm9zID49IHYwLjMyLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI3Byb3h5RnJvbUVudmlyb25tZW50XG4gICAqL1xuICByZWFkb25seSBwcm94eUZyb21FbnZpcm9ubWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHByb3h5VXJsIGRlZmluZXMgdGhlIEhUVFAgcHJveHkgc2VydmVyIHRvIHVzZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcHJveHlVcmxcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5VXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZWxhYmVsaW5ncyBkZWZpbmVzIHRoZSByZWxhYmVsaW5nIHJ1bGVzIHRvIGFwcGx5IHRoZSB0YXJnZXQnc1xuICAgKiBtZXRhZGF0YSBsYWJlbHMuXG4gICAqXG4gICAqIFRoZSBPcGVyYXRvciBhdXRvbWF0aWNhbGx5IGFkZHMgcmVsYWJlbGluZ3MgZm9yIGEgZmV3IHN0YW5kYXJkIEt1YmVybmV0ZXMgZmllbGRzLlxuICAgKlxuICAgKiBUaGUgb3JpZ2luYWwgc2NyYXBlIGpvYidzIG5hbWUgaXMgYXZhaWxhYmxlIHZpYSB0aGUgYF9fdG1wX3Byb21ldGhldXNfam9iX25hbWVgIGxhYmVsLlxuICAgKlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8vcHJvbWV0aGV1cy5pby9kb2NzL3Byb21ldGhldXMvbGF0ZXN0L2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi8jcmVsYWJlbF9jb25maWdcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjcmVsYWJlbGluZ3NcbiAgICovXG4gIHJlYWRvbmx5IHJlbGFiZWxpbmdzPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3NbXTtcblxuICAvKipcbiAgICogc2NoZW1lIGRlZmluZXMgdGhlIEhUVFAgc2NoZW1lIHRvIHVzZSB3aGVuIHNjcmFwaW5nIHRoZSBtZXRyaWNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50cyNzY2hlbWVcbiAgICovXG4gIHJlYWRvbmx5IHNjaGVtZT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1NjaGVtZTtcblxuICAvKipcbiAgICogc2NyYXBlVGltZW91dCBkZWZpbmVzIHRoZSB0aW1lb3V0IGFmdGVyIHdoaWNoIFByb21ldGhldXMgY29uc2lkZXJzIHRoZSBzY3JhcGUgdG8gYmUgZmFpbGVkLlxuICAgKlxuICAgKiBJZiBlbXB0eSwgUHJvbWV0aGV1cyB1c2VzIHRoZSBnbG9iYWwgc2NyYXBlIHRpbWVvdXQgdW5sZXNzIGl0IGlzIGxlc3NcbiAgICogdGhhbiB0aGUgdGFyZ2V0J3Mgc2NyYXBlIGludGVydmFsIHZhbHVlIGluIHdoaWNoIHRoZSBsYXR0ZXIgaXMgdXNlZC5cbiAgICogVGhlIHZhbHVlIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIHNjcmFwZSBpbnRlcnZhbCBvdGhlcndpc2UgdGhlIG9wZXJhdG9yIHdpbGwgcmVqZWN0IHRoZSByZXNvdXJjZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjc2NyYXBlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgc2NyYXBlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogdGFyZ2V0UG9ydCBkZWZpbmVzIHRoZSBuYW1lIG9yIG51bWJlciBvZiB0aGUgdGFyZ2V0IHBvcnQgb2YgdGhlIGBQb2RgIG9iamVjdCBiZWhpbmQgdGhlXG4gICAqIFNlcnZpY2UuIFRoZSBwb3J0IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGNvbnRhaW5lcidzIHBvcnQgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzI3RhcmdldFBvcnRcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBvcnQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0O1xuXG4gIC8qKlxuICAgKiB0bHNDb25maWcgZGVmaW5lcyB0aGUgVExTIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2NyYXBpbmcgdGhlIHRhcmdldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjdGxzQ29uZmlnXG4gICAqL1xuICByZWFkb25seSB0bHNDb25maWc/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWc7XG5cbiAgLyoqXG4gICAqIHRyYWNrVGltZXN0YW1wc1N0YWxlbmVzcyBkZWZpbmVzIHdoZXRoZXIgUHJvbWV0aGV1cyB0cmFja3Mgc3RhbGVuZXNzIG9mXG4gICAqIHRoZSBtZXRyaWNzIHRoYXQgaGF2ZSBhbiBleHBsaWNpdCB0aW1lc3RhbXAgcHJlc2VudCBpbiBzY3JhcGVkIGRhdGEuXG4gICAqIEhhcyBubyBlZmZlY3QgaWYgYGhvbm9yVGltZXN0YW1wc2AgaXMgZmFsc2UuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDguMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMjdHJhY2tUaW1lc3RhbXBzU3RhbGVuZXNzXG4gICAqL1xuICByZWFkb25seSB0cmFja1RpbWVzdGFtcHNTdGFsZW5lc3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXV0aG9yaXphdGlvbic6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uKG9iai5hdXRob3JpemF0aW9uKSxcbiAgICAnYmFzaWNBdXRoJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aChvYmouYmFzaWNBdXRoKSxcbiAgICAnYmVhcmVyVG9rZW5GaWxlJzogb2JqLmJlYXJlclRva2VuRmlsZSxcbiAgICAnYmVhcmVyVG9rZW5TZWNyZXQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQob2JqLmJlYXJlclRva2VuU2VjcmV0KSxcbiAgICAnZW5hYmxlSHR0cDInOiBvYmouZW5hYmxlSHR0cDIsXG4gICAgJ2ZpbHRlclJ1bm5pbmcnOiBvYmouZmlsdGVyUnVubmluZyxcbiAgICAnZm9sbG93UmVkaXJlY3RzJzogb2JqLmZvbGxvd1JlZGlyZWN0cyxcbiAgICAnaG9ub3JMYWJlbHMnOiBvYmouaG9ub3JMYWJlbHMsXG4gICAgJ2hvbm9yVGltZXN0YW1wcyc6IG9iai5ob25vclRpbWVzdGFtcHMsXG4gICAgJ2ludGVydmFsJzogb2JqLmludGVydmFsLFxuICAgICdtZXRyaWNSZWxhYmVsaW5ncyc6IG9iai5tZXRyaWNSZWxhYmVsaW5ncz8ubWFwKHkgPT4gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzKHkpKSxcbiAgICAnbm9Qcm94eSc6IG9iai5ub1Byb3h5LFxuICAgICdvYXV0aDInOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyKG9iai5vYXV0aDIpLFxuICAgICdwYXJhbXMnOiAoKG9iai5wYXJhbXMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5wYXJhbXMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy5tYXAoeSA9PiB5KSB9KSwge30pKSxcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gICAgJ3Byb3h5Q29ubmVjdEhlYWRlcic6ICgob2JqLnByb3h5Q29ubmVjdEhlYWRlcikgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnByb3h5Q29ubmVjdEhlYWRlcikucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/Lm1hcCh5ID0+IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIoeSkpIH0pLCB7fSkpLFxuICAgICdwcm94eUZyb21FbnZpcm9ubWVudCc6IG9iai5wcm94eUZyb21FbnZpcm9ubWVudCxcbiAgICAncHJveHlVcmwnOiBvYmoucHJveHlVcmwsXG4gICAgJ3JlbGFiZWxpbmdzJzogb2JqLnJlbGFiZWxpbmdzPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3MoeSkpLFxuICAgICdzY2hlbWUnOiBvYmouc2NoZW1lLFxuICAgICdzY3JhcGVUaW1lb3V0Jzogb2JqLnNjcmFwZVRpbWVvdXQsXG4gICAgJ3RhcmdldFBvcnQnOiBvYmoudGFyZ2V0UG9ydD8udmFsdWUsXG4gICAgJ3Rsc0NvbmZpZyc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcob2JqLnRsc0NvbmZpZyksXG4gICAgJ3RyYWNrVGltZXN0YW1wc1N0YWxlbmVzcyc6IG9iai50cmFja1RpbWVzdGFtcHNTdGFsZW5lc3MsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBmYWxsYmFja1NjcmFwZVByb3RvY29sIGRlZmluZXMgdGhlIHByb3RvY29sIHRvIHVzZSBpZiBhIHNjcmFwZSByZXR1cm5zIGJsYW5rLCB1bnBhcnNlYWJsZSwgb3Igb3RoZXJ3aXNlIGludmFsaWQgQ29udGVudC1UeXBlLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjMuMC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRmFsbGJhY2tTY3JhcGVQcm90b2NvbFxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNGYWxsYmFja1NjcmFwZVByb3RvY29sIHtcbiAgLyoqIFByb21ldGhldXNQcm90byAqL1xuICBQUk9NRVRIRVVTX1BST1RPID0gXCJQcm9tZXRoZXVzUHJvdG9cIixcbiAgLyoqIE9wZW5NZXRyaWNzVGV4dDAuMC4xICovXG4gIE9QRU5fTUVUUklDU19URVhUMF8wXzEgPSBcIk9wZW5NZXRyaWNzVGV4dDAuMC4xXCIsXG4gIC8qKiBPcGVuTWV0cmljc1RleHQxLjAuMCAqL1xuICBPUEVOX01FVFJJQ1NfVEVYVDFfMF8wID0gXCJPcGVuTWV0cmljc1RleHQxLjAuMFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQwLjAuNCAqL1xuICBQUk9NRVRIRVVTX1RFWFQwXzBfNCA9IFwiUHJvbWV0aGV1c1RleHQwLjAuNFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQxLjAuMCAqL1xuICBQUk9NRVRIRVVTX1RFWFQxXzBfMCA9IFwiUHJvbWV0aGV1c1RleHQxLjAuMFwiLFxufVxuXG4vKipcbiAqIG5hbWVzcGFjZVNlbGVjdG9yIGRlZmluZXMgaW4gd2hpY2ggbmFtZXNwYWNlKHMpIFByb21ldGhldXMgc2hvdWxkIGRpc2NvdmVyIHRoZSBzZXJ2aWNlcy5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBzZXJ2aWNlcyBhcmUgZGlzY292ZXJlZCBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGBTZXJ2aWNlTW9uaXRvcmAgb2JqZWN0IGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBzZWxlY3QgcG9kcyBhY3Jvc3MgZGlmZmVyZW50L2FsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNOYW1lc3BhY2VTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBhbnkgZGVmaW5lcyB0aGUgYm9vbGVhbiBkZXNjcmliaW5nIHdoZXRoZXIgYWxsIG5hbWVzcGFjZXMgYXJlIHNlbGVjdGVkIGluIGNvbnRyYXN0IHRvIGFcbiAgICogbGlzdCByZXN0cmljdGluZyB0aGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yI2FueVxuICAgKi9cbiAgcmVhZG9ubHkgYW55PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogbWF0Y2hOYW1lcyBkZWZpbmVzIHRoZSBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0byBzZWxlY3QgZnJvbS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNOYW1lc3BhY2VTZWxlY3RvciNtYXRjaE5hbWVzXG4gICAqL1xuICByZWFkb25seSBtYXRjaE5hbWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY05hbWVzcGFjZVNlbGVjdG9yKG9iajogU2VydmljZU1vbml0b3JTcGVjTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbnknOiBvYmouYW55LFxuICAgICdtYXRjaE5hbWVzJzogb2JqLm1hdGNoTmFtZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIGRlZmluZXMgaWYgdGhlIGdyb3d0aCBmYWN0b3Igb2Ygb25lIGJ1Y2tldCB0byB0aGUgbmV4dCBpcyBzbWFsbGVyIHRoYW4gdGhpcyxcbiAqIGJ1Y2tldHMgd2lsbCBiZSBtZXJnZWQgdG8gaW5jcmVhc2UgdGhlIGZhY3RvciBzdWZmaWNpZW50bHkuXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjUwLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNOYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3RvciB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogU2VydmljZU1vbml0b3JTcGVjTmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yIHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VNb25pdG9yU3BlY05hdGl2ZUhpc3RvZ3JhbU1pbkJ1Y2tldEZhY3Rvcih2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBTZXJ2aWNlTW9uaXRvclNwZWNOYXRpdmVIaXN0b2dyYW1NaW5CdWNrZXRGYWN0b3Ige1xuICAgIHJldHVybiBuZXcgU2VydmljZU1vbml0b3JTcGVjTmF0aXZlSGlzdG9ncmFtTWluQnVja2V0RmFjdG9yKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBTY3JhcGVQcm90b2NvbCByZXByZXNlbnRzIGEgcHJvdG9jb2wgdXNlZCBieSBQcm9tZXRoZXVzIGZvciBzY3JhcGluZyBtZXRyaWNzLlxuICogU3VwcG9ydGVkIHZhbHVlcyBhcmU6XG4gKiAqIGBPcGVuTWV0cmljc1RleHQwLjAuMWBcbiAqICogYE9wZW5NZXRyaWNzVGV4dDEuMC4wYFxuICogKiBgUHJvbWV0aGV1c1Byb3RvYFxuICogKiBgUHJvbWV0aGV1c1RleHQwLjAuNGBcbiAqICogYFByb21ldGhldXNUZXh0MS4wLjBgXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTY3JhcGVQcm90b2NvbHNcbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZU1vbml0b3JTcGVjU2NyYXBlUHJvdG9jb2xzIHtcbiAgLyoqIFByb21ldGhldXNQcm90byAqL1xuICBQUk9NRVRIRVVTX1BST1RPID0gXCJQcm9tZXRoZXVzUHJvdG9cIixcbiAgLyoqIE9wZW5NZXRyaWNzVGV4dDAuMC4xICovXG4gIE9QRU5fTUVUUklDU19URVhUMF8wXzEgPSBcIk9wZW5NZXRyaWNzVGV4dDAuMC4xXCIsXG4gIC8qKiBPcGVuTWV0cmljc1RleHQxLjAuMCAqL1xuICBPUEVOX01FVFJJQ1NfVEVYVDFfMF8wID0gXCJPcGVuTWV0cmljc1RleHQxLjAuMFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQwLjAuNCAqL1xuICBQUk9NRVRIRVVTX1RFWFQwXzBfNCA9IFwiUHJvbWV0aGV1c1RleHQwLjAuNFwiLFxuICAvKiogUHJvbWV0aGV1c1RleHQxLjAuMCAqL1xuICBQUk9NRVRIRVVTX1RFWFQxXzBfMCA9IFwiUHJvbWV0aGV1c1RleHQxLjAuMFwiLFxufVxuXG4vKipcbiAqIHNlbGVjdG9yIGRlZmluZXMgdGhlIGxhYmVsIHNlbGVjdG9yIHRvIHNlbGVjdCB0aGUgS3ViZXJuZXRlcyBgRW5kcG9pbnRzYCBvYmplY3RzIHRvIHNjcmFwZSBtZXRyaWNzIGZyb20uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3RvcihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlbGVjdG9yTWVjaGFuaXNtIGRlZmluZXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHNlbGVjdCB0aGUgZW5kcG9pbnRzIHRvIHNjcmFwZS5cbiAqIEJ5IGRlZmF1bHQsIHRoZSBzZWxlY3Rpb24gcHJvY2VzcyByZWxpZXMgb24gcmVsYWJlbCBjb25maWd1cmF0aW9ucyB0byBmaWx0ZXIgdGhlIGRpc2NvdmVyZWQgdGFyZ2V0cy5cbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gb3B0IGluIGZvciByb2xlIHNlbGVjdG9ycywgd2hpY2ggbWF5IG9mZmVyIGJldHRlciBlZmZpY2llbmN5IGluIGxhcmdlIGNsdXN0ZXJzLlxuICogV2hpY2ggc3RyYXRlZ3kgaXMgYmVzdCBmb3IgeW91ciB1c2UgY2FzZSBuZWVkcyB0byBiZSBjYXJlZnVsbHkgZXZhbHVhdGVkLlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuMTcuMC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWVjaGFuaXNtIHtcbiAgLyoqIFJlbGFiZWxDb25maWcgKi9cbiAgUkVMQUJFTF9DT05GSUcgPSBcIlJlbGFiZWxDb25maWdcIixcbiAgLyoqIFJvbGVTZWxlY3RvciAqL1xuICBST0xFX1NFTEVDVE9SID0gXCJSb2xlU2VsZWN0b3JcIixcbn1cblxuLyoqXG4gKiBzZXJ2aWNlRGlzY292ZXJ5Um9sZSBkZWZpbmVzIHRoZSBzZXJ2aWNlIGRpc2NvdmVyeSByb2xlIHVzZWQgdG8gZGlzY292ZXIgdGFyZ2V0cy5cbiAqXG4gKiBJZiBzZXQsIHRoZSB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIFwiRW5kcG9pbnRzXCIgb3IgXCJFbmRwb2ludFNsaWNlXCIuXG4gKiBPdGhlcndpc2UgaXQgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhlXG4gKiBQcm9tZXRoZXVzL1Byb21ldGhldXNBZ2VudCByZXNvdXJjZS5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlcnZpY2VEaXNjb3ZlcnlSb2xlXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY1NlcnZpY2VEaXNjb3ZlcnlSb2xlIHtcbiAgLyoqIEVuZHBvaW50cyAqL1xuICBFTkRQT0lOVFMgPSBcIkVuZHBvaW50c1wiLFxuICAvKiogRW5kcG9pbnRTbGljZSAqL1xuICBFTkRQT0lOVF9TTElDRSA9IFwiRW5kcG9pbnRTbGljZVwiLFxufVxuXG4vKipcbiAqIGF1dGhvcml6YXRpb24gY29uZmlndXJlcyB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXIgY3JlZGVudGlhbHMgdG8gdXNlIHdoZW5cbiAqIHNjcmFwaW5nIHRoZSB0YXJnZXQuXG4gKlxuICogQ2Fubm90IGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lIGFzIGBiYXNpY0F1dGhgLCBvciBgb2F1dGgyYC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uIHtcbiAgLyoqXG4gICAqIGNyZWRlbnRpYWxzIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgaW4gdGhlIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVkZW50aWFscyBmb3IgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbiNjcmVkZW50aWFsc1xuICAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbHM/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHM7XG5cbiAgLyoqXG4gICAqIHR5cGUgZGVmaW5lcyB0aGUgYXV0aGVudGljYXRpb24gdHlwZS4gVGhlIHZhbHVlIGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gICAqXG4gICAqIFwiQmFzaWNcIiBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUuXG4gICAqXG4gICAqIERlZmF1bHQ6IFwiQmVhcmVyXCJcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjcmVkZW50aWFscyc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMob2JqLmNyZWRlbnRpYWxzKSxcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYmFzaWNBdXRoIGRlZmluZXMgdGhlIEJhc2ljIEF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIHRvIHVzZSB3aGVuXG4gKiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICpcbiAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBvYXV0aDJgLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoIHtcbiAgLyoqXG4gICAqIHBhc3N3b3JkIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgcGFzc3dvcmQgZm9yXG4gICAqIGF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aCNwYXNzd29yZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFzc3dvcmQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZDtcblxuICAvKipcbiAgICogdXNlcm5hbWUgZGVmaW5lcyBhIGtleSBvZiBhIFNlY3JldCBjb250YWluaW5nIHRoZSB1c2VybmFtZSBmb3JcbiAgICogYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoI3VzZXJuYW1lXG4gICAqL1xuICByZWFkb25seSB1c2VybmFtZT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGgnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncGFzc3dvcmQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQob2JqLnBhc3N3b3JkKSxcbiAgICAndXNlcm5hbWUnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUob2JqLnVzZXJuYW1lKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGJlYXJlclRva2VuU2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgYmVhcmVyXG4gKiB0b2tlbiBmb3Igc2NyYXBpbmcgdGFyZ2V0cy4gVGhlIHNlY3JldCBuZWVkcyB0byBiZSBpbiB0aGUgc2FtZSBuYW1lc3BhY2VcbiAqIGFzIHRoZSBTZXJ2aWNlTW9uaXRvciBvYmplY3QgYW5kIHJlYWRhYmxlIGJ5IHRoZSBQcm9tZXRoZXVzIE9wZXJhdG9yLlxuICpcbiAqIERlcHJlY2F0ZWQ6IHVzZSBgYXV0aG9yaXphdGlvbmAgaW5zdGVhZC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0JlYXJlclRva2VuU2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmVhcmVyVG9rZW5TZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCZWFyZXJUb2tlblNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0JlYXJlclRva2VuU2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlbGFiZWxDb25maWcgYWxsb3dzIGR5bmFtaWMgcmV3cml0aW5nIG9mIHRoZSBsYWJlbCBzZXQgZm9yIHRhcmdldHMsIGFsZXJ0cyxcbiAqIHNjcmFwZWQgc2FtcGxlcyBhbmQgcmVtb3RlIHdyaXRlIHNhbXBsZXMuXG4gKlxuICogTW9yZSBpbmZvOiBodHRwczovL3Byb21ldGhldXMuaW8vZG9jcy9wcm9tZXRoZXVzL2xhdGVzdC9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24vI3JlbGFiZWxfY29uZmlnXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzIHtcbiAgLyoqXG4gICAqIGFjdGlvbiB0byBwZXJmb3JtIGJhc2VkIG9uIHRoZSByZWdleCBtYXRjaGluZy5cbiAgICpcbiAgICogYFVwcGVyY2FzZWAgYW5kIGBMb3dlcmNhc2VgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjM2LjAuXG4gICAqIGBEcm9wRXF1YWxgIGFuZCBgS2VlcEVxdWFsYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi40MS4wLlxuICAgKlxuICAgKiBEZWZhdWx0OiBcIlJlcGxhY2VcIlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI2FjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb247XG5cbiAgLyoqXG4gICAqIG1vZHVsdXMgdG8gdGFrZSBvZiB0aGUgaGFzaCBvZiB0aGUgc291cmNlIGxhYmVsIHZhbHVlcy5cbiAgICpcbiAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gdGhlIGFjdGlvbiBpcyBgSGFzaE1vZGAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MjbW9kdWx1c1xuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWx1cz86IG51bWJlcjtcblxuICAvKipcbiAgICogcmVnZXggZGVmaW5lcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGFnYWluc3Qgd2hpY2ggdGhlIGV4dHJhY3RlZCB2YWx1ZSBpcyBtYXRjaGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI3JlZ2V4XG4gICAqL1xuICByZWFkb25seSByZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGFjZW1lbnQgdmFsdWUgYWdhaW5zdCB3aGljaCBhIFJlcGxhY2UgYWN0aW9uIGlzIHBlcmZvcm1lZCBpZiB0aGVcbiAgICogcmVndWxhciBleHByZXNzaW9uIG1hdGNoZXMuXG4gICAqXG4gICAqIFJlZ2V4IGNhcHR1cmUgZ3JvdXBzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MjcmVwbGFjZW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxhY2VtZW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzZXBhcmF0b3IgZGVmaW5lcyB0aGUgc3RyaW5nIGJldHdlZW4gY29uY2F0ZW5hdGVkIFNvdXJjZUxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5ncyNzZXBhcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IHNlcGFyYXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogc291cmNlTGFiZWxzIGRlZmluZXMgdGhlIHNvdXJjZSBsYWJlbHMgc2VsZWN0IHZhbHVlcyBmcm9tIGV4aXN0aW5nIGxhYmVscy4gVGhlaXIgY29udGVudCBpc1xuICAgKiBjb25jYXRlbmF0ZWQgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgU2VwYXJhdG9yIGFuZCBtYXRjaGVkIGFnYWluc3QgdGhlXG4gICAqIGNvbmZpZ3VyZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzI3NvdXJjZUxhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlTGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHRhcmdldExhYmVsIGRlZmluZXMgdGhlIGxhYmVsIHRvIHdoaWNoIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHdyaXR0ZW4gaW4gYSByZXBsYWNlbWVudC5cbiAgICpcbiAgICogSXQgaXMgbWFuZGF0b3J5IGZvciBgUmVwbGFjZWAsIGBIYXNoTW9kYCwgYExvd2VyY2FzZWAsIGBVcHBlcmNhc2VgLFxuICAgKiBgS2VlcEVxdWFsYCBhbmQgYERyb3BFcXVhbGAgYWN0aW9ucy5cbiAgICpcbiAgICogUmVnZXggY2FwdHVyZSBncm91cHMgYXJlIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNNZXRyaWNSZWxhYmVsaW5ncyN0YXJnZXRMYWJlbFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c01ldHJpY1JlbGFiZWxpbmdzKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3MgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhY3Rpb24nOiBvYmouYWN0aW9uLFxuICAgICdtb2R1bHVzJzogb2JqLm1vZHVsdXMsXG4gICAgJ3JlZ2V4Jzogb2JqLnJlZ2V4LFxuICAgICdyZXBsYWNlbWVudCc6IG9iai5yZXBsYWNlbWVudCxcbiAgICAnc2VwYXJhdG9yJzogb2JqLnNlcGFyYXRvcixcbiAgICAnc291cmNlTGFiZWxzJzogb2JqLnNvdXJjZUxhYmVscz8ubWFwKHkgPT4geSksXG4gICAgJ3RhcmdldExhYmVsJzogb2JqLnRhcmdldExhYmVsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogb2F1dGgyIGRlZmluZXMgdGhlIE9BdXRoMiBzZXR0aW5ncyB0byB1c2Ugd2hlbiBzY3JhcGluZyB0aGUgdGFyZ2V0LlxuICpcbiAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gMi4yNy4wLlxuICpcbiAqIENhbm5vdCBiZSBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcyBgYXV0aG9yaXphdGlvbmAsIG9yIGBiYXNpY0F1dGhgLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyIHtcbiAgLyoqXG4gICAqIGNsaWVudElkIGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgb3IgQ29uZmlnTWFwIGNvbnRhaW5pbmcgdGhlXG4gICAqIE9BdXRoMiBjbGllbnQncyBJRC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjY2xpZW50SWRcbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudElkOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZDtcblxuICAvKipcbiAgICogY2xpZW50U2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgT0F1dGgyXG4gICAqIGNsaWVudCdzIHNlY3JldC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjY2xpZW50U2VjcmV0XG4gICAqL1xuICByZWFkb25seSBjbGllbnRTZWNyZXQ6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldDtcblxuICAvKipcbiAgICogZW5kcG9pbnRQYXJhbXMgY29uZmlndXJlcyB0aGUgSFRUUCBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byB0aGUgdG9rZW5cbiAgICogVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMiNlbmRwb2ludFBhcmFtc1xuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRQYXJhbXM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBub1Byb3h5IGRlZmluZXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIHRoYXQgY2FuIGNvbnRhaW4gSVBzLCBDSURSIG5vdGF0aW9uLCBkb21haW4gbmFtZXNcbiAgICogdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBwcm94eWluZy4gSVAgYW5kIGRvbWFpbiBuYW1lcyBjYW5cbiAgICogY29udGFpbiBwb3J0IG51bWJlcnMuXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDMuMCwgQWxlcnRtYW5hZ2VyID49IHYwLjI1LjAgb3IgVGhhbm9zID49IHYwLjMyLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI25vUHJveHlcbiAgICovXG4gIHJlYWRvbmx5IG5vUHJveHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHByb3h5Q29ubmVjdEhlYWRlciBvcHRpb25hbGx5IHNwZWNpZmllcyBoZWFkZXJzIHRvIHNlbmQgdG9cbiAgICogcHJveGllcyBkdXJpbmcgQ09OTkVDVCByZXF1ZXN0cy5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi40My4wLCBBbGVydG1hbmFnZXIgPj0gdjAuMjUuMCBvciBUaGFub3MgPj0gdjAuMzIuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDIjcHJveHlDb25uZWN0SGVhZGVyXG4gICAqL1xuICByZWFkb25seSBwcm94eUNvbm5lY3RIZWFkZXI/OiB7IFtrZXk6IHN0cmluZ106IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlcltdIH07XG5cbiAgLyoqXG4gICAqIHByb3h5RnJvbUVudmlyb25tZW50IGRlZmluZXMgd2hldGhlciB0byB1c2UgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBieSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKEhUVFBfUFJPWFksIEhUVFBTX1BST1hZLCBhbmQgTk9fUFJPWFkpLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAsIEFsZXJ0bWFuYWdlciA+PSB2MC4yNS4wIG9yIFRoYW5vcyA+PSB2MC4zMi4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMiNwcm94eUZyb21FbnZpcm9ubWVudFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlGcm9tRW52aXJvbm1lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBwcm94eVVybCBkZWZpbmVzIHRoZSBIVFRQIHByb3h5IHNlcnZlciB0byB1c2UuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Byb3h5VXJsXG4gICAqL1xuICByZWFkb25seSBwcm94eVVybD86IHN0cmluZztcblxuICAvKipcbiAgICogc2NvcGVzIGRlZmluZXMgdGhlIE9BdXRoMiBzY29wZXMgdXNlZCBmb3IgdGhlIHRva2VuIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Njb3Blc1xuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIHRsc0NvbmZpZyBkZWZpbmVzIHRoZSBUTFMgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBPQXV0aDIgc2VydmVyLlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQzLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Rsc0NvbmZpZ1xuICAgKi9cbiAgcmVhZG9ubHkgdGxzQ29uZmlnPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnO1xuXG4gIC8qKlxuICAgKiB0b2tlblVybCBkZWZpbmVzIHRoZSBVUkwgdG8gZmV0Y2ggdGhlIHRva2VuIGZyb20uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyI3Rva2VuVXJsXG4gICAqL1xuICByZWFkb25seSB0b2tlblVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xpZW50SWQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQob2JqLmNsaWVudElkKSxcbiAgICAnY2xpZW50U2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldChvYmouY2xpZW50U2VjcmV0KSxcbiAgICAnZW5kcG9pbnRQYXJhbXMnOiAoKG9iai5lbmRwb2ludFBhcmFtcykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmVuZHBvaW50UGFyYW1zKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbm9Qcm94eSc6IG9iai5ub1Byb3h5LFxuICAgICdwcm94eUNvbm5lY3RIZWFkZXInOiAoKG9iai5wcm94eUNvbm5lY3RIZWFkZXIpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5wcm94eUNvbm5lY3RIZWFkZXIpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy5tYXAoeSA9PiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyKHkpKSB9KSwge30pKSxcbiAgICAncHJveHlGcm9tRW52aXJvbm1lbnQnOiBvYmoucHJveHlGcm9tRW52aXJvbm1lbnQsXG4gICAgJ3Byb3h5VXJsJzogb2JqLnByb3h5VXJsLFxuICAgICdzY29wZXMnOiBvYmouc2NvcGVzPy5tYXAoeSA9PiB5KSxcbiAgICAndGxzQ29uZmlnJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyhvYmoudGxzQ29uZmlnKSxcbiAgICAndG9rZW5VcmwnOiBvYmoudG9rZW5VcmwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTZWNyZXRLZXlTZWxlY3RvciBzZWxlY3RzIGEga2V5IG9mIGEgU2VjcmV0LlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlciNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNQcm94eUNvbm5lY3RIZWFkZXIjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUHJveHlDb25uZWN0SGVhZGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlcihvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Byb3h5Q29ubmVjdEhlYWRlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZWxhYmVsQ29uZmlnIGFsbG93cyBkeW5hbWljIHJld3JpdGluZyBvZiB0aGUgbGFiZWwgc2V0IGZvciB0YXJnZXRzLCBhbGVydHMsXG4gKiBzY3JhcGVkIHNhbXBsZXMgYW5kIHJlbW90ZSB3cml0ZSBzYW1wbGVzLlxuICpcbiAqIE1vcmUgaW5mbzogaHR0cHM6Ly9wcm9tZXRoZXVzLmlvL2RvY3MvcHJvbWV0aGV1cy9sYXRlc3QvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLyNyZWxhYmVsX2NvbmZpZ1xuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyB7XG4gIC8qKlxuICAgKiBhY3Rpb24gdG8gcGVyZm9ybSBiYXNlZCBvbiB0aGUgcmVnZXggbWF0Y2hpbmcuXG4gICAqXG4gICAqIGBVcHBlcmNhc2VgIGFuZCBgTG93ZXJjYXNlYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi4zNi4wLlxuICAgKiBgRHJvcEVxdWFsYCBhbmQgYEtlZXBFcXVhbGAgYWN0aW9ucyByZXF1aXJlIFByb21ldGhldXMgPj0gdjIuNDEuMC5cbiAgICpcbiAgICogRGVmYXVsdDogXCJSZXBsYWNlXCJcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNhY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbj86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBtb2R1bHVzIHRvIHRha2Ugb2YgdGhlIGhhc2ggb2YgdGhlIHNvdXJjZSBsYWJlbCB2YWx1ZXMuXG4gICAqXG4gICAqIE9ubHkgYXBwbGljYWJsZSB3aGVuIHRoZSBhY3Rpb24gaXMgYEhhc2hNb2RgLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzI21vZHVsdXNcbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsdXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlZ2V4IGRlZmluZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhZ2FpbnN0IHdoaWNoIHRoZSBleHRyYWN0ZWQgdmFsdWUgaXMgbWF0Y2hlZC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNyZWdleFxuICAgKi9cbiAgcmVhZG9ubHkgcmVnZXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHJlcGxhY2VtZW50IHZhbHVlIGFnYWluc3Qgd2hpY2ggYSBSZXBsYWNlIGFjdGlvbiBpcyBwZXJmb3JtZWQgaWYgdGhlXG4gICAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzLlxuICAgKlxuICAgKiBSZWdleCBjYXB0dXJlIGdyb3VwcyBhcmUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzI3JlcGxhY2VtZW50XG4gICAqL1xuICByZWFkb25seSByZXBsYWNlbWVudD86IHN0cmluZztcblxuICAvKipcbiAgICogc2VwYXJhdG9yIGRlZmluZXMgdGhlIHN0cmluZyBiZXR3ZWVuIGNvbmNhdGVuYXRlZCBTb3VyY2VMYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3Mjc2VwYXJhdG9yXG4gICAqL1xuICByZWFkb25seSBzZXBhcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNvdXJjZUxhYmVscyBkZWZpbmVzIHRoZSBzb3VyY2UgbGFiZWxzIHNlbGVjdCB2YWx1ZXMgZnJvbSBleGlzdGluZyBsYWJlbHMuIFRoZWlyIGNvbnRlbnQgaXNcbiAgICogY29uY2F0ZW5hdGVkIHVzaW5nIHRoZSBjb25maWd1cmVkIFNlcGFyYXRvciBhbmQgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBjb25maWd1cmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyNzb3VyY2VMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUxhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiB0YXJnZXRMYWJlbCBkZWZpbmVzIHRoZSBsYWJlbCB0byB3aGljaCB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcyB3cml0dGVuIGluIGEgcmVwbGFjZW1lbnQuXG4gICAqXG4gICAqIEl0IGlzIG1hbmRhdG9yeSBmb3IgYFJlcGxhY2VgLCBgSGFzaE1vZGAsIGBMb3dlcmNhc2VgLCBgVXBwZXJjYXNlYCxcbiAgICogYEtlZXBFcXVhbGAgYW5kIGBEcm9wRXF1YWxgIGFjdGlvbnMuXG4gICAqXG4gICAqIFJlZ2V4IGNhcHR1cmUgZ3JvdXBzIGFyZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzUmVsYWJlbGluZ3MjdGFyZ2V0TGFiZWxcbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldExhYmVsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNSZWxhYmVsaW5ncyhvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWN0aW9uJzogb2JqLmFjdGlvbixcbiAgICAnbW9kdWx1cyc6IG9iai5tb2R1bHVzLFxuICAgICdyZWdleCc6IG9iai5yZWdleCxcbiAgICAncmVwbGFjZW1lbnQnOiBvYmoucmVwbGFjZW1lbnQsXG4gICAgJ3NlcGFyYXRvcic6IG9iai5zZXBhcmF0b3IsXG4gICAgJ3NvdXJjZUxhYmVscyc6IG9iai5zb3VyY2VMYWJlbHM/Lm1hcCh5ID0+IHkpLFxuICAgICd0YXJnZXRMYWJlbCc6IG9iai50YXJnZXRMYWJlbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNjaGVtZSBkZWZpbmVzIHRoZSBIVFRQIHNjaGVtZSB0byB1c2Ugd2hlbiBzY3JhcGluZyB0aGUgbWV0cmljcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1NjaGVtZVxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNTY2hlbWUge1xuICAvKiogaHR0cCAqL1xuICBIVFRQID0gXCJodHRwXCIsXG4gIC8qKiBodHRwcyAqL1xuICBIVFRQUyA9IFwiaHR0cHNcIixcbn1cblxuLyoqXG4gKiB0YXJnZXRQb3J0IGRlZmluZXMgdGhlIG5hbWUgb3IgbnVtYmVyIG9mIHRoZSB0YXJnZXQgcG9ydCBvZiB0aGUgYFBvZGAgb2JqZWN0IGJlaGluZCB0aGVcbiAqIFNlcnZpY2UuIFRoZSBwb3J0IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGNvbnRhaW5lcidzIHBvcnQgcHJvcGVydHkuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0IHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0IHtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1RhcmdldFBvcnQodmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGFyZ2V0UG9ydCB7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUYXJnZXRQb3J0KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0bHNDb25maWcgZGVmaW5lcyB0aGUgVExTIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2NyYXBpbmcgdGhlIHRhcmdldC5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBjYSBkZWZpbmVzIHRoZSBDZXJ0aWZpY2F0ZSBhdXRob3JpdHkgdXNlZCB3aGVuIHZlcmlmeWluZyBzZXJ2ZXIgY2VydGlmaWNhdGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjYVxuICAgKi9cbiAgcmVhZG9ubHkgY2E/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYTtcblxuICAvKipcbiAgICogY2FGaWxlIGRlZmluZXMgdGhlIHBhdGggdG8gdGhlIENBIGNlcnQgaW4gdGhlIFByb21ldGhldXMgY29udGFpbmVyIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI2NhRmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBjZXJ0IGRlZmluZXMgdGhlIENsaWVudCBjZXJ0aWZpY2F0ZSB0byBwcmVzZW50IHdoZW4gZG9pbmcgY2xpZW50LWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjZXJ0XG4gICAqL1xuICByZWFkb25seSBjZXJ0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydDtcblxuICAvKipcbiAgICogY2VydEZpbGUgZGVmaW5lcyB0aGUgcGF0aCB0byB0aGUgY2xpZW50IGNlcnQgZmlsZSBpbiB0aGUgUHJvbWV0aGV1cyBjb250YWluZXIgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNjZXJ0RmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2VydEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGluc2VjdXJlU2tpcFZlcmlmeSBkZWZpbmVzIGhvdyB0byBkaXNhYmxlIHRhcmdldCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNpbnNlY3VyZVNraXBWZXJpZnlcbiAgICovXG4gIHJlYWRvbmx5IGluc2VjdXJlU2tpcFZlcmlmeT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGtleUZpbGUgZGVmaW5lcyB0aGUgcGF0aCB0byB0aGUgY2xpZW50IGtleSBmaWxlIGluIHRoZSBQcm9tZXRoZXVzIGNvbnRhaW5lciBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI2tleUZpbGVcbiAgICovXG4gIHJlYWRvbmx5IGtleUZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGtleVNlY3JldCBkZWZpbmVzIHRoZSBTZWNyZXQgY29udGFpbmluZyB0aGUgY2xpZW50IGtleSBmaWxlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcja2V5U2VjcmV0XG4gICAqL1xuICByZWFkb25seSBrZXlTZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIG1heFZlcnNpb24gZGVmaW5lcyB0aGUgbWF4aW11bSBhY2NlcHRhYmxlIFRMUyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnI21heFZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1heFZlcnNpb24/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNYXhWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBtaW5WZXJzaW9uIGRlZmluZXMgdGhlIG1pbmltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAgICpcbiAgICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNtaW5WZXJzaW9uXG4gICAqL1xuICByZWFkb25seSBtaW5WZXJzaW9uPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnTWluVmVyc2lvbjtcblxuICAvKipcbiAgICogc2VydmVyTmFtZSBpcyB1c2VkIHRvIHZlcmlmeSB0aGUgaG9zdG5hbWUgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZyNzZXJ2ZXJOYW1lXG4gICAqL1xuICByZWFkb25seSBzZXJ2ZXJOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2EnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2Eob2JqLmNhKSxcbiAgICAnY2FGaWxlJzogb2JqLmNhRmlsZSxcbiAgICAnY2VydCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0KG9iai5jZXJ0KSxcbiAgICAnY2VydEZpbGUnOiBvYmouY2VydEZpbGUsXG4gICAgJ2luc2VjdXJlU2tpcFZlcmlmeSc6IG9iai5pbnNlY3VyZVNraXBWZXJpZnksXG4gICAgJ2tleUZpbGUnOiBvYmoua2V5RmlsZSxcbiAgICAna2V5U2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldChvYmoua2V5U2VjcmV0KSxcbiAgICAnbWF4VmVyc2lvbic6IG9iai5tYXhWZXJzaW9uLFxuICAgICdtaW5WZXJzaW9uJzogb2JqLm1pblZlcnNpb24sXG4gICAgJ3NlcnZlck5hbWUnOiBvYmouc2VydmVyTmFtZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY1NlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjcmVkZW50aWFscyBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGluIHRoZSBuYW1lc3BhY2UgdGhhdCBjb250YWlucyB0aGUgY3JlZGVudGlhbHMgZm9yIGF1dGhlbnRpY2F0aW9uLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNBdXRob3JpemF0aW9uQ3JlZGVudGlhbHMjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQXV0aG9yaXphdGlvbkNyZWRlbnRpYWxzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyhvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0F1dGhvcml6YXRpb25DcmVkZW50aWFscyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwYXNzd29yZCBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGNvbnRhaW5pbmcgdGhlIHBhc3N3b3JkIGZvclxuICogYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFBhc3N3b3JkI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoUGFzc3dvcmQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhQYXNzd29yZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiB1c2VybmFtZSBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IGNvbnRhaW5pbmcgdGhlIHVzZXJuYW1lIGZvclxuICogYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhVc2VybmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c0Jhc2ljQXV0aFVzZXJuYW1lI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzQmFzaWNBdXRoVXNlcm5hbWUob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNCYXNpY0F1dGhVc2VybmFtZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBhY3Rpb24gdG8gcGVyZm9ybSBiYXNlZCBvbiB0aGUgcmVnZXggbWF0Y2hpbmcuXG4gKlxuICogYFVwcGVyY2FzZWAgYW5kIGBMb3dlcmNhc2VgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjM2LjAuXG4gKiBgRHJvcEVxdWFsYCBhbmQgYEtlZXBFcXVhbGAgYWN0aW9ucyByZXF1aXJlIFByb21ldGhldXMgPj0gdjIuNDEuMC5cbiAqXG4gKiBEZWZhdWx0OiBcIlJlcGxhY2VcIlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb25cbiAqL1xuZXhwb3J0IGVudW0gU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzTWV0cmljUmVsYWJlbGluZ3NBY3Rpb24ge1xuICAvKiogcmVwbGFjZSAqL1xuICBSRVBMQUNFID0gXCJyZXBsYWNlXCIsXG4gIC8qKiBrZWVwICovXG4gIEtFRVAgPSBcImtlZXBcIixcbiAgLyoqIGRyb3AgKi9cbiAgRFJPUCA9IFwiZHJvcFwiLFxuICAvKiogaGFzaG1vZCAqL1xuICBIQVNITU9EID0gXCJoYXNobW9kXCIsXG4gIC8qKiBsYWJlbG1hcCAqL1xuICBMQUJFTE1BUCA9IFwibGFiZWxtYXBcIixcbiAgLyoqIGxhYmVsZHJvcCAqL1xuICBMQUJFTERST1AgPSBcImxhYmVsZHJvcFwiLFxuICAvKiogbGFiZWxrZWVwICovXG4gIExBQkVMS0VFUCA9IFwibGFiZWxrZWVwXCIsXG4gIC8qKiBsb3dlcmNhc2UgKi9cbiAgTE9XRVJDQVNFID0gXCJsb3dlcmNhc2VcIixcbiAgLyoqIHVwcGVyY2FzZSAqL1xuICBVUFBFUkNBU0UgPSBcInVwcGVyY2FzZVwiLFxuICAvKioga2VlcGVxdWFsICovXG4gIEtFRVBFUVVBTCA9IFwia2VlcGVxdWFsXCIsXG4gIC8qKiBkcm9wZXF1YWwgKi9cbiAgRFJPUEVRVUFMID0gXCJkcm9wZXF1YWxcIixcbn1cblxuLyoqXG4gKiBjbGllbnRJZCBkZWZpbmVzIGEga2V5IG9mIGEgU2VjcmV0IG9yIENvbmZpZ01hcCBjb250YWluaW5nIHRoZVxuICogT0F1dGgyIGNsaWVudCdzIElELlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkI2NvbmZpZ01hcFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnTWFwPzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXA7XG5cbiAgLyoqXG4gICAqIHNlY3JldCBkZWZpbmVzIHRoZSBTZWNyZXQgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NvbmZpZ01hcCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcChvYmouY29uZmlnTWFwKSxcbiAgICAnc2VjcmV0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2xpZW50U2VjcmV0IGRlZmluZXMgYSBrZXkgb2YgYSBTZWNyZXQgY29udGFpbmluZyB0aGUgT0F1dGgyXG4gKiBjbGllbnQncyBzZWNyZXQuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0I2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRTZWNyZXQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNlY3JldEtleVNlbGVjdG9yIHNlbGVjdHMgYSBrZXkgb2YgYSBTZWNyZXQuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXIge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlciNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlByb3h5Q29ubmVjdEhlYWRlciNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJQcm94eUNvbm5lY3RIZWFkZXInIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyUHJveHlDb25uZWN0SGVhZGVyIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHRsc0NvbmZpZyBkZWZpbmVzIHRoZSBUTFMgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBPQXV0aDIgc2VydmVyLlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi40My4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnIHtcbiAgLyoqXG4gICAqIGNhIGRlZmluZXMgdGhlIENlcnRpZmljYXRlIGF1dGhvcml0eSB1c2VkIHdoZW4gdmVyaWZ5aW5nIHNlcnZlciBjZXJ0aWZpY2F0ZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI2NhXG4gICAqL1xuICByZWFkb25seSBjYT86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhO1xuXG4gIC8qKlxuICAgKiBjZXJ0IGRlZmluZXMgdGhlIENsaWVudCBjZXJ0aWZpY2F0ZSB0byBwcmVzZW50IHdoZW4gZG9pbmcgY2xpZW50LWF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyNjZXJ0XG4gICAqL1xuICByZWFkb25seSBjZXJ0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydDtcblxuICAvKipcbiAgICogaW5zZWN1cmVTa2lwVmVyaWZ5IGRlZmluZXMgaG93IHRvIGRpc2FibGUgdGFyZ2V0IGNlcnRpZmljYXRlIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI2luc2VjdXJlU2tpcFZlcmlmeVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zZWN1cmVTa2lwVmVyaWZ5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZyNrZXlTZWNyZXRcbiAgICovXG4gIHJlYWRvbmx5IGtleVNlY3JldD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldDtcblxuICAvKipcbiAgICogbWF4VmVyc2lvbiBkZWZpbmVzIHRoZSBtYXhpbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gICAqXG4gICAqIEl0IHJlcXVpcmVzIFByb21ldGhldXMgPj0gdjIuNDEuMCBvciBUaGFub3MgPj0gdjAuMzEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcjbWF4VmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgbWF4VmVyc2lvbj86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ01heFZlcnNpb247XG5cbiAgLyoqXG4gICAqIG1pblZlcnNpb24gZGVmaW5lcyB0aGUgbWluaW11bSBhY2NlcHRhYmxlIFRMUyB2ZXJzaW9uLlxuICAgKlxuICAgKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjM1LjAgb3IgVGhhbm9zID49IHYwLjI4LjAuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI21pblZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IG1pblZlcnNpb24/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNaW5WZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBzZXJ2ZXJOYW1lIGlzIHVzZWQgdG8gdmVyaWZ5IHRoZSBob3N0bmFtZSBmb3IgdGhlIHRhcmdldHMuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnI3NlcnZlck5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZlck5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjYSc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYShvYmouY2EpLFxuICAgICdjZXJ0JzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQob2JqLmNlcnQpLFxuICAgICdpbnNlY3VyZVNraXBWZXJpZnknOiBvYmouaW5zZWN1cmVTa2lwVmVyaWZ5LFxuICAgICdrZXlTZWNyZXQnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0KG9iai5rZXlTZWNyZXQpLFxuICAgICdtYXhWZXJzaW9uJzogb2JqLm1heFZlcnNpb24sXG4gICAgJ21pblZlcnNpb24nOiBvYmoubWluVmVyc2lvbixcbiAgICAnc2VydmVyTmFtZSc6IG9iai5zZXJ2ZXJOYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYWN0aW9uIHRvIHBlcmZvcm0gYmFzZWQgb24gdGhlIHJlZ2V4IG1hdGNoaW5nLlxuICpcbiAqIGBVcHBlcmNhc2VgIGFuZCBgTG93ZXJjYXNlYCBhY3Rpb25zIHJlcXVpcmUgUHJvbWV0aGV1cyA+PSB2Mi4zNi4wLlxuICogYERyb3BFcXVhbGAgYW5kIGBLZWVwRXF1YWxgIGFjdGlvbnMgcmVxdWlyZSBQcm9tZXRoZXVzID49IHYyLjQxLjAuXG4gKlxuICogRGVmYXVsdDogXCJSZXBsYWNlXCJcbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1JlbGFiZWxpbmdzQWN0aW9uIHtcbiAgLyoqIHJlcGxhY2UgKi9cbiAgUkVQTEFDRSA9IFwicmVwbGFjZVwiLFxuICAvKioga2VlcCAqL1xuICBLRUVQID0gXCJrZWVwXCIsXG4gIC8qKiBkcm9wICovXG4gIERST1AgPSBcImRyb3BcIixcbiAgLyoqIGhhc2htb2QgKi9cbiAgSEFTSE1PRCA9IFwiaGFzaG1vZFwiLFxuICAvKiogbGFiZWxtYXAgKi9cbiAgTEFCRUxNQVAgPSBcImxhYmVsbWFwXCIsXG4gIC8qKiBsYWJlbGRyb3AgKi9cbiAgTEFCRUxEUk9QID0gXCJsYWJlbGRyb3BcIixcbiAgLyoqIGxhYmVsa2VlcCAqL1xuICBMQUJFTEtFRVAgPSBcImxhYmVsa2VlcFwiLFxuICAvKiogbG93ZXJjYXNlICovXG4gIExPV0VSQ0FTRSA9IFwibG93ZXJjYXNlXCIsXG4gIC8qKiB1cHBlcmNhc2UgKi9cbiAgVVBQRVJDQVNFID0gXCJ1cHBlcmNhc2VcIixcbiAgLyoqIGtlZXBlcXVhbCAqL1xuICBLRUVQRVFVQUwgPSBcImtlZXBlcXVhbFwiLFxuICAvKiogZHJvcGVxdWFsICovXG4gIERST1BFUVVBTCA9IFwiZHJvcGVxdWFsXCIsXG59XG5cbi8qKlxuICogY2EgZGVmaW5lcyB0aGUgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IHVzZWQgd2hlbiB2ZXJpZnlpbmcgc2VydmVyIGNlcnRpZmljYXRlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2Ege1xuICAvKipcbiAgICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYSNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhI3NlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2EgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWdNYXAnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldChvYmouc2VjcmV0KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcnQgZGVmaW5lcyB0aGUgQ2xpZW50IGNlcnRpZmljYXRlIHRvIHByZXNlbnQgd2hlbiBkb2luZyBjbGllbnQtYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQjY29uZmlnTWFwXG4gICAqL1xuICByZWFkb25seSBjb25maWdNYXA/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdLZXlTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnS2V5U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0tleVNlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBtYXhWZXJzaW9uIGRlZmluZXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAqXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNYXhWZXJzaW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ01heFZlcnNpb24ge1xuICAvKiogVExTMTAgKi9cbiAgVExTMTAgPSBcIlRMUzEwXCIsXG4gIC8qKiBUTFMxMSAqL1xuICBUTFMxMSA9IFwiVExTMTFcIixcbiAgLyoqIFRMUzEyICovXG4gIFRMUzEyID0gXCJUTFMxMlwiLFxuICAvKiogVExTMTMgKi9cbiAgVExTMTMgPSBcIlRMUzEzXCIsXG59XG5cbi8qKlxuICogbWluVmVyc2lvbiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gKlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnTWluVmVyc2lvblxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdNaW5WZXJzaW9uIHtcbiAgLyoqIFRMUzEwICovXG4gIFRMUzEwID0gXCJUTFMxMFwiLFxuICAvKiogVExTMTEgKi9cbiAgVExTMTEgPSBcIlRMUzExXCIsXG4gIC8qKiBUTFMxMiAqL1xuICBUTFMxMiA9IFwiVExTMTJcIixcbiAgLyoqIFRMUzEzICovXG4gIFRMUzEzID0gXCJUTFMxM1wiLFxufVxuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJDbGllbnRJZFNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMkNsaWVudElkU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyQ2xpZW50SWRTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2EgZGVmaW5lcyB0aGUgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IHVzZWQgd2hlbiB2ZXJpZnlpbmcgc2VydmVyIGNlcnRpZmljYXRlcy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2Ege1xuICAvKipcbiAgICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYSNjb25maWdNYXBcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ01hcD86IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhI3NlY3JldFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2EgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWdNYXAnOiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldChvYmouc2VjcmV0KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNlcnQgZGVmaW5lcyB0aGUgQ2xpZW50IGNlcnRpZmljYXRlIHRvIHByZXNlbnQgd2hlbiBkb2luZyBjbGllbnQtYXV0aGVudGljYXRpb24uXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydCB7XG4gIC8qKlxuICAgKiBjb25maWdNYXAgZGVmaW5lcyB0aGUgQ29uZmlnTWFwIGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQjY29uZmlnTWFwXG4gICAqL1xuICByZWFkb25seSBjb25maWdNYXA/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwO1xuXG4gIC8qKlxuICAgKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQjc2VjcmV0XG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29uZmlnTWFwJzogdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAob2JqLmNvbmZpZ01hcCksXG4gICAgJ3NlY3JldCc6IHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0KG9iai5zZWNyZXQpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICoga2V5U2VjcmV0IGRlZmluZXMgdGhlIFNlY3JldCBjb250YWluaW5nIHRoZSBjbGllbnQga2V5IGZpbGUgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHNlY3JldCB0byBzZWxlY3QgZnJvbS4gIE11c3QgYmUgYSB2YWxpZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdLZXlTZWNyZXQjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBTZWNyZXQgb3IgaXRzIGtleSBtdXN0IGJlIGRlZmluZWRcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdLZXlTZWNyZXQjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnS2V5U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldChvYmo6IFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0tleVNlY3JldCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBtYXhWZXJzaW9uIGRlZmluZXMgdGhlIG1heGltdW0gYWNjZXB0YWJsZSBUTFMgdmVyc2lvbi5cbiAqXG4gKiBJdCByZXF1aXJlcyBQcm9tZXRoZXVzID49IHYyLjQxLjAgb3IgVGhhbm9zID49IHYwLjMxLjAuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNYXhWZXJzaW9uXG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ01heFZlcnNpb24ge1xuICAvKiogVExTMTAgKi9cbiAgVExTMTAgPSBcIlRMUzEwXCIsXG4gIC8qKiBUTFMxMSAqL1xuICBUTFMxMSA9IFwiVExTMTFcIixcbiAgLyoqIFRMUzEyICovXG4gIFRMUzEyID0gXCJUTFMxMlwiLFxuICAvKiogVExTMTMgKi9cbiAgVExTMTMgPSBcIlRMUzEzXCIsXG59XG5cbi8qKlxuICogbWluVmVyc2lvbiBkZWZpbmVzIHRoZSBtaW5pbXVtIGFjY2VwdGFibGUgVExTIHZlcnNpb24uXG4gKlxuICogSXQgcmVxdWlyZXMgUHJvbWV0aGV1cyA+PSB2Mi4zNS4wIG9yIFRoYW5vcyA+PSB2MC4yOC4wLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnTWluVmVyc2lvblxuICovXG5leHBvcnQgZW51bSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdNaW5WZXJzaW9uIHtcbiAgLyoqIFRMUzEwICovXG4gIFRMUzEwID0gXCJUTFMxMFwiLFxuICAvKiogVExTMTEgKi9cbiAgVExTMTEgPSBcIlRMUzExXCIsXG4gIC8qKiBUTFMxMiAqL1xuICBUTFMxMiA9IFwiVExTMTJcIixcbiAgLyoqIFRMUzEzICovXG4gIFRMUzEzID0gXCJUTFMxM1wiLFxufVxuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYUNvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYUNvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDYVNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NhU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2FTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbmZpZ01hcCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0Q29uZmlnTWFwKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0I25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzVGxzQ29uZmlnQ2VydFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c1Rsc0NvbmZpZ0NlcnRTZWNyZXQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNUbHNDb25maWdDZXJ0U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbmZpZ01hcCBkZWZpbmVzIHRoZSBDb25maWdNYXAgY29udGFpbmluZyBkYXRhIHRvIHVzZSBmb3IgdGhlIHRhcmdldHMuXG4gKlxuICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYUNvbmZpZ01hcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHJlZmVyZW50LlxuICAgKiBUaGlzIGZpZWxkIGlzIGVmZmVjdGl2ZWx5IHJlcXVpcmVkLCBidXQgZHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzXG4gICAqIGFsbG93ZWQgdG8gYmUgZW1wdHkuIEluc3RhbmNlcyBvZiB0aGlzIHR5cGUgd2l0aCBhbiBlbXB0eSB2YWx1ZSBoZXJlIGFyZVxuICAgKiBhbG1vc3QgY2VydGFpbmx5IHdyb25nLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL292ZXJ2aWV3L3dvcmtpbmctd2l0aC1vYmplY3RzL25hbWVzLyNuYW1lc1xuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhQ29uZmlnTWFwI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgQ29uZmlnTWFwIG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FDb25maWdNYXAob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYUNvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IG9mIHRoZSBzZWNyZXQgdG8gc2VsZWN0IGZyb20uICBNdXN0IGJlIGEgdmFsaWQgc2VjcmV0IGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDYVNlY3JldCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIFNlY3JldCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0I29wdGlvbmFsXG4gICAqL1xuICByZWFkb25seSBvcHRpb25hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NhU2VjcmV0KG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2FTZWNyZXQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ29wdGlvbmFsJzogb2JqLm9wdGlvbmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29uZmlnTWFwIGRlZmluZXMgdGhlIENvbmZpZ01hcCBjb250YWluaW5nIGRhdGEgdG8gdXNlIGZvciB0aGUgdGFyZ2V0cy5cbiAqXG4gKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gc2VsZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcmVmZXJlbnQuXG4gICAqIFRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgcmVxdWlyZWQsIGJ1dCBkdWUgdG8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXNcbiAgICogYWxsb3dlZCB0byBiZSBlbXB0eS4gSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSB3aXRoIGFuIGVtcHR5IHZhbHVlIGhlcmUgYXJlXG4gICAqIGFsbW9zdCBjZXJ0YWlubHkgd3JvbmcuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvb3ZlcnZpZXcvd29ya2luZy13aXRoLW9iamVjdHMvbmFtZXMvI25hbWVzXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbmZpZ01hcCBvciBpdHMga2V5IG11c3QgYmUgZGVmaW5lZFxuICAgKlxuICAgKiBAc2NoZW1hIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRDb25maWdNYXAjb3B0aW9uYWxcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9TZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0Q29uZmlnTWFwKG9iajogU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydENvbmZpZ01hcCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAnb3B0aW9uYWwnOiBvYmoub3B0aW9uYWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZWNyZXQgZGVmaW5lcyB0aGUgU2VjcmV0IGNvbnRhaW5pbmcgZGF0YSB0byB1c2UgZm9yIHRoZSB0YXJnZXRzLlxuICpcbiAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRTZWNyZXQge1xuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgc2VjcmV0IHRvIHNlbGVjdCBmcm9tLiAgTXVzdCBiZSBhIHZhbGlkIHNlY3JldCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldCNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSByZWZlcmVudC5cbiAgICogVGhpcyBmaWVsZCBpcyBlZmZlY3RpdmVseSByZXF1aXJlZCwgYnV0IGR1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpc1xuICAgKiBhbGxvd2VkIHRvIGJlIGVtcHR5LiBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIHdpdGggYW4gZW1wdHkgdmFsdWUgaGVyZSBhcmVcbiAgICogYWxtb3N0IGNlcnRhaW5seSB3cm9uZy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9vdmVydmlldy93b3JraW5nLXdpdGgtb2JqZWN0cy9uYW1lcy8jbmFtZXNcbiAgICpcbiAgICogQHNjaGVtYSBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0I25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgU2VjcmV0IG9yIGl0cyBrZXkgbXVzdCBiZSBkZWZpbmVkXG4gICAqXG4gICAqIEBzY2hlbWEgU2VydmljZU1vbml0b3JTcGVjRW5kcG9pbnRzT2F1dGgyVGxzQ29uZmlnQ2VydFNlY3JldCNvcHRpb25hbFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1NlcnZpY2VNb25pdG9yU3BlY0VuZHBvaW50c09hdXRoMlRsc0NvbmZpZ0NlcnRTZWNyZXQob2JqOiBTZXJ2aWNlTW9uaXRvclNwZWNFbmRwb2ludHNPYXV0aDJUbHNDb25maWdDZXJ0U2VjcmV0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdvcHRpb25hbCc6IG9iai5vcHRpb25hbCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4iXX0=