Fundation.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/frameWork/compment/Fundation.js';
  5. var __require = nodeEnv ? function (request) {
  6. return cc.require(request);
  7. } : function (request) {
  8. return __quick_compile_project__.require(request, __filename);
  9. };
  10. function __define (exports, require, module) {
  11. if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
  12. cc._RF.push(module, 'd6b68Nm4pVPo75JXou2zZ8L', 'Fundation');
  13. // script/frameWork/compment/Fundation.ts
  14. "use strict";
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. exports.copyToClipboardForWeb = exports.fastRemoveIndex = exports.sortedLastIndex = exports.sortedIndex = exports.insertionSort = exports.onceArgCall = exports.onceCall = exports.MaxValueOf = exports.CreateIntEnum = exports.CreateObjectKeyAsValueMap = void 0;
  17. //#region ******************************** 辅助函数 ********************************
  18. function CreateObjectKeyAsValueMap(obj) {
  19. var keys = Object.keys(obj);
  20. var ret = Object.create(null);
  21. keys.forEach(function (key) {
  22. ret[key] = key;
  23. });
  24. keys = undefined;
  25. return ret;
  26. }
  27. exports.CreateObjectKeyAsValueMap = CreateObjectKeyAsValueMap;
  28. function CreateIntEnum(states, stateVal) {
  29. if (stateVal === void 0) { stateVal = 1; }
  30. var ret = Object.create(null);
  31. states.forEach(function (state) {
  32. ret[state] = stateVal;
  33. stateVal = stateVal + 1;
  34. });
  35. return ret;
  36. }
  37. exports.CreateIntEnum = CreateIntEnum;
  38. function MaxValueOf(intEnum) {
  39. var init = false;
  40. var maxVal = 0;
  41. for (var k in intEnum) {
  42. if (!init) {
  43. maxVal = intEnum[k];
  44. }
  45. else {
  46. maxVal = (intEnum[k] > maxVal) ? intEnum[k] : maxVal;
  47. }
  48. }
  49. return maxVal;
  50. }
  51. exports.MaxValueOf = MaxValueOf;
  52. function onceCall(cb, cnt) {
  53. if (cnt === void 0) { cnt = 1; }
  54. return function () {
  55. if (cnt <= 0) {
  56. return;
  57. }
  58. ;
  59. --cnt;
  60. if (cnt === 0) {
  61. cb();
  62. }
  63. };
  64. }
  65. exports.onceCall = onceCall;
  66. function onceArgCall(cb, cnt) {
  67. return function (p) {
  68. if (cnt <= 0) {
  69. return;
  70. }
  71. ;
  72. --cnt;
  73. if (cnt === 0) {
  74. cb(p);
  75. }
  76. };
  77. }
  78. exports.onceArgCall = onceArgCall;
  79. //#endregion
  80. /**
  81. * 尾插入排序(从小到大)
  82. * @param list
  83. * @param compare
  84. * @returns
  85. */
  86. function insertionSort(list, compare) {
  87. for (var length = list.length, i = 1; i < length; i++) {
  88. var j = void 0, value = list[i];
  89. for (j = i - 1; j >= 0; j--) {
  90. if (compare(list[j], value) <= 0)
  91. break;
  92. list[j + 1] = list[j];
  93. }
  94. list[j + 1] = value;
  95. }
  96. return list;
  97. }
  98. exports.insertionSort = insertionSort;
  99. /**
  100. * 已排好序(从小到大)的数组,获得 value 应该排在哪个位置(有相同值的情况下,排最左边)
  101. * @param list
  102. * @param value
  103. * @param compare
  104. * @returns
  105. */
  106. function sortedIndex(list, value, compare) {
  107. var low = 0, high = list.length;
  108. while (low < high) {
  109. var mid = (low + high) >>> 1;
  110. if (compare(list[mid], value) < 0)
  111. low = mid + 1;
  112. else
  113. high = mid;
  114. }
  115. return low;
  116. }
  117. exports.sortedIndex = sortedIndex;
  118. /**
  119. * 已排好序(从小到大)的数组,获得 value 应该排在哪个位置(有相同值的情况下,排最右边)
  120. * @param list
  121. * @param value
  122. * @param compare
  123. * @returns
  124. */
  125. function sortedLastIndex(list, value, compare) {
  126. var low = 0, high = list.length;
  127. while (low < high) {
  128. var mid = (low + high) >>> 1;
  129. if (compare(list[mid], value) <= 0)
  130. low = mid + 1;
  131. else
  132. high = mid;
  133. }
  134. return high;
  135. }
  136. exports.sortedLastIndex = sortedLastIndex;
  137. /**
  138. * 快速删除数组元素(不保证删除后的顺序)
  139. * @param arr
  140. * @param idx
  141. */
  142. function fastRemoveIndex(arr, idx) {
  143. if (idx >= 0 && idx < arr.length) {
  144. arr[idx] = arr[arr.length - 1];
  145. arr.length--;
  146. }
  147. }
  148. exports.fastRemoveIndex = fastRemoveIndex;
  149. /**
  150. * 拷贝内容到剪切板
  151. * @param copyStr 内容
  152. */
  153. function copyToClipboardForWeb(copyStr, callback) {
  154. var el = document.createElement('textarea');
  155. el.value = copyStr;
  156. // Prevent keyboard from showing on mobile
  157. el.setAttribute('readonly', '');
  158. //el.style.contain = 'strict';
  159. el.style.position = 'absolute';
  160. el.style.left = '-9999px';
  161. el.style.fontSize = '12pt'; // Prevent zooming on iOS
  162. var selection = getSelection();
  163. var originalRange;
  164. if (selection.rangeCount > 0) {
  165. originalRange = selection.getRangeAt(0);
  166. }
  167. document.body.appendChild(el);
  168. el.select();
  169. // Explicit selection workaround for iOS
  170. el.selectionStart = 0;
  171. el.selectionEnd = copyStr.length;
  172. var isSuccess = false;
  173. try {
  174. isSuccess = document.execCommand('copy');
  175. }
  176. catch (err) {
  177. isSuccess = false;
  178. }
  179. finally {
  180. document.body.removeChild(el);
  181. if (originalRange) {
  182. selection.removeAllRanges();
  183. selection.addRange(originalRange);
  184. }
  185. }
  186. /** 返回结果 */
  187. if (isSuccess) {
  188. callback();
  189. }
  190. else {
  191. callback(new Error("执行剪切板拷贝命令出错"));
  192. }
  193. }
  194. exports.copyToClipboardForWeb = copyToClipboardForWeb;
  195. cc._RF.pop();
  196. }
  197. if (nodeEnv) {
  198. __define(__module.exports, __require, __module);
  199. }
  200. else {
  201. __quick_compile_project__.registerModuleFunc(__filename, function () {
  202. __define(__module.exports, __require, __module);
  203. });
  204. }
  205. })();
  206. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvZnJhbWVXb3JrL2NvbXBtZW50L0Z1bmRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkEsZ0ZBQWdGO0FBQ2hGLFNBQWdCLHlCQUF5QixDQUFtQixHQUFNO0lBQzlELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsSUFBSSxHQUFHLEdBQXdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEdBQUc7UUFDWixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUMsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUNqQixPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFSRCw4REFRQztBQUVELFNBQWdCLGFBQWEsQ0FBbUIsTUFBZ0IsRUFBRSxRQUFvQjtJQUFwQix5QkFBQSxFQUFBLFlBQW9CO0lBQ2xGLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFBLEtBQUs7UUFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUN0QixRQUFRLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQTtJQUNGLE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQVBELHNDQU9DO0FBSUQsU0FBZ0IsVUFBVSxDQUFtQixPQUFnQztJQUN6RSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUM7SUFDakIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsS0FBSyxJQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7UUFDbkIsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE1BQU0sR0FBRyxPQUFPLENB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UUFDMUIsYUFBYSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDM0M7SUFFRCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFWix3Q0FBd0M7SUFDeEMsRUFBRSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDdEIsRUFBRSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBRWpDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN0QixJQUFJO1FBQ0EsU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDNUM7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNWLFNBQVMsR0FBRyxLQUFLLENBQUM7S0FDckI7WUFBUztRQUNOLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLElBQUksYUFBYSxFQUFFO1lBQ2YsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckM7S0FDSjtJQUVELFdBQVc7SUFDWCxJQUFJLFNBQVMsRUFBRTtRQUNYLFFBQVEsRUFBRSxDQUFDO0tBQ2Q7U0FBTTtRQUNILFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFBO0tBQ3JDO0FBQ0wsQ0FBQztBQTNDRCxzREEyQ0MiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJcblxuLy8jcmVnaW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIOexu+Wei+WjsOaYjiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuZXhwb3J0IHR5cGUgQ2FsbGJhY2s8VCA9IGFueT4gPSAoZXJyOiBFcnJvciB8IG51bGwsIGRhdGE6IFQpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0gdW5rbm93bj4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuZXhwb3J0IHR5cGUgT2JqZWN0S2V5QXNWYWx1ZTxUPiA9IHsgcmVhZG9ubHkgW0sgaW4ga2V5b2YgVF06IEs7IH1cbmV4cG9ydCB0eXBlIEtleUFycmF5QXNWYWx1ZTxUIGV4dGVuZHMgc3RyaW5nPiA9IHsgcmVhZG9ubHkgW1YgaW4gVF06IFY7IH1cbi8vI2VuZHJlZ2lvblxuXG4vKipcbiAqIOmUgOavgeaOpeWPo1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElEaXNwb3NlIHtcbiAgICBEaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKiDoh6rliqjplIDmr4HpmYTnnYDlr7nosaEgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURpc3Bvc2VBdHRhY2hUYXJnZXQge1xuICAgIEF1dG9EaXNwb3NlKHRvRGlzcG9zZTogSURpc3Bvc2UpOiB2b2lkO1xufVxuXG4vLyNyZWdpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiog6L6F5Yqp5Ye95pWwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlT2JqZWN0S2V5QXNWYWx1ZU1hcDxUIGV4dGVuZHMgT2JqZWN0PihvYmo6IFQpOiBPYmplY3RLZXlBc1ZhbHVlPFQ+IHtcbiAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgbGV0IHJldDogT2JqZWN0S2V5QXNWYWx1ZTxUPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHJldFtrZXldID0ga2V5O1xuICAgIH0pXG4gICAga2V5cyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlSW50RW51bTxUIGV4dGVuZHMgc3RyaW5nPihzdGF0ZXM6IEFycmF5PFQ+LCBzdGF0ZVZhbDogbnVtYmVyID0gMSk6IHsgW1YgaW4gVF06IG51bWJlciB9IHtcbiAgICBsZXQgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBzdGF0ZXMuZm9yRWFjaChzdGF0ZSA9PiB7XG4gICAgICAgIHJldFtzdGF0ZV0gPSBzdGF0ZVZhbDtcbiAgICAgICAgc3RhdGVWYWwgPSBzdGF0ZVZhbCArIDE7XG4gICAgfSlcbiAgICByZXR1cm4gcmV0O1xufVxuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIE1heFZhbHVlT2Y8VCBleHRlbmRzIHN0cmluZz4oaW50RW51bTogeyBbazogc3RyaW5nXTogbnVtYmVyIH0pIHtcbiAgICBsZXQgaW5pdCA9IGZhbHNlO1xuICAgIGxldCBtYXhWYWwgPSAwO1xuICAgIGZvciAobGV0IGsgaW4gaW50RW51bSkge1xuICAgICAgICBpZiAoIWluaXQpIHtcbiAgICAgICAgICAgIG1heFZhbCA9IGludEVudW1ba107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXhWYWwgPSAoaW50RW51bVtrXSA+IG1heFZhbCkgPyBpbnRFbnVtW2tdIDogbWF4VmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmNlQ2FsbChjYjogKCkgPT4gdm9pZCwgY250OiBudW1iZXIgPSAxKSB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKGNudCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH07XG4gICAgICAgIC0tY250O1xuICAgICAgICBpZiAoY250ID09PSAwKSB7XG4gICAgICAgICAgICBjYigpXG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25jZUFyZ0NhbGw8VD4oY2I6IChwOiBUKSA9PiB2b2lkLCBjbnQ6IG51bWJlcikge1xuICAgIHJldHVybiAocDogVCkgPT4ge1xuICAgICAgICBpZiAoY250IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfTtcbiAgICAgICAgLS1jbnQ7XG4gICAgICAgIGlmIChjbnQgPT09IDApIHtcbiAgICAgICAgICAgIGNiKHApXG4gICAgICAgIH1cbiAgICB9XG59XG4vLyNlbmRyZWdpb25cblxuLyoqXG4gKiDlsL7mj5LlhaXmjpLluo/vvIjku47lsI/liLDlpKfvvIlcbiAqIEBwYXJhbSBsaXN0IFxuICogQHBhcmFtIGNvbXBhcmUgXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydGlvblNvcnQ8VD4obGlzdDogVFtdLCBjb21wYXJlOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgbGVuZ3RoID0gbGlzdC5sZW5ndGgsIGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGosIHZhbHVlOiBUID0gbGlzdFtpXVxuICAgICAgICBmb3IgKGogPSBpIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgIGlmIChjb21wYXJlKGxpc3Rbal0sIHZhbHVlKSA8PSAwKSBicmVha1xuICAgICAgICAgICAgbGlzdFtqICsgMV0gPSBsaXN0W2pdXG4gICAgICAgIH1cbiAgICAgICAgbGlzdFtqICsgMV0gPSB2YWx1ZVxuICAgIH1cbiAgICByZXR1cm4gbGlzdFxufVxuXG4vKipcbiAqIOW3suaOkuWlveW6jyjku47lsI/liLDlpKcp55qE5pWw57uE77yM6I635b6XIHZhbHVlIOW6lOivpeaOkuWcqOWTquS4quS9jee9ru+8iOacieebuOWQjOWAvOeahOaDheWGteS4i++8jOaOkuacgOW3pui+ue+8iVxuICogQHBhcmFtIGxpc3QgXG4gKiBAcGFyYW0gdmFsdWUgXG4gKiBAcGFyYW0gY29tcGFyZSBcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydGVkSW5kZXg8VCwgVj4obGlzdDogVFtdLCB2YWx1ZTogViwgY29tcGFyZTogKGE6IFQsIGI6IFYpID0+IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGxvdyA9IDAsIGhpZ2ggPSBsaXN0Lmxlbmd0aFxuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGxldCBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDFcbiAgICAgICAgaWYgKGNvbXBhcmUobGlzdFttaWRdLCB2YWx1ZSkgPCAwKSBsb3cgPSBtaWQgKyAxXG4gICAgICAgIGVsc2UgaGlnaCA9IG1pZFxuICAgIH1cbiAgICByZXR1cm4gbG93XG59XG5cbi8qKlxuICog5bey5o6S5aW95bqPKOS7juWwj+WIsOWkpynnmoTmlbDnu4TvvIzojrflvpcgdmFsdWUg5bqU6K+l5o6S5Zyo5ZOq5Liq5L2N572u77yI5pyJ55u45ZCM5YC855qE5oOF5Ya15LiL77yM5o6S5pyA5Y+z6L6577yJXG4gKiBAcGFyYW0gbGlzdCBcbiAqIEBwYXJhbSB2YWx1ZSBcbiAqIEBwYXJhbSBjb21wYXJlIFxuICogQHJldHVybnMgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXg8VD4obGlzdDogVFtdLCB2YWx1ZTogVCwgY29tcGFyZTogKGE6IFQsIGI6IFQpID0+IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGxvdyA9IDAsIGhpZ2ggPSBsaXN0Lmxlbmd0aFxuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGxldCBtaWQgPSAobG93ICsgaGlnaCkgPj4+IDFcbiAgICAgICAgaWYgKGNvbXBhcmUobGlzdFttaWRdLCB2YWx1ZSkgPD0gMCkgbG93ID0gbWlkICsgMVxuICAgICAgICBlbHNlIGhpZ2ggPSBtaWRcbiAgICB9XG4gICAgcmV0dXJuIGhpZ2hcbn1cblxuLyoqXG4gKiDlv6vpgJ/liKDpmaTmlbDnu4TlhYPntKDvvIjkuI3kv53or4HliKDpmaTlkI7nmoTpobrluo/vvIlcbiAqIEBwYXJhbSBhcnIgXG4gKiBAcGFyYW0gaWR4IFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFzdFJlbW92ZUluZGV4KGFycjogYW55W10sIGlkeDogbnVtYmVyKSB7XG4gICAgaWYgKGlkeCA+PSAwICYmIGlkeCA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgYXJyW2lkeF0gPSBhcnJbYXJyLmxlbmd0aCAtIDFdO1xuICAgICAgICBhcnIubGVuZ3RoLS07XG4gICAgfVxufVxuXG4vKipcbiAqIOaLt+i0neWGheWuueWIsOWJquWIh+adv1xuICogQHBhcmFtIGNvcHlTdHIg5YaF5a65XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5VG9DbGlwYm9hcmRGb3JXZWIoY29weVN0cjogc3RyaW5nLCBjYWxsYmFjazogKGVycj86IEVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgIGVsLnZhbHVlID0gY29weVN0cjtcblxuICAgIC8vIFByZXZlbnQga2V5Ym9hcmQgZnJvbSBzaG93aW5nIG9uIG1vYmlsZVxuICAgIGVsLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJyk7XG4gICAgLy9lbC5zdHlsZS5jb250YWluID0gJ3N0cmljdCc7XG4gICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGVsLnN0eWxlLmxlZnQgPSAnLTk5OTlweCc7XG4gICAgZWwuc3R5bGUuZm9udFNpemUgPSAnMTJwdCc7IC8vIFByZXZlbnQgem9vbWluZyBvbiBpT1NcblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpITtcbiAgICBsZXQgb3JpZ2luYWxSYW5nZTtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgICAgIG9yaWdpbmFsUmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgICBlbC5zZWxlY3QoKTtcblxuICAgIC8vIEV4cGxpY2l0IHNlbGVjdGlvbiB3b3JrYXJvdW5kIGZvciBpT1NcbiAgICBlbC5zZWxlY3Rpb25TdGFydCA9IDA7XG4gICAgZWwuc2VsZWN0aW9uRW5kID0gY29weVN0ci5sZW5ndGg7XG5cbiAgICBsZXQgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgaXNTdWNjZXNzID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgIGlmIChvcmlnaW5hbFJhbmdlKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2Uob3JpZ2luYWxSYW5nZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiog6L+U5Zue57uT5p6cICovXG4gICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcihcIuaJp+ihjOWJquWIh+adv+aLt+i0neWRveS7pOWHuumUmVwiKSlcbiAgICB9XG59Il19