Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_0000a8
T

217 lines
33 KiB
Plaintext

import { __extends } from "/_nuxt/node_modules/tslib/tslib.es6.js?v=e4f18c29";
import { Observable } from "/_nuxt/node_modules/@apollo/client/utilities/observables/Observable.js?v=e4f18c29";
import { iterateObserversSafely } from "/_nuxt/node_modules/@apollo/client/utilities/observables/iteration.js?v=e4f18c29";
import { fixObservableSubclass } from "/_nuxt/node_modules/@apollo/client/utilities/observables/subclassing.js?v=e4f18c29";
function isPromiseLike(value) {
return value && typeof value.then === "function";
}
// A Concast<T> observable concatenates the given sources into a single
// non-overlapping sequence of Ts, automatically unwrapping any promises,
// and broadcasts the T elements of that sequence to any number of
// subscribers, all without creating a bunch of intermediary Observable
// wrapper objects.
//
// Even though any number of observers can subscribe to the Concast, each
// source observable is guaranteed to receive at most one subscribe call,
// and the results are multicast to all observers.
//
// In addition to broadcasting every next/error message to this.observers,
// the Concast stores the most recent message using this.latest, so any
// new observers can immediately receive the latest message, even if it
// was originally delivered in the past. This behavior means we can assume
// every active observer in this.observers has received the same most
// recent message.
//
// With the exception of this.latest replay, a Concast is a "hot"
// observable in the sense that it does not replay past results from the
// beginning of time for each new observer.
//
// Could we have used some existing RxJS class instead? Concast<T> is
// similar to a BehaviorSubject<T>, because it is multicast and redelivers
// the latest next/error message to new subscribers. Unlike Subject<T>,
// Concast<T> does not expose an Observer<T> interface (this.handlers is
// intentionally private), since Concast<T> gets its inputs from the
// concatenated sources. If we ever switch to RxJS, there may be some
// value in reusing their code, but for now we use zen-observable, which
// does not contain any Subject implementations.
var Concast = /** @class */ (function (_super) {
__extends(Concast, _super);
// Not only can the individual elements of the iterable be promises, but
// also the iterable itself can be wrapped in a promise.
function Concast(sources) {
var _this = _super.call(this, function (observer) {
_this.addObserver(observer);
return function () { return _this.removeObserver(observer); };
}) || this;
// Active observers receiving broadcast messages. Thanks to this.latest,
// we can assume all observers in this Set have received the same most
// recent message, though possibly at different times in the past.
_this.observers = new Set();
_this.promise = new Promise(function (resolve, reject) {
_this.resolve = resolve;
_this.reject = reject;
});
// Bound handler functions that can be reused for every internal
// subscription.
_this.handlers = {
next: function (result) {
if (_this.sub !== null) {
_this.latest = ["next", result];
_this.notify("next", result);
iterateObserversSafely(_this.observers, "next", result);
}
},
error: function (error) {
var sub = _this.sub;
if (sub !== null) {
// Delay unsubscribing from the underlying subscription slightly,
// so that immediately subscribing another observer can keep the
// subscription active.
if (sub)
setTimeout(function () { return sub.unsubscribe(); });
_this.sub = null;
_this.latest = ["error", error];
_this.reject(error);
_this.notify("error", error);
iterateObserversSafely(_this.observers, "error", error);
}
},
complete: function () {
var _a = _this, sub = _a.sub, _b = _a.sources, sources = _b === void 0 ? [] : _b;
if (sub !== null) {
// If complete is called before concast.start, this.sources may be
// undefined, so we use a default value of [] for sources. That works
// here because it falls into the if (!value) {...} block, which
// appropriately terminates the Concast, even if this.sources might
// eventually have been initialized to a non-empty array.
var value = sources.shift();
if (!value) {
if (sub)
setTimeout(function () { return sub.unsubscribe(); });
_this.sub = null;
if (_this.latest && _this.latest[0] === "next") {
_this.resolve(_this.latest[1]);
}
else {
_this.resolve();
}
_this.notify("complete");
// We do not store this.latest = ["complete"], because doing so
// discards useful information about the previous next (or
// error) message. Instead, if new observers subscribe after
// this Concast has completed, they will receive the final
// 'next' message (unless there was an error) immediately
// followed by a 'complete' message (see addObserver).
iterateObserversSafely(_this.observers, "complete");
}
else if (isPromiseLike(value)) {
value.then(function (obs) { return (_this.sub = obs.subscribe(_this.handlers)); }, _this.handlers.error);
}
else {
_this.sub = value.subscribe(_this.handlers);
}
}
},
};
_this.nextResultListeners = new Set();
// A public way to abort observation and broadcast.
_this.cancel = function (reason) {
_this.reject(reason);
_this.sources = [];
_this.handlers.error(reason);
};
// Suppress rejection warnings for this.promise, since it's perfectly
// acceptable to pay no attention to this.promise if you're consuming
// the results through the normal observable API.
_this.promise.catch(function (_) { });
// If someone accidentally tries to create a Concast using a subscriber
// function, recover by creating an Observable from that subscriber and
// using it as the source.
if (typeof sources === "function") {
sources = [new Observable(sources)];
}
if (isPromiseLike(sources)) {
sources.then(function (iterable) { return _this.start(iterable); }, _this.handlers.error);
}
else {
_this.start(sources);
}
return _this;
}
Concast.prototype.start = function (sources) {
if (this.sub !== void 0)
return;
// In practice, sources is most often simply an Array of observables.
// TODO Consider using sources[Symbol.iterator]() to take advantage
// of the laziness of non-Array iterables.
this.sources = Array.from(sources);
// Calling this.handlers.complete() kicks off consumption of the first
// source observable. It's tempting to do this step lazily in
// addObserver, but this.promise can be accessed without calling
// addObserver, so consumption needs to begin eagerly.
this.handlers.complete();
};
Concast.prototype.deliverLastMessage = function (observer) {
if (this.latest) {
var nextOrError = this.latest[0];
var method = observer[nextOrError];
if (method) {
method.call(observer, this.latest[1]);
}
// If the subscription is already closed, and the last message was
// a 'next' message, simulate delivery of the final 'complete'
// message again.
if (this.sub === null && nextOrError === "next" && observer.complete) {
observer.complete();
}
}
};
Concast.prototype.addObserver = function (observer) {
if (!this.observers.has(observer)) {
// Immediately deliver the most recent message, so we can always
// be sure all observers have the latest information.
this.deliverLastMessage(observer);
this.observers.add(observer);
}
};
Concast.prototype.removeObserver = function (observer) {
if (this.observers.delete(observer) && this.observers.size < 1) {
// In case there are still any listeners in this.nextResultListeners, and
// no error or completion has been broadcast yet, make sure those
// observers have a chance to run and then remove themselves from
// this.observers.
this.handlers.complete();
}
};
Concast.prototype.notify = function (method, arg) {
var nextResultListeners = this.nextResultListeners;
if (nextResultListeners.size) {
// Replacing this.nextResultListeners first ensures it does not grow while
// we are iterating over it, potentially leading to infinite loops.
this.nextResultListeners = new Set();
nextResultListeners.forEach(function (listener) { return listener(method, arg); });
}
};
// We need a way to run callbacks just *before* the next result (or error or
// completion) is delivered by this Concast, so we can be sure any code that
// runs as a result of delivering that result/error observes the effects of
// running the callback(s). It was tempting to reuse the Observer type instead
// of introducing NextResultListener, but that messes with the sizing and
// maintenance of this.observers, and ends up being more code overall.
Concast.prototype.beforeNext = function (callback) {
var called = false;
this.nextResultListeners.add(function (method, arg) {
if (!called) {
called = true;
callback(method, arg);
}
});
};
return Concast;
}(Observable));
export { Concast };
// Necessary because the Concast constructor has a different signature
// than the Observable constructor.
fixObservableSubclass(Concast);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvb2JzZXJ2YWJsZXMvQ29uY2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBS0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSXpELFNBQVMsYUFBYSxDQUFJLEtBQW9CO0lBQzVDLE9BQU8sS0FBSyxJQUFJLE9BQVEsS0FBYSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7QUFDNUQsQ0FBQztBQVFELHVFQUF1RTtBQUN2RSx5RUFBeUU7QUFDekUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSxtQkFBbUI7QUFDbkIsRUFBRTtBQUNGLHlFQUF5RTtBQUN6RSx5RUFBeUU7QUFDekUsa0RBQWtEO0FBQ2xELEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLGtCQUFrQjtBQUNsQixFQUFFO0FBQ0YsaUVBQWlFO0FBQ2pFLHdFQUF3RTtBQUN4RSwyQ0FBMkM7QUFDM0MsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSwwRUFBMEU7QUFDMUUsdUVBQXVFO0FBQ3ZFLHdFQUF3RTtBQUN4RSxvRUFBb0U7QUFDcEUscUVBQXFFO0FBQ3JFLHdFQUF3RTtBQUN4RSxnREFBZ0Q7QUFDaEQ7SUFBZ0MsMkJBQWE7SUFZM0Msd0VBQXdFO0lBQ3hFLHdEQUF3RDtJQUN4RCxpQkFBWSxPQUE4RDtRQUN4RSxZQUFBLE1BQUssWUFBQyxVQUFDLFFBQVE7WUFDYixLQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLE9BQU8sY0FBTSxPQUFBLEtBQUksQ0FBQyxjQUFjLENBQUMsUUFB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RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUseUVBQXlFO0lBQ3pFLHNFQUFzRTtJQUN0RSw0QkFBVSxHQUFWLFVBQVcsUUFBNEI7UUFDckMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNLEVBQUUsR0FBRztZQUN2QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osTUFBTSxHQUFHLElBQUksQ0FBQztnQkFDZCxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFRSCxjQUFDO0FBQUQsQ0FBQyxBQWxORCxDQUFnQyxVQUFVLEdBa056Qzs7QUFPRCxzRUFBc0U7QUFDdEUsbUNBQW1DO0FBQ25DLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBPYnNlcnZlcixcbiAgT2JzZXJ2YWJsZVN1YnNjcmlwdGlvbixcbiAgU3Vic2NyaWJlcixcbn0gZnJvbSBcIi4vT2JzZXJ2YWJsZS5qc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuL09ic2VydmFibGUuanNcIjtcbmltcG9ydCB7IGl0ZXJhdGVPYnNlcnZlcnNTYWZlbHkgfSBmcm9tIFwiLi9pdGVyYXRpb24uanNcIjtcbmltcG9ydCB7IGZpeE9ic2VydmFibGVTdWJjbGFzcyB9IGZyb20gXCIuL3N1YmNsYXNzaW5nLmpzXCI7XG5cbnR5cGUgTWF5YmVBc3luYzxUPiA9IFQgfCBQcm9taXNlTGlrZTxUPjtcblxuZnVuY3Rpb24gaXNQcm9taXNlTGlrZTxUPih2YWx1ZTogTWF5YmVBc3luYzxUPik6IHZhbHVlIGlzIFByb21pc2VMaWtlPFQ+IHtcbiAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiAodmFsdWUgYXMgYW55KS50aGVuID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8vIEFueSBpbmRpdmlkdWFsIFNvdXJjZTxUPiBjYW4gYmUgYW4gT2JzZXJ2YWJsZTxUPiBvciBhIHByb21pc2UgZm9yIG9uZS5cbnR5cGUgU291cmNlPFQ+ID0gTWF5YmVBc3luYzxPYnNlcnZhYmxlPFQ+PjtcblxuZXhwb3J0IHR5cGUgQ29uY2FzdFNvdXJjZXNJdGVyYWJsZTxUPiA9IEl0ZXJhYmxlPFNvdXJjZTxUPj47XG5leHBvcnQgdHlwZSBDb25jYXN0U291cmNlc0FycmF5PFQ+ID0gQXJyYXk8U291cmNlPFQ+PjtcblxuLy8gQSBDb25jYXN0PFQ+IG9ic2VydmFibGUgY29uY2F0ZW5hdGVzIHRoZSBnaXZlbiBzb3VyY2VzIGludG8gYSBzaW5nbGVcbi8vIG5vbi1vdmVybGFwcGluZyBzZXF1ZW5jZSBvZiBUcywgYXV0b21hdGljYWxseSB1bndyYXBwaW5nIGFueSBwcm9taXNlcyxcbi8vIGFuZCBicm9hZGNhc3RzIHRoZSBUIGVsZW1lbnRzIG9mIHRoYXQgc2VxdWVuY2UgdG8gYW55IG51bWJlciBvZlxuLy8gc3Vic2NyaWJlcnMsIGFsbCB3aXRob3V0IGNyZWF0aW5nIGEgYnVuY2ggb2YgaW50ZXJtZWRpYXJ5IE9ic2VydmFibGVcbi8vIHdyYXBwZXIgb2JqZWN0cy5cbi8vXG4vLyBFdmVuIHRob3VnaCBhbnkgbnVtYmVyIG9mIG9ic2VydmVycyBjYW4gc3Vic2NyaWJlIHRvIHRoZSBDb25jYXN0LCBlYWNoXG4vLyBzb3VyY2Ugb2JzZXJ2YWJsZSBpcyBndWFyYW50ZWVkIHRvIHJlY2VpdmUgYXQgbW9zdCBvbmUgc3Vic2NyaWJlIGNhbGwsXG4vLyBhbmQgdGhlIHJlc3VsdHMgYXJlIG11bHRpY2FzdCB0byBhbGwgb2JzZXJ2ZXJzLlxuLy9cbi8vIEluIGFkZGl0aW9uIHRvIGJyb2FkY2FzdGluZyBldmVyeSBuZXh0L2Vycm9yIG1lc3NhZ2UgdG8gdGhpcy5vYnNlcnZlcnMsXG4vLyB0aGUgQ29uY2FzdCBzdG9yZXMgdGhlIG1vc3QgcmVjZW50IG1lc3NhZ2UgdXNpbmcgdGhpcy5sYXRlc3QsIHNvIGFueVxuLy8gbmV3IG9ic2VydmVycyBjYW4gaW1tZWRpYXRlbHkgcmVjZWl2ZSB0aGUgbGF0ZXN0IG1lc3NhZ2UsIGV2ZW4gaWYgaXRcbi8vIHdhcyBvcmlnaW5hbGx5IGRlbGl2ZXJlZCBpbiB0aGUgcGFzdC4gVGhpcyBiZWhhdmlvciBtZWFucyB3ZSBjYW4gYXNzdW1lXG4vLyBldmVyeSBhY3RpdmUgb2JzZXJ2ZXIgaW4gdGhpcy5vYnNlcnZlcnMgaGFzIHJlY2VpdmVkIHRoZSBzYW1lIG1vc3Rcbi8vIHJlY2VudCBtZXNzYWdlLlxuLy9cbi8vIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGlzLmxhdGVzdCByZXBsYXksIGEgQ29uY2FzdCBpcyBhIFwiaG90XCJcbi8vIG9ic2VydmFibGUgaW4gdGhlIHNlbnNlIHRoYXQgaXQgZG9lcyBub3QgcmVwbGF5IHBhc3QgcmVzdWx0cyBmcm9tIHRoZVxuLy8gYmVnaW5uaW5nIG9mIHRpbWUgZm9yIGVhY2ggbmV3IG9ic2VydmVyLlxuLy9cbi8vIENvdWxkIHdlIGhhdmUgdXNlZCBzb21lIGV4aXN0aW5nIFJ4SlMgY2xhc3MgaW5zdGVhZD8gQ29uY2FzdDxUPiBpc1xuLy8gc2ltaWxhciB0byBhIEJlaGF2aW9yU3ViamVjdDxUPiwgYmVjYXVzZSBpdCBpcyBtdWx0aWNhc3QgYW5kIHJlZGVsaXZlcnNcbi8vIHRoZSBsYXRlc3QgbmV4dC9lcnJvciBtZXNzYWdlIHRvIG5ldyBzdWJzY3JpYmVycy4gVW5saWtlIFN1YmplY3Q8VD4sXG4vLyBDb25jYXN0PFQ+IGRvZXMgbm90IGV4cG9zZSBhbiBPYnNlcnZlcjxUPiBpbnRlcmZhY2UgKHRoaXMuaGFuZGxlcnMgaXNcbi8vIGludGVudGlvbmFsbHkgcHJpdmF0ZSksIHNpbmNlIENvbmNhc3Q8VD4gZ2V0cyBpdHMgaW5wdXRzIGZyb20gdGhlXG4vLyBjb25jYXRlbmF0ZWQgc291cmNlcy4gSWYgd2UgZXZlciBzd2l0Y2ggdG8gUnhKUywgdGhlcmUgbWF5IGJlIHNvbWVcbi8vIHZhbHVlIGluIHJldXNpbmcgdGhlaXIgY29kZSwgYnV0IGZvciBub3cgd2UgdXNlIHplbi1vYnNlcnZhYmxlLCB3aGljaFxuLy8gZG9lcyBub3QgY29udGFpbiBhbnkgU3ViamVjdCBpbXBsZW1lbnRhdGlvbnMuXG5leHBvcnQgY2xhc3MgQ29uY2FzdDxUPiBleHRlbmRzIE9ic2VydmFibGU8VD4ge1xuICAvLyBBY3RpdmUgb2JzZXJ2ZXJzIHJlY2VpdmluZyBicm9hZGNhc3QgbWVzc2FnZXMuIFRoYW5rcyB0byB0aGlzLmxhdGVzdCxcbiAgLy8gd2UgY2FuIGFzc3VtZSBhbGwgb2JzZXJ2ZXJzIGluIHRoaXMgU2V0IGhhdmUgcmVjZWl2ZWQgdGhlIHNhbWUgbW9zdFxuICAvLyByZWNlbnQgbWVzc2FnZSwgdGhvdWdoIHBvc3NpYmx5IGF0IGRpZmZlcmVudCB0aW1lcyBpbiB0aGUgcGFzdC5cbiAgcHJpdmF0ZSBvYnNlcnZlcnMgPSBuZXcgU2V0PE9ic2VydmVyPFQ+PigpO1xuXG4gIC8vIFRoaXMgcHJvcGVydHkgc3RhcnRzIG9mZiB1bmRlZmluZWQgdG8gaW5kaWNhdGUgdGhlIGluaXRpYWxcbiAgLy8gc3Vic2NyaXB0aW9uIGhhcyBub3QgeWV0IGJlZ3VuLCB0aGVuIHBvaW50cyB0byBlYWNoIHNvdXJjZVxuICAvLyBzdWJzY3JpcHRpb24gaW4gdHVybiwgYW5kIGZpbmFsbHkgYmVjb21lcyBudWxsIGFmdGVyIHRoZSBzb3VyY2VzIGhhdmVcbiAgLy8gYmVlbiBleGhhdXN0ZWQuIEFmdGVyIHRoYXQsIGl0IHN0YXlzIG51bGwuXG4gIHByaXZhdGUgc3ViPzogT2JzZXJ2YWJsZVN1YnNjcmlwdGlvbiB8IG51bGw7XG5cbiAgLy8gTm90IG9ubHkgY2FuIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIHRoZSBpdGVyYWJsZSBiZSBwcm9taXNlcywgYnV0XG4gIC8vIGFsc28gdGhlIGl0ZXJhYmxlIGl0c2VsZiBjYW4gYmUgd3JhcHBlZCBpbiBhIHByb21pc2UuXG4gIGNvbnN0cnVjdG9yKHNvdXJjZXM6IE1heWJlQXN5bmM8Q29uY2FzdFNvdXJjZXNJdGVyYWJsZTxUPj4gfCBTdWJzY3JpYmVyPFQ+KSB7XG4gICAgc3VwZXIoKG9ic2VydmVyKSA9PiB7XG4gICAgICB0aGlzLmFkZE9ic2VydmVyKG9ic2VydmVyKTtcbiAgICAgIHJldHVybiAoKSA9PiB0aGlzLnJlbW92ZU9ic2VydmVyKG9ic2VydmVyKTtcbiAgICB9KTtcblxuICAgIC8vIFN1cHByZXNzIHJlamVjdGlvbiB3YXJuaW5ncyBmb3IgdGhpcy5wcm9taXNlLCBzaW5jZSBpdCdzIHBlcmZlY3RseVxuICAgIC8vIGFjY2VwdGFibGUgdG8gcGF5IG5vIGF0dGVudGlvbiB0byB0aGlzLnByb21pc2UgaWYgeW91J3JlIGNvbnN1bWluZ1xuICAgIC8vIHRoZSByZXN1bHRzIHRocm91Z2ggdGhlIG5vcm1hbCBvYnNlcnZhYmxlIEFQSS5cbiAgICB0aGlzLnByb21pc2UuY2F0Y2goKF8pID0+IHt9KTtcblxuICAgIC8vIElmIHNvbWVvbmUgYWNjaWRlbnRhbGx5IHRyaWVzIHRvIGNyZWF0ZSBhIENvbmNhc3QgdXNpbmcgYSBzdWJzY3JpYmVyXG4gICAgLy8gZnVuY3Rpb24sIHJlY292ZXIgYnkgY3JlYXRpbmcgYW4gT2JzZXJ2YWJsZSBmcm9tIHRoYXQgc3Vic2NyaWJlciBhbmRcbiAgICAvLyB1c2luZyBpdCBhcyB0aGUgc291cmNlLlxuICAgIGlmICh0eXBlb2Ygc291cmNlcyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBzb3VyY2VzID0gW25ldyBPYnNlcnZhYmxlKHNvdXJjZXMpXTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcm9taXNlTGlrZShzb3VyY2VzKSkge1xuICAgICAgc291cmNlcy50aGVuKChpdGVyYWJsZSkgPT4gdGhpcy5zdGFydChpdGVyYWJsZSksIHRoaXMuaGFuZGxlcnMuZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0KHNvdXJjZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgY29uc3VtYWJsZSBhcnJheSBvZiBzb3VyY2Ugb2JzZXJ2YWJsZXMsIGluY3JlbWVudGFsbHkgY29uc3VtZWQgZWFjaCB0aW1lXG4gIC8vIHRoaXMuaGFuZGxlcnMuY29tcGxldGUgaXMgY2FsbGVkLiBUaGlzIHByaXZhdGUgZmllbGQgaXMgbm90IGluaXRpYWxpemVkXG4gIC8vIHVudGlsIHRoZSBjb25jYXN0LnN0YXJ0IG1ldGhvZCBpcyBjYWxsZWQsIHdoaWNoIGNhbiBoYXBwZW4gYXN5bmNocm9ub3VzbHlcbiAgLy8gaWYgYSBQcm9taXNlIGlzIHBhc3NlZCB0byB0aGUgQ29uY2FzdCBjb25zdHJ1Y3Rvciwgc28gdW5kZWZpbmVkIGlzIGFcbiAgLy8gcG9zc2libGUgdmFsdWUgZm9yIHRoaXMuc291cmNlcyBiZWZvcmUgY29uY2FzdC5zdGFydCBpcyBjYWxsZWQuXG4gIHByaXZhdGUgc291cmNlczogU291cmNlPFQ+W10gfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBzdGFydChzb3VyY2VzOiBDb25jYXN0U291cmNlc0l0ZXJhYmxlPFQ+KSB7XG4gICAgaWYgKHRoaXMuc3ViICE9PSB2b2lkIDApIHJldHVybjtcblxuICAgIC8vIEluIHByYWN0aWNlLCBzb3VyY2VzIGlzIG1vc3Qgb2Z0ZW4gc2ltcGx5IGFuIEFycmF5IG9mIG9ic2VydmFibGVzLlxuICAgIC8vIFRPRE8gQ29uc2lkZXIgdXNpbmcgc291cmNlc1tTeW1ib2wuaXRlcmF0b3JdKCkgdG8gdGFrZSBhZHZhbnRhZ2VcbiAgICAvLyBvZiB0aGUgbGF6aW5lc3Mgb2Ygbm9uLUFycmF5IGl0ZXJhYmxlcy5cbiAgICB0aGlzLnNvdXJjZXMgPSBBcnJheS5mcm9tKHNvdXJjZXMpO1xuXG4gICAgLy8gQ2FsbGluZyB0aGlzLmhhbmRsZXJzLmNvbXBsZXRlKCkga2lja3Mgb2ZmIGNvbnN1bXB0aW9uIG9mIHRoZSBmaXJzdFxuICAgIC8vIHNvdXJjZSBvYnNlcnZhYmxlLiBJdCdzIHRlbXB0aW5nIHRvIGRvIHRoaXMgc3RlcCBsYXppbHkgaW5cbiAgICAvLyBhZGRPYnNlcnZlciwgYnV0IHRoaXMucHJvbWlzZSBjYW4gYmUgYWNjZXNzZWQgd2l0aG91dCBjYWxsaW5nXG4gICAgLy8gYWRkT2JzZXJ2ZXIsIHNvIGNvbnN1bXB0aW9uIG5lZWRzIHRvIGJlZ2luIGVhZ2VybHkuXG4gICAgdGhpcy5oYW5kbGVycy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxpdmVyTGFzdE1lc3NhZ2Uob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSB7XG4gICAgaWYgKHRoaXMubGF0ZXN0KSB7XG4gICAgICBjb25zdCBuZXh0T3JFcnJvciA9IHRoaXMubGF0ZXN0WzBdO1xuICAgICAgY29uc3QgbWV0aG9kID0gb2JzZXJ2ZXJbbmV4dE9yRXJyb3JdO1xuICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICBtZXRob2QuY2FsbChvYnNlcnZlciwgdGhpcy5sYXRlc3RbMV0pO1xuICAgICAgfVxuICAgICAgLy8gSWYgdGhlIHN1YnNjcmlwdGlvbiBpcyBhbHJlYWR5IGNsb3NlZCwgYW5kIHRoZSBsYXN0IG1lc3NhZ2Ugd2FzXG4gICAgICAvLyBhICduZXh0JyBtZXNzYWdlLCBzaW11bGF0ZSBkZWxpdmVyeSBvZiB0aGUgZmluYWwgJ2NvbXBsZXRlJ1xuICAgICAgLy8gbWVzc2FnZSBhZ2Fpbi5cbiAgICAgIGlmICh0aGlzLnN1YiA9PT0gbnVsbCAmJiBuZXh0T3JFcnJvciA9PT0gXCJuZXh0XCIgJiYgb2JzZXJ2ZXIuY29tcGxldGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkT2JzZXJ2ZXIob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVycy5oYXMob2JzZXJ2ZXIpKSB7XG4gICAgICAvLyBJbW1lZGlhdGVseSBkZWxpdmVyIHRoZSBtb3N0IHJlY2VudCBtZXNzYWdlLCBzbyB3ZSBjYW4gYWx3YXlzXG4gICAgICAvLyBiZSBzdXJlIGFsbCBvYnNlcnZlcnMgaGF2ZSB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uLlxuICAgICAgdGhpcy5kZWxpdmVyTGFzdE1lc3NhZ2Uob2JzZXJ2ZXIpO1xuICAgICAgdGhpcy5vYnNlcnZlcnMuYWRkKG9ic2VydmVyKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlT2JzZXJ2ZXIob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSB7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXJzLmRlbGV0ZShvYnNlcnZlcikgJiYgdGhpcy5vYnNlcnZlcnMuc2l6ZSA8IDEpIHtcbiAgICAgIC8vIEluIGNhc2UgdGhlcmUgYXJlIHN0aWxsIGFueSBsaXN0ZW5lcnMgaW4gdGhpcy5uZXh0UmVzdWx0TGlzdGVuZXJzLCBhbmRcbiAgICAgIC8vIG5vIGVycm9yIG9yIGNvbXBsZXRpb24gaGFzIGJlZW4gYnJvYWRjYXN0IHlldCwgbWFrZSBzdXJlIHRob3NlXG4gICAgICAvLyBvYnNlcnZlcnMgaGF2ZSBhIGNoYW5jZSB0byBydW4gYW5kIHRoZW4gcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbVxuICAgICAgLy8gdGhpcy5vYnNlcnZlcnMuXG4gICAgICB0aGlzLmhhbmRsZXJzLmNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQW55IENvbmNhc3Qgb2JqZWN0IGNhbiBiZSB0cml2aWFsbHkgY29udmVydGVkIHRvIGEgUHJvbWlzZSwgd2l0aG91dFxuICAvLyBoYXZpbmcgdG8gY3JlYXRlIGEgbmV3IHdyYXBwZXIgT2JzZXJ2YWJsZS4gVGhpcyBwcm9taXNlIHByb3ZpZGVzIGFuXG4gIC8vIGVhc3kgd2F5IHRvIG9ic2VydmUgdGhlIGZpbmFsIHN0YXRlIG9mIHRoZSBDb25jYXN0LlxuICBwcml2YXRlIHJlc29sdmUhOiAocmVzdWx0PzogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkO1xuICBwcml2YXRlIHJlamVjdCE6IChyZWFzb246IGFueSkgPT4gdm9pZDtcbiAgcHVibGljIHJlYWRvbmx5IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgfSk7XG5cbiAgLy8gTmFtZSBhbmQgYXJndW1lbnQgb2YgdGhlIG1vc3QgcmVjZW50bHkgaW52b2tlZCBvYnNlcnZlciBtZXRob2QsIHVzZWRcbiAgLy8gdG8gZGVsaXZlciBsYXRlc3QgcmVzdWx0cyBpbW1lZGlhdGVseSB0byBuZXcgb2JzZXJ2ZXJzLlxuICBwcml2YXRlIGxhdGVzdD86IFtcIm5leHRcIiwgVF0gfCBbXCJlcnJvclwiLCBhbnldO1xuXG4gIC8vIEJvdW5kIGhhbmRsZXIgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHJldXNlZCBmb3IgZXZlcnkgaW50ZXJuYWxcbiAgLy8gc3Vic2NyaXB0aW9uLlxuICBwcml2YXRlIGhhbmRsZXJzID0ge1xuICAgIG5leHQ6IChyZXN1bHQ6IFQpID0+IHtcbiAgICAgIGlmICh0aGlzLnN1YiAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmxhdGVzdCA9IFtcIm5leHRcIiwgcmVzdWx0XTtcbiAgICAgICAgdGhpcy5ub3RpZnkoXCJuZXh0XCIsIHJlc3VsdCk7XG4gICAgICAgIGl0ZXJhdGVPYnNlcnZlcnNTYWZlbHkodGhpcy5vYnNlcnZlcnMsIFwibmV4dFwiLCByZXN1bHQpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHsgc3ViIH0gPSB0aGlzO1xuICAgICAgaWYgKHN1YiAhPT0gbnVsbCkge1xuICAgICAgICAvLyBEZWxheSB1bnN1YnNjcmliaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgc3Vic2NyaXB0aW9uIHNsaWdodGx5LFxuICAgICAgICAvLyBzbyB0aGF0IGltbWVkaWF0ZWx5IHN1YnNjcmliaW5nIGFub3RoZXIgb2JzZXJ2ZXIgY2FuIGtlZXAgdGhlXG4gICAgICAgIC8vIHN1YnNjcmlwdGlvbiBhY3RpdmUuXG4gICAgICAgIGlmIChzdWIpIHNldFRpbWVvdXQoKCkgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLnN1YiA9IG51bGw7XG4gICAgICAgIHRoaXMubGF0ZXN0ID0gW1wiZXJyb3JcIiwgZXJyb3JdO1xuICAgICAgICB0aGlzLnJlamVjdChlcnJvcik7XG4gICAgICAgIHRoaXMubm90aWZ5KFwiZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICBpdGVyYXRlT2JzZXJ2ZXJzU2FmZWx5KHRoaXMub2JzZXJ2ZXJzLCBcImVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgc3ViLCBzb3VyY2VzID0gW10gfSA9IHRoaXM7XG4gICAgICBpZiAoc3ViICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGNvbXBsZXRlIGlzIGNhbGxlZCBiZWZvcmUgY29uY2FzdC5zdGFydCwgdGhpcy5zb3VyY2VzIG1heSBiZVxuICAgICAgICAvLyB1bmRlZmluZWQsIHNvIHdlIHVzZSBhIGRlZmF1bHQgdmFsdWUgb2YgW10gZm9yIHNvdXJjZXMuIFRoYXQgd29ya3NcbiAgICAgICAgLy8gaGVyZSBiZWNhdXNlIGl0IGZhbGxzIGludG8gdGhlIGlmICghdmFsdWUpIHsuLi59IGJsb2NrLCB3aGljaFxuICAgICAgICAvLyBhcHByb3ByaWF0ZWx5IHRlcm1pbmF0ZXMgdGhlIENvbmNhc3QsIGV2ZW4gaWYgdGhpcy5zb3VyY2VzIG1pZ2h0XG4gICAgICAgIC8vIGV2ZW50dWFsbHkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHRvIGEgbm9uLWVtcHR5IGFycmF5LlxuICAgICAgICBjb25zdCB2YWx1ZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgIGlmIChzdWIpIHNldFRpbWVvdXQoKCkgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgIHRoaXMuc3ViID0gbnVsbDtcbiAgICAgICAgICBpZiAodGhpcy5sYXRlc3QgJiYgdGhpcy5sYXRlc3RbMF0gPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUodGhpcy5sYXRlc3RbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5ub3RpZnkoXCJjb21wbGV0ZVwiKTtcbiAgICAgICAgICAvLyBXZSBkbyBub3Qgc3RvcmUgdGhpcy5sYXRlc3QgPSBbXCJjb21wbGV0ZVwiXSwgYmVjYXVzZSBkb2luZyBzb1xuICAgICAgICAgIC8vIGRpc2NhcmRzIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJldmlvdXMgbmV4dCAob3JcbiAgICAgICAgICAvLyBlcnJvcikgbWVzc2FnZS4gSW5zdGVhZCwgaWYgbmV3IG9ic2VydmVycyBzdWJzY3JpYmUgYWZ0ZXJcbiAgICAgICAgICAvLyB0aGlzIENvbmNhc3QgaGFzIGNvbXBsZXRlZCwgdGhleSB3aWxsIHJlY2VpdmUgdGhlIGZpbmFsXG4gICAgICAgICAgLy8gJ25leHQnIG1lc3NhZ2UgKHVubGVzcyB0aGVyZSB3YXMgYW4gZXJyb3IpIGltbWVkaWF0ZWx5XG4gICAgICAgICAgLy8gZm9sbG93ZWQgYnkgYSAnY29tcGxldGUnIG1lc3NhZ2UgKHNlZSBhZGRPYnNlcnZlcikuXG4gICAgICAgICAgaXRlcmF0ZU9ic2VydmVyc1NhZmVseSh0aGlzLm9ic2VydmVycywgXCJjb21wbGV0ZVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1Byb21pc2VMaWtlKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlLnRoZW4oXG4gICAgICAgICAgICAob2JzKSA9PiAodGhpcy5zdWIgPSBvYnMuc3Vic2NyaWJlKHRoaXMuaGFuZGxlcnMpKSxcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlcnMuZXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3ViID0gdmFsdWUuc3Vic2NyaWJlKHRoaXMuaGFuZGxlcnMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBwcml2YXRlIG5leHRSZXN1bHRMaXN0ZW5lcnMgPSBuZXcgU2V0PE5leHRSZXN1bHRMaXN0ZW5lcj4oKTtcblxuICBwcml2YXRlIG5vdGlmeShcbiAgICBtZXRob2Q6IFBhcmFtZXRlcnM8TmV4dFJlc3VsdExpc3RlbmVyPlswXSxcbiAgICBhcmc/OiBQYXJhbWV0ZXJzPE5leHRSZXN1bHRMaXN0ZW5lcj5bMV1cbiAgKSB7XG4gICAgY29uc3QgeyBuZXh0UmVzdWx0TGlzdGVuZXJzIH0gPSB0aGlzO1xuICAgIGlmIChuZXh0UmVzdWx0TGlzdGVuZXJzLnNpemUpIHtcbiAgICAgIC8vIFJlcGxhY2luZyB0aGlzLm5leHRSZXN1bHRMaXN0ZW5lcnMgZmlyc3QgZW5zdXJlcyBpdCBkb2VzIG5vdCBncm93IHdoaWxlXG4gICAgICAvLyB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIgaXQsIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8gaW5maW5pdGUgbG9vcHMuXG4gICAgICB0aGlzLm5leHRSZXN1bHRMaXN0ZW5lcnMgPSBuZXcgU2V0KCk7XG4gICAgICBuZXh0UmVzdWx0TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihtZXRob2QsIGFyZykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlIG5lZWQgYSB3YXkgdG8gcnVuIGNhbGxiYWNrcyBqdXN0ICpiZWZvcmUqIHRoZSBuZXh0IHJlc3VsdCAob3IgZXJyb3Igb3JcbiAgLy8gY29tcGxldGlvbikgaXMgZGVsaXZlcmVkIGJ5IHRoaXMgQ29uY2FzdCwgc28gd2UgY2FuIGJlIHN1cmUgYW55IGNvZGUgdGhhdFxuICAvLyBydW5zIGFzIGEgcmVzdWx0IG9mIGRlbGl2ZXJpbmcgdGhhdCByZXN1bHQvZXJyb3Igb2JzZXJ2ZXMgdGhlIGVmZmVjdHMgb2ZcbiAgLy8gcnVubmluZyB0aGUgY2FsbGJhY2socykuIEl0IHdhcyB0ZW1wdGluZyB0byByZXVzZSB0aGUgT2JzZXJ2ZXIgdHlwZSBpbnN0ZWFkXG4gIC8vIG9mIGludHJvZHVjaW5nIE5leHRSZXN1bHRMaXN0ZW5lciwgYnV0IHRoYXQgbWVzc2VzIHdpdGggdGhlIHNpemluZyBhbmRcbiAgLy8gbWFpbnRlbmFuY2Ugb2YgdGhpcy5vYnNlcnZlcnMsIGFuZCBlbmRzIHVwIGJlaW5nIG1vcmUgY29kZSBvdmVyYWxsLlxuICBiZWZvcmVOZXh0KGNhbGxiYWNrOiBOZXh0UmVzdWx0TGlzdGVuZXIpIHtcbiAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgdGhpcy5uZXh0UmVzdWx0TGlzdGVuZXJzLmFkZCgobWV0aG9kLCBhcmcpID0+IHtcbiAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIGNhbGxiYWNrKG1ldGhvZCwgYXJnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcHVibGljIHdheSB0byBhYm9ydCBvYnNlcnZhdGlvbiBhbmQgYnJvYWRjYXN0LlxuICBwdWJsaWMgY2FuY2VsID0gKHJlYXNvbjogYW55KSA9PiB7XG4gICAgdGhpcy5yZWplY3QocmVhc29uKTtcbiAgICB0aGlzLnNvdXJjZXMgPSBbXTtcbiAgICB0aGlzLmhhbmRsZXJzLmVycm9yKHJlYXNvbik7XG4gIH07XG59XG5cbnR5cGUgTmV4dFJlc3VsdExpc3RlbmVyID0gKFxuICBtZXRob2Q6IFwibmV4dFwiIHwgXCJlcnJvclwiIHwgXCJjb21wbGV0ZVwiLFxuICBhcmc/OiBhbnlcbikgPT4gYW55O1xuXG4vLyBOZWNlc3NhcnkgYmVjYXVzZSB0aGUgQ29uY2FzdCBjb25zdHJ1Y3RvciBoYXMgYSBkaWZmZXJlbnQgc2lnbmF0dXJlXG4vLyB0aGFuIHRoZSBPYnNlcnZhYmxlIGNvbnN0cnVjdG9yLlxuZml4T2JzZXJ2YWJsZVN1YmNsYXNzKENvbmNhc3QpO1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXX0=