UNPKG

@tripsnek/tmf

Version:

TypeScript Modeling Framework - A TypeScript port of the Eclipse Modeling Framework (EMF)

244 lines 32.6 kB
import { BasicEList } from '../basicelist.js'; import { EAttributeImpl } from './eattribute-impl.js'; import { EClassifierImpl } from './eclassifier-impl.js'; import { EReferenceImpl } from './ereference-impl.js'; export class EClassImpl extends EClassifierImpl { classIsAbstract = false; classIsInterface = false; eSuperTypes = new BasicEList(); eStructuralFeatures = new BasicEList(); eOperations = new BasicEList(); // pre-computed and cached lists eReferences; eAllSuperTypes; eAllStructuralFeatures; eAttributes; eAllAttributes; eAllReferences; eAllContainments; eAllOperations; constructor(owner, name, abstract, isInterface) { super(owner, name); if (abstract) this.classIsAbstract = abstract; if (isInterface) this.classIsInterface = isInterface; } isAbstract() { return this.classIsAbstract; } isInterface() { return this.classIsInterface; } setAbstract(value) { this.classIsAbstract = value; } setInterface(value) { this.classIsInterface = value; } getEAttributes() { if (this.eAttributes === undefined) { this.computeEAllAttributes(); } return this.eAttributes; } getEAllAttributes() { if (this.eAllAttributes === undefined) { this.computeEAllAttributes(); } return this.eAllAttributes; } computeEAllAttributes() { this.eAllAttributes = new BasicEList(); this.eAttributes = new BasicEList(); // Add features from this type const features = this.getEStructuralFeatures(); for (let i = 0; i < features.size(); i++) { const feature = features.get(i); if (feature instanceof EAttributeImpl) { this.eAllAttributes.add(feature); this.eAttributes.add(feature); } } // Add features from all super types const allSuperTypes = this.getEAllSuperTypes(); for (let i = 0; i < allSuperTypes.size(); i++) { const superType = allSuperTypes.get(i); const superAttributes = superType.getEAttributes(); for (let j = 0; j < superAttributes.size(); j++) { this.eAllAttributes.add(superAttributes.get(j)); } } } getEIDAttribute() { return this.getEAllAttributes().find((e) => e.isId()); } createInstance() { return this.getEPackage().getEFactoryInstance().create(this); } isSuperTypeOf(someClass) { if (someClass === this) { return true; } else if (someClass === null) { return false; } else { return someClass.getESuperTypes().some((e) => this.isSuperTypeOf(e)); } } getESuperTypes() { return this.eSuperTypes; } getEAllSuperTypes() { if (this.eAllSuperTypes === undefined) { this.computeEAllSuperTypes(); } return this.eAllSuperTypes; } computeEAllSuperTypes() { this.eAllSuperTypes = new BasicEList(); for (let i = 0; i < this.eSuperTypes.size(); i++) { const st = this.eSuperTypes.get(i); const allSuperTypes = st.getEAllSuperTypes(); for (let j = 0; j < allSuperTypes.size(); j++) { this.eAllSuperTypes.add(allSuperTypes.get(j)); } this.eAllSuperTypes.add(st); } } getEStructuralFeatures() { return this.eStructuralFeatures; } getEAllStructuralFeatures() { if (this.eAllStructuralFeatures === undefined) { this.computeAllStructuralFeatures(); } return this.eAllStructuralFeatures; } computeAllStructuralFeatures() { this.eAllStructuralFeatures = new BasicEList(); // Add features from this type for (let i = 0; i < this.eStructuralFeatures.size(); i++) { this.eAllStructuralFeatures.add(this.eStructuralFeatures.get(i)); } // Add features from all super types const superTypes = this.getESuperTypes(); for (let i = 0; i < superTypes.size(); i++) { const superType = superTypes.get(i); const allStructuralFeatures = superType.getEAllStructuralFeatures(); for (let j = 0; j < allStructuralFeatures.size(); j++) { this.eAllStructuralFeatures.add(allStructuralFeatures.get(j)); } } } /** * Returns the feature identified by either it's feature ID (a number) or * name (a string). * @param featureIdOrName */ getEStructuralFeature(featureIdOrName) { if (typeof featureIdOrName === 'number') return this.getEAllStructuralFeatures().find((e) => e.getFeatureID() === featureIdOrName); else return this.getEAllStructuralFeatures().find((e) => e.getName() === featureIdOrName); } getFeatureCount() { return this.getEAllStructuralFeatures().size(); } getFeatureID(feature) { const features = this.getEStructuralFeatures(); if (feature.getFeatureID() >= 0) return feature.getFeatureID(); for (let i = 0; i < features.size(); i++) { if (features.get(i) === feature) { return i; } } return -1; } //====================================================================== // References getEReferences() { if (this.eReferences === undefined) { this.computeEAllReferences(); } return this.eReferences; } getEAllReferences() { if (this.eAllReferences === undefined) { this.computeEAllReferences(); } return this.eAllReferences; } computeEAllReferences() { this.eAllReferences = new BasicEList(); this.eReferences = new BasicEList(); // Add features from this type for (let i = 0; i < this.eStructuralFeatures.size(); i++) { const feature = this.eStructuralFeatures.get(i); if (feature instanceof EReferenceImpl) { this.eAllReferences.add(feature); this.eReferences.add(feature); } } // Add features from all super types const allSuperTypes = this.getEAllSuperTypes(); for (let i = 0; i < allSuperTypes.size(); i++) { const superType = allSuperTypes.get(i); const references = superType.getEReferences(); for (let j = 0; j < references.size(); j++) { this.eAllReferences.add(references.get(j)); } } } getEAllContainments() { if (this.eAllContainments === undefined) { this.computeEAllContainments(); } return this.eAllContainments; } computeEAllContainments() { this.eAllContainments = new BasicEList(); const allReferences = this.getEAllReferences(); for (let i = 0; i < allReferences.size(); i++) { const f = allReferences.get(i); if (f.isContainment()) { this.eAllContainments.add(f); } } } //====================================================================== // Operations getEOperations() { return this.eOperations; } getEAllOperations() { if (this.eAllOperations === undefined) { this.computeEAllOperations(); } return this.eAllOperations; } computeEAllOperations() { this.eAllOperations = new BasicEList(); this.eAllOperations.addAll(this.getEOperations()); const allSuperTypes = this.getEAllSuperTypes(); for (let i = 0; i < allSuperTypes.size(); i++) { const superType = allSuperTypes.get(i); const operations = superType.getEOperations(); for (let j = 0; j < operations.size(); j++) { this.eAllOperations.add(operations.get(j)); } } } //hacky method for when a metamodel is being manipulated at runtime (e.g. in Ecore Editor) recomputeAllLists() { this.computeEAllSuperTypes(); this.computeAllStructuralFeatures(); this.computeEAllAttributes(); this.computeEAllReferences(); this.computeEAllContainments(); this.computeEAllOperations(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNsYXNzLWltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21ldGFtb2RlbC9pbXBsL2VjbGFzcy1pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV0RCxNQUFNLE9BQU8sVUFBVyxTQUFRLGVBQWU7SUFDckMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFekIsV0FBVyxHQUFrQixJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQzlDLG1CQUFtQixHQUE4QixJQUFJLFVBQVUsRUFBRSxDQUFDO0lBQ2xFLFdBQVcsR0FBc0IsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUUxRCxnQ0FBZ0M7SUFDeEIsV0FBVyxDQUFxQjtJQUNoQyxjQUFjLENBQWlCO0lBQy9CLHNCQUFzQixDQUE2QjtJQUNuRCxXQUFXLENBQXFCO0lBQ2hDLGNBQWMsQ0FBcUI7SUFDbkMsY0FBYyxDQUFxQjtJQUNuQyxnQkFBZ0IsQ0FBcUI7SUFDckMsY0FBYyxDQUFxQjtJQUUzQyxZQUNFLEtBQWdCLEVBQ2hCLElBQWEsRUFDYixRQUFrQixFQUNsQixXQUFxQjtRQUVyQixLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25CLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO1FBQzlDLElBQUksV0FBVztZQUFFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxXQUFXLENBQUM7SUFDdkQsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVNLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUFjO1FBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFTSxZQUFZLENBQUMsS0FBYztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksVUFBVSxFQUFjLENBQUM7UUFDbkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO1FBQ2hELDhCQUE4QjtRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLE9BQU8sWUFBWSxjQUFjLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO1FBQ0Qsb0NBQW9DO1FBQ3BDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTSxlQUFlO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFjLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sYUFBYSxDQUFDLFNBQWlCO1FBQ3BDLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksVUFBVSxFQUFVLENBQUM7UUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFTSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVNLHlCQUF5QjtRQUM5QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztJQUVPLDRCQUE0QjtRQUNsQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxVQUFVLEVBQXNCLENBQUM7UUFDbkUsOEJBQThCO1FBQzlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0Qsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDM0MsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxNQUFNLHFCQUFxQixHQUFHLFNBQVMsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1lBQ3BFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxxQkFBcUIsQ0FDMUIsZUFBZ0M7UUFFaEMsSUFBSSxPQUFPLGVBQWUsS0FBSyxRQUFRO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUMsSUFBSSxDQUMxQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxLQUFLLGVBQWUsQ0FDNUMsQ0FBQzs7WUFFRixPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLElBQUksQ0FDMUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxlQUFlLENBQ3ZDLENBQUM7SUFDTixDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFTSxZQUFZLENBQUMsT0FBMkI7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDL0MsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxhQUFhO0lBRU4sY0FBYztRQUNuQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxVQUFVLEVBQWMsQ0FBQztRQUNoRCw4QkFBOEI7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxPQUFPLFlBQVksY0FBYyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUNELG9DQUFvQztRQUNwQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDOUMsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QyxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO1FBQ3JELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLGFBQWE7SUFFTixjQUFjO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLFVBQVUsRUFBYyxDQUFDO1FBQ25ELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwwRkFBMEY7SUFDbkYsaUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVQYWNrYWdlIH0gZnJvbSAnLi4vYXBpL2VwYWNrYWdlLmpzJztcclxuaW1wb3J0IHsgRU9wZXJhdGlvbiB9IGZyb20gJy4uL2FwaS9lb3BlcmF0aW9uLmpzJztcclxuaW1wb3J0IHsgRUF0dHJpYnV0ZSB9IGZyb20gJy4uL2FwaS9lYXR0cmlidXRlLmpzJztcclxuaW1wb3J0IHsgRVJlZmVyZW5jZSB9IGZyb20gJy4uL2FwaS9lcmVmZXJlbmNlLmpzJztcclxuaW1wb3J0IHsgRVN0cnVjdHVyYWxGZWF0dXJlIH0gZnJvbSAnLi4vYXBpL2VzdHJ1Y3R1cmFsLWZlYXR1cmUuanMnO1xyXG5pbXBvcnQgeyBCYXNpY0VMaXN0IH0gZnJvbSAnLi4vYmFzaWNlbGlzdC5qcyc7XHJcbmltcG9ydCB7IEVMaXN0IH0gZnJvbSAnLi4vYXBpL2VsaXN0LmpzJztcclxuaW1wb3J0IHsgRU9iamVjdCB9IGZyb20gJy4uL2FwaS9lb2JqZWN0LmpzJztcclxuaW1wb3J0IHsgRUF0dHJpYnV0ZUltcGwgfSBmcm9tICcuL2VhdHRyaWJ1dGUtaW1wbC5qcyc7XHJcbmltcG9ydCB7IEVDbGFzc2lmaWVySW1wbCB9IGZyb20gJy4vZWNsYXNzaWZpZXItaW1wbC5qcyc7XHJcbmltcG9ydCB7IEVDbGFzcyB9IGZyb20gJy4uL2FwaS9lY2xhc3MuanMnO1xyXG5pbXBvcnQgeyBFUmVmZXJlbmNlSW1wbCB9IGZyb20gJy4vZXJlZmVyZW5jZS1pbXBsLmpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFQ2xhc3NJbXBsIGV4dGVuZHMgRUNsYXNzaWZpZXJJbXBsIGltcGxlbWVudHMgRUNsYXNzIHtcclxuICBwcml2YXRlIGNsYXNzSXNBYnN0cmFjdCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgY2xhc3NJc0ludGVyZmFjZSA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGVTdXBlclR5cGVzOiBFTGlzdDxFQ2xhc3M+ID0gbmV3IEJhc2ljRUxpc3QoKTtcclxuICBwcml2YXRlIGVTdHJ1Y3R1cmFsRmVhdHVyZXM6IEVMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gPSBuZXcgQmFzaWNFTGlzdCgpO1xyXG4gIHByaXZhdGUgZU9wZXJhdGlvbnM6IEVMaXN0PEVPcGVyYXRpb24+ID0gbmV3IEJhc2ljRUxpc3QoKTtcclxuXHJcbiAgLy8gcHJlLWNvbXB1dGVkIGFuZCBjYWNoZWQgbGlzdHNcclxuICBwcml2YXRlIGVSZWZlcmVuY2VzITogRUxpc3Q8RVJlZmVyZW5jZT47XHJcbiAgcHJpdmF0ZSBlQWxsU3VwZXJUeXBlcyE6IEVMaXN0PEVDbGFzcz47XHJcbiAgcHJpdmF0ZSBlQWxsU3RydWN0dXJhbEZlYXR1cmVzITogRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPjtcclxuICBwcml2YXRlIGVBdHRyaWJ1dGVzITogRUxpc3Q8RUF0dHJpYnV0ZT47XHJcbiAgcHJpdmF0ZSBlQWxsQXR0cmlidXRlcyE6IEVMaXN0PEVBdHRyaWJ1dGU+O1xyXG4gIHByaXZhdGUgZUFsbFJlZmVyZW5jZXMhOiBFTGlzdDxFUmVmZXJlbmNlPjtcclxuICBwcml2YXRlIGVBbGxDb250YWlubWVudHMhOiBFTGlzdDxFUmVmZXJlbmNlPjtcclxuICBwcml2YXRlIGVBbGxPcGVyYXRpb25zITogRUxpc3Q8RU9wZXJhdGlvbj47XHJcblxyXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcclxuICAgIG93bmVyPzogRVBhY2thZ2UsXHJcbiAgICBuYW1lPzogc3RyaW5nLFxyXG4gICAgYWJzdHJhY3Q/OiBib29sZWFuLFxyXG4gICAgaXNJbnRlcmZhY2U/OiBib29sZWFuXHJcbiAgKSB7XHJcbiAgICBzdXBlcihvd25lciwgbmFtZSk7XHJcbiAgICBpZiAoYWJzdHJhY3QpIHRoaXMuY2xhc3NJc0Fic3RyYWN0ID0gYWJzdHJhY3Q7XHJcbiAgICBpZiAoaXNJbnRlcmZhY2UpIHRoaXMuY2xhc3NJc0ludGVyZmFjZSA9IGlzSW50ZXJmYWNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQWJzdHJhY3QoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jbGFzc0lzQWJzdHJhY3Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNJbnRlcmZhY2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jbGFzc0lzSW50ZXJmYWNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFic3RyYWN0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsYXNzSXNBYnN0cmFjdCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEludGVyZmFjZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5jbGFzc0lzSW50ZXJmYWNlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RUF0dHJpYnV0ZXMoKTogRUxpc3Q8RUF0dHJpYnV0ZT4ge1xyXG4gICAgaWYgKHRoaXMuZUF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsQXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZUF0dHJpYnV0ZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RUFsbEF0dHJpYnV0ZXMoKTogRUxpc3Q8RUF0dHJpYnV0ZT4ge1xyXG4gICAgaWYgKHRoaXMuZUFsbEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsQXR0cmlidXRlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZUFsbEF0dHJpYnV0ZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVFQWxsQXR0cmlidXRlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZUFsbEF0dHJpYnV0ZXMgPSBuZXcgQmFzaWNFTGlzdDxFQXR0cmlidXRlPigpO1xyXG4gICAgdGhpcy5lQXR0cmlidXRlcyA9IG5ldyBCYXNpY0VMaXN0PEVBdHRyaWJ1dGU+KCk7XHJcbiAgICAvLyBBZGQgZmVhdHVyZXMgZnJvbSB0aGlzIHR5cGVcclxuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBmZWF0dXJlcy5nZXQoaSk7XHJcbiAgICAgIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZUltcGwpIHtcclxuICAgICAgICB0aGlzLmVBbGxBdHRyaWJ1dGVzLmFkZChmZWF0dXJlKTtcclxuICAgICAgICB0aGlzLmVBdHRyaWJ1dGVzLmFkZChmZWF0dXJlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8gQWRkIGZlYXR1cmVzIGZyb20gYWxsIHN1cGVyIHR5cGVzXHJcbiAgICBjb25zdCBhbGxTdXBlclR5cGVzID0gdGhpcy5nZXRFQWxsU3VwZXJUeXBlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdXBlclR5cGVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN1cGVyVHlwZSA9IGFsbFN1cGVyVHlwZXMuZ2V0KGkpO1xyXG4gICAgICBjb25zdCBzdXBlckF0dHJpYnV0ZXMgPSBzdXBlclR5cGUuZ2V0RUF0dHJpYnV0ZXMoKTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzdXBlckF0dHJpYnV0ZXMuc2l6ZSgpOyBqKyspIHtcclxuICAgICAgICB0aGlzLmVBbGxBdHRyaWJ1dGVzLmFkZChzdXBlckF0dHJpYnV0ZXMuZ2V0KGopKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVJREF0dHJpYnV0ZSgpOiBFQXR0cmlidXRlIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmdldEVBbGxBdHRyaWJ1dGVzKCkuZmluZCgoZSkgPT4gZS5pc0lkKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZUluc3RhbmNlKCk6IEVPYmplY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKHRoaXMgYXMgRUNsYXNzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1N1cGVyVHlwZU9mKHNvbWVDbGFzczogRUNsYXNzKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoc29tZUNsYXNzID09PSB0aGlzKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChzb21lQ2xhc3MgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHNvbWVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLnNvbWUoKGUpID0+IHRoaXMuaXNTdXBlclR5cGVPZihlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RVN1cGVyVHlwZXMoKTogRUxpc3Q8RUNsYXNzPiB7XHJcbiAgICByZXR1cm4gdGhpcy5lU3VwZXJUeXBlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRFQWxsU3VwZXJUeXBlcygpOiBFTGlzdDxFQ2xhc3M+IHtcclxuICAgIGlmICh0aGlzLmVBbGxTdXBlclR5cGVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb21wdXRlRUFsbFN1cGVyVHlwZXMoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmVBbGxTdXBlclR5cGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlRUFsbFN1cGVyVHlwZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVBbGxTdXBlclR5cGVzID0gbmV3IEJhc2ljRUxpc3Q8RUNsYXNzPigpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVTdXBlclR5cGVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN0ID0gdGhpcy5lU3VwZXJUeXBlcy5nZXQoaSk7XHJcbiAgICAgIGNvbnN0IGFsbFN1cGVyVHlwZXMgPSBzdC5nZXRFQWxsU3VwZXJUeXBlcygpO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFsbFN1cGVyVHlwZXMuc2l6ZSgpOyBqKyspIHtcclxuICAgICAgICB0aGlzLmVBbGxTdXBlclR5cGVzLmFkZChhbGxTdXBlclR5cGVzLmdldChqKSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lQWxsU3VwZXJUeXBlcy5hZGQoc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTogRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiB7XHJcbiAgICByZXR1cm4gdGhpcy5lU3RydWN0dXJhbEZlYXR1cmVzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTogRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiB7XHJcbiAgICBpZiAodGhpcy5lQWxsU3RydWN0dXJhbEZlYXR1cmVzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5jb21wdXRlQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lQWxsU3RydWN0dXJhbEZlYXR1cmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lQWxsU3RydWN0dXJhbEZlYXR1cmVzID0gbmV3IEJhc2ljRUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpO1xyXG4gICAgLy8gQWRkIGZlYXR1cmVzIGZyb20gdGhpcyB0eXBlXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZVN0cnVjdHVyYWxGZWF0dXJlcy5zaXplKCk7IGkrKykge1xyXG4gICAgICB0aGlzLmVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMuYWRkKHRoaXMuZVN0cnVjdHVyYWxGZWF0dXJlcy5nZXQoaSkpO1xyXG4gICAgfVxyXG4gICAgLy8gQWRkIGZlYXR1cmVzIGZyb20gYWxsIHN1cGVyIHR5cGVzXHJcbiAgICBjb25zdCBzdXBlclR5cGVzID0gdGhpcy5nZXRFU3VwZXJUeXBlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdXBlclR5cGVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHN1cGVyVHlwZSA9IHN1cGVyVHlwZXMuZ2V0KGkpO1xyXG4gICAgICBjb25zdCBhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPSBzdXBlclR5cGUuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFsbFN0cnVjdHVyYWxGZWF0dXJlcy5zaXplKCk7IGorKykge1xyXG4gICAgICAgIHRoaXMuZUFsbFN0cnVjdHVyYWxGZWF0dXJlcy5hZGQoYWxsU3RydWN0dXJhbEZlYXR1cmVzLmdldChqKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGZlYXR1cmUgaWRlbnRpZmllZCBieSBlaXRoZXIgaXQncyBmZWF0dXJlIElEIChhIG51bWJlcikgb3JcclxuICAgKiBuYW1lIChhIHN0cmluZykuXHJcbiAgICogQHBhcmFtIGZlYXR1cmVJZE9yTmFtZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRFU3RydWN0dXJhbEZlYXR1cmUoXHJcbiAgICBmZWF0dXJlSWRPck5hbWU6IG51bWJlciB8IHN0cmluZ1xyXG4gICk6IEVTdHJ1Y3R1cmFsRmVhdHVyZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodHlwZW9mIGZlYXR1cmVJZE9yTmFtZSA9PT0gJ251bWJlcicpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5maW5kKFxyXG4gICAgICAgIChlKSA9PiBlLmdldEZlYXR1cmVJRCgpID09PSBmZWF0dXJlSWRPck5hbWVcclxuICAgICAgKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLmZpbmQoXHJcbiAgICAgICAgKGUpID0+IGUuZ2V0TmFtZSgpID09PSBmZWF0dXJlSWRPck5hbWVcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGZWF0dXJlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5zaXplKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RmVhdHVyZUlEKGZlYXR1cmU6IEVTdHJ1Y3R1cmFsRmVhdHVyZSk6IG51bWJlciB7XHJcbiAgICBjb25zdCBmZWF0dXJlcyA9IHRoaXMuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpO1xyXG4gICAgaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgPj0gMCkgcmV0dXJuIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGlmIChmZWF0dXJlcy5nZXQoaSkgPT09IGZlYXR1cmUpIHtcclxuICAgICAgICByZXR1cm4gaTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gUmVmZXJlbmNlc1xyXG5cclxuICBwdWJsaWMgZ2V0RVJlZmVyZW5jZXMoKTogRUxpc3Q8RVJlZmVyZW5jZT4ge1xyXG4gICAgaWYgKHRoaXMuZVJlZmVyZW5jZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsUmVmZXJlbmNlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZVJlZmVyZW5jZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RUFsbFJlZmVyZW5jZXMoKTogRUxpc3Q8RVJlZmVyZW5jZT4ge1xyXG4gICAgaWYgKHRoaXMuZUFsbFJlZmVyZW5jZXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsUmVmZXJlbmNlcygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZUFsbFJlZmVyZW5jZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVFQWxsUmVmZXJlbmNlcygpOiB2b2lkIHtcclxuICAgIHRoaXMuZUFsbFJlZmVyZW5jZXMgPSBuZXcgQmFzaWNFTGlzdDxFUmVmZXJlbmNlPigpO1xyXG4gICAgdGhpcy5lUmVmZXJlbmNlcyA9IG5ldyBCYXNpY0VMaXN0PEVSZWZlcmVuY2U+KCk7XHJcbiAgICAvLyBBZGQgZmVhdHVyZXMgZnJvbSB0aGlzIHR5cGVcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lU3RydWN0dXJhbEZlYXR1cmVzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGZlYXR1cmUgPSB0aGlzLmVTdHJ1Y3R1cmFsRmVhdHVyZXMuZ2V0KGkpO1xyXG4gICAgICBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2VJbXBsKSB7XHJcbiAgICAgICAgdGhpcy5lQWxsUmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7XHJcbiAgICAgICAgdGhpcy5lUmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEFkZCBmZWF0dXJlcyBmcm9tIGFsbCBzdXBlciB0eXBlc1xyXG4gICAgY29uc3QgYWxsU3VwZXJUeXBlcyA9IHRoaXMuZ2V0RUFsbFN1cGVyVHlwZXMoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsU3VwZXJUeXBlcy5zaXplKCk7IGkrKykge1xyXG4gICAgICBjb25zdCBzdXBlclR5cGUgPSBhbGxTdXBlclR5cGVzLmdldChpKTtcclxuICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IHN1cGVyVHlwZS5nZXRFUmVmZXJlbmNlcygpO1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZmVyZW5jZXMuc2l6ZSgpOyBqKyspIHtcclxuICAgICAgICB0aGlzLmVBbGxSZWZlcmVuY2VzLmFkZChyZWZlcmVuY2VzLmdldChqKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRFQWxsQ29udGFpbm1lbnRzKCk6IEVMaXN0PEVSZWZlcmVuY2U+IHtcclxuICAgIGlmICh0aGlzLmVBbGxDb250YWlubWVudHMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsQ29udGFpbm1lbnRzKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5lQWxsQ29udGFpbm1lbnRzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlRUFsbENvbnRhaW5tZW50cygpOiB2b2lkIHtcclxuICAgIHRoaXMuZUFsbENvbnRhaW5tZW50cyA9IG5ldyBCYXNpY0VMaXN0PEVSZWZlcmVuY2U+KCk7XHJcbiAgICBjb25zdCBhbGxSZWZlcmVuY2VzID0gdGhpcy5nZXRFQWxsUmVmZXJlbmNlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxSZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGYgPSBhbGxSZWZlcmVuY2VzLmdldChpKTtcclxuICAgICAgaWYgKGYuaXNDb250YWlubWVudCgpKSB7XHJcbiAgICAgICAgdGhpcy5lQWxsQ29udGFpbm1lbnRzLmFkZChmKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgLy8gT3BlcmF0aW9uc1xyXG5cclxuICBwdWJsaWMgZ2V0RU9wZXJhdGlvbnMoKTogRUxpc3Q8RU9wZXJhdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZU9wZXJhdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RUFsbE9wZXJhdGlvbnMoKTogRUxpc3Q8RU9wZXJhdGlvbj4ge1xyXG4gICAgaWYgKHRoaXMuZUFsbE9wZXJhdGlvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmNvbXB1dGVFQWxsT3BlcmF0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZUFsbE9wZXJhdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbXB1dGVFQWxsT3BlcmF0aW9ucygpOiB2b2lkIHtcclxuICAgIHRoaXMuZUFsbE9wZXJhdGlvbnMgPSBuZXcgQmFzaWNFTGlzdDxFT3BlcmF0aW9uPigpO1xyXG4gICAgdGhpcy5lQWxsT3BlcmF0aW9ucy5hZGRBbGwodGhpcy5nZXRFT3BlcmF0aW9ucygpKTtcclxuICAgIGNvbnN0IGFsbFN1cGVyVHlwZXMgPSB0aGlzLmdldEVBbGxTdXBlclR5cGVzKCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFN1cGVyVHlwZXMuc2l6ZSgpOyBpKyspIHtcclxuICAgICAgY29uc3Qgc3VwZXJUeXBlID0gYWxsU3VwZXJUeXBlcy5nZXQoaSk7XHJcbiAgICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBzdXBlclR5cGUuZ2V0RU9wZXJhdGlvbnMoKTtcclxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvcGVyYXRpb25zLnNpemUoKTsgaisrKSB7XHJcbiAgICAgICAgdGhpcy5lQWxsT3BlcmF0aW9ucy5hZGQob3BlcmF0aW9ucy5nZXQoaikpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL2hhY2t5IG1ldGhvZCBmb3Igd2hlbiBhIG1ldGFtb2RlbCBpcyBiZWluZyBtYW5pcHVsYXRlZCBhdCBydW50aW1lIChlLmcuIGluIEVjb3JlIEVkaXRvcilcclxuICBwdWJsaWMgcmVjb21wdXRlQWxsTGlzdHMoKXtcclxuICAgIHRoaXMuY29tcHV0ZUVBbGxTdXBlclR5cGVzKCk7XHJcbiAgICB0aGlzLmNvbXB1dGVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTtcclxuICAgIHRoaXMuY29tcHV0ZUVBbGxBdHRyaWJ1dGVzKCk7XHJcbiAgICB0aGlzLmNvbXB1dGVFQWxsUmVmZXJlbmNlcygpO1xyXG4gICAgdGhpcy5jb21wdXRlRUFsbENvbnRhaW5tZW50cygpO1xyXG4gICAgdGhpcy5jb21wdXRlRUFsbE9wZXJhdGlvbnMoKTtcclxuICB9XHJcbn1cclxuIl19