velocious 1.0.327 → 1.0.328
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.
|
@@ -323,7 +323,7 @@ export default class VelociousWebsocketClient {
|
|
|
323
323
|
return {
|
|
324
324
|
disconnectedSince: this.disconnectedSince,
|
|
325
325
|
isOpen: !!this.socket && this.socket.readyState === this.socket.OPEN,
|
|
326
|
-
listenerCount: this.listeners.size
|
|
326
|
+
listenerCount: this.listeners.size + this._channelSubscriptions.size
|
|
327
327
|
};
|
|
328
328
|
}
|
|
329
329
|
/**
|
|
@@ -740,4 +740,4 @@ class VelociousWebsocketResponse {
|
|
|
740
740
|
return deserializeFrontendModelTransportValue(JSON.parse(this.body));
|
|
741
741
|
}
|
|
742
742
|
}
|
|
743
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGtDQUFrQyxNQUFNLDJCQUEyQixDQUFBO0FBQzFFLE9BQU8sb0NBQW9DLE1BQU0sd0JBQXdCLENBQUE7QUFDekUsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sK0NBQStDLENBQUE7QUFFcEcsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUVoRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF3QjtJQUMzQyx1SEFBdUg7SUFDdkgsZUFBZSxDQUFBO0lBQ2YsK0ZBQStGO0lBQy9GLG9CQUFvQixDQUFBO0lBQ3BCLG9KQUFvSjtJQUNwSixTQUFTLENBQUE7SUFFVDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUU7UUFDekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBRS9FLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDckMs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QUMsQ0FBQyxDQUFBO0lBQ3RFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbiBmcm9tIFwiLi93ZWJzb2NrZXQtY29ubmVjdGlvbi5qc1wiXG5pbXBvcnQgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uIGZyb20gXCIuL3dlYnNvY2tldC1jaGFubmVsLmpzXCJcbmltcG9ydCB7ZGVzZXJpYWxpemVGcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWV9IGZyb20gXCIuLi9mcm9udGVuZC1tb2RlbHMvdHJhbnNwb3J0LXNlcmlhbGl6YXRpb24uanNcIlxuXG5jb25zdCBERUZBVUxUX1JFQ09OTkVDVF9ERUxBWVMgPSBbMTAwMCwgMjAwMCwgNDAwMCwgODAwMCwgMTUwMDBdXG5cbi8qKlxuICogQSBzbWFsbCB3ZWJzb2NrZXQgY2xpZW50IHRoYXQgbWlycm9ycyBzaW1wbGUgSFRUUC1zdHlsZSBjYWxscyBhbmQgY2hhbm5lbCBzdWJzY3JpcHRpb25zLlxuICogU3VwcG9ydHMgb3B0aW9uYWwgYXV0by1yZWNvbm5lY3Qgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmIGFuZCBsaXN0ZW5lciByZS1zdWJzY3JpcHRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c1dlYnNvY2tldENsaWVudCB7XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge3JlamVjdDogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkLCByZXNvbHZlOiAocmVzcG9uc2U6IFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlKSA9PiB2b2lkfT59ICovXG4gIHBlbmRpbmdSZXF1ZXN0c1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtyZWplY3Q6IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCwgcmVzb2x2ZTogKHZhbHVlPzogdm9pZCkgPT4gdm9pZH0+fSAqL1xuICBwZW5kaW5nU3Vic2NyaXB0aW9uc1xuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIHtjYWxsYmFja3M6IFNldDwocGF5bG9hZDogYW55KSA9PiB2b2lkPiwgY2hhbm5lbDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQsIHJlYWR5OiBQcm9taXNlPHZvaWQ+fT59ICovXG4gIGxpc3RlbmVyc1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuYXV0b1JlY29ubmVjdF0gLSBFbmFibGUgYXV0by1yZWNvbm5lY3Qgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlYnVnXSAtIFdoZXRoZXIgZGVidWcuXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IFthcmdzLnJlY29ubmVjdERlbGF5c10gLSBCYWNrb2ZmIGRlbGF5cyBpbiBtcyAoZGVmYXVsdDogWzEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDE1MDAwXSkuXG4gICAqIEBwYXJhbSB7e2dldDogKCkgPT4gc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB8IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4sIHNldDogKHNlc3Npb25JZDogc3RyaW5nKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPiwgY2xlYXI6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fX0gW2FyZ3Muc2Vzc2lvblN0b3JlXSAtIE9wdGlvbmFsIHNlc3Npb25JZCBwZXJzaXN0ZW5jZSBob29rLiBXaGVuIHByb3ZpZGVkLCB0aGUgY2xpZW50IHdyaXRlcyBldmVyeSBgc2Vzc2lvbi1lc3RhYmxpc2hlZGAgLyBgc2Vzc2lvbi1yZXN1bWVkYCBpZCB2aWEgYHN0b3JlLnNldChpZClgIGFuZCBjbGVhcnMgaXQgb24gYHNlc3Npb24tZ29uZWAuIEJlZm9yZSB0aGUgZmlyc3QgYGNvbm5lY3QoKWAsIHRoZSBjbGllbnQgcmVhZHMgYW55IHBlcnNpc3RlZCBpZCB2aWEgYHN0b3JlLmdldCgpYCBhbmQgYXR0ZW1wdHMgcmVzdW1wdGlvbi4gQXBwcyBzaG91bGQgYmFjayB0aGlzIGJ5IHdoYXRldmVyIHBlcnNpc3RlbmNlIGxheWVyIHN1cnZpdmVzIHBhZ2UgcmVsb2FkcyAobG9jYWxTdG9yYWdlLCBhIGNvb2tpZSwgU1FMaXRlLCBldGMuKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLnVybF0gRnVsbCB3ZWJzb2NrZXQgVVJMIChkZWZhdWx0OiB3czovLzEyNy4wLjAuMTozMDA2L3dlYnNvY2tldClcbiAgICovXG4gIGNvbnN0cnVjdG9yKHthdXRvUmVjb25uZWN0ID0gZmFsc2UsIGRlYnVnID0gZmFsc2UsIHJlY29ubmVjdERlbGF5cywgc2Vzc2lvblN0b3JlLCB1cmx9ID0ge30pIHtcbiAgICBpZiAoIWdsb2JhbFRoaXMuV2ViU29ja2V0KSB0aHJvdyBuZXcgRXJyb3IoXCJXZWJTb2NrZXQgZ2xvYmFsIGlzIG5vdCBhdmFpbGFibGVcIilcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSBhdXRvUmVjb25uZWN0XG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG4gICAgLyoqIEB0eXBlIHtudW1iZXIgfCBudWxsfSAqL1xuICAgIHRoaXMuZGlzY29ubmVjdGVkU2luY2UgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMgPSBuZXcgTWFwKClcbiAgICB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgIC8qKiBAdHlwZSB7bnVtYmVyW119ICovXG4gICAgdGhpcy5yZWNvbm5lY3REZWxheXMgPSByZWNvbm5lY3REZWxheXMgfHwgREVGQVVMVF9SRUNPTk5FQ1RfREVMQVlTXG4gICAgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGx9ICovXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG51bGxcbiAgICB0aGlzLnVybCA9IHVybCB8fCBcIndzOi8vMTI3LjAuMC4xOjMwMDYvd2Vic29ja2V0XCJcbiAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBNYXAoKVxuICAgIHRoaXMubmV4dElEID0gMVxuICAgIC8qKiBAdHlwZSB7KCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+KSB8IG51bGx9ICovXG4gICAgdGhpcy5vblJlY29ubmVjdCA9IG51bGxcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbiAgICB0aGlzLl9tZXRhZGF0YSA9IHt9XG5cbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFZlbG9jaW91c1dlYnNvY2tldENsaWVudENvbm5lY3Rpb24+fSAqL1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zID0gbmV3IE1hcCgpXG5cbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbj59ICovXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIHRoaXMuX25leHRDb25uZWN0aW9uSWRTZXEgPSAxXG4gICAgdGhpcy5fbmV4dFN1YnNjcmlwdGlvbklkU2VxID0gMVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmcgfCBudWxsfSAtIHNlc3Npb25JZCByZWNlaXZlZCBmcm9tIGBzZXNzaW9uLWVzdGFibGlzaGVkYDsgc2VudCBvbiByZWNvbm5lY3QgZm9yIHJlc3VtcHRpb24uICovXG4gICAgdGhpcy5fc2Vzc2lvbklkID0gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAtIHRydWUgYmV0d2VlbiBhIHJlY29ubmVjdCBhbmQgdGhlIHNlc3Npb24tcmVzdW1lZCAvIHNlc3Npb24tZ29uZSByZXBseS4gKi9cbiAgICB0aGlzLl9hd2FpdGluZ1Jlc3VtZSA9IGZhbHNlXG5cbiAgICAvKiogQHR5cGUge3tnZXQ6ICgpID0+IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCBQcm9taXNlPHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+LCBzZXQ6IChzZXNzaW9uSWQ6IHN0cmluZykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4sIGNsZWFyOiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gfCB1bmRlZmluZWR9ICovXG4gICAgdGhpcy5fc2Vzc2lvblN0b3JlID0gc2Vzc2lvblN0b3JlXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAtIHRydWUgb25jZSB0aGUgc2Vzc2lvblN0b3JlIGhhcyBiZWVuIGNvbnN1bHRlZCBmb3IgYSByZXN0b3JlZCBpZC4gKi9cbiAgICB0aGlzLl9zZXNzaW9uU3RvcmVSZXN0b3JlZCA9IGZhbHNlXG4gIH1cblxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIGlzT3BlbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgMToxIGBXZWJzb2NrZXRDb25uZWN0aW9uYCBvZiB0aGUgZ2l2ZW4gdHlwZSBhZ2FpbnN0IHRoZVxuICAgKiBzZXJ2ZXIuIFJlcXVpcmVzIHRoZSBzb2NrZXQgdG8gYWxyZWFkeSBiZSBjb25uZWN0ZWQgKGNhbGxcbiAgICogYGNvbm5lY3QoKWAgZmlyc3QpLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29ubmVjdGlvblR5cGUgLSBOYW1lIHRoZSBzZXJ2ZXIgcmVnaXN0ZXJlZCB0aGUgY2xhc3MgdW5kZXIuXG4gICAqIEBwYXJhbSB7e3BhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9uQ29ubmVjdD86ICgpID0+IHZvaWQsIG9uTWVzc2FnZT86IChib2R5OiBhbnkpID0+IHZvaWQsIG9uRGlzY29ubmVjdD86ICgpID0+IHZvaWQsIG9uUmVzdW1lPzogKCkgPT4gdm9pZCwgb25DbG9zZT86IChyZWFzb246IHN0cmluZykgPT4gdm9pZH19IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7VmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbn1cbiAgICovXG4gIG9wZW5Db25uZWN0aW9uKGNvbm5lY3Rpb25UeXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHRocm93IG5ldyBFcnJvcihcIldlYnNvY2tldCBpcyBub3Qgb3BlbjsgY2FsbCBjb25uZWN0KCkgZmlyc3RcIilcblxuICAgIGNvbnN0IGNvbm5lY3Rpb25JZCA9IGBjJHt0aGlzLl9uZXh0Q29ubmVjdGlvbklkU2VxKyt9YFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbih7XG4gICAgICBjbGllbnQ6IHRoaXMsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBjb25uZWN0aW9uVHlwZSxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMsXG4gICAgICBvbkNvbm5lY3Q6IG9wdGlvbnMub25Db25uZWN0LFxuICAgICAgb25NZXNzYWdlOiBvcHRpb25zLm9uTWVzc2FnZSxcbiAgICAgIG9uRGlzY29ubmVjdDogb3B0aW9ucy5vbkRpc2Nvbm5lY3QsXG4gICAgICBvblJlc3VtZTogb3B0aW9ucy5vblJlc3VtZSxcbiAgICAgIG9uQ2xvc2U6IG9wdGlvbnMub25DbG9zZVxuICAgIH0pXG5cbiAgICB0aGlzLl9jb25uZWN0aW9ucy5zZXQoY29ubmVjdGlvbklkLCBjb25uZWN0aW9uKVxuICAgIHRoaXMuX3NlbmRNZXNzYWdlKHtcbiAgICAgIHR5cGU6IFwiY29ubmVjdGlvbi1vcGVuXCIsXG4gICAgICBjb25uZWN0aW9uSWQsXG4gICAgICBjb25uZWN0aW9uVHlwZSxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMgfHwge31cbiAgICB9KVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyBhIGNvbm5lY3Rpb24gaGFuZGxlIGZyb20gdGhlIHJlZ2lzdHJ5LiBDYWxsZWQgYnlcbiAgICogYFZlbG9jaW91c1dlYnNvY2tldENsaWVudENvbm5lY3Rpb24uY2xvc2UoKWAgYWZ0ZXIgaXQgbm90aWZpZXNcbiAgICogdGhlIHNlcnZlciwgYW5kIGJ5IHRoZSBzZXNzaW9uLWRlc3Ryb3llZCBjbGVhbnVwIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uSWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfcmVtb3ZlQ29ubmVjdGlvbihjb25uZWN0aW9uSWQpIHtcbiAgICB0aGlzLl9jb25uZWN0aW9ucy5kZWxldGUoY29ubmVjdGlvbklkKVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gYSBuYW1lZCBXZWJzb2NrZXRDaGFubmVsLiBSZXF1aXJlcyB0aGUgc29ja2V0IHRvXG4gICAqIGFscmVhZHkgYmUgY29ubmVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbFR5cGUgLSBOYW1lIHRoZSBzZXJ2ZXIgcmVnaXN0ZXJlZCB0aGUgY2hhbm5lbCB1bmRlci5cbiAgICogQHBhcmFtIHt7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55PiwgbGFzdEV2ZW50SWQ/OiBzdHJpbmcsIG9uTWVzc2FnZT86IChib2R5OiBhbnkpID0+IHZvaWQsIG9uRGlzY29ubmVjdD86ICgpID0+IHZvaWQsIG9uUmVzdW1lPzogKCkgPT4gdm9pZCwgb25DbG9zZT86IChyZWFzb246IHN0cmluZykgPT4gdm9pZH19IFtvcHRpb25zXVxuICAgKiBAcmV0dXJucyB7VmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9ufVxuICAgKi9cbiAgc3Vic2NyaWJlQ2hhbm5lbChjaGFubmVsVHlwZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbigpKSB0aHJvdyBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgaXMgbm90IG9wZW47IGNhbGwgY29ubmVjdCgpIGZpcnN0XCIpXG5cbiAgICBjb25zdCBzdWJzY3JpcHRpb25JZCA9IGBzJHt0aGlzLl9uZXh0U3Vic2NyaXB0aW9uSWRTZXErK31gXG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IFZlbG9jaW91c1dlYnNvY2tldENsaWVudFN1YnNjcmlwdGlvbih7XG4gICAgICBjbGllbnQ6IHRoaXMsXG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICAgIGNoYW5uZWxUeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIG9uTWVzc2FnZTogb3B0aW9ucy5vbk1lc3NhZ2UsXG4gICAgICBvbkRpc2Nvbm5lY3Q6IG9wdGlvbnMub25EaXNjb25uZWN0LFxuICAgICAgb25SZXN1bWU6IG9wdGlvbnMub25SZXN1bWUsXG4gICAgICBvbkNsb3NlOiBvcHRpb25zLm9uQ2xvc2VcbiAgICB9KVxuXG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbklkLCBzdWJzY3JpcHRpb24pXG4gICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjaGFubmVsLXN1YnNjcmliZVwiLFxuICAgICAgc3Vic2NyaXB0aW9uSWQsXG4gICAgICBjaGFubmVsVHlwZSxcbiAgICAgIHBhcmFtczogb3B0aW9ucy5wYXJhbXMgfHwge30sXG4gICAgICAuLi4ob3B0aW9ucy5sYXN0RXZlbnRJZCA/IHtsYXN0RXZlbnRJZDogb3B0aW9ucy5sYXN0RXZlbnRJZH0gOiB7fSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWJzY3JpcHRpb25JZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDaGFubmVsU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbklkKSB7XG4gICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbklkKVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSBnbG9iYWwgbWV0YWRhdGEgdmFsdWUgdGhhdCBpcyBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAqIEZvciBXZWJTb2NrZXQgY29ubmVjdGlvbnMsIGEgbWV0YWRhdGEgdXBkYXRlIG1lc3NhZ2UgaXMgc2VudCBpbW1lZGlhdGVseS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIE1ldGFkYXRhIGtleS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIC0gTWV0YWRhdGEgdmFsdWUgKG51bGwgdG8gY2xlYXIpLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldE1ldGFkYXRhKGtleSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIHRoaXMuX21ldGFkYXRhW2tleV1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbWV0YWRhdGFba2V5XSA9IHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHt0eXBlOiBcIm1ldGFkYXRhXCIsIGRhdGE6IHsuLi50aGlzLl9tZXRhZGF0YX19KVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgYW55Pn0gLSBDdXJyZW50IG1ldGFkYXRhLiAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gey4uLnRoaXMuX21ldGFkYXRhfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIHdlYnNvY2tldCBjb25uZWN0aW9uIGlzIG9wZW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjb25uZWN0KCkge1xuICAgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOKSByZXR1cm5cbiAgICBpZiAodGhpcy5jb25uZWN0UHJvbWlzZSkgcmV0dXJuIHRoaXMuY29ubmVjdFByb21pc2VcblxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmwpXG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc29ja2V0Py5yZW1vdmVFdmVudExpc3RlbmVyKFwib3BlblwiLCBvbk9wZW4pXG4gICAgICAgIHRoaXMuc29ja2V0Py5yZW1vdmVFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcilcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25PcGVuID0gKCkgPT4ge1xuICAgICAgICBjbGVhbnVwKClcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICB9XG4gICAgICBjb25zdCBvbkVycm9yID0gKC8qKiBAdHlwZSB7RXZlbnQgJiB7ZXJyb3I/OiB1bmtub3dufX0gKi8gZXZlbnQpID0+IHtcbiAgICAgICAgY2xlYW51cCgpXG4gICAgICAgIGNvbnN0IGVycm9yID0gZXZlbnQ/LmVycm9yIHx8IG5ldyBFcnJvcihcIldlYnNvY2tldCBjb25uZWN0aW9uIGVycm9yXCIpXG4gICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgb25PcGVuKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIG9uRXJyb3IpXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm9uTWVzc2FnZSlcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCB0aGlzLm9uQ2xvc2UpXG4gICAgfSlcblxuICAgIGF3YWl0IHRoaXMuY29ubmVjdFByb21pc2VcblxuICAgIC8vIENvbGQgcmVzdG9yZSBmcm9tIGV4dGVybmFsIHBlcnNpc3RlbmNlIChzZXNzaW9uU3RvcmUpIG9uIHRoZVxuICAgIC8vIHZlcnkgZmlyc3QgY29ubmVjdDogYXBwcyB3aXJlIHRoaXMgdXAgdG8gc3Vydml2ZSBhIGZ1bGwgcGFnZVxuICAgIC8vIHJlbG9hZC4gQWZ0ZXIgdGhlIGZpcnN0IHJlc3RvcmUgYXR0ZW1wdCB0aGUgaW4tbWVtb3J5IGNhY2hlXG4gICAgLy8gdGFrZXMgb3Zlci5cbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25JZCAmJiAhdGhpcy5fc2Vzc2lvblN0b3JlUmVzdG9yZWQgJiYgdGhpcy5fc2Vzc2lvblN0b3JlKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uU3RvcmVSZXN0b3JlZCA9IHRydWVcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RvcmVkSWQgPSBhd2FpdCB0aGlzLl9zZXNzaW9uU3RvcmUuZ2V0KClcblxuICAgICAgICBpZiAodHlwZW9mIHN0b3JlZElkID09PSBcInN0cmluZ1wiICYmIHN0b3JlZElkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9zZXNzaW9uSWQgPSBzdG9yZWRJZFxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5nZXQgZmFpbGVkXCIsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgYSBjYWNoZWQgc2Vzc2lvbklkIGZyb20gYSBwcmlvciBjb25uZWN0LCBhc2sgdGhlXG4gICAgLy8gc2VydmVyIHRvIHJlc3VtZSBpdC4gVGhlIHNlcnZlciByZXBsaWVzIHdpdGggZWl0aGVyXG4gICAgLy8gYHNlc3Npb24tcmVzdW1lZGAgKHN0YXRlIHByZXNlcnZlZCkgb3IgYHNlc3Npb24tZ29uZWAgKGNsaWVudFxuICAgIC8vIG11c3Qgc3RhcnQgZnJlc2gpOyB0aGUgbWVzc2FnZSBkaXNwYXRjaGVyIGZpcmVzIHRoZSBhcHByb3ByaWF0ZVxuICAgIC8vIGxpZmVjeWNsZSBob29rcyBvbiBsaXZlIENvbm5lY3Rpb24gLyBDaGFubmVsIGhhbmRsZXMuXG4gICAgaWYgKHRoaXMuX3Nlc3Npb25JZCkge1xuICAgICAgdGhpcy5fYXdhaXRpbmdSZXN1bWUgPSB0cnVlXG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7dHlwZTogXCJzZXNzaW9uLXJlc3VtZVwiLCBzZXNzaW9uSWQ6IHRoaXMuX3Nlc3Npb25JZH0pXG4gICAgICAvLyBGaXJlIG9uRGlzY29ubmVjdCBvbiBsaXZlIGhhbmRsZXMgc28gYXBwcyBjYW4gcGF1c2UgVUkgd29ya1xuICAgICAgLy8gdW50aWwgc2Vzc2lvbi1yZXN1bWVkIC8gc2Vzc2lvbi1nb25lIGFycml2ZXMuXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgdGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCkpIGNvbm5lY3Rpb24uX2hhbmRsZURpc2Nvbm5lY3RlZCgpXG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkgc3Vic2NyaXB0aW9uLl9oYW5kbGVEaXNjb25uZWN0ZWQoKVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9tZXRhZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe3R5cGU6IFwibWV0YWRhdGFcIiwgZGF0YTogey4uLnRoaXMuX21ldGFkYXRhfX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgYW5kIGVuYWJsZSBhdXRvLXJlY29ubmVjdC4gUmVzZXRzIHJlY29ubmVjdCBzdGF0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb25uZWN0ZWQuXG4gICAqL1xuICBhc3luYyBjb25uZWN0V2l0aFJlY29ubmVjdCgpIHtcbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSB0cnVlXG4gICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgd2Vic29ja2V0IGFuZCBjbGVhciBwZW5kaW5nIHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuXG5cbiAgICBpZiAodGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7XG4gICAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Py5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgdGhpcy5zb2NrZXQ/LmNsb3NlKClcbiAgICB9KVxuXG4gICAgdGhpcy5zb2NrZXQgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSBhdXRvLXJlY29ubmVjdCBhbmQgY2xvc2UgdGhlIHdlYnNvY2tldC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjbG9zZWQuXG4gICAqL1xuICBhc3luYyBkaXNjb25uZWN0QW5kU3RvcFJlY29ubmVjdCgpIHtcbiAgICB0aGlzLmF1dG9SZWNvbm5lY3QgPSBmYWxzZVxuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuICAgIGF3YWl0IHRoaXMuY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSByYXcgc29ja2V0IHdpdGhvdXQgZGlzYWJsaW5nIGF1dG8tcmVjb25uZWN0LiBVc2VkIGJ5IHRlc3RzIHRvXG4gICAqIHNpbXVsYXRlIGFuIHVuZXhwZWN0ZWQgbmV0d29yayBkcm9wIGFuZCB2ZXJpZnkgcmVjb25uZWN0aW9uIGJlaGF2aW9yLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIHRoZSBzb2NrZXQgaGFzIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGRyb3BDb25uZWN0aW9uKCkge1xuICAgIGlmICghdGhpcy5zb2NrZXQpIHJldHVyblxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0Py5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgKCkgPT4gcmVzb2x2ZSh1bmRlZmluZWQpKVxuICAgICAgdGhpcy5zb2NrZXQ/LmNsb3NlKClcbiAgICB9KVxuXG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBQT1NUIHJlcXVlc3Qgb3ZlciB0aGUgd2Vic29ja2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7YW55fSBbYm9keV0gLSBSZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSB7e2hlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fX0gW29wdGlvbnNdIC0gUmVxdWVzdCBvcHRpb25zIHN1Y2ggYXMgaGVhZGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2U+fSAtIFJlc29sdmVzIHdpdGggdGhlIHBvc3QuXG4gICAqL1xuICBhc3luYyBwb3N0KHBhdGgsIGJvZHksIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoXCJQT1NUXCIsIHBhdGgsIHsuLi5vcHRpb25zLCBib2R5fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgR0VUIHJlcXVlc3Qgb3ZlciB0aGUgd2Vic29ja2V0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGguXG4gICAqIEBwYXJhbSB7e2hlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fX0gW29wdGlvbnNdIC0gUmVxdWVzdCBvcHRpb25zIHN1Y2ggYXMgaGVhZGVycy5cbiAgICogQHJldHVybnMge1Byb21pc2U8VmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2U+fSAtIFJlc29sdmVzIHdpdGggdGhlIGdldC5cbiAgICovXG4gIGFzeW5jIGdldChwYXRoLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KFwiR0VUXCIsIHBhdGgsIG9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGEgY2hhbm5lbCBmb3Igc2VydmVyLXNlbnQgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55KSA9PiB2b2lkfSBjYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyB7KCkgPT4gdm9pZH0gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICovXG4gIG9uKGNoYW5uZWwsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlKGNoYW5uZWwsIHt9LCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc25hcHNob3Qgb2YgdGhlIGNsaWVudCdzIGNvbm5lY3Rpb24gc3RhdGUuXG4gICAqIEByZXR1cm5zIHt7ZGlzY29ubmVjdGVkU2luY2U6IG51bWJlciB8IG51bGwsIGlzT3BlbjogYm9vbGVhbiwgbGlzdGVuZXJDb3VudDogbnVtYmVyfX1cbiAgICovXG4gIHN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNjb25uZWN0ZWRTaW5jZTogdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSxcbiAgICAgIGlzT3BlbjogISF0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5PUEVOLFxuICAgICAgbGlzdGVuZXJDb3VudDogdGhpcy5saXN0ZW5lcnMuc2l6ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGZvciBzZXJ2ZXItc2VudCBldmVudHMgd2l0aCBvcHRpb25hbCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn19IG9wdGlvbnMgLSBTdWJzY3JpcHRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55LCBtZXNzYWdlPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgeygoKSA9PiB2b2lkKSAmIHtyZWFkeTogUHJvbWlzZTx2b2lkPn19IC0gVW5zdWJzY3JpYmUgZnVuY3Rpb24gd2l0aCByZWFkaW5lc3MgcHJvbWlzZS5cbiAgICovXG4gIHN1YnNjcmliZShjaGFubmVsLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHBhcmFtcyA9IG9wdGlvbnM/LnBhcmFtc1xuICAgIGNvbnN0IGxhc3RFdmVudElkID0gb3B0aW9ucz8ubGFzdEV2ZW50SWRcbiAgICBjb25zdCBzdWJzY3JpcHRpb25LZXkgPSB0aGlzLl9zdWJzY3JpcHRpb25LZXkoY2hhbm5lbCwgcGFyYW1zKVxuXG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoc3Vic2NyaXB0aW9uS2V5KSkge1xuICAgICAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICAvKiogQHR5cGUgeygodmFsdWU/OiB2b2lkKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZXNvbHZlUmVhZHlcbiAgICAgIC8qKiBAdHlwZSB7KChlcnJvcjogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgcmVqZWN0UmVhZHlcbiAgICAgIGNvbnN0IHJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXNvbHZlUmVhZHkgPSByZXNvbHZlXG4gICAgICAgIHJlamVjdFJlYWR5ID0gcmVqZWN0XG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxpc3RlbmVycy5zZXQoc3Vic2NyaXB0aW9uS2V5LCB7XG4gICAgICAgIGNhbGxiYWNrczogbmV3IFNldCgpLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlYWR5XG4gICAgICB9KVxuICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5zZXQoc3Vic2NyaXB0aW9uS2V5LCB7XG4gICAgICAgIHJlamVjdDogcmVqZWN0UmVhZHkgfHwgKCgpID0+IHt9KSxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZVJlYWR5IHx8ICgoKSA9PiB7fSlcbiAgICAgIH0pXG5cbiAgICAgIHZvaWQgdGhpcy5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zLCB0eXBlOiBcInN1YnNjcmliZVwifSlcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gdGhpcy5fZGVidWcoXCJTdWJzY3JpYmUgZmFpbGVkXCIsIGVycm9yKSlcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5lckVudHJ5ID0gdGhpcy5saXN0ZW5lcnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgIGlmICghbGlzdGVuZXJFbnRyeSkgdGhyb3cgbmV3IEVycm9yKFwiTGlzdGVuZXJzIG1hcCBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIGxpc3RlbmVyRW50cnkuY2FsbGJhY2tzLmFkZChjYWxsYmFjaylcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgbGlzdGVuZXJFbnRyeS5jYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKVxuXG4gICAgICBpZiAobGlzdGVuZXJFbnRyeS5jYWxsYmFja3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgfVxuICAgIH1cblxuICAgIHVuc3Vic2NyaWJlLnJlYWR5ID0gbGlzdGVuZXJFbnRyeS5yZWFkeVxuXG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGEgY2hhbm5lbCBhbmQgd2FpdCB1bnRpbCB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7bGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT59fSBvcHRpb25zIC0gU3Vic2NyaXB0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IGFueSwgbWVzc2FnZT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCgoKSA9PiB2b2lkKSAmIHtyZWFkeTogUHJvbWlzZTx2b2lkPn0+fSAtIFJlYWR5IHVuc3Vic2NyaWJlIGhhbmRsZS5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZUFuZFdhaXQoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuc3Vic2NyaWJlKGNoYW5uZWwsIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gICAgYXdhaXQgdW5zdWJzY3JpYmUucmVhZHlcblxuICAgIHJldHVybiB1bnN1YnNjcmliZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBIVFRQIG1ldGhvZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbb3B0aW9ucy5ib2R5XSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbb3B0aW9ucy5oZWFkZXJzXSAtIEhlYWRlciBsaXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHJlcXVlc3QobWV0aG9kLCBwYXRoLCB7Ym9keSwgaGVhZGVyc30gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG5cbiAgICBjb25zdCBpZCA9IGB3cy0ke3RoaXMubmV4dElEKyt9YFxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIGlkLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGF0aCxcbiAgICAgIHR5cGU6IFwicmVxdWVzdFwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLnNldChpZCwge3Jlc29sdmUsIHJlamVjdH0pXG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZShwYXlsb2FkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnQ8YW55Pn0gZXZlbnQgLSBFdmVudCBwYXlsb2FkLlxuICAgKi9cbiAgb25NZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgcmF3ID0gdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgPyBldmVudC5kYXRhIDogZXZlbnQuZGF0YT8udG9TdHJpbmc/LigpXG5cbiAgICBpZiAoIXJhdykgcmV0dXJuXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgbGV0IG1lc3NhZ2VcblxuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShyYXcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGV9ID0gbWVzc2FnZVxuXG4gICAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2VcIikge1xuICAgICAgY29uc3Qge2lkfSA9IG1lc3NhZ2VcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBpZCA/IHRoaXMucGVuZGluZ1JlcXVlc3RzLmdldChpZCkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGlkKVxuICAgICAgICBwZW5kaW5nLnJlc29sdmUobmV3IFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlKG1lc3NhZ2UpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGVidWcoYE5vIHBlbmRpbmcgcmVxdWVzdCBmb3IgcmVzcG9uc2UgaWQgJHtpZH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzdWJzY3JpYmVkXCIpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShtZXNzYWdlLmNoYW5uZWwsIG1lc3NhZ2UucGFyYW1zKVxuICAgICAgY29uc3QgcGVuZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgICAgaWYgKHBlbmRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgICBwZW5kaW5nU3Vic2NyaXB0aW9uLnJlc29sdmUoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJldmVudFwiKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgcGF5bG9hZH0gPSBtZXNzYWdlXG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyRW50cnkgb2YgdGhpcy5saXN0ZW5lcnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyRW50cnkuY2hhbm5lbCAhPT0gY2hhbm5lbCkgY29udGludWVcblxuICAgICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5mb3JFYWNoKCgvKiogQHR5cGUgeyhwYXlsb2FkOiBhbnksIG1lc3NhZ2U/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSAqLyBjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsYmFjayhwYXlsb2FkLCBtZXNzYWdlKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZyhcIkxpc3RlbmVyIGVycm9yXCIsIGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwicmVwbGF5LWdhcFwiKSB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb25LZXkgPSB0aGlzLl9zdWJzY3JpcHRpb25LZXkobWVzc2FnZS5jaGFubmVsLCBtZXNzYWdlLnBhcmFtcylcbiAgICAgIGNvbnN0IHBlbmRpbmdTdWJzY3JpcHRpb24gPSB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25LZXkpXG5cbiAgICAgIGlmIChwZW5kaW5nU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbktleSlcbiAgICAgICAgcGVuZGluZ1N1YnNjcmlwdGlvbi5yZWplY3QobmV3IEVycm9yKGBSZXBsYXkgZ2FwIGZvciAke21lc3NhZ2UuY2hhbm5lbH1gKSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1vcGVuZWRcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgY29ubmVjdGlvbj8uX2hhbmRsZU9wZW5lZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tbWVzc2FnZVwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBjb25uZWN0aW9uPy5faGFuZGxlTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tY2xvc2VkXCIpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9ucy5nZXQobWVzc2FnZS5jb25uZWN0aW9uSWQpXG5cbiAgICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShtZXNzYWdlLmNvbm5lY3Rpb25JZClcbiAgICAgICAgY29ubmVjdGlvbi5faGFuZGxlQ2xvc2VkKG1lc3NhZ2UucmVhc29uIHx8IFwic2VydmVyX2Nsb3NlXCIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tZXJyb3JcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuICAgICAgICBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQoYGVycm9yOiAke21lc3NhZ2UubWVzc2FnZSB8fCBcImNvbm5lY3Rpb24tZXJyb3JcIn1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLXN1YnNjcmliZWRcIikge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KG1lc3NhZ2Uuc3Vic2NyaXB0aW9uSWQpXG5cbiAgICAgIHN1Yj8uX2hhbmRsZVN1YnNjcmliZWQoKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLW1lc3NhZ2VcIikge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KG1lc3NhZ2Uuc3Vic2NyaXB0aW9uSWQpXG5cbiAgICAgIHN1Yj8uX2hhbmRsZU1lc3NhZ2UobWVzc2FnZS5ib2R5KVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLXVuc3Vic2NyaWJlZFwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgaWYgKHN1Yikge1xuICAgICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgc3ViLl9oYW5kbGVDbG9zZWQoXCJzZXJ2ZXJfdW5zdWJzY3JpYmVcIilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY2hhbm5lbC1lcnJvclwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgaWYgKHN1Yikge1xuICAgICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgc3ViLl9oYW5kbGVDbG9zZWQoYGVycm9yOiAke21lc3NhZ2UubWVzc2FnZSB8fCBcImNoYW5uZWwtZXJyb3JcIn1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzZXNzaW9uLWVzdGFibGlzaGVkXCIpIHtcbiAgICAgIC8vIEZpcnN0IGNvbm5lY3Q6IGNhY2hlIHNlc3Npb25JZCBmb3IgZnV0dXJlIHJlc3VtZSBhdHRlbXB0cy5cbiAgICAgIGlmICghdGhpcy5fYXdhaXRpbmdSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcbiAgICAgICAgdGhpcy5fcGVyc2lzdFNlc3Npb25JZChtZXNzYWdlLnNlc3Npb25JZClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwic2Vzc2lvbi1yZXN1bWVkXCIpIHtcbiAgICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcbiAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG4gICAgICB0aGlzLl9wZXJzaXN0U2Vzc2lvbklkKG1lc3NhZ2Uuc2Vzc2lvbklkKVxuICAgICAgLy8gRmlyZSBvblJlc3VtZSBvbiBldmVyeSBsaXZlIGhhbmRsZSBzbyB1c2VyIGNvZGUga25vd3MgdGhlXG4gICAgICAvLyBzZXNzaW9uIGNhbWUgYmFjayB3aXRoIHN0YXRlIGludGFjdC5cbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgY29ubmVjdGlvbi5faGFuZGxlUmVzdW1lZCgpXG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkgc3Vic2NyaXB0aW9uLl9oYW5kbGVSZXN1bWVkKClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwic2Vzc2lvbi1nb25lXCIpIHtcbiAgICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcbiAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IG51bGxcbiAgICAgIHRoaXMuX2NsZWFyUGVyc2lzdGVkU2Vzc2lvbklkKClcbiAgICAgIC8vIFRlYXIgZG93biBldmVyeSBsaXZlIGhhbmRsZSDigJQgdGhlaXIgc2VydmVyLXNpZGUgY291bnRlcnBhcnRzXG4gICAgICAvLyBhcmUgZ29uZSBhbmQgbm90aGluZyBjYW4gYnJpbmcgdGhlbSBiYWNrLlxuICAgICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG4gICAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChcInNlc3Npb25fZ29uZVwiKVxuXG4gICAgICBjb25zdCBzdWJzID0gWy4uLnRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2Ygc3Vicykgc3Vic2NyaXB0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2dvbmVcIilcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiZXJyb3JcIiAmJiBtZXNzYWdlLmlkKSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KG1lc3NhZ2UuaWQpXG5cbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmRlbGV0ZShtZXNzYWdlLmlkKVxuICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIlVua25vd24gd2Vic29ja2V0IGVycm9yXCIpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkfSBwYXJhbXMgLSBTdWJzY3JpcHRpb24gcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0YWJsZSBzdWJzY3JpcHRpb24ga2V5LlxuICAgKi9cbiAgX3N1YnNjcmlwdGlvbktleShjaGFubmVsLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW2NoYW5uZWwsIHBhcmFtcyB8fCBudWxsXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3QgYWxsIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB0aGUgc29ja2V0IGNsb3Nlcy4gU2NoZWR1bGVzIHJlY29ubmVjdCBpZiBlbmFibGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlIHx8PSBEYXRlLm5vdygpXG5cbiAgICBmb3IgKGNvbnN0IFtpZCwge3JlamVjdH1dIG9mIHRoaXMucGVuZGluZ1JlcXVlc3RzLmVudHJpZXMoKSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgV2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgcmVzcG9uc2UgZm9yICR7aWR9YCkpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7cmVqZWN0fSBvZiB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKFwiV2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgc3Vic2NyaXB0aW9uIGFja25vd2xlZGdlbWVudFwiKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvbklkICYmIHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgLy8gU2Vzc2lvbiBtYXkgcmVzdW1lIHdoZW4gd2UgcmVjb25uZWN0IOKAlCBrZWVwIHRoZSBoYW5kbGVzIGFsaXZlXG4gICAgICAvLyBhbmQgZmlyZSBvbkRpc2Nvbm5lY3Qgc28gdXNlciBjb2RlIGNhbiBwYXVzZSBVSSB3b3JrLlxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpKSBjb25uZWN0aW9uLl9oYW5kbGVEaXNjb25uZWN0ZWQoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHN1YnNjcmlwdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gcmVzdW1lIHBhdGg6IHRlYXIgZG93biBldmVyeSBsaXZlIENvbm5lY3Rpb24gLyBDaGFubmVsIHN1Yi5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICAgIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxTdWJzID0gWy4uLnRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgY2hhbm5lbFN1YnMpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2Rlc3Ryb3llZFwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuY2xlYXIoKVxuICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcblxuICAgIGlmICh0aGlzLmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlUmVjb25uZWN0KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZW5kTWVzc2FnZShwYXlsb2FkKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgaXMgbm90IG9wZW5cIilcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcblxuICAgIHRoaXMuX2RlYnVnKFwiU2VuZGluZ1wiLCBqc29uKVxuICAgIHRoaXMuc29ja2V0LnNlbmQoanNvbilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpXG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3NjaGVkdWxlUmVjb25uZWN0KCkge1xuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5c1tNYXRoLm1pbih0aGlzLnJlY29ubmVjdEF0dGVtcHQsIHRoaXMucmVjb25uZWN0RGVsYXlzLmxlbmd0aCAtIDEpXVxuXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgICAgdm9pZCB0aGlzLl9hdHRlbXB0UmVjb25uZWN0KClcbiAgICB9LCBkZWxheSlcblxuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCArPSAxXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIF9hdHRlbXB0UmVjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICAgIHRoaXMuX3Jlc3Vic2NyaWJlQWN0aXZlTGlzdGVuZXJzKClcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiUmVjb25uZWN0IGF0dGVtcHQgZmFpbGVkOlwiLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNlbmRzIHN1YnNjcmliZSBtZXNzYWdlcyBmb3IgYWxsIGFjdGl2ZSBsaXN0ZW5lcnMgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZXN1YnNjcmliZUFjdGl2ZUxpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxpc3RlbmVyRW50cnldIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgY2hhbm5lbDogbGlzdGVuZXJFbnRyeS5jaGFubmVsLFxuICAgICAgICAgIHBhcmFtczogbGlzdGVuZXJFbnRyeS5wYXJhbXMsXG4gICAgICAgICAgdHlwZTogXCJzdWJzY3JpYmVcIlxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJSZS1zdWJzY3JpYmUgZmFpbGVkOlwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUuZGVidWcoXCJbVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50XVwiLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgLSBJZCB0byBwZXJzaXN0IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgc2Vzc2lvblN0b3JlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9wZXJzaXN0U2Vzc2lvbklkKHNlc3Npb25JZCkge1xuICAgIGlmICghdGhpcy5fc2Vzc2lvblN0b3JlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9zZXNzaW9uU3RvcmUuc2V0KHNlc3Npb25JZClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLnNldCBmYWlsZWRcIiwgZXJyb3IpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5zZXQgZmFpbGVkXCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbGVhclBlcnNpc3RlZFNlc3Npb25JZCgpIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25TdG9yZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc2Vzc2lvblN0b3JlLmNsZWFyKClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcikpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzcG9uc2VNZXNzYWdlID0gLyoqIEB0eXBlIHt7Ym9keT86IGFueSwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgc3RhdHVzQ29kZT86IG51bWJlciwgc3RhdHVzTWVzc2FnZT86IHN0cmluZywgdHlwZT86IHN0cmluZ319ICovIChtZXNzYWdlKVxuXG4gICAgdGhpcy5ib2R5ID0gcmVzcG9uc2VNZXNzYWdlLmJvZHlcbiAgICB0aGlzLmhlYWRlcnMgPSByZXNwb25zZU1lc3NhZ2UuaGVhZGVycyB8fCB7fVxuICAgIHRoaXMuaWQgPSByZXNwb25zZU1lc3NhZ2UuaWRcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzQ29kZSB8fCAyMDBcbiAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgICB0aGlzLnR5cGUgPSByZXNwb25zZU1lc3NhZ2UudHlwZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHthbnl9IC0gVGhlIGpzb24uICAqL1xuICBqc29uKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNwb25zZSBib2R5IGlzIG5vdCBhIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShKU09OLnBhcnNlKHRoaXMuYm9keSkpXG4gIH1cbn1cbiJdfQ==
|
|
743
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9odHRwLWNsaWVudC93ZWJzb2NrZXQtY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGtDQUFrQyxNQUFNLDJCQUEyQixDQUFBO0FBQzFFLE9BQU8sb0NBQW9DLE1BQU0sd0JBQXdCLENBQUE7QUFDekUsT0FBTyxFQUFDLHNDQUFzQyxFQUFDLE1BQU0sK0NBQStDLENBQUE7QUFFcEcsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtBQUVoRTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLHdCQUF3QjtJQUMzQyx1SEFBdUg7SUFDdkgsZUFBZSxDQUFBO0lBQ2YsK0ZBQStGO0lBQy9GLG9CQUFvQixDQUFBO0lBQ3BCLG9KQUFvSjtJQUNwSixTQUFTLENBQUE7SUFFVDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxFQUFDLGFBQWEsR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUU7UUFDekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBRS9FLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDaEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDckMs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Q0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDdEUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uIGZyb20gXCIuL3dlYnNvY2tldC1jb25uZWN0aW9uLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRTdWJzY3JpcHRpb24gZnJvbSBcIi4vd2Vic29ja2V0LWNoYW5uZWwuanNcIlxuaW1wb3J0IHtkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZX0gZnJvbSBcIi4uL2Zyb250ZW5kLW1vZGVscy90cmFuc3BvcnQtc2VyaWFsaXphdGlvbi5qc1wiXG5cbmNvbnN0IERFRkFVTFRfUkVDT05ORUNUX0RFTEFZUyA9IFsxMDAwLCAyMDAwLCA0MDAwLCA4MDAwLCAxNTAwMF1cblxuLyoqXG4gKiBBIHNtYWxsIHdlYnNvY2tldCBjbGllbnQgdGhhdCBtaXJyb3JzIHNpbXBsZSBIVFRQLXN0eWxlIGNhbGxzIGFuZCBjaGFubmVsIHN1YnNjcmlwdGlvbnMuXG4gKiBTdXBwb3J0cyBvcHRpb25hbCBhdXRvLXJlY29ubmVjdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYgYW5kIGxpc3RlbmVyIHJlLXN1YnNjcmlwdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50IHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCB7cmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQsIHJlc29sdmU6IChyZXNwb25zZTogVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2UpID0+IHZvaWR9Pn0gKi9cbiAgcGVuZGluZ1JlcXVlc3RzXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge3JlamVjdDogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkLCByZXNvbHZlOiAodmFsdWU/OiB2b2lkKSA9PiB2b2lkfT59ICovXG4gIHBlbmRpbmdTdWJzY3JpcHRpb25zXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywge2NhbGxiYWNrczogU2V0PChwYXlsb2FkOiBhbnkpID0+IHZvaWQ+LCBjaGFubmVsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCwgcmVhZHk6IFByb21pc2U8dm9pZD59Pn0gKi9cbiAgbGlzdGVuZXJzXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5hdXRvUmVjb25uZWN0XSAtIEVuYWJsZSBhdXRvLXJlY29ubmVjdCB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWddIC0gV2hldGhlciBkZWJ1Zy5cbiAgICogQHBhcmFtIHtudW1iZXJbXX0gW2FyZ3MucmVjb25uZWN0RGVsYXlzXSAtIEJhY2tvZmYgZGVsYXlzIGluIG1zIChkZWZhdWx0OiBbMTAwMCwgMjAwMCwgNDAwMCwgODAwMCwgMTUwMDBdKS5cbiAgICogQHBhcmFtIHt7Z2V0OiAoKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiwgc2V0OiAoc2Vzc2lvbklkOiBzdHJpbmcpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+LCBjbGVhcjogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59fSBbYXJncy5zZXNzaW9uU3RvcmVdIC0gT3B0aW9uYWwgc2Vzc2lvbklkIHBlcnNpc3RlbmNlIGhvb2suIFdoZW4gcHJvdmlkZWQsIHRoZSBjbGllbnQgd3JpdGVzIGV2ZXJ5IGBzZXNzaW9uLWVzdGFibGlzaGVkYCAvIGBzZXNzaW9uLXJlc3VtZWRgIGlkIHZpYSBgc3RvcmUuc2V0KGlkKWAgYW5kIGNsZWFycyBpdCBvbiBgc2Vzc2lvbi1nb25lYC4gQmVmb3JlIHRoZSBmaXJzdCBgY29ubmVjdCgpYCwgdGhlIGNsaWVudCByZWFkcyBhbnkgcGVyc2lzdGVkIGlkIHZpYSBgc3RvcmUuZ2V0KClgIGFuZCBhdHRlbXB0cyByZXN1bXB0aW9uLiBBcHBzIHNob3VsZCBiYWNrIHRoaXMgYnkgd2hhdGV2ZXIgcGVyc2lzdGVuY2UgbGF5ZXIgc3Vydml2ZXMgcGFnZSByZWxvYWRzIChsb2NhbFN0b3JhZ2UsIGEgY29va2llLCBTUUxpdGUsIGV0Yy4pLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudXJsXSBGdWxsIHdlYnNvY2tldCBVUkwgKGRlZmF1bHQ6IHdzOi8vMTI3LjAuMC4xOjMwMDYvd2Vic29ja2V0KVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2F1dG9SZWNvbm5lY3QgPSBmYWxzZSwgZGVidWcgPSBmYWxzZSwgcmVjb25uZWN0RGVsYXlzLCBzZXNzaW9uU3RvcmUsIHVybH0gPSB7fSkge1xuICAgIGlmICghZ2xvYmFsVGhpcy5XZWJTb2NrZXQpIHRocm93IG5ldyBFcnJvcihcIldlYlNvY2tldCBnbG9iYWwgaXMgbm90IGF2YWlsYWJsZVwiKVxuXG4gICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IGF1dG9SZWNvbm5lY3RcbiAgICB0aGlzLmRlYnVnID0gZGVidWdcbiAgICAvKiogQHR5cGUge251bWJlciB8IG51bGx9ICovXG4gICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKClcbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwXG4gICAgLyoqIEB0eXBlIHtudW1iZXJbXX0gKi9cbiAgICB0aGlzLnJlY29ubmVjdERlbGF5cyA9IHJlY29ubmVjdERlbGF5cyB8fCBERUZBVUxUX1JFQ09OTkVDVF9ERUxBWVNcbiAgICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbH0gKi9cbiAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIHRoaXMudXJsID0gdXJsIHx8IFwid3M6Ly8xMjcuMC4wLjE6MzAwNi93ZWJzb2NrZXRcIlxuICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5uZXh0SUQgPSAxXG4gICAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD4pIHwgbnVsbH0gKi9cbiAgICB0aGlzLm9uUmVjb25uZWN0ID0gbnVsbFxuXG4gICAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuICAgIHRoaXMuX21ldGFkYXRhID0ge31cblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbj59ICovXG4gICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgTWFwKClcblxuICAgIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uPn0gKi9cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgdGhpcy5fbmV4dENvbm5lY3Rpb25JZFNlcSA9IDFcbiAgICB0aGlzLl9uZXh0U3Vic2NyaXB0aW9uSWRTZXEgPSAxXG5cbiAgICAvKiogQHR5cGUge3N0cmluZyB8IG51bGx9IC0gc2Vzc2lvbklkIHJlY2VpdmVkIGZyb20gYHNlc3Npb24tZXN0YWJsaXNoZWRgOyBzZW50IG9uIHJlY29ubmVjdCBmb3IgcmVzdW1wdGlvbi4gKi9cbiAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBiZXR3ZWVuIGEgcmVjb25uZWN0IGFuZCB0aGUgc2Vzc2lvbi1yZXN1bWVkIC8gc2Vzc2lvbi1nb25lIHJlcGx5LiAqL1xuICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7e2dldDogKCkgPT4gc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCB8IFByb21pc2U8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4sIHNldDogKHNlc3Npb25JZDogc3RyaW5nKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPiwgY2xlYXI6ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLl9zZXNzaW9uU3RvcmUgPSBzZXNzaW9uU3RvcmVcbiAgICAvKiogQHR5cGUge2Jvb2xlYW59IC0gdHJ1ZSBvbmNlIHRoZSBzZXNzaW9uU3RvcmUgaGFzIGJlZW4gY29uc3VsdGVkIGZvciBhIHJlc3RvcmVkIGlkLiAqL1xuICAgIHRoaXMuX3Nlc3Npb25TdG9yZVJlc3RvcmVkID0gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgaXNPcGVuKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pXG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSAxOjEgYFdlYnNvY2tldENvbm5lY3Rpb25gIG9mIHRoZSBnaXZlbiB0eXBlIGFnYWluc3QgdGhlXG4gICAqIHNlcnZlci4gUmVxdWlyZXMgdGhlIHNvY2tldCB0byBhbHJlYWR5IGJlIGNvbm5lY3RlZCAoY2FsbFxuICAgKiBgY29ubmVjdCgpYCBmaXJzdCkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb25uZWN0aW9uVHlwZSAtIE5hbWUgdGhlIHNlcnZlciByZWdpc3RlcmVkIHRoZSBjbGFzcyB1bmRlci5cbiAgICogQHBhcmFtIHt7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Piwgb25Db25uZWN0PzogKCkgPT4gdm9pZCwgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9ufVxuICAgKi9cbiAgb3BlbkNvbm5lY3Rpb24oY29ubmVjdGlvblR5cGUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc09wZW4oKSkgdGhyb3cgbmV3IEVycm9yKFwiV2Vic29ja2V0IGlzIG5vdCBvcGVuOyBjYWxsIGNvbm5lY3QoKSBmaXJzdFwiKVxuXG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gYGMke3RoaXMuX25leHRDb25uZWN0aW9uSWRTZXErK31gXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRDb25uZWN0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIG9uQ29ubmVjdDogb3B0aW9ucy5vbkNvbm5lY3QsXG4gICAgICBvbk1lc3NhZ2U6IG9wdGlvbnMub25NZXNzYWdlLFxuICAgICAgb25EaXNjb25uZWN0OiBvcHRpb25zLm9uRGlzY29ubmVjdCxcbiAgICAgIG9uUmVzdW1lOiBvcHRpb25zLm9uUmVzdW1lLFxuICAgICAgb25DbG9zZTogb3B0aW9ucy5vbkNsb3NlXG4gICAgfSlcblxuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLnNldChjb25uZWN0aW9uSWQsIGNvbm5lY3Rpb24pXG4gICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogXCJjb25uZWN0aW9uLW9wZW5cIixcbiAgICAgIGNvbm5lY3Rpb25JZCxcbiAgICAgIGNvbm5lY3Rpb25UeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyB8fCB7fVxuICAgIH0pXG5cbiAgICByZXR1cm4gY29ubmVjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGEgY29ubmVjdGlvbiBoYW5kbGUgZnJvbSB0aGUgcmVnaXN0cnkuIENhbGxlZCBieVxuICAgKiBgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50Q29ubmVjdGlvbi5jbG9zZSgpYCBhZnRlciBpdCBub3RpZmllc1xuICAgKiB0aGUgc2VydmVyLCBhbmQgYnkgdGhlIHNlc3Npb24tZGVzdHJveWVkIGNsZWFudXAgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbm5lY3Rpb25JZFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZW1vdmVDb25uZWN0aW9uKGNvbm5lY3Rpb25JZCkge1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShjb25uZWN0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIG5hbWVkIFdlYnNvY2tldENoYW5uZWwuIFJlcXVpcmVzIHRoZSBzb2NrZXQgdG9cbiAgICogYWxyZWFkeSBiZSBjb25uZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsVHlwZSAtIE5hbWUgdGhlIHNlcnZlciByZWdpc3RlcmVkIHRoZSBjaGFubmVsIHVuZGVyLlxuICAgKiBAcGFyYW0ge3twYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBsYXN0RXZlbnRJZD86IHN0cmluZywgb25NZXNzYWdlPzogKGJvZHk6IGFueSkgPT4gdm9pZCwgb25EaXNjb25uZWN0PzogKCkgPT4gdm9pZCwgb25SZXN1bWU/OiAoKSA9PiB2b2lkLCBvbkNsb3NlPzogKHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfX0gW29wdGlvbnNdXG4gICAqIEByZXR1cm5zIHtWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRTdWJzY3JpcHRpb259XG4gICAqL1xuICBzdWJzY3JpYmVDaGFubmVsKGNoYW5uZWxUeXBlLCBvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKCkpIHRocm93IG5ldyBFcnJvcihcIldlYnNvY2tldCBpcyBub3Qgb3BlbjsgY2FsbCBjb25uZWN0KCkgZmlyc3RcIilcblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkID0gYHMke3RoaXMuX25leHRTdWJzY3JpcHRpb25JZFNlcSsrfWBcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBuZXcgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50U3Vic2NyaXB0aW9uKHtcbiAgICAgIGNsaWVudDogdGhpcyxcbiAgICAgIHN1YnNjcmlwdGlvbklkLFxuICAgICAgY2hhbm5lbFR5cGUsXG4gICAgICBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLFxuICAgICAgb25NZXNzYWdlOiBvcHRpb25zLm9uTWVzc2FnZSxcbiAgICAgIG9uRGlzY29ubmVjdDogb3B0aW9ucy5vbkRpc2Nvbm5lY3QsXG4gICAgICBvblJlc3VtZTogb3B0aW9ucy5vblJlc3VtZSxcbiAgICAgIG9uQ2xvc2U6IG9wdGlvbnMub25DbG9zZVxuICAgIH0pXG5cbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5zZXQoc3Vic2NyaXB0aW9uSWQsIHN1YnNjcmlwdGlvbilcbiAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICB0eXBlOiBcImNoYW5uZWwtc3Vic2NyaWJlXCIsXG4gICAgICBzdWJzY3JpcHRpb25JZCxcbiAgICAgIGNoYW5uZWxUeXBlLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyB8fCB7fSxcbiAgICAgIC4uLihvcHRpb25zLmxhc3RFdmVudElkID8ge2xhc3RFdmVudElkOiBvcHRpb25zLmxhc3RFdmVudElkfSA6IHt9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1YnNjcmlwdGlvbklkXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgX3JlbW92ZUNoYW5uZWxTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uSWQpIHtcbiAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uSWQpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIGdsb2JhbCBtZXRhZGF0YSB2YWx1ZSB0aGF0IGlzIHNlbnQgdG8gdGhlIHNlcnZlci5cbiAgICogRm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucywgYSBtZXRhZGF0YSB1cGRhdGUgbWVzc2FnZSBpcyBzZW50IGltbWVkaWF0ZWx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTWV0YWRhdGEga2V5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBNZXRhZGF0YSB2YWx1ZSAobnVsbCB0byBjbGVhcikuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0TWV0YWRhdGEoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgdGhpcy5fbWV0YWRhdGFba2V5XVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tZXRhZGF0YVtrZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PT0gdGhpcy5zb2NrZXQuT1BFTikge1xuICAgICAgdGhpcy5fc2VuZE1lc3NhZ2Uoe3R5cGU6IFwibWV0YWRhdGFcIiwgZGF0YTogey4uLnRoaXMuX21ldGFkYXRhfX0pXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAtIEN1cnJlbnQgbWV0YWRhdGEuICovXG4gIGdldE1ldGFkYXRhKCkge1xuICAgIHJldHVybiB7Li4udGhpcy5fbWV0YWRhdGF9XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24gaXMgb3Blbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4pIHJldHVyblxuICAgIGlmICh0aGlzLmNvbm5lY3RQcm9taXNlKSByZXR1cm4gdGhpcy5jb25uZWN0UHJvbWlzZVxuXG4gICAgdGhpcy5jb25uZWN0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybClcblxuICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIG9uT3BlbilcbiAgICAgICAgdGhpcy5zb2NrZXQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBvbkVycm9yKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvbk9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNsZWFudXAoKVxuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoLyoqIEB0eXBlIHtFdmVudCAmIHtlcnJvcj86IHVua25vd259fSAqLyBldmVudCkgPT4ge1xuICAgICAgICBjbGVhbnVwKClcbiAgICAgICAgY29uc3QgZXJyb3IgPSBldmVudD8uZXJyb3IgfHwgbmV3IEVycm9yKFwiV2Vic29ja2V0IGNvbm5lY3Rpb24gZXJyb3JcIilcbiAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCBvbk9wZW4pXG4gICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgb25FcnJvcilcbiAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMub25NZXNzYWdlKVxuICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIHRoaXMub25DbG9zZSlcbiAgICB9KVxuXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0UHJvbWlzZVxuXG4gICAgLy8gQ29sZCByZXN0b3JlIGZyb20gZXh0ZXJuYWwgcGVyc2lzdGVuY2UgKHNlc3Npb25TdG9yZSkgb24gdGhlXG4gICAgLy8gdmVyeSBmaXJzdCBjb25uZWN0OiBhcHBzIHdpcmUgdGhpcyB1cCB0byBzdXJ2aXZlIGEgZnVsbCBwYWdlXG4gICAgLy8gcmVsb2FkLiBBZnRlciB0aGUgZmlyc3QgcmVzdG9yZSBhdHRlbXB0IHRoZSBpbi1tZW1vcnkgY2FjaGVcbiAgICAvLyB0YWtlcyBvdmVyLlxuICAgIGlmICghdGhpcy5fc2Vzc2lvbklkICYmICF0aGlzLl9zZXNzaW9uU3RvcmVSZXN0b3JlZCAmJiB0aGlzLl9zZXNzaW9uU3RvcmUpIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25TdG9yZVJlc3RvcmVkID0gdHJ1ZVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdG9yZWRJZCA9IGF3YWl0IHRoaXMuX3Nlc3Npb25TdG9yZS5nZXQoKVxuXG4gICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkSWQgPT09IFwic3RyaW5nXCIgJiYgc3RvcmVkSWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IHN0b3JlZElkXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmdldCBmYWlsZWRcIiwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIGNhY2hlZCBzZXNzaW9uSWQgZnJvbSBhIHByaW9yIGNvbm5lY3QsIGFzayB0aGVcbiAgICAvLyBzZXJ2ZXIgdG8gcmVzdW1lIGl0LiBUaGUgc2VydmVyIHJlcGxpZXMgd2l0aCBlaXRoZXJcbiAgICAvLyBgc2Vzc2lvbi1yZXN1bWVkYCAoc3RhdGUgcHJlc2VydmVkKSBvciBgc2Vzc2lvbi1nb25lYCAoY2xpZW50XG4gICAgLy8gbXVzdCBzdGFydCBmcmVzaCk7IHRoZSBtZXNzYWdlIGRpc3BhdGNoZXIgZmlyZXMgdGhlIGFwcHJvcHJpYXRlXG4gICAgLy8gbGlmZWN5Y2xlIGhvb2tzIG9uIGxpdmUgQ29ubmVjdGlvbiAvIENoYW5uZWwgaGFuZGxlcy5cbiAgICBpZiAodGhpcy5fc2Vzc2lvbklkKSB7XG4gICAgICB0aGlzLl9hd2FpdGluZ1Jlc3VtZSA9IHRydWVcbiAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHt0eXBlOiBcInNlc3Npb24tcmVzdW1lXCIsIHNlc3Npb25JZDogdGhpcy5fc2Vzc2lvbklkfSlcbiAgICAgIC8vIEZpcmUgb25EaXNjb25uZWN0IG9uIGxpdmUgaGFuZGxlcyBzbyBhcHBzIGNhbiBwYXVzZSBVSSB3b3JrXG4gICAgICAvLyB1bnRpbCBzZXNzaW9uLXJlc3VtZWQgLyBzZXNzaW9uLWdvbmUgYXJyaXZlcy5cbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgY29ubmVjdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICAgIGZvciAoY29uc3Qgc3Vic2NyaXB0aW9uIG9mIHRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpKSBzdWJzY3JpcHRpb24uX2hhbmRsZURpc2Nvbm5lY3RlZCgpXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX21ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7dHlwZTogXCJtZXRhZGF0YVwiLCBkYXRhOiB7Li4udGhpcy5fbWV0YWRhdGF9fSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCBhbmQgZW5hYmxlIGF1dG8tcmVjb25uZWN0LiBSZXNldHMgcmVjb25uZWN0IHN0YXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbm5lY3RlZC5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3RXaXRoUmVjb25uZWN0KCkge1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IHRydWVcbiAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgYXdhaXQgdGhpcy5jb25uZWN0KClcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB3ZWJzb2NrZXQgYW5kIGNsZWFyIHBlbmRpbmcgc3RhdGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBjbG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuc29ja2V0KSByZXR1cm5cblxuICAgIGlmICh0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09PSB0aGlzLnNvY2tldC5DTE9TRUQpIHtcbiAgICAgIHRoaXMuc29ja2V0ID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgICB0aGlzLnNvY2tldD8uY2xvc2UoKVxuICAgIH0pXG5cbiAgICB0aGlzLnNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIGF1dG8tcmVjb25uZWN0IGFuZCBjbG9zZSB0aGUgd2Vic29ja2V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNsb3NlZC5cbiAgICovXG4gIGFzeW5jIGRpc2Nvbm5lY3RBbmRTdG9wUmVjb25uZWN0KCkge1xuICAgIHRoaXMuYXV0b1JlY29ubmVjdCA9IGZhbHNlXG4gICAgdGhpcy5fY2FuY2VsUGVuZGluZ1JlY29ubmVjdCgpXG4gICAgYXdhaXQgdGhpcy5jbG9zZSgpXG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHJhdyBzb2NrZXQgd2l0aG91dCBkaXNhYmxpbmcgYXV0by1yZWNvbm5lY3QuIFVzZWQgYnkgdGVzdHMgdG9cbiAgICogc2ltdWxhdGUgYW4gdW5leHBlY3RlZCBuZXR3b3JrIGRyb3AgYW5kIHZlcmlmeSByZWNvbm5lY3Rpb24gYmVoYXZpb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gdGhlIHNvY2tldCBoYXMgY2xvc2VkLlxuICAgKi9cbiAgYXN5bmMgZHJvcENvbm5lY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCkgcmV0dXJuXG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQ/LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpXG4gICAgICB0aGlzLnNvY2tldD8uY2xvc2UoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNvbm5lY3RQcm9taXNlID0gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBhIFBPU1QgcmVxdWVzdCBvdmVyIHRoZSB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aC5cbiAgICogQHBhcmFtIHthbnl9IFtib2R5XSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHt7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBbb3B0aW9uc10gLSBSZXF1ZXN0IG9wdGlvbnMgc3VjaCBhcyBoZWFkZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcG9zdC5cbiAgICovXG4gIGFzeW5jIHBvc3QocGF0aCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdChcIlBPU1RcIiwgcGF0aCwgey4uLm9wdGlvbnMsIGJvZHl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBHRVQgcmVxdWVzdCBvdmVyIHRoZSB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aC5cbiAgICogQHBhcmFtIHt7aGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz59fSBbb3B0aW9uc10gLSBSZXF1ZXN0IG9wdGlvbnMgc3VjaCBhcyBoZWFkZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgZ2V0LlxuICAgKi9cbiAgYXN5bmMgZ2V0KHBhdGgsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJlcXVlc3QoXCJHRVRcIiwgcGF0aCwgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGZvciBzZXJ2ZXItc2VudCBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBhbnkpID0+IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgKi9cbiAgb24oY2hhbm5lbCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpYmUoY2hhbm5lbCwge30sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgY2xpZW50J3MgY29ubmVjdGlvbiBzdGF0ZS5cbiAgICogQHJldHVybnMge3tkaXNjb25uZWN0ZWRTaW5jZTogbnVtYmVyIHwgbnVsbCwgaXNPcGVuOiBib29sZWFuLCBsaXN0ZW5lckNvdW50OiBudW1iZXJ9fVxuICAgKi9cbiAgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc2Nvbm5lY3RlZFNpbmNlOiB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlLFxuICAgICAgaXNPcGVuOiAhIXRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT09IHRoaXMuc29ja2V0Lk9QRU4sXG4gICAgICBsaXN0ZW5lckNvdW50OiB0aGlzLmxpc3RlbmVycy5zaXplICsgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuc2l6ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYSBjaGFubmVsIGZvciBzZXJ2ZXItc2VudCBldmVudHMgd2l0aCBvcHRpb25hbCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFubmVsIC0gQ2hhbm5lbCBuYW1lLlxuICAgKiBAcGFyYW0ge3tsYXN0RXZlbnRJZD86IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgYW55Pn19IG9wdGlvbnMgLSBTdWJzY3JpcHRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogYW55LCBtZXNzYWdlPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gdm9pZH0gY2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgeygoKSA9PiB2b2lkKSAmIHtyZWFkeTogUHJvbWlzZTx2b2lkPn19IC0gVW5zdWJzY3JpYmUgZnVuY3Rpb24gd2l0aCByZWFkaW5lc3MgcHJvbWlzZS5cbiAgICovXG4gIHN1YnNjcmliZShjaGFubmVsLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHBhcmFtcyA9IG9wdGlvbnM/LnBhcmFtc1xuICAgIGNvbnN0IGxhc3RFdmVudElkID0gb3B0aW9ucz8ubGFzdEV2ZW50SWRcbiAgICBjb25zdCBzdWJzY3JpcHRpb25LZXkgPSB0aGlzLl9zdWJzY3JpcHRpb25LZXkoY2hhbm5lbCwgcGFyYW1zKVxuXG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoc3Vic2NyaXB0aW9uS2V5KSkge1xuICAgICAgLyoqIEB0eXBlIHsoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICAvKiogQHR5cGUgeygodmFsdWU/OiB2b2lkKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCByZXNvbHZlUmVhZHlcbiAgICAgIC8qKiBAdHlwZSB7KChlcnJvcjogdW5rbm93bikgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgcmVqZWN0UmVhZHlcbiAgICAgIGNvbnN0IHJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXNvbHZlUmVhZHkgPSByZXNvbHZlXG4gICAgICAgIHJlamVjdFJlYWR5ID0gcmVqZWN0XG4gICAgICB9KVxuXG4gICAgICB0aGlzLmxpc3RlbmVycy5zZXQoc3Vic2NyaXB0aW9uS2V5LCB7XG4gICAgICAgIGNhbGxiYWNrczogbmV3IFNldCgpLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlYWR5XG4gICAgICB9KVxuICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5zZXQoc3Vic2NyaXB0aW9uS2V5LCB7XG4gICAgICAgIHJlamVjdDogcmVqZWN0UmVhZHkgfHwgKCgpID0+IHt9KSxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZVJlYWR5IHx8ICgoKSA9PiB7fSlcbiAgICAgIH0pXG5cbiAgICAgIHZvaWQgdGhpcy5jb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3NlbmRNZXNzYWdlKHtjaGFubmVsLCBsYXN0RXZlbnRJZCwgcGFyYW1zLCB0eXBlOiBcInN1YnNjcmliZVwifSlcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4gdGhpcy5fZGVidWcoXCJTdWJzY3JpYmUgZmFpbGVkXCIsIGVycm9yKSlcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5lckVudHJ5ID0gdGhpcy5saXN0ZW5lcnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgIGlmICghbGlzdGVuZXJFbnRyeSkgdGhyb3cgbmV3IEVycm9yKFwiTGlzdGVuZXJzIG1hcCBub3QgaW5pdGlhbGl6ZWRcIilcblxuICAgIGxpc3RlbmVyRW50cnkuY2FsbGJhY2tzLmFkZChjYWxsYmFjaylcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgbGlzdGVuZXJFbnRyeS5jYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKVxuXG4gICAgICBpZiAobGlzdGVuZXJFbnRyeS5jYWxsYmFja3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgfVxuICAgIH1cblxuICAgIHVuc3Vic2NyaWJlLnJlYWR5ID0gbGlzdGVuZXJFbnRyeS5yZWFkeVxuXG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGEgY2hhbm5lbCBhbmQgd2FpdCB1bnRpbCB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgc3Vic2NyaXB0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHt7bGFzdEV2ZW50SWQ/OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIGFueT59fSBvcHRpb25zIC0gU3Vic2NyaXB0aW9uIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IGFueSwgbWVzc2FnZT86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9IGNhbGxiYWNrIC0gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCgoKSA9PiB2b2lkKSAmIHtyZWFkeTogUHJvbWlzZTx2b2lkPn0+fSAtIFJlYWR5IHVuc3Vic2NyaWJlIGhhbmRsZS5cbiAgICovXG4gIGFzeW5jIHN1YnNjcmliZUFuZFdhaXQoY2hhbm5lbCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCB1bnN1YnNjcmliZSA9IHRoaXMuc3Vic2NyaWJlKGNoYW5uZWwsIG9wdGlvbnMsIGNhbGxiYWNrKVxuXG4gICAgYXdhaXQgdW5zdWJzY3JpYmUucmVhZHlcblxuICAgIHJldHVybiB1bnN1YnNjcmliZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBIVFRQIG1ldGhvZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbb3B0aW9ucy5ib2R5XSAtIFJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbb3B0aW9ucy5oZWFkZXJzXSAtIEhlYWRlciBsaXN0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxWZWxvY2lvdXNXZWJzb2NrZXRSZXNwb25zZT59IC0gUmVzb2x2ZXMgd2l0aCB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHJlcXVlc3QobWV0aG9kLCBwYXRoLCB7Ym9keSwgaGVhZGVyc30gPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuY29ubmVjdCgpXG5cbiAgICBjb25zdCBpZCA9IGB3cy0ke3RoaXMubmV4dElEKyt9YFxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBib2R5LFxuICAgICAgaGVhZGVycyxcbiAgICAgIGlkLFxuICAgICAgbWV0aG9kLFxuICAgICAgcGF0aCxcbiAgICAgIHR5cGU6IFwicmVxdWVzdFwiXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLnNldChpZCwge3Jlc29sdmUsIHJlamVjdH0pXG4gICAgICB0aGlzLl9zZW5kTWVzc2FnZShwYXlsb2FkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnQ8YW55Pn0gZXZlbnQgLSBFdmVudCBwYXlsb2FkLlxuICAgKi9cbiAgb25NZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgcmF3ID0gdHlwZW9mIGV2ZW50LmRhdGEgPT09IFwic3RyaW5nXCIgPyBldmVudC5kYXRhIDogZXZlbnQuZGF0YT8udG9TdHJpbmc/LigpXG5cbiAgICBpZiAoIXJhdykgcmV0dXJuXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG4gICAgbGV0IG1lc3NhZ2VcblxuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShyYXcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiRmFpbGVkIHRvIHBhcnNlIHdlYnNvY2tldCBtZXNzYWdlXCIsIGVycm9yKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGV9ID0gbWVzc2FnZVxuXG4gICAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2VcIikge1xuICAgICAgY29uc3Qge2lkfSA9IG1lc3NhZ2VcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBpZCA/IHRoaXMucGVuZGluZ1JlcXVlc3RzLmdldChpZCkgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGlkKVxuICAgICAgICBwZW5kaW5nLnJlc29sdmUobmV3IFZlbG9jaW91c1dlYnNvY2tldFJlc3BvbnNlKG1lc3NhZ2UpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGVidWcoYE5vIHBlbmRpbmcgcmVxdWVzdCBmb3IgcmVzcG9uc2UgaWQgJHtpZH1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzdWJzY3JpYmVkXCIpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IHRoaXMuX3N1YnNjcmlwdGlvbktleShtZXNzYWdlLmNoYW5uZWwsIG1lc3NhZ2UucGFyYW1zKVxuICAgICAgY29uc3QgcGVuZGluZ1N1YnNjcmlwdGlvbiA9IHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbktleSlcblxuICAgICAgaWYgKHBlbmRpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nU3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uS2V5KVxuICAgICAgICBwZW5kaW5nU3Vic2NyaXB0aW9uLnJlc29sdmUoKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJldmVudFwiKSB7XG4gICAgICBjb25zdCB7Y2hhbm5lbCwgcGF5bG9hZH0gPSBtZXNzYWdlXG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyRW50cnkgb2YgdGhpcy5saXN0ZW5lcnMudmFsdWVzKCkpIHtcbiAgICAgICAgaWYgKGxpc3RlbmVyRW50cnkuY2hhbm5lbCAhPT0gY2hhbm5lbCkgY29udGludWVcblxuICAgICAgICBsaXN0ZW5lckVudHJ5LmNhbGxiYWNrcy5mb3JFYWNoKCgvKiogQHR5cGUgeyhwYXlsb2FkOiBhbnksIG1lc3NhZ2U/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSAqLyBjYWxsYmFjaykgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjYWxsYmFjayhwYXlsb2FkLCBtZXNzYWdlKVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZyhcIkxpc3RlbmVyIGVycm9yXCIsIGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwicmVwbGF5LWdhcFwiKSB7XG4gICAgICBjb25zdCBzdWJzY3JpcHRpb25LZXkgPSB0aGlzLl9zdWJzY3JpcHRpb25LZXkobWVzc2FnZS5jaGFubmVsLCBtZXNzYWdlLnBhcmFtcylcbiAgICAgIGNvbnN0IHBlbmRpbmdTdWJzY3JpcHRpb24gPSB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25LZXkpXG5cbiAgICAgIGlmIChwZW5kaW5nU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuZGVsZXRlKHN1YnNjcmlwdGlvbktleSlcbiAgICAgICAgcGVuZGluZ1N1YnNjcmlwdGlvbi5yZWplY3QobmV3IEVycm9yKGBSZXBsYXkgZ2FwIGZvciAke21lc3NhZ2UuY2hhbm5lbH1gKSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY29ubmVjdGlvbi1vcGVuZWRcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgY29ubmVjdGlvbj8uX2hhbmRsZU9wZW5lZCgpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tbWVzc2FnZVwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnMuZ2V0KG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuXG4gICAgICBjb25uZWN0aW9uPy5faGFuZGxlTWVzc2FnZShtZXNzYWdlLmJvZHkpXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tY2xvc2VkXCIpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9ucy5nZXQobWVzc2FnZS5jb25uZWN0aW9uSWQpXG5cbiAgICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zLmRlbGV0ZShtZXNzYWdlLmNvbm5lY3Rpb25JZClcbiAgICAgICAgY29ubmVjdGlvbi5faGFuZGxlQ2xvc2VkKG1lc3NhZ2UucmVhc29uIHx8IFwic2VydmVyX2Nsb3NlXCIpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImNvbm5lY3Rpb24tZXJyb3JcIikge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHRoaXMuX2Nvbm5lY3Rpb25zLmdldChtZXNzYWdlLmNvbm5lY3Rpb25JZClcblxuICAgICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMuZGVsZXRlKG1lc3NhZ2UuY29ubmVjdGlvbklkKVxuICAgICAgICBjb25uZWN0aW9uLl9oYW5kbGVDbG9zZWQoYGVycm9yOiAke21lc3NhZ2UubWVzc2FnZSB8fCBcImNvbm5lY3Rpb24tZXJyb3JcIn1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLXN1YnNjcmliZWRcIikge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KG1lc3NhZ2Uuc3Vic2NyaXB0aW9uSWQpXG5cbiAgICAgIHN1Yj8uX2hhbmRsZVN1YnNjcmliZWQoKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLW1lc3NhZ2VcIikge1xuICAgICAgY29uc3Qgc3ViID0gdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuZ2V0KG1lc3NhZ2Uuc3Vic2NyaXB0aW9uSWQpXG5cbiAgICAgIHN1Yj8uX2hhbmRsZU1lc3NhZ2UobWVzc2FnZS5ib2R5KVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJjaGFubmVsLXVuc3Vic2NyaWJlZFwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgaWYgKHN1Yikge1xuICAgICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgc3ViLl9oYW5kbGVDbG9zZWQoXCJzZXJ2ZXJfdW5zdWJzY3JpYmVcIilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY2hhbm5lbC1lcnJvclwiKSB7XG4gICAgICBjb25zdCBzdWIgPSB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5nZXQobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcblxuICAgICAgaWYgKHN1Yikge1xuICAgICAgICB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy5kZWxldGUobWVzc2FnZS5zdWJzY3JpcHRpb25JZClcbiAgICAgICAgc3ViLl9oYW5kbGVDbG9zZWQoYGVycm9yOiAke21lc3NhZ2UubWVzc2FnZSB8fCBcImNoYW5uZWwtZXJyb3JcIn1gKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJzZXNzaW9uLWVzdGFibGlzaGVkXCIpIHtcbiAgICAgIC8vIEZpcnN0IGNvbm5lY3Q6IGNhY2hlIHNlc3Npb25JZCBmb3IgZnV0dXJlIHJlc3VtZSBhdHRlbXB0cy5cbiAgICAgIGlmICghdGhpcy5fYXdhaXRpbmdSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbklkID0gbWVzc2FnZS5zZXNzaW9uSWRcbiAgICAgICAgdGhpcy5fcGVyc2lzdFNlc3Npb25JZChtZXNzYWdlLnNlc3Npb25JZClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwic2Vzc2lvbi1yZXN1bWVkXCIpIHtcbiAgICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcbiAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IG1lc3NhZ2Uuc2Vzc2lvbklkXG4gICAgICB0aGlzLl9wZXJzaXN0U2Vzc2lvbklkKG1lc3NhZ2Uuc2Vzc2lvbklkKVxuICAgICAgLy8gRmlyZSBvblJlc3VtZSBvbiBldmVyeSBsaXZlIGhhbmRsZSBzbyB1c2VyIGNvZGUga25vd3MgdGhlXG4gICAgICAvLyBzZXNzaW9uIGNhbWUgYmFjayB3aXRoIHN0YXRlIGludGFjdC5cbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLl9jb25uZWN0aW9ucy52YWx1ZXMoKSkgY29ubmVjdGlvbi5faGFuZGxlUmVzdW1lZCgpXG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiB0aGlzLl9jaGFubmVsU3Vic2NyaXB0aW9ucy52YWx1ZXMoKSkgc3Vic2NyaXB0aW9uLl9oYW5kbGVSZXN1bWVkKClcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwic2Vzc2lvbi1nb25lXCIpIHtcbiAgICAgIHRoaXMuX2F3YWl0aW5nUmVzdW1lID0gZmFsc2VcbiAgICAgIHRoaXMuX3Nlc3Npb25JZCA9IG51bGxcbiAgICAgIHRoaXMuX2NsZWFyUGVyc2lzdGVkU2Vzc2lvbklkKClcbiAgICAgIC8vIFRlYXIgZG93biBldmVyeSBsaXZlIGhhbmRsZSDigJQgdGhlaXIgc2VydmVyLXNpZGUgY291bnRlcnBhcnRzXG4gICAgICAvLyBhcmUgZ29uZSBhbmQgbm90aGluZyBjYW4gYnJpbmcgdGhlbSBiYWNrLlxuICAgICAgY29uc3QgY29ubmVjdGlvbnMgPSBbLi4udGhpcy5fY29ubmVjdGlvbnMudmFsdWVzKCldXG4gICAgICB0aGlzLl9jb25uZWN0aW9ucy5jbGVhcigpXG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb24gb2YgY29ubmVjdGlvbnMpIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChcInNlc3Npb25fZ29uZVwiKVxuXG4gICAgICBjb25zdCBzdWJzID0gWy4uLnRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2Ygc3Vicykgc3Vic2NyaXB0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2dvbmVcIilcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiZXJyb3JcIiAmJiBtZXNzYWdlLmlkKSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmVxdWVzdHMuZ2V0KG1lc3NhZ2UuaWQpXG5cbiAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzLmRlbGV0ZShtZXNzYWdlLmlkKVxuICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvciB8fCBcIlVua25vd24gd2Vic29ja2V0IGVycm9yXCIpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbm5lbCAtIENoYW5uZWwgbmFtZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkfSBwYXJhbXMgLSBTdWJzY3JpcHRpb24gcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0YWJsZSBzdWJzY3JpcHRpb24ga2V5LlxuICAgKi9cbiAgX3N1YnNjcmlwdGlvbktleShjaGFubmVsLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW2NoYW5uZWwsIHBhcmFtcyB8fCBudWxsXSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3QgYWxsIHBlbmRpbmcgcmVxdWVzdHMgd2hlbiB0aGUgc29ja2V0IGNsb3Nlcy4gU2NoZWR1bGVzIHJlY29ubmVjdCBpZiBlbmFibGVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25DbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLmRpc2Nvbm5lY3RlZFNpbmNlIHx8PSBEYXRlLm5vdygpXG5cbiAgICBmb3IgKGNvbnN0IFtpZCwge3JlamVjdH1dIG9mIHRoaXMucGVuZGluZ1JlcXVlc3RzLmVudHJpZXMoKSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgV2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgcmVzcG9uc2UgZm9yICR7aWR9YCkpXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB7cmVqZWN0fSBvZiB0aGlzLnBlbmRpbmdTdWJzY3JpcHRpb25zLnZhbHVlcygpKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKFwiV2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgc3Vic2NyaXB0aW9uIGFja25vd2xlZGdlbWVudFwiKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc2Vzc2lvbklkICYmIHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgLy8gU2Vzc2lvbiBtYXkgcmVzdW1lIHdoZW4gd2UgcmVjb25uZWN0IOKAlCBrZWVwIHRoZSBoYW5kbGVzIGFsaXZlXG4gICAgICAvLyBhbmQgZmlyZSBvbkRpc2Nvbm5lY3Qgc28gdXNlciBjb2RlIGNhbiBwYXVzZSBVSSB3b3JrLlxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpKSBjb25uZWN0aW9uLl9oYW5kbGVEaXNjb25uZWN0ZWQoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMudmFsdWVzKCkpIHN1YnNjcmlwdGlvbi5faGFuZGxlRGlzY29ubmVjdGVkKClcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gcmVzdW1lIHBhdGg6IHRlYXIgZG93biBldmVyeSBsaXZlIENvbm5lY3Rpb24gLyBDaGFubmVsIHN1Yi5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb25zID0gWy4uLnRoaXMuX2Nvbm5lY3Rpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY29ubmVjdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIGNvbm5lY3Rpb25zKSB7XG4gICAgICAgIGNvbm5lY3Rpb24uX2hhbmRsZUNsb3NlZChcInNlc3Npb25fZGVzdHJveWVkXCIpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxTdWJzID0gWy4uLnRoaXMuX2NoYW5uZWxTdWJzY3JpcHRpb25zLnZhbHVlcygpXVxuICAgICAgdGhpcy5fY2hhbm5lbFN1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgY2hhbm5lbFN1YnMpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLl9oYW5kbGVDbG9zZWQoXCJzZXNzaW9uX2Rlc3Ryb3llZFwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXNzaW9uSWQgPSBudWxsXG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMuY2xlYXIoKVxuICAgIHRoaXMucGVuZGluZ1N1YnNjcmlwdGlvbnMuY2xlYXIoKVxuICAgIHRoaXMuY29ubmVjdFByb21pc2UgPSB1bmRlZmluZWRcblxuICAgIGlmICh0aGlzLmF1dG9SZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlUmVjb25uZWN0KClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXlsb2FkIC0gUGF5bG9hZCBkYXRhLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9zZW5kTWVzc2FnZShwYXlsb2FkKSB7XG4gICAgaWYgKCF0aGlzLnNvY2tldCB8fCB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9PSB0aGlzLnNvY2tldC5PUEVOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJzb2NrZXQgaXMgbm90IG9wZW5cIilcbiAgICB9XG5cbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcblxuICAgIHRoaXMuX2RlYnVnKFwiU2VuZGluZ1wiLCBqc29uKVxuICAgIHRoaXMuc29ja2V0LnNlbmQoanNvbilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMucmVjb25uZWN0VGltZXIpIHtcbiAgICAgIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0KHRoaXMucmVjb25uZWN0VGltZXIpXG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3NjaGVkdWxlUmVjb25uZWN0KCkge1xuICAgIHRoaXMuX2NhbmNlbFBlbmRpbmdSZWNvbm5lY3QoKVxuXG4gICAgY29uc3QgZGVsYXkgPSB0aGlzLnJlY29ubmVjdERlbGF5c1tNYXRoLm1pbih0aGlzLnJlY29ubmVjdEF0dGVtcHQsIHRoaXMucmVjb25uZWN0RGVsYXlzLmxlbmd0aCAtIDEpXVxuXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyID0gbnVsbFxuICAgICAgdm9pZCB0aGlzLl9hdHRlbXB0UmVjb25uZWN0KClcbiAgICB9LCBkZWxheSlcblxuICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCArPSAxXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIF9hdHRlbXB0UmVjb25uZWN0KCkge1xuICAgIGlmICghdGhpcy5hdXRvUmVjb25uZWN0KSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbm5lY3QoKVxuICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMFxuICAgICAgdGhpcy5kaXNjb25uZWN0ZWRTaW5jZSA9IG51bGxcbiAgICAgIHRoaXMuX3Jlc3Vic2NyaWJlQWN0aXZlTGlzdGVuZXJzKClcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9uUmVjb25uZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5vblJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwiUmVjb25uZWN0IGF0dGVtcHQgZmFpbGVkOlwiLCBlcnJvcilcblxuICAgICAgaWYgKHRoaXMuYXV0b1JlY29ubmVjdCkge1xuICAgICAgICB0aGlzLl9zY2hlZHVsZVJlY29ubmVjdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNlbmRzIHN1YnNjcmliZSBtZXNzYWdlcyBmb3IgYWxsIGFjdGl2ZSBsaXN0ZW5lcnMgYWZ0ZXIgcmVjb25uZWN0aW9uLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9yZXN1YnNjcmliZUFjdGl2ZUxpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxpc3RlbmVyRW50cnldIG9mIHRoaXMubGlzdGVuZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zZW5kTWVzc2FnZSh7XG4gICAgICAgICAgY2hhbm5lbDogbGlzdGVuZXJFbnRyeS5jaGFubmVsLFxuICAgICAgICAgIHBhcmFtczogbGlzdGVuZXJFbnRyeS5wYXJhbXMsXG4gICAgICAgICAgdHlwZTogXCJzdWJzY3JpYmVcIlxuICAgICAgICB9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fZGVidWcoXCJSZS1zdWJzY3JpYmUgZmFpbGVkOlwiLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtICB7Li4uYW55fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIF9kZWJ1ZyguLi5hcmdzKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUuZGVidWcoXCJbVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50XVwiLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWQgLSBJZCB0byBwZXJzaXN0IHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgc2Vzc2lvblN0b3JlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9wZXJzaXN0U2Vzc2lvbklkKHNlc3Npb25JZCkge1xuICAgIGlmICghdGhpcy5fc2Vzc2lvblN0b3JlKSByZXR1cm5cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9zZXNzaW9uU3RvcmUuc2V0KHNlc3Npb25JZClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLnNldCBmYWlsZWRcIiwgZXJyb3IpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9kZWJ1ZyhcInNlc3Npb25TdG9yZS5zZXQgZmFpbGVkXCIsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF9jbGVhclBlcnNpc3RlZFNlc3Npb25JZCgpIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25TdG9yZSkgcmV0dXJuXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc2Vzc2lvblN0b3JlLmNsZWFyKClcblxuICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXN1bHQuY2F0Y2goKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gZXJyb3IpID0+IHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcikpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX2RlYnVnKFwic2Vzc2lvblN0b3JlLmNsZWFyIGZhaWxlZFwiLCBlcnJvcilcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVmVsb2Npb3VzV2Vic29ja2V0UmVzcG9uc2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgLSBNZXNzYWdlIHRleHQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzcG9uc2VNZXNzYWdlID0gLyoqIEB0eXBlIHt7Ym9keT86IGFueSwgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIGFueT4sIGlkPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCwgc3RhdHVzQ29kZT86IG51bWJlciwgc3RhdHVzTWVzc2FnZT86IHN0cmluZywgdHlwZT86IHN0cmluZ319ICovIChtZXNzYWdlKVxuXG4gICAgdGhpcy5ib2R5ID0gcmVzcG9uc2VNZXNzYWdlLmJvZHlcbiAgICB0aGlzLmhlYWRlcnMgPSByZXNwb25zZU1lc3NhZ2UuaGVhZGVycyB8fCB7fVxuICAgIHRoaXMuaWQgPSByZXNwb25zZU1lc3NhZ2UuaWRcbiAgICB0aGlzLnN0YXR1c0NvZGUgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzQ29kZSB8fCAyMDBcbiAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSByZXNwb25zZU1lc3NhZ2Uuc3RhdHVzTWVzc2FnZSB8fCBcIk9LXCJcbiAgICB0aGlzLnR5cGUgPSByZXNwb25zZU1lc3NhZ2UudHlwZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHthbnl9IC0gVGhlIGpzb24uICAqL1xuICBqc29uKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5ib2R5ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZXNwb25zZSBib2R5IGlzIG5vdCBhIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBkZXNlcmlhbGl6ZUZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZShKU09OLnBhcnNlKHRoaXMuYm9keSkpXG4gIH1cbn1cbiJdfQ==
|