1 | ;
|
2 | var __importStar = (this && this.__importStar) || function (mod) {
|
3 | if (mod && mod.__esModule) return mod;
|
4 | var result = {};
|
5 | if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
6 | result["default"] = mod;
|
7 | return result;
|
8 | };
|
9 | Object.defineProperty(exports, "__esModule", { value: true });
|
10 | const net_1 = require("@xmcl/net");
|
11 | const parser = __importStar(require("fast-html-parser"));
|
12 | const index_1 = require("./index");
|
13 | var ForgeWebPage;
|
14 | (function (ForgeWebPage) {
|
15 | /**
|
16 | * Parse the html string of forge webpage
|
17 | */
|
18 | function parse(content) {
|
19 | const dom = parser.parse(content);
|
20 | const selected = dom.querySelector(".elem-active");
|
21 | const mcversion = selected.text;
|
22 | return {
|
23 | timestamp: "",
|
24 | mcversion,
|
25 | versions: dom.querySelector(".download-list").querySelector("tbody").querySelectorAll("tr")
|
26 | .map((e) => {
|
27 | const links = e.querySelector(".download-links").childNodes
|
28 | .filter((elem) => elem.tagName === "li")
|
29 | .map((elem) => {
|
30 | elem = elem.removeWhitespace();
|
31 | /*
|
32 | * <div class="info-tooltip">
|
33 | * <strong>MD5:</strong> 31742b6c996f53af96f606b7a0c46e2a<br>
|
34 | * <strong>SHA1:</strong> 8d6a23554839d6f6014fbdb7991e3cd8af7eca80
|
35 | * </div>
|
36 | */
|
37 | const tooltipInfo = elem.querySelector(".info-tooltip");
|
38 | const url = tooltipInfo.querySelector("a") || elem.querySelector("a");
|
39 | // href is like /maven/net/minecraftforge/forge/1.14.4-28.1.70/forge-1.14.4-28.1.70-changelog.txt
|
40 | const href = url.attributes.href.trim();
|
41 | const matched = /forge-.+-.+-(\w+)\.\w+/.exec(href);
|
42 | let name = "", sha1 = "", md5 = "";
|
43 | if (matched) {
|
44 | name = matched[1];
|
45 | }
|
46 | if (!name) {
|
47 | throw new Error(`Cannot determine name for forge url "${href}". Maybe the forge webisite changed?`);
|
48 | }
|
49 | try {
|
50 | md5 = tooltipInfo.childNodes[1].text.trim();
|
51 | sha1 = tooltipInfo.childNodes[4].text.trim();
|
52 | }
|
53 | catch (_a) {
|
54 | console.warn(`Error during fetching the sha1 and md5 for the forge "${href}". The result might be wrong.`);
|
55 | }
|
56 | const isSha1 = /\b([a-f0-9]{40})\b/i;
|
57 | const isMd5 = /\b[a-f0-9]{32}\b/i;
|
58 | if (!isMd5.test(md5.trim())) {
|
59 | console.warn(`Illegal Md5 for "${href}": ${md5}`);
|
60 | md5 = "";
|
61 | }
|
62 | if (!isSha1.test(sha1.trim())) {
|
63 | console.warn(`Illegal Sha1 for "${href}": ${sha1}`);
|
64 | sha1 = "";
|
65 | }
|
66 | return {
|
67 | name,
|
68 | md5,
|
69 | sha1,
|
70 | path: href,
|
71 | };
|
72 | });
|
73 | const downloadVersionElem = e.querySelector(".download-version");
|
74 | let version;
|
75 | let type = "common";
|
76 | const icon = downloadVersionElem.querySelector("i");
|
77 | if (icon) {
|
78 | if (icon.classNames.indexOf("promo-recommended") !== -1) {
|
79 | type = "recommended";
|
80 | }
|
81 | else if (icon.classNames.indexOf("promo-latest") !== -1) {
|
82 | type = "latest";
|
83 | }
|
84 | else if (icon.classNames.indexOf("fa-bug") !== -1) {
|
85 | type = "buggy";
|
86 | }
|
87 | version = downloadVersionElem.firstChild.text.trim();
|
88 | }
|
89 | else {
|
90 | version = downloadVersionElem.text.trim();
|
91 | }
|
92 | const installer = links.find((l) => l.name === "installer");
|
93 | const universal = links.find((l) => l.name === "universal");
|
94 | const changelog = links.find((l) => l.name === "changelog");
|
95 | const installerWin = links.find((l) => l.name === "installer-win");
|
96 | const source = links.find((l) => l.name === "source");
|
97 | const launcher = links.find((l) => l.name === "launcher");
|
98 | const mdk = links.find((l) => l.name === "mdk");
|
99 | if (installer === undefined || universal === undefined) {
|
100 | throw new Error("Cannot parse forge web since it missing installer and universal jar info.");
|
101 | }
|
102 | const result = {
|
103 | version,
|
104 | "date": e.querySelector(".download-time").text.trim(),
|
105 | changelog,
|
106 | installer,
|
107 | mdk,
|
108 | universal,
|
109 | source,
|
110 | launcher,
|
111 | "installer-win": installerWin,
|
112 | "mcversion": mcversion,
|
113 | type,
|
114 | };
|
115 | return result;
|
116 | }),
|
117 | };
|
118 | }
|
119 | ForgeWebPage.parse = parse;
|
120 | /**
|
121 | * Query the webpage content from files.minecraftforge.net.
|
122 | *
|
123 | * You can put the last query result to the fallback option. It will check if your old result is up-to-date.
|
124 | * It will request a new page only when the fallback option is outdated.
|
125 | *
|
126 | * @param option The option can control querying minecraft version, and page caching.
|
127 | */
|
128 | async function getWebPage(option = {}) {
|
129 | const mcversion = option.mcversion || "";
|
130 | const url = mcversion === "" ? "http://files.minecraftforge.net/maven/net/minecraftforge/forge/index.html" : `http://files.minecraftforge.net/maven/net/minecraftforge/forge/index_${mcversion}.html`;
|
131 | const page = await net_1.getIfUpdate(url, parse, option.fallback);
|
132 | return page;
|
133 | }
|
134 | ForgeWebPage.getWebPage = getWebPage;
|
135 | let Version;
|
136 | (function (Version) {
|
137 | function to(webPageVersion) {
|
138 | return {
|
139 | universal: webPageVersion.universal,
|
140 | installer: webPageVersion.installer,
|
141 | mcversion: webPageVersion.mcversion,
|
142 | version: webPageVersion.version,
|
143 | };
|
144 | }
|
145 | Version.to = to;
|
146 | })(Version = ForgeWebPage.Version || (ForgeWebPage.Version = {}));
|
147 | })(ForgeWebPage = exports.ForgeWebPage || (exports.ForgeWebPage = {}));
|
148 | index_1.ForgeInstaller.VersionMeta = index_1.ForgeInstaller.VersionMeta || {};
|
149 | index_1.ForgeInstaller.VersionMeta.from = ForgeWebPage.Version.to;
|
150 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZ2V3ZWIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmb3JnZXdlYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxtQ0FBdUQ7QUFDdkQseURBQTJDO0FBQzNDLG1DQUF5QztBQUV6QyxJQUFpQixZQUFZLENBb041QjtBQXBORCxXQUFpQixZQUFZO0lBUXpCOztPQUVHO0lBQ0gsU0FBZ0IsS0FBSyxDQUFDLE9BQWU7UUFDakMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDaEMsT0FBTztZQUNILFNBQVMsRUFBRSxFQUFFO1lBQ2IsU0FBUztZQUNULFFBQVEsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztpQkFDdEYsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1AsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFVBQVU7cUJBQ3RELE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUM7cUJBQ3ZDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNWLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDL0I7Ozs7O3VCQUtHO29CQUNILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ3hELE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUks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b041QjtBQVFBLHNCQUFzQixDQUFDLFdBQVcsR0FBSSxzQkFBc0IsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO0FBQy9FLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRJZlVwZGF0ZSwgVXBkYXRlZE9iamVjdCB9IGZyb20gXCJAeG1jbC9uZXRcIjtcbmltcG9ydCAqIGFzIHBhcnNlciBmcm9tIFwiZmFzdC1odG1sLXBhcnNlclwiO1xuaW1wb3J0IHsgRm9yZ2VJbnN0YWxsZXIgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIEZvcmdlV2ViUGFnZSB7XG5cbiAgICBleHBvcnQgaW50ZXJmYWNlIERvd25sb2FkIHtcbiAgICAgICAgbWQ1OiBzdHJpbmc7XG4gICAgICAgIHNoYTE6IHN0cmluZztcbiAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIHRoZSBodG1sIHN0cmluZyBvZiBmb3JnZSB3ZWJwYWdlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKGNvbnRlbnQ6IHN0cmluZyk6IEZvcmdlV2ViUGFnZSB7XG4gICAgICAgIGNvbnN0IGRvbSA9IHBhcnNlci5wYXJzZShjb250ZW50KTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBkb20ucXVlcnlTZWxlY3RvcihcIi5lbGVtLWFjdGl2ZVwiKTtcbiAgICAgICAgY29uc3QgbWN2ZXJzaW9uID0gc2VsZWN0ZWQudGV4dDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpbWVzdGFtcDogXCJcIixcbiAgICAgICAgICAgIG1jdmVyc2lvbixcbiAgICAgICAgICAgIHZlcnNpb25zOiBkb20ucXVlcnlTZWxlY3RvcihcIi5kb3dubG9hZC1saXN0XCIpLnF1ZXJ5U2VsZWN0b3IoXCJ0Ym9keVwiKS5xdWVyeVNlbGVjdG9yQWxsKFwidHJcIilcbiAgICAgICAgICAgICAgICAubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtzID0gZS5xdWVyeVNlbGVjdG9yKFwiLmRvd25sb2FkLWxpbmtzXCIpLmNoaWxkTm9kZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGVsZW0pID0+IGVsZW0udGFnTmFtZSA9PT0gXCJsaVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZWxlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtLnJlbW92ZVdoaXRlc3BhY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDxkaXYgY2xhc3M9XCJpbmZvLXRvb2x0aXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIDxzdHJvbmc+TUQ1Ojwvc3Ryb25nPiAzMTc0MmI2Yzk5NmY1M2FmOTZmNjA2YjdhMGM0NmUyYTxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIDxzdHJvbmc+U0hBMTo8L3N0cm9uZz4gOGQ2YTIzNTU0ODM5ZDZmNjAxNGZiZGI3OTkxZTNjZDhhZjdlY2E4MFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvb2x0aXBJbmZvID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwiLmluZm8tdG9vbHRpcFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB0b29sdGlwSW5mby5xdWVyeVNlbGVjdG9yKFwiYVwiKSB8fCBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhyZWYgaXMgbGlrZSAvbWF2ZW4vbmV0L21pbmVjcmFmdGZvcmdlL2ZvcmdlLzEuMTQuNC0yOC4xLjcwL2ZvcmdlLTEuMTQuNC0yOC4xLjcwLWNoYW5nZWxvZy50eHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBocmVmID0gdXJsLmF0dHJpYnV0ZXMuaHJlZi50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZCA9IC9mb3JnZS0uKy0uKy0oXFx3KylcXC5cXHcrLy5leGVjKGhyZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gXCJcIiwgc2hhMSA9IFwiXCIsIG1kNSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWQpIHsgbmFtZSA9IG1hdGNoZWRbMV07IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZGV0ZXJtaW5lIG5hbWUgZm9yIGZvcmdlIHVybCBcIiR7aHJlZn1cIi4gTWF5YmUgdGhlIGZvcmdlIHdlYmlzaXRlIGNoYW5nZWQ/YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kNSA9IHRvb2x0aXBJbmZvLmNoaWxkTm9kZXNbMV0udGV4dC50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYTEgPSB0b29sdGlwSW5mby5jaGlsZE5vZGVzWzRdLnRleHQudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEVycm9yIGR1cmluZyBmZXRjaGluZyB0aGUgc2hhMSBhbmQgbWQ1IGZvciB0aGUgZm9yZ2UgXCIke2hyZWZ9XCIuIFRoZSByZXN1bHQgbWlnaHQgYmUgd3JvbmcuYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2hhMSA9IC9cXGIoW2EtZjAtOV17NDB9KVxcYi9pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNZDUgPSAvXFxiW2EtZjAtOV17MzJ9XFxiL2k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc01kNS50ZXN0KG1kNS50cmltKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgSWxsZWdhbCBNZDUgZm9yIFwiJHtocmVmfVwiOiAke21kNX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2hhMS50ZXN0KHNoYTEudHJpbSgpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYElsbGVnYWwgU2hhMSBmb3IgXCIke2hyZWZ9XCI6ICR7c2hhMX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGExID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQ1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGExLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBocmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG93bmxvYWRWZXJzaW9uRWxlbSA9IGUucXVlcnlTZWxlY3RvcihcIi5kb3dubG9hZC12ZXJzaW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmVyc2lvbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGU6IEZvcmdlV2ViUGFnZS5WZXJzaW9uW1widHlwZVwiXSA9IFwiY29tbW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGljb24gPSBkb3dubG9hZFZlcnNpb25FbGVtLnF1ZXJ5U2VsZWN0b3IoXCJpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGljb24uY2xhc3NOYW1lcy5pbmRleE9mKFwicHJvbW8tcmVjb21tZW5kZWRcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFwicmVjb21tZW5kZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaWNvbi5jbGFzc05hbWVzLmluZGV4T2YoXCJwcm9tby1sYXRlc3RcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFwibGF0ZXN0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGljb24uY2xhc3NOYW1lcy5pbmRleE9mKFwiZmEtYnVnXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBcImJ1Z2d5XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZG93bmxvYWRWZXJzaW9uRWxlbS5maXJzdENoaWxkLnRleHQudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGRvd25sb2FkVmVyc2lvbkVsZW0udGV4dC50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVyID0gbGlua3MuZmluZCgobCkgPT4gbC5uYW1lID09PSBcImluc3RhbGxlclwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pdmVyc2FsID0gbGlua3MuZmluZCgobCkgPT4gbC5uYW1lID09PSBcInVuaXZlcnNhbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlbG9nID0gbGlua3MuZmluZCgobCkgPT4gbC5uYW1lID09PSBcImNoYW5nZWxvZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFsbGVyV2luID0gbGlua3MuZmluZCgobCkgPT4gbC5uYW1lID09PSBcImluc3RhbGxlci13aW5cIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGxpbmtzLmZpbmQoKGwpID0+IGwubmFtZSA9PT0gXCJzb3VyY2VcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhdW5jaGVyID0gbGlua3MuZmluZCgobCkgPT4gbC5uYW1lID09PSBcImxhdW5jaGVyXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1kayA9IGxpbmtzLmZpbmQoKGwpID0+IGwubmFtZSA9PT0gXCJtZGtcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbGxlciA9PT0gdW5kZWZpbmVkIHx8IHVuaXZlcnNhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcGFyc2UgZm9yZ2Ugd2ViIHNpbmNlIGl0IG1pc3NpbmcgaW5zdGFsbGVyIGFuZCB1bml2ZXJzYWwgamFyIGluZm8uXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRhdGVcIjogZS5xdWVyeVNlbGVjdG9yKFwiLmRvd25sb2FkLXRpbWVcIikudGV4dC50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2Vsb2csXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZGssXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2hlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaW5zdGFsbGVyLXdpblwiOiBpbnN0YWxsZXJXaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1jdmVyc2lvblwiOiBtY3ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcnkgdGhlIHdlYnBhZ2UgY29udGVudCBmcm9tIGZpbGVzLm1pbmVjcmFmdGZvcmdlLm5ldC5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gcHV0IHRoZSBsYXN0IHF1ZXJ5IHJlc3VsdCB0byB0aGUgZmFsbGJhY2sgb3B0aW9uLiBJdCB3aWxsIGNoZWNrIGlmIHlvdXIgb2xkIHJlc3VsdCBpcyB1cC10by1kYXRlLlxuICAgICAqIEl0IHdpbGwgcmVxdWVzdCBhIG5ldyBwYWdlIG9ubHkgd2hlbiB0aGUgZmFsbGJhY2sgb3B0aW9uIGlzIG91dGRhdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIGNhbiBjb250cm9sIHF1ZXJ5aW5nIG1pbmVjcmFmdCB2ZXJzaW9uLCBhbmQgcGFnZSBjYWNoaW5nLlxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRXZWJQYWdlKCk6IFByb21pc2U8Rm9yZ2VXZWJQYWdlIHwgdW5kZWZpbmVkPjtcbiAgICAvKipcbiAgICAgKiBRdWVyeSB0aGUgd2VicGFnZSBjb250ZW50IGZyb20gZmlsZXMubWluZWNyYWZ0Zm9yZ2UubmV0LlxuICAgICAqXG4gICAgICogWW91IGNhbiBwdXQgdGhlIGxhc3QgcXVlcnkgcmVzdWx0IHRvIHRoZSBmYWxsYmFjayBvcHRpb24uIEl0IHdpbGwgY2hlY2sgaWYgeW91ciBvbGQgcmVzdWx0IGlzIHVwLXRvLWRhdGUuXG4gICAgICogSXQgd2lsbCByZXF1ZXN0IGEgbmV3IHBhZ2Ugb25seSB3aGVuIHRoZSBmYWxsYmFjayBvcHRpb24gaXMgb3V0ZGF0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gY2FuIGNvbnRyb2wgcXVlcnlpbmcgbWluZWNyYWZ0IHZlcnNpb24sIGFuZCBwYWdlIGNhY2hpbmcuXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFdlYlBhZ2Uob3B0aW9uPzoge1xuICAgICAgICBtY3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8Rm9yZ2VXZWJQYWdlIHwgdW5kZWZpbmVkPjtcbiAgICAvKipcbiAgICAgKiBRdWVyeSB0aGUgd2VicGFnZSBjb250ZW50IGZyb20gZmlsZXMubWluZWNyYWZ0Zm9yZ2UubmV0LlxuICAgICAqXG4gICAgICogWW91IGNhbiBwdXQgdGhlIGxhc3QgcXVlcnkgcmVzdWx0IHRvIHRoZSBmYWxsYmFjayBvcHRpb24uIEl0IHdpbGwgY2hlY2sgaWYgeW91ciBvbGQgcmVzdWx0IGlzIHVwLXRvLWRhdGUuXG4gICAgICogSXQgd2lsbCByZXF1ZXN0IGEgbmV3IHBhZ2Ugb25seSB3aGVuIHRoZSBmYWxsYmFjayBvcHRpb24gaXMgb3V0ZGF0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gY2FuIGNvbnRyb2wgcXVlcnlpbmcgbWluZWNyYWZ0IHZlcnNpb24sIGFuZCBwYWdlIGNhY2hpbmcuXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFdlYlBhZ2Uob3B0aW9uPzoge1xuICAgICAgICBtY3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgICAgIGZhbGxiYWNrPzogRm9yZ2VXZWJQYWdlO1xuICAgIH0pOiBQcm9taXNlPEZvcmdlV2ViUGFnZSB8IHVuZGVmaW5lZD47XG4gICAgLyoqXG4gICAgICogUXVlcnkgdGhlIHdlYnBhZ2UgY29udGVudCBmcm9tIGZpbGVzLm1pbmVjcmFmdGZvcmdlLm5ldC5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gcHV0IHRoZSBsYXN0IHF1ZXJ5IHJlc3VsdCB0byB0aGUgZmFsbGJhY2sgb3B0aW9uLiBJdCB3aWxsIGNoZWNrIGlmIHlvdXIgb2xkIHJlc3VsdCBpcyB1cC10by1kYXRlLlxuICAgICAqIEl0IHdpbGwgcmVxdWVzdCBhIG5ldyBwYWdlIG9ubHkgd2hlbiB0aGUgZmFsbGJhY2sgb3B0aW9uIGlzIG91dGRhdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG9wdGlvbiBUaGUgb3B0aW9uIGNhbiBjb250cm9sIHF1ZXJ5aW5nIG1pbmVjcmFmdCB2ZXJzaW9uLCBhbmQgcGFnZSBjYWNoaW5nLlxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRXZWJQYWdlKG9wdGlvbj86IHtcbiAgICAgICAgbWN2ZXJzaW9uPzogc3RyaW5nO1xuICAgICAgICBmYWxsYmFjazogRm9yZ2VXZWJQYWdlO1xuICAgIH0pOiBQcm9taXNlPEZvcmdlV2ViUGFnZT47XG5cbiAgICAvKipcbiAgICAgKiBRdWVyeSB0aGUgd2VicGFnZSBjb250ZW50IGZyb20gZmlsZXMubWluZWNyYWZ0Zm9yZ2UubmV0LlxuICAgICAqXG4gICAgICogWW91IGNhbiBwdXQgdGhlIGxhc3QgcXVlcnkgcmVzdWx0IHRvIHRoZSBmYWxsYmFjayBvcHRpb24uIEl0IHdpbGwgY2hlY2sgaWYgeW91ciBvbGQgcmVzdWx0IGlzIHVwLXRvLWRhdGUuXG4gICAgICogSXQgd2lsbCByZXF1ZXN0IGEgbmV3IHBhZ2Ugb25seSB3aGVuIHRoZSBmYWxsYmFjayBvcHRpb24gaXMgb3V0ZGF0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9uIFRoZSBvcHRpb24gY2FuIGNvbnRyb2wgcXVlcnlpbmcgbWluZWNyYWZ0IHZlcnNpb24sIGFuZCBwYWdlIGNhY2hpbmcuXG4gICAgICovXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdlYlBhZ2Uob3B0aW9uOiB7XG4gICAgICAgIG1jdmVyc2lvbj86IHN0cmluZyxcbiAgICAgICAgZmFsbGJhY2s/OiBGb3JnZVdlYlBhZ2UsXG4gICAgfSA9IHt9KTogUHJvbWlzZTxGb3JnZVdlYlBhZ2UgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgbWN2ZXJzaW9uID0gb3B0aW9uLm1jdmVyc2lvbiB8fCBcIlwiO1xuICAgICAgICBjb25zdCB1cmwgPSBtY3ZlcnNpb24gPT09IFwiXCIgPyBcImh0dHA6Ly9maWxlcy5taW5lY3JhZnRmb3JnZS5uZXQvbWF2ZW4vbmV0L21pbmVjcmFmdGZvcmdlL2ZvcmdlL2luZGV4Lmh0bWxcIiA6IGBodHRwOi8vZmlsZXMubWluZWNyYWZ0Zm9yZ2UubmV0L21hdmVuL25ldC9taW5lY3JhZnRmb3JnZS9mb3JnZS9pbmRleF8ke21jdmVyc2lvbn0uaHRtbGA7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBnZXRJZlVwZGF0ZSh1cmwsIHBhcnNlLCBvcHRpb24uZmFsbGJhY2spO1xuICAgICAgICByZXR1cm4gcGFnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHJpY2hlciB2ZXJzaW9uIGluZm8gdGhhbiBmb3JnZSBpbnN0YWxsZXIgcmVxdWlyZWRcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIFZlcnNpb24gZXh0ZW5kcyBGb3JnZUluc3RhbGxlci5WZXJzaW9uTWV0YSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgbWluZWNyYWZ0IHZlcnNpb25cbiAgICAgICAgICovXG4gICAgICAgIG1jdmVyc2lvbjogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHZlcnNpb24gb2YgZm9yZ2VcbiAgICAgICAgICovXG4gICAgICAgIHZlcnNpb246IHN0cmluZztcbiAgICAgICAgZGF0ZTogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGNoYW5nZWxvZyBpbmZvXG4gICAgICAgICAqL1xuICAgICAgICBjaGFuZ2Vsb2c/OiBGb3JnZVdlYlBhZ2UuRG93bmxvYWQ7XG4gICAgICAgIGluc3RhbGxlcjogRm9yZ2VXZWJQYWdlLkRvd25sb2FkO1xuICAgICAgICBtZGs/OiBGb3JnZVdlYlBhZ2UuRG93bmxvYWQ7XG4gICAgICAgIHVuaXZlcnNhbDogRm9yZ2VXZWJQYWdlLkRvd25sb2FkO1xuICAgICAgICBzb3VyY2U/OiBGb3JnZVdlYlBhZ2UuRG93bmxvYWQ7XG4gICAgICAgIGxhdW5jaGVyPzogRm9yZ2VXZWJQYWdlLkRvd25sb2FkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgZm9yZ2UgcmVsZWFzZS4gVGhlIGBjb21tb25gIG1lYW5zIHRoZSBub3JtYWwgcmVsZWFzZS5cbiAgICAgICAgICovXG4gICAgICAgIHR5cGU6IFwiYnVnZ3lcIiB8IFwicmVjb21tZW5kZWRcIiB8IFwiY29tbW9uXCIgfCBcImxhdGVzdFwiO1xuICAgIH1cblxuICAgIGV4cG9ydCBuYW1lc3BhY2UgVmVyc2lvbiB7XG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiB0byh3ZWJQYWdlVmVyc2lvbjogRm9yZ2VXZWJQYWdlLlZlcnNpb24pOiBGb3JnZUluc3RhbGxlci5WZXJzaW9uTWV0YSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVuaXZlcnNhbDogd2ViUGFnZVZlcnNpb24udW5pdmVyc2FsLFxuICAgICAgICAgICAgICAgIGluc3RhbGxlcjogd2ViUGFnZVZlcnNpb24uaW5zdGFsbGVyLFxuICAgICAgICAgICAgICAgIG1jdmVyc2lvbjogd2ViUGFnZVZlcnNpb24ubWN2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IHdlYlBhZ2VWZXJzaW9uLnZlcnNpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxufVxuXG5kZWNsYXJlIG1vZHVsZSBcIi4vaW5kZXhcIiB7XG4gICAgZXhwb3J0IG5hbWVzcGFjZSBWZXJzaW9uTWV0YSB7XG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tKHdlYlBhZ2VWZXJzaW9uOiBGb3JnZVdlYlBhZ2UuVmVyc2lvbik6IEZvcmdlSW5zdGFsbGVyLlZlcnNpb25NZXRhO1xuICAgIH1cbn1cblxuKEZvcmdlSW5zdGFsbGVyIGFzIGFueSkuVmVyc2lvbk1ldGEgPSAoRm9yZ2VJbnN0YWxsZXIgYXMgYW55KS5WZXJzaW9uTWV0YSB8fCB7fTtcbihGb3JnZUluc3RhbGxlciBhcyBhbnkpLlZlcnNpb25NZXRhLmZyb20gPSBGb3JnZVdlYlBhZ2UuVmVyc2lvbi50bztcblxuZXhwb3J0IGludGVyZmFjZSBGb3JnZVdlYlBhZ2UgZXh0ZW5kcyBVcGRhdGVkT2JqZWN0IHtcbiAgICB2ZXJzaW9uczogRm9yZ2VXZWJQYWdlLlZlcnNpb25bXTtcbiAgICBtY3ZlcnNpb246IHN0cmluZztcbn1cblxuXG5cbiJdfQ== |
\ | No newline at end of file |