footprintjs 9.44.3 → 9.45.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.
@@ -135,8 +135,9 @@ class TransactionBuffer {
135
135
  */
136
136
  detachedBase;
137
137
  /**
138
- * Where the stage writes (9.30.0): `['runs', runId]` for a run-namespaced
139
- * stage, `[]` otherwise. Its containers are the stage's ADDRESS, not a value
138
+ * Where the stage writes (9.30.0): a path prefix its frame computed and
139
+ * hands over as data (C2 — for the engine, the frame's run namespace, or
140
+ * `[]` for the root). Its containers are the stage's ADDRESS, not a value
140
141
  * the stage reads (every read it makes is a key below it), so a shell a
141
142
  * write leaves there is no part of the read-back the record must hold.
142
143
  */
@@ -417,7 +418,7 @@ class TransactionBuffer {
417
418
  * - a container still SHARED with committed state at the same position is
418
419
  * replaced by a private deep copy when it is the value read, or by a
419
420
  * shallow copy when it is a container on the way to it (so a read of
420
- * `runs/<id>/k` copies `k`, not every run's namespace);
421
+ * `k` under a fork child's address copies `k`, not every child's namespace);
421
422
  * - a container the stage STAGED (or anything else the buffer did not
422
423
  * take from committed state) is handed back by reference, as before;
423
424
  * - a container the buffer owns is walked on — and when it is the value
@@ -946,4 +947,4 @@ function flattenedTraceRow(op) {
946
947
  function provenance(readKeys) {
947
948
  return readKeys !== undefined ? { readKeys } : undefined;
948
949
  }
949
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStERzs7O0FBRUgsaURBQWdIO0FBQ2hILHlEQUFvSDtBQUNwSCwrQ0FBeUM7QUFDekMsNkNBVXNCO0FBRXRCLHlDQUFzRjtBQUV0RixNQUFhLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixDQUFrQjtJQUVuRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdEM7Ozs7OztPQU1HO0lBQ0ssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdkM7Ozs7O09BS0c7SUFDSyxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0ssU0FBUyxDQUFtQjtJQUVwQzs7O09BR0c7SUFDSyxZQUFZLENBQW1CO0lBRXZDOzs7OztPQUtHO0lBQ2MsT0FBTyxDQUFvQjtJQUU1QyxvRUFBb0U7SUFDNUQsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN6QixvRkFBb0Y7SUFDNUUsU0FBUyxHQUFHLENBQUMsQ0FBQztJ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SUFDaEYsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDekIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQWMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUU7UUFDdEcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUM7QUFFRCwwRkFBMEY7QUFDMUYsU0FBUyxVQUFVLENBQUMsUUFBOEI7SUFDaEQsT0FBTyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHJhbnNhY3Rpb25CdWZmZXIg4oCUIFBlci1zdGFnZSBTVEFHSU5HIGJ1ZmZlciBmb3Igc3RhdGUgbXV0YXRpb25zXG4gKlxuICogV2hhdCBpdCBJUzogYSBzdGFnaW5nIGJ1ZmZlciB3aXRoIHJlYWQteW91ci13cml0ZXMgYW5kIG5ldC1jaGFuZ2UgY29tbWl0cy5cbiAqIC0gQ2hhbmdlcyBhcmUgc3RhZ2VkIGhlcmUgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbiBhbmQgZmx1c2hlZCB0b1xuICogICBTaGFyZWRNZW1vcnkgaW4gT05FIGJhdGNoIHBlciBzdGFnZSAoYGNvbW1pdCgpYCkg4oCUIG90aGVyIHN0YWdlcyBhbmRcbiAqICAgcGFyYWxsZWwgc2libGluZ3MgbmV2ZXIgb2JzZXJ2ZSBhIHN0YWdlJ3MgaGFsZi1maW5pc2hlZCB3cml0ZXMuXG4gKiAtIFJlYWQtYWZ0ZXItd3JpdGUgY29uc2lzdGVuY3kgd2l0aGluIGEgc3RhZ2Ug4oCUIGEgc3RhZ2Ugc2VlcyBpdHMgb3duXG4gKiAgIHN0YWdlZCB3cml0ZXMgaW1tZWRpYXRlbHkuXG4gKiAtIGBjb21taXQoKWAgcmVjb3JkcyB0aGUgc3RhZ2UncyBORVQgY2hhbmdlIChzZWUge0BsaW5rIGNvbW1pdH0pLCBwbHVzIGFuXG4gKiAgIG9wZXJhdGlvbiB0cmFjZSBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuXG4gKlxuICogV2hhdCBpdCBpcyBOT1Q6IGEgcm9sbGJhY2sgbWVjaGFuaXNtLiBEZXNwaXRlIHRoZSBuYW1lLCB0aGVyZSBpcyBub1xuICogYWJvcnQvcm9sbGJhY2sgcGF0aCDigJQgd2hlbiBhIHN0YWdlIFRIUk9XUywgdGhlIGVuZ2luZSBzdGlsbCBjb21taXRzXG4gKiBldmVyeXRoaW5nIHN0YWdlZCBzbyBmYXIgYmVmb3JlIHJlLXRocm93aW5nIChjb21taXQtb24tZXJyb3IgaW5cbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXJgKS4gVGhhdCBpcyBkZWxpYmVyYXRlOiB0aGUgYXVkaXQgdHJhaWwgbXVzdCByZWNvcmRcbiAqIHdoYXQgdGhlIGZhaWxpbmcgc3RhZ2UgY2hhbmdlZC4gRG8gbm90IHJlbHkgb24gXCJzdGFnZSBmYWlsZWQg4oaSIGl0c1xuICogd3JpdGVzIHZhbmlzaGVkXCIuXG4gKlxuICogVGhlIHBhdGNoIHRyZWVzIGhvbGQgUkVGRVJFTkNFUyB1bnRpbCBjb21taXQgKDkuMjMuMCkuIEEgYHNldGAgc3RvcmVzIHRoZVxuICogY2FsbGVyJ3Mgb3duIHZhbHVlIGluIGBvdmVyd3JpdGVQYXRjaGAgZXhhY3RseSBhcyBpdCBhbHdheXMgZGlkIGluXG4gKiBgd29ya2luZ0NvcHlgOyB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHRha2VuIE9OQ0UgcGVyIHN1cnZpdmluZyBwYXRoXG4gKiB3aGVuIHRoZSBwYXlsb2FkIGxlYXZlcyB0aGUgYnVmZmVyIChgdG9DaGFuZ2VPbmx5UGF5bG9hZGAgL1xuICogYHRvRGVsdGFQYXlsb2FkYCDigJQgZXZlcnkgdmFsdWUgdGhleSBlbWl0IHBhc3NlcyB0aHJvdWdoIGBzdHJ1Y3R1cmVkQ2xvbmVgXG4gKiB0aGVyZSkuIFRoZSBsYXcgXCJ0aGUgcmVjb3JkIG5ldmVyIGFsaWFzZXMgYSBjYWxsZXIncyBvYmplY3RcIiBpcyBrZXB0IGF0XG4gKiB0aGUgY29tbWl0IGJvdW5kYXJ5IGluc3RlYWQgb2YgYXQgZXZlcnkgd3JpdGUsIHdoaWNoIGlzIHdoYXQgbWFrZXMgTlxuICogd3JpdGVzIHRvIG9uZSBwYXRoIE8oTikgaW5zdGVhZCBvZiBPKE4gw5cgc2l6ZSkuIENvbnNlcXVlbmNlLCBieSBkZXNpZ246IGFcbiAqIGNhbGxlciB3aG8gbXV0YXRlcyBpdHMgb3duIG9iamVjdCBBRlRFUiB0aGUgd3JpdGUgYW5kIEJFRk9SRSB0aGUgc3RhZ2VcbiAqIGVuZHMgY29tbWl0cyB0aGUgdmFsdWUgYXMgdGhlIHN0YWdlIHJlYWQgaXQgYmFjayDigJQgdGhlIHJlY29yZCBhZ3JlZXMgd2l0aFxuICogdGhlIHN0YWdlIChDTEFVREUubWQgbGFuZG1pbmUgMydzIGZpcnN0IGJpdGUsIGNsb3NlZCkuIFRoZSBvbmUgcGxhY2UgdGhlXG4gKiBlbmdpbmUgaXRzZWxmIGVkaXRzIFRIUk9VR0ggYSBzdGFnZWQgdmFsdWUg4oCUIGEgbGF0ZXIgbmVzdGVkIG9wIHVuZGVyIGFcbiAqIGBzZXRgIHBhdGgg4oCUIGRldGFjaGVzIHRoYXQgdmFsdWUgZmlyc3QgKHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfSksIHNvXG4gKiBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIG5ldmVyIHNoYXJlIGEgY29udGFpbmVyIHRoZSBlbmdpbmVcbiAqIG11dGF0ZXMgb24gb25lIHNpZGUgb25seS5cbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpLiBUaGVcbiAqIGJ1ZmZlciBubyBsb25nZXIgY2xvbmVzIHRoZSBjb21taXR0ZWQgc3RhdGUgaXQgc3RhcnRzIGZyb20uIGBiYXNlU25hcHNob3RgXG4gKiBJUyB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0IHRvdWNoZWQgKGhlbGQgYnkgcmVmZXJlbmNlIOKAlFxuICogY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwKSwgYW5kIGB3b3JraW5nQ29weWAgc3RhcnRzIGFzIGFcbiAqIGNvcHkgb2YgaXRzIFJPT1Qgb25seTogZWFjaCB3cml0ZSBjb3BpZXMgdGhlIGNvbnRhaW5lcnMgb24gaXRzIG93biBwYXRoXG4gKiAoe0BsaW5rIG93blNwaW5lfSksIGFuZCB0aGUgZmlyc3QgUkVBRCBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBvZiBhXG4gKiBjb250YWluZXIgc3RpbGwgc2hhcmVkIHdpdGggY29tbWl0dGVkIHN0YXRlIHRha2VzIGEgcHJpdmF0ZSBkZWVwIGNvcHkgb2ZcbiAqIGl0ICh7QGxpbmsgcHJpdmF0aXNlfSkg4oCUIHdoYXQgdGhlIHdob2xlLXN0YXRlIGNsb25lIHVzZWQgdG8gZ2l2ZSBldmVyeVxuICogcmVhZCwgc28gYW4gaW4tcGxhY2UgZWRpdCBvZiBhIHJlYWQgdmFsdWUgc3RheXMgcHJpdmF0ZSBleGFjdGx5IGFzIGl0IGRpZC5cbiAqIEEgcmVhZCB0aGUgd29ya2luZyBjb3B5IGNhbm5vdCBhbnN3ZXIgaXMgc2VydmVkIGZyb20gbGl2ZSBzdGF0ZSBieSB0aGVcbiAqIGNhbGxlciwgYXMgYmVmb3JlOyB0aGUgYnVmZmVyIHRoZW4gcmVwbGFjZXMgdGhhdCBwYXRoIG9mIGl0cyBkaWZmIGJhc2VcbiAqIHdpdGggYSBwcml2YXRlIGNvcHkgKHtAbGluayBkZXRhY2hCYXNlfSksIGFzIHRoZSBjbG9uZSBoYWQgaXQuXG4gKlxuICogVEhFIEFETUlUVEVEIFJFQ09SRCAoOS4zMC4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZCkuIEFcbiAqIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGUgc3RhZ2Unc1xuICogcmVhZC15b3VyLXdyaXRlcyB2aWV3IGF0IGV2ZXJ5IHBhdGggdGhlIHN0YWdlIHRvdWNoZWQgKGFuZCBhdCBldmVyeVxuICogY29udGFpbmVyIGl0cyB3cml0ZXMgY3JlYXRlZCBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzKS5cbiAqIEJvdGggZW5jb2RlcnMgY29tbWl0IHRoZSB2YWx1ZSB0aGUgc3RhZ2UgcmVhZDogYSBjb21wYWN0IHJvdyDigJQgYSBgbWVyZ2VgXG4gKiBkZWx0YSwgYW4gYGFwcGVuZGAgdGFpbCDigJQgaXMga2VwdCB3aGVyZSBpdCBwcm92YWJseSBmb2xkcyBiYWNrOyBhIGZhbWlseSBvZlxuICogcm93cyB0aGF0IGRvZXMgbm90IGlzIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHZhbHVlcyB0aGUgc3RhZ2UgcmVhZFxuICogKHtAbGluayBhZG1pdH0pLiBCZWZvcmUgOS4zMC4wIHRoZSBvbmUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgcGVyIHBhdGggd2FzXG4gKiByZXBsYXllZCBhdCBldmVyeSBgbWVyZ2VgIHJvdyBvZiB0aGF0IHBhdGgsIHdoaWNoIGxpZWQgYWNyb3NzIGEgaGFyZCB3cml0ZVxuICogKGAkdXBkYXRlKGsse3h9KTsgayA9IHt5fTsgJHVwZGF0ZShrLHt6fSlgIGNvbW1pdHRlZCBge3ksIHgsIHp9YCBmb3IgYVxuICogcmVhZC1iYWNrIG9mIGB7eSwgen1gKSwgYW4gYFtdYCBjbGVhciwgYSBraW5kIGNoYW5nZSBvciBhbiBhcnJheSB1bmlvblxuICogZGVkdXBsaWNhdGVkIGJ5IHJlZmVyZW5jZS4gVmVyaWZpZWQgd2hlbiB0aGUgc3RhZ2Ugc3RhZ2VkIGEgYG1lcmdlYCBvciBhXG4gKiBuZXN0ZWQgb3A7IGEgc3RhZ2UgdGhhdCBzdGFnZWQgb25seSBgc2V0YCAvIGBkZWxldGVgIG9mIGtleXMgZGlyZWN0bHkgdW5kZXJcbiAqIGl0cyBhZGRyZXNzIGlzIGNvaGVyZW50IGJ5IGNvbnN0cnVjdGlvbiDigJQgYm90aCB0cmVlcyByZWNlaXZlIHRoZSBzYW1lXG4gKiB3cml0ZSDigJQgYW5kIGlzIGFkbWl0dGVkIHdpdGhvdXQgdGhlIGZvbGQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBGYW1pbHksIHR5cGUgTG9zc3ksIHR5cGUgTWVtYmVyLCB0eXBlIFJvd3MsIGFkZHJlc3NEZXB0aE9mLCBsb3NzeUZhbWlsaWVzIH0gZnJvbSAnLi9hZG1pc3Npb24uanMnO1xuaW1wb3J0IHsgdHlwZSBPcFZlcmIsIHR5cGUgU3Vydml2b3IsIGVtaXRJbkZhbWlseU9yZGVyLCBncm91cEludG9GYW1pbGllcywgcHVzaFZhbHVlUm93IH0gZnJvbSAnLi9kZWx0YUVuY29kaW5nLmpzJztcbmltcG9ydCB7IHJlbGF0aW9uIH0gZnJvbSAnLi9rZXlQYXRocy5qcyc7XG5pbXBvcnQge1xuICBhZG9wdCxcbiAgaXNDb250YWluZXIsXG4gIG5hdGl2ZUdldCBhcyBfZ2V0LFxuICBuYXRpdmVTZXQgYXMgX3NldCxcbiAgb3duLFxuICBvd25DaGlsZCxcbiAgb3duZWRSb290T2YsXG4gIG93blNwaW5lLFxuICBzaGFsbG93Q29weSxcbn0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgZGVlcFNtYXJ0TWVyZ2UsIERFTElNLCBkcnlGb2xkLCBub3JtYWxpc2VQYXRoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gIC8qKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBkaWZmIGJhc2U6IHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3RcbiAgICogdG91Y2hlZCwgYnkgcmVmZXJlbmNlIOKAlCBleGNlcHQgd2hlcmUge0BsaW5rIGRldGFjaEJhc2V9IHJlcGxhY2VkIGEgcGF0aFxuICAgKiBvZiBpdCB3aXRoIGEgcHJpdmF0ZSBjb3B5IChpdHMgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gdGhlIHdheSBhcmVcbiAgICogdGhlbiBjb3BpZXMgdG9vLCBvd25lZCBieSB7QGxpbmsgYmFzZU93bmVkfSkuXG4gICAqL1xuICBwcml2YXRlIGJhc2VTbmFwc2hvdDogYW55O1xuICBwcml2YXRlIHdvcmtpbmdDb3B5OiBhbnk7XG5cbiAgcHJpdmF0ZSBvdmVyd3JpdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSB1cGRhdGVQYXRjaDogTWVtb3J5UGF0Y2ggPSB7fTtcbiAgcHJpdmF0ZSBvcFRyYWNlOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH1bXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGVkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFBhdGhzIHdob3NlIGBvdmVyd3JpdGVQYXRjaGAgdmFsdWUgaXMgdGhlIGNhbGxlcidzIG93biBvYmplY3QgKDkuMjMuMCk6XG4gICAqIGEgYHNldGAgb2YgYSBjb250YWluZXIgc3RvcmVzIHRoZSByZWZlcmVuY2UsIGFuZCB0aGlzIGlzIHRoZSBsZWRnZXIgb2ZcbiAgICogd2hpY2ggb25lcyBhcmUgc3RpbGwgc2hhcmVkIHdpdGggdGhlIGNhbGxlciAoYW5kIHdpdGggYHdvcmtpbmdDb3B5YCkuXG4gICAqIENvbnN1bHRlZCBvbmx5IGJ5IHRoZSBlbmdpbmUncyBuZXN0ZWQgb3BzIOKAlCBzZWVcbiAgICoge0BsaW5rIGRldGFjaEhlbGRBbmNlc3RvcnN9OyB0aGUgY29tbWl0IHBheWxvYWQgY2xvbmVzIGV2ZXJ5IHN1cnZpdmluZ1xuICAgKiB2YWx1ZSBhbnl3YXkgYW5kIG5ldmVyIGFza3MuIENsZWFyZWQgd2l0aCB0aGUgcmVzdCBhdCBgY29tbWl0KClgLlxuICAgKi9cbiAgcHJpdmF0ZSBoZWxkUmVmcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKiogQ29tbWl0LXZhbHVlIGVuY29kaW5nIHBvbGljeSAoIzEzYy1CKS4gYCdmdWxsJ2AgPSBoaXN0b3JpY2FsIGJ5dGVzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZTtcblxuICAvKiogUGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBzb3VyY2UgKCNQMSkuIFdoZW4gc2V0ICh0aGVcbiAgICogIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsKSwgZXZlcnkgc3RhZ2VkIG9wIHNuYXBzaG90cyB0aGVcbiAgICogIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciDigJQgdGhlIHRlbXBvcmFsLXByZWZpeCBhdHRyaWJ1dGlvbiBjb25zdW1lZCBieVxuICAgKiAgY2F1c2FsIHNsaWNpbmcuIFVuZGVmaW5lZCAoZGVmYXVsdCkgPSB6ZXJvIGNvc3QsIGJ5dGUtaWRlbnRpY2FsIG9wcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb250YWluZXJzIGluIGB3b3JraW5nQ29weWAgdGhpcyBidWZmZXIgQ1JFQVRFRDogaXRzIHJvb3QgY29weSwgdGhlXG4gICAqIHBhdGggY29waWVzIGl0cyB3cml0ZXMgbWFkZSwgdGhlIG1lcmdlIHJlc3VsdHMgaXQgYnVpbHQsIGFuZCBldmVyeVxuICAgKiBjb250YWluZXIgb2YgdGhlIHByaXZhdGUgY29waWVzIGl0cyByZWFkcyB0b29rLiBBIHdyaXRlIGVkaXRzIHRoZXNlIGluXG4gICAqIHBsYWNlLiBFdmVyeXRoaW5nIGVsc2UgaW4gYHdvcmtpbmdDb3B5YCBpcyBTSEFSRUQg4oCUIHdpdGggdGhlIGNvbW1pdHRlZFxuICAgKiBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkLCBvciB3aXRoIGEgdmFsdWUgdGhlIHN0YWdlIHN0YWdlZCDigJRcbiAgICogYW5kIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCAoe0BsaW5rIG93blNwaW5lfSkuXG4gICAqL1xuICBwcml2YXRlIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgdmFsdWVzIHRoZSBzdGFnZSBzdGFnZWQgd2l0aCB7QGxpbmsgc2V0fSDigJQgaXRzIG93biBvYmplY3RzLFxuICAgKiBoZWxkIGJ5IHJlZmVyZW5jZSAoOS4yMy4wKS4gQSByZWFkIGhhbmRzIHRoZW0gYmFjayBhcyB0aGV5IGFyZSwgZXhhY3RseVxuICAgKiBhcyB0aGUgcHJpdmF0ZSB3b3JraW5nIGNvcHkgYWx3YXlzIGRpZCwgYW5kIG5ldmVyIHByaXZhdGlzZXMgdGhlbTogYVxuICAgKiBwcml2YXRlIGNvcHkgb2YgYSBzdGFnZWQgdmFsdWUgd291bGQgbGVhdmUgYHdvcmtpbmdDb3B5YCBhbmRcbiAgICogYG92ZXJ3cml0ZVBhdGNoYCBkaXNhZ3JlZWluZyBhYm91dCBhIHZhbHVlIHRoZSBzdGFnZSB3cm90ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBPd25lZCBjb250YWluZXJzIHdpdGggbm8gY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZVxuICAgKiBhbnl3aGVyZSBiZWxvdyB0aGVtIChhIHByaXZhdGUgZGVlcCBjb3B5LCBhIG1lcmdlIHJlc3VsdCBidWlsdCBvbiBhXG4gICAqIHByaXZhdGUgYmFzZSwgYSBwYXRoIGNvcHkgd2hvc2Ugc2hhcmVkIGNoaWxkcmVuIHdlcmUgcHJpdmF0aXNlZCkuIEEgcmVhZFxuICAgKiB0aGF0IGxhbmRzIG9uIG9uZSBuZWVkcyBubyB3YWxrIOKAlCBzZWUge0BsaW5rIHByaXZhdGlzZUJlbG93fS5cbiAgICovXG4gIHByaXZhdGUgcHJpdmF0ZVRyZWVzID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBvZiB7QGxpbmsgYmFzZVNuYXBzaG90fSB0aGF0IHtAbGluayBkZXRhY2hCYXNlfSBjcmVhdGVkOlxuICAgKiBpdHMgcm9vdCBjb3B5IGFuZCB0aGUgY29waWVzIG9uIHRoZSB3YXkgdG8gYSBkZXRhY2hlZCBwYXRoLiBBbGxvY2F0ZWRcbiAgICogb25seSBieSB0aGUgZmlyc3QgZGV0YWNoIOKAlCB0aGUgaW4tY29udHJhY3Qgc3RhZ2UgbmV2ZXIgcGF5cyBmb3IgaXQuXG4gICAqL1xuICBwcml2YXRlIGJhc2VPd25lZD86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogVGhlIHByaXZhdGUgZGVlcCBjb3BpZXMge0BsaW5rIGRldGFjaEJhc2V9IHB1dCBpbnRvIHRoZSBkaWZmIGJhc2U6IG5vdGhpbmdcbiAgICogYXQgb3IgYmVsb3cgb25lIGlzIGNvbW1pdHRlZCBzdGF0ZSwgc28gYSBsYXRlciBkZXRhY2ggaW5zaWRlIGl0IGlzIGEgbm8tb3AuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaGVkQmFzZT86IFdlYWtTZXQ8b2JqZWN0PjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIHN0YWdlIHdyaXRlcyAoOS4zMC4wKTogYFsncnVucycsIHJ1bklkXWAgZm9yIGEgcnVuLW5hbWVzcGFjZWRcbiAgICogc3RhZ2UsIGBbXWAgb3RoZXJ3aXNlLiBJdHMgY29udGFpbmVycyBhcmUgdGhlIHN0YWdlJ3MgQUREUkVTUywgbm90IGEgdmFsdWVcbiAgICogdGhlIHN0YWdlIHJlYWRzIChldmVyeSByZWFkIGl0IG1ha2VzIGlzIGEga2V5IGJlbG93IGl0KSwgc28gYSBzaGVsbCBhXG4gICAqIHdyaXRlIGxlYXZlcyB0aGVyZSBpcyBubyBwYXJ0IG9mIHRoZSByZWFkLWJhY2sgdGhlIHJlY29yZCBtdXN0IGhvbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBgbWVyZ2VgIG9wcyBzdGFnZWQgc2luY2UgdGhlIGxhc3QgY29tbWl0IOKAlCBzZWUge0BsaW5rIGFkbWl0fS4gKi9cbiAgcHJpdmF0ZSBzdGFnZWRNZXJnZXMgPSAwO1xuICAvKiogT3BzIHN0YWdlZCBkZWVwZXIgdGhhbiBvbmUga2V5IGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3Mg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIG5lc3RlZE9wcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZTogYW55LFxuICAgIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZSA9ICdmdWxsJyxcbiAgICByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW10sXG4gICAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKSB7XG4gICAgLy8gYGJhc2VgIGlzIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCDigJRcbiAgICAvLyBpbW11dGFibGUtYWZ0ZXItc3dhcCwgdGhlIGludmFyaWFudCB0aGUgZmlyc3QtdG91Y2ggdmlldyBhbHJlYWR5IHJlc3RzXG4gICAgLy8gb24g4oCUIHNvIHRoZSBkaWZmIGJhc2UgaXMgaGVsZCBieSBSRUZFUkVOQ0UsIGFuZCB0aGUgd29ya2luZyBjb3B5IHN0YXJ0c1xuICAgIC8vIGFzIGEgY29weSBvZiBpdHMgUk9PVCBvbmx5LiBCZWZvcmUgOS4yOS4wIHRoZXNlIHR3byBsaW5lcyB3ZXJlIHR3b1xuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgd2hvbGUgc3RhdGUsIHBhaWQgYnkgZXZlcnkgc3RhZ2UgdGhhdCB3cm90ZS5cbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IGJhc2U7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IG93bmVkUm9vdE9mKGJhc2UsIHRoaXMub3duZWQpO1xuICAgIHRoaXMuY29tbWl0VmFsdWVzID0gY29tbWl0VmFsdWVzO1xuICAgIHRoaXMucmVhZEtleXNQcm92aWRlciA9IHJlYWRLZXlzUHJvdmlkZXI7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgY3VycmVudCByZWFkIHByZWZpeCBvbnRvIGEgc3RhZ2VkIG9wIOKAlCBvbmx5IHdoZW4gdGhlXG4gICAqICBwcm92ZW5hbmNlIGRpYWwgaXMgb24gKHByb3ZpZGVyIHByZXNlbnQpLCBzbyB0aGUgZGVmYXVsdCBwYXRoIGFsbG9jYXRlc1xuICAgKiAgbm90aGluZyBhbmQgY29tbWl0IGJ1bmRsZXMgc3RheSBieXRlLWlkZW50aWNhbC4gKi9cbiAgcHJpdmF0ZSBzdGFtcFJlYWRLZXlzKG9wOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH0pOiB0eXBlb2Ygb3Age1xuICAgIGlmICh0aGlzLnJlYWRLZXlzUHJvdmlkZXIpIG9wLnJlYWRLZXlzID0gdGhpcy5yZWFkS2V5c1Byb3ZpZGVyKCk7XG4gICAgcmV0dXJuIG9wO1xuICB9XG5cbiAgLyoqIFN0YWdlIGFuIG9wIGludG8gYG9wVHJhY2VgLCBjb3VudGluZyB3aGF0IGRlY2lkZXMgd2hldGhlciB7QGxpbmsgYWRtaXR9IG11c3QgZm9sZC4gKi9cbiAgcHJpdmF0ZSBzdGFnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBrZXk6IHN0cmluZywgdmVyYjogT3BWZXJiKTogdm9pZCB7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHRoaXMuc3RhZ2VkTWVyZ2VzKys7XG4gICAgaWYgKHBhdGgubGVuZ3RoIC0gYWRkcmVzc0RlcHRoT2YocGF0aCwgdGhpcy5hZGRyZXNzKSA+IDEpIHRoaXMubmVzdGVkT3BzKys7XG4gICAgdGhpcy5vcFRyYWNlLnB1c2godGhpcy5zdGFtcFJlYWRLZXlzKHsgcGF0aDoga2V5LCB2ZXJiIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIFN0b3JlcyB0aGUgUkVGRVJFTkNFIGluIGJvdGggdHJlZXNcbiAgICogKDkuMjMuMCkg4oCUIHRoZSByZWNvcmQncyBjb3B5IGlzIHRha2VuIG9uY2UsIGF0IGNvbW1pdDsgc2VlIHRoZSBoZWFkZXIuXG4gICAqL1xuICBzZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoaXNDb250YWluZXIodmFsdWUpKSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmFkZChrZXkpO1xuICAgICAgdGhpcy5zdGFnZWQuYWRkKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ3NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbmVzdGVkIG9wIGlzIGFib3V0IHRvIHdyaXRlIFRIUk9VR0ggYSBwYXRoIHdob3NlIGBvdmVyd3JpdGVQYXRjaGBcbiAgICogdmFsdWUgaXMgYSBoZWxkIHJlZmVyZW5jZSAoOS4yMy4wKS4gVG9kYXkncyBsYXcgaXMgdGhhdCB0aGUgdHdvIHRyZWVzXG4gICAqIHJlY2VpdmUgdGhlIHNhbWUgbmVzdGVkIGBzZXRgL2BkZWxldGVgIG11dGF0aW9ucyBidXQgT05MWSBgd29ya2luZ0NvcHlgXG4gICAqIHJlY2VpdmVzIGEgbmVzdGVkIGBtZXJnZWAncyByZXN1bHQgKGB1cGRhdGVQYXRjaGAgZ2V0cyB0aGUgZGVsdGEpIOKAlCBzbyBhXG4gICAqIGNvbnRhaW5lciBzaGFyZWQgYmV0d2VlbiB0aGUgdHJlZXMgd291bGQgbGVhayB0aGUgbWVyZ2VkIHZhbHVlIGludG8gdGhlXG4gICAqIG92ZXJ3cml0ZSBwYXlsb2FkLCBhbmQgYSBzaGFyZWQgY29udGFpbmVyIGlzIGFsc28gdGhlIGNhbGxlcidzIG93blxuICAgKiBvYmplY3QsIHdoaWNoIHRoZSBlbmdpbmUgbXVzdCBub3QgZWRpdCBvbiB0aGUgcmVjb3JkJ3MgYmVoYWxmLiBSZXBsYWNpbmdcbiAgICogdGhlIGhlbGQgYW5jZXN0b3Igd2l0aCBpdHMgY2xvbmUgaW4gYG92ZXJ3cml0ZVBhdGNoYCByZXN0b3JlcyBleGFjdGx5XG4gICAqIHRoZSBwcml2YXRlIHRyZWUgdGhlIHBlci13cml0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgaXQsIHBhaWQgb25jZSBwZXJcbiAgICogYW5jZXN0b3IgYW5kIG9ubHkgb24gdGhlIG5lc3RlZC1vcCBwYXRoIHRoZSBwdWJsaWMgc3VyZmFjZSBuZXZlciB0YWtlc1xuICAgKiAodGhlIHNjb3BlIHByb3h5IHdyaXRlcyBST09UIGtleXMpLiBgd29ya2luZ0NvcHlgIGtlZXBzIHRoZSByZWZlcmVuY2UsXG4gICAqIGFzIGl0IGFsd2F5cyBkaWQuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaEhlbGRBbmNlc3RvcnMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlbGRSZWZzLnNpemUgPT09IDApIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGF0aC5zbGljZSgwLCBpKTtcbiAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgoYW5jZXN0b3IpO1xuICAgICAgaWYgKCF0aGlzLmhlbGRSZWZzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGhlbGQgPSBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yKTtcbiAgICAgIGlmIChoZWxkICE9PSBudWxsICYmIHR5cGVvZiBoZWxkID09PSAnb2JqZWN0JykgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBhbmNlc3Rvciwgc3RydWN0dXJlZENsb25lKGhlbGQpKTtcbiAgICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGtleSBkZWxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKCMxM2MtQjsgYWJzb3JicyBiYWNrbG9nIEI4KS5cbiAgICpcbiAgICogU3RhZ2VzIEVYQUNUTFkgdGhlIHNhbWUgYnVmZmVyIG11dGF0aW9ucyBhcyBgc2V0KHBhdGgsIHVuZGVmaW5lZClgIOKAlFxuICAgKiBgd29ya2luZ0NvcHlgL2BvdmVyd3JpdGVQYXRjaGAgZ2V0IGFuIG93biBgdW5kZWZpbmVkYCBhdCB0aGUgcGF0aCAodGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZywgcHJlc2VydmluZyByZWFkIGJlaGF2aW9yIGFuZCB0aGUgZGVkdXAgZGlmZiBiYXNlXG4gICAqIGFjcm9zcyBtb2Rlcykg4oCUIGJ1dCByZWNvcmRzIHRoZSBvcCB2ZXJiIGFzIGAnZGVsZXRlJ2AuIEF0IGNvbW1pdDpcbiAgICogYCdmdWxsJ2AgbW9kZSBtYXBzIGl0IGJhY2sgdG8gYSBgJ3NldCdgIHRyYWNlIGVudHJ5IChieXRlLWlkZW50aWNhbCB0b1xuICAgKiB0b2RheSk7IGAnZGVsdGEnYCBtb2RlIGVtaXRzIGEgcmVhbCBgJ2RlbGV0ZSdgIGVudHJ5IHdob3NlIHJlcGxheVxuICAgKiBSRU1PVkVTIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGBrZXk6IHVuZGVmaW5lZGAgYmVoaW5kLlxuICAgKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBmaWx0ZXIgcmVhZHMgdGhhdCBzdGFnZWQgb3duIGB1bmRlZmluZWRgIGFzIEFCU0VOVFxuICAgKiAoYGRlZXBFcXVhbGAsIDkuMTkuMSkg4oCUIHNvIHVuZGVyIGAnZGVsdGEnYCwgd2hvc2UgY29tbWl0dGVkIHN0YXRlIHJlYWxseVxuICAgKiBsYWNrcyB0aGUga2V5LCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGluc2lkZSBhIGNvbnRhaW5lciB0aGUgc3RhZ2UgYWxzb1xuICAgKiByZS13cm90ZSBpcyB0aGUgbm8tb3AgaXQgaXMsIG5vdCBhIGBzZXRgIG9mIHRoZSB3aG9sZSBjb250YWluZXIuXG4gICAqL1xuICBkZWxldGUocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBgZGVlcFNtYXJ0TWVyZ2VgIGJ1aWxkcyBmcmVzaFxuICAgKiAgY29udGFpbmVycywgc28gbmVpdGhlciB0cmVlIGV2ZXIgaG9sZHMgdGhlIG1lcmdlIElOUFVUIGJ5IHJlZmVyZW5jZTtcbiAgICogIHRoZSBuZXN0ZWQtb3AgZGV0YWNoIGd1YXJkcyB0aGUgYW5jZXN0b3IgaXQgd3JpdGVzIElOVE8uXG4gICAqXG4gICAqICBUaGUgdmFsdWUgbWVyZ2VkIElOVE8gaXMgbWFkZSBwcml2YXRlIGZpcnN0IChgcHJpdmF0aXNlYCksIGFzIHRoZVxuICAgKiAgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBpdCBiZWZvcmUgOS4yOS4wLiBOb3Qgb25seSBmb3IgdGhlIHJlYWRzIHRoYXRcbiAgICogIGZvbGxvdzogYGRlZXBTbWFydE1lcmdlYCB1bmlvbnMgYXJyYXlzIEJZIFJFRkVSRU5DRSwgc28gd2hldGhlciBhblxuICAgKiAgZWxlbWVudCB0aGUgc3RhZ2UgcGFzc2VzIGluIGlzIFwiYWxyZWFkeSB0aGVyZVwiIGRlcGVuZHMgb24gd2hpY2ggb2JqZWN0c1xuICAgKiAgdGhlIGJhc2UgaG9sZHMg4oCUIGEgY29tbWl0dGVkIGFycmF5IHdvdWxkIGRlZHVwIGFuIGVsZW1lbnQgdGhlIHN0YWdlXG4gICAqICByZWFkIGZyb20gaXQgYmVmb3JlIGl0cyBmaXJzdCB3cml0ZSwgd2hlcmUgdGhlIHByaXZhdGUgY29weSAoYW5kXG4gICAqICA5LjI4LjApIGFwcGVuZHMgaXQuICovXG4gIG1lcmdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpID8/IHt9O1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBTbWFydE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgb3duKG1lcmdlZCwgdGhpcy5vd25lZCk7XG4gICAgaWYgKGlzQ29udGFpbmVyKG1lcmdlZCkpIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChtZXJnZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ21lcmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmllbGQtbGV2ZWwgcmVkYWN0aW9uICg5LjE5LjApOiBtYXJrIGRvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlIHN0YWdlZCBhdFxuICAgKiBgcGF0aGAgYXMgc2VjcmV0LCBzbyBgc2NydWJQYXRjaGAgc2NydWJzIHRoZW0gaW4gdGhlIGNvbW1pdCBsb2cgYW5kIHRoZVxuICAgKiBtaXJyb3IgdGhlIHNhbWUgd2F5IGEgd2hvbGUta2V5IHJlZGFjdGlvbiBpcyBzY3J1YmJlZC4gQSBmaWVsZCBpc1xuICAgKiByZWdpc3RlcmVkIGFzIGEgbGl0ZXJhbCBrZXkgQU5ELCB3aGVuIGRvdHRlZCwgYXMgdGhlIG5lc3RlZCBwYXRoIGl0XG4gICAqIG5hbWVzIOKAlCB3aGljaGV2ZXIgZXhpc3RzIGluIHRoZSBwYXRjaCBpcyB0aGUgb25lIGBzY3J1YlBhdGNoYCBmaW5kcy5cbiAgICogTWFya2VkIHBhdGhzIHN1cnZpdmUgY29tbWl0IG9ubHkgd2hpbGUgdGhlIG9wIHBhdGggdGhleSBzaXQgdW5kZXIgZG9lc1xuICAgKiAoc2VlIHtAbGluayBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzfSkuXG4gICAqL1xuICBtYXJrUmVkYWN0ZWRGaWVsZHMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgoWy4uLnBhdGgsIGZpZWxkXSkpO1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKCcuJykpIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgLi4uZmllbGQuc3BsaXQoJy4nKV0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHJlZGFjdGlvbiBtYXJrIGFkZHJlc3MgYW4gYXJyYXkgRUxFTUVOVCByaWdodCBiZWxvdyBgcGF0aGBcbiAgICogKGBsaXN0LjEudG9rZW5gKT8gQW4gYGFwcGVuZGAgcm93IHJlLWJhc2VzIHRoZSBpbmRpY2VzIG9udG8gdGhlIHRhaWwsIHNvXG4gICAqIHN1Y2ggYSBwYXRoIHRha2VzIHRoZSB3aG9sZS12YWx1ZSBgc2V0YCAoYGRlbHRhRW5jb2RpbmcgwrcgcHVzaFZhbHVlUm93YCkuXG4gICAqIEEgbWFyayBieSBOQU1FIGJlbG93IGFuIGFycmF5IChgb2JqLnlgKSBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiB0aGUgdGFpbFxuICAgKiBhcyBvbiB0aGUgd2hvbGUgdmFsdWUsIHNvIHRoZSBjb21wYWN0IHJvdyBzdGF5cyAoYnl0ZS1pZGVudGljYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWRCZWxvdyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXggPSBwYXRoICsgREVMSU07XG4gICAgZm9yIChjb25zdCBtYXJrZWQgb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoIW1hcmtlZC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmV4dCA9IG1hcmtlZC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdChERUxJTSlbMF07XG4gICAgICBpZiAoL14oMHxbMS05XVxcZCopJC8udGVzdChuZXh0KSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0ZWQgcGF0aHMgdGhhdCBzdXJ2aXZlIHRoZSBuZXQtY2hhbmdlIGZpbHRlcjogYSBwYXRoIHN1cnZpdmVzXG4gICAqIHdoZW4gaXQgSVMgYSBzdXJ2aXZpbmcgb3AgcGF0aCAoYSB3aG9sZS1rZXkgcmVkYWN0aW9uKSBvciBzaXRzIFVOREVSIG9uZVxuICAgKiAoYSBmaWVsZCBpbnNpZGUgYSBzdXJ2aXZpbmcgd3JpdGUpLiBBIGRyb3BwZWQgb3AgdGFrZXMgaXRzIGZpZWxkcyB3aXRoIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKHN1cnZpdmluZ1BhdGhzOiBTZXQ8c3RyaW5nPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgIG91dC5hZGQocGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcCBvZiBzdXJ2aXZpbmdQYXRocykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKG9wICsgREVMSU0pKSB7XG4gICAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gVGhlIHZhbHVlIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biDigJQgcHJpdmF0ZSB0byBpdCwgYXMgdGhlIHdob2xlLXN0YXRlIGNsb25lIG1hZGUgZXZlcnkgcmVhZFxuICAgKiBhZnRlciB0aGUgZmlyc3Qgd3JpdGUgYmVmb3JlIDkuMjkuMCAoYHByaXZhdGlzZWApLlxuICAgKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHRoaXMucHJpdmF0aXNlKHBhdGgpO1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgd29ya2luZyBjb3B5IGF0IGBwYXRoYCBXSVRIT1VUIHRha2luZyBhIHByaXZhdGUgY29weSDigJQgZm9yIGFcbiAgICogcmVhZGVyIHRoYXQgb25seSBjb21wYXJlcyAodGhlIGRldi1tb2RlIGJvcnJvd2VkLW11dGF0aW9uIHJlcG9ydCBpblxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdGApLCBuZXZlciBmb3IgYSB2YWx1ZSBoYW5kZWQgdG8gYSBzdGFnZS5cbiAgICovXG4gIHBlZWsocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCB1bmRlciBhIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyLlxuICAgKlxuICAgKiBXaGVuIGB3b3JraW5nQ29weWAgaG9sZHMgbm90aGluZyBhdCBgcGF0aGAg4oCUIHRoZSBzdGFnZSBkZWxldGVkIG9yIHVuc2V0XG4gICAqIGl0LCBvciBhIHdyaXRlIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0IOKAlCBgU3RhZ2VDb250ZXh0IMK3XG4gICAqIHJlYWRTdGF0ZWAgc2VydmVzIHRoZSByZWFkIGZyb20gTElWRSBjb21taXR0ZWQgc3RhdGUsIGV4YWN0bHkgYXMgOS4yOC4wXG4gICAqIGRpZCwgc28gdGhlIHZhbHVlIGl0IGhhbmRzIG91dCBpcyBjb21taXR0ZWQgc3RhdGUgaXRzZWxmLiBPbiA5LjI4LjAgdGhlXG4gICAqIGRpZmYgYmFzZSB3YXMgYSB3aG9sZS1zdGF0ZSBjbG9uZSB0YWtlbiBhdCB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSwgYW5kXG4gICAqIGFuIGluLXBsYWNlIGVkaXQgb2YgdGhhdCB2YWx1ZSAob3V0IG9mIGNvbnRyYWN0IOKAlCByZWFkcyBhcmUgYm9ycm93ZWQpXG4gICAqIGNvdWxkIG5vdCBtb3ZlIGl0OiB3cml0dGVuIGJhY2ssIHRoZSBlZGl0IHdhcyByZWNvcmRlZC4gSGVyZSB0aGUgZGlmZlxuICAgKiBiYXNlIElTIGEgY29tbWl0dGVkIGdlbmVyYXRpb24sIGFuZCBpdCB2ZXJ5IG9mdGVuIGhvbGRzIHRoYXQgc2FtZVxuICAgKiBjb250YWluZXIgYXQgYHBhdGhgIOKAlCB0aGUgZWRpdCB3b3VsZCBtb3ZlIHRoZSBiYXNlIHdpdGggaXQsIGFuZCB0aGVcbiAgICogd3JpdGUtYmFjayB3b3VsZCBjb21taXQgbm8gY2hhbmdlLiBTbyBiZWZvcmUgdGhlIHZhbHVlIGdvZXMgb3V0LCB0aGVcbiAgICogYmFzZSdzIHZhbHVlIGF0IGBwYXRoYCBpcyByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5ICh0aGUgYmFzZSdzXG4gICAqIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgY29waWVkIHNoYWxsb3dseSkg4oCUIHdoYXQgOS4yOC4wJ3NcbiAgICogYmFzZSBoZWxkIHRoZXJlLiBUaGUgY29tbWl0J3MgbmV0LWNoYW5nZSB0ZXN0IGNvbXBhcmVzIGFnYWluc3QgaXQgYW5kXG4gICAqIHRoZSBkZWx0YSBlbmNvZGVyIHJlcGxheXMgZnJvbSBpdDsgdGhlIHZhbHVlIGhhbmRlZCBvdXQgc3RheXMgdGhlIGxpdmVcbiAgICogb25lLCBzbyB3aGF0ZXZlciBlbHNlIGFuIGVkaXQgb2YgaXQgcmVhY2hlcyAobGl2ZSBzdGF0ZSwgdGhlIG5leHRcbiAgICogZ2VuZXJhdGlvbikgYmVoYXZlcyBhcyBvbiA5LjI4LjAgdG9vLlxuICAgKlxuICAgKiBOb3QgYHByaXZhdGlzZWA6IGEgcHJpdmF0ZSBjb3B5IGhhbmRlZCB0byB0aGUgc3RhZ2Ugd291bGQgYWxzbyBrZWVwIHRoZVxuICAgKiBlZGl0IG91dCBvZiBsaXZlIHN0YXRlLCB3aGVyZSA5LjI4LjAgbGV0IGl0IGluIOKAlCBhIHJ1bi1uYW1lc3BhY2VkIHJlYWRcbiAgICogdGhhdCBmYWxscyBiYWNrIHRvIGEgZ2xvYmFsIGtleSB3b3VsZCB0aGVuIGVuZCBkaWZmZXJlbnRseSAodGhlXG4gICAqIGRpZmZlcmVudGlhbCdzIE5FU1RFRCBmYW1pbHkgZmFpbHMgd2l0aGluIDEwMCBwcm9ncmFtcyB0aGF0IHdheSkuXG4gICAqXG4gICAqIENvcGllcyBub3RoaW5nIHdoZW4gdGhlIGJhc2UgaG9sZHMgbm8gY29udGFpbmVyIGF0IGBwYXRoYCwgYW5kIG5vdGhpbmdcbiAgICogdHdpY2U6IGEgcGF0aCBhdCBvciBiZWxvdyBhbiBlYXJsaWVyIGRldGFjaCBpcyBhbHJlYWR5IHByaXZhdGUuIE8ocGF0aClcbiAgICogb3RoZXJ3aXNlLCBwbHVzIE8odmFsdWUpIG9uY2UgcGVyIGRldGFjaGVkIHBhdGguXG4gICAqL1xuICBkZXRhY2hCYXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgfHwgIWlzQ29udGFpbmVyKHRoaXMuYmFzZVNuYXBzaG90KSkgcmV0dXJuO1xuICAgIGxldCBhdDogb2JqZWN0ID0gdGhpcy5iYXNlU25hcHNob3Q7XG4gICAgZm9yIChjb25zdCBrIG9mIHBhdGgpIHtcbiAgICAgIGlmICh0aGlzLmRldGFjaGVkQmFzZT8uaGFzKGF0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGNoaWxkKSkgcmV0dXJuO1xuICAgICAgYXQgPSBjaGlsZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgY29uc3Qgb3duZWQgPSAodGhpcy5iYXNlT3duZWQgPz89IG5ldyBXZWFrU2V0PG9iamVjdD4oKSk7XG4gICAgaWYgKCFvd25lZC5oYXModGhpcy5iYXNlU25hcHNob3QpKSB0aGlzLmJhc2VTbmFwc2hvdCA9IG93bmVkUm9vdE9mKHRoaXMuYmFzZVNuYXBzaG90LCBvd25lZCk7XG4gICAgb3duU3BpbmUodGhpcy5iYXNlU25hcHNob3QsIHBhdGgsIG93bmVkKTtcbiAgICBjb25zdCBjb3B5OiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYXQpO1xuICAgICh0aGlzLmRldGFjaGVkQmFzZSA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKS5hZGQoY29weSk7XG4gICAgX3NldCh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgY29weSk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSByZWFkcyAoOS4yOS4wKTogbWFrZSB0aGUgdmFsdWUgYXQgYHBhdGhgIHRoZSBzdGFnZSdzIG93biBiZWZvcmVcbiAgICogYSByZWFkIGhhbmRzIGl0IG91dCDigJQgc28gYSByZWFkIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIGJlaGF2ZXNcbiAgICogZXhhY3RseSBhcyBpdCBkaWQgd2hlbiB0aGUgYnVmZmVyIGJlZ2FuIHdpdGggYSBkZWVwIGNsb25lIG9mIHRoZSB3aG9sZVxuICAgKiBzdGF0ZS4gQW4gaW4tcGxhY2UgZWRpdCBvZiB3aGF0IHRoZSByZWFkIHJldHVybmVkIChvdXQgb2YgY29udHJhY3Qg4oCUXG4gICAqIHJlYWRzIGFyZSBib3Jyb3dlZCkgc3RheXMgaW5zaWRlIHRoZSBidWZmZXIsIGFuZCBjb21taXR0ZWQgc3RhdGUgaXMgbmV2ZXJcbiAgICogdG91Y2hlZC4gV2hldGhlciB0aGUgUkVDT1JEIGtlZXBzIGl0IGlzIHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXdcbiAgICogKDkuMzAuMCwgb3duZXIgcnVsaW5nIFIxIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHdoYXQgdGhlIHN0YWdlIHJlYWQgYmFjayk6IGl0XG4gICAqIGlzIGtlcHQgd2hlbiB0aGUgZWRpdGVkIHZhbHVlIGxpZXMgYXQgb3IgYmVsb3cgYSBwYXRoIHRoZSBzdGFnZSB3cm90ZSBpblxuICAgKiB0aGlzIHN0YWdlIOKAlCBzZXQsIG1lcmdlZCBvciB3cml0dGVuIGJhY2sgYWxpa2Ug4oCUIGFuZCBsb3N0IG90aGVyd2lzZS5cbiAgICpcbiAgICogV2Fsa2luZyB0aGUgcGF0aCBmcm9tIHRoZSAob3duZWQpIHJvb3Q6XG4gICAqICAtIGEgY29udGFpbmVyIHN0aWxsIFNIQVJFRCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpc1xuICAgKiAgICByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5IHdoZW4gaXQgaXMgdGhlIHZhbHVlIHJlYWQsIG9yIGJ5IGFcbiAgICogICAgc2hhbGxvdyBjb3B5IHdoZW4gaXQgaXMgYSBjb250YWluZXIgb24gdGhlIHdheSB0byBpdCAoc28gYSByZWFkIG9mXG4gICAqICAgIGBydW5zLzxpZD4va2AgY29waWVzIGBrYCwgbm90IGV2ZXJ5IHJ1bidzIG5hbWVzcGFjZSk7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBzdGFnZSBTVEFHRUQgKG9yIGFueXRoaW5nIGVsc2UgdGhlIGJ1ZmZlciBkaWQgbm90XG4gICAqICAgIHRha2UgZnJvbSBjb21taXR0ZWQgc3RhdGUpIGlzIGhhbmRlZCBiYWNrIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlO1xuICAgKiAgLSBhIGNvbnRhaW5lciB0aGUgYnVmZmVyIG93bnMgaXMgd2Fsa2VkIG9uIOKAlCBhbmQgd2hlbiBpdCBpcyB0aGUgdmFsdWVcbiAgICogICAgcmVhZCwgaXRzIHN0aWxsLXNoYXJlZCBkZXNjZW5kYW50cyBhcmUgcHJpdmF0aXNlZFxuICAgKiAgICAoe0BsaW5rIHByaXZhdGlzZUJlbG93fSkuXG4gICAqXG4gICAqIENvc3Q6IE8ocGF0aCkgcGVyIHJlYWQsIHBsdXMgTyh2YWx1ZSkgT05DRSBwZXIgc2hhcmVkIGNvbnRhaW5lciBhIHN0YWdlXG4gICAqIHJlYWRzIGFmdGVyIGl0cyBmaXJzdCB3cml0ZS4gQSBzdGFnZSB0aGF0IG5ldmVyIHJlYWRzIGFmdGVyIHdyaXRpbmcgcGF5c1xuICAgKiBub3RoaW5nOyBhIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBuZXZlciByZWFjaGVzIHRoZSBidWZmZXIuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgLy8gUmVzb2x2ZSBmaXJzdDogYSByZWFkIHRoYXQgbGFuZHMgb24gbm90aGluZyAoYSBtaXNzaW5nIGtleSwgYSByZWZ1c2VkXG4gICAgLy8gc2VnbWVudCwgYSBwcmltaXRpdmUpIHJldHVybnMgbm90aGluZyBhbmQgbXVzdCBjb3B5IG5vdGhpbmcuXG4gICAgY29uc3QgY2hhaW46IG9iamVjdFtdID0gW107XG4gICAgbGV0IGF0OiB1bmtub3duID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgYXQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGF0KSkgcmV0dXJuO1xuICAgICAgY2hhaW4ucHVzaChhdCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMud29ya2luZ0NvcHk7XG4gICAgbGV0IGJhc2U6IHVua25vd24gPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQoYmFzZSwgayk7XG4gICAgICBsZXQgdmFsdWUgPSBjaGFpbltpXTtcbiAgICAgIGlmICghdGhpcy5vd25lZC5oYXModmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gYXRCYXNlIHx8IHRoaXMuc3RhZ2VkLmhhcyh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKGkgPT09IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBhcmVudFtrXSA9IHRoaXMucHJpdmF0ZUNvcHlPZih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm93bmVkLmFkZCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudFtrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gdmFsdWU7XG4gICAgICBiYXNlID0gYXRCYXNlO1xuICAgIH1cbiAgICB0aGlzLnByaXZhdGlzZUJlbG93KHBhcmVudCwgYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gT1dORUQgY29udGFpbmVyIGlzIGFib3V0IHRvIGJlIHJlYWQgd2hvbGUgKGEgcGF0aCBjb3B5IGEgbmVzdGVkIHdyaXRlXG4gICAqIG1hZGUsIHNheSk6IGl0cyBkZXNjZW5kYW50cyBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXJlXG4gICAqIHJlcGxhY2VkIGJ5IHByaXZhdGUgZGVlcCBjb3BpZXMsIHNvIG5vdGhpbmcgdGhlIHJlYWQgaGFuZHMgb3V0IGlzXG4gICAqIGNvbW1pdHRlZCBzdGF0ZS4gV2Fsa3Mgb3duZWQgY29udGFpbmVycyBvbmx5OyBtYXJrcyBlYWNoIG9uZSBmaW5pc2hlZFxuICAgKiAoe0BsaW5rIHByaXZhdGVUcmVlc30pLCBzbyBhIGNvbnRhaW5lciBpcyBzY2FubmVkIG9uY2UgcGVyIHN0YWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2VCZWxvdyhjb250YWluZXI6IG9iamVjdCwgYmFzZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHdvcms6IEFycmF5PFtvYmplY3QsIHVua25vd25dPiA9IFtbY29udGFpbmVyLCBiYXNlXV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW25vZGUsIG5vZGVCYXNlXSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKHRoaXMucHJpdmF0ZVRyZWVzLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKG5vZGUsIGtleSk7XG4gICAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQobm9kZUJhc2UsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLm93bmVkLmhhcyhjaGlsZCkpIHdvcmsucHVzaChbY2hpbGQsIGF0QmFzZV0pO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCA9PT0gYXRCYXNlICYmICF0aGlzLnN0YWdlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB0aGlzLnByaXZhdGVDb3B5T2YoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgcHJpdmF0ZSBkZWVwIGNvcHkgb2YgYSBjb21taXR0ZWQgY29udGFpbmVyIOKAlCBvd25lZCB0aHJvdWdoIGFuZCB0aHJvdWdoLiAqL1xuICBwcml2YXRlIHByaXZhdGVDb3B5T2YodmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgYWRvcHQoY29weSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5wcml2YXRlVHJlZXMuYWRkKGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCBhbnkgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCwgb3IgYSBwYXRoIGFib3ZlIG9yIGJlbG93IGl0P1xuICAgKlxuICAgKiBUaGUgZGV2LW1vZGUgYm9ycm93ZWQtcmVhZCBjaGVjayAoYFN0YWdlQ29udGV4dC5jb21taXRgKSBhc2tzIHRoaXMgYmVmb3JlXG4gICAqIGFjY3VzaW5nIGEgc3RhZ2Ugb2YgbXV0YXRpbmcgYSB2YWx1ZSBpbiBwbGFjZTogYSBrZXkgdGhlIHN0YWdlIGxlZ2l0aW1hdGVseVxuICAgKiBXUk9URSBpcyBleHBlY3RlZCB0byBkaWZmZXIgZnJvbSB3aGF0IGl0IHJlYWQsIGFuZCB3cml0ZXMgcmVhY2ggdGhlIGJ1ZmZlclxuICAgKiBmcm9tIHBhdGhzIHRoYXQgYnlwYXNzIHVzZXItbGV2ZWwgd3JpdGUgdHJhY2tpbmcgdG9vICh0aGUgc3ViZmxvdyBzZWVkLFxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCB0aGUgcmVzdW1lIHJlLXNlZWQpLiBEZXYtbW9kZSBvbmx5IOKAlCBub3RoaW5nIG9uXG4gICAqIHRoZSBob3QgcGF0aCBjYWxscyBpdC5cbiAgICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgLy8gT24gdGhlIHBhdGgsIGJlbG93IGl0IG9yIGFib3ZlIGl0IOKAlCB0aGUgb25lIHBhdGggcmVsYXRpb24gZXZlcnkga2V5IHF1ZXJ5IGFza3MuXG4gICAgICBpZiAocmVsYXRpb24ob3AucGF0aCwgdGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gdGhpcy5zdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKG5ldyBTZXQocm93cy50cmFjZS5tYXAoKHQpID0+IHQucGF0aCkpKTtcbiAgICAvLyBUaGUgYnVuZGxlJ3Mga2V5IG9yZGVyIGlzIGByZWNvcmRDb21taXRgJ3M7IGEgZGlyZWN0IGNhbGxlciBrZWVwcyB0aGlzIHNhbWUgb3JkZXIuXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgb3ZlcndyaXRlOiByb3dzLm92ZXJ3cml0ZSwgdXBkYXRlczogcm93cy51cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZTogcm93cy50cmFjZSB9O1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLmhlbGRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuICAgIHRoaXMub3duZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMub3duZWQuYWRkKHRoaXMud29ya2luZ0NvcHkpO1xuICAgIHRoaXMuc3RhZ2VkID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5zdGFnZWRNZXJnZXMgPSAwO1xuICAgIHRoaXMubmVzdGVkT3BzID0gMDtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAsXG4gICAqIGtlZXBpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIOKAlCBhbmQgdGhlIHJlc3VsdCBpcyBBRE1JVFRFRCAoe0BsaW5rIGFkbWl0fSk6XG4gICAqIGEgZmFtaWx5IG9mIHJvd3Mgd2hvc2UgcmVwbGF5IGRvZXMgbm90IGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGlzXG4gICAqIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHJlYWQtYmFjayBpbnN0ZWFkICg5LjMwLjApLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBERUZBVUxUIChgY29tbWl0VmFsdWVzOiAnZnVsbCdgKSBwYXlsb2FkLCBpbmNsdWRpbmcgdGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZyBvZiBzdGFnZWQgYGRlbGV0ZWAgb3BzIGludG8gYHNldGAtb2YtYHVuZGVmaW5lZGBcbiAgICogdHJhY2UgZW50cmllcy4gVGhlIGRlbHRhIGVuY29kaW5nIGxpdmVzIGluIHtAbGluayB0b0RlbHRhUGF5bG9hZH0uXG4gICAqXG4gICAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogdGhlIG5ldC1jaGFuZ2UgdmVyZGljdCBpcyBwYWlkIG9uY2UgcGVyIFBBVEhcbiAgICogYW5kIHRoZSBjbG9uZSBvbmNlIHBlciBDT05TRUNVVElWRSBydW4gb2Ygb3BzIG9uIGEgcGF0aCwgbm90IG9uY2UgcGVyIG9wXG4gICAqIOKAlCBzZWUgdGhlIHR3byBtZW1vcyBpbnNpZGUuIFBpbm5lZCBieVxuICAgKiB0ZXN0L2xpYi9tZW1vcnkvc2NlbmFyaW8vcmVwZWF0ZWQtcGF0aC1ieXRlLWlkZW50aXR5LnRlc3QudHMgYWdhaW5zdCB0aGVcbiAgICogOS4yMi4wIGJ5dGVzLiBTaW5jZSA5LjIzLjAgdGhhdCBjbG9uZSBpcyBUSEUgY2xvbmU6IHRoZSBwYXRjaCB0cmVlcyBob2xkXG4gICAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2VzIChzZWUgdGhlIGNsYXNzIGhlYWRlciksIHNvIHRoaXMgbG9vcCBpcyB0aGUgb25lXG4gICAqIHBsYWNlIHRoZSByZWNvcmQgaXMgZGV0YWNoZWQgZnJvbSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IFJvd3Mge1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5jaGFuZ2VPbmx5Um93cyhsb3NzeSkpO1xuICB9XG5cbiAgLyoqIFRoZSAnZnVsbCcgcm93czsgYSBmYW1pbHkgaW4gYGxvc3N5YCBpcyB3cml0dGVuIGFzIGl0cyByZWFkLWJhY2ssIGF0IGl0cyBsYXN0IHRvdWNoICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkuICovXG4gIHByaXZhdGUgY2hhbmdlT25seVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICAvLyBQZXIgUEFUSCwgZGVjaWRlZCBvbmNlICg5LjIyLjEpOiBiYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmUgZml4ZWQgYXRcbiAgICAvLyBjb21taXQsIHNvIGV2ZXJ5IGxhdGVyIG9wIG9uIGEgcGF0aCBnZXRzIHRoZSB2ZXJkaWN0IGl0cyBmaXJzdCBvcCBnb3QuXG4gICAgLy8gYHVuZGVmaW5lZGAgPSBub3QgeWV0IGRlY2lkZWQ7IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYXJlIHRoZSBgdHJ1ZWAga2V5cy5cbiAgICBjb25zdCBzdXJ2aXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIC8vIFRoZSBwYXRoIHRoZSBMQVNUIHN1cnZpdmluZyBvcCBjb3BpZWQgaW50byBlYWNoIHBhdGNoIHRyZWUgKDkuMjIuMSkuXG4gICAgLy8gVGhlIHZhbHVlIGF0IGEgcGF0aCBpcyBmaXhlZCBhdCBjb21taXQsIHNvIGFuIG9wIHdob3NlIHByZWRlY2Vzc29yIG9uXG4gICAgLy8gdGhlIFNBTUUgdHJlZSBhbHJlYWR5IGNvcGllZCB0aGF0IHBhdGggd291bGQgd3JpdGUgdGhlIHNhbWUgYnl0ZXMgb3ZlclxuICAgIC8vIHRoZSBzYW1lIGtleSDigJQgaXQga2VlcHMgaXRzIHRyYWNlIHJvdyAodGhlIGxvZyBpcyBieXRlLWlkZW50aWNhbCkgYW5kXG4gICAgLy8gcGF5cyBubyBzZWNvbmQgY2xvbmUuIFRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgc3RhZ2VzIE5cbiAgICAvLyB3aG9sZS1hcnJheSBzZXRzIG9uIE9ORSBwYXRoOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhhdCBjb21taXQgTyhOKVxuICAgIC8vIGluc3RlYWQgb2YgTyhOIMOXIG9wcykuIENPTlNFQ1VUSVZFIG9ubHkg4oCUIGFuIG9wIG9uIGFub3RoZXIgcGF0aCBpblxuICAgIC8vIGJldHdlZW4gbWF5IGhhdmUgY29lcmNlZCBvciBncm93biB0aGlzIG9uZSdzIGNvbnRhaW5lciAoYSBkZXNjZW5kYW50XG4gICAgLy8gYG5hdGl2ZVNldGAgdGhyb3VnaCBhIHByaW1pdGl2ZSwgYSBga2V5OiB1bmRlZmluZWRgIHNoZWxsKSBhbmQgdGhlXG4gICAgLy8gcmUtY29weSBpcyB3aGF0IHJlcGFpcnMgaXQ7IGEgYG1lcmdlYCBiZXR3ZWVuIHR3byBzZXRzIHRvdWNoZXMgdGhlXG4gICAgLy8gb3RoZXIgdHJlZSBhbmQgZG9lcyBub3QgY291bnQuIFNhbWUgbGF3IGFzIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAgICBsZXQgbGFzdFNldFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdE1lcmdlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgZmFtaWx5ID0gbG9zc3k/LmZhbWlsaWVzLmdldChsb3NzeS5yb290T2YuZ2V0KG9wLnBhdGgpIGFzIHN0cmluZyk7XG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGkgPT09IGZhbWlseS5zbG90KSB7XG4gICAgICAgICAgdGhpcy5lbWl0UmVhZEJhY2soZmFtaWx5LCByb3dzLCAnZnVsbCcpO1xuICAgICAgICAgIGxhc3RTZXRQYXRoID0gbGFzdE1lcmdlUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBrZWVwID0gc3Vydml2ZXMuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGtlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZWVwID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKTtcbiAgICAgICAgc3Vydml2ZXMuc2V0KG9wLnBhdGgsIGtlZXApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZWVwKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcblxuICAgICAgdHJhY2UucHVzaChmbGF0dGVuZWRUcmFjZVJvdyhvcCkpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgaWYgKGxhc3RNZXJnZVBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0TWVyZ2VQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFNldFBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0U2V0UGF0aCA9IG9wLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0aHJlZSBlbmNvZGluZyBkaWZmZXJlbmNlczpcbiAgICpcbiAgICogMS4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKHRoZSDCpzIuNSBkZWR1cCBydWxlIOKAlCBgYXBwZW5kYFxuICAgKiAgICBpcyBOT1QgaWRlbXBvdGVudCBvbiByZXBsYXksIHNvIGR1cGxpY2F0ZSBlbnRyaWVzIHdvdWxkIG11bHRpcGx5XG4gICAqICAgIHRhaWxzKS4gVGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIG9wIG1peCArIGJhc2XihpJmaW5hbFxuICAgKiAgICByZWxhdGlvbnNoaXA7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaCxcbiAgICogICAgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMuXG4gICAqIDIuICoqVmVyYiByZXNvbHV0aW9uIHBlciBwYXRoKiog4oCUIGZvciBhIHBhdGggd2l0aCBOTyBzdXJ2aXZpbmcgcmVsYXRpdmVcbiAgICogICAgKHNlZSAzKTpcbiAgICogICAgLSBsYXN0IG9wIGAnZGVsZXRlJ2AgQU5EIGZpbmFsIHZhbHVlIGdvbmUg4oaSIGBkZWxldGVgICh0aGUgcGF0aCBzdGF5c1xuICAgKiAgICAgIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWAgd2l0aCBgdW5kZWZpbmVkYCBmb3Iga2V5LXNldCBjb25zdW1lcnMpLlxuICAgKiAgICAgIFJlcXVpcmVzIHRoZSBwYXJlbnQgdG8gYmUgYSByZWFsIGNvbnRhaW5lciBpbiB0aGUgYmFzZSDigJQgcmVwbGF5IHVzZXNcbiAgICogICAgICBgbmF0aXZlRGVsZXRlYCwgd2hpY2ggaXMgaW5lcnQgb24gYSBwcmltaXRpdmUvYWJzZW50IHBhcmVudCwgd2hlcmVhc1xuICAgKiAgICAgIHRoZSBgJ2Z1bGwnYCBmbGF0dGVuaW5nIChgX3NldGAgb2YgYHVuZGVmaW5lZGApIENPRVJDRVMgdGhhdCBwYXJlbnRcbiAgICogICAgICBpbnRvIGFuIG9iamVjdDsgd2hlbiB0aGV5IHdvdWxkIGRpc2FncmVlIHdlIGtlZXAgdGhlIGZsYXR0ZW5pbmc7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YTtcbiAgICogICAgLSBvdGhlcndpc2UgKGBzZXRgL21peGVkKTogdGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgdGhlXG4gICAqICAgICAgcGF0aCAoe0BsaW5rIGZ1bGxSb3dzVmFsdWV9KS4gSWYgYmFzZSBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZFxuICAgKiAgICAgIGJhc2UgaXMgYSBTVFJJQ1QgUFJFRklYIOKGkiBgYXBwZW5kYCBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGBcbiAgICogICAgICBzdG9yaW5nIHRoZSBmdWxsIHZhbHVlLlxuICAgKiAzLiAqKk9WRVJMQVAgRkFNSUxJRVMgdGFrZSB0aGUgZnVsbC12YWx1ZSBmYWxsYmFjay4qKiBgb3ZlcndyaXRlYCAvXG4gICAqICAgIGB1cGRhdGVzYCBhcmUgbmVzdGVkIHBhdGggVFJFRVMsIHNvIHR3byBzdXJ2aXZpbmcgcGF0aHMgd2hlcmUgb25lIGlzXG4gICAqICAgIGFuIGFuY2VzdG9yIG9mIHRoZSBvdGhlciAoYGFgIGFuZCBgYS5wYCkgc2hhcmUgc3RvcmFnZS4gRGVsdGEnc1xuICAgKiAgICBwZXItcGF0aCBlbmNvZGluZ3Mgd291bGQgY2xvYmJlciBlYWNoIG90aGVyIHRoZXJlIChhbiBgYXBwZW5kYFxuICAgKiAgICBhbmNlc3RvciBzdG9yZXMgb25seSBhIFRBSUwsIGEgYGRlbGV0ZWAgYW5jZXN0b3IgYHVuZGVmaW5lZGApLCBzbyBldmVyeVxuICAgKiAgICBwYXRoIHRoYXQgaGFzIGEgc3Vydml2aW5nIGFuY2VzdG9yL2Rlc2NlbmRhbnQgaXMgY29tbWl0dGVkIGFzIGEgcGxhaW5cbiAgICogICAgYHNldGAgb2YgdGhlIHZhbHVlIHRoZSAnZnVsbCcgcm93cyBnaXZlIGl0LCBhbmQgdGhlIGZhbWlseSdzXG4gICAqICAgIHNoYWxsb3dlc3QgcGF0aCAod2hvc2Ugc2V0IGNvdmVycyB0aGUgd2hvbGUgc3VidHJlZSkgaXMgZW1pdHRlZCBMQVNULlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KSBsaWtlIHRoZSAnZnVsbCcgcGF5bG9hZDogYSBjb21wYWN0XG4gICAqIHJvdyBpcyBrZXB0IG9ubHkgd2hlcmUgdGhlIGJ1bmRsZSBwcm92YWJseSBmb2xkcyBiYWNrLCBhbmQgYSBmYW1pbHkgdGhhdFxuICAgKiBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBTbyBib3RoIGVuY29kaW5ncyBjb21taXQgdGhlXG4gICAqIHZhbHVlIHRoZSBzdGFnZSByZWFkOyBiZWZvcmUgOS4zMC4wIHRoZXkgc2hhcmVkIGEgcmVwbGF5IHRoYXQgZGlkIG5vdFxuICAgKiAoYHJlcGxheVBhdGhWZXJic2AgLyBgcmVwbGF5RmFtaWx5VmVyYnNgLCBkZWxldGVkKS5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKTogUm93cyB7XG4gICAgY29uc3QgZnVsbFZhbHVlQXQgPSB0aGlzLmZ1bGxSb3dzVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5hZG1pdCgobG9zc3kpID0+IHRoaXMuZGVsdGFSb3dzKGxvc3N5LCBmdWxsVmFsdWVBdCkpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWx0YSByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBkZWx0YVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkLCBmdWxsVmFsdWVBdDogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93bik6IFJvd3Mge1xuICAgIGNvbnN0IHJvd3M6IFJvd3MgPSB7IG92ZXJ3cml0ZToge30sIHVwZGF0ZXM6IHt9LCB0cmFjZTogW10gfTtcbiAgICBjb25zdCB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UgfSA9IHJvd3M7XG4gICAgY29uc3QgaW5Mb3NzeSA9IChwYXRoOiBzdHJpbmcpID0+IGxvc3N5Py5mYW1pbGllcy5oYXMobG9zc3kucm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpID09PSB0cnVlO1xuICAgIGNvbnN0IHN1cnZpdm9ycyA9IHRoaXMubmV0Q2hhbmdlU3Vydml2b3JzKHRoaXMub3BzQnlQYXRoKCkpLmZpbHRlcigocykgPT4gIWluTG9zc3kocy5wYXRoKSk7XG4gICAgY29uc3QgeyByb290T2YsIGJ5Um9vdCB9ID0gZ3JvdXBJbnRvRmFtaWxpZXMoc3Vydml2b3JzLCBuZXcgU2V0KHN1cnZpdm9ycy5tYXAoKHMpID0+IHMucGF0aCkpKTtcblxuICAgIC8vIFRIRSBWRVJCIENIT0lDRSDigJQgdGhlIGRlbHRhIGVuY29kZXIgcGlja3MgYSB2ZXJiIHBlciBwYXRoOyB0aGUgVkFMVUVTXG4gICAgLy8gaXQgZW5jb2RlcyBjb21lIGZyb20gdGhlIG9uZSByZXBsYXkgKGBmdWxsVmFsdWVBdGApLCBuZXZlciBhIHJlcGxpY2Egb2ZcbiAgICAvLyB0aGUgdmVyYiBsYXcgKDkuMzAuMDogQ0xBVURFLm1kJ3MgdmVyYi1zd2l0Y2ggcmVwbGljYXMgbG9zdCB0d28gaGVyZSkuXG4gICAgY29uc3QgZW1pdCA9IChzOiBTdXJ2aXZvcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBzZWdtZW50cywgdmVyYnMsIGJlZm9yZSB9ID0gcztcbiAgICAgIGNvbnN0IHByb3YgPSBwcm92ZW5hbmNlKHMucmVhZEtleXMpO1xuICAgICAgaWYgKChieVJvb3QuZ2V0KHJvb3RPZi5nZXQocGF0aCkgYXMgc3RyaW5nKSBhcyBTdXJ2aXZvcltdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJ1bGUgMyDigJQgb25lIGNvaGVyZW50IHRyZWU6IGV2ZXJ5IG1lbWJlciBhIHNldCBvZiBpdHMgdmFsdWUuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoZnVsbFZhbHVlQXQoc2VnbWVudHMpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RWZXJiID0gdmVyYnNbdmVyYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdFZlcmIgPT09ICdkZWxldGUnICYmIHMuYWZ0ZXIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlbGV0ZVJlcGxheXNBc0ZsYXR0ZW5pbmcoc2VnbWVudHMpKSB7XG4gICAgICAgIC8vIFJlYWwgZGVsZXRpb24g4oCUIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuIEtlZXAgdGhlIHBhdGggZW51bWVyYXRlZFxuICAgICAgICAvLyBpbiBgb3ZlcndyaXRlYCAodW5kZWZpbmVkKSBzbyBPYmplY3Qua2V5cyBjb25zdW1lcnMgc2VlIGl0LlxuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ2RlbGV0ZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAodmVyYnMuZXZlcnkoKHYpID0+IHYgPT09ICdtZXJnZScpKSB7XG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnbWVyZ2UnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hWYWx1ZVJvdyhyb3dzLCBwYXRoLCBzZWdtZW50cywgYmVmb3JlLCBmdWxsVmFsdWVBdChzZWdtZW50cyksIHByb3YsIHRoaXMubWFya2VkQmVsb3cocGF0aCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGZhbWlseSB0aGF0IGRpZCBub3QgZm9sZCBiYWNrIHRha2VzIGl0cyBwbGFjZSBieSBpdHMgbGFzdCB0b3VjaC5cbiAgICBjb25zdCBwZW5kaW5nID0gbG9zc3kgPT09IHVuZGVmaW5lZCA/IFtdIDogWy4uLmxvc3N5LmZhbWlsaWVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBhLnNsb3QgLSBiLnNsb3QpO1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBjb25zdCBmbHVzaEJlZm9yZSA9ICh0b3VjaDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB3aGlsZSAobmV4dCA8IHBlbmRpbmcubGVuZ3RoICYmIHBlbmRpbmdbbmV4dF0uc2xvdCA8IHRvdWNoKSB0aGlzLmVtaXRSZWFkQmFjayhwZW5kaW5nW25leHQrK10sIHJvd3MsICdkZWx0YScpO1xuICAgIH07XG4gICAgZW1pdEluRmFtaWx5T3JkZXIoc3Vydml2b3JzLCByb290T2YsIGJ5Um9vdCwgZW1pdCwgZmx1c2hCZWZvcmUpO1xuICAgIGZsdXNoQmVmb3JlKEluZmluaXR5KTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgYWRtaXR0ZWQgcmVjb3JkICg5LjMwLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUSEUgQURNSVNTSU9OIOKAlCBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGVcbiAgICogc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZC4gYGJ1aWxkYFxuICAgKiBsYXlzIHRoZSByb3dzIG91dCAob25lIGVuY29kZXI6IGAnZnVsbCdgIG9yIGAnZGVsdGEnYCk7IHRoZSBjYW5kaWRhdGUgaXNcbiAgICogY2hlY2tlZCAoe0BsaW5rIGxvc3N5RmFtaWxpZXN9KSwgYW5kIHdoZW4gc29tZSBmYW1pbHkncyByb3dzIGRvIG5vdCBmb2xkXG4gICAqIGJhY2sgdGhlIHJvd3MgYXJlIGxhaWQgb3V0IGFnYWluIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZVxuICAgKiBzdGFnZSByZWFkICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkg4oCUIGV2ZXJ5IG90aGVyIGZhbWlseSdzIGJ5dGVzIGV4YWN0bHkgYXNcbiAgICogdGhlIGZpcnN0IGxheW91dCBtYWRlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KGJ1aWxkOiAobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKSA9PiBSb3dzKTogUm93cyB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYnVpbGQodW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb3NzeSA9IHRoaXMubG9zc3lGYW1pbGllcyhjYW5kaWRhdGUpO1xuICAgIHJldHVybiBsb3NzeSA9PT0gdW5kZWZpbmVkID8gY2FuZGlkYXRlIDogYnVpbGQobG9zc3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYW1pbGllcyB3aG9zZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGUgc3RhZ2UgcmVhZCDigJRcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAoYGFkbWlzc2lvbi50cyDCtyBsb3NzeUZhbWlsaWVzYDogdGhlXG4gICAqIGNhbmRpZGF0ZSByZXBsYXllZCBvbnRvIHRoZSBkaWZmIGJhc2UgYnkgYGRyeUZvbGRgLCBldmVyeSBmYW1pbHkgb2ZcbiAgICogdG91Y2hlZCBwYXRocyBjb21wYXJlZCB3aXRoIHRoZSB3b3JraW5nIGNvcHkgYXQgaXRzIHJvb3QgYW5kIG9uIHRoZSB3YXlcbiAgICogZG93biB0byBpdCkuXG4gICAqXG4gICAqIFdpdGhvdXQgYSBmb2xkLCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wOiBpdHNcbiAgICogcm93cyBhcmUgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyIGl0cyBhZGRyZXNzLCBlYWNoXG4gICAqIHdyaXRpbmcgdGhlIFNBTUUgdmFsdWUgaW50byBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIOKAlCB0aGVcbiAgICogcmVjb3JkIGlzIHRoZSByZWFkLWJhY2sgYnkgY29uc3RydWN0aW9uICh0aGUgcHJvcGVydHkncyBST09ULU9OTFkgYXJtXG4gICAqIHBpbnMgdGhpcykuIFRoYXQga2VlcHMgdGhlIGNvbW1pdCBvZiB0aGUgdHlwZWQgc2NvcGUncyByb290LWtleSB3cml0ZXNcbiAgICogZXhhY3RseSBhcyBjaGVhcCBhcyBpdCB3YXMuXG4gICAqL1xuICBwcml2YXRlIGxvc3N5RmFtaWxpZXMoY2FuZGlkYXRlOiBSb3dzKTogTG9zc3kgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN0YWdlZE1lcmdlcyA9PT0gMCAmJiB0aGlzLm5lc3RlZE9wcyA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbG9zc3lGYW1pbGllcyhjYW5kaWRhdGUsIHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLndvcmtpbmdDb3B5LCB0aGlzLm9wVHJhY2UsIHRoaXMuYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYW1pbHkgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkOlxuICAgKiBvbmUgYHNldGAgcm93IHBlciBtZW1iZXIgdGhhdCBjaGFuZ2VkIChkZXNjZW5kYW50cyBieSBsYXN0IHRvdWNoLCBlYWNoXG4gICAqIHdpdGggaXRzIG93biByZWFkIHByZWZpeCksIHRoZSBST09UIGxhc3QsIGFuZCB0aGUgcm9vdCdzIHJlYWQtYmFjayB2YWx1ZVxuICAgKiBpbiBgb3ZlcndyaXRlYCDigJQgb25lIGNvaGVyZW50IHRyZWUsIHNvIG5vIHJvdyBjYW4gY2xvYmJlciBhbm90aGVyLiBUaGVcbiAgICogcm9vdCdzIHJvdyBpcyB3cml0dGVuIGV2ZW4gd2hlbiB0aGUgcm9vdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2U6IGl0IGlzIHRoZVxuICAgKiByb3cgdGhhdCBjYXJyaWVzIHRoZSBmYW1pbHkncyByZWFkLWJhY2sgKGFuZCB0aGUgY29udGFpbmVycyBMLTEncyBkcm9wcGVkXG4gICAqIG9wIGxlZnQpLiBBIGxvbmUgcm9vdCB1bmRlciBgJ2RlbHRhJ2Aga2VlcHMgdGhlIGNvbXBhY3QgYGFwcGVuZGAgd2hlbiB0aGVcbiAgICogdmFsdWUgaXQgcmVhZCBpcyBpdHMgYmFzZSBwbHVzIGEgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgZW1pdFJlYWRCYWNrKGZhbWlseTogRmFtaWx5LCByb3dzOiBSb3dzLCBlbmNvZGluZzogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIGxldCByb290OiBNZW1iZXIgPSBmYW1pbHkubWVtYmVyc1swXTtcbiAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGZhbWlseS5tZW1iZXJzKSB7XG4gICAgICBpZiAobS5wYXRoID09PSBmYW1pbHkucm9vdCkge1xuICAgICAgICByb290ID0gbTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShtLnBhdGguc3BsaXQoREVMSU0pKSkgY29udGludWU7XG4gICAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoOiBtLnBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKG0ucmVhZEtleXMpIH0pO1xuICAgICAgY2hhbmdlZCsrO1xuICAgIH1cbiAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgaWYgKGVuY29kaW5nID09PSAnZGVsdGEnICYmIGNoYW5nZWQgPT09IDAgJiYgYWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgICBwdXNoVmFsdWVSb3coXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGZhbWlseS5yb290LFxuICAgICAgICBmYW1pbHkucm9vdFNlZ21lbnRzLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyLFxuICAgICAgICBwcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpLFxuICAgICAgICB0aGlzLm1hcmtlZEJlbG93KGZhbWlseS5yb290KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IGZhbWlseS5yb290LCB2ZXJiOiAnc2V0JywgLi4ucHJvdmVuYW5jZShyb290LnJlYWRLZXlzKSB9KTtcbiAgICAvLyBUaGUgY2xvbmUgdGhlIGNoZWNrIHRvb2sgKGBhZG1pc3Npb24udHMgwrcgZm9sZHNCYWNrYCksIHdoZW4gaXQgdG9vayBvbmUuXG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgZmFtaWx5LnJvb3RTZWdtZW50cywgZmFtaWx5LmhlbGQgIT09IHVuZGVmaW5lZCA/IGZhbWlseS5oZWxkLnZhbHVlIDogc3RydWN0dXJlZENsb25lKGFmdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgYSBwYXRoIOKAlCB3aGF0IHRoZSBkZWx0YSBlbmNvZGVyXG4gICAqIGNvbW1pdHMgZm9yIGEgZmFtaWx5IG1lbWJlciBvciBhIHBhdGggd2l0aCBhIGBzZXRgIOKAlCByZWFkIGZyb20gT05FXG4gICAqIHtAbGluayBkcnlGb2xkfSBvZiB0aG9zZSByb3dzIG92ZXIgdGhlIHBhdGNoIHRyZWVzIHRoZW1zZWx2ZXMsIHRha2VuIHRoZVxuICAgKiBmaXJzdCB0aW1lIGl0IGlzIGFza2VkLiBCeSByZWZlcmVuY2UsIGFzIHRoZSBzdGFnZSBoZWxkIHRoZW06IGFuIGVsZW1lbnRcbiAgICogYSBgc2V0YCBhbmQgYSBgbWVyZ2VgIG9mIG9uZSBwYXRoIHNoYXJlIHN0YXlzIG9uZSBlbGVtZW50LiBBIHN0YWdlIHRoYXRcbiAgICogc3RhZ2VkIG5vIGBtZXJnZWAgYW5kIG5vIG5lc3RlZCBvcCBuZWVkcyBubyBmb2xkIOKAlCBhIHBhdGgncyB2YWx1ZSBpcyBpdHNcbiAgICogbGFzdCBzdGFnZWQgdmFsdWUuIChCZWZvcmUgOS4zMC4wOiB0d28gcmVwbGljYXMgb2YgdGhlIHZlcmIgbGF3LFxuICAgKiBgcmVwbGF5UGF0aFZlcmJzYCBhbmQgYHJlcGxheUZhbWlseVZlcmJzYC4pXG4gICAqL1xuICBwcml2YXRlIGZ1bGxSb3dzVmFsdWUoKTogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93biB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gKHNlZ21lbnRzKSA9PiBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBsZXQgZm9sZDogdW5rbm93bjtcbiAgICByZXR1cm4gKHNlZ21lbnRzKSA9PiB7XG4gICAgICBmb2xkID8/PSBkcnlGb2xkKHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLnVwZGF0ZVBhdGNoLCB0aGlzLm92ZXJ3cml0ZVBhdGNoLCB0aGlzLmZ1bGxSb3dzKCkpO1xuICAgICAgcmV0dXJuIF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3M6IGV2ZXJ5IG9wIG9uIGEgcGF0aCB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIga2VlcHMsIGEgYGRlbGV0ZWAgc3BlbGxlZCBgc2V0YC4gKi9cbiAgcHJpdmF0ZSBmdWxsUm93cygpOiBUcmFjZUVudHJ5W10ge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCByb3dzOiBUcmFjZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgbGV0IGsgPSBrZWVwLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIGtlZXAuc2V0KG9wLnBhdGgsIChrID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKSkpO1xuICAgICAgaWYgKGspIHJvd3MucHVzaCh7IHBhdGg6IG9wLnBhdGgsIHZlcmI6IG9wLnZlcmIgPT09ICdtZXJnZScgPyAnbWVyZ2UnIDogJ3NldCcgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgc3RhZ2UgY2hhbmdlIHRoZSB2YWx1ZSBhdCBgc2VnbWVudHNgPyBCYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmVcbiAgICogZml4ZWQgYXQgY29tbWl0LCBzbyB0aGlzIGlzIHRoZSBPTkUgbmV0LWNoYW5nZSB2ZXJkaWN0IGJvdGggcGF5bG9hZFxuICAgKiBlbmNvZGluZ3MgYXBwbHkgKGEgbm8tb3Agd3JpdGUgYW5kIGEgd3JpdGUtdGhlbi1yZXZlcnQgYm90aCBmYWlsIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbChfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyksIF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgKyByZS1pbnNlcnRcbiAgICogbW92ZXMgYSByZS10b3VjaGVkIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgTWFwJ3MgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICAgKiBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocykuIFBlci13cml0ZVxuICAgKiBwcm92ZW5hbmNlICgjUDEpOiB0aGUgTEFTVCBvcCdzIHJlYWRLZXlzIGlzIGtlcHQg4oCUIHJlYWQgcHJlZml4ZXMgb25seSBncm93XG4gICAqIHdpdGhpbiBhIHN0YWdlLCBzbyBsYXN0ID09IHVuaW9uIGFjcm9zcyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgb3BzQnlQYXRoKCk6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnZlcmJzLnB1c2gob3AudmVyYik7XG4gICAgICAgIHByZXYubGFzdCA9IGk7XG4gICAgICAgIGlmIChvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkKSBwcmV2LnJlYWRLZXlzID0gb3AucmVhZEtleXM7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIHtcbiAgICAgICAgICB2ZXJiczogW29wLnZlcmJdLFxuICAgICAgICAgIGxhc3Q6IGksXG4gICAgICAgICAgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciDigJQgaWRlbnRpY2FsIHRvICdmdWxsJyAoe0BsaW5rIGNoYW5nZWRTaW5jZUJhc2V9KS4gU3Vydml2b3JzIGtlZXAgbGFzdC10b3VjaCBvcmRlci4gKi9cbiAgcHJpdmF0ZSBuZXRDaGFuZ2VTdXJ2aXZvcnMoYnlQYXRoOiBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KTogU3Vydml2b3JbXSB7XG4gICAgY29uc3Qgc3Vydml2b3JzOiBTdXJ2aXZvcltdID0gW107XG4gICAgZm9yIChjb25zdCBbcGF0aCwgeyB2ZXJicywgcmVhZEtleXMsIGxhc3QgfV0gb2YgYnlQYXRoKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgaWYgKCF0aGlzLmNoYW5nZWRTaW5jZUJhc2Uoc2VnbWVudHMpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBzdXJ2aXZvcnMucHVzaCh7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgcmVhZEtleXMsIGxhc3QsIGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdXJ2aXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGEgc3RhZ2VkIGBkZWxldGVgIGF0IHRoaXMgcGF0aCBjb21taXQgYXMgdGhlIGAnZGVsZXRlJ2AgdmVyYj9cbiAgICpcbiAgICogT25seSB3aGVuIHJlbW92aW5nIHRoZSBrZXkgYW5kIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgZmxhdHRlbmluZyAoYF9zZXRgIG9mXG4gICAqIGB1bmRlZmluZWRgKSBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLiBUaGV5IGRpdmVyZ2Ugd2hlbiB0aGUgcGFyZW50IGlzIG5vdFxuICAgKiBhIGNvbnRhaW5lcjogYG5hdGl2ZURlbGV0ZWAgd2Fsa3MgYXdheSB1bnRvdWNoZWQsIHdoaWxlIGBuYXRpdmVTZXRgXG4gICAqIENPRVJDRVMgdGhlIHByaW1pdGl2ZSBwYXJlbnQgaW50byBhbiBvYmplY3QgdG8gaG9sZCB0aGUga2V5LiBDb21taXR0aW5nXG4gICAqIGBkZWxldGVgIHRoZXJlIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBzdGF0ZSBjaGFuZ2UgdGhlIHN0YWdlIHJlYWxseSBtYWRlLFxuICAgKiBzbyB0aG9zZSAocGF0aG9sb2dpY2FsKSBkZWxldGVzIGtlZXAgdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgLy8gcGFyZW50IGlzIHRoZSBzdGF0ZSByb290IOKAlCBhbHdheXMgYSBjb250YWluZXJcbiAgICBjb25zdCBwYXJlbnQgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cy5zbGljZSgwLCAtMSkpO1xuICAgIHJldHVybiBwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCc7XG4gIH1cbn1cblxuLyoqXG4gKiBIaXN0b3JpY2FsIGZsYXR0ZW5pbmcgZm9yIHRoZSBgJ2Z1bGwnYCBwYXlsb2FkOiBhbiBleHBsaWNpdCBkZWxldGUgY29tbWl0c1xuICogYXMgc2V0LW9mLXVuZGVmaW5lZC4gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSkgcmlkZXMgZWFjaCBzdXJ2aXZpbmcgZW50cnlcbiAqIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbmVkVHJhY2VSb3cob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IFRyYWNlRW50cnkge1xuICByZXR1cm4gb3AudmVyYiA9PT0gJ2RlbGV0ZSdcbiAgICA/IHsgcGF0aDogb3AucGF0aCwgdmVyYjogJ3NldCcgYXMgY29uc3QsIC4uLihvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZEtleXM6IG9wLnJlYWRLZXlzIH0pIH1cbiAgICA6IG9wO1xufVxuXG4vKiogQSByb3cncyBgcmVhZEtleXNgIGZyYWdtZW50IOKAlCBhYnNlbnQgdW5sZXNzIHRoZSBwcm92ZW5hbmNlIGRpYWwgcmVjb3JkZWQgb25lICgjUDEpLiAqL1xuZnVuY3Rpb24gcHJvdmVuYW5jZShyZWFkS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IHJlYWRLZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlYWRLZXlzICE9PSB1bmRlZmluZWQgPyB7IHJlYWRLZXlzIH0gOiB1bmRlZmluZWQ7XG59XG4iXX0=
950
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25CdWZmZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9UcmFuc2FjdGlvbkJ1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStERzs7O0FBRUgsaURBQWdIO0FBQ2hILHlEQUFvSDtBQUNwSCwrQ0FBeUM7QUFDekMsNkNBVXNCO0FBRXRCLHlDQUFzRjtBQUV0RixNQUFhLGlCQUFpQjtJQUM1Qjs7Ozs7T0FLRztJQUNLLFlBQVksQ0FBTTtJQUNsQixXQUFXLENBQU07SUFFakIsY0FBYyxHQUFnQixFQUFFLENBQUM7SUFDakMsV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDOUIsT0FBTyxHQUEwRCxFQUFFLENBQUM7SUFDcEUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDMUM7Ozs7Ozs7T0FPRztJQUNLLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ3JDLDBFQUEwRTtJQUN6RCxZQUFZLENBQW1CO0lBRWhEOzs7K0VBRzJFO0lBQzFELGdCQUFnQixDQUFrQjtJQUVuRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdEM7Ozs7OztPQU1HO0lBQ0ssTUFBTSxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFFdkM7Ozs7O09BS0c7SUFDSyxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUU3Qzs7OztPQUlHO0lBQ0ssU0FBUyxDQUFtQjtJQUVwQzs7O09BR0c7SUFDSyxZQUFZLENBQW1CO0lBRXZDOzs7Ozs7T0FNRztJQUNjLE9BQU8sQ0FBb0I7SUFFNUMsb0VBQW9FO0lBQzVELFlBQVksR0FBRyxDQUFDLENBQUM7SUFDekIsb0ZBQW9GO0lBQzVFLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFdEIsWUFDRSxJQUFTLEVBQ1QsZUFBaUMsTUFBTSxFQUN2QyxnQkFBaUMsRUFDakMsVUFBNkIsRUFBRTtRQUUvQiwrREFBK0Q7UUFDL0QseUVBQXlFO1FBQ3pFLDBFQUEwRTtRQUMxRSxxRUFBcUU7UUFDckUseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBQSx3QkFBVyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7MERBRXNEO0lBQzlDLGFBQWEsQ0FBQyxFQUF1RDtRQUMzRSxJQUFJLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxFQUFFLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2pFLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELHlGQUF5RjtJQUNqRixLQUFLLENBQUMsSUFBeUIsRUFBRSxHQUFXLEVBQUUsSUFBWTtRQUNoRSxJQUFJLElBQUksS0FBSyxPQUFPO1lBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFBLDZCQUFjLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLElBQXlCLEVBQUUsS0FBVSxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQzdELE1BQU0sR0FBRyxHQUFHLElBQUEsd0JBQWEsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBQSxxQkFBUSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBQSx3QkFBVyxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssbUJBQW1CLENBQUMsSUFBeUI7UUFDbkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDO1lBQUUsT0FBTztRQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUEsd0JBQWEsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDakQsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7Z0JBQUUsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsTUFBTSxDQUFDLElBQXlCLEVBQUUsWUFBWSxHQUFHLEtBQUs7UUFDcEQsTUFBTSxHQUFHLEdBQUcsSUFBQSx3QkFBYSxFQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFBLHFCQUFRLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4QyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs4QkFVMEI7SUFDMUIsS0FBSyxDQUFDLElBQXlCLEVBQUUsS0FBVSxFQUFFLFlBQVksR0FBRyxLQUFLO1FBQy9ELE1BQU0sR0FBRyxHQUFHLElBQUEsd0JBQWEsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBQSx5QkFBYyxFQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvQyxJQUFBLHFCQUFRLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUEsZ0JBQUcsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBQSx3QkFBVyxFQUFDLE1BQU0sQ0FBQztZQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBQSx5QkFBYyxFQUFDLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxrQkFBa0IsQ0FBQyxJQUF5QixFQUFFLE1BQXlCO1FBQ3JFLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBQSx3QkFBYSxFQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBQSx3QkFBYSxFQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssV0FBVyxDQUFDLElBQVk7UUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLGdCQUFLLENBQUM7UUFDNUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUFFLFNBQVM7WUFDekMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6RCxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDL0MsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxzQkFBc0IsQ0FBQyxjQUEyQjtRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQzlCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM3QixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNkLFNBQVM7WUFDWCxDQUFDO1lBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxnQkFBSyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDZCxNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsSUFBeUIsRUFBRSxZQUFrQjtRQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLE9BQU8sSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxDQUFDLElBQXlCO1FBQzVCLE9BQU8sSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BNEJHO0lBQ0gsVUFBVSxDQUFDLElBQXlCO1FBQ2xDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFBLHdCQUFXLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUFFLE9BQU87UUFDakUsSUFBSSxFQUFFLEdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNuQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUFFLE9BQU87WUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBQSxxQkFBUSxFQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBQSx3QkFBVyxFQUFDLEtBQUssQ0FBQztnQkFBRSxPQUFPO1lBQ2hDLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDYixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFBRSxPQUFPO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLE9BQU8sRUFBVSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBQSx3QkFBVyxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0YsSUFBQSxxQkFBUSxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxHQUFXLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxPQUFPLEVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJHO0lBQ0ssU0FBUyxDQUFDLElBQXlCO1FBQ3pDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUM5Qix3RUFBd0U7UUFDeEUsK0RBQStEO1FBQy9ELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztRQUMzQixJQUFJLEVBQUUsR0FBWSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ25DLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsRUFBRSxHQUFHLElBQUEscUJBQVEsRUFBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUEsd0JBQVcsRUFBQyxFQUFFLENBQUM7Z0JBQUUsT0FBTztZQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUFJLE1BQU0sR0FBUSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ25DLElBQUksSUFBSSxHQUFZLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBUSxFQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7b0JBQUUsT0FBTztnQkFDdkQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDMUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RDLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxLQUFLLEdBQUcsSUFBQSx3QkFBVyxFQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBQ0QsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNmLElBQUksR0FBRyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxjQUFjLENBQUMsU0FBaUIsRUFBRSxJQUFhO1FBQ3JELE1BQU0sSUFBSSxHQUE2QixDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRyxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO2dCQUFFLFNBQVM7WUFDMUMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUEscUJBQVEsRUFBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFBLHdCQUFXLEVBQUMsS0FBSyxDQUFDO29CQUFFLFNBQVM7Z0JBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVEsRUFBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO29CQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztxQkFDakQsSUFBSSxLQUFLLEtBQUssTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDcEQsSUFBZ0MsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRSxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ3hFLGFBQWEsQ0FBQyxLQUFhO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFBLGtCQUFLLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxTQUFTLENBQUMsSUFBeUI7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBQSx3QkFBYSxFQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLGtGQUFrRjtZQUNsRixJQUFJLElBQUEsc0JBQVEsRUFBQyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5REc7SUFDSCxNQUFNO1FBTUosTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDaEcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFGLHFGQUFxRjtRQUNyRixNQUFNLE9BQU8sR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXZHLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bd0JHO0lBQ0ssbUJBQW1CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxrSEFBa0g7SUFDMUcsY0FBYyxDQUFDLEtBQXdCO1FBQzdDLE1BQU0sSUFBSSxHQUFTLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUM3RCxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDM0MscUVBQXFFO1FBQ3JFLHlFQUF5RTtRQUN6RSwwRUFBMEU7UUFDMUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7UUFDNUMsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsd0VBQXdFO1FBQ3hFLGlFQUFpRTtRQUNqRSxvRUFBb0U7UUFDcEUscUVBQXFFO1FBQ3JFLHVFQUF1RTtRQUN2RSxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLG9FQUFvRTtRQUNwRSxJQUFJLFdBQStCLENBQUM7UUFDcEMsSUFBSSxhQUFpQyxDQUFDO1FBRXRDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBVyxDQUFDLENBQUM7WUFDeEUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUN4QyxXQUFXLEdBQUcsYUFBYSxHQUFHLFNBQVMsQ0FBQztnQkFDMUMsQ0FBQztnQkFDRCxTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJO2dCQUFFLFNBQVMsQ0FBQyw2Q0FBNkM7WUFFbEUsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxhQUFhLEtBQUssRUFBRSxDQUFDLElBQUk7b0JBQUUsU0FBUztnQkFDeEMsYUFBYSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQztnQkFDdEMsSUFBQSxzQkFBSSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxXQUFXLEtBQUssRUFBRSxDQUFDLElBQUk7b0JBQUUsU0FBUztnQkFDdEMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQztnQkFDdEMsSUFBQSxzQkFBSSxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUNHO0lBQ0ssY0FBYztRQUNwQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxpSEFBaUg7SUFDekcsU0FBUyxDQUFDLEtBQXdCLEVBQUUsV0FBNEM7UUFDdEYsTUFBTSxJQUFJLEdBQVMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzdELE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFXLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDakcsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLG9DQUFpQixFQUFDLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9GLHdFQUF3RTtRQUN4RSwwRUFBMEU7UUFDMUUseUVBQXlFO1FBQ3pFLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBVyxFQUFRLEVBQUU7WUFDakMsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3BDLElBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBVyxDQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsK0RBQStEO2dCQUMvRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMzQyxJQUFBLHNCQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEUsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQy9GLG1FQUFtRTtnQkFDbkUsOERBQThEO2dCQUM5RCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxJQUFBLHNCQUFJLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2QyxDQUFDO2lCQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzdDLElBQUEsc0JBQUksRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0UsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUEsK0JBQVksRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEcsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLHFFQUFxRTtRQUNyRSxNQUFNLE9BQU8sR0FBRyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEcsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFhLEVBQVEsRUFBRTtZQUMxQyxPQUFPLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSztnQkFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoSCxDQUFDLENBQUM7UUFDRixJQUFBLG9DQUFpQixFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNoRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsMEVBQTBFO0lBRTFFOzs7Ozs7OztPQVFHO0lBQ0ssS0FBSyxDQUFDLEtBQXlDO1FBQ3JELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSyxhQUFhLENBQUMsU0FBZTtRQUNuQyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3RFLE9BQU8sSUFBQSw0QkFBYSxFQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLFlBQVksQ0FBQyxNQUFjLEVBQUUsSUFBVSxFQUFFLFFBQTBCO1FBQ3pFLElBQUksSUFBSSxHQUFXLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzNCLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ1QsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQztnQkFBRSxTQUFTO1lBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzVELElBQUEsK0JBQVksRUFDVixJQUFJLEVBQ0osTUFBTSxDQUFDLElBQUksRUFDWCxNQUFNLENBQUMsWUFBWSxFQUNuQixNQUFNLEVBQ04sS0FBSyxFQUNMLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUM5QixDQUFDO1lBQ0YsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRiwyRUFBMkU7UUFDM0UsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDO1lBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUcsSUFBSSxJQUFhLENBQUM7UUFDbEIsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2xCLElBQUksS0FBSyxJQUFBLGtCQUFPLEVBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDNUYsT0FBTyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCx5R0FBeUc7SUFDakcsUUFBUTtRQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFpQixFQUFFLENBQUM7UUFDOUIsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssU0FBUztnQkFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUM7Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQUMsUUFBa0I7UUFDekMsT0FBTyxDQUFDLElBQUEsb0JBQVMsRUFBQyxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFBLHNCQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxTQUFTO1FBQ2YsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtFLENBQUM7UUFDekYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2QsSUFBSSxFQUFFLENBQUMsUUFBUSxLQUFLLFNBQVM7b0JBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUU7b0JBQ2xCLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7b0JBQ2hCLElBQUksRUFBRSxDQUFDO29CQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQzVELENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELCtHQUErRztJQUN2RyxrQkFBa0IsQ0FBQyxNQUEyRTtRQUNwRyxNQUFNLFNBQVMsR0FBZSxFQUFFLENBQUM7UUFDakMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO2dCQUFFLFNBQVMsQ0FBQyw2Q0FBNkM7WUFDN0YsTUFBTSxNQUFNLEdBQUcsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBQSxzQkFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0MsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyx5QkFBeUIsQ0FBQyxRQUFrQjtRQUNsRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsZ0RBQWdEO1FBQ3hGLE1BQU0sTUFBTSxHQUFHLElBQUEsc0JBQUksRUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQXYzQkQsOENBdTNCQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEVBQXVEO0lBQ2hGLE9BQU8sRUFBRSxDQUFDLElBQUksS0FBSyxRQUFRO1FBQ3pCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFO1FBQ3RHLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDVCxDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLFNBQVMsVUFBVSxDQUFDLFFBQThCO0lBQ2hELE9BQU8sUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRyYW5zYWN0aW9uQnVmZmVyIOKAlCBQZXItc3RhZ2UgU1RBR0lORyBidWZmZXIgZm9yIHN0YXRlIG11dGF0aW9uc1xuICpcbiAqIFdoYXQgaXQgSVM6IGEgc3RhZ2luZyBidWZmZXIgd2l0aCByZWFkLXlvdXItd3JpdGVzIGFuZCBuZXQtY2hhbmdlIGNvbW1pdHMuXG4gKiAtIENoYW5nZXMgYXJlIHN0YWdlZCBoZXJlIGR1cmluZyBzdGFnZSBleGVjdXRpb24gYW5kIGZsdXNoZWQgdG9cbiAqICAgU2hhcmVkTWVtb3J5IGluIE9ORSBiYXRjaCBwZXIgc3RhZ2UgKGBjb21taXQoKWApIOKAlCBvdGhlciBzdGFnZXMgYW5kXG4gKiAgIHBhcmFsbGVsIHNpYmxpbmdzIG5ldmVyIG9ic2VydmUgYSBzdGFnZSdzIGhhbGYtZmluaXNoZWQgd3JpdGVzLlxuICogLSBSZWFkLWFmdGVyLXdyaXRlIGNvbnNpc3RlbmN5IHdpdGhpbiBhIHN0YWdlIOKAlCBhIHN0YWdlIHNlZXMgaXRzIG93blxuICogICBzdGFnZWQgd3JpdGVzIGltbWVkaWF0ZWx5LlxuICogLSBgY29tbWl0KClgIHJlY29yZHMgdGhlIHN0YWdlJ3MgTkVUIGNoYW5nZSAoc2VlIHtAbGluayBjb21taXR9KSwgcGx1cyBhblxuICogICBvcGVyYXRpb24gdHJhY2UgZm9yIGRldGVybWluaXN0aWMgcmVwbGF5LlxuICpcbiAqIFdoYXQgaXQgaXMgTk9UOiBhIHJvbGxiYWNrIG1lY2hhbmlzbS4gRGVzcGl0ZSB0aGUgbmFtZSwgdGhlcmUgaXMgbm9cbiAqIGFib3J0L3JvbGxiYWNrIHBhdGgg4oCUIHdoZW4gYSBzdGFnZSBUSFJPV1MsIHRoZSBlbmdpbmUgc3RpbGwgY29tbWl0c1xuICogZXZlcnl0aGluZyBzdGFnZWQgc28gZmFyIGJlZm9yZSByZS10aHJvd2luZyAoY29tbWl0LW9uLWVycm9yIGluXG4gKiBgRmxvd2NoYXJ0VHJhdmVyc2VyYCkuIFRoYXQgaXMgZGVsaWJlcmF0ZTogdGhlIGF1ZGl0IHRyYWlsIG11c3QgcmVjb3JkXG4gKiB3aGF0IHRoZSBmYWlsaW5nIHN0YWdlIGNoYW5nZWQuIERvIG5vdCByZWx5IG9uIFwic3RhZ2UgZmFpbGVkIOKGkiBpdHNcbiAqIHdyaXRlcyB2YW5pc2hlZFwiLlxuICpcbiAqIFRoZSBwYXRjaCB0cmVlcyBob2xkIFJFRkVSRU5DRVMgdW50aWwgY29tbWl0ICg5LjIzLjApLiBBIGBzZXRgIHN0b3JlcyB0aGVcbiAqIGNhbGxlcidzIG93biB2YWx1ZSBpbiBgb3ZlcndyaXRlUGF0Y2hgIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGRpZCBpblxuICogYHdvcmtpbmdDb3B5YDsgdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyB0YWtlbiBPTkNFIHBlciBzdXJ2aXZpbmcgcGF0aFxuICogd2hlbiB0aGUgcGF5bG9hZCBsZWF2ZXMgdGhlIGJ1ZmZlciAoYHRvQ2hhbmdlT25seVBheWxvYWRgIC9cbiAqIGB0b0RlbHRhUGF5bG9hZGAg4oCUIGV2ZXJ5IHZhbHVlIHRoZXkgZW1pdCBwYXNzZXMgdGhyb3VnaCBgc3RydWN0dXJlZENsb25lYFxuICogdGhlcmUpLiBUaGUgbGF3IFwidGhlIHJlY29yZCBuZXZlciBhbGlhc2VzIGEgY2FsbGVyJ3Mgb2JqZWN0XCIgaXMga2VwdCBhdFxuICogdGhlIGNvbW1pdCBib3VuZGFyeSBpbnN0ZWFkIG9mIGF0IGV2ZXJ5IHdyaXRlLCB3aGljaCBpcyB3aGF0IG1ha2VzIE5cbiAqIHdyaXRlcyB0byBvbmUgcGF0aCBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHNpemUpLiBDb25zZXF1ZW5jZSwgYnkgZGVzaWduOiBhXG4gKiBjYWxsZXIgd2hvIG11dGF0ZXMgaXRzIG93biBvYmplY3QgQUZURVIgdGhlIHdyaXRlIGFuZCBCRUZPUkUgdGhlIHN0YWdlXG4gKiBlbmRzIGNvbW1pdHMgdGhlIHZhbHVlIGFzIHRoZSBzdGFnZSByZWFkIGl0IGJhY2sg4oCUIHRoZSByZWNvcmQgYWdyZWVzIHdpdGhcbiAqIHRoZSBzdGFnZSAoQ0xBVURFLm1kIGxhbmRtaW5lIDMncyBmaXJzdCBiaXRlLCBjbG9zZWQpLiBUaGUgb25lIHBsYWNlIHRoZVxuICogZW5naW5lIGl0c2VsZiBlZGl0cyBUSFJPVUdIIGEgc3RhZ2VkIHZhbHVlIOKAlCBhIGxhdGVyIG5lc3RlZCBvcCB1bmRlciBhXG4gKiBgc2V0YCBwYXRoIOKAlCBkZXRhY2hlcyB0aGF0IHZhbHVlIGZpcnN0ICh7QGxpbmsgZGV0YWNoSGVsZEFuY2VzdG9yc30pLCBzb1xuICogYHdvcmtpbmdDb3B5YCBhbmQgYG92ZXJ3cml0ZVBhdGNoYCBuZXZlciBzaGFyZSBhIGNvbnRhaW5lciB0aGUgZW5naW5lXG4gKiBtdXRhdGVzIG9uIG9uZSBzaWRlIG9ubHkuXG4gKlxuICogQ09QWS1PTi1XUklURSAoOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS4gVGhlXG4gKiBidWZmZXIgbm8gbG9uZ2VyIGNsb25lcyB0aGUgY29tbWl0dGVkIHN0YXRlIGl0IHN0YXJ0cyBmcm9tLiBgYmFzZVNuYXBzaG90YFxuICogSVMgdGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBzdGFnZSBmaXJzdCB0b3VjaGVkIChoZWxkIGJ5IHJlZmVyZW5jZSDigJRcbiAqIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcCksIGFuZCBgd29ya2luZ0NvcHlgIHN0YXJ0cyBhcyBhXG4gKiBjb3B5IG9mIGl0cyBST09UIG9ubHk6IGVhY2ggd3JpdGUgY29waWVzIHRoZSBjb250YWluZXJzIG9uIGl0cyBvd24gcGF0aFxuICogKHtAbGluayBvd25TcGluZX0pLCBhbmQgdGhlIGZpcnN0IFJFQUQgYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgb2YgYVxuICogY29udGFpbmVyIHN0aWxsIHNoYXJlZCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSB0YWtlcyBhIHByaXZhdGUgZGVlcCBjb3B5IG9mXG4gKiBpdCAoe0BsaW5rIHByaXZhdGlzZX0pIOKAlCB3aGF0IHRoZSB3aG9sZS1zdGF0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgZXZlcnlcbiAqIHJlYWQsIHNvIGFuIGluLXBsYWNlIGVkaXQgb2YgYSByZWFkIHZhbHVlIHN0YXlzIHByaXZhdGUgZXhhY3RseSBhcyBpdCBkaWQuXG4gKiBBIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyIGlzIHNlcnZlZCBmcm9tIGxpdmUgc3RhdGUgYnkgdGhlXG4gKiBjYWxsZXIsIGFzIGJlZm9yZTsgdGhlIGJ1ZmZlciB0aGVuIHJlcGxhY2VzIHRoYXQgcGF0aCBvZiBpdHMgZGlmZiBiYXNlXG4gKiB3aXRoIGEgcHJpdmF0ZSBjb3B5ICh7QGxpbmsgZGV0YWNoQmFzZX0pLCBhcyB0aGUgY2xvbmUgaGFkIGl0LlxuICpcbiAqIFRIRSBBRE1JVFRFRCBSRUNPUkQgKDkuMzAuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1hZG1pdHRlZC1yZWNvcmQubWQpLiBBXG4gKiBjb21taXQgaXMgYWRtaXR0ZWQgb25seSBpZiBpdHMgYnVuZGxlIGZvbGRzIGJhY2sgdG8gdGhlIHN0YWdlJ3NcbiAqIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeSBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkIChhbmQgYXQgZXZlcnlcbiAqIGNvbnRhaW5lciBpdHMgd3JpdGVzIGNyZWF0ZWQgb24gdGhlIHdheSB0aGVyZSwgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcykuXG4gKiBCb3RoIGVuY29kZXJzIGNvbW1pdCB0aGUgdmFsdWUgdGhlIHN0YWdlIHJlYWQ6IGEgY29tcGFjdCByb3cg4oCUIGEgYG1lcmdlYFxuICogZGVsdGEsIGFuIGBhcHBlbmRgIHRhaWwg4oCUIGlzIGtlcHQgd2hlcmUgaXQgcHJvdmFibHkgZm9sZHMgYmFjazsgYSBmYW1pbHkgb2ZcbiAqIHJvd3MgdGhhdCBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyBgc2V0YCByb3dzIG9mIHRoZSB2YWx1ZXMgdGhlIHN0YWdlIHJlYWRcbiAqICh7QGxpbmsgYWRtaXR9KS4gQmVmb3JlIDkuMzAuMCB0aGUgb25lIGFjY3VtdWxhdGVkIG1lcmdlIGRlbHRhIHBlciBwYXRoIHdhc1xuICogcmVwbGF5ZWQgYXQgZXZlcnkgYG1lcmdlYCByb3cgb2YgdGhhdCBwYXRoLCB3aGljaCBsaWVkIGFjcm9zcyBhIGhhcmQgd3JpdGVcbiAqIChgJHVwZGF0ZShrLHt4fSk7IGsgPSB7eX07ICR1cGRhdGUoayx7en0pYCBjb21taXR0ZWQgYHt5LCB4LCB6fWAgZm9yIGFcbiAqIHJlYWQtYmFjayBvZiBge3ksIHp9YCksIGFuIGBbXWAgY2xlYXIsIGEga2luZCBjaGFuZ2Ugb3IgYW4gYXJyYXkgdW5pb25cbiAqIGRlZHVwbGljYXRlZCBieSByZWZlcmVuY2UuIFZlcmlmaWVkIHdoZW4gdGhlIHN0YWdlIHN0YWdlZCBhIGBtZXJnZWAgb3IgYVxuICogbmVzdGVkIG9wOyBhIHN0YWdlIHRoYXQgc3RhZ2VkIG9ubHkgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyXG4gKiBpdHMgYWRkcmVzcyBpcyBjb2hlcmVudCBieSBjb25zdHJ1Y3Rpb24g4oCUIGJvdGggdHJlZXMgcmVjZWl2ZSB0aGUgc2FtZVxuICogd3JpdGUg4oCUIGFuZCBpcyBhZG1pdHRlZCB3aXRob3V0IHRoZSBmb2xkLlxuICovXG5cbmltcG9ydCB7IHR5cGUgRmFtaWx5LCB0eXBlIExvc3N5LCB0eXBlIE1lbWJlciwgdHlwZSBSb3dzLCBhZGRyZXNzRGVwdGhPZiwgbG9zc3lGYW1pbGllcyB9IGZyb20gJy4vYWRtaXNzaW9uLmpzJztcbmltcG9ydCB7IHR5cGUgT3BWZXJiLCB0eXBlIFN1cnZpdm9yLCBlbWl0SW5GYW1pbHlPcmRlciwgZ3JvdXBJbnRvRmFtaWxpZXMsIHB1c2hWYWx1ZVJvdyB9IGZyb20gJy4vZGVsdGFFbmNvZGluZy5qcyc7XG5pbXBvcnQgeyByZWxhdGlvbiB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHtcbiAgYWRvcHQsXG4gIGlzQ29udGFpbmVyLFxuICBuYXRpdmVHZXQgYXMgX2dldCxcbiAgbmF0aXZlU2V0IGFzIF9zZXQsXG4gIG93bixcbiAgb3duQ2hpbGQsXG4gIG93bmVkUm9vdE9mLFxuICBvd25TcGluZSxcbiAgc2hhbGxvd0NvcHksXG59IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdFZhbHVlc01vZGUsIE1lbW9yeVBhdGNoLCBUcmFjZUVudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWVwRXF1YWwsIGRlZXBTbWFydE1lcmdlLCBERUxJTSwgZHJ5Rm9sZCwgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWZmZXIge1xuICAvKipcbiAgICogVGhlIG5ldC1jaGFuZ2UgZGlmZiBiYXNlOiB0aGUgY29tbWl0dGVkIGdlbmVyYXRpb24gdGhlIHN0YWdlIGZpcnN0XG4gICAqIHRvdWNoZWQsIGJ5IHJlZmVyZW5jZSDigJQgZXhjZXB0IHdoZXJlIHtAbGluayBkZXRhY2hCYXNlfSByZXBsYWNlZCBhIHBhdGhcbiAgICogb2YgaXQgd2l0aCBhIHByaXZhdGUgY29weSAoaXRzIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgYXJlXG4gICAqIHRoZW4gY29waWVzIHRvbywgb3duZWQgYnkge0BsaW5rIGJhc2VPd25lZH0pLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlU25hcHNob3Q6IGFueTtcbiAgcHJpdmF0ZSB3b3JraW5nQ29weTogYW55O1xuXG4gIHByaXZhdGUgb3ZlcndyaXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgdXBkYXRlUGF0Y2g6IE1lbW9yeVBhdGNoID0ge307XG4gIHByaXZhdGUgb3BUcmFjZTogeyBwYXRoOiBzdHJpbmc7IHZlcmI6IE9wVmVyYjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3RlZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBQYXRocyB3aG9zZSBgb3ZlcndyaXRlUGF0Y2hgIHZhbHVlIGlzIHRoZSBjYWxsZXIncyBvd24gb2JqZWN0ICg5LjIzLjApOlxuICAgKiBhIGBzZXRgIG9mIGEgY29udGFpbmVyIHN0b3JlcyB0aGUgcmVmZXJlbmNlLCBhbmQgdGhpcyBpcyB0aGUgbGVkZ2VyIG9mXG4gICAqIHdoaWNoIG9uZXMgYXJlIHN0aWxsIHNoYXJlZCB3aXRoIHRoZSBjYWxsZXIgKGFuZCB3aXRoIGB3b3JraW5nQ29weWApLlxuICAgKiBDb25zdWx0ZWQgb25seSBieSB0aGUgZW5naW5lJ3MgbmVzdGVkIG9wcyDigJQgc2VlXG4gICAqIHtAbGluayBkZXRhY2hIZWxkQW5jZXN0b3JzfTsgdGhlIGNvbW1pdCBwYXlsb2FkIGNsb25lcyBldmVyeSBzdXJ2aXZpbmdcbiAgICogdmFsdWUgYW55d2F5IGFuZCBuZXZlciBhc2tzLiBDbGVhcmVkIHdpdGggdGhlIHJlc3QgYXQgYGNvbW1pdCgpYC5cbiAgICovXG4gIHByaXZhdGUgaGVsZFJlZnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqIENvbW1pdC12YWx1ZSBlbmNvZGluZyBwb2xpY3kgKCMxM2MtQikuIGAnZnVsbCdgID0gaGlzdG9yaWNhbCBieXRlcy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG5cbiAgLyoqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2Ugc291cmNlICgjUDEpLiBXaGVuIHNldCAodGhlXG4gICAqICBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZGlhbCksIGV2ZXJ5IHN0YWdlZCBvcCBzbmFwc2hvdHMgdGhlXG4gICAqICBrZXlzIHRyYWNrZWQtcmVhZCBzbyBmYXIg4oCUIHRoZSB0ZW1wb3JhbC1wcmVmaXggYXR0cmlidXRpb24gY29uc3VtZWQgYnlcbiAgICogIGNhdXNhbCBzbGljaW5nLiBVbmRlZmluZWQgKGRlZmF1bHQpID0gemVybyBjb3N0LCBieXRlLWlkZW50aWNhbCBvcHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZEtleXNQcm92aWRlcj86ICgpID0+IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVycyBpbiBgd29ya2luZ0NvcHlgIHRoaXMgYnVmZmVyIENSRUFURUQ6IGl0cyByb290IGNvcHksIHRoZVxuICAgKiBwYXRoIGNvcGllcyBpdHMgd3JpdGVzIG1hZGUsIHRoZSBtZXJnZSByZXN1bHRzIGl0IGJ1aWx0LCBhbmQgZXZlcnlcbiAgICogY29udGFpbmVyIG9mIHRoZSBwcml2YXRlIGNvcGllcyBpdHMgcmVhZHMgdG9vay4gQSB3cml0ZSBlZGl0cyB0aGVzZSBpblxuICAgKiBwbGFjZS4gRXZlcnl0aGluZyBlbHNlIGluIGB3b3JraW5nQ29weWAgaXMgU0hBUkVEIOKAlCB3aXRoIHRoZSBjb21taXR0ZWRcbiAgICogZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCwgb3Igd2l0aCBhIHZhbHVlIHRoZSBzdGFnZSBzdGFnZWQg4oCUXG4gICAqIGFuZCBpcyBjb3BpZWQgYmVmb3JlIGEgd3JpdGUgcGFzc2VzIHRocm91Z2ggaXQgKHtAbGluayBvd25TcGluZX0pLlxuICAgKi9cbiAgcHJpdmF0ZSBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogQ29udGFpbmVyIHZhbHVlcyB0aGUgc3RhZ2Ugc3RhZ2VkIHdpdGgge0BsaW5rIHNldH0g4oCUIGl0cyBvd24gb2JqZWN0cyxcbiAgICogaGVsZCBieSByZWZlcmVuY2UgKDkuMjMuMCkuIEEgcmVhZCBoYW5kcyB0aGVtIGJhY2sgYXMgdGhleSBhcmUsIGV4YWN0bHlcbiAgICogYXMgdGhlIHByaXZhdGUgd29ya2luZyBjb3B5IGFsd2F5cyBkaWQsIGFuZCBuZXZlciBwcml2YXRpc2VzIHRoZW06IGFcbiAgICogcHJpdmF0ZSBjb3B5IG9mIGEgc3RhZ2VkIHZhbHVlIHdvdWxkIGxlYXZlIGB3b3JraW5nQ29weWAgYW5kXG4gICAqIGBvdmVyd3JpdGVQYXRjaGAgZGlzYWdyZWVpbmcgYWJvdXQgYSB2YWx1ZSB0aGUgc3RhZ2Ugd3JvdGUuXG4gICAqL1xuICBwcml2YXRlIHN0YWdlZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogT3duZWQgY29udGFpbmVycyB3aXRoIG5vIGNvbnRhaW5lciBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGVcbiAgICogYW55d2hlcmUgYmVsb3cgdGhlbSAoYSBwcml2YXRlIGRlZXAgY29weSwgYSBtZXJnZSByZXN1bHQgYnVpbHQgb24gYVxuICAgKiBwcml2YXRlIGJhc2UsIGEgcGF0aCBjb3B5IHdob3NlIHNoYXJlZCBjaGlsZHJlbiB3ZXJlIHByaXZhdGlzZWQpLiBBIHJlYWRcbiAgICogdGhhdCBsYW5kcyBvbiBvbmUgbmVlZHMgbm8gd2FsayDigJQgc2VlIHtAbGluayBwcml2YXRpc2VCZWxvd30uXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuICAvKipcbiAgICogVGhlIGNvbnRhaW5lcnMgb2Yge0BsaW5rIGJhc2VTbmFwc2hvdH0gdGhhdCB7QGxpbmsgZGV0YWNoQmFzZX0gY3JlYXRlZDpcbiAgICogaXRzIHJvb3QgY29weSBhbmQgdGhlIGNvcGllcyBvbiB0aGUgd2F5IHRvIGEgZGV0YWNoZWQgcGF0aC4gQWxsb2NhdGVkXG4gICAqIG9ubHkgYnkgdGhlIGZpcnN0IGRldGFjaCDigJQgdGhlIGluLWNvbnRyYWN0IHN0YWdlIG5ldmVyIHBheXMgZm9yIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlT3duZWQ/OiBXZWFrU2V0PG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFRoZSBwcml2YXRlIGRlZXAgY29waWVzIHtAbGluayBkZXRhY2hCYXNlfSBwdXQgaW50byB0aGUgZGlmZiBiYXNlOiBub3RoaW5nXG4gICAqIGF0IG9yIGJlbG93IG9uZSBpcyBjb21taXR0ZWQgc3RhdGUsIHNvIGEgbGF0ZXIgZGV0YWNoIGluc2lkZSBpdCBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRhY2hlZEJhc2U/OiBXZWFrU2V0PG9iamVjdD47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBzdGFnZSB3cml0ZXMgKDkuMzAuMCk6IGEgcGF0aCBwcmVmaXggaXRzIGZyYW1lIGNvbXB1dGVkIGFuZFxuICAgKiBoYW5kcyBvdmVyIGFzIGRhdGEgKEMyIOKAlCBmb3IgdGhlIGVuZ2luZSwgdGhlIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZSwgb3JcbiAgICogYFtdYCBmb3IgdGhlIHJvb3QpLiBJdHMgY29udGFpbmVycyBhcmUgdGhlIHN0YWdlJ3MgQUREUkVTUywgbm90IGEgdmFsdWVcbiAgICogdGhlIHN0YWdlIHJlYWRzIChldmVyeSByZWFkIGl0IG1ha2VzIGlzIGEga2V5IGJlbG93IGl0KSwgc28gYSBzaGVsbCBhXG4gICAqIHdyaXRlIGxlYXZlcyB0aGVyZSBpcyBubyBwYXJ0IG9mIHRoZSByZWFkLWJhY2sgdGhlIHJlY29yZCBtdXN0IGhvbGQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBgbWVyZ2VgIG9wcyBzdGFnZWQgc2luY2UgdGhlIGxhc3QgY29tbWl0IOKAlCBzZWUge0BsaW5rIGFkbWl0fS4gKi9cbiAgcHJpdmF0ZSBzdGFnZWRNZXJnZXMgPSAwO1xuICAvKiogT3BzIHN0YWdlZCBkZWVwZXIgdGhhbiBvbmUga2V5IGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3Mg4oCUIHNlZSB7QGxpbmsgYWRtaXR9LiAqL1xuICBwcml2YXRlIG5lc3RlZE9wcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYmFzZTogYW55LFxuICAgIGNvbW1pdFZhbHVlczogQ29tbWl0VmFsdWVzTW9kZSA9ICdmdWxsJyxcbiAgICByZWFkS2V5c1Byb3ZpZGVyPzogKCkgPT4gc3RyaW5nW10sXG4gICAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgKSB7XG4gICAgLy8gYGJhc2VgIGlzIHRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgc3RhZ2UgZmlyc3QgdG91Y2hlZCDigJRcbiAgICAvLyBpbW11dGFibGUtYWZ0ZXItc3dhcCwgdGhlIGludmFyaWFudCB0aGUgZmlyc3QtdG91Y2ggdmlldyBhbHJlYWR5IHJlc3RzXG4gICAgLy8gb24g4oCUIHNvIHRoZSBkaWZmIGJhc2UgaXMgaGVsZCBieSBSRUZFUkVOQ0UsIGFuZCB0aGUgd29ya2luZyBjb3B5IHN0YXJ0c1xuICAgIC8vIGFzIGEgY29weSBvZiBpdHMgUk9PVCBvbmx5LiBCZWZvcmUgOS4yOS4wIHRoZXNlIHR3byBsaW5lcyB3ZXJlIHR3b1xuICAgIC8vIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgd2hvbGUgc3RhdGUsIHBhaWQgYnkgZXZlcnkgc3RhZ2UgdGhhdCB3cm90ZS5cbiAgICB0aGlzLmJhc2VTbmFwc2hvdCA9IGJhc2U7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IG93bmVkUm9vdE9mKGJhc2UsIHRoaXMub3duZWQpO1xuICAgIHRoaXMuY29tbWl0VmFsdWVzID0gY29tbWl0VmFsdWVzO1xuICAgIHRoaXMucmVhZEtleXNQcm92aWRlciA9IHJlYWRLZXlzUHJvdmlkZXI7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgY3VycmVudCByZWFkIHByZWZpeCBvbnRvIGEgc3RhZ2VkIG9wIOKAlCBvbmx5IHdoZW4gdGhlXG4gICAqICBwcm92ZW5hbmNlIGRpYWwgaXMgb24gKHByb3ZpZGVyIHByZXNlbnQpLCBzbyB0aGUgZGVmYXVsdCBwYXRoIGFsbG9jYXRlc1xuICAgKiAgbm90aGluZyBhbmQgY29tbWl0IGJ1bmRsZXMgc3RheSBieXRlLWlkZW50aWNhbC4gKi9cbiAgcHJpdmF0ZSBzdGFtcFJlYWRLZXlzKG9wOiB7IHBhdGg6IHN0cmluZzsgdmVyYjogT3BWZXJiOyByZWFkS2V5cz86IHN0cmluZ1tdIH0pOiB0eXBlb2Ygb3Age1xuICAgIGlmICh0aGlzLnJlYWRLZXlzUHJvdmlkZXIpIG9wLnJlYWRLZXlzID0gdGhpcy5yZWFkS2V5c1Byb3ZpZGVyKCk7XG4gICAgcmV0dXJuIG9wO1xuICB9XG5cbiAgLyoqIFN0YWdlIGFuIG9wIGludG8gYG9wVHJhY2VgLCBjb3VudGluZyB3aGF0IGRlY2lkZXMgd2hldGhlciB7QGxpbmsgYWRtaXR9IG11c3QgZm9sZC4gKi9cbiAgcHJpdmF0ZSBzdGFnZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBrZXk6IHN0cmluZywgdmVyYjogT3BWZXJiKTogdm9pZCB7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHRoaXMuc3RhZ2VkTWVyZ2VzKys7XG4gICAgaWYgKHBhdGgubGVuZ3RoIC0gYWRkcmVzc0RlcHRoT2YocGF0aCwgdGhpcy5hZGRyZXNzKSA+IDEpIHRoaXMubmVzdGVkT3BzKys7XG4gICAgdGhpcy5vcFRyYWNlLnB1c2godGhpcy5zdGFtcFJlYWRLZXlzKHsgcGF0aDoga2V5LCB2ZXJiIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYXJkIG92ZXJ3cml0ZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIFN0b3JlcyB0aGUgUkVGRVJFTkNFIGluIGJvdGggdHJlZXNcbiAgICogKDkuMjMuMCkg4oCUIHRoZSByZWNvcmQncyBjb3B5IGlzIHRha2VuIG9uY2UsIGF0IGNvbW1pdDsgc2VlIHRoZSBoZWFkZXIuXG4gICAqL1xuICBzZXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgdmFsdWU6IGFueSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHZhbHVlKTtcbiAgICBfc2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHBhdGgsIHZhbHVlKTtcbiAgICBpZiAoaXNDb250YWluZXIodmFsdWUpKSB7XG4gICAgICB0aGlzLmhlbGRSZWZzLmFkZChrZXkpO1xuICAgICAgdGhpcy5zdGFnZWQuYWRkKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oZWxkUmVmcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ3NldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbmVzdGVkIG9wIGlzIGFib3V0IHRvIHdyaXRlIFRIUk9VR0ggYSBwYXRoIHdob3NlIGBvdmVyd3JpdGVQYXRjaGBcbiAgICogdmFsdWUgaXMgYSBoZWxkIHJlZmVyZW5jZSAoOS4yMy4wKS4gVG9kYXkncyBsYXcgaXMgdGhhdCB0aGUgdHdvIHRyZWVzXG4gICAqIHJlY2VpdmUgdGhlIHNhbWUgbmVzdGVkIGBzZXRgL2BkZWxldGVgIG11dGF0aW9ucyBidXQgT05MWSBgd29ya2luZ0NvcHlgXG4gICAqIHJlY2VpdmVzIGEgbmVzdGVkIGBtZXJnZWAncyByZXN1bHQgKGB1cGRhdGVQYXRjaGAgZ2V0cyB0aGUgZGVsdGEpIOKAlCBzbyBhXG4gICAqIGNvbnRhaW5lciBzaGFyZWQgYmV0d2VlbiB0aGUgdHJlZXMgd291bGQgbGVhayB0aGUgbWVyZ2VkIHZhbHVlIGludG8gdGhlXG4gICAqIG92ZXJ3cml0ZSBwYXlsb2FkLCBhbmQgYSBzaGFyZWQgY29udGFpbmVyIGlzIGFsc28gdGhlIGNhbGxlcidzIG93blxuICAgKiBvYmplY3QsIHdoaWNoIHRoZSBlbmdpbmUgbXVzdCBub3QgZWRpdCBvbiB0aGUgcmVjb3JkJ3MgYmVoYWxmLiBSZXBsYWNpbmdcbiAgICogdGhlIGhlbGQgYW5jZXN0b3Igd2l0aCBpdHMgY2xvbmUgaW4gYG92ZXJ3cml0ZVBhdGNoYCByZXN0b3JlcyBleGFjdGx5XG4gICAqIHRoZSBwcml2YXRlIHRyZWUgdGhlIHBlci13cml0ZSBjbG9uZSB1c2VkIHRvIGdpdmUgaXQsIHBhaWQgb25jZSBwZXJcbiAgICogYW5jZXN0b3IgYW5kIG9ubHkgb24gdGhlIG5lc3RlZC1vcCBwYXRoIHRoZSBwdWJsaWMgc3VyZmFjZSBuZXZlciB0YWtlc1xuICAgKiAodGhlIHNjb3BlIHByb3h5IHdyaXRlcyBST09UIGtleXMpLiBgd29ya2luZ0NvcHlgIGtlZXBzIHRoZSByZWZlcmVuY2UsXG4gICAqIGFzIGl0IGFsd2F5cyBkaWQuXG4gICAqL1xuICBwcml2YXRlIGRldGFjaEhlbGRBbmNlc3RvcnMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhlbGRSZWZzLnNpemUgPT09IDApIHJldHVybjtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGF0aC5zbGljZSgwLCBpKTtcbiAgICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVBhdGgoYW5jZXN0b3IpO1xuICAgICAgaWYgKCF0aGlzLmhlbGRSZWZzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGhlbGQgPSBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIGFuY2VzdG9yKTtcbiAgICAgIGlmIChoZWxkICE9PSBudWxsICYmIHR5cGVvZiBoZWxkID09PSAnb2JqZWN0JykgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBhbmNlc3Rvciwgc3RydWN0dXJlZENsb25lKGhlbGQpKTtcbiAgICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0IGtleSBkZWxldGlvbiBhdCB0aGUgc3BlY2lmaWVkIHBhdGggKCMxM2MtQjsgYWJzb3JicyBiYWNrbG9nIEI4KS5cbiAgICpcbiAgICogU3RhZ2VzIEVYQUNUTFkgdGhlIHNhbWUgYnVmZmVyIG11dGF0aW9ucyBhcyBgc2V0KHBhdGgsIHVuZGVmaW5lZClgIOKAlFxuICAgKiBgd29ya2luZ0NvcHlgL2BvdmVyd3JpdGVQYXRjaGAgZ2V0IGFuIG93biBgdW5kZWZpbmVkYCBhdCB0aGUgcGF0aCAodGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZywgcHJlc2VydmluZyByZWFkIGJlaGF2aW9yIGFuZCB0aGUgZGVkdXAgZGlmZiBiYXNlXG4gICAqIGFjcm9zcyBtb2Rlcykg4oCUIGJ1dCByZWNvcmRzIHRoZSBvcCB2ZXJiIGFzIGAnZGVsZXRlJ2AuIEF0IGNvbW1pdDpcbiAgICogYCdmdWxsJ2AgbW9kZSBtYXBzIGl0IGJhY2sgdG8gYSBgJ3NldCdgIHRyYWNlIGVudHJ5IChieXRlLWlkZW50aWNhbCB0b1xuICAgKiB0b2RheSk7IGAnZGVsdGEnYCBtb2RlIGVtaXRzIGEgcmVhbCBgJ2RlbGV0ZSdgIGVudHJ5IHdob3NlIHJlcGxheVxuICAgKiBSRU1PVkVTIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGBrZXk6IHVuZGVmaW5lZGAgYmVoaW5kLlxuICAgKlxuICAgKiBUaGUgbmV0LWNoYW5nZSBmaWx0ZXIgcmVhZHMgdGhhdCBzdGFnZWQgb3duIGB1bmRlZmluZWRgIGFzIEFCU0VOVFxuICAgKiAoYGRlZXBFcXVhbGAsIDkuMTkuMSkg4oCUIHNvIHVuZGVyIGAnZGVsdGEnYCwgd2hvc2UgY29tbWl0dGVkIHN0YXRlIHJlYWxseVxuICAgKiBsYWNrcyB0aGUga2V5LCBkZWxldGluZyBhbiBhYnNlbnQga2V5IGluc2lkZSBhIGNvbnRhaW5lciB0aGUgc3RhZ2UgYWxzb1xuICAgKiByZS13cm90ZSBpcyB0aGUgbm8tb3AgaXQgaXMsIG5vdCBhIGBzZXRgIG9mIHRoZSB3aG9sZSBjb250YWluZXIuXG4gICAqL1xuICBkZWxldGUocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBub3JtYWxpc2VQYXRoKHBhdGgpO1xuICAgIHRoaXMuZGV0YWNoSGVsZEFuY2VzdG9ycyhwYXRoKTtcbiAgICBvd25TcGluZSh0aGlzLndvcmtpbmdDb3B5LCBwYXRoLCB0aGlzLm93bmVkKTtcbiAgICBfc2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIHVuZGVmaW5lZCk7XG4gICAgX3NldCh0aGlzLm92ZXJ3cml0ZVBhdGNoLCBwYXRoLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuaGVsZFJlZnMuZGVsZXRlKGtleSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ2RlbGV0ZScpO1xuICB9XG5cbiAgLyoqIERlZXAgdW5pb24gbWVyZ2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoLiBgZGVlcFNtYXJ0TWVyZ2VgIGJ1aWxkcyBmcmVzaFxuICAgKiAgY29udGFpbmVycywgc28gbmVpdGhlciB0cmVlIGV2ZXIgaG9sZHMgdGhlIG1lcmdlIElOUFVUIGJ5IHJlZmVyZW5jZTtcbiAgICogIHRoZSBuZXN0ZWQtb3AgZGV0YWNoIGd1YXJkcyB0aGUgYW5jZXN0b3IgaXQgd3JpdGVzIElOVE8uXG4gICAqXG4gICAqICBUaGUgdmFsdWUgbWVyZ2VkIElOVE8gaXMgbWFkZSBwcml2YXRlIGZpcnN0IChgcHJpdmF0aXNlYCksIGFzIHRoZVxuICAgKiAgd2hvbGUtc3RhdGUgY2xvbmUgbWFkZSBpdCBiZWZvcmUgOS4yOS4wLiBOb3Qgb25seSBmb3IgdGhlIHJlYWRzIHRoYXRcbiAgICogIGZvbGxvdzogYGRlZXBTbWFydE1lcmdlYCB1bmlvbnMgYXJyYXlzIEJZIFJFRkVSRU5DRSwgc28gd2hldGhlciBhblxuICAgKiAgZWxlbWVudCB0aGUgc3RhZ2UgcGFzc2VzIGluIGlzIFwiYWxyZWFkeSB0aGVyZVwiIGRlcGVuZHMgb24gd2hpY2ggb2JqZWN0c1xuICAgKiAgdGhlIGJhc2UgaG9sZHMg4oCUIGEgY29tbWl0dGVkIGFycmF5IHdvdWxkIGRlZHVwIGFuIGVsZW1lbnQgdGhlIHN0YWdlXG4gICAqICByZWFkIGZyb20gaXQgYmVmb3JlIGl0cyBmaXJzdCB3cml0ZSwgd2hlcmUgdGhlIHByaXZhdGUgY29weSAoYW5kXG4gICAqICA5LjI4LjApIGFwcGVuZHMgaXQuICovXG4gIG1lcmdlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiBhbnksIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICB0aGlzLmRldGFjaEhlbGRBbmNlc3RvcnMocGF0aCk7XG4gICAgdGhpcy5wcml2YXRpc2UocGF0aCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpID8/IHt9O1xuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBTbWFydE1lcmdlKGV4aXN0aW5nLCB2YWx1ZSk7XG4gICAgb3duU3BpbmUodGhpcy53b3JraW5nQ29weSwgcGF0aCwgdGhpcy5vd25lZCk7XG4gICAgb3duKG1lcmdlZCwgdGhpcy5vd25lZCk7XG4gICAgaWYgKGlzQ29udGFpbmVyKG1lcmdlZCkpIHRoaXMucHJpdmF0ZVRyZWVzLmFkZChtZXJnZWQpO1xuICAgIF9zZXQodGhpcy53b3JraW5nQ29weSwgcGF0aCwgbWVyZ2VkKTtcbiAgICBfc2V0KHRoaXMudXBkYXRlUGF0Y2gsIHBhdGgsIGRlZXBTbWFydE1lcmdlKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgcGF0aCkgPz8ge30sIHZhbHVlKSk7XG4gICAgaWYgKHNob3VsZFJlZGFjdCkge1xuICAgICAgdGhpcy5yZWRhY3RlZFBhdGhzLmFkZChrZXkpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlKHBhdGgsIGtleSwgJ21lcmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmllbGQtbGV2ZWwgcmVkYWN0aW9uICg5LjE5LjApOiBtYXJrIGRvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlIHN0YWdlZCBhdFxuICAgKiBgcGF0aGAgYXMgc2VjcmV0LCBzbyBgc2NydWJQYXRjaGAgc2NydWJzIHRoZW0gaW4gdGhlIGNvbW1pdCBsb2cgYW5kIHRoZVxuICAgKiBtaXJyb3IgdGhlIHNhbWUgd2F5IGEgd2hvbGUta2V5IHJlZGFjdGlvbiBpcyBzY3J1YmJlZC4gQSBmaWVsZCBpc1xuICAgKiByZWdpc3RlcmVkIGFzIGEgbGl0ZXJhbCBrZXkgQU5ELCB3aGVuIGRvdHRlZCwgYXMgdGhlIG5lc3RlZCBwYXRoIGl0XG4gICAqIG5hbWVzIOKAlCB3aGljaGV2ZXIgZXhpc3RzIGluIHRoZSBwYXRjaCBpcyB0aGUgb25lIGBzY3J1YlBhdGNoYCBmaW5kcy5cbiAgICogTWFya2VkIHBhdGhzIHN1cnZpdmUgY29tbWl0IG9ubHkgd2hpbGUgdGhlIG9wIHBhdGggdGhleSBzaXQgdW5kZXIgZG9lc1xuICAgKiAoc2VlIHtAbGluayBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzfSkuXG4gICAqL1xuICBtYXJrUmVkYWN0ZWRGaWVsZHMocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICB0aGlzLnJlZGFjdGVkUGF0aHMuYWRkKG5vcm1hbGlzZVBhdGgoWy4uLnBhdGgsIGZpZWxkXSkpO1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKCcuJykpIHRoaXMucmVkYWN0ZWRQYXRocy5hZGQobm9ybWFsaXNlUGF0aChbLi4ucGF0aCwgLi4uZmllbGQuc3BsaXQoJy4nKV0pKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRG9lcyBhIHJlZGFjdGlvbiBtYXJrIGFkZHJlc3MgYW4gYXJyYXkgRUxFTUVOVCByaWdodCBiZWxvdyBgcGF0aGBcbiAgICogKGBsaXN0LjEudG9rZW5gKT8gQW4gYGFwcGVuZGAgcm93IHJlLWJhc2VzIHRoZSBpbmRpY2VzIG9udG8gdGhlIHRhaWwsIHNvXG4gICAqIHN1Y2ggYSBwYXRoIHRha2VzIHRoZSB3aG9sZS12YWx1ZSBgc2V0YCAoYGRlbHRhRW5jb2RpbmcgwrcgcHVzaFZhbHVlUm93YCkuXG4gICAqIEEgbWFyayBieSBOQU1FIGJlbG93IGFuIGFycmF5IChgb2JqLnlgKSBtZWFucyB0aGUgc2FtZSB0aGluZyBvbiB0aGUgdGFpbFxuICAgKiBhcyBvbiB0aGUgd2hvbGUgdmFsdWUsIHNvIHRoZSBjb21wYWN0IHJvdyBzdGF5cyAoYnl0ZS1pZGVudGljYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWRCZWxvdyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBwcmVmaXggPSBwYXRoICsgREVMSU07XG4gICAgZm9yIChjb25zdCBtYXJrZWQgb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoIW1hcmtlZC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmV4dCA9IG1hcmtlZC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdChERUxJTSlbMF07XG4gICAgICBpZiAoL14oMHxbMS05XVxcZCopJC8udGVzdChuZXh0KSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0ZWQgcGF0aHMgdGhhdCBzdXJ2aXZlIHRoZSBuZXQtY2hhbmdlIGZpbHRlcjogYSBwYXRoIHN1cnZpdmVzXG4gICAqIHdoZW4gaXQgSVMgYSBzdXJ2aXZpbmcgb3AgcGF0aCAoYSB3aG9sZS1rZXkgcmVkYWN0aW9uKSBvciBzaXRzIFVOREVSIG9uZVxuICAgKiAoYSBmaWVsZCBpbnNpZGUgYSBzdXJ2aXZpbmcgd3JpdGUpLiBBIGRyb3BwZWQgb3AgdGFrZXMgaXRzIGZpZWxkcyB3aXRoIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKHN1cnZpdmluZ1BhdGhzOiBTZXQ8c3RyaW5nPik6IFNldDxzdHJpbmc+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5yZWRhY3RlZFBhdGhzKSB7XG4gICAgICBpZiAoc3Vydml2aW5nUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICAgIG91dC5hZGQocGF0aCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvcCBvZiBzdXJ2aXZpbmdQYXRocykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKG9wICsgREVMSU0pKSB7XG4gICAgICAgICAgb3V0LmFkZChwYXRoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgY3VycmVudCB2YWx1ZSBhdCBwYXRoIChpbmNsdWRlcyB1bmNvbW1pdHRlZCBjaGFuZ2VzKS4gVGhlIHZhbHVlIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biDigJQgcHJpdmF0ZSB0byBpdCwgYXMgdGhlIHdob2xlLXN0YXRlIGNsb25lIG1hZGUgZXZlcnkgcmVhZFxuICAgKiBhZnRlciB0aGUgZmlyc3Qgd3JpdGUgYmVmb3JlIDkuMjkuMCAoYHByaXZhdGlzZWApLlxuICAgKi9cbiAgZ2V0KHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGRlZmF1bHRWYWx1ZT86IGFueSkge1xuICAgIHRoaXMucHJpdmF0aXNlKHBhdGgpO1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgd29ya2luZyBjb3B5IGF0IGBwYXRoYCBXSVRIT1VUIHRha2luZyBhIHByaXZhdGUgY29weSDigJQgZm9yIGFcbiAgICogcmVhZGVyIHRoYXQgb25seSBjb21wYXJlcyAodGhlIGRldi1tb2RlIGJvcnJvd2VkLW11dGF0aW9uIHJlcG9ydCBpblxuICAgKiBgU3RhZ2VDb250ZXh0LmNvbW1pdGApLCBuZXZlciBmb3IgYSB2YWx1ZSBoYW5kZWQgdG8gYSBzdGFnZS5cbiAgICovXG4gIHBlZWsocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBfZ2V0KHRoaXMud29ya2luZ0NvcHksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCB1bmRlciBhIHJlYWQgdGhlIHdvcmtpbmcgY29weSBjYW5ub3QgYW5zd2VyLlxuICAgKlxuICAgKiBXaGVuIGB3b3JraW5nQ29weWAgaG9sZHMgbm90aGluZyBhdCBgcGF0aGAg4oCUIHRoZSBzdGFnZSBkZWxldGVkIG9yIHVuc2V0XG4gICAqIGl0LCBvciBhIHdyaXRlIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0IOKAlCBgU3RhZ2VDb250ZXh0IMK3XG4gICAqIHJlYWRTdGF0ZWAgc2VydmVzIHRoZSByZWFkIGZyb20gTElWRSBjb21taXR0ZWQgc3RhdGUsIGV4YWN0bHkgYXMgOS4yOC4wXG4gICAqIGRpZCwgc28gdGhlIHZhbHVlIGl0IGhhbmRzIG91dCBpcyBjb21taXR0ZWQgc3RhdGUgaXRzZWxmLiBPbiA5LjI4LjAgdGhlXG4gICAqIGRpZmYgYmFzZSB3YXMgYSB3aG9sZS1zdGF0ZSBjbG9uZSB0YWtlbiBhdCB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSwgYW5kXG4gICAqIGFuIGluLXBsYWNlIGVkaXQgb2YgdGhhdCB2YWx1ZSAob3V0IG9mIGNvbnRyYWN0IOKAlCByZWFkcyBhcmUgYm9ycm93ZWQpXG4gICAqIGNvdWxkIG5vdCBtb3ZlIGl0OiB3cml0dGVuIGJhY2ssIHRoZSBlZGl0IHdhcyByZWNvcmRlZC4gSGVyZSB0aGUgZGlmZlxuICAgKiBiYXNlIElTIGEgY29tbWl0dGVkIGdlbmVyYXRpb24sIGFuZCBpdCB2ZXJ5IG9mdGVuIGhvbGRzIHRoYXQgc2FtZVxuICAgKiBjb250YWluZXIgYXQgYHBhdGhgIOKAlCB0aGUgZWRpdCB3b3VsZCBtb3ZlIHRoZSBiYXNlIHdpdGggaXQsIGFuZCB0aGVcbiAgICogd3JpdGUtYmFjayB3b3VsZCBjb21taXQgbm8gY2hhbmdlLiBTbyBiZWZvcmUgdGhlIHZhbHVlIGdvZXMgb3V0LCB0aGVcbiAgICogYmFzZSdzIHZhbHVlIGF0IGBwYXRoYCBpcyByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5ICh0aGUgYmFzZSdzXG4gICAqIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIHRoZSB3YXkgY29waWVkIHNoYWxsb3dseSkg4oCUIHdoYXQgOS4yOC4wJ3NcbiAgICogYmFzZSBoZWxkIHRoZXJlLiBUaGUgY29tbWl0J3MgbmV0LWNoYW5nZSB0ZXN0IGNvbXBhcmVzIGFnYWluc3QgaXQgYW5kXG4gICAqIHRoZSBkZWx0YSBlbmNvZGVyIHJlcGxheXMgZnJvbSBpdDsgdGhlIHZhbHVlIGhhbmRlZCBvdXQgc3RheXMgdGhlIGxpdmVcbiAgICogb25lLCBzbyB3aGF0ZXZlciBlbHNlIGFuIGVkaXQgb2YgaXQgcmVhY2hlcyAobGl2ZSBzdGF0ZSwgdGhlIG5leHRcbiAgICogZ2VuZXJhdGlvbikgYmVoYXZlcyBhcyBvbiA5LjI4LjAgdG9vLlxuICAgKlxuICAgKiBOb3QgYHByaXZhdGlzZWA6IGEgcHJpdmF0ZSBjb3B5IGhhbmRlZCB0byB0aGUgc3RhZ2Ugd291bGQgYWxzbyBrZWVwIHRoZVxuICAgKiBlZGl0IG91dCBvZiBsaXZlIHN0YXRlLCB3aGVyZSA5LjI4LjAgbGV0IGl0IGluIOKAlCBhIHJ1bi1uYW1lc3BhY2VkIHJlYWRcbiAgICogdGhhdCBmYWxscyBiYWNrIHRvIGEgZ2xvYmFsIGtleSB3b3VsZCB0aGVuIGVuZCBkaWZmZXJlbnRseSAodGhlXG4gICAqIGRpZmZlcmVudGlhbCdzIE5FU1RFRCBmYW1pbHkgZmFpbHMgd2l0aGluIDEwMCBwcm9ncmFtcyB0aGF0IHdheSkuXG4gICAqXG4gICAqIENvcGllcyBub3RoaW5nIHdoZW4gdGhlIGJhc2UgaG9sZHMgbm8gY29udGFpbmVyIGF0IGBwYXRoYCwgYW5kIG5vdGhpbmdcbiAgICogdHdpY2U6IGEgcGF0aCBhdCBvciBiZWxvdyBhbiBlYXJsaWVyIGRldGFjaCBpcyBhbHJlYWR5IHByaXZhdGUuIE8ocGF0aClcbiAgICogb3RoZXJ3aXNlLCBwbHVzIE8odmFsdWUpIG9uY2UgcGVyIGRldGFjaGVkIHBhdGguXG4gICAqL1xuICBkZXRhY2hCYXNlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB2b2lkIHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgfHwgIWlzQ29udGFpbmVyKHRoaXMuYmFzZVNuYXBzaG90KSkgcmV0dXJuO1xuICAgIGxldCBhdDogb2JqZWN0ID0gdGhpcy5iYXNlU25hcHNob3Q7XG4gICAgZm9yIChjb25zdCBrIG9mIHBhdGgpIHtcbiAgICAgIGlmICh0aGlzLmRldGFjaGVkQmFzZT8uaGFzKGF0KSkgcmV0dXJuO1xuICAgICAgY29uc3QgY2hpbGQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGNoaWxkKSkgcmV0dXJuO1xuICAgICAgYXQgPSBjaGlsZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGV0YWNoZWRCYXNlPy5oYXMoYXQpKSByZXR1cm47XG4gICAgY29uc3Qgb3duZWQgPSAodGhpcy5iYXNlT3duZWQgPz89IG5ldyBXZWFrU2V0PG9iamVjdD4oKSk7XG4gICAgaWYgKCFvd25lZC5oYXModGhpcy5iYXNlU25hcHNob3QpKSB0aGlzLmJhc2VTbmFwc2hvdCA9IG93bmVkUm9vdE9mKHRoaXMuYmFzZVNuYXBzaG90LCBvd25lZCk7XG4gICAgb3duU3BpbmUodGhpcy5iYXNlU25hcHNob3QsIHBhdGgsIG93bmVkKTtcbiAgICBjb25zdCBjb3B5OiBvYmplY3QgPSBzdHJ1Y3R1cmVkQ2xvbmUoYXQpO1xuICAgICh0aGlzLmRldGFjaGVkQmFzZSA/Pz0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpKS5hZGQoY29weSk7XG4gICAgX3NldCh0aGlzLmJhc2VTbmFwc2hvdCwgcGF0aCwgY29weSk7XG4gIH1cblxuICAvKipcbiAgICogUHJpdmF0ZSByZWFkcyAoOS4yOS4wKTogbWFrZSB0aGUgdmFsdWUgYXQgYHBhdGhgIHRoZSBzdGFnZSdzIG93biBiZWZvcmVcbiAgICogYSByZWFkIGhhbmRzIGl0IG91dCDigJQgc28gYSByZWFkIGFmdGVyIHRoZSBzdGFnZSdzIGZpcnN0IHdyaXRlIGJlaGF2ZXNcbiAgICogZXhhY3RseSBhcyBpdCBkaWQgd2hlbiB0aGUgYnVmZmVyIGJlZ2FuIHdpdGggYSBkZWVwIGNsb25lIG9mIHRoZSB3aG9sZVxuICAgKiBzdGF0ZS4gQW4gaW4tcGxhY2UgZWRpdCBvZiB3aGF0IHRoZSByZWFkIHJldHVybmVkIChvdXQgb2YgY29udHJhY3Qg4oCUXG4gICAqIHJlYWRzIGFyZSBib3Jyb3dlZCkgc3RheXMgaW5zaWRlIHRoZSBidWZmZXIsIGFuZCBjb21taXR0ZWQgc3RhdGUgaXMgbmV2ZXJcbiAgICogdG91Y2hlZC4gV2hldGhlciB0aGUgUkVDT1JEIGtlZXBzIGl0IGlzIHRoZSBhZG1pdHRlZCByZWNvcmQncyBsYXdcbiAgICogKDkuMzAuMCwgb3duZXIgcnVsaW5nIFIxIOKAlCB0aGUgcmVjb3JkIGtlZXBzIHdoYXQgdGhlIHN0YWdlIHJlYWQgYmFjayk6IGl0XG4gICAqIGlzIGtlcHQgd2hlbiB0aGUgZWRpdGVkIHZhbHVlIGxpZXMgYXQgb3IgYmVsb3cgYSBwYXRoIHRoZSBzdGFnZSB3cm90ZSBpblxuICAgKiB0aGlzIHN0YWdlIOKAlCBzZXQsIG1lcmdlZCBvciB3cml0dGVuIGJhY2sgYWxpa2Ug4oCUIGFuZCBsb3N0IG90aGVyd2lzZS5cbiAgICpcbiAgICogV2Fsa2luZyB0aGUgcGF0aCBmcm9tIHRoZSAob3duZWQpIHJvb3Q6XG4gICAqICAtIGEgY29udGFpbmVyIHN0aWxsIFNIQVJFRCB3aXRoIGNvbW1pdHRlZCBzdGF0ZSBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpc1xuICAgKiAgICByZXBsYWNlZCBieSBhIHByaXZhdGUgZGVlcCBjb3B5IHdoZW4gaXQgaXMgdGhlIHZhbHVlIHJlYWQsIG9yIGJ5IGFcbiAgICogICAgc2hhbGxvdyBjb3B5IHdoZW4gaXQgaXMgYSBjb250YWluZXIgb24gdGhlIHdheSB0byBpdCAoc28gYSByZWFkIG9mXG4gICAqICAgIGBrYCB1bmRlciBhIGZvcmsgY2hpbGQncyBhZGRyZXNzIGNvcGllcyBga2AsIG5vdCBldmVyeSBjaGlsZCdzIG5hbWVzcGFjZSk7XG4gICAqICAtIGEgY29udGFpbmVyIHRoZSBzdGFnZSBTVEFHRUQgKG9yIGFueXRoaW5nIGVsc2UgdGhlIGJ1ZmZlciBkaWQgbm90XG4gICAqICAgIHRha2UgZnJvbSBjb21taXR0ZWQgc3RhdGUpIGlzIGhhbmRlZCBiYWNrIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlO1xuICAgKiAgLSBhIGNvbnRhaW5lciB0aGUgYnVmZmVyIG93bnMgaXMgd2Fsa2VkIG9uIOKAlCBhbmQgd2hlbiBpdCBpcyB0aGUgdmFsdWVcbiAgICogICAgcmVhZCwgaXRzIHN0aWxsLXNoYXJlZCBkZXNjZW5kYW50cyBhcmUgcHJpdmF0aXNlZFxuICAgKiAgICAoe0BsaW5rIHByaXZhdGlzZUJlbG93fSkuXG4gICAqXG4gICAqIENvc3Q6IE8ocGF0aCkgcGVyIHJlYWQsIHBsdXMgTyh2YWx1ZSkgT05DRSBwZXIgc2hhcmVkIGNvbnRhaW5lciBhIHN0YWdlXG4gICAqIHJlYWRzIGFmdGVyIGl0cyBmaXJzdCB3cml0ZS4gQSBzdGFnZSB0aGF0IG5ldmVyIHJlYWRzIGFmdGVyIHdyaXRpbmcgcGF5c1xuICAgKiBub3RoaW5nOyBhIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBuZXZlciByZWFjaGVzIHRoZSBidWZmZXIuXG4gICAqL1xuICBwcml2YXRlIHByaXZhdGlzZShwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdm9pZCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgLy8gUmVzb2x2ZSBmaXJzdDogYSByZWFkIHRoYXQgbGFuZHMgb24gbm90aGluZyAoYSBtaXNzaW5nIGtleSwgYSByZWZ1c2VkXG4gICAgLy8gc2VnbWVudCwgYSBwcmltaXRpdmUpIHJldHVybnMgbm90aGluZyBhbmQgbXVzdCBjb3B5IG5vdGhpbmcuXG4gICAgY29uc3QgY2hhaW46IG9iamVjdFtdID0gW107XG4gICAgbGV0IGF0OiB1bmtub3duID0gdGhpcy53b3JraW5nQ29weTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgcGF0aCkge1xuICAgICAgYXQgPSBvd25DaGlsZChhdCwgayk7XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKGF0KSkgcmV0dXJuO1xuICAgICAgY2hhaW4ucHVzaChhdCk7XG4gICAgfVxuICAgIGxldCBwYXJlbnQ6IGFueSA9IHRoaXMud29ya2luZ0NvcHk7XG4gICAgbGV0IGJhc2U6IHVua25vd24gPSB0aGlzLmJhc2VTbmFwc2hvdDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQoYmFzZSwgayk7XG4gICAgICBsZXQgdmFsdWUgPSBjaGFpbltpXTtcbiAgICAgIGlmICghdGhpcy5vd25lZC5oYXModmFsdWUpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gYXRCYXNlIHx8IHRoaXMuc3RhZ2VkLmhhcyh2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgaWYgKGkgPT09IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBhcmVudFtrXSA9IHRoaXMucHJpdmF0ZUNvcHlPZih2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gc2hhbGxvd0NvcHkodmFsdWUpO1xuICAgICAgICB0aGlzLm93bmVkLmFkZCh2YWx1ZSk7XG4gICAgICAgIHBhcmVudFtrXSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gdmFsdWU7XG4gICAgICBiYXNlID0gYXRCYXNlO1xuICAgIH1cbiAgICB0aGlzLnByaXZhdGlzZUJlbG93KHBhcmVudCwgYmFzZSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gT1dORUQgY29udGFpbmVyIGlzIGFib3V0IHRvIGJlIHJlYWQgd2hvbGUgKGEgcGF0aCBjb3B5IGEgbmVzdGVkIHdyaXRlXG4gICAqIG1hZGUsIHNheSk6IGl0cyBkZXNjZW5kYW50cyBzdGlsbCBzaGFyZWQgd2l0aCBjb21taXR0ZWQgc3RhdGUgYXJlXG4gICAqIHJlcGxhY2VkIGJ5IHByaXZhdGUgZGVlcCBjb3BpZXMsIHNvIG5vdGhpbmcgdGhlIHJlYWQgaGFuZHMgb3V0IGlzXG4gICAqIGNvbW1pdHRlZCBzdGF0ZS4gV2Fsa3Mgb3duZWQgY29udGFpbmVycyBvbmx5OyBtYXJrcyBlYWNoIG9uZSBmaW5pc2hlZFxuICAgKiAoe0BsaW5rIHByaXZhdGVUcmVlc30pLCBzbyBhIGNvbnRhaW5lciBpcyBzY2FubmVkIG9uY2UgcGVyIHN0YWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBwcml2YXRpc2VCZWxvdyhjb250YWluZXI6IG9iamVjdCwgYmFzZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHdvcms6IEFycmF5PFtvYmplY3QsIHVua25vd25dPiA9IFtbY29udGFpbmVyLCBiYXNlXV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgW25vZGUsIG5vZGVCYXNlXSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKHRoaXMucHJpdmF0ZVRyZWVzLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG93bkNoaWxkKG5vZGUsIGtleSk7XG4gICAgICAgIGlmICghaXNDb250YWluZXIoY2hpbGQpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXRCYXNlID0gb3duQ2hpbGQobm9kZUJhc2UsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLm93bmVkLmhhcyhjaGlsZCkpIHdvcmsucHVzaChbY2hpbGQsIGF0QmFzZV0pO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCA9PT0gYXRCYXNlICYmICF0aGlzLnN0YWdlZC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgKG5vZGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0gPSB0aGlzLnByaXZhdGVDb3B5T2YoY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByaXZhdGVUcmVlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgcHJpdmF0ZSBkZWVwIGNvcHkgb2YgYSBjb21taXR0ZWQgY29udGFpbmVyIOKAlCBvd25lZCB0aHJvdWdoIGFuZCB0aHJvdWdoLiAqL1xuICBwcml2YXRlIHByaXZhdGVDb3B5T2YodmFsdWU6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gICAgYWRvcHQoY29weSwgdGhpcy5vd25lZCk7XG4gICAgdGhpcy5wcml2YXRlVHJlZXMuYWRkKGNvcHkpO1xuICAgIHJldHVybiBjb3B5O1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCBhbnkgc3RhZ2VkIG9wIHRvdWNoIGBwYXRoYCwgb3IgYSBwYXRoIGFib3ZlIG9yIGJlbG93IGl0P1xuICAgKlxuICAgKiBUaGUgZGV2LW1vZGUgYm9ycm93ZWQtcmVhZCBjaGVjayAoYFN0YWdlQ29udGV4dC5jb21taXRgKSBhc2tzIHRoaXMgYmVmb3JlXG4gICAqIGFjY3VzaW5nIGEgc3RhZ2Ugb2YgbXV0YXRpbmcgYSB2YWx1ZSBpbiBwbGFjZTogYSBrZXkgdGhlIHN0YWdlIGxlZ2l0aW1hdGVseVxuICAgKiBXUk9URSBpcyBleHBlY3RlZCB0byBkaWZmZXIgZnJvbSB3aGF0IGl0IHJlYWQsIGFuZCB3cml0ZXMgcmVhY2ggdGhlIGJ1ZmZlclxuICAgKiBmcm9tIHBhdGhzIHRoYXQgYnlwYXNzIHVzZXItbGV2ZWwgd3JpdGUgdHJhY2tpbmcgdG9vICh0aGUgc3ViZmxvdyBzZWVkLFxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCB0aGUgcmVzdW1lIHJlLXNlZWQpLiBEZXYtbW9kZSBvbmx5IOKAlCBub3RoaW5nIG9uXG4gICAqIHRoZSBob3QgcGF0aCBjYWxscyBpdC5cbiAgICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbm9ybWFsaXNlUGF0aChwYXRoKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgLy8gT24gdGhlIHBhdGgsIGJlbG93IGl0IG9yIGFib3ZlIGl0IOKAlCB0aGUgb25lIHBhdGggcmVsYXRpb24gZXZlcnkga2V5IHF1ZXJ5IGFza3MuXG4gICAgICBpZiAocmVsYXRpb24ob3AucGF0aCwgdGFyZ2V0KSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIGFsbCBzdGFnZWQgbXV0YXRpb25zIGFuZCByZXR1cm4gdGhlIGNvbW1pdCBidW5kbGUg4oCUIHJlY29yZGluZyB0aGVcbiAgICogc3RhZ2UncyBORVQgQ0hBTkdFLCBub3QgaXRzIHJhdyB3cml0ZSBsb2cuXG4gICAqXG4gICAqIOKUgOKUgCBXSFkgKHRoZSBkZWZlY3QgdGhpcyBmaXhlcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIFByZXZpb3VzbHkgZXZlcnkgYHNldGAvYG1lcmdlYCB3YXMgcmVjb3JkZWQgdmVyYmF0aW0sIHNvIHRoZSBjb21taXQgYnVuZGxlXG4gICAqIHdhcyBhIGxvZyBvZiAqb3BlcmF0aW9ucyogcmF0aGVyIHRoYW4gKmNoYW5nZXMqLiBUd28gb3BlcmF0aW9ucyBwcm9kdWNlIG5vXG4gICAqIG5ldCBjaGFuZ2UgeWV0IHdlcmUgc3RpbGwgY29tbWl0dGVkIGFzIFwibXV0YXRpb25zXCI6XG4gICAqXG4gICAqICAgMS4gTm8tb3Agd3JpdGUgICDigJQgd3JpdGluZyBhIGtleSB0aGUgdmFsdWUgaXQgYWxyZWFkeSBob2xkcyAoZS5nLiBhblxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhZ2VudCBjb250ZXh0IHNsb3QgcmUtZW1pdHRpbmcgaWRlbnRpY2FsIGNvbnRlbnQgZXZlcnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgdHVybikuIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0xLlxuICAgKiAgIDIuIFdyaXRlLXJldmVydCAg4oCUIGNoYW5naW5nIHRoZW4gcmVzdG9yaW5nIGEga2V5IHdpdGhpbiBvbmUgc3RhZ2UuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJhc2UgSz0xLCBzdGFnZSB3cml0ZXMgSz0yIHRoZW4gSz0xLlxuICAgKlxuICAgKiBSZWNvcmRpbmcgdGhlc2UgYXMgbXV0YXRpb25zIChhKSBibG9hdGVkIGNhdXNhbCBzbGljaW5nIC8gYmFja3RyYWNraW5nIHdpdGhcbiAgICogc3B1cmlvdXMgZGVwZW5kZW5jaWVzIG9uIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBuZXZlciByZWFjaCBmaW5hbCBzdGF0ZSxcbiAgICogYW5kIChiKSBtYWRlIGRvd25zdHJlYW0gXCJ3aGF0IGNoYW5nZWQgaGVyZT9cIiBjb25zdW1lcnMgbGlnaHQgdXAgc3RhZ2VzIHRoYXRcbiAgICogY2hhbmdlZCBub3RoaW5nIOKAlCBtb3N0IHZpc2libHkgdGhlIGxlbnMgaGlnaGxpZ2h0IGZsYWdnaW5nIGV2ZXJ5IHNsb3QuXG4gICAqXG4gICAqIOKUgOKUgCBIT1cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqIEF0IGNvbW1pdCB3ZSBob2xkIEJPVEggYGJhc2VTbmFwc2hvdGAgKHN0YXRlIHdoZW4gdGhlIHN0YWdlIGJlZ2FuKSBhbmRcbiAgICogYHdvcmtpbmdDb3B5YCAoc3RhdGUgYWZ0ZXIgYWxsIGl0cyB3cml0ZXMpLiBGb3IgZWFjaCBwYXRoIHRoZSBzdGFnZSB0b3VjaGVkXG4gICAqIHdlIGtlZXAgaXQgaW4gdGhlIGJ1bmRsZSBPTkxZIGlmIGl0cyBmaW5hbCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIGJhc2VcbiAgICogdmFsdWUgKHtAbGluayBkZWVwRXF1YWx9KS4gTm8tb3AgQU5EIHdyaXRlLXJldmVydCBwYXRocyBkcm9wIG91dCwgYmVjYXVzZVxuICAgKiBib3RoIGNvbXBhcmUgZXF1YWwgdG8gYmFzZS4gVGhpcyBpcyBhIHNpbmdsZSBuZXQtZGVsdGEgZGlmZiBhdCBjb21taXQgdGltZVxuICAgKiDigJQgb25lIGRlZXAgY29tcGFyZSBwZXIgdG91Y2hlZCBwYXRoLCBPKGNoYW5nZWQgc3RhdGUpLCBwYWlkIG9uY2UgcGVyIHN0YWdlXG4gICAqIChOT1QgcGVyIHdyaXRlKS4gQSBuYWl2ZSBwZXItd3JpdGUgZGVlcC1lcXVhbCBza2lwIHdvdWxkIGJlIG1vcmUgZXhwZW5zaXZlXG4gICAqIGFuZCB3b3VsZCBzdGlsbCBtaXNzIHdyaXRlLXJldmVydCAodGhlIGludGVybWVkaWF0ZSB3cml0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAqIHZhbHVlIHByZXNlbnQgYXQgdGhlIG1vbWVudCBvZiB3cml0aW5nKS5cbiAgICpcbiAgICog4pSA4pSAIFRXTyBIT05FU1QgVElFUlMgKGJ5IGRlc2lnbiDigJQgZG8gbm90IFwidW5pZnlcIiB0aGVtKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogICDigKIgY29tbWl0IChoZXJlKSAgID0gQ0hBTkdFLWxldmVsIOKAlCB0cnV0aGZ1bCBuZXQgZGVsdGEuIEZlZWRzIHRoZSBjb21taXRcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGxvZywgY2F1c2FsIGNoYWluLCBuYXJyYXRpdmUsIGFuZCB0aGUgbGVucyBoaWdobGlnaHQuXG4gICAqICAg4oCiIGBvbldyaXRlYCBldmVudCA9IE9QLWxldmVsIOKAlCBmaXJlcyBvbiBFVkVSWSB3cml0ZSBhdHRlbXB0IHJlZ2FyZGxlc3Mgb2ZcbiAgICogICAgICAgICAgICAgICAgICAgICAgIG5ldCBjaGFuZ2UuIEZlZWRzIG1ldHJpY3MgLyBiZWhhdmlvdXJhbCBvYnNlcnZhYmlsaXR5XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAoYSBkZWJ1Z2dlciB3YW50cyB0byBzZWUgXCJ3cm90ZSAyLCB0aGVuIHJldmVydGVkXCIpLlxuICAgKiBgb25Xcml0ZWAgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgbWV0aG9kOyBvbmx5IHRoZSBDT01NSVQgYmVjb21lcyBjaGFuZ2Utb25seS5cbiAgICpcbiAgICog4pSA4pSAIEVNUFRZIENPTU1JVFMgQVJFIElOVEVOVElPTkFMIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgKiBBIHN0YWdlIHRoYXQgbmV0cyBubyBjaGFuZ2UgY29tbWl0cyBhbiBFTVBUWSBwYXRjaCDigJQgTk9UIG5vdGhpbmcuXG4gICAqIHtAbGluayBTdGFnZUNvbnRleHQuY29tbWl0fSBzdGlsbCByZWNvcmRzIHRoZSBidW5kbGUgdW5jb25kaXRpb25hbGx5LCBzb1xuICAgKiBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3AgKGl0cyBgcnVudGltZVN0YWdlSWRgXG4gICAqIG1hcmtlciBpcyBwcmVzZXJ2ZWQpOyBvbmx5IGl0cyBQQVRDSCBpcyBlbXB0eS4gVGhpcyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgKiBjb21taXQtaW5kZXhlZCBzbGlkZXIgc3RhYmxlIHdoaWxlIG1ha2luZyB0aGUgaGlnaGxpZ2h0IHRydXRoZnVsLlxuICAgKlxuICAgKiDilIDilIAgS05PV04gTElNSVRBVElPTlMgLyBGVVRVUkUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqICAg4oCiIEV4cGxpY2l0IGtleSBERUxFVElPTiB1bmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSBpcyBzdGlsbFxuICAgKiAgICAgZmxhdHRlbmVkIHRvIHNldC1vZi1gdW5kZWZpbmVkYCAoYSByZW1vdmVkIGtleSBjYW5ub3QgYmUgZXhwcmVzc2VkXG4gICAqICAgICBpbiBNZW1vcnlQYXRjaCBhbG9uZSkuIENMT1NFRCB1bmRlciBgY29tbWl0VmFsdWVzOiAnZGVsdGEnYCAoIzEzYy1CKTpcbiAgICogICAgIHtAbGluayBkZWxldGV9IHN0YWdlcyBhIGRpc3RpbmN0IG9wIGFuZCB0aGUgYnVuZGxlIGNhcnJpZXMgYSByZWFsXG4gICAqICAgICBgZGVsZXRlYCB0cmFjZSB2ZXJiIHdob3NlIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuXG4gICAqICAg4oCiIEFycmF5LW1lcmdlIGRlZHVwIGluIHtAbGluayBkZWVwU21hcnRNZXJnZX0gc3RpbGwgdXNlcyByZWZlcmVuY2UgZXF1YWxpdHlcbiAgICogICAgIChgbmV3IFNldGApLCBzbyBkZWVwLWVxdWFsICpvYmplY3RzKiBpbiBhIG1lcmdlZCBhcnJheSBhcmUgbm90IGRlZHVwZWQuXG4gICAqICAgICBPcnRob2dvbmFsIHRvIHRoaXMgY2hhbmdlOyB0cmFja2VkIHNlcGFyYXRlbHkuXG4gICAqXG4gICAqIFJlc2V0cyB0aGUgYnVmZmVyIHRvIGVtcHR5IHN0YXRlIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIGNvbW1pdCgpOiB7XG4gICAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaDtcbiAgICB1cGRhdGVzOiBNZW1vcnlQYXRjaDtcbiAgICByZWRhY3RlZFBhdGhzOiBTZXQ8c3RyaW5nPjtcbiAgICB0cmFjZTogVHJhY2VFbnRyeVtdO1xuICB9IHtcbiAgICBjb25zdCByb3dzID0gdGhpcy5jb21taXRWYWx1ZXMgPT09ICdkZWx0YScgPyB0aGlzLnRvRGVsdGFQYXlsb2FkKCkgOiB0aGlzLnRvQ2hhbmdlT25seVBheWxvYWQoKTtcbiAgICBjb25zdCByZWRhY3RlZFBhdGhzID0gdGhpcy5zdXJ2aXZpbmdSZWRhY3RlZFBhdGhzKG5ldyBTZXQocm93cy50cmFjZS5tYXAoKHQpID0+IHQucGF0aCkpKTtcbiAgICAvLyBUaGUgYnVuZGxlJ3Mga2V5IG9yZGVyIGlzIGByZWNvcmRDb21taXRgJ3M7IGEgZGlyZWN0IGNhbGxlciBrZWVwcyB0aGlzIHNhbWUgb3JkZXIuXG4gICAgY29uc3QgcGF5bG9hZCA9IHsgb3ZlcndyaXRlOiByb3dzLm92ZXJ3cml0ZSwgdXBkYXRlczogcm93cy51cGRhdGVzLCByZWRhY3RlZFBhdGhzLCB0cmFjZTogcm93cy50cmFjZSB9O1xuXG4gICAgdGhpcy5vdmVyd3JpdGVQYXRjaCA9IHt9O1xuICAgIHRoaXMudXBkYXRlUGF0Y2ggPSB7fTtcbiAgICB0aGlzLm9wVHJhY2UubGVuZ3RoID0gMDtcbiAgICB0aGlzLnJlZGFjdGVkUGF0aHMuY2xlYXIoKTtcbiAgICB0aGlzLmhlbGRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy53b3JraW5nQ29weSA9IHt9O1xuICAgIHRoaXMub3duZWQgPSBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMub3duZWQuYWRkKHRoaXMud29ya2luZ0NvcHkpO1xuICAgIHRoaXMuc3RhZ2VkID0gbmV3IFdlYWtTZXQoKTtcbiAgICB0aGlzLnByaXZhdGVUcmVlcyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgdGhpcy5zdGFnZWRNZXJnZXMgPSAwO1xuICAgIHRoaXMubmVzdGVkT3BzID0gMDtcblxuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGQgb3ZlcndyaXRlIC8gdXBkYXRlcyAvIHRyYWNlIGtlZXBpbmcgT05MWSBwYXRocyB3aG9zZSBmaW5hbCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGJhc2UgdmFsdWUg4oCUIGkuZS4gdGhlIHN0YWdlJ3MgbmV0IGNoYW5nZS4gU2VlXG4gICAqIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXR9IGZvciB0aGUgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBQYXRocyBhcmUgY29tcGFyZWQgYXQgdGhlIGV4YWN0IGdyYW51bGFyaXR5IHRoZXkgd2VyZSB3cml0dGVuIChlYWNoIHRyYWNlXG4gICAqIGVudHJ5J3MgcGF0aCksIGFnYWluc3QgYHdvcmtpbmdDb3B5YCAoZmluYWwpIHZzIGBiYXNlU25hcHNob3RgIChzdGFydCkuXG4gICAqIFN1cnZpdmluZyBgc2V0YCBwYXRocyBjb3B5IHRoZWlyIGZpbmFsIHZhbHVlIGZyb20gYG92ZXJ3cml0ZVBhdGNoYDtcbiAgICogc3Vydml2aW5nIGBtZXJnZWAgcGF0aHMgY29weSB0aGVpciBhY2N1bXVsYXRlZCBkZWx0YSBmcm9tIGB1cGRhdGVQYXRjaGAsXG4gICAqIGtlZXBpbmcgdGhlIHNldC12cy1tZXJnZSB2ZXJiIOKAlCBhbmQgdGhlIHJlc3VsdCBpcyBBRE1JVFRFRCAoe0BsaW5rIGFkbWl0fSk6XG4gICAqIGEgZmFtaWx5IG9mIHJvd3Mgd2hvc2UgcmVwbGF5IGRvZXMgbm90IGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGlzXG4gICAqIHJlY29yZGVkIGFzIGBzZXRgIHJvd3Mgb2YgdGhlIHJlYWQtYmFjayBpbnN0ZWFkICg5LjMwLjApLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBERUZBVUxUIChgY29tbWl0VmFsdWVzOiAnZnVsbCdgKSBwYXlsb2FkLCBpbmNsdWRpbmcgdGhlXG4gICAqIGhpc3RvcmljYWwgZmxhdHRlbmluZyBvZiBzdGFnZWQgYGRlbGV0ZWAgb3BzIGludG8gYHNldGAtb2YtYHVuZGVmaW5lZGBcbiAgICogdHJhY2UgZW50cmllcy4gVGhlIGRlbHRhIGVuY29kaW5nIGxpdmVzIGluIHtAbGluayB0b0RlbHRhUGF5bG9hZH0uXG4gICAqXG4gICAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogdGhlIG5ldC1jaGFuZ2UgdmVyZGljdCBpcyBwYWlkIG9uY2UgcGVyIFBBVEhcbiAgICogYW5kIHRoZSBjbG9uZSBvbmNlIHBlciBDT05TRUNVVElWRSBydW4gb2Ygb3BzIG9uIGEgcGF0aCwgbm90IG9uY2UgcGVyIG9wXG4gICAqIOKAlCBzZWUgdGhlIHR3byBtZW1vcyBpbnNpZGUuIFBpbm5lZCBieVxuICAgKiB0ZXN0L2xpYi9tZW1vcnkvc2NlbmFyaW8vcmVwZWF0ZWQtcGF0aC1ieXRlLWlkZW50aXR5LnRlc3QudHMgYWdhaW5zdCB0aGVcbiAgICogOS4yMi4wIGJ5dGVzLiBTaW5jZSA5LjIzLjAgdGhhdCBjbG9uZSBpcyBUSEUgY2xvbmU6IHRoZSBwYXRjaCB0cmVlcyBob2xkXG4gICAqIHRoZSBjYWxsZXIncyByZWZlcmVuY2VzIChzZWUgdGhlIGNsYXNzIGhlYWRlciksIHNvIHRoaXMgbG9vcCBpcyB0aGUgb25lXG4gICAqIHBsYWNlIHRoZSByZWNvcmQgaXMgZGV0YWNoZWQgZnJvbSB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSB0b0NoYW5nZU9ubHlQYXlsb2FkKCk6IFJvd3Mge1xuICAgIHJldHVybiB0aGlzLmFkbWl0KChsb3NzeSkgPT4gdGhpcy5jaGFuZ2VPbmx5Um93cyhsb3NzeSkpO1xuICB9XG5cbiAgLyoqIFRoZSAnZnVsbCcgcm93czsgYSBmYW1pbHkgaW4gYGxvc3N5YCBpcyB3cml0dGVuIGFzIGl0cyByZWFkLWJhY2ssIGF0IGl0cyBsYXN0IHRvdWNoICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkuICovXG4gIHByaXZhdGUgY2hhbmdlT25seVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKTogUm93cyB7XG4gICAgY29uc3Qgcm93czogUm93cyA9IHsgb3ZlcndyaXRlOiB7fSwgdXBkYXRlczoge30sIHRyYWNlOiBbXSB9O1xuICAgIGNvbnN0IHsgb3ZlcndyaXRlLCB1cGRhdGVzLCB0cmFjZSB9ID0gcm93cztcbiAgICAvLyBQZXIgUEFUSCwgZGVjaWRlZCBvbmNlICg5LjIyLjEpOiBiYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmUgZml4ZWQgYXRcbiAgICAvLyBjb21taXQsIHNvIGV2ZXJ5IGxhdGVyIG9wIG9uIGEgcGF0aCBnZXRzIHRoZSB2ZXJkaWN0IGl0cyBmaXJzdCBvcCBnb3QuXG4gICAgLy8gYHVuZGVmaW5lZGAgPSBub3QgeWV0IGRlY2lkZWQ7IHRoZSBzdXJ2aXZpbmcgcGF0aHMgYXJlIHRoZSBgdHJ1ZWAga2V5cy5cbiAgICBjb25zdCBzdXJ2aXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICAgIC8vIFRoZSBwYXRoIHRoZSBMQVNUIHN1cnZpdmluZyBvcCBjb3BpZWQgaW50byBlYWNoIHBhdGNoIHRyZWUgKDkuMjIuMSkuXG4gICAgLy8gVGhlIHZhbHVlIGF0IGEgcGF0aCBpcyBmaXhlZCBhdCBjb21taXQsIHNvIGFuIG9wIHdob3NlIHByZWRlY2Vzc29yIG9uXG4gICAgLy8gdGhlIFNBTUUgdHJlZSBhbHJlYWR5IGNvcGllZCB0aGF0IHBhdGggd291bGQgd3JpdGUgdGhlIHNhbWUgYnl0ZXMgb3ZlclxuICAgIC8vIHRoZSBzYW1lIGtleSDigJQgaXQga2VlcHMgaXRzIHRyYWNlIHJvdyAodGhlIGxvZyBpcyBieXRlLWlkZW50aWNhbCkgYW5kXG4gICAgLy8gcGF5cyBubyBzZWNvbmQgY2xvbmUuIFRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgc3RhZ2VzIE5cbiAgICAvLyB3aG9sZS1hcnJheSBzZXRzIG9uIE9ORSBwYXRoOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhhdCBjb21taXQgTyhOKVxuICAgIC8vIGluc3RlYWQgb2YgTyhOIMOXIG9wcykuIENPTlNFQ1VUSVZFIG9ubHkg4oCUIGFuIG9wIG9uIGFub3RoZXIgcGF0aCBpblxuICAgIC8vIGJldHdlZW4gbWF5IGhhdmUgY29lcmNlZCBvciBncm93biB0aGlzIG9uZSdzIGNvbnRhaW5lciAoYSBkZXNjZW5kYW50XG4gICAgLy8gYG5hdGl2ZVNldGAgdGhyb3VnaCBhIHByaW1pdGl2ZSwgYSBga2V5OiB1bmRlZmluZWRgIHNoZWxsKSBhbmQgdGhlXG4gICAgLy8gcmUtY29weSBpcyB3aGF0IHJlcGFpcnMgaXQ7IGEgYG1lcmdlYCBiZXR3ZWVuIHR3byBzZXRzIHRvdWNoZXMgdGhlXG4gICAgLy8gb3RoZXIgdHJlZSBhbmQgZG9lcyBub3QgY291bnQuIFNhbWUgbGF3IGFzIGBzdXBlcnNlZGVkQnlOZXh0U2V0YC5cbiAgICBsZXQgbGFzdFNldFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbGFzdE1lcmdlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgZmFtaWx5ID0gbG9zc3k/LmZhbWlsaWVzLmdldChsb3NzeS5yb290T2YuZ2V0KG9wLnBhdGgpIGFzIHN0cmluZyk7XG4gICAgICBpZiAoZmFtaWx5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGkgPT09IGZhbWlseS5zbG90KSB7XG4gICAgICAgICAgdGhpcy5lbWl0UmVhZEJhY2soZmFtaWx5LCByb3dzLCAnZnVsbCcpO1xuICAgICAgICAgIGxhc3RTZXRQYXRoID0gbGFzdE1lcmdlUGF0aCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBrZWVwID0gc3Vydml2ZXMuZ2V0KG9wLnBhdGgpO1xuICAgICAgaWYgKGtlZXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZWVwID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKTtcbiAgICAgICAgc3Vydml2ZXMuc2V0KG9wLnBhdGgsIGtlZXApO1xuICAgICAgfVxuICAgICAgaWYgKCFrZWVwKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcblxuICAgICAgdHJhY2UucHVzaChmbGF0dGVuZWRUcmFjZVJvdyhvcCkpO1xuICAgICAgaWYgKG9wLnZlcmIgPT09ICdtZXJnZScpIHtcbiAgICAgICAgaWYgKGxhc3RNZXJnZVBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0TWVyZ2VQYXRoID0gb3AucGF0aDtcbiAgICAgICAgY29uc3Qgc2VnbWVudHMgPSBvcC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgX3NldCh1cGRhdGVzLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy51cGRhdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobGFzdFNldFBhdGggPT09IG9wLnBhdGgpIGNvbnRpbnVlO1xuICAgICAgICBsYXN0U2V0UGF0aCA9IG9wLnBhdGg7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gb3AucGF0aC5zcGxpdChERUxJTSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgc3RydWN0dXJlZENsb25lKF9nZXQodGhpcy5vdmVyd3JpdGVQYXRjaCwgc2VnbWVudHMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbHRhLWVuY29kZWQgcGF5bG9hZCAoYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsICMxM2MtQikg4oCUIHNhbWUgbmV0LWNoYW5nZVxuICAgKiBmaWx0ZXIgYXMge0BsaW5rIHRvQ2hhbmdlT25seVBheWxvYWR9LCB0aHJlZSBlbmNvZGluZyBkaWZmZXJlbmNlczpcbiAgICpcbiAgICogMS4gKipPbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoKiogKHRoZSDCpzIuNSBkZWR1cCBydWxlIOKAlCBgYXBwZW5kYFxuICAgKiAgICBpcyBOT1QgaWRlbXBvdGVudCBvbiByZXBsYXksIHNvIGR1cGxpY2F0ZSBlbnRyaWVzIHdvdWxkIG11bHRpcGx5XG4gICAqICAgIHRhaWxzKS4gVGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIG9wIG1peCArIGJhc2XihpJmaW5hbFxuICAgKiAgICByZWxhdGlvbnNoaXA7IGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgZWFjaCBwYXRoJ3MgTEFTVCB0b3VjaCxcbiAgICogICAgcHJlc2VydmluZyBsYXN0LXdyaXRlci13aW5zIGZvciBuZXN0ZWQvb3ZlcmxhcHBpbmcgcGF0aHMuXG4gICAqIDIuICoqVmVyYiByZXNvbHV0aW9uIHBlciBwYXRoKiog4oCUIGZvciBhIHBhdGggd2l0aCBOTyBzdXJ2aXZpbmcgcmVsYXRpdmVcbiAgICogICAgKHNlZSAzKTpcbiAgICogICAgLSBsYXN0IG9wIGAnZGVsZXRlJ2AgQU5EIGZpbmFsIHZhbHVlIGdvbmUg4oaSIGBkZWxldGVgICh0aGUgcGF0aCBzdGF5c1xuICAgKiAgICAgIGVudW1lcmF0ZWQgaW4gYG92ZXJ3cml0ZWAgd2l0aCBgdW5kZWZpbmVkYCBmb3Iga2V5LXNldCBjb25zdW1lcnMpLlxuICAgKiAgICAgIFJlcXVpcmVzIHRoZSBwYXJlbnQgdG8gYmUgYSByZWFsIGNvbnRhaW5lciBpbiB0aGUgYmFzZSDigJQgcmVwbGF5IHVzZXNcbiAgICogICAgICBgbmF0aXZlRGVsZXRlYCwgd2hpY2ggaXMgaW5lcnQgb24gYSBwcmltaXRpdmUvYWJzZW50IHBhcmVudCwgd2hlcmVhc1xuICAgKiAgICAgIHRoZSBgJ2Z1bGwnYCBmbGF0dGVuaW5nIChgX3NldGAgb2YgYHVuZGVmaW5lZGApIENPRVJDRVMgdGhhdCBwYXJlbnRcbiAgICogICAgICBpbnRvIGFuIG9iamVjdDsgd2hlbiB0aGV5IHdvdWxkIGRpc2FncmVlIHdlIGtlZXAgdGhlIGZsYXR0ZW5pbmc7XG4gICAqICAgIC0gT05MWSBgJ21lcmdlJ2Agb3BzIOKGkiBgbWVyZ2VgIHdpdGggdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVQYXRjaGBcbiAgICogICAgICBkZWx0YTtcbiAgICogICAgLSBvdGhlcndpc2UgKGBzZXRgL21peGVkKTogdGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgdGhlXG4gICAqICAgICAgcGF0aCAoe0BsaW5rIGZ1bGxSb3dzVmFsdWV9KS4gSWYgYmFzZSBhbmQgdGhhdCB2YWx1ZSBhcmUgYXJyYXlzIGFuZFxuICAgKiAgICAgIGJhc2UgaXMgYSBTVFJJQ1QgUFJFRklYIOKGkiBgYXBwZW5kYCBzdG9yaW5nIG9ubHkgdGhlIHRhaWw7IGVsc2UgYHNldGBcbiAgICogICAgICBzdG9yaW5nIHRoZSBmdWxsIHZhbHVlLlxuICAgKiAzLiAqKk9WRVJMQVAgRkFNSUxJRVMgdGFrZSB0aGUgZnVsbC12YWx1ZSBmYWxsYmFjay4qKiBgb3ZlcndyaXRlYCAvXG4gICAqICAgIGB1cGRhdGVzYCBhcmUgbmVzdGVkIHBhdGggVFJFRVMsIHNvIHR3byBzdXJ2aXZpbmcgcGF0aHMgd2hlcmUgb25lIGlzXG4gICAqICAgIGFuIGFuY2VzdG9yIG9mIHRoZSBvdGhlciAoYGFgIGFuZCBgYS5wYCkgc2hhcmUgc3RvcmFnZS4gRGVsdGEnc1xuICAgKiAgICBwZXItcGF0aCBlbmNvZGluZ3Mgd291bGQgY2xvYmJlciBlYWNoIG90aGVyIHRoZXJlIChhbiBgYXBwZW5kYFxuICAgKiAgICBhbmNlc3RvciBzdG9yZXMgb25seSBhIFRBSUwsIGEgYGRlbGV0ZWAgYW5jZXN0b3IgYHVuZGVmaW5lZGApLCBzbyBldmVyeVxuICAgKiAgICBwYXRoIHRoYXQgaGFzIGEgc3Vydml2aW5nIGFuY2VzdG9yL2Rlc2NlbmRhbnQgaXMgY29tbWl0dGVkIGFzIGEgcGxhaW5cbiAgICogICAgYHNldGAgb2YgdGhlIHZhbHVlIHRoZSAnZnVsbCcgcm93cyBnaXZlIGl0LCBhbmQgdGhlIGZhbWlseSdzXG4gICAqICAgIHNoYWxsb3dlc3QgcGF0aCAod2hvc2Ugc2V0IGNvdmVycyB0aGUgd2hvbGUgc3VidHJlZSkgaXMgZW1pdHRlZCBMQVNULlxuICAgKlxuICAgKiBUaGUgcmVzdWx0IGlzIEFETUlUVEVEICh7QGxpbmsgYWRtaXR9KSBsaWtlIHRoZSAnZnVsbCcgcGF5bG9hZDogYSBjb21wYWN0XG4gICAqIHJvdyBpcyBrZXB0IG9ubHkgd2hlcmUgdGhlIGJ1bmRsZSBwcm92YWJseSBmb2xkcyBiYWNrLCBhbmQgYSBmYW1pbHkgdGhhdFxuICAgKiBkb2VzIG5vdCBpcyByZWNvcmRlZCBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBTbyBib3RoIGVuY29kaW5ncyBjb21taXQgdGhlXG4gICAqIHZhbHVlIHRoZSBzdGFnZSByZWFkOyBiZWZvcmUgOS4zMC4wIHRoZXkgc2hhcmVkIGEgcmVwbGF5IHRoYXQgZGlkIG5vdFxuICAgKiAoYHJlcGxheVBhdGhWZXJic2AgLyBgcmVwbGF5RmFtaWx5VmVyYnNgLCBkZWxldGVkKS5cbiAgICovXG4gIHByaXZhdGUgdG9EZWx0YVBheWxvYWQoKTogUm93cyB7XG4gICAgY29uc3QgZnVsbFZhbHVlQXQgPSB0aGlzLmZ1bGxSb3dzVmFsdWUoKTtcbiAgICByZXR1cm4gdGhpcy5hZG1pdCgobG9zc3kpID0+IHRoaXMuZGVsdGFSb3dzKGxvc3N5LCBmdWxsVmFsdWVBdCkpO1xuICB9XG5cbiAgLyoqIFRoZSBkZWx0YSByb3dzOyBhIGZhbWlseSBpbiBgbG9zc3lgIGlzIHdyaXR0ZW4gYXMgaXRzIHJlYWQtYmFjaywgYXQgaXRzIGxhc3QgdG91Y2ggKHtAbGluayBlbWl0UmVhZEJhY2t9KS4gKi9cbiAgcHJpdmF0ZSBkZWx0YVJvd3MobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkLCBmdWxsVmFsdWVBdDogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93bik6IFJvd3Mge1xuICAgIGNvbnN0IHJvd3M6IFJvd3MgPSB7IG92ZXJ3cml0ZToge30sIHVwZGF0ZXM6IHt9LCB0cmFjZTogW10gfTtcbiAgICBjb25zdCB7IG92ZXJ3cml0ZSwgdXBkYXRlcywgdHJhY2UgfSA9IHJvd3M7XG4gICAgY29uc3QgaW5Mb3NzeSA9IChwYXRoOiBzdHJpbmcpID0+IGxvc3N5Py5mYW1pbGllcy5oYXMobG9zc3kucm9vdE9mLmdldChwYXRoKSBhcyBzdHJpbmcpID09PSB0cnVlO1xuICAgIGNvbnN0IHN1cnZpdm9ycyA9IHRoaXMubmV0Q2hhbmdlU3Vydml2b3JzKHRoaXMub3BzQnlQYXRoKCkpLmZpbHRlcigocykgPT4gIWluTG9zc3kocy5wYXRoKSk7XG4gICAgY29uc3QgeyByb290T2YsIGJ5Um9vdCB9ID0gZ3JvdXBJbnRvRmFtaWxpZXMoc3Vydml2b3JzLCBuZXcgU2V0KHN1cnZpdm9ycy5tYXAoKHMpID0+IHMucGF0aCkpKTtcblxuICAgIC8vIFRIRSBWRVJCIENIT0lDRSDigJQgdGhlIGRlbHRhIGVuY29kZXIgcGlja3MgYSB2ZXJiIHBlciBwYXRoOyB0aGUgVkFMVUVTXG4gICAgLy8gaXQgZW5jb2RlcyBjb21lIGZyb20gdGhlIG9uZSByZXBsYXkgKGBmdWxsVmFsdWVBdGApLCBuZXZlciBhIHJlcGxpY2Egb2ZcbiAgICAvLyB0aGUgdmVyYiBsYXcgKDkuMzAuMDogQ0xBVURFLm1kJ3MgdmVyYi1zd2l0Y2ggcmVwbGljYXMgbG9zdCB0d28gaGVyZSkuXG4gICAgY29uc3QgZW1pdCA9IChzOiBTdXJ2aXZvcik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgeyBwYXRoLCBzZWdtZW50cywgdmVyYnMsIGJlZm9yZSB9ID0gcztcbiAgICAgIGNvbnN0IHByb3YgPSBwcm92ZW5hbmNlKHMucmVhZEtleXMpO1xuICAgICAgaWYgKChieVJvb3QuZ2V0KHJvb3RPZi5nZXQocGF0aCkgYXMgc3RyaW5nKSBhcyBTdXJ2aXZvcltdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJ1bGUgMyDigJQgb25lIGNvaGVyZW50IHRyZWU6IGV2ZXJ5IG1lbWJlciBhIHNldCBvZiBpdHMgdmFsdWUuXG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnc2V0JywgLi4ucHJvdiB9KTtcbiAgICAgICAgX3NldChvdmVyd3JpdGUsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoZnVsbFZhbHVlQXQoc2VnbWVudHMpKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RWZXJiID0gdmVyYnNbdmVyYnMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAobGFzdFZlcmIgPT09ICdkZWxldGUnICYmIHMuYWZ0ZXIgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmRlbGV0ZVJlcGxheXNBc0ZsYXR0ZW5pbmcoc2VnbWVudHMpKSB7XG4gICAgICAgIC8vIFJlYWwgZGVsZXRpb24g4oCUIHJlcGxheSByZW1vdmVzIHRoZSBrZXkuIEtlZXAgdGhlIHBhdGggZW51bWVyYXRlZFxuICAgICAgICAvLyBpbiBgb3ZlcndyaXRlYCAodW5kZWZpbmVkKSBzbyBPYmplY3Qua2V5cyBjb25zdW1lcnMgc2VlIGl0LlxuICAgICAgICB0cmFjZS5wdXNoKHsgcGF0aCwgdmVyYjogJ2RlbGV0ZScsIC4uLnByb3YgfSk7XG4gICAgICAgIF9zZXQob3ZlcndyaXRlLCBzZWdtZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0gZWxzZSBpZiAodmVyYnMuZXZlcnkoKHYpID0+IHYgPT09ICdtZXJnZScpKSB7XG4gICAgICAgIHRyYWNlLnB1c2goeyBwYXRoLCB2ZXJiOiAnbWVyZ2UnLCAuLi5wcm92IH0pO1xuICAgICAgICBfc2V0KHVwZGF0ZXMsIHNlZ21lbnRzLCBzdHJ1Y3R1cmVkQ2xvbmUoX2dldCh0aGlzLnVwZGF0ZVBhdGNoLCBzZWdtZW50cykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1c2hWYWx1ZVJvdyhyb3dzLCBwYXRoLCBzZWdtZW50cywgYmVmb3JlLCBmdWxsVmFsdWVBdChzZWdtZW50cyksIHByb3YsIHRoaXMubWFya2VkQmVsb3cocGF0aCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBBIGZhbWlseSB0aGF0IGRpZCBub3QgZm9sZCBiYWNrIHRha2VzIGl0cyBwbGFjZSBieSBpdHMgbGFzdCB0b3VjaC5cbiAgICBjb25zdCBwZW5kaW5nID0gbG9zc3kgPT09IHVuZGVmaW5lZCA/IFtdIDogWy4uLmxvc3N5LmZhbWlsaWVzLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBhLnNsb3QgLSBiLnNsb3QpO1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBjb25zdCBmbHVzaEJlZm9yZSA9ICh0b3VjaDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICB3aGlsZSAobmV4dCA8IHBlbmRpbmcubGVuZ3RoICYmIHBlbmRpbmdbbmV4dF0uc2xvdCA8IHRvdWNoKSB0aGlzLmVtaXRSZWFkQmFjayhwZW5kaW5nW25leHQrK10sIHJvd3MsICdkZWx0YScpO1xuICAgIH07XG4gICAgZW1pdEluRmFtaWx5T3JkZXIoc3Vydml2b3JzLCByb290T2YsIGJ5Um9vdCwgZW1pdCwgZmx1c2hCZWZvcmUpO1xuICAgIGZsdXNoQmVmb3JlKEluZmluaXR5KTtcbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8vIOKUgOKUgCBUaGUgYWRtaXR0ZWQgcmVjb3JkICg5LjMwLjApIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUSEUgQURNSVNTSU9OIOKAlCBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUgZm9sZHMgYmFjayB0byB0aGVcbiAgICogc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnkgcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZC4gYGJ1aWxkYFxuICAgKiBsYXlzIHRoZSByb3dzIG91dCAob25lIGVuY29kZXI6IGAnZnVsbCdgIG9yIGAnZGVsdGEnYCk7IHRoZSBjYW5kaWRhdGUgaXNcbiAgICogY2hlY2tlZCAoe0BsaW5rIGxvc3N5RmFtaWxpZXN9KSwgYW5kIHdoZW4gc29tZSBmYW1pbHkncyByb3dzIGRvIG5vdCBmb2xkXG4gICAqIGJhY2sgdGhlIHJvd3MgYXJlIGxhaWQgb3V0IGFnYWluIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZVxuICAgKiBzdGFnZSByZWFkICh7QGxpbmsgZW1pdFJlYWRCYWNrfSkg4oCUIGV2ZXJ5IG90aGVyIGZhbWlseSdzIGJ5dGVzIGV4YWN0bHkgYXNcbiAgICogdGhlIGZpcnN0IGxheW91dCBtYWRlIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFkbWl0KGJ1aWxkOiAobG9zc3k6IExvc3N5IHwgdW5kZWZpbmVkKSA9PiBSb3dzKTogUm93cyB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYnVpbGQodW5kZWZpbmVkKTtcbiAgICBjb25zdCBsb3NzeSA9IHRoaXMubG9zc3lGYW1pbGllcyhjYW5kaWRhdGUpO1xuICAgIHJldHVybiBsb3NzeSA9PT0gdW5kZWZpbmVkID8gY2FuZGlkYXRlIDogYnVpbGQobG9zc3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYW1pbGllcyB3aG9zZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGUgc3RhZ2UgcmVhZCDigJRcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAoYGFkbWlzc2lvbi50cyDCtyBsb3NzeUZhbWlsaWVzYDogdGhlXG4gICAqIGNhbmRpZGF0ZSByZXBsYXllZCBvbnRvIHRoZSBkaWZmIGJhc2UgYnkgYGRyeUZvbGRgLCBldmVyeSBmYW1pbHkgb2ZcbiAgICogdG91Y2hlZCBwYXRocyBjb21wYXJlZCB3aXRoIHRoZSB3b3JraW5nIGNvcHkgYXQgaXRzIHJvb3QgYW5kIG9uIHRoZSB3YXlcbiAgICogZG93biB0byBpdCkuXG4gICAqXG4gICAqIFdpdGhvdXQgYSBmb2xkLCB3aGVuIHRoZSBzdGFnZSBzdGFnZWQgbm8gYG1lcmdlYCBhbmQgbm8gbmVzdGVkIG9wOiBpdHNcbiAgICogcm93cyBhcmUgYHNldGAgLyBgZGVsZXRlYCBvZiBrZXlzIGRpcmVjdGx5IHVuZGVyIGl0cyBhZGRyZXNzLCBlYWNoXG4gICAqIHdyaXRpbmcgdGhlIFNBTUUgdmFsdWUgaW50byBgd29ya2luZ0NvcHlgIGFuZCBgb3ZlcndyaXRlUGF0Y2hgIOKAlCB0aGVcbiAgICogcmVjb3JkIGlzIHRoZSByZWFkLWJhY2sgYnkgY29uc3RydWN0aW9uICh0aGUgcHJvcGVydHkncyBST09ULU9OTFkgYXJtXG4gICAqIHBpbnMgdGhpcykuIFRoYXQga2VlcHMgdGhlIGNvbW1pdCBvZiB0aGUgdHlwZWQgc2NvcGUncyByb290LWtleSB3cml0ZXNcbiAgICogZXhhY3RseSBhcyBjaGVhcCBhcyBpdCB3YXMuXG4gICAqL1xuICBwcml2YXRlIGxvc3N5RmFtaWxpZXMoY2FuZGlkYXRlOiBSb3dzKTogTG9zc3kgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnN0YWdlZE1lcmdlcyA9PT0gMCAmJiB0aGlzLm5lc3RlZE9wcyA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbG9zc3lGYW1pbGllcyhjYW5kaWRhdGUsIHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLndvcmtpbmdDb3B5LCB0aGlzLm9wVHJhY2UsIHRoaXMuYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogQSBmYW1pbHkgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkOlxuICAgKiBvbmUgYHNldGAgcm93IHBlciBtZW1iZXIgdGhhdCBjaGFuZ2VkIChkZXNjZW5kYW50cyBieSBsYXN0IHRvdWNoLCBlYWNoXG4gICAqIHdpdGggaXRzIG93biByZWFkIHByZWZpeCksIHRoZSBST09UIGxhc3QsIGFuZCB0aGUgcm9vdCdzIHJlYWQtYmFjayB2YWx1ZVxuICAgKiBpbiBgb3ZlcndyaXRlYCDigJQgb25lIGNvaGVyZW50IHRyZWUsIHNvIG5vIHJvdyBjYW4gY2xvYmJlciBhbm90aGVyLiBUaGVcbiAgICogcm9vdCdzIHJvdyBpcyB3cml0dGVuIGV2ZW4gd2hlbiB0aGUgcm9vdCBpdHNlbGYgZGlkIG5vdCBjaGFuZ2U6IGl0IGlzIHRoZVxuICAgKiByb3cgdGhhdCBjYXJyaWVzIHRoZSBmYW1pbHkncyByZWFkLWJhY2sgKGFuZCB0aGUgY29udGFpbmVycyBMLTEncyBkcm9wcGVkXG4gICAqIG9wIGxlZnQpLiBBIGxvbmUgcm9vdCB1bmRlciBgJ2RlbHRhJ2Aga2VlcHMgdGhlIGNvbXBhY3QgYGFwcGVuZGAgd2hlbiB0aGVcbiAgICogdmFsdWUgaXQgcmVhZCBpcyBpdHMgYmFzZSBwbHVzIGEgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgZW1pdFJlYWRCYWNrKGZhbWlseTogRmFtaWx5LCByb3dzOiBSb3dzLCBlbmNvZGluZzogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIGxldCByb290OiBNZW1iZXIgPSBmYW1pbHkubWVtYmVyc1swXTtcbiAgICBsZXQgY2hhbmdlZCA9IDA7XG4gICAgZm9yIChjb25zdCBtIG9mIGZhbWlseS5tZW1iZXJzKSB7XG4gICAgICBpZiAobS5wYXRoID09PSBmYW1pbHkucm9vdCkge1xuICAgICAgICByb290ID0gbTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuY2hhbmdlZFNpbmNlQmFzZShtLnBhdGguc3BsaXQoREVMSU0pKSkgY29udGludWU7XG4gICAgICByb3dzLnRyYWNlLnB1c2goeyBwYXRoOiBtLnBhdGgsIHZlcmI6ICdzZXQnLCAuLi5wcm92ZW5hbmNlKG0ucmVhZEtleXMpIH0pO1xuICAgICAgY2hhbmdlZCsrO1xuICAgIH1cbiAgICBjb25zdCBhZnRlciA9IF9nZXQodGhpcy53b3JraW5nQ29weSwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgaWYgKGVuY29kaW5nID09PSAnZGVsdGEnICYmIGNoYW5nZWQgPT09IDAgJiYgYWZ0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYmVmb3JlID0gX2dldCh0aGlzLmJhc2VTbmFwc2hvdCwgZmFtaWx5LnJvb3RTZWdtZW50cyk7XG4gICAgICBwdXNoVmFsdWVSb3coXG4gICAgICAgIHJvd3MsXG4gICAgICAgIGZhbWlseS5yb290LFxuICAgICAgICBmYW1pbHkucm9vdFNlZ21lbnRzLFxuICAgICAgICBiZWZvcmUsXG4gICAgICAgIGFmdGVyLFxuICAgICAgICBwcm92ZW5hbmNlKHJvb3QucmVhZEtleXMpLFxuICAgICAgICB0aGlzLm1hcmtlZEJlbG93KGZhbWlseS5yb290KSxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJvd3MudHJhY2UucHVzaCh7IHBhdGg6IGZhbWlseS5yb290LCB2ZXJiOiAnc2V0JywgLi4ucHJvdmVuYW5jZShyb290LnJlYWRLZXlzKSB9KTtcbiAgICAvLyBUaGUgY2xvbmUgdGhlIGNoZWNrIHRvb2sgKGBhZG1pc3Npb24udHMgwrcgZm9sZHNCYWNrYCksIHdoZW4gaXQgdG9vayBvbmUuXG4gICAgX3NldChyb3dzLm92ZXJ3cml0ZSwgZmFtaWx5LnJvb3RTZWdtZW50cywgZmFtaWx5LmhlbGQgIT09IHVuZGVmaW5lZCA/IGZhbWlseS5oZWxkLnZhbHVlIDogc3RydWN0dXJlZENsb25lKGFmdGVyKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzdGFnZSdzICdmdWxsJyByb3dzIGdpdmUgYSBwYXRoIOKAlCB3aGF0IHRoZSBkZWx0YSBlbmNvZGVyXG4gICAqIGNvbW1pdHMgZm9yIGEgZmFtaWx5IG1lbWJlciBvciBhIHBhdGggd2l0aCBhIGBzZXRgIOKAlCByZWFkIGZyb20gT05FXG4gICAqIHtAbGluayBkcnlGb2xkfSBvZiB0aG9zZSByb3dzIG92ZXIgdGhlIHBhdGNoIHRyZWVzIHRoZW1zZWx2ZXMsIHRha2VuIHRoZVxuICAgKiBmaXJzdCB0aW1lIGl0IGlzIGFza2VkLiBCeSByZWZlcmVuY2UsIGFzIHRoZSBzdGFnZSBoZWxkIHRoZW06IGFuIGVsZW1lbnRcbiAgICogYSBgc2V0YCBhbmQgYSBgbWVyZ2VgIG9mIG9uZSBwYXRoIHNoYXJlIHN0YXlzIG9uZSBlbGVtZW50LiBBIHN0YWdlIHRoYXRcbiAgICogc3RhZ2VkIG5vIGBtZXJnZWAgYW5kIG5vIG5lc3RlZCBvcCBuZWVkcyBubyBmb2xkIOKAlCBhIHBhdGgncyB2YWx1ZSBpcyBpdHNcbiAgICogbGFzdCBzdGFnZWQgdmFsdWUuIChCZWZvcmUgOS4zMC4wOiB0d28gcmVwbGljYXMgb2YgdGhlIHZlcmIgbGF3LFxuICAgKiBgcmVwbGF5UGF0aFZlcmJzYCBhbmQgYHJlcGxheUZhbWlseVZlcmJzYC4pXG4gICAqL1xuICBwcml2YXRlIGZ1bGxSb3dzVmFsdWUoKTogKHNlZ21lbnRzOiBzdHJpbmdbXSkgPT4gdW5rbm93biB7XG4gICAgaWYgKHRoaXMuc3RhZ2VkTWVyZ2VzID09PSAwICYmIHRoaXMubmVzdGVkT3BzID09PSAwKSByZXR1cm4gKHNlZ21lbnRzKSA9PiBfZ2V0KHRoaXMub3ZlcndyaXRlUGF0Y2gsIHNlZ21lbnRzKTtcbiAgICBsZXQgZm9sZDogdW5rbm93bjtcbiAgICByZXR1cm4gKHNlZ21lbnRzKSA9PiB7XG4gICAgICBmb2xkID8/PSBkcnlGb2xkKHRoaXMuYmFzZVNuYXBzaG90LCB0aGlzLnVwZGF0ZVBhdGNoLCB0aGlzLm92ZXJ3cml0ZVBhdGNoLCB0aGlzLmZ1bGxSb3dzKCkpO1xuICAgICAgcmV0dXJuIF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICAgIH07XG4gIH1cblxuICAvKiogVGhlIHN0YWdlJ3MgJ2Z1bGwnIHJvd3M6IGV2ZXJ5IG9wIG9uIGEgcGF0aCB0aGUgbmV0LWNoYW5nZSBmaWx0ZXIga2VlcHMsIGEgYGRlbGV0ZWAgc3BlbGxlZCBgc2V0YC4gKi9cbiAgcHJpdmF0ZSBmdWxsUm93cygpOiBUcmFjZUVudHJ5W10ge1xuICAgIGNvbnN0IGtlZXAgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcbiAgICBjb25zdCByb3dzOiBUcmFjZUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMub3BUcmFjZSkge1xuICAgICAgbGV0IGsgPSBrZWVwLmdldChvcC5wYXRoKTtcbiAgICAgIGlmIChrID09PSB1bmRlZmluZWQpIGtlZXAuc2V0KG9wLnBhdGgsIChrID0gdGhpcy5jaGFuZ2VkU2luY2VCYXNlKG9wLnBhdGguc3BsaXQoREVMSU0pKSkpO1xuICAgICAgaWYgKGspIHJvd3MucHVzaCh7IHBhdGg6IG9wLnBhdGgsIHZlcmI6IG9wLnZlcmIgPT09ICdtZXJnZScgPyAnbWVyZ2UnIDogJ3NldCcgfSk7XG4gICAgfVxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgc3RhZ2UgY2hhbmdlIHRoZSB2YWx1ZSBhdCBgc2VnbWVudHNgPyBCYXNlIGFuZCBmaW5hbCB2YWx1ZSBhcmVcbiAgICogZml4ZWQgYXQgY29tbWl0LCBzbyB0aGlzIGlzIHRoZSBPTkUgbmV0LWNoYW5nZSB2ZXJkaWN0IGJvdGggcGF5bG9hZFxuICAgKiBlbmNvZGluZ3MgYXBwbHkgKGEgbm8tb3Agd3JpdGUgYW5kIGEgd3JpdGUtdGhlbi1yZXZlcnQgYm90aCBmYWlsIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZFNpbmNlQmFzZShzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWRlZXBFcXVhbChfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cyksIF9nZXQodGhpcy53b3JraW5nQ29weSwgc2VnbWVudHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIOKGkiBpdHMgb3AtdmVyYiBzZXF1ZW5jZSwgb3JkZXJlZCBieSBMQVNUIHRvdWNoIChkZWxldGUgKyByZS1pbnNlcnRcbiAgICogbW92ZXMgYSByZS10b3VjaGVkIHBhdGggdG8gdGhlIGVuZCBvZiB0aGUgTWFwJ3MgaW5zZXJ0aW9uIG9yZGVyIOKAlFxuICAgKiBwcmVzZXJ2aW5nIGxhc3Qtd3JpdGVyLXdpbnMgZm9yIG5lc3RlZC9vdmVybGFwcGluZyBwYXRocykuIFBlci13cml0ZVxuICAgKiBwcm92ZW5hbmNlICgjUDEpOiB0aGUgTEFTVCBvcCdzIHJlYWRLZXlzIGlzIGtlcHQg4oCUIHJlYWQgcHJlZml4ZXMgb25seSBncm93XG4gICAqIHdpdGhpbiBhIHN0YWdlLCBzbyBsYXN0ID09IHVuaW9uIGFjcm9zcyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgb3BzQnlQYXRoKCk6IE1hcDxzdHJpbmcsIHsgdmVyYnM6IE9wVmVyYltdOyByZWFkS2V5cz86IHN0cmluZ1tdOyBsYXN0OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm9wVHJhY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gdGhpcy5vcFRyYWNlW2ldO1xuICAgICAgY29uc3QgcHJldiA9IGJ5UGF0aC5nZXQob3AucGF0aCk7XG4gICAgICBpZiAocHJldikge1xuICAgICAgICBwcmV2LnZlcmJzLnB1c2gob3AudmVyYik7XG4gICAgICAgIHByZXYubGFzdCA9IGk7XG4gICAgICAgIGlmIChvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkKSBwcmV2LnJlYWRLZXlzID0gb3AucmVhZEtleXM7XG4gICAgICAgIGJ5UGF0aC5kZWxldGUob3AucGF0aCk7XG4gICAgICAgIGJ5UGF0aC5zZXQob3AucGF0aCwgcHJldik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBieVBhdGguc2V0KG9wLnBhdGgsIHtcbiAgICAgICAgICB2ZXJiczogW29wLnZlcmJdLFxuICAgICAgICAgIGxhc3Q6IGksXG4gICAgICAgICAgLi4uKG9wLnJlYWRLZXlzICE9PSB1bmRlZmluZWQgJiYgeyByZWFkS2V5czogb3AucmVhZEtleXMgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlQYXRoO1xuICB9XG5cbiAgLyoqIFRoZSBuZXQtY2hhbmdlIGZpbHRlciDigJQgaWRlbnRpY2FsIHRvICdmdWxsJyAoe0BsaW5rIGNoYW5nZWRTaW5jZUJhc2V9KS4gU3Vydml2b3JzIGtlZXAgbGFzdC10b3VjaCBvcmRlci4gKi9cbiAgcHJpdmF0ZSBuZXRDaGFuZ2VTdXJ2aXZvcnMoYnlQYXRoOiBNYXA8c3RyaW5nLCB7IHZlcmJzOiBPcFZlcmJbXTsgcmVhZEtleXM/OiBzdHJpbmdbXTsgbGFzdDogbnVtYmVyIH0+KTogU3Vydml2b3JbXSB7XG4gICAgY29uc3Qgc3Vydml2b3JzOiBTdXJ2aXZvcltdID0gW107XG4gICAgZm9yIChjb25zdCBbcGF0aCwgeyB2ZXJicywgcmVhZEtleXMsIGxhc3QgfV0gb2YgYnlQYXRoKSB7XG4gICAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgICAgaWYgKCF0aGlzLmNoYW5nZWRTaW5jZUJhc2Uoc2VnbWVudHMpKSBjb250aW51ZTsgLy8gbm8tb3Agb3Igd3JpdGUtdGhlbi1yZXZlcnQg4oaSIG5vIG5ldCBjaGFuZ2VcbiAgICAgIGNvbnN0IGJlZm9yZSA9IF9nZXQodGhpcy5iYXNlU25hcHNob3QsIHNlZ21lbnRzKTtcbiAgICAgIGNvbnN0IGFmdGVyID0gX2dldCh0aGlzLndvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gICAgICBzdXJ2aXZvcnMucHVzaCh7IHBhdGgsIHNlZ21lbnRzLCB2ZXJicywgcmVhZEtleXMsIGxhc3QsIGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgfVxuICAgIHJldHVybiBzdXJ2aXZvcnM7XG4gIH1cblxuICAvKipcbiAgICogTWF5IGEgc3RhZ2VkIGBkZWxldGVgIGF0IHRoaXMgcGF0aCBjb21taXQgYXMgdGhlIGAnZGVsZXRlJ2AgdmVyYj9cbiAgICpcbiAgICogT25seSB3aGVuIHJlbW92aW5nIHRoZSBrZXkgYW5kIHRoZSBgJ2Z1bGwnYCBtb2RlJ3MgZmxhdHRlbmluZyAoYF9zZXRgIG9mXG4gICAqIGB1bmRlZmluZWRgKSBsYW5kIGluIHRoZSBzYW1lIHBsYWNlLiBUaGV5IGRpdmVyZ2Ugd2hlbiB0aGUgcGFyZW50IGlzIG5vdFxuICAgKiBhIGNvbnRhaW5lcjogYG5hdGl2ZURlbGV0ZWAgd2Fsa3MgYXdheSB1bnRvdWNoZWQsIHdoaWxlIGBuYXRpdmVTZXRgXG4gICAqIENPRVJDRVMgdGhlIHByaW1pdGl2ZSBwYXJlbnQgaW50byBhbiBvYmplY3QgdG8gaG9sZCB0aGUga2V5LiBDb21taXR0aW5nXG4gICAqIGBkZWxldGVgIHRoZXJlIHdvdWxkIHNpbGVudGx5IGRyb3AgYSBzdGF0ZSBjaGFuZ2UgdGhlIHN0YWdlIHJlYWxseSBtYWRlLFxuICAgKiBzbyB0aG9zZSAocGF0aG9sb2dpY2FsKSBkZWxldGVzIGtlZXAgdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlUmVwbGF5c0FzRmxhdHRlbmluZyhzZWdtZW50czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgLy8gcGFyZW50IGlzIHRoZSBzdGF0ZSByb290IOKAlCBhbHdheXMgYSBjb250YWluZXJcbiAgICBjb25zdCBwYXJlbnQgPSBfZ2V0KHRoaXMuYmFzZVNuYXBzaG90LCBzZWdtZW50cy5zbGljZSgwLCAtMSkpO1xuICAgIHJldHVybiBwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCc7XG4gIH1cbn1cblxuLyoqXG4gKiBIaXN0b3JpY2FsIGZsYXR0ZW5pbmcgZm9yIHRoZSBgJ2Z1bGwnYCBwYXlsb2FkOiBhbiBleHBsaWNpdCBkZWxldGUgY29tbWl0c1xuICogYXMgc2V0LW9mLXVuZGVmaW5lZC4gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSkgcmlkZXMgZWFjaCBzdXJ2aXZpbmcgZW50cnlcbiAqIHVudG91Y2hlZC5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbmVkVHJhY2VSb3cob3A6IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBPcFZlcmI7IHJlYWRLZXlzPzogc3RyaW5nW10gfSk6IFRyYWNlRW50cnkge1xuICByZXR1cm4gb3AudmVyYiA9PT0gJ2RlbGV0ZSdcbiAgICA/IHsgcGF0aDogb3AucGF0aCwgdmVyYjogJ3NldCcgYXMgY29uc3QsIC4uLihvcC5yZWFkS2V5cyAhPT0gdW5kZWZpbmVkICYmIHsgcmVhZEtleXM6IG9wLnJlYWRLZXlzIH0pIH1cbiAgICA6IG9wO1xufVxuXG4vKiogQSByb3cncyBgcmVhZEtleXNgIGZyYWdtZW50IOKAlCBhYnNlbnQgdW5sZXNzIHRoZSBwcm92ZW5hbmNlIGRpYWwgcmVjb3JkZWQgb25lICgjUDEpLiAqL1xuZnVuY3Rpb24gcHJvdmVuYW5jZShyZWFkS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiB7IHJlYWRLZXlzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHJlYWRLZXlzICE9PSB1bmRlZmluZWQgPyB7IHJlYWRLZXlzIH0gOiB1bmRlZmluZWQ7XG59XG4iXX0=