UNPKG

family-hierarchy

Version:

A small library for **Angular 9+** that implements [vis-network](https://github.com/visjs/vis-network) to generate a hierarchy chart of a family.

232 lines 29.4 kB
import { __decorate, __read, __spread } from "tslib"; import { Injectable } from '@angular/core'; import { Subject, BehaviorSubject } from 'rxjs'; import { DataSet } from 'vis-network/standalone'; import { DEFAULT_CONFIG } from '../config/default'; import { isObject } from 'util'; import * as i0 from "@angular/core"; /* tslint:disable */ var FamilyHierarchyService = /** @class */ (function () { function FamilyHierarchyService() { this.currentEdges = new BehaviorSubject(new DataSet()); this._Edges = this.currentEdges.asObservable(); this.currentNodes = new BehaviorSubject(new DataSet()); this._Nodes = this.currentNodes.asObservable(); this.currentFhNodes = new BehaviorSubject([]); this._fhNodes = this.currentFhNodes.asObservable(); this.currentFhUnions = new BehaviorSubject([]); this._fhUnions = this.currentFhUnions.asObservable(); this.currentFhLinks = new BehaviorSubject([]); this._fhLinks = this.currentFhLinks.asObservable(); this.currentConfig = new BehaviorSubject(DEFAULT_CONFIG); this._config = this.currentConfig.asObservable(); this.init = new Subject(); this._init = this.init.asObservable(); this._clickNode = new Subject(); this.clickNode = this._clickNode.asObservable(); this._clickUnion = new Subject(); this.clickUnion = this._clickUnion.asObservable(); this._clickLink = new Subject(); this.clickLink = this._clickLink.asObservable(); } Object.defineProperty(FamilyHierarchyService.prototype, "Edges", { get: function () { return this._Edges; }, enumerable: true, configurable: true }); Object.defineProperty(FamilyHierarchyService.prototype, "Nodes", { get: function () { return this._Nodes; }, enumerable: true, configurable: true }); FamilyHierarchyService.prototype.setFhNodes = function (nodes) { this.currentNodes.next(this.generateNodes(nodes)); this.currentFhNodes.next(nodes); }; Object.defineProperty(FamilyHierarchyService.prototype, "FhNodes", { get: function () { return this._fhNodes; }, enumerable: true, configurable: true }); FamilyHierarchyService.prototype.setFhUnions = function (unions) { this.generateUnions(unions); this.currentFhUnions.next(unions); }; Object.defineProperty(FamilyHierarchyService.prototype, "FhUnions", { get: function () { return this._fhUnions; }, enumerable: true, configurable: true }); FamilyHierarchyService.prototype.setFhLinks = function (links) { this.currentEdges.next(this.generateEdges(links)); this.currentFhLinks.next(links); }; Object.defineProperty(FamilyHierarchyService.prototype, "FhLinks", { get: function () { return this._fhLinks; }, enumerable: true, configurable: true }); FamilyHierarchyService.prototype.setConfig = function (config) { this.currentConfig.next(this.mergeDeep(this.currentConfig.getValue(), config)); }; Object.defineProperty(FamilyHierarchyService.prototype, "config", { get: function () { return this._config; }, enumerable: true, configurable: true }); FamilyHierarchyService.prototype.sendClickEvent = function (e, type) { if (type === 'node') { var node = this.currentFhNodes.getValue().find(function (el) { return el.id === e.nodes[0]; }); if (node) { this._clickNode.next(node); } else { var id_1 = e.nodes[0].replace('u', ''); var union = this.currentFhUnions.getValue().find(function (el) { return el.id == id_1; }); this._clickUnion.next(union); } } else { var link = this.currentFhLinks.getValue().find(function (el) { return el.id == e.edges[0]; }); if (link) { this._clickLink.next(link); } else { var regex = /(?<=l)(.*?)(?=_)/; var id_2 = e.edges[0].toString().match(regex)[0]; this._clickLink.next(this.currentFhUnions.getValue().find(function (o) { return o.id == id_2; })); } } }; FamilyHierarchyService.prototype.initialize = function (data, config) { this.currentFhLinks.next(data.links); this.currentFhNodes.next(data.nodes); this.currentFhUnions.next(data.unions); this.currentEdges.next(this.generateEdges(data.links)), this.currentNodes.next(this.generateNodes(data.nodes)); this.generateUnions(data.unions); if (config) { this.setConfig(config); } this.init.next(true); }; FamilyHierarchyService.prototype.mergeDeep = function (target) { var _a, _b; var sources = []; for (var _i = 1; _i < arguments.length; _i++) { sources[_i - 1] = arguments[_i]; } if (!sources.length) { return target; } var source = sources.shift(); if (isObject(target) && isObject(source)) { for (var key in source) { if (isObject(source[key])) { if (!target[key]) { Object.assign(target, (_a = {}, _a[key] = {}, _a)); } else { target[key] = Object.assign({}, target[key]); } this.mergeDeep(target[key], source[key]); } else { Object.assign(target, (_b = {}, _b[key] = source[key], _b)); } } } return this.mergeDeep.apply(this, __spread([target], sources)); }; FamilyHierarchyService.prototype.generateNodes = function (nodes) { var _this = this; return new DataSet(nodes.map(function (o) { return _this.createNode(o); })); }; FamilyHierarchyService.prototype.createNode = function (o) { return { id: o.id, image: o.image ? o.image : this.currentConfig.getValue().nodes.images, shape: 'image', size: this.currentConfig.getValue().nodes.size, level: (o.level * 2) - 1, label: o.label }; }; FamilyHierarchyService.prototype.createEdge = function (o) { return { id: o.id, from: o.nodeId, to: "u" + o.unionId, color: this.currentConfig.getValue().links.childrens.styles }; }; FamilyHierarchyService.prototype.generateEdges = function (links) { var _this = this; return new DataSet(links.map(function (o) { return _this.createEdge(o); })); }; FamilyHierarchyService.prototype.generateUnions = function (unions) { var _this = this; unions.forEach(function (u) { _this.createUnion(u); }); }; FamilyHierarchyService.prototype.createUnion = function (u) { var _this = this; var level; var node = { id: "u" + u.id, image: this.currentConfig.getValue().union.images, shape: 'image', size: this.currentConfig.getValue().union.size, }; u.components.forEach(function (e) { var edge = { id: "l" + u.id + "_" + node.id + "-" + e, from: node.id, to: e, color: _this.currentConfig.getValue().links.parents.styles, }; level = _this.currentFhNodes.getValue().filter(function (n) { return n.id === e; })[0].level; _this.currentEdges.getValue().add(edge); }); node.level = (level * 2); this.currentNodes.getValue().add(node); }; FamilyHierarchyService.prototype.addNode = function (node) { this.currentFhNodes.getValue().push(node); this.currentNodes.getValue().add(this.createNode(node)); }; FamilyHierarchyService.prototype.addLink = function (link) { this.currentFhLinks.getValue().push(link); this.currentEdges.getValue().add(this.createEdge(link)); }; FamilyHierarchyService.prototype.addUnion = function (union) { this.currentFhUnions.getValue().push(union); this.createUnion(union); }; FamilyHierarchyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FamilyHierarchyService_Factory() { return new FamilyHierarchyService(); }, token: FamilyHierarchyService, providedIn: "root" }); FamilyHierarchyService = __decorate([ Injectable({ providedIn: 'root' }) ], FamilyHierarchyService); return FamilyHierarchyService; }()); export { FamilyHierarchyService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaWx5LWhpZXJhcmNoeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFtaWx5LWhpZXJhcmNoeS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL2ZhbWlseS1oaWVyYXJjaHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUU1RCxPQUFPLEVBQUUsT0FBTyxFQUFvQixNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUVoQyxvQkFBb0I7QUFLcEI7SUF3RkU7UUF2RlEsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxPQUFPLEVBQVEsQ0FBQyxDQUFDO1FBQ3ZFLFdBQU0sR0FBK0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU10RSxpQkFBWSxHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLE9BQU8sRUFBUSxDQUFDLENBQUM7UUFDdkUsV0FBTSxHQUErQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBTXRFLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVksRUFBRSxDQUFDLENBQUM7UUFDckQsYUFBUSxHQUEwQixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBU3BFLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQWEsRUFBRSxDQUFDLENBQUM7UUFDdkQsY0FBUyxHQUEyQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBU3ZFLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVksRUFBRSxDQUFDLENBQUM7UUFDckQsYUFBUSxHQUEwQixJQUFJLENB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QUksQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVNLHdDQUFPLEdBQWQsVUFBZSxJQUFZO1FBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0seUNBQVEsR0FBZixVQUFnQixLQUFjO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQzs7SUE5TVUsc0JBQXNCO1FBSGxDLFVBQVUsQ0FBQztZQUNWLFVBQVUsRUFBRSxNQUFNO1NBQ25CLENBQUM7T0FDVyxzQkFBc0IsQ0ErTWxDO2lDQTNORDtDQTJOQyxBQS9NRCxJQStNQztTQS9NWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGaE5vZGUsIEZoVW5pb24sIEZoTGluaywgRmhDb25maWcsIEZoRGF0YSB9IGZyb20gJy4uL21vZGVscy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBEYXRhU2V0LCBOb2RlLCBFZGdlLCBEYXRhIH0gZnJvbSAndmlzLW5ldHdvcmsvc3RhbmRhbG9uZSc7XHJcbmltcG9ydCB7IERFRkFVTFRfQ09ORklHIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQnO1xyXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJ3V0aWwnO1xyXG5cclxuLyogdHNsaW50OmRpc2FibGUgKi9cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZhbWlseUhpZXJhcmNoeVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgY3VycmVudEVkZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU2V0PEVkZ2U+PihuZXcgRGF0YVNldDxFZGdlPigpKTtcclxuICBwcml2YXRlIF9FZGdlcyA6IE9ic2VydmFibGU8RGF0YVNldDxFZGdlPj4gPSB0aGlzLmN1cnJlbnRFZGdlcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHVibGljIGdldCBFZGdlcygpOiBPYnNlcnZhYmxlPERhdGFTZXQ8RWRnZT4+IHtcclxuICAgIHJldHVybiB0aGlzLl9FZGdlcztcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBjdXJyZW50Tm9kZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTZXQ8Tm9kZT4+KG5ldyBEYXRhU2V0PE5vZGU+KCkpO1xyXG4gIHByaXZhdGUgX05vZGVzIDogT2JzZXJ2YWJsZTxEYXRhU2V0PE5vZGU+PiA9IHRoaXMuY3VycmVudE5vZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwdWJsaWMgZ2V0IE5vZGVzKCk6IE9ic2VydmFibGU8RGF0YVNldDxOb2RlPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX05vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhOb2RlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhOb2RlIFtdPihbXSk7XHJcbiAgcHVibGljIF9maE5vZGVzOiBPYnNlcnZhYmxlPEZoTm9kZSBbXT4gPSB0aGlzLmN1cnJlbnRGaE5vZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBzZXRGaE5vZGVzKG5vZGVzOiBGaE5vZGUgW10pIHtcclxuICAgIHRoaXMuY3VycmVudE5vZGVzLm5leHQodGhpcy5nZW5lcmF0ZU5vZGVzKG5vZGVzKSk7XHJcbiAgICB0aGlzLmN1cnJlbnRGaE5vZGVzLm5leHQobm9kZXMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IEZoTm9kZXMoKTogT2JzZXJ2YWJsZTxGaE5vZGUgW10+IHtcclxuICAgIHJldHVybiB0aGlzLl9maE5vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhVbmlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZoVW5pb24gW10+KFtdKTtcclxuICBwdWJsaWMgX2ZoVW5pb25zOiBPYnNlcnZhYmxlPEZoVW5pb24gW10+ID0gdGhpcy5jdXJyZW50RmhVbmlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHVibGljIHNldEZoVW5pb25zKHVuaW9uczogRmhVbmlvbiBbXSkge1xyXG4gICAgdGhpcy5nZW5lcmF0ZVVuaW9ucyh1bmlvbnMpO1xyXG4gICAgdGhpcy5jdXJyZW50RmhVbmlvbnMubmV4dCh1bmlvbnMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IEZoVW5pb25zKCk6IE9ic2VydmFibGU8RmhVbmlvbiBbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZoVW5pb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhMaW5rcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhMaW5rIFtdPihbXSk7XHJcbiAgcHVibGljIF9maExpbmtzOiBPYnNlcnZhYmxlPEZoTGluayBbXT4gPSB0aGlzLmN1cnJlbnRGaExpbmtzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBzZXRGaExpbmtzKGxpbmtzOiBGaExpbmsgW10pIHtcclxuICAgIHRoaXMuY3VycmVudEVkZ2VzLm5leHQodGhpcy5nZW5lcmF0ZUVkZ2VzKGxpbmtzKSlcclxuICAgIHRoaXMuY3VycmVudEZoTGlua3MubmV4dChsaW5rcyk7XHJcbiAgfVxyXG4gIGdldCBGaExpbmtzKCk6IE9ic2VydmFibGU8RmhMaW5rIFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmhMaW5rcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3VycmVudENvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhDb25maWc+KERFRkFVTFRfQ09ORklHKTtcclxuICBwdWJsaWMgX2NvbmZpZzogT2JzZXJ2YWJsZTxGaENvbmZpZz4gPSB0aGlzLmN1cnJlbnRDb25maWcuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHVibGljIHNldENvbmZpZyhjb25maWc6IEZoQ29uZmlnKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRDb25maWcubmV4dCh0aGlzLm1lcmdlRGVlcCh0aGlzLmN1cnJlbnRDb25maWcuZ2V0VmFsdWUoKSwgY29uZmlnKSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IE9ic2VydmFibGU8RmhDb25maWc+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHB1YmxpYyBfaW5pdDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaW5pdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfY2xpY2tOb2RlID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHB1YmxpYyBjbGlja05vZGUgPSB0aGlzLl9jbGlja05vZGUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2NsaWNrVW5pb24gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIGNsaWNrVW5pb24gPSB0aGlzLl9jbGlja1VuaW9uLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9jbGlja0xpbmsgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIGNsaWNrTGluayA9IHRoaXMuX2NsaWNrTGluay5hc09ic2VydmFibGUoKTtcclxuICBcclxuICBwdWJsaWMgc2VuZENsaWNrRXZlbnQoZTogYW55LCB0eXBlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ25vZGUnKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRGaE5vZGVzLmdldFZhbHVlKCkuZmluZCggZWwgPT4gZWwuaWQgPT09IGUubm9kZXNbMF0pO1xyXG4gICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuX2NsaWNrTm9kZS5uZXh0KG5vZGUpO1xyXG4gICAgICB9IGVsc2UgeyBcclxuICAgICAgICBjb25zdCBpZCA9IGUubm9kZXNbMF0ucmVwbGFjZSgndScsJycpO1xyXG4gICAgICAgIGNvbnN0IHVuaW9uID0gdGhpcy5jdXJyZW50RmhVbmlvbnMuZ2V0VmFsdWUoKS5maW5kKCBlbCA9PiBlbC5pZCA9PSBpZClcclxuICAgICAgICB0aGlzLl9jbGlja1VuaW9uLm5leHQodW5pb24pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBsaW5rICA9IHRoaXMuY3VycmVudEZoTGlua3MuZ2V0VmFsdWUoKS5maW5kKCBlbCA9PiBlbC5pZCA9PSBlLmVkZ2VzWzBdKTtcclxuICAgICAgaWYgKGxpbmspIHtcclxuICAgICAgICB0aGlzLl9jbGlja0xpbmsubmV4dChsaW5rKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByZWdleCA9IC8oPzw9bCkoLio/KSg/PV8pLztcclxuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gZS5lZGdlc1swXS50b1N0cmluZygpLm1hdGNoKHJlZ2V4KVswXTtcclxuICAgICAgICB0aGlzLl9jbGlja0xpbmsubmV4dCh0aGlzLmN1cnJlbnRGaFVuaW9ucy5nZXRWYWx1ZSgpLmZpbmQoIG8gPT4gby5pZCA9PSBpZCkgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplKGRhdGE6IEZoRGF0YSwgY29uZmlnPzogRmhDb25maWcpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEZoTGlua3MubmV4dChkYXRhLmxpbmtzKTtcclxuICAgIHRoaXMuY3VycmVudEZoTm9kZXMubmV4dChkYXRhLm5vZGVzKTtcclxuICAgIHRoaXMuY3VycmVudEZoVW5pb25zLm5leHQoZGF0YS51bmlvbnMpO1xyXG4gICAgdGhpcy5jdXJyZW50RWRnZXMubmV4dCh0aGlzLmdlbmVyYXRlRWRnZXMoZGF0YS5saW5rcykpLFxyXG4gICAgdGhpcy5jdXJyZW50Tm9kZXMubmV4dCh0aGlzLmdlbmVyYXRlTm9kZXMoZGF0YS5ub2RlcykpXHJcbiAgICB0aGlzLmdlbmVyYXRlVW5pb25zKGRhdGEudW5pb25zKTtcclxuXHJcbiAgICBpZiAoY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0Lm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlRGVlcCh0YXJnZXQsIC4uLnNvdXJjZXMpIHtcclxuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHsgcmV0dXJuIHRhcmdldDsgfVxyXG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xyXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XHJcbiAgICAgICAgICBpZiAoIXRhcmdldFtrZXldKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiB7fSB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0W2tleV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5tZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlTm9kZXMobm9kZXM6IEZoTm9kZSBbXSk6IERhdGFTZXQ8Tm9kZT4ge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRhU2V0PE5vZGU+IChcclxuICAgICAgbm9kZXMubWFwKFxyXG4gICAgICAgIChvOiBGaE5vZGUpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vZGUobyk7XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOb2RlKG86IEZoTm9kZSk6IE5vZGUge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQgOiBvLmlkLFxyXG4gICAgICBpbWFnZSA6IG8uaW1hZ2UgPyBvLmltYWdlIDogdGhpcy5jdXJyZW50Q29uZmlnLmdldFZhbHVlKCkubm9kZXMuaW1hZ2VzLFxyXG4gICAgICBzaGFwZTogJ2ltYWdlJyxcclxuICAgICAgc2l6ZSA6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLm5vZGVzLnNpemUsXHJcbiAgICAgIGxldmVsIDogKG8ubGV2ZWwgKiAyKSAtIDEsXHJcbiAgICAgIGxhYmVsIDogby5sYWJlbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRWRnZShvOiBGaExpbmspOiBFZGdlIHtcclxuICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IG8uaWQsXHJcbiAgICAgIGZyb206IG8ubm9kZUlkLFxyXG4gICAgICB0bzogYHUke28udW5pb25JZH1gLFxyXG4gICAgICBjb2xvcjogdGhpcy5jdXJyZW50Q29uZmlnLmdldFZhbHVlKCkubGlua3MuY2hpbGRyZW5zLnN0eWxlc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVFZGdlcyhsaW5rczogRmhMaW5rIFtdKTogRGF0YVNldDxFZGdlPiB7XHJcbiAgICByZXR1cm4gbmV3IERhdGFTZXQ8RWRnZT4gKFxyXG4gICAgICBsaW5rcy5tYXAoXHJcbiAgICAgICAgKG86IEZoTGluaykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRWRnZShvKTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlVW5pb25zKHVuaW9uczogRmhVbmlvbiBbXSk6IHZvaWQge1xyXG4gICAgdW5pb25zLmZvckVhY2goKHU6IEZoVW5pb24pID0+IHtcclxuICAgICAgdGhpcy5jcmVhdGVVbmlvbih1KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVbmlvbih1OiBGaFVuaW9uKTogdm9pZCB7XHJcbiAgICBsZXQgbGV2ZWw7XHJcbiAgICBjb25zdCBub2RlOiBOb2RlID0ge1xyXG4gICAgICBpZDogYHUke3UuaWR9YCxcclxuICAgICAgaW1hZ2U6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLnVuaW9uLmltYWdlcyxcclxuICAgICAgc2hhcGU6ICdpbWFnZScsXHJcbiAgICAgIHNpemU6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLnVuaW9uLnNpemUsXHJcbiAgICB9O1xyXG4gICAgdS5jb21wb25lbnRzLmZvckVhY2goKGU6bnVtYmVyIHwgc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVkZ2U6IEVkZ2UgPSB7XHJcbiAgICAgICAgaWQ6IGBsJHt1LmlkfV8ke25vZGUuaWR9LSR7ZX1gLFxyXG4gICAgICAgIGZyb206IG5vZGUuaWQsXHJcbiAgICAgICAgdG86IGUsXHJcbiAgICAgICAgY29sb3I6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLmxpbmtzLnBhcmVudHMuc3R5bGVzLFxyXG4gICAgICB9O1xyXG4gICAgICBsZXZlbCA9IHRoaXMuY3VycmVudEZoTm9kZXMuZ2V0VmFsdWUoKS5maWx0ZXIoIG4gPT4gbi5pZCA9PT0gZSlbMF0ubGV2ZWw7XHJcbiAgICAgIHRoaXMuY3VycmVudEVkZ2VzLmdldFZhbHVlKCkuYWRkKGVkZ2UpO1xyXG4gICAgfSk7XHJcbiAgICBub2RlLmxldmVsID0gKGxldmVsICogMik7XHJcbiAgICB0aGlzLmN1cnJlbnROb2Rlcy5nZXRWYWx1ZSgpLmFkZChub2RlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGROb2RlKG5vZGU6IEZoTm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50RmhOb2Rlcy5nZXRWYWx1ZSgpLnB1c2gobm9kZSk7XHJcbiAgICB0aGlzLmN1cnJlbnROb2Rlcy5nZXRWYWx1ZSgpLmFkZCh0aGlzLmNyZWF0ZU5vZGUobm9kZSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZExpbmsobGluazogRmhMaW5rKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRGaExpbmtzLmdldFZhbHVlKCkucHVzaChsaW5rKTtcclxuICAgIHRoaXMuY3VycmVudEVkZ2VzLmdldFZhbHVlKCkuYWRkKHRoaXMuY3JlYXRlRWRnZShsaW5rKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkVW5pb24odW5pb246IEZoVW5pb24pOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEZoVW5pb25zLmdldFZhbHVlKCkucHVzaCh1bmlvbik7XHJcbiAgICB0aGlzLmNyZWF0ZVVuaW9uKHVuaW9uKTtcclxuICB9XHJcbn1cclxuIl19