@aerokit/sdk 12.77.0 → 12.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/cjs/bpm/process.js +4 -1
  2. package/dist/cjs/bpm/tasks.js +3 -1
  3. package/dist/cjs/bpm/tracer.js +3 -1
  4. package/dist/cjs/cms/cmis.js +105 -177
  5. package/dist/cjs/db/database.js +5 -1
  6. package/dist/cjs/db/query.js +19 -1
  7. package/dist/cjs/db/repository.js +2 -1
  8. package/dist/cjs/db/sql.js +5 -2
  9. package/dist/cjs/etcd/client.js +4 -1
  10. package/dist/cjs/http/errors/ForbiddenError.js +9 -9
  11. package/dist/cjs/http/errors/ValidationError.js +9 -9
  12. package/dist/cjs/http/request.js +2 -1
  13. package/dist/cjs/http/response.js +102 -188
  14. package/dist/cjs/http/rs/resource-http-controller.js +4 -1
  15. package/dist/cjs/http/rs/resource-mappings.js +6 -3
  16. package/dist/cjs/http/rs/resource-method.js +10 -1
  17. package/dist/cjs/http/rs/resource.js +11 -1
  18. package/dist/cjs/http/upload.js +3 -1
  19. package/dist/cjs/io/files.js +5 -7
  20. package/dist/cjs/io/streams.js +5 -1
  21. package/dist/cjs/io/zip.js +4 -1
  22. package/dist/cjs/job/scheduler.js +4 -1
  23. package/dist/cjs/kafka/consumer.js +3 -2
  24. package/dist/cjs/kafka/producer.js +3 -1
  25. package/dist/cjs/log/logging.js +2 -1
  26. package/dist/cjs/mail/client.js +2 -1
  27. package/dist/cjs/messaging/consumer.js +3 -1
  28. package/dist/cjs/messaging/producer.js +3 -1
  29. package/dist/cjs/mongodb/client.js +26 -1
  30. package/dist/cjs/mongodb/dao.js +3 -1
  31. package/dist/cjs/net/soap.js +15 -1
  32. package/dist/cjs/net/websockets.js +5 -1
  33. package/dist/cjs/platform/engines.js +2 -1
  34. package/dist/cjs/platform/os.js +7 -9
  35. package/dist/cjs/platform/problems.js +7 -13
  36. package/dist/cjs/platform/registry.js +4 -1
  37. package/dist/cjs/platform/repository.js +4 -1
  38. package/dist/cjs/platform/workspace.js +8 -1
  39. package/dist/cjs/redis/client.js +2 -1
  40. package/dist/cjs/security/oauth.js +2 -1
  41. package/dist/cjs/template/engines.js +6 -1
  42. package/dist/dts/db/query.d.ts +10 -0
  43. package/dist/esm/bpm/process.mjs +4 -1
  44. package/dist/esm/bpm/tasks.mjs +3 -1
  45. package/dist/esm/bpm/tracer.mjs +3 -1
  46. package/dist/esm/cms/cmis.mjs +105 -177
  47. package/dist/esm/db/database.mjs +5 -1
  48. package/dist/esm/db/query.mjs +19 -1
  49. package/dist/esm/db/repository.mjs +2 -1
  50. package/dist/esm/db/sql.mjs +5 -2
  51. package/dist/esm/etcd/client.mjs +4 -1
  52. package/dist/esm/http/errors/ForbiddenError.mjs +9 -9
  53. package/dist/esm/http/errors/ValidationError.mjs +9 -9
  54. package/dist/esm/http/request.mjs +2 -1
  55. package/dist/esm/http/response.mjs +102 -188
  56. package/dist/esm/http/rs/resource-http-controller.mjs +4 -1
  57. package/dist/esm/http/rs/resource-mappings.mjs +6 -3
  58. package/dist/esm/http/rs/resource-method.mjs +10 -1
  59. package/dist/esm/http/rs/resource.mjs +11 -1
  60. package/dist/esm/http/upload.mjs +3 -1
  61. package/dist/esm/io/files.mjs +5 -7
  62. package/dist/esm/io/streams.mjs +5 -1
  63. package/dist/esm/io/zip.mjs +4 -1
  64. package/dist/esm/job/scheduler.mjs +4 -1
  65. package/dist/esm/kafka/consumer.mjs +3 -2
  66. package/dist/esm/kafka/producer.mjs +3 -1
  67. package/dist/esm/log/logging.mjs +2 -1
  68. package/dist/esm/mail/client.mjs +2 -1
  69. package/dist/esm/messaging/consumer.mjs +3 -1
  70. package/dist/esm/messaging/producer.mjs +3 -1
  71. package/dist/esm/mongodb/client.mjs +26 -1
  72. package/dist/esm/mongodb/dao.mjs +3 -1
  73. package/dist/esm/net/soap.mjs +15 -1
  74. package/dist/esm/net/websockets.mjs +5 -1
  75. package/dist/esm/platform/engines.mjs +2 -1
  76. package/dist/esm/platform/os.mjs +7 -9
  77. package/dist/esm/platform/problems.mjs +7 -13
  78. package/dist/esm/platform/registry.mjs +4 -1
  79. package/dist/esm/platform/repository.mjs +4 -1
  80. package/dist/esm/platform/workspace.mjs +8 -1
  81. package/dist/esm/redis/client.mjs +2 -1
  82. package/dist/esm/security/oauth.mjs +2 -1
  83. package/dist/esm/template/engines.mjs +6 -1
  84. package/package.json +1 -1
@@ -134,6 +134,7 @@ class Process {
134
134
  }
135
135
  }
136
136
  class VariableScope {
137
+ variableScope;
137
138
  constructor(variableScope) {
138
139
  this.variableScope = variableScope;
139
140
  }
@@ -424,6 +425,7 @@ class VariableScope {
424
425
  }
425
426
  }
426
427
  class ExecutionContext extends VariableScope {
428
+ execution;
427
429
  constructor() {
428
430
  super(__context.get("execution"));
429
431
  this.execution = __context.get("execution");
@@ -657,6 +659,7 @@ var DelegationState = /* @__PURE__ */ ((DelegationState2) => {
657
659
  return DelegationState2;
658
660
  })(DelegationState || {});
659
661
  class TaskContext extends VariableScope {
662
+ task;
660
663
  constructor() {
661
664
  super(__context.get("task"));
662
665
  this.task = __context.get("task");
@@ -1068,4 +1071,4 @@ class TaskContext extends VariableScope {
1068
1071
  if (typeof module !== "undefined") {
1069
1072
  module.exports = Process;
1070
1073
  }
1071
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9wcm9jZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBQcm9jZXNzXG4gKiAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvY2VzcyBpbnN0YW5jZXMsXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcsIHVwZGF0aW5nIG1ldGFkYXRhLCBhbmQgbWFuYWdpbmcgdmFyaWFibGVzLlxuICovXG5cbmltcG9ydCB7IFZhbHVlcyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvYnBtL3ZhbHVlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlMaW5rIH0gZnJvbSBcIi4vdGFza3NcIjtcblxuY29uc3QgSkJwbW5FcnJvciA9IEphdmEudHlwZSgnb3JnLmZsb3dhYmxlLmVuZ2luZS5kZWxlZ2F0ZS5CcG1uRXJyb3InKTtcbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgQnBtbkVycm9yIHtcblx0Y29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG5ldyBKQnBtbkVycm9yKGNvZGUsIG1lc3NhZ2UpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcblxuXHQvKipcblx0ICogU3RhcnRzIGEgbmV3IHByb2Nlc3MgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGtleS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGtleSAoSUQpIG9mIHRoZSBwcm9jZXNzIHRvIHN0YXJ0LlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NLZXkgQW4gb3B0aW9uYWwgYnVzaW5lc3Mga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9jZXNzIGluc3RhbmNlLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFuIG9wdGlvbmFsIG1hcCBvZiBwcm9jZXNzIHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIHVwb24gc3RhcnRpbmcuIERlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdC5cblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgbmV3bHkgc3RhcnRlZCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBzdGFydChrZXk6IHN0cmluZywgYnVzaW5lc3NLZXk6IHN0cmluZyA9ICcnLCBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiBzdHJpbmcge1xuXHRcdHJldHVybiBCcG1GYWNhZGUuc3RhcnRQcm9jZXNzKGtleSwgYnVzaW5lc3NLZXksIEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQsIG5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGJ1c2luZXNzIGtleSBvZiBhbiBleGlzdGluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIGJ1c2luZXNzS2V5IFRoZSBuZXcgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyB1cGRhdGVCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBidXNpbmVzc0tleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnVwZGF0ZUJ1c2luZXNzS2V5KHByb2Nlc3NJbnN0YW5jZUlkLCBidXNpbmVzc0tleSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYnVzaW5lc3Mgc3RhdHVzIG9mIGFuIGV4aXN0aW5nIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NTdGF0dXMgVGhlIG5ldyBidXNpbmVzcyBzdGF0dXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHVwZGF0ZUJ1c2luZXNzU3RhdHVzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIGJ1c2luZXNzU3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudXBkYXRlQnVzaW5lc3NTdGF0dXMocHJvY2Vzc0luc3RhbmNlSWQsIGJ1c2luZXNzU3RhdHVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLCBvciBgbnVsbGAgaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LiBUaGUgdHlwZSBpcyBgYW55YCBhcyBpdCBkZXBlbmRzIG9uIHRoZSBzdG9yZWQgdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGFsbCB2YXJpYWJsZXMgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlLCB3aGVyZSBrZXlzIGFyZSB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIGFyZSB0aGUgdmFyaWFibGUgdmFsdWVzLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5nZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgb3IgdXBkYXRlcyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSBpbiBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZS4gVGhlIHR5cGUgaXMgYGFueWAgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGRhdGEgdHlwZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgcmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUucmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29ycmVsYXRlcyBhIG1lc3NhZ2UgZXZlbnQgd2l0aCBhIHJ1bm5pbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byBjb3JyZWxhdGUgdGhlIG1lc3NhZ2UgdG8uXG5cdCAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWVzc2FnZSBldmVudCBkZWZpbmVkIGluIHRoZSBCUE1OIHByb2Nlc3MuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZXMgQSBtYXAgb2YgdmFyaWFibGVzIChgTWFwPHN0cmluZywgYW55PmApIHRvIHBhc3MgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZSBldmVudC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgY29ycmVsYXRlTWVzc2FnZUV2ZW50KHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIG1lc3NhZ2VOYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5jb3JyZWxhdGVNZXNzYWdlRXZlbnQocHJvY2Vzc0luc3RhbmNlSWQsIG1lc3NhZ2VOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCBvYmplY3QsIHR5cGljYWxseSB1c2VkIHdpdGhpbiBhbiBleGVjdXRpb24gbGlzdGVuZXIgb3Igc2VydmljZSB0YXNrLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgYEV4ZWN1dGlvbkNvbnRleHRgIGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRFeGVjdXRpb25Db250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgRXhlY3V0aW9uQ29udGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCB0YXNrIGNvbnRleHQgb2JqZWN0LCB0eXBpY2FsbHkgdXNlZCB3aXRoaW4gYSB0YXNrIGxpc3RlbmVyIG9yIHNlcnZpY2UgdGFzay5cblx0ICpcblx0ICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGBUYXNrQ29udGV4dGAgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tDb250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgVGFza0NvbnRleHQoKTtcblx0fVxufVxuXG5jbGFzcyBWYXJpYWJsZVNjb3BlIHtcblxuXHRwcml2YXRlIHZhcmlhYmxlU2NvcGU6IGFueTtcblxuXHRjb25zdHJ1Y3Rvcih2YXJpYWJsZVNjb3BlOiBhbnkpIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUgPSB2YXJpYWJsZVNjb3BlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YXJpYWJsZSB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzID0gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlcygpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5wYXJzZVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YXJpYWJsZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgdmFyaWFibGVzLCBhcyBpbnN0YW5jZXMgb2YgdGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnRlcmZhY2UsIHdoaWNoIGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBvbmx5IHRoZSB2YWx1ZSAodHlwZSwgZXhlY3V0aW9uIGlkLCBldGMuKVxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3RzIChKYXZhIHR5cGUpLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVJbnN0YW5jZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBsb2NhbCB0byB0aGlzIHNjb3BlIG9ubHkuIFNvLCBpbiBjb250cmFyeSB0byB7QGxpbmsgI2dldFZhcmlhYmxlcygpfSwgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBwYXJlbnQgc2NvcGUgd29uJ3QgYmUgcmV0dXJuZWQuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwgdmFyaWFibGUgdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB2YXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBsb2NhbCB0byB0aGlzIHNjb3BlIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaWFibGUuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2VzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB2YWx1ZSBmb3Igb25lIHNwZWNpZmljIHZhcmlhYmxlLiBXaWxsIGxvb2sgaW4gcGFyZW50IHNjb3BlcyB3aGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBhcnRpY3VsYXIgc2NvcGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI2dldFZhcmlhYmxlKFN0cmluZyl9LCBidXQgcmV0dXJucyBhIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnN0YW5jZSwgd2hpY2ggY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIGp1c3QgdGhlIHZhbHVlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2UodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIHZhcmlhYmxlIGFuZCBvbmx5IGNoZWNrcyB0aGlzIHNjb3BlIGFuZCBub3QgYW55IHBhcmVudCBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZCBsb2NhbGx5LlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjZ2V0VmFyaWFibGVMb2NhbChTdHJpbmcpfSwgYnV0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9LCB3aGljaCBoYXMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgdmFsdWUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSBhbmQgYWxsIHBhcmVudCBzY29wZXMuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGFsbCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTmFtZXMoKTogU2V0PHN0cmluZz4ge1xuXHRcdGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXMoKS50b0FycmF5KCkpIHtcblx0XHRcdHZhcmlhYmxlTmFtZXMuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSAobm8gcGFyZW50IHNjb3BlcykuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzTG9jYWwgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXNMb2NhbCgpLnRvQXJyYXkoKSkge1xuXHRcdFx0dmFyaWFibGVOYW1lc0xvY2FsLmFkZChuZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlTmFtZXNMb2NhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4gSXQgY2hlY2tzIHBhcmVudCBzY29wZXMgZm9yIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGJlZm9yZSBzZXR0aW5nIG9uIHRoZSBjdXJyZW50IHNjb3BlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI3NldFZhcmlhYmxlKFN0cmluZywgT2JqZWN0KX0sIGJ1dCB0aGUgdmFyaWFibGUgaXMgc2V0IHRvIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZSkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCBsb2NhbGx5LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQgKGBhbnlgKS5cblx0ICogQHJldHVybnMgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwcm92aWRlZCB2YXJpYWJsZXMgdG8gdGhlIHZhcmlhYmxlIHNjb3BlLCB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIGFsZ29yaXRobS5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgdmFyaWFibGVzIHRvIGJlIHNldC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjc2V0VmFyaWFibGVzKE1hcCl9LCBidXQgdGhlIHZhcmlhYmxlcyBhcmUgc2V0IG9uIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZXMpLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzIEEgbWFwIG9mIGtleXMgKGBzdHJpbmdgKSBhbmQgdmFsdWVzIChgYW55YCkgZm9yIHRoZSBsb2NhbCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VmFyaWFibGVzTG9jYWwodmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBvciBhbnkgcGFyZW50IHNjb3BlIGhhcyB2YXJpYWJsZXMuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB2YXJpYWJsZXMgZXhpc3QgaW4gc2NvcGUgaGllcmFyY2h5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5oYXNWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbG9jYWwgdmFyaWFibGVzIGV4aXN0LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXNMb2NhbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlc0xvY2FsKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgb3IgYW55IHBhcmVudCBzY29wZSBoYXMgYSBzcGVjaWZpYyB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFyaWFibGUgaXMgZm91bmQgaW4gdGhlIHNjb3BlIGhpZXJhcmNoeSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGFzVmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgaGFzIGEgc3BlY2lmaWMgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhcmlhYmxlIGlzIGZvdW5kIGxvY2FsbHksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBwcm9jZXNzIGluc3RhbmNlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuIFNlYXJjaGVzIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGxvY2FsIHZhcmlhYmxlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZXMgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZSBmb3IgZWFjaCBvZiB0aGVtLiBTZWFyY2hlcyB1cCB0aGUgc2NvcGUgaGllcmFyY2h5LlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lcyBBbiBhcnJheSBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ1tdYCkgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlcyh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgdHJhbnNpZW50IHZhcmlhYmxlIHVzaW5nIHRoZSBkZWZhdWx0IHNjb3BpbmcgbWVjaGFuaXNtICh1cCB0aGUgaGllcmFyY2h5KS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YXJpYWJsZVZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBhIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgbXVsdGlwbGUgdHJhbnNpZW50IHZhcmlhYmxlcyB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIG1lY2hhbmlzbSAodXAgdGhlIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXMpIHtcblx0XHRcdHRyYW5zaWVudFZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSB0cmFuc2llbnQgdmFyaWFibGUsIHNlYXJjaGluZyB1cCB0aGUgcGFyZW50IHNjb3Blcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSAoYGFueWApLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUodGhpcy52YXJpYWJsZVNjb3BlLmdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdHJhbnNpZW50IHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHRyYW5zaWVudCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRjb25zdCB0cmFuc2llbnRWYXJpYWJsZXMgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhbnNpZW50VmFyaWFibGVzKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIG11bHRpcGxlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKHRyYW5zaWVudFZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlcykge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwodHJhbnNpZW50VmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudmFyaWFibGVTY29wZS5nZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlcy5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdHJhbnNpZW50VmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzcGVjaWZpYyBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHNwZWNpZmljIHRyYW5zaWVudCB2YXJpYWJsZSwgc2VhcmNoaW5nIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUucmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIHRyYW5zaWVudCB2YXJpYWJsZXMgb2YgdGhpcyBzY29wZSBhbmQgaXRzIHBhcmVudCBzY29wZXMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVzKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCgpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0aW9uQ29udGV4dCBvYmplY3RcbiAqICogUHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNvbnRyb2wgb3ZlciB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuICovXG5jbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgVmFyaWFibGVTY29wZSB7XG5cblx0cHJpdmF0ZSBleGVjdXRpb246IGFueTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcihfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKSk7XG5cdFx0dGhpcy5leGVjdXRpb24gPSBfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbmlxdWUgaWQgb2YgdGhpcyBwYXRoIG9mIGV4ZWN1dGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGFuZGxlIHRvIHByb3ZpZGUgZXh0ZXJuYWwgc2lnbmFscyBiYWNrIGludG8gdGhlIGVuZ2luZSBhZnRlciB3YWl0IHN0YXRlcy5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJhbGwgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlICdyb290JyBwcm9jZXNzIGluc3RhbmNlLiBXaGVuIHVzaW5nIGNhbGwgYWN0aXZpdHkgZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzSW5zdGFuY2Ugc2V0IHdpbGwgbm90IGFsd2F5cyBiZSB0aGUgcm9vdC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG9wbW9zdCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHJvb3QgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRSb290UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Um9vdFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjb250YWluIHRoZSBldmVudCBuYW1lIGluIGNhc2UgdGhpcyBleGVjdXRpb24gaXMgcGFzc2VkIGluIGZvciBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBldmVudCBuYW1lLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYW4gZXZlbnQgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV2ZW50TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgZXZlbnQgKHR5cGljYWxseSB3aGVuIGV4ZWN1dGlvbiBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9KS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0RXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0RXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIGtleSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIHN0YXR1cyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mgc3RhdHVzLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgZXhlY3V0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cblx0ICogQHJldHVybnMgVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiB0aGlzIGV4ZWN1dGlvbiBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgZXhlY3V0aW9uIGJlbG9uZ3MgdG8gb3IgYG51bGxgLCBpZiB0aGlzIGV4ZWN1dGlvbiBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZS5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgZXhlY3V0aW9uLiBJZiBudWxsLCB0aGUgZXhlY3V0aW9uIHJlcHJlc2VudHMgYSBwcm9jZXNzLWluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFBhcmVudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGNhbGxpbmcgZXhlY3V0aW9uLiBJZiBub3QgbnVsbCwgdGhlIGV4ZWN1dGlvbiBpcyBwYXJ0IG9mIGEgc3VicHJvY2Vzcy5cblx0ICogQHJldHVybnMgVGhlIHN1cGVyIGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFN1cGVyRXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0U3VwZXJFeGVjdXRpb25JZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBhY3Rpdml0eSBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50QWN0aXZpdHlJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRDdXJyZW50QWN0aXZpdHlJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRlbmFudCBpZCwgaWYgYW55IGlzIHNldCBiZWZvcmUgb24gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBvciBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgdGVuYW50IElELCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFRlbmFudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJQTU4gZWxlbWVudCB3aGVyZSB0aGUgZXhlY3V0aW9uIGN1cnJlbnRseSBpcyBhdC5cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmxvdyBlbGVtZW50IG9iamVjdCAodHlwZSBpcyBKYXZhIG9iamVjdCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEZsb3dFbGVtZW50KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93RWxlbWVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY3VycmVudCBCUE1OIGVsZW1lbnQgdGhlIGV4ZWN1dGlvbiBpcyBhdC5cblx0ICogQHBhcmFtIGZsb3dFbGVtZW50IFRoZSBuZXcgZmxvdyBlbGVtZW50IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzZXRDdXJyZW50Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEN1cnJlbnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEZsb3dhYmxlTGlzdGVuZXJ9IGluc3RhbmNlIG1hdGNoaW5nIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0gaWYgY3VycmVudGx5IGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBpcyBiZWluZyBleGVjdXRpb24uIFJldHVybnMgbnVsbCBvdGhlcndpc2UuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEZsb3dhYmxlIExpc3RlbmVyIG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3RlbmVyfSBpcyBiZWluZyBleGVjdXRlZC5cblx0ICogQHBhcmFtIGN1cnJlbnRMaXN0ZW5lciBUaGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3QgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoY3VycmVudExpc3RlbmVyOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRDdXJyZW50Rmxvd2FibGVMaXN0ZW5lcihjdXJyZW50TGlzdGVuZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHNuYXBzaG90IHJlYWQgb25seSBkZWxlZ2F0ZSBleGVjdXRpb24gb2YgdGhpcyBkZWxlZ2F0ZSBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEge0BsaW5rIFJlYWRPbmx5RGVsZWdhdGVFeGVjdXRpb259IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzbmFwc2hvdFJlYWRPbmx5KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNuYXBzaG90UmVhZE9ubHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBleGVjdXRpb24sIG9yIG51bGwgaWYgdGhlcmUgbm8gcGFyZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UGFyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgbGlzdCBvZiBleGVjdXRpb24gb2Ygd2hpY2ggdGhpcyBleGVjdXRpb24gdGhlIHBhcmVudCBvZi5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgY2hpbGQgZXhlY3V0aW9uIG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9ucygpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV4ZWN1dGlvbnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBtYWtlcyB0aGlzIGV4ZWN1dGlvbiBhY3RpdmUgb3IgaW5hY3RpdmUuXG5cdCAqIEBwYXJhbSBpc0FjdGl2ZSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGFjdGl2ZS5cblx0ICovXG5cdHB1YmxpYyBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRBY3RpdmUoaXNBY3RpdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNBY3RpdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaGFzIGVuZGVkIG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGVuZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0VuZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0VuZGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogY2hhbmdlcyB0aGUgY29uY3VycmVudCBpbmRpY2F0b3Igb24gdGhpcyBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBpc0NvbmN1cnJlbnQgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBjb25jdXJyZW50LlxuXHQgKi9cblx0cHVibGljIHNldENvbmN1cnJlbnQoaXNDb25jdXJyZW50OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0Q29uY3VycmVudChpc0NvbmN1cnJlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjb25jdXJyZW50IG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGNvbmN1cnJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNDb25jdXJyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgcHJvY2VzcyBpbnN0YW5jZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgcHJvY2VzcyBpbnN0YW5jZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9jZXNzSW5zdGFuY2VUeXBlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc1Byb2Nlc3NJbnN0YW5jZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmFjdGl2YXRlcyB0aGlzIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIGV4YW1wbGUgaW4gYSBqb2luOiB0aGUgZXhlY3V0aW9uIHN0aWxsIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBsb25nZXIgYWN0aXZlLlxuXHQgKi9cblx0cHVibGljIGluYWN0aXZhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uaW5hY3RpdmF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBzY29wZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTY29wZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNTY29wZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlIG9yIG5vdC5cblx0ICogQHBhcmFtIGlzU2NvcGUgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBhIHNjb3BlLlxuXHQgKi9cblx0cHVibGljIHNldFNjb3BlKGlzU2NvcGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRTY29wZShpc1Njb3BlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aSBpbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgbXVsdGkgaW5zdGFuY2Ugcm9vdCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNNdWx0aUluc3RhbmNlUm9vdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNNdWx0aUluc3RhbmNlUm9vdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIG11bHRpIGluc3RhbmNlIHJvb3Qgb3Igbm90LlxuXHQgKiBAcGFyYW0gaXNNdWx0aUluc3RhbmNlUm9vdCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aS1pbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0TXVsdGlJbnN0YW5jZVJvb3QoaXNNdWx0aUluc3RhbmNlUm9vdDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldE11bHRpSW5zdGFuY2VSb290KGlzTXVsdGlJbnN0YW5jZVJvb3QpO1xuXHR9XG5cbn1cblxuZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG5jbGFzcyBUYXNrQ29udGV4dCBleHRlbmRzIFZhcmlhYmxlU2NvcGUge1xuXG5cdHByaXZhdGUgdGFzazogYW55O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKF9fY29udGV4dC5nZXQoJ3Rhc2snKSk7XG5cdFx0dGhpcy50YXNrID0gX19jb250ZXh0LmdldCgndGFzaycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERCIGlkIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hbWUgb3IgdGl0bGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG5hbWUgZm9yIHRoZSB0YXNrLlxuXHQgKi9cblx0cHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldE5hbWUobmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RGVzY3JpcHRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXMgd2l0aCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCB3aGVyZSBoaWdoZXIgdmFsdWVzIG1lYW4gYSBoaWdoZXIgcHJpb3JpdHkgYW5kIGxvd2VyIHZhbHVlcyBtZWFuIGxvd2VyIHByaW9yaXR5OiBbMC4uMTldIGxvd2VzdCwgWzIwLi4zOV0gbG93LFxuXHQgKiBbNDAuLjU5XSBub3JtYWwsIFs2MC4uNzldIGhpZ2ggWzgwLi4xMDBdIGhpZ2hlc3Rcblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldFByaW9yaXR5KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcmlvcml0eSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdyxcblx0ICogWzQwLi41OV0gbm9ybWFsLCBbNjAuLjc5XSBoaWdoIFs4MC4uMTAwXSBoaWdoZXN0XG5cdCAqIFxuXHQgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2ssIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdywgWzQwLi41OV0gbm9ybWFsLCBcblx0ICovXG5cdHB1YmxpYyBzZXRQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldFByaW9yaXR5KHByaW9yaXR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAgaWYgdGhlIHRhc2sgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzSW5zdGFuY2VJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0UHJvY2Vzc0luc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgSUQgb2YgdGhlIGV4ZWN1dGlvbiB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV4ZWN1dGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBJRCBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRTdGF0ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0U3RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBjcmVhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRDcmVhdGVUaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q3JlYXRlVGltZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBpbiBwcm9ncmVzcyBzdGFydCB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0VGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdGFydGVkIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgc3RhcnRlZCB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY2xhaW1lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBjbGFpbSB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1UaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q2xhaW1UaW1lKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgY2xhaW1lZCB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IGNsYWltZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1lZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDbGFpbWVkQnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkQnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGlkIG9mIHRoZSBhY3Rpdml0eSBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIHRhc2sgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2Vzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB0YXNrIGRlZmluaXRpb24ga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRUYXNrRGVmaW5pdGlvbktleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlZCB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LlxuXHQgKiBcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIGlzIHN1c3BlbmRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTdXNwZW5kZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5pc1N1c3BlbmRlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIGFuZCBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGggKGlmIGFueSkuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdGVuYW50IElEIG9mIHRoaXMgdGFzaywgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBubyB0ZW5hbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdHB1YmxpYyBnZXRUZW5hbnRJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0VGVuYW50SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZm9ybSBrZXkgZm9yIHRoZSB1c2VyIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtIGtleSBkZWZpbmVkIG9uIHRoZSB1c2VyIHRhc2sgaW4gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbi4gV2lsbCByZXR1cm4gYG51bGxgIGlmIHRoaXMgdGFzayBpcyBub3QgYSB1c2VyIHRhc2sgb3IgaWYgbm8gZm9ybSBrZXkgaXMgZGVmaW5lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBmb3JtIGtleSBmb3IgdGhlIHVzZXIgdGFzaywgb3IgYG51bGxgIGlmIG5vIGZvcm0ga2V5IGlzIGRlZmluZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Rm9ybUtleSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Rm9ybUtleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgZm9ybSBrZXkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZm9ybUtleSB0aGUgbmV3IGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrLCBvciBgbnVsbGAgdG8gcmVtb3ZlIHRoZSBmb3JtIGtleVxuXHQgKi9cblx0cHVibGljIHNldEZvcm1LZXkoZm9ybUtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEZvcm1LZXkoZm9ybUtleSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGV2ZW50IG5hbWUgd2hpY2ggdHJpZ2dlcmVkIHRoZSB0YXNrIGxpc3RlbmVyIHRvIGZpcmUgZm9yIHRoaXMgdGFzay4gV2lsbCByZXR1cm4gYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lci5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBldmVudCBuYW1lIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2ssIG9yIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRFdmVudE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZXZlbnQgaGFuZGxlciBpZGVudGlmaWVyIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2suIFdpbGwgcmV0dXJuIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIgb3IgaWYgdGhlIGV2ZW50IGhhbmRsZXIgZG9lcyBub3QgaGF2ZSBhbiBpZGVudGlmaWVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGV2ZW50IGhhbmRsZXIgaWRlbnRpZmllciwgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lciBvciBpZiB0aGUgZXZlbnQgaGFuZGxlciBkb2VzIG5vdCBoYXZlIGFuIGlkZW50aWZpZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV2ZW50SGFuZGxlcklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgZGVsZWdhdGlvbiBzdGF0ZSBvZiB0aGUgdGFzaywgd2hpY2ggaXMgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCBkZWxlZ2F0ZWQsIGBQRU5ESU5HYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIHdhaXRpbmcgZm9yIHJlc29sdXRpb24gYnkgdGhlIGFzc2lnbmVlLCBhbmQgYFJFU09MVkVEYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIGhhcyBiZWVuIHJlc29sdmVkIGJ5IHRoZSBhc3NpZ25lZSBidXQgbm90IHlldCBjb21wbGV0ZWQgYnkgdGhlIG93bmVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGRlbGVnYXRpb24gc3RhdGUgb2YgdGhlIHRhc2ssIHdoaWNoIGlzIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgZGVsZWdhdGVkLCBgUEVORElOR2AgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCB3YWl0aW5nIGZvciByZXNvbHV0aW9uIGJ5IHRoZSBhc3NpZ25lZSwgYW5kIGBSRVNPTFZFRGAgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCBoYXMgYmVlbiByZXNvbHZlZCBieSB0aGUgYXNzaWduZWUgYnV0IG5vdCB5ZXQgY29tcGxldGVkIGJ5IHRoZSBvd25lci5cblx0ICovXG5cdHB1YmxpYyBnZXREZWxlZ2F0aW9uU3RhdGUoKTogRGVsZWdhdGlvblN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldERlbGVnYXRpb25TdGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBjYW5kaWRhdGUgdXNlciB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSB1c2VyIGlzIHRoZSBhc3NpZ25lZSBvZiB0aGUgdGFzaywgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYSBjYW5kaWRhdGUgdG8gYmVjb21lIGFuIGFzc2lnbmVlLiBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VlIHRoaXMgdGFzayBpbiB0aGVpciB0YXNrIGxpc3QgYW5kIGNsYWltIGl0IHRvIGJlY29tZSB0aGUgYXNzaWduZWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXNlcklkIHRoZSB1c2VyIElEIG9mIHRoZSBjYW5kaWRhdGUgdXNlciB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlVXNlcih1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgbXVsdGlwbGUgdXNlcnMgYXMgY2FuZGlkYXRlIHVzZXIgdG8gdGhpcyB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGNhbmRpZGF0ZVVzZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGNhbmRpZGF0ZSB1c2VyIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXJzKGNhbmRpZGF0ZVVzZXJzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5hZGRDYW5kaWRhdGVVc2VycyhjYW5kaWRhdGVVc2Vycyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGNhbmRpZGF0ZSBncm91cCB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHVzZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cCBhcmUgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBncm91cCBpcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2ssIGJ1dCBpdCBtZWFucyB0aGF0IGFsbCB1c2VycyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoZSBncm91cCBhcmUgY2FuZGlkYXRlcyB0byBiZWNvbWUgYXNzaWduZWVzLiBUaGUgdXNlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGUgZ3JvdXAgd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGlzIHRhc2sgaW4gdGhlaXIgdGFzayBsaXN0IGFuZCBjbGFpbSBpdCB0byBiZWNvbWUgdGhlIGFzc2lnbmVlLlxuXHQgKiBcblx0ICogQHBhcmFtIGdyb3VwSWQgdGhlIGdyb3VwIElEIG9mIHRoZSBjYW5kaWRhdGUgZ3JvdXAgdG8gYWRkIHRvIHRoaXMgdGFzay5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVHcm91cChncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBtdWx0aXBsZSBncm91cHMgYXMgY2FuZGlkYXRlIGdyb3VwIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSBjYW5kaWRhdGVHcm91cHMgdGhlIGNvbGxlY3Rpb24gb2YgY2FuZGlkYXRlIGdyb3VwIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay4gVGhpcyBpcyB0aGUgdXNlciB0aGF0IGhhcyB0byB3b3JrIG9uIHRoaXMgdGFzayBhbmQgY29tcGxldGUgaXQuIFdoZW4gYSB0YXNrIGlzIGFzc2lnbmVkIHRvIGEgdXNlciwgdGhhdCB1c2VyIGJlY29tZXMgdGhlIGFzc2lnbmVlIG9mIHRoZSB0YXNrLiBUaGUgYXNzaWduZWUgaXMgdGhlIG9ubHkgb25lIHRoYXQgY2FuIGNvbXBsZXRlIHRoZSB0YXNrICh1bmxlc3MgdGhlIHRhc2sgaXMgZGVsZWdhdGVkXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T3duZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE93bmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLiBUaGlzIGlzIHRoZSB1c2VyIHRoYXQgaGFzIHRvIHdvcmsgb24gdGhpcyB0YXNrIGFuZCBjb21wbGV0ZSBpdC4gV2hlbiBhIHRhc2sgaXMgYXNzaWduZWQgdG8gYSB1c2VyLCB0aGF0IHVzZXIgYmVjb21lcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2suIFRoZSBhc3NpZ25lZSBpcyB0aGUgb25seSBvbmUgdGhhdCBjYW4gY29tcGxldGUgdGhlIHRhc2sgKHVubGVzcyB0aGUgdGFzayBpcyBkZWxlZ2F0ZWRcblx0ICogXG5cdCAqIEBwYXJhbSBvd25lciB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIob3duZXI6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXRPd25lcihvd25lcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0byB3aGljaCB0aGlzIHRhc2sgaXMgZGVsZWdhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgSUQgb2YgdGhlIGFzc2lnbmVlIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRBc3NpZ25lZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICogQHBhcmFtIGFzc2lnbmVlIHRoZSB1c2VyIElEIG9mIHRoZSBhc3NpZ25lZSBvZiB0aGlzIHRhc2tcblx0ICovXG4gICAgcHVibGljIHNldEFzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLnNldEFzc2lnbmVlKGFzc2lnbmVlKTtcbiAgICB9XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSBpbiBwcm9ncmVzcyBzdGFydCBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGluUHJvZ3Jlc3NTdGFydER1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZShpblByb2dyZXNzU3RhcnREdWVEYXRlOiBEYXRlKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoaW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGR1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0RHVlRGF0ZShkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2F0ZWdvcnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldENhdGVnb3J5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlIHRoZSBjYXRlZ29yeSBvZiB0aGUgdGFzay4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCBhbmQgYWxsb3dzIHRvICd0YWcnIHRhc2tzIGFzIGJlbG9uZ2luZyB0byBhIGNlcnRhaW4gY2F0ZWdvcnkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIG5ldyBjYXRlZ29yeSBvZiB0aGUgdGFza1xuXHQgKi9cblx0cHVibGljIHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXHR9XG5cblxuICAgIC8qKlxuICAgICAqIEludm9sdmVzIGEgdXNlciB3aXRoIGEgdGFzay4gVGhlIHR5cGUgb2YgaWRlbnRpdHkgbGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHBhcmFtIGlkZW50aXR5TGlua1R5cGVcbiAgICAgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgdXNlciBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgYWRkVXNlcklkZW50aXR5TGluayh1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZFVzZXJJZGVudGl0eUxpbmsodXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG4gICAgLyoqXG4gICAgICogSW52b2x2ZXMgYSBncm91cCB3aXRoIGdyb3VwIHRhc2suIFRoZSB0eXBlIG9mIGlkZW50aXR5TGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmsuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmFkZEdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVVc2VySWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nKX0gOyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cElkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZUdyb3VwKGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIHVzZXIgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciBpbnZvbHZlLCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuICAgICAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG5cdHB1YmxpYyBkZWxldGVVc2VySWRlbnRpdHlMaW5rKHVzZXJJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suZGVsZXRlVXNlcklkZW50aXR5TGluayh1c2VySWQsIGlkZW50aXR5TGlua1R5cGUpO1xuXHR9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgZ3JvdXAgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjYW5kaWRhdGUgdXNlcnMgYW5kIGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHNldCBvZiB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgb2YgdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9LlxuICAgICAqL1xuXHRwdWJsaWMgZ2V0Q2FuZGlkYXRlcygpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDYW5kaWRhdGVzKCk7XG5cdH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSBQcm9jZXNzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSxvQkFBdUI7QUFHdkIsTUFBTSxhQUFhLEtBQUssS0FBSyx3Q0FBd0M7QUFDckUsTUFBTSxZQUFZLEtBQUssS0FBSyxvREFBb0Q7QUFFekUs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QUFLLEtBQUssMEJBQTBCO0FBQUEsRUFDNUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTywwQkFBMEIsd0JBQW9DO0FBQ3BFLFNBQUssS0FBSywwQkFBMEIsc0JBQXNCO0FBQUEsRUFDM0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxhQUFtQjtBQUN6QixXQUFPLEtBQUssS0FBSyxXQUFXO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxXQUFXLFNBQXFCO0FBQ3RDLFNBQUssS0FBSyxXQUFXLE9BQU87QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGNBQXNCO0FBQzVCLFdBQU8sS0FBSyxLQUFLLFlBQVk7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksVUFBd0I7QUFDMUMsU0FBSyxLQUFLLFlBQVksUUFBUTtBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFPLG9CQUFvQixRQUFnQixrQkFBZ0M7QUFDMUUsU0FBSyxLQUFLLG9CQUFvQixRQUFRLGdCQUFnQjtBQUFBLEVBQ3ZEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlVLHFCQUFxQixTQUFpQixrQkFBZ0M7QUFDekUsU0FBSyxLQUFLLHFCQUFxQixTQUFTLGdCQUFnQjtBQUFBLEVBQzVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVU8sb0JBQW9CLFFBQXNCO0FBQzdDLFNBQUssS0FBSyxvQkFBb0IsTUFBTTtBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUkscUJBQXFCLFNBQXVCO0FBQ2xELFNBQUssS0FBSyxxQkFBcUIsT0FBTztBQUFBLEVBQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlPLHVCQUF1QixRQUFnQixrQkFBZ0M7QUFDN0UsU0FBSyxLQUFLLHVCQUF1QixRQUFRLGdCQUFnQjtBQUFBLEVBQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlVLHdCQUF3QixTQUFpQixrQkFBZ0M7QUFDNUUsU0FBSyxLQUFLLHdCQUF3QixTQUFTLGdCQUFnQjtBQUFBLEVBQy9EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUksZ0JBQWdDO0FBQ3RDLFdBQU8sS0FBSyxLQUFLLGNBQWM7QUFBQSxFQUNoQztBQUNEO0FBR0EsSUFBSSxPQUFPLFdBQVcsYUFBYTtBQUVsQyxTQUFPLFVBQVU7QUFDbEI7IiwKICAibmFtZXMiOiBbIkRlbGVnYXRpb25TdGF0ZSJdCn0K
1074
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9wcm9jZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBQcm9jZXNzXG4gKiAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvY2VzcyBpbnN0YW5jZXMsXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcsIHVwZGF0aW5nIG1ldGFkYXRhLCBhbmQgbWFuYWdpbmcgdmFyaWFibGVzLlxuICovXG5cbmltcG9ydCB7IFZhbHVlcyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvYnBtL3ZhbHVlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlMaW5rIH0gZnJvbSBcIi4vdGFza3NcIjtcblxuY29uc3QgSkJwbW5FcnJvciA9IEphdmEudHlwZSgnb3JnLmZsb3dhYmxlLmVuZ2luZS5kZWxlZ2F0ZS5CcG1uRXJyb3InKTtcbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgQnBtbkVycm9yIHtcblx0Y29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG5ldyBKQnBtbkVycm9yKGNvZGUsIG1lc3NhZ2UpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcblxuXHQvKipcblx0ICogU3RhcnRzIGEgbmV3IHByb2Nlc3MgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGtleS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGtleSAoSUQpIG9mIHRoZSBwcm9jZXNzIHRvIHN0YXJ0LlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NLZXkgQW4gb3B0aW9uYWwgYnVzaW5lc3Mga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9jZXNzIGluc3RhbmNlLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFuIG9wdGlvbmFsIG1hcCBvZiBwcm9jZXNzIHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIHVwb24gc3RhcnRpbmcuIERlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdC5cblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgbmV3bHkgc3RhcnRlZCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBzdGFydChrZXk6IHN0cmluZywgYnVzaW5lc3NLZXk6IHN0cmluZyA9ICcnLCBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiBzdHJpbmcge1xuXHRcdHJldHVybiBCcG1GYWNhZGUuc3RhcnRQcm9jZXNzKGtleSwgYnVzaW5lc3NLZXksIEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQsIG5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGJ1c2luZXNzIGtleSBvZiBhbiBleGlzdGluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIGJ1c2luZXNzS2V5IFRoZSBuZXcgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyB1cGRhdGVCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBidXNpbmVzc0tleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnVwZGF0ZUJ1c2luZXNzS2V5KHByb2Nlc3NJbnN0YW5jZUlkLCBidXNpbmVzc0tleSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYnVzaW5lc3Mgc3RhdHVzIG9mIGFuIGV4aXN0aW5nIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NTdGF0dXMgVGhlIG5ldyBidXNpbmVzcyBzdGF0dXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHVwZGF0ZUJ1c2luZXNzU3RhdHVzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIGJ1c2luZXNzU3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudXBkYXRlQnVzaW5lc3NTdGF0dXMocHJvY2Vzc0luc3RhbmNlSWQsIGJ1c2luZXNzU3RhdHVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLCBvciBgbnVsbGAgaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LiBUaGUgdHlwZSBpcyBgYW55YCBhcyBpdCBkZXBlbmRzIG9uIHRoZSBzdG9yZWQgdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGFsbCB2YXJpYWJsZXMgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlLCB3aGVyZSBrZXlzIGFyZSB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIGFyZSB0aGUgdmFyaWFibGUgdmFsdWVzLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5nZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgb3IgdXBkYXRlcyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSBpbiBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZS4gVGhlIHR5cGUgaXMgYGFueWAgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGRhdGEgdHlwZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgcmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUucmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29ycmVsYXRlcyBhIG1lc3NhZ2UgZXZlbnQgd2l0aCBhIHJ1bm5pbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byBjb3JyZWxhdGUgdGhlIG1lc3NhZ2UgdG8uXG5cdCAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWVzc2FnZSBldmVudCBkZWZpbmVkIGluIHRoZSBCUE1OIHByb2Nlc3MuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZXMgQSBtYXAgb2YgdmFyaWFibGVzIChgTWFwPHN0cmluZywgYW55PmApIHRvIHBhc3MgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZSBldmVudC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgY29ycmVsYXRlTWVzc2FnZUV2ZW50KHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIG1lc3NhZ2VOYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5jb3JyZWxhdGVNZXNzYWdlRXZlbnQocHJvY2Vzc0luc3RhbmNlSWQsIG1lc3NhZ2VOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCBvYmplY3QsIHR5cGljYWxseSB1c2VkIHdpdGhpbiBhbiBleGVjdXRpb24gbGlzdGVuZXIgb3Igc2VydmljZSB0YXNrLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgYEV4ZWN1dGlvbkNvbnRleHRgIGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRFeGVjdXRpb25Db250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgRXhlY3V0aW9uQ29udGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCB0YXNrIGNvbnRleHQgb2JqZWN0LCB0eXBpY2FsbHkgdXNlZCB3aXRoaW4gYSB0YXNrIGxpc3RlbmVyIG9yIHNlcnZpY2UgdGFzay5cblx0ICpcblx0ICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGBUYXNrQ29udGV4dGAgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tDb250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgVGFza0NvbnRleHQoKTtcblx0fVxufVxuXG5jbGFzcyBWYXJpYWJsZVNjb3BlIHtcblxuXHRwcml2YXRlIHZhcmlhYmxlU2NvcGU6IGFueTtcblxuXHRjb25zdHJ1Y3Rvcih2YXJpYWJsZVNjb3BlOiBhbnkpIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUgPSB2YXJpYWJsZVNjb3BlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YXJpYWJsZSB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzID0gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlcygpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5wYXJzZVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YXJpYWJsZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgdmFyaWFibGVzLCBhcyBpbnN0YW5jZXMgb2YgdGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnRlcmZhY2UsIHdoaWNoIGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBvbmx5IHRoZSB2YWx1ZSAodHlwZSwgZXhlY3V0aW9uIGlkLCBldGMuKVxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3RzIChKYXZhIHR5cGUpLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVJbnN0YW5jZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBsb2NhbCB0byB0aGlzIHNjb3BlIG9ubHkuIFNvLCBpbiBjb250cmFyeSB0byB7QGxpbmsgI2dldFZhcmlhYmxlcygpfSwgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBwYXJlbnQgc2NvcGUgd29uJ3QgYmUgcmV0dXJuZWQuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwgdmFyaWFibGUgdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB2YXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBsb2NhbCB0byB0aGlzIHNjb3BlIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaWFibGUuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2VzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB2YWx1ZSBmb3Igb25lIHNwZWNpZmljIHZhcmlhYmxlLiBXaWxsIGxvb2sgaW4gcGFyZW50IHNjb3BlcyB3aGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBhcnRpY3VsYXIgc2NvcGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI2dldFZhcmlhYmxlKFN0cmluZyl9LCBidXQgcmV0dXJucyBhIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnN0YW5jZSwgd2hpY2ggY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIGp1c3QgdGhlIHZhbHVlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2UodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIHZhcmlhYmxlIGFuZCBvbmx5IGNoZWNrcyB0aGlzIHNjb3BlIGFuZCBub3QgYW55IHBhcmVudCBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZCBsb2NhbGx5LlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjZ2V0VmFyaWFibGVMb2NhbChTdHJpbmcpfSwgYnV0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9LCB3aGljaCBoYXMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgdmFsdWUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSBhbmQgYWxsIHBhcmVudCBzY29wZXMuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGFsbCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTmFtZXMoKTogU2V0PHN0cmluZz4ge1xuXHRcdGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXMoKS50b0FycmF5KCkpIHtcblx0XHRcdHZhcmlhYmxlTmFtZXMuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSAobm8gcGFyZW50IHNjb3BlcykuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzTG9jYWwgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXNMb2NhbCgpLnRvQXJyYXkoKSkge1xuXHRcdFx0dmFyaWFibGVOYW1lc0xvY2FsLmFkZChuZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlTmFtZXNMb2NhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4gSXQgY2hlY2tzIHBhcmVudCBzY29wZXMgZm9yIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGJlZm9yZSBzZXR0aW5nIG9uIHRoZSBjdXJyZW50IHNjb3BlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI3NldFZhcmlhYmxlKFN0cmluZywgT2JqZWN0KX0sIGJ1dCB0aGUgdmFyaWFibGUgaXMgc2V0IHRvIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZSkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCBsb2NhbGx5LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQgKGBhbnlgKS5cblx0ICogQHJldHVybnMgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwcm92aWRlZCB2YXJpYWJsZXMgdG8gdGhlIHZhcmlhYmxlIHNjb3BlLCB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIGFsZ29yaXRobS5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgdmFyaWFibGVzIHRvIGJlIHNldC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjc2V0VmFyaWFibGVzKE1hcCl9LCBidXQgdGhlIHZhcmlhYmxlcyBhcmUgc2V0IG9uIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZXMpLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzIEEgbWFwIG9mIGtleXMgKGBzdHJpbmdgKSBhbmQgdmFsdWVzIChgYW55YCkgZm9yIHRoZSBsb2NhbCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VmFyaWFibGVzTG9jYWwodmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBvciBhbnkgcGFyZW50IHNjb3BlIGhhcyB2YXJpYWJsZXMuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB2YXJpYWJsZXMgZXhpc3QgaW4gc2NvcGUgaGllcmFyY2h5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5oYXNWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbG9jYWwgdmFyaWFibGVzIGV4aXN0LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXNMb2NhbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlc0xvY2FsKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgb3IgYW55IHBhcmVudCBzY29wZSBoYXMgYSBzcGVjaWZpYyB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFyaWFibGUgaXMgZm91bmQgaW4gdGhlIHNjb3BlIGhpZXJhcmNoeSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGFzVmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgaGFzIGEgc3BlY2lmaWMgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhcmlhYmxlIGlzIGZvdW5kIGxvY2FsbHksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBwcm9jZXNzIGluc3RhbmNlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuIFNlYXJjaGVzIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGxvY2FsIHZhcmlhYmxlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZXMgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZSBmb3IgZWFjaCBvZiB0aGVtLiBTZWFyY2hlcyB1cCB0aGUgc2NvcGUgaGllcmFyY2h5LlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lcyBBbiBhcnJheSBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ1tdYCkgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlcyh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgdHJhbnNpZW50IHZhcmlhYmxlIHVzaW5nIHRoZSBkZWZhdWx0IHNjb3BpbmcgbWVjaGFuaXNtICh1cCB0aGUgaGllcmFyY2h5KS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YXJpYWJsZVZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBhIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgbXVsdGlwbGUgdHJhbnNpZW50IHZhcmlhYmxlcyB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIG1lY2hhbmlzbSAodXAgdGhlIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXMpIHtcblx0XHRcdHRyYW5zaWVudFZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSB0cmFuc2llbnQgdmFyaWFibGUsIHNlYXJjaGluZyB1cCB0aGUgcGFyZW50IHNjb3Blcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSAoYGFueWApLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUodGhpcy52YXJpYWJsZVNjb3BlLmdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdHJhbnNpZW50IHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHRyYW5zaWVudCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRjb25zdCB0cmFuc2llbnRWYXJpYWJsZXMgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhbnNpZW50VmFyaWFibGVzKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIG11bHRpcGxlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKHRyYW5zaWVudFZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlcykge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwodHJhbnNpZW50VmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudmFyaWFibGVTY29wZS5nZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlcy5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdHJhbnNpZW50VmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzcGVjaWZpYyBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHNwZWNpZmljIHRyYW5zaWVudCB2YXJpYWJsZSwgc2VhcmNoaW5nIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUucmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIHRyYW5zaWVudCB2YXJpYWJsZXMgb2YgdGhpcyBzY29wZSBhbmQgaXRzIHBhcmVudCBzY29wZXMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVzKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCgpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0aW9uQ29udGV4dCBvYmplY3RcbiAqICogUHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNvbnRyb2wgb3ZlciB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuICovXG5jbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgVmFyaWFibGVTY29wZSB7XG5cblx0cHJpdmF0ZSBleGVjdXRpb246IGFueTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcihfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKSk7XG5cdFx0dGhpcy5leGVjdXRpb24gPSBfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbmlxdWUgaWQgb2YgdGhpcyBwYXRoIG9mIGV4ZWN1dGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGFuZGxlIHRvIHByb3ZpZGUgZXh0ZXJuYWwgc2lnbmFscyBiYWNrIGludG8gdGhlIGVuZ2luZSBhZnRlciB3YWl0IHN0YXRlcy5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJhbGwgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlICdyb290JyBwcm9jZXNzIGluc3RhbmNlLiBXaGVuIHVzaW5nIGNhbGwgYWN0aXZpdHkgZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzSW5zdGFuY2Ugc2V0IHdpbGwgbm90IGFsd2F5cyBiZSB0aGUgcm9vdC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG9wbW9zdCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHJvb3QgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRSb290UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Um9vdFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjb250YWluIHRoZSBldmVudCBuYW1lIGluIGNhc2UgdGhpcyBleGVjdXRpb24gaXMgcGFzc2VkIGluIGZvciBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBldmVudCBuYW1lLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYW4gZXZlbnQgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV2ZW50TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgZXZlbnQgKHR5cGljYWxseSB3aGVuIGV4ZWN1dGlvbiBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9KS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0RXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0RXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIGtleSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIHN0YXR1cyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mgc3RhdHVzLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgZXhlY3V0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cblx0ICogQHJldHVybnMgVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiB0aGlzIGV4ZWN1dGlvbiBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgZXhlY3V0aW9uIGJlbG9uZ3MgdG8gb3IgYG51bGxgLCBpZiB0aGlzIGV4ZWN1dGlvbiBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZS5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgZXhlY3V0aW9uLiBJZiBudWxsLCB0aGUgZXhlY3V0aW9uIHJlcHJlc2VudHMgYSBwcm9jZXNzLWluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFBhcmVudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGNhbGxpbmcgZXhlY3V0aW9uLiBJZiBub3QgbnVsbCwgdGhlIGV4ZWN1dGlvbiBpcyBwYXJ0IG9mIGEgc3VicHJvY2Vzcy5cblx0ICogQHJldHVybnMgVGhlIHN1cGVyIGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFN1cGVyRXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0U3VwZXJFeGVjdXRpb25JZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBhY3Rpdml0eSBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50QWN0aXZpdHlJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRDdXJyZW50QWN0aXZpdHlJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRlbmFudCBpZCwgaWYgYW55IGlzIHNldCBiZWZvcmUgb24gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBvciBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgdGVuYW50IElELCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFRlbmFudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJQTU4gZWxlbWVudCB3aGVyZSB0aGUgZXhlY3V0aW9uIGN1cnJlbnRseSBpcyBhdC5cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmxvdyBlbGVtZW50IG9iamVjdCAodHlwZSBpcyBKYXZhIG9iamVjdCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEZsb3dFbGVtZW50KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93RWxlbWVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY3VycmVudCBCUE1OIGVsZW1lbnQgdGhlIGV4ZWN1dGlvbiBpcyBhdC5cblx0ICogQHBhcmFtIGZsb3dFbGVtZW50IFRoZSBuZXcgZmxvdyBlbGVtZW50IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzZXRDdXJyZW50Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEN1cnJlbnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEZsb3dhYmxlTGlzdGVuZXJ9IGluc3RhbmNlIG1hdGNoaW5nIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0gaWYgY3VycmVudGx5IGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBpcyBiZWluZyBleGVjdXRpb24uIFJldHVybnMgbnVsbCBvdGhlcndpc2UuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEZsb3dhYmxlIExpc3RlbmVyIG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3RlbmVyfSBpcyBiZWluZyBleGVjdXRlZC5cblx0ICogQHBhcmFtIGN1cnJlbnRMaXN0ZW5lciBUaGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3QgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoY3VycmVudExpc3RlbmVyOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRDdXJyZW50Rmxvd2FibGVMaXN0ZW5lcihjdXJyZW50TGlzdGVuZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHNuYXBzaG90IHJlYWQgb25seSBkZWxlZ2F0ZSBleGVjdXRpb24gb2YgdGhpcyBkZWxlZ2F0ZSBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEge0BsaW5rIFJlYWRPbmx5RGVsZWdhdGVFeGVjdXRpb259IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzbmFwc2hvdFJlYWRPbmx5KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNuYXBzaG90UmVhZE9ubHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBleGVjdXRpb24sIG9yIG51bGwgaWYgdGhlcmUgbm8gcGFyZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UGFyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgbGlzdCBvZiBleGVjdXRpb24gb2Ygd2hpY2ggdGhpcyBleGVjdXRpb24gdGhlIHBhcmVudCBvZi5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgY2hpbGQgZXhlY3V0aW9uIG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9ucygpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV4ZWN1dGlvbnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBtYWtlcyB0aGlzIGV4ZWN1dGlvbiBhY3RpdmUgb3IgaW5hY3RpdmUuXG5cdCAqIEBwYXJhbSBpc0FjdGl2ZSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGFjdGl2ZS5cblx0ICovXG5cdHB1YmxpYyBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRBY3RpdmUoaXNBY3RpdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNBY3RpdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaGFzIGVuZGVkIG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGVuZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0VuZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0VuZGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogY2hhbmdlcyB0aGUgY29uY3VycmVudCBpbmRpY2F0b3Igb24gdGhpcyBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBpc0NvbmN1cnJlbnQgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBjb25jdXJyZW50LlxuXHQgKi9cblx0cHVibGljIHNldENvbmN1cnJlbnQoaXNDb25jdXJyZW50OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0Q29uY3VycmVudChpc0NvbmN1cnJlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjb25jdXJyZW50IG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGNvbmN1cnJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNDb25jdXJyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgcHJvY2VzcyBpbnN0YW5jZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgcHJvY2VzcyBpbnN0YW5jZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9jZXNzSW5zdGFuY2VUeXBlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc1Byb2Nlc3NJbnN0YW5jZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmFjdGl2YXRlcyB0aGlzIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIGV4YW1wbGUgaW4gYSBqb2luOiB0aGUgZXhlY3V0aW9uIHN0aWxsIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBsb25nZXIgYWN0aXZlLlxuXHQgKi9cblx0cHVibGljIGluYWN0aXZhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uaW5hY3RpdmF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBzY29wZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTY29wZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNTY29wZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlIG9yIG5vdC5cblx0ICogQHBhcmFtIGlzU2NvcGUgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBhIHNjb3BlLlxuXHQgKi9cblx0cHVibGljIHNldFNjb3BlKGlzU2NvcGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRTY29wZShpc1Njb3BlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aSBpbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgbXVsdGkgaW5zdGFuY2Ugcm9vdCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNNdWx0aUluc3RhbmNlUm9vdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNNdWx0aUluc3RhbmNlUm9vdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIG11bHRpIGluc3RhbmNlIHJvb3Qgb3Igbm90LlxuXHQgKiBAcGFyYW0gaXNNdWx0aUluc3RhbmNlUm9vdCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aS1pbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0TXVsdGlJbnN0YW5jZVJvb3QoaXNNdWx0aUluc3RhbmNlUm9vdDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldE11bHRpSW5zdGFuY2VSb290KGlzTXVsdGlJbnN0YW5jZVJvb3QpO1xuXHR9XG5cbn1cblxuZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG5jbGFzcyBUYXNrQ29udGV4dCBleHRlbmRzIFZhcmlhYmxlU2NvcGUge1xuXG5cdHByaXZhdGUgdGFzazogYW55O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKF9fY29udGV4dC5nZXQoJ3Rhc2snKSk7XG5cdFx0dGhpcy50YXNrID0gX19jb250ZXh0LmdldCgndGFzaycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERCIGlkIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hbWUgb3IgdGl0bGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG5hbWUgZm9yIHRoZSB0YXNrLlxuXHQgKi9cblx0cHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldE5hbWUobmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RGVzY3JpcHRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXMgd2l0aCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCB3aGVyZSBoaWdoZXIgdmFsdWVzIG1lYW4gYSBoaWdoZXIgcHJpb3JpdHkgYW5kIGxvd2VyIHZhbHVlcyBtZWFuIGxvd2VyIHByaW9yaXR5OiBbMC4uMTldIGxvd2VzdCwgWzIwLi4zOV0gbG93LFxuXHQgKiBbNDAuLjU5XSBub3JtYWwsIFs2MC4uNzldIGhpZ2ggWzgwLi4xMDBdIGhpZ2hlc3Rcblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldFByaW9yaXR5KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcmlvcml0eSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdyxcblx0ICogWzQwLi41OV0gbm9ybWFsLCBbNjAuLjc5XSBoaWdoIFs4MC4uMTAwXSBoaWdoZXN0XG5cdCAqIFxuXHQgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2ssIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdywgWzQwLi41OV0gbm9ybWFsLCBcblx0ICovXG5cdHB1YmxpYyBzZXRQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldFByaW9yaXR5KHByaW9yaXR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAgaWYgdGhlIHRhc2sgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzSW5zdGFuY2VJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0UHJvY2Vzc0luc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgSUQgb2YgdGhlIGV4ZWN1dGlvbiB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV4ZWN1dGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBJRCBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRTdGF0ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0U3RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBjcmVhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRDcmVhdGVUaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q3JlYXRlVGltZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBpbiBwcm9ncmVzcyBzdGFydCB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0VGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdGFydGVkIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgc3RhcnRlZCB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY2xhaW1lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBjbGFpbSB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1UaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q2xhaW1UaW1lKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgY2xhaW1lZCB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IGNsYWltZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1lZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDbGFpbWVkQnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkQnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGlkIG9mIHRoZSBhY3Rpdml0eSBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIHRhc2sgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2Vzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB0YXNrIGRlZmluaXRpb24ga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRUYXNrRGVmaW5pdGlvbktleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlZCB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LlxuXHQgKiBcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIGlzIHN1c3BlbmRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTdXNwZW5kZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5pc1N1c3BlbmRlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIGFuZCBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGggKGlmIGFueSkuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdGVuYW50IElEIG9mIHRoaXMgdGFzaywgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBubyB0ZW5hbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdHB1YmxpYyBnZXRUZW5hbnRJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0VGVuYW50SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZm9ybSBrZXkgZm9yIHRoZSB1c2VyIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtIGtleSBkZWZpbmVkIG9uIHRoZSB1c2VyIHRhc2sgaW4gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbi4gV2lsbCByZXR1cm4gYG51bGxgIGlmIHRoaXMgdGFzayBpcyBub3QgYSB1c2VyIHRhc2sgb3IgaWYgbm8gZm9ybSBrZXkgaXMgZGVmaW5lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBmb3JtIGtleSBmb3IgdGhlIHVzZXIgdGFzaywgb3IgYG51bGxgIGlmIG5vIGZvcm0ga2V5IGlzIGRlZmluZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Rm9ybUtleSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Rm9ybUtleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgZm9ybSBrZXkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZm9ybUtleSB0aGUgbmV3IGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrLCBvciBgbnVsbGAgdG8gcmVtb3ZlIHRoZSBmb3JtIGtleVxuXHQgKi9cblx0cHVibGljIHNldEZvcm1LZXkoZm9ybUtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEZvcm1LZXkoZm9ybUtleSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGV2ZW50IG5hbWUgd2hpY2ggdHJpZ2dlcmVkIHRoZSB0YXNrIGxpc3RlbmVyIHRvIGZpcmUgZm9yIHRoaXMgdGFzay4gV2lsbCByZXR1cm4gYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lci5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBldmVudCBuYW1lIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2ssIG9yIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRFdmVudE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZXZlbnQgaGFuZGxlciBpZGVudGlmaWVyIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2suIFdpbGwgcmV0dXJuIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIgb3IgaWYgdGhlIGV2ZW50IGhhbmRsZXIgZG9lcyBub3QgaGF2ZSBhbiBpZGVudGlmaWVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGV2ZW50IGhhbmRsZXIgaWRlbnRpZmllciwgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lciBvciBpZiB0aGUgZXZlbnQgaGFuZGxlciBkb2VzIG5vdCBoYXZlIGFuIGlkZW50aWZpZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV2ZW50SGFuZGxlcklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgZGVsZWdhdGlvbiBzdGF0ZSBvZiB0aGUgdGFzaywgd2hpY2ggaXMgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCBkZWxlZ2F0ZWQsIGBQRU5ESU5HYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIHdhaXRpbmcgZm9yIHJlc29sdXRpb24gYnkgdGhlIGFzc2lnbmVlLCBhbmQgYFJFU09MVkVEYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIGhhcyBiZWVuIHJlc29sdmVkIGJ5IHRoZSBhc3NpZ25lZSBidXQgbm90IHlldCBjb21wbGV0ZWQgYnkgdGhlIG93bmVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGRlbGVnYXRpb24gc3RhdGUgb2YgdGhlIHRhc2ssIHdoaWNoIGlzIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgZGVsZWdhdGVkLCBgUEVORElOR2AgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCB3YWl0aW5nIGZvciByZXNvbHV0aW9uIGJ5IHRoZSBhc3NpZ25lZSwgYW5kIGBSRVNPTFZFRGAgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCBoYXMgYmVlbiByZXNvbHZlZCBieSB0aGUgYXNzaWduZWUgYnV0IG5vdCB5ZXQgY29tcGxldGVkIGJ5IHRoZSBvd25lci5cblx0ICovXG5cdHB1YmxpYyBnZXREZWxlZ2F0aW9uU3RhdGUoKTogRGVsZWdhdGlvblN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldERlbGVnYXRpb25TdGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBjYW5kaWRhdGUgdXNlciB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSB1c2VyIGlzIHRoZSBhc3NpZ25lZSBvZiB0aGUgdGFzaywgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYSBjYW5kaWRhdGUgdG8gYmVjb21lIGFuIGFzc2lnbmVlLiBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VlIHRoaXMgdGFzayBpbiB0aGVpciB0YXNrIGxpc3QgYW5kIGNsYWltIGl0IHRvIGJlY29tZSB0aGUgYXNzaWduZWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXNlcklkIHRoZSB1c2VyIElEIG9mIHRoZSBjYW5kaWRhdGUgdXNlciB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlVXNlcih1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgbXVsdGlwbGUgdXNlcnMgYXMgY2FuZGlkYXRlIHVzZXIgdG8gdGhpcyB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGNhbmRpZGF0ZVVzZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGNhbmRpZGF0ZSB1c2VyIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXJzKGNhbmRpZGF0ZVVzZXJzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5hZGRDYW5kaWRhdGVVc2VycyhjYW5kaWRhdGVVc2Vycyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGNhbmRpZGF0ZSBncm91cCB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHVzZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cCBhcmUgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBncm91cCBpcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2ssIGJ1dCBpdCBtZWFucyB0aGF0IGFsbCB1c2VycyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoZSBncm91cCBhcmUgY2FuZGlkYXRlcyB0byBiZWNvbWUgYXNzaWduZWVzLiBUaGUgdXNlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGUgZ3JvdXAgd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGlzIHRhc2sgaW4gdGhlaXIgdGFzayBsaXN0IGFuZCBjbGFpbSBpdCB0byBiZWNvbWUgdGhlIGFzc2lnbmVlLlxuXHQgKiBcblx0ICogQHBhcmFtIGdyb3VwSWQgdGhlIGdyb3VwIElEIG9mIHRoZSBjYW5kaWRhdGUgZ3JvdXAgdG8gYWRkIHRvIHRoaXMgdGFzay5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVHcm91cChncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBtdWx0aXBsZSBncm91cHMgYXMgY2FuZGlkYXRlIGdyb3VwIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSBjYW5kaWRhdGVHcm91cHMgdGhlIGNvbGxlY3Rpb24gb2YgY2FuZGlkYXRlIGdyb3VwIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay4gVGhpcyBpcyB0aGUgdXNlciB0aGF0IGhhcyB0byB3b3JrIG9uIHRoaXMgdGFzayBhbmQgY29tcGxldGUgaXQuIFdoZW4gYSB0YXNrIGlzIGFzc2lnbmVkIHRvIGEgdXNlciwgdGhhdCB1c2VyIGJlY29tZXMgdGhlIGFzc2lnbmVlIG9mIHRoZSB0YXNrLiBUaGUgYXNzaWduZWUgaXMgdGhlIG9ubHkgb25lIHRoYXQgY2FuIGNvbXBsZXRlIHRoZSB0YXNrICh1bmxlc3MgdGhlIHRhc2sgaXMgZGVsZWdhdGVkXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T3duZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE93bmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLiBUaGlzIGlzIHRoZSB1c2VyIHRoYXQgaGFzIHRvIHdvcmsgb24gdGhpcyB0YXNrIGFuZCBjb21wbGV0ZSBpdC4gV2hlbiBhIHRhc2sgaXMgYXNzaWduZWQgdG8gYSB1c2VyLCB0aGF0IHVzZXIgYmVjb21lcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2suIFRoZSBhc3NpZ25lZSBpcyB0aGUgb25seSBvbmUgdGhhdCBjYW4gY29tcGxldGUgdGhlIHRhc2sgKHVubGVzcyB0aGUgdGFzayBpcyBkZWxlZ2F0ZWRcblx0ICogXG5cdCAqIEBwYXJhbSBvd25lciB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIob3duZXI6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXRPd25lcihvd25lcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0byB3aGljaCB0aGlzIHRhc2sgaXMgZGVsZWdhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgSUQgb2YgdGhlIGFzc2lnbmVlIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRBc3NpZ25lZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICogQHBhcmFtIGFzc2lnbmVlIHRoZSB1c2VyIElEIG9mIHRoZSBhc3NpZ25lZSBvZiB0aGlzIHRhc2tcblx0ICovXG4gICAgcHVibGljIHNldEFzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLnNldEFzc2lnbmVlKGFzc2lnbmVlKTtcbiAgICB9XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSBpbiBwcm9ncmVzcyBzdGFydCBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGluUHJvZ3Jlc3NTdGFydER1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZShpblByb2dyZXNzU3RhcnREdWVEYXRlOiBEYXRlKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoaW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGR1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0RHVlRGF0ZShkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2F0ZWdvcnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldENhdGVnb3J5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlIHRoZSBjYXRlZ29yeSBvZiB0aGUgdGFzay4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCBhbmQgYWxsb3dzIHRvICd0YWcnIHRhc2tzIGFzIGJlbG9uZ2luZyB0byBhIGNlcnRhaW4gY2F0ZWdvcnkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIG5ldyBjYXRlZ29yeSBvZiB0aGUgdGFza1xuXHQgKi9cblx0cHVibGljIHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXHR9XG5cblxuICAgIC8qKlxuICAgICAqIEludm9sdmVzIGEgdXNlciB3aXRoIGEgdGFzay4gVGhlIHR5cGUgb2YgaWRlbnRpdHkgbGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHBhcmFtIGlkZW50aXR5TGlua1R5cGVcbiAgICAgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgdXNlciBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgYWRkVXNlcklkZW50aXR5TGluayh1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZFVzZXJJZGVudGl0eUxpbmsodXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG4gICAgLyoqXG4gICAgICogSW52b2x2ZXMgYSBncm91cCB3aXRoIGdyb3VwIHRhc2suIFRoZSB0eXBlIG9mIGlkZW50aXR5TGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmsuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmFkZEdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVVc2VySWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nKX0gOyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cElkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZUdyb3VwKGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIHVzZXIgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciBpbnZvbHZlLCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuICAgICAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG5cdHB1YmxpYyBkZWxldGVVc2VySWRlbnRpdHlMaW5rKHVzZXJJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suZGVsZXRlVXNlcklkZW50aXR5TGluayh1c2VySWQsIGlkZW50aXR5TGlua1R5cGUpO1xuXHR9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgZ3JvdXAgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjYW5kaWRhdGUgdXNlcnMgYW5kIGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHNldCBvZiB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgb2YgdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9LlxuICAgICAqL1xuXHRwdWJsaWMgZ2V0Q2FuZGlkYXRlcygpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDYW5kaWRhdGVzKCk7XG5cdH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSBQcm9jZXNzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSxvQkFBdUI7QUFHdkIsTUFBTSxhQUFhLEtBQUssS0FBSyx3Q0FBd0M7QUFDckUsTUFBTSxZQUFZLEtBQUssS0FBSyxvREFBb0Q7QUFFekUs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