@greenmice/ngx-cesium
Version:
Angular library for working with Cesium.
327 lines • 50.8 kB
JavaScript
/**
* Fix for the constant entity shadowing.
* PR in Cesium repo: https://github.com/AnalyticalGraphicsInc/cesium/pull/5736
*/
// tslint:disable
const AssociativeArray = Cesium.AssociativeArray;
const Color = Cesium.Color;
const ColorGeometryInstanceAttribute = Cesium.ColorGeometryInstanceAttribute;
const defined = Cesium.defined;
const DistanceDisplayCondition = Cesium.DistanceDisplayCondition;
const DistanceDisplayConditionGeometryInstanceAttribute = Cesium.DistanceDisplayConditionGeometryInstanceAttribute;
const ShowGeometryInstanceAttribute = Cesium.ShowGeometryInstanceAttribute;
const Primitive = Cesium.Primitive;
const ShadowMode = Cesium.ShadowMode;
const BoundingSphereState = Cesium.BoundingSphereState;
const ColorMaterialProperty = Cesium.ColorMaterialProperty;
const MaterialProperty = Cesium.MaterialProperty;
const Property = Cesium.Property;
var colorScratch = new Color();
var distanceDisplayConditionScratch = new DistanceDisplayCondition();
var defaultDistanceDisplayCondition = new DistanceDisplayCondition();
function Batch(primitives, translucent, appearanceType, depthFailAppearanceType, depthFailMaterialProperty, closed, shadows) {
this.translucent = translucent;
this.appearanceType = appearanceType;
this.depthFailAppearanceType = depthFailAppearanceType;
this.depthFailMaterialProperty = depthFailMaterialProperty;
this.depthFailMaterial = undefined;
this.closed = closed;
this.shadows = shadows;
this.primitives = primitives;
this.createPrimitive = false;
this.waitingOnCreate = false;
this.primitive = undefined;
this.oldPrimitive = undefined;
this.geometry = new AssociativeArray();
this.updaters = new AssociativeArray();
this.updatersWithAttributes = new AssociativeArray();
this.attributes = new AssociativeArray();
this.subscriptions = new AssociativeArray();
this.showsUpdated = new AssociativeArray();
this.itemsToRemove = [];
this.invalidated = false;
var removeMaterialSubscription;
if (defined(depthFailMaterialProperty)) {
removeMaterialSubscription = depthFailMaterialProperty.definitionChanged.addEventListener(Batch.prototype.onMaterialChanged, this);
}
this.removeMaterialSubscription = removeMaterialSubscription;
}
Batch.prototype.onMaterialChanged = function () {
this.invalidated = true;
};
Batch.prototype.isMaterial = function (updater) {
var material = this.depthFailMaterialProperty;
var updaterMaterial = updater.depthFailMaterialProperty;
if (updaterMaterial === material) {
return true;
}
if (defined(material)) {
return material.equals(updaterMaterial);
}
return false;
};
Batch.prototype.add = function (updater, instance) {
var id = updater.id;
this.createPrimitive = true;
this.geometry.set(id, instance);
this.updaters.set(id, updater);
if (!updater.hasConstantFill || !updater.fillMaterialProperty.isConstant || !Property.isConstant(updater.distanceDisplayConditionProperty)) {
this.updatersWithAttributes.set(id, updater);
}
else {
var that = this;
this.subscriptions.set(id, updater.entity.definitionChanged.addEventListener(function (entity, propertyName, newValue, oldValue) {
if (propertyName === 'isShowing') {
that.showsUpdated.set(updater.id, updater);
}
}));
}
};
Batch.prototype.remove = function (updater) {
var id = updater.id;
this.createPrimitive = this.geometry.remove(id) || this.createPrimitive;
if (this.updaters.remove(id)) {
this.updatersWithAttributes.remove(id);
var unsubscribe = this.subscriptions.get(id);
if (defined(unsubscribe)) {
unsubscribe();
this.subscriptions.remove(id);
}
}
};
Batch.prototype.update = function (time) {
var isUpdated = true;
var removedCount = 0;
var primitive = this.primitive;
var primitives = this.primitives;
var attributes;
var i;
if (this.createPrimitive) {
var geometries = this.geometry.values;
var geometriesLength = geometries.length;
if (geometriesLength > 0) {
if (defined(primitive)) {
if (!defined(this.oldPrimitive)) {
this.oldPrimitive = primitive;
}
else {
primitives.remove(primitive);
}
}
for (i = 0; i < geometriesLength; i++) {
var geometryItem = geometries[i];
var originalAttributes = geometryItem.attributes;
attributes = this.attributes.get(geometryItem.id.id);
if (defined(attributes)) {
if (defined(originalAttributes.show)) {
originalAttributes.show.value = attributes.show;
}
if (defined(originalAttributes.color)) {
originalAttributes.color.value = attributes.color;
}
if (defined(originalAttributes.depthFailColor)) {
originalAttributes.depthFailColor.value = attributes.depthFailColor;
}
}
}
var depthFailAppearance;
if (defined(this.depthFailAppearanceType)) {
if (defined(this.depthFailMaterialProperty)) {
this.depthFailMaterial = MaterialProperty.getValue(time, this.depthFailMaterialProperty, this.depthFailMaterial);
}
depthFailAppearance = new this.depthFailAppearanceType({
material: this.depthFailMaterial,
translucent: this.translucent,
closed: this.closed
});
}
primitive = new Primitive({
show: false,
asynchronous: true,
geometryInstances: geometries,
appearance: new this.appearanceType({
flat: this.shadows === ShadowMode.DISABLED || this.shadows === ShadowMode.CAST_ONLY,
translucent: this.translucent,
closed: this.closed
}),
depthFailAppearance: depthFailAppearance,
shadows: this.shadows
});
primitives.add(primitive);
isUpdated = false;
}
else {
if (defined(primitive)) {
primitives.remove(primitive);
primitive = undefined;
}
var oldPrimitive = this.oldPrimitive;
if (defined(oldPrimitive)) {
primitives.remove(oldPrimitive);
this.oldPrimitive = undefined;
}
}
this.attributes.removeAll();
this.primitive = primitive;
this.createPrimitive = false;
this.waitingOnCreate = true;
}
else if (defined(primitive) && primitive.ready) {
primitive.show = true;
if (defined(this.oldPrimitive)) {
primitives.remove(this.oldPrimitive);
this.oldPrimitive = undefined;
}
if (defined(this.depthFailAppearanceType) && !(this.depthFailMaterialProperty instanceof ColorMaterialProperty)) {
this.depthFailMaterial = MaterialProperty.getValue(time, this.depthFailMaterialProperty, this.depthFailMaterial);
this.primitive.depthFailAppearance.material = this.depthFailMaterial;
}
var updatersWithAttributes = this.updatersWithAttributes.values;
var length = updatersWithAttributes.length;
var waitingOnCreate = this.waitingOnCreate;
for (i = 0; i < length; i++) {
var updater = updatersWithAttributes[i];
var instance = this.geometry.get(updater.id);
attributes = this.attributes.get(instance.id.id);
if (!defined(attributes)) {
attributes = primitive.getGeometryInstanceAttributes(instance.id);
this.attributes.set(instance.id.id, attributes);
}
if (!updater.fillMaterialProperty.isConstant || waitingOnCreate) {
var colorProperty = updater.fillMaterialProperty.color;
var resultColor = Property.getValueOrDefault(colorProperty, time, Color.WHITE, colorScratch);
if (!Color.equals(attributes._lastColor, resultColor)) {
attributes._lastColor = Color.clone(resultColor, attributes._lastColor);
attributes.color = ColorGeometryInstanceAttribute.toValue(resultColor, attributes.color);
if ((this.translucent && attributes.color[3] === 255) || (!this.translucent && attributes.color[3] !== 255)) {
this.itemsToRemove[removedCount++] = updater;
}
}
}
if (defined(this.depthFailAppearanceType) && updater.depthFailMaterialProperty instanceof ColorMaterialProperty && (!updater.depthFailMaterialProperty.isConstant || waitingOnCreate)) {
var depthFailColorProperty = updater.depthFailMaterialProperty.color;
var depthColor = Property.getValueOrDefault(depthFailColorProperty, time, Color.WHITE, colorScratch);
if (!Color.equals(attributes._lastDepthFailColor, depthColor)) {
attributes._lastDepthFailColor = Color.clone(depthColor, attributes._lastDepthFailColor);
attributes.depthFailColor = ColorGeometryInstanceAttribute.toValue(depthColor, attributes.depthFailColor);
}
}
var show = updater.entity.isShowing && (updater.hasConstantFill || updater.isFilled(time));
var currentShow = attributes.show[0] === 1;
if (show !== currentShow) {
attributes.show = ShowGeometryInstanceAttribute.toValue(show, attributes.show);
}
var distanceDisplayConditionProperty = updater.distanceDisplayConditionProperty;
if (!Property.isConstant(distanceDisplayConditionProperty)) {
var distanceDisplayCondition = Property.getValueOrDefault(distanceDisplayConditionProperty, time, defaultDistanceDisplayCondition, distanceDisplayConditionScratch);
if (!DistanceDisplayCondition.equals(distanceDisplayCondition, attributes._lastDistanceDisplayCondition)) {
attributes._lastDistanceDisplayCondition = DistanceDisplayCondition.clone(distanceDisplayCondition, attributes._lastDistanceDisplayCondition);
attributes.distanceDisplayCondition = DistanceDisplayConditionGeometryInstanceAttribute.toValue(distanceDisplayCondition, attributes.distanceDisplayCondition);
}
}
}
this.updateShows(primitive);
this.waitingOnCreate = false;
}
else if (defined(primitive) && !primitive.ready) {
isUpdated = false;
}
this.itemsToRemove.length = removedCount;
return isUpdated;
};
Batch.prototype.updateShows = function (primitive) {
var showsUpdated = this.showsUpdated.values;
var length = showsUpdated.length;
for (var i = 0; i < length; i++) {
var updater = showsUpdated[i];
var instance = this.geometry.get(updater.id);
var attributes = this.attributes.get(instance.id.id);
if (!defined(attributes)) {
attributes = primitive.getGeometryInstanceAttributes(instance.id);
this.attributes.set(instance.id.id, attributes);
}
var show = updater.entity.isShowing;
var currentShow = attributes.show[0] === 1;
if (show !== currentShow) {
attributes.show = ShowGeometryInstanceAttribute.toValue(show, attributes.show);
}
}
this.showsUpdated.removeAll();
};
Batch.prototype.contains = function (updater) {
return this.updaters.contains(updater.id);
};
Batch.prototype.getBoundingSphere = function (updater, result) {
var primitive = this.primitive;
if (!primitive.ready) {
return BoundingSphereState.PENDING;
}
var attributes = primitive.getGeometryInstanceAttributes(updater.entity);
if (!defined(attributes) || !defined(attributes.boundingSphere) || //
(defined(attributes.show) && attributes.show[0] === 0)) {
return BoundingSphereState.FAILED;
}
attributes.boundingSphere.clone(result);
return BoundingSphereState.DONE;
};
Batch.prototype.removeAllPrimitives = function () {
var primitives = this.primitives;
var primitive = this.primitive;
if (defined(primitive)) {
primitives.remove(primitive);
this.primitive = undefined;
this.geometry.removeAll();
this.updaters.removeAll();
}
var oldPrimitive = this.oldPrimitive;
if (defined(oldPrimitive)) {
primitives.remove(oldPrimitive);
this.oldPrimitive = undefined;
}
};
Batch.prototype.destroy = function () {
var primitive = this.primitive;
var primitives = this.primitives;
if (defined(primitive)) {
primitives.remove(primitive);
}
var oldPrimitive = this.oldPrimitive;
if (defined(oldPrimitive)) {
primitives.remove(oldPrimitive);
}
if (defined(this.removeMaterialSubscription)) {
this.removeMaterialSubscription();
}
};
let wasFixed = false;
export function fixCesiumEntitiesShadows() {
if (wasFixed) {
return;
}
Cesium.StaticGeometryColorBatch.prototype.add = function (time, updater) {
var items;
var translucent;
var instance = updater.createFillGeometryInstance(time);
if (instance.attributes.color.value[3] === 255) {
items = this._solidItems;
translucent = false;
}
else {
items = this._translucentItems;
translucent = true;
}
var length = items.length;
for (var i = 0; i < length; i++) {
var item = items[i];
if (item.isMaterial(updater)) {
item.add(updater, instance);
return;
}
}
var batch = new Batch(this._primitives, translucent, this._appearanceType, this._depthFailAppearanceType, updater.depthFailMaterialProperty, this._closed, this._shadows);
batch.add(updater, instance);
items.push(batch);
};
wasFixed = true;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGljR2VvbWV0cnlDb2xvckJhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jZXNpdW0vc3JjL2xpYi9hbmd1bGFyLWNlc2l1bS9jZXNpdW0tZW5oYW5jZW1lbnRzL1N0YXRpY0dlb21ldHJ5Q29sb3JCYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxpQkFBaUI7QUFDakIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7QUFDakQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUMzQixNQUFNLDhCQUE4QixHQUFHLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQztBQUM3RSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0FBQy9CLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDO0FBQ2pFLE1BQU0saURBQWlELEdBQUcsTUFBTSxDQUFDLGlEQUFpRCxDQUFDO0FBQ25ILE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxDQUFDLDZCQUE2QixDQUFDO0FBQzNFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDbkMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUNyQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztBQUN2RCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztBQUMzRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztBQUNqRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0FBRWpDLElBQUksWUFBWSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFDL0IsSUFBSSwrQkFBK0IsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7QUFDckUsSUFB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RUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0ssS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQixDQUFDLENBQUM7SUFDRixRQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpeCBmb3IgdGhlIGNvbnN0YW50IGVudGl0eSBzaGFkb3dpbmcuXG4gKiBQUiBpbiBDZXNpdW0gcmVwbzogaHR0cHM6Ly9naXRodWIuY29tL0FuYWx5dGljYWxHcmFwaGljc0luYy9jZXNpdW0vcHVsbC81NzM2XG4gKi9cblxuLy8gdHNsaW50OmRpc2FibGVcbmNvbnN0IEFzc29jaWF0aXZlQXJyYXkgPSBDZXNpdW0uQXNzb2NpYXRpdmVBcnJheTtcbmNvbnN0IENvbG9yID0gQ2VzaXVtLkNvbG9yO1xuY29uc3QgQ29sb3JHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlID0gQ2VzaXVtLkNvbG9yR2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZTtcbmNvbnN0IGRlZmluZWQgPSBDZXNpdW0uZGVmaW5lZDtcbmNvbnN0IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbiA9IENlc2l1bS5EaXN0YW5jZURpc3BsYXlDb25kaXRpb247XG5jb25zdCBEaXN0YW5jZURpc3BsYXlDb25kaXRpb25HZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlID0gQ2VzaXVtLkRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbkdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGU7XG5jb25zdCBTaG93R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZSA9IENlc2l1bS5TaG93R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZTtcbmNvbnN0IFByaW1pdGl2ZSA9IENlc2l1bS5QcmltaXRpdmU7XG5jb25zdCBTaGFkb3dNb2RlID0gQ2VzaXVtLlNoYWRvd01vZGU7XG5jb25zdCBCb3VuZGluZ1NwaGVyZVN0YXRlID0gQ2VzaXVtLkJvdW5kaW5nU3BoZXJlU3RhdGU7XG5jb25zdCBDb2xvck1hdGVyaWFsUHJvcGVydHkgPSBDZXNpdW0uQ29sb3JNYXRlcmlhbFByb3BlcnR5O1xuY29uc3QgTWF0ZXJpYWxQcm9wZXJ0eSA9IENlc2l1bS5NYXRlcmlhbFByb3BlcnR5O1xuY29uc3QgUHJvcGVydHkgPSBDZXNpdW0uUHJvcGVydHk7XG5cbnZhciBjb2xvclNjcmF0Y2ggPSBuZXcgQ29sb3IoKTtcbnZhciBkaXN0YW5jZURpc3BsYXlDb25kaXRpb25TY3JhdGNoID0gbmV3IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbigpO1xudmFyIGRlZmF1bHREaXN0YW5jZURpc3BsYXlDb25kaXRpb24gPSBuZXcgRGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uKCk7XG5cbmZ1bmN0aW9uIEJhdGNoKHByaW1pdGl2ZXMsIHRyYW5zbHVjZW50LCBhcHBlYXJhbmNlVHlwZSwgZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUsIGRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHksIGNsb3NlZCwgc2hhZG93cykge1xuICB0aGlzLnRyYW5zbHVjZW50ID0gdHJhbnNsdWNlbnQ7XG4gIHRoaXMuYXBwZWFyYW5jZVR5cGUgPSBhcHBlYXJhbmNlVHlwZTtcbiAgdGhpcy5kZXB0aEZhaWxBcHBlYXJhbmNlVHlwZSA9IGRlcHRoRmFpbEFwcGVhcmFuY2VUeXBlO1xuICB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHkgPSBkZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5O1xuICB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsID0gdW5kZWZpbmVkO1xuICB0aGlzLmNsb3NlZCA9IGNsb3NlZDtcbiAgdGhpcy5zaGFkb3dzID0gc2hhZG93cztcbiAgdGhpcy5wcmltaXRpdmVzID0gcHJpbWl0aXZlcztcbiAgdGhpcy5jcmVhdGVQcmltaXRpdmUgPSBmYWxzZTtcbiAgdGhpcy53YWl0aW5nT25DcmVhdGUgPSBmYWxzZTtcbiAgdGhpcy5wcmltaXRpdmUgPSB1bmRlZmluZWQ7XG4gIHRoaXMub2xkUHJpbWl0aXZlID0gdW5kZWZpbmVkO1xuICB0aGlzLmdlb21ldHJ5ID0gbmV3IEFzc29jaWF0aXZlQXJyYXkoKTtcbiAgdGhpcy51cGRhdGVycyA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XG4gIHRoaXMudXBkYXRlcnNXaXRoQXR0cmlidXRlcyA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XG4gIHRoaXMuYXR0cmlidXRlcyA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XG4gIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XG4gIHRoaXMuc2hvd3NVcGRhdGVkID0gbmV3IEFzc29jaWF0aXZlQXJyYXkoKTtcbiAgdGhpcy5pdGVtc1RvUmVtb3ZlID0gW107XG4gIHRoaXMuaW52YWxpZGF0ZWQgPSBmYWxzZTtcbiAgXG4gIHZhciByZW1vdmVNYXRlcmlhbFN1YnNjcmlwdGlvbjtcbiAgaWYgKGRlZmluZWQoZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eSkpIHtcbiAgICByZW1vdmVNYXRlcmlhbFN1YnNjcmlwdGlvbiA9IGRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHkuZGVmaW5pdGlvbkNoYW5nZWQuYWRkRXZlbnRMaXN0ZW5lcihCYXRjaC5wcm90b3R5cGUub25NYXRlcmlhbENoYW5nZWQsIHRoaXMpO1xuICB9XG4gIHRoaXMucmVtb3ZlTWF0ZXJpYWxTdWJzY3JpcHRpb24gPSByZW1vdmVNYXRlcmlhbFN1YnNjcmlwdGlvbjtcbn1cblxuQmF0Y2gucHJvdG90eXBlLm9uTWF0ZXJpYWxDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmludmFsaWRhdGVkID0gdHJ1ZTtcbn07XG5cbkJhdGNoLnByb3RvdHlwZS5pc01hdGVyaWFsID0gZnVuY3Rpb24gKHVwZGF0ZXIpIHtcbiAgdmFyIG1hdGVyaWFsID0gdGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5O1xuICB2YXIgdXBkYXRlck1hdGVyaWFsID0gdXBkYXRlci5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5O1xuICBpZiAodXBkYXRlck1hdGVyaWFsID09PSBtYXRlcmlhbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChkZWZpbmVkKG1hdGVyaWFsKSkge1xuICAgIHJldHVybiBtYXRlcmlhbC5lcXVhbHModXBkYXRlck1hdGVyaWFsKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5CYXRjaC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHVwZGF0ZXIsIGluc3RhbmNlKSB7XG4gIHZhciBpZCA9IHVwZGF0ZXIuaWQ7XG4gIHRoaXMuY3JlYXRlUHJpbWl0aXZlID0gdHJ1ZTtcbiAgdGhpcy5nZW9tZXRyeS5zZXQoaWQsIGluc3RhbmNlKTtcbiAgdGhpcy51cGRhdGVycy5zZXQoaWQsIHVwZGF0ZXIpO1xuICBpZiAoIXVwZGF0ZXIuaGFzQ29uc3RhbnRGaWxsIHx8ICF1cGRhdGVyLmZpbGxNYXRlcmlhbFByb3BlcnR5LmlzQ29uc3RhbnQgfHwgIVByb3BlcnR5LmlzQ29uc3RhbnQodXBkYXRlci5kaXN0YW5jZURpc3BsYXlDb25kaXRpb25Qcm9wZXJ0eSkpIHtcbiAgICB0aGlzLnVwZGF0ZXJzV2l0aEF0dHJpYnV0ZXMuc2V0KGlkLCB1cGRhdGVyKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnNldChpZCwgdXBkYXRlci5lbnRpdHkuZGVmaW5pdGlvbkNoYW5nZWQuYWRkRXZlbnRMaXN0ZW5lcihmdW5jdGlvbiAoZW50aXR5LCBwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gJ2lzU2hvd2luZycpIHtcbiAgICAgICAgdGhhdC5zaG93c1VwZGF0ZWQuc2V0KHVwZGF0ZXIuaWQsIHVwZGF0ZXIpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxufTtcblxuQmF0Y2gucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh1cGRhdGVyKSB7XG4gIHZhciBpZCA9IHVwZGF0ZXIuaWQ7XG4gIHRoaXMuY3JlYXRlUHJpbWl0aXZlID0gdGhpcy5nZW9tZXRyeS5yZW1vdmUoaWQpIHx8IHRoaXMuY3JlYXRlUHJpbWl0aXZlO1xuICBpZiAodGhpcy51cGRhdGVycy5yZW1vdmUoaWQpKSB7XG4gICAgdGhpcy51cGRhdGVyc1dpdGhBdHRyaWJ1dGVzLnJlbW92ZShpZCk7XG4gICAgdmFyIHVuc3Vic2NyaWJlID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChpZCk7XG4gICAgaWYgKGRlZmluZWQodW5zdWJzY3JpYmUpKSB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnJlbW92ZShpZCk7XG4gICAgfVxuICB9XG59O1xuXG5CYXRjaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHRpbWUpIHtcbiAgdmFyIGlzVXBkYXRlZCA9IHRydWU7XG4gIHZhciByZW1vdmVkQ291bnQgPSAwO1xuICB2YXIgcHJpbWl0aXZlID0gdGhpcy5wcmltaXRpdmU7XG4gIHZhciBwcmltaXRpdmVzID0gdGhpcy5wcmltaXRpdmVzO1xuICB2YXIgYXR0cmlidXRlcztcbiAgdmFyIGk7XG4gIFxuICBpZiAodGhpcy5jcmVhdGVQcmltaXRpdmUpIHtcbiAgICB2YXIgZ2VvbWV0cmllcyA9IHRoaXMuZ2VvbWV0cnkudmFsdWVzO1xuICAgIHZhciBnZW9tZXRyaWVzTGVuZ3RoID0gZ2VvbWV0cmllcy5sZW5ndGg7XG4gICAgaWYgKGdlb21ldHJpZXNMZW5ndGggPiAwKSB7XG4gICAgICBpZiAoZGVmaW5lZChwcmltaXRpdmUpKSB7XG4gICAgICAgIGlmICghZGVmaW5lZCh0aGlzLm9sZFByaW1pdGl2ZSkpIHtcbiAgICAgICAgICB0aGlzLm9sZFByaW1pdGl2ZSA9IHByaW1pdGl2ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmltaXRpdmVzLnJlbW92ZShwcmltaXRpdmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tZXRyaWVzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGdlb21ldHJ5SXRlbSA9IGdlb21ldHJpZXNbaV07XG4gICAgICAgIHZhciBvcmlnaW5hbEF0dHJpYnV0ZXMgPSBnZW9tZXRyeUl0ZW0uYXR0cmlidXRlcztcbiAgICAgICAgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcy5nZXQoZ2VvbWV0cnlJdGVtLmlkLmlkKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChkZWZpbmVkKGF0dHJpYnV0ZXMpKSB7XG4gICAgICAgICAgaWYgKGRlZmluZWQob3JpZ2luYWxBdHRyaWJ1dGVzLnNob3cpKSB7XG4gICAgICAgICAgICBvcmlnaW5hbEF0dHJpYnV0ZXMuc2hvdy52YWx1ZSA9IGF0dHJpYnV0ZXMuc2hvdztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlZmluZWQob3JpZ2luYWxBdHRyaWJ1dGVzLmNvbG9yKSkge1xuICAgICAgICAgICAgb3JpZ2luYWxBdHRyaWJ1dGVzLmNvbG9yLnZhbHVlID0gYXR0cmlidXRlcy5jb2xvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlZmluZWQob3JpZ2luYWxBdHRyaWJ1dGVzLmRlcHRoRmFpbENvbG9yKSkge1xuICAgICAgICAgICAgb3JpZ2luYWxBdHRyaWJ1dGVzLmRlcHRoRmFpbENvbG9yLnZhbHVlID0gYXR0cmlidXRlcy5kZXB0aEZhaWxDb2xvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIGRlcHRoRmFpbEFwcGVhcmFuY2U7XG4gICAgICBpZiAoZGVmaW5lZCh0aGlzLmRlcHRoRmFpbEFwcGVhcmFuY2VUeXBlKSkge1xuICAgICAgICBpZiAoZGVmaW5lZCh0aGlzLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHkpKSB7XG4gICAgICAgICAgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbCA9IE1hdGVyaWFsUHJvcGVydHkuZ2V0VmFsdWUodGltZSwgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5LCB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsKTtcbiAgICAgICAgfVxuICAgICAgICBkZXB0aEZhaWxBcHBlYXJhbmNlID0gbmV3IHRoaXMuZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUoe1xuICAgICAgICAgIG1hdGVyaWFsOiB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsLFxuICAgICAgICAgIHRyYW5zbHVjZW50OiB0aGlzLnRyYW5zbHVjZW50LFxuICAgICAgICAgIGNsb3NlZDogdGhpcy5jbG9zZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHByaW1pdGl2ZSA9IG5ldyBQcmltaXRpdmUoe1xuICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgYXN5bmNocm9ub3VzOiB0cnVlLFxuICAgICAgICBnZW9tZXRyeUluc3RhbmNlczogZ2VvbWV0cmllcyxcbiAgICAgICAgYXBwZWFyYW5jZTogbmV3IHRoaXMuYXBwZWFyYW5jZVR5cGUoe1xuICAgICAgICAgIGZsYXQ6IHRoaXMuc2hhZG93cyA9PT0gU2hhZG93TW9kZS5ESVNBQkxFRCB8fCB0aGlzLnNoYWRvd3MgPT09IFNoYWRvd01vZGUuQ0FTVF9PTkxZLFxuICAgICAgICAgIHRyYW5zbHVjZW50OiB0aGlzLnRyYW5zbHVjZW50LFxuICAgICAgICAgIGNsb3NlZDogdGhpcy5jbG9zZWRcbiAgICAgICAgfSksXG4gICAgICAgIGRlcHRoRmFpbEFwcGVhcmFuY2U6IGRlcHRoRmFpbEFwcGVhcmFuY2UsXG4gICAgICAgIHNoYWRvd3M6IHRoaXMuc2hhZG93c1xuICAgICAgfSk7XG4gICAgICBwcmltaXRpdmVzLmFkZChwcmltaXRpdmUpO1xuICAgICAgaXNVcGRhdGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWZpbmVkKHByaW1pdGl2ZSkpIHtcbiAgICAgICAgcHJpbWl0aXZlcy5yZW1vdmUocHJpbWl0aXZlKTtcbiAgICAgICAgcHJpbWl0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIG9sZFByaW1pdGl2ZSA9IHRoaXMub2xkUHJpbWl0aXZlO1xuICAgICAgaWYgKGRlZmluZWQob2xkUHJpbWl0aXZlKSkge1xuICAgICAgICBwcmltaXRpdmVzLnJlbW92ZShvbGRQcmltaXRpdmUpO1xuICAgICAgICB0aGlzLm9sZFByaW1pdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5hdHRyaWJ1dGVzLnJlbW92ZUFsbCgpO1xuICAgIHRoaXMucHJpbWl0aXZlID0gcHJpbWl0aXZlO1xuICAgIHRoaXMuY3JlYXRlUHJpbWl0aXZlID0gZmFsc2U7XG4gICAgdGhpcy53YWl0aW5nT25DcmVhdGUgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGRlZmluZWQocHJpbWl0aXZlKSAmJiBwcmltaXRpdmUucmVhZHkpIHtcbiAgICBwcmltaXRpdmUuc2hvdyA9IHRydWU7XG4gICAgaWYgKGRlZmluZWQodGhpcy5vbGRQcmltaXRpdmUpKSB7XG4gICAgICBwcmltaXRpdmVzLnJlbW92ZSh0aGlzLm9sZFByaW1pdGl2ZSk7XG4gICAgICB0aGlzLm9sZFByaW1pdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRlZmluZWQodGhpcy5kZXB0aEZhaWxBcHBlYXJhbmNlVHlwZSkgJiYgISh0aGlzLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHkgaW5zdGFuY2VvZiBDb2xvck1hdGVyaWFsUHJvcGVydHkpKSB7XG4gICAgICB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsID0gTWF0ZXJpYWxQcm9wZXJ0eS5nZXRWYWx1ZSh0aW1lLCB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHksIHRoaXMuZGVwdGhGYWlsTWF0ZXJpYWwpO1xuICAgICAgdGhpcy5wcmltaXRpdmUuZGVwdGhGYWlsQXBwZWFyYW5jZS5tYXRlcmlhbCA9IHRoaXMuZGVwdGhGYWlsTWF0ZXJpYWw7XG4gICAgfVxuICAgIFxuICAgIHZhciB1cGRhdGVyc1dpdGhBdHRyaWJ1dGVzID0gdGhpcy51cGRhdGVyc1dpdGhBdHRyaWJ1dGVzLnZhbHVlcztcbiAgICB2YXIgbGVuZ3RoID0gdXBkYXRlcnNXaXRoQXR0cmlidXRlcy5sZW5ndGg7XG4gICAgdmFyIHdhaXRpbmdPbkNyZWF0ZSA9IHRoaXMud2FpdGluZ09uQ3JlYXRlO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHVwZGF0ZXIgPSB1cGRhdGVyc1dpdGhBdHRyaWJ1dGVzW2ldO1xuICAgICAgdmFyIGluc3RhbmNlID0gdGhpcy5nZW9tZXRyeS5nZXQodXBkYXRlci5pZCk7XG4gICAgICBcbiAgICAgIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXMuZ2V0KGluc3RhbmNlLmlkLmlkKTtcbiAgICAgIGlmICghZGVmaW5lZChhdHRyaWJ1dGVzKSkge1xuICAgICAgICBhdHRyaWJ1dGVzID0gcHJpbWl0aXZlLmdldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVzKGluc3RhbmNlLmlkKTtcbiAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLnNldChpbnN0YW5jZS5pZC5pZCwgYXR0cmlidXRlcyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICghdXBkYXRlci5maWxsTWF0ZXJpYWxQcm9wZXJ0eS5pc0NvbnN0YW50IHx8IHdhaXRpbmdPbkNyZWF0ZSkge1xuICAgICAgICB2YXIgY29sb3JQcm9wZXJ0eSA9IHVwZGF0ZXIuZmlsbE1hdGVyaWFsUHJvcGVydHkuY29sb3I7XG4gICAgICAgIHZhciByZXN1bHRDb2xvciA9IFByb3BlcnR5LmdldFZhbHVlT3JEZWZhdWx0KGNvbG9yUHJvcGVydHksIHRpbWUsIENvbG9yLldISVRFLCBjb2xvclNjcmF0Y2gpO1xuICAgICAgICBpZiAoIUNvbG9yLmVxdWFscyhhdHRyaWJ1dGVzLl9sYXN0Q29sb3IsIHJlc3VsdENvbG9yKSkge1xuICAgICAgICAgIGF0dHJpYnV0ZXMuX2xhc3RDb2xvciA9IENvbG9yLmNsb25lKHJlc3VsdENvbG9yLCBhdHRyaWJ1dGVzLl9sYXN0Q29sb3IpO1xuICAgICAgICAgIGF0dHJpYnV0ZXMuY29sb3IgPSBDb2xvckdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUudG9WYWx1ZShyZXN1bHRDb2xvciwgYXR0cmlidXRlcy5jb2xvcik7XG4gICAgICAgICAgaWYgKCh0aGlzLnRyYW5zbHVjZW50ICYmIGF0dHJpYnV0ZXMuY29sb3JbM10gPT09IDI1NSkgfHwgKCF0aGlzLnRyYW5zbHVjZW50ICYmIGF0dHJpYnV0ZXMuY29sb3JbM10gIT09IDI1NSkpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNUb1JlbW92ZVtyZW1vdmVkQ291bnQrK10gPSB1cGRhdGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZGVmaW5lZCh0aGlzLmRlcHRoRmFpbEFwcGVhcmFuY2VUeXBlKSAmJiB1cGRhdGVyLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHkgaW5zdGFuY2VvZiBDb2xvck1hdGVyaWFsUHJvcGVydHkgJiYgKCF1cGRhdGVyLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHkuaXNDb25zdGFudCB8fCB3YWl0aW5nT25DcmVhdGUpKSB7XG4gICAgICAgIHZhciBkZXB0aEZhaWxDb2xvclByb3BlcnR5ID0gdXBkYXRlci5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5LmNvbG9yO1xuICAgICAgICB2YXIgZGVwdGhDb2xvciA9IFByb3BlcnR5LmdldFZhbHVlT3JEZWZhdWx0KGRlcHRoRmFpbENvbG9yUHJvcGVydHksIHRpbWUsIENvbG9yLldISVRFLCBjb2xvclNjcmF0Y2gpO1xuICAgICAgICBpZiAoIUNvbG9yLmVxdWFscyhhdHRyaWJ1dGVzLl9sYXN0RGVwdGhGYWlsQ29sb3IsIGRlcHRoQ29sb3IpKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5fbGFzdERlcHRoRmFpbENvbG9yID0gQ29sb3IuY2xvbmUoZGVwdGhDb2xvciwgYXR0cmlidXRlcy5fbGFzdERlcHRoRmFpbENvbG9yKTtcbiAgICAgICAgICBhdHRyaWJ1dGVzLmRlcHRoRmFpbENvbG9yID0gQ29sb3JHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUoZGVwdGhDb2xvciwgYXR0cmlidXRlcy5kZXB0aEZhaWxDb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIHNob3cgPSB1cGRhdGVyLmVudGl0eS5pc1Nob3dpbmcgJiYgKHVwZGF0ZXIuaGFzQ29uc3RhbnRGaWxsIHx8IHVwZGF0ZXIuaXNGaWxsZWQodGltZSkpO1xuICAgICAgdmFyIGN1cnJlbnRTaG93ID0gYXR0cmlidXRlcy5zaG93WzBdID09PSAxO1xuICAgICAgaWYgKHNob3cgIT09IGN1cnJlbnRTaG93KSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuc2hvdyA9IFNob3dHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUoc2hvdywgYXR0cmlidXRlcy5zaG93KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvblByb3BlcnR5ID0gdXBkYXRlci5kaXN0YW5jZURpc3BsYXlDb25kaXRpb25Qcm9wZXJ0eTtcbiAgICAgIGlmICghUHJvcGVydHkuaXNDb25zdGFudChkaXN0YW5jZURpc3BsYXlDb25kaXRpb25Qcm9wZXJ0eSkpIHtcbiAgICAgICAgdmFyIGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbiA9IFByb3BlcnR5LmdldFZhbHVlT3JEZWZhdWx0KGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvblByb3BlcnR5LCB0aW1lLCBkZWZhdWx0RGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uLCBkaXN0YW5jZURpc3BsYXlDb25kaXRpb25TY3JhdGNoKTtcbiAgICAgICAgaWYgKCFEaXN0YW5jZURpc3BsYXlDb25kaXRpb24uZXF1YWxzKGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbiwgYXR0cmlidXRlcy5fbGFzdERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbikpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzLl9sYXN0RGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uID0gRGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uLmNsb25lKGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbiwgYXR0cmlidXRlcy5fbGFzdERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbik7XG4gICAgICAgICAgYXR0cmlidXRlcy5kaXN0YW5jZURpc3BsYXlDb25kaXRpb24gPSBEaXN0YW5jZURpc3BsYXlDb25kaXRpb25HZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUoZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uLCBhdHRyaWJ1dGVzLmRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy51cGRhdGVTaG93cyhwcmltaXRpdmUpO1xuICAgIHRoaXMud2FpdGluZ09uQ3JlYXRlID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAoZGVmaW5lZChwcmltaXRpdmUpICYmICFwcmltaXRpdmUucmVhZHkpIHtcbiAgICBpc1VwZGF0ZWQgPSBmYWxzZTtcbiAgfVxuICB0aGlzLml0ZW1zVG9SZW1vdmUubGVuZ3RoID0gcmVtb3ZlZENvdW50O1xuICByZXR1cm4gaXNVcGRhdGVkO1xufTtcblxuQmF0Y2gucHJvdG90eXBlLnVwZGF0ZVNob3dzID0gZnVuY3Rpb24gKHByaW1pdGl2ZSkge1xuICB2YXIgc2hvd3NVcGRhdGVkID0gdGhpcy5zaG93c1VwZGF0ZWQudmFsdWVzO1xuICB2YXIgbGVuZ3RoID0gc2hvd3NVcGRhdGVkLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIHZhciB1cGRhdGVyID0gc2hvd3NVcGRhdGVkW2ldO1xuICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZ2VvbWV0cnkuZ2V0KHVwZGF0ZXIuaWQpO1xuICAgIFxuICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLmdldChpbnN0YW5jZS5pZC5pZCk7XG4gICAgaWYgKCFkZWZpbmVkKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBhdHRyaWJ1dGVzID0gcHJpbWl0aXZlLmdldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVzKGluc3RhbmNlLmlkKTtcbiAgICAgIHRoaXMuYXR0cmlidXRlcy5zZXQoaW5zdGFuY2UuaWQuaWQsIGF0dHJpYnV0ZXMpO1xuICAgIH1cbiAgICBcbiAgICB2YXIgc2hvdyA9IHVwZGF0ZXIuZW50aXR5LmlzU2hvd2luZztcbiAgICB2YXIgY3VycmVudFNob3cgPSBhdHRyaWJ1dGVzLnNob3dbMF0gPT09IDE7XG4gICAgaWYgKHNob3cgIT09IGN1cnJlbnRTaG93KSB7XG4gICAgICBhdHRyaWJ1dGVzLnNob3cgPSBTaG93R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZS50b1ZhbHVlKHNob3csIGF0dHJpYnV0ZXMuc2hvdyk7XG4gICAgfVxuICB9XG4gIHRoaXMuc2hvd3NVcGRhdGVkLnJlbW92ZUFsbCgpO1xufTtcblxuQmF0Y2gucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKHVwZGF0ZXIpIHtcbiAgcmV0dXJuIHRoaXMudXBkYXRlcnMuY29udGFpbnModXBkYXRlci5pZCk7XG59O1xuXG5CYXRjaC5wcm90b3R5cGUuZ2V0Qm91bmRpbmdTcGhlcmUgPSBmdW5jdGlvbiAodXBkYXRlciwgcmVzdWx0KSB7XG4gIHZhciBwcmltaXRpdmUgPSB0aGlzLnByaW1pdGl2ZTtcbiAgaWYgKCFwcmltaXRpdmUucmVhZHkpIHtcbiAgICByZXR1cm4gQm91bmRpbmdTcGhlcmVTdGF0ZS5QRU5ESU5HO1xuICB9XG4gIHZhciBhdHRyaWJ1dGVzID0gcHJpbWl0aXZlLmdldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVzKHVwZGF0ZXIuZW50aXR5KTtcbiAgaWYgKCFkZWZpbmVkKGF0dHJpYnV0ZXMpIHx8ICFkZWZpbmVkKGF0dHJpYnV0ZXMuYm91bmRpbmdTcGhlcmUpIHx8Ly9cbiAgICAoZGVmaW5lZChhdHRyaWJ1dGVzLnNob3cpICYmIGF0dHJpYnV0ZXMuc2hvd1swXSA9PT0gMCkpIHtcbiAgICByZXR1cm4gQm91bmRpbmdTcGhlcmVTdGF0ZS5GQUlMRUQ7XG4gIH1cbiAgYXR0cmlidXRlcy5ib3VuZGluZ1NwaGVyZS5jbG9uZShyZXN1bHQpO1xuICByZXR1cm4gQm91bmRpbmdTcGhlcmVTdGF0ZS5ET05FO1xufTtcblxuQmF0Y2gucHJvdG90eXBlLnJlbW92ZUFsbFByaW1pdGl2ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBwcmltaXRpdmVzID0gdGhpcy5wcmltaXRpdmVzO1xuICBcbiAgdmFyIHByaW1pdGl2ZSA9IHRoaXMucHJpbWl0aXZlO1xuICBpZiAoZGVmaW5lZChwcmltaXRpdmUpKSB7XG4gICAgcHJpbWl0aXZlcy5yZW1vdmUocHJpbWl0aXZlKTtcbiAgICB0aGlzLnByaW1pdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmdlb21ldHJ5LnJlbW92ZUFsbCgpO1xuICAgIHRoaXMudXBkYXRlcnMucmVtb3ZlQWxsKCk7XG4gIH1cbiAgXG4gIHZhciBvbGRQcmltaXRpdmUgPSB0aGlzLm9sZFByaW1pdGl2ZTtcbiAgaWYgKGRlZmluZWQob2xkUHJpbWl0aXZlKSkge1xuICAgIHByaW1pdGl2ZXMucmVtb3ZlKG9sZFByaW1pdGl2ZSk7XG4gICAgdGhpcy5vbGRQcmltaXRpdmUgPSB1bmRlZmluZWQ7XG4gIH1cbn07XG5cbkJhdGNoLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgcHJpbWl0aXZlID0gdGhpcy5wcmltaXRpdmU7XG4gIHZhciBwcmltaXRpdmVzID0gdGhpcy5wcmltaXRpdmVzO1xuICBpZiAoZGVmaW5lZChwcmltaXRpdmUpKSB7XG4gICAgcHJpbWl0aXZlcy5yZW1vdmUocHJpbWl0aXZlKTtcbiAgfVxuICB2YXIgb2xkUHJpbWl0aXZlID0gdGhpcy5vbGRQcmltaXRpdmU7XG4gIGlmIChkZWZpbmVkKG9sZFByaW1pdGl2ZSkpIHtcbiAgICBwcmltaXRpdmVzLnJlbW92ZShvbGRQcmltaXRpdmUpO1xuICB9XG4gIGlmIChkZWZpbmVkKHRoaXMucmVtb3ZlTWF0ZXJpYWxTdWJzY3JpcHRpb24pKSB7XG4gICAgdGhpcy5yZW1vdmVNYXRlcmlhbFN1YnNjcmlwdGlvbigpO1xuICB9XG59O1xuXG5cbmxldCB3YXNGaXhlZCA9IGZhbHNlO1xuXG5leHBvcnQgZnVuY3Rpb24gZml4Q2VzaXVtRW50aXRpZXNTaGFkb3dzKCkge1xuICBpZiAod2FzRml4ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgQ2VzaXVtLlN0YXRpY0dlb21ldHJ5Q29sb3JCYXRjaC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHRpbWU6IGFueSwgdXBkYXRlcjogYW55KSB7XG4gICAgdmFyIGl0ZW1zO1xuICAgIHZhciB0cmFuc2x1Y2VudDtcbiAgICB2YXIgaW5zdGFuY2UgPSB1cGRhdGVyLmNyZWF0ZUZpbGxHZW9tZXRyeUluc3RhbmNlKHRpbWUpO1xuICAgIGlmIChpbnN0YW5jZS5hdHRyaWJ1dGVzLmNvbG9yLnZhbHVlWzNdID09PSAyNTUpIHtcbiAgICAgIGl0ZW1zID0gdGhpcy5fc29saWRJdGVtcztcbiAgICAgIHRyYW5zbHV