parse-server 2.8.4 → 8.6.2
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/LICENSE +167 -25
- package/NOTICE +10 -0
- package/README.md +929 -278
- package/lib/AccountLockout.js +47 -30
- package/lib/Adapters/AdapterLoader.js +21 -6
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
- package/lib/Adapters/Auth/AuthAdapter.js +116 -13
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
- package/lib/Adapters/Auth/OAuth1Client.js +27 -46
- package/lib/Adapters/Auth/apple.js +123 -0
- package/lib/Adapters/Auth/facebook.js +162 -35
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +118 -48
- package/lib/Adapters/Auth/google.js +160 -51
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +6 -7
- package/lib/Adapters/Auth/index.js +170 -62
- package/lib/Adapters/Auth/instagram.js +114 -40
- package/lib/Adapters/Auth/janraincapture.js +52 -23
- package/lib/Adapters/Auth/janrainengage.js +19 -36
- package/lib/Adapters/Auth/keycloak.js +148 -0
- package/lib/Adapters/Auth/ldap.js +167 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +111 -55
- package/lib/Adapters/Auth/meetup.js +24 -34
- package/lib/Adapters/Auth/mfa.js +324 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +97 -162
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +108 -49
- package/lib/Adapters/Auth/spotify.js +107 -55
- package/lib/Adapters/Auth/twitter.js +188 -48
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +26 -39
- package/lib/Adapters/Auth/wechat.js +106 -44
- package/lib/Adapters/Auth/weibo.js +132 -58
- package/lib/Adapters/Cache/CacheAdapter.js +13 -8
- package/lib/Adapters/Cache/InMemoryCache.js +3 -13
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
- package/lib/Adapters/Cache/LRUCache.js +13 -27
- package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +10 -8
- package/lib/Adapters/Files/FilesAdapter.js +83 -25
- package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
- package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
- package/lib/Adapters/Logger/WinstonLogger.js +69 -88
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
- package/lib/Adapters/Push/PushAdapter.js +14 -7
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +488 -125
- package/lib/ClientSDK.js +2 -6
- package/lib/Config.js +525 -94
- package/lib/Controllers/AdaptableController.js +5 -25
- package/lib/Controllers/AnalyticsController.js +22 -23
- package/lib/Controllers/CacheController.js +10 -31
- package/lib/Controllers/DatabaseController.js +767 -313
- package/lib/Controllers/FilesController.js +49 -54
- package/lib/Controllers/HooksController.js +80 -84
- package/lib/Controllers/LiveQueryController.js +35 -22
- package/lib/Controllers/LoggerController.js +22 -58
- package/lib/Controllers/ParseGraphQLController.js +293 -0
- package/lib/Controllers/PushController.js +58 -49
- package/lib/Controllers/SchemaController.js +916 -422
- package/lib/Controllers/UserController.js +265 -180
- package/lib/Controllers/index.js +90 -125
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +30 -0
- package/lib/Deprecator/Deprecator.js +127 -0
- package/lib/Error.js +48 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +214 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +78 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +162 -0
- package/lib/GraphQL/loaders/schemaQueries.js +81 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +63 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +274 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +25 -33
- package/lib/LiveQuery/Id.js +2 -5
- package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
- package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
- package/lib/LiveQuery/ParsePubSub.js +7 -16
- package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
- package/lib/LiveQuery/QueryTools.js +76 -15
- package/lib/LiveQuery/RequestSchema.js +111 -97
- package/lib/LiveQuery/SessionTokenCache.js +23 -36
- package/lib/LiveQuery/Subscription.js +8 -17
- package/lib/LiveQuery/equalObjects.js +2 -3
- package/lib/Options/Definitions.js +1355 -382
- package/lib/Options/docs.js +301 -62
- package/lib/Options/index.js +11 -1
- package/lib/Options/parsers.js +14 -10
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +6 -13
- package/lib/ParseServer.js +474 -235
- package/lib/ParseServerRESTController.js +102 -40
- package/lib/PromiseRouter.js +39 -50
- package/lib/Push/PushQueue.js +24 -30
- package/lib/Push/PushWorker.js +32 -56
- package/lib/Push/utils.js +22 -35
- package/lib/RestQuery.js +361 -139
- package/lib/RestWrite.js +713 -344
- package/lib/Routers/AggregateRouter.js +97 -71
- package/lib/Routers/AnalyticsRouter.js +8 -14
- package/lib/Routers/AudiencesRouter.js +16 -35
- package/lib/Routers/ClassesRouter.js +86 -72
- package/lib/Routers/CloudCodeRouter.js +28 -37
- package/lib/Routers/FeaturesRouter.js +22 -25
- package/lib/Routers/FilesRouter.js +266 -171
- package/lib/Routers/FunctionsRouter.js +87 -103
- package/lib/Routers/GlobalConfigRouter.js +94 -33
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +43 -47
- package/lib/Routers/IAPValidationRouter.js +57 -70
- package/lib/Routers/InstallationsRouter.js +17 -25
- package/lib/Routers/LogsRouter.js +10 -25
- package/lib/Routers/PagesRouter.js +647 -0
- package/lib/Routers/PublicAPIRouter.js +104 -112
- package/lib/Routers/PurgeRouter.js +19 -29
- package/lib/Routers/PushRouter.js +14 -28
- package/lib/Routers/RolesRouter.js +7 -14
- package/lib/Routers/SchemasRouter.js +63 -42
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +25 -38
- package/lib/Routers/UsersRouter.js +463 -190
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +29 -0
- package/lib/StatusHandler.js +96 -93
- package/lib/TestUtils.js +70 -14
- package/lib/Utils.js +468 -0
- package/lib/batch.js +74 -40
- package/lib/cache.js +8 -8
- package/lib/cli/definitions/parse-live-query-server.js +4 -3
- package/lib/cli/definitions/parse-server.js +4 -3
- package/lib/cli/parse-live-query-server.js +9 -17
- package/lib/cli/parse-server.js +49 -47
- package/lib/cli/utils/commander.js +20 -29
- package/lib/cli/utils/runner.js +31 -32
- package/lib/cloud-code/Parse.Cloud.js +711 -36
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +6 -11
- package/lib/defaults.js +21 -15
- package/lib/deprecated.js +1 -1
- package/lib/index.js +78 -67
- package/lib/logger.js +12 -20
- package/lib/middlewares.js +484 -160
- package/lib/password.js +10 -6
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +4 -3
- package/lib/rest.js +157 -82
- package/lib/triggers.js +627 -185
- package/lib/vendor/README.md +3 -3
- package/lib/vendor/mongodbUrl.js +224 -137
- package/package.json +135 -57
- package/postinstall.js +38 -50
- package/public_html/invalid_verification_link.html +3 -3
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +301 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/CHANGELOG.md +0 -1246
- package/PATENTS +0 -37
- package/bin/dev +0 -37
- package/lib/.DS_Store +0 -0
- package/lib/Adapters/Auth/common.js +0 -2
- package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
- package/lib/Controllers/SchemaCache.js +0 -97
- package/lib/LiveQuery/.DS_Store +0 -0
- package/lib/cli/utils/parsers.js +0 -77
- package/lib/cloud-code/.DS_Store +0 -0
- package/lib/cloud-code/HTTPResponse.js +0 -57
- package/lib/cloud-code/Untitled-1 +0 -123
- package/lib/cloud-code/httpRequest.js +0 -102
- package/lib/cloud-code/team.html +0 -123
- package/lib/graphql/ParseClass.js +0 -234
- package/lib/graphql/Schema.js +0 -197
- package/lib/graphql/index.js +0 -1
- package/lib/graphql/types/ACL.js +0 -35
- package/lib/graphql/types/Date.js +0 -25
- package/lib/graphql/types/File.js +0 -24
- package/lib/graphql/types/GeoPoint.js +0 -35
- package/lib/graphql/types/JSONObject.js +0 -30
- package/lib/graphql/types/NumberInput.js +0 -43
- package/lib/graphql/types/NumberQuery.js +0 -42
- package/lib/graphql/types/Pointer.js +0 -35
- package/lib/graphql/types/QueryConstraint.js +0 -61
- package/lib/graphql/types/StringQuery.js +0 -39
- package/lib/graphql/types/index.js +0 -110
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ParseGraphQLServer = void 0;
|
|
7
|
+
var _cors = _interopRequireDefault(require("cors"));
|
|
8
|
+
var _graphqlUploadExpress = _interopRequireDefault(require("graphql-upload/graphqlUploadExpress.js"));
|
|
9
|
+
var _server = require("@apollo/server");
|
|
10
|
+
var _express = require("@apollo/server/express4");
|
|
11
|
+
var _disabled = require("@apollo/server/plugin/disabled");
|
|
12
|
+
var _express2 = _interopRequireDefault(require("express"));
|
|
13
|
+
var _graphql = require("graphql");
|
|
14
|
+
var _subscriptionsTransportWs = require("subscriptions-transport-ws");
|
|
15
|
+
var _middlewares = require("../middlewares");
|
|
16
|
+
var _requiredParameter = _interopRequireDefault(require("../requiredParameter"));
|
|
17
|
+
var _logger = _interopRequireDefault(require("../logger"));
|
|
18
|
+
var _ParseGraphQLSchema = require("./ParseGraphQLSchema");
|
|
19
|
+
var _ParseGraphQLController = _interopRequireWildcard(require("../Controllers/ParseGraphQLController"));
|
|
20
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
21
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
|
+
const IntrospectionControlPlugin = publicIntrospection => ({
|
|
23
|
+
requestDidStart: requestContext => ({
|
|
24
|
+
didResolveOperation: async () => {
|
|
25
|
+
// If public introspection is enabled, we allow all introspection queries
|
|
26
|
+
if (publicIntrospection) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const isMasterOrMaintenance = requestContext.contextValue.auth?.isMaster || requestContext.contextValue.auth?.isMaintenance;
|
|
30
|
+
if (isMasterOrMaintenance) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Now we check if the query is an introspection query
|
|
35
|
+
// this check strategy should work in 99.99% cases
|
|
36
|
+
// we can have an issue if a user name a field or class __schemaSomething
|
|
37
|
+
// we want to avoid a full AST check
|
|
38
|
+
const isIntrospectionQuery = requestContext.request.query?.includes('__schema');
|
|
39
|
+
if (isIntrospectionQuery) {
|
|
40
|
+
throw new _graphql.GraphQLError('Introspection is not allowed', {
|
|
41
|
+
extensions: {
|
|
42
|
+
http: {
|
|
43
|
+
status: 403
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
});
|
|
51
|
+
class ParseGraphQLServer {
|
|
52
|
+
constructor(parseServer, config) {
|
|
53
|
+
this.parseServer = parseServer || (0, _requiredParameter.default)('You must provide a parseServer instance!');
|
|
54
|
+
if (!config || !config.graphQLPath) {
|
|
55
|
+
(0, _requiredParameter.default)('You must provide a config.graphQLPath!');
|
|
56
|
+
}
|
|
57
|
+
this.config = config;
|
|
58
|
+
this.parseGraphQLController = this.parseServer.config.parseGraphQLController;
|
|
59
|
+
this.log = this.parseServer.config && this.parseServer.config.loggerController || _logger.default;
|
|
60
|
+
this.parseGraphQLSchema = new _ParseGraphQLSchema.ParseGraphQLSchema({
|
|
61
|
+
parseGraphQLController: this.parseGraphQLController,
|
|
62
|
+
databaseController: this.parseServer.config.databaseController,
|
|
63
|
+
log: this.log,
|
|
64
|
+
graphQLCustomTypeDefs: this.config.graphQLCustomTypeDefs,
|
|
65
|
+
appId: this.parseServer.config.appId
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async _getGraphQLOptions() {
|
|
69
|
+
try {
|
|
70
|
+
return {
|
|
71
|
+
schema: await this.parseGraphQLSchema.load(),
|
|
72
|
+
context: async ({
|
|
73
|
+
req,
|
|
74
|
+
res
|
|
75
|
+
}) => {
|
|
76
|
+
res.set('access-control-allow-origin', req.get('origin') || '*');
|
|
77
|
+
return {
|
|
78
|
+
info: req.info,
|
|
79
|
+
config: req.config,
|
|
80
|
+
auth: req.auth
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
} catch (e) {
|
|
85
|
+
this.log.error(e.stack || typeof e.toString === 'function' && e.toString() || e);
|
|
86
|
+
throw e;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async _getServer() {
|
|
90
|
+
const schemaRef = this.parseGraphQLSchema.graphQLSchema;
|
|
91
|
+
const newSchemaRef = await this.parseGraphQLSchema.load();
|
|
92
|
+
if (schemaRef === newSchemaRef && this._server) {
|
|
93
|
+
return this._server;
|
|
94
|
+
}
|
|
95
|
+
// It means a parallel _getServer call is already in progress
|
|
96
|
+
if (this._schemaRefMutex === newSchemaRef) {
|
|
97
|
+
return this._server;
|
|
98
|
+
}
|
|
99
|
+
// Update the schema ref mutex to avoid parallel _getServer calls
|
|
100
|
+
this._schemaRefMutex = newSchemaRef;
|
|
101
|
+
const createServer = async () => {
|
|
102
|
+
try {
|
|
103
|
+
const {
|
|
104
|
+
schema,
|
|
105
|
+
context
|
|
106
|
+
} = await this._getGraphQLOptions();
|
|
107
|
+
const apollo = new _server.ApolloServer({
|
|
108
|
+
csrfPrevention: {
|
|
109
|
+
// See https://www.apollographql.com/docs/router/configuration/csrf/
|
|
110
|
+
// needed since we use graphql upload
|
|
111
|
+
requestHeaders: ['X-Parse-Application-Id']
|
|
112
|
+
},
|
|
113
|
+
introspection: this.config.graphQLPublicIntrospection,
|
|
114
|
+
plugins: [(0, _disabled.ApolloServerPluginCacheControlDisabled)(), IntrospectionControlPlugin(this.config.graphQLPublicIntrospection)],
|
|
115
|
+
schema
|
|
116
|
+
});
|
|
117
|
+
await apollo.start();
|
|
118
|
+
return (0, _express.expressMiddleware)(apollo, {
|
|
119
|
+
context
|
|
120
|
+
});
|
|
121
|
+
} catch (e) {
|
|
122
|
+
// Reset all mutexes and forward the error
|
|
123
|
+
this._server = null;
|
|
124
|
+
this._schemaRefMutex = null;
|
|
125
|
+
throw e;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
// Do not await so parallel request will wait the same promise ref
|
|
129
|
+
this._server = createServer();
|
|
130
|
+
return this._server;
|
|
131
|
+
}
|
|
132
|
+
_transformMaxUploadSizeToBytes(maxUploadSize) {
|
|
133
|
+
const unitMap = {
|
|
134
|
+
kb: 1,
|
|
135
|
+
mb: 2,
|
|
136
|
+
gb: 3
|
|
137
|
+
};
|
|
138
|
+
return Number(maxUploadSize.slice(0, -2)) * Math.pow(1024, unitMap[maxUploadSize.slice(-2).toLowerCase()]);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* @static
|
|
143
|
+
* Allow developers to customize each request with inversion of control/dependency injection
|
|
144
|
+
*/
|
|
145
|
+
applyRequestContextMiddleware(api, options) {
|
|
146
|
+
if (options.requestContextMiddleware) {
|
|
147
|
+
if (typeof options.requestContextMiddleware !== 'function') {
|
|
148
|
+
throw new Error('requestContextMiddleware must be a function');
|
|
149
|
+
}
|
|
150
|
+
api.use(this.config.graphQLPath, options.requestContextMiddleware);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
applyGraphQL(app) {
|
|
154
|
+
if (!app || !app.use) {
|
|
155
|
+
(0, _requiredParameter.default)('You must provide an Express.js app instance!');
|
|
156
|
+
}
|
|
157
|
+
app.use(this.config.graphQLPath, (0, _cors.default)());
|
|
158
|
+
app.use(this.config.graphQLPath, _middlewares.handleParseHeaders);
|
|
159
|
+
app.use(this.config.graphQLPath, _middlewares.handleParseSession);
|
|
160
|
+
this.applyRequestContextMiddleware(app, this.parseServer.config);
|
|
161
|
+
app.use(this.config.graphQLPath, _middlewares.handleParseErrors);
|
|
162
|
+
app.use(this.config.graphQLPath, (0, _graphqlUploadExpress.default)({
|
|
163
|
+
maxFileSize: this._transformMaxUploadSizeToBytes(this.parseServer.config.maxUploadSize || '20mb')
|
|
164
|
+
}));
|
|
165
|
+
app.use(this.config.graphQLPath, _express2.default.json(), async (req, res, next) => {
|
|
166
|
+
const server = await this._getServer();
|
|
167
|
+
return server(req, res, next);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
applyPlayground(app) {
|
|
171
|
+
if (!app || !app.get) {
|
|
172
|
+
(0, _requiredParameter.default)('You must provide an Express.js app instance!');
|
|
173
|
+
}
|
|
174
|
+
app.get(this.config.playgroundPath || (0, _requiredParameter.default)('You must provide a config.playgroundPath to applyPlayground!'), (_req, res) => {
|
|
175
|
+
res.setHeader('Content-Type', 'text/html');
|
|
176
|
+
res.write(`<div id="sandbox" style="position:absolute;top:0;right:0;bottom:0;left:0"></div>
|
|
177
|
+
<script src="https://embeddable-sandbox.cdn.apollographql.com/_latest/embeddable-sandbox.umd.production.min.js"></script>
|
|
178
|
+
<script>
|
|
179
|
+
new window.EmbeddedSandbox({
|
|
180
|
+
target: "#sandbox",
|
|
181
|
+
endpointIsEditable: false,
|
|
182
|
+
initialEndpoint: ${JSON.stringify(this.config.graphQLPath)},
|
|
183
|
+
handleRequest: (endpointUrl, options) => {
|
|
184
|
+
return fetch(endpointUrl, {
|
|
185
|
+
...options,
|
|
186
|
+
headers: {
|
|
187
|
+
...options.headers,
|
|
188
|
+
'X-Parse-Application-Id': ${JSON.stringify(this.parseServer.config.appId)},
|
|
189
|
+
'X-Parse-Master-Key': ${JSON.stringify(this.parseServer.config.masterKey)},
|
|
190
|
+
},
|
|
191
|
+
})
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
// advanced options: https://www.apollographql.com/docs/studio/explorer/sandbox#embedding-sandbox
|
|
195
|
+
</script>`);
|
|
196
|
+
res.end();
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
createSubscriptions(server) {
|
|
200
|
+
_subscriptionsTransportWs.SubscriptionServer.create({
|
|
201
|
+
execute: _graphql.execute,
|
|
202
|
+
subscribe: _graphql.subscribe,
|
|
203
|
+
onOperation: async (_message, params, webSocket) => Object.assign({}, params, await this._getGraphQLOptions(webSocket.upgradeReq))
|
|
204
|
+
}, {
|
|
205
|
+
server,
|
|
206
|
+
path: this.config.subscriptionsPath || (0, _requiredParameter.default)('You must provide a config.subscriptionsPath to createSubscriptions!')
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
setGraphQLConfig(graphQLConfig) {
|
|
210
|
+
return this.parseGraphQLController.updateGraphQLConfig(graphQLConfig);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.ParseGraphQLServer = ParseGraphQLServer;
|
|
214
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29ycyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2dyYXBocWxVcGxvYWRFeHByZXNzIiwiX3NlcnZlciIsIl9leHByZXNzIiwiX2Rpc2FibGVkIiwiX2V4cHJlc3MyIiwiX2dyYXBocWwiLCJfc3Vic2NyaXB0aW9uc1RyYW5zcG9ydFdzIiwiX21pZGRsZXdhcmVzIiwiX3JlcXVpcmVkUGFyYW1ldGVyIiwiX2xvZ2dlciIsIl9QYXJzZUdyYXBoUUxTY2hlbWEiLCJfUGFyc2VHcmFwaFFMQ29udHJvbGxlciIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSW50cm9zcGVjdGlvbkNvbnRyb2xQbHVnaW4iLCJwdWJsaWNJbnRyb3NwZWN0aW9uIiwicmVxdWVzdERpZFN0YXJ0IiwicmVxdWVzdENvbnRleHQiLCJkaWRSZXNvbHZlT3BlcmF0aW9uIiwiaXNNYXN0ZXJPck1haW50ZW5hbmNlIiwiY29udGV4dFZhbHVlIiwiYXV0aCIsImlzTWFzdGVyIiwiaXNNYWludGVuYW5jZSIsImlzSW50cm9zcGVjdGlvblF1ZXJ5IiwicmVxdWVzdCIsInF1ZXJ5IiwiaW5jbHVkZXMiLCJHcmFwaFFMRXJyb3IiLCJleHRlbnNpb25zIiwiaHR0cCIsInN0YXR1cyIsIlBhcnNlR3JhcGhRTFNlcnZlciIsImNvbnN0cnVjdG9yIiwicGFyc2VTZXJ2ZXIiLCJjb25maWciLCJyZXF1aXJlZFBhcmFtZXRlciIsImdyYXBoUUxQYXRoIiwicGFyc2VHcmFwaFFMQ29udHJvbGxlciIsImxvZyIsImxvZ2dlckNvbnRyb2xsZXIiLCJkZWZhdWx0TG9nZ2VyIiwicGFyc2VHcmFwaFFMU2NoZW1hIiwiUGFyc2VHcmFwaFFMU2NoZW1hIiwiZGF0YWJhc2VDb250cm9sbGVyIiwiZ3JhcGhRTEN1c3RvbVR5cGVEZWZzIiwiYXBwSWQiLCJfZ2V0R3JhcGhRTE9wdGlvbnMiLCJzY2hlbWEiLCJsb2FkIiwiY29udGV4dCIsInJlcSIsInJlcyIsImluZm8iLCJlcnJvciIsInN0YWNrIiwidG9TdHJpbmciLCJfZ2V0U2VydmVyIiwic2NoZW1hUmVmIiwiZ3JhcGhRTFNjaGVtYSIsIm5ld1NjaGVtYVJlZiIsIl9zY2hlbWFSZWZNdXRleCIsImNyZWF0ZVNlcnZlciIsImFwb2xsbyIsIkFwb2xsb1NlcnZlciIsImNzcmZQcmV2ZW50aW9uIiwicmVxdWVzdEhlYWRlcnMiLCJpbnRyb3NwZWN0aW9uIiwiZ3JhcGhRTFB1YmxpY0ludHJvc3BlY3Rpb24iLCJwbHVnaW5zIiwiQXBvbGxvU2VydmVyUGx1Z2luQ2FjaGVDb250cm9sRGlzYWJsZWQiLCJzdGFydCIsImV4cHJlc3NNaWRkbGV3YXJlIiwiX3RyYW5zZm9ybU1heFVwbG9hZFNpemVUb0J5dGVzIiwibWF4VXBsb2FkU2l6ZSIsInVuaXRNYXAiLCJrYiIsIm1iIiwiZ2IiLCJOdW1iZXIiLCJzbGljZSIsIk1hdGgiLCJwb3ciLCJ0b0xvd2VyQ2FzZSIsImFwcGx5UmVxdWVzdENvbnRleHRNaWRkbGV3YXJlIiwiYXBpIiwib3B0aW9ucyIsInJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSIsIkVycm9yIiwidXNlIiwiYXBwbHlHcmFwaFFMIiwiYXBwIiwiY29yc01pZGRsZXdhcmUiLCJoYW5kbGVQYXJzZUhlYWRlcnMiLCJoYW5kbGVQYXJzZVNlc3Npb24iLCJoYW5kbGVQYXJzZUVycm9ycyIsImdyYXBocWxVcGxvYWRFeHByZXNzIiwibWF4RmlsZVNpemUiLCJleHByZXNzIiwianNvbiIsIm5leHQiLCJzZXJ2ZXIiLCJhcHBseVBsYXlncm91bmQiLCJwbGF5Z3JvdW5kUGF0aCIsIl9yZXEiLCJzZXRIZWFkZXIiLCJ3cml0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJtYXN0ZXJLZXkiLCJlbmQiLCJjcmVhdGVTdWJzY3JpcHRpb25zIiwiU3Vic2NyaXB0aW9uU2VydmVyIiwiY3JlYXRlIiwiZXhlY3V0ZSIsInN1YnNjcmliZSIsIm9uT3BlcmF0aW9uIiwiX21lc3NhZ2UiLCJwYXJhbXMiLCJ3ZWJTb2NrZXQiLCJhc3NpZ24iLCJ1cGdyYWRlUmVxIiwicGF0aCIsInN1YnNjcmlwdGlvbnNQYXRoIiwic2V0R3JhcGhRTENvbmZpZyIsImdyYXBoUUxDb25maWciLCJ1cGRhdGVHcmFwaFFMQ29uZmlnIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9HcmFwaFFML1BhcnNlR3JhcGhRTFNlcnZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29yc01pZGRsZXdhcmUgZnJvbSAnY29ycyc7XG5pbXBvcnQgZ3JhcGhxbFVwbG9hZEV4cHJlc3MgZnJvbSAnZ3JhcGhxbC11cGxvYWQvZ3JhcGhxbFVwbG9hZEV4cHJlc3MuanMnO1xuaW1wb3J0IHsgQXBvbGxvU2VydmVyIH0gZnJvbSAnQGFwb2xsby9zZXJ2ZXInO1xuaW1wb3J0IHsgZXhwcmVzc01pZGRsZXdhcmUgfSBmcm9tICdAYXBvbGxvL3NlcnZlci9leHByZXNzNCc7XG5pbXBvcnQgeyBBcG9sbG9TZXJ2ZXJQbHVnaW5DYWNoZUNvbnRyb2xEaXNhYmxlZCB9IGZyb20gJ0BhcG9sbG8vc2VydmVyL3BsdWdpbi9kaXNhYmxlZCc7XG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGV4ZWN1dGUsIHN1YnNjcmliZSwgR3JhcGhRTEVycm9yIH0gZnJvbSAnZ3JhcGhxbCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25TZXJ2ZXIgfSBmcm9tICdzdWJzY3JpcHRpb25zLXRyYW5zcG9ydC13cyc7XG5pbXBvcnQgeyBoYW5kbGVQYXJzZUVycm9ycywgaGFuZGxlUGFyc2VIZWFkZXJzLCBoYW5kbGVQYXJzZVNlc3Npb24gfSBmcm9tICcuLi9taWRkbGV3YXJlcyc7XG5pbXBvcnQgcmVxdWlyZWRQYXJhbWV0ZXIgZnJvbSAnLi4vcmVxdWlyZWRQYXJhbWV0ZXInO1xuaW1wb3J0IGRlZmF1bHRMb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFBhcnNlR3JhcGhRTFNjaGVtYSB9IGZyb20gJy4vUGFyc2VHcmFwaFFMU2NoZW1hJztcbmltcG9ydCBQYXJzZUdyYXBoUUxDb250cm9sbGVyLCB7IFBhcnNlR3JhcGhRTENvbmZpZyB9IGZyb20gJy4uL0NvbnRyb2xsZXJzL1BhcnNlR3JhcGhRTENvbnRyb2xsZXInO1xuXG5cbmNvbnN0IEludHJvc3BlY3Rpb25Db250cm9sUGx1Z2luID0gKHB1YmxpY0ludHJvc3BlY3Rpb24pID0+ICh7XG5cblxuICByZXF1ZXN0RGlkU3RhcnQ6IChyZXF1ZXN0Q29udGV4dCkgPT4gKHtcblxuICAgIGRpZFJlc29sdmVPcGVyYXRpb246IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIElmIHB1YmxpYyBpbnRyb3NwZWN0aW9uIGlzIGVuYWJsZWQsIHdlIGFsbG93IGFsbCBpbnRyb3NwZWN0aW9uIHF1ZXJpZXNcbiAgICAgIGlmIChwdWJsaWNJbnRyb3NwZWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNNYXN0ZXJPck1haW50ZW5hbmNlID0gcmVxdWVzdENvbnRleHQuY29udGV4dFZhbHVlLmF1dGg/LmlzTWFzdGVyIHx8IHJlcXVlc3RDb250ZXh0LmNvbnRleHRWYWx1ZS5hdXRoPy5pc01haW50ZW5hbmNlXG4gICAgICBpZiAoaXNNYXN0ZXJPck1haW50ZW5hbmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTm93IHdlIGNoZWNrIGlmIHRoZSBxdWVyeSBpcyBhbiBpbnRyb3NwZWN0aW9uIHF1ZXJ5XG4gICAgICAvLyB0aGlzIGNoZWNrIHN0cmF0ZWd5IHNob3VsZCB3b3JrIGluIDk5Ljk5JSBjYXNlc1xuICAgICAgLy8gd2UgY2FuIGhhdmUgYW4gaXNzdWUgaWYgYSB1c2VyIG5hbWUgYSBmaWVsZCBvciBjbGFzcyBfX3NjaGVtYVNvbWV0aGluZ1xuICAgICAgLy8gd2Ugd2FudCB0byBhdm9pZCBhIGZ1bGwgQVNUIGNoZWNrXG4gICAgICBjb25zdCBpc0ludHJvc3BlY3Rpb25RdWVyeSA9XG4gICAgICAgIHJlcXVlc3RDb250ZXh0LnJlcXVlc3QucXVlcnk/LmluY2x1ZGVzKCdfX3NjaGVtYScpXG5cbiAgICAgIGlmIChpc0ludHJvc3BlY3Rpb25RdWVyeSkge1xuICAgICAgICB0aHJvdyBuZXcgR3JhcGhRTEVycm9yKCdJbnRyb3NwZWN0aW9uIGlzIG5vdCBhbGxvd2VkJywge1xuICAgICAgICAgIGV4dGVuc2lvbnM6IHtcbiAgICAgICAgICAgIGh0dHA6IHtcbiAgICAgICAgICAgICAgc3RhdHVzOiA0MDMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICB9KVxuXG59KTtcblxuY2xhc3MgUGFyc2VHcmFwaFFMU2VydmVyIHtcbiAgcGFyc2VHcmFwaFFMQ29udHJvbGxlcjogUGFyc2VHcmFwaFFMQ29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcihwYXJzZVNlcnZlciwgY29uZmlnKSB7XG4gICAgdGhpcy5wYXJzZVNlcnZlciA9IHBhcnNlU2VydmVyIHx8IHJlcXVpcmVkUGFyYW1ldGVyKCdZb3UgbXVzdCBwcm92aWRlIGEgcGFyc2VTZXJ2ZXIgaW5zdGFuY2UhJyk7XG4gICAgaWYgKCFjb25maWcgfHwgIWNvbmZpZy5ncmFwaFFMUGF0aCkge1xuICAgICAgcmVxdWlyZWRQYXJhbWV0ZXIoJ1lvdSBtdXN0IHByb3ZpZGUgYSBjb25maWcuZ3JhcGhRTFBhdGghJyk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMucGFyc2VHcmFwaFFMQ29udHJvbGxlciA9IHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLnBhcnNlR3JhcGhRTENvbnRyb2xsZXI7XG4gICAgdGhpcy5sb2cgPVxuICAgICAgKHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnICYmIHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLmxvZ2dlckNvbnRyb2xsZXIpIHx8IGRlZmF1bHRMb2dnZXI7XG4gICAgdGhpcy5wYXJzZUdyYXBoUUxTY2hlbWEgPSBuZXcgUGFyc2VHcmFwaFFMU2NoZW1hKHtcbiAgICAgIHBhcnNlR3JhcGhRTENvbnRyb2xsZXI6IHRoaXMucGFyc2VHcmFwaFFMQ29udHJvbGxlcixcbiAgICAgIGRhdGFiYXNlQ29udHJvbGxlcjogdGhpcy5wYXJzZVNlcnZlci5jb25maWcuZGF0YWJhc2VDb250cm9sbGVyLFxuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIGdyYXBoUUxDdXN0b21UeXBlRGVmczogdGhpcy5jb25maWcuZ3JhcGhRTEN1c3RvbVR5cGVEZWZzLFxuICAgICAgYXBwSWQ6IHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLmFwcElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgX2dldEdyYXBoUUxPcHRpb25zKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY2hlbWE6IGF3YWl0IHRoaXMucGFyc2VHcmFwaFFMU2NoZW1hLmxvYWQoKSxcbiAgICAgICAgY29udGV4dDogYXN5bmMgKHsgcmVxLCByZXMgfSkgPT4ge1xuICAgICAgICAgIHJlcy5zZXQoJ2FjY2Vzcy1jb250cm9sLWFsbG93LW9yaWdpbicsIHJlcS5nZXQoJ29yaWdpbicpIHx8ICcqJyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluZm86IHJlcS5pbmZvLFxuICAgICAgICAgICAgY29uZmlnOiByZXEuY29uZmlnLFxuICAgICAgICAgICAgYXV0aDogcmVxLmF1dGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoZS5zdGFjayB8fCAodHlwZW9mIGUudG9TdHJpbmcgPT09ICdmdW5jdGlvbicgJiYgZS50b1N0cmluZygpKSB8fCBlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX2dldFNlcnZlcigpIHtcbiAgICBjb25zdCBzY2hlbWFSZWYgPSB0aGlzLnBhcnNlR3JhcGhRTFNjaGVtYS5ncmFwaFFMU2NoZW1hO1xuICAgIGNvbnN0IG5ld1NjaGVtYVJlZiA9IGF3YWl0IHRoaXMucGFyc2VHcmFwaFFMU2NoZW1hLmxvYWQoKTtcbiAgICBpZiAoc2NoZW1hUmVmID09PSBuZXdTY2hlbWFSZWYgJiYgdGhpcy5fc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyO1xuICAgIH1cbiAgICAvLyBJdCBtZWFucyBhIHBhcmFsbGVsIF9nZXRTZXJ2ZXIgY2FsbCBpcyBhbHJlYWR5IGluIHByb2dyZXNzXG4gICAgaWYgKHRoaXMuX3NjaGVtYVJlZk11dGV4ID09PSBuZXdTY2hlbWFSZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXI7XG4gICAgfVxuICAgIC8vIFVwZGF0ZSB0aGUgc2NoZW1hIHJlZiBtdXRleCB0byBhdm9pZCBwYXJhbGxlbCBfZ2V0U2VydmVyIGNhbGxzXG4gICAgdGhpcy5fc2NoZW1hUmVmTXV0ZXggPSBuZXdTY2hlbWFSZWY7XG4gICAgY29uc3QgY3JlYXRlU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBzY2hlbWEsIGNvbnRleHQgfSA9IGF3YWl0IHRoaXMuX2dldEdyYXBoUUxPcHRpb25zKCk7XG4gICAgICAgIGNvbnN0IGFwb2xsbyA9IG5ldyBBcG9sbG9TZXJ2ZXIoe1xuICAgICAgICAgIGNzcmZQcmV2ZW50aW9uOiB7XG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cuYXBvbGxvZ3JhcGhxbC5jb20vZG9jcy9yb3V0ZXIvY29uZmlndXJhdGlvbi9jc3JmL1xuICAgICAgICAgICAgLy8gbmVlZGVkIHNpbmNlIHdlIHVzZSBncmFwaHFsIHVwbG9hZFxuICAgICAgICAgICAgcmVxdWVzdEhlYWRlcnM6IFsnWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCddLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW50cm9zcGVjdGlvbjogdGhpcy5jb25maWcuZ3JhcGhRTFB1YmxpY0ludHJvc3BlY3Rpb24sXG4gICAgICAgICAgcGx1Z2luczogW0Fwb2xsb1NlcnZlclBsdWdpbkNhY2hlQ29udHJvbERpc2FibGVkKCksIEludHJvc3BlY3Rpb25Db250cm9sUGx1Z2luKHRoaXMuY29uZmlnLmdyYXBoUUxQdWJsaWNJbnRyb3NwZWN0aW9uKV0sXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgYXBvbGxvLnN0YXJ0KCk7XG4gICAgICAgIHJldHVybiBleHByZXNzTWlkZGxld2FyZShhcG9sbG8sIHtcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gUmVzZXQgYWxsIG11dGV4ZXMgYW5kIGZvcndhcmQgdGhlIGVycm9yXG4gICAgICAgIHRoaXMuX3NlcnZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NjaGVtYVJlZk11dGV4ID0gbnVsbDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRG8gbm90IGF3YWl0IHNvIHBhcmFsbGVsIHJlcXVlc3Qgd2lsbCB3YWl0IHRoZSBzYW1lIHByb21pc2UgcmVmXG4gICAgdGhpcy5fc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlcjtcbiAgfVxuXG4gIF90cmFuc2Zvcm1NYXhVcGxvYWRTaXplVG9CeXRlcyhtYXhVcGxvYWRTaXplKSB7XG4gICAgY29uc3QgdW5pdE1hcCA9IHtcbiAgICAgIGtiOiAxLFxuICAgICAgbWI6IDIsXG4gICAgICBnYjogMyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIE51bWJlcihtYXhVcGxvYWRTaXplLnNsaWNlKDAsIC0yKSkgKlxuICAgICAgTWF0aC5wb3coMTAyNCwgdW5pdE1hcFttYXhVcGxvYWRTaXplLnNsaWNlKC0yKS50b0xvd2VyQ2FzZSgpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQWxsb3cgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgZWFjaCByZXF1ZXN0IHdpdGggaW52ZXJzaW9uIG9mIGNvbnRyb2wvZGVwZW5kZW5jeSBpbmplY3Rpb25cbiAgICovXG4gIGFwcGx5UmVxdWVzdENvbnRleHRNaWRkbGV3YXJlKGFwaSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVlc3RDb250ZXh0TWlkZGxld2FyZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICAgIGFwaS51c2UodGhpcy5jb25maWcuZ3JhcGhRTFBhdGgsIG9wdGlvbnMucmVxdWVzdENvbnRleHRNaWRkbGV3YXJlKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUdyYXBoUUwoYXBwKSB7XG4gICAgaWYgKCFhcHAgfHwgIWFwcC51c2UpIHtcbiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyKCdZb3UgbXVzdCBwcm92aWRlIGFuIEV4cHJlc3MuanMgYXBwIGluc3RhbmNlIScpO1xuICAgIH1cbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBjb3JzTWlkZGxld2FyZSgpKTtcbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBoYW5kbGVQYXJzZUhlYWRlcnMpO1xuICAgIGFwcC51c2UodGhpcy5jb25maWcuZ3JhcGhRTFBhdGgsIGhhbmRsZVBhcnNlU2Vzc2lvbik7XG4gICAgdGhpcy5hcHBseVJlcXVlc3RDb250ZXh0TWlkZGxld2FyZShhcHAsIHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnKTtcbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBoYW5kbGVQYXJzZUVycm9ycyk7XG4gICAgYXBwLnVzZShcbiAgICAgIHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLFxuICAgICAgZ3JhcGhxbFVwbG9hZEV4cHJlc3Moe1xuICAgICAgICBtYXhGaWxlU2l6ZTogdGhpcy5fdHJhbnNmb3JtTWF4VXBsb2FkU2l6ZVRvQnl0ZXMoXG4gICAgICAgICAgdGhpcy5wYXJzZVNlcnZlci5jb25maWcubWF4VXBsb2FkU2l6ZSB8fCAnMjBtYidcbiAgICAgICAgKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCB0aGlzLl9nZXRTZXJ2ZXIoKTtcbiAgICAgIHJldHVybiBzZXJ2ZXIocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlQbGF5Z3JvdW5kKGFwcCkge1xuICAgIGlmICghYXBwIHx8ICFhcHAuZ2V0KSB7XG4gICAgICByZXF1aXJlZFBhcmFtZXRlcignWW91IG11c3QgcHJvdmlkZSBhbiBFeHByZXNzLmpzIGFwcCBpbnN0YW5jZSEnKTtcbiAgICB9XG5cbiAgICBhcHAuZ2V0KFxuICAgICAgdGhpcy5jb25maWcucGxheWdyb3VuZFBhdGggfHxcbiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyKCdZb3UgbXVzdCBwcm92aWRlIGEgY29uZmlnLnBsYXlncm91bmRQYXRoIHRvIGFwcGx5UGxheWdyb3VuZCEnKSxcbiAgICAgIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICByZXMud3JpdGUoXG4gICAgICAgICAgYDxkaXYgaWQ9XCJzYW5kYm94XCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MFwiPjwvZGl2PlxuICAgICAgICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9lbWJlZGRhYmxlLXNhbmRib3guY2RuLmFwb2xsb2dyYXBocWwuY29tL19sYXRlc3QvZW1iZWRkYWJsZS1zYW5kYm94LnVtZC5wcm9kdWN0aW9uLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgIG5ldyB3aW5kb3cuRW1iZWRkZWRTYW5kYm94KHtcbiAgICAgICAgICAgICB0YXJnZXQ6IFwiI3NhbmRib3hcIixcbiAgICAgICAgICAgICBlbmRwb2ludElzRWRpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgIGluaXRpYWxFbmRwb2ludDogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZy5ncmFwaFFMUGF0aCl9LFxuICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3Q6IChlbmRwb2ludFVybCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZmV0Y2goZW5kcG9pbnRVcmwsIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCc6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZVNlcnZlci5jb25maWcuYXBwSWQpfSxcbiAgICAgICAgICAgICAgICAgICAgJ1gtUGFyc2UtTWFzdGVyLUtleSc6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZVNlcnZlci5jb25maWcubWFzdGVyS2V5KX0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgIH0pO1xuICAgICAgICAgICAvLyBhZHZhbmNlZCBvcHRpb25zOiBodHRwczovL3d3dy5hcG9sbG9ncmFwaHFsLmNvbS9kb2NzL3N0dWRpby9leHBsb3Jlci9zYW5kYm94I2VtYmVkZGluZy1zYW5kYm94XG4gICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICApO1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbnMoc2VydmVyKSB7XG4gICAgU3Vic2NyaXB0aW9uU2VydmVyLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgZXhlY3V0ZSxcbiAgICAgICAgc3Vic2NyaWJlLFxuICAgICAgICBvbk9wZXJhdGlvbjogYXN5bmMgKF9tZXNzYWdlLCBwYXJhbXMsIHdlYlNvY2tldCkgPT5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBwYXJhbXMsIGF3YWl0IHRoaXMuX2dldEdyYXBoUUxPcHRpb25zKHdlYlNvY2tldC51cGdyYWRlUmVxKSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzZXJ2ZXIsXG4gICAgICAgIHBhdGg6XG4gICAgICAgICAgdGhpcy5jb25maWcuc3Vic2NyaXB0aW9uc1BhdGggfHxcbiAgICAgICAgICByZXF1aXJlZFBhcmFtZXRlcignWW91IG11c3QgcHJvdmlkZSBhIGNvbmZpZy5zdWJzY3JpcHRpb25zUGF0aCB0byBjcmVhdGVTdWJzY3JpcHRpb25zIScpLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRHcmFwaFFMQ29uZmlnKGdyYXBoUUxDb25maWc6IFBhcnNlR3JhcGhRTENvbmZpZyk6IFByb21pc2Uge1xuICAgIHJldHVybiB0aGlzLnBhcnNlR3JhcGhRTENvbnRyb2xsZXIudXBkYXRlR3JhcGhRTENvbmZpZyhncmFwaFFMQ29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgeyBQYXJzZUdyYXBoUUxTZXJ2ZXIgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0Es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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.updateObject = exports.deleteObject = exports.createObject = void 0;
|
|
7
|
+
var _rest = _interopRequireDefault(require("../../rest"));
|
|
8
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
const createObject = async (className, fields, config, auth, info) => {
|
|
10
|
+
if (!fields) {
|
|
11
|
+
fields = {};
|
|
12
|
+
}
|
|
13
|
+
return (await _rest.default.create(config, auth, className, fields, info.clientSDK, info.context)).response;
|
|
14
|
+
};
|
|
15
|
+
exports.createObject = createObject;
|
|
16
|
+
const updateObject = async (className, objectId, fields, config, auth, info) => {
|
|
17
|
+
if (!fields) {
|
|
18
|
+
fields = {};
|
|
19
|
+
}
|
|
20
|
+
return (await _rest.default.update(config, auth, className, {
|
|
21
|
+
objectId
|
|
22
|
+
}, fields, info.clientSDK, info.context)).response;
|
|
23
|
+
};
|
|
24
|
+
exports.updateObject = updateObject;
|
|
25
|
+
const deleteObject = async (className, objectId, config, auth, info) => {
|
|
26
|
+
await _rest.default.del(config, auth, className, objectId, info.context);
|
|
27
|
+
return true;
|
|
28
|
+
};
|
|
29
|
+
exports.deleteObject = deleteObject;
|
|
30
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVzdCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY3JlYXRlT2JqZWN0IiwiY2xhc3NOYW1lIiwiZmllbGRzIiwiY29uZmlnIiwiYXV0aCIsImluZm8iLCJyZXN0IiwiY3JlYXRlIiwiY2xpZW50U0RLIiwiY29udGV4dCIsInJlc3BvbnNlIiwiZXhwb3J0cyIsInVwZGF0ZU9iamVjdCIsIm9iamVjdElkIiwidXBkYXRlIiwiZGVsZXRlT2JqZWN0IiwiZGVsIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0dyYXBoUUwvaGVscGVycy9vYmplY3RzTXV0YXRpb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZXN0IGZyb20gJy4uLy4uL3Jlc3QnO1xuXG5jb25zdCBjcmVhdGVPYmplY3QgPSBhc3luYyAoY2xhc3NOYW1lLCBmaWVsZHMsIGNvbmZpZywgYXV0aCwgaW5mbykgPT4ge1xuICBpZiAoIWZpZWxkcykge1xuICAgIGZpZWxkcyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIChhd2FpdCByZXN0LmNyZWF0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgZmllbGRzLCBpbmZvLmNsaWVudFNESywgaW5mby5jb250ZXh0KSlcbiAgICAucmVzcG9uc2U7XG59O1xuXG5jb25zdCB1cGRhdGVPYmplY3QgPSBhc3luYyAoY2xhc3NOYW1lLCBvYmplY3RJZCwgZmllbGRzLCBjb25maWcsIGF1dGgsIGluZm8pID0+IHtcbiAgaWYgKCFmaWVsZHMpIHtcbiAgICBmaWVsZHMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgYXdhaXQgcmVzdC51cGRhdGUoY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHsgb2JqZWN0SWQgfSwgZmllbGRzLCBpbmZvLmNsaWVudFNESywgaW5mby5jb250ZXh0KVxuICApLnJlc3BvbnNlO1xufTtcblxuY29uc3QgZGVsZXRlT2JqZWN0ID0gYXN5bmMgKGNsYXNzTmFtZSwgb2JqZWN0SWQsIGNvbmZpZywgYXV0aCwgaW5mbykgPT4ge1xuICBhd2FpdCByZXN0LmRlbChjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgb2JqZWN0SWQsIGluZm8uY29udGV4dCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IHsgY3JlYXRlT2JqZWN0LCB1cGRhdGVPYmplY3QsIGRlbGV0ZU9iamVjdCB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFBOEIsU0FBQUQsdUJBQUFFLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFOUIsTUFBTUcsWUFBWSxHQUFHLE1BQUFBLENBQU9DLFNBQVMsRUFBRUMsTUFBTSxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsSUFBSSxLQUFLO0VBQ3BFLElBQUksQ0FBQ0gsTUFBTSxFQUFFO0lBQ1hBLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDYjtFQUVBLE9BQU8sQ0FBQyxNQUFNSSxhQUFJLENBQUNDLE1BQU0sQ0FBQ0osTUFBTSxFQUFFQyxJQUFJLEVBQUVILFNBQVMsRUFBRUMsTUFBTSxFQUFFRyxJQUFJLENBQUNHLFNBQVMsRUFBRUgsSUFBSSxDQUFDSSxPQUFPLENBQUMsRUFDckZDLFFBQVE7QUFDYixDQUFDO0FBQUNDLE9BQUEsQ0FBQVgsWUFBQSxHQUFBQSxZQUFBO0FBRUYsTUFBTVksWUFBWSxHQUFHLE1BQUFBLENBQU9YLFNBQVMsRUFBRVksUUFBUSxFQUFFWCxNQUFNLEVBQUVDLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxJQUFJLEtBQUs7RUFDOUUsSUFBSSxDQUFDSCxNQUFNLEVBQUU7SUFDWEEsTUFBTSxHQUFHLENBQUMsQ0FBQztFQUNiO0VBRUEsT0FBTyxDQUNMLE1BQU1JLGFBQUksQ0FBQ1EsTUFBTSxDQUFDWCxNQUFNLEVBQUVDLElBQUksRUFBRUgsU0FBUyxFQUFFO0lBQUVZO0VBQVMsQ0FBQyxFQUFFWCxNQUFNLEVBQUVHLElBQUksQ0FBQ0csU0FBUyxFQUFFSCxJQUFJLENBQUNJLE9BQU8sQ0FBQyxFQUM5RkMsUUFBUTtBQUNaLENBQUM7QUFBQ0MsT0FBQSxDQUFBQyxZQUFBLEdBQUFBLFlBQUE7QUFFRixNQUFNRyxZQUFZLEdBQUcsTUFBQUEsQ0FBT2QsU0FBUyxFQUFFWSxRQUFRLEVBQUVWLE1BQU0sRUFBRUMsSUFBSSxFQUFFQyxJQUFJLEtBQUs7RUFDdEUsTUFBTUMsYUFBSSxDQUFDVSxHQUFHLENBQUNiLE1BQU0sRUFBRUMsSUFBSSxFQUFFSCxTQUFTLEVBQUVZLFFBQVEsRUFBRVIsSUFBSSxDQUFDSSxPQUFPLENBQUM7RUFDL0QsT0FBTyxJQUFJO0FBQ2IsQ0FBQztBQUFDRSxPQUFBLENBQUFJLFlBQUEsR0FBQUEsWUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.needToGetAllKeys = exports.getObject = exports.findObjects = exports.calculateSkipAndLimit = void 0;
|
|
7
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
8
|
+
var _graphqlRelay = require("graphql-relay");
|
|
9
|
+
var _rest = _interopRequireDefault(require("../../rest"));
|
|
10
|
+
var _query = require("../transformers/query");
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
// Eslint/Prettier conflict
|
|
13
|
+
/* eslint-disable*/
|
|
14
|
+
const needToGetAllKeys = (fields, keys, parseClasses) => keys ? keys.split(',').some(keyName => {
|
|
15
|
+
const key = keyName.split('.');
|
|
16
|
+
if (fields[key[0]]) {
|
|
17
|
+
if (fields[key[0]].type === 'Relation') return false;
|
|
18
|
+
if (fields[key[0]].type === 'Pointer') {
|
|
19
|
+
const subClass = parseClasses[fields[key[0]].targetClass];
|
|
20
|
+
if (subClass && subClass.fields[key[1]]) {
|
|
21
|
+
// Current sub key is not custom
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
} else if (!key[1] || fields[key[0]].type === 'Array' || fields[key[0]].type === 'Object') {
|
|
25
|
+
// current key is not custom
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Key not found into Parse Schema so it's custom
|
|
30
|
+
return true;
|
|
31
|
+
}) : true;
|
|
32
|
+
/* eslint-enable*/
|
|
33
|
+
exports.needToGetAllKeys = needToGetAllKeys;
|
|
34
|
+
const getObject = async (className, objectId, keys, include, readPreference, includeReadPreference, config, auth, info, parseClasses) => {
|
|
35
|
+
const options = {};
|
|
36
|
+
try {
|
|
37
|
+
if (!needToGetAllKeys(parseClasses[className].fields, keys, parseClasses)) {
|
|
38
|
+
options.keys = keys;
|
|
39
|
+
}
|
|
40
|
+
} catch (e) {
|
|
41
|
+
// eslint-disable-next-line no-console
|
|
42
|
+
console.error(e);
|
|
43
|
+
}
|
|
44
|
+
if (include) {
|
|
45
|
+
options.include = include;
|
|
46
|
+
if (includeReadPreference) {
|
|
47
|
+
options.includeReadPreference = includeReadPreference;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (readPreference) {
|
|
51
|
+
options.readPreference = readPreference;
|
|
52
|
+
}
|
|
53
|
+
const response = await _rest.default.get(config, auth, className, objectId, options, info.clientSDK, info.context);
|
|
54
|
+
if (!response.results || response.results.length == 0) {
|
|
55
|
+
throw new _node.default.Error(_node.default.Error.OBJECT_NOT_FOUND, 'Object not found.');
|
|
56
|
+
}
|
|
57
|
+
const object = response.results[0];
|
|
58
|
+
if (className === '_User') {
|
|
59
|
+
delete object.sessionToken;
|
|
60
|
+
}
|
|
61
|
+
return object;
|
|
62
|
+
};
|
|
63
|
+
exports.getObject = getObject;
|
|
64
|
+
const findObjects = async (className, where, order, skipInput, first, after, last, before, keys, include, includeAll, readPreference, includeReadPreference, subqueryReadPreference, config, auth, info, selectedFields, parseClasses) => {
|
|
65
|
+
if (!where) {
|
|
66
|
+
where = {};
|
|
67
|
+
}
|
|
68
|
+
(0, _query.transformQueryInputToParse)(where, className, parseClasses);
|
|
69
|
+
const skipAndLimitCalculation = calculateSkipAndLimit(skipInput, first, after, last, before, config.maxLimit);
|
|
70
|
+
let {
|
|
71
|
+
skip
|
|
72
|
+
} = skipAndLimitCalculation;
|
|
73
|
+
const {
|
|
74
|
+
limit,
|
|
75
|
+
needToPreCount
|
|
76
|
+
} = skipAndLimitCalculation;
|
|
77
|
+
let preCount = undefined;
|
|
78
|
+
if (needToPreCount) {
|
|
79
|
+
const preCountOptions = {
|
|
80
|
+
limit: 0,
|
|
81
|
+
count: true
|
|
82
|
+
};
|
|
83
|
+
if (readPreference) {
|
|
84
|
+
preCountOptions.readPreference = readPreference;
|
|
85
|
+
}
|
|
86
|
+
if (Object.keys(where).length > 0 && subqueryReadPreference) {
|
|
87
|
+
preCountOptions.subqueryReadPreference = subqueryReadPreference;
|
|
88
|
+
}
|
|
89
|
+
preCount = (await _rest.default.find(config, auth, className, where, preCountOptions, info.clientSDK, info.context)).count;
|
|
90
|
+
if ((skip || 0) + limit < preCount) {
|
|
91
|
+
skip = preCount - limit;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const options = {};
|
|
95
|
+
if (selectedFields.find(field => field.startsWith('edges.') || field.startsWith('pageInfo.'))) {
|
|
96
|
+
if (limit || limit === 0) {
|
|
97
|
+
options.limit = limit;
|
|
98
|
+
} else {
|
|
99
|
+
options.limit = 100;
|
|
100
|
+
}
|
|
101
|
+
if (options.limit !== 0) {
|
|
102
|
+
if (order) {
|
|
103
|
+
options.order = order;
|
|
104
|
+
}
|
|
105
|
+
if (skip) {
|
|
106
|
+
options.skip = skip;
|
|
107
|
+
}
|
|
108
|
+
if (config.maxLimit && options.limit > config.maxLimit) {
|
|
109
|
+
// Silently replace the limit on the query with the max configured
|
|
110
|
+
options.limit = config.maxLimit;
|
|
111
|
+
}
|
|
112
|
+
if (!needToGetAllKeys(parseClasses[className].fields, keys, parseClasses)) {
|
|
113
|
+
options.keys = keys;
|
|
114
|
+
}
|
|
115
|
+
if (includeAll === true) {
|
|
116
|
+
options.includeAll = includeAll;
|
|
117
|
+
}
|
|
118
|
+
if (!options.includeAll && include) {
|
|
119
|
+
options.include = include;
|
|
120
|
+
}
|
|
121
|
+
if ((options.includeAll || options.include) && includeReadPreference) {
|
|
122
|
+
options.includeReadPreference = includeReadPreference;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
options.limit = 0;
|
|
127
|
+
}
|
|
128
|
+
if ((selectedFields.includes('count') || selectedFields.includes('pageInfo.hasPreviousPage') || selectedFields.includes('pageInfo.hasNextPage')) && !needToPreCount) {
|
|
129
|
+
options.count = true;
|
|
130
|
+
}
|
|
131
|
+
if (readPreference) {
|
|
132
|
+
options.readPreference = readPreference;
|
|
133
|
+
}
|
|
134
|
+
if (Object.keys(where).length > 0 && subqueryReadPreference) {
|
|
135
|
+
options.subqueryReadPreference = subqueryReadPreference;
|
|
136
|
+
}
|
|
137
|
+
let results, count;
|
|
138
|
+
if (options.count || !options.limit || options.limit && options.limit > 0) {
|
|
139
|
+
const findResult = await _rest.default.find(config, auth, className, where, options, info.clientSDK, info.context);
|
|
140
|
+
results = findResult.results;
|
|
141
|
+
count = findResult.count;
|
|
142
|
+
}
|
|
143
|
+
let edges = null;
|
|
144
|
+
let pageInfo = null;
|
|
145
|
+
if (results) {
|
|
146
|
+
edges = results.map((result, index) => ({
|
|
147
|
+
cursor: (0, _graphqlRelay.offsetToCursor)((skip || 0) + index),
|
|
148
|
+
node: result
|
|
149
|
+
}));
|
|
150
|
+
pageInfo = {
|
|
151
|
+
hasPreviousPage: (preCount && preCount > 0 || count && count > 0) && skip !== undefined && skip > 0,
|
|
152
|
+
startCursor: (0, _graphqlRelay.offsetToCursor)(skip || 0),
|
|
153
|
+
endCursor: (0, _graphqlRelay.offsetToCursor)((skip || 0) + (results.length || 1) - 1),
|
|
154
|
+
hasNextPage: (preCount || count) > (skip || 0) + results.length
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
edges,
|
|
159
|
+
pageInfo,
|
|
160
|
+
count: preCount || count
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
exports.findObjects = findObjects;
|
|
164
|
+
const calculateSkipAndLimit = (skipInput, first, after, last, before, maxLimit) => {
|
|
165
|
+
let skip = undefined;
|
|
166
|
+
let limit = undefined;
|
|
167
|
+
let needToPreCount = false;
|
|
168
|
+
|
|
169
|
+
// Validates the skip input
|
|
170
|
+
if (skipInput || skipInput === 0) {
|
|
171
|
+
if (skipInput < 0) {
|
|
172
|
+
throw new _node.default.Error(_node.default.Error.INVALID_QUERY, 'Skip should be a positive number');
|
|
173
|
+
}
|
|
174
|
+
skip = skipInput;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Validates the after param
|
|
178
|
+
if (after) {
|
|
179
|
+
after = (0, _graphqlRelay.cursorToOffset)(after);
|
|
180
|
+
if (!after && after !== 0 || after < 0) {
|
|
181
|
+
throw new _node.default.Error(_node.default.Error.INVALID_QUERY, 'After is not a valid cursor');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// If skip and after are passed, a new skip is calculated by adding them
|
|
185
|
+
skip = (skip || 0) + (after + 1);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Validates the first param
|
|
189
|
+
if (first || first === 0) {
|
|
190
|
+
if (first < 0) {
|
|
191
|
+
throw new _node.default.Error(_node.default.Error.INVALID_QUERY, 'First should be a positive number');
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// The first param is translated to the limit param of the Parse legacy API
|
|
195
|
+
limit = first;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Validates the before param
|
|
199
|
+
if (before || before === 0) {
|
|
200
|
+
// This method converts the cursor to the index of the object
|
|
201
|
+
before = (0, _graphqlRelay.cursorToOffset)(before);
|
|
202
|
+
if (!before && before !== 0 || before < 0) {
|
|
203
|
+
throw new _node.default.Error(_node.default.Error.INVALID_QUERY, 'Before is not a valid cursor');
|
|
204
|
+
}
|
|
205
|
+
if ((skip || 0) >= before) {
|
|
206
|
+
// If the before index is less than the skip, no objects will be returned
|
|
207
|
+
limit = 0;
|
|
208
|
+
} else if (!limit && limit !== 0 || (skip || 0) + limit > before) {
|
|
209
|
+
// If there is no limit set, the limit is calculated. Or, if the limit (plus skip) is bigger than the before index, the new limit is set.
|
|
210
|
+
limit = before - (skip || 0);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Validates the last param
|
|
215
|
+
if (last || last === 0) {
|
|
216
|
+
if (last < 0) {
|
|
217
|
+
throw new _node.default.Error(_node.default.Error.INVALID_QUERY, 'Last should be a positive number');
|
|
218
|
+
}
|
|
219
|
+
if (last > maxLimit) {
|
|
220
|
+
// Last can't be bigger than Parse server maxLimit config.
|
|
221
|
+
last = maxLimit;
|
|
222
|
+
}
|
|
223
|
+
if (limit || limit === 0) {
|
|
224
|
+
// If there is a previous limit set, it may be adjusted
|
|
225
|
+
if (last < limit) {
|
|
226
|
+
// if last is less than the current limit
|
|
227
|
+
skip = (skip || 0) + (limit - last); // The skip is adjusted
|
|
228
|
+
limit = last; // the limit is adjusted
|
|
229
|
+
}
|
|
230
|
+
} else if (last === 0) {
|
|
231
|
+
// No objects will be returned
|
|
232
|
+
limit = 0;
|
|
233
|
+
} else {
|
|
234
|
+
// No previous limit set, the limit will be equal to last and pre count is needed.
|
|
235
|
+
limit = last;
|
|
236
|
+
needToPreCount = true;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
skip,
|
|
241
|
+
limit,
|
|
242
|
+
needToPreCount
|
|
243
|
+
};
|
|
244
|
+
};
|
|
245
|
+
exports.calculateSkipAndLimit = calculateSkipAndLimit;
|
|
246
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2dyYXBocWxSZWxheSIsIl9yZXN0IiwiX3F1ZXJ5IiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwibmVlZFRvR2V0QWxsS2V5cyIsImZpZWxkcyIsImtleXMiLCJwYXJzZUNsYXNzZXMiLCJzcGxpdCIsInNvbWUiLCJrZXlOYW1lIiwia2V5IiwidHlwZSIsInN1YkNsYXNzIiwidGFyZ2V0Q2xhc3MiLCJleHBvcnRzIiwiZ2V0T2JqZWN0IiwiY2xhc3NOYW1lIiwib2JqZWN0SWQiLCJpbmNsdWRlIiwicmVhZFByZWZlcmVuY2UiLCJpbmNsdWRlUmVhZFByZWZlcmVuY2UiLCJjb25maWciLCJhdXRoIiwiaW5mbyIsIm9wdGlvbnMiLCJjb25zb2xlIiwiZXJyb3IiLCJyZXNwb25zZSIsInJlc3QiLCJnZXQiLCJjbGllbnRTREsiLCJjb250ZXh0IiwicmVzdWx0cyIsImxlbmd0aCIsIlBhcnNlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwib2JqZWN0Iiwic2Vzc2lvblRva2VuIiwiZmluZE9iamVjdHMiLCJ3aGVyZSIsIm9yZGVyIiwic2tpcElucHV0IiwiZmlyc3QiLCJhZnRlciIsImxhc3QiLCJiZWZvcmUiLCJpbmNsdWRlQWxsIiwic3VicXVlcnlSZWFkUHJlZmVyZW5jZSIsInNlbGVjdGVkRmllbGRzIiwidHJhbnNmb3JtUXVlcnlJbnB1dFRvUGFyc2UiLCJza2lwQW5kTGltaXRDYWxjdWxhdGlvbiIsImNhbGN1bGF0ZVNraXBBbmRMaW1pdCIsIm1heExpbWl0Iiwic2tpcCIsImxpbWl0IiwibmVlZFRvUHJlQ291bnQiLCJwcmVDb3VudCIsInVuZGVmaW5lZCIsInByZUNvdW50T3B0aW9ucyIsImNvdW50IiwiT2JqZWN0IiwiZmluZCIsImZpZWxkIiwic3RhcnRzV2l0aCIsImluY2x1ZGVzIiwiZmluZFJlc3VsdCIsImVkZ2VzIiwicGFnZUluZm8iLCJtYXAiLCJyZXN1bHQiLCJpbmRleCIsImN1cnNvciIsIm9mZnNldFRvQ3Vyc29yIiwibm9kZSIsImhhc1ByZXZpb3VzUGFnZSIsInN0YXJ0Q3Vyc29yIiwiZW5kQ3Vyc29yIiwiaGFzTmV4dFBhZ2UiLCJJTlZBTElEX1FVRVJZIiwiY3Vyc29yVG9PZmZzZXQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvR3JhcGhRTC9oZWxwZXJzL29iamVjdHNRdWVyaWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCB7IG9mZnNldFRvQ3Vyc29yLCBjdXJzb3JUb09mZnNldCB9IGZyb20gJ2dyYXBocWwtcmVsYXknO1xuaW1wb3J0IHJlc3QgZnJvbSAnLi4vLi4vcmVzdCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1RdWVyeUlucHV0VG9QYXJzZSB9IGZyb20gJy4uL3RyYW5zZm9ybWVycy9xdWVyeSc7XG5cbi8vIEVzbGludC9QcmV0dGllciBjb25mbGljdFxuLyogZXNsaW50LWRpc2FibGUqL1xuY29uc3QgbmVlZFRvR2V0QWxsS2V5cyA9IChmaWVsZHMsIGtleXMsIHBhcnNlQ2xhc3NlcykgPT5cbiAga2V5c1xuICAgID8ga2V5cy5zcGxpdCgnLCcpLnNvbWUoa2V5TmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleU5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgaWYgKGZpZWxkc1trZXlbMF1dKSB7XG4gICAgICAgICAgaWYgKGZpZWxkc1trZXlbMF1dLnR5cGUgPT09ICdSZWxhdGlvbicpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICBpZiAoZmllbGRzW2tleVswXV0udHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJDbGFzcyA9IHBhcnNlQ2xhc3Nlc1tmaWVsZHNba2V5WzBdXS50YXJnZXRDbGFzc107XG4gICAgICAgICAgICBpZiAoc3ViQ2xhc3MgJiYgc3ViQ2xhc3MuZmllbGRzW2tleVsxXV0pIHtcbiAgICAgICAgICAgICAgLy8gQ3VycmVudCBzdWIga2V5IGlzIG5vdCBjdXN0b21cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAha2V5WzFdIHx8XG4gICAgICAgICAgICBmaWVsZHNba2V5WzBdXS50eXBlID09PSAnQXJyYXknIHx8XG4gICAgICAgICAgICBmaWVsZHNba2V5WzBdXS50eXBlID09PSAnT2JqZWN0J1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gY3VycmVudCBrZXkgaXMgbm90IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBLZXkgbm90IGZvdW5kIGludG8gUGFyc2UgU2NoZW1hIHNvIGl0J3MgY3VzdG9tXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSlcbiAgICA6IHRydWU7XG4vKiBlc2xpbnQtZW5hYmxlKi9cblxuY29uc3QgZ2V0T2JqZWN0ID0gYXN5bmMgKFxuICBjbGFzc05hbWUsXG4gIG9iamVjdElkLFxuICBrZXlzLFxuICBpbmNsdWRlLFxuICByZWFkUHJlZmVyZW5jZSxcbiAgaW5jbHVkZVJlYWRQcmVmZXJlbmNlLFxuICBjb25maWcsXG4gIGF1dGgsXG4gIGluZm8sXG4gIHBhcnNlQ2xhc3Nlc1xuKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7fTtcbiAgdHJ5IHtcbiAgICBpZiAoIW5lZWRUb0dldEFsbEtleXMocGFyc2VDbGFzc2VzW2NsYXNzTmFtZV0uZmllbGRzLCBrZXlzLCBwYXJzZUNsYXNzZXMpKSB7XG4gICAgICBvcHRpb25zLmtleXMgPSBrZXlzO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgfVxuICBpZiAoaW5jbHVkZSkge1xuICAgIG9wdGlvbnMuaW5jbHVkZSA9IGluY2x1ZGU7XG4gICAgaWYgKGluY2x1ZGVSZWFkUHJlZmVyZW5jZSkge1xuICAgICAgb3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSBpbmNsdWRlUmVhZFByZWZlcmVuY2U7XG4gICAgfVxuICB9XG4gIGlmIChyZWFkUHJlZmVyZW5jZSkge1xuICAgIG9wdGlvbnMucmVhZFByZWZlcmVuY2UgPSByZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzdC5nZXQoXG4gICAgY29uZmlnLFxuICAgIGF1dGgsXG4gICAgY2xhc3NOYW1lLFxuICAgIG9iamVjdElkLFxuICAgIG9wdGlvbnMsXG4gICAgaW5mby5jbGllbnRTREssXG4gICAgaW5mby5jb250ZXh0XG4gICk7XG5cbiAgaWYgKCFyZXNwb25zZS5yZXN1bHRzIHx8IHJlc3BvbnNlLnJlc3VsdHMubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ09iamVjdCBub3QgZm91bmQuJyk7XG4gIH1cblxuICBjb25zdCBvYmplY3QgPSByZXNwb25zZS5yZXN1bHRzWzBdO1xuICBpZiAoY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgZGVsZXRlIG9iamVjdC5zZXNzaW9uVG9rZW47XG4gIH1cbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cbmNvbnN0IGZpbmRPYmplY3RzID0gYXN5bmMgKFxuICBjbGFzc05hbWUsXG4gIHdoZXJlLFxuICBvcmRlcixcbiAgc2tpcElucHV0LFxuICBmaXJzdCxcbiAgYWZ0ZXIsXG4gIGxhc3QsXG4gIGJlZm9yZSxcbiAga2V5cyxcbiAgaW5jbHVkZSxcbiAgaW5jbHVkZUFsbCxcbiAgcmVhZFByZWZlcmVuY2UsXG4gIGluY2x1ZGVSZWFkUHJlZmVyZW5jZSxcbiAgc3VicXVlcnlSZWFkUHJlZmVyZW5jZSxcbiAgY29uZmlnLFxuICBhdXRoLFxuICBpbmZvLFxuICBzZWxlY3RlZEZpZWxkcyxcbiAgcGFyc2VDbGFzc2VzXG4pID0+IHtcbiAgaWYgKCF3aGVyZSkge1xuICAgIHdoZXJlID0ge307XG4gIH1cbiAgdHJhbnNmb3JtUXVlcnlJbnB1dFRvUGFyc2Uod2hlcmUsIGNsYXNzTmFtZSwgcGFyc2VDbGFzc2VzKTtcbiAgY29uc3Qgc2tpcEFuZExpbWl0Q2FsY3VsYXRpb24gPSBjYWxjdWxhdGVTa2lwQW5kTGltaXQoXG4gICAgc2tpcElucHV0LFxuICAgIGZpcnN0LFxuICAgIGFmdGVyLFxuICAgIGxhc3QsXG4gICAgYmVmb3JlLFxuICAgIGNvbmZpZy5tYXhMaW1pdFxuICApO1xuICBsZXQgeyBza2lwIH0gPSBza2lwQW5kTGltaXRDYWxjdWxhdGlvbjtcbiAgY29uc3QgeyBsaW1pdCwgbmVlZFRvUHJlQ291bnQgfSA9IHNraXBBbmRMaW1pdENhbGN1bGF0aW9uO1xuICBsZXQgcHJlQ291bnQgPSB1bmRlZmluZWQ7XG4gIGlmIChuZWVkVG9QcmVDb3VudCkge1xuICAgIGNvbnN0IHByZUNvdW50T3B0aW9ucyA9IHtcbiAgICAgIGxpbWl0OiAwLFxuICAgICAgY291bnQ6IHRydWUsXG4gICAgfTtcbiAgICBpZiAocmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHByZUNvdW50T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMod2hlcmUpLmxlbmd0aCA+IDAgJiYgc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgICAgcHJlQ291bnRPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIH1cbiAgICBwcmVDb3VudCA9IChcbiAgICAgIGF3YWl0IHJlc3QuZmluZChjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgd2hlcmUsIHByZUNvdW50T3B0aW9ucywgaW5mby5jbGllbnRTREssIGluZm8uY29udGV4dClcbiAgICApLmNvdW50O1xuICAgIGlmICgoc2tpcCB8fCAwKSArIGxpbWl0IDwgcHJlQ291bnQpIHtcbiAgICAgIHNraXAgPSBwcmVDb3VudCAtIGxpbWl0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICBpZiAoc2VsZWN0ZWRGaWVsZHMuZmluZChmaWVsZCA9PiBmaWVsZC5zdGFydHNXaXRoKCdlZGdlcy4nKSB8fCBmaWVsZC5zdGFydHNXaXRoKCdwYWdlSW5mby4nKSkpIHtcbiAgICBpZiAobGltaXQgfHwgbGltaXQgPT09IDApIHtcbiAgICAgIG9wdGlvbnMubGltaXQgPSBsaW1pdDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy5saW1pdCA9IDEwMDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGltaXQgIT09IDApIHtcbiAgICAgIGlmIChvcmRlcikge1xuICAgICAgICBvcHRpb25zLm9yZGVyID0gb3JkZXI7XG4gICAgICB9XG4gICAgICBpZiAoc2tpcCkge1xuICAgICAgICBvcHRpb25zLnNraXAgPSBza2lwO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5tYXhMaW1pdCAmJiBvcHRpb25zLmxpbWl0ID4gY29uZmlnLm1heExpbWl0KSB7XG4gICAgICAgIC8vIFNpbGVudGx5IHJlcGxhY2UgdGhlIGxpbWl0IG9uIHRoZSBxdWVyeSB3aXRoIHRoZSBtYXggY29uZmlndXJlZFxuICAgICAgICBvcHRpb25zLmxpbWl0ID0gY29uZmlnLm1heExpbWl0O1xuICAgICAgfVxuICAgICAgaWYgKCFuZWVkVG9HZXRBbGxLZXlzKHBhcnNlQ2xhc3Nlc1tjbGFzc05hbWVdLmZpZWxkcywga2V5cywgcGFyc2VDbGFzc2VzKSkge1xuICAgICAgICBvcHRpb25zLmtleXMgPSBrZXlzO1xuICAgICAgfVxuICAgICAgaWYgKGluY2x1ZGVBbGwgPT09IHRydWUpIHtcbiAgICAgICAgb3B0aW9ucy5pbmNsdWRlQWxsID0gaW5jbHVkZUFsbDtcbiAgICAgIH1cbiAgICAgIGlmICghb3B0aW9ucy5pbmNsdWRlQWxsICYmIGluY2x1ZGUpIHtcbiAgICAgICAgb3B0aW9ucy5pbmNsdWRlID0gaW5jbHVkZTtcbiAgICAgIH1cbiAgICAgIGlmICgob3B0aW9ucy5pbmNsdWRlQWxsIHx8IG9wdGlvbnMuaW5jbHVkZSkgJiYgaW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICAgIG9wdGlvbnMuaW5jbHVkZVJlYWRQcmVmZXJlbmNlID0gaW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLmxpbWl0ID0gMDtcbiAgfVxuXG4gIGlmIChcbiAgICAoc2VsZWN0ZWRGaWVsZHMuaW5jbHVkZXMoJ2NvdW50JykgfHxcbiAgICAgIHNlbGVjdGVkRmllbGRzLmluY2x1ZGVzKCdwYWdlSW5mby5oYXNQcmV2aW91c1BhZ2UnKSB8fFxuICAgICAgc2VsZWN0ZWRGaWVsZHMuaW5jbHVkZXMoJ3BhZ2VJbmZvLmhhc05leHRQYWdlJykpICYmXG4gICAgIW5lZWRUb1ByZUNvdW50XG4gICkge1xuICAgIG9wdGlvbnMuY291bnQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHJlYWRQcmVmZXJlbmNlKSB7XG4gICAgb3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHJlYWRQcmVmZXJlbmNlO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyh3aGVyZSkubGVuZ3RoID4gMCAmJiBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgb3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIGxldCByZXN1bHRzLCBjb3VudDtcbiAgaWYgKG9wdGlvbnMuY291bnQgfHwgIW9wdGlvbnMubGltaXQgfHwgKG9wdGlvbnMubGltaXQgJiYgb3B0aW9ucy5saW1pdCA+IDApKSB7XG4gICAgY29uc3QgZmluZFJlc3VsdCA9IGF3YWl0IHJlc3QuZmluZChcbiAgICAgIGNvbmZpZyxcbiAgICAgIGF1dGgsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICB3aGVyZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpbmZvLmNsaWVudFNESyxcbiAgICAgIGluZm8uY29udGV4dFxuICAgICk7XG4gICAgcmVzdWx0cyA9IGZpbmRSZXN1bHQucmVzdWx0cztcbiAgICBjb3VudCA9IGZpbmRSZXN1bHQuY291bnQ7XG4gIH1cblxuICBsZXQgZWRnZXMgPSBudWxsO1xuICBsZXQgcGFnZUluZm8gPSBudWxsO1xuICBpZiAocmVzdWx0cykge1xuICAgIGVkZ2VzID0gcmVzdWx0cy5tYXAoKHJlc3VsdCwgaW5kZXgpID0+ICh7XG4gICAgICBjdXJzb3I6IG9mZnNldFRvQ3Vyc29yKChza2lwIHx8IDApICsgaW5kZXgpLFxuICAgICAgbm9kZTogcmVzdWx0LFxuICAgIH0pKTtcblxuICAgIHBhZ2VJbmZvID0ge1xuICAgICAgaGFzUHJldmlvdXNQYWdlOlxuICAgICAgICAoKHByZUNvdW50ICYmIHByZUNvdW50ID4gMCkgfHwgKGNvdW50ICYmIGNvdW50ID4gMCkpICYmIHNraXAgIT09IHVuZGVmaW5lZCAmJiBza2lwID4gMCxcbiAgICAgIHN0YXJ0Q3Vyc29yOiBvZmZzZXRUb0N1cnNvcihza2lwIHx8IDApLFxuICAgICAgZW5kQ3Vyc29yOiBvZmZzZXRUb0N1cnNvcigoc2tpcCB8fCAwKSArIChyZXN1bHRzLmxlbmd0aCB8fCAxKSAtIDEpLFxuICAgICAgaGFzTmV4dFBhZ2U6IChwcmVDb3VudCB8fCBjb3VudCkgPiAoc2tpcCB8fCAwKSArIHJlc3VsdHMubGVuZ3RoLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVkZ2VzLFxuICAgIHBhZ2VJbmZvLFxuICAgIGNvdW50OiBwcmVDb3VudCB8fCBjb3VudCxcbiAgfTtcbn07XG5cbmNvbnN0IGNhbGN1bGF0ZVNraXBBbmRMaW1pdCA9IChza2lwSW5wdXQsIGZpcnN0LCBhZnRlciwgbGFzdCwgYmVmb3JlLCBtYXhMaW1pdCkgPT4ge1xuICBsZXQgc2tpcCA9IHVuZGVmaW5lZDtcbiAgbGV0IGxpbWl0ID0gdW5kZWZpbmVkO1xuICBsZXQgbmVlZFRvUHJlQ291bnQgPSBmYWxzZTtcblxuICAvLyBWYWxpZGF0ZXMgdGhlIHNraXAgaW5wdXRcbiAgaWYgKHNraXBJbnB1dCB8fCBza2lwSW5wdXQgPT09IDApIHtcbiAgICBpZiAoc2tpcElucHV0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksICdTa2lwIHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICAgIH1cbiAgICBza2lwID0gc2tpcElucHV0O1xuICB9XG5cbiAgLy8gVmFsaWRhdGVzIHRoZSBhZnRlciBwYXJhbVxuICBpZiAoYWZ0ZXIpIHtcbiAgICBhZnRlciA9IGN1cnNvclRvT2Zmc2V0KGFmdGVyKTtcbiAgICBpZiAoKCFhZnRlciAmJiBhZnRlciAhPT0gMCkgfHwgYWZ0ZXIgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSwgJ0FmdGVyIGlzIG5vdCBhIHZhbGlkIGN1cnNvcicpO1xuICAgIH1cblxuICAgIC8vIElmIHNraXAgYW5kIGFmdGVyIGFyZSBwYXNzZWQsIGEgbmV3IHNraXAgaXMgY2FsY3VsYXRlZCBieSBhZGRpbmcgdGhlbVxuICAgIHNraXAgPSAoc2tpcCB8fCAwKSArIChhZnRlciArIDEpO1xuICB9XG5cbiAgLy8gVmFsaWRhdGVzIHRoZSBmaXJzdCBwYXJhbVxuICBpZiAoZmlyc3QgfHwgZmlyc3QgPT09IDApIHtcbiAgICBpZiAoZmlyc3QgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSwgJ0ZpcnN0IHNob3VsZCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICAgIH1cblxuICAgIC8vIFRoZSBmaXJzdCBwYXJhbSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBsaW1pdCBwYXJhbSBvZiB0aGUgUGFyc2UgbGVnYWN5IEFQSVxuICAgIGxpbWl0ID0gZmlyc3Q7XG4gIH1cblxuICAvLyBWYWxpZGF0ZXMgdGhlIGJlZm9yZSBwYXJhbVxuICBpZiAoYmVmb3JlIHx8IGJlZm9yZSA9PT0gMCkge1xuICAgIC8vIFRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoZSBjdXJzb3IgdG8gdGhlIGluZGV4IG9mIHRoZSBvYmplY3RcbiAgICBiZWZvcmUgPSBjdXJzb3JUb09mZnNldChiZWZvcmUpO1xuICAgIGlmICgoIWJlZm9yZSAmJiBiZWZvcmUgIT09IDApIHx8IGJlZm9yZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCAnQmVmb3JlIGlzIG5vdCBhIHZhbGlkIGN1cnNvcicpO1xuICAgIH1cblxuICAgIGlmICgoc2tpcCB8fCAwKSA+PSBiZWZvcmUpIHtcbiAgICAgIC8vIElmIHRoZSBiZWZvcmUgaW5kZXggaXMgbGVzcyB0aGFuIHRoZSBza2lwLCBubyBvYmplY3RzIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgIGxpbWl0ID0gMDtcbiAgICB9IGVsc2UgaWYgKCghbGltaXQgJiYgbGltaXQgIT09IDApIHx8IChza2lwIHx8IDApICsgbGltaXQgPiBiZWZvcmUpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG5vIGxpbWl0IHNldCwgdGhlIGxpbWl0IGlzIGNhbGN1bGF0ZWQuIE9yLCBpZiB0aGUgbGltaXQgKHBsdXMgc2tpcCkgaXMgYmlnZ2VyIHRoYW4gdGhlIGJlZm9yZSBpbmRleCwgdGhlIG5ldyBsaW1pdCBpcyBzZXQuXG4gICAgICBsaW1pdCA9IGJlZm9yZSAtIChza2lwIHx8IDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlcyB0aGUgbGFzdCBwYXJhbVxuICBpZiAobGFzdCB8fCBsYXN0ID09PSAwKSB7XG4gICAgaWYgKGxhc3QgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSwgJ0xhc3Qgc2hvdWxkIGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGxhc3QgPiBtYXhMaW1pdCkge1xuICAgICAgLy8gTGFzdCBjYW4ndCBiZSBiaWdnZXIgdGhhbiBQYXJzZSBzZXJ2ZXIgbWF4TGltaXQgY29uZmlnLlxuICAgICAgbGFzdCA9IG1heExpbWl0O1xuICAgIH1cblxuICAgIGlmIChsaW1pdCB8fCBsaW1pdCA9PT0gMCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwcmV2aW91cyBsaW1pdCBzZXQsIGl0IG1heSBiZSBhZGp1c3RlZFxuICAgICAgaWYgKGxhc3QgPCBsaW1pdCkge1xuICAgICAgICAvLyBpZiBsYXN0IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCBsaW1pdFxuICAgICAgICBza2lwID0gKHNraXAgfHwgMCkgKyAobGltaXQgLSBsYXN0KTsgLy8gVGhlIHNraXAgaXMgYWRqdXN0ZWRcbiAgICAgICAgbGltaXQgPSBsYXN0OyAvLyB0aGUgbGltaXQgaXMgYWRqdXN0ZWRcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09IDApIHtcbiAgICAgIC8vIE5vIG9iamVjdHMgd2lsbCBiZSByZXR1cm5lZFxuICAgICAgbGltaXQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBwcmV2aW91cyBsaW1pdCBzZXQsIHRoZSBsaW1pdCB3aWxsIGJlIGVxdWFsIHRvIGxhc3QgYW5kIHByZSBjb3VudCBpcyBuZWVkZWQuXG4gICAgICBsaW1pdCA9IGxhc3Q7XG4gICAgICBuZWVkVG9QcmVDb3VudCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc2tpcCxcbiAgICBsaW1pdCxcbiAgICBuZWVkVG9QcmVDb3VudCxcbiAgfTtcbn07XG5cbmV4cG9ydCB7IGdldE9iamVjdCwgZmluZE9iamVjdHMsIGNhbGN1bGF0ZVNraXBBbmRMaW1pdCwgbmVlZFRvR2V0QWxsS2V5cyB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxLQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxhQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFBbUUsU0FBQUQsdUJBQUFLLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFbkU7QUFDQTtBQUNBLE1BQU1HLGdCQUFnQixHQUFHQSxDQUFDQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsWUFBWSxLQUNsREQsSUFBSSxHQUNBQSxJQUFJLENBQUNFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQ0MsSUFBSSxDQUFDQyxPQUFPLElBQUk7RUFDOUIsTUFBTUMsR0FBRyxHQUFHRCxPQUFPLENBQUNGLEtBQUssQ0FBQyxHQUFHLENBQUM7RUFDOUIsSUFBSUgsTUFBTSxDQUFDTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNsQixJQUFJTixNQUFNLENBQUNNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLEtBQUssVUFBVSxFQUFFLE9BQU8sS0FBSztJQUNwRCxJQUFJUCxNQUFNLENBQUNNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLEtBQUssU0FBUyxFQUFFO01BQ3JDLE1BQU1DLFFBQVEsR0FBR04sWUFBWSxDQUFDRixNQUFNLENBQUNNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDRyxXQUFXLENBQUM7TUFDekQsSUFBSUQsUUFBUSxJQUFJQSxRQUFRLENBQUNSLE1BQU0sQ0FBQ00sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDdkM7UUFDQSxPQUFPLEtBQUs7TUFDZDtJQUNGLENBQUMsTUFBTSxJQUNMLENBQUNBLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFDUE4sTUFBTSxDQUFDTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxLQUFLLE9BQU8sSUFDL0JQLE1BQU0sQ0FBQ00sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNDLElBQUksS0FBSyxRQUFRLEVBQ2hDO01BQ0E7TUFDQSxPQUFPLEtBQUs7SUFDZDtFQUNGO0VBQ0E7RUFDQSxPQUFPLElBQUk7QUFDYixDQUFDLENBQUMsR0FDRixJQUFJO0FBQ1Y7QUFBQUcsT0FBQSxDQUFBWCxnQkFBQSxHQUFBQSxnQkFBQTtBQUVBLE1BQU1ZLFNBQVMsR0FBRyxNQUFBQSxDQUNoQkMsU0FBUyxFQUNUQyxRQUFRLEVBQ1JaLElBQUksRUFDSmEsT0FBTyxFQUNQQyxjQUFjLEVBQ2RDLHFCQUFxQixFQUNyQkMsTUFBTSxFQUNOQyxJQUFJLEVBQ0pDLElBQUksRUFDSmpCLFlBQVksS0FDVDtFQUNILE1BQU1rQixPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQ2xCLElBQUk7SUFDRixJQUFJLENBQUNyQixnQkFBZ0IsQ0FBQ0csWUFBWSxDQUFDVSxTQUFTLENBQUMsQ0FBQ1osTUFBTSxFQUFFQyxJQUFJLEVBQUVDLFlBQVksQ0FBQyxFQUFFO01BQ3pFa0IsT0FBTyxDQUFDbkIsSUFBSSxHQUFHQSxJQUFJO0lBQ3JCO0VBQ0YsQ0FBQyxDQUFDLE9BQU9MLENBQUMsRUFBRTtJQUNWO0lBQ0F5QixPQUFPLENBQUNDLEtBQUssQ0FBQzFCLENBQUMsQ0FBQztFQUNsQjtFQUNBLElBQUlrQixPQUFPLEVBQUU7SUFDWE0sT0FBTyxDQUFDTixPQUFPLEdBQUdBLE9BQU87SUFDekIsSUFBSUUscUJBQXFCLEVBQUU7TUFDekJJLE9BQU8sQ0FBQ0oscUJBQXFCLEdBQUdBLHFCQUFxQjtJQUN2RDtFQUNGO0VBQ0EsSUFBSUQsY0FBYyxFQUFFO0lBQ2xCSyxPQUFPLENBQUNMLGNBQWMsR0FBR0EsY0FBYztFQUN6QztFQUVBLE1BQU1RLFFBQVEsR0FBRyxNQUFNQyxhQUFJLENBQUNDLEdBQUcsQ0FDN0JSLE1BQU0sRUFDTkMsSUFBSSxFQUNKTixTQUFTLEVBQ1RDLFFBQVEsRUFDUk8sT0FBTyxFQUNQRCxJQUFJLENBQUNPLFNBQVMsRUFDZFAsSUFBSSxDQUFDUSxPQUNQLENBQUM7RUFFRCxJQUFJLENBQUNKLFFBQVEsQ0FBQ0ssT0FBTyxJQUFJTCxRQUFRLENBQUNLLE9BQU8sQ0FBQ0MsTUFBTSxJQUFJLENBQUMsRUFBRTtJQUNyRCxNQUFNLElBQUlDLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUM7RUFDMUU7RUFFQSxNQUFNQyxNQUFNLEdBQUdWLFFBQVEsQ0FBQ0ssT0FBTyxDQUFDLENBQUMsQ0FBQztFQUNsQyxJQUFJaEIsU0FBUyxLQUFLLE9BQU8sRUFBRTtJQUN6QixPQUFPcUIsTUFBTSxDQUFDQyxZQUFZO0VBQzVCO0VBQ0EsT0FBT0QsTUFBTTtBQUNmLENBQUM7QUFBQ3ZCLE9BQUEsQ0FBQUMsU0FBQSxHQUFBQSxTQUFBO0FBRUYsTUFBTXdCLFdBQVcsR0FBRyxNQUFBQSxDQUNsQnZCLFNBQVMsRUFDVHdCLEtBQUssRUFDTEMsS0FBSyxFQUNMQyxTQUFTLEVBQ1RDLEtBQUssRUFDTEMsS0FBSyxFQUNMQyxJQUFJLEVBQ0pDLE1BQU0sRUFDTnpDLElBQUksRUFDSmEsT0FBTyxFQUNQNkIsVUFBVSxFQUNWNUIsY0FBYyxFQUNkQyxxQkFBcUIsRUFDckI0QixzQkFBc0IsRUFDdEIzQixNQUFNLEVBQ05DLElBQUksRUFDSkMsSUFBSSxFQUNKMEIsY0FBYyxFQUNkM0MsWUFBWSxLQUNUO0VBQ0gsSUFBSSxDQUFDa0MsS0FBSyxFQUFFO0lBQ1ZBLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDWjtFQUNBLElBQUFVLGlDQUEwQixFQUFDVixLQUFLLEVBQUV4QixTQUFTLEVBQUVWLFlBQVksQ0FBQztFQUMxRCxNQUFNNkMsdUJBQXVCLEdBQUdDLHFCQUFxQixDQUNuRFYsU0FBUyxFQUNUQyxLQUFLLEVBQ0xDLEtBQUssRUFDTEMsSUFBSSxFQUNKQyxNQUFNLEVBQ056QixNQUFNLENBQUNnQyxRQUNULENBQUM7RUFDRCxJQUFJO0lBQUVDO0VBQUssQ0FBQyxHQUFHSCx1QkFBdUI7RUFDdEMsTUFBTTtJQUFFSSxLQUFLO0lBQUVDO0VBQWUsQ0FBQyxHQUFHTCx1QkFBdUI7RUFDekQsSUFBSU0sUUFBUSxHQUFHQyxTQUFTO0VBQ3hCLElBQUlGLGNBQWMsRUFBRTtJQUNsQixNQUFNRyxlQUFlLEdBQUc7TUFDdEJKLEtBQUssRUFBRSxDQUFDO01BQ1JLLEtBQUssRUFBRTtJQUNULENBQUM7SUFDRCxJQUFJekMsY0FBYyxFQUFFO01BQ2xCd0MsZUFBZSxDQUFDeEMsY0FBYyxHQUFHQSxjQUFjO0lBQ2pEO0lBQ0EsSUFBSTBDLE1BQU0sQ0FBQ3hELElBQUksQ0FBQ21DLEtBQUssQ0FBQyxDQUFDUCxNQUFNLEdBQUcsQ0FBQyxJQUFJZSxzQkFBc0IsRUFBRTtNQUMzRFcsZUFBZSxDQUFDWCxzQkFBc0IsR0FBR0Esc0JBQXNCO0lBQ2pFO0lBQ0FTLFFBQVEsR0FBRyxDQUNULE1BQU03QixhQUFJLENBQUNrQyxJQUFJLENBQUN6QyxNQUFNLEVBQUVDLElBQUksRUFBRU4sU0FBUyxFQUFFd0IsS0FBSyxFQUFFbUIsZUFBZSxFQUFFcEMsSUFBSSxDQUFDTyxTQUFTLEVBQUVQLElBQUksQ0FBQ1EsT0FBTyxDQUFDLEVBQzlGNkIsS0FBSztJQUNQLElBQUksQ0FBQ04sSUFBSSxJQUFJLENBQUMsSUFBSUMsS0FBSyxHQUFHRSxRQUFRLEVBQUU7TUFDbENILElBQUksR0FBR0csUUFBUSxHQUFHRixLQUFLO0lBQ3pCO0VBQ0Y7RUFFQSxNQUFNL0IsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUVsQixJQUFJeUIsY0FBYyxDQUFDYSxJQUFJLENBQUNDLEtBQUssSUFBSUEsS0FBSyxDQUFDQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUlELEtBQUssQ0FBQ0MsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUU7SUFDN0YsSUFBSVQsS0FBSyxJQUFJQSxLQUFLLEtBQUssQ0FBQyxFQUFFO01BQ3hCL0IsT0FBTyxDQUFDK0IsS0FBSyxHQUFHQSxLQUFLO0lBQ3ZCLENBQUMsTUFBTTtNQUNML0IsT0FBTyxDQUFDK0IsS0FBSyxHQUFHLEdBQUc7SUFDckI7SUFDQSxJQUFJL0IsT0FBTyxDQUFDK0IsS0FBSyxLQUFLLENBQUMsRUFBRTtNQUN2QixJQUFJZCxLQUFLLEVBQUU7UUFDVGpCLE9BQU8sQ0FBQ2lCLEtBQUssR0FBR0EsS0FBSztNQUN2QjtNQUNBLElBQUlhLElBQUksRUFBRTtRQUNSOUIsT0FBTyxDQUFDOEIsSUFBSSxHQUFHQSxJQUFJO01BQ3JCO01BQ0EsSUFBSWpDLE1BQU0sQ0FBQ2dDLFFBQVEsSUFBSTdCLE9BQU8sQ0FBQytCLEtBQUssR0FBR2xDLE1BQU0sQ0FBQ2dDLFFBQVEsRUFBRTtRQUN0RDtRQUNBN0IsT0FBTyxDQUFDK0IsS0FBSyxHQUFHbEMsTUFBTSxDQUFDZ0MsUUFBUTtNQUNqQztNQUNBLElBQUksQ0FBQ2xELGdCQUFnQixDQUFDRyxZQUFZLENBQUNVLFNBQVMsQ0FBQyxDQUFDWixNQUFNLEVBQUVDLElBQUksRUFBRUMsWUFBWSxDQUFDLEVBQUU7UUFDekVrQixPQUFPLENBQUNuQixJQUFJLEdBQUdBLElBQUk7TUFDckI7TUFDQSxJQUFJMEMsVUFBVSxLQUFLLElBQUksRUFBRTtRQUN2QnZCLE9BQU8sQ0FBQ3VCLFVBQVUsR0FBR0EsVUFBVTtNQUNqQztNQUNBLElBQUksQ0FBQ3ZCLE9BQU8sQ0FBQ3VCLFVBQVUsSUFBSTdCLE9BQU8sRUFBRTtRQUNsQ00sT0FBTyxDQUFDTixPQUFPLEdBQUdBLE9BQU87TUFDM0I7TUFDQSxJQUFJLENBQUNNLE9BQU8sQ0FBQ3VCLFVBQVUsSUFBSXZCLE9BQU8sQ0FBQ04sT0FBTyxLQUFLRSxxQkFBcUIsRUFBRTtRQUNwRUksT0FBTyxDQUFDSixxQkFBcUIsR0FBR0EscUJBQXFCO01BQ3ZEO0lBQ0Y7RUFDRixDQUFDLE1BQU07SUFDTEksT0FBTyxDQUFDK0IsS0FBSyxHQUFHLENBQUM7RUFDbkI7RUFFQSxJQUNFLENBQUNOLGNBQWMsQ0FBQ2dCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFDL0JoQixjQUFjLENBQUNnQixRQUFRLENBQUMsMEJBQTBCLENBQUMsSUFDbkRoQixjQUFjLENBQUNnQixRQUFRLENBQUMsc0JBQXNCLENBQUMsS0FDakQsQ0FBQ1QsY0FBYyxFQUNmO0lBQ0FoQyxPQUFPLENBQUNvQyxLQUFLLEdBQUcsSUFBSTtFQUN0QjtFQUVBLElBQUl6QyxjQUFjLEVBQUU7SUFDbEJLLE9BQU8sQ0FBQ0wsY0FBYyxHQUFHQSxjQUFjO0VBQ3pDO0VBQ0EsSUFBSTBDLE1BQU0sQ0FBQ3hELElBQUksQ0FBQ21DLEtBQUssQ0FBQyxDQUFDUCxNQUFNLEdBQUcsQ0FBQyxJQUFJZSxzQkFBc0IsRUFBRTtJQUMzRHhCLE9BQU8sQ0FBQ3dCLHNCQUFzQixHQUFHQSxzQkFBc0I7RUFDekQ7RUFFQSxJQUFJaEIsT0FBTyxFQUFFNEIsS0FBSztFQUNsQixJQUFJcEMsT0FBTyxDQUFDb0MsS0FBSyxJQUFJLENBQUNwQyxPQUFPLENBQUMrQixLQUFLLElBQUsvQixPQUFPLENBQUMrQixLQUFLLElBQUkvQixPQUFPLENBQUMrQixLQUFLLEdBQUcsQ0FBRSxFQUFFO0lBQzNFLE1BQU1XLFVBQVUsR0FBRyxNQUFNdEMsYUFBSSxDQUFDa0MsSUFBSSxDQUNoQ3pDLE1BQU0sRUFDTkMsSUFBSSxFQUNKTixTQUFTLEVBQ1R3QixLQUFLLEVBQ0xoQixPQUFPLEVBQ1BELElBQUksQ0FBQ08sU0FBUyxFQUNkUCxJQUFJLENBQUNRLE9BQ1AsQ0FBQztJQUNEQyxPQUFPLEdBQUdrQyxVQUFVLENBQUNsQyxPQUFPO0lBQzVCNEIsS0FBSyxHQUFHTSxVQUFVLENBQUNOLEtBQUs7RUFDMUI7RUFFQSxJQUFJTyxLQUFLLEdBQUcsSUFBSTtFQUNoQixJQUFJQyxRQUFRLEdBQUcsSUFBSTtFQUNuQixJQUFJcEMsT0FBTyxFQUFFO0lBQ1htQyxLQUFLLEdBQUduQyxPQUFPLENBQUNxQyxHQUFHLENBQUMsQ0FBQ0MsTUFBTSxFQUFFQyxLQUFLLE1BQU07TUFDdENDLE1BQU0sRUFBRSxJQUFBQyw0QkFBYyxFQUFDLENBQUNuQixJQUFJLElBQUksQ0FBQyxJQUFJaUIsS0FBSyxDQUFDO01BQzNDRyxJQUFJLEVBQUVKO0lBQ1IsQ0FBQyxDQUFDLENBQUM7SUFFSEYsUUFBUSxHQUFHO01BQ1RPLGVBQWUsRUFDYixDQUFFbEIsUUFBUSxJQUFJQSxRQUFRLEdBQUcsQ0FBQyxJQUFNRyxLQUFLLElBQUlBLEtBQUssR0FBRyxDQUFFLEtBQUtOLElBQUksS0FBS0ksU0FBUyxJQUFJSixJQUFJLEdBQUcsQ0FBQztNQUN4RnNCLFdBQVcsRUFBRSxJQUFBSCw0QkFBYyxFQUFDbkIsSUFBSSxJQUFJLENBQUMsQ0FBQztNQUN0Q3VCLFNBQVMsRUFBRSxJQUFBSiw0QkFBYyxFQUFDLENBQUNuQixJQUFJLElBQUksQ0FBQyxLQUFLdEIsT0FBTyxDQUFDQyxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQ2xFNkMsV0FBVyxFQUFFLENBQUNyQixRQUFRLElBQUlHLEtBQUssSUFBSSxDQUFDTixJQUFJLElBQUksQ0FBQyxJQUFJdEIsT0FBTyxDQUFDQztJQUMzRCxDQUFDO0VBQ0g7RUFFQSxPQUFPO0lBQ0xrQyxLQUFLO0lBQ0xDLFFBQVE7SUFDUlIsS0FBSyxFQUFFSCxRQUFRLElBQUlHO0VBQ3JCLENBQUM7QUFDSCxDQUFDO0FBQUM5QyxPQUFBLENBQUF5QixXQUFBLEdBQUFBLFdBQUE7QUFFRixNQUFNYSxxQkFBcUIsR0FBR0EsQ0FBQ1YsU0FBUyxFQUFFQyxLQUFLLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFFQyxNQUFNLEVBQUVPLFFBQVEsS0FBSztFQUNqRixJQUFJQyxJQUFJLEdBQUdJLFNBQVM7RUFDcEIsSUFBSUgsS0FBSyxHQUFHRyxTQUFTO0VBQ3JCLElBQUlGLGNBQWMsR0FBRyxLQUFLOztFQUUxQjtFQUNBLElBQUlkLFNBQVMsSUFBSUEsU0FBUyxLQUFLLENBQUMsRUFBRTtJQUNoQyxJQUFJQSxTQUFTLEdBQUcsQ0FBQyxFQUFFO01BQ2pCLE1BQU0sSUFBSVIsYUFBSyxDQUFDQyxLQUFLLENBQUNELGFBQUssQ0FBQ0MsS0FBSyxDQUFDNEMsYUFBYSxFQUFFLGtDQUFrQyxDQUFDO0lBQ3RGO0lBQ0F6QixJQUFJLEdBQUdaLFNBQVM7RUFDbEI7O0VBRUE7RUFDQSxJQUFJRSxLQUFLLEVBQUU7SUFDVEEsS0FBSyxHQUFHLElBQUFvQyw0QkFBYyxFQUFDcEMsS0FBSyxDQUFDO0lBQzdCLElBQUssQ0FBQ0EsS0FBSyxJQUFJQSxLQUFLLEtBQUssQ0FBQyxJQUFLQSxLQUFLLEdBQUcsQ0FBQyxFQUFFO01BQ3hDLE1BQU0sSUFBSVYsYUFBSyxDQUFDQyxLQUFLLENBQUNELGFBQUssQ0FBQ0MsS0FBSyxDQUFDNEMsYUFBYSxFQUFFLDZCQUE2QixDQUFDO0lBQ2pGOztJQUVBO0lBQ0F6QixJQUFJLEdBQUcsQ0FBQ0EsSUFBSSxJQUFJLENBQUMsS0FBS1YsS0FBSyxHQUFHLENBQUMsQ0FBQztFQUNsQzs7RUFFQTtFQUNBLElBQUlELEtBQUssSUFBSUEsS0FBSyxLQUFLLENBQUMsRUFBRTtJQUN4QixJQUFJQSxLQUFLLEdBQUcsQ0FBQyxFQUFFO01BQ2IsTUFBTSxJQUFJVCxhQUFLLENBQUNDLEtBQUssQ0FBQ0QsYUFBSyxDQUFDQyxLQUFLLENBQUM0QyxhQUFhLEVBQUUsbUNBQW1DLENBQUM7SUFDdkY7O0lBRUE7SUFDQXhCLEtBQUssR0FBR1osS0FBSztFQUNmOztFQUVBO0VBQ0EsSUFBSUcsTUFBTSxJQUFJQSxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQzFCO0lBQ0FBLE1BQU0sR0FBRyxJQUFBa0MsNEJBQWMsRUFBQ2xDLE1BQU0sQ0FBQztJQUMvQixJQUFLLENBQUNBLE1BQU0sSUFBSUEsTUFBTSxLQUFLLENBQUMsSUFBS0EsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUMzQyxNQUFNLElBQUlaLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQzRDLGFBQWEsRUFBRSw4QkFBOEIsQ0FBQztJQUNsRjtJQUVBLElBQUksQ0FBQ3pCLElBQUksSUFBSSxDQUFDLEtBQUtSLE1BQU0sRUFBRTtNQUN6QjtNQUNBUyxLQUFLLEdBQUcsQ0FBQztJQUNYLENBQUMsTUFBTSxJQUFLLENBQUNBLEtBQUssSUFBSUEsS0FBSyxLQUFLLENBQUMsSUFBSyxDQUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJQyxLQUFLLEdBQUdULE1BQU0sRUFBRTtNQUNsRTtNQUNBUyxLQUFLLEdBQUdULE1BQU0sSUFBSVEsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM5QjtFQUNGOztFQUVBO0VBQ0EsSUFBSVQsSUFBSSxJQUFJQSxJQUFJLEtBQUssQ0FBQyxFQUFFO0lBQ3RCLElBQUlBLElBQUksR0FBRyxDQUFDLEVBQUU7TUFDWixNQUFNLElBQUlYLGFBQUssQ0FBQ0MsS0FBSyxDQUFDRCxhQUFLLENBQUNDLEtBQUssQ0FBQzRDLGFBQWEsRUFBRSxrQ0FBa0MsQ0FBQztJQUN0RjtJQUVBLElBQUlsQyxJQUFJLEdBQUdRLFFBQVEsRUFBRTtNQUNuQjtNQUNBUixJQUFJLEdBQUdRLFFBQVE7SUFDakI7SUFFQSxJQUFJRSxLQUFLLElBQUlBLEtBQUssS0FBSyxDQUFDLEVBQUU7TUFDeEI7TUFDQSxJQUFJVixJQUFJLEdBQUdVLEtBQUssRUFBRTtRQUNoQjtRQUNBRCxJQUFJLEdBQUcsQ0FBQ0EsSUFBSSxJQUFJLENBQUMsS0FBS0MsS0FBSyxHQUFHVixJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JDVSxLQUFLLEdBQUdWLElBQUksQ0FBQyxDQUFDO01BQ2hCO0lBQ0YsQ0FBQyxNQUFNLElBQUlBLElBQUksS0FBSyxDQUFDLEVBQUU7TUFDckI7TUFDQVUsS0FBSyxHQUFHLENBQUM7SUFDWCxDQUFDLE1BQU07TUFDTDtNQUNBQSxLQUFLLEdBQUdWLElBQUk7TUFDWlcsY0FBYyxHQUFHLElBQUk7SUFDdkI7RUFDRjtFQUNBLE9BQU87SUFDTEYsSUFBSTtJQUNKQyxLQUFLO0lBQ0xDO0VBQ0YsQ0FBQztBQUNILENBQUM7QUFBQzFDLE9BQUEsQ0FBQXNDLHFCQUFBLEdBQUFBLHFCQUFBIiwiaWdub3JlTGlzdCI6W119
|