1 | (function (factory) {
|
---|
2 | if (typeof module === "object" && typeof module.exports === "object") {
|
---|
3 | var v = factory(require, exports);
|
---|
4 | if (v !== undefined) module.exports = v;
|
---|
5 | }
|
---|
6 | else if (typeof define === "function" && define.amd) {
|
---|
7 | define("@angular/compiler-cli/ngcc/src/execution/tasks/utils", ["require", "exports", "tslib", "@angular/compiler-cli/ngcc/src/execution/tasks/api"], factory);
|
---|
8 | }
|
---|
9 | })(function (require, exports) {
|
---|
10 | "use strict";
|
---|
11 | Object.defineProperty(exports, "__esModule", { value: true });
|
---|
12 | exports.sortTasksByPriority = exports.getBlockedTasks = exports.getDependentsSet = exports.computeTaskDependencies = exports.stringifyTask = void 0;
|
---|
13 | var tslib_1 = require("tslib");
|
---|
14 | var api_1 = require("@angular/compiler-cli/ngcc/src/execution/tasks/api");
|
---|
15 | /** Stringify a task for debugging purposes. */
|
---|
16 | var stringifyTask = function (task) {
|
---|
17 | return "{entryPoint: " + task.entryPoint.name + ", formatProperty: " + task.formatProperty + ", " +
|
---|
18 | ("processDts: " + api_1.DtsProcessing[task.processDts] + "}");
|
---|
19 | };
|
---|
20 | exports.stringifyTask = stringifyTask;
|
---|
21 | /**
|
---|
22 | * Compute a mapping of tasks to the tasks that are dependent on them (if any).
|
---|
23 | *
|
---|
24 | * Task A can depend upon task B, if either:
|
---|
25 | *
|
---|
26 | * * A and B have the same entry-point _and_ B is generating the typings for that entry-point
|
---|
27 | * (i.e. has `processDts: true`).
|
---|
28 | * * A's entry-point depends on B's entry-point _and_ B is also generating typings.
|
---|
29 | *
|
---|
30 | * NOTE: If a task is not generating typings, then it cannot affect anything which depends on its
|
---|
31 | * entry-point, regardless of the dependency graph. To put this another way, only the task
|
---|
32 | * which produces the typings for a dependency needs to have been completed.
|
---|
33 | *
|
---|
34 | * As a performance optimization, we take into account the fact that `tasks` are sorted in such a
|
---|
35 | * way that a task can only depend on earlier tasks (i.e. dependencies always come before
|
---|
36 | * dependents in the list of tasks).
|
---|
37 | *
|
---|
38 | * @param tasks A (partially ordered) list of tasks.
|
---|
39 | * @param graph The dependency graph between entry-points.
|
---|
40 | * @return A map from each task to those tasks directly dependent upon it.
|
---|
41 | */
|
---|
42 | function computeTaskDependencies(tasks, graph) {
|
---|
43 | var dependencies = new api_1.TaskDependencies();
|
---|
44 | var candidateDependencies = new Map();
|
---|
45 | tasks.forEach(function (task) {
|
---|
46 | var e_1, _a;
|
---|
47 | var entryPointPath = task.entryPoint.path;
|
---|
48 | // Find the earlier tasks (`candidateDependencies`) that this task depends upon.
|
---|
49 | var deps = graph.dependenciesOf(entryPointPath);
|
---|
50 | var taskDependencies = deps.filter(function (dep) { return candidateDependencies.has(dep); })
|
---|
51 | .map(function (dep) { return candidateDependencies.get(dep); });
|
---|
52 | // If this task has dependencies, add it to the dependencies and dependents maps.
|
---|
53 | if (taskDependencies.length > 0) {
|
---|
54 | try {
|
---|
55 | for (var taskDependencies_1 = tslib_1.__values(taskDependencies), taskDependencies_1_1 = taskDependencies_1.next(); !taskDependencies_1_1.done; taskDependencies_1_1 = taskDependencies_1.next()) {
|
---|
56 | var dependency = taskDependencies_1_1.value;
|
---|
57 | var taskDependents = getDependentsSet(dependencies, dependency);
|
---|
58 | taskDependents.add(task);
|
---|
59 | }
|
---|
60 | }
|
---|
61 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
---|
62 | finally {
|
---|
63 | try {
|
---|
64 | if (taskDependencies_1_1 && !taskDependencies_1_1.done && (_a = taskDependencies_1.return)) _a.call(taskDependencies_1);
|
---|
65 | }
|
---|
66 | finally { if (e_1) throw e_1.error; }
|
---|
67 | }
|
---|
68 | }
|
---|
69 | if (task.processDts !== api_1.DtsProcessing.No) {
|
---|
70 | // SANITY CHECK:
|
---|
71 | // There should only be one task per entry-point that generates typings (and thus can be a
|
---|
72 | // dependency of other tasks), so the following should theoretically never happen, but check
|
---|
73 | // just in case.
|
---|
74 | if (candidateDependencies.has(entryPointPath)) {
|
---|
75 | var otherTask = candidateDependencies.get(entryPointPath);
|
---|
76 | throw new Error('Invariant violated: Multiple tasks are assigned generating typings for ' +
|
---|
77 | ("'" + entryPointPath + "':\n - " + exports.stringifyTask(otherTask) + "\n - " + exports.stringifyTask(task)));
|
---|
78 | }
|
---|
79 | // This task can potentially be a dependency (i.e. it generates typings), so add it to the
|
---|
80 | // list of candidate dependencies for subsequent tasks.
|
---|
81 | candidateDependencies.set(entryPointPath, task);
|
---|
82 | }
|
---|
83 | else {
|
---|
84 | // This task is not generating typings so we need to add it to the dependents of the task that
|
---|
85 | // does generate typings, if that exists
|
---|
86 | if (candidateDependencies.has(entryPointPath)) {
|
---|
87 | var typingsTask = candidateDependencies.get(entryPointPath);
|
---|
88 | var typingsTaskDependents = getDependentsSet(dependencies, typingsTask);
|
---|
89 | typingsTaskDependents.add(task);
|
---|
90 | }
|
---|
91 | }
|
---|
92 | });
|
---|
93 | return dependencies;
|
---|
94 | }
|
---|
95 | exports.computeTaskDependencies = computeTaskDependencies;
|
---|
96 | function getDependentsSet(map, task) {
|
---|
97 | if (!map.has(task)) {
|
---|
98 | map.set(task, new Set());
|
---|
99 | }
|
---|
100 | return map.get(task);
|
---|
101 | }
|
---|
102 | exports.getDependentsSet = getDependentsSet;
|
---|
103 | /**
|
---|
104 | * Invert the given mapping of Task dependencies.
|
---|
105 | *
|
---|
106 | * @param dependencies The mapping of tasks to the tasks that depend upon them.
|
---|
107 | * @returns A mapping of tasks to the tasks that they depend upon.
|
---|
108 | */
|
---|
109 | function getBlockedTasks(dependencies) {
|
---|
110 | var e_2, _a, e_3, _b;
|
---|
111 | var blockedTasks = new Map();
|
---|
112 | try {
|
---|
113 | for (var dependencies_1 = tslib_1.__values(dependencies), dependencies_1_1 = dependencies_1.next(); !dependencies_1_1.done; dependencies_1_1 = dependencies_1.next()) {
|
---|
114 | var _c = tslib_1.__read(dependencies_1_1.value, 2), dependency = _c[0], dependents = _c[1];
|
---|
115 | try {
|
---|
116 | for (var dependents_1 = (e_3 = void 0, tslib_1.__values(dependents)), dependents_1_1 = dependents_1.next(); !dependents_1_1.done; dependents_1_1 = dependents_1.next()) {
|
---|
117 | var dependent = dependents_1_1.value;
|
---|
118 | var dependentSet = getDependentsSet(blockedTasks, dependent);
|
---|
119 | dependentSet.add(dependency);
|
---|
120 | }
|
---|
121 | }
|
---|
122 | catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
---|
123 | finally {
|
---|
124 | try {
|
---|
125 | if (dependents_1_1 && !dependents_1_1.done && (_b = dependents_1.return)) _b.call(dependents_1);
|
---|
126 | }
|
---|
127 | finally { if (e_3) throw e_3.error; }
|
---|
128 | }
|
---|
129 | }
|
---|
130 | }
|
---|
131 | catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
---|
132 | finally {
|
---|
133 | try {
|
---|
134 | if (dependencies_1_1 && !dependencies_1_1.done && (_a = dependencies_1.return)) _a.call(dependencies_1);
|
---|
135 | }
|
---|
136 | finally { if (e_2) throw e_2.error; }
|
---|
137 | }
|
---|
138 | return blockedTasks;
|
---|
139 | }
|
---|
140 | exports.getBlockedTasks = getBlockedTasks;
|
---|
141 | /**
|
---|
142 | * Sort a list of tasks by priority.
|
---|
143 | *
|
---|
144 | * Priority is determined by the number of other tasks that a task is (transitively) blocking:
|
---|
145 | * The more tasks a task is blocking the higher its priority is, because processing it will
|
---|
146 | * potentially unblock more tasks.
|
---|
147 | *
|
---|
148 | * To keep the behavior predictable, if two tasks block the same number of other tasks, their
|
---|
149 | * relative order in the original `tasks` lists is preserved.
|
---|
150 | *
|
---|
151 | * @param tasks A (partially ordered) list of tasks.
|
---|
152 | * @param dependencies The mapping of tasks to the tasks that depend upon them.
|
---|
153 | * @return The list of tasks sorted by priority.
|
---|
154 | */
|
---|
155 | function sortTasksByPriority(tasks, dependencies) {
|
---|
156 | var priorityPerTask = new Map();
|
---|
157 | var computePriority = function (task, idx) { return [dependencies.has(task) ? dependencies.get(task).size : 0, idx]; };
|
---|
158 | tasks.forEach(function (task, i) { return priorityPerTask.set(task, computePriority(task, i)); });
|
---|
159 | return tasks.slice().sort(function (task1, task2) {
|
---|
160 | var _a = tslib_1.__read(priorityPerTask.get(task1), 2), p1 = _a[0], idx1 = _a[1];
|
---|
161 | var _b = tslib_1.__read(priorityPerTask.get(task2), 2), p2 = _b[0], idx2 = _b[1];
|
---|
162 | return (p2 - p1) || (idx1 - idx2);
|
---|
163 | });
|
---|
164 | }
|
---|
165 | exports.sortTasksByPriority = sortTasksByPriority;
|
---|
166 | });
|
---|
167 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvbmdjYy9zcmMvZXhlY3V0aW9uL3Rhc2tzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7SUFTQSwwRUFBbUY7SUFFbkYsK0NBQStDO0lBQ3hDLElBQU0sYUFBYSxHQUFHLFVBQUMsSUFBVTtRQUNwQyxPQUFBLGtCQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksMEJBQXFCLElBQUksQ0FBQyxjQUFjLE9BQUk7YUFDaEYsaUJBQWUsbUJBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQUcsQ0FBQTtJQURoRCxDQUNnRCxDQUFDO0lBRnhDLFFBQUEsYUFBYSxpQkFFMkI7SUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bb0JHO0lBQ0gsU0FBZ0IsdUJBQXVCLENBQ25DLEtBQTRCLEVBQUUsS0FBMkI7UUFDM0QsSUFBTSxZQUFZLEdBQUcsSUFBSSxzQkFBZ0IsRUFBRSxDQUFDO1FBQzVDLElBQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQWdCLENBQUM7UUFFdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFBLElBQUk7O1lBQ2hCLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBRTVDLGdGQUFnRjtZQUNoRixJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xELElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBOUIsQ0FBOEIsQ0FBQztpQkFDN0MsR0FBRyxDQUFDLFVBQUEsR0FBRyxJQUFJLE9BQUEscUJBQXFCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBRSxFQUEv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LElBQU0sZUFBZSxHQUFHLFVBQUMsSUFBVSxFQUFFLEdBQVcsSUFDeEIsT0FBQSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQWhFLENBQWdFLENBQUM7UUFFekYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFDLElBQUksRUFBRSxDQUFDLElBQUssT0FBQSxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQW5ELENBQW1ELENBQUMsQ0FBQztRQUVoRixPQUFPLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxLQUFLLEVBQUUsS0FBSztZQUMvQixJQUFBLEtBQUEsZUFBYSxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBRSxJQUFBLEVBQXZDLEVBQUUsUUFBQSxFQUFFLElBQUksUUFBK0IsQ0FBQztZQUN6QyxJQUFBLEtBQUEsZUFBYSxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBRSxJQUFBLEVBQXZDLEVBQUUsUUFBQSxFQUFFLElBQUksUUFBK0IsQ0FBQztZQUUvQyxPQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQWRELGtEQWNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge0RlcEdyYXBofSBmcm9tICdkZXBlbmRlbmN5LWdyYXBoJztcbmltcG9ydCB7RW50cnlQb2ludH0gZnJvbSAnLi4vLi4vcGFja2FnZXMvZW50cnlfcG9pbnQnO1xuaW1wb3J0IHtEdHNQcm9jZXNzaW5nLCBQYXJ0aWFsbHlPcmRlcmVkVGFza3MsIFRhc2ssIFRhc2tEZXBlbmRlbmNpZXN9IGZyb20gJy4vYXBpJztcblxuLyoqIFN0cmluZ2lmeSBhIHRhc2sgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdpZnlUYXNrID0gKHRhc2s6IFRhc2spOiBzdHJpbmcgPT5cbiAgICBge2VudHJ5UG9pbnQ6ICR7dGFzay5lbnRyeVBvaW50Lm5hbWV9LCBmb3JtYXRQcm9wZXJ0eTogJHt0YXNrLmZvcm1hdFByb3BlcnR5fSwgYCArXG4gICAgYHByb2Nlc3NEdHM6ICR7RHRzUHJvY2Vzc2luZ1t0YXNrLnByb2Nlc3NEdHNdfX1gO1xuXG4vKipcbiAqIENvbXB1dGUgYSBtYXBwaW5nIG9mIHRhc2tzIHRvIHRoZSB0YXNrcyB0aGF0IGFyZSBkZXBlbmRlbnQgb24gdGhlbSAoaWYgYW55KS5cbiAqXG4gKiBUYXNrIEEgY2FuIGRlcGVuZCB1cG9uIHRhc2sgQiwgaWYgZWl0aGVyOlxuICpcbiAqICogQSBhbmQgQiBoYXZlIHRoZSBzYW1lIGVudHJ5LXBvaW50IF9hbmRfIEIgaXMgZ2VuZXJhdGluZyB0aGUgdHlwaW5ncyBmb3IgdGhhdCBlbnRyeS1wb2ludFxuICogICAoaS5lLiBoYXMgYHByb2Nlc3NEdHM6IHRydWVgKS5cbiAqICogQSdzIGVudHJ5LXBvaW50IGRlcGVuZHMgb24gQidzIGVudHJ5LXBvaW50IF9hbmRfIEIgaXMgYWxzbyBnZW5lcmF0aW5nIHR5cGluZ3MuXG4gKlxuICogTk9URTogSWYgYSB0YXNrIGlzIG5vdCBnZW5lcmF0aW5nIHR5cGluZ3MsIHRoZW4gaXQgY2Fubm90IGFmZmVjdCBhbnl0aGluZyB3aGljaCBkZXBlbmRzIG9uIGl0c1xuICogICAgICAgZW50cnktcG9pbnQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGRlcGVuZGVuY3kgZ3JhcGguIFRvIHB1dCB0aGlzIGFub3RoZXIgd2F5LCBvbmx5IHRoZSB0YXNrXG4gKiAgICAgICB3aGljaCBwcm9kdWNlcyB0aGUgdHlwaW5ncyBmb3IgYSBkZXBlbmRlbmN5IG5lZWRzIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQuXG4gKlxuICogQXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHdlIHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IHRoYXQgYHRhc2tzYCBhcmUgc29ydGVkIGluIHN1Y2ggYVxuICogd2F5IHRoYXQgYSB0YXNrIGNhbiBvbmx5IGRlcGVuZCBvbiBlYXJsaWVyIHRhc2tzIChpLmUuIGRlcGVuZGVuY2llcyBhbHdheXMgY29tZSBiZWZvcmVcbiAqIGRlcGVuZGVudHMgaW4gdGhlIGxpc3Qgb2YgdGFza3MpLlxuICpcbiAqIEBwYXJhbSB0YXNrcyBBIChwYXJ0aWFsbHkgb3JkZXJlZCkgbGlzdCBvZiB0YXNrcy5cbiAqIEBwYXJhbSBncmFwaCBUaGUgZGVwZW5kZW5jeSBncmFwaCBiZXR3ZWVuIGVudHJ5LXBvaW50cy5cbiAqIEByZXR1cm4gQSBtYXAgZnJvbSBlYWNoIHRhc2sgdG8gdGhvc2UgdGFza3MgZGlyZWN0bHkgZGVwZW5kZW50IHVwb24gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlVGFza0RlcGVuZGVuY2llcyhcbiAgICB0YXNrczogUGFydGlhbGx5T3JkZXJlZFRhc2tzLCBncmFwaDogRGVwR3JhcGg8RW50cnlQb2ludD4pOiBUYXNrRGVwZW5kZW5jaWVzIHtcbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gbmV3IFRhc2tEZXBlbmRlbmNpZXMoKTtcbiAgY29uc3QgY2FuZGlkYXRlRGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIFRhc2s+KCk7XG5cbiAgdGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICBjb25zdCBlbnRyeVBvaW50UGF0aCA9IHRhc2suZW50cnlQb2ludC5wYXRoO1xuXG4gICAgLy8gRmluZCB0aGUgZWFybGllciB0YXNrcyAoYGNhbmRpZGF0ZURlcGVuZGVuY2llc2ApIHRoYXQgdGhpcyB0YXNrIGRlcGVuZHMgdXBvbi5cbiAgICBjb25zdCBkZXBzID0gZ3JhcGguZGVwZW5kZW5jaWVzT2YoZW50cnlQb2ludFBhdGgpO1xuICAgIGNvbnN0IHRhc2tEZXBlbmRlbmNpZXMgPSBkZXBzLmZpbHRlcihkZXAgPT4gY2FuZGlkYXRlRGVwZW5kZW5jaWVzLmhhcyhkZXApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChkZXAgPT4gY2FuZGlkYXRlRGVwZW5kZW5jaWVzLmdldChkZXApISk7XG5cbiAgICAvLyBJZiB0aGlzIHRhc2sgaGFzIGRlcGVuZGVuY2llcywgYWRkIGl0IHRvIHRoZSBkZXBlbmRlbmNpZXMgYW5kIGRlcGVuZGVudHMgbWFwcy5cbiAgICBpZiAodGFza0RlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdGFza0RlcGVuZGVuY2llcykge1xuICAgICAgICBjb25zdCB0YXNrRGVwZW5kZW50cyA9IGdldERlcGVuZGVudHNTZXQoZGVwZW5kZW5jaWVzLCBkZXBlbmRlbmN5KTtcbiAgICAgICAgdGFza0RlcGVuZGVudHMuYWRkKHRhc2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0YXNrLnByb2Nlc3NEdHMgIT09IER0c1Byb2Nlc3NpbmcuTm8pIHtcbiAgICAgIC8vIFNBTklUWSBDSEVDSzpcbiAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSB0YXNrIHBlciBlbnRyeS1wb2ludCB0aGF0IGdlbmVyYXRlcyB0eXBpbmdzIChhbmQgdGh1cyBjYW4gYmUgYVxuICAgICAgLy8gZGVwZW5kZW5jeSBvZiBvdGhlciB0YXNrcyksIHNvIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHRoZW9yZXRpY2FsbHkgbmV2ZXIgaGFwcGVuLCBidXQgY2hlY2tcbiAgICAgIC8vIGp1c3QgaW4gY2FzZS5cbiAgICAgIGlmIChjYW5kaWRhdGVEZXBlbmRlbmNpZXMuaGFzKGVudHJ5UG9pbnRQYXRoKSkge1xuICAgICAgICBjb25zdCBvdGhlclRhc2sgPSBjYW5kaWRhdGVEZXBlbmRlbmNpZXMuZ2V0KGVudHJ5UG9pbnRQYXRoKSE7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdJbnZhcmlhbnQgdmlvbGF0ZWQ6IE11bHRpcGxlIHRhc2tzIGFyZSBhc3NpZ25lZCBnZW5lcmF0aW5nIHR5cGluZ3MgZm9yICcgK1xuICAgICAgICAgICAgYCcke2VudHJ5UG9pbnRQYXRofSc6XFxuICAtICR7c3RyaW5naWZ5VGFzayhvdGhlclRhc2spfVxcbiAgLSAke3N0cmluZ2lmeVRhc2sodGFzayl9YCk7XG4gICAgICB9XG4gICAgICAvLyBUaGlzIHRhc2sgY2FuIHBvdGVudGlhbGx5IGJlIGEgZGVwZW5kZW5jeSAoaS5lLiBpdCBnZW5lcmF0ZXMgdHlwaW5ncyksIHNvIGFkZCBpdCB0byB0aGVcbiAgICAgIC8vIGxpc3Qgb2YgY2FuZGlkYXRlIGRlcGVuZGVuY2llcyBmb3Igc3Vic2VxdWVudCB0YXNrcy5cbiAgICAgIGNhbmRpZGF0ZURlcGVuZGVuY2llcy5zZXQoZW50cnlQb2ludFBhdGgsIHRhc2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIHRhc2sgaXMgbm90IGdlbmVyYXRpbmcgdHlwaW5ncyBzbyB3ZSBuZWVkIHRvIGFkZCBpdCB0byB0aGUgZGVwZW5kZW50cyBvZiB0aGUgdGFzayB0aGF0XG4gICAgICAvLyBkb2VzIGdlbmVyYXRlIHR5cGluZ3MsIGlmIHRoYXQgZXhpc3RzXG4gICAgICBpZiAoY2FuZGlkYXRlRGVwZW5kZW5jaWVzLmhhcyhlbnRyeVBvaW50UGF0aCkpIHtcbiAgICAgICAgY29uc3QgdHlwaW5nc1Rhc2sgPSBjYW5kaWRhdGVEZXBlbmRlbmNpZXMuZ2V0KGVudHJ5UG9pbnRQYXRoKSE7XG4gICAgICAgIGNvbnN0IHR5cGluZ3NUYXNrRGVwZW5kZW50cyA9IGdldERlcGVuZGVudHNTZXQoZGVwZW5kZW5jaWVzLCB0eXBpbmdzVGFzayk7XG4gICAgICAgIHR5cGluZ3NUYXNrRGVwZW5kZW50cy5hZGQodGFzayk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVwZW5kZW50c1NldChtYXA6IFRhc2tEZXBlbmRlbmNpZXMsIHRhc2s6IFRhc2spOiBTZXQ8VGFzaz4ge1xuICBpZiAoIW1hcC5oYXModGFzaykpIHtcbiAgICBtYXAuc2V0KHRhc2ssIG5ldyBTZXQoKSk7XG4gIH1cbiAgcmV0dXJuIG1hcC5nZXQodGFzaykhO1xufVxuXG4vKipcbiAqIEludmVydCB0aGUgZ2l2ZW4gbWFwcGluZyBvZiBUYXNrIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAcGFyYW0gZGVwZW5kZW5jaWVzIFRoZSBtYXBwaW5nIG9mIHRhc2tzIHRvIHRoZSB0YXNrcyB0aGF0IGRlcGVuZCB1cG9uIHRoZW0uXG4gKiBAcmV0dXJucyBBIG1hcHBpbmcgb2YgdGFza3MgdG8gdGhlIHRhc2tzIHRoYXQgdGhleSBkZXBlbmQgdXBvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJsb2NrZWRUYXNrcyhkZXBlbmRlbmNpZXM6IFRhc2tEZXBlbmRlbmNpZXMpOiBNYXA8VGFzaywgU2V0PFRhc2s+PiB7XG4gIGNvbnN0IGJsb2NrZWRUYXNrcyA9IG5ldyBNYXA8VGFzaywgU2V0PFRhc2s+PigpO1xuICBmb3IgKGNvbnN0IFtkZXBlbmRlbmN5LCBkZXBlbmRlbnRzXSBvZiBkZXBlbmRlbmNpZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVudCBvZiBkZXBlbmRlbnRzKSB7XG4gICAgICBjb25zdCBkZXBlbmRlbnRTZXQgPSBnZXREZXBlbmRlbnRzU2V0KGJsb2NrZWRUYXNrcywgZGVwZW5kZW50KTtcbiAgICAgIGRlcGVuZGVudFNldC5hZGQoZGVwZW5kZW5jeSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBibG9ja2VkVGFza3M7XG59XG5cbi8qKlxuICogU29ydCBhIGxpc3Qgb2YgdGFza3MgYnkgcHJpb3JpdHkuXG4gKlxuICogUHJpb3JpdHkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVyIG9mIG90aGVyIHRhc2tzIHRoYXQgYSB0YXNrIGlzICh0cmFuc2l0aXZlbHkpIGJsb2NraW5nOlxuICogVGhlIG1vcmUgdGFza3MgYSB0YXNrIGlzIGJsb2NraW5nIHRoZSBoaWdoZXIgaXRzIHByaW9yaXR5IGlzLCBiZWNhdXNlIHByb2Nlc3NpbmcgaXQgd2lsbFxuICogcG90ZW50aWFsbHkgdW5ibG9jayBtb3JlIHRhc2tzLlxuICpcbiAqIFRvIGtlZXAgdGhlIGJlaGF2aW9yIHByZWRpY3RhYmxlLCBpZiB0d28gdGFza3MgYmxvY2sgdGhlIHNhbWUgbnVtYmVyIG9mIG90aGVyIHRhc2tzLCB0aGVpclxuICogcmVsYXRpdmUgb3JkZXIgaW4gdGhlIG9yaWdpbmFsIGB0YXNrc2AgbGlzdHMgaXMgcHJlc2VydmVkLlxuICpcbiAqIEBwYXJhbSB0YXNrcyBBIChwYXJ0aWFsbHkgb3JkZXJlZCkgbGlzdCBvZiB0YXNrcy5cbiAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgVGhlIG1hcHBpbmcgb2YgdGFza3MgdG8gdGhlIHRhc2tzIHRoYXQgZGVwZW5kIHVwb24gdGhlbS5cbiAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgdGFza3Mgc29ydGVkIGJ5IHByaW9yaXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydFRhc2tzQnlQcmlvcml0eShcbiAgICB0YXNrczogUGFydGlhbGx5T3JkZXJlZFRhc2tzLCBkZXBlbmRlbmNpZXM6IFRhc2tEZXBlbmRlbmNpZXMpOiBQYXJ0aWFsbHlPcmRlcmVkVGFza3Mge1xuICBjb25zdCBwcmlvcml0eVBlclRhc2sgPSBuZXcgTWFwPFRhc2ssIFtudW1iZXIsIG51bWJlcl0+KCk7XG4gIGNvbnN0IGNvbXB1dGVQcmlvcml0eSA9ICh0YXNrOiBUYXNrLCBpZHg6IG51bWJlcik6XG4gICAgICBbbnVtYmVyLCBudW1iZXJdID0+IFtkZXBlbmRlbmNpZXMuaGFzKHRhc2spID8gZGVwZW5kZW5jaWVzLmdldCh0YXNrKSEuc2l6ZSA6IDAsIGlkeF07XG5cbiAgdGFza3MuZm9yRWFjaCgodGFzaywgaSkgPT4gcHJpb3JpdHlQZXJUYXNrLnNldCh0YXNrLCBjb21wdXRlUHJpb3JpdHkodGFzaywgaSkpKTtcblxuICByZXR1cm4gdGFza3Muc2xpY2UoKS5zb3J0KCh0YXNrMSwgdGFzazIpID0+IHtcbiAgICBjb25zdCBbcDEsIGlkeDFdID0gcHJpb3JpdHlQZXJUYXNrLmdldCh0YXNrMSkhO1xuICAgIGNvbnN0IFtwMiwgaWR4Ml0gPSBwcmlvcml0eVBlclRhc2suZ2V0KHRhc2syKSE7XG5cbiAgICByZXR1cm4gKHAyIC0gcDEpIHx8IChpZHgxIC0gaWR4Mik7XG4gIH0pO1xufVxuIl19 |
---|