UNPKG

angular-cesium

Version:
327 lines 51.4 kB
/** * 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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QUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9CLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixPQUFPO2FBQ1I7U0FFRjtRQUVELElBQUksS0FBSyxHQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvSyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BCLENBQUMsQ0FBQztJQUNGLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBGaXggZm9yIHRoZSBjb25zdGFudCBlbnRpdHkgc2hhZG93aW5nLlxyXG4gKiBQUiBpbiBDZXNpdW0gcmVwbzogaHR0cHM6Ly9naXRodWIuY29tL0FuYWx5dGljYWxHcmFwaGljc0luYy9jZXNpdW0vcHVsbC81NzM2XHJcbiAqL1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGVcclxuY29uc3QgQXNzb2NpYXRpdmVBcnJheSA9IENlc2l1bS5Bc3NvY2lhdGl2ZUFycmF5O1xyXG5jb25zdCBDb2xvciA9IENlc2l1bS5Db2xvcjtcclxuY29uc3QgQ29sb3JHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlID0gQ2VzaXVtLkNvbG9yR2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZTtcclxuY29uc3QgZGVmaW5lZCA9IENlc2l1bS5kZWZpbmVkO1xyXG5jb25zdCBEaXN0YW5jZURpc3BsYXlDb25kaXRpb24gPSBDZXNpdW0uRGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uO1xyXG5jb25zdCBEaXN0YW5jZURpc3BsYXlDb25kaXRpb25HZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlID0gQ2VzaXVtLkRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbkdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGU7XHJcbmNvbnN0IFNob3dHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlID0gQ2VzaXVtLlNob3dHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlO1xyXG5jb25zdCBQcmltaXRpdmUgPSBDZXNpdW0uUHJpbWl0aXZlO1xyXG5jb25zdCBTaGFkb3dNb2RlID0gQ2VzaXVtLlNoYWRvd01vZGU7XHJcbmNvbnN0IEJvdW5kaW5nU3BoZXJlU3RhdGUgPSBDZXNpdW0uQm91bmRpbmdTcGhlcmVTdGF0ZTtcclxuY29uc3QgQ29sb3JNYXRlcmlhbFByb3BlcnR5ID0gQ2VzaXVtLkNvbG9yTWF0ZXJpYWxQcm9wZXJ0eTtcclxuY29uc3QgTWF0ZXJpYWxQcm9wZXJ0eSA9IENlc2l1bS5NYXRlcmlhbFByb3BlcnR5O1xyXG5jb25zdCBQcm9wZXJ0eSA9IENlc2l1bS5Qcm9wZXJ0eTtcclxuXHJcbnZhciBjb2xvclNjcmF0Y2ggPSBuZXcgQ29sb3IoKTtcclxudmFyIGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvblNjcmF0Y2ggPSBuZXcgRGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uKCk7XHJcbnZhciBkZWZhdWx0RGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uID0gbmV3IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbigpO1xyXG5cclxuZnVuY3Rpb24gQmF0Y2gocHJpbWl0aXZlcywgdHJhbnNsdWNlbnQsIGFwcGVhcmFuY2VUeXBlLCBkZXB0aEZhaWxBcHBlYXJhbmNlVHlwZSwgZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eSwgY2xvc2VkLCBzaGFkb3dzKSB7XHJcbiAgdGhpcy50cmFuc2x1Y2VudCA9IHRyYW5zbHVjZW50O1xyXG4gIHRoaXMuYXBwZWFyYW5jZVR5cGUgPSBhcHBlYXJhbmNlVHlwZTtcclxuICB0aGlzLmRlcHRoRmFpbEFwcGVhcmFuY2VUeXBlID0gZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGU7XHJcbiAgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5ID0gZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eTtcclxuICB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsID0gdW5kZWZpbmVkO1xyXG4gIHRoaXMuY2xvc2VkID0gY2xvc2VkO1xyXG4gIHRoaXMuc2hhZG93cyA9IHNoYWRvd3M7XHJcbiAgdGhpcy5wcmltaXRpdmVzID0gcHJpbWl0aXZlcztcclxuICB0aGlzLmNyZWF0ZVByaW1pdGl2ZSA9IGZhbHNlO1xyXG4gIHRoaXMud2FpdGluZ09uQ3JlYXRlID0gZmFsc2U7XHJcbiAgdGhpcy5wcmltaXRpdmUgPSB1bmRlZmluZWQ7XHJcbiAgdGhpcy5vbGRQcmltaXRpdmUgPSB1bmRlZmluZWQ7XHJcbiAgdGhpcy5nZW9tZXRyeSA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XHJcbiAgdGhpcy51cGRhdGVycyA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XHJcbiAgdGhpcy51cGRhdGVyc1dpdGhBdHRyaWJ1dGVzID0gbmV3IEFzc29jaWF0aXZlQXJyYXkoKTtcclxuICB0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgQXNzb2NpYXRpdmVBcnJheSgpO1xyXG4gIHRoaXMuc3Vic2NyaXB0aW9ucyA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XHJcbiAgdGhpcy5zaG93c1VwZGF0ZWQgPSBuZXcgQXNzb2NpYXRpdmVBcnJheSgpO1xyXG4gIHRoaXMuaXRlbXNUb1JlbW92ZSA9IFtdO1xyXG4gIHRoaXMuaW52YWxpZGF0ZWQgPSBmYWxzZTtcclxuICBcclxuICB2YXIgcmVtb3ZlTWF0ZXJpYWxTdWJzY3JpcHRpb247XHJcbiAgaWYgKGRlZmluZWQoZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eSkpIHtcclxuICAgIHJlbW92ZU1hdGVyaWFsU3Vic2NyaXB0aW9uID0gZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eS5kZWZpbml0aW9uQ2hhbmdlZC5hZGRFdmVudExpc3RlbmVyKEJhdGNoLnByb3RvdHlwZS5vbk1hdGVyaWFsQ2hhbmdlZCwgdGhpcyk7XHJcbiAgfVxyXG4gIHRoaXMucmVtb3ZlTWF0ZXJpYWxTdWJzY3JpcHRpb24gPSByZW1vdmVNYXRlcmlhbFN1YnNjcmlwdGlvbjtcclxufVxyXG5cclxuQmF0Y2gucHJvdG90eXBlLm9uTWF0ZXJpYWxDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xyXG4gIHRoaXMuaW52YWxpZGF0ZWQgPSB0cnVlO1xyXG59O1xyXG5cclxuQmF0Y2gucHJvdG90eXBlLmlzTWF0ZXJpYWwgPSBmdW5jdGlvbiAodXBkYXRlcikge1xyXG4gIHZhciBtYXRlcmlhbCA9IHRoaXMuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eTtcclxuICB2YXIgdXBkYXRlck1hdGVyaWFsID0gdXBkYXRlci5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5O1xyXG4gIGlmICh1cGRhdGVyTWF0ZXJpYWwgPT09IG1hdGVyaWFsKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgaWYgKGRlZmluZWQobWF0ZXJpYWwpKSB7XHJcbiAgICByZXR1cm4gbWF0ZXJpYWwuZXF1YWxzKHVwZGF0ZXJNYXRlcmlhbCk7XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufTtcclxuXHJcbkJhdGNoLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodXBkYXRlciwgaW5zdGFuY2UpIHtcclxuICB2YXIgaWQgPSB1cGRhdGVyLmlkO1xyXG4gIHRoaXMuY3JlYXRlUHJpbWl0aXZlID0gdHJ1ZTtcclxuICB0aGlzLmdlb21ldHJ5LnNldChpZCwgaW5zdGFuY2UpO1xyXG4gIHRoaXMudXBkYXRlcnMuc2V0KGlkLCB1cGRhdGVyKTtcclxuICBpZiAoIXVwZGF0ZXIuaGFzQ29uc3RhbnRGaWxsIHx8ICF1cGRhdGVyLmZpbGxNYXRlcmlhbFByb3BlcnR5LmlzQ29uc3RhbnQgfHwgIVByb3BlcnR5LmlzQ29uc3RhbnQodXBkYXRlci5kaXN0YW5jZURpc3BsYXlDb25kaXRpb25Qcm9wZXJ0eSkpIHtcclxuICAgIHRoaXMudXBkYXRlcnNXaXRoQXR0cmlidXRlcy5zZXQoaWQsIHVwZGF0ZXIpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXM7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGlkLCB1cGRhdGVyLmVudGl0eS5kZWZpbml0aW9uQ2hhbmdlZC5hZGRFdmVudExpc3RlbmVyKGZ1bmN0aW9uIChlbnRpdHksIHByb3BlcnR5TmFtZSwgbmV3VmFsdWUsIG9sZFZhbHVlKSB7XHJcbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT09ICdpc1Nob3dpbmcnKSB7XHJcbiAgICAgICAgdGhhdC5zaG93c1VwZGF0ZWQuc2V0KHVwZGF0ZXIuaWQsIHVwZGF0ZXIpO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG59O1xyXG5cclxuQmF0Y2gucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh1cGRhdGVyKSB7XHJcbiAgdmFyIGlkID0gdXBkYXRlci5pZDtcclxuICB0aGlzLmNyZWF0ZVByaW1pdGl2ZSA9IHRoaXMuZ2VvbWV0cnkucmVtb3ZlKGlkKSB8fCB0aGlzLmNyZWF0ZVByaW1pdGl2ZTtcclxuICBpZiAodGhpcy51cGRhdGVycy5yZW1vdmUoaWQpKSB7XHJcbiAgICB0aGlzLnVwZGF0ZXJzV2l0aEF0dHJpYnV0ZXMucmVtb3ZlKGlkKTtcclxuICAgIHZhciB1bnN1YnNjcmliZSA9IHRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoaWQpO1xyXG4gICAgaWYgKGRlZmluZWQodW5zdWJzY3JpYmUpKSB7XHJcbiAgICAgIHVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5yZW1vdmUoaWQpO1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbkJhdGNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAodGltZSkge1xyXG4gIHZhciBpc1VwZGF0ZWQgPSB0cnVlO1xyXG4gIHZhciByZW1vdmVkQ291bnQgPSAwO1xyXG4gIHZhciBwcmltaXRpdmUgPSB0aGlzLnByaW1pdGl2ZTtcclxuICB2YXIgcHJpbWl0aXZlcyA9IHRoaXMucHJpbWl0aXZlcztcclxuICB2YXIgYXR0cmlidXRlcztcclxuICB2YXIgaTtcclxuICBcclxuICBpZiAodGhpcy5jcmVhdGVQcmltaXRpdmUpIHtcclxuICAgIHZhciBnZW9tZXRyaWVzID0gdGhpcy5nZW9tZXRyeS52YWx1ZXM7XHJcbiAgICB2YXIgZ2VvbWV0cmllc0xlbmd0aCA9IGdlb21ldHJpZXMubGVuZ3RoO1xyXG4gICAgaWYgKGdlb21ldHJpZXNMZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmIChkZWZpbmVkKHByaW1pdGl2ZSkpIHtcclxuICAgICAgICBpZiAoIWRlZmluZWQodGhpcy5vbGRQcmltaXRpdmUpKSB7XHJcbiAgICAgICAgICB0aGlzLm9sZFByaW1pdGl2ZSA9IHByaW1pdGl2ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcHJpbWl0aXZlcy5yZW1vdmUocHJpbWl0aXZlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tZXRyaWVzTGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgZ2VvbWV0cnlJdGVtID0gZ2VvbWV0cmllc1tpXTtcclxuICAgICAgICB2YXIgb3JpZ2luYWxBdHRyaWJ1dGVzID0gZ2VvbWV0cnlJdGVtLmF0dHJpYnV0ZXM7XHJcbiAgICAgICAgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcy5nZXQoZ2VvbWV0cnlJdGVtLmlkLmlkKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoZGVmaW5lZChhdHRyaWJ1dGVzKSkge1xyXG4gICAgICAgICAgaWYgKGRlZmluZWQob3JpZ2luYWxBdHRyaWJ1dGVzLnNob3cpKSB7XHJcbiAgICAgICAgICAgIG9yaWdpbmFsQXR0cmlidXRlcy5zaG93LnZhbHVlID0gYXR0cmlidXRlcy5zaG93O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGRlZmluZWQob3JpZ2luYWxBdHRyaWJ1dGVzLmNvbG9yKSkge1xyXG4gICAgICAgICAgICBvcmlnaW5hbEF0dHJpYnV0ZXMuY29sb3IudmFsdWUgPSBhdHRyaWJ1dGVzLmNvbG9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGRlZmluZWQob3JpZ2luYWxBdHRyaWJ1dGVzLmRlcHRoRmFpbENvbG9yKSkge1xyXG4gICAgICAgICAgICBvcmlnaW5hbEF0dHJpYnV0ZXMuZGVwdGhGYWlsQ29sb3IudmFsdWUgPSBhdHRyaWJ1dGVzLmRlcHRoRmFpbENvbG9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdmFyIGRlcHRoRmFpbEFwcGVhcmFuY2U7XHJcbiAgICAgIGlmIChkZWZpbmVkKHRoaXMuZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUpKSB7XHJcbiAgICAgICAgaWYgKGRlZmluZWQodGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5KSkge1xyXG4gICAgICAgICAgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbCA9IE1hdGVyaWFsUHJvcGVydHkuZ2V0VmFsdWUodGltZSwgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5LCB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVwdGhGYWlsQXBwZWFyYW5jZSA9IG5ldyB0aGlzLmRlcHRoRmFpbEFwcGVhcmFuY2VUeXBlKHtcclxuICAgICAgICAgIG1hdGVyaWFsOiB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsLFxyXG4gICAgICAgICAgdHJhbnNsdWNlbnQ6IHRoaXMudHJhbnNsdWNlbnQsXHJcbiAgICAgICAgICBjbG9zZWQ6IHRoaXMuY2xvc2VkXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHByaW1pdGl2ZSA9IG5ldyBQcmltaXRpdmUoe1xyXG4gICAgICAgIHNob3c6IGZhbHNlLFxyXG4gICAgICAgIGFzeW5jaHJvbm91czogdHJ1ZSxcclxuICAgICAgICBnZW9tZXRyeUluc3RhbmNlczogZ2VvbWV0cmllcyxcclxuICAgICAgICBhcHBlYXJhbmNlOiBuZXcgdGhpcy5hcHBlYXJhbmNlVHlwZSh7XHJcbiAgICAgICAgICBmbGF0OiB0aGlzLnNoYWRvd3MgPT09IFNoYWRvd01vZGUuRElTQUJMRUQgfHwgdGhpcy5zaGFkb3dzID09PSBTaGFkb3dNb2RlLkNBU1RfT05MWSxcclxuICAgICAgICAgIHRyYW5zbHVjZW50OiB0aGlzLnRyYW5zbHVjZW50LFxyXG4gICAgICAgICAgY2xvc2VkOiB0aGlzLmNsb3NlZFxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGRlcHRoRmFpbEFwcGVhcmFuY2U6IGRlcHRoRmFpbEFwcGVhcmFuY2UsXHJcbiAgICAgICAgc2hhZG93czogdGhpcy5zaGFkb3dzXHJcbiAgICAgIH0pO1xyXG4gICAgICBwcmltaXRpdmVzLmFkZChwcmltaXRpdmUpO1xyXG4gICAgICBpc1VwZGF0ZWQgPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChkZWZpbmVkKHByaW1pdGl2ZSkpIHtcclxuICAgICAgICBwcmltaXRpdmVzLnJlbW92ZShwcmltaXRpdmUpO1xyXG4gICAgICAgIHByaW1pdGl2ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgICB2YXIgb2xkUHJpbWl0aXZlID0gdGhpcy5vbGRQcmltaXRpdmU7XHJcbiAgICAgIGlmIChkZWZpbmVkKG9sZFByaW1pdGl2ZSkpIHtcclxuICAgICAgICBwcmltaXRpdmVzLnJlbW92ZShvbGRQcmltaXRpdmUpO1xyXG4gICAgICAgIHRoaXMub2xkUHJpbWl0aXZlID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuYXR0cmlidXRlcy5yZW1vdmVBbGwoKTtcclxuICAgIHRoaXMucHJpbWl0aXZlID0gcHJpbWl0aXZlO1xyXG4gICAgdGhpcy5jcmVhdGVQcmltaXRpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMud2FpdGluZ09uQ3JlYXRlID0gdHJ1ZTtcclxuICB9IGVsc2UgaWYgKGRlZmluZWQocHJpbWl0aXZlKSAmJiBwcmltaXRpdmUucmVhZHkpIHtcclxuICAgIHByaW1pdGl2ZS5zaG93ID0gdHJ1ZTtcclxuICAgIGlmIChkZWZpbmVkKHRoaXMub2xkUHJpbWl0aXZlKSkge1xyXG4gICAgICBwcmltaXRpdmVzLnJlbW92ZSh0aGlzLm9sZFByaW1pdGl2ZSk7XHJcbiAgICAgIHRoaXMub2xkUHJpbWl0aXZlID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoZGVmaW5lZCh0aGlzLmRlcHRoRmFpbEFwcGVhcmFuY2VUeXBlKSAmJiAhKHRoaXMuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eSBpbnN0YW5jZW9mIENvbG9yTWF0ZXJpYWxQcm9wZXJ0eSkpIHtcclxuICAgICAgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbCA9IE1hdGVyaWFsUHJvcGVydHkuZ2V0VmFsdWUodGltZSwgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5LCB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsKTtcclxuICAgICAgdGhpcy5wcmltaXRpdmUuZGVwdGhGYWlsQXBwZWFyYW5jZS5tYXRlcmlhbCA9IHRoaXMuZGVwdGhGYWlsTWF0ZXJpYWw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHZhciB1cGRhdGVyc1dpdGhBdHRyaWJ1dGVzID0gdGhpcy51cGRhdGVyc1dpdGhBdHRyaWJ1dGVzLnZhbHVlcztcclxuICAgIHZhciBsZW5ndGggPSB1cGRhdGVyc1dpdGhBdHRyaWJ1dGVzLmxlbmd0aDtcclxuICAgIHZhciB3YWl0aW5nT25DcmVhdGUgPSB0aGlzLndhaXRpbmdPbkNyZWF0ZTtcclxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgdXBkYXRlciA9IHVwZGF0ZXJzV2l0aEF0dHJpYnV0ZXNbaV07XHJcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZ2VvbWV0cnkuZ2V0KHVwZGF0ZXIuaWQpO1xyXG4gICAgICBcclxuICAgICAgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcy5nZXQoaW5zdGFuY2UuaWQuaWQpO1xyXG4gICAgICBpZiAoIWRlZmluZWQoYXR0cmlidXRlcykpIHtcclxuICAgICAgICBhdHRyaWJ1dGVzID0gcHJpbWl0aXZlLmdldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVzKGluc3RhbmNlLmlkKTtcclxuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMuc2V0KGluc3RhbmNlLmlkLmlkLCBhdHRyaWJ1dGVzKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgaWYgKCF1cGRhdGVyLmZpbGxNYXRlcmlhbFByb3BlcnR5LmlzQ29uc3RhbnQgfHwgd2FpdGluZ09uQ3JlYXRlKSB7XHJcbiAgICAgICAgdmFyIGNvbG9yUHJvcGVydHkgPSB1cGRhdGVyLmZpbGxNYXRlcmlhbFByb3BlcnR5LmNvbG9yO1xyXG4gICAgICAgIHZhciByZXN1bHRDb2xvciA9IFByb3BlcnR5LmdldFZhbHVlT3JEZWZhdWx0KGNvbG9yUHJvcGVydHksIHRpbWUsIENvbG9yLldISVRFLCBjb2xvclNjcmF0Y2gpO1xyXG4gICAgICAgIGlmICghQ29sb3IuZXF1YWxzKGF0dHJpYnV0ZXMuX2xhc3RDb2xvciwgcmVzdWx0Q29sb3IpKSB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVzLl9sYXN0Q29sb3IgPSBDb2xvci5jbG9uZShyZXN1bHRDb2xvciwgYXR0cmlidXRlcy5fbGFzdENvbG9yKTtcclxuICAgICAgICAgIGF0dHJpYnV0ZXMuY29sb3IgPSBDb2xvckdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUudG9WYWx1ZShyZXN1bHRDb2xvciwgYXR0cmlidXRlcy5jb2xvcik7XHJcbiAgICAgICAgICBpZiAoKHRoaXMudHJhbnNsdWNlbnQgJiYgYXR0cmlidXRlcy5jb2xvclszXSA9PT0gMjU1KSB8fCAoIXRoaXMudHJhbnNsdWNlbnQgJiYgYXR0cmlidXRlcy5jb2xvclszXSAhPT0gMjU1KSkge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zVG9SZW1vdmVbcmVtb3ZlZENvdW50KytdID0gdXBkYXRlcjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmIChkZWZpbmVkKHRoaXMuZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUpICYmIHVwZGF0ZXIuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eSBpbnN0YW5jZW9mIENvbG9yTWF0ZXJpYWxQcm9wZXJ0eSAmJiAoIXVwZGF0ZXIuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eS5pc0NvbnN0YW50IHx8IHdhaXRpbmdPbkNyZWF0ZSkpIHtcclxuICAgICAgICB2YXIgZGVwdGhGYWlsQ29sb3JQcm9wZXJ0eSA9IHVwZGF0ZXIuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eS5jb2xvcjtcclxuICAgICAgICB2YXIgZGVwdGhDb2xvciA9IFByb3BlcnR5LmdldFZhbHVlT3JEZWZhdWx0KGRlcHRoRmFpbENvbG9yUHJvcGVydHksIHRpbWUsIENvbG9yLldISVRFLCBjb2xvclNjcmF0Y2gpO1xyXG4gICAgICAgIGlmICghQ29sb3IuZXF1YWxzKGF0dHJpYnV0ZXMuX2xhc3REZXB0aEZhaWxDb2xvciwgZGVwdGhDb2xvcikpIHtcclxuICAgICAgICAgIGF0dHJpYnV0ZXMuX2xhc3REZXB0aEZhaWxDb2xvciA9IENvbG9yLmNsb25lKGRlcHRoQ29sb3IsIGF0dHJpYnV0ZXMuX2xhc3REZXB0aEZhaWxDb2xvcik7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVzLmRlcHRoRmFpbENvbG9yID0gQ29sb3JHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUoZGVwdGhDb2xvciwgYXR0cmlidXRlcy5kZXB0aEZhaWxDb2xvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB2YXIgc2hvdyA9IHVwZGF0ZXIuZW50aXR5LmlzU2hvd2luZyAmJiAodXBkYXRlci5oYXNDb25zdGFudEZpbGwgfHwgdXBkYXRlci5pc0ZpbGxlZCh0aW1lKSk7XHJcbiAgICAgIHZhciBjdXJyZW50U2hvdyA9IGF0dHJpYnV0ZXMuc2hvd1swXSA9PT0gMTtcclxuICAgICAgaWYgKHNob3cgIT09IGN1cnJlbnRTaG93KSB7XHJcbiAgICAgICAgYXR0cmlidXRlcy5zaG93ID0gU2hvd0dlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUudG9WYWx1ZShzaG93LCBhdHRyaWJ1dGVzLnNob3cpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB2YXIgZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uUHJvcGVydHkgPSB1cGRhdGVyLmRpc3RhbmNlRGlzcGxheUNvbmRpdGlvblByb3BlcnR5O1xyXG4gICAgICBpZiAoIVByb3BlcnR5LmlzQ29uc3RhbnQoZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uUHJvcGVydHkpKSB7XHJcbiAgICAgICAgdmFyIGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbiA9IFByb3BlcnR5LmdldFZhbHVlT3JEZWZhdWx0KGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvblByb3BlcnR5LCB0aW1lLCBkZWZhdWx0RGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uLCBkaXN0YW5jZURpc3BsYXlDb25kaXRpb25TY3JhdGNoKTtcclxuICAgICAgICBpZiAoIURpc3RhbmNlRGlzcGxheUNvbmRpdGlvbi5lcXVhbHMoZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uLCBhdHRyaWJ1dGVzLl9sYXN0RGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uKSkge1xyXG4gICAgICAgICAgYXR0cmlidXRlcy5fbGFzdERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbiA9IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbi5jbG9uZShkaXN0YW5jZURpc3BsYXlDb25kaXRpb24sIGF0dHJpYnV0ZXMuX2xhc3REaXN0YW5jZURpc3BsYXlDb25kaXRpb24pO1xyXG4gICAgICAgICAgYXR0cmlidXRlcy5kaXN0YW5jZURpc3BsYXlDb25kaXRpb24gPSBEaXN0YW5jZURpc3BsYXlDb25kaXRpb25HZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUoZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uLCBhdHRyaWJ1dGVzLmRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMudXBkYXRlU2hvd3MocHJpbWl0aXZlKTtcclxuICAgIHRoaXMud2FpdGluZ09uQ3JlYXRlID0gZmFsc2U7XHJcbiAgfSBlbHNlIGlmIChkZWZpbmVkKHByaW1pdGl2ZSkgJiYgIXByaW1pdGl2ZS5yZWFkeSkge1xyXG4gICAgaXNVcGRhdGVkID0gZmFsc2U7XHJcbiAgfVxyXG4gIHRoaXMuaXRlbXNUb1JlbW92ZS5sZW5ndGggPSByZW1vdmVkQ291bnQ7XHJcbiAgcmV0dXJuIGlzVXBkYXRlZDtcclxufTtcclxuXHJcbkJhdGNoLnByb3RvdHlwZS51cGRhdGVTaG93cyA9IGZ1bmN0aW9uIChwcmltaXRpdmUpIHtcclxuICB2YXIgc2hvd3NVcGRhdGVkID0gdGhpcy5zaG93c1VwZGF0ZWQudmFsdWVzO1xyXG4gIHZhciBsZW5ndGggPSBzaG93c1VwZGF0ZWQubGVuZ3RoO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgIHZhciB1cGRhdGVyID0gc2hvd3NVcGRhdGVkW2ldO1xyXG4gICAgdmFyIGluc3RhbmNlID0gdGhpcy5nZW9tZXRyeS5nZXQodXBkYXRlci5pZCk7XHJcbiAgICBcclxuICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLmdldChpbnN0YW5jZS5pZC5pZCk7XHJcbiAgICBpZiAoIWRlZmluZWQoYXR0cmlidXRlcykpIHtcclxuICAgICAgYXR0cmlidXRlcyA9IHByaW1pdGl2ZS5nZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlcyhpbnN0YW5jZS5pZCk7XHJcbiAgICAgIHRoaXMuYXR0cmlidXRlcy5zZXQoaW5zdGFuY2UuaWQuaWQsIGF0dHJpYnV0ZXMpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB2YXIgc2hvdyA9IHVwZGF0ZXIuZW50aXR5LmlzU2hvd2luZztcclxuICAgIHZhciBjdXJyZW50U2hvdyA9IGF0dHJpYnV0ZXMuc2hvd1swXSA9PT0gMTtcclxuICAgIGlmIChzaG93ICE9PSBjdXJyZW50U2hvdykge1xyXG4gICAgICBhdHRyaWJ1dGVzLnNob3cgPSBTaG93R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZS50b1ZhbHVlKHNob3csIGF0dHJpYnV0ZXMuc2hvdyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHRoaXMuc2hvd3NVcGRhdGVkLnJlbW92ZUFsbCgpO1xyXG59O1xyXG5cclxuQmF0Y2gucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKHVwZGF0ZXIpIHtcclxuICByZXR1cm4gdGhpcy51cGRhdGVycy5jb250YWlucyh1cGRhdGVyLmlkKTtcclxufTtcclxuXHJcbkJhdGNoLnByb3RvdHlwZS5nZXRCb3VuZGluZ1NwaGVyZSA9IGZ1bmN0aW9uICh1cGRhdGVyLCByZXN1bHQpIHtcclxuICB2YXIgcHJpbWl0aXZlID0gdGhpcy5wcmltaXRpdmU7XHJcbiAgaWYgKCFwcmltaXRpdmUucmVhZHkpIHtcclxuICAgIHJldHVybiBCb3VuZGluZ1NwaGVyZVN0YXRlLlBFTkRJTkc7XHJcbiAgfVxyXG4gIHZhciBhdHRyaWJ1dGVzID0gcHJpbWl0aXZlLmdldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVzKHVwZGF0ZXIuZW50aXR5KTtcclxuICBpZiAoIWRlZmluZWQoYXR0cmlidXRlcykgfHwgIWRlZmluZWQoYXR0cmlidXRlcy5ib3VuZGluZ1NwaGVyZSkgfHwvL1xyXG4gICAgKGRlZmluZWQoYXR0cmlidXRlcy5zaG93KSAmJiBhdHRyaWJ1dGVzLnNob3dbMF0gPT09IDApKSB7XHJcbiAgICByZXR1cm4gQm91bmRpbmdTcGhlcmVTdGF0ZS5GQUlMRUQ7XHJcbiAgfVxyXG4gIGF0dHJpYnV0ZXMuYm91bmRpbmdTcGhlcmUuY2xvbmUocmVzdWx0KTtcclxuICByZXR1cm4gQm91bmRpbmdTcGhlcmVTdGF0ZS5ET05FO1xyXG59O1xyXG5cclxuQmF0Y2gucHJvdG90eXBlLnJlbW92ZUFsbFByaW1pdGl2ZXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgdmFyIHByaW1pdGl2ZXMgPSB0aGlzLnByaW1pdGl2ZXM7XHJcbiAgXHJcbiAgdmFyIHByaW1pdGl2ZSA9IHRoaXMucHJpbWl0aXZlO1xyXG4gIGlmIChkZWZpbmVkKHByaW1pdGl2ZSkpIHtcclxuICAgIHByaW1pdGl2ZXMucmVtb3ZlKHByaW1pdGl2ZSk7XHJcbiAgICB0aGlzLnByaW1pdGl2ZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZ2VvbWV0cnkucmVtb3ZlQWxsKCk7XHJcbiAgICB0aGlzLnVwZGF0ZXJzLnJlbW92ZUFsbCgpO1xyXG4gIH1cclxuICBcclxuICB2YXIgb2xkUHJpbWl0aXZlID0gdGhpcy5vbGRQcmltaXRpdmU7XHJcbiAgaWYgKGRlZmluZWQob2xkUHJpbWl0aXZlKSkge1xyXG4gICAgcHJpbWl0aXZlcy5yZW1vdmUob2xkUHJpbWl0aXZlKTtcclxuICAgIHRoaXMub2xkUHJpbWl0aXZlID0gdW5kZWZpbmVkO1xyXG4gIH1cclxufTtcclxuXHJcbkJhdGNoLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xyXG4gIHZhciBwcmltaXRpdmUgPSB0aGlzLnByaW1pdGl2ZTtcclxuICB2YXIgcHJpbWl0aXZlcyA9IHRoaXMucHJpbWl0aXZlcztcclxuICBpZiAoZGVmaW5lZChwcmltaXRpdmUpKSB7XHJcbiAgICBwcmltaXRpdmVzLnJlbW92ZShwcmltaXRpdmUpO1xyXG4gIH1cclxuICB2YXIgb2xkUHJpbWl0aXZlID0gdGhpcy5vbGRQcmltaXRpdmU7XHJcbiAgaWYgKGRlZmluZWQob2xkUHJpbWl0aXZlKSkge1xyXG4gICAgcHJpbWl0aXZlcy5yZW1vdmUob2xkUHJpbWl0aXZlKTtcclxuICB9XHJcbiAgaWYgKGRlZmluZWQodGhpcy5yZW1vdmVNYXRlcmlhbFN1YnNjcmlwdGlvbikpIHtcclxuICAgIHRoaXMucmVtb3ZlTWF0ZXJpYWxTdWJzY3JpcHRpb24oKTtcclxuICB9XHJcbn07XHJcblxyXG5cclxubGV0IHdhc0ZpeGVkID0gZmFsc2U7XHJcb