UNPKG

27.1 kBJavaScriptView Raw
1"use strict";
2var __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};
9Object.defineProperty(exports, "__esModule", { value: true });
10const net_1 = require("@xmcl/net");
11const parser = __importStar(require("fast-html-parser"));
12const index_1 = require("./index");
13var 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 = {}));
148index_1.ForgeInstaller.VersionMeta = index_1.ForgeInstaller.VersionMeta || {};
149index_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