UNPKG

20.2 kBJavaScriptView Raw
1var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4 else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5 return c > 3 && r && Object.defineProperty(target, key, r), r;
6};
7var __metadata = (this && this.__metadata) || function (k, v) {
8 if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9};
10import { Component, ContentChild, EventEmitter, HostListener, Input, Output, TemplateRef, ViewChild } from '@angular/core';
11import { TreeModel } from '../models/tree.model';
12import { TreeDraggedElement } from '../models/tree-dragged-element.model';
13import { TreeOptions } from '../models/tree-options.model';
14import { TreeViewportComponent } from './tree-viewport.component';
15import includes from 'lodash/includes';
16import pick from 'lodash/pick';
17var TreeComponent = /** @class */ (function () {
18 function TreeComponent(treeModel, treeDraggedElement) {
19 var _this = this;
20 this.treeModel = treeModel;
21 this.treeDraggedElement = treeDraggedElement;
22 treeModel.eventNames.forEach(function (name) { return _this[name] = new EventEmitter(); });
23 treeModel.subscribeToState(function (state) { return _this.stateChange.emit(state); });
24 }
25 Object.defineProperty(TreeComponent.prototype, "nodes", {
26 // Will be handled in ngOnChanges
27 set: function (nodes) {
28 },
29 enumerable: true,
30 configurable: true
31 });
32 ;
33 Object.defineProperty(TreeComponent.prototype, "options", {
34 set: function (options) {
35 },
36 enumerable: true,
37 configurable: true
38 });
39 ;
40 Object.defineProperty(TreeComponent.prototype, "focused", {
41 set: function (value) {
42 this.treeModel.setFocus(value);
43 },
44 enumerable: true,
45 configurable: true
46 });
47 Object.defineProperty(TreeComponent.prototype, "state", {
48 set: function (state) {
49 this.treeModel.setState(state);
50 },
51 enumerable: true,
52 configurable: true
53 });
54 TreeComponent.prototype.onKeydown = function ($event) {
55 if (!this.treeModel.isFocused)
56 return;
57 if (includes(['input', 'textarea'], document.activeElement.tagName.toLowerCase()))
58 return;
59 var focusedNode = this.treeModel.getFocusedNode();
60 this.treeModel.performKeyAction(focusedNode, $event);
61 };
62 TreeComponent.prototype.onMousedown = function ($event) {
63 function isOutsideClick(startElement, nodeName) {
64 return !startElement ? true : startElement.localName === nodeName ? false : isOutsideClick(startElement.parentElement, nodeName);
65 }
66 if (isOutsideClick($event.target, 'tree-root')) {
67 this.treeModel.setFocus(false);
68 }
69 };
70 TreeComponent.prototype.ngOnChanges = function (changes) {
71 if (changes.options || changes.nodes) {
72 this.treeModel.setData({
73 options: changes.options && changes.options.currentValue,
74 nodes: changes.nodes && changes.nodes.currentValue,
75 events: pick(this, this.treeModel.eventNames)
76 });
77 }
78 };
79 TreeComponent.prototype.sizeChanged = function () {
80 this.viewportComponent.setViewport();
81 };
82 __decorate([
83 ContentChild('loadingTemplate', { static: false }),
84 __metadata("design:type", TemplateRef)
85 ], TreeComponent.prototype, "loadingTemplate", void 0);
86 __decorate([
87 ContentChild('treeNodeTemplate', { static: false }),
88 __metadata("design:type", TemplateRef)
89 ], TreeComponent.prototype, "treeNodeTemplate", void 0);
90 __decorate([
91 ContentChild('treeNodeWrapperTemplate', { static: false }),
92 __metadata("design:type", TemplateRef)
93 ], TreeComponent.prototype, "treeNodeWrapperTemplate", void 0);
94 __decorate([
95 ContentChild('treeNodeFullTemplate', { static: false }),
96 __metadata("design:type", TemplateRef)
97 ], TreeComponent.prototype, "treeNodeFullTemplate", void 0);
98 __decorate([
99 ViewChild('viewport', { static: false }),
100 __metadata("design:type", TreeViewportComponent)
101 ], TreeComponent.prototype, "viewportComponent", void 0);
102 __decorate([
103 Input(),
104 __metadata("design:type", Array),
105 __metadata("design:paramtypes", [Array])
106 ], TreeComponent.prototype, "nodes", null);
107 __decorate([
108 Input(),
109 __metadata("design:type", TreeOptions),
110 __metadata("design:paramtypes", [TreeOptions])
111 ], TreeComponent.prototype, "options", null);
112 __decorate([
113 Input(),
114 __metadata("design:type", Boolean),
115 __metadata("design:paramtypes", [Boolean])
116 ], TreeComponent.prototype, "focused", null);
117 __decorate([
118 Input(),
119 __metadata("design:type", Object),
120 __metadata("design:paramtypes", [Object])
121 ], TreeComponent.prototype, "state", null);
122 __decorate([
123 Output(),
124 __metadata("design:type", Object)
125 ], TreeComponent.prototype, "toggleExpanded", void 0);
126 __decorate([
127 Output(),
128 __metadata("design:type", Object)
129 ], TreeComponent.prototype, "activate", void 0);
130 __decorate([
131 Output(),
132 __metadata("design:type", Object)
133 ], TreeComponent.prototype, "deactivate", void 0);
134 __decorate([
135 Output(),
136 __metadata("design:type", Object)
137 ], TreeComponent.prototype, "nodeActivate", void 0);
138 __decorate([
139 Output(),
140 __metadata("design:type", Object)
141 ], TreeComponent.prototype, "nodeDeactivate", void 0);
142 __decorate([
143 Output(),
144 __metadata("design:type", Object)
145 ], TreeComponent.prototype, "select", void 0);
146 __decorate([
147 Output(),
148 __metadata("design:type", Object)
149 ], TreeComponent.prototype, "deselect", void 0);
150 __decorate([
151 Output(),
152 __metadata("design:type", Object)
153 ], TreeComponent.prototype, "focus", void 0);
154 __decorate([
155 Output(),
156 __metadata("design:type", Object)
157 ], TreeComponent.prototype, "blur", void 0);
158 __decorate([
159 Output(),
160 __metadata("design:type", Object)
161 ], TreeComponent.prototype, "updateData", void 0);
162 __decorate([
163 Output(),
164 __metadata("design:type", Object)
165 ], TreeComponent.prototype, "initialized", void 0);
166 __decorate([
167 Output(),
168 __metadata("design:type", Object)
169 ], TreeComponent.prototype, "moveNode", void 0);
170 __decorate([
171 Output(),
172 __metadata("design:type", Object)
173 ], TreeComponent.prototype, "copyNode", void 0);
174 __decorate([
175 Output(),
176 __metadata("design:type", Object)
177 ], TreeComponent.prototype, "loadNodeChildren", void 0);
178 __decorate([
179 Output(),
180 __metadata("design:type", Object)
181 ], TreeComponent.prototype, "changeFilter", void 0);
182 __decorate([
183 Output(),
184 __metadata("design:type", Object)
185 ], TreeComponent.prototype, "event", void 0);
186 __decorate([
187 Output(),
188 __metadata("design:type", Object)
189 ], TreeComponent.prototype, "stateChange", void 0);
190 __decorate([
191 HostListener('body: keydown', ['$event']),
192 __metadata("design:type", Function),
193 __metadata("design:paramtypes", [Object]),
194 __metadata("design:returntype", void 0)
195 ], TreeComponent.prototype, "onKeydown", null);
196 __decorate([
197 HostListener('body: mousedown', ['$event']),
198 __metadata("design:type", Function),
199 __metadata("design:paramtypes", [Object]),
200 __metadata("design:returntype", void 0)
201 ], TreeComponent.prototype, "onMousedown", null);
202 TreeComponent = __decorate([
203 Component({
204 selector: 'Tree, tree-root',
205 providers: [TreeModel],
206 styles: [],
207 template: "\n <tree-viewport #viewport>\n <div\n class=\"angular-tree-component\"\n [class.node-dragging]=\"treeDraggedElement.isDragging()\"\n [class.angular-tree-component-rtl]=\"treeModel.options.rtl\">\n <tree-node-collection\n *ngIf=\"treeModel.roots\"\n [nodes]=\"treeModel.roots\"\n [treeModel]=\"treeModel\"\n [templates]=\"{\n loadingTemplate: loadingTemplate,\n treeNodeTemplate: treeNodeTemplate,\n treeNodeWrapperTemplate: treeNodeWrapperTemplate,\n treeNodeFullTemplate: treeNodeFullTemplate\n }\">\n </tree-node-collection>\n <tree-node-drop-slot\n class=\"empty-tree-drop-slot\"\n *ngIf=\"treeModel.isEmptyTree()\"\n [dropIndex]=\"0\"\n [node]=\"treeModel.virtualRoot\">\n </tree-node-drop-slot>\n </div>\n </tree-viewport>\n "
208 }),
209 __metadata("design:paramtypes", [TreeModel,
210 TreeDraggedElement])
211 ], TreeComponent);
212 return TreeComponent;
213}());
214export { TreeComponent };
215//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvY29tcG9uZW50cy90cmVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRWxFLE9BQU8sUUFBUSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQWlDL0I7SUEyQ0UsdUJBQ1MsU0FBb0IsRUFDcEIsa0JBQXNDO1FBRi9DLGlCQU1DO1FBTFEsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUNwQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBRTdDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBSSxJQUFLLE9BQUEsS0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLEVBQS9CLENBQStCLENBQUMsQ0FBQztRQUN4RSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsVUFBQyxLQUFLLElBQUssT0FBQSxLQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBNUIsQ0FBNEIsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUF0Q1Esc0JBQUksZ0NBQUs7UUFEbEIsaUNBQWlDO2FBQ3hCLFVBQVUsS0FBWTtRQUMvQixDQUFDOzs7T0FB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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyZWVNb2RlbCB9IGZyb20gJy4uL21vZGVscy90cmVlLm1vZGVsJztcbmltcG9ydCB7IFRyZWVEcmFnZ2VkRWxlbWVudCB9IGZyb20gJy4uL21vZGVscy90cmVlLWRyYWdnZWQtZWxlbWVudC5tb2RlbCc7XG5pbXBvcnQgeyBUcmVlT3B0aW9ucyB9IGZyb20gJy4uL21vZGVscy90cmVlLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgVHJlZVZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi90cmVlLXZpZXdwb3J0LmNvbXBvbmVudCc7XG5cbmltcG9ydCBpbmNsdWRlcyBmcm9tICdsb2Rhc2gvaW5jbHVkZXMnO1xuaW1wb3J0IHBpY2sgZnJvbSAnbG9kYXNoL3BpY2snO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdUcmVlLCB0cmVlLXJvb3QnLFxuICBwcm92aWRlcnM6IFtUcmVlTW9kZWxdLFxuICBzdHlsZXM6IFtdLFxuICB0ZW1wbGF0ZTogYFxuICAgICAgPHRyZWUtdmlld3BvcnQgI3ZpZXdwb3J0PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYW5ndWxhci10cmVlLWNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mubm9kZS1kcmFnZ2luZ109XCJ0cmVlRHJhZ2dlZEVsZW1lbnQuaXNEcmFnZ2luZygpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5hbmd1bGFyLXRyZWUtY29tcG9uZW50LXJ0bF09XCJ0cmVlTW9kZWwub3B0aW9ucy5ydGxcIj5cbiAgICAgICAgICAgICAgPHRyZWUtbm9kZS1jb2xsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0cmVlTW9kZWwucm9vdHNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtub2Rlc109XCJ0cmVlTW9kZWwucm9vdHNcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0cmVlTW9kZWxdPVwidHJlZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVzXT1cIntcbiAgICAgICAgICAgIGxvYWRpbmdUZW1wbGF0ZTogbG9hZGluZ1RlbXBsYXRlLFxuICAgICAgICAgICAgdHJlZU5vZGVUZW1wbGF0ZTogdHJlZU5vZGVUZW1wbGF0ZSxcbiAgICAgICAgICAgIHRyZWVOb2RlV3JhcHBlclRlbXBsYXRlOiB0cmVlTm9kZVdyYXBwZXJUZW1wbGF0ZSxcbiAgICAgICAgICAgIHRyZWVOb2RlRnVsbFRlbXBsYXRlOiB0cmVlTm9kZUZ1bGxUZW1wbGF0ZVxuICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgPC90cmVlLW5vZGUtY29sbGVjdGlvbj5cbiAgICAgICAgICAgICAgPHRyZWUtbm9kZS1kcm9wLXNsb3RcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImVtcHR5LXRyZWUtZHJvcC1zbG90XCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRyZWVNb2RlbC5pc0VtcHR5VHJlZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZHJvcEluZGV4XT1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cInRyZWVNb2RlbC52aXJ0dWFsUm9vdFwiPlxuICAgICAgICAgICAgICA8L3RyZWUtbm9kZS1kcm9wLXNsb3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICA8L3RyZWUtdmlld3BvcnQ+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgVHJlZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIF9ub2RlczogYW55W107XG4gIF9vcHRpb25zOiBUcmVlT3B0aW9ucztcblxuICBAQ29udGVudENoaWxkKCdsb2FkaW5nVGVtcGxhdGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgbG9hZGluZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCd0cmVlTm9kZVRlbXBsYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRyZWVOb2RlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ3RyZWVOb2RlV3JhcHBlclRlbXBsYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRyZWVOb2RlV3JhcHBlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCd0cmVlTm9kZUZ1bGxUZW1wbGF0ZScsIHsgc3RhdGljOiBmYWxzZSB9KSB0cmVlTm9kZUZ1bGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgQFZpZXdDaGlsZCgndmlld3BvcnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgdmlld3BvcnRDb21wb25lbnQ6IFRyZWVWaWV3cG9ydENvbXBvbmVudDtcblxuICAvLyBXaWxsIGJlIGhhbmRsZWQgaW4gbmdPbkNoYW5nZXNcbiAgQElucHV0KCkgc2V0IG5vZGVzKG5vZGVzOiBhbnlbXSkge1xuICB9O1xuXG4gIEBJbnB1dCgpIHNldCBvcHRpb25zKG9wdGlvbnM6IFRyZWVPcHRpb25zKSB7XG4gIH07XG5cbiAgQElucHV0KCkgc2V0IGZvY3VzZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRyZWVNb2RlbC5zZXRGb2N1cyh2YWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc3RhdGUoc3RhdGUpIHtcbiAgICB0aGlzLnRyZWVNb2RlbC5zZXRTdGF0ZShzdGF0ZSk7XG4gIH1cblxuICBAT3V0cHV0KCkgdG9nZ2xlRXhwYW5kZWQ7XG4gIEBPdXRwdXQoKSBhY3RpdmF0ZTtcbiAgQE91dHB1dCgpIGRlYWN0aXZhdGU7XG4gIEBPdXRwdXQoKSBub2RlQWN0aXZhdGU7XG4gIEBPdXRwdXQoKSBub2RlRGVhY3RpdmF0ZTtcbiAgQE91dHB1dCgpIHNlbGVjdDtcbiAgQE91dHB1dCgpIGRlc2VsZWN0O1xuICBAT3V0cHV0KCkgZm9jdXM7XG4gIEBPdXRwdXQoKSBibHVyO1xuICBAT3V0cHV0KCkgdXBkYXRlRGF0YTtcbiAgQE91dHB1dCgpIGluaXRpYWxpemVkO1xuICBAT3V0cHV0KCkgbW92ZU5vZGU7XG4gIEBPdXRwdXQoKSBjb3B5Tm9kZTtcbiAgQE91dHB1dCgpIGxvYWROb2RlQ2hpbGRyZW47XG4gIEBPdXRwdXQoKSBjaGFuZ2VGaWx0ZXI7XG4gIEBPdXRwdXQoKSBldmVudDtcbiAgQE91dHB1dCgpIHN0YXRlQ2hhbmdlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0cmVlTW9kZWw6IFRyZWVNb2RlbCxcbiAgICBwdWJsaWMgdHJlZURyYWdnZWRFbGVtZW50OiBUcmVlRHJhZ2dlZEVsZW1lbnQpIHtcblxuICAgIHRyZWVNb2RlbC5ldmVudE5hbWVzLmZvckVhY2goKG5hbWUpID0+IHRoaXNbbmFtZV0gPSBuZXcgRXZlbnRFbWl0dGVyKCkpO1xuICAgIHRyZWVNb2RlbC5zdWJzY3JpYmVUb1N0YXRlKChzdGF0ZSkgPT4gdGhpcy5zdGF0ZUNoYW5nZS5lbWl0KHN0YXRlKSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdib2R5OiBrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgb25LZXlkb3duKCRldmVudCkge1xuICAgIGlmICghdGhpcy50cmVlTW9kZWwuaXNGb2N1c2VkKSByZXR1cm47XG4gICAgaWYgKGluY2x1ZGVzKFsnaW5wdXQnLCAndGV4dGFyZWEnXSxcbiAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZm9jdXNlZE5vZGUgPSB0aGlzLnRyZWVNb2RlbC5nZXRGb2N1c2VkTm9kZSgpO1xuXG4gICAgdGhpcy50cmVlTW9kZWwucGVyZm9ybUtleUFjdGlvbihmb2N1c2VkTm9kZSwgJGV2ZW50KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JvZHk6IG1vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gIG9uTW91c2Vkb3duKCRldmVudCkge1xuICAgIGZ1bmN0aW9uIGlzT3V0c2lkZUNsaWNrKHN0YXJ0RWxlbWVudDogRWxlbWVudCwgbm9kZU5hbWU6IHN0cmluZykge1xuICAgICAgcmV0dXJuICFzdGFydEVsZW1lbnQgPyB0cnVlIDogc3RhcnRFbGVtZW50LmxvY2FsTmFtZSA9PT0gbm9kZU5hbWUgPyBmYWxzZSA6IGlzT3V0c2lkZUNsaWNrKHN0YXJ0RWxlbWVudC5wYXJlbnRFbGVtZW50LCBub2RlTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzT3V0c2lkZUNsaWNrKCRldmVudC50YXJnZXQsICd0cmVlLXJvb3QnKSkge1xuICAgICAgdGhpcy50cmVlTW9kZWwuc2V0Rm9jdXMoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zIHx8IGNoYW5nZXMubm9kZXMpIHtcbiAgICAgIHRoaXMudHJlZU1vZGVsLnNldERhdGEoe1xuICAgICAgICBvcHRpb25zOiBjaGFuZ2VzLm9wdGlvbnMgJiYgY2hhbmdlcy5vcHRpb25zLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgbm9kZXM6IGNoYW5nZXMubm9kZXMgJiYgY2hhbmdlcy5ub2Rlcy5jdXJyZW50VmFsdWUsXG4gICAgICAgIGV2ZW50czogcGljayh0aGlzLCB0aGlzLnRyZWVNb2RlbC5ldmVudE5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2l6ZUNoYW5nZWQoKSB7XG4gICAgdGhpcy52aWV3cG9ydENvbXBvbmVudC5zZXRWaWV3cG9ydCgpO1xuICB9XG59XG4iXX0=
\No newline at end of file