UNPKG

27.8 kBJavaScriptView Raw
1/**
2 * 分词器接口
3 *
4 * @author 老雷<leizongmin@gmail.com>
5 */
6'use strict';
7Object.defineProperty(exports, "__esModule", { value: true });
8exports.SegmentCore = void 0;
9const POSTAG_1 = require("../POSTAG");
10const index_1 = require("../mod/index");
11const stringify_1 = require("./methods/stringify");
12const split_1 = require("./methods/split");
13const indexOf_1 = require("./methods/indexOf");
14const convertSynonym_1 = require("./methods/convertSynonym");
15const listModules_1 = require("./methods/listModules");
16const _get_text_1 = require("./methods/_get_text");
17const getOptionsDoSegment_1 = require("./methods/getOptionsDoSegment");
18const useModules_1 = require("./methods/useModules");
19const doSegment_1 = require("./methods/doSegment");
20/**
21 * 创建分词器接口
22 */
23class SegmentCore {
24 constructor(options = {}) {
25 /**
26 * 分段
27 *
28 * 由於 segment 是利用對內容的前後文分析來進行分詞
29 * 所以如何切割段落對於結果就會產生不同影響
30 *
31 * `RegExp` or 具有 `.[Symbol.split](input: string, limit?: number) => string[]` 的物件
32 *
33 * @type {Segment.ISPLIT}
34 */
35 this.SPLIT = /([\r\n]+|^[ \s]+|[ \s]+$|[ \s]{2,})/gm;
36 /**
37 * 分段之後 如果符合以下條件 則直接忽略分析
38 * `RegExp` or 具有 `.test(input: string) => boolean` 的物件
39 *
40 * @type {Segment.ISPLIT_FILTER}
41 */
42 this.SPLIT_FILTER = /^([\r\n]+)$/g;
43 /**
44 * 词性
45 * @type {POSTAG}
46 */
47 this.POSTAG = POSTAG_1.default;
48 /**
49 * 词典表
50 * @type {{}}
51 */
52 this.DICT = {};
53 this.modules = {
54 /**
55 * 分词模块
56 */
57 tokenizer: [],
58 /**
59 * 优化模块
60 */
61 optimizer: [],
62 };
63 this.db = {};
64 this.options = {};
65 const self = this;
66 this.options = Object.assign({}, this.options, options);
67 this.tokenizer = new index_1.Tokenizer(this);
68 this.optimizer = new index_1.Optimizer(this);
69 if (this.options.db) {
70 this.options.db.forEach(function (data) {
71 self.db[data.type] = data;
72 });
73 }
74 delete this.options.db;
75 }
76 getDictDatabase(type, autocreate, libTableDict) {
77 // @ts-ignore
78 return this.db[type];
79 }
80 use(mod, ...argv) {
81 useModules_1.useModules(this, mod, ...argv);
82 return this;
83 }
84 getDict(type) {
85 return this.DICT[type];
86 }
87 getOptionsDoSegment(options) {
88 return getOptionsDoSegment_1.getOptionsDoSegment(options, this.options.optionsDoSegment);
89 }
90 _get_text(text) {
91 return _get_text_1._get_text(text);
92 }
93 addBlacklist(word, remove) {
94 let me = this;
95 const BLACKLIST = me.getDictDatabase("BLACKLIST" /* BLACKLIST */);
96 const TABLE = me.getDictDatabase("TABLE" /* TABLE */);
97 let bool = !remove;
98 if (bool) {
99 BLACKLIST.add(word);
100 TABLE.remove(word);
101 }
102 else {
103 BLACKLIST.remove(word);
104 }
105 return this;
106 }
107 /**
108 * remove key in TABLE by BLACKLIST
109 */
110 doBlacklist() {
111 let me = this;
112 const BLACKLIST = me.getDict("BLACKLIST" /* BLACKLIST */);
113 const TABLE = me.getDictDatabase("TABLE" /* TABLE */);
114 Object.entries(BLACKLIST)
115 .forEach(function ([key, bool]) {
116 bool && TABLE.remove(key);
117 });
118 return this;
119 }
120 listModules(options = {}) {
121 options = this.getOptionsDoSegment(options);
122 return listModules_1.listModules(this.modules, options);
123 }
124 doSegment(text, options = {}) {
125 const me = this;
126 options = me.getOptionsDoSegment(options);
127 //console.dir(options);
128 let text_list = me._get_text(text)
129 // @ts-ignore
130 .split(this.SPLIT);
131 text = undefined;
132 const mods = me.listModules(options).enable;
133 // 将文本按照换行符分割成多段,并逐一分词
134 let ret = text_list.reduce(function (ret, section) {
135 //console.dir(section);
136 if (me.SPLIT_FILTER.test(section)) {
137 ret = ret.concat({ w: section });
138 // @ts-ignore
139 section = [];
140 }
141 //section = section.trim();
142 if (section.length > 0) {
143 // 分词
144 let sret = me.tokenizer.split(section, mods.tokenizer);
145 // 优化
146 sret = me.optimizer.doOptimize(sret, mods.optimizer);
147 // 连接分词结果
148 if (sret.length > 0) {
149 ret = ret.concat(sret);
150 }
151 }
152 return ret;
153 }, []);
154 // 去除标点符号
155 if (options.stripPunctuation) {
156 ret = doSegment_1._doSegmentStripPOSTAG(ret, POSTAG_1.default.D_W);
157 }
158 if (options.convertSynonym) {
159 ret = this.convertSynonym(ret);
160 }
161 // 去除停止符
162 if (options.stripStopword) {
163 ret = doSegment_1._doSegmentStripStopword(ret, me.getDict('STOPWORD'));
164 }
165 if (options.stripSpace) {
166 ret = doSegment_1._doSegmentStripSpace(ret);
167 }
168 // 仅返回单词内容
169 if (options.simple) {
170 ret = doSegment_1._doSegmentSimple(ret);
171 }
172 return ret;
173 }
174 convertSynonym(ret, showcount) {
175 return convertSynonym_1.convertSynonym(ret, {
176 showcount,
177 DICT_SYNONYM: this.getDict('SYNONYM'),
178 DICT_TABLE: this.getDict('TABLE'),
179 POSTAG: this.POSTAG,
180 });
181 }
182 /**
183 * 将单词数组连接成字符串
184 *
185 * @param {Array} words 单词数组
186 * @return {String}
187 */
188 stringify(words, ...argv) {
189 return stringify_1.stringify(words, ...argv);
190 }
191 /**
192 * 将单词数组连接成字符串
193 *
194 * @param {Array} words 单词数组
195 * @return {String}
196 */
197 static stringify(words, ...argv) {
198 return stringify_1.stringify(words, ...argv);
199 }
200 /**
201 * 根据某个单词或词性来分割单词数组
202 *
203 * @param {Array} words 单词数组
204 * @param {Number|String} s 用于分割的单词或词性
205 * @return {Array}
206 */
207 split(words, s, ...argv) {
208 return split_1.split(words, s, ...argv);
209 }
210 /**
211 * 在单词数组中查找某一个单词或词性所在的位置
212 *
213 * @param {Array} words 单词数组
214 * @param {Number|String} s 要查找的单词或词性
215 * @param {Number} cur 开始位置
216 * @return {Number} 找不到,返回-1
217 */
218 indexOf(words, s, cur, ...argv) {
219 return indexOf_1.indexOf(words, cur, ...argv);
220 }
221}
222exports.SegmentCore = SegmentCore;
223exports.default = SegmentCore;
224//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILFlBQVksQ0FBQzs7O0FBS2Isc0NBQStCO0FBVS9CLHdDQUFrRjtBQVNsRixtREFBZ0Q7QUFDaEQsMkNBQXdDO0FBQ3hDLCtDQUE0QztBQUM1Qyw2REFBd0Y7QUFDeEYsdURBQW9EO0FBQ3BELG1EQUFnRDtBQUNoRCx1RUFBb0U7QUFDcEUscURBQWtEO0FBQ2xELG1EQUs2QjtBQUk3Qjs7R0FFRztBQUNILE1BQWEsV0FBVztJQStEdkIsWUFBWSxVQUEyQixFQUFFO1FBNUR6Qzs7Ozs7Ozs7O1dBU0c7UUFDSCxVQUFLLEdBQVcsdUNBQWlELENBQUM7UUFFbEU7Ozs7O1dBS0c7UUFDSCxpQkFBWSxHQUFrQixjQUErQixDQUFDO1FBRTlEOzs7V0FHRztRQUNILFdBQU0sR0FBRyxnQkFBTSxDQUFDO1FBQ2hCOzs7V0FHRztRQUNILFNBQUksR0FLQSxFQUFFLENBQUM7UUFDUCxZQUFPLEdBQUc7WUFDVDs7ZUFFRztZQUNILFNBQVMsRUFBRSxFQUFFO1lBQ2I7O2VBRUc7WUFDSCxTQUFTLEVBQUUsRUFBRTtTQUliLENBQUM7UUFLRixPQUFFLEdBRUUsRUFBRSxDQUFDO1FBRVAsWUFBTyxHQUFvQixFQUFFLENBQUM7UUFNN0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWxCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksaUJBQVMsQ0FBQyxJQUFXLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksaUJBQVMsQ0FBQyxJQUFXLENBQUMsQ0FBQztRQUU1QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUNuQjtZQUND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LENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLEtBQWMsRUFBRSxDQUFrQixFQUFFLEdBQVksRUFBRSxHQUFHLElBQUk7UUFFaEUsT0FBTyxpQkFBTyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0NBRUQ7QUE5V0Qsa0NBOFdDO0FBSUQsa0JBQWUsV0FBVyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDliIbor43lmajmjqXlj6NcbiAqXG4gKiBAYXV0aG9yIOiAgembtzxsZWl6b25nbWluQGdtYWlsLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIEB0cy1pZ25vcmVcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuaW1wb3J0IFBPU1RBRyBmcm9tICcuLi9QT1NUQUcnO1xuaW1wb3J0IFRhYmxlRGljdEJsYWNrbGlzdCBmcm9tICcuLi90YWJsZS9ibGFja2xpc3QnO1xuaW1wb3J0IEFic3RyYWN0VGFibGVEaWN0Q29yZSBmcm9tICcuLi90YWJsZS9jb3JlJztcbmltcG9ydCB7IElPcHRpb25zIGFzIElPcHRpb25zVGFibGVEaWN0LCBUYWJsZURpY3QgfSBmcm9tICcuLi90YWJsZS9kaWN0JztcblxuaW1wb3J0IExvYWRlciBmcm9tICcuLi9sb2FkZXInO1xuaW1wb3J0IHsgY3JsZiB9IGZyb20gJ2NybGYtbm9ybWFsaXplJztcbmltcG9ydCB7IFRhYmxlRGljdFN0b3B3b3JkIH0gZnJvbSAnLi4vdGFibGUvc3RvcHdvcmQnO1xuaW1wb3J0IFRhYmxlRGljdFN5bm9ueW0gZnJvbSAnLi4vdGFibGUvc3lub255bSc7XG5pbXBvcnQgU2VnbWVudERpY3QgZnJvbSAnc2VnbWVudC1kaWN0JztcbmltcG9ydCB7IElTdWJPcHRpbWl6ZXIsIElTdWJUb2tlbml6ZXIsIE9wdGltaXplciwgVG9rZW5pemVyIH0gZnJvbSAnLi4vbW9kL2luZGV4JztcbmltcG9ydCB7IGRlYnVnVG9rZW4gfSBmcm9tICcuLi91dGlsL2RlYnVnJztcbmltcG9ydCB7IElXb3JkRGVidWcgfSBmcm9tICcuLi91dGlsL2luZGV4JztcblxuaW1wb3J0IGRlZXBtZXJnZSBmcm9tICdkZWVwbWVyZ2UtcGx1cy9jb3JlJztcbmltcG9ydCB7IEVudW1EaWN0RGF0YWJhc2UgfSBmcm9tICcuLi9jb25zdCc7XG5pbXBvcnQgeyBFTlVNX1NVQk1PRFMsIEVOVU1fU1VCTU9EU19OQU1FLCBFTlVNX1NVQk1PRFNfT1RIRVIgfSBmcm9tICcuLi9tb2QvaW5kZXgnO1xuaW1wb3J0IHsgZGVmYXVsdE9wdGlvbnNEb1NlZ21lbnQgfSBmcm9tICcuL2RlZmF1bHRzJztcbmltcG9ydCB7IElESUNULCBJRElDVDIsIElESUNUX0JMQUNLTElTVCwgSURJQ1RfU1RPUFdPUkQsIElESUNUX1NZTk9OWU0sIElPcHRpb25zRG9TZWdtZW50LCBJT3B0aW9uc1NlZ21lbnQsIElTUExJVCwgSVNQTElUX0ZJTFRFUiwgSVdvcmQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gJy4vbWV0aG9kcy9zdHJpbmdpZnknO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuL21ldGhvZHMvc3BsaXQnO1xuaW1wb3J0IHsgaW5kZXhPZiB9IGZyb20gJy4vbWV0aG9kcy9pbmRleE9mJztcbmltcG9ydCB7IGNvbnZlcnRTeW5vbnltLCBJQ29udmVydFN5bm9ueW1XaXRoU2hvd2NvdW50IH0gZnJvbSAnLi9tZXRob2RzL2NvbnZlcnRTeW5vbnltJztcbmltcG9ydCB7IGxpc3RNb2R1bGVzIH0gZnJvbSAnLi9tZXRob2RzL2xpc3RNb2R1bGVzJztcbmltcG9ydCB7IF9nZXRfdGV4dCB9IGZyb20gJy4vbWV0aG9kcy9fZ2V0X3RleHQnO1xuaW1wb3J0IHsgZ2V0T3B0aW9uc0RvU2VnbWVudCB9IGZyb20gJy4vbWV0aG9kcy9nZXRPcHRpb25zRG9TZWdtZW50JztcbmltcG9ydCB7IHVzZU1vZHVsZXMgfSBmcm9tICcuL21ldGhvZHMvdXNlTW9kdWxlcyc7XG5pbXBvcnQge1xuXHRfZG9TZWdtZW50U2ltcGxlLFxuXHRfZG9TZWdtZW50U3RyaXBQT1NUQUcsXG5cdF9kb1NlZ21lbnRTdHJpcFNwYWNlLFxuXHRfZG9TZWdtZW50U3RyaXBTdG9wd29yZCxcbn0gZnJvbSAnLi9tZXRob2RzL2RvU2VnbWVudCc7XG5pbXBvcnQgeyBJVFNPdmVyd3JpdGUgfSBmcm9tICd0cy10eXBlJztcblxuXG4vKipcbiAqIOWIm+W7uuWIhuivjeWZqOaOpeWPo1xuICovXG5leHBvcnQgY2xhc3MgU2VnbWVudENvcmVcbntcblxuXHQvKipcblx0ICog5YiG5q61XG5cdCAqXG5cdCAqIOeUseaWvCBzZWdtZW50IOaYr+WIqeeUqOWwjeWFp+WuueeahOWJjeW+jOaWh+WIhuaekOS+humAsuihjOWIhuipnlxuXHQgKiDmiYDku6XlpoLkvZXliIflibLmrrXokL3lsI3mlrzntZDmnpzlsLHmnIPnlKLnlJ/kuI3lkIzlvbHpn79cblx0ICpcblx0ICogYFJlZ0V4cGAgb3Ig5YW35pyJIGAuW1N5bWJvbC5zcGxpdF0oaW5wdXQ6IHN0cmluZywgbGltaXQ/OiBudW1iZXIpID0+IHN0cmluZ1tdYCDnmoTnianku7Zcblx0ICpcblx0ICogQHR5cGUge1NlZ21lbnQuSVNQTElUfVxuXHQgKi9cblx0U1BMSVQ6IElTUExJVCA9IC8oW1xcclxcbl0rfF5b44CAXFxzXSt8W+OAgFxcc10rJHxb44CAXFxzXXsyLH0pL2dtIGFzIElTUExJVDtcblxuXHQvKipcblx0ICog5YiG5q615LmL5b6MIOWmguaenOespuWQiOS7peS4i+aineS7tiDliYfnm7TmjqXlv73nlaXliIbmnpBcblx0ICogYFJlZ0V4cGAgb3Ig5YW35pyJIGAudGVzdChpbnB1dDogc3RyaW5nKSA9PiBib29sZWFuYCDnmoTnianku7Zcblx0ICpcblx0ICogQHR5cGUge1NlZ21lbnQuSVNQTElUX0ZJTFRFUn1cblx0ICovXG5cdFNQTElUX0ZJTFRFUjogSVNQTElUX0ZJTFRFUiA9IC9eKFtcXHJcXG5dKykkL2cgYXMgSVNQTElUX0ZJTFRFUjtcblxuXHQvKipcblx0ICog6K+N5oCnXG5cdCAqIEB0eXBlIHtQT1NUQUd9XG5cdCAqL1xuXHRQT1NUQUcgPSBQT1NUQUc7XG5cdC8qKlxuXHQgKiDor43lhbjooahcblx0ICogQHR5cGUge3t9fVxuXHQgKi9cblx0RElDVDoge1xuXHRcdFNUT1BXT1JEPzogSURJQ1RfU1RPUFdPUkQsXG5cdFx0U1lOT05ZTT86IElESUNUX1NZTk9OWU0sXG5cblx0XHRba2V5OiBzdHJpbmddOiBJRElDVCxcblx0fSA9IHt9O1xuXHRtb2R1bGVzID0ge1xuXHRcdC8qKlxuXHRcdCAqIOWIhuivjeaooeWdl1xuXHRcdCAqL1xuXHRcdHRva2VuaXplcjogW10sXG5cdFx0LyoqXG5cdFx0ICog5LyY5YyW5qih5Z2XXG5cdFx0ICovXG5cdFx0b3B0aW1pemVyOiBbXSxcblx0fSBhcyB7XG5cdFx0dG9rZW5pemVyOiBJU3ViVG9rZW5pemVyW10sXG5cdFx0b3B0aW1pemVyOiBJU3ViT3B0aW1pemVyW10sXG5cdH07XG5cblx0dG9rZW5pemVyOiBUb2tlbml6ZXI7XG5cdG9wdGltaXplcjogT3B0aW1pemVyO1xuXG5cdGRiOiB7XG5cdFx0W2tleTogc3RyaW5nXTogVGFibGVEaWN0LFxuXHR9ID0ge307XG5cblx0b3B0aW9uczogSU9wdGlvbnNTZWdtZW50ID0ge307XG5cblx0aW5pdGVkPzogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zOiBJT3B0aW9uc1NlZ21lbnQgPSB7fSlcblx0e1xuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXG5cdFx0dGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuXHRcdHRoaXMudG9rZW5pemVyID0gbmV3IFRva2VuaXplcih0aGlzIGFzIGFueSk7XG5cdFx0dGhpcy5vcHRpbWl6ZXIgPSBuZXcgT3B0aW1pemVyKHRoaXMgYXMgYW55KTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnMuZGIpXG5cdFx0e1xuXHRcdFx0dGhpcy5vcHRpb25zLmRiLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpXG5cdFx0XHR7XG5cdFx0XHRcdHNlbGYuZGJbZGF0YS50eXBlXSA9IGRhdGE7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRkZWxldGUgdGhpcy5vcHRpb25zLmRiO1xuXHR9XG5cblx0Z2V0RGljdERhdGFiYXNlPFIgZXh0ZW5kcyBUYWJsZURpY3RTeW5vbnltPih0eXBlOiBFbnVtRGljdERhdGFiYXNlLlNZTk9OWU0sXG5cdFx0YXV0b2NyZWF0ZT86IGJvb2xlYW4sXG5cdFx0bGliVGFibGVEaWN0PzogeyBuZXcoLi4uYXJndik6IFIgfSxcblx0KTogUlxuXHRnZXREaWN0RGF0YWJhc2U8UiBleHRlbmRzIFRhYmxlRGljdD4odHlwZTogRW51bURpY3REYXRhYmFzZS5UQUJMRSwgYXV0b2NyZWF0ZT86IGJvb2xlYW4sIGxpYlRhYmxlRGljdD86IHsgbmV3KC4uLmFyZ3YpOiBSIH0pOiBSXG5cdGdldERpY3REYXRhYmFzZTxSIGV4dGVuZHMgVGFibGVEaWN0U3RvcHdvcmQ+KHR5cGU6IEVudW1EaWN0RGF0YWJhc2UuU1RPUFdPUkQsXG5cdFx0YXV0b2NyZWF0ZT86IGJvb2xlYW4sXG5cdFx0bGliVGFibGVEaWN0PzogeyBuZXcoLi4uYXJndik6IFIgfSxcblx0KTogUlxuXHRnZXREaWN0RGF0YWJhc2U8UiBleHRlbmRzIFRhYmxlRGljdEJsYWNrbGlzdD4odHlwZTogRW51bURpY3REYXRhYmFzZS5CTEFDS0xJU1QsXG5cdFx0YXV0b2NyZWF0ZT86IGJvb2xlYW4sXG5cdFx0bGliVGFibGVEaWN0PzogeyBuZXcoLi4uYXJndik6IFIgfSxcblx0KTogUlxuXHRnZXREaWN0RGF0YWJhc2U8UiBleHRlbmRzIFRhYmxlRGljdEJsYWNrbGlzdD4odHlwZTogRW51bURpY3REYXRhYmFzZS5CTEFDS0xJU1RfRk9SX09QVElNSVpFUixcblx0XHRhdXRvY3JlYXRlPzogYm9vbGVhbixcblx0XHRsaWJUYWJsZURpY3Q/OiB7IG5ldyguLi5hcmd2KTogUiB9LFxuXHQpOiBSXG5cdGdldERpY3REYXRhYmFzZTxSIGV4dGVuZHMgQWJzdHJhY3RUYWJsZURpY3RDb3JlPGFueT4+KHR5cGU6IHN0cmluZyB8IEVudW1EaWN0RGF0YWJhc2UsXG5cdFx0YXV0b2NyZWF0ZT86IGJvb2xlYW4sXG5cdFx0bGliVGFibGVEaWN0PzogeyBuZXcoLi4uYXJndik6IFIgfSxcblx0KTogUlxuXHRnZXREaWN0RGF0YWJhc2UodHlwZTogc3RyaW5nLCBhdXRvY3JlYXRlPzogYm9vbGVhbiwgbGliVGFibGVEaWN0Pylcblx0e1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRyZXR1cm4gdGhpcy5kYlt0eXBlXTtcblx0fVxuXG5cdC8qKlxuXHQgKiDovb3lhaXliIbor43mqKHlnZdcblx0ICpcblx0ICogQHBhcmFtIHtTdHJpbmd8QXJyYXl8T2JqZWN0fSBtb2R1bGUg5qih5Z2X5ZCN56ewKOaVsOe7hCnmiJbmqKHlnZflr7nosaFcblx0ICogQHJldHVybiB7U2VnbWVudH1cblx0ICovXG5cdHVzZShtb2Q6IElTdWJPcHRpbWl6ZXIsIC4uLmFyZ3YpOiB0aGlzXG5cdHVzZShtb2Q6IElTdWJUb2tlbml6ZXIsIC4uLmFyZ3YpOiB0aGlzXG5cdHVzZShtb2QsIC4uLmFyZ3YpOiB0aGlzXG5cdHVzZShtb2QsIC4uLmFyZ3YpXG5cdHtcblx0XHR1c2VNb2R1bGVzKHRoaXMsIG1vZCwgLi4uYXJndik7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0LyoqXG5cdCAqIOWPluivjeWFuOihqFxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSDnsbvlnotcblx0ICogQHJldHVybiB7b2JqZWN0fVxuXHQgKi9cblx0Z2V0RGljdCh0eXBlOiBFbnVtRGljdERhdGFiYXNlLlNUT1BXT1JEKTogSURJQ1RfU1RPUFdPUkRcblx0Z2V0RGljdCh0eXBlOiBFbnVtRGljdERhdGFiYXNlLlNZTk9OWU0pOiBJRElDVF9TWU5PTllNXG5cdGdldERpY3QodHlwZTogRW51bURpY3REYXRhYmFzZS5UQUJMRSk6IElESUNUPElXb3JkPlxuXHRnZXREaWN0KHR5cGU6IEVudW1EaWN0RGF0YWJhc2UuQkxBQ0tMSVNUKTogSURJQ1RfQkxBQ0tMSVNUXG5cdGdldERpY3QodHlwZTogRW51bURpY3REYXRhYmFzZS5CTEFDS0xJU1RfRk9SX09QVElNSVpFUik6IElESUNUX0JMQUNLTElTVFxuXHRnZXREaWN0KHR5cGU6ICdUQUJMRTInKTogSURJQ1QyPElXb3JkPlxuXHRnZXREaWN0KHR5cGU6IEVudW1EaWN0RGF0YWJhc2UpOiBJRElDVFxuXHRnZXREaWN0KHR5cGUpOiBJRElDVFxuXHRnZXREaWN0KHR5cGUpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5ESUNUW3R5cGVdO1xuXHR9XG5cblx0Z2V0T3B0aW9uc0RvU2VnbWVudDxUIGV4dGVuZHMgSU9wdGlvbnNEb1NlZ21lbnQ+KG9wdGlvbnM/OiBUKTogVFxuXHR7XG5cdFx0cmV0dXJuIGdldE9wdGlvbnNEb1NlZ21lbnQ8VD4ob3B0aW9ucywgdGhpcy5vcHRpb25zLm9wdGlvbnNEb1NlZ21lbnQpXG5cdH1cblxuXHRwcm90ZWN0ZWQgX2dldF90ZXh0KHRleHQ6IHN0cmluZyB8IEJ1ZmZlcik6IHN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIF9nZXRfdGV4dCh0ZXh0KVxuXHR9XG5cblx0YWRkQmxhY2tsaXN0KHdvcmQ6IHN0cmluZywgcmVtb3ZlPzogYm9vbGVhbilcblx0e1xuXHRcdGxldCBtZSA9IHRoaXM7XG5cblx0XHRjb25zdCBCTEFDS0xJU1QgPSBtZS5nZXREaWN0RGF0YWJhc2UoRW51bURpY3REYXRhYmFzZS5CTEFDS0xJU1QpO1xuXHRcdGNvbnN0IFRBQkxFID0gbWUuZ2V0RGljdERhdGFiYXNlKEVudW1EaWN0RGF0YWJhc2UuVEFCTEUpO1xuXG5cdFx0bGV0IGJvb2wgPSAhcmVtb3ZlO1xuXG5cdFx0aWYgKGJvb2wpXG5cdFx0e1xuXHRcdFx0QkxBQ0tMSVNULmFkZCh3b3JkKTtcblx0XHRcdFRBQkxFLnJlbW92ZSh3b3JkKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdEJMQUNLTElTVC5yZW1vdmUod29yZClcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0LyoqXG5cdCAqIHJlbW92ZSBrZXkgaW4gVEFCTEUgYnkgQkxBQ0tMSVNUXG5cdCAqL1xuXHRkb0JsYWNrbGlzdCgpXG5cdHtcblx0XHRsZXQgbWUgPSB0aGlzO1xuXG5cdFx0Y29uc3QgQkxBQ0tMSVNUID0gbWUuZ2V0RGljdChFbnVtRGljdERhdGFiYXNlLkJMQUNLTElTVCk7XG5cdFx0Y29uc3QgVEFCTEUgPSBtZS5nZXREaWN0RGF0YWJhc2UoRW51bURpY3REYXRhYmFzZS5UQUJMRSk7XG5cblx0XHRPYmplY3QuZW50cmllcyhCTEFDS0xJU1QpXG5cdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAoW2tleSwgYm9vbF0pXG5cdFx0XHR7XG5cdFx0XHRcdGJvb2wgJiYgVEFCTEUucmVtb3ZlKGtleSlcblx0XHRcdH0pXG5cdFx0O1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdGxpc3RNb2R1bGVzKG9wdGlvbnM6IElPcHRpb25zRG9TZWdtZW50ID0ge30pXG5cdHtcblx0XHRvcHRpb25zID0gdGhpcy5nZXRPcHRpb25zRG9TZWdtZW50KG9wdGlvbnMpO1xuXG5cdFx0cmV0dXJuIGxpc3RNb2R1bGVzKHRoaXMubW9kdWxlcywgb3B0aW9ucyk7XG5cdH1cblxuXHQvKipcblx0ICog5byA5aeL5YiG6K+NXG5cdCAqXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IOaWh+acrFxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyDpgInpoblcblx0ICogICAtIHtCb29sZWFufSBzaW1wbGUg5piv5ZCm5LuF6L+U5Zue5Y2V6K+N5YaF5a65XG5cdCAqICAgLSB7Qm9vbGVhbn0gc3RyaXBQdW5jdHVhdGlvbiDljrvpmaTmoIfngrnnrKblj7dcblx0ICogICAtIHtCb29sZWFufSBjb252ZXJ0U3lub255bSDovazmjaLlkIzkuYnor41cblx0ICogICAtIHtCb29sZWFufSBzdHJpcFN0b3B3b3JkIOWOu+mZpOWBnOatouesplxuXHQgKiBAcmV0dXJuIHtBcnJheX1cblx0ICovXG5cdGRvU2VnbWVudCh0ZXh0OiBzdHJpbmcgfCBCdWZmZXIsIG9wdGlvbnM6IElUU092ZXJ3cml0ZTxJT3B0aW9uc0RvU2VnbWVudCwge1xuXHRcdHNpbXBsZTogdHJ1ZSxcblx0fT4pOiBzdHJpbmdbXVxuXHRkb1NlZ21lbnQodGV4dDogc3RyaW5nIHwgQnVmZmVyLCBvcHRpb25zPzogSU9wdGlvbnNEb1NlZ21lbnQpOiBJV29yZFtdXG5cdGRvU2VnbWVudCh0ZXh0LCBvcHRpb25zOiBJT3B0aW9uc0RvU2VnbWVudCA9IHt9KVxuXHR7XG5cdFx0Y29uc3QgbWUgPSB0aGlzO1xuXG5cdFx0b3B0aW9ucyA9IG1lLmdldE9wdGlvbnNEb1NlZ21lbnQob3B0aW9ucyk7XG5cblx0XHQvL2NvbnNvbGUuZGlyKG9wdGlvbnMpO1xuXG5cdFx0bGV0IHRleHRfbGlzdCA9IG1lLl9nZXRfdGV4dCh0ZXh0KVxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0LnNwbGl0KHRoaXMuU1BMSVQpXG5cdFx0O1xuXHRcdHRleHQgPSB1bmRlZmluZWQ7XG5cblx0XHRjb25zdCBtb2RzID0gbWUubGlzdE1vZHVsZXMob3B0aW9ucykuZW5hYmxlO1xuXG5cdFx0Ly8g5bCG5paH5pys5oyJ54Wn5o2i6KGM56ym5YiG5Ymy5oiQ5aSa5q6177yM5bm26YCQ5LiA5YiG6K+NXG5cdFx0bGV0IHJldCA9IHRleHRfbGlzdC5yZWR1Y2UoZnVuY3Rpb24gKHJldCwgc2VjdGlvbilcblx0XHR7XG5cdFx0XHQvL2NvbnNvbGUuZGlyKHNlY3Rpb24pO1xuXG5cdFx0XHRpZiAobWUuU1BMSVRfRklMVEVSLnRlc3Qoc2VjdGlvbikpXG5cdFx0XHR7XG5cdFx0XHRcdHJldCA9IHJldC5jb25jYXQoeyB3OiBzZWN0aW9uIH0pO1xuXG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0c2VjdGlvbiA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHQvL3NlY3Rpb24gPSBzZWN0aW9uLnRyaW0oKTtcblx0XHRcdGlmIChzZWN0aW9uLmxlbmd0aCA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdC8vIOWIhuivjVxuXHRcdFx0XHRsZXQgc3JldCA9IG1lLnRva2VuaXplci5zcGxpdChzZWN0aW9uLCBtb2RzLnRva2VuaXplcik7XG5cblx0XHRcdFx0Ly8g5LyY5YyWXG5cdFx0XHRcdHNyZXQgPSBtZS5vcHRpbWl6ZXIuZG9PcHRpbWl6ZShzcmV0LCBtb2RzLm9wdGltaXplcik7XG5cblx0XHRcdFx0Ly8g6L+e5o6l5YiG6K+N57uT5p6cXG5cdFx0XHRcdGlmIChzcmV0Lmxlbmd0aCA+IDApXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXQgPSByZXQuY29uY2F0KHNyZXQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSwgW10pO1xuXG5cdFx0Ly8g5Y676Zmk5qCH54K556ym5Y+3XG5cdFx0aWYgKG9wdGlvbnMuc3RyaXBQdW5jdHVhdGlvbilcblx0XHR7XG5cdFx0XHRyZXQgPSBfZG9TZWdtZW50U3RyaXBQT1NUQUcocmV0LCBQT1NUQUcuRF9XKVxuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLmNvbnZlcnRTeW5vbnltKVxuXHRcdHtcblx0XHRcdHJldCA9IHRoaXMuY29udmVydFN5bm9ueW0ocmV0KTtcblx0XHR9XG5cblx0XHQvLyDljrvpmaTlgZzmraLnrKZcblx0XHRpZiAob3B0aW9ucy5zdHJpcFN0b3B3b3JkKVxuXHRcdHtcblx0XHRcdHJldCA9IF9kb1NlZ21lbnRTdHJpcFN0b3B3b3JkKHJldCwgbWUuZ2V0RGljdCgnU1RPUFdPUkQnKSlcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5zdHJpcFNwYWNlKVxuXHRcdHtcblx0XHRcdHJldCA9IF9kb1NlZ21lbnRTdHJpcFNwYWNlKHJldClcblx0XHR9XG5cblx0XHQvLyDku4Xov5Tlm57ljZXor43lhoXlrrlcblx0XHRpZiAob3B0aW9ucy5zaW1wbGUpXG5cdFx0e1xuXHRcdFx0cmV0ID0gX2RvU2VnbWVudFNpbXBsZShyZXQpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fVxuXG5cdC8qKlxuXHQgKiDovazmjaLlkIzkuYnor41cblx0ICovXG5cdGNvbnZlcnRTeW5vbnltKHJldDogSVdvcmREZWJ1Z1tdLCBzaG93Y291bnQ6IHRydWUpOiB7XG5cdFx0Y291bnQ6IG51bWJlcixcblx0XHRsaXN0OiBJV29yZERlYnVnW10sXG5cdH1cblx0LyoqXG5cdCAqIOi9rOaNouWQjOS5ieivjVxuXHQgKi9cblx0Y29udmVydFN5bm9ueW0ocmV0OiBJV29yZERlYnVnW10sIHNob3djb3VudD86IGJvb2xlYW4pOiBJV29yZERlYnVnW11cblx0Y29udmVydFN5bm9ueW0ocmV0OiBJV29yZERlYnVnW10sIHNob3djb3VudD86IGJvb2xlYW4pXG5cdHtcblx0XHRyZXR1cm4gY29udmVydFN5bm9ueW0ocmV0LCB7XG5cdFx0XHRzaG93Y291bnQsXG5cdFx0XHRESUNUX1NZTk9OWU06IHRoaXMuZ2V0RGljdCgnU1lOT05ZTScpLFxuXHRcdFx0RElDVF9UQUJMRTogdGhpcy5nZXREaWN0KCdUQUJMRScpLFxuXHRcdFx0UE9TVEFHOiB0aGlzLlBPU1RBRyxcblx0XHR9KSBhcyBJV29yZERlYnVnW10gfCBJQ29udmVydFN5bm9ueW1XaXRoU2hvd2NvdW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIOWwhuWNleivjeaVsOe7hOi/nuaOpeaIkOWtl+espuS4slxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyDljZXor43mlbDnu4Rcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0c3RyaW5naWZ5KHdvcmRzOiBBcnJheTxJV29yZCB8IHN0cmluZz4sIC4uLmFyZ3YpOiBzdHJpbmdcblx0e1xuXHRcdHJldHVybiBzdHJpbmdpZnkod29yZHMsIC4uLmFyZ3YpO1xuXHR9XG5cblx0LyoqXG5cdCAqIOWwhuWNleivjeaVsOe7hOi/nuaOpeaIkOWtl+espuS4slxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyDljZXor43mlbDnu4Rcblx0ICogQHJldHVybiB7U3RyaW5nfVxuXHQgKi9cblx0c3RhdGljIHN0cmluZ2lmeSh3b3JkczogQXJyYXk8SVdvcmQgfCBzdHJpbmc+LCAuLi5hcmd2KTogc3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gc3RyaW5naWZ5KHdvcmRzLCAuLi5hcmd2KVxuXHR9XG5cblx0LyoqXG5cdCAqIOagueaNruafkOS4quWNleivjeaIluivjeaAp+adpeWIhuWJsuWNleivjeaVsOe7hFxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSB3b3JkcyDljZXor43mlbDnu4Rcblx0ICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBzIOeUqOS6juWIhuWJsueahOWNleivjeaIluivjeaAp1xuXHQgKiBAcmV0dXJuIHtBcnJheX1cblx0ICovXG5cdHNwbGl0KHdvcmRzOiBJV29yZFtdLCBzOiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3YpOiBJV29yZFtdXG5cdHtcblx0XHRyZXR1cm4gc3BsaXQod29yZHMsIHMsIC4uLmFyZ3YpXG5cdH1cblxuXHQvKipcblx0ICog5Zyo5Y2V6K+N5pWw57uE5Lit5p+l5om+5p+Q5LiA5Liq5Y2V6K+N5oiW6K+N5oCn5omA5Zyo55qE5L2N572uXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IHdvcmRzIOWNleivjeaVsOe7hFxuXHQgKiBAcGFyYW0ge051bWJlcnxTdHJpbmd9IHMg6KaB5p+l5om+55qE5Y2V6K+N5oiW6K+N5oCnXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBjdXIg5byA5aeL5L2N572uXG5cdCAqIEByZXR1cm4ge051bWJlcn0g5om+5LiN5Yiw77yM6L+U5ZueLTFcblx0ICovXG5cdGluZGV4T2Yod29yZHM6IElXb3JkW10sIHM6IHN0cmluZyB8IG51bWJlciwgY3VyPzogbnVtYmVyLCAuLi5hcmd2KVxuXHR7XG5cdFx0cmV0dXJuIGluZGV4T2Yod29yZHMsIGN1ciwgLi4uYXJndilcblx0fVxuXG59XG5cbmV4cG9ydCB7IElESUNULCBJRElDVDIsIElESUNUX0JMQUNLTElTVCwgSURJQ1RfU1RPUFdPUkQsIElESUNUX1NZTk9OWU0sIElPcHRpb25zRG9TZWdtZW50LCBJT3B0aW9uc1NlZ21lbnQsIElTUExJVCwgSVNQTElUX0ZJTFRFUiwgSVdvcmQgfVxuXG5leHBvcnQgZGVmYXVsdCBTZWdtZW50Q29yZTtcbiJdfQ==
\No newline at end of file