parse-server 6.0.0-alpha.2 → 6.0.0-alpha.21
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.
- package/README.md +45 -17
- package/lib/AccountLockout.js +11 -26
- package/lib/Adapters/AdapterLoader.js +8 -14
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
- package/lib/Adapters/Auth/AuthAdapter.js +7 -16
- package/lib/Adapters/Auth/OAuth1Client.js +32 -57
- package/lib/Adapters/Auth/apple.js +6 -22
- package/lib/Adapters/Auth/facebook.js +7 -37
- package/lib/Adapters/Auth/gcenter.js +8 -37
- package/lib/Adapters/Auth/github.js +7 -10
- package/lib/Adapters/Auth/google.js +11 -34
- package/lib/Adapters/Auth/gpgames.js +5 -8
- package/lib/Adapters/Auth/httpsRequest.js +1 -7
- package/lib/Adapters/Auth/index.js +20 -65
- package/lib/Adapters/Auth/instagram.js +5 -9
- package/lib/Adapters/Auth/janraincapture.js +8 -12
- package/lib/Adapters/Auth/janrainengage.js +7 -11
- package/lib/Adapters/Auth/keycloak.js +5 -19
- package/lib/Adapters/Auth/ldap.js +1 -15
- package/lib/Adapters/Auth/line.js +7 -10
- package/lib/Adapters/Auth/linkedin.js +7 -12
- package/lib/Adapters/Auth/meetup.js +7 -10
- package/lib/Adapters/Auth/microsoft.js +7 -10
- package/lib/Adapters/Auth/oauth2.js +6 -18
- package/lib/Adapters/Auth/phantauth.js +8 -10
- package/lib/Adapters/Auth/qq.js +7 -13
- package/lib/Adapters/Auth/spotify.js +7 -14
- package/lib/Adapters/Auth/twitter.js +5 -15
- package/lib/Adapters/Auth/vkontakte.js +9 -15
- package/lib/Adapters/Auth/wechat.js +7 -10
- package/lib/Adapters/Auth/weibo.js +7 -11
- package/lib/Adapters/Cache/CacheAdapter.js +4 -12
- package/lib/Adapters/Cache/InMemoryCache.js +5 -19
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
- package/lib/Adapters/Cache/LRUCache.js +1 -11
- package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +46 -87
- package/lib/Adapters/Cache/SchemaCache.js +1 -6
- package/lib/Adapters/Email/MailAdapter.js +2 -7
- package/lib/Adapters/Files/FilesAdapter.js +7 -21
- package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
- package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
- package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
- package/lib/Adapters/Logger/WinstonLogger.js +3 -30
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
- package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
- package/lib/Adapters/PubSub/RedisPubSub.js +13 -10
- package/lib/Adapters/Push/PushAdapter.js +2 -8
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
- package/lib/Auth.js +54 -121
- package/lib/ClientSDK.js +3 -11
- package/lib/Config.js +69 -113
- package/lib/Controllers/AdaptableController.js +6 -18
- package/lib/Controllers/AnalyticsController.js +1 -9
- package/lib/Controllers/CacheController.js +3 -23
- package/lib/Controllers/DatabaseController.js +147 -345
- package/lib/Controllers/FilesController.js +5 -34
- package/lib/Controllers/HooksController.js +1 -51
- package/lib/Controllers/LiveQueryController.js +4 -23
- package/lib/Controllers/LoggerController.js +15 -54
- package/lib/Controllers/ParseGraphQLController.js +49 -104
- package/lib/Controllers/PushController.js +20 -59
- package/lib/Controllers/SchemaController.js +154 -344
- package/lib/Controllers/UserController.js +11 -72
- package/lib/Controllers/index.js +19 -68
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +1 -8
- package/lib/Deprecator/Deprecator.js +9 -18
- package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
- package/lib/GraphQL/ParseGraphQLServer.js +2 -29
- package/lib/GraphQL/helpers/objectsMutations.js +2 -12
- package/lib/GraphQL/helpers/objectsQueries.js +18 -76
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
- package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
- package/lib/GraphQL/loaders/filesMutations.js +2 -19
- package/lib/GraphQL/loaders/functionsMutations.js +6 -17
- package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
- package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
- package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
- package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
- package/lib/GraphQL/loaders/schemaMutations.js +1 -20
- package/lib/GraphQL/loaders/schemaQueries.js +1 -14
- package/lib/GraphQL/loaders/schemaTypes.js +2 -6
- package/lib/GraphQL/loaders/usersMutations.js +6 -28
- package/lib/GraphQL/loaders/usersQueries.js +4 -26
- package/lib/GraphQL/parseGraphQLUtils.js +6 -19
- package/lib/GraphQL/transformers/className.js +1 -4
- package/lib/GraphQL/transformers/constraintType.js +1 -20
- package/lib/GraphQL/transformers/inputType.js +1 -20
- package/lib/GraphQL/transformers/mutation.js +6 -51
- package/lib/GraphQL/transformers/outputType.js +1 -20
- package/lib/GraphQL/transformers/query.js +6 -42
- package/lib/GraphQL/transformers/schemaFields.js +7 -34
- package/lib/KeyPromiseQueue.js +1 -12
- package/lib/LiveQuery/Client.js +1 -25
- package/lib/LiveQuery/Id.js +1 -7
- package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
- package/lib/LiveQuery/ParseLiveQueryServer.js +92 -306
- package/lib/LiveQuery/ParsePubSub.js +1 -12
- package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
- package/lib/LiveQuery/QueryTools.js +14 -116
- package/lib/LiveQuery/RequestSchema.js +1 -1
- package/lib/LiveQuery/SessionTokenCache.js +1 -17
- package/lib/LiveQuery/Subscription.js +4 -18
- package/lib/LiveQuery/equalObjects.js +2 -14
- package/lib/Options/Definitions.js +79 -10
- package/lib/Options/docs.js +23 -3
- package/lib/Options/index.js +4 -12
- package/lib/Options/parsers.js +1 -18
- package/lib/Page.js +1 -9
- package/lib/ParseMessageQueue.js +1 -10
- package/lib/ParseServer.js +144 -182
- package/lib/ParseServerRESTController.js +6 -33
- package/lib/PromiseRouter.js +16 -50
- package/lib/Push/PushQueue.js +3 -15
- package/lib/Push/PushWorker.js +7 -32
- package/lib/Push/utils.js +9 -38
- package/lib/RestQuery.js +105 -242
- package/lib/RestWrite.js +212 -377
- package/lib/Routers/AggregateRouter.js +14 -51
- package/lib/Routers/AnalyticsRouter.js +2 -8
- package/lib/Routers/AudiencesRouter.js +1 -15
- package/lib/Routers/ClassesRouter.js +3 -53
- package/lib/Routers/CloudCodeRouter.js +1 -19
- package/lib/Routers/FeaturesRouter.js +1 -10
- package/lib/Routers/FilesRouter.js +29 -76
- package/lib/Routers/FunctionsRouter.js +5 -28
- package/lib/Routers/GlobalConfigRouter.js +4 -18
- package/lib/Routers/GraphQLRouter.js +1 -14
- package/lib/Routers/HooksRouter.js +1 -29
- package/lib/Routers/IAPValidationRouter.js +6 -29
- package/lib/Routers/InstallationsRouter.js +2 -12
- package/lib/Routers/LogsRouter.js +4 -16
- package/lib/Routers/PagesRouter.js +69 -129
- package/lib/Routers/PublicAPIRouter.js +3 -62
- package/lib/Routers/PurgeRouter.js +1 -15
- package/lib/Routers/PushRouter.js +2 -18
- package/lib/Routers/RolesRouter.js +1 -7
- package/lib/Routers/SchemasRouter.js +4 -34
- package/lib/Routers/SecurityRouter.js +1 -12
- package/lib/Routers/SessionsRouter.js +3 -19
- package/lib/Routers/UsersRouter.js +58 -155
- package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
- package/lib/SchemaMigrations/Migrations.js +2 -8
- package/lib/Security/Check.js +8 -16
- package/lib/Security/CheckGroup.js +4 -11
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
- package/lib/Security/CheckGroups/CheckGroups.js +1 -4
- package/lib/Security/CheckRunner.js +22 -41
- package/lib/StatusHandler.js +12 -69
- package/lib/TestUtils.js +1 -6
- package/lib/Utils.js +27 -66
- package/lib/batch.js +17 -28
- package/lib/cache.js +1 -3
- package/lib/cli/definitions/parse-live-query-server.js +1 -3
- package/lib/cli/definitions/parse-server.js +1 -3
- package/lib/cli/parse-live-query-server.js +1 -6
- package/lib/cli/parse-server.js +11 -21
- package/lib/cli/utils/commander.js +13 -51
- package/lib/cli/utils/runner.js +1 -14
- package/lib/cloud-code/Parse.Cloud.js +71 -92
- package/lib/cryptoUtils.js +11 -19
- package/lib/defaults.js +2 -14
- package/lib/deprecated.js +1 -2
- package/lib/index.js +16 -34
- package/lib/logger.js +6 -13
- package/lib/middlewares.js +147 -151
- package/lib/password.js +6 -10
- package/lib/request.js +173 -2
- package/lib/requiredParameter.js +1 -3
- package/lib/rest.js +19 -41
- package/lib/triggers.js +54 -252
- package/lib/vendor/mongodbUrl.js +125 -305
- package/package.json +22 -19
- package/lib/cloud-code/HTTPResponse.js +0 -73
- package/lib/cloud-code/httpRequest.js +0 -192
|
@@ -4,21 +4,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
const mongodb = require('mongodb');
|
|
9
|
-
|
|
10
8
|
const Collection = mongodb.Collection;
|
|
11
|
-
|
|
12
9
|
class MongoCollection {
|
|
13
10
|
constructor(mongoCollection) {
|
|
14
11
|
this._mongoCollection = mongoCollection;
|
|
15
|
-
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Does a find with "smart indexing".
|
|
16
15
|
// Currently this just means, if it needs a geoindex and there is
|
|
17
16
|
// none, then build the geoindex.
|
|
18
17
|
// This could be improved a lot but it's not clear if that's a good
|
|
19
18
|
// idea. Or even if this behavior is a good idea.
|
|
20
|
-
|
|
21
|
-
|
|
22
19
|
find(query, {
|
|
23
20
|
skip,
|
|
24
21
|
limit,
|
|
@@ -37,7 +34,6 @@ class MongoCollection {
|
|
|
37
34
|
$meta: 'textScore'
|
|
38
35
|
};
|
|
39
36
|
}
|
|
40
|
-
|
|
41
37
|
return this._rawFind(query, {
|
|
42
38
|
skip,
|
|
43
39
|
limit,
|
|
@@ -52,18 +48,16 @@ class MongoCollection {
|
|
|
52
48
|
// Check for "no geoindex" error
|
|
53
49
|
if (error.code != 17007 && !error.message.match(/unable to find index for .geoNear/)) {
|
|
54
50
|
throw error;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
}
|
|
52
|
+
// Figure out what key needs an index
|
|
58
53
|
const key = error.message.match(/field=([A-Za-z_0-9]+) /)[1];
|
|
59
|
-
|
|
60
54
|
if (!key) {
|
|
61
55
|
throw error;
|
|
62
56
|
}
|
|
63
|
-
|
|
64
57
|
var index = {};
|
|
65
58
|
index[key] = '2d';
|
|
66
|
-
return this._mongoCollection.createIndex(index)
|
|
59
|
+
return this._mongoCollection.createIndex(index)
|
|
60
|
+
// Retry, but just once.
|
|
67
61
|
.then(() => this._rawFind(query, {
|
|
68
62
|
skip,
|
|
69
63
|
limit,
|
|
@@ -77,18 +71,16 @@ class MongoCollection {
|
|
|
77
71
|
}));
|
|
78
72
|
});
|
|
79
73
|
}
|
|
74
|
+
|
|
80
75
|
/**
|
|
81
76
|
* Collation to support case insensitive queries
|
|
82
77
|
*/
|
|
83
|
-
|
|
84
|
-
|
|
85
78
|
static caseInsensitiveCollation() {
|
|
86
79
|
return {
|
|
87
80
|
locale: 'en_US',
|
|
88
81
|
strength: 2
|
|
89
82
|
};
|
|
90
83
|
}
|
|
91
|
-
|
|
92
84
|
_rawFind(query, {
|
|
93
85
|
skip,
|
|
94
86
|
limit,
|
|
@@ -107,22 +99,17 @@ class MongoCollection {
|
|
|
107
99
|
readPreference,
|
|
108
100
|
hint
|
|
109
101
|
});
|
|
110
|
-
|
|
111
102
|
if (keys) {
|
|
112
103
|
findOperation = findOperation.project(keys);
|
|
113
104
|
}
|
|
114
|
-
|
|
115
105
|
if (caseInsensitive) {
|
|
116
106
|
findOperation = findOperation.collation(MongoCollection.caseInsensitiveCollation());
|
|
117
107
|
}
|
|
118
|
-
|
|
119
108
|
if (maxTimeMS) {
|
|
120
109
|
findOperation = findOperation.maxTimeMS(maxTimeMS);
|
|
121
110
|
}
|
|
122
|
-
|
|
123
111
|
return explain ? findOperation.explain(explain) : findOperation.toArray();
|
|
124
112
|
}
|
|
125
|
-
|
|
126
113
|
count(query, {
|
|
127
114
|
skip,
|
|
128
115
|
limit,
|
|
@@ -140,7 +127,6 @@ class MongoCollection {
|
|
|
140
127
|
maxTimeMS
|
|
141
128
|
});
|
|
142
129
|
}
|
|
143
|
-
|
|
144
130
|
const countOperation = this._mongoCollection.countDocuments(query, {
|
|
145
131
|
skip,
|
|
146
132
|
limit,
|
|
@@ -149,14 +135,11 @@ class MongoCollection {
|
|
|
149
135
|
readPreference,
|
|
150
136
|
hint
|
|
151
137
|
});
|
|
152
|
-
|
|
153
138
|
return countOperation;
|
|
154
139
|
}
|
|
155
|
-
|
|
156
140
|
distinct(field, query) {
|
|
157
141
|
return this._mongoCollection.distinct(field, query);
|
|
158
142
|
}
|
|
159
|
-
|
|
160
143
|
aggregate(pipeline, {
|
|
161
144
|
maxTimeMS,
|
|
162
145
|
readPreference,
|
|
@@ -170,39 +153,34 @@ class MongoCollection {
|
|
|
170
153
|
explain
|
|
171
154
|
}).toArray();
|
|
172
155
|
}
|
|
173
|
-
|
|
174
156
|
insertOne(object, session) {
|
|
175
157
|
return this._mongoCollection.insertOne(object, {
|
|
176
158
|
session
|
|
177
159
|
});
|
|
178
|
-
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Atomically updates data in the database for a single (first) object that matched the query
|
|
179
163
|
// If there is nothing that matches the query - does insert
|
|
180
164
|
// Postgres Note: `INSERT ... ON CONFLICT UPDATE` that is available since 9.5.
|
|
181
|
-
|
|
182
|
-
|
|
183
165
|
upsertOne(query, update, session) {
|
|
184
166
|
return this._mongoCollection.updateOne(query, update, {
|
|
185
167
|
upsert: true,
|
|
186
168
|
session
|
|
187
169
|
});
|
|
188
170
|
}
|
|
189
|
-
|
|
190
171
|
updateOne(query, update) {
|
|
191
172
|
return this._mongoCollection.updateOne(query, update);
|
|
192
173
|
}
|
|
193
|
-
|
|
194
174
|
updateMany(query, update, session) {
|
|
195
175
|
return this._mongoCollection.updateMany(query, update, {
|
|
196
176
|
session
|
|
197
177
|
});
|
|
198
178
|
}
|
|
199
|
-
|
|
200
179
|
deleteMany(query, session) {
|
|
201
180
|
return this._mongoCollection.deleteMany(query, {
|
|
202
181
|
session
|
|
203
182
|
});
|
|
204
183
|
}
|
|
205
|
-
|
|
206
184
|
_ensureSparseUniqueIndexInBackground(indexRequest) {
|
|
207
185
|
return new Promise((resolve, reject) => {
|
|
208
186
|
this._mongoCollection.createIndex(indexRequest, {
|
|
@@ -218,12 +196,9 @@ class MongoCollection {
|
|
|
218
196
|
});
|
|
219
197
|
});
|
|
220
198
|
}
|
|
221
|
-
|
|
222
199
|
drop() {
|
|
223
200
|
return this._mongoCollection.drop();
|
|
224
201
|
}
|
|
225
|
-
|
|
226
202
|
}
|
|
227
|
-
|
|
228
203
|
exports.default = MongoCollection;
|
|
229
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvQ29sbGVjdGlvbi5qcyJdLCJuYW1lcyI6WyJtb25nb2RiIiwicmVxdWlyZSIsIkNvbGxlY3Rpb24iLCJNb25nb0NvbGxlY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm1vbmdvQ29sbGVjdGlvbiIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kIiwicXVlcnkiLCJza2lwIiwibGltaXQiLCJzb3J0Iiwia2V5cyIsIm1heFRpbWVNUyIsInJlYWRQcmVmZXJlbmNlIiwiaGludCIsImNhc2VJbnNlbnNpdGl2ZSIsImV4cGxhaW4iLCIkc2NvcmUiLCJzY29yZSIsIiRtZXRhIiwiX3Jhd0ZpbmQiLCJjYXRjaCIsImVycm9yIiwiY29kZSIsIm1lc3NhZ2UiLCJtYXRjaCIsImtleSIsImluZGV4IiwiY3JlYXRlSW5kZXgiLCJ0aGVuIiwiY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uIiwibG9jYWxlIiwic3RyZW5ndGgiLCJmaW5kT3BlcmF0aW9uIiwicHJvamVjdCIsImNvbGxhdGlvbiIsInRvQXJyYXkiLCJjb3VudCIsIk9iamVjdCIsImxlbmd0aCIsImVzdGltYXRlZERvY3VtZW50Q291bnQiLCJjb3VudE9wZXJhdGlvbiIsImNvdW50RG9jdW1lbnRzIiwiZGlzdGluY3QiLCJmaWVsZCIsImFnZ3JlZ2F0ZSIsInBpcGVsaW5lIiwiaW5zZXJ0T25lIiwib2JqZWN0Iiwic2Vzc2lvbiIsInVwc2VydE9uZSIsInVwZGF0ZSIsInVwZGF0ZU9uZSIsInVwc2VydCIsInVwZGF0ZU1hbnkiLCJkZWxldGVNYW55IiwiX2Vuc3VyZVNwYXJzZVVuaXF1ZUluZGV4SW5CYWNrZ3JvdW5kIiwiaW5kZXhSZXF1ZXN0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ1bmlxdWUiLCJiYWNrZ3JvdW5kIiwic3BhcnNlIiwiZHJvcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLE1BQU1BLE9BQU8sR0FBR0MsT0FBTyxDQUFDLFNBQUQsQ0FBdkI7O0FBQ0EsTUFBTUMsVUFBVSxHQUFHRixPQUFPLENBQUNFLFVBQTNCOztBQUVlLE1BQU1DLGVBQU4sQ0FBc0I7QUFHbkNDLEVBQUFBLFdBQVcsQ0FBQ0MsZUFBRCxFQUE4QjtBQUN2QyxTQUFLQyxnQkFBTCxHQUF3QkQsZUFBeEI7QUFDRCxHQUxrQyxDQU9uQztBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQUUsRUFBQUEsSUFBSSxDQUNGQyxLQURFLEVBRUY7QUFBRUMsSUFBQUEsSUFBRjtBQUFRQyxJQUFBQSxLQUFSO0FBQWVDLElBQUFBLElBQWY7QUFBcUJDLElBQUFBLElBQXJCO0FBQTJCQyxJQUFBQSxTQUEzQjtBQUFzQ0MsSUFBQUEsY0FBdEM7QUFBc0RDLElBQUFBLElBQXREO0FBQTREQyxJQUFBQSxlQUE1RDtBQUE2RUMsSUFBQUE7QUFBN0UsTUFBeUYsRUFGdkYsRUFHRjtBQUNBO0FBQ0EsUUFBSUwsSUFBSSxJQUFJQSxJQUFJLENBQUNNLE1BQWpCLEVBQXlCO0FBQ3ZCLGFBQU9OLElBQUksQ0FBQ00sTUFBWjtBQUNBTixNQUFBQSxJQUFJLENBQUNPLEtBQUwsR0FBYTtBQUFFQyxRQUFBQSxLQUFLLEVBQUU7QUFBVCxPQUFiO0FBQ0Q7O0FBQ0QsV0FBTyxLQUFLQyxRQUFMLENBQWNiLEtBQWQsRUFBcUI7QUFDMUJDLE1BQUFBLElBRDBCO0FBRTFCQyxNQUFBQSxLQUYwQjtBQUcxQkMsTUFBQUEsSUFIMEI7QUFJMUJDLE1BQUFBLElBSjBCO0FBSzFCQyxNQUFBQSxTQUwwQjtBQU0xQkMsTUFBQUEsY0FOMEI7QUFPMUJDLE1BQUFBLElBUDBCO0FBUTFCQyxNQUFBQSxlQVIwQjtBQVMxQkMsTUFBQUE7QUFUMEIsS0FBckIsRUFVSkssS0FWSSxDQVVFQyxLQUFLLElBQUk7QUFDaEI7QUFDQSxVQUFJQSxLQUFLLENBQUNDLElBQU4sSUFBYyxLQUFkLElBQXVCLENBQUNELEtBQUssQ0FBQ0UsT0FBTixDQUFjQyxLQUFkLENBQW9CLG1DQUFwQixDQUE1QixFQUFzRjtBQUNwRixjQUFNSCxLQUFOO0FBQ0QsT0FKZSxDQUtoQjs7O0FBQ0EsWUFBTUksR0FBRyxHQUFHSixLQUFLLENBQUNFLE9BQU4sQ0FBY0MsS0FBZCxDQUFvQix3QkFBcEIsRUFBOEMsQ0FBOUMsQ0FBWjs7QUFDQSxVQUFJLENBQUNDLEdBQUwsRUFBVTtBQUNSLGNBQU1KLEtBQU47QUFDRDs7QUFFRCxVQUFJSyxLQUFLLEdBQUcsRUFBWjtBQUNBQSxNQUFBQSxLQUFLLENBQUNELEdBQUQsQ0FBTCxHQUFhLElBQWI7QUFDQSxhQUNFLEtBQUtyQixnQkFBTCxDQUNHdUIsV0FESCxDQUNlRCxLQURmLEVBRUU7QUFGRixPQUdHRSxJQUhILENBR1EsTUFDSixLQUFLVCxRQUFMLENBQWNiLEtBQWQsRUFBcUI7QUFDbkJDLFFBQUFBLElBRG1CO0FBRW5CQyxRQUFBQSxLQUZtQjtBQUduQkMsUUFBQUEsSUFIbUI7QUFJbkJDLFFBQUFBLElBSm1CO0FBS25CQyxRQUFBQSxTQUxtQjtBQU1uQkMsUUFBQUEsY0FObUI7QUFPbkJDLFFBQUFBLElBUG1CO0FBUW5CQyxRQUFBQSxlQVJtQjtBQVNuQkMsUUFBQUE7QUFUbUIsT0FBckIsQ0FKSixDQURGO0FBa0JELEtBekNNLENBQVA7QUEwQ0Q7QUFFRDtBQUNGO0FBQ0E7OztBQUNpQyxTQUF4QmMsd0JBQXdCLEdBQUc7QUFDaEMsV0FBTztBQUFFQyxNQUFBQSxNQUFNLEVBQUUsT0FBVjtBQUFtQkMsTUFBQUEsUUFBUSxFQUFFO0FBQTdCLEtBQVA7QUFDRDs7QUFFRFosRUFBQUEsUUFBUSxDQUNOYixLQURNLEVBRU47QUFBRUMsSUFBQUEsSUFBRjtBQUFRQyxJQUFBQSxLQUFSO0FBQWVDLElBQUFBLElBQWY7QUFBcUJDLElBQUFBLElBQXJCO0FBQTJCQyxJQUFBQSxTQUEzQjtBQUFzQ0MsSUFBQUEsY0FBdEM7QUFBc0RDLElBQUFBLElBQXREO0FBQTREQyxJQUFBQSxlQUE1RDtBQUE2RUMsSUFBQUE7QUFBN0UsTUFBeUYsRUFGbkYsRUFHTjtBQUNBLFFBQUlpQixhQUFhLEdBQUcsS0FBSzVCLGdCQUFMLENBQXNCQyxJQUF0QixDQUEyQkMsS0FBM0IsRUFBa0M7QUFDcERDLE1BQUFBLElBRG9EO0FBRXBEQyxNQUFBQSxLQUZvRDtBQUdwREMsTUFBQUEsSUFIb0Q7QUFJcERHLE1BQUFBLGNBSm9EO0FBS3BEQyxNQUFBQTtBQUxvRCxLQUFsQyxDQUFwQjs7QUFRQSxRQUFJSCxJQUFKLEVBQVU7QUFDUnNCLE1BQUFBLGFBQWEsR0FBR0EsYUFBYSxDQUFDQyxPQUFkLENBQXNCdkIsSUFBdEIsQ0FBaEI7QUFDRDs7QUFFRCxRQUFJSSxlQUFKLEVBQXFCO0FBQ25Ca0IsTUFBQUEsYUFBYSxHQUFHQSxhQUFhLENBQUNFLFNBQWQsQ0FBd0JqQyxlQUFlLENBQUM0Qix3QkFBaEIsRUFBeEIsQ0FBaEI7QUFDRDs7QUFFRCxRQUFJbEIsU0FBSixFQUFlO0FBQ2JxQixNQUFBQSxhQUFhLEdBQUdBLGFBQWEsQ0FBQ3JCLFNBQWQsQ0FBd0JBLFNBQXhCLENBQWhCO0FBQ0Q7O0FBRUQsV0FBT0ksT0FBTyxHQUFHaUIsYUFBYSxDQUFDakIsT0FBZCxDQUFzQkEsT0FBdEIsQ0FBSCxHQUFvQ2lCLGFBQWEsQ0FBQ0csT0FBZCxFQUFsRDtBQUNEOztBQUVEQyxFQUFBQSxLQUFLLENBQUM5QixLQUFELEVBQVE7QUFBRUMsSUFBQUEsSUFBRjtBQUFRQyxJQUFBQSxLQUFSO0FBQWVDLElBQUFBLElBQWY7QUFBcUJFLElBQUFBLFNBQXJCO0FBQWdDQyxJQUFBQSxjQUFoQztBQUFnREMsSUFBQUE7QUFBaEQsTUFBeUQsRUFBakUsRUFBcUU7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFJLE9BQU9QLEtBQVAsS0FBaUIsUUFBakIsSUFBNkIsQ0FBQytCLE1BQU0sQ0FBQzNCLElBQVAsQ0FBWUosS0FBWixFQUFtQmdDLE1BQXJELEVBQTZEO0FBQzNELGFBQU8sS0FBS2xDLGdCQUFMLENBQXNCbUMsc0JBQXRCLENBQTZDO0FBQ2xENUIsUUFBQUE7QUFEa0QsT0FBN0MsQ0FBUDtBQUdEOztBQUVELFVBQU02QixjQUFjLEdBQUcsS0FBS3BDLGdCQUFMLENBQXNCcUMsY0FBdEIsQ0FBcUNuQyxLQUFyQyxFQUE0QztBQUNqRUMsTUFBQUEsSUFEaUU7QUFFakVDLE1BQUFBLEtBRmlFO0FBR2pFQyxNQUFBQSxJQUhpRTtBQUlqRUUsTUFBQUEsU0FKaUU7QUFLakVDLE1BQUFBLGNBTGlFO0FBTWpFQyxNQUFBQTtBQU5pRSxLQUE1QyxDQUF2Qjs7QUFTQSxXQUFPMkIsY0FBUDtBQUNEOztBQUVERSxFQUFBQSxRQUFRLENBQUNDLEtBQUQsRUFBUXJDLEtBQVIsRUFBZTtBQUNyQixXQUFPLEtBQUtGLGdCQUFMLENBQXNCc0MsUUFBdEIsQ0FBK0JDLEtBQS9CLEVBQXNDckMsS0FBdEMsQ0FBUDtBQUNEOztBQUVEc0MsRUFBQUEsU0FBUyxDQUFDQyxRQUFELEVBQVc7QUFBRWxDLElBQUFBLFNBQUY7QUFBYUMsSUFBQUEsY0FBYjtBQUE2QkMsSUFBQUEsSUFBN0I7QUFBbUNFLElBQUFBO0FBQW5DLE1BQStDLEVBQTFELEVBQThEO0FBQ3JFLFdBQU8sS0FBS1gsZ0JBQUwsQ0FDSndDLFNBREksQ0FDTUMsUUFETixFQUNnQjtBQUFFbEMsTUFBQUEsU0FBRjtBQUFhQyxNQUFBQSxjQUFiO0FBQTZCQyxNQUFBQSxJQUE3QjtBQUFtQ0UsTUFBQUE7QUFBbkMsS0FEaEIsRUFFSm9CLE9BRkksRUFBUDtBQUdEOztBQUVEVyxFQUFBQSxTQUFTLENBQUNDLE1BQUQsRUFBU0MsT0FBVCxFQUFrQjtBQUN6QixXQUFPLEtBQUs1QyxnQkFBTCxDQUFzQjBDLFNBQXRCLENBQWdDQyxNQUFoQyxFQUF3QztBQUFFQyxNQUFBQTtBQUFGLEtBQXhDLENBQVA7QUFDRCxHQXRJa0MsQ0F3SW5DO0FBQ0E7QUFDQTs7O0FBQ0FDLEVBQUFBLFNBQVMsQ0FBQzNDLEtBQUQsRUFBUTRDLE1BQVIsRUFBZ0JGLE9BQWhCLEVBQXlCO0FBQ2hDLFdBQU8sS0FBSzVDLGdCQUFMLENBQXNCK0MsU0FBdEIsQ0FBZ0M3QyxLQUFoQyxFQUF1QzRDLE1BQXZDLEVBQStDO0FBQ3BERSxNQUFBQSxNQUFNLEVBQUUsSUFENEM7QUFFcERKLE1BQUFBO0FBRm9ELEtBQS9DLENBQVA7QUFJRDs7QUFFREcsRUFBQUEsU0FBUyxDQUFDN0MsS0FBRCxFQUFRNEMsTUFBUixFQUFnQjtBQUN2QixXQUFPLEtBQUs5QyxnQkFBTCxDQUFzQitDLFNBQXRCLENBQWdDN0MsS0FBaEMsRUFBdUM0QyxNQUF2QyxDQUFQO0FBQ0Q7O0FBRURHLEVBQUFBLFVBQVUsQ0FBQy9DLEtBQUQsRUFBUTRDLE1BQVIsRUFBZ0JGLE9BQWhCLEVBQXlCO0FBQ2pDLFdBQU8sS0FBSzVDLGdCQUFMLENBQXNCaUQsVUFBdEIsQ0FBaUMvQyxLQUFqQyxFQUF3QzRDLE1BQXhDLEVBQWdEO0FBQUVGLE1BQUFBO0FBQUYsS0FBaEQsQ0FBUDtBQUNEOztBQUVETSxFQUFBQSxVQUFVLENBQUNoRCxLQUFELEVBQVEwQyxPQUFSLEVBQWlCO0FBQ3pCLFdBQU8sS0FBSzVDLGdCQUFMLENBQXNCa0QsVUFBdEIsQ0FBaUNoRCxLQUFqQyxFQUF3QztBQUFFMEMsTUFBQUE7QUFBRixLQUF4QyxDQUFQO0FBQ0Q7O0FBRURPLEVBQUFBLG9DQUFvQyxDQUFDQyxZQUFELEVBQWU7QUFDakQsV0FBTyxJQUFJQyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3RDLFdBQUt2RCxnQkFBTCxDQUFzQnVCLFdBQXRCLENBQ0U2QixZQURGLEVBRUU7QUFBRUksUUFBQUEsTUFBTSxFQUFFLElBQVY7QUFBZ0JDLFFBQUFBLFVBQVUsRUFBRSxJQUE1QjtBQUFrQ0MsUUFBQUEsTUFBTSxFQUFFO0FBQTFDLE9BRkYsRUFHRXpDLEtBQUssSUFBSTtBQUNQLFlBQUlBLEtBQUosRUFBVztBQUNUc0MsVUFBQUEsTUFBTSxDQUFDdEMsS0FBRCxDQUFOO0FBQ0QsU0FGRCxNQUVPO0FBQ0xxQyxVQUFBQSxPQUFPO0FBQ1I7QUFDRixPQVRIO0FBV0QsS0FaTSxDQUFQO0FBYUQ7O0FBRURLLEVBQUFBLElBQUksR0FBRztBQUNMLFdBQU8sS0FBSzNELGdCQUFMLENBQXNCMkQsSUFBdEIsRUFBUDtBQUNEOztBQWhMa0MiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBtb25nb2RiID0gcmVxdWlyZSgnbW9uZ29kYicpO1xuY29uc3QgQ29sbGVjdGlvbiA9IG1vbmdvZGIuQ29sbGVjdGlvbjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9uZ29Db2xsZWN0aW9uIHtcbiAgX21vbmdvQ29sbGVjdGlvbjogQ29sbGVjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihtb25nb0NvbGxlY3Rpb246IENvbGxlY3Rpb24pIHtcbiAgICB0aGlzLl9tb25nb0NvbGxlY3Rpb24gPSBtb25nb0NvbGxlY3Rpb247XG4gIH1cblxuICAvLyBEb2VzIGEgZmluZCB3aXRoIFwic21hcnQgaW5kZXhpbmdcIi5cbiAgLy8gQ3VycmVudGx5IHRoaXMganVzdCBtZWFucywgaWYgaXQgbmVlZHMgYSBnZW9pbmRleCBhbmQgdGhlcmUgaXNcbiAgLy8gbm9uZSwgdGhlbiBidWlsZCB0aGUgZ2VvaW5kZXguXG4gIC8vIFRoaXMgY291bGQgYmUgaW1wcm92ZWQgYSBsb3QgYnV0IGl0J3Mgbm90IGNsZWFyIGlmIHRoYXQncyBhIGdvb2RcbiAgLy8gaWRlYS4gT3IgZXZlbiBpZiB0aGlzIGJlaGF2aW9yIGlzIGEgZ29vZCBpZGVhLlxuICBmaW5kKFxuICAgIHF1ZXJ5LFxuICAgIHsgc2tpcCwgbGltaXQsIHNvcnQsIGtleXMsIG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGNhc2VJbnNlbnNpdGl2ZSwgZXhwbGFpbiB9ID0ge31cbiAgKSB7XG4gICAgLy8gU3VwcG9ydCBmb3IgRnVsbCBUZXh0IFNlYXJjaCAtICR0ZXh0XG4gICAgaWYgKGtleXMgJiYga2V5cy4kc2NvcmUpIHtcbiAgICAgIGRlbGV0ZSBrZXlzLiRzY29yZTtcbiAgICAgIGtleXMuc2NvcmUgPSB7ICRtZXRhOiAndGV4dFNjb3JlJyB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmF3RmluZChxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIGtleXMsXG4gICAgICBtYXhUaW1lTVMsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICBleHBsYWluLFxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIC8vIENoZWNrIGZvciBcIm5vIGdlb2luZGV4XCIgZXJyb3JcbiAgICAgIGlmIChlcnJvci5jb2RlICE9IDE3MDA3ICYmICFlcnJvci5tZXNzYWdlLm1hdGNoKC91bmFibGUgdG8gZmluZCBpbmRleCBmb3IgLmdlb05lYXIvKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBrZXkgbmVlZHMgYW4gaW5kZXhcbiAgICAgIGNvbnN0IGtleSA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL2ZpZWxkPShbQS1aYS16XzAtOV0rKSAvKVsxXTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSB7fTtcbiAgICAgIGluZGV4W2tleV0gPSAnMmQnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uXG4gICAgICAgICAgLmNyZWF0ZUluZGV4KGluZGV4KVxuICAgICAgICAgIC8vIFJldHJ5LCBidXQganVzdCBvbmNlLlxuICAgICAgICAgIC50aGVuKCgpID0+XG4gICAgICAgICAgICB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICBtYXhUaW1lTVMsXG4gICAgICAgICAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgICAgICAgICBoaW50LFxuICAgICAgICAgICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICAgICAgICAgIGV4cGxhaW4sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGF0aW9uIHRvIHN1cHBvcnQgY2FzZSBpbnNlbnNpdGl2ZSBxdWVyaWVzXG4gICAqL1xuICBzdGF0aWMgY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uKCkge1xuICAgIHJldHVybiB7IGxvY2FsZTogJ2VuX1VTJywgc3RyZW5ndGg6IDIgfTtcbiAgfVxuXG4gIF9yYXdGaW5kKFxuICAgIHF1ZXJ5LFxuICAgIHsgc2tpcCwgbGltaXQsIHNvcnQsIGtleXMsIG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGNhc2VJbnNlbnNpdGl2ZSwgZXhwbGFpbiB9ID0ge31cbiAgKSB7XG4gICAgbGV0IGZpbmRPcGVyYXRpb24gPSB0aGlzLl9tb25nb0NvbGxlY3Rpb24uZmluZChxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICB9KTtcblxuICAgIGlmIChrZXlzKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5wcm9qZWN0KGtleXMpO1xuICAgIH1cblxuICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICAgIGZpbmRPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uLmNvbGxhdGlvbihNb25nb0NvbGxlY3Rpb24uY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uKCkpO1xuICAgIH1cblxuICAgIGlmIChtYXhUaW1lTVMpIHtcbiAgICAgIGZpbmRPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uLm1heFRpbWVNUyhtYXhUaW1lTVMpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBsYWluID8gZmluZE9wZXJhdGlvbi5leHBsYWluKGV4cGxhaW4pIDogZmluZE9wZXJhdGlvbi50b0FycmF5KCk7XG4gIH1cblxuICBjb3VudChxdWVyeSwgeyBza2lwLCBsaW1pdCwgc29ydCwgbWF4VGltZU1TLCByZWFkUHJlZmVyZW5jZSwgaGludCB9ID0ge30pIHtcbiAgICAvLyBJZiBxdWVyeSBpcyBlbXB0eSwgdGhlbiB1c2UgZXN0aW1hdGVkRG9jdW1lbnRDb3VudCBpbnN0ZWFkLlxuICAgIC8vIFRoaXMgaXMgZHVlIHRvIGNvdW50RG9jdW1lbnRzIHBlcmZvcm1pbmcgYSBzY2FuLFxuICAgIC8vIHdoaWNoIGdyZWF0bHkgaW5jcmVhc2VzIGV4ZWN1dGlvbiB0aW1lIHdoZW4gYmVpbmcgcnVuIG9uIGxhcmdlIGNvbGxlY3Rpb25zLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQXV0b21hdHRpYy9tb25nb29zZS9pc3N1ZXMvNjcxMyBmb3IgbW9yZSBpbmZvIHJlZ2FyZGluZyB0aGlzIHByb2JsZW0uXG4gICAgaWYgKHR5cGVvZiBxdWVyeSAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uZXN0aW1hdGVkRG9jdW1lbnRDb3VudCh7XG4gICAgICAgIG1heFRpbWVNUyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50T3BlcmF0aW9uID0gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNvdW50RG9jdW1lbnRzKHF1ZXJ5LCB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAgbWF4VGltZU1TLFxuICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICBoaW50LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50T3BlcmF0aW9uO1xuICB9XG5cbiAgZGlzdGluY3QoZmllbGQsIHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kaXN0aW5jdChmaWVsZCwgcXVlcnkpO1xuICB9XG5cbiAgYWdncmVnYXRlKHBpcGVsaW5lLCB7IG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGV4cGxhaW4gfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvblxuICAgICAgLmFnZ3JlZ2F0ZShwaXBlbGluZSwgeyBtYXhUaW1lTVMsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluIH0pXG4gICAgICAudG9BcnJheSgpO1xuICB9XG5cbiAgaW5zZXJ0T25lKG9iamVjdCwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uaW5zZXJ0T25lKG9iamVjdCwgeyBzZXNzaW9uIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSB1cGRhdGVzIGRhdGEgaW4gdGhlIGRhdGFiYXNlIGZvciBhIHNpbmdsZSAoZmlyc3QpIG9iamVjdCB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5XG4gIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBxdWVyeSAtIGRvZXMgaW5zZXJ0XG4gIC8vIFBvc3RncmVzIE5vdGU6IGBJTlNFUlQgLi4uIE9OIENPTkZMSUNUIFVQREFURWAgdGhhdCBpcyBhdmFpbGFibGUgc2luY2UgOS41LlxuICB1cHNlcnRPbmUocXVlcnksIHVwZGF0ZSwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUsIHtcbiAgICAgIHVwc2VydDogdHJ1ZSxcbiAgICAgIHNlc3Npb24sXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVPbmUocXVlcnksIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlTWFueShxdWVyeSwgdXBkYXRlLCBzZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi51cGRhdGVNYW55KHF1ZXJ5LCB1cGRhdGUsIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIGRlbGV0ZU1hbnkocXVlcnksIHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRlbGV0ZU1hbnkocXVlcnksIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIF9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZChpbmRleFJlcXVlc3QpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KFxuICAgICAgICBpbmRleFJlcXVlc3QsXG4gICAgICAgIHsgdW5pcXVlOiB0cnVlLCBiYWNrZ3JvdW5kOiB0cnVlLCBzcGFyc2U6IHRydWUgfSxcbiAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kcm9wKCk7XG4gIH1cbn1cbiJdfQ==
|
|
204
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb25nb2RiIiwicmVxdWlyZSIsIkNvbGxlY3Rpb24iLCJNb25nb0NvbGxlY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm1vbmdvQ29sbGVjdGlvbiIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kIiwicXVlcnkiLCJza2lwIiwibGltaXQiLCJzb3J0Iiwia2V5cyIsIm1heFRpbWVNUyIsInJlYWRQcmVmZXJlbmNlIiwiaGludCIsImNhc2VJbnNlbnNpdGl2ZSIsImV4cGxhaW4iLCIkc2NvcmUiLCJzY29yZSIsIiRtZXRhIiwiX3Jhd0ZpbmQiLCJjYXRjaCIsImVycm9yIiwiY29kZSIsIm1lc3NhZ2UiLCJtYXRjaCIsImtleSIsImluZGV4IiwiY3JlYXRlSW5kZXgiLCJ0aGVuIiwiY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uIiwibG9jYWxlIiwic3RyZW5ndGgiLCJmaW5kT3BlcmF0aW9uIiwicHJvamVjdCIsImNvbGxhdGlvbiIsInRvQXJyYXkiLCJjb3VudCIsIk9iamVjdCIsImxlbmd0aCIsImVzdGltYXRlZERvY3VtZW50Q291bnQiLCJjb3VudE9wZXJhdGlvbiIsImNvdW50RG9jdW1lbnRzIiwiZGlzdGluY3QiLCJmaWVsZCIsImFnZ3JlZ2F0ZSIsInBpcGVsaW5lIiwiaW5zZXJ0T25lIiwib2JqZWN0Iiwic2Vzc2lvbiIsInVwc2VydE9uZSIsInVwZGF0ZSIsInVwZGF0ZU9uZSIsInVwc2VydCIsInVwZGF0ZU1hbnkiLCJkZWxldGVNYW55IiwiX2Vuc3VyZVNwYXJzZVVuaXF1ZUluZGV4SW5CYWNrZ3JvdW5kIiwiaW5kZXhSZXF1ZXN0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ1bmlxdWUiLCJiYWNrZ3JvdW5kIiwic3BhcnNlIiwiZHJvcCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvQ29sbGVjdGlvbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBtb25nb2RiID0gcmVxdWlyZSgnbW9uZ29kYicpO1xuY29uc3QgQ29sbGVjdGlvbiA9IG1vbmdvZGIuQ29sbGVjdGlvbjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9uZ29Db2xsZWN0aW9uIHtcbiAgX21vbmdvQ29sbGVjdGlvbjogQ29sbGVjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihtb25nb0NvbGxlY3Rpb246IENvbGxlY3Rpb24pIHtcbiAgICB0aGlzLl9tb25nb0NvbGxlY3Rpb24gPSBtb25nb0NvbGxlY3Rpb247XG4gIH1cblxuICAvLyBEb2VzIGEgZmluZCB3aXRoIFwic21hcnQgaW5kZXhpbmdcIi5cbiAgLy8gQ3VycmVudGx5IHRoaXMganVzdCBtZWFucywgaWYgaXQgbmVlZHMgYSBnZW9pbmRleCBhbmQgdGhlcmUgaXNcbiAgLy8gbm9uZSwgdGhlbiBidWlsZCB0aGUgZ2VvaW5kZXguXG4gIC8vIFRoaXMgY291bGQgYmUgaW1wcm92ZWQgYSBsb3QgYnV0IGl0J3Mgbm90IGNsZWFyIGlmIHRoYXQncyBhIGdvb2RcbiAgLy8gaWRlYS4gT3IgZXZlbiBpZiB0aGlzIGJlaGF2aW9yIGlzIGEgZ29vZCBpZGVhLlxuICBmaW5kKFxuICAgIHF1ZXJ5LFxuICAgIHsgc2tpcCwgbGltaXQsIHNvcnQsIGtleXMsIG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGNhc2VJbnNlbnNpdGl2ZSwgZXhwbGFpbiB9ID0ge31cbiAgKSB7XG4gICAgLy8gU3VwcG9ydCBmb3IgRnVsbCBUZXh0IFNlYXJjaCAtICR0ZXh0XG4gICAgaWYgKGtleXMgJiYga2V5cy4kc2NvcmUpIHtcbiAgICAgIGRlbGV0ZSBrZXlzLiRzY29yZTtcbiAgICAgIGtleXMuc2NvcmUgPSB7ICRtZXRhOiAndGV4dFNjb3JlJyB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcmF3RmluZChxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIGtleXMsXG4gICAgICBtYXhUaW1lTVMsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICBleHBsYWluLFxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgIC8vIENoZWNrIGZvciBcIm5vIGdlb2luZGV4XCIgZXJyb3JcbiAgICAgIGlmIChlcnJvci5jb2RlICE9IDE3MDA3ICYmICFlcnJvci5tZXNzYWdlLm1hdGNoKC91bmFibGUgdG8gZmluZCBpbmRleCBmb3IgLmdlb05lYXIvKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIEZpZ3VyZSBvdXQgd2hhdCBrZXkgbmVlZHMgYW4gaW5kZXhcbiAgICAgIGNvbnN0IGtleSA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL2ZpZWxkPShbQS1aYS16XzAtOV0rKSAvKVsxXTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5kZXggPSB7fTtcbiAgICAgIGluZGV4W2tleV0gPSAnMmQnO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uXG4gICAgICAgICAgLmNyZWF0ZUluZGV4KGluZGV4KVxuICAgICAgICAgIC8vIFJldHJ5LCBidXQganVzdCBvbmNlLlxuICAgICAgICAgIC50aGVuKCgpID0+XG4gICAgICAgICAgICB0aGlzLl9yYXdGaW5kKHF1ZXJ5LCB7XG4gICAgICAgICAgICAgIHNraXAsXG4gICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgICBtYXhUaW1lTVMsXG4gICAgICAgICAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgICAgICAgICBoaW50LFxuICAgICAgICAgICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICAgICAgICAgIGV4cGxhaW4sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGF0aW9uIHRvIHN1cHBvcnQgY2FzZSBpbnNlbnNpdGl2ZSBxdWVyaWVzXG4gICAqL1xuICBzdGF0aWMgY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uKCkge1xuICAgIHJldHVybiB7IGxvY2FsZTogJ2VuX1VTJywgc3RyZW5ndGg6IDIgfTtcbiAgfVxuXG4gIF9yYXdGaW5kKFxuICAgIHF1ZXJ5LFxuICAgIHsgc2tpcCwgbGltaXQsIHNvcnQsIGtleXMsIG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGNhc2VJbnNlbnNpdGl2ZSwgZXhwbGFpbiB9ID0ge31cbiAgKSB7XG4gICAgbGV0IGZpbmRPcGVyYXRpb24gPSB0aGlzLl9tb25nb0NvbGxlY3Rpb24uZmluZChxdWVyeSwge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICB9KTtcblxuICAgIGlmIChrZXlzKSB7XG4gICAgICBmaW5kT3BlcmF0aW9uID0gZmluZE9wZXJhdGlvbi5wcm9qZWN0KGtleXMpO1xuICAgIH1cblxuICAgIGlmIChjYXNlSW5zZW5zaXRpdmUpIHtcbiAgICAgIGZpbmRPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uLmNvbGxhdGlvbihNb25nb0NvbGxlY3Rpb24uY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uKCkpO1xuICAgIH1cblxuICAgIGlmIChtYXhUaW1lTVMpIHtcbiAgICAgIGZpbmRPcGVyYXRpb24gPSBmaW5kT3BlcmF0aW9uLm1heFRpbWVNUyhtYXhUaW1lTVMpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBsYWluID8gZmluZE9wZXJhdGlvbi5leHBsYWluKGV4cGxhaW4pIDogZmluZE9wZXJhdGlvbi50b0FycmF5KCk7XG4gIH1cblxuICBjb3VudChxdWVyeSwgeyBza2lwLCBsaW1pdCwgc29ydCwgbWF4VGltZU1TLCByZWFkUHJlZmVyZW5jZSwgaGludCB9ID0ge30pIHtcbiAgICAvLyBJZiBxdWVyeSBpcyBlbXB0eSwgdGhlbiB1c2UgZXN0aW1hdGVkRG9jdW1lbnRDb3VudCBpbnN0ZWFkLlxuICAgIC8vIFRoaXMgaXMgZHVlIHRvIGNvdW50RG9jdW1lbnRzIHBlcmZvcm1pbmcgYSBzY2FuLFxuICAgIC8vIHdoaWNoIGdyZWF0bHkgaW5jcmVhc2VzIGV4ZWN1dGlvbiB0aW1lIHdoZW4gYmVpbmcgcnVuIG9uIGxhcmdlIGNvbGxlY3Rpb25zLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQXV0b21hdHRpYy9tb25nb29zZS9pc3N1ZXMvNjcxMyBmb3IgbW9yZSBpbmZvIHJlZ2FyZGluZyB0aGlzIHByb2JsZW0uXG4gICAgaWYgKHR5cGVvZiBxdWVyeSAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uZXN0aW1hdGVkRG9jdW1lbnRDb3VudCh7XG4gICAgICAgIG1heFRpbWVNUyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50T3BlcmF0aW9uID0gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNvdW50RG9jdW1lbnRzKHF1ZXJ5LCB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAgbWF4VGltZU1TLFxuICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICBoaW50LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvdW50T3BlcmF0aW9uO1xuICB9XG5cbiAgZGlzdGluY3QoZmllbGQsIHF1ZXJ5KSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kaXN0aW5jdChmaWVsZCwgcXVlcnkpO1xuICB9XG5cbiAgYWdncmVnYXRlKHBpcGVsaW5lLCB7IG1heFRpbWVNUywgcmVhZFByZWZlcmVuY2UsIGhpbnQsIGV4cGxhaW4gfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvblxuICAgICAgLmFnZ3JlZ2F0ZShwaXBlbGluZSwgeyBtYXhUaW1lTVMsIHJlYWRQcmVmZXJlbmNlLCBoaW50LCBleHBsYWluIH0pXG4gICAgICAudG9BcnJheSgpO1xuICB9XG5cbiAgaW5zZXJ0T25lKG9iamVjdCwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24uaW5zZXJ0T25lKG9iamVjdCwgeyBzZXNzaW9uIH0pO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSB1cGRhdGVzIGRhdGEgaW4gdGhlIGRhdGFiYXNlIGZvciBhIHNpbmdsZSAoZmlyc3QpIG9iamVjdCB0aGF0IG1hdGNoZWQgdGhlIHF1ZXJ5XG4gIC8vIElmIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBxdWVyeSAtIGRvZXMgaW5zZXJ0XG4gIC8vIFBvc3RncmVzIE5vdGU6IGBJTlNFUlQgLi4uIE9OIENPTkZMSUNUIFVQREFURWAgdGhhdCBpcyBhdmFpbGFibGUgc2luY2UgOS41LlxuICB1cHNlcnRPbmUocXVlcnksIHVwZGF0ZSwgc2Vzc2lvbikge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUsIHtcbiAgICAgIHVwc2VydDogdHJ1ZSxcbiAgICAgIHNlc3Npb24sXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVPbmUocXVlcnksIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9tb25nb0NvbGxlY3Rpb24udXBkYXRlT25lKHF1ZXJ5LCB1cGRhdGUpO1xuICB9XG5cbiAgdXBkYXRlTWFueShxdWVyeSwgdXBkYXRlLCBzZXNzaW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi51cGRhdGVNYW55KHF1ZXJ5LCB1cGRhdGUsIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIGRlbGV0ZU1hbnkocXVlcnksIHNlc3Npb24pIHtcbiAgICByZXR1cm4gdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmRlbGV0ZU1hbnkocXVlcnksIHsgc2Vzc2lvbiB9KTtcbiAgfVxuXG4gIF9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZChpbmRleFJlcXVlc3QpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KFxuICAgICAgICBpbmRleFJlcXVlc3QsXG4gICAgICAgIHsgdW5pcXVlOiB0cnVlLCBiYWNrZ3JvdW5kOiB0cnVlLCBzcGFyc2U6IHRydWUgfSxcbiAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRyb3AoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vbmdvQ29sbGVjdGlvbi5kcm9wKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsTUFBTUEsT0FBTyxHQUFHQyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ2xDLE1BQU1DLFVBQVUsR0FBR0YsT0FBTyxDQUFDRSxVQUFVO0FBRXRCLE1BQU1DLGVBQWUsQ0FBQztFQUduQ0MsV0FBVyxDQUFDQyxlQUEyQixFQUFFO0lBQ3ZDLElBQUksQ0FBQ0MsZ0JBQWdCLEdBQUdELGVBQWU7RUFDekM7O0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBRSxJQUFJLENBQ0ZDLEtBQUssRUFDTDtJQUFFQyxJQUFJO0lBQUVDLEtBQUs7SUFBRUMsSUFBSTtJQUFFQyxJQUFJO0lBQUVDLFNBQVM7SUFBRUMsY0FBYztJQUFFQyxJQUFJO0lBQUVDLGVBQWU7SUFBRUM7RUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQzNGO0lBQ0E7SUFDQSxJQUFJTCxJQUFJLElBQUlBLElBQUksQ0FB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
|