@beiguancyc/parse-server 9.9.0-ruixiang.1

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.
Files changed (251) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +10 -0
  3. package/README.md +1311 -0
  4. package/bin/parse-live-query-server +3 -0
  5. package/bin/parse-server +3 -0
  6. package/lib/AccountLockout.js +149 -0
  7. package/lib/Adapters/AdapterLoader.js +60 -0
  8. package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
  9. package/lib/Adapters/Auth/AuthAdapter.js +132 -0
  10. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
  11. package/lib/Adapters/Auth/OAuth1Client.js +204 -0
  12. package/lib/Adapters/Auth/apple.js +125 -0
  13. package/lib/Adapters/Auth/facebook.js +187 -0
  14. package/lib/Adapters/Auth/gcenter.js +217 -0
  15. package/lib/Adapters/Auth/github.js +125 -0
  16. package/lib/Adapters/Auth/google.js +122 -0
  17. package/lib/Adapters/Auth/gpgames.js +125 -0
  18. package/lib/Adapters/Auth/httpsRequest.js +41 -0
  19. package/lib/Adapters/Auth/index.js +248 -0
  20. package/lib/Adapters/Auth/instagram.js +118 -0
  21. package/lib/Adapters/Auth/janraincapture.js +85 -0
  22. package/lib/Adapters/Auth/janrainengage.js +57 -0
  23. package/lib/Adapters/Auth/keycloak.js +168 -0
  24. package/lib/Adapters/Auth/ldap.js +193 -0
  25. package/lib/Adapters/Auth/line.js +125 -0
  26. package/lib/Adapters/Auth/linkedin.js +117 -0
  27. package/lib/Adapters/Auth/meetup.js +44 -0
  28. package/lib/Adapters/Auth/mfa.js +334 -0
  29. package/lib/Adapters/Auth/microsoft.js +111 -0
  30. package/lib/Adapters/Auth/oauth2.js +115 -0
  31. package/lib/Adapters/Auth/phantauth.js +53 -0
  32. package/lib/Adapters/Auth/qq.js +113 -0
  33. package/lib/Adapters/Auth/spotify.js +115 -0
  34. package/lib/Adapters/Auth/twitter.js +197 -0
  35. package/lib/Adapters/Auth/utils.js +28 -0
  36. package/lib/Adapters/Auth/vkontakte.js +55 -0
  37. package/lib/Adapters/Auth/wechat.js +110 -0
  38. package/lib/Adapters/Auth/weibo.js +141 -0
  39. package/lib/Adapters/Cache/CacheAdapter.js +40 -0
  40. package/lib/Adapters/Cache/InMemoryCache.js +61 -0
  41. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
  42. package/lib/Adapters/Cache/LRUCache.js +35 -0
  43. package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
  44. package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
  45. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  46. package/lib/Adapters/Email/MailAdapter.js +32 -0
  47. package/lib/Adapters/Files/FilesAdapter.js +129 -0
  48. package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
  49. package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
  50. package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
  51. package/lib/Adapters/Logger/WinstonLogger.js +107 -0
  52. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
  53. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
  54. package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
  55. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  56. package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
  57. package/lib/Adapters/Push/PushAdapter.js +40 -0
  58. package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
  59. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
  60. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
  61. package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
  62. package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
  63. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
  64. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
  65. package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
  66. package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
  67. package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
  68. package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
  69. package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
  70. package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
  71. package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
  72. package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
  73. package/lib/Adapters/Storage/StorageAdapter.js +2 -0
  74. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  75. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  76. package/lib/Auth.js +687 -0
  77. package/lib/AuthDataLock.js +53 -0
  78. package/lib/ClientSDK.js +39 -0
  79. package/lib/Config.js +879 -0
  80. package/lib/Controllers/AdaptableController.js +72 -0
  81. package/lib/Controllers/AnalyticsController.js +43 -0
  82. package/lib/Controllers/CacheController.js +71 -0
  83. package/lib/Controllers/DatabaseController.js +1685 -0
  84. package/lib/Controllers/FilesController.js +122 -0
  85. package/lib/Controllers/HooksController.js +254 -0
  86. package/lib/Controllers/LiveQueryController.js +72 -0
  87. package/lib/Controllers/LoggerController.js +222 -0
  88. package/lib/Controllers/ParseGraphQLController.js +294 -0
  89. package/lib/Controllers/PushController.js +224 -0
  90. package/lib/Controllers/SchemaController.js +1563 -0
  91. package/lib/Controllers/UserController.js +364 -0
  92. package/lib/Controllers/index.js +251 -0
  93. package/lib/Controllers/types.js +2 -0
  94. package/lib/Deprecator/Deprecations.js +100 -0
  95. package/lib/Deprecator/Deprecator.js +140 -0
  96. package/lib/Error.js +50 -0
  97. package/lib/FileUrlValidator.js +69 -0
  98. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  99. package/lib/GraphQL/ParseGraphQLServer.js +241 -0
  100. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  101. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  102. package/lib/GraphQL/helpers/queryComplexity.js +138 -0
  103. package/lib/GraphQL/loaders/configMutations.js +87 -0
  104. package/lib/GraphQL/loaders/configQueries.js +79 -0
  105. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  106. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  107. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
  108. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  109. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  110. package/lib/GraphQL/loaders/functionsMutations.js +77 -0
  111. package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
  112. package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
  113. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  114. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  115. package/lib/GraphQL/loaders/schemaMutations.js +161 -0
  116. package/lib/GraphQL/loaders/schemaQueries.js +80 -0
  117. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  118. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  119. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  120. package/lib/GraphQL/parseGraphQLUtils.js +71 -0
  121. package/lib/GraphQL/transformers/className.js +14 -0
  122. package/lib/GraphQL/transformers/constraintType.js +53 -0
  123. package/lib/GraphQL/transformers/inputType.js +51 -0
  124. package/lib/GraphQL/transformers/mutation.js +280 -0
  125. package/lib/GraphQL/transformers/outputType.js +51 -0
  126. package/lib/GraphQL/transformers/query.js +237 -0
  127. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  128. package/lib/InstallationDedup.js +178 -0
  129. package/lib/KeyPromiseQueue.js +48 -0
  130. package/lib/LiveQuery/Client.js +90 -0
  131. package/lib/LiveQuery/Id.js +20 -0
  132. package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
  133. package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
  134. package/lib/LiveQuery/ParsePubSub.js +37 -0
  135. package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
  136. package/lib/LiveQuery/QueryTools.js +443 -0
  137. package/lib/LiveQuery/RequestSchema.js +161 -0
  138. package/lib/LiveQuery/SessionTokenCache.js +51 -0
  139. package/lib/LiveQuery/Subscription.js +47 -0
  140. package/lib/LiveQuery/equalObjects.js +50 -0
  141. package/lib/Options/Definitions.js +1599 -0
  142. package/lib/Options/docs.js +389 -0
  143. package/lib/Options/index.js +12 -0
  144. package/lib/Options/parsers.js +89 -0
  145. package/lib/Page.js +44 -0
  146. package/lib/ParseMessageQueue.js +24 -0
  147. package/lib/ParseServer.js +632 -0
  148. package/lib/ParseServerRESTController.js +173 -0
  149. package/lib/PromiseRouter.js +208 -0
  150. package/lib/Push/PushQueue.js +67 -0
  151. package/lib/Push/PushWorker.js +101 -0
  152. package/lib/Push/utils.js +129 -0
  153. package/lib/RestQuery.js +1208 -0
  154. package/lib/RestWrite.js +1671 -0
  155. package/lib/Routers/AggregateRouter.js +150 -0
  156. package/lib/Routers/AnalyticsRouter.js +26 -0
  157. package/lib/Routers/AudiencesRouter.js +54 -0
  158. package/lib/Routers/ClassesRouter.js +191 -0
  159. package/lib/Routers/CloudCodeRouter.js +87 -0
  160. package/lib/Routers/FeaturesRouter.js +72 -0
  161. package/lib/Routers/FilesRouter.js +772 -0
  162. package/lib/Routers/FunctionsRouter.js +341 -0
  163. package/lib/Routers/GlobalConfigRouter.js +123 -0
  164. package/lib/Routers/GraphQLRouter.js +41 -0
  165. package/lib/Routers/HooksRouter.js +121 -0
  166. package/lib/Routers/IAPValidationRouter.js +113 -0
  167. package/lib/Routers/InstallationsRouter.js +46 -0
  168. package/lib/Routers/LogsRouter.js +57 -0
  169. package/lib/Routers/PagesRouter.js +676 -0
  170. package/lib/Routers/PurgeRouter.js +45 -0
  171. package/lib/Routers/PushRouter.js +75 -0
  172. package/lib/Routers/RolesRouter.js +33 -0
  173. package/lib/Routers/SchemasRouter.js +118 -0
  174. package/lib/Routers/SecurityRouter.js +34 -0
  175. package/lib/Routers/SessionsRouter.js +126 -0
  176. package/lib/Routers/UsersRouter.js +733 -0
  177. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  178. package/lib/SchemaMigrations/Migrations.js +30 -0
  179. package/lib/Security/Check.js +109 -0
  180. package/lib/Security/CheckGroup.js +44 -0
  181. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  182. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
  183. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  184. package/lib/Security/CheckRunner.js +213 -0
  185. package/lib/SharedRest.js +34 -0
  186. package/lib/StatusHandler.js +329 -0
  187. package/lib/TestUtils.js +87 -0
  188. package/lib/Utils.js +577 -0
  189. package/lib/batch.js +185 -0
  190. package/lib/cache.js +12 -0
  191. package/lib/cli/definitions/parse-live-query-server.js +9 -0
  192. package/lib/cli/definitions/parse-server.js +9 -0
  193. package/lib/cli/parse-live-query-server.js +14 -0
  194. package/lib/cli/parse-server.js +101 -0
  195. package/lib/cli/utils/commander.js +132 -0
  196. package/lib/cli/utils/runner.js +53 -0
  197. package/lib/cloud-code/Parse.Cloud.js +797 -0
  198. package/lib/cloud-code/Parse.Server.js +21 -0
  199. package/lib/cryptoUtils.js +54 -0
  200. package/lib/defaults.js +58 -0
  201. package/lib/deprecated.js +12 -0
  202. package/lib/index.js +89 -0
  203. package/lib/logger.js +40 -0
  204. package/lib/middlewares.js +810 -0
  205. package/lib/password.js +40 -0
  206. package/lib/request.js +175 -0
  207. package/lib/requiredParameter.js +11 -0
  208. package/lib/rest.js +264 -0
  209. package/lib/triggers.js +949 -0
  210. package/lib/vendor/README.md +8 -0
  211. package/lib/vendor/mongodbUrl.js +1012 -0
  212. package/package.json +172 -0
  213. package/postinstall.js +38 -0
  214. package/public/custom_json.html +17 -0
  215. package/public/custom_json.json +23 -0
  216. package/public/custom_page.html +15 -0
  217. package/public/de/email_verification_link_expired.html +24 -0
  218. package/public/de/email_verification_link_invalid.html +21 -0
  219. package/public/de/email_verification_send_fail.html +21 -0
  220. package/public/de/email_verification_send_success.html +19 -0
  221. package/public/de/email_verification_success.html +18 -0
  222. package/public/de/password_reset.html +65 -0
  223. package/public/de/password_reset_link_invalid.html +19 -0
  224. package/public/de/password_reset_success.html +18 -0
  225. package/public/de-AT/email_verification_link_expired.html +24 -0
  226. package/public/de-AT/email_verification_link_invalid.html +21 -0
  227. package/public/de-AT/email_verification_send_fail.html +21 -0
  228. package/public/de-AT/email_verification_send_success.html +19 -0
  229. package/public/de-AT/email_verification_success.html +18 -0
  230. package/public/de-AT/password_reset.html +65 -0
  231. package/public/de-AT/password_reset_link_invalid.html +19 -0
  232. package/public/de-AT/password_reset_success.html +18 -0
  233. package/public/email_verification_link_expired.html +24 -0
  234. package/public/email_verification_link_invalid.html +21 -0
  235. package/public/email_verification_send_fail.html +21 -0
  236. package/public/email_verification_send_success.html +19 -0
  237. package/public/email_verification_success.html +18 -0
  238. package/public/password_reset.html +65 -0
  239. package/public/password_reset_link_invalid.html +19 -0
  240. package/public/password_reset_success.html +18 -0
  241. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  242. package/types/@types/deepcopy/index.d.ts +5 -0
  243. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  244. package/types/Options/index.d.ts +320 -0
  245. package/types/ParseServer.d.ts +65 -0
  246. package/types/eslint.config.mjs +30 -0
  247. package/types/index.d.ts +21 -0
  248. package/types/logger.d.ts +2 -0
  249. package/types/tests.ts +44 -0
  250. package/types/tsconfig.json +24 -0
  251. package/views/choose_password +215 -0
@@ -0,0 +1,1012 @@
1
+ /*
2
+ * A slightly patched version of node's URL module, with support for `mongodb://` URIs.
3
+ * See https://github.com/nodejs/node for licensing information.
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ var _punycode = _interopRequireDefault(require("punycode/punycode.js"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ exports.parse = urlParse;
11
+ exports.resolve = urlResolve;
12
+ exports.resolveObject = urlResolveObject;
13
+ exports.format = urlFormat;
14
+ exports.Url = Url;
15
+ function Url() {
16
+ this.protocol = null;
17
+ this.slashes = null;
18
+ this.auth = null;
19
+ this.host = null;
20
+ this.port = null;
21
+ this.hostname = null;
22
+ this.hash = null;
23
+ this.search = null;
24
+ this.query = null;
25
+ this.pathname = null;
26
+ this.path = null;
27
+ this.href = null;
28
+ }
29
+
30
+ // Reference: RFC 3986, RFC 1808, RFC 2396
31
+
32
+ // define these here so at least they only have to be
33
+ // compiled once on the first module load.
34
+ const protocolPattern = /^([a-z0-9.+-]+:)/i;
35
+ const portPattern = /:[0-9]*$/;
36
+
37
+ // Special case for a simple path URL
38
+ const simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/;
39
+
40
+ // protocols that can allow "unsafe" and "unwise" chars.
41
+ const unsafeProtocol = {
42
+ javascript: true,
43
+ 'javascript:': true
44
+ };
45
+ // protocols that never have a hostname.
46
+ const hostlessProtocol = {
47
+ javascript: true,
48
+ 'javascript:': true
49
+ };
50
+ // protocols that always contain a // bit.
51
+ const slashedProtocol = {
52
+ http: true,
53
+ 'http:': true,
54
+ https: true,
55
+ 'https:': true,
56
+ ftp: true,
57
+ 'ftp:': true,
58
+ gopher: true,
59
+ 'gopher:': true,
60
+ file: true,
61
+ 'file:': true
62
+ };
63
+ const querystring = require('querystring');
64
+
65
+ /* istanbul ignore next: improve coverage */
66
+ function urlParse(url, parseQueryString, slashesDenoteHost) {
67
+ if (url instanceof Url) {
68
+ return url;
69
+ }
70
+ var u = new Url();
71
+ u.parse(url, parseQueryString, slashesDenoteHost);
72
+ return u;
73
+ }
74
+
75
+ /* istanbul ignore next: improve coverage */
76
+ Url.prototype.parse = function (url, parseQueryString, slashesDenoteHost) {
77
+ if (typeof url !== 'string') {
78
+ throw new TypeError('Parameter "url" must be a string, not ' + typeof url);
79
+ }
80
+
81
+ // Copy chrome, IE, opera backslash-handling behavior.
82
+ // Back slashes before the query string get converted to forward slashes
83
+ // See: https://code.google.com/p/chromium/issues/detail?id=25916
84
+ var hasHash = false;
85
+ var start = -1;
86
+ var end = -1;
87
+ var rest = '';
88
+ var lastPos = 0;
89
+ var i = 0;
90
+ for (var inWs = false, split = false; i < url.length; ++i) {
91
+ const code = url.charCodeAt(i);
92
+
93
+ // Find first and last non-whitespace characters for trimming
94
+ const isWs = code === 32 /* */ || code === 9 /*\t*/ || code === 13 /*\r*/ || code === 10 /*\n*/ || code === 12 /*\f*/ || code === 160 /*\u00A0*/ || code === 65279; /*\uFEFF*/
95
+ if (start === -1) {
96
+ if (isWs) {
97
+ continue;
98
+ }
99
+ lastPos = start = i;
100
+ } else {
101
+ if (inWs) {
102
+ if (!isWs) {
103
+ end = -1;
104
+ inWs = false;
105
+ }
106
+ } else if (isWs) {
107
+ end = i;
108
+ inWs = true;
109
+ }
110
+ }
111
+
112
+ // Only convert backslashes while we haven't seen a split character
113
+ if (!split) {
114
+ switch (code) {
115
+ case 35:
116
+ // '#'
117
+ hasHash = true;
118
+ // Fall through
119
+ case 63:
120
+ // '?'
121
+ split = true;
122
+ break;
123
+ case 92:
124
+ // '\\'
125
+ if (i - lastPos > 0) {
126
+ rest += url.slice(lastPos, i);
127
+ }
128
+ rest += '/';
129
+ lastPos = i + 1;
130
+ break;
131
+ }
132
+ } else if (!hasHash && code === 35 /*#*/) {
133
+ hasHash = true;
134
+ }
135
+ }
136
+
137
+ // Check if string was non-empty (including strings with only whitespace)
138
+ if (start !== -1) {
139
+ if (lastPos === start) {
140
+ // We didn't convert any backslashes
141
+
142
+ if (end === -1) {
143
+ if (start === 0) {
144
+ rest = url;
145
+ } else {
146
+ rest = url.slice(start);
147
+ }
148
+ } else {
149
+ rest = url.slice(start, end);
150
+ }
151
+ } else if (end === -1 && lastPos < url.length) {
152
+ // We converted some backslashes and have only part of the entire string
153
+ rest += url.slice(lastPos);
154
+ } else if (end !== -1 && lastPos < end) {
155
+ // We converted some backslashes and have only part of the entire string
156
+ rest += url.slice(lastPos, end);
157
+ }
158
+ }
159
+ if (!slashesDenoteHost && !hasHash) {
160
+ // Try fast path regexp
161
+ const simplePath = simplePathPattern.exec(rest);
162
+ if (simplePath) {
163
+ this.path = rest;
164
+ this.href = rest;
165
+ this.pathname = simplePath[1];
166
+ if (simplePath[2]) {
167
+ this.search = simplePath[2];
168
+ if (parseQueryString) {
169
+ this.query = querystring.parse(this.search.slice(1));
170
+ } else {
171
+ this.query = this.search.slice(1);
172
+ }
173
+ } else if (parseQueryString) {
174
+ this.search = '';
175
+ this.query = {};
176
+ }
177
+ return this;
178
+ }
179
+ }
180
+ var proto = protocolPattern.exec(rest);
181
+ if (proto) {
182
+ proto = proto[0];
183
+ var lowerProto = proto.toLowerCase();
184
+ this.protocol = lowerProto;
185
+ rest = rest.slice(proto.length);
186
+ }
187
+
188
+ // figure out if it's got a host
189
+ // user@server is *always* interpreted as a hostname, and url
190
+ // resolution will treat //foo/bar as host=foo,path=bar because that's
191
+ // how the browser resolves relative URLs.
192
+ if (slashesDenoteHost || proto || /^\/\/[^@\/]+@[^@\/]+/.test(rest)) {
193
+ var slashes = rest.charCodeAt(0) === 47 /*/*/ && rest.charCodeAt(1) === 47; /*/*/
194
+ if (slashes && !(proto && hostlessProtocol[proto])) {
195
+ rest = rest.slice(2);
196
+ this.slashes = true;
197
+ }
198
+ }
199
+ if (!hostlessProtocol[proto] && (slashes || proto && !slashedProtocol[proto])) {
200
+ // there's a hostname.
201
+ // the first instance of /, ?, ;, or # ends the host.
202
+ //
203
+ // If there is an @ in the hostname, then non-host chars *are* allowed
204
+ // to the left of the last @ sign, unless some host-ending character
205
+ // comes *before* the @-sign.
206
+ // URLs are obnoxious.
207
+ //
208
+ // ex:
209
+ // http://a@b@c/ => user:a@b host:c
210
+ // http://a@b?@c => user:a host:b path:/?@c
211
+
212
+ // v0.12 TODO(isaacs): This is not quite how Chrome does things.
213
+ // Review our test case against browsers more comprehensively.
214
+
215
+ var hostEnd = -1;
216
+ var atSign = -1;
217
+ var nonHost = -1;
218
+ for (i = 0; i < rest.length; ++i) {
219
+ switch (rest.charCodeAt(i)) {
220
+ case 9: // '\t'
221
+ case 10: // '\n'
222
+ case 13: // '\r'
223
+ case 32: // ' '
224
+ case 34: // '"'
225
+ case 37: // '%'
226
+ case 39: // '\''
227
+ case 59: // ';'
228
+ case 60: // '<'
229
+ case 62: // '>'
230
+ case 92: // '\\'
231
+ case 94: // '^'
232
+ case 96: // '`'
233
+ case 123: // '{'
234
+ case 124: // '|'
235
+ case 125:
236
+ // '}'
237
+ // Characters that are never ever allowed in a hostname from RFC 2396
238
+ if (nonHost === -1) {
239
+ nonHost = i;
240
+ }
241
+ break;
242
+ case 35: // '#'
243
+ case 47: // '/'
244
+ case 63:
245
+ // '?'
246
+ // Find the first instance of any host-ending characters
247
+ if (nonHost === -1) {
248
+ nonHost = i;
249
+ }
250
+ hostEnd = i;
251
+ break;
252
+ case 64:
253
+ // '@'
254
+ // At this point, either we have an explicit point where the
255
+ // auth portion cannot go past, or the last @ char is the decider.
256
+ atSign = i;
257
+ nonHost = -1;
258
+ break;
259
+ }
260
+ if (hostEnd !== -1) {
261
+ break;
262
+ }
263
+ }
264
+ start = 0;
265
+ if (atSign !== -1) {
266
+ this.auth = decodeURIComponent(rest.slice(0, atSign));
267
+ start = atSign + 1;
268
+ }
269
+ if (nonHost === -1) {
270
+ this.host = rest.slice(start);
271
+ rest = '';
272
+ } else {
273
+ this.host = rest.slice(start, nonHost);
274
+ rest = rest.slice(nonHost);
275
+ }
276
+
277
+ // pull out port.
278
+ this.parseHost();
279
+
280
+ // we've indicated that there is a hostname,
281
+ // so even if it's empty, it has to be present.
282
+ if (typeof this.hostname !== 'string') {
283
+ this.hostname = '';
284
+ }
285
+ var hostname = this.hostname;
286
+
287
+ // if hostname begins with [ and ends with ]
288
+ // assume that it's an IPv6 address.
289
+ var ipv6Hostname = hostname.charCodeAt(0) === 91 /*[*/ && hostname.charCodeAt(hostname.length - 1) === 93; /*]*/
290
+
291
+ // validate a little.
292
+ if (!ipv6Hostname) {
293
+ const result = validateHostname(this, rest, hostname);
294
+ if (result !== undefined) {
295
+ rest = result;
296
+ }
297
+ }
298
+
299
+ // hostnames are always lower case.
300
+ this.hostname = this.hostname.toLowerCase();
301
+ if (!ipv6Hostname) {
302
+ // IDNA Support: Returns a punycoded representation of "domain".
303
+ // It only converts parts of the domain name that
304
+ // have non-ASCII characters, i.e. it doesn't matter if
305
+ // you call it with a domain that already is ASCII-only.
306
+ this.hostname = _punycode.default.toASCII(this.hostname);
307
+ }
308
+ var p = this.port ? ':' + this.port : '';
309
+ var h = this.hostname || '';
310
+ this.host = h + p;
311
+
312
+ // strip [ and ] from the hostname
313
+ // the host field still retains them, though
314
+ if (ipv6Hostname) {
315
+ this.hostname = this.hostname.slice(1, -1);
316
+ if (rest[0] !== '/') {
317
+ rest = '/' + rest;
318
+ }
319
+ }
320
+ }
321
+
322
+ // now rest is set to the post-host stuff.
323
+ // chop off any delim chars.
324
+ if (!unsafeProtocol[lowerProto]) {
325
+ // First, make 100% sure that any "autoEscape" chars get
326
+ // escaped, even if encodeURIComponent doesn't think they
327
+ // need to be.
328
+ const result = autoEscapeStr(rest);
329
+ if (result !== undefined) {
330
+ rest = result;
331
+ }
332
+ }
333
+ var questionIdx = -1;
334
+ var hashIdx = -1;
335
+ for (i = 0; i < rest.length; ++i) {
336
+ const code = rest.charCodeAt(i);
337
+ if (code === 35 /*#*/) {
338
+ this.hash = rest.slice(i);
339
+ hashIdx = i;
340
+ break;
341
+ } else if (code === 63 /*?*/ && questionIdx === -1) {
342
+ questionIdx = i;
343
+ }
344
+ }
345
+ if (questionIdx !== -1) {
346
+ if (hashIdx === -1) {
347
+ this.search = rest.slice(questionIdx);
348
+ this.query = rest.slice(questionIdx + 1);
349
+ } else {
350
+ this.search = rest.slice(questionIdx, hashIdx);
351
+ this.query = rest.slice(questionIdx + 1, hashIdx);
352
+ }
353
+ if (parseQueryString) {
354
+ this.query = querystring.parse(this.query);
355
+ }
356
+ } else if (parseQueryString) {
357
+ // no query string, but parseQueryString still requested
358
+ this.search = '';
359
+ this.query = {};
360
+ }
361
+ var firstIdx = questionIdx !== -1 && (hashIdx === -1 || questionIdx < hashIdx) ? questionIdx : hashIdx;
362
+ if (firstIdx === -1) {
363
+ if (rest.length > 0) {
364
+ this.pathname = rest;
365
+ }
366
+ } else if (firstIdx > 0) {
367
+ this.pathname = rest.slice(0, firstIdx);
368
+ }
369
+ if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {
370
+ this.pathname = '/';
371
+ }
372
+
373
+ // to support http.request
374
+ if (this.pathname || this.search) {
375
+ const p = this.pathname || '';
376
+ const s = this.search || '';
377
+ this.path = p + s;
378
+ }
379
+
380
+ // finally, reconstruct the href based on what has been validated.
381
+ this.href = this.format();
382
+ return this;
383
+ };
384
+
385
+ /* istanbul ignore next: improve coverage */
386
+ function validateHostname(self, rest, hostname) {
387
+ for (var i = 0, lastPos; i <= hostname.length; ++i) {
388
+ var code;
389
+ if (i < hostname.length) {
390
+ code = hostname.charCodeAt(i);
391
+ }
392
+ if (code === 46 /*.*/ || i === hostname.length) {
393
+ if (i - lastPos > 0) {
394
+ if (i - lastPos > 63) {
395
+ self.hostname = hostname.slice(0, lastPos + 63);
396
+ return '/' + hostname.slice(lastPos + 63) + rest;
397
+ }
398
+ }
399
+ lastPos = i + 1;
400
+ continue;
401
+ } else if (code >= 48 /*0*/ && code <= 57 /*9*/ || code >= 97 /*a*/ && code <= 122 /*z*/ || code === 45 /*-*/ || code >= 65 /*A*/ && code <= 90 /*Z*/ || code === 43 /*+*/ || code === 95 /*_*/ || /* BEGIN MONGO URI PATCH */
402
+ code === 44 /*,*/ || code === 58 /*:*/ || /* END MONGO URI PATCH */
403
+ code > 127) {
404
+ continue;
405
+ }
406
+ // Invalid host character
407
+ self.hostname = hostname.slice(0, i);
408
+ if (i < hostname.length) {
409
+ return '/' + hostname.slice(i) + rest;
410
+ }
411
+ break;
412
+ }
413
+ }
414
+
415
+ /* istanbul ignore next: improve coverage */
416
+ function autoEscapeStr(rest) {
417
+ var newRest = '';
418
+ var lastPos = 0;
419
+ for (var i = 0; i < rest.length; ++i) {
420
+ // Automatically escape all delimiters and unwise characters from RFC 2396
421
+ // Also escape single quotes in case of an XSS attack
422
+ switch (rest.charCodeAt(i)) {
423
+ case 9:
424
+ // '\t'
425
+ if (i - lastPos > 0) {
426
+ newRest += rest.slice(lastPos, i);
427
+ }
428
+ newRest += '%09';
429
+ lastPos = i + 1;
430
+ break;
431
+ case 10:
432
+ // '\n'
433
+ if (i - lastPos > 0) {
434
+ newRest += rest.slice(lastPos, i);
435
+ }
436
+ newRest += '%0A';
437
+ lastPos = i + 1;
438
+ break;
439
+ case 13:
440
+ // '\r'
441
+ if (i - lastPos > 0) {
442
+ newRest += rest.slice(lastPos, i);
443
+ }
444
+ newRest += '%0D';
445
+ lastPos = i + 1;
446
+ break;
447
+ case 32:
448
+ // ' '
449
+ if (i - lastPos > 0) {
450
+ newRest += rest.slice(lastPos, i);
451
+ }
452
+ newRest += '%20';
453
+ lastPos = i + 1;
454
+ break;
455
+ case 34:
456
+ // '"'
457
+ if (i - lastPos > 0) {
458
+ newRest += rest.slice(lastPos, i);
459
+ }
460
+ newRest += '%22';
461
+ lastPos = i + 1;
462
+ break;
463
+ case 39:
464
+ // '\''
465
+ if (i - lastPos > 0) {
466
+ newRest += rest.slice(lastPos, i);
467
+ }
468
+ newRest += '%27';
469
+ lastPos = i + 1;
470
+ break;
471
+ case 60:
472
+ // '<'
473
+ if (i - lastPos > 0) {
474
+ newRest += rest.slice(lastPos, i);
475
+ }
476
+ newRest += '%3C';
477
+ lastPos = i + 1;
478
+ break;
479
+ case 62:
480
+ // '>'
481
+ if (i - lastPos > 0) {
482
+ newRest += rest.slice(lastPos, i);
483
+ }
484
+ newRest += '%3E';
485
+ lastPos = i + 1;
486
+ break;
487
+ case 92:
488
+ // '\\'
489
+ if (i - lastPos > 0) {
490
+ newRest += rest.slice(lastPos, i);
491
+ }
492
+ newRest += '%5C';
493
+ lastPos = i + 1;
494
+ break;
495
+ case 94:
496
+ // '^'
497
+ if (i - lastPos > 0) {
498
+ newRest += rest.slice(lastPos, i);
499
+ }
500
+ newRest += '%5E';
501
+ lastPos = i + 1;
502
+ break;
503
+ case 96:
504
+ // '`'
505
+ if (i - lastPos > 0) {
506
+ newRest += rest.slice(lastPos, i);
507
+ }
508
+ newRest += '%60';
509
+ lastPos = i + 1;
510
+ break;
511
+ case 123:
512
+ // '{'
513
+ if (i - lastPos > 0) {
514
+ newRest += rest.slice(lastPos, i);
515
+ }
516
+ newRest += '%7B';
517
+ lastPos = i + 1;
518
+ break;
519
+ case 124:
520
+ // '|'
521
+ if (i - lastPos > 0) {
522
+ newRest += rest.slice(lastPos, i);
523
+ }
524
+ newRest += '%7C';
525
+ lastPos = i + 1;
526
+ break;
527
+ case 125:
528
+ // '}'
529
+ if (i - lastPos > 0) {
530
+ newRest += rest.slice(lastPos, i);
531
+ }
532
+ newRest += '%7D';
533
+ lastPos = i + 1;
534
+ break;
535
+ }
536
+ }
537
+ if (lastPos === 0) {
538
+ return;
539
+ }
540
+ if (lastPos < rest.length) {
541
+ return newRest + rest.slice(lastPos);
542
+ } else {
543
+ return newRest;
544
+ }
545
+ }
546
+
547
+ // format a parsed object into a url string
548
+ /* istanbul ignore next: improve coverage */
549
+ function urlFormat(obj) {
550
+ // ensure it's an object, and not a string url.
551
+ // If it's an obj, this is a no-op.
552
+ // this way, you can call url_format() on strings
553
+ // to clean up potentially wonky urls.
554
+ if (typeof obj === 'string') {
555
+ obj = urlParse(obj);
556
+ } else if (typeof obj !== 'object' || obj === null) {
557
+ throw new TypeError('Parameter "urlObj" must be an object, not ' + (obj === null ? 'null' : typeof obj));
558
+ } else if (!(obj instanceof Url)) {
559
+ return Url.prototype.format.call(obj);
560
+ }
561
+ return obj.format();
562
+ }
563
+
564
+ /* istanbul ignore next: improve coverage */
565
+ Url.prototype.format = function () {
566
+ var auth = this.auth || '';
567
+ if (auth) {
568
+ auth = encodeAuth(auth);
569
+ auth += '@';
570
+ }
571
+ var protocol = this.protocol || '';
572
+ var pathname = this.pathname || '';
573
+ var hash = this.hash || '';
574
+ var host = false;
575
+ var query = '';
576
+ if (this.host) {
577
+ host = auth + this.host;
578
+ } else if (this.hostname) {
579
+ host = auth + (this.hostname.indexOf(':') === -1 ? this.hostname : '[' + this.hostname + ']');
580
+ if (this.port) {
581
+ host += ':' + this.port;
582
+ }
583
+ }
584
+ if (this.query !== null && typeof this.query === 'object') {
585
+ query = querystring.stringify(this.query);
586
+ }
587
+ var search = this.search || query && '?' + query || '';
588
+ if (protocol && protocol.charCodeAt(protocol.length - 1) !== 58 /*:*/) {
589
+ protocol += ':';
590
+ }
591
+ var newPathname = '';
592
+ var lastPos = 0;
593
+ for (var i = 0; i < pathname.length; ++i) {
594
+ switch (pathname.charCodeAt(i)) {
595
+ case 35:
596
+ // '#'
597
+ if (i - lastPos > 0) {
598
+ newPathname += pathname.slice(lastPos, i);
599
+ }
600
+ newPathname += '%23';
601
+ lastPos = i + 1;
602
+ break;
603
+ case 63:
604
+ // '?'
605
+ if (i - lastPos > 0) {
606
+ newPathname += pathname.slice(lastPos, i);
607
+ }
608
+ newPathname += '%3F';
609
+ lastPos = i + 1;
610
+ break;
611
+ }
612
+ }
613
+ if (lastPos > 0) {
614
+ if (lastPos !== pathname.length) {
615
+ pathname = newPathname + pathname.slice(lastPos);
616
+ } else {
617
+ pathname = newPathname;
618
+ }
619
+ }
620
+
621
+ // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
622
+ // unless they had them to begin with.
623
+ if (this.slashes || (!protocol || slashedProtocol[protocol]) && host !== false) {
624
+ host = '//' + (host || '');
625
+ if (pathname && pathname.charCodeAt(0) !== 47 /*/*/) {
626
+ pathname = '/' + pathname;
627
+ }
628
+ } else if (!host) {
629
+ host = '';
630
+ }
631
+ search = search.replace('#', '%23');
632
+ if (hash && hash.charCodeAt(0) !== 35 /*#*/) {
633
+ hash = '#' + hash;
634
+ }
635
+ if (search && search.charCodeAt(0) !== 63 /*?*/) {
636
+ search = '?' + search;
637
+ }
638
+ return protocol + host + pathname + search + hash;
639
+ };
640
+
641
+ /* istanbul ignore next: improve coverage */
642
+ function urlResolve(source, relative) {
643
+ return urlParse(source, false, true).resolve(relative);
644
+ }
645
+
646
+ /* istanbul ignore next: improve coverage */
647
+ Url.prototype.resolve = function (relative) {
648
+ return this.resolveObject(urlParse(relative, false, true)).format();
649
+ };
650
+
651
+ /* istanbul ignore next: improve coverage */
652
+ function urlResolveObject(source, relative) {
653
+ if (!source) {
654
+ return relative;
655
+ }
656
+ return urlParse(source, false, true).resolveObject(relative);
657
+ }
658
+
659
+ /* istanbul ignore next: improve coverage */
660
+ Url.prototype.resolveObject = function (relative) {
661
+ if (typeof relative === 'string') {
662
+ var rel = new Url();
663
+ rel.parse(relative, false, true);
664
+ relative = rel;
665
+ }
666
+ var result = new Url();
667
+ var tkeys = Object.keys(this);
668
+ for (var tk = 0; tk < tkeys.length; tk++) {
669
+ var tkey = tkeys[tk];
670
+ result[tkey] = this[tkey];
671
+ }
672
+
673
+ // hash is always overridden, no matter what.
674
+ // even href="" will remove it.
675
+ result.hash = relative.hash;
676
+
677
+ // if the relative url is empty, then there's nothing left to do here.
678
+ if (relative.href === '') {
679
+ result.href = result.format();
680
+ return result;
681
+ }
682
+
683
+ // hrefs like //foo/bar always cut to the protocol.
684
+ if (relative.slashes && !relative.protocol) {
685
+ // take everything except the protocol from relative
686
+ var rkeys = Object.keys(relative);
687
+ for (var rk = 0; rk < rkeys.length; rk++) {
688
+ var rkey = rkeys[rk];
689
+ if (rkey !== 'protocol') {
690
+ result[rkey] = relative[rkey];
691
+ }
692
+ }
693
+
694
+ //urlParse appends trailing / to urls like http://www.example.com
695
+ if (slashedProtocol[result.protocol] && result.hostname && !result.pathname) {
696
+ result.path = result.pathname = '/';
697
+ }
698
+ result.href = result.format();
699
+ return result;
700
+ }
701
+ if (relative.protocol && relative.protocol !== result.protocol) {
702
+ // if it's a known url protocol, then changing
703
+ // the protocol does weird things
704
+ // first, if it's not file:, then we MUST have a host,
705
+ // and if there was a path
706
+ // to begin with, then we MUST have a path.
707
+ // if it is file:, then the host is dropped,
708
+ // because that's known to be hostless.
709
+ // anything else is assumed to be absolute.
710
+ if (!slashedProtocol[relative.protocol]) {
711
+ var keys = Object.keys(relative);
712
+ for (var v = 0; v < keys.length; v++) {
713
+ var k = keys[v];
714
+ result[k] = relative[k];
715
+ }
716
+ result.href = result.format();
717
+ return result;
718
+ }
719
+ result.protocol = relative.protocol;
720
+ if (!relative.host && !/^file:?$/.test(relative.protocol) && !hostlessProtocol[relative.protocol]) {
721
+ const relPath = (relative.pathname || '').split('/');
722
+ while (relPath.length) {
723
+ const shifted = relPath.shift();
724
+ if (shifted) {
725
+ relative.host = shifted;
726
+ break;
727
+ }
728
+ }
729
+ if (!relative.host) {
730
+ relative.host = '';
731
+ }
732
+ if (!relative.hostname) {
733
+ relative.hostname = '';
734
+ }
735
+ if (relPath[0] !== '') {
736
+ relPath.unshift('');
737
+ }
738
+ if (relPath.length < 2) {
739
+ relPath.unshift('');
740
+ }
741
+ result.pathname = relPath.join('/');
742
+ } else {
743
+ result.pathname = relative.pathname;
744
+ }
745
+ result.search = relative.search;
746
+ result.query = relative.query;
747
+ result.host = relative.host || '';
748
+ result.auth = relative.auth;
749
+ result.hostname = relative.hostname || relative.host;
750
+ result.port = relative.port;
751
+ // to support http.request
752
+ if (result.pathname || result.search) {
753
+ var p = result.pathname || '';
754
+ var s = result.search || '';
755
+ result.path = p + s;
756
+ }
757
+ result.slashes = result.slashes || relative.slashes;
758
+ result.href = result.format();
759
+ return result;
760
+ }
761
+ var isSourceAbs = result.pathname && result.pathname.charAt(0) === '/';
762
+ var isRelAbs = relative.host || relative.pathname && relative.pathname.charAt(0) === '/';
763
+ var mustEndAbs = isRelAbs || isSourceAbs || result.host && relative.pathname;
764
+ var removeAllDots = mustEndAbs;
765
+ var srcPath = result.pathname && result.pathname.split('/') || [];
766
+ var relPath = relative.pathname && relative.pathname.split('/') || [];
767
+ var psychotic = result.protocol && !slashedProtocol[result.protocol];
768
+
769
+ // if the url is a non-slashed url, then relative
770
+ // links like ../.. should be able
771
+ // to crawl up to the hostname, as well. This is strange.
772
+ // result.protocol has already been set by now.
773
+ // Later on, put the first path part into the host field.
774
+ if (psychotic) {
775
+ result.hostname = '';
776
+ result.port = null;
777
+ if (result.host) {
778
+ if (srcPath[0] === '') {
779
+ srcPath[0] = result.host;
780
+ } else {
781
+ srcPath.unshift(result.host);
782
+ }
783
+ }
784
+ result.host = '';
785
+ if (relative.protocol) {
786
+ relative.hostname = null;
787
+ relative.port = null;
788
+ if (relative.host) {
789
+ if (relPath[0] === '') {
790
+ relPath[0] = relative.host;
791
+ } else {
792
+ relPath.unshift(relative.host);
793
+ }
794
+ }
795
+ relative.host = null;
796
+ }
797
+ mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
798
+ }
799
+ if (isRelAbs) {
800
+ // it's absolute.
801
+ result.host = relative.host || relative.host === '' ? relative.host : result.host;
802
+ result.hostname = relative.hostname || relative.hostname === '' ? relative.hostname : result.hostname;
803
+ result.search = relative.search;
804
+ result.query = relative.query;
805
+ srcPath = relPath;
806
+ // fall through to the dot-handling below.
807
+ } else if (relPath.length) {
808
+ // it's relative
809
+ // throw away the existing file, and take the new path instead.
810
+ if (!srcPath) {
811
+ srcPath = [];
812
+ }
813
+ srcPath.pop();
814
+ srcPath = srcPath.concat(relPath);
815
+ result.search = relative.search;
816
+ result.query = relative.query;
817
+ } else if (relative.search !== null && relative.search !== undefined) {
818
+ // just pull out the search.
819
+ // like href='?foo'.
820
+ // Put this after the other two cases because it simplifies the booleans
821
+ if (psychotic) {
822
+ result.hostname = result.host = srcPath.shift();
823
+ //occasionally the auth can get stuck only in host
824
+ //this especially happens in cases like
825
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
826
+ const authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;
827
+ if (authInHost) {
828
+ result.auth = authInHost.shift();
829
+ result.host = result.hostname = authInHost.shift();
830
+ }
831
+ }
832
+ result.search = relative.search;
833
+ result.query = relative.query;
834
+ //to support http.request
835
+ if (result.pathname !== null || result.search !== null) {
836
+ result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');
837
+ }
838
+ result.href = result.format();
839
+ return result;
840
+ }
841
+ if (!srcPath.length) {
842
+ // no path at all. easy.
843
+ // we've already handled the other stuff above.
844
+ result.pathname = null;
845
+ //to support http.request
846
+ if (result.search) {
847
+ result.path = '/' + result.search;
848
+ } else {
849
+ result.path = null;
850
+ }
851
+ result.href = result.format();
852
+ return result;
853
+ }
854
+
855
+ // if a url ENDs in . or .., then it must get a trailing slash.
856
+ // however, if it ends in anything else non-slashy,
857
+ // then it must NOT get a trailing slash.
858
+ var last = srcPath.slice(-1)[0];
859
+ var hasTrailingSlash = (result.host || relative.host || srcPath.length > 1) && (last === '.' || last === '..') || last === '';
860
+
861
+ // strip single dots, resolve double dots to parent dir
862
+ // if the path tries to go above the root, `up` ends up > 0
863
+ var up = 0;
864
+ for (var i = srcPath.length; i >= 0; i--) {
865
+ last = srcPath[i];
866
+ if (last === '.') {
867
+ spliceOne(srcPath, i);
868
+ } else if (last === '..') {
869
+ spliceOne(srcPath, i);
870
+ up++;
871
+ } else if (up) {
872
+ spliceOne(srcPath, i);
873
+ up--;
874
+ }
875
+ }
876
+
877
+ // if the path is allowed to go above the root, restore leading ..s
878
+ if (!mustEndAbs && !removeAllDots) {
879
+ for (; up--; up) {
880
+ srcPath.unshift('..');
881
+ }
882
+ }
883
+ if (mustEndAbs && srcPath[0] !== '' && (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
884
+ srcPath.unshift('');
885
+ }
886
+ if (hasTrailingSlash && srcPath.join('/').substr(-1) !== '/') {
887
+ srcPath.push('');
888
+ }
889
+ var isAbsolute = srcPath[0] === '' || srcPath[0] && srcPath[0].charAt(0) === '/';
890
+
891
+ // put the host back
892
+ if (psychotic) {
893
+ if (isAbsolute) {
894
+ result.hostname = result.host = '';
895
+ } else {
896
+ result.hostname = result.host = srcPath.length ? srcPath.shift() : '';
897
+ }
898
+ //occasionally the auth can get stuck only in host
899
+ //this especially happens in cases like
900
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
901
+ const authInHost = result.host && result.host.indexOf('@') > 0 ? result.host.split('@') : false;
902
+ if (authInHost) {
903
+ result.auth = authInHost.shift();
904
+ result.host = result.hostname = authInHost.shift();
905
+ }
906
+ }
907
+ mustEndAbs = mustEndAbs || result.host && srcPath.length;
908
+ if (mustEndAbs && !isAbsolute) {
909
+ srcPath.unshift('');
910
+ }
911
+ if (!srcPath.length) {
912
+ result.pathname = null;
913
+ result.path = null;
914
+ } else {
915
+ result.pathname = srcPath.join('/');
916
+ }
917
+
918
+ //to support request.http
919
+ if (result.pathname !== null || result.search !== null) {
920
+ result.path = (result.pathname ? result.pathname : '') + (result.search ? result.search : '');
921
+ }
922
+ result.auth = relative.auth || result.auth;
923
+ result.slashes = result.slashes || relative.slashes;
924
+ result.href = result.format();
925
+ return result;
926
+ };
927
+
928
+ /* istanbul ignore next: improve coverage */
929
+ Url.prototype.parseHost = function () {
930
+ var host = this.host;
931
+ var port = portPattern.exec(host);
932
+ if (port) {
933
+ port = port[0];
934
+ if (port !== ':') {
935
+ this.port = port.slice(1);
936
+ }
937
+ host = host.slice(0, host.length - port.length);
938
+ }
939
+ if (host) {
940
+ this.hostname = host;
941
+ }
942
+ };
943
+
944
+ // About 1.5x faster than the two-arg version of Array#splice().
945
+ /* istanbul ignore next: improve coverage */
946
+ function spliceOne(list, index) {
947
+ for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {
948
+ list[i] = list[k];
949
+ }
950
+ list.pop();
951
+ }
952
+ var hexTable = new Array(256);
953
+ for (var i = 0; i < 256; ++i) {
954
+ hexTable[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
955
+ }
956
+ /* istanbul ignore next: improve coverage */
957
+ function encodeAuth(str) {
958
+ // faster encodeURIComponent alternative for encoding auth uri components
959
+ var out = '';
960
+ var lastPos = 0;
961
+ for (var i = 0; i < str.length; ++i) {
962
+ var c = str.charCodeAt(i);
963
+
964
+ // These characters do not need escaping:
965
+ // ! - . _ ~
966
+ // ' ( ) * :
967
+ // digits
968
+ // alpha (uppercase)
969
+ // alpha (lowercase)
970
+ if (c === 0x21 || c === 0x2d || c === 0x2e || c === 0x5f || c === 0x7e || c >= 0x27 && c <= 0x2a || c >= 0x30 && c <= 0x3a || c >= 0x41 && c <= 0x5a || c >= 0x61 && c <= 0x7a) {
971
+ continue;
972
+ }
973
+ if (i - lastPos > 0) {
974
+ out += str.slice(lastPos, i);
975
+ }
976
+ lastPos = i + 1;
977
+
978
+ // Other ASCII characters
979
+ if (c < 0x80) {
980
+ out += hexTable[c];
981
+ continue;
982
+ }
983
+
984
+ // Multi-byte characters ...
985
+ if (c < 0x800) {
986
+ out += hexTable[0xc0 | c >> 6] + hexTable[0x80 | c & 0x3f];
987
+ continue;
988
+ }
989
+ if (c < 0xd800 || c >= 0xe000) {
990
+ out += hexTable[0xe0 | c >> 12] + hexTable[0x80 | c >> 6 & 0x3f] + hexTable[0x80 | c & 0x3f];
991
+ continue;
992
+ }
993
+ // Surrogate pair
994
+ ++i;
995
+ var c2;
996
+ if (i < str.length) {
997
+ c2 = str.charCodeAt(i) & 0x3ff;
998
+ } else {
999
+ c2 = 0;
1000
+ }
1001
+ c = 0x10000 + ((c & 0x3ff) << 10 | c2);
1002
+ out += hexTable[0xf0 | c >> 18] + hexTable[0x80 | c >> 12 & 0x3f] + hexTable[0x80 | c >> 6 & 0x3f] + hexTable[0x80 | c & 0x3f];
1003
+ }
1004
+ if (lastPos === 0) {
1005
+ return str;
1006
+ }
1007
+ if (lastPos < str.length) {
1008
+ return out + str.slice(lastPos);
1009
+ }
1010
+ return out;
1011
+ }
1012
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHVueWNvZGUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImV4cG9ydHMiLCJwYXJzZSIsInVybFBhcnNlIiwicmVzb2x2ZSIsInVybFJlc29sdmUiLCJyZXNvbHZlT2JqZWN0IiwidXJsUmVzb2x2ZU9iamVjdCIsImZvcm1hdCIsInVybEZvcm1hdCIsIlVybCIsInByb3RvY29sIiwic2xhc2hlcyIsImF1dGgiLCJob3N0IiwicG9ydCIsImhvc3RuYW1lIiwiaGFzaCIsInNlYXJjaCIsInF1ZXJ5IiwicGF0aG5hbWUiLCJwYXRoIiwiaHJlZiIsInByb3RvY29sUGF0dGVybiIsInBvcnRQYXR0ZXJuIiwic2ltcGxlUGF0aFBhdHRlcm4iLCJ1bnNhZmVQcm90b2NvbCIsImphdmFzY3JpcHQiLCJob3N0bGVzc1Byb3RvY29sIiwic2xhc2hlZFByb3RvY29sIiwiaHR0cCIsImh0dHBzIiwiZnRwIiwiZ29waGVyIiwiZmlsZSIsInF1ZXJ5c3RyaW5nIiwidXJsIiwicGFyc2VRdWVyeVN0cmluZyIsInNsYXNoZXNEZW5vdGVIb3N0IiwidSIsInByb3RvdHlwZSIsIlR5cGVFcnJvciIsImhhc0hhc2giLCJzdGFydCIsImVuZCIsInJlc3QiLCJsYXN0UG9zIiwiaSIsImluV3MiLCJzcGxpdCIsImxlbmd0aCIsImNvZGUiLCJjaGFyQ29kZUF0IiwiaXNXcyIsInNsaWNlIiwic2ltcGxlUGF0aCIsImV4ZWMiLCJwcm90byIsImxvd2VyUHJvdG8iLCJ0b0xvd2VyQ2FzZSIsInRlc3QiLCJob3N0RW5kIiwiYXRTaWduIiwibm9uSG9zdCIsImRlY29kZVVSSUNvbXBvbmVudCIsInBhcnNlSG9zdCIsImlwdjZIb3N0bmFtZSIsInJlc3VsdCIsInZhbGlkYXRlSG9zdG5hbWUiLCJ1bmRlZmluZWQiLCJwdW55Y29kZSIsInRvQVNDSUkiLCJwIiwiaCIsImF1dG9Fc2NhcGVTdHIiLCJxdWVzdGlvbklkeCIsImhhc2hJZHgiLCJmaXJzdElkeCIsInMiLCJzZWxmIiwibmV3UmVzdCIsIm9iaiIsImNhbGwiLCJlbmNvZGVBdXRoIiwiaW5kZXhPZiIsInN0cmluZ2lmeSIsIm5ld1BhdGhuYW1lIiwicmVwbGFjZSIsInNvdXJjZSIsInJlbGF0aXZlIiwicmVsIiwidGtleXMiLCJPYmplY3QiLCJrZXlzIiwidGsiLCJ0a2V5IiwicmtleXMiLCJyayIsInJrZXkiLCJ2IiwiayIsInJlbFBhdGgiLCJzaGlmdGVkIiwic2hpZnQiLCJ1bnNoaWZ0Iiwiam9pbiIsImlzU291cmNlQWJzIiwiY2hhckF0IiwiaXNSZWxBYnMiLCJtdXN0RW5kQWJzIiwicmVtb3ZlQWxsRG90cyIsInNyY1BhdGgiLCJwc3ljaG90aWMiLCJwb3AiLCJjb25jYXQiLCJhdXRoSW5Ib3N0IiwibGFzdCIsImhhc1RyYWlsaW5nU2xhc2giLCJ1cCIsInNwbGljZU9uZSIsInN1YnN0ciIsInB1c2giLCJpc0Fic29sdXRlIiwibGlzdCIsImluZGV4IiwibiIsImhleFRhYmxlIiwiQXJyYXkiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwic3RyIiwib3V0IiwiYyIsImMyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZlbmRvci9tb25nb2RiVXJsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBBIHNsaWdodGx5IHBhdGNoZWQgdmVyc2lvbiBvZiBub2RlJ3MgVVJMIG1vZHVsZSwgd2l0aCBzdXBwb3J0IGZvciBgbW9uZ29kYjovL2AgVVJJcy5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUgZm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbi5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCBwdW55Y29kZSBmcm9tICdwdW55Y29kZS9wdW55Y29kZS5qcyc7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG5jb25zdCBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pO1xuY29uc3QgcG9ydFBhdHRlcm4gPSAvOlswLTldKiQvO1xuXG4vLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG5jb25zdCBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW15cXD9cXHNdKikoXFw/W15cXHNdKik/JC87XG5cbi8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuY29uc3QgdW5zYWZlUHJvdG9jb2wgPSB7XG4gIGphdmFzY3JpcHQ6IHRydWUsXG4gICdqYXZhc2NyaXB0Oic6IHRydWUsXG59O1xuLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuY29uc3QgaG9zdGxlc3NQcm90b2NvbCA9IHtcbiAgamF2YXNjcmlwdDogdHJ1ZSxcbiAgJ2phdmFzY3JpcHQ6JzogdHJ1ZSxcbn07XG4vLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbmNvbnN0IHNsYXNoZWRQcm90b2NvbCA9IHtcbiAgaHR0cDogdHJ1ZSxcbiAgJ2h0dHA6JzogdHJ1ZSxcbiAgaHR0cHM6IHRydWUsXG4gICdodHRwczonOiB0cnVlLFxuICBmdHA6IHRydWUsXG4gICdmdHA6JzogdHJ1ZSxcbiAgZ29waGVyOiB0cnVlLFxuICAnZ29waGVyOic6IHRydWUsXG4gIGZpbGU6IHRydWUsXG4gICdmaWxlOic6IHRydWUsXG59O1xuY29uc3QgcXVlcnlzdHJpbmcgPSByZXF1aXJlKCdxdWVyeXN0cmluZycpO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuZnVuY3Rpb24gdXJsUGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsIGluc3RhbmNlb2YgVXJsKSB7IHJldHVybiB1cmw7IH1cblxuICB2YXIgdSA9IG5ldyBVcmwoKTtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5VcmwucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHR5cGVvZiB1cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGFyYW1ldGVyIFwidXJsXCIgbXVzdCBiZSBhIHN0cmluZywgbm90ICcgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIGhhc0hhc2ggPSBmYWxzZTtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIHJlc3QgPSAnJztcbiAgdmFyIGxhc3RQb3MgPSAwO1xuICB2YXIgaSA9IDA7XG4gIGZvciAodmFyIGluV3MgPSBmYWxzZSwgc3BsaXQgPSBmYWxzZTsgaSA8IHVybC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGNvZGUgPSB1cmwuY2hhckNvZGVBdChpKTtcblxuICAgIC8vIEZpbmQgZmlyc3QgYW5kIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBmb3IgdHJpbW1pbmdcbiAgICBjb25zdCBpc1dzID1cbiAgICAgIGNvZGUgPT09IDMyIC8qICovIHx8XG4gICAgICBjb2RlID09PSA5IC8qXFx0Ki8gfHxcbiAgICAgIGNvZGUgPT09IDEzIC8qXFxyKi8gfHxcbiAgICAgIGNvZGUgPT09IDEwIC8qXFxuKi8gfHxcbiAgICAgIGNvZGUgPT09IDEyIC8qXFxmKi8gfHxcbiAgICAgIGNvZGUgPT09IDE2MCAvKlxcdTAwQTAqLyB8fFxuICAgICAgY29kZSA9PT0gNjUyNzk7IC8qXFx1RkVGRiovXG4gICAgaWYgKHN0YXJ0ID09PSAtMSkge1xuICAgICAgaWYgKGlzV3MpIHsgY29udGludWU7IH1cbiAgICAgIGxhc3RQb3MgPSBzdGFydCA9IGk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbldzKSB7XG4gICAgICAgIGlmICghaXNXcykge1xuICAgICAgICAgIGVuZCA9IC0xO1xuICAgICAgICAgIGluV3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc1dzKSB7XG4gICAgICAgIGVuZCA9IGk7XG4gICAgICAgIGluV3MgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9ubHkgY29udmVydCBiYWNrc2xhc2hlcyB3aGlsZSB3ZSBoYXZlbid0IHNlZW4gYSBzcGxpdCBjaGFyYWN0ZXJcbiAgICBpZiAoIXNwbGl0KSB7XG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSAzNTogLy8gJyMnXG4gICAgICAgICAgaGFzSGFzaCA9IHRydWU7XG4gICAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgICAgICBjYXNlIDYzOiAvLyAnPydcbiAgICAgICAgICBzcGxpdCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTI6IC8vICdcXFxcJ1xuICAgICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgcmVzdCArPSB1cmwuc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgICByZXN0ICs9ICcvJztcbiAgICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghaGFzSGFzaCAmJiBjb2RlID09PSAzNSAvKiMqLykge1xuICAgICAgaGFzSGFzaCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgc3RyaW5nIHdhcyBub24tZW1wdHkgKGluY2x1ZGluZyBzdHJpbmdzIHdpdGggb25seSB3aGl0ZXNwYWNlKVxuICBpZiAoc3RhcnQgIT09IC0xKSB7XG4gICAgaWYgKGxhc3RQb3MgPT09IHN0YXJ0KSB7XG4gICAgICAvLyBXZSBkaWRuJ3QgY29udmVydCBhbnkgYmFja3NsYXNoZXNcblxuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSAwKSB7IHJlc3QgPSB1cmw7IH1cbiAgICAgICAgZWxzZSB7IHJlc3QgPSB1cmwuc2xpY2Uoc3RhcnQpOyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0ID0gdXJsLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kID09PSAtMSAmJiBsYXN0UG9zIDwgdXJsLmxlbmd0aCkge1xuICAgICAgLy8gV2UgY29udmVydGVkIHNvbWUgYmFja3NsYXNoZXMgYW5kIGhhdmUgb25seSBwYXJ0IG9mIHRoZSBlbnRpcmUgc3RyaW5nXG4gICAgICByZXN0ICs9IHVybC5zbGljZShsYXN0UG9zKTtcbiAgICB9IGVsc2UgaWYgKGVuZCAhPT0gLTEgJiYgbGFzdFBvcyA8IGVuZCkge1xuICAgICAgLy8gV2UgY29udmVydGVkIHNvbWUgYmFja3NsYXNoZXMgYW5kIGhhdmUgb25seSBwYXJ0IG9mIHRoZSBlbnRpcmUgc3RyaW5nXG4gICAgICByZXN0ICs9IHVybC5zbGljZShsYXN0UG9zLCBlbmQpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgIWhhc0hhc2gpIHtcbiAgICAvLyBUcnkgZmFzdCBwYXRoIHJlZ2V4cFxuICAgIGNvbnN0IHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zbGljZSgxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VhcmNoLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICAgICAgdGhpcy5xdWVyeSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gcHJvdG9jb2xQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gIGlmIChwcm90bykge1xuICAgIHByb3RvID0gcHJvdG9bMF07XG4gICAgdmFyIGxvd2VyUHJvdG8gPSBwcm90by50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMucHJvdG9jb2wgPSBsb3dlclByb3RvO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCAvXlxcL1xcL1teQFxcL10rQFteQFxcL10rLy50ZXN0KHJlc3QpKSB7XG4gICAgdmFyIHNsYXNoZXMgPSByZXN0LmNoYXJDb2RlQXQoMCkgPT09IDQ3IC8qLyovICYmIHJlc3QuY2hhckNvZGVBdCgxKSA9PT0gNDc7IC8qLyovXG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnNsaWNlKDIpO1xuICAgICAgdGhpcy5zbGFzaGVzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dICYmIChzbGFzaGVzIHx8IChwcm90byAmJiAhc2xhc2hlZFByb3RvY29sW3Byb3RvXSkpKSB7XG4gICAgLy8gdGhlcmUncyBhIGhvc3RuYW1lLlxuICAgIC8vIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAvLCA/LCA7LCBvciAjIGVuZHMgdGhlIGhvc3QuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBAIGluIHRoZSBob3N0bmFtZSwgdGhlbiBub24taG9zdCBjaGFycyAqYXJlKiBhbGxvd2VkXG4gICAgLy8gdG8gdGhlIGxlZnQgb2YgdGhlIGxhc3QgQCBzaWduLCB1bmxlc3Mgc29tZSBob3N0LWVuZGluZyBjaGFyYWN0ZXJcbiAgICAvLyBjb21lcyAqYmVmb3JlKiB0aGUgQC1zaWduLlxuICAgIC8vIFVSTHMgYXJlIG9ibm94aW91cy5cbiAgICAvL1xuICAgIC8vIGV4OlxuICAgIC8vIGh0dHA6Ly9hQGJAYy8gPT4gdXNlcjphQGIgaG9zdDpjXG4gICAgLy8gaHR0cDovL2FAYj9AYyA9PiB1c2VyOmEgaG9zdDpiIHBhdGg6Lz9AY1xuXG4gICAgLy8gdjAuMTIgVE9ETyhpc2FhY3MpOiBUaGlzIGlzIG5vdCBxdWl0ZSBob3cgQ2hyb21lIGRvZXMgdGhpbmdzLlxuICAgIC8vIFJldmlldyBvdXIgdGVzdCBjYXNlIGFnYWluc3QgYnJvd3NlcnMgbW9yZSBjb21wcmVoZW5zaXZlbHkuXG5cbiAgICB2YXIgaG9zdEVuZCA9IC0xO1xuICAgIHZhciBhdFNpZ24gPSAtMTtcbiAgICB2YXIgbm9uSG9zdCA9IC0xO1xuICAgIGZvciAoaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBzd2l0Y2ggKHJlc3QuY2hhckNvZGVBdChpKSkge1xuICAgICAgICBjYXNlIDk6IC8vICdcXHQnXG4gICAgICAgIGNhc2UgMTA6IC8vICdcXG4nXG4gICAgICAgIGNhc2UgMTM6IC8vICdcXHInXG4gICAgICAgIGNhc2UgMzI6IC8vICcgJ1xuICAgICAgICBjYXNlIDM0OiAvLyAnXCInXG4gICAgICAgIGNhc2UgMzc6IC8vICclJ1xuICAgICAgICBjYXNlIDM5OiAvLyAnXFwnJ1xuICAgICAgICBjYXNlIDU5OiAvLyAnOydcbiAgICAgICAgY2FzZSA2MDogLy8gJzwnXG4gICAgICAgIGNhc2UgNjI6IC8vICc+J1xuICAgICAgICBjYXNlIDkyOiAvLyAnXFxcXCdcbiAgICAgICAgY2FzZSA5NDogLy8gJ14nXG4gICAgICAgIGNhc2UgOTY6IC8vICdgJ1xuICAgICAgICBjYXNlIDEyMzogLy8gJ3snXG4gICAgICAgIGNhc2UgMTI0OiAvLyAnfCdcbiAgICAgICAgY2FzZSAxMjU6IC8vICd9J1xuICAgICAgICAgIC8vIENoYXJhY3RlcnMgdGhhdCBhcmUgbmV2ZXIgZXZlciBhbGxvd2VkIGluIGEgaG9zdG5hbWUgZnJvbSBSRkMgMjM5NlxuICAgICAgICAgIGlmIChub25Ib3N0ID09PSAtMSkgeyBub25Ib3N0ID0gaTsgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM1OiAvLyAnIydcbiAgICAgICAgY2FzZSA0NzogLy8gJy8nXG4gICAgICAgIGNhc2UgNjM6IC8vICc/J1xuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGluc3RhbmNlIG9mIGFueSBob3N0LWVuZGluZyBjaGFyYWN0ZXJzXG4gICAgICAgICAgaWYgKG5vbkhvc3QgPT09IC0xKSB7IG5vbkhvc3QgPSBpOyB9XG4gICAgICAgICAgaG9zdEVuZCA9IGk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjQ6IC8vICdAJ1xuICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIGVpdGhlciB3ZSBoYXZlIGFuIGV4cGxpY2l0IHBvaW50IHdoZXJlIHRoZVxuICAgICAgICAgIC8vIGF1dGggcG9ydGlvbiBjYW5ub3QgZ28gcGFzdCwgb3IgdGhlIGxhc3QgQCBjaGFyIGlzIHRoZSBkZWNpZGVyLlxuICAgICAgICAgIGF0U2lnbiA9IGk7XG4gICAgICAgICAgbm9uSG9zdCA9IC0xO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhvc3RFbmQgIT09IC0xKSB7IGJyZWFrOyB9XG4gICAgfVxuICAgIHN0YXJ0ID0gMDtcbiAgICBpZiAoYXRTaWduICE9PSAtMSkge1xuICAgICAgdGhpcy5hdXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3Quc2xpY2UoMCwgYXRTaWduKSk7XG4gICAgICBzdGFydCA9IGF0U2lnbiArIDE7XG4gICAgfVxuICAgIGlmIChub25Ib3N0ID09PSAtMSkge1xuICAgICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZShzdGFydCk7XG4gICAgICByZXN0ID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaG9zdCA9IHJlc3Quc2xpY2Uoc3RhcnQsIG5vbkhvc3QpO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2Uobm9uSG9zdCk7XG4gICAgfVxuXG4gICAgLy8gcHVsbCBvdXQgcG9ydC5cbiAgICB0aGlzLnBhcnNlSG9zdCgpO1xuXG4gICAgLy8gd2UndmUgaW5kaWNhdGVkIHRoYXQgdGhlcmUgaXMgYSBob3N0bmFtZSxcbiAgICAvLyBzbyBldmVuIGlmIGl0J3MgZW1wdHksIGl0IGhhcyB0byBiZSBwcmVzZW50LlxuICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0bmFtZSAhPT0gJ3N0cmluZycpIHsgdGhpcy5ob3N0bmFtZSA9ICcnOyB9XG5cbiAgICB2YXIgaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lO1xuXG4gICAgLy8gaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAvLyBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICB2YXIgaXB2Nkhvc3RuYW1lID1cbiAgICAgIGhvc3RuYW1lLmNoYXJDb2RlQXQoMCkgPT09IDkxIC8qWyovICYmIGhvc3RuYW1lLmNoYXJDb2RlQXQoaG9zdG5hbWUubGVuZ3RoIC0gMSkgPT09IDkzOyAvKl0qL1xuXG4gICAgLy8gdmFsaWRhdGUgYSBsaXR0bGUuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlSG9zdG5hbWUodGhpcywgcmVzdCwgaG9zdG5hbWUpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7IHJlc3QgPSByZXN1bHQ7IH1cbiAgICB9XG5cbiAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG5cbiAgICAvLyBzdHJpcCBbIGFuZCBdIGZyb20gdGhlIGhvc3RuYW1lXG4gICAgLy8gdGhlIGhvc3QgZmllbGQgc3RpbGwgcmV0YWlucyB0aGVtLCB0aG91Z2hcbiAgICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS5zbGljZSgxLCAtMSk7XG4gICAgICBpZiAocmVzdFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3QgPSAnLycgKyByZXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vdyByZXN0IGlzIHNldCB0byB0aGUgcG9zdC1ob3N0IHN0dWZmLlxuICAvLyBjaG9wIG9mZiBhbnkgZGVsaW0gY2hhcnMuXG4gIGlmICghdW5zYWZlUHJvdG9jb2xbbG93ZXJQcm90b10pIHtcbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBjb25zdCByZXN1bHQgPSBhdXRvRXNjYXBlU3RyKHJlc3QpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkgeyByZXN0ID0gcmVzdWx0OyB9XG4gIH1cblxuICB2YXIgcXVlc3Rpb25JZHggPSAtMTtcbiAgdmFyIGhhc2hJZHggPSAtMTtcbiAgZm9yIChpID0gMDsgaSA8IHJlc3QubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb2RlID0gcmVzdC5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjb2RlID09PSAzNSAvKiMqLykge1xuICAgICAgdGhpcy5oYXNoID0gcmVzdC5zbGljZShpKTtcbiAgICAgIGhhc2hJZHggPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSA2MyAvKj8qLyAmJiBxdWVzdGlvbklkeCA9PT0gLTEpIHtcbiAgICAgIHF1ZXN0aW9uSWR4ID0gaTtcbiAgICB9XG4gIH1cblxuICBpZiAocXVlc3Rpb25JZHggIT09IC0xKSB7XG4gICAgaWYgKGhhc2hJZHggPT09IC0xKSB7XG4gICAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc2xpY2UocXVlc3Rpb25JZHgpO1xuICAgICAgdGhpcy5xdWVyeSA9IHJlc3Quc2xpY2UocXVlc3Rpb25JZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWFyY2ggPSByZXN0LnNsaWNlKHF1ZXN0aW9uSWR4LCBoYXNoSWR4KTtcbiAgICAgIHRoaXMucXVlcnkgPSByZXN0LnNsaWNlKHF1ZXN0aW9uSWR4ICsgMSwgaGFzaElkeCk7XG4gICAgfVxuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5xdWVyeSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHBhcnNlUXVlcnlTdHJpbmcpIHtcbiAgICAvLyBubyBxdWVyeSBzdHJpbmcsIGJ1dCBwYXJzZVF1ZXJ5U3RyaW5nIHN0aWxsIHJlcXVlc3RlZFxuICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgdGhpcy5xdWVyeSA9IHt9O1xuICB9XG5cbiAgdmFyIGZpcnN0SWR4ID1cbiAgICBxdWVzdGlvbklkeCAhPT0gLTEgJiYgKGhhc2hJZHggPT09IC0xIHx8IHF1ZXN0aW9uSWR4IDwgaGFzaElkeCkgPyBxdWVzdGlvbklkeCA6IGhhc2hJZHg7XG4gIGlmIChmaXJzdElkeCA9PT0gLTEpIHtcbiAgICBpZiAocmVzdC5sZW5ndGggPiAwKSB7IHRoaXMucGF0aG5hbWUgPSByZXN0OyB9XG4gIH0gZWxzZSBpZiAoZmlyc3RJZHggPiAwKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9IHJlc3Quc2xpY2UoMCwgZmlyc3RJZHgpO1xuICB9XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiYgdGhpcy5ob3N0bmFtZSAmJiAhdGhpcy5wYXRobmFtZSkge1xuICAgIHRoaXMucGF0aG5hbWUgPSAnLyc7XG4gIH1cblxuICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICBpZiAodGhpcy5wYXRobmFtZSB8fCB0aGlzLnNlYXJjaCkge1xuICAgIGNvbnN0IHAgPSB0aGlzLnBhdGhuYW1lIHx8ICcnO1xuICAgIGNvbnN0IHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiB2YWxpZGF0ZUhvc3RuYW1lKHNlbGYsIHJlc3QsIGhvc3RuYW1lKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsYXN0UG9zOyBpIDw9IGhvc3RuYW1lLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGNvZGU7XG4gICAgaWYgKGkgPCBob3N0bmFtZS5sZW5ndGgpIHsgY29kZSA9IGhvc3RuYW1lLmNoYXJDb2RlQXQoaSk7IH1cbiAgICBpZiAoY29kZSA9PT0gNDYgLyouKi8gfHwgaSA9PT0gaG9zdG5hbWUubGVuZ3RoKSB7XG4gICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7XG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDYzKSB7XG4gICAgICAgICAgc2VsZi5ob3N0bmFtZSA9IGhvc3RuYW1lLnNsaWNlKDAsIGxhc3RQb3MgKyA2Myk7XG4gICAgICAgICAgcmV0dXJuICcvJyArIGhvc3RuYW1lLnNsaWNlKGxhc3RQb3MgKyA2MykgKyByZXN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKGNvZGUgPj0gNDggLyowKi8gJiYgY29kZSA8PSA1NykgLyo5Ki8gfHxcbiAgICAgIChjb2RlID49IDk3IC8qYSovICYmIGNvZGUgPD0gMTIyKSAvKnoqLyB8fFxuICAgICAgY29kZSA9PT0gNDUgLyotKi8gfHxcbiAgICAgIChjb2RlID49IDY1IC8qQSovICYmIGNvZGUgPD0gOTApIC8qWiovIHx8XG4gICAgICBjb2RlID09PSA0MyAvKisqLyB8fFxuICAgICAgY29kZSA9PT0gOTUgLypfKi8gfHxcbiAgICAgIC8qIEJFR0lOIE1PTkdPIFVSSSBQQVRDSCAqL1xuICAgICAgY29kZSA9PT0gNDQgLyosKi8gfHxcbiAgICAgIGNvZGUgPT09IDU4IC8qOiovIHx8XG4gICAgICAvKiBFTkQgTU9OR08gVVJJIFBBVENIICovXG4gICAgICBjb2RlID4gMTI3XG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gSW52YWxpZCBob3N0IGNoYXJhY3RlclxuICAgIHNlbGYuaG9zdG5hbWUgPSBob3N0bmFtZS5zbGljZSgwLCBpKTtcbiAgICBpZiAoaSA8IGhvc3RuYW1lLmxlbmd0aCkgeyByZXR1cm4gJy8nICsgaG9zdG5hbWUuc2xpY2UoaSkgKyByZXN0OyB9XG4gICAgYnJlYWs7XG4gIH1cbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cbmZ1bmN0aW9uIGF1dG9Fc2NhcGVTdHIocmVzdCkge1xuICB2YXIgbmV3UmVzdCA9ICcnO1xuICB2YXIgbGFzdFBvcyA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdC5sZW5ndGg7ICsraSkge1xuICAgIC8vIEF1dG9tYXRpY2FsbHkgZXNjYXBlIGFsbCBkZWxpbWl0ZXJzIGFuZCB1bndpc2UgY2hhcmFjdGVycyBmcm9tIFJGQyAyMzk2XG4gICAgLy8gQWxzbyBlc2NhcGUgc2luZ2xlIHF1b3RlcyBpbiBjYXNlIG9mIGFuIFhTUyBhdHRhY2tcbiAgICBzd2l0Y2ggKHJlc3QuY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSA5OiAvLyAnXFx0J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclMDknO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDogLy8gJ1xcbidcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTBBJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTM6IC8vICdcXHInXG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpOyB9XG4gICAgICAgIG5ld1Jlc3QgKz0gJyUwRCc7XG4gICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDMyOiAvLyAnICdcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTIwJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzQ6IC8vICdcIidcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTIyJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzk6IC8vICdcXCcnXG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpOyB9XG4gICAgICAgIG5ld1Jlc3QgKz0gJyUyNyc7XG4gICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYwOiAvLyAnPCdcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTNDJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6IC8vICc+J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclM0UnO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA5MjogLy8gJ1xcXFwnXG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgbmV3UmVzdCArPSByZXN0LnNsaWNlKGxhc3RQb3MsIGkpOyB9XG4gICAgICAgIG5ld1Jlc3QgKz0gJyU1Qyc7XG4gICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDk0OiAvLyAnXidcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdSZXN0ICs9IHJlc3Quc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UmVzdCArPSAnJTVFJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgOTY6IC8vICdgJ1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclNjAnO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjM6IC8vICd7J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclN0InO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjQ6IC8vICd8J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclN0MnO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjU6IC8vICd9J1xuICAgICAgICBpZiAoaSAtIGxhc3RQb3MgPiAwKSB7IG5ld1Jlc3QgKz0gcmVzdC5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdSZXN0ICs9ICclN0QnO1xuICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdFBvcyA9PT0gMCkgeyByZXR1cm47IH1cbiAgaWYgKGxhc3RQb3MgPCByZXN0Lmxlbmd0aCkgeyByZXR1cm4gbmV3UmVzdCArIHJlc3Quc2xpY2UobGFzdFBvcyk7IH1cbiAgZWxzZSB7IHJldHVybiBuZXdSZXN0OyB9XG59XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiB1cmxGb3JtYXQob2JqKSB7XG4gIC8vIGVuc3VyZSBpdCdzIGFuIG9iamVjdCwgYW5kIG5vdCBhIHN0cmluZyB1cmwuXG4gIC8vIElmIGl0J3MgYW4gb2JqLCB0aGlzIGlzIGEgbm8tb3AuXG4gIC8vIHRoaXMgd2F5LCB5b3UgY2FuIGNhbGwgdXJsX2Zvcm1hdCgpIG9uIHN0cmluZ3NcbiAgLy8gdG8gY2xlYW4gdXAgcG90ZW50aWFsbHkgd29ua3kgdXJscy5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7IG9iaiA9IHVybFBhcnNlKG9iaik7IH1cbiAgZWxzZSBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKVxuICB7IHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ1BhcmFtZXRlciBcInVybE9ialwiIG11c3QgYmUgYW4gb2JqZWN0LCBub3QgJyArIChvYmogPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygb2JqKVxuICApOyB9XG4gIGVsc2UgaWYgKCEob2JqIGluc3RhbmNlb2YgVXJsKSkgeyByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopOyB9XG5cbiAgcmV0dXJuIG9iai5mb3JtYXQoKTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cblVybC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlQXV0aChhdXRoKTtcbiAgICBhdXRoICs9ICdAJztcbiAgfVxuXG4gIHZhciBwcm90b2NvbCA9IHRoaXMucHJvdG9jb2wgfHwgJyc7XG4gIHZhciBwYXRobmFtZSA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gIHZhciBoYXNoID0gdGhpcy5oYXNoIHx8ICcnO1xuICB2YXIgaG9zdCA9IGZhbHNlO1xuICB2YXIgcXVlcnkgPSAnJztcblxuICBpZiAodGhpcy5ob3N0KSB7XG4gICAgaG9zdCA9IGF1dGggKyB0aGlzLmhvc3Q7XG4gIH0gZWxzZSBpZiAodGhpcy5ob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKHRoaXMuaG9zdG5hbWUuaW5kZXhPZignOicpID09PSAtMSA/IHRoaXMuaG9zdG5hbWUgOiAnWycgKyB0aGlzLmhvc3RuYW1lICsgJ10nKTtcbiAgICBpZiAodGhpcy5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHRoaXMucG9ydDtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5xdWVyeSA9PT0gJ29iamVjdCcpXG4gIHsgcXVlcnkgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkodGhpcy5xdWVyeSk7IH1cblxuICB2YXIgc2VhcmNoID0gdGhpcy5zZWFyY2ggfHwgKHF1ZXJ5ICYmICc/JyArIHF1ZXJ5KSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuY2hhckNvZGVBdChwcm90b2NvbC5sZW5ndGggLSAxKSAhPT0gNTggLyo6Ki8pIHsgcHJvdG9jb2wgKz0gJzonOyB9XG5cbiAgdmFyIG5ld1BhdGhuYW1lID0gJyc7XG4gIHZhciBsYXN0UG9zID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXRobmFtZS5sZW5ndGg7ICsraSkge1xuICAgIHN3aXRjaCAocGF0aG5hbWUuY2hhckNvZGVBdChpKSkge1xuICAgICAgY2FzZSAzNTogLy8gJyMnXG4gICAgICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgbmV3UGF0aG5hbWUgKz0gcGF0aG5hbWUuc2xpY2UobGFzdFBvcywgaSk7IH1cbiAgICAgICAgbmV3UGF0aG5hbWUgKz0gJyUyMyc7XG4gICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYzOiAvLyAnPydcbiAgICAgICAgaWYgKGkgLSBsYXN0UG9zID4gMCkgeyBuZXdQYXRobmFtZSArPSBwYXRobmFtZS5zbGljZShsYXN0UG9zLCBpKTsgfVxuICAgICAgICBuZXdQYXRobmFtZSArPSAnJTNGJztcbiAgICAgICAgbGFzdFBvcyA9IGkgKyAxO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGxhc3RQb3MgPiAwKSB7XG4gICAgaWYgKGxhc3RQb3MgIT09IHBhdGhuYW1lLmxlbmd0aCkgeyBwYXRobmFtZSA9IG5ld1BhdGhuYW1lICsgcGF0aG5hbWUuc2xpY2UobGFzdFBvcyk7IH1cbiAgICBlbHNlIHsgcGF0aG5hbWUgPSBuZXdQYXRobmFtZTsgfVxuICB9XG5cbiAgLy8gb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gIC8vIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gIGlmICh0aGlzLnNsYXNoZXMgfHwgKCghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJDb2RlQXQoMCkgIT09IDQ3IC8qLyovKSB7IHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWU7IH1cbiAgfSBlbHNlIGlmICghaG9zdCkge1xuICAgIGhvc3QgPSAnJztcbiAgfVxuXG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIGlmIChoYXNoICYmIGhhc2guY2hhckNvZGVBdCgwKSAhPT0gMzUgLyojKi8pIHsgaGFzaCA9ICcjJyArIGhhc2g7IH1cbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2guY2hhckNvZGVBdCgwKSAhPT0gNjMgLyo/Ki8pIHsgc2VhcmNoID0gJz8nICsgc2VhcmNoOyB9XG5cbiAgcmV0dXJuIHByb3RvY29sICsgaG9zdCArIHBhdGhuYW1lICsgc2VhcmNoICsgaGFzaDtcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKHJlbGF0aXZlKSB7XG4gIHJldHVybiB0aGlzLnJlc29sdmVPYmplY3QodXJsUGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKSkuZm9ybWF0KCk7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaW1wcm92ZSBjb3ZlcmFnZSAqL1xuZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIGlmICghc291cmNlKSB7IHJldHVybiByZWxhdGl2ZTsgfVxuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5VcmwucHJvdG90eXBlLnJlc29sdmVPYmplY3QgPSBmdW5jdGlvbiAocmVsYXRpdmUpIHtcbiAgaWYgKHR5cGVvZiByZWxhdGl2ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgcmVsID0gbmV3IFVybCgpO1xuICAgIHJlbC5wYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpO1xuICAgIHJlbGF0aXZlID0gcmVsO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyBVcmwoKTtcbiAgdmFyIHRrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gIGZvciAodmFyIHRrID0gMDsgdGsgPCB0a2V5cy5sZW5ndGg7IHRrKyspIHtcbiAgICB2YXIgdGtleSA9IHRrZXlzW3RrXTtcbiAgICByZXN1bHRbdGtleV0gPSB0aGlzW3RrZXldO1xuICB9XG5cbiAgLy8gaGFzaCBpcyBhbHdheXMgb3ZlcnJpZGRlbiwgbm8gbWF0dGVyIHdoYXQuXG4gIC8vIGV2ZW4gaHJlZj1cIlwiIHdpbGwgcmVtb3ZlIGl0LlxuICByZXN1bHQuaGFzaCA9IHJlbGF0aXZlLmhhc2g7XG5cbiAgLy8gaWYgdGhlIHJlbGF0aXZlIHVybCBpcyBlbXB0eSwgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkbyBoZXJlLlxuICBpZiAocmVsYXRpdmUuaHJlZiA9PT0gJycpIHtcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaHJlZnMgbGlrZSAvL2Zvby9iYXIgYWx3YXlzIGN1dCB0byB0aGUgcHJvdG9jb2wuXG4gIGlmIChyZWxhdGl2ZS5zbGFzaGVzICYmICFyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgIC8vIHRha2UgZXZlcnl0aGluZyBleGNlcHQgdGhlIHByb3RvY29sIGZyb20gcmVsYXRpdmVcbiAgICB2YXIgcmtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgZm9yICh2YXIgcmsgPSAwOyByayA8IHJrZXlzLmxlbmd0aDsgcmsrKykge1xuICAgICAgdmFyIHJrZXkgPSBya2V5c1tya107XG4gICAgICBpZiAocmtleSAhPT0gJ3Byb3RvY29sJykgeyByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTsgfVxuICAgIH1cblxuICAgIC8vdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvLyBpZiBpdCdzIGEga25vd24gdXJsIHByb3RvY29sLCB0aGVuIGNoYW5naW5nXG4gICAgLy8gdGhlIHByb3RvY29sIGRvZXMgd2VpcmQgdGhpbmdzXG4gICAgLy8gZmlyc3QsIGlmIGl0J3Mgbm90IGZpbGU6LCB0aGVuIHdlIE1VU1QgaGF2ZSBhIGhvc3QsXG4gICAgLy8gYW5kIGlmIHRoZXJlIHdhcyBhIHBhdGhcbiAgICAvLyB0byBiZWdpbiB3aXRoLCB0aGVuIHdlIE1VU1QgaGF2ZSBhIHBhdGguXG4gICAgLy8gaWYgaXQgaXMgZmlsZTosIHRoZW4gdGhlIGhvc3QgaXMgZHJvcHBlZCxcbiAgICAvLyBiZWNhdXNlIHRoYXQncyBrbm93biB0byBiZSBob3N0bGVzcy5cbiAgICAvLyBhbnl0aGluZyBlbHNlIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuXG4gICAgaWYgKCFzbGFzaGVkUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgICAgICB2YXIgayA9IGtleXNbdl07XG4gICAgICAgIHJlc3VsdFtrXSA9IHJlbGF0aXZlW2tdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlc3VsdC5wcm90b2NvbCA9IHJlbGF0aXZlLnByb3RvY29sO1xuICAgIGlmIChcbiAgICAgICFyZWxhdGl2ZS5ob3N0ICYmXG4gICAgICAhL15maWxlOj8kLy50ZXN0KHJlbGF0aXZlLnByb3RvY29sKSAmJlxuICAgICAgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdXG4gICAgKSB7XG4gICAgICBjb25zdCByZWxQYXRoID0gKHJlbGF0aXZlLnBhdGhuYW1lIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgICAgd2hpbGUgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHNoaWZ0ZWQgPSByZWxQYXRoLnNoaWZ0KCk7XG4gICAgICAgIGlmIChzaGlmdGVkKSB7XG4gICAgICAgICAgcmVsYXRpdmUuaG9zdCA9IHNoaWZ0ZWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgeyByZWxhdGl2ZS5ob3N0ID0gJyc7IH1cbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdG5hbWUpIHsgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJzsgfVxuICAgICAgaWYgKHJlbFBhdGhbMF0gIT09ICcnKSB7IHJlbFBhdGgudW5zaGlmdCgnJyk7IH1cbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHsgcmVsUGF0aC51bnNoaWZ0KCcnKTsgfVxuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsUGF0aC5qb2luKCcvJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbGF0aXZlLnBhdGhuYW1lO1xuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCAnJztcbiAgICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGg7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdDtcbiAgICByZXN1bHQucG9ydCA9IHJlbGF0aXZlLnBvcnQ7XG4gICAgLy8gdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnBhdGhuYW1lIHx8IHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHZhciBwID0gcmVzdWx0LnBhdGhuYW1lIHx8ICcnO1xuICAgICAgdmFyIHMgPSByZXN1bHQuc2VhcmNoIHx8ICcnO1xuICAgICAgcmVzdWx0LnBhdGggPSBwICsgcztcbiAgICB9XG4gICAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB2YXIgaXNTb3VyY2VBYnMgPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB2YXIgaXNSZWxBYnMgPSByZWxhdGl2ZS5ob3N0IHx8IChyZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJyk7XG4gIHZhciBtdXN0RW5kQWJzID0gaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHwgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKTtcbiAgdmFyIHJlbW92ZUFsbERvdHMgPSBtdXN0RW5kQWJzO1xuICB2YXIgc3JjUGF0aCA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykpIHx8IFtdO1xuICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5zcGxpdCgnLycpKSB8fCBbXTtcbiAgdmFyIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHsgc3JjUGF0aFswXSA9IHJlc3VsdC5ob3N0OyB9XG4gICAgICBlbHNlIHsgc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTsgfVxuICAgIH1cbiAgICByZXN1bHQuaG9zdCA9ICcnO1xuICAgIGlmIChyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgPSBudWxsO1xuICAgICAgcmVsYXRpdmUucG9ydCA9IG51bGw7XG4gICAgICBpZiAocmVsYXRpdmUuaG9zdCkge1xuICAgICAgICBpZiAocmVsUGF0aFswXSA9PT0gJycpIHsgcmVsUGF0aFswXSA9IHJlbGF0aXZlLmhvc3Q7IH1cbiAgICAgICAgZWxzZSB7IHJlbFBhdGgudW5zaGlmdChyZWxhdGl2ZS5ob3N0KTsgfVxuICAgICAgfVxuICAgICAgcmVsYXRpdmUuaG9zdCA9IG51bGw7XG4gICAgfVxuICAgIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzICYmIChyZWxQYXRoWzBdID09PSAnJyB8fCBzcmNQYXRoWzBdID09PSAnJyk7XG4gIH1cblxuICBpZiAoaXNSZWxBYnMpIHtcbiAgICAvLyBpdCdzIGFic29sdXRlLlxuICAgIHJlc3VsdC5ob3N0ID0gcmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJyA/IHJlbGF0aXZlLmhvc3QgOiByZXN1bHQuaG9zdDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPVxuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgfHwgcmVsYXRpdmUuaG9zdG5hbWUgPT09ICcnID8gcmVsYXRpdmUuaG9zdG5hbWUgOiByZXN1bHQuaG9zdG5hbWU7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICBzcmNQYXRoID0gcmVsUGF0aDtcbiAgICAvLyBmYWxsIHRocm91Z2ggdG8gdGhlIGRvdC1oYW5kbGluZyBiZWxvdy5cbiAgfSBlbHNlIGlmIChyZWxQYXRoLmxlbmd0aCkge1xuICAgIC8vIGl0J3MgcmVsYXRpdmVcbiAgICAvLyB0aHJvdyBhd2F5IHRoZSBleGlzdGluZyBmaWxlLCBhbmQgdGFrZSB0aGUgbmV3IHBhdGggaW5zdGVhZC5cbiAgICBpZiAoIXNyY1BhdGgpIHsgc3JjUGF0aCA9IFtdOyB9XG4gICAgc3JjUGF0aC5wb3AoKTtcbiAgICBzcmNQYXRoID0gc3JjUGF0aC5jb25jYXQocmVsUGF0aCk7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgfSBlbHNlIGlmIChyZWxhdGl2ZS5zZWFyY2ggIT09IG51bGwgJiYgcmVsYXRpdmUuc2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBqdXN0IHB1bGwgb3V0IHRoZSBzZWFyY2guXG4gICAgLy8gbGlrZSBocmVmPSc/Zm9vJy5cbiAgICAvLyBQdXQgdGhpcyBhZnRlciB0aGUgb3RoZXIgdHdvIGNhc2VzIGJlY2F1c2UgaXQgc2ltcGxpZmllcyB0aGUgYm9vbGVhbnNcbiAgICBpZiAocHN5Y2hvdGljKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGguc2hpZnQoKTtcbiAgICAgIC8vb2NjYXNpb25hbGx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgICBjb25zdCBhdXRoSW5Ib3N0ID1cbiAgICAgICAgcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/IHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICAgIHJlc3VsdC5hdXRoID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSAhPT0gbnVsbCB8fCByZXN1bHQuc2VhcmNoICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgKyAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9XG4gICAgKChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiYgKGxhc3QgPT09ICcuJyB8fCBsYXN0ID09PSAnLi4nKSkgfHxcbiAgICBsYXN0ID09PSAnJztcblxuICAvLyBzdHJpcCBzaW5nbGUgZG90cywgcmVzb2x2ZSBkb3VibGUgZG90cyB0byBwYXJlbnQgZGlyXG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBzcmNQYXRoLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcbiAgICBsYXN0ID0gc3JjUGF0aFtpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBzcGxpY2VPbmUoc3JjUGF0aCwgaSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBzcGxpY2VPbmUoc3JjUGF0aCwgaSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNwbGljZU9uZShzcmNQYXRoLCBpKTtcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoIW11c3RFbmRBYnMgJiYgIXJlbW92ZUFsbERvdHMpIHtcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHNyY1BhdGgudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobXVzdEVuZEFicyAmJiBzcmNQYXRoWzBdICE9PSAnJyAmJiAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgc3JjUGF0aC5qb2luKCcvJykuc3Vic3RyKC0xKSAhPT0gJy8nKSB7XG4gICAgc3JjUGF0aC5wdXNoKCcnKTtcbiAgfVxuXG4gIHZhciBpc0Fic29sdXRlID0gc3JjUGF0aFswXSA9PT0gJycgfHwgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIGlmIChpc0Fic29sdXRlKSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuaG9zdG5hbWUgPSByZXN1bHQuaG9zdCA9IHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgfVxuICAgIC8vb2NjYXNpb25hbGx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICBjb25zdCBhdXRoSW5Ib3N0ID0gcmVzdWx0Lmhvc3QgJiYgcmVzdWx0Lmhvc3QuaW5kZXhPZignQCcpID4gMCA/IHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKHJlc3VsdC5wYXRobmFtZSAhPT0gbnVsbCB8fCByZXN1bHQuc2VhcmNoICE9PSBudWxsKSB7XG4gICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICsgKHJlc3VsdC5zZWFyY2ggPyByZXN1bHQuc2VhcmNoIDogJycpO1xuICB9XG4gIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aCB8fCByZXN1bHQuYXV0aDtcbiAgcmVzdWx0LnNsYXNoZXMgPSByZXN1bHQuc2xhc2hlcyB8fCByZWxhdGl2ZS5zbGFzaGVzO1xuICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5VcmwucHJvdG90eXBlLnBhcnNlSG9zdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnNsaWNlKDEpO1xuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zbGljZSgwLCBob3N0Lmxlbmd0aCAtIHBvcnQubGVuZ3RoKTtcbiAgfVxuICBpZiAoaG9zdCkgeyB0aGlzLmhvc3RuYW1lID0gaG9zdDsgfVxufTtcblxuLy8gQWJvdXQgMS41eCBmYXN0ZXIgdGhhbiB0aGUgdHdvLWFyZyB2ZXJzaW9uIG9mIEFycmF5I3NwbGljZSgpLlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGltcHJvdmUgY292ZXJhZ2UgKi9cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKHZhciBpID0gaW5kZXgsIGsgPSBpICsgMSwgbiA9IGxpc3QubGVuZ3RoOyBrIDwgbjsgaSArPSAxLCBrICs9IDEpIHsgbGlzdFtpXSA9IGxpc3Rba107IH1cbiAgbGlzdC5wb3AoKTtcbn1cblxudmFyIGhleFRhYmxlID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKVxueyBoZXhUYWJsZVtpXSA9ICclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCk7IH1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpbXByb3ZlIGNvdmVyYWdlICovXG5mdW5jdGlvbiBlbmNvZGVBdXRoKHN0cikge1xuICAvLyBmYXN0ZXIgZW5jb2RlVVJJQ29tcG9uZW50IGFsdGVybmF0aXZlIGZvciBlbmNvZGluZyBhdXRoIHVyaSBjb21wb25lbnRzXG4gIHZhciBvdXQgPSAnJztcbiAgdmFyIGxhc3RQb3MgPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAvLyBUaGVzZSBjaGFyYWN0ZXJzIGRvIG5vdCBuZWVkIGVzY2FwaW5nOlxuICAgIC8vICEgLSAuIF8gflxuICAgIC8vICcgKCApICogOlxuICAgIC8vIGRpZ2l0c1xuICAgIC8vIGFscGhhICh1cHBlcmNhc2UpXG4gICAgLy8gYWxwaGEgKGxvd2VyY2FzZSlcbiAgICBpZiAoXG4gICAgICBjID09PSAweDIxIHx8XG4gICAgICBjID09PSAweDJkIHx8XG4gICAgICBjID09PSAweDJlIHx8XG4gICAgICBjID09PSAweDVmIHx8XG4gICAgICBjID09PSAweDdlIHx8XG4gICAgICAoYyA+PSAweDI3ICYmIGMgPD0gMHgyYSkgfHxcbiAgICAgIChjID49IDB4MzAgJiYgYyA8PSAweDNhKSB8fFxuICAgICAgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NWEpIHx8XG4gICAgICAoYyA+PSAweDYxICYmIGMgPD0gMHg3YSlcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpIC0gbGFzdFBvcyA+IDApIHsgb3V0ICs9IHN0ci5zbGljZShsYXN0UG9zLCBpKTsgfVxuXG4gICAgbGFzdFBvcyA9IGkgKyAxO1xuXG4gICAgLy8gT3RoZXIgQVNDSUkgY2hhcmFjdGVyc1xuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgb3V0ICs9IGhleFRhYmxlW2NdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gTXVsdGktYnl0ZSBjaGFyYWN0ZXJzIC4uLlxuICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIG91dCArPSBoZXhUYWJsZVsweGMwIHwgKGMgPj4gNildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzZildO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjIDwgMHhkODAwIHx8IGMgPj0gMHhlMDAwKSB7XG4gICAgICBvdXQgKz1cbiAgICAgICAgaGV4VGFibGVbMHhlMCB8IChjID4+IDEyKV0gK1xuICAgICAgICBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzZildICtcbiAgICAgICAgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzZildO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFN1cnJvZ2F0ZSBwYWlyXG4gICAgKytpO1xuICAgIHZhciBjMjtcbiAgICBpZiAoaSA8IHN0ci5sZW5ndGgpIHsgYzIgPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4M2ZmOyB9XG4gICAgZWxzZSB7IGMyID0gMDsgfVxuICAgIGMgPSAweDEwMDAwICsgKCgoYyAmIDB4M2ZmKSA8PCAxMCkgfCBjMik7XG4gICAgb3V0ICs9XG4gICAgICBoZXhUYWJsZVsweGYwIHwgKGMgPj4gMTgpXSArXG4gICAgICBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M2YpXSArXG4gICAgICBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzZildICtcbiAgICAgIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M2YpXTtcbiAgfVxuICBpZiAobGFzdFBvcyA9PT0gMCkgeyByZXR1cm4gc3RyOyB9XG4gIGlmIChsYXN0UG9zIDwgc3RyLmxlbmd0aCkgeyByZXR1cm4gb3V0ICsgc3RyLnNsaWNlKGxhc3RQb3MpOyB9XG4gIHJldHVybiBvdXQ7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7O0FBRVosSUFBQUEsU0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQTRDLFNBQUFELHVCQUFBRSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRTVDRyxPQUFPLENBQUNDLEtBQUssR0FBR0MsUUFBUTtBQUN4QkYsT0FBTyxDQUFDRyxPQUFPLEdBQUdDLFVBQVU7QUFDNUJKLE9BQU8sQ0FBQ0ssYUFBYSxHQUFHQyxnQkFBZ0I7QUFDeENOLE9BQU8sQ0FBQ08sTUFBTSxHQUFHQyxTQUFTO0FBRTFCUixPQUFPLENBQUNTLEdBQUcsR0FBR0EsR0FBRztBQUVqQixTQUFTQSxHQUFHQSxDQUFBLEVBQUc7RUFDYixJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJO0VBQ3BCLElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUk7RUFDbkIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtFQUNoQixJQUFJLENBQUNDLElBQUksR0FBRyxJQUFJO0VBQ2hCLElBQUksQ0FBQ0MsSUFBSSxHQUFHLElBQUk7RUFDaEIsSUFBSSxDQUFDQyxRQUFRLEdBQUcsSUFBSTtFQUNwQixJQUFJLENBQUNDLElBQUksR0FBRyxJQUFJO0VBQ2hCLElBQUksQ0FBQ0MsTUFBTSxHQUFHLElBQUk7RUFDbEIsSUFBSSxDQUFDQyxLQUFLLEdBQUcsSUFBSTtFQUNqQixJQUFJLENBQUNDLFFBQVEsR0FBRyxJQUFJO0VBQ3BCLElBQUksQ0FBQ0MsSUFBSSxHQUFHLElBQUk7RUFDaEIsSUFBSSxDQUFDQyxJQUFJLEdBQUcsSUFBSTtBQUNsQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLG1CQUFtQjtBQUMzQyxNQUFNQyxXQUFXLEdBQUcsVUFBVTs7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