anti-redirect

去除重定向, 支持谷歌/百度/搜狗/360/知乎/贴吧/简书/豆瓣/微博...

  1. // ==UserScript==
  2. // @name anti-redirect
  3. // @author Axetroy
  4. // @description 去除重定向, 支持谷歌/百度/搜狗/360/知乎/贴吧/简书/豆瓣/微博...
  5. // @version 2.21.7
  6. // @update 2023-09-03 13:51:39
  7. // @grant GM_xmlhttpRequest
  8. // @match *://www.baidu.com/*
  9. // @match *://tieba.baidu.com/*
  10. // @match *://v.baidu.com/*
  11. // @match *://xueshu.baidu.com/*
  12. // @include *://www.google*
  13. // @match *://www.google.com/*
  14. // @match *://docs.google.com/*
  15. // @match *://mail.google.com/*
  16. // @match *://play.google.com/*
  17. // @match *://www.youtube.com/*
  18. // @match *://encrypted.google.com/*
  19. // @match *://www.so.com/*
  20. // @match *://www.zhihu.com/*
  21. // @match *://daily.zhihu.com/*
  22. // @match *://zhuanlan.zhihu.com/*
  23. // @match *://weibo.com/*
  24. // @match *://twitter.com/*
  25. // @match *://www.sogou.com/*
  26. // @match *://juejin.im/*
  27. // @match *://juejin.cn/*
  28. // @match *://mail.qq.com/*
  29. // @match *://addons.mozilla.org/*
  30. // @match *://www.jianshu.com/*
  31. // @match *://www.douban.com/*
  32. // @match *://getpocket.com/*
  33. // @match *://www.dogedoge.com/*
  34. // @match *://51.ruyo.net/*
  35. // @match *://steamcommunity.com/*
  36. // @match *://mijisou.com/*
  37. // @match *://blog.csdn.net/*
  38. // @match *://*.blog.csdn.net/*
  39. // @match *://*.oschina.net/*
  40. // @match *://app.yinxiang.com/*
  41. // @match *://www.logonews.cn/*
  42. // @match *://afdian.net/*
  43. // @match *://blog.51cto.com/*
  44. // @match *://xie.infoq.cn/*
  45. // @match *://gitee.com/*
  46. // @match *://sspai.com/*
  47. // @connect www.baidu.com
  48. // @connect *
  49. // @compatible chrome 完美运行
  50. // @compatible firefox 完美运行
  51. // @supportURL https://github.com/axetroy/anti-redirect/issues/new/choose
  52. // @homepage https://github.com/axetroy/anti-redirect
  53. // @run-at document-start
  54. // @contributionURL troy450409405@gmail.com|alipay.com
  55. // @namespace https://gf.qytechs.cn/zh-CN/users/3400-axetroy
  56. // @license Anti 996 License; https://github.com/axetroy/anti-redirect/blob/master/LICENSE
  57. // ==/UserScript==
  58.  
  59. // Github源码: https://github.com/axetroy/anti-redirect
  60.  
  61. // 如果这能帮助到你,欢迎在 Github 上点击 star 和 follow.
  62.  
  63. // 或者在支付宝搜索 " 511118132 " 领取红包
  64.  
  65. // 你的支持就是我更新的动力
  66.  
  67.  
  68. /******/ (() => { // webpackBootstrap
  69. /******/ var __webpack_modules__ = ([
  70. /* 0 */,
  71. /* 1 */
  72. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  73.  
  74. "use strict";
  75.  
  76. var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
  77. var useValue = arguments.length > 2;
  78. for (var i = 0; i < initializers.length; i++) {
  79. value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
  80. }
  81. return useValue ? value : void 0;
  82. };
  83. var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
  84. function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
  85. var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
  86. var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
  87. var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
  88. var _, done = false;
  89. for (var i = decorators.length - 1; i >= 0; i--) {
  90. var context = {};
  91. for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
  92. for (var p in contextIn.access) context.access[p] = contextIn.access[p];
  93. context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
  94. var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
  95. if (kind === "accessor") {
  96. if (result === void 0) continue;
  97. if (result === null || typeof result !== "object") throw new TypeError("Object expected");
  98. if (_ = accept(result.get)) descriptor.get = _;
  99. if (_ = accept(result.set)) descriptor.set = _;
  100. if (_ = accept(result.init)) initializers.unshift(_);
  101. }
  102. else if (_ = accept(result)) {
  103. if (kind === "field") initializers.unshift(_);
  104. else descriptor[key] = _;
  105. }
  106. }
  107. if (target) Object.defineProperty(target, contextIn.name, descriptor);
  108. done = true;
  109. };
  110. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  111. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  112. return new (P || (P = Promise))(function (resolve, reject) {
  113. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  114. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  115. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  116. step((generator = generator.apply(thisArg, _arguments || [])).next());
  117. });
  118. };
  119. Object.defineProperty(exports, "__esModule", ({ value: true }));
  120. exports.App = void 0;
  121. const utils_1 = __webpack_require__(2);
  122. let App = (() => {
  123. var _a;
  124. let _instanceExtraInitializers = [];
  125. let _onHover_decorators;
  126. let _onScroll_decorators;
  127. return _a = class App {
  128. constructor() {
  129. this.config = (__runInitializers(this, _instanceExtraInitializers), void 0);
  130. this.provides = [];
  131. console.log("%c Anti-Redirect %c Copyright \xa9 2015-%s %s", 'font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;font-size:64px;color:#00bbee;-webkit-text-fill-color:#00bbee;-webkit-text-stroke: 1px #00bbee;', "font-size:12px;color:#999999;", new Date().getFullYear(), "\n" + "Author @Axetroy");
  132. console.log("[Anti Redirect]: 如果发现页面重定向未去除,欢迎反馈!");
  133. console.log(`%c[Anti Redirect]: 支付宝搜索 "%c511118132%c" 领取红包支持作者!`, "font-size: 12px;", "font-size: 16px;color: red", "font-size: 12px;");
  134. }
  135. /**
  136. * A 标签是否匹配服务提供者
  137. * @param aElement
  138. * @param provider
  139. */
  140. isMatchProvider(aElement, provider) {
  141. if (aElement.getAttribute(utils_1.Marker.RedirectStatusDone)) {
  142. return false;
  143. }
  144. if (provider.test instanceof RegExp && !provider.test.test(aElement.href)) {
  145. return false;
  146. }
  147. if (typeof provider.test === "function" && !provider.test(aElement)) {
  148. return false;
  149. }
  150. if (provider.test instanceof Boolean) {
  151. return provider.test;
  152. }
  153. return true;
  154. }
  155. /**
  156. * 当鼠标移动到 A 标签上时
  157. * @param event
  158. */
  159. onHover(event) {
  160. const aElement = event.target;
  161. if (aElement.tagName !== "A") {
  162. return;
  163. }
  164. // trigger on hover handler
  165. for (const provider of this.provides) {
  166. if (this.isMatchProvider(aElement, provider)) {
  167. provider.resolve(aElement);
  168. }
  169. }
  170. }
  171. /**
  172. * 当页面滚动时
  173. */
  174. onScroll() {
  175. // 筛选所有在可视区域内的A标签
  176. const visibleElements = [].slice
  177. .call(document.querySelectorAll("a[href]"))
  178. .filter((aElement) => {
  179. return aElement.href.indexOf("http") > -1 && (0, utils_1.isInView)(aElement) && (0, utils_1.getRedirect)(aElement) <= 2;
  180. });
  181. // trigger scroll handler
  182. for (const provider of this.provides) {
  183. for (const aElement of visibleElements) {
  184. if (this.isMatchProvider(aElement, provider)) {
  185. provider.resolve(aElement);
  186. }
  187. }
  188. }
  189. }
  190. /**
  191. * 当页面准备就绪时,进行初始化动作
  192. */
  193. pageOnReady() {
  194. return __awaiter(this, void 0, void 0, function* () {
  195. for (const provider of this.provides) {
  196. if (provider.onInit) {
  197. yield provider.onInit();
  198. }
  199. // 如果页面处于初始的状态,没有滚动过,则出发一次onScroll事件
  200. if (window.scrollY <= 0) {
  201. this.onScroll();
  202. }
  203. }
  204. });
  205. }
  206. /**
  207. * 设置配置
  208. * @param config
  209. */
  210. setConfig(config) {
  211. this.config = config;
  212. return this;
  213. }
  214. /**
  215. * 注册(不可用)服务提供者
  216. * @param providers
  217. */
  218. registerProvider(providers) {
  219. for (const provideConfig of providers) {
  220. // test 如果是 boolean
  221. if (provideConfig.test === false) {
  222. continue;
  223. }
  224. // test 如果是正则表达式
  225. if (provideConfig.test instanceof RegExp && !provideConfig.test.test(document.domain)) {
  226. continue;
  227. }
  228. // test 如果是一个function
  229. if (typeof provideConfig.test === "function" && provideConfig.test() === false) {
  230. continue;
  231. }
  232. const provider = new provideConfig.provider();
  233. provider.isDebug = this.config.isDebug;
  234. this.provides.push(provider);
  235. console.info(`[Anti-redirect]: 加载引擎 ${provideConfig.name}`);
  236. console.info(`当前页面: '${location.href}'`);
  237. }
  238. return this;
  239. }
  240. /**
  241. * 启动应用
  242. */
  243. bootstrap() {
  244. addEventListener("scroll", this.onScroll.bind(this));
  245. addEventListener("mousemove", this.onHover.bind(this));
  246. addEventListener("DOMContentLoaded", this.pageOnReady.bind(this));
  247. }
  248. },
  249. (() => {
  250. const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
  251. _onHover_decorators = [(0, utils_1.throttleDecorator)(50)];
  252. _onScroll_decorators = [(0, utils_1.debounceDecorator)(300)];
  253. __esDecorate(_a, null, _onHover_decorators, { kind: "method", name: "onHover", static: false, private: false, access: { has: obj => "onHover" in obj, get: obj => obj.onHover }, metadata: _metadata }, null, _instanceExtraInitializers);
  254. __esDecorate(_a, null, _onScroll_decorators, { kind: "method", name: "onScroll", static: false, private: false, access: { has: obj => "onScroll" in obj, get: obj => obj.onScroll }, metadata: _metadata }, null, _instanceExtraInitializers);
  255. if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
  256. })(),
  257. _a;
  258. })();
  259. exports.App = App;
  260.  
  261.  
  262. /***/ }),
  263. /* 2 */
  264. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  265.  
  266. "use strict";
  267.  
  268. Object.defineProperty(exports, "__esModule", ({ value: true }));
  269. exports.antiRedirect = exports.decreaseRedirect = exports.increaseRedirect = exports.getRedirect = exports.isInView = exports.debounceDecorator = exports.throttleDecorator = exports.getText = exports.queryParser = exports.matchLinkFromUrl = exports.Marker = void 0;
  270. const debounce = __webpack_require__(3);
  271. const throttle = __webpack_require__(4);
  272. var Marker;
  273. (function (Marker) {
  274. Marker["RedirectCount"] = "redirect-count";
  275. Marker["RedirectStatusDone"] = "anti-redirect-origin-href";
  276. })(Marker || (exports.Marker = Marker = {}));
  277. /**
  278. * 根据url上的路径匹配,去除重定向
  279. * @param {HTMLAnchorElement} aElement
  280. * @param {RegExp} tester
  281. * @returns {boolean}
  282. */
  283. function matchLinkFromUrl(aElement, tester) {
  284. const matcher = tester.exec(aElement.href);
  285. if (!((matcher === null || matcher === void 0 ? void 0 : matcher.length) && matcher[1])) {
  286. return "";
  287. }
  288. let url = "";
  289. try {
  290. url = decodeURIComponent(matcher[1]);
  291. }
  292. catch (e) {
  293. url = /https?:\/\//.test(matcher[1]) ? matcher[1] : "";
  294. }
  295. return url;
  296. }
  297. exports.matchLinkFromUrl = matchLinkFromUrl;
  298. class Query {
  299. constructor(queryStr) {
  300. this.queryStr = queryStr;
  301. this.object = {};
  302. this.object = this.toObject(queryStr.replace(/^\?+/, ""));
  303. }
  304. toObject(queryStr) {
  305. const obj = {};
  306. queryStr.split("&").forEach((item) => {
  307. const arr = item.split("=") || [];
  308. let key = arr[0] || "";
  309. let value = arr[1] || "";
  310. try {
  311. key = decodeURIComponent(arr[0] || "");
  312. value = decodeURIComponent(arr[1] || "");
  313. }
  314. catch (err) {
  315. //
  316. }
  317. if (key) {
  318. obj[key] = value;
  319. }
  320. });
  321. return obj;
  322. }
  323. toString() {
  324. const arr = [];
  325. for (const key in this.object) {
  326. if (Object.prototype.hasOwnProperty.call(this.object, key)) {
  327. const value = this.object[key];
  328. arr.push(`${key}=${value}`);
  329. }
  330. }
  331. return arr.length ? `?${arr.join("&")}` : "";
  332. }
  333. }
  334. function queryParser(queryString) {
  335. return new Query(queryString);
  336. }
  337. exports.queryParser = queryParser;
  338. function getText(htmlElement) {
  339. return (htmlElement.innerText || htmlElement.textContent).trim();
  340. }
  341. exports.getText = getText;
  342. function throttleDecorator(wait, options = {}) {
  343. return (originMethod, context) => {
  344. return throttle(originMethod, wait, options);
  345. };
  346. }
  347. exports.throttleDecorator = throttleDecorator;
  348. function debounceDecorator(wait, options = {}) {
  349. return (originMethod, context) => {
  350. return debounce(originMethod, wait, options);
  351. };
  352. }
  353. exports.debounceDecorator = debounceDecorator;
  354. function isInView(element) {
  355. const rect = element.getBoundingClientRect();
  356. const vWidth = window.innerWidth || document.documentElement.clientWidth;
  357. const vHeight = window.innerHeight || document.documentElement.clientHeight;
  358. const efp = (x, y) => {
  359. return document.elementFromPoint(x, y);
  360. };
  361. // Return false if it's not in the viewport
  362. if (rect.right < 0 || rect.bottom < 0 || rect.left > vWidth || rect.top > vHeight) {
  363. return false;
  364. }
  365. // Return true if any of its four corners are visible
  366. return (element.contains(efp(rect.left, rect.top)) ||
  367. element.contains(efp(rect.right, rect.top)) ||
  368. element.contains(efp(rect.right, rect.bottom)) ||
  369. element.contains(efp(rect.left, rect.bottom)));
  370. }
  371. exports.isInView = isInView;
  372. function getRedirect(aElement) {
  373. return +(aElement.getAttribute(Marker.RedirectCount) || 0);
  374. }
  375. exports.getRedirect = getRedirect;
  376. function increaseRedirect(aElement) {
  377. const num = getRedirect(aElement);
  378. aElement.setAttribute(Marker.RedirectCount, `${num}${1}`);
  379. }
  380. exports.increaseRedirect = increaseRedirect;
  381. function decreaseRedirect(aElement) {
  382. const num = getRedirect(aElement);
  383. if (num > 0) {
  384. aElement.setAttribute(Marker.RedirectCount, `${num - 1}`);
  385. }
  386. }
  387. exports.decreaseRedirect = decreaseRedirect;
  388. /**
  389. * 去除重定向
  390. * @param aElement A标签元素
  391. * @param realUrl 真实的地址
  392. * @param options
  393. */
  394. function antiRedirect(aElement, realUrl, options = {}) {
  395. options.debug = typeof options.debug === "undefined" ? "production" !== "production" : options.debug;
  396. options.force = options.force;
  397. if (!options.force && (!realUrl || aElement.href === realUrl)) {
  398. return;
  399. }
  400. if (options.debug) {
  401. aElement.style.backgroundColor = "green";
  402. }
  403. aElement.setAttribute(Marker.RedirectStatusDone, aElement.href);
  404. aElement.href = realUrl;
  405. }
  406. exports.antiRedirect = antiRedirect;
  407.  
  408.  
  409. /***/ }),
  410. /* 3 */
  411. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  412.  
  413. /**
  414. * lodash (Custom Build) <https://lodash.com/>
  415. * Build: `lodash modularize exports="npm" -o ./`
  416. * Copyright jQuery Foundation and other contributors <https://jquery.org/>
  417. * Released under MIT license <https://lodash.com/license>
  418. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  419. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  420. */
  421.  
  422. /** Used as the `TypeError` message for "Functions" methods. */
  423. var FUNC_ERROR_TEXT = 'Expected a function';
  424.  
  425. /** Used as references for various `Number` constants. */
  426. var NAN = 0 / 0;
  427.  
  428. /** `Object#toString` result references. */
  429. var symbolTag = '[object Symbol]';
  430.  
  431. /** Used to match leading and trailing whitespace. */
  432. var reTrim = /^\s+|\s+$/g;
  433.  
  434. /** Used to detect bad signed hexadecimal string values. */
  435. var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
  436.  
  437. /** Used to detect binary string values. */
  438. var reIsBinary = /^0b[01]+$/i;
  439.  
  440. /** Used to detect octal string values. */
  441. var reIsOctal = /^0o[0-7]+$/i;
  442.  
  443. /** Built-in method references without a dependency on `root`. */
  444. var freeParseInt = parseInt;
  445.  
  446. /** Detect free variable `global` from Node.js. */
  447. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  448.  
  449. /** Detect free variable `self`. */
  450. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  451.  
  452. /** Used as a reference to the global object. */
  453. var root = freeGlobal || freeSelf || Function('return this')();
  454.  
  455. /** Used for built-in method references. */
  456. var objectProto = Object.prototype;
  457.  
  458. /**
  459. * Used to resolve the
  460. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  461. * of values.
  462. */
  463. var objectToString = objectProto.toString;
  464.  
  465. /* Built-in method references for those with the same name as other `lodash` methods. */
  466. var nativeMax = Math.max,
  467. nativeMin = Math.min;
  468.  
  469. /**
  470. * Gets the timestamp of the number of milliseconds that have elapsed since
  471. * the Unix epoch (1 January 1970 00:00:00 UTC).
  472. *
  473. * @static
  474. * @memberOf _
  475. * @since 2.4.0
  476. * @category Date
  477. * @returns {number} Returns the timestamp.
  478. * @example
  479. *
  480. * _.defer(function(stamp) {
  481. * console.log(_.now() - stamp);
  482. * }, _.now());
  483. * // => Logs the number of milliseconds it took for the deferred invocation.
  484. */
  485. var now = function() {
  486. return root.Date.now();
  487. };
  488.  
  489. /**
  490. * Creates a debounced function that delays invoking `func` until after `wait`
  491. * milliseconds have elapsed since the last time the debounced function was
  492. * invoked. The debounced function comes with a `cancel` method to cancel
  493. * delayed `func` invocations and a `flush` method to immediately invoke them.
  494. * Provide `options` to indicate whether `func` should be invoked on the
  495. * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
  496. * with the last arguments provided to the debounced function. Subsequent
  497. * calls to the debounced function return the result of the last `func`
  498. * invocation.
  499. *
  500. * **Note:** If `leading` and `trailing` options are `true`, `func` is
  501. * invoked on the trailing edge of the timeout only if the debounced function
  502. * is invoked more than once during the `wait` timeout.
  503. *
  504. * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
  505. * until to the next tick, similar to `setTimeout` with a timeout of `0`.
  506. *
  507. * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
  508. * for details over the differences between `_.debounce` and `_.throttle`.
  509. *
  510. * @static
  511. * @memberOf _
  512. * @since 0.1.0
  513. * @category Function
  514. * @param {Function} func The function to debounce.
  515. * @param {number} [wait=0] The number of milliseconds to delay.
  516. * @param {Object} [options={}] The options object.
  517. * @param {boolean} [options.leading=false]
  518. * Specify invoking on the leading edge of the timeout.
  519. * @param {number} [options.maxWait]
  520. * The maximum time `func` is allowed to be delayed before it's invoked.
  521. * @param {boolean} [options.trailing=true]
  522. * Specify invoking on the trailing edge of the timeout.
  523. * @returns {Function} Returns the new debounced function.
  524. * @example
  525. *
  526. * // Avoid costly calculations while the window size is in flux.
  527. * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
  528. *
  529. * // Invoke `sendMail` when clicked, debouncing subsequent calls.
  530. * jQuery(element).on('click', _.debounce(sendMail, 300, {
  531. * 'leading': true,
  532. * 'trailing': false
  533. * }));
  534. *
  535. * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
  536. * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
  537. * var source = new EventSource('/stream');
  538. * jQuery(source).on('message', debounced);
  539. *
  540. * // Cancel the trailing debounced invocation.
  541. * jQuery(window).on('popstate', debounced.cancel);
  542. */
  543. function debounce(func, wait, options) {
  544. var lastArgs,
  545. lastThis,
  546. maxWait,
  547. result,
  548. timerId,
  549. lastCallTime,
  550. lastInvokeTime = 0,
  551. leading = false,
  552. maxing = false,
  553. trailing = true;
  554.  
  555. if (typeof func != 'function') {
  556. throw new TypeError(FUNC_ERROR_TEXT);
  557. }
  558. wait = toNumber(wait) || 0;
  559. if (isObject(options)) {
  560. leading = !!options.leading;
  561. maxing = 'maxWait' in options;
  562. maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
  563. trailing = 'trailing' in options ? !!options.trailing : trailing;
  564. }
  565.  
  566. function invokeFunc(time) {
  567. var args = lastArgs,
  568. thisArg = lastThis;
  569.  
  570. lastArgs = lastThis = undefined;
  571. lastInvokeTime = time;
  572. result = func.apply(thisArg, args);
  573. return result;
  574. }
  575.  
  576. function leadingEdge(time) {
  577. // Reset any `maxWait` timer.
  578. lastInvokeTime = time;
  579. // Start the timer for the trailing edge.
  580. timerId = setTimeout(timerExpired, wait);
  581. // Invoke the leading edge.
  582. return leading ? invokeFunc(time) : result;
  583. }
  584.  
  585. function remainingWait(time) {
  586. var timeSinceLastCall = time - lastCallTime,
  587. timeSinceLastInvoke = time - lastInvokeTime,
  588. result = wait - timeSinceLastCall;
  589.  
  590. return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
  591. }
  592.  
  593. function shouldInvoke(time) {
  594. var timeSinceLastCall = time - lastCallTime,
  595. timeSinceLastInvoke = time - lastInvokeTime;
  596.  
  597. // Either this is the first call, activity has stopped and we're at the
  598. // trailing edge, the system time has gone backwards and we're treating
  599. // it as the trailing edge, or we've hit the `maxWait` limit.
  600. return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
  601. (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
  602. }
  603.  
  604. function timerExpired() {
  605. var time = now();
  606. if (shouldInvoke(time)) {
  607. return trailingEdge(time);
  608. }
  609. // Restart the timer.
  610. timerId = setTimeout(timerExpired, remainingWait(time));
  611. }
  612.  
  613. function trailingEdge(time) {
  614. timerId = undefined;
  615.  
  616. // Only invoke if we have `lastArgs` which means `func` has been
  617. // debounced at least once.
  618. if (trailing && lastArgs) {
  619. return invokeFunc(time);
  620. }
  621. lastArgs = lastThis = undefined;
  622. return result;
  623. }
  624.  
  625. function cancel() {
  626. if (timerId !== undefined) {
  627. clearTimeout(timerId);
  628. }
  629. lastInvokeTime = 0;
  630. lastArgs = lastCallTime = lastThis = timerId = undefined;
  631. }
  632.  
  633. function flush() {
  634. return timerId === undefined ? result : trailingEdge(now());
  635. }
  636.  
  637. function debounced() {
  638. var time = now(),
  639. isInvoking = shouldInvoke(time);
  640.  
  641. lastArgs = arguments;
  642. lastThis = this;
  643. lastCallTime = time;
  644.  
  645. if (isInvoking) {
  646. if (timerId === undefined) {
  647. return leadingEdge(lastCallTime);
  648. }
  649. if (maxing) {
  650. // Handle invocations in a tight loop.
  651. timerId = setTimeout(timerExpired, wait);
  652. return invokeFunc(lastCallTime);
  653. }
  654. }
  655. if (timerId === undefined) {
  656. timerId = setTimeout(timerExpired, wait);
  657. }
  658. return result;
  659. }
  660. debounced.cancel = cancel;
  661. debounced.flush = flush;
  662. return debounced;
  663. }
  664.  
  665. /**
  666. * Checks if `value` is the
  667. * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
  668. * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
  669. *
  670. * @static
  671. * @memberOf _
  672. * @since 0.1.0
  673. * @category Lang
  674. * @param {*} value The value to check.
  675. * @returns {boolean} Returns `true` if `value` is an object, else `false`.
  676. * @example
  677. *
  678. * _.isObject({});
  679. * // => true
  680. *
  681. * _.isObject([1, 2, 3]);
  682. * // => true
  683. *
  684. * _.isObject(_.noop);
  685. * // => true
  686. *
  687. * _.isObject(null);
  688. * // => false
  689. */
  690. function isObject(value) {
  691. var type = typeof value;
  692. return !!value && (type == 'object' || type == 'function');
  693. }
  694.  
  695. /**
  696. * Checks if `value` is object-like. A value is object-like if it's not `null`
  697. * and has a `typeof` result of "object".
  698. *
  699. * @static
  700. * @memberOf _
  701. * @since 4.0.0
  702. * @category Lang
  703. * @param {*} value The value to check.
  704. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  705. * @example
  706. *
  707. * _.isObjectLike({});
  708. * // => true
  709. *
  710. * _.isObjectLike([1, 2, 3]);
  711. * // => true
  712. *
  713. * _.isObjectLike(_.noop);
  714. * // => false
  715. *
  716. * _.isObjectLike(null);
  717. * // => false
  718. */
  719. function isObjectLike(value) {
  720. return !!value && typeof value == 'object';
  721. }
  722.  
  723. /**
  724. * Checks if `value` is classified as a `Symbol` primitive or object.
  725. *
  726. * @static
  727. * @memberOf _
  728. * @since 4.0.0
  729. * @category Lang
  730. * @param {*} value The value to check.
  731. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
  732. * @example
  733. *
  734. * _.isSymbol(Symbol.iterator);
  735. * // => true
  736. *
  737. * _.isSymbol('abc');
  738. * // => false
  739. */
  740. function isSymbol(value) {
  741. return typeof value == 'symbol' ||
  742. (isObjectLike(value) && objectToString.call(value) == symbolTag);
  743. }
  744.  
  745. /**
  746. * Converts `value` to a number.
  747. *
  748. * @static
  749. * @memberOf _
  750. * @since 4.0.0
  751. * @category Lang
  752. * @param {*} value The value to process.
  753. * @returns {number} Returns the number.
  754. * @example
  755. *
  756. * _.toNumber(3.2);
  757. * // => 3.2
  758. *
  759. * _.toNumber(Number.MIN_VALUE);
  760. * // => 5e-324
  761. *
  762. * _.toNumber(Infinity);
  763. * // => Infinity
  764. *
  765. * _.toNumber('3.2');
  766. * // => 3.2
  767. */
  768. function toNumber(value) {
  769. if (typeof value == 'number') {
  770. return value;
  771. }
  772. if (isSymbol(value)) {
  773. return NAN;
  774. }
  775. if (isObject(value)) {
  776. var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
  777. value = isObject(other) ? (other + '') : other;
  778. }
  779. if (typeof value != 'string') {
  780. return value === 0 ? value : +value;
  781. }
  782. value = value.replace(reTrim, '');
  783. var isBinary = reIsBinary.test(value);
  784. return (isBinary || reIsOctal.test(value))
  785. ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
  786. : (reIsBadHex.test(value) ? NAN : +value);
  787. }
  788.  
  789. module.exports = debounce;
  790.  
  791.  
  792. /***/ }),
  793. /* 4 */
  794. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  795.  
  796. /**
  797. * lodash (Custom Build) <https://lodash.com/>
  798. * Build: `lodash modularize exports="npm" -o ./`
  799. * Copyright jQuery Foundation and other contributors <https://jquery.org/>
  800. * Released under MIT license <https://lodash.com/license>
  801. * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
  802. * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
  803. */
  804.  
  805. /** Used as the `TypeError` message for "Functions" methods. */
  806. var FUNC_ERROR_TEXT = 'Expected a function';
  807.  
  808. /** Used as references for various `Number` constants. */
  809. var NAN = 0 / 0;
  810.  
  811. /** `Object#toString` result references. */
  812. var symbolTag = '[object Symbol]';
  813.  
  814. /** Used to match leading and trailing whitespace. */
  815. var reTrim = /^\s+|\s+$/g;
  816.  
  817. /** Used to detect bad signed hexadecimal string values. */
  818. var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
  819.  
  820. /** Used to detect binary string values. */
  821. var reIsBinary = /^0b[01]+$/i;
  822.  
  823. /** Used to detect octal string values. */
  824. var reIsOctal = /^0o[0-7]+$/i;
  825.  
  826. /** Built-in method references without a dependency on `root`. */
  827. var freeParseInt = parseInt;
  828.  
  829. /** Detect free variable `global` from Node.js. */
  830. var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
  831.  
  832. /** Detect free variable `self`. */
  833. var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
  834.  
  835. /** Used as a reference to the global object. */
  836. var root = freeGlobal || freeSelf || Function('return this')();
  837.  
  838. /** Used for built-in method references. */
  839. var objectProto = Object.prototype;
  840.  
  841. /**
  842. * Used to resolve the
  843. * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
  844. * of values.
  845. */
  846. var objectToString = objectProto.toString;
  847.  
  848. /* Built-in method references for those with the same name as other `lodash` methods. */
  849. var nativeMax = Math.max,
  850. nativeMin = Math.min;
  851.  
  852. /**
  853. * Gets the timestamp of the number of milliseconds that have elapsed since
  854. * the Unix epoch (1 January 1970 00:00:00 UTC).
  855. *
  856. * @static
  857. * @memberOf _
  858. * @since 2.4.0
  859. * @category Date
  860. * @returns {number} Returns the timestamp.
  861. * @example
  862. *
  863. * _.defer(function(stamp) {
  864. * console.log(_.now() - stamp);
  865. * }, _.now());
  866. * // => Logs the number of milliseconds it took for the deferred invocation.
  867. */
  868. var now = function() {
  869. return root.Date.now();
  870. };
  871.  
  872. /**
  873. * Creates a debounced function that delays invoking `func` until after `wait`
  874. * milliseconds have elapsed since the last time the debounced function was
  875. * invoked. The debounced function comes with a `cancel` method to cancel
  876. * delayed `func` invocations and a `flush` method to immediately invoke them.
  877. * Provide `options` to indicate whether `func` should be invoked on the
  878. * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
  879. * with the last arguments provided to the debounced function. Subsequent
  880. * calls to the debounced function return the result of the last `func`
  881. * invocation.
  882. *
  883. * **Note:** If `leading` and `trailing` options are `true`, `func` is
  884. * invoked on the trailing edge of the timeout only if the debounced function
  885. * is invoked more than once during the `wait` timeout.
  886. *
  887. * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
  888. * until to the next tick, similar to `setTimeout` with a timeout of `0`.
  889. *
  890. * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
  891. * for details over the differences between `_.debounce` and `_.throttle`.
  892. *
  893. * @static
  894. * @memberOf _
  895. * @since 0.1.0
  896. * @category Function
  897. * @param {Function} func The function to debounce.
  898. * @param {number} [wait=0] The number of milliseconds to delay.
  899. * @param {Object} [options={}] The options object.
  900. * @param {boolean} [options.leading=false]
  901. * Specify invoking on the leading edge of the timeout.
  902. * @param {number} [options.maxWait]
  903. * The maximum time `func` is allowed to be delayed before it's invoked.
  904. * @param {boolean} [options.trailing=true]
  905. * Specify invoking on the trailing edge of the timeout.
  906. * @returns {Function} Returns the new debounced function.
  907. * @example
  908. *
  909. * // Avoid costly calculations while the window size is in flux.
  910. * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
  911. *
  912. * // Invoke `sendMail` when clicked, debouncing subsequent calls.
  913. * jQuery(element).on('click', _.debounce(sendMail, 300, {
  914. * 'leading': true,
  915. * 'trailing': false
  916. * }));
  917. *
  918. * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
  919. * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
  920. * var source = new EventSource('/stream');
  921. * jQuery(source).on('message', debounced);
  922. *
  923. * // Cancel the trailing debounced invocation.
  924. * jQuery(window).on('popstate', debounced.cancel);
  925. */
  926. function debounce(func, wait, options) {
  927. var lastArgs,
  928. lastThis,
  929. maxWait,
  930. result,
  931. timerId,
  932. lastCallTime,
  933. lastInvokeTime = 0,
  934. leading = false,
  935. maxing = false,
  936. trailing = true;
  937.  
  938. if (typeof func != 'function') {
  939. throw new TypeError(FUNC_ERROR_TEXT);
  940. }
  941. wait = toNumber(wait) || 0;
  942. if (isObject(options)) {
  943. leading = !!options.leading;
  944. maxing = 'maxWait' in options;
  945. maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
  946. trailing = 'trailing' in options ? !!options.trailing : trailing;
  947. }
  948.  
  949. function invokeFunc(time) {
  950. var args = lastArgs,
  951. thisArg = lastThis;
  952.  
  953. lastArgs = lastThis = undefined;
  954. lastInvokeTime = time;
  955. result = func.apply(thisArg, args);
  956. return result;
  957. }
  958.  
  959. function leadingEdge(time) {
  960. // Reset any `maxWait` timer.
  961. lastInvokeTime = time;
  962. // Start the timer for the trailing edge.
  963. timerId = setTimeout(timerExpired, wait);
  964. // Invoke the leading edge.
  965. return leading ? invokeFunc(time) : result;
  966. }
  967.  
  968. function remainingWait(time) {
  969. var timeSinceLastCall = time - lastCallTime,
  970. timeSinceLastInvoke = time - lastInvokeTime,
  971. result = wait - timeSinceLastCall;
  972.  
  973. return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
  974. }
  975.  
  976. function shouldInvoke(time) {
  977. var timeSinceLastCall = time - lastCallTime,
  978. timeSinceLastInvoke = time - lastInvokeTime;
  979.  
  980. // Either this is the first call, activity has stopped and we're at the
  981. // trailing edge, the system time has gone backwards and we're treating
  982. // it as the trailing edge, or we've hit the `maxWait` limit.
  983. return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
  984. (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
  985. }
  986.  
  987. function timerExpired() {
  988. var time = now();
  989. if (shouldInvoke(time)) {
  990. return trailingEdge(time);
  991. }
  992. // Restart the timer.
  993. timerId = setTimeout(timerExpired, remainingWait(time));
  994. }
  995.  
  996. function trailingEdge(time) {
  997. timerId = undefined;
  998.  
  999. // Only invoke if we have `lastArgs` which means `func` has been
  1000. // debounced at least once.
  1001. if (trailing && lastArgs) {
  1002. return invokeFunc(time);
  1003. }
  1004. lastArgs = lastThis = undefined;
  1005. return result;
  1006. }
  1007.  
  1008. function cancel() {
  1009. if (timerId !== undefined) {
  1010. clearTimeout(timerId);
  1011. }
  1012. lastInvokeTime = 0;
  1013. lastArgs = lastCallTime = lastThis = timerId = undefined;
  1014. }
  1015.  
  1016. function flush() {
  1017. return timerId === undefined ? result : trailingEdge(now());
  1018. }
  1019.  
  1020. function debounced() {
  1021. var time = now(),
  1022. isInvoking = shouldInvoke(time);
  1023.  
  1024. lastArgs = arguments;
  1025. lastThis = this;
  1026. lastCallTime = time;
  1027.  
  1028. if (isInvoking) {
  1029. if (timerId === undefined) {
  1030. return leadingEdge(lastCallTime);
  1031. }
  1032. if (maxing) {
  1033. // Handle invocations in a tight loop.
  1034. timerId = setTimeout(timerExpired, wait);
  1035. return invokeFunc(lastCallTime);
  1036. }
  1037. }
  1038. if (timerId === undefined) {
  1039. timerId = setTimeout(timerExpired, wait);
  1040. }
  1041. return result;
  1042. }
  1043. debounced.cancel = cancel;
  1044. debounced.flush = flush;
  1045. return debounced;
  1046. }
  1047.  
  1048. /**
  1049. * Creates a throttled function that only invokes `func` at most once per
  1050. * every `wait` milliseconds. The throttled function comes with a `cancel`
  1051. * method to cancel delayed `func` invocations and a `flush` method to
  1052. * immediately invoke them. Provide `options` to indicate whether `func`
  1053. * should be invoked on the leading and/or trailing edge of the `wait`
  1054. * timeout. The `func` is invoked with the last arguments provided to the
  1055. * throttled function. Subsequent calls to the throttled function return the
  1056. * result of the last `func` invocation.
  1057. *
  1058. * **Note:** If `leading` and `trailing` options are `true`, `func` is
  1059. * invoked on the trailing edge of the timeout only if the throttled function
  1060. * is invoked more than once during the `wait` timeout.
  1061. *
  1062. * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
  1063. * until to the next tick, similar to `setTimeout` with a timeout of `0`.
  1064. *
  1065. * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
  1066. * for details over the differences between `_.throttle` and `_.debounce`.
  1067. *
  1068. * @static
  1069. * @memberOf _
  1070. * @since 0.1.0
  1071. * @category Function
  1072. * @param {Function} func The function to throttle.
  1073. * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
  1074. * @param {Object} [options={}] The options object.
  1075. * @param {boolean} [options.leading=true]
  1076. * Specify invoking on the leading edge of the timeout.
  1077. * @param {boolean} [options.trailing=true]
  1078. * Specify invoking on the trailing edge of the timeout.
  1079. * @returns {Function} Returns the new throttled function.
  1080. * @example
  1081. *
  1082. * // Avoid excessively updating the position while scrolling.
  1083. * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
  1084. *
  1085. * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
  1086. * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
  1087. * jQuery(element).on('click', throttled);
  1088. *
  1089. * // Cancel the trailing throttled invocation.
  1090. * jQuery(window).on('popstate', throttled.cancel);
  1091. */
  1092. function throttle(func, wait, options) {
  1093. var leading = true,
  1094. trailing = true;
  1095.  
  1096. if (typeof func != 'function') {
  1097. throw new TypeError(FUNC_ERROR_TEXT);
  1098. }
  1099. if (isObject(options)) {
  1100. leading = 'leading' in options ? !!options.leading : leading;
  1101. trailing = 'trailing' in options ? !!options.trailing : trailing;
  1102. }
  1103. return debounce(func, wait, {
  1104. 'leading': leading,
  1105. 'maxWait': wait,
  1106. 'trailing': trailing
  1107. });
  1108. }
  1109.  
  1110. /**
  1111. * Checks if `value` is the
  1112. * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
  1113. * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
  1114. *
  1115. * @static
  1116. * @memberOf _
  1117. * @since 0.1.0
  1118. * @category Lang
  1119. * @param {*} value The value to check.
  1120. * @returns {boolean} Returns `true` if `value` is an object, else `false`.
  1121. * @example
  1122. *
  1123. * _.isObject({});
  1124. * // => true
  1125. *
  1126. * _.isObject([1, 2, 3]);
  1127. * // => true
  1128. *
  1129. * _.isObject(_.noop);
  1130. * // => true
  1131. *
  1132. * _.isObject(null);
  1133. * // => false
  1134. */
  1135. function isObject(value) {
  1136. var type = typeof value;
  1137. return !!value && (type == 'object' || type == 'function');
  1138. }
  1139.  
  1140. /**
  1141. * Checks if `value` is object-like. A value is object-like if it's not `null`
  1142. * and has a `typeof` result of "object".
  1143. *
  1144. * @static
  1145. * @memberOf _
  1146. * @since 4.0.0
  1147. * @category Lang
  1148. * @param {*} value The value to check.
  1149. * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
  1150. * @example
  1151. *
  1152. * _.isObjectLike({});
  1153. * // => true
  1154. *
  1155. * _.isObjectLike([1, 2, 3]);
  1156. * // => true
  1157. *
  1158. * _.isObjectLike(_.noop);
  1159. * // => false
  1160. *
  1161. * _.isObjectLike(null);
  1162. * // => false
  1163. */
  1164. function isObjectLike(value) {
  1165. return !!value && typeof value == 'object';
  1166. }
  1167.  
  1168. /**
  1169. * Checks if `value` is classified as a `Symbol` primitive or object.
  1170. *
  1171. * @static
  1172. * @memberOf _
  1173. * @since 4.0.0
  1174. * @category Lang
  1175. * @param {*} value The value to check.
  1176. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
  1177. * @example
  1178. *
  1179. * _.isSymbol(Symbol.iterator);
  1180. * // => true
  1181. *
  1182. * _.isSymbol('abc');
  1183. * // => false
  1184. */
  1185. function isSymbol(value) {
  1186. return typeof value == 'symbol' ||
  1187. (isObjectLike(value) && objectToString.call(value) == symbolTag);
  1188. }
  1189.  
  1190. /**
  1191. * Converts `value` to a number.
  1192. *
  1193. * @static
  1194. * @memberOf _
  1195. * @since 4.0.0
  1196. * @category Lang
  1197. * @param {*} value The value to process.
  1198. * @returns {number} Returns the number.
  1199. * @example
  1200. *
  1201. * _.toNumber(3.2);
  1202. * // => 3.2
  1203. *
  1204. * _.toNumber(Number.MIN_VALUE);
  1205. * // => 5e-324
  1206. *
  1207. * _.toNumber(Infinity);
  1208. * // => Infinity
  1209. *
  1210. * _.toNumber('3.2');
  1211. * // => 3.2
  1212. */
  1213. function toNumber(value) {
  1214. if (typeof value == 'number') {
  1215. return value;
  1216. }
  1217. if (isSymbol(value)) {
  1218. return NAN;
  1219. }
  1220. if (isObject(value)) {
  1221. var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
  1222. value = isObject(other) ? (other + '') : other;
  1223. }
  1224. if (typeof value != 'string') {
  1225. return value === 0 ? value : +value;
  1226. }
  1227. value = value.replace(reTrim, '');
  1228. var isBinary = reIsBinary.test(value);
  1229. return (isBinary || reIsOctal.test(value))
  1230. ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
  1231. : (reIsBadHex.test(value) ? NAN : +value);
  1232. }
  1233.  
  1234. module.exports = throttle;
  1235.  
  1236.  
  1237. /***/ }),
  1238. /* 5 */
  1239. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1240.  
  1241. "use strict";
  1242.  
  1243. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1244. exports.RuyoProvider = void 0;
  1245. const utils_1 = __webpack_require__(2);
  1246. class RuyoProvider {
  1247. constructor() {
  1248. this.test = /\/[^\?]*\?u=(.*)/;
  1249. }
  1250. resolve(aElement) {
  1251. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("u"));
  1252. }
  1253. }
  1254. exports.RuyoProvider = RuyoProvider;
  1255.  
  1256.  
  1257. /***/ }),
  1258. /* 6 */
  1259. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1260.  
  1261. "use strict";
  1262.  
  1263. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1264. exports.MozillaProvider = void 0;
  1265. const utils_1 = __webpack_require__(2);
  1266. class MozillaProvider {
  1267. constructor() {
  1268. this.test = /outgoing\.prod\.mozaws\.net\/v\d\/\w+\/(.*)/;
  1269. }
  1270. resolve(aElement) {
  1271. (0, utils_1.antiRedirect)(aElement, (0, utils_1.matchLinkFromUrl)(aElement, this.test));
  1272. }
  1273. }
  1274. exports.MozillaProvider = MozillaProvider;
  1275.  
  1276.  
  1277. /***/ }),
  1278. /* 7 */
  1279. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  1280.  
  1281. "use strict";
  1282.  
  1283. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  1284. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  1285. return new (P || (P = Promise))(function (resolve, reject) {
  1286. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  1287. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  1288. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  1289. step((generator = generator.apply(thisArg, _arguments || [])).next());
  1290. });
  1291. };
  1292. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1293. exports.YinXiangProvider = void 0;
  1294. const utils_1 = __webpack_require__(2);
  1295. class YinXiangProvider {
  1296. constructor() {
  1297. this.test = /^http:\/\//;
  1298. }
  1299. resolve(aElement) {
  1300. // 编辑器
  1301. if (aElement.hasAttribute("data-mce-href")) {
  1302. if (!aElement.onclick) {
  1303. (0, utils_1.antiRedirect)(aElement, aElement.href, { force: true });
  1304. aElement.onclick = (e) => {
  1305. // 阻止事件冒泡, 因为上层元素绑定的click事件会重定向
  1306. if (e.stopPropagation) {
  1307. e.stopPropagation();
  1308. }
  1309. aElement.setAttribute("target", "_blank");
  1310. window.top ? window.top.open(aElement.href) : window.open(aElement.href);
  1311. };
  1312. }
  1313. }
  1314. // 分享页面
  1315. else if (/^https:\/\/app\.yinxiang\.com\/OutboundRedirect\.action\?dest=/.test(aElement.href)) {
  1316. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("dest"));
  1317. }
  1318. }
  1319. onInit() {
  1320. return __awaiter(this, void 0, void 0, function* () {
  1321. const handler = (e) => {
  1322. const dom = e.target;
  1323. const tagName = dom.tagName.toUpperCase();
  1324. switch (tagName) {
  1325. case "A": {
  1326. this.resolve(dom);
  1327. break;
  1328. }
  1329. case "IFRAME": {
  1330. if (dom.hasAttribute("anti-redirect-handled")) {
  1331. return;
  1332. }
  1333. dom.setAttribute("anti-redirect-handled", "1");
  1334. dom.contentWindow.document.addEventListener("mouseover", handler);
  1335. break;
  1336. }
  1337. }
  1338. };
  1339. document.addEventListener("mouseover", handler);
  1340. return this;
  1341. });
  1342. }
  1343. }
  1344. exports.YinXiangProvider = YinXiangProvider;
  1345.  
  1346.  
  1347. /***/ }),
  1348. /* 8 */
  1349. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1350.  
  1351. "use strict";
  1352.  
  1353. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1354. exports.CSDNProvider = void 0;
  1355. const utils_1 = __webpack_require__(2);
  1356. class CSDNProvider {
  1357. constructor() {
  1358. this.test = /^https?:\/\//;
  1359. }
  1360. resolve(aElement) {
  1361. var _a;
  1362. this.container = document.querySelector("#content_views");
  1363. if ((_a = this.container) === null || _a === void 0 ? void 0 : _a.contains(aElement)) {
  1364. if (!aElement.onclick && aElement.origin !== window.location.origin) {
  1365. (0, utils_1.antiRedirect)(aElement, aElement.href, { force: true });
  1366. aElement.onclick = (e) => {
  1367. // 阻止事件冒泡, 因为上层元素绑定的click事件会重定向
  1368. if (e.stopPropagation) {
  1369. e.stopPropagation();
  1370. }
  1371. aElement.setAttribute("target", "_blank");
  1372. };
  1373. }
  1374. }
  1375. }
  1376. }
  1377. exports.CSDNProvider = CSDNProvider;
  1378.  
  1379.  
  1380. /***/ }),
  1381. /* 9 */
  1382. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1383.  
  1384. "use strict";
  1385.  
  1386. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1387. exports.OSChinaProvider = void 0;
  1388. const utils_1 = __webpack_require__(2);
  1389. class OSChinaProvider {
  1390. constructor() {
  1391. this.test = /oschina\.net\/action\/GoToLink\?url=(.*)/;
  1392. }
  1393. resolve(aElement) {
  1394. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("url"));
  1395. }
  1396. }
  1397. exports.OSChinaProvider = OSChinaProvider;
  1398.  
  1399.  
  1400. /***/ }),
  1401. /* 10 */
  1402. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1403.  
  1404. "use strict";
  1405.  
  1406. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1407. exports.ZhihuDailyProvider = void 0;
  1408. const utils_1 = __webpack_require__(2);
  1409. class ZhihuDailyProvider {
  1410. constructor() {
  1411. this.test = /zhihu\.com\/\?target=(.*)/;
  1412. }
  1413. resolve(aElement) {
  1414. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("target"));
  1415. }
  1416. }
  1417. exports.ZhihuDailyProvider = ZhihuDailyProvider;
  1418.  
  1419.  
  1420. /***/ }),
  1421. /* 11 */
  1422. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1423.  
  1424. "use strict";
  1425.  
  1426. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1427. exports.GoogleDocsProvider = void 0;
  1428. const utils_1 = __webpack_require__(2);
  1429. class GoogleDocsProvider {
  1430. constructor() {
  1431. this.test = /www\.google\.com\/url\?q=(.*)/;
  1432. }
  1433. resolve(aElement) {
  1434. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("q"));
  1435. }
  1436. }
  1437. exports.GoogleDocsProvider = GoogleDocsProvider;
  1438.  
  1439.  
  1440. /***/ }),
  1441. /* 12 */
  1442. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1443.  
  1444. "use strict";
  1445.  
  1446. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1447. exports.PocketProvider = void 0;
  1448. const utils_1 = __webpack_require__(2);
  1449. class PocketProvider {
  1450. constructor() {
  1451. this.test = /getpocket\.com\/redirect\?url=(.*)/;
  1452. }
  1453. resolve(aElement) {
  1454. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("url"));
  1455. }
  1456. }
  1457. exports.PocketProvider = PocketProvider;
  1458.  
  1459.  
  1460. /***/ }),
  1461. /* 13 */
  1462. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1463.  
  1464. "use strict";
  1465.  
  1466. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1467. exports.GmailProvider = void 0;
  1468. const utils_1 = __webpack_require__(2);
  1469. class GmailProvider {
  1470. constructor() {
  1471. this.test = true;
  1472. this.REDIRECT_PROPERTY = "data-saferedirecturl";
  1473. }
  1474. resolve(aElement) {
  1475. // 移除这个属性,那么 a 链接就不会跳转
  1476. // FIXME: gmail 是多层 iframe 嵌套
  1477. if (aElement.getAttribute(this.REDIRECT_PROPERTY)) {
  1478. aElement.removeAttribute(this.REDIRECT_PROPERTY);
  1479. (0, utils_1.antiRedirect)(aElement, aElement.href);
  1480. }
  1481. }
  1482. }
  1483. exports.GmailProvider = GmailProvider;
  1484.  
  1485.  
  1486. /***/ }),
  1487. /* 14 */
  1488. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1489.  
  1490. "use strict";
  1491.  
  1492. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1493. exports.JuejinProvider = void 0;
  1494. const utils_1 = __webpack_require__(2);
  1495. class JuejinProvider {
  1496. constructor() {
  1497. this.test = /link\.juejin\.(im|cn)\/\?target=(.*)/;
  1498. }
  1499. resolve(aElement) {
  1500. const finalURL = new URL(aElement.href).searchParams.get("target");
  1501. (0, utils_1.antiRedirect)(aElement, finalURL);
  1502. if (this.test.test(aElement.title)) {
  1503. aElement.title = finalURL;
  1504. }
  1505. }
  1506. }
  1507. exports.JuejinProvider = JuejinProvider;
  1508.  
  1509.  
  1510. /***/ }),
  1511. /* 15 */
  1512. /***/ ((__unused_webpack_module, exports) => {
  1513.  
  1514. "use strict";
  1515.  
  1516. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1517. exports.QQMailProvider = void 0;
  1518. class QQMailProvider {
  1519. constructor() {
  1520. this.test = true;
  1521. }
  1522. resolve(aElement) {
  1523. var _a;
  1524. this.container = document.querySelector("#contentDiv");
  1525. if ((_a = this.container) === null || _a === void 0 ? void 0 : _a.contains(aElement)) {
  1526. if (aElement.onclick) {
  1527. aElement.onclick = (e) => {
  1528. // 阻止事件冒泡, 因为上层元素绑定的click事件会重定向
  1529. if (e.stopPropagation) {
  1530. e.stopPropagation();
  1531. }
  1532. };
  1533. }
  1534. }
  1535. }
  1536. }
  1537. exports.QQMailProvider = QQMailProvider;
  1538.  
  1539.  
  1540. /***/ }),
  1541. /* 16 */
  1542. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1543.  
  1544. "use strict";
  1545.  
  1546. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1547. exports.MiJiProvider = void 0;
  1548. const utils_1 = __webpack_require__(2);
  1549. class MiJiProvider {
  1550. constructor() {
  1551. this.test = /mijisou\.com\/url_proxy\?proxyurl=(.*)/;
  1552. }
  1553. resolve(aElement) {
  1554. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("proxyurl"));
  1555. }
  1556. }
  1557. exports.MiJiProvider = MiJiProvider;
  1558.  
  1559.  
  1560. /***/ }),
  1561. /* 17 */
  1562. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1563.  
  1564. "use strict";
  1565.  
  1566. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1567. exports.GooglePlayProvider = void 0;
  1568. const utils_1 = __webpack_require__(2);
  1569. class GooglePlayProvider {
  1570. test(aElement) {
  1571. if (/google\.com\/url\?q=(.*)/.test(aElement.href)) {
  1572. return true;
  1573. }
  1574. else if (/^\/store\/apps\/details/.test(location.pathname)) {
  1575. return true;
  1576. }
  1577. return false;
  1578. }
  1579. resolve(aElement) {
  1580. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("q"));
  1581. // 移除开发者栏目下的重定向
  1582. const eles = [].slice.call(document.querySelectorAll("a.hrTbp"));
  1583. for (const ele of eles) {
  1584. if (!ele.href) {
  1585. continue;
  1586. }
  1587. if (ele.getAttribute(utils_1.Marker.RedirectStatusDone)) {
  1588. continue;
  1589. }
  1590. ele.setAttribute(utils_1.Marker.RedirectStatusDone, ele.href);
  1591. ele.setAttribute("target", "_blank");
  1592. ele.addEventListener("click", (event) => {
  1593. event.stopPropagation();
  1594. }, true);
  1595. }
  1596. }
  1597. }
  1598. exports.GooglePlayProvider = GooglePlayProvider;
  1599.  
  1600.  
  1601. /***/ }),
  1602. /* 18 */
  1603. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1604.  
  1605. "use strict";
  1606.  
  1607. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1608. exports.SteamProvider = void 0;
  1609. const utils_1 = __webpack_require__(2);
  1610. class SteamProvider {
  1611. constructor() {
  1612. this.test = /steamcommunity\.com\/linkfilter\/\?url=(.*)/;
  1613. }
  1614. resolve(aElement) {
  1615. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("url"));
  1616. }
  1617. }
  1618. exports.SteamProvider = SteamProvider;
  1619.  
  1620.  
  1621. /***/ }),
  1622. /* 19 */
  1623. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1624.  
  1625. "use strict";
  1626.  
  1627. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1628. exports.TiebaProvider = void 0;
  1629. const utils_1 = __webpack_require__(2);
  1630. class TiebaProvider {
  1631. constructor() {
  1632. this.test = /jump\d*\.bdimg\.com/;
  1633. }
  1634. resolve(aElement) {
  1635. if (!this.test.test(aElement.href)) {
  1636. return;
  1637. }
  1638. let url = "";
  1639. const text = aElement.innerText || aElement.textContent || "";
  1640. try {
  1641. if (/https?:\/\//.test(text)) {
  1642. url = decodeURIComponent(text);
  1643. }
  1644. }
  1645. catch (e) {
  1646. url = /https?:\/\//.test(text) ? text : "";
  1647. }
  1648. if (url) {
  1649. (0, utils_1.antiRedirect)(aElement, url);
  1650. }
  1651. }
  1652. }
  1653. exports.TiebaProvider = TiebaProvider;
  1654.  
  1655.  
  1656. /***/ }),
  1657. /* 20 */
  1658. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1659.  
  1660. "use strict";
  1661.  
  1662. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1663. exports.TwitterProvider = void 0;
  1664. const utils_1 = __webpack_require__(2);
  1665. class TwitterProvider {
  1666. constructor() {
  1667. this.test = /t\.co\/\w+/;
  1668. }
  1669. resolve(aElement) {
  1670. if (!this.test.test(aElement.href)) {
  1671. return;
  1672. }
  1673. if (/https?:\/\//.test(aElement.title)) {
  1674. const url = decodeURIComponent(aElement.title);
  1675. (0, utils_1.antiRedirect)(aElement, url);
  1676. return;
  1677. }
  1678. const innerText = aElement.innerText.replace(/…$/, "");
  1679. if (/https?:\/\//.test(innerText)) {
  1680. (0, utils_1.antiRedirect)(aElement, innerText);
  1681. return;
  1682. }
  1683. }
  1684. }
  1685. exports.TwitterProvider = TwitterProvider;
  1686.  
  1687.  
  1688. /***/ }),
  1689. /* 21 */
  1690. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1691.  
  1692. "use strict";
  1693.  
  1694. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1695. exports.BaiduVideoProvider = void 0;
  1696. const utils_1 = __webpack_require__(2);
  1697. const gm_http_1 = __webpack_require__(22);
  1698. class BaiduVideoProvider {
  1699. constructor() {
  1700. this.test = /v\.baidu\.com\/link\?url=/;
  1701. }
  1702. resolve(aElement) {
  1703. gm_http_1.default
  1704. .request({
  1705. url: aElement.href,
  1706. method: "GET",
  1707. anonymous: true,
  1708. })
  1709. .then((res) => {
  1710. if (res.finalUrl) {
  1711. (0, utils_1.antiRedirect)(aElement, res.finalUrl);
  1712. }
  1713. })
  1714. .catch((err) => {
  1715. console.error(err);
  1716. });
  1717. }
  1718. }
  1719. exports.BaiduVideoProvider = BaiduVideoProvider;
  1720.  
  1721.  
  1722. /***/ }),
  1723. /* 22 */
  1724. /***/ (function(module) {
  1725.  
  1726. (function webpackUniversalModuleDefinition(root, factory) {
  1727. if(true)
  1728. module.exports = factory();
  1729. else {}
  1730. })(this, function() {
  1731. return /******/ (function(modules) { // webpackBootstrap
  1732. /******/ // The module cache
  1733. /******/ var installedModules = {};
  1734. /******/
  1735. /******/ // The require function
  1736. /******/ function __nested_webpack_require_535__(moduleId) {
  1737. /******/
  1738. /******/ // Check if module is in cache
  1739. /******/ if(installedModules[moduleId]) {
  1740. /******/ return installedModules[moduleId].exports;
  1741. /******/ }
  1742. /******/ // Create a new module (and put it into the cache)
  1743. /******/ var module = installedModules[moduleId] = {
  1744. /******/ i: moduleId,
  1745. /******/ l: false,
  1746. /******/ exports: {}
  1747. /******/ };
  1748. /******/
  1749. /******/ // Execute the module function
  1750. /******/ modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_535__);
  1751. /******/
  1752. /******/ // Flag the module as loaded
  1753. /******/ module.l = true;
  1754. /******/
  1755. /******/ // Return the exports of the module
  1756. /******/ return module.exports;
  1757. /******/ }
  1758. /******/
  1759. /******/
  1760. /******/ // expose the modules object (__webpack_modules__)
  1761. /******/ __nested_webpack_require_535__.m = modules;
  1762. /******/
  1763. /******/ // expose the module cache
  1764. /******/ __nested_webpack_require_535__.c = installedModules;
  1765. /******/
  1766. /******/ // define getter function for harmony exports
  1767. /******/ __nested_webpack_require_535__.d = function(exports, name, getter) {
  1768. /******/ if(!__nested_webpack_require_535__.o(exports, name)) {
  1769. /******/ Object.defineProperty(exports, name, {
  1770. /******/ configurable: false,
  1771. /******/ enumerable: true,
  1772. /******/ get: getter
  1773. /******/ });
  1774. /******/ }
  1775. /******/ };
  1776. /******/
  1777. /******/ // getDefaultExport function for compatibility with non-harmony modules
  1778. /******/ __nested_webpack_require_535__.n = function(module) {
  1779. /******/ var getter = module && module.__esModule ?
  1780. /******/ function getDefault() { return module['default']; } :
  1781. /******/ function getModuleExports() { return module; };
  1782. /******/ __nested_webpack_require_535__.d(getter, 'a', getter);
  1783. /******/ return getter;
  1784. /******/ };
  1785. /******/
  1786. /******/ // Object.prototype.hasOwnProperty.call
  1787. /******/ __nested_webpack_require_535__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  1788. /******/
  1789. /******/ // __webpack_public_path__
  1790. /******/ __nested_webpack_require_535__.p = "";
  1791. /******/
  1792. /******/ // Load entry module and return exports
  1793. /******/ return __nested_webpack_require_535__(__nested_webpack_require_535__.s = 0);
  1794. /******/ })
  1795. /************************************************************************/
  1796. /******/ ([
  1797. /* 0 */
  1798. /***/ (function(module, exports, __webpack_require__) {
  1799.  
  1800. "use strict";
  1801.  
  1802. /**
  1803. * Created by axetroy on 17-6-23.
  1804. */
  1805. /// <reference path="./index.d.ts" />
  1806. var __assign = (this && this.__assign) || Object.assign || function(t) {
  1807. for (var s, i = 1, n = arguments.length; i < n; i++) {
  1808. s = arguments[i];
  1809. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  1810. t[p] = s[p];
  1811. }
  1812. return t;
  1813. };
  1814. Object.defineProperty(exports, "__esModule", { value: true });
  1815. function isFunction(func) {
  1816. return typeof func === "function";
  1817. }
  1818. var Http = (function () {
  1819. function Http(config) {
  1820. if (config === void 0) { config = {}; }
  1821. this.config = config;
  1822. }
  1823. Http.prototype.setConfig = function (config) {
  1824. if (config === void 0) { config = {}; }
  1825. this.config = __assign({}, this.config, config);
  1826. };
  1827. Http.prototype.create = function (config) {
  1828. return new Http(config);
  1829. };
  1830. Http.prototype.request = function (config) {
  1831. var _this = this;
  1832. return new Promise(function (resolve, reject) {
  1833. var commonRequestConfig = {
  1834. method: config.method,
  1835. url: config.url,
  1836. data: config.body,
  1837. header: config.headers
  1838. };
  1839. var GM_xmlhttpRequestConfig = __assign({}, commonRequestConfig, config, _this.config);
  1840. var onreadystatechange = GM_xmlhttpRequestConfig.onreadystatechange, onerror = GM_xmlhttpRequestConfig.onerror, onabort = GM_xmlhttpRequestConfig.onabort, ontimeout = GM_xmlhttpRequestConfig.ontimeout;
  1841. GM_xmlhttpRequestConfig.synchronous = true; // async
  1842. GM_xmlhttpRequestConfig.onreadystatechange = function (response) {
  1843. try {
  1844. isFunction(onreadystatechange) &&
  1845. onreadystatechange.call(this, response);
  1846. }
  1847. catch (err) {
  1848. reject(err);
  1849. }
  1850. if (response.readyState !== 4)
  1851. return;
  1852. response.status >= 200 && response.status < 400
  1853. ? resolve(response)
  1854. : reject(response);
  1855. };
  1856. GM_xmlhttpRequestConfig.onerror = function (response) {
  1857. try {
  1858. isFunction(onerror) && onerror.call(this, response);
  1859. reject(response);
  1860. }
  1861. catch (err) {
  1862. reject(err);
  1863. }
  1864. };
  1865. GM_xmlhttpRequestConfig.onabort = function (response) {
  1866. try {
  1867. isFunction(onabort) && onabort.call(this, response);
  1868. reject(response);
  1869. }
  1870. catch (err) {
  1871. reject(err);
  1872. }
  1873. };
  1874. GM_xmlhttpRequestConfig.ontimeout = function (response) {
  1875. try {
  1876. isFunction(ontimeout) && ontimeout.call(this, response);
  1877. reject(response);
  1878. }
  1879. catch (err) {
  1880. reject(err);
  1881. }
  1882. };
  1883. if (_this.config.debug) {
  1884. console.log("%c[" + commonRequestConfig.method.toUpperCase() + "]%c: " + commonRequestConfig.url, "color: green", "color: #000;text-style: under-line");
  1885. }
  1886. GM_xmlhttpRequest(__assign({}, GM_xmlhttpRequestConfig));
  1887. });
  1888. };
  1889. Http.prototype.get = function (url, data, headers, config) {
  1890. if (headers === void 0) { headers = {}; }
  1891. if (config === void 0) { config = {}; }
  1892. return this.request(__assign({ url: url, method: "GET", body: data, headers: headers }, config));
  1893. };
  1894. Http.prototype.post = function (url, data, headers, config) {
  1895. if (headers === void 0) { headers = {}; }
  1896. if (config === void 0) { config = {}; }
  1897. return this.request(__assign({ url: url, method: "POST", body: data, headers: headers }, config));
  1898. };
  1899. Http.prototype.put = function (url, data, headers, config) {
  1900. if (headers === void 0) { headers = {}; }
  1901. if (config === void 0) { config = {}; }
  1902. return this.request(__assign({ url: url, method: "POST", body: data, headers: headers }, config));
  1903. };
  1904. Http.prototype["delete"] = function (url, data, headers, config) {
  1905. if (headers === void 0) { headers = {}; }
  1906. if (config === void 0) { config = {}; }
  1907. return this.request(__assign({ url: url, method: "DELETE", body: data, headers: headers }, config));
  1908. };
  1909. Http.prototype.head = function (url, data, headers, config) {
  1910. if (headers === void 0) { headers = {}; }
  1911. if (config === void 0) { config = {}; }
  1912. return this.request(__assign({ url: url, method: "HEAD", body: data, headers: headers }, config));
  1913. };
  1914. return Http;
  1915. }());
  1916. exports.Http = Http;
  1917. var timeout = 5000;
  1918. exports.timeout = timeout;
  1919. var http = new Http({ timeout: timeout });
  1920. exports.http = http;
  1921. exports.default = http;
  1922.  
  1923.  
  1924. /***/ })
  1925. /******/ ]);
  1926. });
  1927.  
  1928. /***/ }),
  1929. /* 23 */
  1930. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  1931.  
  1932. "use strict";
  1933.  
  1934. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1935. exports.WeboProvider = void 0;
  1936. const utils_1 = __webpack_require__(2);
  1937. class WeboProvider {
  1938. constructor() {
  1939. this.test = /t\.cn\/\w+/;
  1940. }
  1941. resolve(aElement) {
  1942. if (!(this.test.test(aElement.href) && /^https?:\/\//.test(aElement.title))) {
  1943. return;
  1944. }
  1945. const url = decodeURIComponent(aElement.title);
  1946. if (url) {
  1947. aElement.href = url;
  1948. (0, utils_1.antiRedirect)(aElement, url);
  1949. }
  1950. }
  1951. }
  1952. exports.WeboProvider = WeboProvider;
  1953.  
  1954.  
  1955. /***/ }),
  1956. /* 24 */
  1957. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  1958.  
  1959. "use strict";
  1960.  
  1961. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  1962. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  1963. return new (P || (P = Promise))(function (resolve, reject) {
  1964. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  1965. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  1966. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  1967. step((generator = generator.apply(thisArg, _arguments || [])).next());
  1968. });
  1969. };
  1970. Object.defineProperty(exports, "__esModule", ({ value: true }));
  1971. exports.BaiduProvider = void 0;
  1972. const utils_1 = __webpack_require__(2);
  1973. const gm_http_1 = __webpack_require__(22);
  1974. const p_retry_1 = __webpack_require__(25);
  1975. class BaiduProvider {
  1976. constructor() {
  1977. this.test = /www\.baidu\.com\/link\?url=/;
  1978. }
  1979. resolve(aElement) {
  1980. if ((0, utils_1.getRedirect)(aElement) <= 2 && this.test.test(aElement.href)) {
  1981. (0, utils_1.increaseRedirect)(aElement);
  1982. (0, p_retry_1.default)(() => this.handlerOneElement(aElement), { retries: 3 })
  1983. .then((res) => {
  1984. (0, utils_1.decreaseRedirect)(aElement);
  1985. })
  1986. .catch((err) => {
  1987. (0, utils_1.decreaseRedirect)(aElement);
  1988. });
  1989. }
  1990. }
  1991. handlerOneElement(aElement) {
  1992. return __awaiter(this, void 0, void 0, function* () {
  1993. try {
  1994. const res = yield gm_http_1.default.request({
  1995. url: aElement.href,
  1996. method: "GET",
  1997. anonymous: true,
  1998. });
  1999. if (res.finalUrl) {
  2000. (0, utils_1.antiRedirect)(aElement, res.finalUrl);
  2001. }
  2002. return res;
  2003. }
  2004. catch (err) {
  2005. console.error(err);
  2006. return Promise.reject(new Error(`[http]: ${aElement.href} fail`));
  2007. }
  2008. });
  2009. }
  2010. }
  2011. exports.BaiduProvider = BaiduProvider;
  2012.  
  2013.  
  2014. /***/ }),
  2015. /* 25 */
  2016. /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
  2017.  
  2018. "use strict";
  2019. __webpack_require__.r(__webpack_exports__);
  2020. /* harmony export */ __webpack_require__.d(__webpack_exports__, {
  2021. /* harmony export */ AbortError: () => (/* binding */ AbortError),
  2022. /* harmony export */ "default": () => (/* binding */ pRetry)
  2023. /* harmony export */ });
  2024. /* harmony import */ var retry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26);
  2025.  
  2026.  
  2027. const networkErrorMsgs = new Set([
  2028. 'Failed to fetch', // Chrome
  2029. 'NetworkError when attempting to fetch resource.', // Firefox
  2030. 'The Internet connection appears to be offline.', // Safari
  2031. 'Network request failed', // `cross-fetch`
  2032. 'fetch failed', // Undici (Node.js)
  2033. ]);
  2034.  
  2035. class AbortError extends Error {
  2036. constructor(message) {
  2037. super();
  2038.  
  2039. if (message instanceof Error) {
  2040. this.originalError = message;
  2041. ({message} = message);
  2042. } else {
  2043. this.originalError = new Error(message);
  2044. this.originalError.stack = this.stack;
  2045. }
  2046.  
  2047. this.name = 'AbortError';
  2048. this.message = message;
  2049. }
  2050. }
  2051.  
  2052. const decorateErrorWithCounts = (error, attemptNumber, options) => {
  2053. // Minus 1 from attemptNumber because the first attempt does not count as a retry
  2054. const retriesLeft = options.retries - (attemptNumber - 1);
  2055.  
  2056. error.attemptNumber = attemptNumber;
  2057. error.retriesLeft = retriesLeft;
  2058. return error;
  2059. };
  2060.  
  2061. const isNetworkError = errorMessage => networkErrorMsgs.has(errorMessage);
  2062.  
  2063. async function pRetry(input, options) {
  2064. return new Promise((resolve, reject) => {
  2065. options = {
  2066. onFailedAttempt() {},
  2067. retries: 10,
  2068. ...options,
  2069. };
  2070.  
  2071. const operation = retry__WEBPACK_IMPORTED_MODULE_0__.operation(options);
  2072.  
  2073. const abortHandler = () => {
  2074. operation.stop();
  2075. reject(options.signal?.reason);
  2076. };
  2077.  
  2078. if (options.signal && !options.signal.aborted) {
  2079. options.signal.addEventListener('abort', abortHandler, {once: true});
  2080. }
  2081.  
  2082. const cleanUp = () => {
  2083. options.signal?.removeEventListener('abort', abortHandler);
  2084. operation.stop();
  2085. };
  2086.  
  2087. operation.attempt(async attemptNumber => {
  2088. try {
  2089. const result = await input(attemptNumber);
  2090. cleanUp();
  2091. resolve(result);
  2092. } catch (error) {
  2093. try {
  2094. if (!(error instanceof Error)) {
  2095. throw new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`);
  2096. }
  2097.  
  2098. if (error instanceof AbortError) {
  2099. throw error.originalError;
  2100. }
  2101.  
  2102. if (error instanceof TypeError && !isNetworkError(error.message)) {
  2103. throw error;
  2104. }
  2105.  
  2106. await options.onFailedAttempt(decorateErrorWithCounts(error, attemptNumber, options));
  2107.  
  2108. if (!operation.retry(error)) {
  2109. throw operation.mainError();
  2110. }
  2111. } catch (finalError) {
  2112. decorateErrorWithCounts(finalError, attemptNumber, options);
  2113. cleanUp();
  2114. reject(finalError);
  2115. }
  2116. }
  2117. });
  2118. });
  2119. }
  2120.  
  2121.  
  2122. /***/ }),
  2123. /* 26 */
  2124. /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
  2125.  
  2126. module.exports = __webpack_require__(27);
  2127.  
  2128. /***/ }),
  2129. /* 27 */
  2130. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2131.  
  2132. var RetryOperation = __webpack_require__(28);
  2133.  
  2134. exports.operation = function(options) {
  2135. var timeouts = exports.timeouts(options);
  2136. return new RetryOperation(timeouts, {
  2137. forever: options && (options.forever || options.retries === Infinity),
  2138. unref: options && options.unref,
  2139. maxRetryTime: options && options.maxRetryTime
  2140. });
  2141. };
  2142.  
  2143. exports.timeouts = function(options) {
  2144. if (options instanceof Array) {
  2145. return [].concat(options);
  2146. }
  2147.  
  2148. var opts = {
  2149. retries: 10,
  2150. factor: 2,
  2151. minTimeout: 1 * 1000,
  2152. maxTimeout: Infinity,
  2153. randomize: false
  2154. };
  2155. for (var key in options) {
  2156. opts[key] = options[key];
  2157. }
  2158.  
  2159. if (opts.minTimeout > opts.maxTimeout) {
  2160. throw new Error('minTimeout is greater than maxTimeout');
  2161. }
  2162.  
  2163. var timeouts = [];
  2164. for (var i = 0; i < opts.retries; i++) {
  2165. timeouts.push(this.createTimeout(i, opts));
  2166. }
  2167.  
  2168. if (options && options.forever && !timeouts.length) {
  2169. timeouts.push(this.createTimeout(i, opts));
  2170. }
  2171.  
  2172. // sort the array numerically ascending
  2173. timeouts.sort(function(a,b) {
  2174. return a - b;
  2175. });
  2176.  
  2177. return timeouts;
  2178. };
  2179.  
  2180. exports.createTimeout = function(attempt, opts) {
  2181. var random = (opts.randomize)
  2182. ? (Math.random() + 1)
  2183. : 1;
  2184.  
  2185. var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));
  2186. timeout = Math.min(timeout, opts.maxTimeout);
  2187.  
  2188. return timeout;
  2189. };
  2190.  
  2191. exports.wrap = function(obj, options, methods) {
  2192. if (options instanceof Array) {
  2193. methods = options;
  2194. options = null;
  2195. }
  2196.  
  2197. if (!methods) {
  2198. methods = [];
  2199. for (var key in obj) {
  2200. if (typeof obj[key] === 'function') {
  2201. methods.push(key);
  2202. }
  2203. }
  2204. }
  2205.  
  2206. for (var i = 0; i < methods.length; i++) {
  2207. var method = methods[i];
  2208. var original = obj[method];
  2209.  
  2210. obj[method] = function retryWrapper(original) {
  2211. var op = exports.operation(options);
  2212. var args = Array.prototype.slice.call(arguments, 1);
  2213. var callback = args.pop();
  2214.  
  2215. args.push(function(err) {
  2216. if (op.retry(err)) {
  2217. return;
  2218. }
  2219. if (err) {
  2220. arguments[0] = op.mainError();
  2221. }
  2222. callback.apply(this, arguments);
  2223. });
  2224.  
  2225. op.attempt(function() {
  2226. original.apply(obj, args);
  2227. });
  2228. }.bind(obj, original);
  2229. obj[method].options = options;
  2230. }
  2231. };
  2232.  
  2233.  
  2234. /***/ }),
  2235. /* 28 */
  2236. /***/ ((module) => {
  2237.  
  2238. function RetryOperation(timeouts, options) {
  2239. // Compatibility for the old (timeouts, retryForever) signature
  2240. if (typeof options === 'boolean') {
  2241. options = { forever: options };
  2242. }
  2243.  
  2244. this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));
  2245. this._timeouts = timeouts;
  2246. this._options = options || {};
  2247. this._maxRetryTime = options && options.maxRetryTime || Infinity;
  2248. this._fn = null;
  2249. this._errors = [];
  2250. this._attempts = 1;
  2251. this._operationTimeout = null;
  2252. this._operationTimeoutCb = null;
  2253. this._timeout = null;
  2254. this._operationStart = null;
  2255. this._timer = null;
  2256.  
  2257. if (this._options.forever) {
  2258. this._cachedTimeouts = this._timeouts.slice(0);
  2259. }
  2260. }
  2261. module.exports = RetryOperation;
  2262.  
  2263. RetryOperation.prototype.reset = function() {
  2264. this._attempts = 1;
  2265. this._timeouts = this._originalTimeouts.slice(0);
  2266. }
  2267.  
  2268. RetryOperation.prototype.stop = function() {
  2269. if (this._timeout) {
  2270. clearTimeout(this._timeout);
  2271. }
  2272. if (this._timer) {
  2273. clearTimeout(this._timer);
  2274. }
  2275.  
  2276. this._timeouts = [];
  2277. this._cachedTimeouts = null;
  2278. };
  2279.  
  2280. RetryOperation.prototype.retry = function(err) {
  2281. if (this._timeout) {
  2282. clearTimeout(this._timeout);
  2283. }
  2284.  
  2285. if (!err) {
  2286. return false;
  2287. }
  2288. var currentTime = new Date().getTime();
  2289. if (err && currentTime - this._operationStart >= this._maxRetryTime) {
  2290. this._errors.push(err);
  2291. this._errors.unshift(new Error('RetryOperation timeout occurred'));
  2292. return false;
  2293. }
  2294.  
  2295. this._errors.push(err);
  2296.  
  2297. var timeout = this._timeouts.shift();
  2298. if (timeout === undefined) {
  2299. if (this._cachedTimeouts) {
  2300. // retry forever, only keep last error
  2301. this._errors.splice(0, this._errors.length - 1);
  2302. timeout = this._cachedTimeouts.slice(-1);
  2303. } else {
  2304. return false;
  2305. }
  2306. }
  2307.  
  2308. var self = this;
  2309. this._timer = setTimeout(function() {
  2310. self._attempts++;
  2311.  
  2312. if (self._operationTimeoutCb) {
  2313. self._timeout = setTimeout(function() {
  2314. self._operationTimeoutCb(self._attempts);
  2315. }, self._operationTimeout);
  2316.  
  2317. if (self._options.unref) {
  2318. self._timeout.unref();
  2319. }
  2320. }
  2321.  
  2322. self._fn(self._attempts);
  2323. }, timeout);
  2324.  
  2325. if (this._options.unref) {
  2326. this._timer.unref();
  2327. }
  2328.  
  2329. return true;
  2330. };
  2331.  
  2332. RetryOperation.prototype.attempt = function(fn, timeoutOps) {
  2333. this._fn = fn;
  2334.  
  2335. if (timeoutOps) {
  2336. if (timeoutOps.timeout) {
  2337. this._operationTimeout = timeoutOps.timeout;
  2338. }
  2339. if (timeoutOps.cb) {
  2340. this._operationTimeoutCb = timeoutOps.cb;
  2341. }
  2342. }
  2343.  
  2344. var self = this;
  2345. if (this._operationTimeoutCb) {
  2346. this._timeout = setTimeout(function() {
  2347. self._operationTimeoutCb();
  2348. }, self._operationTimeout);
  2349. }
  2350.  
  2351. this._operationStart = new Date().getTime();
  2352.  
  2353. this._fn(this._attempts);
  2354. };
  2355.  
  2356. RetryOperation.prototype.try = function(fn) {
  2357. console.log('Using RetryOperation.try() is deprecated');
  2358. this.attempt(fn);
  2359. };
  2360.  
  2361. RetryOperation.prototype.start = function(fn) {
  2362. console.log('Using RetryOperation.start() is deprecated');
  2363. this.attempt(fn);
  2364. };
  2365.  
  2366. RetryOperation.prototype.start = RetryOperation.prototype.try;
  2367.  
  2368. RetryOperation.prototype.errors = function() {
  2369. return this._errors;
  2370. };
  2371.  
  2372. RetryOperation.prototype.attempts = function() {
  2373. return this._attempts;
  2374. };
  2375.  
  2376. RetryOperation.prototype.mainError = function() {
  2377. if (this._errors.length === 0) {
  2378. return null;
  2379. }
  2380.  
  2381. var counts = {};
  2382. var mainError = null;
  2383. var mainErrorCount = 0;
  2384.  
  2385. for (var i = 0; i < this._errors.length; i++) {
  2386. var error = this._errors[i];
  2387. var message = error.message;
  2388. var count = (counts[message] || 0) + 1;
  2389.  
  2390. counts[message] = count;
  2391.  
  2392. if (count >= mainErrorCount) {
  2393. mainError = error;
  2394. mainErrorCount = count;
  2395. }
  2396. }
  2397.  
  2398. return mainError;
  2399. };
  2400.  
  2401.  
  2402. /***/ }),
  2403. /* 29 */
  2404. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  2405.  
  2406. "use strict";
  2407.  
  2408. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  2409. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  2410. return new (P || (P = Promise))(function (resolve, reject) {
  2411. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  2412. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  2413. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  2414. step((generator = generator.apply(thisArg, _arguments || [])).next());
  2415. });
  2416. };
  2417. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2418. exports.DogeDogeProvider = void 0;
  2419. const utils_1 = __webpack_require__(2);
  2420. const gm_http_1 = __webpack_require__(22);
  2421. class DogeDogeProvider {
  2422. constructor() {
  2423. this.test = /www\.dogedoge\.com\/rd\/.{1,}/;
  2424. }
  2425. resolve(aElement) {
  2426. if ((0, utils_1.getRedirect)(aElement) <= 2 && this.test.test(aElement.href)) {
  2427. (0, utils_1.increaseRedirect)(aElement);
  2428. this.handlerOneElement(aElement)
  2429. .then((res) => {
  2430. (0, utils_1.decreaseRedirect)(aElement);
  2431. })
  2432. .catch((err) => {
  2433. (0, utils_1.decreaseRedirect)(aElement);
  2434. });
  2435. }
  2436. }
  2437. handlerOneElement(aElement) {
  2438. return __awaiter(this, void 0, void 0, function* () {
  2439. try {
  2440. const res = yield gm_http_1.default.request({
  2441. url: aElement.href,
  2442. method: "GET",
  2443. anonymous: true,
  2444. });
  2445. if (res.finalUrl) {
  2446. (0, utils_1.antiRedirect)(aElement, res.finalUrl);
  2447. }
  2448. return res;
  2449. }
  2450. catch (err) {
  2451. console.error(err);
  2452. }
  2453. });
  2454. }
  2455. }
  2456. exports.DogeDogeProvider = DogeDogeProvider;
  2457.  
  2458.  
  2459. /***/ }),
  2460. /* 30 */
  2461. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2462.  
  2463. "use strict";
  2464.  
  2465. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2466. exports.DouBanProvider = void 0;
  2467. const utils_1 = __webpack_require__(2);
  2468. class DouBanProvider {
  2469. constructor() {
  2470. this.test = /douban\.com\/link2\/?\?url=(.*)/;
  2471. }
  2472. resolve(aElement) {
  2473. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("url"));
  2474. }
  2475. }
  2476. exports.DouBanProvider = DouBanProvider;
  2477.  
  2478.  
  2479. /***/ }),
  2480. /* 31 */
  2481. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2482.  
  2483. "use strict";
  2484.  
  2485. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2486. exports.GoogleProvider = void 0;
  2487. const utils_1 = __webpack_require__(2);
  2488. class GoogleProvider {
  2489. constructor() {
  2490. this.test = true;
  2491. }
  2492. resolve(aElement) {
  2493. const traceProperties = ["ping", "data-jsarwt", "data-usg", "data-ved"];
  2494. // 移除追踪
  2495. for (const property of traceProperties) {
  2496. if (aElement.getAttribute(property)) {
  2497. aElement.removeAttribute(property);
  2498. }
  2499. }
  2500. // 移除多余的事件
  2501. if (aElement.getAttribute("onmousedown")) {
  2502. aElement.removeAttribute("onmousedown");
  2503. }
  2504. // 尝试去除重定向
  2505. if (aElement.getAttribute("data-href")) {
  2506. const realUrl = aElement.getAttribute("data-href");
  2507. (0, utils_1.antiRedirect)(aElement, realUrl);
  2508. }
  2509. const url = new URL(aElement.href);
  2510. if (url.searchParams.get("url")) {
  2511. (0, utils_1.antiRedirect)(aElement, url.searchParams.get("url"));
  2512. }
  2513. }
  2514. }
  2515. exports.GoogleProvider = GoogleProvider;
  2516.  
  2517.  
  2518. /***/ }),
  2519. /* 32 */
  2520. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2521.  
  2522. "use strict";
  2523.  
  2524. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2525. exports.JianShuProvider = void 0;
  2526. const utils_1 = __webpack_require__(2);
  2527. class JianShuProvider {
  2528. constructor() {
  2529. this.test = (aElement) => {
  2530. const isLink1 = /links\.jianshu\.com\/go/.test(aElement.href);
  2531. const isLink2 = /link\.jianshu\.com(\/)?\?t=/.test(aElement.href);
  2532. const isLink3 = /jianshu\.com\/go-wild\/?\?(.*)url=/.test(aElement.href);
  2533. if (isLink1 || isLink2 || isLink3) {
  2534. return true;
  2535. }
  2536. return false;
  2537. };
  2538. }
  2539. resolve(aElement) {
  2540. const search = new URL(aElement.href).searchParams;
  2541. (0, utils_1.antiRedirect)(aElement, search.get("to") || search.get("t") || search.get("url"));
  2542. }
  2543. }
  2544. exports.JianShuProvider = JianShuProvider;
  2545.  
  2546.  
  2547. /***/ }),
  2548. /* 33 */
  2549. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2550.  
  2551. "use strict";
  2552.  
  2553. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2554. exports.SoProvider = void 0;
  2555. const utils_1 = __webpack_require__(2);
  2556. class SoProvider {
  2557. constructor() {
  2558. this.test = /so\.com\/link\?(.*)/;
  2559. }
  2560. resolve(aElement) {
  2561. const url = aElement.getAttribute("data-mdurl") || aElement.getAttribute("e-landurl");
  2562. if (url) {
  2563. (0, utils_1.antiRedirect)(aElement, url);
  2564. }
  2565. // remove track
  2566. aElement.removeAttribute("e_href");
  2567. aElement.removeAttribute("data-res");
  2568. }
  2569. }
  2570. exports.SoProvider = SoProvider;
  2571.  
  2572.  
  2573. /***/ }),
  2574. /* 34 */
  2575. /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
  2576.  
  2577. "use strict";
  2578.  
  2579. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  2580. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  2581. return new (P || (P = Promise))(function (resolve, reject) {
  2582. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  2583. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  2584. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  2585. step((generator = generator.apply(thisArg, _arguments || [])).next());
  2586. });
  2587. };
  2588. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2589. exports.SoGouProvider = void 0;
  2590. const utils_1 = __webpack_require__(2);
  2591. const gm_http_1 = __webpack_require__(22);
  2592. class SoGouProvider {
  2593. constructor() {
  2594. this.test = /www\.sogou\.com\/link\?url=/;
  2595. }
  2596. resolve(aElement) {
  2597. return __awaiter(this, void 0, void 0, function* () {
  2598. try {
  2599. if ((0, utils_1.getRedirect)(aElement) <= 2 && this.test.test(aElement.href)) {
  2600. (0, utils_1.increaseRedirect)(aElement);
  2601. const res = yield gm_http_1.default.request({
  2602. url: aElement.href,
  2603. method: "GET",
  2604. anonymous: true,
  2605. });
  2606. (0, utils_1.decreaseRedirect)(aElement);
  2607. const finalUrl = res.finalUrl;
  2608. if (finalUrl && !this.test.test(finalUrl)) {
  2609. (0, utils_1.antiRedirect)(aElement, res.finalUrl);
  2610. }
  2611. else {
  2612. const matcher = res.responseText.match(/URL=['"]([^'"]+)['"]/);
  2613. if (matcher === null || matcher === void 0 ? void 0 : matcher[1]) {
  2614. (0, utils_1.antiRedirect)(aElement, res.finalUrl);
  2615. }
  2616. }
  2617. }
  2618. }
  2619. catch (err) {
  2620. (0, utils_1.decreaseRedirect)(aElement);
  2621. console.error(err);
  2622. }
  2623. });
  2624. }
  2625. parsePage(res) {
  2626. const responseText = res.responseText.replace(/(src=[^>]*|link=[^>])/g, "");
  2627. const html = document.createElement("html");
  2628. html.innerHTML = responseText;
  2629. // let selector = '#main .results div.vrwrap>h3';
  2630. // let selector = '#main .results h3>a';
  2631. const selector = '#main .results a[href*="www.sogou.com/link?url="]';
  2632. const remotes = [].slice.call(html.querySelectorAll("#main .results a[href]"));
  2633. const locals = [].slice.call(document.querySelectorAll(selector));
  2634. for (const localEle of locals) {
  2635. for (const remoteEle of remotes) {
  2636. let localText = (0, utils_1.getText)(localEle);
  2637. let remoteText = (0, utils_1.getText)(remoteEle);
  2638. // 通用按钮,例如【点击下载】
  2639. if (localEle.classList.contains("str-public-btn")) {
  2640. localText = (0, utils_1.getText)(localEle.parentNode);
  2641. remoteText = (0, utils_1.getText)(remoteEle.parentNode);
  2642. }
  2643. else if (localEle.classList.contains("str_img")) {
  2644. // 图片
  2645. localText = (0, utils_1.getText)(localEle.parentNode.parentNode);
  2646. remoteText = (0, utils_1.getText)(remoteEle.parentNode.parentNode);
  2647. }
  2648. if (!localText || localText !== remoteText) {
  2649. return;
  2650. }
  2651. (0, utils_1.antiRedirect)(localEle, remoteEle.href);
  2652. }
  2653. }
  2654. }
  2655. onInit() {
  2656. return __awaiter(this, void 0, void 0, function* () {
  2657. if (!/www\.sogou\.com\/web/.test(window.top.location.href)) {
  2658. return;
  2659. }
  2660. const query = (0, utils_1.queryParser)(window.top.location.search);
  2661. // 搜索使用http搜索,得到的是直接链接
  2662. const url = `${location.protocol.replace(/:$/, "").replace("s", "")}://${location.host + location.pathname + query}`;
  2663. gm_http_1.default
  2664. .get(url)
  2665. .then((res) => {
  2666. this.parsePage(res);
  2667. })
  2668. .catch((err) => {
  2669. console.error(err);
  2670. });
  2671. return this;
  2672. });
  2673. }
  2674. }
  2675. exports.SoGouProvider = SoGouProvider;
  2676.  
  2677.  
  2678. /***/ }),
  2679. /* 35 */
  2680. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2681.  
  2682. "use strict";
  2683.  
  2684. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2685. exports.YoutubeProvider = void 0;
  2686. const utils_1 = __webpack_require__(2);
  2687. class YoutubeProvider {
  2688. constructor() {
  2689. this.test = /www\.youtube\.com\/redirect\?.{1,}/;
  2690. }
  2691. resolve(aElement) {
  2692. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("q"));
  2693. }
  2694. }
  2695. exports.YoutubeProvider = YoutubeProvider;
  2696.  
  2697.  
  2698. /***/ }),
  2699. /* 36 */
  2700. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2701.  
  2702. "use strict";
  2703.  
  2704. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2705. exports.ZhihuProvider = void 0;
  2706. const utils_1 = __webpack_require__(2);
  2707. class ZhihuProvider {
  2708. constructor() {
  2709. this.test = /zhihu\.com\/\?target=(.*)/;
  2710. }
  2711. resolve(aElement) {
  2712. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("target"));
  2713. }
  2714. }
  2715. exports.ZhihuProvider = ZhihuProvider;
  2716.  
  2717.  
  2718. /***/ }),
  2719. /* 37 */
  2720. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2721.  
  2722. "use strict";
  2723.  
  2724. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2725. exports.BaiduXueshuProvider = void 0;
  2726. const utils_1 = __webpack_require__(2);
  2727. class BaiduXueshuProvider {
  2728. constructor() {
  2729. this.test = /xueshu\.baidu\.com\/s?\?(.*)/; // 此处无用
  2730. }
  2731. resolve(aElement) {
  2732. const realHref = aElement.getAttribute("data-link") || aElement.getAttribute("data-url");
  2733. if (realHref) {
  2734. (0, utils_1.antiRedirect)(aElement, decodeURIComponent(realHref));
  2735. }
  2736. }
  2737. }
  2738. exports.BaiduXueshuProvider = BaiduXueshuProvider;
  2739.  
  2740.  
  2741. /***/ }),
  2742. /* 38 */
  2743. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2744.  
  2745. "use strict";
  2746.  
  2747. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2748. exports.ZhihuZhuanlanProvider = void 0;
  2749. const utils_1 = __webpack_require__(2);
  2750. class ZhihuZhuanlanProvider {
  2751. constructor() {
  2752. this.test = /link\.zhihu\.com\/\?target=(.*)/;
  2753. }
  2754. resolve(aElement) {
  2755. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("target"));
  2756. }
  2757. }
  2758. exports.ZhihuZhuanlanProvider = ZhihuZhuanlanProvider;
  2759.  
  2760.  
  2761. /***/ }),
  2762. /* 39 */
  2763. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2764.  
  2765. "use strict";
  2766.  
  2767. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2768. exports.LogonewsProvider = void 0;
  2769. const utils_1 = __webpack_require__(2);
  2770. class LogonewsProvider {
  2771. constructor() {
  2772. this.test = /link\.logonews\.cn\/\?url=(.*)/;
  2773. }
  2774. resolve(aElement) {
  2775. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("url"));
  2776. }
  2777. }
  2778. exports.LogonewsProvider = LogonewsProvider;
  2779.  
  2780.  
  2781. /***/ }),
  2782. /* 40 */
  2783. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2784.  
  2785. "use strict";
  2786.  
  2787. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2788. exports.AfDianNetProvider = void 0;
  2789. const utils_1 = __webpack_require__(2);
  2790. class AfDianNetProvider {
  2791. constructor() {
  2792. this.test = /afdian\.net\/link\?target=(.*)/;
  2793. }
  2794. resolve(aElement) {
  2795. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("target"));
  2796. }
  2797. }
  2798. exports.AfDianNetProvider = AfDianNetProvider;
  2799.  
  2800.  
  2801. /***/ }),
  2802. /* 41 */
  2803. /***/ ((__unused_webpack_module, exports) => {
  2804.  
  2805. "use strict";
  2806.  
  2807. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2808. exports.Blog51CTO = void 0;
  2809. class Blog51CTO {
  2810. constructor() {
  2811. this.test = true;
  2812. }
  2813. resolve(aElement) {
  2814. var _a;
  2815. this.container = document.querySelector(".article-detail");
  2816. if ((_a = this.container) === null || _a === void 0 ? void 0 : _a.contains(aElement)) {
  2817. if (!aElement.onclick && aElement.href) {
  2818. aElement.onclick = function antiRedirectOnClickFn(e) {
  2819. e.stopPropagation();
  2820. e.preventDefault();
  2821. e.stopImmediatePropagation();
  2822. const $a = document.createElement("a");
  2823. $a.href = aElement.href;
  2824. $a.target = aElement.target;
  2825. $a.click();
  2826. };
  2827. }
  2828. }
  2829. }
  2830. }
  2831. exports.Blog51CTO = Blog51CTO;
  2832.  
  2833.  
  2834. /***/ }),
  2835. /* 42 */
  2836. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2837.  
  2838. "use strict";
  2839.  
  2840. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2841. exports.InfoQProvider = void 0;
  2842. const utils_1 = __webpack_require__(2);
  2843. class InfoQProvider {
  2844. constructor() {
  2845. this.test = /infoq\.cn\/link\?target=(.*)/;
  2846. }
  2847. resolve(aElement) {
  2848. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("target"));
  2849. }
  2850. }
  2851. exports.InfoQProvider = InfoQProvider;
  2852.  
  2853.  
  2854. /***/ }),
  2855. /* 43 */
  2856. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2857.  
  2858. "use strict";
  2859.  
  2860. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2861. exports.GiteeProvider = void 0;
  2862. const utils_1 = __webpack_require__(2);
  2863. class GiteeProvider {
  2864. constructor() {
  2865. this.test = /gitee\.com\/link\?target=(.*)/;
  2866. }
  2867. resolve(aElement) {
  2868. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("target"));
  2869. }
  2870. }
  2871. exports.GiteeProvider = GiteeProvider;
  2872.  
  2873.  
  2874. /***/ }),
  2875. /* 44 */
  2876. /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
  2877.  
  2878. "use strict";
  2879.  
  2880. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2881. exports.SSPaiProvider = void 0;
  2882. const utils_1 = __webpack_require__(2);
  2883. class SSPaiProvider {
  2884. constructor() {
  2885. this.test = /sspai\.com\/link\?target=(.*)/;
  2886. }
  2887. resolve(aElement) {
  2888. (0, utils_1.antiRedirect)(aElement, new URL(aElement.href).searchParams.get("target"));
  2889. }
  2890. }
  2891. exports.SSPaiProvider = SSPaiProvider;
  2892.  
  2893.  
  2894. /***/ })
  2895. /******/ ]);
  2896. /************************************************************************/
  2897. /******/ // The module cache
  2898. /******/ var __webpack_module_cache__ = {};
  2899. /******/
  2900. /******/ // The require function
  2901. /******/ function __webpack_require__(moduleId) {
  2902. /******/ // Check if module is in cache
  2903. /******/ var cachedModule = __webpack_module_cache__[moduleId];
  2904. /******/ if (cachedModule !== undefined) {
  2905. /******/ return cachedModule.exports;
  2906. /******/ }
  2907. /******/ // Create a new module (and put it into the cache)
  2908. /******/ var module = __webpack_module_cache__[moduleId] = {
  2909. /******/ // no module.id needed
  2910. /******/ // no module.loaded needed
  2911. /******/ exports: {}
  2912. /******/ };
  2913. /******/
  2914. /******/ // Execute the module function
  2915. /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  2916. /******/
  2917. /******/ // Return the exports of the module
  2918. /******/ return module.exports;
  2919. /******/ }
  2920. /******/
  2921. /************************************************************************/
  2922. /******/ /* webpack/runtime/define property getters */
  2923. /******/ (() => {
  2924. /******/ // define getter functions for harmony exports
  2925. /******/ __webpack_require__.d = (exports, definition) => {
  2926. /******/ for(var key in definition) {
  2927. /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
  2928. /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
  2929. /******/ }
  2930. /******/ }
  2931. /******/ };
  2932. /******/ })();
  2933. /******/
  2934. /******/ /* webpack/runtime/global */
  2935. /******/ (() => {
  2936. /******/ __webpack_require__.g = (function() {
  2937. /******/ if (typeof globalThis === 'object') return globalThis;
  2938. /******/ try {
  2939. /******/ return this || new Function('return this')();
  2940. /******/ } catch (e) {
  2941. /******/ if (typeof window === 'object') return window;
  2942. /******/ }
  2943. /******/ })();
  2944. /******/ })();
  2945. /******/
  2946. /******/ /* webpack/runtime/hasOwnProperty shorthand */
  2947. /******/ (() => {
  2948. /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
  2949. /******/ })();
  2950. /******/
  2951. /******/ /* webpack/runtime/make namespace object */
  2952. /******/ (() => {
  2953. /******/ // define __esModule on exports
  2954. /******/ __webpack_require__.r = (exports) => {
  2955. /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  2956. /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  2957. /******/ }
  2958. /******/ Object.defineProperty(exports, '__esModule', { value: true });
  2959. /******/ };
  2960. /******/ })();
  2961. /******/
  2962. /************************************************************************/
  2963. var __webpack_exports__ = {};
  2964. // This entry need to be wrapped in an IIFE because it need to be in strict mode.
  2965. (() => {
  2966. "use strict";
  2967. var exports = __webpack_exports__;
  2968.  
  2969. Object.defineProperty(exports, "__esModule", ({ value: true }));
  2970. const app_1 = __webpack_require__(1);
  2971. const _51_ruyo_net_1 = __webpack_require__(5);
  2972. const addons_mozilla_org_1 = __webpack_require__(6);
  2973. const app_yinxiang_com_1 = __webpack_require__(7);
  2974. const blog_csdn_net_1 = __webpack_require__(8);
  2975. const oschina_com_1 = __webpack_require__(9);
  2976. const daily_zhihu_com_1 = __webpack_require__(10);
  2977. const docs_google_com_1 = __webpack_require__(11);
  2978. const getpocket_com_1 = __webpack_require__(12);
  2979. const gmail_google_com_1 = __webpack_require__(13);
  2980. const juejin_com_1 = __webpack_require__(14);
  2981. const mail_qq_com_1 = __webpack_require__(15);
  2982. const mijisou_com_1 = __webpack_require__(16);
  2983. const play_google_com_1 = __webpack_require__(17);
  2984. const steamcommunity_com_1 = __webpack_require__(18);
  2985. const tieba_baidu_com_1 = __webpack_require__(19);
  2986. const twitter_com_1 = __webpack_require__(20);
  2987. const video_baidu_com_1 = __webpack_require__(21);
  2988. const weibo_com_1 = __webpack_require__(23);
  2989. const www_baidu_com_1 = __webpack_require__(24);
  2990. const www_dogedoge_com_1 = __webpack_require__(29);
  2991. const www_douban_com_1 = __webpack_require__(30);
  2992. const www_google_com_1 = __webpack_require__(31);
  2993. const www_jianshu_com_1 = __webpack_require__(32);
  2994. const www_so_com_1 = __webpack_require__(33);
  2995. const www_sogou_com_1 = __webpack_require__(34);
  2996. const www_youtube_com_1 = __webpack_require__(35);
  2997. const www_zhihu_com_1 = __webpack_require__(36);
  2998. const xueshu_baidu_com_1 = __webpack_require__(37);
  2999. const zhuanlan_zhihu_com_1 = __webpack_require__(38);
  3000. const www_logonews_cn_1 = __webpack_require__(39);
  3001. const afadian_net_1 = __webpack_require__(40);
  3002. const blog_51cto_com_1 = __webpack_require__(41);
  3003. const infoq_cn_1 = __webpack_require__(42);
  3004. const gitee_com_1 = __webpack_require__(43);
  3005. const sspai_com_1 = __webpack_require__(44);
  3006. const gm_http_1 = __webpack_require__(22);
  3007. const app = new app_1.App();
  3008. const isDebug = "production" !== "production";
  3009. gm_http_1.default.setConfig({ debug: isDebug });
  3010. app
  3011. .setConfig({ isDebug })
  3012. .registerProvider([
  3013. {
  3014. // 测试地址: https://www.zhihu.com/question/25258775
  3015. name: "知乎",
  3016. test: /www\.zhihu\.com/,
  3017. provider: www_zhihu_com_1.ZhihuProvider,
  3018. },
  3019. {
  3020. // 测试地址: https://zhuanlan.zhihu.com/p/20549978
  3021. name: "知乎专栏",
  3022. test: /zhuanlan\.zhihu\.com/,
  3023. provider: zhuanlan_zhihu_com_1.ZhihuZhuanlanProvider,
  3024. },
  3025. {
  3026. // 测试地址:
  3027. name: "知乎日报",
  3028. test: /daily\.zhihu\.com/,
  3029. provider: daily_zhihu_com_1.ZhihuDailyProvider,
  3030. },
  3031. {
  3032. name: "Google搜索",
  3033. test: /\w+\.google\./,
  3034. provider: www_google_com_1.GoogleProvider,
  3035. },
  3036. {
  3037. // 测试地址: https://docs.google.com/spreadsheets/d/1TFcEXMcKrwoIAECIVyBU0GPoSmRqZ7A0VBvqeKYVSww/htmlview
  3038. name: "Google Docs",
  3039. test: /docs\.google\.com/,
  3040. provider: docs_google_com_1.GoogleDocsProvider,
  3041. },
  3042. {
  3043. name: "Gmail",
  3044. test: /mail\.google\.com/,
  3045. provider: gmail_google_com_1.GmailProvider,
  3046. },
  3047. {
  3048. // 测试地址: https://play.google.com/store/movies/details/%E7%A7%BB%E5%8B%95%E8%BF%B7%E5%AE%AE_%E6%AD%BB%E4%BA%A1%E8%A7%A3%E8%97%A5?id=YNy7gRqwtMk
  3049. name: "Google Play",
  3050. test: /play\.google\.com/,
  3051. provider: play_google_com_1.GooglePlayProvider,
  3052. },
  3053. {
  3054. // 测试地址: https://www.youtube.com/watch?v=XTXSRRSv1bY
  3055. name: "Google Youtube",
  3056. test: /www\.youtube\.com/,
  3057. provider: www_youtube_com_1.YoutubeProvider,
  3058. },
  3059. {
  3060. // 测试地址: https://www.so.com/s?ie=utf-8&fr=none&src=360sou_newhome&q=chrome
  3061. name: "360搜索",
  3062. test: /www\.so\.com/,
  3063. provider: www_so_com_1.SoProvider,
  3064. },
  3065. {
  3066. name: "新浪微博",
  3067. test: /\.weibo\.com/,
  3068. provider: weibo_com_1.WeboProvider,
  3069. },
  3070. // 测试: https://twitter.com/ftium4/status/1512815116810522631
  3071. {
  3072. name: "Twitter",
  3073. test: /twitter\.com/,
  3074. provider: twitter_com_1.TwitterProvider,
  3075. },
  3076. {
  3077. // 测试: http://www.sogou.com/web?query=chrome&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=1527&sst0=1504347367611&lkt=0%2C0%2C0&sugsuv=00091651B48CA45F593B61A29B131405&sugtime=1504347367611
  3078. name: "搜狗搜索",
  3079. test: /www\.sogou\.com/,
  3080. provider: www_sogou_com_1.SoGouProvider,
  3081. },
  3082. {
  3083. // 测试: https://www.baidu.com/s?wd=chrome&rsv_spt=1&rsv_iqid=0xcb136237000ed40e&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baidulocal&rsv_enter=1&rsv_sug3=7&rsv_sug1=7&rsv_sug7=101&rsv_sug2=0&inputT=813&rsv_sug4=989&timestamp=1504349229266&rn=50&vf_bl=1
  3084. name: "百度搜索",
  3085. test: /www\.baidu\.com/,
  3086. provider: www_baidu_com_1.BaiduProvider,
  3087. },
  3088. {
  3089. // 测试: https://www.baidu.com/s?wd=chrome&pn=20&oq=chrome&tn=baiduhome_pg&ie=utf-8&usm=3&rsv_idx=2&rsv_pq=e043900d0000752d&rsv_t=6bb0UqEwp2Tle6TAMBDlU3Wg%2BSxoqvvOhZKyQgM%2BVQP8Gc54QZLhcDcj62eGfNG75aq5&rsv_page=1
  3090. name: "百度视频",
  3091. test: /v\.baidu\.com/,
  3092. provider: video_baidu_com_1.BaiduVideoProvider,
  3093. },
  3094. {
  3095. // 测试: http://xueshu.baidu.com/s?wd=paperuri%3A%28ae4d6b5da05eca552dab05aeefb966e6%29&ie=utf-8&filter=sc_long_sign&sc_ks_para=q%3D%E2%80%9C%E4%BA%92%E8%81%94%E7%BD%91%2B%E5%81%A5%E5%BA%B7%E7%AE%A1%E7%90%86%E2%80%9D%E6%A8%A1%E5%BC%8F%E6%8E%A2%E8%AE%A8%E5%8F%8A%E5%85%B6%E5%BA%94%E7%94%A8&tn=SE_baiduxueshu_c1gjeupa
  3096. name: "百度学术",
  3097. test: /xueshu\.baidu\.com/,
  3098. provider: xueshu_baidu_com_1.BaiduXueshuProvider,
  3099. },
  3100. {
  3101. // 测试地址: http://tieba.baidu.com/p/5300844180
  3102. name: "百度贴吧",
  3103. test: /tieba\.baidu\.com/,
  3104. provider: tieba_baidu_com_1.TiebaProvider,
  3105. },
  3106. {
  3107. // 测试地址: https://juejin.im/entry/59ac8fa551882524241a8802?utm_source=gold_browser_extension
  3108. name: "掘金",
  3109. test: /juejin\.(im|cn)/,
  3110. provider: juejin_com_1.JuejinProvider,
  3111. },
  3112. {
  3113. name: "QQ邮箱",
  3114. test: /mail\.qq\.com/,
  3115. provider: mail_qq_com_1.QQMailProvider,
  3116. },
  3117. {
  3118. // 测试地址: https://addons.mozilla.org/zh-CN/firefox/addon/evernote-web-clipper/
  3119. name: "Mozilla",
  3120. test: /addons\.mozilla\.org/,
  3121. provider: addons_mozilla_org_1.MozillaProvider,
  3122. },
  3123. {
  3124. // 测试地址: https://www.jianshu.com/p/979776ca44b8
  3125. // https://www.jianshu.com/p/fc8abc65bbb2
  3126. name: "简书",
  3127. test: /www\.jianshu\.com/,
  3128. provider: www_jianshu_com_1.JianShuProvider,
  3129. },
  3130. {
  3131. // 测试地址: https://www.douban.com/doulist/240962/
  3132. // 测试地址: https://www.douban.com/search?cat=1002&q=%E9%BB%91%E9%95%9C
  3133. name: "豆瓣",
  3134. test: /douban\.com/,
  3135. provider: www_douban_com_1.DouBanProvider,
  3136. },
  3137. {
  3138. // 测试地址: https://getpocket.com/a/recommended/
  3139. // 需要登陆
  3140. name: "Pocket",
  3141. test: /getpocket\.com/,
  3142. provider: getpocket_com_1.PocketProvider,
  3143. },
  3144. {
  3145. // 测试地址: https://www.dogedoge.com/results?q=chrome
  3146. name: "DogeDoge",
  3147. test: /www\.dogedoge\.com/,
  3148. provider: www_dogedoge_com_1.DogeDogeProvider,
  3149. },
  3150. {
  3151. // 测试地址: https://51.ruyo.net/15053.html
  3152. name: "Ruyo",
  3153. test: /51\.ruyo\.net/,
  3154. provider: _51_ruyo_net_1.RuyoProvider,
  3155. },
  3156. {
  3157. // 测试地址: https://steamcommunity.com/sharedfiles/filedetails/?id=1311535531
  3158. name: "Steam",
  3159. test: /steamcommunity\.com/,
  3160. provider: steamcommunity_com_1.SteamProvider,
  3161. },
  3162. {
  3163. // 测试地址: https://mijisou.com/?q=chrome&category_general=on&time_range=&language=zh-CN&pageno=1
  3164. name: "秘迹",
  3165. test: /mijisou\.com/,
  3166. provider: mijisou_com_1.MiJiProvider,
  3167. },
  3168. {
  3169. // 测试地址: https://github.com/axetroy/anti-redirect/issues/350
  3170. name: "CSDN",
  3171. test: /blog\.csdn\.net/,
  3172. provider: blog_csdn_net_1.CSDNProvider,
  3173. },
  3174. {
  3175. // 测试地址:https://my.oschina.net/chipo/blog/3067672
  3176. name: "OS China",
  3177. test: /oschina\.net/,
  3178. provider: oschina_com_1.OSChinaProvider,
  3179. },
  3180. {
  3181. // 测试地址: https://github.com/axetroy/anti-redirect/issues/350
  3182. name: "印象笔记",
  3183. test: /app\.yinxiang\.com/,
  3184. provider: app_yinxiang_com_1.YinXiangProvider,
  3185. },
  3186. {
  3187. // 测试地址: https://www.logonews.cn/2021073002420141.html
  3188. name: "标志情报局",
  3189. test: /www\.logonews\.cn/,
  3190. provider: www_logonews_cn_1.LogonewsProvider,
  3191. },
  3192. {
  3193. // 测试地址: https://afdian.net/a/xiaofanEric
  3194. name: "爱发电",
  3195. test: /afdian\.net/,
  3196. provider: afadian_net_1.AfDianNetProvider,
  3197. },
  3198. {
  3199. // 测试地址: https://blog.51cto.com/u_11512826/2068421
  3200. name: "51CTO博客",
  3201. test: /blog\.51cto\.com/,
  3202. provider: blog_51cto_com_1.Blog51CTO,
  3203. },
  3204. {
  3205. // 测试地址: https://xie.infoq.cn/link?target=https%3A%2F%2Fwww.finclip.com%2F%3Fchannel%3Dinfoqseo
  3206. name: 'InfoQ',
  3207. test: /infoq\.cn/,
  3208. provider: infoq_cn_1.InfoQProvider
  3209. },
  3210. {
  3211. // 测试地址: https://gitee.com/Tencent/ncnn
  3212. name: 'Gitee',
  3213. test: /gitee.com/,
  3214. provider: gitee_com_1.GiteeProvider
  3215. },
  3216. {
  3217. // 测试地址: https://sspai.com/post/77499
  3218. name: '少数派',
  3219. test: /sspai\.com/,
  3220. provider: sspai_com_1.SSPaiProvider
  3221. }
  3222. ])
  3223. .bootstrap();
  3224.  
  3225. })();
  3226.  
  3227. /******/ })()
  3228. ;
  3229. //# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0lBQ0Q7UUFDRSx5Q0FBeUM7UUFDekMsSUFBSSxFQUFFLEtBQUs7UUFDWCxJQUFJLEVBQUUsYUFBYTtRQUNuQixRQUFRLEVBQUUsK0JBQWlCO0tBQzVCO0lBQ0Q7UUFDRSxrREFBa0Q7UUFDbEQsSUFBSSxFQUFFLFNBQVM7UUFDZixJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLFFBQVEsRUFBRSwwQkFBUztLQUNwQjtJQUNEO1FBQ0UsK0ZBQStGO1FBQy9GLElBQUksRUFBRSxPQUFPO1FBQ2IsSUFBSSxFQUFFLFdBQVc7UUFDakIsUUFBUSxFQUFFLHdCQUFhO0tBQ3hCO0lBQ0Q7UUFDRSx1Q0FBdUM7UUFDdkMsSUFBSSxFQUFFLE9BQU87UUFDYixJQUFJLEVBQUUsV0FBVztRQUNqQixRQUFRLEVBQUUseUJBQWE7S0FDeEI7SUFDRDtRQUNFLHFDQUFxQztRQUNyQyxJQUFJLEVBQUUsS0FBSztRQUNYLElBQUksRUFBRSxZQUFZO1FBQ2xCLFFBQVEsRUFBRSx5QkFBYTtLQUN4QjtDQUNGLENBQUM7S0FDRCxTQUFTLEVBQUUsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvYXBwLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL25vZGVfbW9kdWxlcy9sb2Rhc2guZGVib3VuY2UvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL25vZGVfbW9kdWxlcy9sb2Rhc2gudGhyb3R0bGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy81MS5ydXlvLm5ldC50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL2FkZG9ucy5tb3ppbGxhLm9yZy50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL2FwcC55aW54aWFuZy5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy9ibG9nLmNzZG4ubmV0LnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvb3NjaGluYS5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy9kYWlseS56aGlodS5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy9kb2NzLmdvb2dsZS5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy9nZXRwb2NrZXQuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvZ21haWwuZ29vZ2xlLmNvbS50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL2p1ZWppbi5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy9tYWlsLnFxLmNvbS50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL21pamlzb3UuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvcGxheS5nb29nbGUuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvc3RlYW1jb21tdW5pdHkuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvdGllYmEuYmFpZHUuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvdHdpdHRlci5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy92aWRlby5iYWlkdS5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL25vZGVfbW9kdWxlcy9nbS1odHRwL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy93ZWliby5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy93d3cuYmFpZHUuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9ub2RlX21vZHVsZXMvcC1yZXRyeS9pbmRleC5qcyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vbm9kZV9tb2R1bGVzL3JldHJ5L2luZGV4LmpzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9ub2RlX21vZHVsZXMvcmV0cnkvbGliL3JldHJ5LmpzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9ub2RlX21vZHVsZXMvcmV0cnkvbGliL3JldHJ5X29wZXJhdGlvbi5qcyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL3d3dy5kb2dlZG9nZS5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy93d3cuZG91YmFuLmNvbS50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL3d3dy5nb29nbGUuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvd3d3LmppYW5zaHUuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvd3d3LnNvLmNvbS50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL3d3dy5zb2dvdS5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy93d3cueW91dHViZS5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy93d3cuemhpaHUuY29tLnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMveHVlc2h1LmJhaWR1LmNvbS50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL3podWFubGFuLnpoaWh1LmNvbS50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL3d3dy5sb2dvbmV3cy5jbi50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL2FmYWRpYW4ubmV0LnRzIiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9zcmMvc2l0ZXMvYmxvZy41MWN0by5jb20udHMiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC8uL3NyYy9zaXRlcy9pbmZvcS5jbi50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL2dpdGVlLmNvbS50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0Ly4vc3JjL3NpdGVzL3NzcGFpLmNvbS50cyIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2FudGktcmVkaXJlY3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2FudGktcmVkaXJlY3Qvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9hbnRpLXJlZGlyZWN0L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vYW50aS1yZWRpcmVjdC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2FudGktcmVkaXJlY3QvLi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUHJvdmlkZXIsIElQcm92aWRlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vcHJvdmlkZXJcIjtcbmltcG9ydCB7IE1hcmtlciwgZGVib3VuY2VEZWNvcmF0b3IsIGdldFJlZGlyZWN0LCBpc0luVmlldywgdGhyb3R0bGVEZWNvcmF0b3IgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG50eXBlIHRlc3RlciA9ICgpID0+IGJvb2xlYW47XG5cbmludGVyZmFjZSBJUHJvdmlkZXJDb25maWcge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRlc3Q6IFJlZ0V4cCB8IGJvb2xlYW4gfCB0ZXN0ZXI7XG4gIHByb3ZpZGVyOiBJUHJvdmlkZXJDb25zdHJ1Y3Rvcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXBwQ29uZmlnIHtcbiAgaXNEZWJ1ZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcCB7XG4gIHByaXZhdGUgY29uZmlnOiBJQXBwQ29uZmlnO1xuICBwcml2YXRlIHByb3ZpZGVzOiBJUHJvdmlkZXJbXSA9IFtdO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiJWMgQW50aS1SZWRpcmVjdCAlYyBDb3B5cmlnaHQgXFx4YTkgMjAxNS0lcyAlc1wiLFxuICAgICAgJ2ZvbnQtZmFtaWx5OiBcIkhlbHZldGljYSBOZXVlXCIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjY0cHg7Y29sb3I6IzAwYmJlZTstd2Via2l0LXRleHQtZmlsbC1jb2xvcjojMDBiYmVlOy13ZWJraXQtdGV4dC1zdHJva2U6IDFweCAjMDBiYmVlOycsXG4gICAgICBcImZvbnQtc2l6ZToxMnB4O2NvbG9yOiM5OTk5OTk7XCIsXG4gICAgICBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksXG4gICAgICBcIlxcblwiICsgXCJBdXRob3IgQEF4ZXRyb3lcIixcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKFwiW0FudGkgUmVkaXJlY3RdOiDlpoLmnpzlj5HnjrDpobXpnaLph43lrprlkJHmnKrljrvpmaTvvIzmrKLov47lj43ppoghXCIpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYCVjW0FudGkgUmVkaXJlY3RdOiDmlK/ku5jlrp3mkJzntKIgXCIlYzUxMTExODEzMiVjXCIg6aKG5Y+W57qi5YyF5pSv5oyB5L2c6ICFIWAsXG4gICAgICBcImZvbnQtc2l6ZTogMTJweDtcIixcbiAgICAgIFwiZm9udC1zaXplOiAxNnB4O2NvbG9yOiByZWRcIixcbiAgICAgIFwiZm9udC1zaXplOiAxMnB4O1wiLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIEEg5qCH562+5piv5ZCm5Yy56YWN5pyN5Yqh5o+Q5L6b6ICFXG4gICAqIEBwYXJhbSBhRWxlbWVudFxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICovXG4gIHByaXZhdGUgaXNNYXRjaFByb3ZpZGVyKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCwgcHJvdmlkZXI6IElQcm92aWRlcik6IGJvb2xlYW4ge1xuICAgIGlmIChhRWxlbWVudC5nZXRBdHRyaWJ1dGUoTWFya2VyLlJlZGlyZWN0U3RhdHVzRG9uZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHByb3ZpZGVyLnRlc3QgaW5zdGFuY2VvZiBSZWdFeHAgJiYgIXByb3ZpZGVyLnRlc3QudGVzdChhRWxlbWVudC5ocmVmKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyLnRlc3QgPT09IFwiZnVuY3Rpb25cIiAmJiAhcHJvdmlkZXIudGVzdChhRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHByb3ZpZGVyLnRlc3QgaW5zdGFuY2VvZiBCb29sZWFuKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZXIudGVzdCBhcyBib29sZWFuO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICog5b2T6byg5qCH56e75Yqo5YiwIEEg5qCH562+5LiK5pe2XG4gICAqIEBwYXJhbSBldmVudFxuICAgKi9cbiAgQHRocm90dGxlRGVjb3JhdG9yKDUwKVxuICBwcml2YXRlIG9uSG92ZXIoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICAgIGlmIChhRWxlbWVudC50YWdOYW1lICE9PSBcIkFcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB0cmlnZ2VyIG9uIGhvdmVyIGhhbmRsZXJcbiAgICBmb3IgKGNvbnN0IHByb3ZpZGVyIG9mIHRoaXMucHJvdmlkZXMpIHtcbiAgICAgIGlmICh0aGlzLmlzTWF0Y2hQcm92aWRlcihhRWxlbWVudCwgcHJvdmlkZXIpKSB7XG4gICAgICAgIHByb3ZpZGVyLnJlc29sdmUoYUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICog5b2T6aG16Z2i5rua5Yqo5pe2XG4gICAqL1xuICBAZGVib3VuY2VEZWNvcmF0b3IoMzAwKVxuICBwcml2YXRlIG9uU2Nyb2xsKCkge1xuICAgIC8vIOetm+mAieaJgOacieWcqOWPr+inhuWMuuWfn+WGheeahEHmoIfnrb5cbiAgICBjb25zdCB2aXNpYmxlRWxlbWVudHM6IEhUTUxBbmNob3JFbGVtZW50W10gPSBbXS5zbGljZVxuICAgICAgLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImFbaHJlZl1cIikpXG4gICAgICAuZmlsdGVyKChhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpID0+IHtcbiAgICAgICAgcmV0dXJuIGFFbGVtZW50LmhyZWYuaW5kZXhPZihcImh0dHBcIikgPiAtMSAmJiBpc0luVmlldyhhRWxlbWVudCkgJiYgZ2V0UmVkaXJlY3QoYUVsZW1lbnQpIDw9IDI7XG4gICAgICB9KTtcbiAgICAvLyB0cmlnZ2VyIHNjcm9sbCBoYW5kbGVyXG4gICAgZm9yIChjb25zdCBwcm92aWRlciBvZiB0aGlzLnByb3ZpZGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IGFFbGVtZW50IG9mIHZpc2libGVFbGVtZW50cykge1xuICAgICAgICBpZiAodGhpcy5pc01hdGNoUHJvdmlkZXIoYUVsZW1lbnQsIHByb3ZpZGVyKSkge1xuICAgICAgICAgIHByb3ZpZGVyLnJlc29sdmUoYUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiDlvZPpobXpnaLlh4blpIflsLHnu6rml7bvvIzov5vooYzliJ3lp4vljJbliqjkvZxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFnZU9uUmVhZHkoKSB7XG4gICAgZm9yIChjb25zdCBwcm92aWRlciBvZiB0aGlzLnByb3ZpZGVzKSB7XG4gICAgICBpZiAocHJvdmlkZXIub25Jbml0KSB7XG4gICAgICAgIGF3YWl0IHByb3ZpZGVyLm9uSW5pdCgpO1xuICAgICAgfVxuICAgICAgLy8g5aaC5p6c6aG16Z2i5aSE5LqO5Yid5aeL55qE54q25oCB77yM5rKh5pyJ5rua5Yqo6L+H77yM5YiZ5Ye65Y+R5LiA5qyhb25TY3JvbGzkuovku7ZcbiAgICAgIGlmICh3aW5kb3cuc2Nyb2xsWSA8PSAwKSB7XG4gICAgICAgIHRoaXMub25TY3JvbGwoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIOiuvue9rumFjee9rlxuICAgKiBAcGFyYW0gY29uZmlnXG4gICAqL1xuICBwdWJsaWMgc2V0Q29uZmlnKGNvbmZpZzogSUFwcENvbmZpZyk6IHRoaXMge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiDms6jlhozmnI3liqHmj5DkvpvogIVcbiAgICogQHBhcmFtIHByb3ZpZGVyc1xuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyUHJvdmlkZXIocHJvdmlkZXJzOiBJUHJvdmlkZXJDb25maWdbXSk6IHRoaXMge1xuICAgIGZvciAoY29uc3QgcHJvdmlkZUNvbmZpZyBvZiBwcm92aWRlcnMpIHtcbiAgICAgIC8vIHRlc3Qg5aaC5p6c5pivIGJvb2xlYW5cbiAgICAgIGlmIChwcm92aWRlQ29uZmlnLnRlc3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gdGVzdCDlpoLmnpzmmK/mraPliJnooajovr7lvI9cbiAgICAgIGlmIChwcm92aWRlQ29uZmlnLnRlc3QgaW5zdGFuY2VvZiBSZWdFeHAgJiYgIXByb3ZpZGVDb25maWcudGVzdC50ZXN0KGRvY3VtZW50LmRvbWFpbikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyB0ZXN0IOWmguaenOaYr+S4gOS4qmZ1bmN0aW9uXG4gICAgICBpZiAodHlwZW9mIHByb3ZpZGVDb25maWcudGVzdCA9PT0gXCJmdW5jdGlvblwiICYmIHByb3ZpZGVDb25maWcudGVzdCgpID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IHByb3ZpZGVDb25maWcucHJvdmlkZXIoKTtcbiAgICAgIHByb3ZpZGVyLmlzRGVidWcgPSB0aGlzLmNvbmZpZy5pc0RlYnVnO1xuICAgICAgdGhpcy5wcm92aWRlcy5wdXNoKHByb3ZpZGVyKTtcbiAgICAgIGNvbnNvbGUuaW5mbyhgW0FudGktcmVkaXJlY3RdOiDliqDovb3lvJXmk44gJHtwcm92aWRlQ29uZmlnLm5hbWV9YCk7XG4gICAgICBjb25zb2xlLmluZm8oYOW9k+WJjemhtemdojogJyR7bG9jYXRpb24uaHJlZn0nYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiDlkK/liqjlupTnlKhcbiAgICovXG4gIHB1YmxpYyBib290c3RyYXAoKSB7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vbkhvdmVyLmJpbmQodGhpcykpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIHRoaXMucGFnZU9uUmVhZHkuYmluZCh0aGlzKSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIGRlYm91bmNlIGZyb20gXCJsb2Rhc2guZGVib3VuY2VcIjtcbmltcG9ydCAqIGFzIHRocm90dGxlIGZyb20gXCJsb2Rhc2gudGhyb3R0bGVcIjtcblxuZXhwb3J0IGVudW0gTWFya2VyIHtcbiAgUmVkaXJlY3RDb3VudCA9IFwicmVkaXJlY3QtY291bnRcIixcbiAgUmVkaXJlY3RTdGF0dXNEb25lID0gXCJhbnRpLXJlZGlyZWN0LW9yaWdpbi1ocmVmXCIsXG59XG5cbi8vIHJvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBhbGxvdyByZXR1cm4gYW55dGhpbmdcbnR5cGUgRGVjb3JhdG9yTWV0aG9kRnVuY3Rpb24gPSAob3JpZ2luTWV0aG9kOiBGdW5jdGlvbiwgY29udGV4dDogQ2xhc3NNZW1iZXJEZWNvcmF0b3JDb250ZXh0KSA9PiBhbnk7XG5cbi8qKlxuICog5qC55o2udXJs5LiK55qE6Lev5b6E5Yy56YWN77yM5Y676Zmk6YeN5a6a5ZCRXG4gKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBhRWxlbWVudFxuICogQHBhcmFtIHtSZWdFeHB9IHRlc3RlclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaExpbmtGcm9tVXJsKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCwgdGVzdGVyOiBSZWdFeHApOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaGVyOiBzdHJpbmdbXSA9IHRlc3Rlci5leGVjKGFFbGVtZW50LmhyZWYpO1xuICBpZiAoIShtYXRjaGVyPy5sZW5ndGggJiYgbWF0Y2hlclsxXSkpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuXG4gIGxldCB1cmwgPSBcIlwiO1xuICB0cnkge1xuICAgIHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaGVyWzFdKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHVybCA9IC9odHRwcz86XFwvXFwvLy50ZXN0KG1hdGNoZXJbMV0pID8gbWF0Y2hlclsxXSA6IFwiXCI7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cblxuY2xhc3MgUXVlcnkge1xuICBwcml2YXRlIG9iamVjdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBxdWVyeVN0cjogc3RyaW5nKSB7XG4gICAgdGhpcy5vYmplY3QgPSB0aGlzLnRvT2JqZWN0KHF1ZXJ5U3RyLnJlcGxhY2UoL15cXD8rLywgXCJcIikpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b09iamVjdChxdWVyeVN0cjogc3RyaW5nKSB7XG4gICAgY29uc3Qgb2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgcXVlcnlTdHIuc3BsaXQoXCImXCIpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGFycjogc3RyaW5nW10gPSBpdGVtLnNwbGl0KFwiPVwiKSB8fCBbXTtcbiAgICAgIGxldCBrZXk6IHN0cmluZyA9IGFyclswXSB8fCBcIlwiO1xuICAgICAgbGV0IHZhbHVlOiBzdHJpbmcgPSBhcnJbMV0gfHwgXCJcIjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChhcnJbMF0gfHwgXCJcIik7XG4gICAgICAgIHZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KGFyclsxXSB8fCBcIlwiKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvL1xuICAgICAgfVxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBhcnI6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5vYmplY3QpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5vYmplY3QsIGtleSkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm9iamVjdFtrZXldO1xuICAgICAgICBhcnIucHVzaChgJHtrZXl9PSR7dmFsdWV9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnIubGVuZ3RoID8gYD8ke2Fyci5qb2luKFwiJlwiKX1gIDogXCJcIjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlQYXJzZXIocXVlcnlTdHJpbmc6IHN0cmluZyk6IFF1ZXJ5IHtcbiAgcmV0dXJuIG5ldyBRdWVyeShxdWVyeVN0cmluZyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0KGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiAoaHRtbEVsZW1lbnQuaW5uZXJUZXh0IHx8IGh0bWxFbGVtZW50LnRleHRDb250ZW50KS50cmltKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aHJvdHRsZURlY29yYXRvcih3YWl0OiBudW1iZXIsIG9wdGlvbnMgPSB7fSk6IERlY29yYXRvck1ldGhvZEZ1bmN0aW9uIHtcbiAgcmV0dXJuIChvcmlnaW5NZXRob2QsIGNvbnRleHQ6IENsYXNzTWVtYmVyRGVjb3JhdG9yQ29udGV4dCkgPT4ge1xuICAgIHJldHVybiB0aHJvdHRsZShvcmlnaW5NZXRob2QsIHdhaXQsIG9wdGlvbnMpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2VEZWNvcmF0b3Iod2FpdDogbnVtYmVyLCBvcHRpb25zID0ge30pOiBEZWNvcmF0b3JNZXRob2RGdW5jdGlvbiB7XG4gIHJldHVybiAob3JpZ2luTWV0aG9kLCBjb250ZXh0OiBDbGFzc01lbWJlckRlY29yYXRvckNvbnRleHQpID0+IHtcbiAgICByZXR1cm4gZGVib3VuY2Uob3JpZ2luTWV0aG9kLCB3YWl0LCBvcHRpb25zKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW5WaWV3KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIGNvbnN0IHZXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgY29uc3QgdkhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuXG4gIGNvbnN0IGVmcCA9ICh4LCB5KSA9PiB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIGZhbHNlIGlmIGl0J3Mgbm90IGluIHRoZSB2aWV3cG9ydFxuICBpZiAocmVjdC5yaWdodCA8IDAgfHwgcmVjdC5ib3R0b20gPCAwIHx8IHJlY3QubGVmdCA+IHZXaWR0aCB8fCByZWN0LnRvcCA+IHZIZWlnaHQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgaXRzIGZvdXIgY29ybmVycyBhcmUgdmlzaWJsZVxuICByZXR1cm4gKFxuICAgIGVsZW1lbnQuY29udGFpbnMoZWZwKHJlY3QubGVmdCwgcmVjdC50b3ApKSB8fFxuICAgIGVsZW1lbnQuY29udGFpbnMoZWZwKHJlY3QucmlnaHQsIHJlY3QudG9wKSkgfHxcbiAgICBlbGVtZW50LmNvbnRhaW5zKGVmcChyZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSkpIHx8XG4gICAgZWxlbWVudC5jb250YWlucyhlZnAocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWRpcmVjdChhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpOiBudW1iZXIge1xuICByZXR1cm4gKyhhRWxlbWVudC5nZXRBdHRyaWJ1dGUoTWFya2VyLlJlZGlyZWN0Q291bnQpIHx8IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5jcmVhc2VSZWRpcmVjdChhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpOiB2b2lkIHtcbiAgY29uc3QgbnVtOiBudW1iZXIgPSBnZXRSZWRpcmVjdChhRWxlbWVudCk7XG4gIGFFbGVtZW50LnNldEF0dHJpYnV0ZShNYXJrZXIuUmVkaXJlY3RDb3VudCwgYCR7bnVtfSR7MX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY3JlYXNlUmVkaXJlY3QoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KTogdm9pZCB7XG4gIGNvbnN0IG51bTogbnVtYmVyID0gZ2V0UmVkaXJlY3QoYUVsZW1lbnQpO1xuICBpZiAobnVtID4gMCkge1xuICAgIGFFbGVtZW50LnNldEF0dHJpYnV0ZShNYXJrZXIuUmVkaXJlY3RDb3VudCwgYCR7bnVtIC0gMX1gKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgSUFudGlSZWRpcmVjdE9wdGlvbiB7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgZm9yY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIOWOu+mZpOmHjeWumuWQkVxuICogQHBhcmFtIGFFbGVtZW50IEHmoIfnrb7lhYPntKBcbiAqIEBwYXJhbSByZWFsVXJsIOecn+WunueahOWcsOWdgFxuICogQHBhcmFtIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFudGlSZWRpcmVjdChhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQsIHJlYWxVcmw6IHN0cmluZywgb3B0aW9uczogSUFudGlSZWRpcmVjdE9wdGlvbiA9IHt9KSB7XG4gIG9wdGlvbnMuZGVidWcgPSB0eXBlb2Ygb3B0aW9ucy5kZWJ1ZyA9PT0gXCJ1bmRlZmluZWRcIiA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA6IG9wdGlvbnMuZGVidWc7XG5cbiAgb3B0aW9ucy5mb3JjZSA9IG9wdGlvbnMuZm9yY2U7XG5cbiAgaWYgKCFvcHRpb25zLmZvcmNlICYmICghcmVhbFVybCB8fCBhRWxlbWVudC5ocmVmID09PSByZWFsVXJsKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgIGFFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiZ3JlZW5cIjtcbiAgfVxuICBhRWxlbWVudC5zZXRBdHRyaWJ1dGUoTWFya2VyLlJlZGlyZWN0U3RhdHVzRG9uZSwgYUVsZW1lbnQuaHJlZik7XG4gIGFFbGVtZW50LmhyZWYgPSByZWFsVXJsO1xufVxuIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRocm90dGxlZCBmdW5jdGlvbiB0aGF0IG9ubHkgaW52b2tlcyBgZnVuY2AgYXQgbW9zdCBvbmNlIHBlclxuICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG9cbiAqIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYFxuICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZVxuICogdGhyb3R0bGVkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24gcmV0dXJuIHRoZVxuICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhyb3R0bGUgaW52b2NhdGlvbnMgdG8uXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBleGNlc3NpdmVseSB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgc2Nyb2xsaW5nLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICpcbiAqIC8vIEludm9rZSBgcmVuZXdUb2tlbmAgd2hlbiB0aGUgY2xpY2sgZXZlbnQgaXMgZmlyZWQsIGJ1dCBub3QgbW9yZSB0aGFuIG9uY2UgZXZlcnkgNSBtaW51dGVzLlxuICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsZWFkaW5nID0gdHJ1ZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gJ2xlYWRpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMubGVhZGluZyA6IGxlYWRpbmc7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuICByZXR1cm4gZGVib3VuY2UoZnVuYywgd2FpdCwge1xuICAgICdsZWFkaW5nJzogbGVhZGluZyxcbiAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgJ3RyYWlsaW5nJzogdHJhaWxpbmdcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRocm90dGxlO1xuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBSdXlvUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC9cXC9bXlxcP10qXFw/dT0oLiopLztcbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXCJ1XCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCwgbWF0Y2hMaW5rRnJvbVVybCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBNb3ppbGxhUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC9vdXRnb2luZ1xcLnByb2RcXC5tb3phd3NcXC5uZXRcXC92XFxkXFwvXFx3K1xcLyguKikvO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIG1hdGNoTGlua0Zyb21VcmwoYUVsZW1lbnQsIHRoaXMudGVzdCkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUHJvdmlkZXIgfSBmcm9tIFwiQC9wcm92aWRlclwiO1xuaW1wb3J0IHsgYW50aVJlZGlyZWN0IH0gZnJvbSBcIkAvdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFlpblhpYW5nUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC9eaHR0cDpcXC9cXC8vO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICAvLyDnvJbovpHlmahcbiAgICBpZiAoYUVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGF0YS1tY2UtaHJlZlwiKSkge1xuICAgICAgaWYgKCFhRWxlbWVudC5vbmNsaWNrKSB7XG4gICAgICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgYUVsZW1lbnQuaHJlZiwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgYUVsZW1lbnQub25jbGljayA9IChlKSA9PiB7XG4gICAgICAgICAgLy8g6Zi75q2i5LqL5Lu25YaS5rOhLCDlm6DkuLrkuIrlsYLlhYPntKDnu5HlrprnmoRjbGlja+S6i+S7tuS8mumHjeWumuWQkVxuICAgICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYUVsZW1lbnQuc2V0QXR0cmlidXRlKFwidGFyZ2V0XCIsIFwiX2JsYW5rXCIpO1xuICAgICAgICAgIHdpbmRvdy50b3AgPyB3aW5kb3cudG9wLm9wZW4oYUVsZW1lbnQuaHJlZikgOiB3aW5kb3cub3BlbihhRWxlbWVudC5ocmVmKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8g5YiG5Lqr6aG16Z2iXG4gICAgZWxzZSBpZiAoL15odHRwczpcXC9cXC9hcHBcXC55aW54aWFuZ1xcLmNvbVxcL091dGJvdW5kUmVkaXJlY3RcXC5hY3Rpb25cXD9kZXN0PS8udGVzdChhRWxlbWVudC5ocmVmKSkge1xuICAgICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXCJkZXN0XCIpKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGFzeW5jIG9uSW5pdCgpOiBQcm9taXNlPHRoaXM+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgIGNvbnN0IGRvbSA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICBjb25zdCB0YWdOYW1lID0gZG9tLnRhZ05hbWUudG9VcHBlckNhc2UoKTtcblxuICAgICAgc3dpdGNoICh0YWdOYW1lKSB7XG4gICAgICAgIGNhc2UgXCJBXCI6IHtcbiAgICAgICAgICB0aGlzLnJlc29sdmUoZG9tIGFzIEhUTUxBbmNob3JFbGVtZW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwiSUZSQU1FXCI6IHtcbiAgICAgICAgICBpZiAoZG9tLmhhc0F0dHJpYnV0ZShcImFudGktcmVkaXJlY3QtaGFuZGxlZFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkb20uc2V0QXR0cmlidXRlKFwiYW50aS1yZWRpcmVjdC1oYW5kbGVkXCIsIFwiMVwiKTtcbiAgICAgICAgICAoZG9tIGFzIEhUTUxJRnJhbWVFbGVtZW50KS5jb250ZW50V2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgaGFuZGxlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCBoYW5kbGVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBDU0ROUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC9eaHR0cHM/OlxcL1xcLy87XG4gIHByaXZhdGUgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2NvbnRlbnRfdmlld3NcIik7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyPy5jb250YWlucyhhRWxlbWVudCkpIHtcbiAgICAgIGlmICghYUVsZW1lbnQub25jbGljayAmJiBhRWxlbWVudC5vcmlnaW4gIT09IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCBhRWxlbWVudC5ocmVmLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICBhRWxlbWVudC5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICAvLyDpmLvmraLkuovku7blhpLms6EsIOWboOS4uuS4iuWxguWFg+e0oOe7keWumueahGNsaWNr5LqL5Lu25Lya6YeN5a6a5ZCRXG4gICAgICAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFFbGVtZW50LnNldEF0dHJpYnV0ZShcInRhcmdldFwiLCBcIl9ibGFua1wiKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgT1NDaGluYVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAvb3NjaGluYVxcLm5ldFxcL2FjdGlvblxcL0dvVG9MaW5rXFw/dXJsPSguKikvO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldChcInVybFwiKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgWmhpaHVEYWlseVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAvemhpaHVcXC5jb21cXC9cXD90YXJnZXQ9KC4qKS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwidGFyZ2V0XCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBHb29nbGVEb2NzUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC93d3dcXC5nb29nbGVcXC5jb21cXC91cmxcXD9xPSguKikvO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldChcInFcIikpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUHJvdmlkZXIgfSBmcm9tIFwiQC9wcm92aWRlclwiO1xuaW1wb3J0IHsgYW50aVJlZGlyZWN0IH0gZnJvbSBcIkAvdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFBvY2tldFByb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAvZ2V0cG9ja2V0XFwuY29tXFwvcmVkaXJlY3RcXD91cmw9KC4qKS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwidXJsXCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5leHBvcnQgY2xhc3MgR21haWxQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gdHJ1ZTtcbiAgcHJpdmF0ZSBSRURJUkVDVF9QUk9QRVJUWSA9IFwiZGF0YS1zYWZlcmVkaXJlY3R1cmxcIjtcbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgLy8g56e76Zmk6L+Z5Liq5bGe5oCn77yM6YKj5LmIIGEg6ZO+5o6l5bCx5LiN5Lya6Lez6L2sXG4gICAgLy8gRklYTUU6IGdtYWlsIOaYr+WkmuWxgiBpZnJhbWUg5bWM5aWXXG4gICAgaWYgKGFFbGVtZW50LmdldEF0dHJpYnV0ZSh0aGlzLlJFRElSRUNUX1BST1BFUlRZKSkge1xuICAgICAgYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKHRoaXMuUkVESVJFQ1RfUFJPUEVSVFkpO1xuICAgICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCBhRWxlbWVudC5ocmVmKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgSnVlamluUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC9saW5rXFwuanVlamluXFwuKGltfGNuKVxcL1xcP3RhcmdldD0oLiopLztcbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgY29uc3QgZmluYWxVUkwgPSBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXCJ0YXJnZXRcIik7XG4gICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCBmaW5hbFVSTCk7XG5cbiAgICBpZiAodGhpcy50ZXN0LnRlc3QoYUVsZW1lbnQudGl0bGUpKSB7XG4gICAgICBhRWxlbWVudC50aXRsZSA9IGZpbmFsVVJMO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcblxuZXhwb3J0IGNsYXNzIFFRTWFpbFByb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSB0cnVlO1xuICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjb250ZW50RGl2XCIpO1xuICAgIGlmICh0aGlzLmNvbnRhaW5lcj8uY29udGFpbnMoYUVsZW1lbnQpKSB7XG4gICAgICBpZiAoYUVsZW1lbnQub25jbGljaykge1xuICAgICAgICBhRWxlbWVudC5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICAvLyDpmLvmraLkuovku7blhpLms6EsIOWboOS4uuS4iuWxguWFg+e0oOe7keWumueahGNsaWNr5LqL5Lu25Lya6YeN5a6a5ZCRXG4gICAgICAgICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgTWlKaVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAvbWlqaXNvdVxcLmNvbVxcL3VybF9wcm94eVxcP3Byb3h5dXJsPSguKikvO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldChcInByb3h5dXJsXCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IE1hcmtlciwgYW50aVJlZGlyZWN0IH0gZnJvbSBcIkAvdXRpbHNcIjtcbmV4cG9ydCBjbGFzcyBHb29nbGVQbGF5UHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdChhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBpZiAoL2dvb2dsZVxcLmNvbVxcL3VybFxcP3E9KC4qKS8udGVzdChhRWxlbWVudC5ocmVmKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICgvXlxcL3N0b3JlXFwvYXBwc1xcL2RldGFpbHMvLnRlc3QobG9jYXRpb24ucGF0aG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXCJxXCIpKTtcblxuICAgIC8vIOenu+mZpOW8gOWPkeiAheagj+ebruS4i+eahOmHjeWumuWQkVxuICAgIGNvbnN0IGVsZXMgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJhLmhyVGJwXCIpKTtcblxuICAgIGZvciAoY29uc3QgZWxlIG9mIGVsZXMpIHtcbiAgICAgIGlmICghZWxlLmhyZWYpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZWxlLmdldEF0dHJpYnV0ZShNYXJrZXIuUmVkaXJlY3RTdGF0dXNEb25lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZWxlLnNldEF0dHJpYnV0ZShNYXJrZXIuUmVkaXJlY3RTdGF0dXNEb25lLCBlbGUuaHJlZik7XG4gICAgICBlbGUuc2V0QXR0cmlidXRlKFwidGFyZ2V0XCIsIFwiX2JsYW5rXCIpO1xuXG4gICAgICBlbGUuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgXCJjbGlja1wiLFxuICAgICAgICAoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJUHJvdmlkZXIgfSBmcm9tIFwiQC9wcm92aWRlclwiO1xuaW1wb3J0IHsgYW50aVJlZGlyZWN0IH0gZnJvbSBcIkAvdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFN0ZWFtUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC9zdGVhbWNvbW11bml0eVxcLmNvbVxcL2xpbmtmaWx0ZXJcXC9cXD91cmw9KC4qKS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwidXJsXCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5leHBvcnQgY2xhc3MgVGllYmFQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL2p1bXBcXGQqXFwuYmRpbWdcXC5jb20vO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMudGVzdC50ZXN0KGFFbGVtZW50LmhyZWYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB1cmwgPSBcIlwiO1xuICAgIGNvbnN0IHRleHQ6IHN0cmluZyA9IGFFbGVtZW50LmlubmVyVGV4dCB8fCBhRWxlbWVudC50ZXh0Q29udGVudCB8fCBcIlwiO1xuICAgIHRyeSB7XG4gICAgICBpZiAoL2h0dHBzPzpcXC9cXC8vLnRlc3QodGV4dCkpIHtcbiAgICAgICAgdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHRleHQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHVybCA9IC9odHRwcz86XFwvXFwvLy50ZXN0KHRleHQpID8gdGV4dCA6IFwiXCI7XG4gICAgfVxuICAgIGlmICh1cmwpIHtcbiAgICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgdXJsKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgVHdpdHRlclByb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAvdFxcLmNvXFwvXFx3Ky87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGlmICghdGhpcy50ZXN0LnRlc3QoYUVsZW1lbnQuaHJlZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoL2h0dHBzPzpcXC9cXC8vLnRlc3QoYUVsZW1lbnQudGl0bGUpKSB7XG4gICAgICBjb25zdCB1cmw6IHN0cmluZyA9IGRlY29kZVVSSUNvbXBvbmVudChhRWxlbWVudC50aXRsZSk7XG5cbiAgICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgdXJsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbm5lclRleHQgPSBhRWxlbWVudC5pbm5lclRleHQucmVwbGFjZSgv4oCmJC8sIFwiXCIpO1xuXG4gICAgaWYgKC9odHRwcz86XFwvXFwvLy50ZXN0KGlubmVyVGV4dCkpIHtcbiAgICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgaW5uZXJUZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuaW1wb3J0IGh0dHAgZnJvbSBcImdtLWh0dHBcIjtcblxuZXhwb3J0IGNsYXNzIEJhaWR1VmlkZW9Qcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL3ZcXC5iYWlkdVxcLmNvbVxcL2xpbmtcXD91cmw9LztcbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgaHR0cFxuICAgICAgLnJlcXVlc3Qoe1xuICAgICAgICB1cmw6IGFFbGVtZW50LmhyZWYsXG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgYW5vbnltb3VzOiB0cnVlLFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXM6IFJlc3BvbnNlJCkgPT4ge1xuICAgICAgICBpZiAocmVzLmZpbmFsVXJsKSB7XG4gICAgICAgICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCByZXMuZmluYWxVcmwpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImdtSHR0cFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJnbUh0dHBcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIENyZWF0ZWQgYnkgYXhldHJveSBvbiAxNy02LTIzLlxuICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi9pbmRleC5kLnRzXCIgLz5cbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZnVuY3Rpb24gaXNGdW5jdGlvbihmdW5jKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBmdW5jID09PSBcImZ1bmN0aW9uXCI7XG59XG52YXIgSHR0cCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSHR0cChjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgICBIdHRwLnByb3RvdHlwZS5zZXRDb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB0aGlzLmNvbmZpZyA9IF9fYXNzaWduKHt9LCB0aGlzLmNvbmZpZywgY29uZmlnKTtcbiAgICB9O1xuICAgIEh0dHAucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBIdHRwKGNvbmZpZyk7XG4gICAgfTtcbiAgICBIdHRwLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIGNvbW1vblJlcXVlc3RDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBjb25maWcubWV0aG9kLFxuICAgICAgICAgICAgICAgIHVybDogY29uZmlnLnVybCxcbiAgICAgICAgICAgICAgICBkYXRhOiBjb25maWcuYm9keSxcbiAgICAgICAgICAgICAgICBoZWFkZXI6IGNvbmZpZy5oZWFkZXJzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIEdNX3htbGh0dHBSZXF1ZXN0Q29uZmlnID0gX19hc3NpZ24oe30sIGNvbW1vblJlcXVlc3RDb25maWcsIGNvbmZpZywgX3RoaXMuY29uZmlnKTtcbiAgICAgICAgICAgIHZhciBvbnJlYWR5c3RhdGVjaGFuZ2UgPSBHTV94bWxodHRwUmVxdWVzdENvbmZpZy5vbnJlYWR5c3RhdGVjaGFuZ2UsIG9uZXJyb3IgPSBHTV94bWxodHRwUmVxdWVzdENvbmZpZy5vbmVycm9yLCBvbmFib3J0ID0gR01feG1saHR0cFJlcXVlc3RDb25maWcub25hYm9ydCwgb250aW1lb3V0ID0gR01feG1saHR0cFJlcXVlc3RDb25maWcub250aW1lb3V0O1xuICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3RDb25maWcuc3luY2hyb25vdXMgPSB0cnVlOyAvLyBhc3luY1xuICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3RDb25maWcub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbihvbnJlYWR5c3RhdGVjaGFuZ2UpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBvbnJlYWR5c3RhdGVjaGFuZ2UuY2FsbCh0aGlzLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZWFkeVN0YXRlICE9PSA0KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiByZXNwb25zZS5zdGF0dXMgPCA0MDBcbiAgICAgICAgICAgICAgICAgICAgPyByZXNvbHZlKHJlc3BvbnNlKVxuICAgICAgICAgICAgICAgICAgICA6IHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3RDb25maWcub25lcnJvciA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlzRnVuY3Rpb24ob25lcnJvcikgJiYgb25lcnJvci5jYWxsKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3RDb25maWcub25hYm9ydCA9IGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlzRnVuY3Rpb24ob25hYm9ydCkgJiYgb25hYm9ydC5jYWxsKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgR01feG1saHR0cFJlcXVlc3RDb25maWcub250aW1lb3V0ID0gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbihvbnRpbWVvdXQpICYmIG9udGltZW91dC5jYWxsKHRoaXMsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKF90aGlzLmNvbmZpZy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiJWNbXCIgKyBjb21tb25SZXF1ZXN0Q29uZmlnLm1ldGhvZC50b1VwcGVyQ2FzZSgpICsgXCJdJWM6IFwiICsgY29tbW9uUmVxdWVzdENvbmZpZy51cmwsIFwiY29sb3I6IGdyZWVuXCIsIFwiY29sb3I6ICMwMDA7dGV4dC1zdHlsZTogdW5kZXItbGluZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEdNX3htbGh0dHBSZXF1ZXN0KF9fYXNzaWduKHt9LCBHTV94bWxodHRwUmVxdWVzdENvbmZpZykpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIEh0dHAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh1cmwsIGRhdGEsIGhlYWRlcnMsIGNvbmZpZykge1xuICAgICAgICBpZiAoaGVhZGVycyA9PT0gdm9pZCAwKSB7IGhlYWRlcnMgPSB7fTsgfVxuICAgICAgICBpZiAoY29uZmlnID09PSB2b2lkIDApIHsgY29uZmlnID0ge307IH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChfX2Fzc2lnbih7IHVybDogdXJsLCBtZXRob2Q6IFwiR0VUXCIsIGJvZHk6IGRhdGEsIGhlYWRlcnM6IGhlYWRlcnMgfSwgY29uZmlnKSk7XG4gICAgfTtcbiAgICBIdHRwLnByb3RvdHlwZS5wb3N0ID0gZnVuY3Rpb24gKHVybCwgZGF0YSwgaGVhZGVycywgY29uZmlnKSB7XG4gICAgICAgIGlmIChoZWFkZXJzID09PSB2b2lkIDApIHsgaGVhZGVycyA9IHt9OyB9XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KF9fYXNzaWduKHsgdXJsOiB1cmwsIG1ldGhvZDogXCJQT1NUXCIsIGJvZHk6IGRhdGEsIGhlYWRlcnM6IGhlYWRlcnMgfSwgY29uZmlnKSk7XG4gICAgfTtcbiAgICBIdHRwLnByb3RvdHlwZS5wdXQgPSBmdW5jdGlvbiAodXJsLCBkYXRhLCBoZWFkZXJzLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMgPT09IHZvaWQgMCkgeyBoZWFkZXJzID0ge307IH1cbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoX19hc3NpZ24oeyB1cmw6IHVybCwgbWV0aG9kOiBcIlBPU1RcIiwgYm9keTogZGF0YSwgaGVhZGVyczogaGVhZGVycyB9LCBjb25maWcpKTtcbiAgICB9O1xuICAgIEh0dHAucHJvdG90eXBlW1wiZGVsZXRlXCJdID0gZnVuY3Rpb24gKHVybCwgZGF0YSwgaGVhZGVycywgY29uZmlnKSB7XG4gICAgICAgIGlmIChoZWFkZXJzID09PSB2b2lkIDApIHsgaGVhZGVycyA9IHt9OyB9XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KF9fYXNzaWduKHsgdXJsOiB1cmwsIG1ldGhvZDogXCJERUxFVEVcIiwgYm9keTogZGF0YSwgaGVhZGVyczogaGVhZGVycyB9LCBjb25maWcpKTtcbiAgICB9O1xuICAgIEh0dHAucHJvdG90eXBlLmhlYWQgPSBmdW5jdGlvbiAodXJsLCBkYXRhLCBoZWFkZXJzLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMgPT09IHZvaWQgMCkgeyBoZWFkZXJzID0ge307IH1cbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gdm9pZCAwKSB7IGNvbmZpZyA9IHt9OyB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoX19hc3NpZ24oeyB1cmw6IHVybCwgbWV0aG9kOiBcIkhFQURcIiwgYm9keTogZGF0YSwgaGVhZGVyczogaGVhZGVycyB9LCBjb25maWcpKTtcbiAgICB9O1xuICAgIHJldHVybiBIdHRwO1xufSgpKTtcbmV4cG9ydHMuSHR0cCA9IEh0dHA7XG52YXIgdGltZW91dCA9IDUwMDA7XG5leHBvcnRzLnRpbWVvdXQgPSB0aW1lb3V0O1xudmFyIGh0dHAgPSBuZXcgSHR0cCh7IHRpbWVvdXQ6IHRpbWVvdXQgfSk7XG5leHBvcnRzLmh0dHAgPSBodHRwO1xuZXhwb3J0cy5kZWZhdWx0ID0gaHR0cDtcblxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTsiLCJpbXBvcnQgeyBJUHJvdmlkZXIgfSBmcm9tIFwiQC9wcm92aWRlclwiO1xuaW1wb3J0IHsgYW50aVJlZGlyZWN0IH0gZnJvbSBcIkAvdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFdlYm9Qcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL3RcXC5jblxcL1xcdysvO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBpZiAoISh0aGlzLnRlc3QudGVzdChhRWxlbWVudC5ocmVmKSAmJiAvXmh0dHBzPzpcXC9cXC8vLnRlc3QoYUVsZW1lbnQudGl0bGUpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVybDogc3RyaW5nID0gZGVjb2RlVVJJQ29tcG9uZW50KGFFbGVtZW50LnRpdGxlKTtcblxuICAgIGlmICh1cmwpIHtcbiAgICAgIGFFbGVtZW50LmhyZWYgPSB1cmw7XG4gICAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIHVybCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJUHJvdmlkZXIgfSBmcm9tIFwiQC9wcm92aWRlclwiO1xuaW1wb3J0IHsgYW50aVJlZGlyZWN0LCBkZWNyZWFzZVJlZGlyZWN0LCBnZXRSZWRpcmVjdCwgaW5jcmVhc2VSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5pbXBvcnQgaHR0cCBmcm9tIFwiZ20taHR0cFwiO1xuaW1wb3J0IHBSZXRyeSBmcm9tIFwicC1yZXRyeVwiO1xuXG5leHBvcnQgY2xhc3MgQmFpZHVQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL3d3d1xcLmJhaWR1XFwuY29tXFwvbGlua1xcP3VybD0vO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBpZiAoZ2V0UmVkaXJlY3QoYUVsZW1lbnQpIDw9IDIgJiYgdGhpcy50ZXN0LnRlc3QoYUVsZW1lbnQuaHJlZikpIHtcbiAgICAgIGluY3JlYXNlUmVkaXJlY3QoYUVsZW1lbnQpO1xuXG4gICAgICBwUmV0cnkoKCkgPT4gdGhpcy5oYW5kbGVyT25lRWxlbWVudChhRWxlbWVudCksIHsgcmV0cmllczogMyB9KVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgZGVjcmVhc2VSZWRpcmVjdChhRWxlbWVudCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZGVjcmVhc2VSZWRpcmVjdChhRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlck9uZUVsZW1lbnQoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGh0dHAucmVxdWVzdCh7XG4gICAgICAgIHVybDogYUVsZW1lbnQuaHJlZixcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBhbm9ueW1vdXM6IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlcy5maW5hbFVybCkge1xuICAgICAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIHJlcy5maW5hbFVybCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBbaHR0cF06ICR7YUVsZW1lbnQuaHJlZn0gZmFpbGApKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCByZXRyeSBmcm9tICdyZXRyeSc7XG5cbmNvbnN0IG5ldHdvcmtFcnJvck1zZ3MgPSBuZXcgU2V0KFtcblx0J0ZhaWxlZCB0byBmZXRjaCcsIC8vIENocm9tZVxuXHQnTmV0d29ya0Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byBmZXRjaCByZXNvdXJjZS4nLCAvLyBGaXJlZm94XG5cdCdUaGUgSW50ZXJuZXQgY29ubmVjdGlvbiBhcHBlYXJzIHRvIGJlIG9mZmxpbmUuJywgLy8gU2FmYXJpXG5cdCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJywgLy8gYGNyb3NzLWZldGNoYFxuXHQnZmV0Y2ggZmFpbGVkJywgLy8gVW5kaWNpIChOb2RlLmpzKVxuXSk7XG5cbmV4cG9ydCBjbGFzcyBBYm9ydEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG5cdFx0c3VwZXIoKTtcblxuXHRcdGlmIChtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHRoaXMub3JpZ2luYWxFcnJvciA9IG1lc3NhZ2U7XG5cdFx0XHQoe21lc3NhZ2V9ID0gbWVzc2FnZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMub3JpZ2luYWxFcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcblx0XHRcdHRoaXMub3JpZ2luYWxFcnJvci5zdGFjayA9IHRoaXMuc3RhY2s7XG5cdFx0fVxuXG5cdFx0dGhpcy5uYW1lID0gJ0Fib3J0RXJyb3InO1xuXHRcdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdH1cbn1cblxuY29uc3QgZGVjb3JhdGVFcnJvcldpdGhDb3VudHMgPSAoZXJyb3IsIGF0dGVtcHROdW1iZXIsIG9wdGlvbnMpID0+IHtcblx0Ly8gTWludXMgMSBmcm9tIGF0dGVtcHROdW1iZXIgYmVjYXVzZSB0aGUgZmlyc3QgYXR0ZW1wdCBkb2VzIG5vdCBjb3VudCBhcyBhIHJldHJ5XG5cdGNvbnN0IHJldHJpZXNMZWZ0ID0gb3B0aW9ucy5yZXRyaWVzIC0gKGF0dGVtcHROdW1iZXIgLSAxKTtcblxuXHRlcnJvci5hdHRlbXB0TnVtYmVyID0gYXR0ZW1wdE51bWJlcjtcblx0ZXJyb3IucmV0cmllc0xlZnQgPSByZXRyaWVzTGVmdDtcblx0cmV0dXJuIGVycm9yO1xufTtcblxuY29uc3QgaXNOZXR3b3JrRXJyb3IgPSBlcnJvck1lc3NhZ2UgPT4gbmV0d29ya0Vycm9yTXNncy5oYXMoZXJyb3JNZXNzYWdlKTtcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gcFJldHJ5KGlucHV0LCBvcHRpb25zKSB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0b3B0aW9ucyA9IHtcblx0XHRcdG9uRmFpbGVkQXR0ZW1wdCgpIHt9LFxuXHRcdFx0cmV0cmllczogMTAsXG5cdFx0XHQuLi5vcHRpb25zLFxuXHRcdH07XG5cblx0XHRjb25zdCBvcGVyYXRpb24gPSByZXRyeS5vcGVyYXRpb24ob3B0aW9ucyk7XG5cblx0XHRjb25zdCBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG5cdFx0XHRvcGVyYXRpb24uc3RvcCgpO1xuXHRcdFx0cmVqZWN0KG9wdGlvbnMuc2lnbmFsPy5yZWFzb24pO1xuXHRcdH07XG5cblx0XHRpZiAob3B0aW9ucy5zaWduYWwgJiYgIW9wdGlvbnMuc2lnbmFsLmFib3J0ZWQpIHtcblx0XHRcdG9wdGlvbnMuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRIYW5kbGVyLCB7b25jZTogdHJ1ZX0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNsZWFuVXAgPSAoKSA9PiB7XG5cdFx0XHRvcHRpb25zLnNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEhhbmRsZXIpO1xuXHRcdFx0b3BlcmF0aW9uLnN0b3AoKTtcblx0XHR9O1xuXG5cdFx0b3BlcmF0aW9uLmF0dGVtcHQoYXN5bmMgYXR0ZW1wdE51bWJlciA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSBhd2FpdCBpbnB1dChhdHRlbXB0TnVtYmVyKTtcblx0XHRcdFx0Y2xlYW5VcCgpO1xuXHRcdFx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBOb24tZXJyb3Igd2FzIHRocm93bjogXCIke2Vycm9yfVwiLiBZb3Ugc2hvdWxkIG9ubHkgdGhyb3cgZXJyb3JzLmApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIEFib3J0RXJyb3IpIHtcblx0XHRcdFx0XHRcdHRocm93IGVycm9yLm9yaWdpbmFsRXJyb3I7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgVHlwZUVycm9yICYmICFpc05ldHdvcmtFcnJvcihlcnJvci5tZXNzYWdlKSkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZXJyb3I7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXdhaXQgb3B0aW9ucy5vbkZhaWxlZEF0dGVtcHQoZGVjb3JhdGVFcnJvcldpdGhDb3VudHMoZXJyb3IsIGF0dGVtcHROdW1iZXIsIG9wdGlvbnMpKTtcblxuXHRcdFx0XHRcdGlmICghb3BlcmF0aW9uLnJldHJ5KGVycm9yKSkge1xuXHRcdFx0XHRcdFx0dGhyb3cgb3BlcmF0aW9uLm1haW5FcnJvcigpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZmluYWxFcnJvcikge1xuXHRcdFx0XHRcdGRlY29yYXRlRXJyb3JXaXRoQ291bnRzKGZpbmFsRXJyb3IsIGF0dGVtcHROdW1iZXIsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdGNsZWFuVXAoKTtcblx0XHRcdFx0XHRyZWplY3QoZmluYWxFcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3JldHJ5Jyk7IiwidmFyIFJldHJ5T3BlcmF0aW9uID0gcmVxdWlyZSgnLi9yZXRyeV9vcGVyYXRpb24nKTtcblxuZXhwb3J0cy5vcGVyYXRpb24gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciB0aW1lb3V0cyA9IGV4cG9ydHMudGltZW91dHMob3B0aW9ucyk7XG4gIHJldHVybiBuZXcgUmV0cnlPcGVyYXRpb24odGltZW91dHMsIHtcbiAgICAgIGZvcmV2ZXI6IG9wdGlvbnMgJiYgKG9wdGlvbnMuZm9yZXZlciB8fCBvcHRpb25zLnJldHJpZXMgPT09IEluZmluaXR5KSxcbiAgICAgIHVucmVmOiBvcHRpb25zICYmIG9wdGlvbnMudW5yZWYsXG4gICAgICBtYXhSZXRyeVRpbWU6IG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhSZXRyeVRpbWVcbiAgfSk7XG59O1xuXG5leHBvcnRzLnRpbWVvdXRzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChvcHRpb25zKTtcbiAgfVxuXG4gIHZhciBvcHRzID0ge1xuICAgIHJldHJpZXM6IDEwLFxuICAgIGZhY3RvcjogMixcbiAgICBtaW5UaW1lb3V0OiAxICogMTAwMCxcbiAgICBtYXhUaW1lb3V0OiBJbmZpbml0eSxcbiAgICByYW5kb21pemU6IGZhbHNlXG4gIH07XG4gIGZvciAodmFyIGtleSBpbiBvcHRpb25zKSB7XG4gICAgb3B0c1trZXldID0gb3B0aW9uc1trZXldO1xuICB9XG5cbiAgaWYgKG9wdHMubWluVGltZW91dCA+IG9wdHMubWF4VGltZW91dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWluVGltZW91dCBpcyBncmVhdGVyIHRoYW4gbWF4VGltZW91dCcpO1xuICB9XG5cbiAgdmFyIHRpbWVvdXRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0cy5yZXRyaWVzOyBpKyspIHtcbiAgICB0aW1lb3V0cy5wdXNoKHRoaXMuY3JlYXRlVGltZW91dChpLCBvcHRzKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvcmV2ZXIgJiYgIXRpbWVvdXRzLmxlbmd0aCkge1xuICAgIHRpbWVvdXRzLnB1c2godGhpcy5jcmVhdGVUaW1lb3V0KGksIG9wdHMpKTtcbiAgfVxuXG4gIC8vIHNvcnQgdGhlIGFycmF5IG51bWVyaWNhbGx5IGFzY2VuZGluZ1xuICB0aW1lb3V0cy5zb3J0KGZ1bmN0aW9uKGEsYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSk7XG5cbiAgcmV0dXJuIHRpbWVvdXRzO1xufTtcblxuZXhwb3J0cy5jcmVhdGVUaW1lb3V0ID0gZnVuY3Rpb24oYXR0ZW1wdCwgb3B0cykge1xuICB2YXIgcmFuZG9tID0gKG9wdHMucmFuZG9taXplKVxuICAgID8gKE1hdGgucmFuZG9tKCkgKyAxKVxuICAgIDogMTtcblxuICB2YXIgdGltZW91dCA9IE1hdGgucm91bmQocmFuZG9tICogTWF0aC5tYXgob3B0cy5taW5UaW1lb3V0LCAxKSAqIE1hdGgucG93KG9wdHMuZmFjdG9yLCBhdHRlbXB0KSk7XG4gIHRpbWVvdXQgPSBNYXRoLm1pbih0aW1lb3V0LCBvcHRzLm1heFRpbWVvdXQpO1xuXG4gIHJldHVybiB0aW1lb3V0O1xufTtcblxuZXhwb3J0cy53cmFwID0gZnVuY3Rpb24ob2JqLCBvcHRpb25zLCBtZXRob2RzKSB7XG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBtZXRob2RzID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gbnVsbDtcbiAgfVxuXG4gIGlmICghbWV0aG9kcykge1xuICAgIG1ldGhvZHMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG1ldGhvZHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtZXRob2QgICA9IG1ldGhvZHNbaV07XG4gICAgdmFyIG9yaWdpbmFsID0gb2JqW21ldGhvZF07XG5cbiAgICBvYmpbbWV0aG9kXSA9IGZ1bmN0aW9uIHJldHJ5V3JhcHBlcihvcmlnaW5hbCkge1xuICAgICAgdmFyIG9wICAgICAgID0gZXhwb3J0cy5vcGVyYXRpb24ob3B0aW9ucyk7XG4gICAgICB2YXIgYXJncyAgICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgICAgYXJncy5wdXNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICBpZiAob3AucmV0cnkoZXJyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgYXJndW1lbnRzWzBdID0gb3AubWFpbkVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuXG4gICAgICBvcC5hdHRlbXB0KGZ1bmN0aW9uKCkge1xuICAgICAgICBvcmlnaW5hbC5hcHBseShvYmosIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfS5iaW5kKG9iaiwgb3JpZ2luYWwpO1xuICAgIG9ialttZXRob2RdLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG59O1xuIiwiZnVuY3Rpb24gUmV0cnlPcGVyYXRpb24odGltZW91dHMsIG9wdGlvbnMpIHtcbiAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgdGhlIG9sZCAodGltZW91dHMsIHJldHJ5Rm9yZXZlcikgc2lnbmF0dXJlXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0aW9ucyA9IHsgZm9yZXZlcjogb3B0aW9ucyB9O1xuICB9XG5cbiAgdGhpcy5fb3JpZ2luYWxUaW1lb3V0cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGltZW91dHMpKTtcbiAgdGhpcy5fdGltZW91dHMgPSB0aW1lb3V0cztcbiAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMuX21heFJldHJ5VGltZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhSZXRyeVRpbWUgfHwgSW5maW5pdHk7XG4gIHRoaXMuX2ZuID0gbnVsbDtcbiAgdGhpcy5fZXJyb3JzID0gW107XG4gIHRoaXMuX2F0dGVtcHRzID0gMTtcbiAgdGhpcy5fb3BlcmF0aW9uVGltZW91dCA9IG51bGw7XG4gIHRoaXMuX29wZXJhdGlvblRpbWVvdXRDYiA9IG51bGw7XG4gIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICB0aGlzLl9vcGVyYXRpb25TdGFydCA9IG51bGw7XG4gIHRoaXMuX3RpbWVyID0gbnVsbDtcblxuICBpZiAodGhpcy5fb3B0aW9ucy5mb3JldmVyKSB7XG4gICAgdGhpcy5fY2FjaGVkVGltZW91dHMgPSB0aGlzLl90aW1lb3V0cy5zbGljZSgwKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBSZXRyeU9wZXJhdGlvbjtcblxuUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2F0dGVtcHRzID0gMTtcbiAgdGhpcy5fdGltZW91dHMgPSB0aGlzLl9vcmlnaW5hbFRpbWVvdXRzLnNsaWNlKDApO1xufVxuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fdGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgfVxuICBpZiAodGhpcy5fdGltZXIpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICB9XG5cbiAgdGhpcy5fdGltZW91dHMgICAgICAgPSBbXTtcbiAgdGhpcy5fY2FjaGVkVGltZW91dHMgPSBudWxsO1xufTtcblxuUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnJldHJ5ID0gZnVuY3Rpb24oZXJyKSB7XG4gIGlmICh0aGlzLl90aW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICB9XG5cbiAgaWYgKCFlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIGlmIChlcnIgJiYgY3VycmVudFRpbWUgLSB0aGlzLl9vcGVyYXRpb25TdGFydCA+PSB0aGlzLl9tYXhSZXRyeVRpbWUpIHtcbiAgICB0aGlzLl9lcnJvcnMucHVzaChlcnIpO1xuICAgIHRoaXMuX2Vycm9ycy51bnNoaWZ0KG5ldyBFcnJvcignUmV0cnlPcGVyYXRpb24gdGltZW91dCBvY2N1cnJlZCcpKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0aGlzLl9lcnJvcnMucHVzaChlcnIpO1xuXG4gIHZhciB0aW1lb3V0ID0gdGhpcy5fdGltZW91dHMuc2hpZnQoKTtcbiAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9jYWNoZWRUaW1lb3V0cykge1xuICAgICAgLy8gcmV0cnkgZm9yZXZlciwgb25seSBrZWVwIGxhc3QgZXJyb3JcbiAgICAgIHRoaXMuX2Vycm9ycy5zcGxpY2UoMCwgdGhpcy5fZXJyb3JzLmxlbmd0aCAtIDEpO1xuICAgICAgdGltZW91dCA9IHRoaXMuX2NhY2hlZFRpbWVvdXRzLnNsaWNlKC0xKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIHNlbGYuX2F0dGVtcHRzKys7XG5cbiAgICBpZiAoc2VsZi5fb3BlcmF0aW9uVGltZW91dENiKSB7XG4gICAgICBzZWxmLl90aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5fb3BlcmF0aW9uVGltZW91dENiKHNlbGYuX2F0dGVtcHRzKTtcbiAgICAgIH0sIHNlbGYuX29wZXJhdGlvblRpbWVvdXQpO1xuXG4gICAgICBpZiAoc2VsZi5fb3B0aW9ucy51bnJlZikge1xuICAgICAgICAgIHNlbGYuX3RpbWVvdXQudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxmLl9mbihzZWxmLl9hdHRlbXB0cyk7XG4gIH0sIHRpbWVvdXQpO1xuXG4gIGlmICh0aGlzLl9vcHRpb25zLnVucmVmKSB7XG4gICAgICB0aGlzLl90aW1lci51bnJlZigpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuYXR0ZW1wdCA9IGZ1bmN0aW9uKGZuLCB0aW1lb3V0T3BzKSB7XG4gIHRoaXMuX2ZuID0gZm47XG5cbiAgaWYgKHRpbWVvdXRPcHMpIHtcbiAgICBpZiAodGltZW91dE9wcy50aW1lb3V0KSB7XG4gICAgICB0aGlzLl9vcGVyYXRpb25UaW1lb3V0ID0gdGltZW91dE9wcy50aW1lb3V0O1xuICAgIH1cbiAgICBpZiAodGltZW91dE9wcy5jYikge1xuICAgICAgdGhpcy5fb3BlcmF0aW9uVGltZW91dENiID0gdGltZW91dE9wcy5jYjtcbiAgICB9XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICh0aGlzLl9vcGVyYXRpb25UaW1lb3V0Q2IpIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuX29wZXJhdGlvblRpbWVvdXRDYigpO1xuICAgIH0sIHNlbGYuX29wZXJhdGlvblRpbWVvdXQpO1xuICB9XG5cbiAgdGhpcy5fb3BlcmF0aW9uU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICB0aGlzLl9mbih0aGlzLl9hdHRlbXB0cyk7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUudHJ5ID0gZnVuY3Rpb24oZm4pIHtcbiAgY29uc29sZS5sb2coJ1VzaW5nIFJldHJ5T3BlcmF0aW9uLnRyeSgpIGlzIGRlcHJlY2F0ZWQnKTtcbiAgdGhpcy5hdHRlbXB0KGZuKTtcbn07XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKGZuKSB7XG4gIGNvbnNvbGUubG9nKCdVc2luZyBSZXRyeU9wZXJhdGlvbi5zdGFydCgpIGlzIGRlcHJlY2F0ZWQnKTtcbiAgdGhpcy5hdHRlbXB0KGZuKTtcbn07XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5zdGFydCA9IFJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS50cnk7XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5lcnJvcnMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2Vycm9ycztcbn07XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5hdHRlbXB0cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXR0ZW1wdHM7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUubWFpbkVycm9yID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9lcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgY291bnRzID0ge307XG4gIHZhciBtYWluRXJyb3IgPSBudWxsO1xuICB2YXIgbWFpbkVycm9yQ291bnQgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVycm9yID0gdGhpcy5fZXJyb3JzW2ldO1xuICAgIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICB2YXIgY291bnQgPSAoY291bnRzW21lc3NhZ2VdIHx8IDApICsgMTtcblxuICAgIGNvdW50c1ttZXNzYWdlXSA9IGNvdW50O1xuXG4gICAgaWYgKGNvdW50ID49IG1haW5FcnJvckNvdW50KSB7XG4gICAgICBtYWluRXJyb3IgPSBlcnJvcjtcbiAgICAgIG1haW5FcnJvckNvdW50ID0gY291bnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1haW5FcnJvcjtcbn07XG4iLCJpbXBvcnQgeyBJUHJvdmlkZXIgfSBmcm9tIFwiQC9wcm92aWRlclwiO1xuaW1wb3J0IHsgYW50aVJlZGlyZWN0LCBkZWNyZWFzZVJlZGlyZWN0LCBnZXRSZWRpcmVjdCwgaW5jcmVhc2VSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5pbXBvcnQgaHR0cCBmcm9tIFwiZ20taHR0cFwiO1xuXG5leHBvcnQgY2xhc3MgRG9nZURvZ2VQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL3d3d1xcLmRvZ2Vkb2dlXFwuY29tXFwvcmRcXC8uezEsfS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGlmIChnZXRSZWRpcmVjdChhRWxlbWVudCkgPD0gMiAmJiB0aGlzLnRlc3QudGVzdChhRWxlbWVudC5ocmVmKSkge1xuICAgICAgaW5jcmVhc2VSZWRpcmVjdChhRWxlbWVudCk7XG4gICAgICB0aGlzLmhhbmRsZXJPbmVFbGVtZW50KGFFbGVtZW50KVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgZGVjcmVhc2VSZWRpcmVjdChhRWxlbWVudCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgZGVjcmVhc2VSZWRpcmVjdChhRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlck9uZUVsZW1lbnQoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlczogUmVzcG9uc2UkID0gYXdhaXQgaHR0cC5yZXF1ZXN0KHtcbiAgICAgICAgdXJsOiBhRWxlbWVudC5ocmVmLFxuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGFub255bW91czogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlcy5maW5hbFVybCkge1xuICAgICAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIHJlcy5maW5hbFVybCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBEb3VCYW5Qcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL2RvdWJhblxcLmNvbVxcL2xpbmsyXFwvP1xcP3VybD0oLiopLztcbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXCJ1cmxcIikpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBHb29nbGVQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gdHJ1ZTtcbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgY29uc3QgdHJhY2VQcm9wZXJ0aWVzID0gW1wicGluZ1wiLCBcImRhdGEtanNhcnd0XCIsIFwiZGF0YS11c2dcIiwgXCJkYXRhLXZlZFwiXTtcblxuICAgIC8vIOenu+mZpOi/vei4qlxuICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdHJhY2VQcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoYUVsZW1lbnQuZ2V0QXR0cmlidXRlKHByb3BlcnR5KSkge1xuICAgICAgICBhRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUocHJvcGVydHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOenu+mZpOWkmuS9meeahOS6i+S7tlxuICAgIGlmIChhRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSkge1xuICAgICAgYUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwib25tb3VzZWRvd25cIik7XG4gICAgfVxuXG4gICAgLy8g5bCd6K+V5Y676Zmk6YeN5a6a5ZCRXG4gICAgaWYgKGFFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtaHJlZlwiKSkge1xuICAgICAgY29uc3QgcmVhbFVybDogc3RyaW5nID0gYUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1ocmVmXCIpO1xuICAgICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCByZWFsVXJsKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGFFbGVtZW50LmhyZWYpO1xuXG4gICAgaWYgKHVybC5zZWFyY2hQYXJhbXMuZ2V0KFwidXJsXCIpKSB7XG4gICAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIHVybC5zZWFyY2hQYXJhbXMuZ2V0KFwidXJsXCIpKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgSmlhblNodVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaXNMaW5rMSA9IC9saW5rc1xcLmppYW5zaHVcXC5jb21cXC9nby8udGVzdChhRWxlbWVudC5ocmVmKTtcbiAgICBjb25zdCBpc0xpbmsyID0gL2xpbmtcXC5qaWFuc2h1XFwuY29tKFxcLyk/XFw/dD0vLnRlc3QoYUVsZW1lbnQuaHJlZik7XG4gICAgY29uc3QgaXNMaW5rMyA9IC9qaWFuc2h1XFwuY29tXFwvZ28td2lsZFxcLz9cXD8oLiopdXJsPS8udGVzdChhRWxlbWVudC5ocmVmKTtcblxuICAgIGlmIChpc0xpbmsxIHx8IGlzTGluazIgfHwgaXNMaW5rMykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBjb25zdCBzZWFyY2ggPSBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcztcbiAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIHNlYXJjaC5nZXQoXCJ0b1wiKSB8fCBzZWFyY2guZ2V0KFwidFwiKSB8fCBzZWFyY2guZ2V0KFwidXJsXCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBTb1Byb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAvc29cXC5jb21cXC9saW5rXFw/KC4qKS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGNvbnN0IHVybCA9IGFFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWR1cmxcIikgfHwgYUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZS1sYW5kdXJsXCIpO1xuXG4gICAgaWYgKHVybCkge1xuICAgICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCB1cmwpO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSB0cmFja1xuICAgIGFFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcImVfaHJlZlwiKTtcbiAgICBhRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXJlc1wiKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCwgZGVjcmVhc2VSZWRpcmVjdCwgZ2V0UmVkaXJlY3QsIGdldFRleHQsIGluY3JlYXNlUmVkaXJlY3QsIHF1ZXJ5UGFyc2VyIH0gZnJvbSBcIkAvdXRpbHNcIjtcbmltcG9ydCBodHRwIGZyb20gXCJnbS1odHRwXCI7XG5cbmV4cG9ydCBjbGFzcyBTb0dvdVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAvd3d3XFwuc29nb3VcXC5jb21cXC9saW5rXFw/dXJsPS87XG4gIHB1YmxpYyBhc3luYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZ2V0UmVkaXJlY3QoYUVsZW1lbnQpIDw9IDIgJiYgdGhpcy50ZXN0LnRlc3QoYUVsZW1lbnQuaHJlZikpIHtcbiAgICAgICAgaW5jcmVhc2VSZWRpcmVjdChhRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGh0dHAucmVxdWVzdCh7XG4gICAgICAgICAgdXJsOiBhRWxlbWVudC5ocmVmLFxuICAgICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgICAgICBhbm9ueW1vdXM6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBkZWNyZWFzZVJlZGlyZWN0KGFFbGVtZW50KTtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSByZXMuZmluYWxVcmw7XG4gICAgICAgIGlmIChmaW5hbFVybCAmJiAhdGhpcy50ZXN0LnRlc3QoZmluYWxVcmwpKSB7XG4gICAgICAgICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCByZXMuZmluYWxVcmwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG1hdGNoZXIgPSByZXMucmVzcG9uc2VUZXh0Lm1hdGNoKC9VUkw9WydcIl0oW14nXCJdKylbJ1wiXS8pO1xuICAgICAgICAgIGlmIChtYXRjaGVyPy5bMV0pIHtcbiAgICAgICAgICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgcmVzLmZpbmFsVXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGRlY3JlYXNlUmVkaXJlY3QoYUVsZW1lbnQpO1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHBhcnNlUGFnZShyZXM6IFJlc3BvbnNlJCk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3BvbnNlVGV4dDogc3RyaW5nID0gcmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC8oc3JjPVtePl0qfGxpbms9W14+XSkvZywgXCJcIik7XG4gICAgY29uc3QgaHRtbDogSFRNTEh0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImh0bWxcIik7XG4gICAgaHRtbC5pbm5lckhUTUwgPSByZXNwb25zZVRleHQ7XG5cbiAgICAvLyBsZXQgc2VsZWN0b3IgPSAnI21haW4gLnJlc3VsdHMgZGl2LnZyd3JhcD5oMyc7XG4gICAgLy8gbGV0IHNlbGVjdG9yID0gJyNtYWluIC5yZXN1bHRzIGgzPmEnO1xuICAgIGNvbnN0IHNlbGVjdG9yID0gJyNtYWluIC5yZXN1bHRzIGFbaHJlZio9XCJ3d3cuc29nb3UuY29tL2xpbms/dXJsPVwiXSc7XG4gICAgY29uc3QgcmVtb3RlcyA9IFtdLnNsaWNlLmNhbGwoaHRtbC5xdWVyeVNlbGVjdG9yQWxsKFwiI21haW4gLnJlc3VsdHMgYVtocmVmXVwiKSk7XG4gICAgY29uc3QgbG9jYWxzID0gW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG5cbiAgICBmb3IgKGNvbnN0IGxvY2FsRWxlIG9mIGxvY2Fscykge1xuICAgICAgZm9yIChjb25zdCByZW1vdGVFbGUgb2YgcmVtb3Rlcykge1xuICAgICAgICBsZXQgbG9jYWxUZXh0ID0gZ2V0VGV4dChsb2NhbEVsZSk7XG4gICAgICAgIGxldCByZW1vdGVUZXh0ID0gZ2V0VGV4dChyZW1vdGVFbGUpO1xuXG4gICAgICAgIC8vIOmAmueUqOaMiemSru+8jOS+i+WmguOAkOeCueWHu+S4i+i9veOAkVxuICAgICAgICBpZiAobG9jYWxFbGUuY2xhc3NMaXN0LmNvbnRhaW5zKFwic3RyLXB1YmxpYy1idG5cIikpIHtcbiAgICAgICAgICBsb2NhbFRleHQgPSBnZXRUZXh0KGxvY2FsRWxlLnBhcmVudE5vZGUpO1xuICAgICAgICAgIHJlbW90ZVRleHQgPSBnZXRUZXh0KHJlbW90ZUVsZS5wYXJlbnROb2RlKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbEVsZS5jbGFzc0xpc3QuY29udGFpbnMoXCJzdHJfaW1nXCIpKSB7XG4gICAgICAgICAgLy8g5Zu+54mHXG4gICAgICAgICAgbG9jYWxUZXh0ID0gZ2V0VGV4dChsb2NhbEVsZS5wYXJlbnROb2RlLnBhcmVudE5vZGUpO1xuICAgICAgICAgIHJlbW90ZVRleHQgPSBnZXRUZXh0KHJlbW90ZUVsZS5wYXJlbnROb2RlLnBhcmVudE5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsb2NhbFRleHQgfHwgbG9jYWxUZXh0ICE9PSByZW1vdGVUZXh0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFudGlSZWRpcmVjdChsb2NhbEVsZSwgcmVtb3RlRWxlLmhyZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwdWJsaWMgYXN5bmMgb25Jbml0KCkge1xuICAgIGlmICghL3d3d1xcLnNvZ291XFwuY29tXFwvd2ViLy50ZXN0KHdpbmRvdy50b3AubG9jYXRpb24uaHJlZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcXVlcnkgPSBxdWVyeVBhcnNlcih3aW5kb3cudG9wLmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICAvLyDmkJzntKLkvb/nlKhodHRw5pCc57Si77yM5b6X5Yiw55qE5piv55u05o6l6ZO+5o6lXG4gICAgY29uc3QgdXJsOiBzdHJpbmcgPSBgJHtsb2NhdGlvbi5wcm90b2NvbC5yZXBsYWNlKC86JC8sIFwiXCIpLnJlcGxhY2UoXCJzXCIsIFwiXCIpfTovLyR7XG4gICAgICBsb2NhdGlvbi5ob3N0ICsgbG9jYXRpb24ucGF0aG5hbWUgKyBxdWVyeVxuICAgIH1gO1xuXG4gICAgaHR0cFxuICAgICAgLmdldCh1cmwpXG4gICAgICAudGhlbigocmVzOiBSZXNwb25zZSQpID0+IHtcbiAgICAgICAgdGhpcy5wYXJzZVBhZ2UocmVzKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBZb3V0dWJlUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC93d3dcXC55b3V0dWJlXFwuY29tXFwvcmVkaXJlY3RcXD8uezEsfS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwicVwiKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgWmhpaHVQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL3poaWh1XFwuY29tXFwvXFw/dGFyZ2V0PSguKikvO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldChcInRhcmdldFwiKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQmFpZHVYdWVzaHVQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL3h1ZXNodVxcLmJhaWR1XFwuY29tXFwvcz9cXD8oLiopLzsgLy8g5q2k5aSE5peg55SoXG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGNvbnN0IHJlYWxIcmVmOiBzdHJpbmcgPSBhRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWxpbmtcIikgfHwgYUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS11cmxcIik7XG4gICAgaWYgKHJlYWxIcmVmKSB7XG4gICAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIGRlY29kZVVSSUNvbXBvbmVudChyZWFsSHJlZikpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBaaGlodVpodWFubGFuUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC9saW5rXFwuemhpaHVcXC5jb21cXC9cXD90YXJnZXQ9KC4qKS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwidGFyZ2V0XCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBMb2dvbmV3c1Byb3ZpZGVyIGltcGxlbWVudHMgSVByb3ZpZGVyIHtcbiAgcHVibGljIHRlc3QgPSAvbGlua1xcLmxvZ29uZXdzXFwuY25cXC9cXD91cmw9KC4qKS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwidXJsXCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGFudGlSZWRpcmVjdCB9IGZyb20gXCJAL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZkRpYW5OZXRQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL2FmZGlhblxcLm5ldFxcL2xpbmtcXD90YXJnZXQ9KC4qKS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwidGFyZ2V0XCIpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSVByb3ZpZGVyIH0gZnJvbSBcIkAvcHJvdmlkZXJcIjtcblxuZXhwb3J0IGNsYXNzIEJsb2c1MUNUTyBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gdHJ1ZTtcbiAgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYXJ0aWNsZS1kZXRhaWxcIik7XG4gICAgaWYgKHRoaXMuY29udGFpbmVyPy5jb250YWlucyhhRWxlbWVudCkpIHtcbiAgICAgIGlmICghYUVsZW1lbnQub25jbGljayAmJiBhRWxlbWVudC5ocmVmKSB7XG4gICAgICAgIGFFbGVtZW50Lm9uY2xpY2sgPSBmdW5jdGlvbiBhbnRpUmVkaXJlY3RPbkNsaWNrRm4oZSkge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICBjb25zdCAkYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhXCIpO1xuXG4gICAgICAgICAgJGEuaHJlZiA9IGFFbGVtZW50LmhyZWY7XG4gICAgICAgICAgJGEudGFyZ2V0ID0gYUVsZW1lbnQudGFyZ2V0O1xuXG4gICAgICAgICAgJGEuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgSW5mb1FQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL2luZm9xXFwuY25cXC9saW5rXFw/dGFyZ2V0PSguKikvO1xuICBwdWJsaWMgcmVzb2x2ZShhRWxlbWVudDogSFRNTEFuY2hvckVsZW1lbnQpIHtcbiAgICBhbnRpUmVkaXJlY3QoYUVsZW1lbnQsIG5ldyBVUkwoYUVsZW1lbnQuaHJlZikuc2VhcmNoUGFyYW1zLmdldChcInRhcmdldFwiKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IElQcm92aWRlciB9IGZyb20gXCJAL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBhbnRpUmVkaXJlY3QgfSBmcm9tIFwiQC91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgR2l0ZWVQcm92aWRlciBpbXBsZW1lbnRzIElQcm92aWRlciB7XG4gIHB1YmxpYyB0ZXN0ID0gL2dpdGVlXFwuY29tXFwvbGlua1xcP3RhcmdldD0oLiopLztcbiAgcHVibGljIHJlc29sdmUoYUVsZW1lbnQ6IEhUTUxBbmNob3JFbGVtZW50KSB7XG4gICAgYW50aVJlZGlyZWN0KGFFbGVtZW50LCBuZXcgVVJMKGFFbGVtZW50LmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoXCJ0YXJnZXRcIikpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJUHJvdmlkZXIgfSBmcm9tIFwiQC9wcm92aWRlclwiO1xuaW1wb3J0IHsgYW50aVJlZGlyZWN0IH0gZnJvbSBcIkAvdXRpbHNcIjtcblxuZXhwb3J0IGNsYXNzIFNTUGFpUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvdmlkZXIge1xuICBwdWJsaWMgdGVzdCA9IC9zc3BhaVxcLmNvbVxcL2xpbmtcXD90YXJnZXQ9KC4qKS87XG4gIHB1YmxpYyByZXNvbHZlKGFFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgIGFudGlSZWRpcmVjdChhRWxlbWVudCwgbmV3IFVSTChhRWxlbWVudC5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KFwidGFyZ2V0XCIpKTtcbiAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB7IEFwcCB9IGZyb20gXCJAL2FwcFwiO1xuaW1wb3J0IHsgUnV5b1Byb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvNTEucnV5by5uZXRcIjtcbmltcG9ydCB7IE1vemlsbGFQcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL2FkZG9ucy5tb3ppbGxhLm9yZ1wiO1xuaW1wb3J0IHsgWWluWGlhbmdQcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL2FwcC55aW54aWFuZy5jb21cIjtcbmltcG9ydCB7IENTRE5Qcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL2Jsb2cuY3Nkbi5uZXRcIjtcbmltcG9ydCB7IE9TQ2hpbmFQcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL29zY2hpbmEuY29tXCI7XG5pbXBvcnQgeyBaaGlodURhaWx5UHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy9kYWlseS56aGlodS5jb21cIjtcbmltcG9ydCB7IEdvb2dsZURvY3NQcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL2RvY3MuZ29vZ2xlLmNvbVwiO1xuaW1wb3J0IHsgUG9ja2V0UHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy9nZXRwb2NrZXQuY29tXCI7XG5pbXBvcnQgeyBHbWFpbFByb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvZ21haWwuZ29vZ2xlLmNvbVwiO1xuaW1wb3J0IHsgSnVlamluUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy9qdWVqaW4uY29tXCI7XG5pbXBvcnQgeyBRUU1haWxQcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL21haWwucXEuY29tXCI7XG5pbXBvcnQgeyBNaUppUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy9taWppc291LmNvbVwiO1xuaW1wb3J0IHsgR29vZ2xlUGxheVByb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvcGxheS5nb29nbGUuY29tXCI7XG5pbXBvcnQgeyBTdGVhbVByb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvc3RlYW1jb21tdW5pdHkuY29tXCI7XG5pbXBvcnQgeyBUaWViYVByb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvdGllYmEuYmFpZHUuY29tXCI7XG5pbXBvcnQgeyBUd2l0dGVyUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy90d2l0dGVyLmNvbVwiO1xuaW1wb3J0IHsgQmFpZHVWaWRlb1Byb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvdmlkZW8uYmFpZHUuY29tXCI7XG5pbXBvcnQgeyBXZWJvUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy93ZWliby5jb21cIjtcbmltcG9ydCB7IEJhaWR1UHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy93d3cuYmFpZHUuY29tXCI7XG5pbXBvcnQgeyBEb2dlRG9nZVByb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvd3d3LmRvZ2Vkb2dlLmNvbVwiO1xuaW1wb3J0IHsgRG91QmFuUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy93d3cuZG91YmFuLmNvbVwiO1xuaW1wb3J0IHsgR29vZ2xlUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy93d3cuZ29vZ2xlLmNvbVwiO1xuaW1wb3J0IHsgSmlhblNodVByb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvd3d3LmppYW5zaHUuY29tXCI7XG5pbXBvcnQgeyBTb1Byb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvd3d3LnNvLmNvbVwiO1xuaW1wb3J0IHsgU29Hb3VQcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL3d3dy5zb2dvdS5jb21cIjtcbmltcG9ydCB7IFlvdXR1YmVQcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL3d3dy55b3V0dWJlLmNvbVwiO1xuaW1wb3J0IHsgWmhpaHVQcm92aWRlciB9IGZyb20gXCJAL3NpdGVzL3d3dy56aGlodS5jb21cIjtcbmltcG9ydCB7IEJhaWR1WHVlc2h1UHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy94dWVzaHUuYmFpZHUuY29tXCI7XG5pbXBvcnQgeyBaaGlodVpodWFubGFuUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy96aHVhbmxhbi56aGlodS5jb21cIjtcbmltcG9ydCB7IExvZ29uZXdzUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy93d3cubG9nb25ld3MuY25cIjtcbmltcG9ydCB7IEFmRGlhbk5ldFByb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvYWZhZGlhbi5uZXRcIjtcbmltcG9ydCB7IEJsb2c1MUNUTyB9IGZyb20gXCJAL3NpdGVzL2Jsb2cuNTFjdG8uY29tXCI7XG5pbXBvcnQgeyBJbmZvUVByb3ZpZGVyIH0gZnJvbSBcIkAvc2l0ZXMvaW5mb3EuY25cIjtcbmltcG9ydCB7IEdpdGVlUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy9naXRlZS5jb21cIjtcbmltcG9ydCB7IFNTUGFpUHJvdmlkZXIgfSBmcm9tIFwiQC9zaXRlcy9zc3BhaS5jb21cIjtcbmltcG9ydCBodHRwIGZyb20gXCJnbS1odHRwXCI7XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbmNvbnN0IGlzRGVidWc6IGJvb2xlYW4gPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCI7XG5cbmh0dHAuc2V0Q29uZmlnKHsgZGVidWc6IGlzRGVidWcgfSk7XG5cbmFwcFxuICAuc2V0Q29uZmlnKHsgaXNEZWJ1ZyB9KVxuICAucmVnaXN0ZXJQcm92aWRlcihbXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3d3dy56aGlodS5jb20vcXVlc3Rpb24vMjUyNTg3NzVcbiAgICAgIG5hbWU6IFwi55+l5LmOXCIsXG4gICAgICB0ZXN0OiAvd3d3XFwuemhpaHVcXC5jb20vLFxuICAgICAgcHJvdmlkZXI6IFpoaWh1UHJvdmlkZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vemh1YW5sYW4uemhpaHUuY29tL3AvMjA1NDk5NzhcbiAgICAgIG5hbWU6IFwi55+l5LmO5LiT5qCPXCIsXG4gICAgICB0ZXN0OiAvemh1YW5sYW5cXC56aGlodVxcLmNvbS8sXG4gICAgICBwcm92aWRlcjogWmhpaHVaaHVhbmxhblByb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOlxuICAgICAgbmFtZTogXCLnn6XkuY7ml6XmiqVcIixcbiAgICAgIHRlc3Q6IC9kYWlseVxcLnpoaWh1XFwuY29tLyxcbiAgICAgIHByb3ZpZGVyOiBaaGlodURhaWx5UHJvdmlkZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIkdvb2dsZeaQnOe0olwiLFxuICAgICAgdGVzdDogL1xcdytcXC5nb29nbGVcXC4vLFxuICAgICAgcHJvdmlkZXI6IEdvb2dsZVByb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xVEZjRVhNY0tyd29JQUVDSVZ5QlUwR1BvU21ScVo3QTBWQnZxZUtZVlN3dy9odG1sdmlld1xuICAgICAgbmFtZTogXCJHb29nbGUgRG9jc1wiLFxuICAgICAgdGVzdDogL2RvY3NcXC5nb29nbGVcXC5jb20vLFxuICAgICAgcHJvdmlkZXI6IEdvb2dsZURvY3NQcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwiR21haWxcIixcbiAgICAgIHRlc3Q6IC9tYWlsXFwuZ29vZ2xlXFwuY29tLyxcbiAgICAgIHByb3ZpZGVyOiBHbWFpbFByb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9tb3ZpZXMvZGV0YWlscy8lRTclQTclQkIlRTUlOEIlOTUlRTglQkYlQjclRTUlQUUlQUVfJUU2JUFEJUJCJUU0JUJBJUExJUU4JUE3JUEzJUU4JTk3JUE1P2lkPVlOeTdnUnF3dE1rXG4gICAgICBuYW1lOiBcIkdvb2dsZSBQbGF5XCIsXG4gICAgICB0ZXN0OiAvcGxheVxcLmdvb2dsZVxcLmNvbS8sXG4gICAgICBwcm92aWRlcjogR29vZ2xlUGxheVByb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVhUWFNSUlN2MWJZXG4gICAgICBuYW1lOiBcIkdvb2dsZSBZb3V0dWJlXCIsXG4gICAgICB0ZXN0OiAvd3d3XFwueW91dHViZVxcLmNvbS8sXG4gICAgICBwcm92aWRlcjogWW91dHViZVByb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3d3dy5zby5jb20vcz9pZT11dGYtOCZmcj1ub25lJnNyYz0zNjBzb3VfbmV3aG9tZSZxPWNocm9tZVxuICAgICAgbmFtZTogXCIzNjDmkJzntKJcIixcbiAgICAgIHRlc3Q6IC93d3dcXC5zb1xcLmNvbS8sXG4gICAgICBwcm92aWRlcjogU29Qcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6IFwi5paw5rWq5b6u5Y2aXCIsXG4gICAgICB0ZXN0OiAvXFwud2VpYm9cXC5jb20vLFxuICAgICAgcHJvdmlkZXI6IFdlYm9Qcm92aWRlcixcbiAgICB9LFxuICAgIC8vIOa1i+ivlTogaHR0cHM6Ly90d2l0dGVyLmNvbS9mdGl1bTQvc3RhdHVzLzE1MTI4MTUxMTY4MTA1MjI2MzFcbiAgICB7XG4gICAgICBuYW1lOiBcIlR3aXR0ZXJcIixcbiAgICAgIHRlc3Q6IC90d2l0dGVyXFwuY29tLyxcbiAgICAgIHByb3ZpZGVyOiBUd2l0dGVyUHJvdmlkZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyDmtYvor5U6IGh0dHA6Ly93d3cuc29nb3UuY29tL3dlYj9xdWVyeT1jaHJvbWUmX2FzZj13d3cuc29nb3UuY29tJl9hc3Q9Jnc9MDEwMTk5MDAmcD00MDA0MDEwMCZpZT11dGY4JmZyb209aW5kZXgtbm9sb2dpbiZzX2Zyb209aW5kZXgmc3V0PTE1Mjcmc3N0MD0xNTA0MzQ3MzY3NjExJmxrdD0wJTJDMCUyQzAmc3Vnc3V2PTAwMDkxNjUxQjQ4Q0E0NUY1OTNCNjFBMjlCMTMxNDA1JnN1Z3RpbWU9MTUwNDM0NzM2NzYxMVxuICAgICAgbmFtZTogXCLmkJzni5fmkJzntKJcIixcbiAgICAgIHRlc3Q6IC93d3dcXC5zb2dvdVxcLmNvbS8sXG4gICAgICBwcm92aWRlcjogU29Hb3VQcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivlTogaHR0cHM6Ly93d3cuYmFpZHUuY29tL3M/d2Q9Y2hyb21lJnJzdl9zcHQ9MSZyc3ZfaXFpZD0weGNiMTM2MjM3MDAwZWQ0MGUmaXNzcD0xJmY9OCZyc3ZfYnA9MCZyc3ZfaWR4PTImaWU9dXRmLTgmdG49YmFpZHVsb2NhbCZyc3ZfZW50ZXI9MSZyc3Zfc3VnMz03JnJzdl9zdWcxPTcmcnN2X3N1Zzc9MTAxJnJzdl9zdWcyPTAmaW5wdXRUPTgxMyZyc3Zfc3VnND05ODkmdGltZXN0YW1wPTE1MDQzNDkyMjkyNjYmcm49NTAmdmZfYmw9MVxuICAgICAgbmFtZTogXCLnmb7luqbmkJzntKJcIixcbiAgICAgIHRlc3Q6IC93d3dcXC5iYWlkdVxcLmNvbS8sXG4gICAgICBwcm92aWRlcjogQmFpZHVQcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivlTogaHR0cHM6Ly93d3cuYmFpZHUuY29tL3M/d2Q9Y2hyb21lJnBuPTIwJm9xPWNocm9tZSZ0bj1iYWlkdWhvbWVfcGcmaWU9dXRmLTgmdXNtPTMmcnN2X2lkeD0yJnJzdl9wcT1lMDQzOTAwZDAwMDA3NTJkJnJzdl90PTZiYjBVcUV3cDJUbGU2VEFNQkRsVTNXZyUyQlN4b3F2dk9oWkt5UWdNJTJCVlFQOEdjNTRRWkxoY0RjajYyZUdmTkc3NWFxNSZyc3ZfcGFnZT0xXG4gICAgICBuYW1lOiBcIueZvuW6puinhumikVwiLFxuICAgICAgdGVzdDogL3ZcXC5iYWlkdVxcLmNvbS8sXG4gICAgICBwcm92aWRlcjogQmFpZHVWaWRlb1Byb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+VOiBodHRwOi8veHVlc2h1LmJhaWR1LmNvbS9zP3dkPXBhcGVydXJpJTNBJTI4YWU0ZDZiNWRhMDVlY2E1NTJkYWIwNWFlZWZiOTY2ZTYlMjkmaWU9dXRmLTgmZmlsdGVyPXNjX2xvbmdfc2lnbiZzY19rc19wYXJhPXElM0QlRTIlODAlOUMlRTQlQkElOTIlRTglODElOTQlRTclQkQlOTElMkIlRTUlODElQTUlRTUlQkElQjclRTclQUUlQTElRTclOTAlODYlRTIlODAlOUQlRTYlQTglQTElRTUlQkMlOEYlRTYlOEUlQTIlRTglQUUlQTglRTUlOEYlOEElRTUlODUlQjYlRTUlQkElOTQlRTclOTQlQTgmdG49U0VfYmFpZHV4dWVzaHVfYzFnamV1cGFcbiAgICAgIG5hbWU6IFwi55m+5bqm5a2m5pyvXCIsXG4gICAgICB0ZXN0OiAveHVlc2h1XFwuYmFpZHVcXC5jb20vLFxuICAgICAgcHJvdmlkZXI6IEJhaWR1WHVlc2h1UHJvdmlkZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHA6Ly90aWViYS5iYWlkdS5jb20vcC81MzAwODQ0MTgwXG4gICAgICBuYW1lOiBcIueZvuW6pui0tOWQp1wiLFxuICAgICAgdGVzdDogL3RpZWJhXFwuYmFpZHVcXC5jb20vLFxuICAgICAgcHJvdmlkZXI6IFRpZWJhUHJvdmlkZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vanVlamluLmltL2VudHJ5LzU5YWM4ZmE1NTE4ODI1MjQyNDFhODgwMj91dG1fc291cmNlPWdvbGRfYnJvd3Nlcl9leHRlbnNpb25cbiAgICAgIG5hbWU6IFwi5o6Y6YeRXCIsXG4gICAgICB0ZXN0OiAvanVlamluXFwuKGltfGNuKS8sXG4gICAgICBwcm92aWRlcjogSnVlamluUHJvdmlkZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcIlFR6YKu566xXCIsXG4gICAgICB0ZXN0OiAvbWFpbFxcLnFxXFwuY29tLyxcbiAgICAgIHByb3ZpZGVyOiBRUU1haWxQcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9hZGRvbnMubW96aWxsYS5vcmcvemgtQ04vZmlyZWZveC9hZGRvbi9ldmVybm90ZS13ZWItY2xpcHBlci9cbiAgICAgIG5hbWU6IFwiTW96aWxsYVwiLFxuICAgICAgdGVzdDogL2FkZG9uc1xcLm1vemlsbGFcXC5vcmcvLFxuICAgICAgcHJvdmlkZXI6IE1vemlsbGFQcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly93d3cuamlhbnNodS5jb20vcC85Nzk3NzZjYTQ0YjhcbiAgICAgIC8vIGh0dHBzOi8vd3d3LmppYW5zaHUuY29tL3AvZmM4YWJjNjViYmIyXG4gICAgICBuYW1lOiBcIueugOS5plwiLFxuICAgICAgdGVzdDogL3d3d1xcLmppYW5zaHVcXC5jb20vLFxuICAgICAgcHJvdmlkZXI6IEppYW5TaHVQcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly93d3cuZG91YmFuLmNvbS9kb3VsaXN0LzI0MDk2Mi9cbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly93d3cuZG91YmFuLmNvbS9zZWFyY2g/Y2F0PTEwMDImcT0lRTklQkIlOTElRTklOTUlOUNcbiAgICAgIG5hbWU6IFwi6LGG55OjXCIsXG4gICAgICB0ZXN0OiAvZG91YmFuXFwuY29tLyxcbiAgICAgIHByb3ZpZGVyOiBEb3VCYW5Qcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9nZXRwb2NrZXQuY29tL2EvcmVjb21tZW5kZWQvXG4gICAgICAvLyDpnIDopoHnmbvpmYZcbiAgICAgIG5hbWU6IFwiUG9ja2V0XCIsXG4gICAgICB0ZXN0OiAvZ2V0cG9ja2V0XFwuY29tLyxcbiAgICAgIHByb3ZpZGVyOiBQb2NrZXRQcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly93d3cuZG9nZWRvZ2UuY29tL3Jlc3VsdHM/cT1jaHJvbWVcbiAgICAgIG5hbWU6IFwiRG9nZURvZ2VcIixcbiAgICAgIHRlc3Q6IC93d3dcXC5kb2dlZG9nZVxcLmNvbS8sXG4gICAgICBwcm92aWRlcjogRG9nZURvZ2VQcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly81MS5ydXlvLm5ldC8xNTA1My5odG1sXG4gICAgICBuYW1lOiBcIlJ1eW9cIixcbiAgICAgIHRlc3Q6IC81MVxcLnJ1eW9cXC5uZXQvLFxuICAgICAgcHJvdmlkZXI6IFJ1eW9Qcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9zdGVhbWNvbW11bml0eS5jb20vc2hhcmVkZmlsZXMvZmlsZWRldGFpbHMvP2lkPTEzMTE1MzU1MzFcbiAgICAgIG5hbWU6IFwiU3RlYW1cIixcbiAgICAgIHRlc3Q6IC9zdGVhbWNvbW11bml0eVxcLmNvbS8sXG4gICAgICBwcm92aWRlcjogU3RlYW1Qcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9taWppc291LmNvbS8/cT1jaHJvbWUmY2F0ZWdvcnlfZ2VuZXJhbD1vbiZ0aW1lX3JhbmdlPSZsYW5ndWFnZT16aC1DTiZwYWdlbm89MVxuICAgICAgbmFtZTogXCLnp5jov7lcIixcbiAgICAgIHRlc3Q6IC9taWppc291XFwuY29tLyxcbiAgICAgIHByb3ZpZGVyOiBNaUppUHJvdmlkZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vZ2l0aHViLmNvbS9heGV0cm95L2FudGktcmVkaXJlY3QvaXNzdWVzLzM1MFxuICAgICAgbmFtZTogXCJDU0ROXCIsXG4gICAgICB0ZXN0OiAvYmxvZ1xcLmNzZG5cXC5uZXQvLFxuICAgICAgcHJvdmlkZXI6IENTRE5Qcm92aWRlcixcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgO+8mmh0dHBzOi8vbXkub3NjaGluYS5uZXQvY2hpcG8vYmxvZy8zMDY3NjcyXG4gICAgICBuYW1lOiBcIk9TIENoaW5hXCIsXG4gICAgICB0ZXN0OiAvb3NjaGluYVxcLm5ldC8sXG4gICAgICBwcm92aWRlcjogT1NDaGluYVByb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL2dpdGh1Yi5jb20vYXhldHJveS9hbnRpLXJlZGlyZWN0L2lzc3Vlcy8zNTBcbiAgICAgIG5hbWU6IFwi5Y2w6LGh56yU6K6wXCIsXG4gICAgICB0ZXN0OiAvYXBwXFwueWlueGlhbmdcXC5jb20vLFxuICAgICAgcHJvdmlkZXI6IFlpblhpYW5nUHJvdmlkZXIsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vd3d3LmxvZ29uZXdzLmNuLzIwMjEwNzMwMDI0MjAxNDEuaHRtbFxuICAgICAgbmFtZTogXCLmoIflv5fmg4XmiqXlsYBcIixcbiAgICAgIHRlc3Q6IC93d3dcXC5sb2dvbmV3c1xcLmNuLyxcbiAgICAgIHByb3ZpZGVyOiBMb2dvbmV3c1Byb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL2FmZGlhbi5uZXQvYS94aWFvZmFuRXJpY1xuICAgICAgbmFtZTogXCLniLHlj5HnlLVcIixcbiAgICAgIHRlc3Q6IC9hZmRpYW5cXC5uZXQvLFxuICAgICAgcHJvdmlkZXI6IEFmRGlhbk5ldFByb3ZpZGVyLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL2Jsb2cuNTFjdG8uY29tL3VfMTE1MTI4MjYvMjA2ODQyMVxuICAgICAgbmFtZTogXCI1MUNUT+WNmuWuolwiLFxuICAgICAgdGVzdDogL2Jsb2dcXC41MWN0b1xcLmNvbS8sXG4gICAgICBwcm92aWRlcjogQmxvZzUxQ1RPLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8g5rWL6K+V5Zyw5Z2AOiBodHRwczovL3hpZS5pbmZvcS5jbi9saW5rP3RhcmdldD1odHRwcyUzQSUyRiUyRnd3dy5maW5jbGlwLmNvbSUyRiUzRmNoYW5uZWwlM0RpbmZvcXNlb1xuICAgICAgbmFtZTogJ0luZm9RJyxcbiAgICAgIHRlc3Q6IC9pbmZvcVxcLmNuLyxcbiAgICAgIHByb3ZpZGVyOiBJbmZvUVByb3ZpZGVyXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyDmtYvor5XlnLDlnYA6IGh0dHBzOi8vZ2l0ZWUuY29tL1RlbmNlbnQvbmNublxuICAgICAgbmFtZTogJ0dpdGVlJyxcbiAgICAgIHRlc3Q6IC9naXRlZS5jb20vLFxuICAgICAgcHJvdmlkZXI6IEdpdGVlUHJvdmlkZXJcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIOa1i+ivleWcsOWdgDogaHR0cHM6Ly9zc3BhaS5jb20vcG9zdC83NzQ5OVxuICAgICAgbmFtZTogJ+WwkeaVsOa0vicsXG4gICAgICB0ZXN0OiAvc3NwYWlcXC5jb20vLFxuICAgICAgcHJvdmlkZXI6IFNTUGFpUHJvdmlkZXJcbiAgICB9XG4gIF0pXG4gIC5ib290c3RyYXAoKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址