UNPKG

@eliorar/angular-cesium

Version:

Angular library for working with Cesium.

328 lines 50.5 kB
/** * Fix for the constant entity shadowing. * PR in Cesium repo: https://github.com/AnalyticalGraphicsInc/cesium/pull/5736 */ import { AssociativeArray, Color, ColorGeometryInstanceAttribute, ColorMaterialProperty, defined, DistanceDisplayCondition, DistanceDisplayConditionGeometryInstanceAttribute, Primitive, ShadowMode, ShowGeometryInstanceAttribute } from 'cesium'; // tslint:disable // const AssociativeArray = AssociativeArray; // const Color = Color; // const ColorGeometryInstanceAttribute = ColorGeometryInstanceAttribute; // const defined = defined; // const DistanceDisplayCondition = DistanceDisplayCondition; // const DistanceDisplayConditionGeometryInstanceAttribute = DistanceDisplayConditionGeometryInstanceAttribute; // const ShowGeometryInstanceAttribute = ShowGeometryInstanceAttribute; // const Primitive = Primitive; // const ShadowMode = ShadowMode; // const BoundingSphereState = BoundingSphereState; // const ColorMaterialProperty = ColorMaterialProperty; // const MaterialProperty = MaterialProperty; // const Property = 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 || !Cesium.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 = Cesium.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 = Cesium.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 = Cesium.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 = Cesium.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 (!Cesium.Property.isConstant(distanceDisplayConditionProperty)) { var distanceDisplayCondition = Cesium.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 Cesium.BoundingSphereState.PENDING; } var attributes = primitive.getGeometryInstanceAttributes(updater.entity); if (!defined(attributes) || !defined(attributes.boundingSphere) || // (defined(attributes.show) && attributes.show[0] === 0)) { return Cesium.BoundingSphereState.FAILED; } attributes.boundingSphere.clone(result); return Cesium.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGljR2VvbWV0cnlDb2xvckJhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jZXNpdW0vc3JjL2xpYi9hbmd1bGFyLWNlc2l1bS9jZXNpdW0tZW5oYW5jZW1lbnRzL1N0YXRpY0dlb21ldHJ5Q29sb3JCYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCw4QkFBOEIsRUFDOUIscUJBQXFCLEVBQ3JCLE9BQU8sRUFDUCx3QkFBd0IsRUFDeEIsaURBQWlELEVBQ2pELFNBQVMsRUFDVCxVQUFVLEVBQ1YsNkJBQTZCLEVBQzlCLE1BQU0sUUFBUSxDQUFDO0FBSWhCLGlCQUFpQjtBQUNqQiw2Q0FBNkM7QUFDN0MsdUJBQXVCO0FBQ3ZCLHlFQUF5RTtBQUN6RSwyQkFBMkI7QUFDM0IsNkRBQTZEO0FBQzdELCtHQUErRztBQUMvRyx1RUFBdUU7QUFDdkUsK0JBQStCO0FBQy9CLGlDQUFpQztBQUNqQyxtREFBbUQ7QUFDbkQsdURBQXVEO0FBQ3ZELDZDQUE2QztBQUM3Qyw4QkFBOEI7QUFFOUIsSUFBSSxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUMvQixJQUFJLCtCQUErQixHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQztBQUNyRSxJQUFJLCtCQUErQixHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQztBQUVyRSxTQUFTLEtBQUssQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLEVBQUUsT0FBTztJQUN6SCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUMvQixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUNyQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsdUJBQXVCLENBQUM7SUFDdkQsSUFB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T0FBTyxDQUFDLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixPQUFPO2FBQ1I7U0FFRjtRQUVELElBQUksS0FBSyxHQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvSyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BCLENBQUMsQ0FBQztJQUNGLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRml4IGZvciB0aGUgY29uc3RhbnQgZW50aXR5IHNoYWRvd2luZy5cbiAqIFBSIGluIENlc2l1bSByZXBvOiBodHRwczovL2dpdGh1Yi5jb20vQW5hbHl0aWNhbEdyYXBoaWNzSW5jL2Nlc2l1bS9wdWxsLzU3MzZcbiAqL1xuaW1wb3J0IHtcbiAgQXNzb2NpYXRpdmVBcnJheSxcbiAgQ29sb3IsXG4gIENvbG9yR2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZSxcbiAgQ29sb3JNYXRlcmlhbFByb3BlcnR5LFxuICBkZWZpbmVkLFxuICBEaXN0YW5jZURpc3BsYXlDb25kaXRpb24sXG4gIERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbkdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUsXG4gIFByaW1pdGl2ZSxcbiAgU2hhZG93TW9kZSxcbiAgU2hvd0dlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVcbn0gZnJvbSAnY2VzaXVtJztcblxuZGVjbGFyZSB2YXIgQ2VzaXVtOiBhbnk7XG5cbi8vIHRzbGludDpkaXNhYmxlXG4vLyBjb25zdCBBc3NvY2lhdGl2ZUFycmF5ID0gQXNzb2NpYXRpdmVBcnJheTtcbi8vIGNvbnN0IENvbG9yID0gQ29sb3I7XG4vLyBjb25zdCBDb2xvckdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUgPSBDb2xvckdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGU7XG4vLyBjb25zdCBkZWZpbmVkID0gZGVmaW5lZDtcbi8vIGNvbnN0IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbiA9IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbjtcbi8vIGNvbnN0IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbkdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUgPSBEaXN0YW5jZURpc3BsYXlDb25kaXRpb25HZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlO1xuLy8gY29uc3QgU2hvd0dlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUgPSBTaG93R2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZTtcbi8vIGNvbnN0IFByaW1pdGl2ZSA9IFByaW1pdGl2ZTtcbi8vIGNvbnN0IFNoYWRvd01vZGUgPSBTaGFkb3dNb2RlO1xuLy8gY29uc3QgQm91bmRpbmdTcGhlcmVTdGF0ZSA9IEJvdW5kaW5nU3BoZXJlU3RhdGU7XG4vLyBjb25zdCBDb2xvck1hdGVyaWFsUHJvcGVydHkgPSBDb2xvck1hdGVyaWFsUHJvcGVydHk7XG4vLyBjb25zdCBNYXRlcmlhbFByb3BlcnR5ID0gTWF0ZXJpYWxQcm9wZXJ0eTtcbi8vICBjb25zdCBQcm9wZXJ0eSA9IFByb3BlcnR5O1xuXG52YXIgY29sb3JTY3JhdGNoID0gbmV3IENvbG9yKCk7XG52YXIgZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uU2NyYXRjaCA9IG5ldyBEaXN0YW5jZURpc3BsYXlDb25kaXRpb24oKTtcbnZhciBkZWZhdWx0RGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uID0gbmV3IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbigpO1xuXG5mdW5jdGlvbiBCYXRjaChwcmltaXRpdmVzLCB0cmFuc2x1Y2VudCwgYXBwZWFyYW5jZVR5cGUsIGRlcHRoRmFpbEFwcGVhcmFuY2VUeXBlLCBkZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5LCBjbG9zZWQsIHNoYWRvd3MpIHtcbiAgdGhpcy50cmFuc2x1Y2VudCA9IHRyYW5zbHVjZW50O1xuICB0aGlzLmFwcGVhcmFuY2VUeXBlID0gYXBwZWFyYW5jZVR5cGU7XG4gIHRoaXMuZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUgPSBkZXB0aEZhaWxBcHBlYXJhbmNlVHlwZTtcbiAgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5ID0gZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eTtcbiAgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5jbG9zZWQgPSBjbG9zZWQ7XG4gIHRoaXMuc2hhZG93cyA9IHNoYWRvd3M7XG4gIHRoaXMucHJpbWl0aXZlcyA9IHByaW1pdGl2ZXM7XG4gIHRoaXMuY3JlYXRlUHJpbWl0aXZlID0gZmFsc2U7XG4gIHRoaXMud2FpdGluZ09uQ3JlYXRlID0gZmFsc2U7XG4gIHRoaXMucHJpbWl0aXZlID0gdW5kZWZpbmVkO1xuICB0aGlzLm9sZFByaW1pdGl2ZSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5nZW9tZXRyeSA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XG4gIHRoaXMudXBkYXRlcnMgPSBuZXcgQXNzb2NpYXRpdmVBcnJheSgpO1xuICB0aGlzLnVwZGF0ZXJzV2l0aEF0dHJpYnV0ZXMgPSBuZXcgQXNzb2NpYXRpdmVBcnJheSgpO1xuICB0aGlzLmF0dHJpYnV0ZXMgPSBuZXcgQXNzb2NpYXRpdmVBcnJheSgpO1xuICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgQXNzb2NpYXRpdmVBcnJheSgpO1xuICB0aGlzLnNob3dzVXBkYXRlZCA9IG5ldyBBc3NvY2lhdGl2ZUFycmF5KCk7XG4gIHRoaXMuaXRlbXNUb1JlbW92ZSA9IFtdO1xuICB0aGlzLmludmFsaWRhdGVkID0gZmFsc2U7XG5cbiAgdmFyIHJlbW92ZU1hdGVyaWFsU3Vic2NyaXB0aW9uO1xuICBpZiAoZGVmaW5lZChkZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5KSkge1xuICAgIHJlbW92ZU1hdGVyaWFsU3Vic2NyaXB0aW9uID0gZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eS5kZWZpbml0aW9uQ2hhbmdlZC5hZGRFdmVudExpc3RlbmVyKEJhdGNoLnByb3RvdHlwZS5vbk1hdGVyaWFsQ2hhbmdlZCwgdGhpcyk7XG4gIH1cbiAgdGhpcy5yZW1vdmVNYXRlcmlhbFN1YnNjcmlwdGlvbiA9IHJlbW92ZU1hdGVyaWFsU3Vic2NyaXB0aW9uO1xufVxuXG5CYXRjaC5wcm90b3R5cGUub25NYXRlcmlhbENoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaW52YWxpZGF0ZWQgPSB0cnVlO1xufTtcblxuQmF0Y2gucHJvdG90eXBlLmlzTWF0ZXJpYWwgPSBmdW5jdGlvbiAodXBkYXRlcikge1xuICB2YXIgbWF0ZXJpYWwgPSB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHk7XG4gIHZhciB1cGRhdGVyTWF0ZXJpYWwgPSB1cGRhdGVyLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHk7XG4gIGlmICh1cGRhdGVyTWF0ZXJpYWwgPT09IG1hdGVyaWFsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGRlZmluZWQobWF0ZXJpYWwpKSB7XG4gICAgcmV0dXJuIG1hdGVyaWFsLmVxdWFscyh1cGRhdGVyTWF0ZXJpYWwpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbkJhdGNoLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodXBkYXRlciwgaW5zdGFuY2UpIHtcbiAgdmFyIGlkID0gdXBkYXRlci5pZDtcbiAgdGhpcy5jcmVhdGVQcmltaXRpdmUgPSB0cnVlO1xuICB0aGlzLmdlb21ldHJ5LnNldChpZCwgaW5zdGFuY2UpO1xuICB0aGlzLnVwZGF0ZXJzLnNldChpZCwgdXBkYXRlcik7XG4gIGlmICghdXBkYXRlci5oYXNDb25zdGFudEZpbGwgfHwgIXVwZGF0ZXIuZmlsbE1hdGVyaWFsUHJvcGVydHkuaXNDb25zdGFudCB8fCAhQ2VzaXVtLlByb3BlcnR5LmlzQ29uc3RhbnQodXBkYXRlci5kaXN0YW5jZURpc3BsYXlDb25kaXRpb25Qcm9wZXJ0eSkpIHtcbiAgICB0aGlzLnVwZGF0ZXJzV2l0aEF0dHJpYnV0ZXMuc2V0KGlkLCB1cGRhdGVyKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnNldChpZCwgdXBkYXRlci5lbnRpdHkuZGVmaW5pdGlvbkNoYW5nZWQuYWRkRXZlbnRMaXN0ZW5lcihmdW5jdGlvbiAoZW50aXR5LCBwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlLCBvbGRWYWx1ZSkge1xuICAgICAgaWYgKHByb3BlcnR5TmFtZSA9PT0gJ2lzU2hvd2luZycpIHtcbiAgICAgICAgdGhhdC5zaG93c1VwZGF0ZWQuc2V0KHVwZGF0ZXIuaWQsIHVwZGF0ZXIpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxufTtcblxuQmF0Y2gucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh1cGRhdGVyKSB7XG4gIHZhciBpZCA9IHVwZGF0ZXIuaWQ7XG4gIHRoaXMuY3JlYXRlUHJpbWl0aXZlID0gdGhpcy5nZW9tZXRyeS5yZW1vdmUoaWQpIHx8IHRoaXMuY3JlYXRlUHJpbWl0aXZlO1xuICBpZiAodGhpcy51cGRhdGVycy5yZW1vdmUoaWQpKSB7XG4gICAgdGhpcy51cGRhdGVyc1dpdGhBdHRyaWJ1dGVzLnJlbW92ZShpZCk7XG4gICAgdmFyIHVuc3Vic2NyaWJlID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChpZCk7XG4gICAgaWYgKGRlZmluZWQodW5zdWJzY3JpYmUpKSB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnJlbW92ZShpZCk7XG4gICAgfVxuICB9XG59O1xuXG5CYXRjaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHRpbWUpIHtcbiAgdmFyIGlzVXBkYXRlZCA9IHRydWU7XG4gIHZhciByZW1vdmVkQ291bnQgPSAwO1xuICB2YXIgcHJpbWl0aXZlID0gdGhpcy5wcmltaXRpdmU7XG4gIHZhciBwcmltaXRpdmVzID0gdGhpcy5wcmltaXRpdmVzO1xuICB2YXIgYXR0cmlidXRlcztcbiAgdmFyIGk7XG5cbiAgaWYgKHRoaXMuY3JlYXRlUHJpbWl0aXZlKSB7XG4gICAgdmFyIGdlb21ldHJpZXMgPSB0aGlzLmdlb21ldHJ5LnZhbHVlcztcbiAgICB2YXIgZ2VvbWV0cmllc0xlbmd0aCA9IGdlb21ldHJpZXMubGVuZ3RoO1xuICAgIGlmIChnZW9tZXRyaWVzTGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGRlZmluZWQocHJpbWl0aXZlKSkge1xuICAgICAgICBpZiAoIWRlZmluZWQodGhpcy5vbGRQcmltaXRpdmUpKSB7XG4gICAgICAgICAgdGhpcy5vbGRQcmltaXRpdmUgPSBwcmltaXRpdmU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbWl0aXZlcy5yZW1vdmUocHJpbWl0aXZlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbWV0cmllc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBnZW9tZXRyeUl0ZW0gPSBnZW9tZXRyaWVzW2ldO1xuICAgICAgICB2YXIgb3JpZ2luYWxBdHRyaWJ1dGVzID0gZ2VvbWV0cnlJdGVtLmF0dHJpYnV0ZXM7XG4gICAgICAgIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXMuZ2V0KGdlb21ldHJ5SXRlbS5pZC5pZCk7XG5cbiAgICAgICAgaWYgKGRlZmluZWQoYXR0cmlidXRlcykpIHtcbiAgICAgICAgICBpZiAoZGVmaW5lZChvcmlnaW5hbEF0dHJpYnV0ZXMuc2hvdykpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsQXR0cmlidXRlcy5zaG93LnZhbHVlID0gYXR0cmlidXRlcy5zaG93O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVmaW5lZChvcmlnaW5hbEF0dHJpYnV0ZXMuY29sb3IpKSB7XG4gICAgICAgICAgICBvcmlnaW5hbEF0dHJpYnV0ZXMuY29sb3IudmFsdWUgPSBhdHRyaWJ1dGVzLmNvbG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVmaW5lZChvcmlnaW5hbEF0dHJpYnV0ZXMuZGVwdGhGYWlsQ29sb3IpKSB7XG4gICAgICAgICAgICBvcmlnaW5hbEF0dHJpYnV0ZXMuZGVwdGhGYWlsQ29sb3IudmFsdWUgPSBhdHRyaWJ1dGVzLmRlcHRoRmFpbENvbG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZGVwdGhGYWlsQXBwZWFyYW5jZTtcbiAgICAgIGlmIChkZWZpbmVkKHRoaXMuZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUpKSB7XG4gICAgICAgIGlmIChkZWZpbmVkKHRoaXMuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eSkpIHtcbiAgICAgICAgICB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsID0gQ2VzaXVtLk1hdGVyaWFsUHJvcGVydHkuZ2V0VmFsdWUodGltZSwgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5LCB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsKTtcbiAgICAgICAgfVxuICAgICAgICBkZXB0aEZhaWxBcHBlYXJhbmNlID0gbmV3IHRoaXMuZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUoe1xuICAgICAgICAgIG1hdGVyaWFsOiB0aGlzLmRlcHRoRmFpbE1hdGVyaWFsLFxuICAgICAgICAgIHRyYW5zbHVjZW50OiB0aGlzLnRyYW5zbHVjZW50LFxuICAgICAgICAgIGNsb3NlZDogdGhpcy5jbG9zZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHByaW1pdGl2ZSA9IG5ldyBQcmltaXRpdmUoe1xuICAgICAgICBzaG93OiBmYWxzZSxcbiAgICAgICAgYXN5bmNocm9ub3VzOiB0cnVlLFxuICAgICAgICBnZW9tZXRyeUluc3RhbmNlczogZ2VvbWV0cmllcyxcbiAgICAgICAgYXBwZWFyYW5jZTogbmV3IHRoaXMuYXBwZWFyYW5jZVR5cGUoe1xuICAgICAgICAgIGZsYXQ6IHRoaXMuc2hhZG93cyA9PT0gU2hhZG93TW9kZS5ESVNBQkxFRCB8fCB0aGlzLnNoYWRvd3MgPT09IFNoYWRvd01vZGUuQ0FTVF9PTkxZLFxuICAgICAgICAgIHRyYW5zbHVjZW50OiB0aGlzLnRyYW5zbHVjZW50LFxuICAgICAgICAgIGNsb3NlZDogdGhpcy5jbG9zZWRcbiAgICAgICAgfSksXG4gICAgICAgIGRlcHRoRmFpbEFwcGVhcmFuY2U6IGRlcHRoRmFpbEFwcGVhcmFuY2UsXG4gICAgICAgIHNoYWRvd3M6IHRoaXMuc2hhZG93c1xuICAgICAgfSk7XG4gICAgICBwcmltaXRpdmVzLmFkZChwcmltaXRpdmUpO1xuICAgICAgaXNVcGRhdGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWZpbmVkKHByaW1pdGl2ZSkpIHtcbiAgICAgICAgcHJpbWl0aXZlcy5yZW1vdmUocHJpbWl0aXZlKTtcbiAgICAgICAgcHJpbWl0aXZlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIG9sZFByaW1pdGl2ZSA9IHRoaXMub2xkUHJpbWl0aXZlO1xuICAgICAgaWYgKGRlZmluZWQob2xkUHJpbWl0aXZlKSkge1xuICAgICAgICBwcmltaXRpdmVzLnJlbW92ZShvbGRQcmltaXRpdmUpO1xuICAgICAgICB0aGlzLm9sZFByaW1pdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmF0dHJpYnV0ZXMucmVtb3ZlQWxsKCk7XG4gICAgdGhpcy5wcmltaXRpdmUgPSBwcmltaXRpdmU7XG4gICAgdGhpcy5jcmVhdGVQcmltaXRpdmUgPSBmYWxzZTtcbiAgICB0aGlzLndhaXRpbmdPbkNyZWF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoZGVmaW5lZChwcmltaXRpdmUpICYmIHByaW1pdGl2ZS5yZWFkeSkge1xuICAgIHByaW1pdGl2ZS5zaG93ID0gdHJ1ZTtcbiAgICBpZiAoZGVmaW5lZCh0aGlzLm9sZFByaW1pdGl2ZSkpIHtcbiAgICAgIHByaW1pdGl2ZXMucmVtb3ZlKHRoaXMub2xkUHJpbWl0aXZlKTtcbiAgICAgIHRoaXMub2xkUHJpbWl0aXZlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChkZWZpbmVkKHRoaXMuZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUpICYmICEodGhpcy5kZXB0aEZhaWxNYXRlcmlhbFByb3BlcnR5IGluc3RhbmNlb2YgQ29sb3JNYXRlcmlhbFByb3BlcnR5KSkge1xuICAgICAgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbCA9IENlc2l1bS5NYXRlcmlhbFByb3BlcnR5LmdldFZhbHVlKHRpbWUsIHRoaXMuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eSwgdGhpcy5kZXB0aEZhaWxNYXRlcmlhbCk7XG4gICAgICB0aGlzLnByaW1pdGl2ZS5kZXB0aEZhaWxBcHBlYXJhbmNlLm1hdGVyaWFsID0gdGhpcy5kZXB0aEZhaWxNYXRlcmlhbDtcbiAgICB9XG5cbiAgICB2YXIgdXBkYXRlcnNXaXRoQXR0cmlidXRlcyA9IHRoaXMudXBkYXRlcnNXaXRoQXR0cmlidXRlcy52YWx1ZXM7XG4gICAgdmFyIGxlbmd0aCA9IHVwZGF0ZXJzV2l0aEF0dHJpYnV0ZXMubGVuZ3RoO1xuICAgIHZhciB3YWl0aW5nT25DcmVhdGUgPSB0aGlzLndhaXRpbmdPbkNyZWF0ZTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB1cGRhdGVyID0gdXBkYXRlcnNXaXRoQXR0cmlidXRlc1tpXTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZ2VvbWV0cnkuZ2V0KHVwZGF0ZXIuaWQpO1xuXG4gICAgICBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLmdldChpbnN0YW5jZS5pZC5pZCk7XG4gICAgICBpZiAoIWRlZmluZWQoYXR0cmlidXRlcykpIHtcbiAgICAgICAgYXR0cmlidXRlcyA9IHByaW1pdGl2ZS5nZXRHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlcyhpbnN0YW5jZS5pZCk7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcy5zZXQoaW5zdGFuY2UuaWQuaWQsIGF0dHJpYnV0ZXMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZXIuZmlsbE1hdGVyaWFsUHJvcGVydHkuaXNDb25zdGFudCB8fCB3YWl0aW5nT25DcmVhdGUpIHtcbiAgICAgICAgdmFyIGNvbG9yUHJvcGVydHkgPSB1cGRhdGVyLmZpbGxNYXRlcmlhbFByb3BlcnR5LmNvbG9yO1xuICAgICAgICB2YXIgcmVzdWx0Q29sb3IgPSBDZXNpdW0uUHJvcGVydHkuZ2V0VmFsdWVPckRlZmF1bHQoY29sb3JQcm9wZXJ0eSwgdGltZSwgQ29sb3IuV0hJVEUsIGNvbG9yU2NyYXRjaCk7XG4gICAgICAgIGlmICghQ29sb3IuZXF1YWxzKGF0dHJpYnV0ZXMuX2xhc3RDb2xvciwgcmVzdWx0Q29sb3IpKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5fbGFzdENvbG9yID0gQ29sb3IuY2xvbmUocmVzdWx0Q29sb3IsIGF0dHJpYnV0ZXMuX2xhc3RDb2xvcik7XG4gICAgICAgICAgYXR0cmlidXRlcy5jb2xvciA9IENvbG9yR2VvbWV0cnlJbnN0YW5jZUF0dHJpYnV0ZS50b1ZhbHVlKHJlc3VsdENvbG9yLCBhdHRyaWJ1dGVzLmNvbG9yKTtcbiAgICAgICAgICBpZiAoKHRoaXMudHJhbnNsdWNlbnQgJiYgYXR0cmlidXRlcy5jb2xvclszXSA9PT0gMjU1KSB8fCAoIXRoaXMudHJhbnNsdWNlbnQgJiYgYXR0cmlidXRlcy5jb2xvclszXSAhPT0gMjU1KSkge1xuICAgICAgICAgICAgdGhpcy5pdGVtc1RvUmVtb3ZlW3JlbW92ZWRDb3VudCsrXSA9IHVwZGF0ZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWZpbmVkKHRoaXMuZGVwdGhGYWlsQXBwZWFyYW5jZVR5cGUpICYmIHVwZGF0ZXIuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eSBpbnN0YW5jZW9mIENvbG9yTWF0ZXJpYWxQcm9wZXJ0eSAmJiAoIXVwZGF0ZXIuZGVwdGhGYWlsTWF0ZXJpYWxQcm9wZXJ0eS5pc0NvbnN0YW50IHx8IHdhaXRpbmdPbkNyZWF0ZSkpIHtcbiAgICAgICAgdmFyIGRlcHRoRmFpbENvbG9yUHJvcGVydHkgPSB1cGRhdGVyLmRlcHRoRmFpbE1hdGVyaWFsUHJvcGVydHkuY29sb3I7XG4gICAgICAgIHZhciBkZXB0aENvbG9yID0gQ2VzaXVtLlByb3BlcnR5LmdldFZhbHVlT3JEZWZhdWx0KGRlcHRoRmFpbENvbG9yUHJvcGVydHksIHRpbWUsIENvbG9yLldISVRFLCBjb2xvclNjcmF0Y2gpO1xuICAgICAgICBpZiAoIUNvbG9yLmVxdWFscyhhdHRyaWJ1dGVzLl9sYXN0RGVwdGhGYWlsQ29sb3IsIGRlcHRoQ29sb3IpKSB7XG4gICAgICAgICAgYXR0cmlidXRlcy5fbGFzdERlcHRoRmFpbENvbG9yID0gQ29sb3IuY2xvbmUoZGVwdGhDb2xvciwgYXR0cmlidXRlcy5fbGFzdERlcHRoRmFpbENvbG9yKTtcbiAgICAgICAgICBhdHRyaWJ1dGVzLmRlcHRoRmFpbENvbG9yID0gQ29sb3JHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUoZGVwdGhDb2xvciwgYXR0cmlidXRlcy5kZXB0aEZhaWxDb2xvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNob3cgPSB1cGRhdGVyLmVudGl0eS5pc1Nob3dpbmcgJiYgKHVwZGF0ZXIuaGFzQ29uc3RhbnRGaWxsIHx8IHVwZGF0ZXIuaXNGaWxsZWQodGltZSkpO1xuICAgICAgdmFyIGN1cnJlbnRTaG93ID0gYXR0cmlidXRlcy5zaG93WzBdID09PSAxO1xuICAgICAgaWYgKHNob3cgIT09IGN1cnJlbnRTaG93KSB7XG4gICAgICAgIGF0dHJpYnV0ZXMuc2hvdyA9IFNob3dHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUoc2hvdywgYXR0cmlidXRlcy5zaG93KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvblByb3BlcnR5ID0gdXBkYXRlci5kaXN0YW5jZURpc3BsYXlDb25kaXRpb25Qcm9wZXJ0eTtcbiAgICAgIGlmICghQ2VzaXVtLlByb3BlcnR5LmlzQ29uc3RhbnQoZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uUHJvcGVydHkpKSB7XG4gICAgICAgIHZhciBkaXN0YW5jZURpc3BsYXlDb25kaXRpb24gPSBDZXNpdW0uUHJvcGVydHkuZ2V0VmFsdWVPckRlZmF1bHQoZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uUHJvcGVydHksIHRpbWUsIGRlZmF1bHREaXN0YW5jZURpc3BsYXlDb25kaXRpb24sIGRpc3RhbmNlRGlzcGxheUNvbmRpdGlvblNjcmF0Y2gpO1xuICAgICAgICBpZiAoIURpc3RhbmNlRGlzcGxheUNvbmRpdGlvbi5lcXVhbHMoZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uLCBhdHRyaWJ1dGVzLl9sYXN0RGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uKSkge1xuICAgICAgICAgIGF0dHJpYnV0ZXMuX2xhc3REaXN0YW5jZURpc3BsYXlDb25kaXRpb24gPSBEaXN0YW5jZURpc3BsYXlDb25kaXRpb24uY2xvbmUoZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uLCBhdHRyaWJ1dGVzLl9sYXN0RGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uKTtcbiAgICAgICAgICBhdHRyaWJ1dGVzLmRpc3RhbmNlRGlzcGxheUNvbmRpdGlvbiA9IERpc3RhbmNlRGlzcGxheUNvbmRpdGlvbkdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGUudG9WYWx1ZShkaXN0YW5jZURpc3BsYXlDb25kaXRpb24sIGF0dHJpYnV0ZXMuZGlzdGFuY2VEaXNwbGF5Q29uZGl0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU2hvd3MocHJpbWl0aXZlKTtcbiAgICB0aGlzLndhaXRpbmdPbkNyZWF0ZSA9IGZhbHNlO1xuICB9IGVsc2UgaWYgKGRlZmluZWQocHJpbWl0aXZlKSAmJiAhcHJpbWl0aXZlLnJlYWR5KSB7XG4gICAgaXNVcGRhdGVkID0gZmFsc2U7XG4gIH1cbiAgdGhpcy5pdGVtc1RvUmVtb3ZlLmxlbmd0aCA9IHJlbW92ZWRDb3VudDtcbiAgcmV0dXJuIGlzVXBkYXRlZDtcbn07XG5cbkJhdGNoLnByb3RvdHlwZS51cGRhdGVTaG93cyA9IGZ1bmN0aW9uIChwcmltaXRpdmUpIHtcbiAgdmFyIHNob3dzVXBkYXRlZCA9IHRoaXMuc2hvd3NVcGRhdGVkLnZhbHVlcztcbiAgdmFyIGxlbmd0aCA9IHNob3dzVXBkYXRlZC5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdXBkYXRlciA9IHNob3dzVXBkYXRlZFtpXTtcbiAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLmdlb21ldHJ5LmdldCh1cGRhdGVyLmlkKTtcblxuICAgIHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzLmdldChpbnN0YW5jZS5pZC5pZCk7XG4gICAgaWYgKCFkZWZpbmVkKGF0dHJpYnV0ZXMpKSB7XG4gICAgICBhdHRyaWJ1dGVzID0gcHJpbWl0aXZlLmdldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVzKGluc3RhbmNlLmlkKTtcbiAgICAgIHRoaXMuYXR0cmlidXRlcy5zZXQoaW5zdGFuY2UuaWQuaWQsIGF0dHJpYnV0ZXMpO1xuICAgIH1cblxuICAgIHZhciBzaG93ID0gdXBkYXRlci5lbnRpdHkuaXNTaG93aW5nO1xuICAgIHZhciBjdXJyZW50U2hvdyA9IGF0dHJpYnV0ZXMuc2hvd1swXSA9PT0gMTtcbiAgICBpZiAoc2hvdyAhPT0gY3VycmVudFNob3cpIHtcbiAgICAgIGF0dHJpYnV0ZXMuc2hvdyA9IFNob3dHZW9tZXRyeUluc3RhbmNlQXR0cmlidXRlLnRvVmFsdWUoc2hvdywgYXR0cmlidXRlcy5zaG93KTtcbiAgICB9XG4gIH1cbiAgdGhpcy5zaG93c1VwZGF0ZWQucmVtb3ZlQWxsKCk7XG59O1xuXG5CYXRjaC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAodXBkYXRlcikge1xuICByZXR1cm4gdGhpcy51cGRhdGVycy5jb250YWlucyh1cGRhdGVyLmlkKTtcbn07XG5cbkJhdGNoLnByb3RvdHlwZS5nZXRCb3VuZGluZ1NwaGVyZSA9IGZ1bmN0aW9uICh1cGRhdGVyLCByZXN1bHQpIHtcbiAgdmFyIHByaW1pdGl2ZSA9IHRoaXMucHJpbWl0aXZlO1xuICBpZiAoIXByaW1pdGl2ZS5yZWFkeSkge1xuICAgIHJldHVybiBDZXNpdW0uQm91bmRpbmdTcGhlcmVTdGF0ZS5QRU5ESU5HO1xuICB9XG4gIHZhciBhdHRyaWJ1dGVzID0gcHJpbWl0aXZlLmdldEdlb21ldHJ5SW5zdGFuY2VBdHRyaWJ1dGVzKHVwZGF0ZXIuZW50aXR5KTtcbiAgaWYgKCFkZWZpbmVkKGF0dHJpYnV0ZXMpIHx8ICFkZWZpbmVkKGF0dHJpYnV0ZXMuYm91bmRpbmdTcGhlcmUpIHx8Ly9cbiAgICAoZGVmaW5lZChhdHRyaWJ1dGVzLnNob3cpICYmIGF0dHJpYnV0ZXMuc2hvd1swXSA9PT0gMCkpIHtcbiAgICByZXR1cm4gQ2VzaXVtLkJvdW5kaW5nU3BoZXJlU3RhdGUuRkFJTEVEO1xuICB9XG4gIGF0dHJpYnV0ZXMuYm91bmRpbmdTcGhlcmUuY2xvbmUocmVzdWx0KTtcbiAgcmV0dXJuIENlc2l1bS5Cb3VuZGluZ1NwaGVyZVN0YXRlLkRPTkU7XG59O1xuXG5CYXRjaC5wcm90b3R5cGUucmVtb3ZlQWxsUHJpbWl0aXZlcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByaW1pdGl2ZXMgPSB0aGlzLnByaW1pdGl2ZXM7XG5cbiAgdmFyIHByaW1pdGl2ZSA9IHRoaXMucHJpbWl0aXZlO1xuICBpZiAoZGVmaW5lZChwcmltaXRpdmUpKSB7XG4gICAgcHJpbWl0aXZlcy5yZW1vdmUocHJpbWl0aXZlKTtcbiAgICB0aGlzLnByaW1pdGl2ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmdlb21ldHJ5LnJlbW92ZUFsbCgpO1xuICAgIHRoaXMudXBkYXRlcnMucmVtb3ZlQWxsKCk7XG4gIH1cblxuICB2YXIgb2xkUHJpbWl0aXZlID0gdGhpcy5vbGRQcmltaXRpdmU7XG4gIGlmIChkZWZpbmVkKG9sZFByaW1pdGl2ZSkpIHtcbiAgICBwcmltaXRpdmVzLnJlbW92ZShvbGRQcmltaXRpdmUpO1xuICAgIHRoaXMub2xkUHJpbWl0aXZlID0gdW5kZWZpbmVkO1xuICB9XG59O1xuXG5CYXRjaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByaW1pdGl2ZSA9IHRoaXMucHJpbWl0aXZlO1xuICB2YXIgcHJpbWl0aXZlcyA9IHRoaXMucHJpbWl0aXZlcztcbiAgaWYgKGRlZmluZWQocHJpbWl0aXZlKSkge1xuICAgIHByaW1pdGl2ZXMucmVtb3ZlKHByaW1pdGl2ZSk7XG4gIH1cbiAgdmFyIG9sZFByaW1pdGl2ZSA9IHRoaXMub2xkUHJpbWl0aXZlO1xuICBpZiAoZGVmaW5lZChvbGRQcmltaXRpdmUpKSB7XG4gICAgcHJpbWl0aXZlcy5yZW1vdmUob2xkUHJpbWl0aXZlKTtcbiAgfVxuICBpZiAoZGVmaW5lZCh0aGlzLnJlbW92ZU1hdGVyaWFsU3Vic2NyaXB0aW9uKSkge1xuICAgIHRoaXMucmVtb3ZlTWF0ZXJpYWxTdWJzY3JpcHRpb24oKTtcbiAgfVxufTtcblxuXG5sZXQgd2FzRml4ZWQgPSBmYWxzZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZpeENlc2l1bUVudGl0aWVzU2hhZG93cygpIHtcbiAgaWYgKHdhc0ZpeGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIENlc2l1bS5TdGF0aWNHZW9tZXRyeUNvbG9yQmF0Y2gucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh0aW1lOiBhbnksIHVwZGF0ZXI6IGFueSkge1xuICAgIHZhciBpdGVtcztcbiAgICB2YXIgdHJhbnNsdWNlbnQ7XG4gICAgdmFyIGluc3RhbmNlID0gdXBkYXRlci5jcmVhdGVGaWxsR2VvbWV0cnlJbnN0YW5jZSh0aW1lKTtcbiAgICBpZiAoaW5zdGFuY2UuYXR0cmlidXRlcy5jb2xvci52YWx1ZVszXSA9PT0gMjU1KSB7XG4gICAgICBpdGVtcyA9IHRoaXMuX3NvbGlkSXRlbXM7XG4gICAgICB0cmFuc2x1Y2VudCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtcyA9IHRoaXMuX3RyYW5zbHVjZW50SXRlbXM7XG4gICAgICB0cmFuc2x1Y2VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxlbmd0aCA9IGl0ZW1zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgaWYgKGl0ZW0uaXNNYXRlcmlhbCh1cGR