@datagrok-libraries/bio 5.9.7 → 5.9.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,154 +0,0 @@
1
- /** HELM associated sdf libraries with monomer processing*/
2
- export class MonomerLibrary {
3
- constructor(sdf) {
4
- this.monomerFields = [
5
- 'molecule', 'MonomerType', 'MonomerNaturalAnalogCode', 'MonomerName', 'MonomerCode', 'MonomerCaps', 'BranchMonomer',
6
- ];
7
- this.library = {};
8
- this.monomers = [];
9
- const sdfReader = new SDFReader();
10
- const data = sdfReader.getColls(sdf);
11
- this.monomerFields.forEach((f) => {
12
- if (!(f in data))
13
- throw new Error(`Monomer library was not compiled: ${f} field is absent in provided file`);
14
- if (data[f].length != data.molecule.length)
15
- throw new Error(`Monomer library was not compiled: ${f} field is not presented for each monomer`);
16
- });
17
- for (let i = 0; i < data.molecule.length; i++) {
18
- const linkData = this.getLinkData(data.molecule[i], data.MonomerCaps[i], data.MonomerName[i]);
19
- const entry = {
20
- mol: data.molecule[i],
21
- type: 'Peptide',
22
- code: data.MonomerCode[i],
23
- analogueCode: data.MonomerNaturalAnalogCode[i],
24
- linkages: linkData,
25
- };
26
- const name = data.MonomerCode[i] !== '.' ? data.MonomerCode[i] : data.MonomerName[i];
27
- this.library[name] = entry;
28
- this.monomers.push(name);
29
- }
30
- }
31
- /** getting full monomer information from monomer library
32
- * @param {string} name
33
- * @return {MonomerEntry}
34
- */
35
- getMonomerEntry(name) {
36
- if (!this.monomers.includes(name))
37
- throw new Error(`Monomer library do not contain ${name} monomer`);
38
- return this.library[name];
39
- }
40
- /** getting mol as string for monomer
41
- * @param {string} name
42
- * @return {string}
43
- */
44
- getMonomerMol(name) {
45
- if (!this.monomers.includes(name))
46
- throw new Error(`Monomer library do not contain ${name} monomer`);
47
- const entry = this.library[name];
48
- let monomerMol = entry.mol.replace(/M RGP .+\n/, '');
49
- //order matters
50
- const links = Object.keys(entry.linkages);
51
- for (const link of links)
52
- monomerMol = monomerMol.replace('R#', entry.linkages[link].type + ' ');
53
- return monomerMol;
54
- }
55
- /** getting the list of the minomers available in library*/
56
- get monomerNames() {
57
- return this.monomers;
58
- }
59
- static get id() {
60
- return MonomerLibrary.libName;
61
- }
62
- getLinkData(mol, caps, name) {
63
- var _a;
64
- const rawData = mol.match(/M RGP .+/);
65
- if (rawData === null)
66
- throw new Error(`Monomer library was not compiled: ${name} entry has no RGP`);
67
- const types = {};
68
- (_a = caps.split('\n')) === null || _a === void 0 ? void 0 : _a.forEach((e) => {
69
- types[e.match(/\d+/)[0]] = e.match(/(?<=\])\w+/)[0];
70
- });
71
- const data = rawData[0].replace('M RGP ', '').split(/\s+/);
72
- const res = {};
73
- for (let i = 0; i < parseInt(data[0]); i++) {
74
- const code = parseInt(data[2 * i + 2]);
75
- let type = '';
76
- switch (code) {
77
- case 1:
78
- type = 'N-terminal';
79
- break;
80
- case 2:
81
- type = 'C-terminal';
82
- break;
83
- case 3:
84
- type = 'branch';
85
- break;
86
- default:
87
- break;
88
- }
89
- res[type] = { atomNumber: parseInt(data[2 * i + 1]), type: types[code] };
90
- }
91
- return res;
92
- }
93
- }
94
- MonomerLibrary.libName = 'monomerLibrary';
95
- //TODO: merge with Chem version
96
- class SDFReader {
97
- constructor() {
98
- this.dataColls = { 'molecule': [] };
99
- }
100
- getColls(content) {
101
- this.read(content);
102
- return this.dataColls;
103
- }
104
- read(content) {
105
- content = content.replaceAll('\r', ''); //equalize old and new sdf standards
106
- let startIndex = content.indexOf('$$$$', 0);
107
- this.parse(content, 0, startIndex, (name, val) => {
108
- this.dataColls[name] = [];
109
- this.dataColls[name].push(val);
110
- });
111
- startIndex += 5;
112
- while (startIndex > -1 && startIndex < content.length)
113
- startIndex = this.readNext(content, startIndex);
114
- }
115
- readNext(content, startIndex) {
116
- const nextStartIndex = content.indexOf('$$$$', startIndex);
117
- if (nextStartIndex === -1) {
118
- return -1;
119
- }
120
- else {
121
- this.parse(content, startIndex, nextStartIndex, (name, val) => {
122
- this.dataColls[name].push(val);
123
- });
124
- }
125
- if (nextStartIndex > -1)
126
- return nextStartIndex + 5;
127
- return nextStartIndex;
128
- }
129
- parse(content, start, end, handler) {
130
- const molEnd = +content.indexOf('M END\n', start) + 7;
131
- let localEnd = start;
132
- this.dataColls['molecule'].push(content.substring(start, molEnd));
133
- start = molEnd;
134
- while (localEnd < end) {
135
- start = content.indexOf('> <', localEnd);
136
- if (start === -1)
137
- return;
138
- start += 3;
139
- localEnd = content.indexOf('>\n', start);
140
- if (localEnd === -1)
141
- return;
142
- const propertyName = content.substring(start, localEnd);
143
- start = localEnd + 2;
144
- localEnd = content.indexOf('\n', start);
145
- if (localEnd === -1)
146
- localEnd = end;
147
- else if (content[localEnd + 1] != '\n')
148
- localEnd = content.indexOf('\n', localEnd + 1);
149
- handler(propertyName, content.substring(start, localEnd));
150
- localEnd += 2;
151
- }
152
- }
153
- }
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ub21lci1saWJyYXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibW9ub21lci1saWJyYXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLDJEQUEyRDtBQUMzRCxNQUFNLE9BQU8sY0FBYztJQVd6QixZQUFZLEdBQVc7UUFSZixrQkFBYSxHQUFhO1lBQ2hDLFVBQVUsRUFBRSxhQUFhLEVBQUUsMEJBQTBCLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsZUFBZTtTQUNwSCxDQUFDO1FBRU0sWUFBTyxHQUFtQixFQUFFLENBQUM7UUFFN0IsYUFBUSxHQUFhLEVBQUUsQ0FBQztRQUc5QixNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO2dCQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUU3RixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO2dCQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDdEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FB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LENBQUMsQ0FBQztnQkFDakIsUUFBUSxHQUFHLEdBQUcsQ0FBQztpQkFDWixJQUFJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSTtnQkFDcEMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVqRCxPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDMUQsUUFBUSxJQUFJLENBQUMsQ0FBQztTQUNmO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgTW9ub21lckVudHJ5ID0ge1xuICBtb2w6IHN0cmluZyxcbiAgdHlwZTogc3RyaW5nLFxuICBhbmFsb2d1ZUNvZGU6IHN0cmluZyxcbiAgbGlua2FnZXM6IHsgW2xpbms6IHN0cmluZ106IHsgYXRvbU51bWJlcjogbnVtYmVyLCB0eXBlOiBzdHJpbmcgfSB9XG59O1xuZXhwb3J0IHR5cGUgTW9ub21lckVudHJpZXMgPSB7IFtuYW1lOiBzdHJpbmddOiBNb25vbWVyRW50cnkgfTtcbmV4cG9ydCB0eXBlIExpbmtEYXRhID0geyBbbGluazogc3RyaW5nXTogeyBhdG9tTnVtYmVyOiBudW1iZXIsIHR5cGU6IHN0cmluZyB9IH07XG5cbi8qKiBIRUxNIGFzc29jaWF0ZWQgc2RmIGxpYnJhcmllcyB3aXRoIG1vbm9tZXIgcHJvY2Vzc2luZyovXG5leHBvcnQgY2xhc3MgTW9ub21lckxpYnJhcnkge1xuICBzdGF0aWMgbGliTmFtZSA9ICdtb25vbWVyTGlicmFyeSc7XG5cbiAgcHJpdmF0ZSBtb25vbWVyRmllbGRzOiBzdHJpbmdbXSA9IFtcbiAgICAnbW9sZWN1bGUnLCAnTW9ub21lclR5cGUnLCAnTW9ub21lck5hdHVyYWxBbmFsb2dDb2RlJywgJ01vbm9tZXJOYW1lJywgJ01vbm9tZXJDb2RlJywgJ01vbm9tZXJDYXBzJywgJ0JyYW5jaE1vbm9tZXInLFxuICBdO1xuXG4gIHByaXZhdGUgbGlicmFyeTogTW9ub21lckVudHJpZXMgPSB7fTtcblxuICBwcml2YXRlIG1vbm9tZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNkZjogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2RmUmVhZGVyID0gbmV3IFNERlJlYWRlcigpO1xuICAgIGNvbnN0IGRhdGEgPSBzZGZSZWFkZXIuZ2V0Q29sbHMoc2RmKTtcbiAgICB0aGlzLm1vbm9tZXJGaWVsZHMuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgaWYgKCEoZiBpbiBkYXRhKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb25vbWVyIGxpYnJhcnkgd2FzIG5vdCBjb21waWxlZDogJHtmfSBmaWVsZCBpcyBhYnNlbnQgaW4gcHJvdmlkZWQgZmlsZWApO1xuXG4gICAgICBpZiAoZGF0YVtmXS5sZW5ndGggIT0gZGF0YS5tb2xlY3VsZS5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9ub21lciBsaWJyYXJ5IHdhcyBub3QgY29tcGlsZWQ6ICR7Zn0gZmllbGQgaXMgbm90IHByZXNlbnRlZCBmb3IgZWFjaCBtb25vbWVyYCk7XG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubW9sZWN1bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpbmtEYXRhID0gdGhpcy5nZXRMaW5rRGF0YShkYXRhLm1vbGVjdWxlW2ldLCBkYXRhLk1vbm9tZXJDYXBzW2ldLCBkYXRhLk1vbm9tZXJOYW1lW2ldKTtcbiAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICBtb2w6IGRhdGEubW9sZWN1bGVbaV0sXG4gICAgICAgIHR5cGU6ICdQZXB0aWRlJyxcbiAgICAgICAgY29kZTogZGF0YS5Nb25vbWVyQ29kZVtpXSxcbiAgICAgICAgYW5hbG9ndWVDb2RlOiBkYXRhLk1vbm9tZXJOYXR1cmFsQW5hbG9nQ29kZVtpXSxcbiAgICAgICAgbGlua2FnZXM6IGxpbmtEYXRhLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbmFtZSA9IGRhdGEuTW9ub21lckNvZGVbaV0gIT09ICcuJyA/IGRhdGEuTW9ub21lckNvZGVbaV0gOiBkYXRhLk1vbm9tZXJOYW1lW2ldO1xuICAgICAgdGhpcy5saWJyYXJ5W25hbWVdID0gZW50cnk7XG4gICAgICB0aGlzLm1vbm9tZXJzLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGdldHRpbmcgZnVsbCBtb25vbWVyIGluZm9ybWF0aW9uIGZyb20gbW9ub21lciBsaWJyYXJ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm4ge01vbm9tZXJFbnRyeX1cbiAgICovXG4gIHB1YmxpYyBnZXRNb25vbWVyRW50cnkobmFtZTogc3RyaW5nKTogTW9ub21lckVudHJ5IHtcbiAgICBpZiAoIXRoaXMubW9ub21lcnMuaW5jbHVkZXMobmFtZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vbm9tZXIgbGlicmFyeSBkbyBub3QgY29udGFpbiAke25hbWV9IG1vbm9tZXJgKTtcblxuICAgIHJldHVybiB0aGlzLmxpYnJhcnlbbmFtZV07XG4gIH1cblxuICAvKiogZ2V0dGluZyBtb2wgYXMgc3RyaW5nIGZvciBtb25vbWVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHB1YmxpYyBnZXRNb25vbWVyTW9sKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLm1vbm9tZXJzLmluY2x1ZGVzKG5hbWUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb25vbWVyIGxpYnJhcnkgZG8gbm90IGNvbnRhaW4gJHtuYW1lfSBtb25vbWVyYCk7XG5cblxuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5saWJyYXJ5W25hbWVdO1xuICAgIGxldCBtb25vbWVyTW9sID0gZW50cnkubW9sLnJlcGxhY2UoL00gIFJHUCAgLitcXG4vLCAnJyk7XG5cbiAgICAvL29yZGVyIG1hdHRlcnNcbiAgICBjb25zdCBsaW5rcyA9IE9iamVjdC5rZXlzKGVudHJ5LmxpbmthZ2VzKTtcbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpXG4gICAgICBtb25vbWVyTW9sID0gbW9ub21lck1vbC5yZXBsYWNlKCdSIycsIGVudHJ5LmxpbmthZ2VzW2xpbmtdLnR5cGUgKyAnICcpO1xuXG5cbiAgICByZXR1cm4gbW9ub21lck1vbDtcbiAgfVxuXG4gIC8qKiBnZXR0aW5nIHRoZSBsaXN0IG9mIHRoZSBtaW5vbWVycyBhdmFpbGFibGUgaW4gbGlicmFyeSovXG4gIGdldCBtb25vbWVyTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm1vbm9tZXJzO1xuICB9XG5cbiAgc3RhdGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBNb25vbWVyTGlicmFyeS5saWJOYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMaW5rRGF0YShtb2w6IHN0cmluZywgY2Fwczogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBMaW5rRGF0YSB7XG4gICAgY29uc3QgcmF3RGF0YSA9IG1vbC5tYXRjaCgvTSAgUkdQICAuKy8pO1xuICAgIGlmIChyYXdEYXRhID09PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb25vbWVyIGxpYnJhcnkgd2FzIG5vdCBjb21waWxlZDogJHtuYW1lfSBlbnRyeSBoYXMgbm8gUkdQYCk7XG5cbiAgICBjb25zdCB0eXBlczogeyBbY29kZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBjYXBzLnNwbGl0KCdcXG4nKT8uZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgdHlwZXNbZS5tYXRjaCgvXFxkKy8pIVswXV0gPSBlLm1hdGNoKC8oPzw9XFxdKVxcdysvKSFbMF07XG4gICAgfSk7XG5cbiAgICBjb25zdCBkYXRhID0gcmF3RGF0YVswXS5yZXBsYWNlKCdNICBSR1AgICcsICcnKS5zcGxpdCgvXFxzKy8pO1xuICAgIGNvbnN0IHJlczogTGlua0RhdGEgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlSW50KGRhdGFbMF0pOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBwYXJzZUludChkYXRhWzIgKiBpICsgMl0pO1xuICAgICAgbGV0IHR5cGUgPSAnJztcbiAgICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICB0eXBlID0gJ04tdGVybWluYWwnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdHlwZSA9ICdDLXRlcm1pbmFsJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHR5cGUgPSAnYnJhbmNoJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlc1t0eXBlXSA9IHthdG9tTnVtYmVyOiBwYXJzZUludChkYXRhWzIgKiBpICsgMV0pLCB0eXBlOiB0eXBlc1tjb2RlXX07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuXG4vL1RPRE86IG1lcmdlIHdpdGggQ2hlbSB2ZXJzaW9uXG5jbGFzcyBTREZSZWFkZXIge1xuICBkYXRhQ29sbHM6IHsgW186IHN0cmluZ106IHN0cmluZyBbXSB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZGF0YUNvbGxzID0geydtb2xlY3VsZSc6IFtdfTtcbiAgfVxuXG4gIGdldENvbGxzKGNvbnRlbnQ6IHN0cmluZyk6IHsgW186IHN0cmluZ106IHN0cmluZ1tdIH0ge1xuICAgIHRoaXMucmVhZChjb250ZW50KTtcbiAgICByZXR1cm4gdGhpcy5kYXRhQ29sbHM7XG4gIH1cblxuICByZWFkKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoJ1xccicsICcnKTsgLy9lcXVhbGl6ZSBvbGQgYW5kIG5ldyBzZGYgc3RhbmRhcmRzXG4gICAgbGV0IHN0YXJ0SW5kZXggPSBjb250ZW50LmluZGV4T2YoJyQkJCQnLCAwKTtcbiAgICB0aGlzLnBhcnNlKGNvbnRlbnQsIDAsIHN0YXJ0SW5kZXgsIChuYW1lOiBzdHJpbmcsIHZhbDogc3RyaW5nKTogdm9pZCA9PiB7IC8vIFRPRE86IHR5cGVcbiAgICAgIHRoaXMuZGF0YUNvbGxzW25hbWVdID0gW107XG4gICAgICB0aGlzLmRhdGFDb2xsc1tuYW1lXS5wdXNoKHZhbCk7XG4gICAgfSk7XG4gICAgc3RhcnRJbmRleCArPSA1O1xuICAgIHdoaWxlIChzdGFydEluZGV4ID4gLTEgJiYgc3RhcnRJbmRleCA8IGNvbnRlbnQubGVuZ3RoKVxuICAgICAgc3RhcnRJbmRleCA9IHRoaXMucmVhZE5leHQoY29udGVudCwgc3RhcnRJbmRleCk7XG4gIH1cblxuICByZWFkTmV4dChjb250ZW50OiBzdHJpbmcsIHN0YXJ0SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgbmV4dFN0YXJ0SW5kZXggPSBjb250ZW50LmluZGV4T2YoJyQkJCQnLCBzdGFydEluZGV4KTtcbiAgICBpZiAobmV4dFN0YXJ0SW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyc2UoY29udGVudCwgc3RhcnRJbmRleCwgbmV4dFN0YXJ0SW5kZXgsXG4gICAgICAgIChuYW1lOiBzdHJpbmcsIHZhbDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5kYXRhQ29sbHNbbmFtZV0ucHVzaCh2YWwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFN0YXJ0SW5kZXggPiAtMSlcbiAgICAgIHJldHVybiBuZXh0U3RhcnRJbmRleCArIDU7XG5cblxuICAgIHJldHVybiBuZXh0U3RhcnRJbmRleDtcbiAgfVxuXG4gIHBhcnNlKGNvbnRlbnQ6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIGhhbmRsZXI6IChuYW1lOiBzdHJpbmcsIHZhbDogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgbW9sRW5kID0gK2NvbnRlbnQuaW5kZXhPZignTSAgRU5EXFxuJywgc3RhcnQpICsgNztcbiAgICBsZXQgbG9jYWxFbmQgPSBzdGFydDtcbiAgICB0aGlzLmRhdGFDb2xsc1snbW9sZWN1bGUnXS5wdXNoKGNvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBtb2xFbmQpKTtcblxuICAgIHN0YXJ0ID0gbW9sRW5kO1xuICAgIHdoaWxlIChsb2NhbEVuZCA8IGVuZCkge1xuICAgICAgc3RhcnQgPSBjb250ZW50LmluZGV4T2YoJz4gPCcsIGxvY2FsRW5kKTtcbiAgICAgIGlmIChzdGFydCA9PT0gLTEpXG4gICAgICAgIHJldHVybjtcblxuXG4gICAgICBzdGFydCArPSAzO1xuICAgICAgbG9jYWxFbmQgPSBjb250ZW50LmluZGV4T2YoJz5cXG4nLCBzdGFydCk7XG4gICAgICBpZiAobG9jYWxFbmQgPT09IC0xKVxuICAgICAgICByZXR1cm47XG5cblxuICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGxvY2FsRW5kKTtcbiAgICAgIHN0YXJ0ID0gbG9jYWxFbmQgKyAyO1xuXG4gICAgICBsb2NhbEVuZCA9IGNvbnRlbnQuaW5kZXhPZignXFxuJywgc3RhcnQpO1xuICAgICAgaWYgKGxvY2FsRW5kID09PSAtMSlcbiAgICAgICAgbG9jYWxFbmQgPSBlbmQ7XG4gICAgICBlbHNlIGlmIChjb250ZW50W2xvY2FsRW5kICsgMV0gIT0gJ1xcbicpXG4gICAgICAgIGxvY2FsRW5kID0gY29udGVudC5pbmRleE9mKCdcXG4nLCBsb2NhbEVuZCArIDEpO1xuXG4gICAgICBoYW5kbGVyKHByb3BlcnR5TmFtZSwgY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGxvY2FsRW5kKSk7XG4gICAgICBsb2NhbEVuZCArPSAyO1xuICAgIH1cbiAgfVxufVxuIl19