UNPKG

31.1 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4// tslint:disable ban-types no-bitwise
5const ts_utils_1 = require("@neo-one/ts-utils");
6const path = tslib_1.__importStar(require("path"));
7exports.getGlobals = (program, typeChecker) => {
8 const bufferFile = ts_utils_1.tsUtils.file.getSourceFile(program, require.resolve('@types/node/index.d.ts'));
9 if (bufferFile === undefined) {
10 throw new Error('Could not find Buffer');
11 }
12 const neoFile = ts_utils_1.tsUtils.file.getSourceFile(program, path.resolve(path.dirname(require.resolve('@neo-one/smart-contract')), 'index.d.ts'));
13 if (neoFile === undefined) {
14 throw new Error('Could not find NEO type definition file');
15 }
16 const neoGlobal = ts_utils_1.tsUtils.statement.getNamespaceOrThrow(neoFile, 'global');
17 const buffer = ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(bufferFile, 'Buffer'));
18 const bufferVar = ts_utils_1.tsUtils.type_.getSymbolOrThrow(ts_utils_1.tsUtils.type_.getType(typeChecker, ts_utils_1.tsUtils.statement.getVariableDeclarationOrThrow(bufferFile, 'Buffer')));
19 return {
20 Array: ts_utils_1.tsUtils.type_.getSymbolOrThrow(ts_utils_1.tsUtils.types.getArrayType(typeChecker)),
21 Buffer: buffer,
22 BufferFrom: ts_utils_1.tsUtils.symbol.getMemberOrThrow(bufferVar, 'from'),
23 BufferEquals: ts_utils_1.tsUtils.symbol.getMemberOrThrow(buffer, 'equals'),
24 process: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getVariableDeclarationOrThrow(bufferFile, 'process')),
25 AccountBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'AccountBase')),
26 AssetBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'AssetBase')),
27 AttributeBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'AttributeBase')),
28 BlockBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'BlockBase')),
29 ContractBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'ContractBase')),
30 HeaderBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'HeaderBase')),
31 InputBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'InputBase')),
32 OutputBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'OutputBase')),
33 TransactionBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'TransactionBase')),
34 ValidatorBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'ValidatorBase')),
35 StorageContextBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'StorageContextBase')),
36 StorageContextReadOnlyBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'StorageContextReadOnlyBase')),
37 StorageIteratorBase: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getInterfaceOrThrow(neoGlobal, 'StorageIteratorBase')),
38 syscall: ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getFunctionOrThrow(neoGlobal, 'syscall'))
39 };
40};
41const findLibFile = (program) => {
42 const files = program.getSourceFiles();
43 return files.find(file => ts_utils_1.tsUtils.statement.getClass(file, 'MapStorage') !== undefined);
44};
45exports.getLibs = (program, typeChecker) => {
46 const libFileIn = findLibFile(program);
47 if (libFileIn === undefined) {
48 throw new Error('Could not find NEO lib file');
49 }
50 const libFile = libFileIn;
51 return {
52 get SmartContract() {
53 return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getClassOrThrow(libFile, 'SmartContract'));
54 },
55 get MapStorage() {
56 return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getClassOrThrow(libFile, 'MapStorage'));
57 },
58 get SetStorage() {
59 return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getClassOrThrow(libFile, 'SetStorage'));
60 },
61 get Fixed() {
62 return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Fixed'));
63 },
64 get constant() {
65 return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getFunctionOrThrow(libFile, 'constant'));
66 },
67 get verify() {
68 return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getFunctionOrThrow(libFile, 'verify'));
69 },
70 get createEventHandler() {
71 return ts_utils_1.tsUtils.node.getSymbolOrThrow(typeChecker, ts_utils_1.tsUtils.statement.getFunctionOrThrow(libFile, 'createEventHandler'));
72 }
73 };
74};
75exports.getLibAliases = (program, languageService) => {
76 const libFileIn = findLibFile(program);
77 if (libFileIn === undefined) {
78 throw new Error('Could not find NEO lib file');
79 }
80 const libFile = libFileIn;
81 let aliases = {};
82 return {
83 get Address() {
84 if (aliases.Address === undefined) {
85 // tslint:disable-next-line no-object-mutation
86 aliases.Address = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Address')));
87 }
88 return aliases.Address;
89 },
90 get Hash256() {
91 if (aliases.Hash256 === undefined) {
92 // tslint:disable-next-line no-object-mutation
93 aliases.Hash256 = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Hash256')));
94 }
95 return aliases.Hash256;
96 },
97 get Signature() {
98 if (aliases.Signature === undefined) {
99 // tslint:disable-next-line no-object-mutation
100 aliases.Signature = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Signature')));
101 }
102 return aliases.Signature;
103 },
104 get PublicKey() {
105 if (aliases.PublicKey === undefined) {
106 // tslint:disable-next-line no-object-mutation
107 aliases.PublicKey = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'PublicKey')));
108 }
109 return aliases.PublicKey;
110 },
111 get Fixed() {
112 if (aliases.Fixed === undefined) {
113 // tslint:disable-next-line no-object-mutation
114 aliases.Fixed = new Set(ts_utils_1.tsUtils.reference.findReferencesAsNodes(program, languageService, ts_utils_1.tsUtils.statement.getTypeAliasOrThrow(libFile, 'Fixed')));
115 }
116 return aliases.Fixed;
117 },
118 reset() {
119 aliases = {};
120 }
121 };
122};
123
124//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN5bWJvbHMudHMiXSwibmFtZXMiOlsiZ2V0R2xvYmFscyIsInByb2dyYW0iLCJ0eXBlQ2hlY2tlciIsImJ1ZmZlckZpbGUiLCJ0c1V0aWxzIiwiZmlsZSIsImdldFNvdXJjZUZpbGUiLCJyZXF1aXJlIiwicmVzb2x2ZSIsInVuZGVmaW5lZCIsIkVycm9yIiwibmVvRmlsZSIsInBhdGgiLCJkaXJuYW1lIiwibmVvR2xvYmFsIiwic3RhdGVtZW50IiwiZ2V0TmFtZXNwYWNlT3JUaHJvdyIsImJ1ZmZlciIsIm5vZGUiLCJnZXRTeW1ib2xPclRocm93IiwiZ2V0SW50ZXJmYWNlT3JUaHJvdyIsImJ1ZmZlclZhciIsInR5cGVfIiwiZ2V0VHlwZSIsImdldFZhcmlhYmxlRGVjbGFyYXRpb25PclRocm93IiwiQXJyYXkiLCJ0eXBlcyIsImdldEFycmF5VHlwZSIsIkJ1ZmZlciIsIkJ1ZmZlckZyb20iLCJzeW1ib2wiLCJnZXRNZW1iZXJPclRocm93IiwiQnVmZmVyRXF1YWxzIiwicHJvY2VzcyIsIkFjY291bnRCYXNlIiwiQXNzZXRCYXNlIiwiQXR0cmlidXRlQmFzZSIsIkJsb2NrQmFzZSIsIkNvbnRyYWN0QmFzZSIsIkhlYWRlckJhc2UiLCJJbnB1dEJhc2UiLCJPdXRwdXRCYXNlIiwiVHJhbnNhY3Rpb25CYXNlIiwiVmFsaWRhdG9yQmFzZSIsIlN0b3JhZ2VDb250ZXh0QmFzZSIsIlN0b3JhZ2VDb250ZXh0UmVhZE9ubHlCYXNlIiwiU3RvcmFnZUl0ZXJhdG9yQmFzZSIsInN5c2NhbGwiLCJnZXRGdW5jdGlvbk9yVGhyb3ciLCJmaW5kTGliRmlsZSIsImZpbGVzIiwiZ2V0U291cmNlRmlsZXMiLCJmaW5kIiwiZ2V0Q2xhc3MiLCJnZXRMaWJzIiwibGliRmlsZUluIiwibGliRmlsZSIsIlNtYXJ0Q29udHJhY3QiLCJnZXRDbGFzc09yVGhyb3ciLCJNYXBTdG9yYWdlIiwiU2V0U3RvcmFnZSIsIkZpeGVkIiwiZ2V0VHlwZUFsaWFzT3JUaHJvdyIsImNvbnN0YW50IiwidmVyaWZ5IiwiY3JlYXRlRXZlbnRIYW5kbGVyIiwiZ2V0TGliQWxpYXNlcyIsImxhbmd1YWdlU2VydmljZSIsImFsaWFzZXMiLCJBZGRyZXNzIiwiU2V0IiwicmVmZXJlbmNlIiwiZmluZFJlZmVyZW5jZXNBc05vZGVzIiwiSGFzaDI1NiIsIlNpZ25hdHVyZSIsIlB1YmxpY0tleSIsInJlc2V0Il0sIm1hcHBpbmdzIjoiOzs7QUFBQSxzQ0FBQTtBQUNBLGdEQUFBO0FBQ0EsbURBQUE7QUF5QmFBLFFBQUFBLFVBQVUsR0FBRyxDQUFDQyxPQUFELEVBQXNCQyxXQUF0QixFQUFBLEVBQUE7SUFDeEIsTUFBTUMsVUFBVSxHQUFHQyxrQkFBTyxDQUFDQyxJQUFSLENBQWFDLGFBQWIsQ0FBMkJMLE9BQTNCLEVBQW9DTSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0Isd0JBQWhCLENBQXBDLENBQW5CLENBQUE7SUFDQSxJQUFJTCxVQUFVLEtBQUtNLFNBQW5CLEVBQThCO1FBQzVCLE1BQU0sSUFBSUMsS0FBSixDQUFVLHVCQUFWLENBQU4sQ0FBQTtLQUNEO0lBQ0QsTUFBTUMsT0FBTyxHQUFHUCxrQkFBTyxDQUFDQyxJQUFSLENBQWFDLGFBQWIsQ0FDZEwsT0FEYyxFQUVkVyxJQUFJLENBQUNKLE9BQUwsQ0FBYUksSUFBSSxDQUFDQyxPQUFMLENBQWFOLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQix5QkFBaEIsQ0FBYixDQUFiLEVBQXVFLFlBQXZFLENBRmMsQ0FBaEIsQ0FBQTtJQUlBLElBQUlHLE9BQU8sS0FBS0YsU0FBaEIsRUFBMkI7UUFDekIsTUFBTSxJQUFJQyxLQUFKLENBQVUseUNBQVYsQ0FBTixDQUFBO0tBQ0Q7SUFFRCxNQUFNSSxTQUFTLEdBQUdWLGtCQUFPLENBQUNXLFNBQVIsQ0FBa0JDLG1CQUFsQixDQUFzQ0wsT0FBdEMsRUFBK0MsUUFBL0MsQ0FBbEIsQ0FBQTtJQUVBLE1BQU1NLE1BQU0sR0FBR2Isa0JBQU8sQ0FBQ2MsSUFBUixDQUFhQyxnQkFBYixDQUNiakIsV0FEYSxFQUViRSxrQkFBTyxD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T0FBdEMsRUFBK0MsV0FBL0MsQ0FIMEIsQ0FBUixDQUFwQixDQUFBO2FBS0Q7WUFFRCxPQUFPWSxPQUFPLENBQUNNLFNBQWYsQ0FBQTtRQUNELENBcENJO1FBcUNMLElBQUlDLFNBQUo7WUFDRSxJQUFJUCxPQUFPLENBQUNPLFNBQVIsS0FBc0JsRSxTQUExQixFQUFxQztnQkFDbkMsOENBQUE7Z0JBQ0EyRCxPQUFPLENBQUNPLFNBQVIsR0FBb0IsSUFBSUwsR0FBSixDQUFRbEUsa0JBQU8sQ0FBQ21FLFNBQVIsQ0FBa0JDLHFCQUFsQixDQUMxQnZFLE9BRDBCLEVBRTFCa0UsZUFGMEIsRUFHMUIvRCxrQkFBTyxDQUFDVyxTQUFSLENBQWtCK0MsbUJBQWxCLENBQXNDTixPQUF0QyxFQUErQyxXQUEvQyxDQUgwQixDQUFSLENBQXBCLENBQUE7YUFLRDtZQUVELE9BQU9ZLE9BQU8sQ0FBQ08sU0FBZixDQUFBO1FBQ0QsQ0FoREk7UUFpREwsSUFBSWQsS0FBSjtZQUNFLElBQUlPLE9BQU8sQ0FBQ1AsS0FBUixLQUFrQnBELFNBQXRCLEVBQWlDO2dCQUMvQiw4Q0FBQTtnQkFDQTJELE9BQU8sQ0FBQ1AsS0FBUixHQUFnQixJQUFJUyxHQUFKLENBQVFsRSxrQkFBTyxDQUFDbUUsU0FBUixDQUFrQkMscUJBQWxCLENBQ3RCdkUsT0FEc0IsRUFFdEJrRSxlQUZzQixFQUd0Qi9ELGtCQUFPLENBQUNXLFNBQVIsQ0FBa0IrQyxtQkFBbEIsQ0FBc0NOLE9BQXRDLEVBQStDLE9BQS9DLENBSHNCLENBQVIsQ0FBaEIsQ0FBQTthQUtEO1lBRUQsT0FBT1ksT0FBTyxDQUFDUCxLQUFmLENBQUE7UUFDRCxDQTVESTtRQTZETGUsS0FBSztZQUNIUixPQUFPLEdBQUcsRUFBVixDQUFBO1FBQ0QsQ0FBQTtLQS9ESCxDQUFBO0FBaUVELENBM0VNLENBQUEiLCJmaWxlIjoibmVvLW9uZS1zbWFydC1jb250cmFjdC1jb21waWxlci9zcmMvc3ltYm9scy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlIGJhbi10eXBlcyBuby1iaXR3aXNlXG5pbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuZXhwb3J0IGludGVyZmFjZSBHbG9iYWxzIHtcbiAgcmVhZG9ubHkgQXJyYXk6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQnVmZmVyOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IEJ1ZmZlckZyb206IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQnVmZmVyRXF1YWxzOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IHByb2Nlc3M6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQWNjb3VudEJhc2U6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQXNzZXRCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IEF0dHJpYnV0ZUJhc2U6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgQmxvY2tCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IENvbnRyYWN0QmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBIZWFkZXJCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IElucHV0QmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBPdXRwdXRCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IFRyYW5zYWN0aW9uQmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBWYWxpZGF0b3JCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IFN0b3JhZ2VDb250ZXh0QmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBTdG9yYWdlQ29udGV4dFJlYWRPbmx5QmFzZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBTdG9yYWdlSXRlcmF0b3JCYXNlOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IHN5c2NhbGw6IHRzLlN5bWJvbDtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEdsb2JhbHMgPSAocHJvZ3JhbTogdHMuUHJvZ3JhbSwgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyKTogR2xvYmFscyA9PiB7XG4gIGNvbnN0IGJ1ZmZlckZpbGUgPSB0c1V0aWxzLmZpbGUuZ2V0U291cmNlRmlsZShwcm9ncmFtLCByZXF1aXJlLnJlc29sdmUoJ0B0eXBlcy9ub2RlL2luZGV4LmQudHMnKSk7XG4gIGlmIChidWZmZXJGaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIEJ1ZmZlcicpO1xuICB9XG4gIGNvbnN0IG5lb0ZpbGUgPSB0c1V0aWxzLmZpbGUuZ2V0U291cmNlRmlsZShcbiAgICBwcm9ncmFtLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKCdAbmVvLW9uZS9zbWFydC1jb250cmFjdCcpKSwgJ2luZGV4LmQudHMnKSxcbiAgKTtcbiAgaWYgKG5lb0ZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgTkVPIHR5cGUgZGVmaW5pdGlvbiBmaWxlJyk7XG4gIH1cblxuICBjb25zdCBuZW9HbG9iYWwgPSB0c1V0aWxzLnN0YXRlbWVudC5nZXROYW1lc3BhY2VPclRocm93KG5lb0ZpbGUsICdnbG9iYWwnKTtcblxuICBjb25zdCBidWZmZXIgPSB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICB0eXBlQ2hlY2tlcixcbiAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KGJ1ZmZlckZpbGUsICdCdWZmZXInKSxcbiAgKTtcblxuICBjb25zdCBidWZmZXJWYXIgPSB0c1V0aWxzLnR5cGVfLmdldFN5bWJvbE9yVGhyb3coXG4gICAgdHNVdGlscy50eXBlXy5nZXRUeXBlKHR5cGVDaGVja2VyLCB0c1V0aWxzLnN0YXRlbWVudC5nZXRWYXJpYWJsZURlY2xhcmF0aW9uT3JUaHJvdyhidWZmZXJGaWxlLCAnQnVmZmVyJykpLFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgQXJyYXk6IHRzVXRpbHMudHlwZV8uZ2V0U3ltYm9sT3JUaHJvdyh0c1V0aWxzLnR5cGVzLmdldEFycmF5VHlwZSh0eXBlQ2hlY2tlcikpLFxuICAgIEJ1ZmZlcjogYnVmZmVyLFxuICAgIEJ1ZmZlckZyb206IHRzVXRpbHMuc3ltYm9sLmdldE1lbWJlck9yVGhyb3coYnVmZmVyVmFyLCAnZnJvbScpLFxuICAgIEJ1ZmZlckVxdWFsczogdHNVdGlscy5zeW1ib2wuZ2V0TWVtYmVyT3JUaHJvdyhidWZmZXIsICdlcXVhbHMnKSxcbiAgICBwcm9jZXNzOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbk9yVGhyb3coYnVmZmVyRmlsZSwgJ3Byb2Nlc3MnKSxcbiAgICApLFxuICAgIEFjY291bnRCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdBY2NvdW50QmFzZScpLFxuICAgICksXG4gICAgQXNzZXRCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdBc3NldEJhc2UnKSxcbiAgICApLFxuICAgIEF0dHJpYnV0ZUJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ0F0dHJpYnV0ZUJhc2UnKSxcbiAgICApLFxuICAgIEJsb2NrQmFzZTogdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3coXG4gICAgICB0eXBlQ2hlY2tlcixcbiAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldEludGVyZmFjZU9yVGhyb3cobmVvR2xvYmFsLCAnQmxvY2tCYXNlJyksXG4gICAgKSxcbiAgICBDb250cmFjdEJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ0NvbnRyYWN0QmFzZScpLFxuICAgICksXG4gICAgSGVhZGVyQmFzZTogdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3coXG4gICAgICB0eXBlQ2hlY2tlcixcbiAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldEludGVyZmFjZU9yVGhyb3cobmVvR2xvYmFsLCAnSGVhZGVyQmFzZScpLFxuICAgICksXG4gICAgSW5wdXRCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdJbnB1dEJhc2UnKSxcbiAgICApLFxuICAgIE91dHB1dEJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ091dHB1dEJhc2UnKSxcbiAgICApLFxuICAgIFRyYW5zYWN0aW9uQmFzZTogdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3coXG4gICAgICB0eXBlQ2hlY2tlcixcbiAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldEludGVyZmFjZU9yVGhyb3cobmVvR2xvYmFsLCAnVHJhbnNhY3Rpb25CYXNlJyksXG4gICAgKSxcbiAgICBWYWxpZGF0b3JCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdWYWxpZGF0b3JCYXNlJyksXG4gICAgKSxcbiAgICBTdG9yYWdlQ29udGV4dEJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ1N0b3JhZ2VDb250ZXh0QmFzZScpLFxuICAgICksXG4gICAgU3RvcmFnZUNvbnRleHRSZWFkT25seUJhc2U6IHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgdHlwZUNoZWNrZXIsXG4gICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRJbnRlcmZhY2VPclRocm93KG5lb0dsb2JhbCwgJ1N0b3JhZ2VDb250ZXh0UmVhZE9ubHlCYXNlJyksXG4gICAgKSxcbiAgICBTdG9yYWdlSXRlcmF0b3JCYXNlOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyhcbiAgICAgIHR5cGVDaGVja2VyLFxuICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0SW50ZXJmYWNlT3JUaHJvdyhuZW9HbG9iYWwsICdTdG9yYWdlSXRlcmF0b3JCYXNlJyksXG4gICAgKSxcbiAgICBzeXNjYWxsOiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyh0eXBlQ2hlY2tlciwgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0RnVuY3Rpb25PclRocm93KG5lb0dsb2JhbCwgJ3N5c2NhbGwnKSksXG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExpYnMge1xuICByZWFkb25seSBTbWFydENvbnRyYWN0OiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IE1hcFN0b3JhZ2U6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgU2V0U3RvcmFnZTogdHMuU3ltYm9sO1xuICByZWFkb25seSBGaXhlZDogdHMuU3ltYm9sO1xuICByZWFkb25seSBjb25zdGFudDogdHMuU3ltYm9sO1xuICByZWFkb25seSB2ZXJpZnk6IHRzLlN5bWJvbDtcbiAgcmVhZG9ubHkgY3JlYXRlRXZlbnRIYW5kbGVyOiB0cy5TeW1ib2w7XG59XG5cbmNvbnN0IGZpbmRMaWJGaWxlID0gKHByb2dyYW06IHRzLlByb2dyYW0pOiB0cy5Tb3VyY2VGaWxlIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZmlsZXMgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCk7XG5cbiAgcmV0dXJuIGZpbGVzLmZpbmQoKGZpbGUpID0+IHRzVXRpbHMuc3RhdGVtZW50LmdldENsYXNzKGZpbGUsICdNYXBTdG9yYWdlJykgIT09IHVuZGVmaW5lZCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGlicyA9IChwcm9ncmFtOiB0cy5Qcm9ncmFtLCB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXIpOiBMaWJzID0+IHtcbiAgY29uc3QgbGliRmlsZUluID0gZmluZExpYkZpbGUocHJvZ3JhbSk7XG4gIGlmIChsaWJGaWxlSW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgTkVPIGxpYiBmaWxlJyk7XG4gIH1cblxuICBjb25zdCBsaWJGaWxlID0gbGliRmlsZUluO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0IFNtYXJ0Q29udHJhY3QoKTogdHMuU3ltYm9sIHtcbiAgICAgIHJldHVybiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyh0eXBlQ2hlY2tlciwgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0Q2xhc3NPclRocm93KGxpYkZpbGUsICdTbWFydENvbnRyYWN0JykpO1xuICAgIH0sXG4gICAgZ2V0IE1hcFN0b3JhZ2UoKTogdHMuU3ltYm9sIHtcbiAgICAgIHJldHVybiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyh0eXBlQ2hlY2tlciwgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0Q2xhc3NPclRocm93KGxpYkZpbGUsICdNYXBTdG9yYWdlJykpO1xuICAgIH0sXG4gICAgZ2V0IFNldFN0b3JhZ2UoKTogdHMuU3ltYm9sIHtcbiAgICAgIHJldHVybiB0c1V0aWxzLm5vZGUuZ2V0U3ltYm9sT3JUaHJvdyh0eXBlQ2hlY2tlciwgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0Q2xhc3NPclRocm93KGxpYkZpbGUsICdTZXRTdG9yYWdlJykpO1xuICAgIH0sXG4gICAgZ2V0IEZpeGVkKCk6IHRzLlN5bWJvbCB7XG4gICAgICByZXR1cm4gdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3codHlwZUNoZWNrZXIsIHRzVXRpbHMuc3RhdGVtZW50LmdldFR5cGVBbGlhc09yVGhyb3cobGliRmlsZSwgJ0ZpeGVkJykpO1xuICAgIH0sXG4gICAgZ2V0IGNvbnN0YW50KCk6IHRzLlN5bWJvbCB7XG4gICAgICByZXR1cm4gdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3codHlwZUNoZWNrZXIsIHRzVXRpbHMuc3RhdGVtZW50LmdldEZ1bmN0aW9uT3JUaHJvdyhsaWJGaWxlLCAnY29uc3RhbnQnKSk7XG4gICAgfSxcbiAgICBnZXQgdmVyaWZ5KCk6IHRzLlN5bWJvbCB7XG4gICAgICByZXR1cm4gdHNVdGlscy5ub2RlLmdldFN5bWJvbE9yVGhyb3codHlwZUNoZWNrZXIsIHRzVXRpbHMuc3RhdGVtZW50LmdldEZ1bmN0aW9uT3JUaHJvdyhsaWJGaWxlLCAndmVyaWZ5JykpO1xuICAgIH0sXG4gICAgZ2V0IGNyZWF0ZUV2ZW50SGFuZGxlcigpOiB0cy5TeW1ib2wge1xuICAgICAgcmV0dXJuIHRzVXRpbHMubm9kZS5nZXRTeW1ib2xPclRocm93KFxuICAgICAgICB0eXBlQ2hlY2tlcixcbiAgICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0RnVuY3Rpb25PclRocm93KGxpYkZpbGUsICdjcmVhdGVFdmVudEhhbmRsZXInKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGliQWxpYXNlcyB7XG4gIHJlYWRvbmx5IEFkZHJlc3M6IFNldDx0cy5JZGVudGlmaWVyPjtcbiAgcmVhZG9ubHkgSGFzaDI1NjogU2V0PHRzLklkZW50aWZpZXI+O1xuICByZWFkb25seSBTaWduYXR1cmU6IFNldDx0cy5JZGVudGlmaWVyPjtcbiAgcmVhZG9ubHkgUHVibGljS2V5OiBTZXQ8dHMuSWRlbnRpZmllcj47XG4gIHJlYWRvbmx5IEZpeGVkOiBTZXQ8dHMuSWRlbnRpZmllcj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGliQWxpYXNlc1dpdGhSZXNldCBleHRlbmRzIExpYkFsaWFzZXMge1xuICByZWFkb25seSByZXNldDogKCkgPT4gdm9pZDtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUgcmVhZG9ubHkta2V5d29yZFxuaW50ZXJmYWNlIExpYkFsaWFzZXNPcHRpb25hbCB7XG4gIEFkZHJlc3M/OiBTZXQ8dHMuSWRlbnRpZmllcj47XG4gIEhhc2gyNTY/OiBTZXQ8dHMuSWRlbnRpZmllcj47XG4gIFNpZ25hdHVyZT86IFNldDx0cy5JZGVudGlmaWVyPjtcbiAgUHVibGljS2V5PzogU2V0PHRzLklkZW50aWZpZXI+O1xuICBGaXhlZD86IFNldDx0cy5JZGVudGlmaWVyPjtcbn1cbi8vIHRzbGludDplbmFibGUgcmVhZG9ubHkta2V5d29yZFxuXG5leHBvcnQgY29uc3QgZ2V0TGliQWxpYXNlcyA9IChwcm9ncmFtOiB0cy5Qcm9ncmFtLCBsYW5ndWFnZVNlcnZpY2U6IHRzLkxhbmd1YWdlU2VydmljZSk6IExpYkFsaWFzZXNXaXRoUmVzZXQgPT4ge1xuICBjb25zdCBsaWJGaWxlSW4gPSBmaW5kTGliRmlsZShwcm9ncmFtKTtcbiAgaWYgKGxpYkZpbGVJbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBORU8gbGliIGZpbGUnKTtcbiAgfVxuXG4gIGNvbnN0IGxpYkZpbGUgPSBsaWJGaWxlSW47XG5cbiAgbGV0IGFsaWFzZXM6IExpYkFsaWFzZXNPcHRpb25hbCA9IHt9O1xuXG4gIHJldHVybiB7XG4gICAgZ2V0IEFkZHJlc3MoKSB7XG4gICAgICBpZiAoYWxpYXNlcy5BZGRyZXNzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW9iamVjdC1tdXRhdGlvblxuICAgICAgICBhbGlhc2VzLkFkZHJlc3MgPSBuZXcgU2V0KHRzVXRpbHMucmVmZXJlbmNlLmZpbmRSZWZlcmVuY2VzQXNOb2RlcyhcbiAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICAgICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRUeXBlQWxpYXNPclRocm93KGxpYkZpbGUsICdBZGRyZXNzJyksXG4gICAgICAgICkgYXMgdHMuSWRlbnRpZmllcltdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsaWFzZXMuQWRkcmVzcztcbiAgICB9LFxuICAgIGdldCBIYXNoMjU2KCkge1xuICAgICAgaWYgKGFsaWFzZXMuSGFzaDI1NiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1vYmplY3QtbXV0YXRpb25cbiAgICAgICAgYWxpYXNlcy5IYXNoMjU2ID0gbmV3IFNldCh0c1V0aWxzLnJlZmVyZW5jZS5maW5kUmVmZXJlbmNlc0FzTm9kZXMoXG4gICAgICAgICAgcHJvZ3JhbSxcbiAgICAgICAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0VHlwZUFsaWFzT3JUaHJvdyhsaWJGaWxlLCAnSGFzaDI1NicpLFxuICAgICAgICApIGFzIHRzLklkZW50aWZpZXJbXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGlhc2VzLkhhc2gyNTY7XG4gICAgfSxcbiAgICBnZXQgU2lnbmF0dXJlKCkge1xuICAgICAgaWYgKGFsaWFzZXMuU2lnbmF0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLW9iamVjdC1tdXRhdGlvblxuICAgICAgICBhbGlhc2VzLlNpZ25hdHVyZSA9IG5ldyBTZXQodHNVdGlscy5yZWZlcmVuY2UuZmluZFJlZmVyZW5jZXNBc05vZGVzKFxuICAgICAgICAgIHByb2dyYW0sXG4gICAgICAgICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgICAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldFR5cGVBbGlhc09yVGhyb3cobGliRmlsZSwgJ1NpZ25hdHVyZScpLFxuICAgICAgICApIGFzIHRzLklkZW50aWZpZXJbXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGlhc2VzLlNpZ25hdHVyZTtcbiAgICB9LFxuICAgIGdldCBQdWJsaWNLZXkoKSB7XG4gICAgICBpZiAoYWxpYXNlcy5QdWJsaWNLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tb2JqZWN0LW11dGF0aW9uXG4gICAgICAgIGFsaWFzZXMuUHVibGljS2V5ID0gbmV3IFNldCh0c1V0aWxzLnJlZmVyZW5jZS5maW5kUmVmZXJlbmNlc0FzTm9kZXMoXG4gICAgICAgICAgcHJvZ3JhbSxcbiAgICAgICAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgICAgICAgdHNVdGlscy5zdGF0ZW1lbnQuZ2V0VHlwZUFsaWFzT3JUaHJvdyhsaWJGaWxlLCAnUHVibGljS2V5JyksXG4gICAgICAgICkgYXMgdHMuSWRlbnRpZmllcltdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsaWFzZXMuUHVibGljS2V5O1xuICAgIH0sXG4gICAgZ2V0IEZpeGVkKCkge1xuICAgICAgaWYgKGFsaWFzZXMuRml4ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tb2JqZWN0LW11dGF0aW9uXG4gICAgICAgIGFsaWFzZXMuRml4ZWQgPSBuZXcgU2V0KHRzVXRpbHMucmVmZXJlbmNlLmZpbmRSZWZlcmVuY2VzQXNOb2RlcyhcbiAgICAgICAgICBwcm9ncmFtLFxuICAgICAgICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICAgICAgICB0c1V0aWxzLnN0YXRlbWVudC5nZXRUeXBlQWxpYXNPclRocm93KGxpYkZpbGUsICdGaXhlZCcpLFxuICAgICAgICApIGFzIHRzLklkZW50aWZpZXJbXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhbGlhc2VzLkZpeGVkO1xuICAgIH0sXG4gICAgcmVzZXQoKSB7XG4gICAgICBhbGlhc2VzID0ge307XG4gICAgfSxcbiAgfTtcbn07XG4iXX0=